chordia-ui 4.0.6 → 4.0.7

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.
Files changed (36) hide show
  1. package/dist/MessageThread.cjs.js +4 -6
  2. package/dist/MessageThread.cjs.js.map +1 -1
  3. package/dist/MessageThread.es.js +348 -475
  4. package/dist/MessageThread.es.js.map +1 -1
  5. package/dist/ThinkingIndicator.cjs.js +17 -0
  6. package/dist/ThinkingIndicator.cjs.js.map +1 -0
  7. package/dist/{ChatMessage.es.js → ThinkingIndicator.es.js} +415 -288
  8. package/dist/ThinkingIndicator.es.js.map +1 -0
  9. package/dist/Toast.cjs.js +2 -2
  10. package/dist/Toast.cjs.js.map +1 -1
  11. package/dist/Toast.es.js +103 -115
  12. package/dist/Toast.es.js.map +1 -1
  13. package/dist/components/chat.cjs.js +1 -1
  14. package/dist/components/chat.cjs.js.map +1 -1
  15. package/dist/components/chat.es.js +5 -5
  16. package/dist/components/common.cjs.js +1 -1
  17. package/dist/components/common.es.js +1 -1
  18. package/dist/components/policies.cjs.js +1 -1
  19. package/dist/components/policies.cjs.js.map +1 -1
  20. package/dist/components/policies.es.js +357 -283
  21. package/dist/components/policies.es.js.map +1 -1
  22. package/dist/components/reports.cjs.js +2 -2
  23. package/dist/components/reports.cjs.js.map +1 -1
  24. package/dist/components/reports.es.js +25 -20
  25. package/dist/components/reports.es.js.map +1 -1
  26. package/dist/index.cjs.js +1 -1
  27. package/dist/index.es.js +5 -5
  28. package/package.json +1 -1
  29. package/src/components/common/AskCompass.jsx +2 -15
  30. package/src/components/policies/PoliciesPage.jsx +15 -13
  31. package/src/components/policies/PolicyCard.jsx +35 -5
  32. package/src/components/policies/PolicyDetailsDrawer.jsx +101 -34
  33. package/src/components/reports/ReportsList.jsx +8 -2
  34. package/dist/ChatMessage.cjs.js +0 -15
  35. package/dist/ChatMessage.cjs.js.map +0 -1
  36. package/dist/ChatMessage.es.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MessageThread.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\nimport React from \"react\";\n\n/**\n * ThinkingIndicator\n * Status bubble shown while the assistant is working: a Chordia brand symbol\n * followed by a rounded pill that sizes to its text. The pill grows / shrinks\n * (and wraps) with whatever status message is passed.\n *\n * Props:\n * phase - \"thinking\" | \"tool\" | \"responding\" | \"generating\"\n * label - explicit status text (e.g. a notice or tool label); overrides\n * the phase default\n * toolSteps - (kept for API compatibility; not rendered in this design)\n * compact - slightly smaller symbol / paddings\n */\n\nconst SYMBOL_BG = \"#2e3236\"; // grey/strong\nconst BUBBLE_BG = \"#e3e1d7\"; // rail/surface-2\nconst TEXT_COLOR = \"#2e3236\"; // grey/strong\n\n// Chordia brand symbol (concentric green rings on a dark disc).\nfunction BrandSymbol({ size = 32 }) {\n const inner = Math.round(size * 0.75);\n return (\n <div\n style={{\n width: size,\n height: size,\n borderRadius: \"9999px\",\n background: SYMBOL_BG,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n overflow: \"hidden\",\n flexShrink: 0,\n }}\n >\n <svg\n width={inner}\n height={inner}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ display: \"block\" }}\n aria-hidden=\"true\"\n >\n <path\n d=\"M12 24C18.6274 24 24 18.6274 24 12C24 5.37258 18.6274 0 12 0C5.37258 0 0 5.37258 0 12C0 18.6274 5.37258 24 12 24Z\"\n fill={SYMBOL_BG}\n />\n <path\n d=\"M12.0281 1.54883C15.1413 1.54883 17.9364 2.90958 19.8514 5.06845C21.4881 6.9137 22.4824 9.34236 22.4824 12.0032C22.4824 15.0939 21.1413 17.8711 19.0094 19.7849C17.1586 21.4463 14.7113 22.4575 12.0281 22.4575C9.34478 22.4575 6.74638 21.3828 4.8764 19.6286C2.84343 17.7216 1.57373 15.0107 1.57373 12.0032C1.57373 9.28897 2.60792 6.81646 4.30366 4.95829C6.21523 2.86349 8.9682 1.54883 12.0281 1.54883Z\"\n stroke=\"#E8D4A3\"\n strokeWidth=\"1.6\"\n strokeMiterlimit=\"10\"\n />\n <path\n d=\"M12.0281 4.27832C14.237 4.27832 16.2239 5.21303 17.6307 6.69799C18.9409 8.08066 19.7525 9.94558 19.7525 12.0027C19.7525 14.2369 18.8032 16.2491 17.2862 17.6582C15.9086 18.9419 14.06 19.7271 12.0281 19.7271C9.99626 19.7271 8.46689 18.4265 7.08366 17.1225C5.58971 15.714 4.30371 14.2184 4.30371 12.0027C4.30371 10.0097 5.05856 8.19307 6.2979 6.82333C7.71148 5.26024 9.75514 4.27832 12.0281 4.27832Z\"\n stroke=\"#9BDB9C\"\n strokeWidth=\"1.2\"\n strokeMiterlimit=\"10\"\n />\n <path\n d=\"M12.0282 7.00837C13.3327 7.00837 14.5209 7.50861 15.4101 8.32753C16.4016 9.24032 17.0226 10.5488 17.0226 12.0028C17.0226 13.3805 16.4651 14.6282 15.563 15.5315C14.6592 16.4369 13.4091 16.9973 12.0282 16.9973C10.6472 16.9973 10.1869 15.4702 9.29093 14.6164C8.33599 13.7065 7.03369 13.426 7.03369 12.0023C7.03369 10.7303 7.50919 9.56969 8.29158 8.68781C9.20662 7.65699 10.5415 7.00781 12.0282 7.00781V7.00837Z\"\n stroke=\"#4DE294\"\n strokeWidth=\"0.8\"\n strokeMiterlimit=\"10\"\n />\n </svg>\n </div>\n );\n}\n\nexport default function ThinkingIndicator({\n phase = \"thinking\",\n label,\n // eslint-disable-next-line no-unused-vars\n toolSteps = [],\n // eslint-disable-next-line no-unused-vars\n elapsedMs,\n compact = false,\n}) {\n const text =\n label ||\n (phase === \"responding\" || phase === \"generating\"\n ? \"Compass is generating response...\"\n : \"Thinking...\");\n\n const symbolSize = compact ? 28 : 32;\n\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n animation: \"cuiThinkingPulse 1.6s ease-in-out infinite\",\n }}\n >\n <style>{`\n @keyframes cuiThinkingPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.6; } }\n `}</style>\n\n <BrandSymbol size={symbolSize} />\n\n <div\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n background: BUBBLE_BG,\n padding: compact ? \"8px 12px\" : \"12px 16px\",\n borderRadius: \"20px\",\n maxWidth: \"100%\",\n minWidth: 0,\n }}\n >\n <p\n style={{\n margin: 0,\n fontSize: \"14px\",\n fontWeight: 400,\n lineHeight: \"normal\",\n color: TEXT_COLOR,\n fontFamily: \"inherit\",\n // Grow / shrink (and wrap) with the message text.\n overflowWrap: \"anywhere\",\n wordBreak: \"break-word\",\n }}\n >\n {text}\n </p>\n </div>\n </div>\n );\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, useMemo } from \"react\";\nimport {\n MessageSquare,\n Search,\n Pin,\n Check,\n X,\n PanelLeftClose,\n MoreVertical,\n ChevronLeft,\n ChevronRight,\n} from \"lucide-react\";\n\n/**\n * ChatHistoryPanel Component\n * Panel showing chat thread history with search, All/Pinned filtering,\n * date-grouped sections and per-thread pin / rename / delete actions.\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 // optional: renders the \"new chat\" header action\n * onCollapse - () => void // optional: renders the collapse header action\n * onRenameThread - (threadId, newTitle) => void // optional: when provided, inline edit is enabled\n * onDeleteThread - (threadId) => void // optional: when provided, inline delete is enabled\n * onPinThread - (threadId, nextPinned) => void // optional: when provided, the pin toggle is enabled\n * loading - boolean\n */\n\n// Design tokens (from Figma \"Insights\" / thread history side section)\nconst COLORS = {\n title: \"#2e3236\", // grey/strong\n muted: \"#808183\", // grey/muted\n faint: \"#989898\", // neutral/400\n hoverBg: \"#f3f7f7\", // grey/hover\n selectedBg: \"#FAF5E9\", // selected thread background\n border: \"#d9d9d9\", // grey/absent\n borderSubtle: \"#e6e6e6\",\n pillDarkBg: \"#272727\", // neutral/850\n pillDarkText: \"#f2f2f0\", // neutral/50\n searchTrack: \"#d8d8d8\", // neutral/150\n};\n\n// Which date bucket a thread falls into.\nfunction dateBucket(dateStr) {\n const d = dateStr ? new Date(dateStr) : null;\n if (!d || Number.isNaN(d.getTime())) return \"Older\";\n const now = new Date();\n const startToday = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const startYesterday = new Date(startToday);\n startYesterday.setDate(startToday.getDate() - 1);\n if (d >= startToday) return \"Today\";\n if (d >= startYesterday) return \"Yesterday\";\n return \"Older\";\n}\n\nconst BUCKET_ORDER = [\"Today\", \"Yesterday\", \"Older\"];\n\n// Compact relative time, e.g. \"just now\", \"5m ago\", \"2h ago\", \"3d ago\",\n// falling back to a localized short date for anything older than a week.\nfunction formatRelative(dateStr) {\n const d = dateStr ? new Date(dateStr) : null;\n if (!d || Number.isNaN(d.getTime())) return \"\";\n const diff = Date.now() - d.getTime();\n const min = Math.floor(diff / 60000);\n if (min < 1) return \"just now\";\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.floor(hr / 24);\n if (day < 7) return `${day}d ago`;\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n}\n\nexport default function ChatHistoryPanel({\n threads = [],\n activeThreadId,\n onSelectThread,\n onNewChat,\n onCollapse,\n onRenameThread,\n onDeleteThread,\n onPinThread,\n loading = false,\n pageSize = 10,\n // Server-side pagination (controlled). When `onPageChange` is provided the\n // panel renders whatever `threads` it's given as the current page, drives the\n // controls from `page` / `pageCount`, and asks the parent to fetch new pages.\n page,\n pageCount,\n onPageChange,\n // Called when the All/Pinned filter changes. When provided, the parent is\n // expected to (re)fetch — e.g. hit the API with `&pinned=true`.\n onFilterChange,\n}) {\n const serverPaginated = typeof onPageChange === \"function\";\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [filter, setFilter] = useState(\"all\"); // \"all\" | \"pinned\"\n const changeFilter = (f) => {\n setFilter(f);\n onFilterChange?.(f);\n };\n const [currentPage, setCurrentPage] = useState(1);\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 [menuOpenId, setMenuOpenId] = useState(null); // thread id whose ⋮ dropdown is open\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 // Close the ⋮ dropdown on any outside click or Escape. The kebab toggle\n // stops propagation, so the click that opens the menu never reaches here.\n useEffect(() => {\n if (!menuOpenId) return;\n const close = () => setMenuOpenId(null);\n const onKey = (e) => {\n if (e.key === \"Escape\") setMenuOpenId(null);\n };\n document.addEventListener(\"click\", close);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"click\", close);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [menuOpenId]);\n\n const canEdit = typeof onRenameThread === \"function\";\n const canDelete = typeof onDeleteThread === \"function\";\n const canPin = typeof onPinThread === \"function\";\n\n // Filter -> search -> sort (pinned first, then most-recent) -> paginate ->\n // group the current page's slice by date.\n const { groups, totalPages } = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n const filtered = threads.filter((t) => {\n if (filter === \"pinned\" && !t.pinned) return false;\n if (!q) return true;\n return (\n (t.title || \"\").toLowerCase().includes(q) ||\n (t.last_message_preview || \"\").toLowerCase().includes(q)\n );\n });\n\n const sorted = [...filtered].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 // Server mode: `threads` is already the current page — render it all and\n // take the page count from the parent. Client mode: slice locally.\n const pages = serverPaginated\n ? Math.max(1, pageCount || 1)\n : Math.max(1, Math.ceil(sorted.length / pageSize));\n let pageItems;\n if (serverPaginated) {\n pageItems = sorted;\n } else {\n const safePage = Math.min(currentPage, pages);\n const start = (safePage - 1) * pageSize;\n pageItems = sorted.slice(start, start + pageSize);\n }\n\n const byBucket = {};\n for (const t of pageItems) {\n const bucket = dateBucket(t.updated_at || t.created_at);\n (byBucket[bucket] ||= []).push(t);\n }\n const grouped = BUCKET_ORDER.map((label) => ({\n label,\n items: byBucket[label] || [],\n })).filter((g) => g.items.length > 0);\n\n return { groups: grouped, totalPages: pages };\n }, [threads, searchQuery, filter, currentPage, pageSize, serverPaginated, pageCount]);\n\n const totalVisible = groups.reduce((n, g) => n + g.items.length, 0);\n\n // Effective page / navigation — controlled by the parent in server mode.\n const effectivePage = serverPaginated ? Math.max(1, page || 1) : currentPage;\n const goToPage = serverPaginated ? onPageChange : setCurrentPage;\n\n // Reset to the first page whenever the search / filter changes (client mode).\n useEffect(() => {\n if (!serverPaginated) setCurrentPage(1);\n }, [searchQuery, filter, serverPaginated]);\n\n // Clamp the current page when the page count shrinks (client mode).\n useEffect(() => {\n if (!serverPaginated) setCurrentPage((p) => Math.min(p, totalPages));\n }, [totalPages, serverPaginated]);\n\n // Window of up to 5 page numbers centered on the current page.\n const pageWindow = useMemo(() => {\n const max = 5;\n if (totalPages <= max) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n let start = Math.max(1, effectivePage - 2);\n const end = Math.min(totalPages, start + max - 1);\n start = Math.max(1, end - max + 1);\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n }, [totalPages, effectivePage]);\n\n const startEdit = (e, thread) => {\n e.stopPropagation();\n setMenuOpenId(null);\n setDeletingId(null);\n setEditingId(thread.id);\n // Pre-fill the editor with the thread's current title so the user edits\n // the existing text rather than starting from a blank field. Fall back to\n // `name` in case the title is carried under that key.\n setEditValue(thread.title || thread.name || \"\");\n };\n\n const saveEdit = (e) => {\n if (e) e.stopPropagation();\n const trimmed = (editValue || \"\").trim();\n if (editingId && trimmed) onRenameThread?.(editingId, trimmed);\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 setMenuOpenId(null);\n setEditingId(null);\n setDeletingId(thread.id);\n };\n\n const confirmDelete = (e) => {\n if (e) e.stopPropagation();\n if (deletingId) onDeleteThread?.(deletingId);\n setDeletingId(null);\n };\n\n const cancelDelete = (e) => {\n if (e) e.stopPropagation();\n setDeletingId(null);\n };\n\n const togglePin = (e, thread) => {\n e.stopPropagation();\n onPinThread?.(thread.id, !thread.pinned);\n };\n\n const iconBtnStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"24px\",\n height: \"24px\",\n padding: 0,\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n color: COLORS.muted,\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: \"#FFFFFF\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div style={{ padding: \"16px 16px 0 16px\", flexShrink: 0 }}>\n {/* Section title */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n height: \"32px\",\n }}\n >\n <div style={{ fontSize: \"14px\", fontWeight: 400, color: COLORS.title }}>\n Threads\n </div>\n {onCollapse && (\n <button\n type=\"button\"\n title=\"Collapse\"\n onClick={onCollapse}\n style={{\n ...iconBtnStyle,\n width: \"20px\",\n height: \"20px\",\n color: COLORS.muted,\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = COLORS.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <PanelLeftClose size={20} strokeWidth={1.5} />\n </button>\n )}\n </div>\n\n {/* Search */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: \"32px\",\n background: COLORS.searchTrack,\n borderRadius: \"11px\",\n padding: \"1px\",\n marginTop: \"12px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flex: 1,\n alignItems: \"center\",\n gap: \"8px\",\n height: \"30px\",\n background: \"#FFFFFF\",\n borderRadius: \"10px\",\n padding: \"4px 8px\",\n }}\n >\n <Search size={18} style={{ color: COLORS.faint, flexShrink: 0 }} />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search\"\n style={{\n flex: 1,\n minWidth: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontSize: \"14px\",\n fontWeight: 500,\n color: COLORS.title,\n }}\n />\n </div>\n </div>\n\n {/* Filter pills */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"16px\", marginTop: \"12px\" }}>\n <button\n type=\"button\"\n onClick={() => changeFilter(\"all\")}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"28px\",\n padding: \"0 12px\",\n borderRadius: \"8px\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n fontWeight: 400,\n lineHeight: \"24px\",\n transition: \"all 0.12s ease\",\n background: filter === \"all\" ? COLORS.pillDarkBg : COLORS.hoverBg,\n color: filter === \"all\" ? COLORS.pillDarkText : COLORS.title,\n }}\n >\n All\n </button>\n <button\n type=\"button\"\n onClick={() => changeFilter(\"pinned\")}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n height: \"28px\",\n padding: \"0 16px\",\n borderRadius: \"10px\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n fontWeight: 400,\n lineHeight: \"24px\",\n transition: \"all 0.12s ease\",\n background: filter === \"pinned\" ? COLORS.pillDarkBg : COLORS.hoverBg,\n color: filter === \"pinned\" ? COLORS.pillDarkText : COLORS.title,\n }}\n >\n <Pin size={16} style={{ flexShrink: 0 }} />\n Pinned\n </button>\n </div>\n </div>\n\n {/* Thread List */}\n <div style={{ flex: 1, overflowY: \"auto\", padding: \"16px 16px 8px 16px\" }}>\n {loading ? (\n <div style={{ padding: \"30px 16px\", textAlign: \"center\", color: COLORS.faint, fontSize: \"13px\" }}>\n Loading threads...\n </div>\n ) : totalVisible === 0 ? (\n <div style={{ padding: \"30px 16px\", textAlign: \"center\", color: COLORS.faint, fontSize: \"13px\" }}>\n {searchQuery\n ? \"No threads found\"\n : filter === \"pinned\"\n ? \"No pinned threads\"\n : \"No threads yet\"}\n </div>\n ) : (\n groups.map((group) => (\n <div key={group.label} style={{ marginBottom: \"8px\" }}>\n {/* Section header */}\n <div\n style={{\n fontSize: \"13px\",\n fontWeight: 500,\n color: COLORS.title,\n padding: \"8px 0 4px 0\",\n }}\n >\n {group.label}\n </div>\n\n {group.items.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 isMenuOpen = menuOpenId === thread.id;\n const hasMenu = canEdit || canDelete;\n const showActions =\n (canPin || hasMenu) &&\n (isHovered || isActive || isMenuOpen) &&\n !isEditing &&\n !isDeleting;\n\n const isOpen = isMenuOpen || isDeleting || isEditing;\n const rowBg = isActive\n ? COLORS.selectedBg\n : isHovered || isOpen\n ? COLORS.hoverBg\n : \"transparent\";\n const rowBorder =\n isActive || isHovered || isOpen\n ? `1px solid ${COLORS.border}`\n : \"1px solid transparent\";\n\n return (\n <div\n key={thread.id}\n onClick={() => {\n if (isEditing || isDeleting) return;\n onSelectThread?.(thread.id);\n }}\n onMouseEnter={() => setHoveredId(thread.id)}\n onMouseLeave={() =>\n setHoveredId((prev) => (prev === thread.id ? null : prev))\n }\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"8px 4px\",\n marginBottom: \"2px\",\n borderRadius: \"8px\",\n background: rowBg,\n border: rowBorder,\n cursor: isEditing || isDeleting ? \"default\" : \"pointer\",\n transition: \"background 0.12s ease, border-color 0.12s ease\",\n boxSizing: \"border-box\",\n position: \"relative\",\n }}\n >\n {/* Leading icon */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"40px\",\n height: \"40px\",\n flexShrink: 0,\n color: COLORS.muted,\n }}\n >\n <MessageSquare size={20} />\n </div>\n\n {/* Title + subtitle (or inline editor) */}\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: \"14px\",\n fontWeight: 600,\n color: COLORS.title,\n background: \"#fff\",\n border: `1px solid ${COLORS.border}`,\n borderRadius: \"6px\",\n padding: \"4px 8px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n ) : (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n textAlign: \"left\",\n }}\n >\n <div\n title={thread.title || thread.name || \"Untitled thread\"}\n style={{\n display: \"block\",\n minWidth: 0,\n maxWidth: \"100%\",\n fontSize: \"14px\",\n fontWeight: isActive ? 550 : 500,\n color: COLORS.title,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n lineHeight: 1.2,\n }}\n >\n {thread.title || thread.name || \"Untitled thread\"}\n </div>\n {isDeleting ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n }}\n >\n <span\n style={{\n fontSize: \"12px\",\n fontWeight: 500,\n color: COLORS.title,\n }}\n >\n Confirm: delete this thread?\n </span>\n <button\n type=\"button\"\n onClick={confirmDelete}\n style={{\n padding: \"3px 12px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: COLORS.title,\n background: \"#ECEEF2\",\n border: `1px solid ${COLORS.borderSubtle}`,\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = \"#E2E5EA\")}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"#ECEEF2\")}\n >\n Yes\n </button>\n <button\n type=\"button\"\n onClick={cancelDelete}\n style={{\n padding: \"3px 6px\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: COLORS.muted,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = COLORS.title)}\n onMouseLeave={(e) => (e.currentTarget.style.color = COLORS.muted)}\n >\n No\n </button>\n </div>\n ) : (\n <div\n style={{\n fontSize: \"12px\",\n color: COLORS.muted,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n lineHeight: 1.5,\n }}\n >\n {thread.message_count != null && (\n <>\n {thread.message_count} msg{thread.message_count !== 1 ? \"s\" : \"\"}\n {\" · \"}\n </>\n )}\n {formatRelative(thread.updated_at || thread.created_at)}\n </div>\n )}\n </div>\n )}\n\n {/* Inline edit actions */}\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={{ ...iconBtnStyle, color: \"#1f9d57\" }}\n onMouseEnter={(e) => (e.currentTarget.style.background = \"rgba(31,157,87,0.12)\")}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <Check size={15} />\n </button>\n <button\n type=\"button\"\n title=\"Cancel\"\n onClick={cancelEdit}\n style={iconBtnStyle}\n onMouseEnter={(e) => (e.currentTarget.style.background = \"rgba(0,0,0,0.06)\")}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <X size={15} />\n </button>\n </div>\n )}\n\n {/* A pinned thread keeps its pin indicator visible even when\n the row isn't hovered/active and the action cluster is hidden. */}\n {!isEditing && !isDeleting && !showActions && thread.pinned && (\n <Pin\n size={14}\n style={{ color: COLORS.title, flexShrink: 0 }}\n fill=\"currentColor\"\n />\n )}\n\n {/* Hover / selected action cluster: pin + kebab menu */}\n {showActions && (\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"2px\", flexShrink: 0 }}>\n {canPin && (\n <button\n type=\"button\"\n title={thread.pinned ? \"Unpin\" : \"Pin\"}\n onClick={(e) => togglePin(e, thread)}\n style={{\n ...iconBtnStyle,\n color: thread.pinned ? COLORS.title : COLORS.muted,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n e.currentTarget.style.color = COLORS.title;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = thread.pinned ? COLORS.title : COLORS.muted;\n }}\n >\n <Pin size={14} fill={thread.pinned ? \"currentColor\" : \"none\"} />\n </button>\n )}\n {hasMenu && (\n <button\n type=\"button\"\n title=\"More\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpenId((prev) => (prev === thread.id ? null : thread.id));\n }}\n style={{\n ...iconBtnStyle,\n color: isMenuOpen ? COLORS.title : COLORS.muted,\n background: isMenuOpen ? \"rgba(0,0,0,0.06)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n e.currentTarget.style.color = COLORS.title;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = isMenuOpen\n ? \"rgba(0,0,0,0.06)\"\n : \"transparent\";\n e.currentTarget.style.color = isMenuOpen ? COLORS.title : COLORS.muted;\n }}\n >\n <MoreVertical size={14} />\n </button>\n )}\n </div>\n )}\n\n {/* ⋮ dropdown: Rename / Delete */}\n {isMenuOpen && hasMenu && (\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"calc(100% - 2px)\",\n right: \"8px\",\n zIndex: 20,\n width: \"144px\",\n background: \"#FFFFFF\",\n border: `1px solid ${COLORS.border}`,\n borderRadius: \"4px\",\n boxShadow: \"-2px 2px 4px rgba(0,0,0,0.1)\",\n overflow: \"hidden\",\n }}\n >\n {canEdit && (\n <button\n type=\"button\"\n onClick={(e) => startEdit(e, thread)}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n padding: \"12px\",\n fontSize: \"13px\",\n color: COLORS.title,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = COLORS.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n Rename\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n onClick={(e) => startDelete(e, thread)}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n padding: \"12px\",\n fontSize: \"13px\",\n color: COLORS.title,\n background: \"transparent\",\n border: \"none\",\n borderTop: canEdit ? `1px solid ${COLORS.border}` : \"none\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = COLORS.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n Delete\n </button>\n )}\n </div>\n )}\n\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {/* Pagination */}\n {!loading && totalPages > 1 && (\n <div\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"6px\",\n height: \"64px\",\n padding: \"0 16px\",\n boxSizing: \"border-box\",\n borderTop: `1px solid ${COLORS.border}`,\n }}\n >\n {/* Back */}\n <button\n type=\"button\"\n disabled={effectivePage <= 1}\n onClick={() => goToPage(Math.max(1, effectivePage - 1))}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"4px\",\n height: \"24px\",\n padding: \"4px 8px\",\n borderRadius: \"10px\",\n background: \"#FFFFFF\",\n border: `1px solid ${COLORS.borderSubtle}`,\n fontSize: \"12px\",\n lineHeight: \"16px\",\n color: \"#0b0b0b\",\n cursor: effectivePage <= 1 ? \"default\" : \"pointer\",\n opacity: effectivePage <= 1 ? 0.5 : 1,\n }}\n >\n <ChevronLeft size={12} />\n Back\n </button>\n\n {/* Page numbers */}\n {pageWindow.map((n) => {\n const isActivePage = n === effectivePage;\n return (\n <button\n key={n}\n type=\"button\"\n onClick={() => goToPage(n)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"24px\",\n minWidth: \"22px\",\n padding: \"4px 8px\",\n borderRadius: \"10px\",\n fontSize: \"12px\",\n lineHeight: \"16px\",\n cursor: \"pointer\",\n background: isActivePage ? \"#0b0b0b\" : \"#FFFFFF\",\n color: isActivePage ? \"#FFFFFF\" : \"#0b0b0b\",\n border: isActivePage ? \"1px solid #0b0b0b\" : `1px solid ${COLORS.borderSubtle}`,\n fontWeight: isActivePage ? 600 : 400,\n }}\n >\n {n}\n </button>\n );\n })}\n\n {/* Next */}\n <button\n type=\"button\"\n disabled={effectivePage >= totalPages}\n onClick={() => goToPage(Math.min(totalPages, effectivePage + 1))}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"4px\",\n height: \"24px\",\n padding: \"4px 8px\",\n borderRadius: \"10px\",\n background: \"#FFFFFF\",\n border: `1px solid ${COLORS.borderSubtle}`,\n fontSize: \"12px\",\n lineHeight: \"16px\",\n color: \"#0b0b0b\",\n cursor: effectivePage >= totalPages ? \"default\" : \"pointer\",\n opacity: effectivePage >= totalPages ? 0.5 : 1,\n }}\n >\n Next\n <ChevronRight size={12} />\n </button>\n </div>\n )}\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":["SYMBOL_BG","BUBBLE_BG","TEXT_COLOR","BrandSymbol","size","inner","jsx","jsxs","ThinkingIndicator","phase","label","toolSteps","elapsedMs","compact","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","COLORS","dateBucket","dateStr","d","now","startToday","startYesterday","BUCKET_ORDER","formatRelative","diff","min","hr","day","ChatHistoryPanel","threads","activeThreadId","onSelectThread","onNewChat","onCollapse","onRenameThread","onDeleteThread","onPinThread","loading","pageSize","page","pageCount","onPageChange","onFilterChange","serverPaginated","searchQuery","setSearchQuery","filter","setFilter","changeFilter","f","currentPage","setCurrentPage","hoveredId","setHoveredId","editingId","setEditingId","editValue","setEditValue","deletingId","setDeletingId","menuOpenId","setMenuOpenId","editInputRef","close","onKey","canEdit","canDelete","canPin","groups","totalPages","useMemo","q","sorted","t","a","b","aTime","pages","pageItems","start","byBucket","bucket","g","totalVisible","n","effectivePage","goToPage","p","pageWindow","_","i","end","startEdit","thread","saveEdit","trimmed","cancelEdit","startDelete","confirmDelete","cancelDelete","togglePin","iconBtnStyle","PanelLeftClose","Search","Pin","group","isActive","isHovered","isEditing","isDeleting","isMenuOpen","hasMenu","showActions","isOpen","rowBg","rowBorder","MessageSquare","Check","X","MoreVertical","ChevronLeft","isActivePage","ChevronRight","useUserContext","MessageThread","sessionTitle","currentUser","messageInput","setMessageInput","isFocused","setIsFocused","isLoading","setIsLoading","userData","displayCurrentUser","content","optimisticMessage","msg","handleKeyPress","Clock","ref","idx","Hash","AtSign","Paperclip"],"mappings":"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"}
1
+ {"version":3,"file":"MessageThread.es.js","sources":["../src/components/chat/ChatInterface.jsx","../src/components/chat/ChatHistoryPanel.jsx","../src/components/chat/MessageThread.jsx"],"sourcesContent":["\"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, useMemo } from \"react\";\nimport {\n MessageSquare,\n Search,\n Pin,\n Check,\n X,\n PanelLeftClose,\n MoreVertical,\n ChevronLeft,\n ChevronRight,\n} from \"lucide-react\";\n\n/**\n * ChatHistoryPanel Component\n * Panel showing chat thread history with search, All/Pinned filtering,\n * date-grouped sections and per-thread pin / rename / delete actions.\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 // optional: renders the \"new chat\" header action\n * onCollapse - () => void // optional: renders the collapse header action\n * onRenameThread - (threadId, newTitle) => void // optional: when provided, inline edit is enabled\n * onDeleteThread - (threadId) => void // optional: when provided, inline delete is enabled\n * onPinThread - (threadId, nextPinned) => void // optional: when provided, the pin toggle is enabled\n * loading - boolean\n */\n\n// Design tokens (from Figma \"Insights\" / thread history side section)\nconst COLORS = {\n title: \"#2e3236\", // grey/strong\n muted: \"#808183\", // grey/muted\n faint: \"#989898\", // neutral/400\n hoverBg: \"#f3f7f7\", // grey/hover\n selectedBg: \"#FAF5E9\", // selected thread background\n border: \"#d9d9d9\", // grey/absent\n borderSubtle: \"#e6e6e6\",\n pillDarkBg: \"#272727\", // neutral/850\n pillDarkText: \"#f2f2f0\", // neutral/50\n searchTrack: \"#d8d8d8\", // neutral/150\n};\n\n// Which date bucket a thread falls into.\nfunction dateBucket(dateStr) {\n const d = dateStr ? new Date(dateStr) : null;\n if (!d || Number.isNaN(d.getTime())) return \"Older\";\n const now = new Date();\n const startToday = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const startYesterday = new Date(startToday);\n startYesterday.setDate(startToday.getDate() - 1);\n if (d >= startToday) return \"Today\";\n if (d >= startYesterday) return \"Yesterday\";\n return \"Older\";\n}\n\nconst BUCKET_ORDER = [\"Today\", \"Yesterday\", \"Older\"];\n\n// Compact relative time, e.g. \"just now\", \"5m ago\", \"2h ago\", \"3d ago\",\n// falling back to a localized short date for anything older than a week.\nfunction formatRelative(dateStr) {\n const d = dateStr ? new Date(dateStr) : null;\n if (!d || Number.isNaN(d.getTime())) return \"\";\n const diff = Date.now() - d.getTime();\n const min = Math.floor(diff / 60000);\n if (min < 1) return \"just now\";\n if (min < 60) return `${min}m ago`;\n const hr = Math.floor(min / 60);\n if (hr < 24) return `${hr}h ago`;\n const day = Math.floor(hr / 24);\n if (day < 7) return `${day}d ago`;\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n}\n\nexport default function ChatHistoryPanel({\n threads = [],\n activeThreadId,\n onSelectThread,\n onNewChat,\n onCollapse,\n onRenameThread,\n onDeleteThread,\n onPinThread,\n loading = false,\n pageSize = 10,\n // Server-side pagination (controlled). When `onPageChange` is provided the\n // panel renders whatever `threads` it's given as the current page, drives the\n // controls from `page` / `pageCount`, and asks the parent to fetch new pages.\n page,\n pageCount,\n onPageChange,\n // Called when the All/Pinned filter changes. When provided, the parent is\n // expected to (re)fetch — e.g. hit the API with `&pinned=true`.\n onFilterChange,\n}) {\n const serverPaginated = typeof onPageChange === \"function\";\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [filter, setFilter] = useState(\"all\"); // \"all\" | \"pinned\"\n const changeFilter = (f) => {\n setFilter(f);\n onFilterChange?.(f);\n };\n const [currentPage, setCurrentPage] = useState(1);\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 [menuOpenId, setMenuOpenId] = useState(null); // thread id whose ⋮ dropdown is open\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 // Close the ⋮ dropdown on any outside click or Escape. The kebab toggle\n // stops propagation, so the click that opens the menu never reaches here.\n useEffect(() => {\n if (!menuOpenId) return;\n const close = () => setMenuOpenId(null);\n const onKey = (e) => {\n if (e.key === \"Escape\") setMenuOpenId(null);\n };\n document.addEventListener(\"click\", close);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"click\", close);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [menuOpenId]);\n\n const canEdit = typeof onRenameThread === \"function\";\n const canDelete = typeof onDeleteThread === \"function\";\n const canPin = typeof onPinThread === \"function\";\n\n // Filter -> search -> sort (pinned first, then most-recent) -> paginate ->\n // group the current page's slice by date.\n const { groups, totalPages } = useMemo(() => {\n const q = searchQuery.trim().toLowerCase();\n const filtered = threads.filter((t) => {\n if (filter === \"pinned\" && !t.pinned) return false;\n if (!q) return true;\n return (\n (t.title || \"\").toLowerCase().includes(q) ||\n (t.last_message_preview || \"\").toLowerCase().includes(q)\n );\n });\n\n const sorted = [...filtered].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 // Server mode: `threads` is already the current page — render it all and\n // take the page count from the parent. Client mode: slice locally.\n const pages = serverPaginated\n ? Math.max(1, pageCount || 1)\n : Math.max(1, Math.ceil(sorted.length / pageSize));\n let pageItems;\n if (serverPaginated) {\n pageItems = sorted;\n } else {\n const safePage = Math.min(currentPage, pages);\n const start = (safePage - 1) * pageSize;\n pageItems = sorted.slice(start, start + pageSize);\n }\n\n const byBucket = {};\n for (const t of pageItems) {\n const bucket = dateBucket(t.updated_at || t.created_at);\n (byBucket[bucket] ||= []).push(t);\n }\n const grouped = BUCKET_ORDER.map((label) => ({\n label,\n items: byBucket[label] || [],\n })).filter((g) => g.items.length > 0);\n\n return { groups: grouped, totalPages: pages };\n }, [threads, searchQuery, filter, currentPage, pageSize, serverPaginated, pageCount]);\n\n const totalVisible = groups.reduce((n, g) => n + g.items.length, 0);\n\n // Effective page / navigation — controlled by the parent in server mode.\n const effectivePage = serverPaginated ? Math.max(1, page || 1) : currentPage;\n const goToPage = serverPaginated ? onPageChange : setCurrentPage;\n\n // Reset to the first page whenever the search / filter changes (client mode).\n useEffect(() => {\n if (!serverPaginated) setCurrentPage(1);\n }, [searchQuery, filter, serverPaginated]);\n\n // Clamp the current page when the page count shrinks (client mode).\n useEffect(() => {\n if (!serverPaginated) setCurrentPage((p) => Math.min(p, totalPages));\n }, [totalPages, serverPaginated]);\n\n // Window of up to 5 page numbers centered on the current page.\n const pageWindow = useMemo(() => {\n const max = 5;\n if (totalPages <= max) {\n return Array.from({ length: totalPages }, (_, i) => i + 1);\n }\n let start = Math.max(1, effectivePage - 2);\n const end = Math.min(totalPages, start + max - 1);\n start = Math.max(1, end - max + 1);\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n }, [totalPages, effectivePage]);\n\n const startEdit = (e, thread) => {\n e.stopPropagation();\n setMenuOpenId(null);\n setDeletingId(null);\n setEditingId(thread.id);\n // Pre-fill the editor with the thread's current title so the user edits\n // the existing text rather than starting from a blank field. Fall back to\n // `name` in case the title is carried under that key.\n setEditValue(thread.title || thread.name || \"\");\n };\n\n const saveEdit = (e) => {\n if (e) e.stopPropagation();\n const trimmed = (editValue || \"\").trim();\n if (editingId && trimmed) onRenameThread?.(editingId, trimmed);\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 setMenuOpenId(null);\n setEditingId(null);\n setDeletingId(thread.id);\n };\n\n const confirmDelete = (e) => {\n if (e) e.stopPropagation();\n if (deletingId) onDeleteThread?.(deletingId);\n setDeletingId(null);\n };\n\n const cancelDelete = (e) => {\n if (e) e.stopPropagation();\n setDeletingId(null);\n };\n\n const togglePin = (e, thread) => {\n e.stopPropagation();\n onPinThread?.(thread.id, !thread.pinned);\n };\n\n const iconBtnStyle = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"24px\",\n height: \"24px\",\n padding: 0,\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n color: COLORS.muted,\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: \"#FFFFFF\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div style={{ padding: \"16px 16px 0 16px\", flexShrink: 0 }}>\n {/* Section title */}\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n height: \"32px\",\n }}\n >\n <div style={{ fontSize: \"14px\", fontWeight: 400, color: COLORS.title }}>\n Threads\n </div>\n {onCollapse && (\n <button\n type=\"button\"\n title=\"Collapse\"\n onClick={onCollapse}\n style={{\n ...iconBtnStyle,\n width: \"20px\",\n height: \"20px\",\n color: COLORS.muted,\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = COLORS.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <PanelLeftClose size={20} strokeWidth={1.5} />\n </button>\n )}\n </div>\n\n {/* Search */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n height: \"32px\",\n background: COLORS.searchTrack,\n borderRadius: \"11px\",\n padding: \"1px\",\n marginTop: \"12px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n flex: 1,\n alignItems: \"center\",\n gap: \"8px\",\n height: \"30px\",\n background: \"#FFFFFF\",\n borderRadius: \"10px\",\n padding: \"4px 8px\",\n }}\n >\n <Search size={18} style={{ color: COLORS.faint, flexShrink: 0 }} />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search\"\n style={{\n flex: 1,\n minWidth: 0,\n border: \"none\",\n outline: \"none\",\n background: \"transparent\",\n fontSize: \"14px\",\n fontWeight: 500,\n color: COLORS.title,\n }}\n />\n </div>\n </div>\n\n {/* Filter pills */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"16px\", marginTop: \"12px\" }}>\n <button\n type=\"button\"\n onClick={() => changeFilter(\"all\")}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"28px\",\n padding: \"0 12px\",\n borderRadius: \"8px\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n fontWeight: 400,\n lineHeight: \"24px\",\n transition: \"all 0.12s ease\",\n background: filter === \"all\" ? COLORS.pillDarkBg : COLORS.hoverBg,\n color: filter === \"all\" ? COLORS.pillDarkText : COLORS.title,\n }}\n >\n All\n </button>\n <button\n type=\"button\"\n onClick={() => changeFilter(\"pinned\")}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"8px\",\n height: \"28px\",\n padding: \"0 16px\",\n borderRadius: \"10px\",\n border: \"none\",\n cursor: \"pointer\",\n fontSize: \"14px\",\n fontWeight: 400,\n lineHeight: \"24px\",\n transition: \"all 0.12s ease\",\n background: filter === \"pinned\" ? COLORS.pillDarkBg : COLORS.hoverBg,\n color: filter === \"pinned\" ? COLORS.pillDarkText : COLORS.title,\n }}\n >\n <Pin size={16} style={{ flexShrink: 0 }} />\n Pinned\n </button>\n </div>\n </div>\n\n {/* Thread List */}\n <div style={{ flex: 1, overflowY: \"auto\", padding: \"16px 16px 8px 16px\" }}>\n {loading ? (\n <div style={{ padding: \"30px 16px\", textAlign: \"center\", color: COLORS.faint, fontSize: \"13px\" }}>\n Loading threads...\n </div>\n ) : totalVisible === 0 ? (\n <div style={{ padding: \"30px 16px\", textAlign: \"center\", color: COLORS.faint, fontSize: \"13px\" }}>\n {searchQuery\n ? \"No threads found\"\n : filter === \"pinned\"\n ? \"No pinned threads\"\n : \"No threads yet\"}\n </div>\n ) : (\n groups.map((group) => (\n <div key={group.label} style={{ marginBottom: \"8px\" }}>\n {/* Section header */}\n <div\n style={{\n fontSize: \"13px\",\n fontWeight: 500,\n color: COLORS.title,\n padding: \"8px 0 4px 0\",\n }}\n >\n {group.label}\n </div>\n\n {group.items.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 isMenuOpen = menuOpenId === thread.id;\n const hasMenu = canEdit || canDelete;\n const showActions =\n (canPin || hasMenu) &&\n (isHovered || isActive || isMenuOpen) &&\n !isEditing &&\n !isDeleting;\n\n const isOpen = isMenuOpen || isDeleting || isEditing;\n const rowBg = isActive\n ? COLORS.selectedBg\n : isHovered || isOpen\n ? COLORS.hoverBg\n : \"transparent\";\n const rowBorder =\n isActive || isHovered || isOpen\n ? `1px solid ${COLORS.border}`\n : \"1px solid transparent\";\n\n return (\n <div\n key={thread.id}\n onClick={() => {\n if (isEditing || isDeleting) return;\n onSelectThread?.(thread.id);\n }}\n onMouseEnter={() => setHoveredId(thread.id)}\n onMouseLeave={() =>\n setHoveredId((prev) => (prev === thread.id ? null : prev))\n }\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"4px\",\n padding: \"8px 4px\",\n marginBottom: \"2px\",\n borderRadius: \"8px\",\n background: rowBg,\n border: rowBorder,\n cursor: isEditing || isDeleting ? \"default\" : \"pointer\",\n transition: \"background 0.12s ease, border-color 0.12s ease\",\n boxSizing: \"border-box\",\n position: \"relative\",\n }}\n >\n {/* Leading icon */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: \"40px\",\n height: \"40px\",\n flexShrink: 0,\n color: COLORS.muted,\n }}\n >\n <MessageSquare size={20} />\n </div>\n\n {/* Title + subtitle (or inline editor) */}\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: \"14px\",\n fontWeight: 600,\n color: COLORS.title,\n background: \"#fff\",\n border: `1px solid ${COLORS.border}`,\n borderRadius: \"6px\",\n padding: \"4px 8px\",\n outline: \"none\",\n boxSizing: \"border-box\",\n }}\n />\n ) : (\n <div\n style={{\n flex: 1,\n minWidth: 0,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"4px\",\n textAlign: \"left\",\n }}\n >\n <div\n title={thread.title || thread.name || \"Untitled thread\"}\n style={{\n display: \"block\",\n minWidth: 0,\n maxWidth: \"100%\",\n fontSize: \"14px\",\n fontWeight: isActive ? 550 : 500,\n color: COLORS.title,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n lineHeight: 1.2,\n }}\n >\n {thread.title || thread.name || \"Untitled thread\"}\n </div>\n {isDeleting ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n }}\n >\n <span\n style={{\n fontSize: \"12px\",\n fontWeight: 500,\n color: COLORS.title,\n }}\n >\n Confirm: delete this thread?\n </span>\n <button\n type=\"button\"\n onClick={confirmDelete}\n style={{\n padding: \"3px 12px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: COLORS.title,\n background: \"#ECEEF2\",\n border: `1px solid ${COLORS.borderSubtle}`,\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = \"#E2E5EA\")}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"#ECEEF2\")}\n >\n Yes\n </button>\n <button\n type=\"button\"\n onClick={cancelDelete}\n style={{\n padding: \"3px 6px\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: COLORS.muted,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.color = COLORS.title)}\n onMouseLeave={(e) => (e.currentTarget.style.color = COLORS.muted)}\n >\n No\n </button>\n </div>\n ) : (\n <div\n style={{\n fontSize: \"12px\",\n color: COLORS.muted,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n lineHeight: 1.5,\n }}\n >\n {thread.message_count != null && (\n <>\n {thread.message_count} msg{thread.message_count !== 1 ? \"s\" : \"\"}\n {\" · \"}\n </>\n )}\n {formatRelative(thread.updated_at || thread.created_at)}\n </div>\n )}\n </div>\n )}\n\n {/* Inline edit actions */}\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={{ ...iconBtnStyle, color: \"#1f9d57\" }}\n onMouseEnter={(e) => (e.currentTarget.style.background = \"rgba(31,157,87,0.12)\")}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <Check size={15} />\n </button>\n <button\n type=\"button\"\n title=\"Cancel\"\n onClick={cancelEdit}\n style={iconBtnStyle}\n onMouseEnter={(e) => (e.currentTarget.style.background = \"rgba(0,0,0,0.06)\")}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n <X size={15} />\n </button>\n </div>\n )}\n\n {/* A pinned thread keeps its pin indicator visible even when\n the row isn't hovered/active and the action cluster is hidden. */}\n {!isEditing && !isDeleting && !showActions && thread.pinned && (\n <Pin\n size={14}\n style={{ color: COLORS.title, flexShrink: 0 }}\n fill=\"currentColor\"\n />\n )}\n\n {/* Hover / selected action cluster: pin + kebab menu */}\n {showActions && (\n <div style={{ display: \"inline-flex\", alignItems: \"center\", gap: \"2px\", flexShrink: 0 }}>\n {canPin && (\n <button\n type=\"button\"\n title={thread.pinned ? \"Unpin\" : \"Pin\"}\n onClick={(e) => togglePin(e, thread)}\n style={{\n ...iconBtnStyle,\n color: thread.pinned ? COLORS.title : COLORS.muted,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n e.currentTarget.style.color = COLORS.title;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = thread.pinned ? COLORS.title : COLORS.muted;\n }}\n >\n <Pin size={14} fill={thread.pinned ? \"currentColor\" : \"none\"} />\n </button>\n )}\n {hasMenu && (\n <button\n type=\"button\"\n title=\"More\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuOpenId((prev) => (prev === thread.id ? null : thread.id));\n }}\n style={{\n ...iconBtnStyle,\n color: isMenuOpen ? COLORS.title : COLORS.muted,\n background: isMenuOpen ? \"rgba(0,0,0,0.06)\" : \"transparent\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(0,0,0,0.06)\";\n e.currentTarget.style.color = COLORS.title;\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = isMenuOpen\n ? \"rgba(0,0,0,0.06)\"\n : \"transparent\";\n e.currentTarget.style.color = isMenuOpen ? COLORS.title : COLORS.muted;\n }}\n >\n <MoreVertical size={14} />\n </button>\n )}\n </div>\n )}\n\n {/* ⋮ dropdown: Rename / Delete */}\n {isMenuOpen && hasMenu && (\n <div\n onClick={(e) => e.stopPropagation()}\n style={{\n position: \"absolute\",\n top: \"calc(100% - 2px)\",\n right: \"8px\",\n zIndex: 20,\n width: \"144px\",\n background: \"#FFFFFF\",\n border: `1px solid ${COLORS.border}`,\n borderRadius: \"4px\",\n boxShadow: \"-2px 2px 4px rgba(0,0,0,0.1)\",\n overflow: \"hidden\",\n }}\n >\n {canEdit && (\n <button\n type=\"button\"\n onClick={(e) => startEdit(e, thread)}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n padding: \"12px\",\n fontSize: \"13px\",\n color: COLORS.title,\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = COLORS.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n Rename\n </button>\n )}\n {canDelete && (\n <button\n type=\"button\"\n onClick={(e) => startDelete(e, thread)}\n style={{\n display: \"block\",\n width: \"100%\",\n textAlign: \"left\",\n padding: \"12px\",\n fontSize: \"13px\",\n color: COLORS.title,\n background: \"transparent\",\n border: \"none\",\n borderTop: canEdit ? `1px solid ${COLORS.border}` : \"none\",\n cursor: \"pointer\",\n }}\n onMouseEnter={(e) => (e.currentTarget.style.background = COLORS.hoverBg)}\n onMouseLeave={(e) => (e.currentTarget.style.background = \"transparent\")}\n >\n Delete\n </button>\n )}\n </div>\n )}\n\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {/* Pagination */}\n {!loading && totalPages > 1 && (\n <div\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"6px\",\n height: \"64px\",\n padding: \"0 16px\",\n boxSizing: \"border-box\",\n borderTop: `1px solid ${COLORS.border}`,\n }}\n >\n {/* Back */}\n <button\n type=\"button\"\n disabled={effectivePage <= 1}\n onClick={() => goToPage(Math.max(1, effectivePage - 1))}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"4px\",\n height: \"24px\",\n padding: \"4px 8px\",\n borderRadius: \"10px\",\n background: \"#FFFFFF\",\n border: `1px solid ${COLORS.borderSubtle}`,\n fontSize: \"12px\",\n lineHeight: \"16px\",\n color: \"#0b0b0b\",\n cursor: effectivePage <= 1 ? \"default\" : \"pointer\",\n opacity: effectivePage <= 1 ? 0.5 : 1,\n }}\n >\n <ChevronLeft size={12} />\n Back\n </button>\n\n {/* Page numbers */}\n {pageWindow.map((n) => {\n const isActivePage = n === effectivePage;\n return (\n <button\n key={n}\n type=\"button\"\n onClick={() => goToPage(n)}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"24px\",\n minWidth: \"22px\",\n padding: \"4px 8px\",\n borderRadius: \"10px\",\n fontSize: \"12px\",\n lineHeight: \"16px\",\n cursor: \"pointer\",\n background: isActivePage ? \"#0b0b0b\" : \"#FFFFFF\",\n color: isActivePage ? \"#FFFFFF\" : \"#0b0b0b\",\n border: isActivePage ? \"1px solid #0b0b0b\" : `1px solid ${COLORS.borderSubtle}`,\n fontWeight: isActivePage ? 600 : 400,\n }}\n >\n {n}\n </button>\n );\n })}\n\n {/* Next */}\n <button\n type=\"button\"\n disabled={effectivePage >= totalPages}\n onClick={() => goToPage(Math.min(totalPages, effectivePage + 1))}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"4px\",\n height: \"24px\",\n padding: \"4px 8px\",\n borderRadius: \"10px\",\n background: \"#FFFFFF\",\n border: `1px solid ${COLORS.borderSubtle}`,\n fontSize: \"12px\",\n lineHeight: \"16px\",\n color: \"#0b0b0b\",\n cursor: effectivePage >= totalPages ? \"default\" : \"pointer\",\n opacity: effectivePage >= totalPages ? 0.5 : 1,\n }}\n >\n Next\n <ChevronRight size={12} />\n </button>\n </div>\n )}\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":["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","elapsedMs","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","jsxs","jsx","Fragment","message","ChatMessage","ThinkingIndicator","Send","COLORS","dateBucket","dateStr","d","now","startToday","startYesterday","BUCKET_ORDER","formatRelative","diff","min","hr","day","ChatHistoryPanel","threads","activeThreadId","onSelectThread","onNewChat","onCollapse","onRenameThread","onDeleteThread","onPinThread","loading","pageSize","page","pageCount","onPageChange","onFilterChange","serverPaginated","searchQuery","setSearchQuery","filter","setFilter","changeFilter","f","currentPage","setCurrentPage","hoveredId","setHoveredId","editingId","setEditingId","editValue","setEditValue","deletingId","setDeletingId","menuOpenId","setMenuOpenId","editInputRef","close","onKey","canEdit","canDelete","canPin","groups","totalPages","useMemo","q","sorted","t","a","b","aTime","pages","pageItems","start","byBucket","bucket","label","totalVisible","n","g","effectivePage","goToPage","p","pageWindow","_","i","end","startEdit","thread","saveEdit","trimmed","cancelEdit","startDelete","confirmDelete","cancelDelete","togglePin","iconBtnStyle","PanelLeftClose","Search","Pin","group","isActive","isHovered","isEditing","isDeleting","isMenuOpen","hasMenu","showActions","isOpen","rowBg","rowBorder","MessageSquare","Check","X","MoreVertical","ChevronLeft","isActivePage","ChevronRight","useUserContext","MessageThread","sessionTitle","currentUser","messageInput","setMessageInput","isFocused","setIsFocused","isLoading","setIsLoading","userData","displayCurrentUser","content","optimisticMessage","msg","handleKeyPress","Clock","ref","idx","Hash","AtSign","Paperclip"],"mappings":"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"}