chordia-ui 3.3.2 → 3.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/SmallButton.cjs.js +1 -1
- package/dist/SmallButton.cjs.js.map +1 -1
- package/dist/SmallButton.es.js +170 -162
- package/dist/SmallButton.es.js.map +1 -1
- package/dist/components/chat.cjs.js +8 -8
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +329 -335
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/data.cjs.js +1 -1
- package/dist/components/data.cjs.js.map +1 -1
- package/dist/components/data.es.js +83 -80
- package/dist/components/data.es.js.map +1 -1
- package/dist/components/layout.cjs.js +1 -1
- package/dist/components/layout.cjs.js.map +1 -1
- package/dist/components/layout.es.js +3 -1
- package/dist/components/layout.es.js.map +1 -1
- package/dist/index.cjs2.js +1 -1
- package/dist/index.cjs2.js.map +1 -1
- package/dist/index.es2.js +4 -4
- package/dist/index.es2.js.map +1 -1
- package/dist/pages/interactionDetails.cjs.js +2 -2
- package/dist/pages/interactionDetails.cjs.js.map +1 -1
- package/dist/pages/interactionDetails.es.js +117 -123
- package/dist/pages/interactionDetails.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/chat/ChatHistoryPanel.jsx +3 -3
- package/src/components/chat/ChatInterface.jsx +14 -14
- package/src/components/common/MessageThread.jsx +19 -19
- package/src/components/data/DataTable.jsx +18 -15
- package/src/components/layout/SplitPane.jsx +2 -0
- package/src/components/login/LoginPage.jsx +4 -4
- package/src/components/primitives/SmallButton.jsx +14 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.es.js","sources":["../../src/components/chat/ChatMessage.jsx","../../src/components/chat/ThinkingIndicator.jsx","../../src/components/chat/ChatInterface.jsx","../../src/components/chat/ChatHistoryPanel.jsx","../../src/components/chat/MessageThread.jsx","../../src/components/chat/ChartRenderer.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Wrench, Copy, Check, PanelRightOpen } from \"lucide-react\";\n\n/**\n * Lightweight Markdown Renderer\n * Handles: code blocks, inline code, bold, italic, links, lists, headers, horizontal rules, file paths\n */\nconst MarkdownRenderer = ({ content, onCodeBlockClick, onFilePathClick }) => {\n const [copiedBlocks, setCopiedBlocks] = useState(new Set());\n\n const copyToClipboard = async (text, blockId) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set([...prev, blockId]));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text:', err);\n }\n };\n\n const renderCodeBlock = (code, language, blockId) => {\n const isCopied = copiedBlocks.has(blockId);\n \n return (\n <div \n key={blockId}\n style={{\n position: 'relative',\n marginBottom: '16px',\n borderRadius: '8px',\n background: 'var(--ink, #1E2125)',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n overflow: 'hidden',\n }}\n >\n {/* Header with language and copy button */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 12px',\n background: 'rgba(255,255,255,0.05)',\n borderBottom: '1px solid rgba(255,255,255,0.1)',\n }}>\n <span style={{\n fontSize: '11px',\n color: 'rgba(255,255,255,0.7)',\n fontFamily: 'var(--font-mono, monospace)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}>\n {language || 'code'}\n </span>\n <button\n onClick={() => copyToClipboard(code, blockId)}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'rgba(255,255,255,0.1)';\n e.target.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n {onCodeBlockClick && (\n <button\n onClick={() => onCodeBlockClick({ code, language })}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255,255,255,0.1)';\n e.currentTarget.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'none';\n e.currentTarget.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n <PanelRightOpen size={12} />\n Canvas\n </button>\n )}\n </div>\n {/* Code content */}\n <pre style={{\n margin: 0,\n padding: '12px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n lineHeight: 1.4,\n color: 'rgba(255,255,255,0.95)',\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}>\n {code}\n </pre>\n </div>\n );\n };\n\n const parseMarkdown = (text) => {\n const elements = [];\n const lines = text.split('\\n');\n let i = 0;\n let blockId = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n \n // Code blocks (```language)\n if (line.trim().startsWith('```')) {\n const language = line.trim().slice(3);\n let codeLines = [];\n i++;\n \n while (i < lines.length && !lines[i].trim().startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n \n if (i < lines.length) i++; // Skip closing ```\n \n elements.push(renderCodeBlock(codeLines.join('\\n'), language, `code-${blockId++}`));\n continue;\n }\n \n // Headers\n if (line.startsWith('#')) {\n const level = line.match(/^#+/)[0].length;\n const text = line.slice(level).trim();\n const HeaderTag = level === 1 ? 'h2' : level === 2 ? 'h3' : level === 3 ? 'h4' : 'h5';\n \n elements.push(\n React.createElement(HeaderTag, {\n key: `header-${i}`,\n style: {\n fontSize: level === 1 ? '18px' : level === 2 ? '16px' : '14px',\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n marginTop: elements.length > 0 ? '20px' : '0',\n marginBottom: '8px',\n lineHeight: 1.3,\n }\n }, text)\n );\n i++;\n continue;\n }\n \n // Horizontal rule\n if (line.trim() === '---' || line.trim() === '***') {\n elements.push(\n <hr key={`hr-${i}`} style={{\n border: 'none',\n borderTop: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n margin: '16px 0',\n }} />\n );\n i++;\n continue;\n }\n \n // Lists\n if (line.match(/^(\\s*)([-*+]|\\d+\\.)\\s/)) {\n const listItems = [];\n const isOrdered = /^\\s*\\d+\\./.test(line);\n \n while (i < lines.length && (lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s/) || lines[i].trim() === '')) {\n if (lines[i].trim() !== '') {\n const match = lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s(.*)$/);\n if (match) {\n listItems.push(match[3]);\n }\n }\n i++;\n }\n \n const ListTag = isOrdered ? 'ol' : 'ul';\n elements.push(\n React.createElement(ListTag, {\n key: `list-${i}`,\n style: {\n margin: '8px 0',\n paddingLeft: '20px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }\n }, listItems.map((item, idx) => \n React.createElement('li', {\n key: `item-${idx}`,\n style: { marginBottom: '4px' }\n }, parseInlineMarkdownWithContext(item))\n ))\n );\n continue;\n }\n \n // Tables (lines starting with |)\n if (line.trim().startsWith('|') && line.trim().endsWith('|')) {\n const tableRows = [];\n while (i < lines.length && lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|')) {\n tableRows.push(lines[i]);\n i++;\n }\n \n if (tableRows.length >= 2) {\n // Parse cells from each row\n const parseCells = (row) => row.trim().slice(1, -1).split('|').map(c => c.trim());\n const headerCells = parseCells(tableRows[0]);\n \n // Check if row 1 is a separator (---|---|---)\n const isSeparator = (row) => parseCells(row).every(c => /^[-:]+$/.test(c));\n const hasSeparator = tableRows.length >= 2 && isSeparator(tableRows[1]);\n const bodyStart = hasSeparator ? 2 : 1;\n \n // Parse alignment from separator\n const alignments = hasSeparator ? parseCells(tableRows[1]).map(c => {\n if (c.startsWith(':') && c.endsWith(':')) return 'center';\n if (c.endsWith(':')) return 'right';\n return 'left';\n }) : headerCells.map(() => 'left');\n \n const cellStyle = {\n padding: '6px 12px',\n borderBottom: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n fontSize: '13px',\n lineHeight: 1.5,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n };\n \n elements.push(\n <div key={`table-${i}`} style={{ overflowX: 'auto', margin: '8px 0' }}>\n <table style={{\n borderCollapse: 'collapse',\n width: '100%',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '6px',\n overflow: 'hidden',\n }}>\n {hasSeparator && (\n <thead>\n <tr style={{ background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))' }}>\n {headerCells.map((cell, ci) => (\n <th key={ci} style={{ ...cellStyle, fontWeight: 660, textAlign: alignments[ci] || 'left', whiteSpace: 'nowrap' }}>\n {parseInlineMarkdownWithContext(cell)}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {(hasSeparator ? tableRows.slice(bodyStart) : tableRows).map((row, ri) => (\n <tr key={ri} style={{ background: ri % 2 === 1 ? 'var(--hover-warm-subtle, rgba(231,212,162,0.04))' : 'transparent' }}>\n {parseCells(row).map((cell, ci) => (\n <td key={ci} style={{ ...cellStyle, textAlign: alignments[ci] || 'left' }}>\n {parseInlineMarkdownWithContext(cell)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n }\n continue;\n }\n \n // Regular paragraphs\n if (line.trim()) {\n const paragraph = [];\n while (i < lines.length && lines[i].trim() && !lines[i].match(/^(#|```|---|\\*\\*\\*|(\\s*)([-*+]|\\d+\\.)\\s)/) && !(lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|'))) {\n paragraph.push(lines[i]);\n i++;\n }\n \n if (paragraph.length > 0) {\n elements.push(\n <p key={`p-${i}`} style={{ \n margin: '8px 0',\n lineHeight: 1.6,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {parseInlineMarkdownWithContext(paragraph.join(' '))}\n </p>\n );\n }\n } else {\n i++;\n }\n }\n \n return elements;\n };\n\n const parseInlineMarkdown = (text) => {\n const elements = [];\n let remaining = text;\n let key = 0;\n\n while (remaining.length > 0) {\n // File paths (before other patterns to catch them first)\n if (onFilePathClick) {\n // Match file paths: containing /src/, /components/, /packages/ or ending in common extensions\n const filePathMatch = remaining.match(/^([^\\s`*\\[]+(?:\\/src\\/|\\/components\\/|\\/packages\\/)[^\\s`*\\[]*|[^\\s`*\\[]*\\.(ts|tsx|js|jsx|py|css|scss|sass|json|md|yaml|yml|html|xml|sh|sql|go|rs|php|java|c|cpp|h|hpp)(?:\\b|$))/);\n if (filePathMatch) {\n const filePath = filePathMatch[1];\n elements.push(\n <span\n key={`file-path-${key++}`}\n onClick={() => onFilePathClick(filePath)}\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n textUnderlineOffset: '2px',\n cursor: 'pointer',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n transition: 'all 0.15s ease',\n ':hover': {\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n textDecoration: 'underline',\n textDecorationStyle: 'solid'\n }\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'var(--hover-warm-subtle, rgba(231,212,162,0.08))';\n e.target.style.textDecorationStyle = 'solid';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.textDecorationStyle = 'dotted';\n }}\n >\n {filePath}\n </span>\n );\n remaining = remaining.slice(filePathMatch[0].length);\n continue;\n }\n }\n\n // Inline code\n const inlineCodeMatch = remaining.match(/^`([^`]+)`/);\n if (inlineCodeMatch) {\n elements.push(\n <code key={`inline-code-${key++}`} style={{\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '3px',\n padding: '2px 4px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '12px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {inlineCodeMatch[1]}\n </code>\n );\n remaining = remaining.slice(inlineCodeMatch[0].length);\n continue;\n }\n\n // Bold\n const boldMatch = remaining.match(/^\\*\\*([^*]+)\\*\\*/);\n if (boldMatch) {\n elements.push(\n <strong key={`bold-${key++}`} style={{\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {boldMatch[1]}\n </strong>\n );\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n // Italic\n const italicMatch = remaining.match(/^\\*([^*]+)\\*/);\n if (italicMatch) {\n elements.push(\n <em key={`italic-${key++}`} style={{\n fontStyle: 'italic',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {italicMatch[1]}\n </em>\n );\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n // Links\n const linkMatch = remaining.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n elements.push(\n <a key={`link-${key++}`} \n href={linkMatch[2]} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}>\n {linkMatch[1]}\n </a>\n );\n remaining = remaining.slice(linkMatch[0].length);\n continue;\n }\n\n // Regular text — consume up to the next special char, or consume the special char itself if no pattern matched\n const nextSpecialChar = remaining.search(/[`*\\[]/);\n if (nextSpecialChar === -1) {\n // No more special chars — add rest and break\n elements.push(remaining);\n break;\n } else if (nextSpecialChar === 0) {\n // Special char at position 0 but no pattern matched — consume it as text\n elements.push(remaining[0]);\n remaining = remaining.slice(1);\n } else {\n elements.push(remaining.slice(0, nextSpecialChar));\n remaining = remaining.slice(nextSpecialChar);\n }\n }\n\n return elements.length === 1 && typeof elements[0] === 'string' ? elements[0] : elements;\n };\n\n // Helper to pass context to parseInlineMarkdown calls within parseMarkdown\n const parseInlineMarkdownWithContext = (text) => parseInlineMarkdown(text);\n \n return <div>{parseMarkdown(content)}</div>;\n};\n\n/**\n * ChatMessage Component\n * Individual message in chat interface with markdown support for assistant messages\n */\nexport default function ChatMessage({ \n role, \n content, \n html, \n timestamp, \n toolBadges, \n isStreaming,\n onCodeBlockClick,\n onFilePathClick,\n}) {\n const isUser = role === \"user\";\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isUser ? \"flex-end\" : \"flex-start\",\n marginBottom: \"16px\",\n maxWidth: \"100%\",\n }}\n >\n {/* Role label */}\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginBottom: \"6px\",\n fontWeight: 650,\n letterSpacing: \"0.02em\",\n }}\n >\n {isUser ? \"You\" : \"Chordia\"}\n {isStreaming && !isUser && (\n <span style={{ marginLeft: \"6px\", color: \"var(--rail-purple, #9B7AA8)\" }}>\n ●\n </span>\n )}\n </div>\n\n {/* Tool badges */}\n {toolBadges && toolBadges.length > 0 && (\n <div style={{ \n marginBottom: \"8px\", \n display: \"flex\", \n flexWrap: \"wrap\", \n gap: \"4px\",\n maxWidth: \"75%\" \n }}>\n {toolBadges.map((badge, index) => (\n <span \n key={badge.id || index}\n style={{\n display: \"inline-block\",\n fontSize: \"11px\",\n padding: \"2px 8px\",\n borderRadius: \"6px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: `1px solid ${\n badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\"\n }`,\n color: badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\",\n }}\n >\n <Wrench size={10} style={{ marginRight: 3, verticalAlign: \"middle\" }} />\n {badge.name}\n {badge.pending ? \"...\" : badge.success !== false ? \" ✓\" : \" ✗\"}\n </span>\n ))}\n </div>\n )}\n\n {/* Message bubble */}\n <div\n style={{\n maxWidth: \"75%\",\n padding: \"12px 16px\",\n borderRadius: \"var(--radius-lg, 12px)\",\n background: isUser\n ? \"var(--card-customer, rgba(94,136,176,0.08))\"\n : \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: isUser\n ? \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\"\n : \"1px solid var(--border, rgba(52,58,64,0.12))\",\n fontSize: \"var(--text-base, 14px)\",\n lineHeight: 1.6,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n wordBreak: \"break-word\",\n }}\n >\n {html ? (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n ) : isUser ? (\n // User messages stay plain text\n <div style={{ whiteSpace: \"pre-wrap\" }}>{content}</div>\n ) : (\n // Assistant messages get markdown rendering\n <MarkdownRenderer content={content || \"\"} onCodeBlockClick={onCodeBlockClick} onFilePathClick={onFilePathClick} />\n )}\n </div>\n\n {/* Timestamp */}\n {timestamp && (\n <div\n style={{\n fontSize: \"var(--text-xs-plus, 10.5px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginTop: \"4px\",\n fontFamily: \"var(--font-mono, monospace)\",\n }}\n >\n {timestamp}\n </div>\n )}\n </div>\n );\n}","\"use client\";\n\nexport default function ThinkingIndicator({ \n phase = \"thinking\", \n toolSteps = [], \n label,\n elapsedMs,\n compact = false\n}) {\n const formatElapsedTime = (ms) => {\n if (!ms || ms < 1000) return null;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\n };\n\n const getPhaseLabel = () => {\n if (label) return label;\n switch (phase) {\n case \"thinking\": return \"Thinking...\";\n case \"tool\": return null;\n case \"responding\": return \"Responding...\";\n default: return \"Thinking...\";\n }\n };\n\n const renderToolStep = (step, index) => {\n const getStatusDot = () => {\n const baseDotStyle = {\n width: compact ? '4px' : '6px',\n height: compact ? '4px' : '6px',\n borderRadius: '50%',\n display: 'inline-block',\n marginRight: compact ? '6px' : '8px'\n };\n\n switch (step.status) {\n case 'active':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--rail-purple, #9B7AA8)',\n animation: 'pulse 1.2s ease-in-out infinite'\n }}\n />\n );\n case 'done':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--text-xfaint, rgba(30,33,37,0.28))'\n }}\n />\n );\n case 'error':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--rail-compliance, #C98A5A)'\n }}\n />\n );\n default:\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--text-xfaint, rgba(30,33,37,0.28))'\n }}\n />\n );\n }\n };\n\n const getStatusText = () => {\n switch (step.status) {\n case 'done':\n return (\n <span style={{ \n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)'\n }}>\n ✓\n </span>\n );\n case 'error':\n return (\n <span style={{ \n color: 'var(--rail-compliance, #C98A5A)',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)'\n }}>\n failed\n </span>\n );\n default:\n return null;\n }\n };\n\n return (\n <div \n key={index}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: compact ? '2px' : '4px'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {getStatusDot()}\n <span style={{\n fontFamily: 'var(--font-mono)',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)',\n color: 'var(--text-muted)'\n }}>\n {step.name}\n </span>\n </div>\n {getStatusText()}\n </div>\n );\n };\n\n const renderShimmerBar = () => (\n <div style={{\n width: '100%',\n height: compact ? '2px' : '3px',\n backgroundColor: 'var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: compact ? '2px' : '3px',\n overflow: 'hidden',\n position: 'relative'\n }}>\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: 'linear-gradient(90deg, transparent 0%, rgba(155,122,168,0.3) 50%, transparent 100%)',\n animation: 'shimmer 2s linear infinite'\n }} />\n </div>\n );\n\n const renderCursor = () => (\n <span style={{\n width: compact ? '4px' : '6px',\n height: compact ? '10px' : '14px',\n backgroundColor: 'var(--rail-purple, #9B7AA8)',\n borderRadius: '1px',\n display: 'inline-block',\n marginLeft: '2px',\n animation: 'cursorBlink 0.8s ease-in-out infinite'\n }} />\n );\n\n const phaseLabel = getPhaseLabel();\n const elapsedTime = formatElapsedTime(elapsedMs);\n\n return (\n <div style={{\n borderLeft: `${compact ? '3px' : '4px'} solid var(--rail-purple, #9B7AA8)`,\n backgroundColor: 'var(--card-assistant, rgba(155,122,168,0.06))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: compact ? '8px' : '10px',\n padding: compact ? '8px 10px 8px 12px' : '10px 14px 10px 18px'\n }}>\n <style>\n {`\n @keyframes shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(200%); }\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1.0; }\n }\n \n @keyframes cursorBlink {\n 0%, 100% { opacity: 0; }\n 50% { opacity: 1; }\n }\n `}\n </style>\n \n {/* Header */}\n {!compact && (\n <div style={{\n fontSize: 'var(--text-xs-plus, 10.5px)',\n fontWeight: 650,\n textTransform: 'uppercase',\n letterSpacing: 'var(--tracking-label, 0.16em)',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n marginBottom: '8px'\n }}>\n AI ASSISTANT\n </div>\n )}\n\n {/* Content based on phase */}\n {phase === \"thinking\" && (\n <div>\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n marginBottom: compact ? '4px' : '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n {phaseLabel}\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n {renderShimmerBar()}\n </div>\n )}\n\n {phase === \"tool\" && (\n <div>\n {phaseLabel && (\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n marginBottom: compact ? '4px' : '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n {phaseLabel}\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n )}\n <div style={{ marginBottom: compact ? '4px' : '8px' }}>\n {toolSteps.map((step, index) => renderToolStep(step, index))}\n </div>\n {renderShimmerBar()}\n </div>\n )}\n\n {phase === \"responding\" && (\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {phaseLabel}\n {renderCursor()}\n </div>\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { Send } from \"lucide-react\";\nimport ChatMessage from \"./ChatMessage\";\nimport ThinkingIndicator from \"./ThinkingIndicator\";\n// TODO: replace with framework-agnostic toast\nconst toast = { error: (...args) => console.warn(\"toast.error:\", ...args) };\n\n/**\n * ChatInterface Component\n * Interactive chat interface with streaming SSE support, thinking phases, and tool visibility.\n */\nexport default function ChatInterface({\n initialMessages = [],\n onSendMessage,\n onStreamMessage, // NEW: streaming version of onSendMessage\n onMessagesChange, // NEW: callback when messages array changes\n onCodeBlockClick, // callback when \"Canvas\" button clicked on a code block: ({ code, language }) => void\n placeholder = \"Ask a question about this interaction...\",\n title = \"Chat with Chordia\",\n}) {\n const [messages, setMessages] = useState(initialMessages || []);\n const [inputValue, setInputValue] = useState(\"\");\n const [isProcessing, setIsProcessing] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const [currentAssistantMessage, setCurrentAssistantMessage] = useState(null);\n const [thinkingPhase, setThinkingPhase] = useState(\"thinking\");\n const [thinkingStartTime, setThinkingStartTime] = useState(null);\n const [elapsedMs, setElapsedMs] = useState(0);\n const messagesEndRef = useRef(null);\n const inputRef = useRef(null);\n const streamAbortController = useRef(null);\n const currentAssistantRef = useRef(null);\n const lastChunkTimeRef = useRef(null);\n const [streamSilent, setStreamSilent] = useState(false);\n const [silenceSeconds, setSilenceSeconds] = useState(0);\n\n // Auto-scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages, isProcessing]);\n\n // Auto-resize textarea\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.style.height = \"auto\";\n inputRef.current.style.height = `${Math.min(\n inputRef.current.scrollHeight,\n 120\n )}px`;\n }\n }, [inputValue]);\n\n // Update messages and notify parent\n useEffect(() => {\n if (onMessagesChange) {\n const allMessages = [...messages];\n if (currentAssistantMessage) {\n allMessages.push(currentAssistantMessage);\n }\n onMessagesChange(allMessages);\n }\n }, [messages, currentAssistantMessage, onMessagesChange]);\n\n // Elapsed time tracker + silence detector\n useEffect(() => {\n let interval;\n if (isProcessing && thinkingStartTime) {\n interval = setInterval(() => {\n setElapsedMs(Date.now() - thinkingStartTime);\n // Detect stream silence (no chunks for 3s+)\n if (lastChunkTimeRef.current) {\n const gap = (Date.now() - lastChunkTimeRef.current) / 1000;\n if (gap >= 3) {\n setStreamSilent(true);\n setSilenceSeconds(Math.floor(gap));\n } else {\n setStreamSilent(false);\n }\n }\n }, 500);\n }\n return () => interval && clearInterval(interval);\n }, [isProcessing, thinkingStartTime]);\n\n const resetProcessingState = () => {\n setIsProcessing(false);\n setIsSending(false);\n setCurrentAssistantMessage(null);\n currentAssistantRef.current = null;\n setThinkingPhase(\"thinking\");\n setStreamSilent(false);\n setSilenceSeconds(0);\n lastChunkTimeRef.current = null;\n setThinkingStartTime(null);\n setElapsedMs(0);\n if (streamAbortController.current) {\n streamAbortController.current.abort();\n streamAbortController.current = null;\n }\n };\n\n const parseSSELine = (line) => {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n if (data === \"[DONE]\") {\n return { type: \"done\" };\n }\n try {\n const parsed = JSON.parse(data);\n return { type: \"data\", data: parsed };\n } catch (e) {\n return null;\n }\n }\n return null;\n };\n\n const handleStreamChunk = (chunk) => {\n if (!chunk.choices?.[0]?.delta) return;\n\n lastChunkTimeRef.current = Date.now();\n setStreamSilent(false);\n\n const delta = chunk.choices[0].delta;\n \n // Check for tool use/result indicators\n if (delta.tool_calls || delta.tool_results) {\n setThinkingPhase(\"tool\");\n return;\n }\n\n // If we get content, switch to responding phase\n if (delta.content !== undefined) {\n setThinkingPhase(\"responding\");\n \n // Initialize or update current assistant message\n setCurrentAssistantMessage(prev => {\n const baseMessage = prev || {\n id: Date.now().toString(),\n role: \"assistant\",\n content: \"\",\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n isStreaming: true,\n };\n \n const updated = {\n ...baseMessage,\n content: (baseMessage.content || \"\") + (delta.content || \"\"),\n };\n currentAssistantRef.current = updated;\n return updated;\n });\n }\n };\n\n const processStream = async (stream) => {\n const reader = stream.getReader();\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 lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.trim()) {\n const parsed = parseSSELine(line);\n if (parsed) {\n if (parsed.type === \"done\") {\n return; // Stream complete\n } else if (parsed.type === \"data\") {\n handleStreamChunk(parsed.data);\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n };\n\n const handleSend = async () => {\n if (!inputValue.trim() || isSending) return;\n\n const userContent = inputValue.trim();\n const userMessage = {\n id: Date.now().toString(),\n role: \"user\",\n content: userContent,\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n\n // Add user message and start processing\n const newMessages = [...messages, userMessage];\n setMessages(newMessages);\n setInputValue(\"\");\n setIsProcessing(true);\n setIsSending(true);\n setThinkingPhase(\"thinking\");\n setThinkingStartTime(Date.now());\n lastChunkTimeRef.current = Date.now();\n\n // Create abort controller for this stream\n streamAbortController.current = new AbortController();\n\n try {\n let result;\n \n // Use streaming version if provided, otherwise fall back to regular\n if (onStreamMessage) {\n result = await onStreamMessage(userContent, newMessages);\n } else if (onSendMessage) {\n result = await onSendMessage(userContent, newMessages);\n } else {\n // Fallback to dummy response\n setTimeout(() => {\n const assistantMessage = {\n id: (Date.now() + 1).toString(),\n role: \"assistant\",\n content: \"This is a demonstration response. In a real implementation, this would connect to your LLM backend.\",\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n setMessages(prev => [...prev, assistantMessage]);\n resetProcessingState();\n }, 1000);\n return;\n }\n\n // Handle ReadableStream response\n if (result instanceof ReadableStream) {\n await processStream(result);\n } \n // Handle Response with SSE body\n else if (result instanceof Response && result.body) {\n await processStream(result.body);\n }\n // Handle Promise that resolves to a stream\n else if (result && typeof result.then === \"function\") {\n const resolved = await result;\n if (resolved instanceof ReadableStream) {\n await processStream(resolved);\n } else if (resolved instanceof Response && resolved.body) {\n await processStream(resolved.body);\n }\n }\n\n // Finalize the assistant message using ref (state is stale in this closure)\n if (currentAssistantRef.current) {\n setMessages(prev => [...prev, { \n ...currentAssistantRef.current, \n isStreaming: false \n }]);\n }\n\n } catch (error) {\n if (error.name !== \"AbortError\") {\n toast.error(\"Failed to send message\");\n console.error(\"Stream error:\", error);\n }\n } finally {\n resetProcessingState();\n }\n };\n\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"var(--radius-lg, 12px)\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n overflow: \"hidden\",\n }}\n >\n {/* Header — hidden when title is empty */}\n {title ? <div\n style={{\n padding: \"16px 20px\",\n borderBottom: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n fontSize: \"var(--text-lg, 16px)\",\n fontWeight: 720,\n letterSpacing: \"-0.01em\",\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n }}\n >\n {title}\n </div>\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n marginTop: \"2px\",\n }}\n >\n Ask questions, get insights from analyzed interactions\n </div>\n </div> : null}\n\n {/* Messages area */}\n <div\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: \"auto\",\n padding: \"20px\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {messages.length === 0 ? (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"var(--text-md, 13px)\",\n textAlign: \"center\",\n padding: \"40px\",\n }}\n >\n No messages yet. Start a conversation by asking a question below.\n </div>\n ) : (\n <>\n {messages.map((message) => (\n <ChatMessage\n key={message.id}\n role={message.role}\n content={message.content}\n html={message.html}\n timestamp={message.timestamp}\n toolBadges={message.toolBadges}\n isStreaming={message.isStreaming}\n onCodeBlockClick={onCodeBlockClick}\n />\n ))}\n \n {/* Current streaming message */}\n {currentAssistantMessage && (\n <ChatMessage\n key={currentAssistantMessage.id}\n role={currentAssistantMessage.role}\n content={currentAssistantMessage.content}\n timestamp={currentAssistantMessage.timestamp}\n isStreaming={true}\n onCodeBlockClick={onCodeBlockClick}\n />\n )}\n \n {/* Thinking indicator — shows during initial thinking or stream silence */}\n {isProcessing && (!currentAssistantMessage || streamSilent) && (\n <div style={{ marginBottom: \"16px\" }}>\n <ThinkingIndicator \n phase={streamSilent ? \"tool\" : thinkingPhase}\n elapsedMs={elapsedMs}\n label={\n streamSilent && silenceSeconds >= 30\n ? \"Compacting conversation — trimming context to stay sharp...\"\n : streamSilent && silenceSeconds >= 10\n ? \"Running background tasks...\"\n : streamSilent\n ? \"Still working...\"\n : undefined\n }\n />\n </div>\n )}\n \n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Input area */}\n <div\n style={{\n borderTop: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n padding: \"16px 20px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"flex-end\",\n }}\n >\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n disabled={isSending}\n style={{\n flex: 1,\n padding: \"10px 14px\",\n fontSize: \"var(--text-base, 14px)\",\n lineHeight: 1.5,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n background: \"rgba(255, 255, 255, 0.95)\",\n border: \"1px solid rgba(52, 58, 64, 0.18)\",\n borderRadius: \"var(--radius-md, 8px)\",\n resize: \"none\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n fontFamily: \"inherit\",\n minHeight: \"42px\",\n maxHeight: \"120px\",\n opacity: isSending ? 0.6 : 1,\n cursor: isSending ? \"not-allowed\" : \"text\",\n }}\n onFocus={(e) => {\n if (!isSending) {\n e.target.style.borderColor = \"rgba(94, 136, 176, 0.35)\";\n }\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"rgba(52, 58, 64, 0.18)\";\n }}\n />\n <button\n onClick={handleSend}\n disabled={!inputValue.trim() || isSending}\n style={{\n padding: \"10px 16px\",\n background:\n inputValue.trim() && !isSending\n ? \"var(--rail-discovery, #5E88B0)\"\n : \"var(--border-subtle, rgba(52,58,64,0.08))\",\n color:\n inputValue.trim() && !isSending\n ? \"rgba(255, 255, 255, 0.95)\"\n : \"var(--text-faint, rgba(30,33,37,0.36))\",\n border: \"none\",\n borderRadius: \"var(--radius-md, 8px)\",\n cursor:\n inputValue.trim() && !isSending ? \"pointer\" : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontSize: \"var(--text-md, 13px)\",\n fontWeight: 650,\n transition: \"all 0.15s ease\",\n height: \"42px\",\n }}\n onMouseEnter={(e) => {\n if (inputValue.trim() && !isSending) {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 1)\";\n }\n }}\n onMouseLeave={(e) => {\n if (inputValue.trim() && !isSending) {\n e.currentTarget.style.background = \"var(--rail-discovery, #5E88B0)\";\n }\n }}\n >\n {isSending ? (\n <>\n <style>\n {`\n @keyframes buttonSpin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <div\n style={{\n width: \"14px\",\n height: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"white\",\n borderRadius: \"50%\",\n animation: \"buttonSpin 0.6s linear infinite\",\n }}\n />\n Sending...\n </>\n ) : (\n <>\n <Send size={16} />\n Send\n </>\n )}\n </button>\n </div>\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginTop: \"8px\",\n }}\n >\n Press Enter to send, Shift+Enter for new line\n </div>\n </div>\n </div>\n );\n}","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { MessageSquare, Search, Clock, Pin } from \"lucide-react\";\n\n/**\n * ChatHistoryPanel Component\n * Panel showing chat thread history with search functionality.\n * \n * Props:\n * threads - Array of thread objects: { id, title, created_at, updated_at, message_count, last_message_preview, pinned, archived, tags }\n * activeThreadId - Currently selected thread id\n * onSelectThread - (threadId) => void\n * onNewChat - () => void\n * loading - boolean\n */\nexport default function ChatHistoryPanel({\n threads = [],\n activeThreadId,\n onSelectThread,\n onNewChat,\n loading = false,\n}) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const filteredThreads = threads.filter((thread) => {\n if (!searchQuery) return true;\n const q = searchQuery.toLowerCase();\n return (\n (thread.title || \"\").toLowerCase().includes(q) ||\n (thread.last_message_preview || \"\").toLowerCase().includes(q)\n );\n });\n\n // Sort: pinned first, then by updated_at descending\n const sortedThreads = [...filteredThreads].sort((a, b) => {\n if (a.pinned && !b.pinned) return -1;\n if (!a.pinned && b.pinned) return 1;\n const aTime = new Date(a.updated_at || a.created_at || 0).getTime();\n const bTime = new Date(b.updated_at || b.created_at || 0).getTime();\n return bTime - aTime;\n });\n\n const formatTime = (dateStr) => {\n if (!dateStr) return \"\";\n const d = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0) {\n return d.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else if (diffDays < 7) {\n return d.toLocaleDateString(\"en-US\", { weekday: \"short\" });\n } else {\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"var(--paper, rgba(255,255,255,0.95))\",\n borderRight: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"12px 14px\",\n borderBottom: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n flexShrink: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"10px\",\n }}\n >\n <div\n style={{\n fontSize: \"13px\",\n fontWeight: 650,\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n }}\n >\n Threads\n </div>\n {onNewChat && (\n <button\n onClick={onNewChat}\n style={{\n padding: \"4px 10px\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"var(--rail-discovery, #5E88B0)\",\n background: \"rgba(94, 136, 176, 0.08)\",\n border: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 0.14)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 0.08)\";\n }}\n >\n + New\n </button>\n )}\n </div>\n\n {/* Search */}\n <div style={{ position: \"relative\" }}>\n <Search\n size={13}\n style={{\n position: \"absolute\",\n left: \"10px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n pointerEvents: \"none\",\n }}\n />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search threads...\"\n style={{\n width: \"100%\",\n padding: \"7px 10px 7px 32px\",\n fontSize: \"12px\",\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"6px\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n boxSizing: \"border-box\",\n }}\n onFocus={(e) => {\n e.target.style.borderColor = \"rgba(94, 136, 176, 0.35)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"rgba(52, 58, 64, 0.12)\";\n }}\n />\n </div>\n </div>\n\n {/* Thread List */}\n <div style={{ flex: 1, overflowY: \"auto\", padding: \"4px 6px\" }}>\n {loading ? (\n <div\n style={{\n padding: \"30px 16px\",\n textAlign: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"12px\",\n }}\n >\n Loading threads...\n </div>\n ) : sortedThreads.length === 0 ? (\n <div\n style={{\n padding: \"30px 16px\",\n textAlign: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"12px\",\n }}\n >\n {searchQuery ? \"No threads found\" : \"No threads yet\"}\n </div>\n ) : (\n sortedThreads.map((thread) => {\n const isActive = thread.id === activeThreadId;\n return (\n <div\n key={thread.id}\n onClick={() => onSelectThread?.(thread.id)}\n style={{\n padding: \"10px 10px\",\n marginBottom: \"2px\",\n borderRadius: \"6px\",\n background: isActive\n ? \"rgba(94, 136, 176, 0.10)\"\n : \"transparent\",\n border: isActive\n ? \"1px solid rgba(94, 136, 176, 0.15)\"\n : \"1px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) e.currentTarget.style.background = \"rgba(0,0,0,0.03)\";\n }}\n onMouseLeave={(e) => {\n if (!isActive) e.currentTarget.style.background = \"transparent\";\n }}\n >\n {/* Title row */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\", marginBottom: \"4px\" }}>\n <MessageSquare\n size={12}\n style={{\n color: isActive ? \"var(--rail-discovery, #5E88B0)\" : \"var(--text-faint, rgba(30,33,37,0.36))\",\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n fontSize: \"12px\",\n fontWeight: isActive ? 650 : 550,\n color: isActive\n ? \"var(--text-ink, rgba(30,33,37,0.92))\"\n : \"var(--text-base, rgba(30,33,37,0.78))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {thread.title || \"Untitled thread\"}\n </div>\n {thread.pinned && (\n <Pin size={10} style={{ color: \"var(--rail-discovery, #5E88B0)\", flexShrink: 0 }} />\n )}\n </div>\n\n {/* Preview */}\n {thread.last_message_preview && (\n <div\n style={{\n fontSize: \"11px\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n marginLeft: \"18px\",\n marginBottom: \"4px\",\n }}\n >\n {thread.last_message_preview}\n </div>\n )}\n\n {/* Meta */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n marginLeft: \"18px\",\n fontSize: \"10px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n <Clock size={9} />\n <span>{formatTime(thread.updated_at || thread.created_at)}</span>\n {thread.message_count != null && (\n <>\n <span>·</span>\n <span>{thread.message_count} msg{thread.message_count !== 1 ? \"s\" : \"\"}</span>\n </>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n","/**\n * NOTE: Deprecated component.\n *\n * This chat-scoped `MessageThread` was an early demo implementation and\n * is tightly coupled to app-specific context (`useUserContext`, `toast`, etc.).\n *\n * For new work and for consumers of the `chordia-ui` library, prefer the\n * framework-agnostic, reusable version exported from:\n *\n * `src/components/common/MessageThread.jsx`\n *\n * which is re-exported via the main package entry:\n *\n * import { MessageThread } from \"chordia-ui\";\n *\n * This file is kept only for backwards compatibility within the app.\n */\n\"use client\";\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { Send, Paperclip, AtSign, Hash, Clock } from \"lucide-react\";\n// TODO: replace with framework-agnostic toast\nconst toast = { error: (...args) => console.warn(\"toast.error:\", ...args) };\n// TODO: replace with framework-agnostic context\nconst useUserContext = () => ({ userData: { name: \"User\", email: \"\" } });\n\n/**\n * MessageThread Component\n * Threaded messaging interface for team collaboration around sessions.\n * Supports mentions, condition references, and timestamp links.\n * Uses dummy data for demonstration purposes.\n */\nexport default function MessageThread({\n sessionTitle,\n messages: initialMessages,\n onSendMessage,\n currentUser,\n}) {\n const [messageInput, setMessageInput] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [messages, setMessages] = useState(initialMessages || []);\n const [isLoading, setIsLoading] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const { userData } = useUserContext();\n const messagesEndRef = useRef(null);\n\n // Get current user from context if not provided\n const displayCurrentUser = currentUser || {\n name: userData?.name || \"You\",\n initials: userData?.name\n ?.split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase() || \"YO\",\n color: \"#6B7C93\",\n };\n\n // Use initialMessages if provided, otherwise use empty array (no API fetching)\n useEffect(() => {\n if (initialMessages) {\n setMessages(initialMessages);\n } else {\n setMessages([]);\n }\n }, [initialMessages]);\n\n // Scroll to bottom when new messages arrive\n useEffect(() => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages]);\n\n const handleSend = async () => {\n if (!messageInput.trim()) return;\n\n const content = messageInput.trim();\n setMessageInput(\"\");\n setIsSending(true);\n\n // Create optimistic message\n const optimisticMessage = {\n id: `temp-${Date.now()}`,\n author: {\n name: displayCurrentUser.name,\n role: userData?.role || \"\",\n initials: displayCurrentUser.initials,\n color: displayCurrentUser.color,\n },\n content: content,\n timestamp: \"Just now\",\n type: \"comment\",\n isOptimistic: true,\n };\n\n // Optimistically add message\n setMessages((prev) => [...prev, optimisticMessage]);\n\n // If onSendMessage callback is provided, use it\n if (onSendMessage) {\n try {\n await onSendMessage(content);\n // Remove optimistic flag after callback succeeds\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticMessage.id\n ? { ...msg, isOptimistic: false }\n : msg\n )\n );\n } catch (error) {\n // Remove optimistic message on error\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticMessage.id));\n toast.error(\"Failed to send message\");\n } finally {\n setIsSending(false);\n }\n return;\n }\n\n // No API - just confirm the optimistic message\n setTimeout(() => {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticMessage.id\n ? { ...msg, isOptimistic: false }\n : msg\n )\n );\n setIsSending(false);\n }, 500);\n };\n\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"var(--radius-lg, 12px)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n {sessionTitle && (\n <div\n style={{\n padding: \"14px 16px\",\n borderBottom: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n fontSize: \"var(--text-md, 13px)\",\n fontWeight: 680,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n marginBottom: \"3px\",\n }}\n >\n Session Discussion\n </div>\n {sessionTitle && (\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n <span>{sessionTitle}</span>\n </div>\n )}\n </div>\n )}\n\n {/* Messages */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: \"16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\",\n }}\n >\n {isLoading ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n Loading messages...\n </div>\n ) : messages.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n No messages yet. Start the conversation!\n </div>\n ) : (\n messages.map((message) => (\n <div\n key={message.id}\n style={{\n display: \"flex\",\n gap: \"12px\",\n opacity: message.type === \"system\" ? 0.75 : 1,\n }}\n >\n {/* Avatar */}\n {message.type !== \"system\" && (\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"8px\",\n background: message.author.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n opacity: 0.9,\n }}\n >\n {message.author.initials}\n </div>\n )}\n {message.type === \"system\" && (\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"8px\",\n background: \"rgba(30, 33, 37, 0.08)\",\n color: \"rgba(30, 33, 37, 0.52)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n }}\n >\n <Clock size={14} />\n </div>\n )}\n\n {/* Message content */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* Author and timestamp */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n gap: \"8px\",\n marginBottom: \"4px\",\n }}\n >\n <span\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 650,\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n }}\n >\n {message.author.name}\n </span>\n <span\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontFamily: \"var(--font-mono, monospace)\",\n }}\n >\n {message.timestamp}\n </span>\n {message.author.role && (\n <span\n style={{\n fontSize: \"var(--text-xs, 10px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n fontWeight: 600,\n }}\n >\n {message.author.role}\n </span>\n )}\n {message.isEdited && (\n <span\n style={{\n fontSize: \"var(--text-xs, 10px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontStyle: \"italic\",\n }}\n >\n (edited)\n </span>\n )}\n </div>\n\n {/* Message text */}\n <div\n style={{\n fontSize: \"var(--text-md, 13px)\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n lineHeight: 1.5,\n marginBottom: message.references ? \"8px\" : 0,\n }}\n >\n {message.content}\n </div>\n\n {/* References */}\n {message.references && message.references.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px\",\n marginTop: \"8px\",\n }}\n >\n {message.references.map((ref, idx) => (\n <button\n key={idx}\n type=\"button\"\n style={{\n fontSize: \"11px\",\n padding: \"4px 8px\",\n borderRadius: \"6px\",\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\n background: \"rgba(255, 255, 255, 0.7)\",\n color:\n ref.type === \"condition\"\n ? \"rgba(94, 136, 176, 0.85)\"\n : ref.type === \"observation\"\n ? \"rgba(107, 123, 147, 0.85)\"\n : ref.type === \"timestamp\"\n ? \"rgba(184, 156, 106, 0.85)\"\n : \"rgba(30, 33, 37, 0.65)\",\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n transition: \"all 0.15s ease\",\n fontWeight: 550,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(255, 255, 255, 0.95)\";\n e.currentTarget.style.borderColor =\n \"rgba(52, 58, 64, 0.24)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background =\n \"rgba(255, 255, 255, 0.7)\";\n e.currentTarget.style.borderColor =\n \"rgba(52, 58, 64, 0.16)\";\n }}\n >\n {ref.type === \"timestamp\" && <Clock size={12} />}\n {(ref.type === \"condition\" ||\n ref.type === \"observation\") && <Hash size={12} />}\n {ref.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input area */}\n <div\n style={{\n padding: \"12px\",\n borderTop: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-end\",\n }}\n >\n {/* Current user avatar */}\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"var(--radius-md, 8px)\",\n background: displayCurrentUser.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 650,\n flexShrink: 0,\n opacity: 0.9,\n }}\n >\n {displayCurrentUser.initials}\n </div>\n\n {/* Input field */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n }}\n >\n <textarea\n value={messageInput}\n onChange={(e) => setMessageInput(e.target.value)}\n onKeyDown={handleKeyPress}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder=\"Add a comment...\"\n style={{\n width: \"100%\",\n minHeight: \"38px\",\n maxHeight: \"120px\",\n padding: \"8px 12px\",\n fontSize: \"var(--text-md, 13px)\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n background: \"white\",\n border: `1px solid ${\n isFocused\n ? \"rgba(94, 136, 176, 0.35)\"\n : \"rgba(52, 58, 64, 0.16)\"\n }`,\n borderRadius: \"var(--radius-md, 8px)\",\n resize: \"vertical\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n }}\n />\n\n {/* Toolbar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Mention user\"\n >\n <AtSign size={16} />\n </button>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Reference condition\"\n >\n <Hash size={16} />\n </button>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Attach file\"\n >\n <Paperclip size={16} />\n </button>\n </div>\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!messageInput.trim() || isSending}\n style={{\n padding: \"6px 12px\",\n background:\n messageInput.trim() && !isSending\n ? \"rgba(94, 136, 176, 0.85)\"\n : \"var(--border-subtle, rgba(52,58,64,0.08))\",\n border: \"none\",\n borderRadius: \"6px\",\n color:\n messageInput.trim() && !isSending\n ? \"white\"\n : \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 600,\n cursor:\n messageInput.trim() && !isSending\n ? \"pointer\"\n : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (messageInput.trim() && !isSending) {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 1)\";\n }\n }}\n onMouseLeave={(e) => {\n if (messageInput.trim() && !isSending) {\n e.currentTarget.style.background =\n \"rgba(94, 136, 176, 0.85)\";\n }\n }}\n >\n {isSending ? (\n <>\n <style>\n {`\n @keyframes messageSpin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <div\n style={{\n width: \"14px\",\n height: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"white\",\n borderRadius: \"50%\",\n animation: \"messageSpin 0.6s linear infinite\",\n }}\n />\n Sending...\n </>\n ) : (\n <>\n <Send size={14} />\n Send\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n <div\n style={{\n marginTop: \"8px\",\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n lineHeight: 1.4,\n }}\n >\n <strong>Tip:</strong> Use{\" \"}\n <code\n style={{\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 4px\",\n borderRadius: \"3px\",\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"var(--text-xs, 10px)\",\n }}\n >\n @\n </code>{\" \"}\n to mention teammates,{\" \"}\n <code\n style={{\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 4px\",\n borderRadius: \"3px\",\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"var(--text-xs, 10px)\",\n }}\n >\n #\n </code>{\" \"}\n to reference conditions\n </div>\n </div>\n </div>\n );\n}\n\n","\"use client\";\nimport React, { useRef, useCallback } from 'react';\nimport {\n ResponsiveContainer, BarChart, Bar, Cell, LineChart, Line,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n PieChart, Pie, AreaChart, Area,\n} from 'recharts';\n\n// Chordia design system rail colors — ordered for max visual distinction\nconst COLORS = [\n '#5E88B0', // rail-discovery / rail-blue\n '#9B7AA8', // rail-purple / rail-tone\n '#C98A5A', // rail-compliance / rail-orange\n '#7BA89D', // rail-signal-upsell (teal-green)\n '#D17B6B', // rail-coral / rail-signal-churn\n '#6B7C93', // rail-slate / rail-outcome\n '#9B8E6F', // rail-olive / rail-signal-satisfaction\n '#8A9BAF', // rail-quality\n '#B8976A', // rail-teal (warm gold)\n '#A8C76B', // green accent (complementary)\n];\n\n// Shared axis/tooltip/legend styling\nconst AXIS_TICK = { fill: 'var(--text-muted, #666)', fontSize: 12 };\nconst AXIS_LINE = { stroke: 'var(--border, #e0e0e0)' };\nconst GRID_STROKE = 'var(--border, #e0e0e0)';\nconst TOOLTIP_STYLE = {\n contentStyle: {\n backgroundColor: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',\n color: 'var(--text-ink, #1e2125)',\n },\n labelStyle: { color: 'var(--text-strong, #1e2125)' },\n};\nconst LEGEND_STYLE = { color: 'var(--text-ink, #1e2125)', fontSize: '12px' };\n\n// Smart label: skip x_label if tick values already contain the label text\nconst shouldShowAxisLabel = (label, tickValues) => {\n if (!label) return false;\n const lower = label.toLowerCase();\n // If most ticks contain the label word, it's redundant\n const matches = tickValues.filter(v => String(v).toLowerCase().includes(lower));\n return matches.length < tickValues.length * 0.5;\n};\n\n// --- Export utilities ---\nconst downloadPng = async (containerEl, title) => {\n const svg = containerEl.querySelector('svg');\n if (!svg) return;\n const clone = svg.cloneNode(true);\n // Ensure dimensions\n const w = svg.clientWidth || 600;\n const h = svg.clientHeight || 300;\n clone.setAttribute('width', w);\n clone.setAttribute('height', h);\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n // Inline computed styles for export fidelity\n const styleEl = document.createElement('style');\n styleEl.textContent = `text { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }`;\n clone.insertBefore(styleEl, clone.firstChild);\n const xml = new XMLSerializer().serializeToString(clone);\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const scale = 2; // retina\n canvas.width = w * scale;\n canvas.height = h * scale;\n const ctx = canvas.getContext('2d');\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0, w, h);\n URL.revokeObjectURL(url);\n const link = document.createElement('a');\n link.download = `${(title || 'chart').replace(/[^a-z0-9]+/gi, '_')}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n };\n img.src = url;\n};\n\nconst copyAsCsv = (series, allXValues) => {\n const header = ['', ...series.map(s => s.name)].join(',');\n const rows = allXValues.map(x => {\n const vals = series.map(s => {\n const match = s.data.find(d => d.x === x);\n return match ? match.y : '';\n });\n return [x, ...vals].join(',');\n });\n const csv = [header, ...rows].join('\\n');\n navigator.clipboard.writeText(csv);\n};\n\nconst ActionBar = ({ onDownload, onCopy, copied }) => (\n <div style={{\n display: 'flex', gap: 6, justifyContent: 'flex-end',\n marginBottom: 8, opacity: 0.7, transition: 'opacity 0.15s',\n }}>\n <button onClick={onCopy} title=\"Copy data as CSV\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n {copied ? '✓ Copied' : '📋 CSV'}\n </button>\n <button onClick={onDownload} title=\"Download as PNG\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n 📥 PNG\n </button>\n </div>\n);\n\nconst ChartRenderer = ({ chartType, title, xLabel, yLabel, series }) => {\n const chartRef = useRef(null);\n const [copied, setCopied] = React.useState(false);\n\n if (!series || series.length === 0) return null;\n\n // Transform: merge all series into [{x, series1: val, series2: val}, ...]\n const allXValues = [...new Set(series.flatMap(s => s.data.map(d => d.x)))];\n const chartData = allXValues.map(x => {\n const point = { x };\n series.forEach(s => {\n const match = s.data.find(d => d.x === x);\n point[s.name] = match ? match.y : null;\n });\n return point;\n });\n\n const seriesNames = series.map(s => s.name);\n const isSingleSeries = seriesNames.length === 1;\n\n // Determine if axis labels are redundant\n const showXLabel = shouldShowAxisLabel(xLabel, allXValues);\n const bottomMargin = showXLabel ? 20 : 5;\n\n // Check if x-axis labels are long (rotate them)\n const maxTickLen = Math.max(...allXValues.map(v => String(v).length));\n const rotateXTicks = maxTickLen > 12 || allXValues.length > 8;\n\n const containerStyle = {\n background: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-md, 8px)',\n padding: '16px',\n marginBottom: '16px',\n };\n\n const titleStyle = {\n color: 'var(--text-strong, #1e2125)',\n fontSize: '14px',\n fontWeight: '600',\n marginBottom: '12px',\n };\n\n const xAxisProps = {\n dataKey: 'x',\n tick: rotateXTicks\n ? { fill: 'var(--text-muted, #666)', fontSize: 11, angle: -35, textAnchor: 'end' }\n : AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(showXLabel ? {\n label: { value: xLabel, position: 'insideBottom', offset: -10, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } }\n } : {}),\n };\n\n const yAxisProps = {\n tick: AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(yLabel ? {\n label: { value: yLabel, angle: -90, position: 'insideLeft', style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } }\n } : {}),\n };\n\n const renderChart = () => {\n switch (chartType) {\n case 'bar':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n {!isSingleSeries && <Legend wrapperStyle={LEGEND_STYLE} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[2, 2, 0, 0]}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n\n case 'horizontal_bar': {\n // Horizontal bar: swap X/Y, use YAxis for categories\n return (\n <ResponsiveContainer width=\"100%\" height={Math.max(300, chartData.length * 40)}>\n <BarChart data={chartData} layout=\"vertical\" margin={{ top: 5, right: 30, left: 100, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis type=\"number\" tick={AXIS_TICK} axisLine={AXIS_LINE} tickLine={AXIS_LINE}\n {...(yLabel ? { label: { value: yLabel, position: 'insideBottom', offset: -5, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } } } : {})}\n />\n <YAxis type=\"category\" dataKey=\"x\" tick={{ fill: 'var(--text-muted, #666)', fontSize: 11 }} width={90} axisLine={AXIS_LINE} tickLine={AXIS_LINE} />\n <Tooltip {...TOOLTIP_STYLE} />\n {!isSingleSeries && <Legend wrapperStyle={LEGEND_STYLE} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[0, 2, 2, 0]}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n }\n\n case 'line':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n <Legend wrapperStyle={LEGEND_STYLE} />\n {seriesNames.map((name, i) => (\n <Line key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n dot={{ r: 4, fill: COLORS[i % COLORS.length] }}\n activeDot={{ r: 6, fill: COLORS[i % COLORS.length] }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n );\n\n case 'area':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <AreaChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n <Legend wrapperStyle={LEGEND_STYLE} />\n {seriesNames.map((name, i) => (\n <Area key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n fill={COLORS[i % COLORS.length]} fillOpacity={0.15}\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n );\n\n case 'pie': {\n // Pie uses first series only\n const pieData = series[0].data.map((d, i) => ({\n name: d.x,\n value: d.y,\n fill: COLORS[i % COLORS.length],\n }));\n const RADIAN = Math.PI / 180;\n const renderLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, name }) => {\n const radius = outerRadius + 20;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n if (percent < 0.04) return null;\n return (\n <text x={x} y={y} fill=\"var(--text-ink, #1e2125)\" fontSize={11}\n textAnchor={x > cx ? 'start' : 'end'} dominantBaseline=\"central\">\n {name} ({(percent * 100).toFixed(0)}%)\n </text>\n );\n };\n return (\n <ResponsiveContainer width=\"100%\" height={320}>\n <PieChart>\n <Pie data={pieData} cx=\"50%\" cy=\"50%\" outerRadius={100}\n dataKey=\"value\" label={renderLabel} labelLine={{ stroke: 'var(--text-muted, #666)' }}>\n {pieData.map((entry, i) => (\n <Cell key={i} fill={entry.fill} />\n ))}\n </Pie>\n <Tooltip {...TOOLTIP_STYLE} />\n </PieChart>\n </ResponsiveContainer>\n );\n }\n\n case 'metric': {\n const s = series[0];\n const current = s.data[0];\n const previous = s.data.length > 1 ? s.data[1] : null;\n const value = current.y;\n const unit = current.x || '';\n const hasTrend = previous !== null;\n const change = hasTrend ? value - previous.y : 0;\n const pctChange = hasTrend && previous.y !== 0 ? ((change / Math.abs(previous.y)) * 100) : 0;\n const isPositive = change > 0;\n const isNegative = change < 0;\n const trendColor = isPositive ? '#7BA89D' : isNegative ? '#D17B6B' : 'var(--text-muted, #666)';\n const trendArrow = isPositive ? '↑' : isNegative ? '↓' : '→';\n\n // Format large numbers nicely\n const fmt = (n) => {\n if (Number.isInteger(n) && Math.abs(n) >= 1000) return n.toLocaleString();\n if (typeof n === 'number') return n % 1 === 0 ? n.toString() : n.toFixed(n < 10 ? 2 : 1);\n return String(n);\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 12, padding: '8px 0' }}>\n <div style={{\n fontSize: '36px', fontWeight: 700, lineHeight: 1,\n color: 'var(--text-strong, #1e2125)',\n fontVariantNumeric: 'tabular-nums',\n }}>\n {fmt(value)}\n </div>\n {unit && (\n <div style={{ fontSize: '14px', color: 'var(--text-muted, #666)', fontWeight: 500 }}>\n {unit}\n </div>\n )}\n {hasTrend && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: 4,\n fontSize: '13px', fontWeight: 600, color: trendColor,\n background: isPositive ? 'rgba(123,168,157,0.12)' : isNegative ? 'rgba(209,123,107,0.12)' : 'rgba(128,128,128,0.08)',\n padding: '3px 8px', borderRadius: 'var(--radius-sm, 4px)',\n }}>\n <span>{trendArrow}</span>\n <span>{fmt(Math.abs(change))} ({Math.abs(pctChange).toFixed(1)}%)</span>\n </div>\n )}\n {hasTrend && (\n <div style={{ fontSize: '11px', color: 'var(--text-faint, #999)' }}>\n vs {previous.x || 'previous'}\n </div>\n )}\n </div>\n );\n }\n\n default:\n return <div style={{ color: 'var(--text-muted)', fontSize: 12, padding: 8 }}>Unsupported chart type: {chartType}</div>;\n }\n };\n\n const handleDownload = useCallback(() => {\n if (chartRef.current) downloadPng(chartRef.current, title);\n }, [title]);\n\n const handleCopy = useCallback(() => {\n copyAsCsv(series, allXValues);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [series, allXValues]);\n\n const showActions = chartType !== 'metric';\n\n return (\n <div style={containerStyle}>\n {title && <div style={titleStyle}>{title}</div>}\n {showActions && <ActionBar onDownload={handleDownload} onCopy={handleCopy} copied={copied} />}\n <div ref={chartRef}>\n {renderChart()}\n </div>\n </div>\n );\n};\n\nexport default ChartRenderer;\n"],"names":["MarkdownRenderer","content","onCodeBlockClick","onFilePathClick","copiedBlocks","setCopiedBlocks","useState","copyToClipboard","text","blockId","prev","newSet","err","renderCodeBlock","code","language","isCopied","jsxs","jsx","e","Check","Copy","PanelRightOpen","parseMarkdown","elements","lines","i","line","codeLines","level","HeaderTag","React","listItems","isOrdered","match","ListTag","item","idx","parseInlineMarkdownWithContext","tableRows","parseCells","row","c","headerCells","isSeparator","hasSeparator","bodyStart","alignments","cellStyle","cell","ci","ri","paragraph","parseInlineMarkdown","remaining","key","filePathMatch","filePath","inlineCodeMatch","boldMatch","italicMatch","linkMatch","nextSpecialChar","ChatMessage","role","html","timestamp","toolBadges","isStreaming","isUser","badge","index","Wrench","ThinkingIndicator","phase","toolSteps","label","elapsedMs","compact","formatElapsedTime","ms","seconds","minutes","remainingSeconds","getPhaseLabel","renderToolStep","step","getStatusDot","baseDotStyle","getStatusText","renderShimmerBar","renderCursor","phaseLabel","elapsedTime","toast","args","ChatInterface","initialMessages","onSendMessage","onStreamMessage","onMessagesChange","placeholder","title","messages","setMessages","inputValue","setInputValue","isProcessing","setIsProcessing","isSending","setIsSending","currentAssistantMessage","setCurrentAssistantMessage","thinkingPhase","setThinkingPhase","thinkingStartTime","setThinkingStartTime","setElapsedMs","messagesEndRef","useRef","inputRef","streamAbortController","currentAssistantRef","lastChunkTimeRef","streamSilent","setStreamSilent","silenceSeconds","setSilenceSeconds","useEffect","_a","allMessages","interval","gap","resetProcessingState","parseSSELine","data","handleStreamChunk","chunk","_b","delta","baseMessage","updated","processStream","stream","reader","decoder","buffer","done","value","parsed","handleSend","userContent","userMessage","newMessages","result","assistantMessage","resolved","error","handleKeyDown","Fragment","message","Send","ChatHistoryPanel","threads","activeThreadId","onSelectThread","onNewChat","loading","searchQuery","setSearchQuery","sortedThreads","thread","q","a","b","aTime","formatTime","dateStr","d","diffMs","diffDays","Search","isActive","MessageSquare","Pin","Clock","useUserContext","MessageThread","sessionTitle","currentUser","messageInput","setMessageInput","isFocused","setIsFocused","isLoading","setIsLoading","userData","displayCurrentUser","n","optimisticMessage","msg","handleKeyPress","ref","Hash","AtSign","Paperclip","COLORS","AXIS_TICK","AXIS_LINE","GRID_STROKE","TOOLTIP_STYLE","LEGEND_STYLE","shouldShowAxisLabel","tickValues","lower","v","downloadPng","containerEl","svg","clone","w","h","styleEl","xml","blob","url","img","canvas","scale","ctx","link","copyAsCsv","series","allXValues","header","s","rows","x","vals","csv","ActionBar","onDownload","onCopy","copied","ChartRenderer","chartType","xLabel","yLabel","chartRef","setCopied","chartData","point","seriesNames","isSingleSeries","showXLabel","bottomMargin","rotateXTicks","containerStyle","titleStyle","xAxisProps","yAxisProps","renderChart","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","name","Bar","_","Cell","LineChart","Line","AreaChart","Area","pieData","RADIAN","PieChart","Pie","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","y","entry","current","previous","unit","hasTrend","change","pctChange","isPositive","isNegative","trendColor","trendArrow","fmt","handleDownload","useCallback","handleCopy"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat.es.js","sources":["../../src/components/chat/ChatMessage.jsx","../../src/components/chat/ThinkingIndicator.jsx","../../src/components/chat/ChatInterface.jsx","../../src/components/chat/ChatHistoryPanel.jsx","../../src/components/chat/MessageThread.jsx","../../src/components/chat/ChartRenderer.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Wrench, Copy, Check, PanelRightOpen } from \"lucide-react\";\n\n/**\n * Lightweight Markdown Renderer\n * Handles: code blocks, inline code, bold, italic, links, lists, headers, horizontal rules, file paths\n */\nconst MarkdownRenderer = ({ content, onCodeBlockClick, onFilePathClick }) => {\n const [copiedBlocks, setCopiedBlocks] = useState(new Set());\n\n const copyToClipboard = async (text, blockId) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set([...prev, blockId]));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text:', err);\n }\n };\n\n const renderCodeBlock = (code, language, blockId) => {\n const isCopied = copiedBlocks.has(blockId);\n \n return (\n <div \n key={blockId}\n style={{\n position: 'relative',\n marginBottom: '16px',\n borderRadius: '8px',\n background: 'var(--ink, #1E2125)',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n overflow: 'hidden',\n }}\n >\n {/* Header with language and copy button */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 12px',\n background: 'rgba(255,255,255,0.05)',\n borderBottom: '1px solid rgba(255,255,255,0.1)',\n }}>\n <span style={{\n fontSize: '11px',\n color: 'rgba(255,255,255,0.7)',\n fontFamily: 'var(--font-mono, monospace)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}>\n {language || 'code'}\n </span>\n <button\n onClick={() => copyToClipboard(code, blockId)}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'rgba(255,255,255,0.1)';\n e.target.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n {onCodeBlockClick && (\n <button\n onClick={() => onCodeBlockClick({ code, language })}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255,255,255,0.1)';\n e.currentTarget.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'none';\n e.currentTarget.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n <PanelRightOpen size={12} />\n Canvas\n </button>\n )}\n </div>\n {/* Code content */}\n <pre style={{\n margin: 0,\n padding: '12px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n lineHeight: 1.4,\n color: 'rgba(255,255,255,0.95)',\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}>\n {code}\n </pre>\n </div>\n );\n };\n\n const parseMarkdown = (text) => {\n const elements = [];\n const lines = text.split('\\n');\n let i = 0;\n let blockId = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n \n // Code blocks (```language)\n if (line.trim().startsWith('```')) {\n const language = line.trim().slice(3);\n let codeLines = [];\n i++;\n \n while (i < lines.length && !lines[i].trim().startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n \n if (i < lines.length) i++; // Skip closing ```\n \n elements.push(renderCodeBlock(codeLines.join('\\n'), language, `code-${blockId++}`));\n continue;\n }\n \n // Headers\n if (line.startsWith('#')) {\n const level = line.match(/^#+/)[0].length;\n const text = line.slice(level).trim();\n const HeaderTag = level === 1 ? 'h2' : level === 2 ? 'h3' : level === 3 ? 'h4' : 'h5';\n \n elements.push(\n React.createElement(HeaderTag, {\n key: `header-${i}`,\n style: {\n fontSize: level === 1 ? '18px' : level === 2 ? '16px' : '14px',\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n marginTop: elements.length > 0 ? '20px' : '0',\n marginBottom: '8px',\n lineHeight: 1.3,\n }\n }, text)\n );\n i++;\n continue;\n }\n \n // Horizontal rule\n if (line.trim() === '---' || line.trim() === '***') {\n elements.push(\n <hr key={`hr-${i}`} style={{\n border: 'none',\n borderTop: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n margin: '16px 0',\n }} />\n );\n i++;\n continue;\n }\n \n // Lists\n if (line.match(/^(\\s*)([-*+]|\\d+\\.)\\s/)) {\n const listItems = [];\n const isOrdered = /^\\s*\\d+\\./.test(line);\n \n while (i < lines.length && (lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s/) || lines[i].trim() === '')) {\n if (lines[i].trim() !== '') {\n const match = lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s(.*)$/);\n if (match) {\n listItems.push(match[3]);\n }\n }\n i++;\n }\n \n const ListTag = isOrdered ? 'ol' : 'ul';\n elements.push(\n React.createElement(ListTag, {\n key: `list-${i}`,\n style: {\n margin: '8px 0',\n paddingLeft: '20px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }\n }, listItems.map((item, idx) => \n React.createElement('li', {\n key: `item-${idx}`,\n style: { marginBottom: '4px' }\n }, parseInlineMarkdownWithContext(item))\n ))\n );\n continue;\n }\n \n // Tables (lines starting with |)\n if (line.trim().startsWith('|') && line.trim().endsWith('|')) {\n const tableRows = [];\n while (i < lines.length && lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|')) {\n tableRows.push(lines[i]);\n i++;\n }\n \n if (tableRows.length >= 2) {\n // Parse cells from each row\n const parseCells = (row) => row.trim().slice(1, -1).split('|').map(c => c.trim());\n const headerCells = parseCells(tableRows[0]);\n \n // Check if row 1 is a separator (---|---|---)\n const isSeparator = (row) => parseCells(row).every(c => /^[-:]+$/.test(c));\n const hasSeparator = tableRows.length >= 2 && isSeparator(tableRows[1]);\n const bodyStart = hasSeparator ? 2 : 1;\n \n // Parse alignment from separator\n const alignments = hasSeparator ? parseCells(tableRows[1]).map(c => {\n if (c.startsWith(':') && c.endsWith(':')) return 'center';\n if (c.endsWith(':')) return 'right';\n return 'left';\n }) : headerCells.map(() => 'left');\n \n const cellStyle = {\n padding: '6px 12px',\n borderBottom: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n fontSize: '13px',\n lineHeight: 1.5,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n };\n \n elements.push(\n <div key={`table-${i}`} style={{ overflowX: 'auto', margin: '8px 0' }}>\n <table style={{\n borderCollapse: 'collapse',\n width: '100%',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '6px',\n overflow: 'hidden',\n }}>\n {hasSeparator && (\n <thead>\n <tr style={{ background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))' }}>\n {headerCells.map((cell, ci) => (\n <th key={ci} style={{ ...cellStyle, fontWeight: 660, textAlign: alignments[ci] || 'left', whiteSpace: 'nowrap' }}>\n {parseInlineMarkdownWithContext(cell)}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {(hasSeparator ? tableRows.slice(bodyStart) : tableRows).map((row, ri) => (\n <tr key={ri} style={{ background: ri % 2 === 1 ? 'var(--hover-warm-subtle, rgba(231,212,162,0.04))' : 'transparent' }}>\n {parseCells(row).map((cell, ci) => (\n <td key={ci} style={{ ...cellStyle, textAlign: alignments[ci] || 'left' }}>\n {parseInlineMarkdownWithContext(cell)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n }\n continue;\n }\n \n // Regular paragraphs\n if (line.trim()) {\n const paragraph = [];\n while (i < lines.length && lines[i].trim() && !lines[i].match(/^(#|```|---|\\*\\*\\*|(\\s*)([-*+]|\\d+\\.)\\s)/) && !(lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|'))) {\n paragraph.push(lines[i]);\n i++;\n }\n \n if (paragraph.length > 0) {\n elements.push(\n <p key={`p-${i}`} style={{ \n margin: '8px 0',\n lineHeight: 1.6,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {parseInlineMarkdownWithContext(paragraph.join(' '))}\n </p>\n );\n }\n } else {\n i++;\n }\n }\n \n return elements;\n };\n\n const parseInlineMarkdown = (text) => {\n const elements = [];\n let remaining = text;\n let key = 0;\n\n while (remaining.length > 0) {\n // File paths (before other patterns to catch them first)\n if (onFilePathClick) {\n // Match file paths: containing /src/, /components/, /packages/ or ending in common extensions\n const filePathMatch = remaining.match(/^([^\\s`*\\[]+(?:\\/src\\/|\\/components\\/|\\/packages\\/)[^\\s`*\\[]*|[^\\s`*\\[]*\\.(ts|tsx|js|jsx|py|css|scss|sass|json|md|yaml|yml|html|xml|sh|sql|go|rs|php|java|c|cpp|h|hpp)(?:\\b|$))/);\n if (filePathMatch) {\n const filePath = filePathMatch[1];\n elements.push(\n <span\n key={`file-path-${key++}`}\n onClick={() => onFilePathClick(filePath)}\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n textUnderlineOffset: '2px',\n cursor: 'pointer',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n transition: 'all 0.15s ease',\n ':hover': {\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n textDecoration: 'underline',\n textDecorationStyle: 'solid'\n }\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'var(--hover-warm-subtle, rgba(231,212,162,0.08))';\n e.target.style.textDecorationStyle = 'solid';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.textDecorationStyle = 'dotted';\n }}\n >\n {filePath}\n </span>\n );\n remaining = remaining.slice(filePathMatch[0].length);\n continue;\n }\n }\n\n // Inline code\n const inlineCodeMatch = remaining.match(/^`([^`]+)`/);\n if (inlineCodeMatch) {\n elements.push(\n <code key={`inline-code-${key++}`} style={{\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '3px',\n padding: '2px 4px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '12px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {inlineCodeMatch[1]}\n </code>\n );\n remaining = remaining.slice(inlineCodeMatch[0].length);\n continue;\n }\n\n // Bold\n const boldMatch = remaining.match(/^\\*\\*([^*]+)\\*\\*/);\n if (boldMatch) {\n elements.push(\n <strong key={`bold-${key++}`} style={{\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {boldMatch[1]}\n </strong>\n );\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n // Italic\n const italicMatch = remaining.match(/^\\*([^*]+)\\*/);\n if (italicMatch) {\n elements.push(\n <em key={`italic-${key++}`} style={{\n fontStyle: 'italic',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {italicMatch[1]}\n </em>\n );\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n // Links\n const linkMatch = remaining.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n elements.push(\n <a key={`link-${key++}`} \n href={linkMatch[2]} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}>\n {linkMatch[1]}\n </a>\n );\n remaining = remaining.slice(linkMatch[0].length);\n continue;\n }\n\n // Regular text — consume up to the next special char, or consume the special char itself if no pattern matched\n const nextSpecialChar = remaining.search(/[`*\\[]/);\n if (nextSpecialChar === -1) {\n // No more special chars — add rest and break\n elements.push(remaining);\n break;\n } else if (nextSpecialChar === 0) {\n // Special char at position 0 but no pattern matched — consume it as text\n elements.push(remaining[0]);\n remaining = remaining.slice(1);\n } else {\n elements.push(remaining.slice(0, nextSpecialChar));\n remaining = remaining.slice(nextSpecialChar);\n }\n }\n\n return elements.length === 1 && typeof elements[0] === 'string' ? elements[0] : elements;\n };\n\n // Helper to pass context to parseInlineMarkdown calls within parseMarkdown\n const parseInlineMarkdownWithContext = (text) => parseInlineMarkdown(text);\n \n return <div>{parseMarkdown(content)}</div>;\n};\n\n/**\n * ChatMessage Component\n * Individual message in chat interface with markdown support for assistant messages\n */\nexport default function ChatMessage({ \n role, \n content, \n html, \n timestamp, \n toolBadges, \n isStreaming,\n onCodeBlockClick,\n onFilePathClick,\n}) {\n const isUser = role === \"user\";\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isUser ? \"flex-end\" : \"flex-start\",\n marginBottom: \"16px\",\n maxWidth: \"100%\",\n }}\n >\n {/* Role label */}\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginBottom: \"6px\",\n fontWeight: 650,\n letterSpacing: \"0.02em\",\n }}\n >\n {isUser ? \"You\" : \"Chordia\"}\n {isStreaming && !isUser && (\n <span style={{ marginLeft: \"6px\", color: \"var(--rail-purple, #9B7AA8)\" }}>\n ●\n </span>\n )}\n </div>\n\n {/* Tool badges */}\n {toolBadges && toolBadges.length > 0 && (\n <div style={{ \n marginBottom: \"8px\", \n display: \"flex\", \n flexWrap: \"wrap\", \n gap: \"4px\",\n maxWidth: \"75%\" \n }}>\n {toolBadges.map((badge, index) => (\n <span \n key={badge.id || index}\n style={{\n display: \"inline-block\",\n fontSize: \"11px\",\n padding: \"2px 8px\",\n borderRadius: \"6px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: `1px solid ${\n badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\"\n }`,\n color: badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\",\n }}\n >\n <Wrench size={10} style={{ marginRight: 3, verticalAlign: \"middle\" }} />\n {badge.name}\n {badge.pending ? \"...\" : badge.success !== false ? \" ✓\" : \" ✗\"}\n </span>\n ))}\n </div>\n )}\n\n {/* Message bubble */}\n <div\n style={{\n maxWidth: \"75%\",\n padding: \"12px 16px\",\n borderRadius: \"var(--radius-lg, 12px)\",\n background: isUser\n ? \"var(--card-customer, rgba(94,136,176,0.08))\"\n : \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: isUser\n ? \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\"\n : \"1px solid var(--border, rgba(52,58,64,0.12))\",\n fontSize: \"var(--text-base, 14px)\",\n lineHeight: 1.6,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n wordBreak: \"break-word\",\n }}\n >\n {html ? (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n ) : isUser ? (\n // User messages stay plain text\n <div style={{ whiteSpace: \"pre-wrap\" }}>{content}</div>\n ) : (\n // Assistant messages get markdown rendering\n <MarkdownRenderer content={content || \"\"} onCodeBlockClick={onCodeBlockClick} onFilePathClick={onFilePathClick} />\n )}\n </div>\n\n {/* Timestamp */}\n {timestamp && (\n <div\n style={{\n fontSize: \"var(--text-xs-plus, 10.5px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginTop: \"4px\",\n fontFamily: \"var(--font-mono, monospace)\",\n }}\n >\n {timestamp}\n </div>\n )}\n </div>\n );\n}","\"use client\";\n\nexport default function ThinkingIndicator({ \n phase = \"thinking\", \n toolSteps = [], \n label,\n elapsedMs,\n compact = false\n}) {\n const formatElapsedTime = (ms) => {\n if (!ms || ms < 1000) return null;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\n };\n\n const getPhaseLabel = () => {\n if (label) return label;\n switch (phase) {\n case \"thinking\": return \"Thinking...\";\n case \"tool\": return null;\n case \"responding\": return \"Responding...\";\n default: return \"Thinking...\";\n }\n };\n\n const renderToolStep = (step, index) => {\n const getStatusDot = () => {\n const baseDotStyle = {\n width: compact ? '4px' : '6px',\n height: compact ? '4px' : '6px',\n borderRadius: '50%',\n display: 'inline-block',\n marginRight: compact ? '6px' : '8px'\n };\n\n switch (step.status) {\n case 'active':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--rail-purple, #9B7AA8)',\n animation: 'pulse 1.2s ease-in-out infinite'\n }}\n />\n );\n case 'done':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--text-xfaint, rgba(30,33,37,0.28))'\n }}\n />\n );\n case 'error':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--rail-compliance, #C98A5A)'\n }}\n />\n );\n default:\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--text-xfaint, rgba(30,33,37,0.28))'\n }}\n />\n );\n }\n };\n\n const getStatusText = () => {\n switch (step.status) {\n case 'done':\n return (\n <span style={{ \n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)'\n }}>\n ✓\n </span>\n );\n case 'error':\n return (\n <span style={{ \n color: 'var(--rail-compliance, #C98A5A)',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)'\n }}>\n failed\n </span>\n );\n default:\n return null;\n }\n };\n\n return (\n <div \n key={index}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: compact ? '2px' : '4px'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {getStatusDot()}\n <span style={{\n fontFamily: 'var(--font-mono)',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)',\n color: 'var(--text-muted)'\n }}>\n {step.name}\n </span>\n </div>\n {getStatusText()}\n </div>\n );\n };\n\n const renderShimmerBar = () => (\n <div style={{\n width: '100%',\n height: compact ? '2px' : '3px',\n backgroundColor: 'var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: compact ? '2px' : '3px',\n overflow: 'hidden',\n position: 'relative'\n }}>\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: 'linear-gradient(90deg, transparent 0%, rgba(155,122,168,0.3) 50%, transparent 100%)',\n animation: 'shimmer 2s linear infinite'\n }} />\n </div>\n );\n\n const renderCursor = () => (\n <span style={{\n width: compact ? '4px' : '6px',\n height: compact ? '10px' : '14px',\n backgroundColor: 'var(--rail-purple, #9B7AA8)',\n borderRadius: '1px',\n display: 'inline-block',\n marginLeft: '2px',\n animation: 'cursorBlink 0.8s ease-in-out infinite'\n }} />\n );\n\n const phaseLabel = getPhaseLabel();\n const elapsedTime = formatElapsedTime(elapsedMs);\n\n return (\n <div style={{\n borderLeft: `${compact ? '3px' : '4px'} solid var(--rail-purple, #9B7AA8)`,\n backgroundColor: 'var(--card-assistant, rgba(155,122,168,0.06))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: compact ? '8px' : '10px',\n padding: compact ? '8px 10px 8px 12px' : '10px 14px 10px 18px'\n }}>\n <style>\n {`\n @keyframes shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(200%); }\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1.0; }\n }\n \n @keyframes cursorBlink {\n 0%, 100% { opacity: 0; }\n 50% { opacity: 1; }\n }\n `}\n </style>\n \n {/* Header */}\n {!compact && (\n <div style={{\n fontSize: 'var(--text-xs-plus, 10.5px)',\n fontWeight: 650,\n textTransform: 'uppercase',\n letterSpacing: 'var(--tracking-label, 0.16em)',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n marginBottom: '8px'\n }}>\n AI ASSISTANT\n </div>\n )}\n\n {/* Content based on phase */}\n {phase === \"thinking\" && (\n <div>\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n marginBottom: compact ? '4px' : '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n {phaseLabel}\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n {renderShimmerBar()}\n </div>\n )}\n\n {phase === \"tool\" && (\n <div>\n {phaseLabel && (\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n marginBottom: compact ? '4px' : '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n {phaseLabel}\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n )}\n <div style={{ marginBottom: compact ? '4px' : '8px' }}>\n {toolSteps.map((step, index) => renderToolStep(step, index))}\n </div>\n {renderShimmerBar()}\n </div>\n )}\n\n {phase === \"responding\" && (\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {phaseLabel}\n {renderCursor()}\n </div>\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { Send } from \"lucide-react\";\nimport ChatMessage from \"./ChatMessage\";\nimport ThinkingIndicator from \"./ThinkingIndicator\";\n// TODO: replace with framework-agnostic toast\nconst toast = { error: (...args) => console.warn(\"toast.error:\", ...args) };\n\n/**\n * ChatInterface Component\n * Interactive chat interface with streaming SSE support, thinking phases, and tool visibility.\n */\nexport default function ChatInterface({\n initialMessages = [],\n onSendMessage,\n onStreamMessage, // NEW: streaming version of onSendMessage\n onMessagesChange, // NEW: callback when messages array changes\n onCodeBlockClick, // callback when \"Canvas\" button clicked on a code block: ({ code, language }) => void\n placeholder = \"Ask a question about this interaction...\",\n title = \"Chat with Chordia\",\n}) {\n const [messages, setMessages] = useState(initialMessages || []);\n const [inputValue, setInputValue] = useState(\"\");\n const [isProcessing, setIsProcessing] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const [currentAssistantMessage, setCurrentAssistantMessage] = useState(null);\n const [thinkingPhase, setThinkingPhase] = useState(\"thinking\");\n const [thinkingStartTime, setThinkingStartTime] = useState(null);\n const [elapsedMs, setElapsedMs] = useState(0);\n const messagesEndRef = useRef(null);\n const inputRef = useRef(null);\n const streamAbortController = useRef(null);\n const currentAssistantRef = useRef(null);\n const lastChunkTimeRef = useRef(null);\n const [streamSilent, setStreamSilent] = useState(false);\n const [silenceSeconds, setSilenceSeconds] = useState(0);\n\n // Auto-scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages, isProcessing]);\n\n // Auto-resize textarea\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.style.height = \"auto\";\n inputRef.current.style.height = `${Math.min(\n inputRef.current.scrollHeight,\n 120\n )}px`;\n }\n }, [inputValue]);\n\n // Update messages and notify parent\n useEffect(() => {\n if (onMessagesChange) {\n const allMessages = [...messages];\n if (currentAssistantMessage) {\n allMessages.push(currentAssistantMessage);\n }\n onMessagesChange(allMessages);\n }\n }, [messages, currentAssistantMessage, onMessagesChange]);\n\n // Elapsed time tracker + silence detector\n useEffect(() => {\n let interval;\n if (isProcessing && thinkingStartTime) {\n interval = setInterval(() => {\n setElapsedMs(Date.now() - thinkingStartTime);\n // Detect stream silence (no chunks for 3s+)\n if (lastChunkTimeRef.current) {\n const gap = (Date.now() - lastChunkTimeRef.current) / 1000;\n if (gap >= 3) {\n setStreamSilent(true);\n setSilenceSeconds(Math.floor(gap));\n } else {\n setStreamSilent(false);\n }\n }\n }, 500);\n }\n return () => interval && clearInterval(interval);\n }, [isProcessing, thinkingStartTime]);\n\n const resetProcessingState = () => {\n setIsProcessing(false);\n setIsSending(false);\n setCurrentAssistantMessage(null);\n currentAssistantRef.current = null;\n setThinkingPhase(\"thinking\");\n setStreamSilent(false);\n setSilenceSeconds(0);\n lastChunkTimeRef.current = null;\n setThinkingStartTime(null);\n setElapsedMs(0);\n if (streamAbortController.current) {\n streamAbortController.current.abort();\n streamAbortController.current = null;\n }\n };\n\n const parseSSELine = (line) => {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n if (data === \"[DONE]\") {\n return { type: \"done\" };\n }\n try {\n const parsed = JSON.parse(data);\n return { type: \"data\", data: parsed };\n } catch (e) {\n return null;\n }\n }\n return null;\n };\n\n const handleStreamChunk = (chunk) => {\n if (!chunk.choices?.[0]?.delta) return;\n\n lastChunkTimeRef.current = Date.now();\n setStreamSilent(false);\n\n const delta = chunk.choices[0].delta;\n \n // Check for tool use/result indicators\n if (delta.tool_calls || delta.tool_results) {\n setThinkingPhase(\"tool\");\n return;\n }\n\n // If we get content, switch to responding phase\n if (delta.content !== undefined) {\n setThinkingPhase(\"responding\");\n \n // Initialize or update current assistant message\n setCurrentAssistantMessage(prev => {\n const baseMessage = prev || {\n id: Date.now().toString(),\n role: \"assistant\",\n content: \"\",\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n isStreaming: true,\n };\n \n const updated = {\n ...baseMessage,\n content: (baseMessage.content || \"\") + (delta.content || \"\"),\n };\n currentAssistantRef.current = updated;\n return updated;\n });\n }\n };\n\n const processStream = async (stream) => {\n const reader = stream.getReader();\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 lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.trim()) {\n const parsed = parseSSELine(line);\n if (parsed) {\n if (parsed.type === \"done\") {\n return; // Stream complete\n } else if (parsed.type === \"data\") {\n handleStreamChunk(parsed.data);\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n };\n\n const handleSend = async () => {\n if (!inputValue.trim() || isSending) return;\n\n const userContent = inputValue.trim();\n const userMessage = {\n id: Date.now().toString(),\n role: \"user\",\n content: userContent,\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n\n // Add user message and start processing\n const newMessages = [...messages, userMessage];\n setMessages(newMessages);\n setInputValue(\"\");\n setIsProcessing(true);\n setIsSending(true);\n setThinkingPhase(\"thinking\");\n setThinkingStartTime(Date.now());\n lastChunkTimeRef.current = Date.now();\n\n // Create abort controller for this stream\n streamAbortController.current = new AbortController();\n\n try {\n let result;\n \n // Use streaming version if provided, otherwise fall back to regular\n if (onStreamMessage) {\n result = await onStreamMessage(userContent, newMessages);\n } else if (onSendMessage) {\n result = await onSendMessage(userContent, newMessages);\n } else {\n // Fallback to dummy response\n setTimeout(() => {\n const assistantMessage = {\n id: (Date.now() + 1).toString(),\n role: \"assistant\",\n content: \"This is a demonstration response. In a real implementation, this would connect to your LLM backend.\",\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n setMessages(prev => [...prev, assistantMessage]);\n resetProcessingState();\n }, 1000);\n return;\n }\n\n // Handle ReadableStream response\n if (result instanceof ReadableStream) {\n await processStream(result);\n } \n // Handle Response with SSE body\n else if (result instanceof Response && result.body) {\n await processStream(result.body);\n }\n // Handle Promise that resolves to a stream\n else if (result && typeof result.then === \"function\") {\n const resolved = await result;\n if (resolved instanceof ReadableStream) {\n await processStream(resolved);\n } else if (resolved instanceof Response && resolved.body) {\n await processStream(resolved.body);\n }\n }\n\n // Finalize the assistant message using ref (state is stale in this closure)\n if (currentAssistantRef.current) {\n setMessages(prev => [...prev, { \n ...currentAssistantRef.current, \n isStreaming: false \n }]);\n }\n\n } catch (error) {\n if (error.name !== \"AbortError\") {\n toast.error(\"Failed to send message\");\n console.error(\"Stream error:\", error);\n }\n } finally {\n resetProcessingState();\n }\n };\n\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"var(--radius-lg, 12px)\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n overflow: \"hidden\",\n }}\n >\n {/* Header — hidden when title is empty */}\n {title ? <div\n style={{\n padding: \"16px 20px\",\n borderBottom: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n fontSize: \"var(--text-lg, 16px)\",\n fontWeight: 720,\n letterSpacing: \"-0.01em\",\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n }}\n >\n {title}\n </div>\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n marginTop: \"2px\",\n }}\n >\n Ask questions, get insights from analyzed interactions\n </div>\n </div> : null}\n\n {/* Messages area */}\n <div\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: \"auto\",\n padding: \"20px\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {messages.length === 0 ? (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"var(--text-md, 13px)\",\n textAlign: \"center\",\n padding: \"40px\",\n }}\n >\n No messages yet. Start a conversation by asking a question below.\n </div>\n ) : (\n <>\n {messages.map((message) => (\n <ChatMessage\n key={message.id}\n role={message.role}\n content={message.content}\n html={message.html}\n timestamp={message.timestamp}\n toolBadges={message.toolBadges}\n isStreaming={message.isStreaming}\n onCodeBlockClick={onCodeBlockClick}\n />\n ))}\n \n {/* Current streaming message */}\n {currentAssistantMessage && (\n <ChatMessage\n key={currentAssistantMessage.id}\n role={currentAssistantMessage.role}\n content={currentAssistantMessage.content}\n timestamp={currentAssistantMessage.timestamp}\n isStreaming={true}\n onCodeBlockClick={onCodeBlockClick}\n />\n )}\n \n {/* Thinking indicator — shows during initial thinking or stream silence */}\n {isProcessing && (!currentAssistantMessage || streamSilent) && (\n <div style={{ marginBottom: \"16px\" }}>\n <ThinkingIndicator \n phase={streamSilent ? \"tool\" : thinkingPhase}\n elapsedMs={elapsedMs}\n label={\n streamSilent && silenceSeconds >= 30\n ? \"Compacting conversation — trimming context to stay sharp...\"\n : streamSilent && silenceSeconds >= 10\n ? \"Running background tasks...\"\n : streamSilent\n ? \"Still working...\"\n : undefined\n }\n />\n </div>\n )}\n \n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Input area */}\n <div\n style={{\n borderTop: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n padding: \"16px 20px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"flex-end\",\n }}\n >\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n disabled={isSending}\n style={{\n flex: 1,\n padding: \"10px 14px\",\n fontSize: \"var(--text-base, 14px)\",\n lineHeight: 1.5,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n background: \"rgba(255, 255, 255, 0.95)\",\n border: \"1px solid rgba(52, 58, 64, 0.18)\",\n borderRadius: \"var(--radius-md, 8px)\",\n resize: \"none\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n fontFamily: \"inherit\",\n minHeight: \"42px\",\n maxHeight: \"120px\",\n opacity: isSending ? 0.6 : 1,\n cursor: isSending ? \"not-allowed\" : \"text\",\n }}\n onFocus={(e) => {\n if (!isSending) {\n e.target.style.borderColor = \"rgba(94, 136, 176, 0.35)\";\n }\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"rgba(52, 58, 64, 0.18)\";\n }}\n />\n <button\n onClick={handleSend}\n disabled={!inputValue.trim() || isSending}\n style={{\n padding: \"10px 16px\",\n background:\n inputValue.trim() && !isSending\n ? \"var(--Base-Strong, #0B0B0B)\"\n : \"#ECEEF2\",\n color:\n inputValue.trim() && !isSending\n ? \"white\"\n : \"var(--text-base)\",\n border: \"none\",\n borderRadius: \"var(--radius-md, 8px)\",\n cursor:\n inputValue.trim() && !isSending ? \"pointer\" : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontSize: \"var(--text-md, 13px)\",\n fontWeight: 650,\n transition: \"all 0.15s ease\",\n height: \"42px\",\n }}\n // onMouseEnter={(e) => {\n // if (inputValue.trim() && !isSending) {\n // e.currentTarget.style.background = \"var(--Base-Strong, #0B0B0B)\";\n // }\n // }}\n // onMouseLeave={(e) => {\n // if (inputValue.trim() && !isSending) {\n // e.currentTarget.style.background = \"#ECEEF2\";\n // }\n // }}\n >\n {isSending ? (\n <>\n <style>\n {`\n @keyframes buttonSpin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <div\n style={{\n width: \"14px\",\n height: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"white\",\n borderRadius: \"50%\",\n animation: \"buttonSpin 0.6s linear infinite\",\n }}\n />\n Sending...\n </>\n ) : (\n <>\n <Send size={16} />\n Send\n </>\n )}\n </button>\n </div>\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginTop: \"8px\",\n }}\n >\n Press Enter to send, Shift+Enter for new line\n </div>\n </div>\n </div>\n );\n}","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { MessageSquare, Search, Clock, Pin } from \"lucide-react\";\n\n/**\n * ChatHistoryPanel Component\n * Panel showing chat thread history with search functionality.\n * \n * Props:\n * threads - Array of thread objects: { id, title, created_at, updated_at, message_count, last_message_preview, pinned, archived, tags }\n * activeThreadId - Currently selected thread id\n * onSelectThread - (threadId) => void\n * onNewChat - () => void\n * loading - boolean\n */\nexport default function ChatHistoryPanel({\n threads = [],\n activeThreadId,\n onSelectThread,\n onNewChat,\n loading = false,\n}) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const filteredThreads = threads.filter((thread) => {\n if (!searchQuery) return true;\n const q = searchQuery.toLowerCase();\n return (\n (thread.title || \"\").toLowerCase().includes(q) ||\n (thread.last_message_preview || \"\").toLowerCase().includes(q)\n );\n });\n\n // Sort: pinned first, then by updated_at descending\n const sortedThreads = [...filteredThreads].sort((a, b) => {\n if (a.pinned && !b.pinned) return -1;\n if (!a.pinned && b.pinned) return 1;\n const aTime = new Date(a.updated_at || a.created_at || 0).getTime();\n const bTime = new Date(b.updated_at || b.created_at || 0).getTime();\n return bTime - aTime;\n });\n\n const formatTime = (dateStr) => {\n if (!dateStr) return \"\";\n const d = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0) {\n return d.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else if (diffDays < 7) {\n return d.toLocaleDateString(\"en-US\", { weekday: \"short\" });\n } else {\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"var(--paper, rgba(255,255,255,0.95))\",\n borderRight: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"12px 14px\",\n borderBottom: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n flexShrink: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"10px\",\n }}\n >\n <div\n style={{\n fontSize: \"13px\",\n fontWeight: 650,\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n }}\n >\n Threads\n </div>\n {onNewChat && (\n <button\n onClick={onNewChat}\n style={{\n padding: \"4px 10px\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"var(--Base-Strong, #0B0B0B)\",\n background: \"#ECEEF2\",\n border: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#ECEEF2\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 0.08)\";\n }}\n >\n + New\n </button>\n )}\n </div>\n\n {/* Search */}\n <div style={{ position: \"relative\" }}>\n <Search\n size={13}\n style={{\n position: \"absolute\",\n left: \"10px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n pointerEvents: \"none\",\n }}\n />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search threads...\"\n style={{\n width: \"100%\",\n padding: \"7px 10px 7px 32px\",\n fontSize: \"12px\",\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"6px\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n boxSizing: \"border-box\",\n }}\n onFocus={(e) => {\n e.target.style.borderColor = \"rgba(94, 136, 176, 0.35)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"rgba(52, 58, 64, 0.12)\";\n }}\n />\n </div>\n </div>\n\n {/* Thread List */}\n <div style={{ flex: 1, overflowY: \"auto\", padding: \"4px 6px\" }}>\n {loading ? (\n <div\n style={{\n padding: \"30px 16px\",\n textAlign: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"12px\",\n }}\n >\n Loading threads...\n </div>\n ) : sortedThreads.length === 0 ? (\n <div\n style={{\n padding: \"30px 16px\",\n textAlign: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"12px\",\n }}\n >\n {searchQuery ? \"No threads found\" : \"No threads yet\"}\n </div>\n ) : (\n sortedThreads.map((thread) => {\n const isActive = thread.id === activeThreadId;\n return (\n <div\n key={thread.id}\n onClick={() => onSelectThread?.(thread.id)}\n style={{\n padding: \"10px 10px\",\n marginBottom: \"2px\",\n borderRadius: \"6px\",\n background: isActive\n ? \"rgba(94, 136, 176, 0.10)\"\n : \"transparent\",\n border: isActive\n ? \"1px solid rgba(94, 136, 176, 0.15)\"\n : \"1px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) e.currentTarget.style.background = \"rgba(0,0,0,0.03)\";\n }}\n onMouseLeave={(e) => {\n if (!isActive) e.currentTarget.style.background = \"transparent\";\n }}\n >\n {/* Title row */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\", marginBottom: \"4px\" }}>\n <MessageSquare\n size={12}\n style={{\n color: isActive ? \"var(--rail-discovery, #5E88B0)\" : \"var(--text-faint, rgba(30,33,37,0.36))\",\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n fontSize: \"12px\",\n fontWeight: isActive ? 650 : 550,\n color: isActive\n ? \"var(--text-ink, rgba(30,33,37,0.92))\"\n : \"var(--text-base, rgba(30,33,37,0.78))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {thread.title || \"Untitled thread\"}\n </div>\n {thread.pinned && (\n <Pin size={10} style={{ color: \"var(--rail-discovery, #5E88B0)\", flexShrink: 0 }} />\n )}\n </div>\n\n {/* Preview */}\n {thread.last_message_preview && (\n <div\n style={{\n fontSize: \"11px\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n marginLeft: \"18px\",\n marginBottom: \"4px\",\n }}\n >\n {thread.last_message_preview}\n </div>\n )}\n\n {/* Meta */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n marginLeft: \"18px\",\n fontSize: \"10px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n <Clock size={9} />\n <span>{formatTime(thread.updated_at || thread.created_at)}</span>\n {thread.message_count != null && (\n <>\n <span>·</span>\n <span>{thread.message_count} msg{thread.message_count !== 1 ? \"s\" : \"\"}</span>\n </>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n","/**\n * NOTE: Deprecated component.\n *\n * This chat-scoped `MessageThread` was an early demo implementation and\n * is tightly coupled to app-specific context (`useUserContext`, `toast`, etc.).\n *\n * For new work and for consumers of the `chordia-ui` library, prefer the\n * framework-agnostic, reusable version exported from:\n *\n * `src/components/common/MessageThread.jsx`\n *\n * which is re-exported via the main package entry:\n *\n * import { MessageThread } from \"chordia-ui\";\n *\n * This file is kept only for backwards compatibility within the app.\n */\n\"use client\";\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { Send, Paperclip, AtSign, Hash, Clock } from \"lucide-react\";\n// TODO: replace with framework-agnostic toast\nconst toast = { error: (...args) => console.warn(\"toast.error:\", ...args) };\n// TODO: replace with framework-agnostic context\nconst useUserContext = () => ({ userData: { name: \"User\", email: \"\" } });\n\n/**\n * MessageThread Component\n * Threaded messaging interface for team collaboration around sessions.\n * Supports mentions, condition references, and timestamp links.\n * Uses dummy data for demonstration purposes.\n */\nexport default function MessageThread({\n sessionTitle,\n messages: initialMessages,\n onSendMessage,\n currentUser,\n}) {\n const [messageInput, setMessageInput] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [messages, setMessages] = useState(initialMessages || []);\n const [isLoading, setIsLoading] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const { userData } = useUserContext();\n const messagesEndRef = useRef(null);\n\n // Get current user from context if not provided\n const displayCurrentUser = currentUser || {\n name: userData?.name || \"You\",\n initials: userData?.name\n ?.split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase() || \"YO\",\n color: \"#6B7C93\",\n };\n\n // Use initialMessages if provided, otherwise use empty array (no API fetching)\n useEffect(() => {\n if (initialMessages) {\n setMessages(initialMessages);\n } else {\n setMessages([]);\n }\n }, [initialMessages]);\n\n // Scroll to bottom when new messages arrive\n useEffect(() => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages]);\n\n const handleSend = async () => {\n if (!messageInput.trim()) return;\n\n const content = messageInput.trim();\n setMessageInput(\"\");\n setIsSending(true);\n\n // Create optimistic message\n const optimisticMessage = {\n id: `temp-${Date.now()}`,\n author: {\n name: displayCurrentUser.name,\n role: userData?.role || \"\",\n initials: displayCurrentUser.initials,\n color: displayCurrentUser.color,\n },\n content: content,\n timestamp: \"Just now\",\n type: \"comment\",\n isOptimistic: true,\n };\n\n // Optimistically add message\n setMessages((prev) => [...prev, optimisticMessage]);\n\n // If onSendMessage callback is provided, use it\n if (onSendMessage) {\n try {\n await onSendMessage(content);\n // Remove optimistic flag after callback succeeds\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticMessage.id\n ? { ...msg, isOptimistic: false }\n : msg\n )\n );\n } catch (error) {\n // Remove optimistic message on error\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticMessage.id));\n toast.error(\"Failed to send message\");\n } finally {\n setIsSending(false);\n }\n return;\n }\n\n // No API - just confirm the optimistic message\n setTimeout(() => {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticMessage.id\n ? { ...msg, isOptimistic: false }\n : msg\n )\n );\n setIsSending(false);\n }, 500);\n };\n\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"var(--radius-lg, 12px)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n {sessionTitle && (\n <div\n style={{\n padding: \"14px 16px\",\n borderBottom: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n fontSize: \"var(--text-md, 13px)\",\n fontWeight: 680,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n marginBottom: \"3px\",\n }}\n >\n Session Discussion\n </div>\n {sessionTitle && (\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n <span>{sessionTitle}</span>\n </div>\n )}\n </div>\n )}\n\n {/* Messages */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: \"16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\",\n }}\n >\n {isLoading ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n Loading messages...\n </div>\n ) : messages.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n No messages yet. Start the conversation!\n </div>\n ) : (\n messages.map((message) => (\n <div\n key={message.id}\n style={{\n display: \"flex\",\n gap: \"12px\",\n opacity: message.type === \"system\" ? 0.75 : 1,\n }}\n >\n {/* Avatar */}\n {message.type !== \"system\" && (\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"8px\",\n background: message.author.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n opacity: 0.9,\n }}\n >\n {message.author.initials}\n </div>\n )}\n {message.type === \"system\" && (\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"8px\",\n background: \"rgba(30, 33, 37, 0.08)\",\n color: \"rgba(30, 33, 37, 0.52)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n }}\n >\n <Clock size={14} />\n </div>\n )}\n\n {/* Message content */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* Author and timestamp */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n gap: \"8px\",\n marginBottom: \"4px\",\n }}\n >\n <span\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 650,\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n }}\n >\n {message.author.name}\n </span>\n <span\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontFamily: \"var(--font-mono, monospace)\",\n }}\n >\n {message.timestamp}\n </span>\n {message.author.role && (\n <span\n style={{\n fontSize: \"var(--text-xs, 10px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n fontWeight: 600,\n }}\n >\n {message.author.role}\n </span>\n )}\n {message.isEdited && (\n <span\n style={{\n fontSize: \"var(--text-xs, 10px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontStyle: \"italic\",\n }}\n >\n (edited)\n </span>\n )}\n </div>\n\n {/* Message text */}\n <div\n style={{\n fontSize: \"var(--text-md, 13px)\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n lineHeight: 1.5,\n marginBottom: message.references ? \"8px\" : 0,\n }}\n >\n {message.content}\n </div>\n\n {/* References */}\n {message.references && message.references.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px\",\n marginTop: \"8px\",\n }}\n >\n {message.references.map((ref, idx) => (\n <button\n key={idx}\n type=\"button\"\n style={{\n fontSize: \"11px\",\n padding: \"4px 8px\",\n borderRadius: \"6px\",\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\n background: \"rgba(255, 255, 255, 0.7)\",\n color:\n ref.type === \"condition\"\n ? \"rgba(94, 136, 176, 0.85)\"\n : ref.type === \"observation\"\n ? \"rgba(107, 123, 147, 0.85)\"\n : ref.type === \"timestamp\"\n ? \"rgba(184, 156, 106, 0.85)\"\n : \"rgba(30, 33, 37, 0.65)\",\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n transition: \"all 0.15s ease\",\n fontWeight: 550,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(255, 255, 255, 0.95)\";\n e.currentTarget.style.borderColor =\n \"rgba(52, 58, 64, 0.24)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background =\n \"rgba(255, 255, 255, 0.7)\";\n e.currentTarget.style.borderColor =\n \"rgba(52, 58, 64, 0.16)\";\n }}\n >\n {ref.type === \"timestamp\" && <Clock size={12} />}\n {(ref.type === \"condition\" ||\n ref.type === \"observation\") && <Hash size={12} />}\n {ref.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input area */}\n <div\n style={{\n padding: \"12px\",\n borderTop: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-end\",\n }}\n >\n {/* Current user avatar */}\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"var(--radius-md, 8px)\",\n background: displayCurrentUser.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 650,\n flexShrink: 0,\n opacity: 0.9,\n }}\n >\n {displayCurrentUser.initials}\n </div>\n\n {/* Input field */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n }}\n >\n <textarea\n value={messageInput}\n onChange={(e) => setMessageInput(e.target.value)}\n onKeyDown={handleKeyPress}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder=\"Add a comment...\"\n style={{\n width: \"100%\",\n minHeight: \"38px\",\n maxHeight: \"120px\",\n padding: \"8px 12px\",\n fontSize: \"var(--text-md, 13px)\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n background: \"white\",\n border: `1px solid ${\n isFocused\n ? \"rgba(94, 136, 176, 0.35)\"\n : \"rgba(52, 58, 64, 0.16)\"\n }`,\n borderRadius: \"var(--radius-md, 8px)\",\n resize: \"vertical\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n }}\n />\n\n {/* Toolbar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Mention user\"\n >\n <AtSign size={16} />\n </button>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Reference condition\"\n >\n <Hash size={16} />\n </button>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Attach file\"\n >\n <Paperclip size={16} />\n </button>\n </div>\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!messageInput.trim() || isSending}\n style={{\n padding: \"6px 12px\",\n background:\n messageInput.trim() && !isSending\n ? \"rgba(94, 136, 176, 0.85)\"\n : \"var(--border-subtle, rgba(52,58,64,0.08))\",\n border: \"none\",\n borderRadius: \"6px\",\n color:\n messageInput.trim() && !isSending\n ? \"white\"\n : \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 600,\n cursor:\n messageInput.trim() && !isSending\n ? \"pointer\"\n : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (messageInput.trim() && !isSending) {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 1)\";\n }\n }}\n onMouseLeave={(e) => {\n if (messageInput.trim() && !isSending) {\n e.currentTarget.style.background =\n \"rgba(94, 136, 176, 0.85)\";\n }\n }}\n >\n {isSending ? (\n <>\n <style>\n {`\n @keyframes messageSpin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <div\n style={{\n width: \"14px\",\n height: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"white\",\n borderRadius: \"50%\",\n animation: \"messageSpin 0.6s linear infinite\",\n }}\n />\n Sending...\n </>\n ) : (\n <>\n <Send size={14} />\n Send\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n <div\n style={{\n marginTop: \"8px\",\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n lineHeight: 1.4,\n }}\n >\n <strong>Tip:</strong> Use{\" \"}\n <code\n style={{\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 4px\",\n borderRadius: \"3px\",\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"var(--text-xs, 10px)\",\n }}\n >\n @\n </code>{\" \"}\n to mention teammates,{\" \"}\n <code\n style={{\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 4px\",\n borderRadius: \"3px\",\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"var(--text-xs, 10px)\",\n }}\n >\n #\n </code>{\" \"}\n to reference conditions\n </div>\n </div>\n </div>\n );\n}\n\n","\"use client\";\nimport React, { useRef, useCallback } from 'react';\nimport {\n ResponsiveContainer, BarChart, Bar, Cell, LineChart, Line,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n PieChart, Pie, AreaChart, Area,\n} from 'recharts';\n\n// Chordia design system rail colors — ordered for max visual distinction\nconst COLORS = [\n '#5E88B0', // rail-discovery / rail-blue\n '#9B7AA8', // rail-purple / rail-tone\n '#C98A5A', // rail-compliance / rail-orange\n '#7BA89D', // rail-signal-upsell (teal-green)\n '#D17B6B', // rail-coral / rail-signal-churn\n '#6B7C93', // rail-slate / rail-outcome\n '#9B8E6F', // rail-olive / rail-signal-satisfaction\n '#8A9BAF', // rail-quality\n '#B8976A', // rail-teal (warm gold)\n '#A8C76B', // green accent (complementary)\n];\n\n// Shared axis/tooltip/legend styling\nconst AXIS_TICK = { fill: 'var(--text-muted, #666)', fontSize: 12 };\nconst AXIS_LINE = { stroke: 'var(--border, #e0e0e0)' };\nconst GRID_STROKE = 'var(--border, #e0e0e0)';\nconst TOOLTIP_STYLE = {\n contentStyle: {\n backgroundColor: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',\n color: 'var(--text-ink, #1e2125)',\n },\n labelStyle: { color: 'var(--text-strong, #1e2125)' },\n};\nconst LEGEND_STYLE = { color: 'var(--text-ink, #1e2125)', fontSize: '12px' };\n\n// Smart label: skip x_label if tick values already contain the label text\nconst shouldShowAxisLabel = (label, tickValues) => {\n if (!label) return false;\n const lower = label.toLowerCase();\n // If most ticks contain the label word, it's redundant\n const matches = tickValues.filter(v => String(v).toLowerCase().includes(lower));\n return matches.length < tickValues.length * 0.5;\n};\n\n// --- Export utilities ---\nconst downloadPng = async (containerEl, title) => {\n const svg = containerEl.querySelector('svg');\n if (!svg) return;\n const clone = svg.cloneNode(true);\n // Ensure dimensions\n const w = svg.clientWidth || 600;\n const h = svg.clientHeight || 300;\n clone.setAttribute('width', w);\n clone.setAttribute('height', h);\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n // Inline computed styles for export fidelity\n const styleEl = document.createElement('style');\n styleEl.textContent = `text { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }`;\n clone.insertBefore(styleEl, clone.firstChild);\n const xml = new XMLSerializer().serializeToString(clone);\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const scale = 2; // retina\n canvas.width = w * scale;\n canvas.height = h * scale;\n const ctx = canvas.getContext('2d');\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0, w, h);\n URL.revokeObjectURL(url);\n const link = document.createElement('a');\n link.download = `${(title || 'chart').replace(/[^a-z0-9]+/gi, '_')}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n };\n img.src = url;\n};\n\nconst copyAsCsv = (series, allXValues) => {\n const header = ['', ...series.map(s => s.name)].join(',');\n const rows = allXValues.map(x => {\n const vals = series.map(s => {\n const match = s.data.find(d => d.x === x);\n return match ? match.y : '';\n });\n return [x, ...vals].join(',');\n });\n const csv = [header, ...rows].join('\\n');\n navigator.clipboard.writeText(csv);\n};\n\nconst ActionBar = ({ onDownload, onCopy, copied }) => (\n <div style={{\n display: 'flex', gap: 6, justifyContent: 'flex-end',\n marginBottom: 8, opacity: 0.7, transition: 'opacity 0.15s',\n }}>\n <button onClick={onCopy} title=\"Copy data as CSV\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n {copied ? '✓ Copied' : '📋 CSV'}\n </button>\n <button onClick={onDownload} title=\"Download as PNG\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n 📥 PNG\n </button>\n </div>\n);\n\nconst ChartRenderer = ({ chartType, title, xLabel, yLabel, series }) => {\n const chartRef = useRef(null);\n const [copied, setCopied] = React.useState(false);\n\n if (!series || series.length === 0) return null;\n\n // Transform: merge all series into [{x, series1: val, series2: val}, ...]\n const allXValues = [...new Set(series.flatMap(s => s.data.map(d => d.x)))];\n const chartData = allXValues.map(x => {\n const point = { x };\n series.forEach(s => {\n const match = s.data.find(d => d.x === x);\n point[s.name] = match ? match.y : null;\n });\n return point;\n });\n\n const seriesNames = series.map(s => s.name);\n const isSingleSeries = seriesNames.length === 1;\n\n // Determine if axis labels are redundant\n const showXLabel = shouldShowAxisLabel(xLabel, allXValues);\n const bottomMargin = showXLabel ? 20 : 5;\n\n // Check if x-axis labels are long (rotate them)\n const maxTickLen = Math.max(...allXValues.map(v => String(v).length));\n const rotateXTicks = maxTickLen > 12 || allXValues.length > 8;\n\n const containerStyle = {\n background: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-md, 8px)',\n padding: '16px',\n marginBottom: '16px',\n };\n\n const titleStyle = {\n color: 'var(--text-strong, #1e2125)',\n fontSize: '14px',\n fontWeight: '600',\n marginBottom: '12px',\n };\n\n const xAxisProps = {\n dataKey: 'x',\n tick: rotateXTicks\n ? { fill: 'var(--text-muted, #666)', fontSize: 11, angle: -35, textAnchor: 'end' }\n : AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(showXLabel ? {\n label: { value: xLabel, position: 'insideBottom', offset: -10, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } }\n } : {}),\n };\n\n const yAxisProps = {\n tick: AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(yLabel ? {\n label: { value: yLabel, angle: -90, position: 'insideLeft', style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } }\n } : {}),\n };\n\n const renderChart = () => {\n switch (chartType) {\n case 'bar':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n {!isSingleSeries && <Legend wrapperStyle={LEGEND_STYLE} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[2, 2, 0, 0]}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n\n case 'horizontal_bar': {\n // Horizontal bar: swap X/Y, use YAxis for categories\n return (\n <ResponsiveContainer width=\"100%\" height={Math.max(300, chartData.length * 40)}>\n <BarChart data={chartData} layout=\"vertical\" margin={{ top: 5, right: 30, left: 100, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis type=\"number\" tick={AXIS_TICK} axisLine={AXIS_LINE} tickLine={AXIS_LINE}\n {...(yLabel ? { label: { value: yLabel, position: 'insideBottom', offset: -5, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } } } : {})}\n />\n <YAxis type=\"category\" dataKey=\"x\" tick={{ fill: 'var(--text-muted, #666)', fontSize: 11 }} width={90} axisLine={AXIS_LINE} tickLine={AXIS_LINE} />\n <Tooltip {...TOOLTIP_STYLE} />\n {!isSingleSeries && <Legend wrapperStyle={LEGEND_STYLE} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[0, 2, 2, 0]}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n }\n\n case 'line':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n <Legend wrapperStyle={LEGEND_STYLE} />\n {seriesNames.map((name, i) => (\n <Line key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n dot={{ r: 4, fill: COLORS[i % COLORS.length] }}\n activeDot={{ r: 6, fill: COLORS[i % COLORS.length] }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n );\n\n case 'area':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <AreaChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n <Legend wrapperStyle={LEGEND_STYLE} />\n {seriesNames.map((name, i) => (\n <Area key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n fill={COLORS[i % COLORS.length]} fillOpacity={0.15}\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n );\n\n case 'pie': {\n // Pie uses first series only\n const pieData = series[0].data.map((d, i) => ({\n name: d.x,\n value: d.y,\n fill: COLORS[i % COLORS.length],\n }));\n const RADIAN = Math.PI / 180;\n const renderLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, name }) => {\n const radius = outerRadius + 20;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n if (percent < 0.04) return null;\n return (\n <text x={x} y={y} fill=\"var(--text-ink, #1e2125)\" fontSize={11}\n textAnchor={x > cx ? 'start' : 'end'} dominantBaseline=\"central\">\n {name} ({(percent * 100).toFixed(0)}%)\n </text>\n );\n };\n return (\n <ResponsiveContainer width=\"100%\" height={320}>\n <PieChart>\n <Pie data={pieData} cx=\"50%\" cy=\"50%\" outerRadius={100}\n dataKey=\"value\" label={renderLabel} labelLine={{ stroke: 'var(--text-muted, #666)' }}>\n {pieData.map((entry, i) => (\n <Cell key={i} fill={entry.fill} />\n ))}\n </Pie>\n <Tooltip {...TOOLTIP_STYLE} />\n </PieChart>\n </ResponsiveContainer>\n );\n }\n\n case 'metric': {\n const s = series[0];\n const current = s.data[0];\n const previous = s.data.length > 1 ? s.data[1] : null;\n const value = current.y;\n const unit = current.x || '';\n const hasTrend = previous !== null;\n const change = hasTrend ? value - previous.y : 0;\n const pctChange = hasTrend && previous.y !== 0 ? ((change / Math.abs(previous.y)) * 100) : 0;\n const isPositive = change > 0;\n const isNegative = change < 0;\n const trendColor = isPositive ? '#7BA89D' : isNegative ? '#D17B6B' : 'var(--text-muted, #666)';\n const trendArrow = isPositive ? '↑' : isNegative ? '↓' : '→';\n\n // Format large numbers nicely\n const fmt = (n) => {\n if (Number.isInteger(n) && Math.abs(n) >= 1000) return n.toLocaleString();\n if (typeof n === 'number') return n % 1 === 0 ? n.toString() : n.toFixed(n < 10 ? 2 : 1);\n return String(n);\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 12, padding: '8px 0' }}>\n <div style={{\n fontSize: '36px', fontWeight: 700, lineHeight: 1,\n color: 'var(--text-strong, #1e2125)',\n fontVariantNumeric: 'tabular-nums',\n }}>\n {fmt(value)}\n </div>\n {unit && (\n <div style={{ fontSize: '14px', color: 'var(--text-muted, #666)', fontWeight: 500 }}>\n {unit}\n </div>\n )}\n {hasTrend && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: 4,\n fontSize: '13px', fontWeight: 600, color: trendColor,\n background: isPositive ? 'rgba(123,168,157,0.12)' : isNegative ? 'rgba(209,123,107,0.12)' : 'rgba(128,128,128,0.08)',\n padding: '3px 8px', borderRadius: 'var(--radius-sm, 4px)',\n }}>\n <span>{trendArrow}</span>\n <span>{fmt(Math.abs(change))} ({Math.abs(pctChange).toFixed(1)}%)</span>\n </div>\n )}\n {hasTrend && (\n <div style={{ fontSize: '11px', color: 'var(--text-faint, #999)' }}>\n vs {previous.x || 'previous'}\n </div>\n )}\n </div>\n );\n }\n\n default:\n return <div style={{ color: 'var(--text-muted)', fontSize: 12, padding: 8 }}>Unsupported chart type: {chartType}</div>;\n }\n };\n\n const handleDownload = useCallback(() => {\n if (chartRef.current) downloadPng(chartRef.current, title);\n }, [title]);\n\n const handleCopy = useCallback(() => {\n copyAsCsv(series, allXValues);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [series, allXValues]);\n\n const showActions = chartType !== 'metric';\n\n return (\n <div style={containerStyle}>\n {title && <div style={titleStyle}>{title}</div>}\n {showActions && <ActionBar onDownload={handleDownload} onCopy={handleCopy} copied={copied} />}\n <div ref={chartRef}>\n {renderChart()}\n </div>\n </div>\n );\n};\n\nexport default ChartRenderer;\n"],"names":["MarkdownRenderer","content","onCodeBlockClick","onFilePathClick","copiedBlocks","setCopiedBlocks","useState","copyToClipboard","text","blockId","prev","newSet","err","renderCodeBlock","code","language","isCopied","jsxs","jsx","e","Check","Copy","PanelRightOpen","parseMarkdown","elements","lines","i","line","codeLines","level","HeaderTag","React","listItems","isOrdered","match","ListTag","item","idx","parseInlineMarkdownWithContext","tableRows","parseCells","row","c","headerCells","isSeparator","hasSeparator","bodyStart","alignments","cellStyle","cell","ci","ri","paragraph","parseInlineMarkdown","remaining","key","filePathMatch","filePath","inlineCodeMatch","boldMatch","italicMatch","linkMatch","nextSpecialChar","ChatMessage","role","html","timestamp","toolBadges","isStreaming","isUser","badge","index","Wrench","ThinkingIndicator","phase","toolSteps","label","elapsedMs","compact","formatElapsedTime","ms","seconds","minutes","remainingSeconds","getPhaseLabel","renderToolStep","step","getStatusDot","baseDotStyle","getStatusText","renderShimmerBar","renderCursor","phaseLabel","elapsedTime","toast","args","ChatInterface","initialMessages","onSendMessage","onStreamMessage","onMessagesChange","placeholder","title","messages","setMessages","inputValue","setInputValue","isProcessing","setIsProcessing","isSending","setIsSending","currentAssistantMessage","setCurrentAssistantMessage","thinkingPhase","setThinkingPhase","thinkingStartTime","setThinkingStartTime","setElapsedMs","messagesEndRef","useRef","inputRef","streamAbortController","currentAssistantRef","lastChunkTimeRef","streamSilent","setStreamSilent","silenceSeconds","setSilenceSeconds","useEffect","_a","allMessages","interval","gap","resetProcessingState","parseSSELine","data","handleStreamChunk","chunk","_b","delta","baseMessage","updated","processStream","stream","reader","decoder","buffer","done","value","parsed","handleSend","userContent","userMessage","newMessages","result","assistantMessage","resolved","error","handleKeyDown","Fragment","message","Send","ChatHistoryPanel","threads","activeThreadId","onSelectThread","onNewChat","loading","searchQuery","setSearchQuery","sortedThreads","thread","q","a","b","aTime","formatTime","dateStr","d","diffMs","diffDays","Search","isActive","MessageSquare","Pin","Clock","useUserContext","MessageThread","sessionTitle","currentUser","messageInput","setMessageInput","isFocused","setIsFocused","isLoading","setIsLoading","userData","displayCurrentUser","n","optimisticMessage","msg","handleKeyPress","ref","Hash","AtSign","Paperclip","COLORS","AXIS_TICK","AXIS_LINE","GRID_STROKE","TOOLTIP_STYLE","LEGEND_STYLE","shouldShowAxisLabel","tickValues","lower","v","downloadPng","containerEl","svg","clone","w","h","styleEl","xml","blob","url","img","canvas","scale","ctx","link","copyAsCsv","series","allXValues","header","s","rows","x","vals","csv","ActionBar","onDownload","onCopy","copied","ChartRenderer","chartType","xLabel","yLabel","chartRef","setCopied","chartData","point","seriesNames","isSingleSeries","showXLabel","bottomMargin","rotateXTicks","containerStyle","titleStyle","xAxisProps","yAxisProps","renderChart","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","name","Bar","_","Cell","LineChart","Line","AreaChart","Area","pieData","RADIAN","PieChart","Pie","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","y","entry","current","previous","unit","hasTrend","change","pctChange","isPositive","isNegative","trendColor","trendArrow","fmt","handleDownload","useCallback","handleCopy"],"mappings":"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"}
|