chordia-ui 3.7.0 → 3.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ChatMessage.cjs.js +15 -0
- package/dist/ChatMessage.cjs.js.map +1 -0
- package/dist/ChatMessage.es.js +915 -0
- package/dist/ChatMessage.es.js.map +1 -0
- package/dist/SideDrawer.cjs.js +2 -0
- package/dist/SideDrawer.cjs.js.map +1 -0
- package/dist/SideDrawer.es.js +358 -0
- package/dist/SideDrawer.es.js.map +1 -0
- package/dist/Toast.cjs.js +2 -2
- package/dist/Toast.cjs.js.map +1 -1
- package/dist/Toast.es.js +301 -671
- package/dist/Toast.es.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.cjs.js +4 -4
- package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.es.js +652 -603
- package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
- package/dist/components/chat.cjs.js +5 -7
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +393 -849
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/common.cjs.js +1 -1
- package/dist/components/common.es.js +28 -27
- package/dist/components/common.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.es.js +73 -72
- package/dist/index.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/UpdatedInteractionDetails/UpdatedInteractionContext.jsx +6 -2
- package/src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx +190 -139
- package/src/components/chat/ChartRenderer.jsx +300 -49
- package/src/components/common/AskCompass.jsx +91 -87
- package/src/components/common/SideDrawer.jsx +7 -3
- package/dist/ChartRenderer.cjs.js +0 -3
- package/dist/ChartRenderer.cjs.js.map +0 -1
- package/dist/ChartRenderer.es.js +0 -304
- package/dist/ChartRenderer.es.js.map +0 -1
|
@@ -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"],"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 // Override the chat bubble's inherited `word-break: break-word`\n // so cells size to natural min-content; the wrapper's\n // overflow-x: auto handles wide tables via horizontal scroll\n // instead of collapsing columns char-by-char on long URLs.\n wordBreak: 'normal',\n overflowWrap: 'normal',\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 const linkText = linkMatch[1];\n const linkHref = linkMatch[2];\n const isViewButton = linkText === 'View';\n const viewButtonStyle = {\n display: 'inline-flex',\n alignItems: 'center',\n padding: '3px 10px',\n background: 'var(--rail-discovery, #5E88B0)',\n color: '#fff',\n textDecoration: 'none',\n borderRadius: '4px',\n fontSize: '12px',\n fontWeight: 600,\n whiteSpace: 'nowrap',\n cursor: 'pointer',\n };\n const defaultLinkStyle = {\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n };\n elements.push(\n <a key={`link-${key++}`}\n href={linkHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={isViewButton ? viewButtonStyle : defaultLinkStyle}>\n {linkText}\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"],"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","linkText","linkHref","isViewButton","viewButtonStyle","defaultLinkStyle","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","optimisticMessage","msg","handleKeyPress","ref","Hash","AtSign","Paperclip"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat.es.js","sources":["../../src/components/chat/ThinkingIndicator.jsx","../../src/components/chat/ChatInterface.jsx","../../src/components/chat/ChatHistoryPanel.jsx","../../src/components/chat/MessageThread.jsx"],"sourcesContent":["\"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"],"names":["ThinkingIndicator","phase","toolSteps","label","elapsedMs","compact","formatElapsedTime","ms","seconds","minutes","remainingSeconds","getPhaseLabel","renderToolStep","step","index","getStatusDot","baseDotStyle","jsx","getStatusText","jsxs","renderShimmerBar","renderCursor","phaseLabel","elapsedTime","toast","args","ChatInterface","initialMessages","onSendMessage","onStreamMessage","onMessagesChange","onCodeBlockClick","placeholder","title","messages","setMessages","useState","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","line","data","handleStreamChunk","chunk","_b","delta","prev","baseMessage","updated","processStream","stream","reader","decoder","buffer","done","value","lines","parsed","handleSend","userContent","userMessage","newMessages","result","assistantMessage","resolved","error","handleKeyDown","e","Fragment","message","ChatMessage","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","content","optimisticMessage","msg","handleKeyPress","ref","idx","Hash","AtSign","Paperclip"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../Toast.cjs.js"),a=require("../AgentLiftCard.cjs.js"),r=require("../SummarySection.cjs.js"),t=require("../CustomFilterChips.cjs.js"),o=require("../TourGuideTooltip.cjs.js"),i=require("../SideDrawer.cjs.js");require("react/jsx-runtime");require("react");require("motion/react");require("lucide-react");require("../ChatMessage.cjs.js");require("recharts");require("../TextInput.cjs.js");require("../SmallButton.cjs.js");require("../Tooltip.cjs.js");require("react-dom");exports.AskCompass=e.AskCompass;exports.AutoSearch=e.AutoSearch;exports.FileUploadSuccessState=e.FileUploadSuccessState;exports.FileUploadingState=e.FileUploadingState;exports.Toast=e.Toast;exports.ToastContainer=e.ToastContainer;exports.AgentLiftCard=a.AgentLiftCard;exports.EvidenceItem=a.EvidenceItem;exports.ConditionCard=r.ConditionCard;exports.ModelScoreCard=r.ModelScoreCard;exports.ObservationCard=r.ObservationCard;exports.ScoreDriverCard=r.ScoreDriverCard;exports.ScoreDriverCardVariant=r.ScoreDriverCardVariant;exports.SignalCard=r.SignalCard;exports.SmallObservationCard=r.SmallObservationCard;exports.SummarySection=r.SummarySection;exports.CustomFilterChips=t.CustomFilterChips;exports.Pagination=t.Pagination;exports.TourGuideTooltip=o.TourGuideTooltip;exports.DrawerButton=i.DrawerButton;exports.DrawerInput=i.DrawerInput;exports.DrawerLabel=i.DrawerLabel;exports.SideDrawer=i.SideDrawer;
|
|
2
2
|
//# sourceMappingURL=common.cjs.js.map
|