chordia-ui 3.9.2 → 3.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/PerformancePanel.cjs.js +1 -1
- package/dist/PerformancePanel.cjs.js.map +1 -1
- package/dist/PerformancePanel.es.js +587 -749
- package/dist/PerformancePanel.es.js.map +1 -1
- package/dist/components/chat.cjs.js +3 -3
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +67 -67
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/media.cjs.js +1 -1
- package/dist/components/media.cjs.js.map +1 -1
- package/dist/components/media.es.js +4 -4
- package/dist/components/media.es.js.map +1 -1
- package/dist/components/reports.cjs.js +2 -2
- package/dist/components/reports.cjs.js.map +1 -1
- package/dist/components/reports.es.js +18 -18
- package/dist/components/reports.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/chat/ChatHistoryPanel.jsx +3 -3
- package/src/components/chat/ChatInterface.jsx +3 -3
- package/src/components/media/InteractionSummaryCard.jsx +1 -1
- package/src/components/performance/PerformanceDetailsPage.jsx +51 -52
- package/src/components/performance/performanceRangeFormat.js +3 -2
- package/src/components/reports/ReportsDetails.jsx +2 -2
|
@@ -1 +1 @@
|
|
|
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, useRef, useEffect } from \"react\";\nimport { MessageSquare, Search, Clock, Pin, Pencil, Trash2, Check, X } 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 * onRenameThread - (threadId, newTitle) => void // optional: when provided, inline edit is enabled\n * onDeleteThread - (threadId) => void // optional: when provided, inline delete is enabled\n * loading - boolean\n */\nexport default function ChatHistoryPanel({\n threads = [],\n activeThreadId,\n onSelectThread,\n onNewChat,\n onRenameThread,\n onDeleteThread,\n loading = false,\n}) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [hoveredId, setHoveredId] = useState(null);\n const [editingId, setEditingId] = useState(null);\n const [editValue, setEditValue] = useState(\"\");\n const [deletingId, setDeletingId] = useState(null);\n const editInputRef = useRef(null);\n\n useEffect(() => {\n if (editingId && editInputRef.current) {\n editInputRef.current.focus();\n editInputRef.current.select();\n }\n }, [editingId]);\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 const startEdit = (e, thread) => {\n e.stopPropagation();\n setDeletingId(null);\n setEditingId(thread.id);\n setEditValue(thread.title || \"\");\n };\n\n const saveEdit = (e) => {\n if (e) e.stopPropagation();\n const trimmed = (editValue || \"\").trim();\n if (editingId && trimmed) {\n onRenameThread?.(editingId, trimmed);\n }\n setEditingId(null);\n setEditValue(\"\");\n };\n\n const cancelEdit = (e) => {\n if (e) e.stopPropagation();\n setEditingId(null);\n setEditValue(\"\");\n };\n\n const startDelete = (e, thread) => {\n e.stopPropagation();\n setEditingId(null);\n setDeletingId(thread.id);\n };\n\n const confirmDelete = (e) => {\n if (e) e.stopPropagation();\n if (deletingId) {\n onDeleteThread?.(deletingId);\n }\n setDeletingId(null);\n };\n\n const cancelDelete = (e) => {\n if (e) e.stopPropagation();\n setDeletingId(null);\n };\n\n const iconBtnStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"22px\",\n height: \"22px\",\n padding: 0,\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n transition: \"all 0.12s ease\",\n flexShrink: 0,\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 const isHovered = hoveredId === thread.id;\n const isEditing = editingId === thread.id;\n const isDeleting = deletingId === thread.id;\n const canEdit = typeof onRenameThread === \"function\";\n const canDelete = typeof onDeleteThread === \"function\";\n const showActions = (canEdit || canDelete) && isHovered && !isEditing && !isDeleting;\n\n return (\n <div\n key={thread.id}\n onClick={() => {\n if (isEditing || isDeleting) return;\n onSelectThread?.(thread.id);\n }}\n onMouseEnter={(e) => {\n setHoveredId(thread.id);\n if (!isActive) e.currentTarget.style.background = \"rgba(0,0,0,0.03)\";\n }}\n onMouseLeave={(e) => {\n setHoveredId((prev) => (prev === thread.id ? null : prev));\n if (!isActive) e.currentTarget.style.background = \"transparent\";\n }}\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: isEditing || isDeleting ? \"default\" : \"pointer\",\n transition: \"all 0.12s ease\",\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\n {isEditing ? (\n <input\n ref={editInputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") saveEdit(e);\n else if (e.key === \"Escape\") cancelEdit(e);\n }}\n style={{\n flex: 1,\n minWidth: 0,\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n background: \"var(--paper-elevated, #fff)\",\n border: \"1px solid rgba(94, 136, 176, 0.45)\",\n borderRadius: \"4px\",\n padding: \"3px 6px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n ) : (\n <div\n style={{\n flex: 1,\n minWidth: 0,\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 )}\n\n {!isEditing && !isDeleting && thread.pinned && (\n <Pin size={10} style={{ color: \"var(--rail-discovery, #5E88B0)\", flexShrink: 0 }} />\n )}\n\n {/* Inline edit actions: save / cancel */}\n {isEditing && (\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"2px\", flexShrink: 0 }}>\n <button\n type=\"button\"\n title=\"Save\"\n onClick={saveEdit}\n style={{\n ...iconBtnStyle,\n color: \"var(--rail-discovery, #5E88B0)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 0.12)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <Check size={13} />\n </button>\n <button\n type=\"button\"\n title=\"Cancel\"\n onClick={cancelEdit}\n style={iconBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <X size={13} />\n </button>\n </div>\n )}\n\n {/* Hover actions: edit / delete */}\n {showActions && (\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"2px\", flexShrink: 0 }}>\n {canEdit && (\n <button\n type=\"button\"\n title=\"Rename\"\n onClick={(e) => startEdit(e, thread)}\n style={iconBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n e.currentTarget.style.color = \"var(--text-ink, rgba(30,33,37,0.92))\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--text-muted, rgba(30,33,37,0.56))\";\n }}\n >\n <Pencil size={12} />\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n title=\"Delete\"\n onClick={(e) => startDelete(e, thread)}\n style={iconBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(220, 53, 69, 0.10)\";\n e.currentTarget.style.color = \"#DC3545\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--text-muted, rgba(30,33,37,0.56))\";\n }}\n >\n <Trash2 size={12} />\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* Inline delete confirmation */}\n {isDeleting ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n marginLeft: \"18px\",\n marginTop: \"2px\",\n }}\n >\n <span\n style={{\n fontSize: \"11px\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n fontWeight: 500,\n }}\n >\n Confirm: delete this thread?\n </span>\n <button\n type=\"button\"\n onClick={confirmDelete}\n style={{\n padding: \"3px 10px\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n background: \"#ECEEF2\",\n border: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n borderRadius: \"5px\",\n cursor: \"pointer\",\n transition: \"background 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#E2E5EA\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"#ECEEF2\";\n }}\n >\n Yes\n </button>\n <button\n type=\"button\"\n onClick={cancelDelete}\n style={{\n padding: \"3px 4px\",\n fontSize: \"11px\",\n fontWeight: 500,\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"color 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"var(--text-ink, rgba(30,33,37,0.92))\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"var(--text-muted, rgba(30,33,37,0.56))\";\n }}\n >\n No\n </button>\n </div>\n ) : (\n <>\n {/* Preview */}\n {thread.last_message_preview && !isEditing && (\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 </>\n )}\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","onRenameThread","onDeleteThread","loading","searchQuery","setSearchQuery","hoveredId","setHoveredId","editingId","setEditingId","editValue","setEditValue","deletingId","setDeletingId","editInputRef","sortedThreads","thread","q","a","b","aTime","formatTime","dateStr","d","diffMs","diffDays","startEdit","saveEdit","trimmed","cancelEdit","startDelete","confirmDelete","cancelDelete","iconBtnStyle","Search","isActive","isHovered","isEditing","isDeleting","canEdit","canDelete","showActions","MessageSquare","Pin","Check","X","Pencil","Trash2","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
|
+
{"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(undefined, {\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(undefined, {\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(undefined, {\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, useRef, useEffect } from \"react\";\nimport { MessageSquare, Search, Clock, Pin, Pencil, Trash2, Check, X } 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 * onRenameThread - (threadId, newTitle) => void // optional: when provided, inline edit is enabled\n * onDeleteThread - (threadId) => void // optional: when provided, inline delete is enabled\n * loading - boolean\n */\nexport default function ChatHistoryPanel({\n threads = [],\n activeThreadId,\n onSelectThread,\n onNewChat,\n onRenameThread,\n onDeleteThread,\n loading = false,\n}) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [hoveredId, setHoveredId] = useState(null);\n const [editingId, setEditingId] = useState(null);\n const [editValue, setEditValue] = useState(\"\");\n const [deletingId, setDeletingId] = useState(null);\n const editInputRef = useRef(null);\n\n useEffect(() => {\n if (editingId && editInputRef.current) {\n editInputRef.current.focus();\n editInputRef.current.select();\n }\n }, [editingId]);\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(undefined, { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else if (diffDays < 7) {\n return d.toLocaleDateString(undefined, { weekday: \"short\" });\n } else {\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n }\n };\n\n const startEdit = (e, thread) => {\n e.stopPropagation();\n setDeletingId(null);\n setEditingId(thread.id);\n setEditValue(thread.title || \"\");\n };\n\n const saveEdit = (e) => {\n if (e) e.stopPropagation();\n const trimmed = (editValue || \"\").trim();\n if (editingId && trimmed) {\n onRenameThread?.(editingId, trimmed);\n }\n setEditingId(null);\n setEditValue(\"\");\n };\n\n const cancelEdit = (e) => {\n if (e) e.stopPropagation();\n setEditingId(null);\n setEditValue(\"\");\n };\n\n const startDelete = (e, thread) => {\n e.stopPropagation();\n setEditingId(null);\n setDeletingId(thread.id);\n };\n\n const confirmDelete = (e) => {\n if (e) e.stopPropagation();\n if (deletingId) {\n onDeleteThread?.(deletingId);\n }\n setDeletingId(null);\n };\n\n const cancelDelete = (e) => {\n if (e) e.stopPropagation();\n setDeletingId(null);\n };\n\n const iconBtnStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"22px\",\n height: \"22px\",\n padding: 0,\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"4px\",\n cursor: \"pointer\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n transition: \"all 0.12s ease\",\n flexShrink: 0,\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 const isHovered = hoveredId === thread.id;\n const isEditing = editingId === thread.id;\n const isDeleting = deletingId === thread.id;\n const canEdit = typeof onRenameThread === \"function\";\n const canDelete = typeof onDeleteThread === \"function\";\n const showActions = (canEdit || canDelete) && isHovered && !isEditing && !isDeleting;\n\n return (\n <div\n key={thread.id}\n onClick={() => {\n if (isEditing || isDeleting) return;\n onSelectThread?.(thread.id);\n }}\n onMouseEnter={(e) => {\n setHoveredId(thread.id);\n if (!isActive) e.currentTarget.style.background = \"rgba(0,0,0,0.03)\";\n }}\n onMouseLeave={(e) => {\n setHoveredId((prev) => (prev === thread.id ? null : prev));\n if (!isActive) e.currentTarget.style.background = \"transparent\";\n }}\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: isEditing || isDeleting ? \"default\" : \"pointer\",\n transition: \"all 0.12s ease\",\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\n {isEditing ? (\n <input\n ref={editInputRef}\n type=\"text\"\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={(e) => {\n e.stopPropagation();\n if (e.key === \"Enter\") saveEdit(e);\n else if (e.key === \"Escape\") cancelEdit(e);\n }}\n style={{\n flex: 1,\n minWidth: 0,\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n background: \"var(--paper-elevated, #fff)\",\n border: \"1px solid rgba(94, 136, 176, 0.45)\",\n borderRadius: \"4px\",\n padding: \"3px 6px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n ) : (\n <div\n style={{\n flex: 1,\n minWidth: 0,\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 )}\n\n {!isEditing && !isDeleting && thread.pinned && (\n <Pin size={10} style={{ color: \"var(--rail-discovery, #5E88B0)\", flexShrink: 0 }} />\n )}\n\n {/* Inline edit actions: save / cancel */}\n {isEditing && (\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"2px\", flexShrink: 0 }}>\n <button\n type=\"button\"\n title=\"Save\"\n onClick={saveEdit}\n style={{\n ...iconBtnStyle,\n color: \"var(--rail-discovery, #5E88B0)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 0.12)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <Check size={13} />\n </button>\n <button\n type=\"button\"\n title=\"Cancel\"\n onClick={cancelEdit}\n style={iconBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <X size={13} />\n </button>\n </div>\n )}\n\n {/* Hover actions: edit / delete */}\n {showActions && (\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"2px\", flexShrink: 0 }}>\n {canEdit && (\n <button\n type=\"button\"\n title=\"Rename\"\n onClick={(e) => startEdit(e, thread)}\n style={iconBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n e.currentTarget.style.color = \"var(--text-ink, rgba(30,33,37,0.92))\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--text-muted, rgba(30,33,37,0.56))\";\n }}\n >\n <Pencil size={12} />\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n title=\"Delete\"\n onClick={(e) => startDelete(e, thread)}\n style={iconBtnStyle}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(220, 53, 69, 0.10)\";\n e.currentTarget.style.color = \"#DC3545\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"var(--text-muted, rgba(30,33,37,0.56))\";\n }}\n >\n <Trash2 size={12} />\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* Inline delete confirmation */}\n {isDeleting ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n marginLeft: \"18px\",\n marginTop: \"2px\",\n }}\n >\n <span\n style={{\n fontSize: \"11px\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n fontWeight: 500,\n }}\n >\n Confirm: delete this thread?\n </span>\n <button\n type=\"button\"\n onClick={confirmDelete}\n style={{\n padding: \"3px 10px\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n background: \"#ECEEF2\",\n border: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n borderRadius: \"5px\",\n cursor: \"pointer\",\n transition: \"background 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#E2E5EA\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"#ECEEF2\";\n }}\n >\n Yes\n </button>\n <button\n type=\"button\"\n onClick={cancelDelete}\n style={{\n padding: \"3px 4px\",\n fontSize: \"11px\",\n fontWeight: 500,\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n transition: \"color 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"var(--text-ink, rgba(30,33,37,0.92))\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"var(--text-muted, rgba(30,33,37,0.56))\";\n }}\n >\n No\n </button>\n </div>\n ) : (\n <>\n {/* Preview */}\n {thread.last_message_preview && !isEditing && (\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 </>\n )}\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","onRenameThread","onDeleteThread","loading","searchQuery","setSearchQuery","hoveredId","setHoveredId","editingId","setEditingId","editValue","setEditValue","deletingId","setDeletingId","editInputRef","sortedThreads","thread","q","a","b","aTime","formatTime","dateStr","d","diffMs","diffDays","startEdit","saveEdit","trimmed","cancelEdit","startDelete","confirmDelete","cancelDelete","iconBtnStyle","Search","isActive","isHovered","isEditing","isDeleting","canEdit","canDelete","showActions","MessageSquare","Pin","Check","X","Pencil","Trash2","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 x=require("../Timeline.cjs.js"),r=require("react/jsx-runtime"),w=require("react");require("lucide-react");const C={inbound:"var(--rail-discovery, #5E88B0)",outbound:"var(--rail-purple, #9B7AA8)",internal:"var(--rail-outcome, #6B7C93)",chat:"var(--rail-teal, #7BA89D)"},D=t=>{if(t==null||t<=0)return null;const i=Math.floor(t/3600),o=Math.floor(t%3600/60),s=Math.round(t%60);return i>0?`${i}:${String(o).padStart(2,"0")}:${String(s).padStart(2,"0")}`:`${o}:${String(s).padStart(2,"0")}`},R=t=>{if(!t)return null;try{return new Date(t).toLocaleDateString(
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const x=require("../Timeline.cjs.js"),r=require("react/jsx-runtime"),w=require("react");require("lucide-react");const C={inbound:"var(--rail-discovery, #5E88B0)",outbound:"var(--rail-purple, #9B7AA8)",internal:"var(--rail-outcome, #6B7C93)",chat:"var(--rail-teal, #7BA89D)"},D=t=>{if(t==null||t<=0)return null;const i=Math.floor(t/3600),o=Math.floor(t%3600/60),s=Math.round(t%60);return i>0?`${i}:${String(o).padStart(2,"0")}:${String(s).padStart(2,"0")}`:`${o}:${String(s).padStart(2,"0")}`},R=t=>{if(!t)return null;try{return new Date(t).toLocaleDateString(void 0,{month:"short",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch{return null}};function W({title:t,agentName:i,customerName:o,date:s,duration:y,direction:u,driver:v,sentiment:c,disposition:h,scores:p,tags:f,railColor:T,isActive:d=!1,onClick:g,children:S}){const j=T||C[u]||"var(--rail-outcome, #6B7C93)",b=D(y),m=R(s),l=[];i&&l.push(i),o&&l.push(o),m&&l.push(m),b&&l.push(b);const a=[];return u&&a.push({label:u}),v&&a.push({label:v}),c&&a.push({label:c}),h&&a.push({label:h}),f&&a.push(...f),r.jsxs("div",{onClick:g,style:{position:"relative",padding:"10px 14px 10px 18px",borderRadius:"var(--radius-md, 8px)",overflow:"hidden",background:d?"var(--hover-warm-subtle, rgba(231,212,162,0.08))":"var(--paper-elevated, rgba(255,255,255,0.82))",border:`1px solid ${d?"var(--border-hover, rgba(52,58,64,0.18))":"var(--border, rgba(52,58,64,0.12))"}`,cursor:g?"pointer":"default",transition:"background 0.15s, border-color 0.15s"},onMouseEnter:e=>{!d&&g&&(e.currentTarget.style.background="var(--hover-warm-subtle, rgba(231,212,162,0.08))",e.currentTarget.style.borderColor="var(--border-hover, rgba(52,58,64,0.18))")},onMouseLeave:e=>{d||(e.currentTarget.style.background="var(--paper-elevated, rgba(255,255,255,0.82))",e.currentTarget.style.borderColor="var(--border, rgba(52,58,64,0.12))")},children:[r.jsx("div",{style:{position:"absolute",left:0,top:0,bottom:0,width:"var(--rail-width-thin, 4px)",backgroundColor:j,borderRadius:"var(--radius-md, 8px) 0 0 var(--radius-md, 8px)"}}),r.jsxs("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:12},children:[r.jsxs("div",{style:{flex:1,minWidth:0},children:[t?r.jsx("div",{style:{fontSize:"var(--text-md, 13px)",fontWeight:550,color:"var(--text-strong, rgba(30,33,37,0.92))",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",lineHeight:"var(--leading-snug, 1.375)"},children:t}):null,l.length>0?r.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:6,marginTop:3,fontSize:"var(--text-sm, 11px)",color:"var(--text-muted, rgba(30,33,37,0.56))",lineHeight:"var(--leading-snug, 1.375)"},children:l.map((e,n)=>r.jsxs(w.Fragment,{children:[n>0?r.jsx("span",{style:{color:"var(--text-xfaint, rgba(30,33,37,0.28))"},children:"·"}):null,r.jsx("span",{children:e})]},n))}):null,a.length>0?r.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4,marginTop:6},children:a.map((e,n)=>r.jsx("span",{style:{display:"inline-block",fontSize:"var(--text-xs, 10px)",fontWeight:500,padding:"1px 7px",borderRadius:999,background:"var(--paper, rgba(255,255,255,0.78))",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",color:e.color||"var(--text-faint, rgba(30,33,37,0.36))",textTransform:"capitalize",letterSpacing:"0.01em",lineHeight:1.5},children:e.label},n))}):null]}),p&&p.length>0?r.jsx("div",{style:{display:"flex",gap:10,flexShrink:0,alignItems:"flex-start",paddingTop:2},children:p.map((e,n)=>r.jsxs("div",{style:{textAlign:"center",minWidth:28},children:[r.jsx("div",{style:{fontSize:"var(--text-lg, 14px)",fontWeight:600,color:"var(--text-strong, rgba(30,33,37,0.92))",fontFamily:"var(--font-mono, monospace)",lineHeight:1.2},children:e.value!=null?Math.round(e.value):"—"}),r.jsx("div",{style:{fontSize:"var(--text-xxs, 9px)",fontWeight:650,textTransform:"uppercase",letterSpacing:"var(--tracking-label, 0.16em)",color:"var(--text-xfaint, rgba(30,33,37,0.28))",marginTop:1},children:e.label})]},n))}):null]}),S]})}exports.ConversationTurn=x.ConversationTurn;exports.Timeline=x.Timeline;exports.TranscriptCard=x.TranscriptCard;exports.InteractionSummaryCard=W;
|
|
2
2
|
//# sourceMappingURL=media.cjs.js.map
|