chordia-ui 3.2.2 → 3.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -0
- package/dist/IntegrationCard.cjs.js +2 -0
- package/dist/IntegrationCard.cjs.js.map +1 -0
- package/dist/IntegrationCard.es.js +217 -0
- package/dist/IntegrationCard.es.js.map +1 -0
- package/dist/UploadInteraction.cjs.js +2 -0
- package/dist/UploadInteraction.cjs.js.map +1 -0
- package/dist/UploadInteraction.es.js +379 -0
- package/dist/UploadInteraction.es.js.map +1 -0
- package/dist/components/layout.cjs.js +2 -2
- package/dist/components/layout.cjs.js.map +1 -1
- package/dist/components/layout.es.js +202 -411
- package/dist/components/layout.es.js.map +1 -1
- package/dist/components/onboarding.cjs.js +2 -0
- package/dist/components/onboarding.cjs.js.map +1 -0
- package/dist/components/onboarding.es.js +712 -0
- package/dist/components/onboarding.es.js.map +1 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs2.js +2 -2
- package/dist/index.cjs2.js.map +1 -1
- package/dist/index.es.js +49 -41
- package/dist/index.es.js.map +1 -1
- package/dist/index.es2.js +869 -811
- package/dist/index.es2.js.map +1 -1
- package/dist/pages/interactionDetails.cjs.js +1 -1
- package/dist/pages/interactionDetails.cjs.js.map +1 -1
- package/dist/pages/interactionDetails.es.js +16 -15
- package/dist/pages/interactionDetails.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +5 -1
- package/src/components/index.js +3 -0
- package/src/components/login/LoginPage.jsx +107 -5
- package/src/components/onboarding/AddTeammates.jsx +278 -0
- package/src/components/onboarding/ConnectData.jsx +89 -0
- package/src/components/onboarding/GettingStarted.jsx +524 -0
- package/src/components/onboarding/UploadEvaluate.jsx +255 -0
- package/src/components/onboarding/UploadInteraction.jsx +186 -0
- package/src/components/onboarding/index.js +5 -0
- package/src/tokens/colors.css +13 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactionDetails.es.js","sources":["../../src/components/pages/interactionDetails/CoachingSynthesisCard.jsx","../../src/components/pages/interactionDetails/InteractionContext.jsx","../../src/components/pages/interactionDetails/InteractionScores.jsx","../../src/components/pages/interactionDetails/InteractionSignals.jsx","../../src/components/pages/interactionDetails/InteractionGuidance.jsx","../../src/components/pages/interactionDetails/InteractionNBA.jsx","../../src/components/pages/interactionDetails/InteractionRecording.jsx","../../src/components/pages/interactionDetails/InteractionTranscript.jsx","../../src/components/common/MessageThread.jsx","../../src/components/pages/interactionDetails/InteractionDetailPanel.jsx","../../src/components/pages/interactionDetails/ExpandPatternComparison.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { TrendingUp, Lightbulb, Building, MessageSquareQuote } from \"lucide-react\";\n\n/**\n * CoachingSynthesisCard — displays LLM-generated coaching synthesis from Compass.\n *\n * Props:\n * - data object Coaching synthesis response (see shape below)\n * - loading boolean Show shimmer loading state\n * - error string Error message to display\n *\n * Data shape (from compass/summaries/coaching.py):\n * - one_liner string One-sentence summary\n * - context string Situational factors\n * - strengths Array<{ text: string, quote?: string }>\n * - improvements Array<{ text: string, quote?: string }>\n * - organizational Array<{ text: string, quote?: string }> (alias: organizational_insights)\n * - overall string \"effective\" | \"strong\" | \"needs_improvement\" | \"mixed\"\n */\n\nconst STYLE_ID = \"coaching-synthesis-keyframes\";\n\nfunction ensureKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n @keyframes coaching-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n @keyframes coaching-pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1; }\n }\n `;\n document.head.appendChild(style);\n}\n\nexport default function CoachingSynthesisCard({ data, loading, error }) {\n React.useEffect(() => { ensureKeyframes(); }, []);\n\n // Loading state\n if (loading) {\n return (\n <div style={{\n padding: \"20px 0\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n }}>\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}>\n <div style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"var(--rail-tone)\",\n animation: \"coaching-pulse 1.5s ease-in-out infinite\",\n }} />\n <span style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--rail-tone)\",\n fontFamily: \"var(--font-sans)\",\n fontWeight: 500,\n }}>\n Compass is synthesizing coaching insights…\n </span>\n </div>\n {/* Shimmer lines */}\n {[180, 260, 220].map((w, i) => (\n <div\n key={i}\n style={{\n height: 10,\n width: w,\n maxWidth: \"100%\",\n borderRadius: 4,\n background: \"linear-gradient(90deg, var(--hover-warm-subtle) 25%, var(--hover-warm) 50%, var(--hover-warm-subtle) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `coaching-shimmer 1.8s ease-in-out infinite`,\n animationDelay: `${i * 0.2}s`,\n }}\n />\n ))}\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div style={{\n padding: \"16px 0\",\n fontSize: \"var(--text-base)\",\n color: \"var(--text-faint)\",\n fontFamily: \"var(--font-sans)\",\n }}>\n Unable to generate coaching summary.\n </div>\n );\n }\n\n // No data\n if (!data) return null;\n\n const strengths = data.strengths || [];\n const improvements = data.improvements || [];\n const organizational = data.organizational || data.organizational_insights || [];\n const oneLiner = typeof data.one_liner === \"string\" ? data.one_liner : data.one_liner?.text || \"\";\n const context = typeof data.context === \"string\" ? data.context : data.context?.text || \"\";\n\n return (\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 14,\n fontFamily: \"var(--font-sans)\",\n }}>\n {/* One-liner */}\n {oneLiner && (\n <div style={{\n fontSize: \"var(--text-lg)\",\n fontWeight: 600,\n color: \"var(--text-strong)\",\n lineHeight: 1.4,\n }}>\n {oneLiner}\n </div>\n )}\n\n {/* Context */}\n {context && (\n <div style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-muted)\",\n lineHeight: 1.45,\n }}>\n {context}\n </div>\n )}\n\n {/* Strengths */}\n {strengths.length > 0 && (\n <CoachingSection\n icon={<TrendingUp size={13} />}\n label=\"Strengths\"\n color=\"var(--rail-discovery)\"\n items={strengths}\n />\n )}\n\n {/* Improvements */}\n {improvements.length > 0 && (\n <CoachingSection\n icon={<Lightbulb size={13} />}\n label=\"Improvements\"\n color=\"var(--rail-compliance)\"\n items={improvements}\n />\n )}\n\n {/* Organizational */}\n {organizational.length > 0 && (\n <CoachingSection\n icon={<Building size={13} />}\n label=\"Organizational\"\n color=\"var(--rail-outcome)\"\n items={organizational}\n />\n )}\n\n {/* Overall rating */}\n {data.overall && (\n <div style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-faint)\",\n fontStyle: \"italic\",\n marginTop: 2,\n }}>\n Overall: {data.overall.replace(/_/g, \" \")}\n </div>\n )}\n </div>\n );\n}\n\nfunction CoachingSection({ icon, label, color, items }) {\n return (\n <div>\n {/* Section header */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n marginBottom: 6,\n color,\n fontSize: \"var(--text-base)\",\n fontWeight: 650,\n letterSpacing: \"0.04em\",\n }}>\n {icon}\n {label}\n </div>\n\n {/* Items */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {items.map((item, i) => {\n const text = typeof item === \"string\" ? item : item?.text || \"\";\n const quote = typeof item === \"object\" ? item?.quote : null;\n\n return (\n <div key={i} style={{ paddingLeft: 14 }}>\n <div style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-base)\",\n lineHeight: 1.4,\n }}>\n • {text}\n </div>\n {quote && (\n <div style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 4,\n marginTop: 3,\n paddingLeft: 8,\n }}>\n <MessageSquareQuote\n size={10}\n style={{\n color: \"var(--text-faint)\",\n flexShrink: 0,\n marginTop: 2,\n }}\n />\n <span style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-muted)\",\n fontStyle: \"italic\",\n lineHeight: 1.35,\n }}>\n \"{quote}\"\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport CardBase from '../../primitives/Card.jsx';\n\nfunction fmtDur(seconds) {\n const m = Math.floor(seconds / 60);\n const s = Math.round(seconds % 60);\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nexport default function InteractionContext({ title, meta, callPurpose, classification, dimensions }) {\n const cp = callPurpose || {};\n const cls = classification || {};\n\n return (\n <CardBase variant=\"elevated\" padding=\"sm\">\n <div style={{ fontSize: 'var(--text-md)', fontWeight: 550, color: 'var(--text-strong)', lineHeight: 1.375, marginBottom: 6 }}>\n {title}\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: '4px 12px', fontSize: 11, color: 'var(--text-muted)' }}>\n {meta.evaluated_dt && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Date</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{new Date(meta.evaluated_dt).toLocaleString()}</div></div>}\n {meta.duration_seconds != null && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Duration</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{fmtDur(meta.duration_seconds)}</div></div>}\n {meta.message_count && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Messages</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{meta.message_count}</div></div>}\n {cp.interaction_direction && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Direction</span><div style={{ color: 'var(--text-base)' }}>{cp.interaction_direction}</div></div>}\n {cp.interaction_driver && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Driver</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{cp.interaction_driver}</div></div>}\n {cp.customer_intent && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Intent</span><div style={{ color: 'var(--text-base)' }}>{cp.customer_intent}</div></div>}\n {cls.interaction_paradigm && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Paradigm</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{cls.interaction_paradigm}</div></div>}\n {dimensions.map((dim, i) => (\n <div key={i}><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>{dim.label || dim.key}</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{dim.value}</div></div>\n ))}\n </div>\n {meta.session_id && (\n <div style={{ fontSize: 10, color: 'var(--text-faint)', fontFamily: 'var(--font-mono)', marginTop: 4, userSelect: 'all' }}>\n {meta.session_id}\n </div>\n )}\n </CardBase>\n );\n}","import React from 'react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\n\nexport default function InteractionScores({ scores }) {\n if (!scores?.length) return null;\n\n return (\n <DetailCard title=\"Scores\">\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\n {scores.map((s, i) => {\n const val = s.value != null ? Math.round(s.value) : null;\n return (\n <div key={i} style={{ textAlign: 'center', minWidth: 48 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: 'var(--text-ink)' }}>{val ?? '—'}</div>\n <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 2 }}>{s.label || s.key}</div>\n </div>\n );\n })}\n </div>\n </DetailCard>\n );\n}","import React, { useMemo } from 'react';\nimport { Target, CheckCircle, Lightbulb, Scale, Zap, MessageSquare, FileText, ChevronDown } from 'lucide-react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport SectionLabel from '../../primitives/SectionLabel.jsx';\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\n\nconst GROUP_LABELS = {\n outcome: { label: 'Outcome', icon: <Target size={12} />, color: 'var(--rail-outcome)' },\n process: { label: 'Process & Protocol', icon: <FileText size={12} />, color: 'var(--rail-discovery)' },\n compliance: { label: 'Compliance', icon: <Scale size={12} />, color: 'var(--rail-compliance)' },\n customer_friction: { label: 'Customer Friction', icon: <Zap size={12} />, color: 'var(--rail-coral)' },\n experience: { label: 'Experience', icon: <MessageSquare size={12} />, color: 'var(--rail-teal)' },\n};\n\nconst KIND_COLORS = {\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\n};\n\nexport default function InteractionSignals({\n signals,\n expandedSignals,\n toggleSignal,\n playEvidence,\n timelinePlaying,\n currentTimeSeconds,\n highlightTurns,\n borderRadius\n}) {\n if (!signals?.signals?.length) return null;\n\n const grouped = useMemo(() => {\n const result = {};\n for (const s of signals.signals) {\n const g = s.group || 'experience';\n if (!result[g]) result[g] = [];\n result[g].push(s);\n }\n return result;\n }, [signals]);\n\n return (\n <DetailCard title={`Signals (${signals.present_count} present / ${signals.total_signals_evaluated} evaluated)`} borderRadius={borderRadius}>\n {Object.entries(grouped).map(([groupKey, groupSignals]) => {\n const info = GROUP_LABELS[groupKey] || GROUP_LABELS.experience;\n\n return (\n <div key={groupKey} style={{ marginBottom: 10 }}>\n <SectionLabel style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {info.icon}\n <span>{info.label}</span>\n </SectionLabel>\n\n <div style={{ marginTop: 4, display: 'flex', flexDirection: 'column', gap: 6 }}>\n {groupSignals.map((s, i) => {\n const name = s.display_name || s.key || '';\n const delta = s.baseline?.delta;\n const hasObs = s.observations?.length > 0;\n const isExpanded = expandedSignals.has(s.key);\n \n // Map signal group to Tag variant\n const getVariant = (group) => {\n switch (group) {\n case 'outcome': return 'phase';\n case 'process': return 'tool';\n case 'compliance': return 'policy';\n case 'customer_friction': return 'default';\n case 'experience': return 'global';\n default: return 'default';\n }\n };\n \n return (\n <div\n key={i}\n id={`signal-${s.key}`}\n style={{\n border: '1px solid var(--border, rgba(52, 58, 64, 0.12))',\n borderRadius: 'var(--radius-md, 8px)',\n background: 'var(--paper, rgba(255, 255, 255, 0.98))',\n overflow: 'hidden',\n }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n if (hasObs) {\n toggleSignal(s.key);\n e.currentTarget.blur();\n }\n }}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 10px',\n background: 'transparent',\n borderTop: '1px solid transparent',\n borderRight: '1px solid transparent',\n borderLeft: '1px solid transparent',\n borderBottom: '1px solid var(--border, rgba(52, 58, 64, 0.08))',\n cursor: hasObs ? 'pointer' : 'default',\n }}\n title={[\n s.confidence != null ? `Confidence: ${Math.round(s.confidence * 100)}%` : '',\n delta != null ? `Δ baseline: ${delta > 0 ? '+' : ''}${(delta * 100).toFixed(1)}%` : '',\n ].filter(Boolean).join(' · ')}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n whiteSpace: 'nowrap',\n }}\n >\n {KIND_COLORS[s.kind]?.icon}\n <span>{name}</span>\n {hasObs && (\n <span\n style={{\n marginLeft: 4,\n fontSize: 10,\n opacity: 0.6,\n }}\n >\n ({s.observations.length})\n </span>\n )}\n </span>\n {hasObs && (\n <ChevronDown\n size={14}\n style={{\n color: 'var(--text-muted)',\n flexShrink: 0,\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.16s ease',\n }}\n />\n )}\n </button>\n\n {isExpanded && s.observations && (\n <div style={{ width: '100%', margin: '0 0 6px' }}>\n {s.observations.map((obs, oi) => (\n <div key={oi} style={{ marginBottom: 6 }}>\n <div\n style={{\n display: 'flex',\n borderRadius: 'var(--radius-sm, 8px)',\n background: 'var(--paper, #fff)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: 3,\n background: info.color,\n }}\n />\n <div\n style={{\n flex: 1,\n fontSize: 'var(--text-sm)',\n color: 'var(--text-muted)',\n padding: '8px 12px',\n }}\n >\n <div\n style={{\n fontWeight: 600,\n color: 'var(--text-base)',\n marginBottom: 3,\n fontSize: 'var(--text-base)',\n }}\n >\n {obs.key || ''}\n </div>\n <div style={{ marginBottom: 6, lineHeight: 1.4 }}>\n {obs.reason || obs.explanation || ''}\n </div>\n {obs.evidence?.map((ev, ei) => {\n const startMs = ev.start_ms;\n const endMs = ev.end_ms;\n\n let isPlayingSegment = false;\n if (startMs != null && timelinePlaying) {\n const startSec = startMs / 1000;\n const endSec =\n endMs != null ? endMs / 1000 : startSec + 1;\n const cs = currentTimeSeconds ?? 0;\n isPlayingSegment =\n cs >= startSec && cs <= endSec + 0.25;\n }\n\n return (\n <EvidenceItem\n key={ei}\n ev={ev}\n isPlaying={isPlayingSegment}\n railColor={info.color}\n onPlay={(startMs, endMs) =>\n playEvidence?.(startMs, endMs, ev.turn_ids)\n }\n onHighlight={highlightTurns}\n />\n );\n })}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </DetailCard>\n );\n}","import React from 'react';\nimport { CheckCircle, Lightbulb, Zap, CornerDownRight } from 'lucide-react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\n\nconst KIND_COLORS = {\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\n};\n\nexport default function InteractionGuidance({\n guidance,\n playEvidence,\n timelinePlaying,\n currentTimeSeconds,\n highlightTurns,\n borderRadius\n}) {\n if (!guidance?.items?.length) return null;\n\n return (\n <DetailCard title={`Guidance (${guidance.total_items} items)`} borderRadius={borderRadius}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {guidance.items.map((g, i) => {\n const ki = KIND_COLORS[g.guidance_kind] || KIND_COLORS.excellence;\n const ownerBadge = g.owner === 'organization'\n ? { bg: 'color-mix(in srgb, var(--rail-discovery) 15%, transparent)', color: 'var(--rail-discovery)', text: 'ORG' }\n : g.owner === 'shared'\n ? { bg: 'color-mix(in srgb, var(--state-unknown) 15%, transparent)', color: 'var(--state-unknown)', text: 'SHARED' }\n : { bg: 'color-mix(in srgb, var(--rail-teal) 10%, transparent)', color: 'var(--rail-teal)', text: 'AGENT' };\n return (\n <div key={i} style={{\n padding: '10px 12px', borderRadius: 'var(--radius)',\n background: 'var(--paper)', borderLeft: `3px solid ${ki.color}`,\n }}>\n <div style={{ fontSize: 'var(--text-base)', color: 'var(--text-strong)', display: 'flex', alignItems: 'center', gap: 5, fontWeight: 550 }}>\n {ki.icon} {g.title || ''}\n <span style={{\n fontSize: 9, padding: '1px 6px', borderRadius: 8, marginLeft: 4,\n background: ownerBadge.bg, color: ownerBadge.color, fontWeight: 600,\n }}>\n {ownerBadge.text}\n </span>\n </div>\n {g.detail && <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 4, lineHeight: 1.4 }}>{g.detail}</div>}\n {/* Signal refs with evidence */}\n {g.signal_refs?.map((sr, si) => (\n <div key={si} style={{ marginTop: 6 }}>\n <div\n style={{\n fontSize: 10,\n color: 'var(--text-muted)',\n fontWeight: 600,\n marginBottom: 3,\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n }}\n >\n <CornerDownRight size={10} /> {sr.display_name || sr.signal_key}\n {sr.confidence != null && (\n <span style={{ fontWeight: 400, opacity: 0.7 }}>\n {' '}\n ({Math.round(sr.confidence * 100)}%)\n </span>\n )}\n </div>\n {sr.evidence?.map((ev, ei) => {\n const startMs = ev.start_ms;\n const endMs = ev.end_ms;\n\n let isPlayingSegment = false;\n if (startMs != null && timelinePlaying) {\n const startSec = startMs / 1000;\n const endSec =\n endMs != null ? endMs / 1000 : startSec + 1;\n const cs = currentTimeSeconds ?? 0;\n isPlayingSegment =\n cs >= startSec && cs <= endSec + 0.25;\n }\n\n return (\n <EvidenceItem\n key={ei}\n ev={ev}\n isPlaying={isPlayingSegment}\n onPlay={(sMs, eMs) =>\n playEvidence?.(sMs, eMs, ev.turn_ids)\n }\n onHighlight={highlightTurns}\n />\n );\n })}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n </DetailCard>\n );\n}","import React from 'react';\nimport { Target } from 'lucide-react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\n\nexport default function InteractionNBA({ nba }) {\n const items = nba?.recommendations || nba?.actions || [];\n if (!items.length) return null;\n\n return (\n <DetailCard title=\"Next Best Actions\">\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {items.slice(0, 8).map((r, i) => (\n <div key={i} style={{ fontSize: 11, color: 'var(--text-muted)', display: 'flex', alignItems: 'center', gap: 4 }}>\n <Target size={12} /> <strong style={{ color: 'var(--text-base)' }}>{r.action || r.title || ''}</strong>\n {r.rationale && ` — ${r.rationale}`}\n </div>\n ))}\n </div>\n </DetailCard>\n );\n}","import React from 'react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport Timeline from '../../media/Timeline.jsx';\n\nexport default function InteractionRecording({ \n audioUrl, \n timelineSegments, \n durationSeconds, \n currentTimeSeconds,\n timelinePlaying,\n playbackRate,\n onSeek,\n onTogglePlay,\n onSeekBack,\n onSeekForward,\n onSetPlaybackRate,\n audioRef\n}) {\n if (!audioUrl) return null;\n\n return (\n <DetailCard title=\"Recording\">\n <Timeline\n segments={timelineSegments}\n durationSeconds={durationSeconds || 0}\n currentTimeSeconds={currentTimeSeconds}\n onSeek={onSeek}\n showControls={true}\n hasRecording={true}\n timelinePlaying={timelinePlaying}\n playbackRate={playbackRate}\n onTogglePlay={onTogglePlay}\n onSeekBack={onSeekBack}\n onSeekForward={onSeekForward}\n onSetPlaybackRate={onSetPlaybackRate}\n />\n {/* Hidden audio element for actual playback */}\n <audio ref={audioRef} preload=\"none\" style={{ display: 'none' }}>\n <source src={audioUrl} type=\"audio/mpeg\" />\n </audio>\n </DetailCard>\n );\n}","import React from 'react';\nimport TranscriptCard from '../../media/TranscriptCard.jsx';\n\nexport default function InteractionTranscript({ \n transcript, \n audioUrl,\n highlightedTurns,\n activeTurnIndex,\n timelinePlaying,\n turnObservations,\n setExpandedSignals,\n onTurnPlayPause,\n}) {\n if (!transcript?.messages?.length) return null;\n\n // Helper function to format time from ms to \"MM:SS–MM:SS\"\n const formatTimeRange = (startMs, endMs) => {\n if (startMs == null) return undefined;\n const formatTime = (ms) => {\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.floor((ms % 60000) / 1000);\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n };\n const start = formatTime(startMs);\n const end = endMs != null ? formatTime(endMs) : start;\n return `${start}–${end}`;\n };\n\n const turns = transcript.messages.map((m, i) => ({\n actor: m.actor === 'agent' ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer'),\n actorType: m.actor === 'agent' ? 'agent' : 'customer',\n text: m.text || '',\n timeRange: formatTimeRange(m.start ?? m.start_ms, m.end ?? m.end_ms),\n isHighlighted: highlightedTurns.has(i),\n highlightColor: (timelinePlaying && activeTurnIndex === i) \n ? (m.actor === 'agent' ? 'var(--rail-outcome)' : 'var(--rail-discovery)')\n : undefined,\n observations: (turnObservations[i] || []).map(obs => ({\n ...obs,\n onClick: () => {\n // Expand the parent signal and scroll to it\n setExpandedSignals(prev => new Set([...prev, obs.signalKey]));\n setTimeout(() => {\n const el = document.getElementById(`signal-${obs.signalKey}`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 100);\n },\n })),\n }));\n\n return (\n <div id=\"transcript-container\">\n <TranscriptCard\n turns={turns}\n audioUrl={audioUrl}\n activeTurnIndex={activeTurnIndex}\n autoScrollActiveTurn={timelinePlaying}\n isExternalPlaying={timelinePlaying}\n onTurnPlayPause={onTurnPlayPause}\n />\n </div>\n );\n}","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Send, Clock, ChevronRight } from \"lucide-react\";\n\nconst messageActionButtonStyle = {\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.65)\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n};\n\n// Map author roles to consistent avatar background colors so that\n// supervisors, admins, and agents are visually distinct.\nconst roleColorMap = (role) => {\n if (!role) return null;\n const normalized = String(role).toLowerCase();\n if (normalized === \"supervisor\") return \"var(--rail-compliance)\";\n if (normalized === \"admin\" || normalized === \"administrator\")\n return \"var(--rail-discovery)\";\n if (normalized === \"agent\") return \"var(--rail-outcome)\";\n return null;\n};\n\n// Safely extract an array of messages/comments from a thread or payload,\n// tolerating different backend shapes (messages, comments, thread_messages, items, etc.).\nconst extractMessagesArray = (node) => {\n if (!node) return [];\n\n const directCandidates = [\n node.messages,\n node.comments,\n node.thread_messages,\n node.items,\n node.children,\n ];\n\n for (const candidate of directCandidates) {\n if (Array.isArray(candidate) && candidate.length) {\n return candidate;\n }\n }\n\n // Handle wrapped shapes like { messages: { data: [...] } }\n if (node.messages && Array.isArray(node.messages.data)) {\n return node.messages.data;\n }\n\n return [];\n};\n\n// Flatten a nested messages array (with optional replies) into a linear list\n// while preserving parent/child relationships via parentId and keeping\n// replies immediately after their parent.\nconst flattenMessages = (rawMessages, parentId = null, startIndex = 0) => {\n const out = [];\n\n (rawMessages || []).forEach((m, index) => {\n const author = m.author || {};\n const authorName = author.name || m.author_name || \"Unknown\";\n const initials =\n author.initials ||\n (authorName\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()) ||\n \"U\";\n const role = author.role || m.author_role;\n const roleColor = roleColorMap(role);\n const color = author.color || m.author_color || roleColor || \"#6B7C93\";\n\n const id = m.id || `msg-${startIndex + index}`;\n\n const baseMessage = {\n id,\n author: {\n name: authorName,\n initials,\n color,\n role,\n },\n content: m.content || m.text || \"\",\n timestamp: m.timestamp || m.created_at_display || m.created_at || \"\",\n type: m.type || \"comment\",\n isEdited: m.isEdited || m.is_edited || m.edited || false,\n references: m.references || [],\n parentId: m.parentId || m.parent_message_id || parentId || null,\n };\n\n out.push(baseMessage);\n\n if (Array.isArray(m.replies) && m.replies.length > 0) {\n out.push(\n ...flattenMessages(m.replies, id, startIndex + out.length)\n );\n }\n });\n\n return out;\n};\n\nconst formatTimestamp = (value) => {\n if (!value) return \"\";\n // If it's already a human-friendly string, just return as-is\n if (!/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) return value;\n\n try {\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return value;\n\n const now = new Date();\n const sameDay =\n d.getFullYear() === now.getFullYear() &&\n d.getMonth() === now.getMonth() &&\n d.getDate() === now.getDate();\n\n const yesterday = new Date(now);\n yesterday.setDate(yesterday.getDate() - 1);\n const isYesterday =\n d.getFullYear() === yesterday.getFullYear() &&\n d.getMonth() === yesterday.getMonth() &&\n d.getDate() === yesterday.getDate();\n\n const timeStr = d.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n\n if (sameDay) {\n return `Today at ${timeStr}`;\n }\n\n if (isYesterday) {\n return `Yesterday at ${timeStr}`;\n }\n\n // Within last 7 days: show weekday name\n const diffMs = now.getTime() - d.getTime();\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\n if (diffDays < 7 && diffDays > 0) {\n const weekday = d.toLocaleDateString(undefined, { weekday: \"long\" });\n return `${weekday} at ${timeStr}`;\n }\n\n // Older: fallback to short date\n const dateStr = d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: d.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n });\n\n return `${dateStr} at ${timeStr}`;\n } catch {\n return value;\n }\n};\n\n\n\n/**\n * MessageThread (common)\n *\n * Lightweight, UI-only message thread component for session discussion.\n * - Controlled via `messages` + `onSendMessage` (and optional reply/edit/delete callbacks)\n * - onSendMessage(payload) receives { content, parent_message_id } for API use\n * - onEditMessage({ id, content }): on API error return { success: false } or throw to keep edit UI open\n * - No data fetching or app-specific APIs – host app owns data + side effects\n *\n * `messages` items:\n * {\n * id: string;\n * author: { name: string; initials: string; color: string; role?: string };\n * content: string;\n * timestamp: string; // already formatted for display\n * type?: \"comment\" | \"system\";\n * isEdited?: boolean;\n * references?: Array<{ type: \"condition\" | \"timestamp\" | \"observation\"; label: string }>;\n * }\n *\n * When a structured `messageThread` payload is provided (for example from an\n * `interaction-message-thread` block), this component will normalize its\n * threads and messages into the same internal shape so existing threads and\n * comments render without the caller needing to reshape the data.\n */\nexport default function MessageThread({\n sessionTitle,\n sessionSubtitle,\n threadLabel,\n messages: initialMessages,\n messageThread,\n onSendMessage,\n onReplyMessage,\n onEditMessage,\n onDeleteMessage,\n onCreateNewThread, // optional: host can handle new thread creation\n onThreadSelect, // optional: host can react when a thread pill is selected\n currentUser,\n isLoading = false,\n}) {\n const [messageInput, setMessageInput] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [messages, setMessages] = useState(initialMessages || []);\n const [isSending, setIsSending] = useState(false);\n const [hoveredMessageId, setHoveredMessageId] = useState(null);\n // Thread tabs — start empty; callers or messageThread payload define them.\n const [threads, setThreads] = useState([]);\n const [activeThreadId, setActiveThreadId] = useState(null);\n const [replyingToMessageId, setReplyingToMessageId] = useState(null);\n const [replyDraft, setReplyDraft] = useState(\"\");\n const [editingMessageId, setEditingMessageId] = useState(null);\n const [editContent, setEditContent] = useState(\"\");\n const [deleteConfirmMessage, setDeleteConfirmMessage] = useState(null);\n const [showNewThreadCompose, setShowNewThreadCompose] = useState(false);\n const [newThreadInput, setNewThreadInput] = useState(\"\");\n const [isCreatingNewThread, setIsCreatingNewThread] = useState(false);\n const [expandedParentIds, setExpandedParentIds] = useState(new Set());\n\n const messagesEndRef = useRef(null);\n const messageInputRef = useRef(null);\n\n const normalizedRole =\n (currentUser && currentUser.role && String(currentUser.role).toLowerCase()) ||\n \"\";\n\n const displayCurrentUser = useMemo(() => {\n if (!currentUser) {\n return {\n name: \"You\",\n initials: \"YO\",\n color: \"#6B7C93\",\n };\n }\n\n const name = currentUser.name || \"You\";\n const initials =\n currentUser.initials ||\n (name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()) ||\n \"YO\";\n\n const role =\n currentUser.role && String(currentUser.role).toLowerCase();\n const roleColor = roleColorMap(role);\n\n const color = currentUser.color || roleColor || \"#6B7C93\";\n\n return {\n ...currentUser,\n name,\n initials,\n color,\n };\n }, [currentUser]);\n const canCreateNewThread =\n normalizedRole === \"supervisor\" || normalizedRole === \"admin\";\n\n const childrenByParentId = useMemo(() => {\n const map = {};\n (messages || []).forEach((m) => {\n if (!m.parentId) return;\n if (!map[m.parentId]) map[m.parentId] = [];\n map[m.parentId].push(m);\n });\n return map;\n }, [messages]);\n\n const topLevelMessages = useMemo(\n () => (messages || []).filter((m) => !m.parentId),\n [messages]\n );\n\n // Shared helpers so reply/edit/delete checks are consistent for\n // both top‑level messages and nested replies.\n const isChildReply = (id) => replyingToMessageId === id;\n const isChildEdit = (id) => editingMessageId === id;\n const isChildDelete = (id) =>\n deleteConfirmMessage && deleteConfirmMessage.id === id;\n\n const hasHeader = threadLabel || sessionTitle || sessionSubtitle;\n const replyingToMessage = replyingToMessageId\n ? messages.find((m) => m.id === replyingToMessageId)\n : null;\n\n useEffect(() => {\n // When caller passes explicit messages (and no structured messageThread),\n // keep internal state in sync. Avoid resetting when using messageThread.\n if (messageThread) return;\n if (!initialMessages) return;\n setMessages(initialMessages);\n }, [initialMessages, messageThread]);\n\n // Normalize an optional `messageThread` payload (e.g. from interaction-detail data)\n // into local threads + messages so existing backend data shows up in the UI.\n useEffect(() => {\n if (!messageThread) return;\n\n const rawThreads = Array.isArray(messageThread.threads)\n ? messageThread.threads\n : Array.isArray(messageThread.items)\n ? messageThread.items\n : [];\n\n // Case 1: multi-thread payload\n if (rawThreads.length > 0) {\n const normalizedThreads = rawThreads.map((t, index) => {\n const id = t.id || t.thread_id || `thread-${index + 1}`;\n const label =\n t.label ||\n t.title ||\n (index === 0 ? threadLabel || \"Session\" : `Thread ${index + 1}`);\n\n const rawMessagesForThread = extractMessagesArray(t);\n const messagesForThread = flattenMessages(rawMessagesForThread);\n\n return { id, label, messages: messagesForThread };\n });\n\n // Prefer payload threads; do not invent a default \"Session\" thread.\n setThreads(normalizedThreads);\n\n const firstWithMessages =\n normalizedThreads.find((t) => (t.messages || []).length > 0) ||\n normalizedThreads[0];\n\n const flatMessages = firstWithMessages?.messages || [];\n setMessages(flatMessages);\n // Start with all replies collapsed; user can expand per‑message.\n setExpandedParentIds(new Set());\n setActiveThreadId(firstWithMessages?.id || null);\n return;\n }\n\n // Case 2: single-thread payload with flat messages\n const rawFlat = extractMessagesArray(messageThread);\n if (rawFlat.length) {\n const mappedMessages = flattenMessages(rawFlat);\n\n setMessages(mappedMessages);\n // Start with all replies collapsed; user can expand per‑message.\n setExpandedParentIds(new Set());\n\n // Single-thread payload without an explicit threads array: create one\n // pill using the thread's own title so we don't show a generic \"Session\".\n const singleId = messageThread.id || \"thread-1\";\n const singleLabel =\n messageThread.title || threadLabel || \"Thread 1\";\n\n setThreads([\n {\n id: singleId,\n label: singleLabel,\n },\n ]);\n setActiveThreadId(singleId);\n }\n }, [messageThread, threadLabel]);\n useEffect(() => {\n // Keep the primary thread label aligned with the provided threadLabel\n if (!threadLabel) return;\n setThreads((prev) =>\n prev.map((thread, index) =>\n index === 0 ? { ...thread, label: threadLabel } : thread\n )\n );\n }, [threadLabel]);\n\n useEffect(() => {\n if (!messagesEndRef.current) return;\n if (!messages || messages.length === 0) return;\n // Keep the messages scrolled to the bottom *within* the thread container\n // without forcing the entire page to scroll.\n const container = messagesEndRef.current.parentElement;\n if (container) {\n container.scrollTop = container.scrollHeight;\n } else {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n }\n }, [messages]);\n\n const handleNewThreadSubmit = async () => {\n const trimmed = newThreadInput.trim();\n if (!trimmed) return;\n setIsCreatingNewThread(true);\n try {\n const newId = `thread-${Date.now()}`;\n setThreads((prev) => [\n ...prev,\n {\n id: newId,\n label: trimmed.slice(0, 32) || `Thread ${prev.length + 1}`,\n },\n ]);\n setActiveThreadId(newId);\n await onCreateNewThread?.(trimmed);\n setNewThreadInput(\"\");\n setShowNewThreadCompose(false);\n } finally {\n setIsCreatingNewThread(false);\n }\n };\n\n const handleNewThreadCancel = () => {\n setShowNewThreadCompose(false);\n setNewThreadInput(\"\");\n };\n\n const handleSend = async () => {\n const trimmed = messageInput.trim();\n if (!trimmed) return;\n\n const content = trimmed;\n setMessageInput(\"\");\n\n const optimisticId = `temp-${Date.now()}`;\n const optimisticMessage = {\n id: optimisticId,\n author: displayCurrentUser,\n content,\n timestamp: \"Just now\",\n type: \"comment\",\n isOptimistic: true,\n parentId: replyingToMessageId || null,\n };\n\n setMessages((prev) => [...prev, optimisticMessage]);\n\n if (onSendMessage) {\n setIsSending(true);\n try {\n await onSendMessage({\n content,\n parent_message_id: replyingToMessageId || null,\n });\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\n )\n );\n } catch {\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticId));\n } finally {\n setIsSending(false);\n }\n setReplyingToMessageId(null);\n return;\n }\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\n )\n );\n setReplyingToMessageId(null);\n };\n\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleReplyClick = (message) => {\n setReplyingToMessageId(message.id);\n setReplyDraft(\"\");\n setEditingMessageId(null);\n setEditContent(\"\");\n setHoveredMessageId(null);\n onReplyMessage?.(message);\n };\n\n const handleInlineReplySend = async (parentMessageId) => {\n const trimmed = replyDraft.trim();\n if (!trimmed) return;\n\n const optimisticId = `reply-${Date.now()}`;\n const optimisticReply = {\n id: optimisticId,\n author: displayCurrentUser,\n content: trimmed,\n timestamp: \"Just now\",\n type: \"comment\",\n isOptimistic: !onSendMessage,\n parentId: parentMessageId,\n };\n\n setMessages((prev) => [...prev, optimisticReply]);\n\n setIsSending(true);\n try {\n if (onSendMessage) {\n await onSendMessage({\n content: trimmed,\n parent_message_id: parentMessageId,\n });\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\n )\n );\n }\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n } catch {\n if (onSendMessage) {\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticId));\n }\n } finally {\n setIsSending(false);\n }\n };\n\n const handleEditClick = (message) => {\n setEditingMessageId(message.id);\n setEditContent(message.content || \"\");\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n setHoveredMessageId(null);\n };\n\n const handleEditSubmit = async () => {\n const trimmed = editContent.trim();\n if (!trimmed || !editingMessageId) return;\n try {\n const result = await onEditMessage?.({ id: editingMessageId, content: trimmed });\n // Keep edit UI open if host explicitly reports failure (e.g. API 500).\n // Host can return { success: false } or throw; either way we do not update or close.\n if (result && typeof result === \"object\" && result.success === false) {\n return;\n }\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === editingMessageId\n ? { ...msg, content: trimmed, isEdited: true }\n : msg\n )\n );\n setEditingMessageId(null);\n setEditContent(\"\");\n } catch (err) {\n // Keep edit textarea + Cancel + Save visible on error; host can show a toast.\n // eslint-disable-next-line no-console\n console.error(\"MessageThread edit failed:\", err);\n }\n };\n\n const handleEditCancel = () => {\n setEditingMessageId(null);\n setEditContent(\"\");\n };\n\n const handleDeleteClick = (message) => {\n setDeleteConfirmMessage(message);\n setHoveredMessageId(null);\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteConfirmMessage) return;\n const msg = deleteConfirmMessage;\n setDeleteConfirmMessage(null);\n setMessages((prev) => prev.filter((m) => m.id !== msg.id));\n await onDeleteMessage?.(msg);\n };\n\n // Recursive renderer for a single message + its children\nconst renderMessageTree = (message, depth = 0) => {\n const children = childrenByParentId[message.id] || [];\n const hasChildren = children.length > 0;\n const isExpanded = expandedParentIds.has(message.id);\n const isEditing = isChildEdit(message.id);\n const isReplying = isChildReply(message.id);\n\n return (\n <div key={message.id}>\n <div\n onMouseEnter={() =>\n message.type !== \"system\" && setHoveredMessageId(message.id)\n }\n onMouseLeave={() => setHoveredMessageId(null)}\n style={{\n display: \"flex\",\n gap: \"12px\",\n opacity: message.type === \"system\" ? 0.75 : 1,\n padding: \"4px 0\",\n margin: \"0 -4px\",\n borderRadius: \"8px\",\n marginLeft: depth > 0 ? 16 : 0,\n }}\n >\n {message.type !== \"system\" ? (\n <div\n style={{\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\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 }}\n >\n {message.author.initials}\n </div>\n ) : (\n <div\n style={{\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\n background: \"rgba(30, 33, 37, 0.1)\",\n color: \"rgba(30, 33, 37, 0.55)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Clock size={16} />\n </div>\n )}\n\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* header: name + time + role chip + hover actions */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n marginBottom: \"6px\",\n justifyContent: \"space-between\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n }}\n >\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 650,\n color: \"rgba(30, 33, 37, 0.9)\",\n }}\n >\n {message.author.name}\n </span>\n {message.timestamp && (\n <span\n style={{\n fontSize: \"10px\",\n fontFamily: \"var(--default-mono-font-family)\",\n color: \"rgba(30, 33, 37, 0.5)\",\n }}\n >\n {formatTimestamp(message.timestamp)}\n </span>\n )}\n {message.author?.role && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n fontSize: \"10px\",\n color: \"rgba(30, 33, 37, 0.6)\",\n background: \"rgba(30, 33, 37, 0.08)\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n fontWeight: 600,\n }}\n >\n {String(message.author.role)}\n </span>\n )}\n {(message.isEdited || message.is_edited) && (\n <span\n style={{\n fontSize: \"10px\",\n color: \"rgba(30, 33, 37, 0.5)\",\n fontStyle: \"italic\",\n }}\n >\n (Edited)\n </span>\n )}\n </div>\n\n {message.type !== \"system\" &&\n hoveredMessageId === message.id && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n flexShrink: 0,\n }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleReplyClick(message);\n }}\n style={messageActionButtonStyle}\n >\n Reply\n </button>\n {onEditMessage && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleEditClick(message);\n }}\n style={messageActionButtonStyle}\n >\n Edit\n </button>\n )}\n {onDeleteMessage && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleDeleteClick(message);\n }}\n style={{\n ...messageActionButtonStyle,\n color: \"rgba(198, 99, 99, 0.9)\",\n }}\n >\n Delete\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* body: edit vs text */}\n {isEditing ? (\n <div style={{ marginTop: \"4px\" }}>\n <textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleEditSubmit();\n }\n if (e.key === \"Escape\") handleEditCancel();\n }}\n placeholder=\"Edit message...\"\n autoFocus\n style={{\n width: \"100%\",\n minHeight: \"56px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n background: \"white\",\n border: \"1px solid rgba(52, 58, 64, 0.2)\",\n borderRadius: \"6px\",\n resize: \"vertical\",\n outline: \"none\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n marginBottom: \"8px\",\n }}\n />\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n }}\n >\n <button\n type=\"button\"\n onClick={handleEditCancel}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.45)\",\n background: \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.15)\";\n e.currentTarget.style.color =\n \"rgba(30, 33, 37, 0.7)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.1)\";\n e.currentTarget.style.color =\n \"rgba(30, 33, 37, 0.45)\";\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleEditSubmit}\n disabled={!editContent?.trim()}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: editContent?.trim()\n ? \"white\"\n : \"rgba(30, 33, 37, 0.45)\",\n background: editContent?.trim()\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: editContent?.trim() ? \"pointer\" : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (editContent?.trim()) {\n e.currentTarget.style.background = \"#4d7290\";\n }\n }}\n onMouseLeave={(e) => {\n if (editContent?.trim()) {\n e.currentTarget.style.background = \"#5e88b0\";\n }\n }}\n >\n Save\n </button>\n </div>\n </div>\n ) : (\n <div\n style={{\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n lineHeight: 1.55,\n marginBottom: message.references?.length ? \"8px\" : 0,\n }}\n >\n {message.content}\n </div>\n )}\n\n {/* inline reply box when replying to this id */}\n {isReplying && (\n <div style={{ marginTop: \"12px\" }}>\n <textarea\n value={replyDraft}\n onChange={(e) => setReplyDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n }\n }}\n placeholder=\"Type your reply...\"\n disabled={isSending}\n autoFocus\n style={{\n width: \"100%\",\n minHeight: \"64px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n background: \"white\",\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\n borderRadius: \"6px\",\n resize: \"vertical\",\n outline: \"none\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n marginBottom: \"10px\",\n }}\n />\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n }}\n disabled={isSending}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.45)\",\n background: \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: isSending ? \"not-allowed\" : \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => handleInlineReplySend(message.id)}\n disabled={!replyDraft.trim() || isSending}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color:\n replyDraft.trim() && !isSending\n ? \"white\"\n : \"rgba(30, 33, 37, 0.45)\",\n background:\n replyDraft.trim() && !isSending\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.12)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor:\n replyDraft.trim() && !isSending\n ? \"pointer\"\n : \"not-allowed\",\n }}\n >\n Send\n </button>\n </div>\n </div>\n )}\n\n {/* references block (unchanged) */}\n {/* ... your existing references pills ... */}\n\n {/* children: collapse/expand replies */}\n {hasChildren && (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={() =>\n setExpandedParentIds((prev) => {\n const next = new Set(prev);\n next.has(message.id)\n ? next.delete(message.id)\n : next.add(message.id);\n return next;\n })\n }\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.6)\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: 6,\n cursor: \"pointer\",\n }}\n title={isExpanded ? \"Collapse replies\" : \"Expand replies\"}\n >\n <ChevronRight\n size={14}\n style={{\n flexShrink: 0,\n transform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n <span>\n {children.length} {children.length === 1 ? \"reply\" : \"replies\"}\n </span>\n </button>\n\n {isExpanded && (\n <div\n style={{\n marginTop: 8,\n marginLeft: 16,\n paddingLeft: 16,\n borderLeft: \"2px solid rgba(52, 58, 64, 0.14)\",\n }}\n >\n {children.map((child) =>\n renderMessageTree(child, depth + 1)\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"rgba(255, 255, 255, 0.98)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* Delete confirmation overlay */}\n {deleteConfirmMessage && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(30, 33, 37, 0.35)\",\n borderRadius: \"12px\",\n }}\n onClick={() => setDeleteConfirmMessage(null)}\n >\n <div\n style={{\n background: \"white\",\n borderRadius: \"12px\",\n padding: \"20px 24px\",\n boxShadow: \"0 8px 24px rgba(30, 33, 37, 0.15)\",\n maxWidth: \"320px\",\n width: \"90%\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <p\n style={{\n margin: 0,\n marginBottom: \"20px\",\n fontSize: \"14px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.9)\",\n lineHeight: 1.45,\n }}\n >\n Do you really want to delete?\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"10px\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n type=\"button\"\n onClick={() => setDeleteConfirmMessage(null)}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.45)\",\n background: \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleDeleteConfirm}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"white\",\n background: \"#5e88b0\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Header */}\n {hasHeader && (\n <div\n style={{\n padding: \"14px 16px\",\n borderBottom: \"1px solid rgba(52, 58, 64, 0.12)\",\n background: \"rgba(255, 255, 255, 0.98)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n <div>\n <div\n style={{\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.95)\",\n marginBottom: \"4px\",\n }}\n >\n {threadLabel || \"Session Discussion\"}\n </div>\n {(sessionTitle || sessionSubtitle) && (\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n }}\n >\n {sessionTitle || sessionSubtitle}\n </div>\n )}\n {threads.length > 0 && (\n <div\n style={{\n marginTop: \"8px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n }}\n >\n {threads.map((thread) => {\n const isActive = thread.id === activeThreadId;\n return (\n <button\n key={thread.id}\n type=\"button\"\n onClick={() => {\n setActiveThreadId(thread.id);\n if (Array.isArray(thread.messages)) {\n setMessages(thread.messages);\n // On thread switch, start with replies collapsed.\n setExpandedParentIds(new Set());\n }\n setHoveredMessageId(null);\n setReplyingToMessageId(null);\n setEditingMessageId(null);\n onThreadSelect?.(thread);\n }}\n style={{\n padding: \"4px 10px\",\n borderRadius: \"999px\",\n border: \"1px solid rgba(184, 156, 106, 0.35)\",\n background: isActive\n ? \"rgba(184, 156, 106, 0.16)\"\n : \"rgba(255, 255, 255, 0.9)\",\n color: \"rgba(30, 33, 37, 0.85)\",\n fontSize: \"11px\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n {thread.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* \"+ New thread\" – only for supervisor/admin roles */}\n {canCreateNewThread && (\n <button\n type=\"button\"\n onClick={() => {\n setShowNewThreadCompose((prev) => !prev);\n }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"6px 12px\",\n fontSize: \"13px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.75)\",\n background: \"transparent\",\n border: \"1px solid rgba(30, 33, 37, 0.12)\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(231, 212, 162, 0.12)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n title=\"Start a new discussion thread\"\n >\n <span\n style={{\n fontSize: 16,\n lineHeight: 1,\n marginTop: -1,\n }}\n >\n +\n </span>\n New thread\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Messages list */}\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 {/* Inline \"new thread\" compose */}\n {showNewThreadCompose && (\n <div\n style={{\n marginBottom: \"16px\",\n padding: \"12px\",\n background: \"rgba(30, 33, 37, 0.04)\",\n border: \"1px solid rgba(52, 58, 64, 0.14)\",\n borderRadius: \"8px\",\n }}\n >\n <textarea\n value={newThreadInput}\n onChange={(e) => setNewThreadInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleNewThreadSubmit();\n }\n }}\n placeholder=\"Start a new thread...\"\n disabled={isCreatingNewThread}\n style={{\n width: \"100%\",\n minHeight: \"64px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n background: \"white\",\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\n borderRadius: \"6px\",\n resize: \"vertical\",\n outline: \"none\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n marginBottom: \"10px\",\n }}\n />\n <div style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\n <button\n type=\"button\"\n onClick={handleNewThreadCancel}\n disabled={isCreatingNewThread}\n style={{\n padding: \"6px 14px\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.7)\",\n background: \"rgba(30, 33, 37, 0.08)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: isCreatingNewThread ? \"not-allowed\" : \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleNewThreadSubmit}\n disabled={!newThreadInput.trim() || isCreatingNewThread}\n style={{\n padding: \"6px 14px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"white\",\n background:\n newThreadInput.trim() && !isCreatingNewThread\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.25)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor:\n newThreadInput.trim() && !isCreatingNewThread\n ? \"pointer\"\n : \"not-allowed\",\n }}\n >\n {isCreatingNewThread ? \"Sending...\" : \"Send\"}\n </button>\n </div>\n </div>\n )}\n {isLoading ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n }}\n >\n Loading messages...\n </div>\n ) : topLevelMessages.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n }}\n >\n No messages yet. Start the conversation!\n </div>\n ) : (\n // topLevelMessages.map((message) => (\n // <div\n // key={message.id}\n // onMouseEnter={() =>\n // message.type !== \"system\" && setHoveredMessageId(message.id)\n // }\n // onMouseLeave={() => setHoveredMessageId(null)}\n // style={{\n // display: \"flex\",\n // gap: \"12px\",\n // opacity: message.type === \"system\" ? 0.75 : 1,\n // padding: \"4px 0\",\n // margin: \"0 -4px\",\n // borderRadius: \"8px\",\n // }}\n // >\n // {message.type !== \"system\" ? (\n // <div\n // style={{\n // width: \"36px\",\n // height: \"36px\",\n // borderRadius: \"50%\",\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 // }}\n // >\n // {message.author.initials}\n // </div>\n // ) : (\n // <div\n // style={{\n // width: \"36px\",\n // height: \"36px\",\n // borderRadius: \"50%\",\n // background: \"rgba(30, 33, 37, 0.1)\",\n // color: \"rgba(30, 33, 37, 0.55)\",\n // display: \"flex\",\n // alignItems: \"center\",\n // justifyContent: \"center\",\n // flexShrink: 0,\n // }}\n // >\n // <Clock size={16} />\n // </div>\n // )}\n\n // <div style={{ flex: 1, minWidth: 0 }}>\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // marginBottom: \"6px\",\n // justifyContent: \"space-between\",\n // }}\n // >\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // }}\n // >\n // <span\n // style={{\n // fontSize: \"13px\",\n // fontWeight: 650,\n // color: \"rgba(30, 33, 37, 0.9)\",\n // }}\n // >\n // {message.author.name}\n // </span>\n // {message.timestamp && (\n // <span\n // style={{\n // fontSize: \"10px\",\n // fontFamily: \"var(--default-mono-font-family)\",\n // color: \"rgba(30, 33, 37, 0.5)\",\n // }}\n // >\n // {formatTimestamp(message.timestamp)}\n // </span>\n // )}\n // {message.author?.role && (\n // <span\n // style={{\n // display: \"inline-flex\",\n // alignItems: \"center\",\n // fontSize: \"10px\",\n // color: \"rgba(30, 33, 37, 0.6)\",\n // background: \"rgba(30, 33, 37, 0.08)\",\n // padding: \"3px 8px\",\n // borderRadius: \"6px\",\n // textTransform: \"uppercase\",\n // letterSpacing: \"0.04em\",\n // fontWeight: 600,\n // }}\n // >\n // {String(message.author.role)}\n // </span>\n // )}\n // </div>\n\n // {message.type !== \"system\" &&\n // hoveredMessageId === message.id && (\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"12px\",\n // flexShrink: 0,\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleReplyClick(message);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Reply\n // </button>\n // {onEditMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleEditClick(message);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Edit\n // </button>\n // )}\n // {onDeleteMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleDeleteClick(message);\n // }}\n // style={{\n // ...messageActionButtonStyle,\n // color: \"rgba(198, 99, 99, 0.9)\",\n // }}\n // >\n // Delete\n // </button>\n // )}\n // </div>\n // )}\n // </div>\n\n // {isChildEdit(message.id) ? (\n // <div style={{ marginTop: \"6px\" }}>\n // <textarea\n // value={editContent}\n // onChange={(e) => setEditContent(e.target.value)}\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }\n // }}\n // placeholder=\"Edit message...\"\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border: \"1px solid rgba(52, 58, 64, 0.2)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"8px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: \"rgba(30, 33, 37, 0.45)\",\n // background: \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: \"pointer\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={handleEditSubmit}\n // disabled={!editContent.trim()}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: editContent.trim()\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background: editContent.trim()\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: editContent.trim() ? \"pointer\" : \"not-allowed\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // Save\n // </button>\n // </div>\n // </div>\n // ) : (\n // <div\n // style={{\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // lineHeight: 1.55,\n // }}\n // >\n // {message.content}\n // </div>\n // )}\n\n // {isChildReply(message.id) && (\n // <div style={{ marginTop: \"12px\" }}>\n // <textarea\n // value={replyDraft}\n // onChange={(e) => setReplyDraft(e.target.value)}\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }\n // }}\n // placeholder=\"Type your reply...\"\n // disabled={isSending}\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border: \"1px solid rgba(52, 58, 64, 0.16)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"10px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }}\n // disabled={isSending}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: \"rgba(30, 33, 37, 0.45)\",\n // background: \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: isSending ? \"not-allowed\" : \"pointer\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={() => handleInlineReplySend(message.id)}\n // disabled={!replyDraft.trim() || isSending}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // replyDraft.trim() && !isSending\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background:\n // replyDraft.trim() && !isSending\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.12)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor:\n // replyDraft.trim() && !isSending\n // ? \"pointer\"\n // : \"not-allowed\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // {isSending ? \"Sending...\" : \"Send\"}\n // </button>\n // </div>\n // </div>\n // )}\n\n // {childrenByParentId[message.id]?.length ? (\n // <div style={{ marginTop: \"8px\" }}>\n // <button\n // type=\"button\"\n // onClick={() =>\n // setExpandedParentIds((prev) => {\n // const next = new Set(prev);\n // if (next.has(message.id)) next.delete(message.id);\n // else next.add(message.id);\n // return next;\n // })\n // }\n // style={{\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // padding: 0,\n // border: \"none\",\n // background: \"transparent\",\n // cursor: \"pointer\",\n // fontSize: \"12px\",\n // fontWeight: 500,\n // color: \"rgba(30, 33, 37, 0.55)\",\n // fontFamily: \"inherit\",\n // }}\n // >\n // <ChevronRight\n // size={14}\n // style={{\n // flexShrink: 0,\n // transition: \"transform 0.2s ease\",\n // transform: expandedParentIds.has(message.id)\n // ? \"rotate(90deg)\"\n // : \"rotate(0deg)\",\n // }}\n // />\n // <span>\n // {childrenByParentId[message.id].length}{\" \"}\n // {childrenByParentId[message.id].length === 1\n // ? \"reply\"\n // : \"replies\"}\n // </span>\n // </button>\n // {expandedParentIds.has(message.id) && (\n // <div\n // style={{\n // marginTop: \"8px\",\n // marginLeft: \"16px\",\n // paddingLeft: \"16px\",\n // borderLeft:\n // \"2px solid rgba(52, 58, 64, 0.14)\",\n // }}\n // >\n // {childrenByParentId[message.id].map((reply) => {\n // const isReplyEditing = isChildEdit(reply.id);\n // const isReplyBeingRepliedTo = isChildReply(reply.id);\n\n // return (\n // <div\n // key={reply.id}\n // onMouseEnter={() => {\n // if (reply.type !== \"system\") {\n // setHoveredMessageId(reply.id);\n // }\n // }}\n // onMouseLeave={() => setHoveredMessageId(null)}\n // style={{\n // display: \"flex\",\n // gap: \"12px\",\n // padding: \"4px 0\",\n // margin: \"0 -4px\",\n // borderRadius: \"8px\",\n // }}\n // >\n // <div\n // style={{\n // width: \"28px\",\n // height: \"28px\",\n // borderRadius: \"50%\",\n // background: reply.author.color,\n // color: \"white\",\n // display: \"flex\",\n // alignItems: \"center\",\n // justifyContent: \"center\",\n // fontSize: \"10px\",\n // fontWeight: 650,\n // flexShrink: 0,\n // }}\n // >\n // {reply.author.initials}\n // </div>\n // <div style={{ flex: 1, minWidth: 0 }}>\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // marginBottom: \"4px\",\n // justifyContent: \"space-between\",\n // }}\n // >\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // }}\n // >\n // <span\n // style={{\n // fontSize: \"13px\",\n // fontWeight: 650,\n // color: \"rgba(30, 33, 37, 0.9)\",\n // }}\n // >\n // {reply.author.name}\n // </span>\n // {reply.timestamp && (\n // <span\n // style={{\n // fontSize: \"10px\",\n // fontFamily:\n // \"var(--default-mono-font-family)\",\n // color:\n // \"rgba(30, 33, 37, 0.5)\",\n // }}\n // >\n // {formatTimestamp(\n // reply.timestamp\n // )}\n // </span>\n // )}\n // {reply.author?.role && (\n // <span\n // style={{\n // display: \"inline-flex\",\n // alignItems: \"center\",\n // gap: \"4px\",\n // fontSize: \"10px\",\n // color:\n // \"rgba(30, 33, 37, 0.6)\",\n // background:\n // \"rgba(30, 33, 37, 0.08)\",\n // padding: \"3px 8px\",\n // borderRadius: \"6px\",\n // textTransform: \"uppercase\",\n // letterSpacing: \"0.04em\",\n // fontWeight: 600,\n // }}\n // >\n // {reply.author.role}\n // </span>\n // )}\n // </div>\n\n // {reply.type !== \"system\" &&\n // hoveredMessageId === reply.id && (\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"12px\",\n // flexShrink: 0,\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleReplyClick(reply);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Reply\n // </button>\n // {onEditMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleEditClick(reply);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Edit\n // </button>\n // )}\n // {onDeleteMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleDeleteClick(reply);\n // }}\n // style={{\n // ...messageActionButtonStyle,\n // color:\n // \"rgba(198, 99, 99, 0.9)\",\n // }}\n // >\n // Delete\n // </button>\n // )}\n // </div>\n // )}\n // </div>\n\n // {isReplyEditing ? (\n // <div style={{ marginTop: \"6px\" }}>\n // <textarea\n // value={editContent}\n // onChange={(e) =>\n // setEditContent(e.target.value)\n // }\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }\n // }}\n // placeholder=\"Edit message...\"\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border:\n // \"1px solid rgba(52, 58, 64, 0.2)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"8px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // \"rgba(30, 33, 37, 0.45)\",\n // background:\n // \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: \"pointer\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={handleEditSubmit}\n // disabled={!editContent.trim()}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: editContent.trim()\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background: editContent.trim()\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: editContent.trim()\n // ? \"pointer\"\n // : \"not-allowed\",\n // }}\n // >\n // Save\n // </button>\n // </div>\n // </div>\n // ) : (\n // <div\n // style={{\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // lineHeight: 1.55,\n // }}\n // >\n // {reply.content}\n // </div>\n // )}\n\n // {isReplyBeingRepliedTo && (\n // <div style={{ marginTop: \"12px\" }}>\n // <textarea\n // value={replyDraft}\n // onChange={(e) =>\n // setReplyDraft(e.target.value)\n // }\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }\n // }}\n // placeholder=\"Type your reply...\"\n // disabled={isSending}\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border:\n // \"1px solid rgba(52, 58, 64, 0.16)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"10px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }}\n // disabled={isSending}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // \"rgba(30, 33, 37, 0.45)\",\n // background:\n // \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: isSending\n // ? \"not-allowed\"\n // : \"pointer\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={() =>\n // handleInlineReplySend(reply.id)\n // }\n // disabled={\n // !replyDraft.trim() || isSending\n // }\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // replyDraft.trim() && !isSending\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background:\n // replyDraft.trim() && !isSending\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.12)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor:\n // replyDraft.trim() && !isSending\n // ? \"pointer\"\n // : \"not-allowed\",\n // }}\n // >\n // {isSending ? \"Sending...\" : \"Send\"}\n // </button>\n // </div>\n // </div>\n // )}\n // </div>\n // </div>\n // );\n // })}\n // </div>\n // )}\n // </div>\n // ) : null}\n // </div>\n // </div>\n // ))\n topLevelMessages.map((message) => renderMessageTree(message, 0))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input area */}\n <div\n style={{\n padding: \"12px\",\n borderTop: \"1px solid rgba(52, 58, 64, 0.12)\",\n background: \"rgba(255, 255, 255, 0.95)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-end\",\n }}\n >\n <div\n style={{\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\n background: displayCurrentUser.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n }}\n >\n {displayCurrentUser.initials}\n </div>\n\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n }}\n >\n <textarea\n ref={messageInputRef}\n value={messageInput}\n onChange={(e) => setMessageInput(e.target.value)}\n onKeyDown={handleKeyPress}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={\n replyingToMessage ? \"Type your reply...\" : \"Add a comment...\"\n }\n style={{\n width: \"100%\",\n minHeight: \"38px\",\n maxHeight: \"120px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.85)\",\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: \"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 <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!messageInput.trim() || isSending}\n style={{\n padding: \"8px 16px\",\n background:\n messageInput.trim() && !isSending\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n color:\n messageInput.trim() && !isSending\n ? \"white\"\n : \"rgba(30, 33, 37, 0.45)\",\n fontSize: \"12px\",\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 >\n {isSending ? (\n <>\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: \"spin 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 </div>\n );\n}\n\n","\"use client\";\n\nimport React, { useState, useEffect, useLayoutEffect, useRef, useMemo } from 'react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport { Tabs } from '../../index.js';\nimport CoachingSynthesisCard from './CoachingSynthesisCard.jsx';\nimport InteractionContext from './InteractionContext.jsx';\nimport InteractionScores from './InteractionScores.jsx';\nimport AgentLiftCard from '../../common/AgentLiftCard.jsx';\nimport InteractionSignals from './InteractionSignals.jsx';\nimport InteractionGuidance from './InteractionGuidance.jsx';\nimport InteractionNBA from './InteractionNBA.jsx';\nimport InteractionRecording from './InteractionRecording.jsx';\nimport InteractionTranscript from './InteractionTranscript.jsx';\nimport MessageThread from '../../common/MessageThread.jsx';\n\nfunction findBlock(blocks, id) {\n return blocks.find((b) => b.block_id === id);\n}\n\nfunction InteractionDetailPanel({\n data,\n audioUrl,\n coachingData,\n messageThread,\n coachingLoading,\n coachingError,\n // Optional callbacks for host apps to wire MessageThread to real APIs.\n onThreadSendMessage,\n onThreadEditMessage,\n onThreadDeleteMessage,\n onThreadCreateNewThread,\n onThreadSelect,\n threadLoading,\n threadCurrentUser,\n}) {\n const blocks = data.blocks || [];\n const evidenceIndex = data.evidence_index || {};\n const audioRef = useRef(null);\n const segmentEndHandlerRef = useRef(null);\n const [highlightedTurns, setHighlightedTurns] = useState(new Set());\n const [expandedSignals, setExpandedSignals] = useState(new Set());\n\n // Timeline state for audio playback integration\n const [currentTimeSeconds, setCurrentTimeSeconds] = useState(0);\n const [timelinePlaying, setTimelinePlaying] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n\n // Extract block data\n const meta = findBlock(blocks, 'interaction-metadata')?.payload || {};\n const ctx = findBlock(blocks, 'interaction-context')?.payload || {};\n const summary = findBlock(blocks, 'interaction-summary')?.payload || {};\n const scores = findBlock(blocks, 'interaction-scores')?.payload || {};\n const signals = findBlock(blocks, 'interaction-signals')?.payload || {};\n const guidance = findBlock(blocks, 'interaction-guidance')?.payload || {};\n const transcript = findBlock(blocks, 'interaction-transcript')?.payload || {};\n // const messageThread = findBlock(blocks, 'interaction-message-thread')?.payload || {};\n const nba = findBlock(blocks, 'interaction-nba')?.payload || {};\n const dimensionsBlock = findBlock(blocks, 'interaction-dimensions')?.payload || {};\n const dimensions = (dimensionsBlock.dimensions || []).filter(d => d.value);\n const outcomeLift = findBlock(blocks, 'interaction-outcome-lift')?.payload || {};\n\n // Build turn → observation pills map from signals data\n const turnObservations = useMemo(() => {\n const map = {}; // turnIndex → [{label, reason, color, signalKey}]\n const GROUP_LABELS = {\n outcome: { color: 'var(--rail-outcome)' },\n process: { color: 'var(--rail-discovery)' },\n compliance: { color: 'var(--rail-compliance)' },\n customer_friction: { color: 'var(--rail-coral)' },\n experience: { color: 'var(--rail-teal)' },\n };\n\n for (const signal of (signals.signals || [])) {\n const groupInfo = GROUP_LABELS[signal.group] || {};\n for (const obs of (signal.observations || [])) {\n for (const ev of (obs.evidence || [])) {\n if (ev.turn_ids?.length) {\n for (const tid of ev.turn_ids) {\n if (!map[tid]) map[tid] = [];\n // Deduplicate by observation key per turn\n if (!map[tid].some(o => o.label === (obs.key || signal.display_name || signal.key))) {\n map[tid].push({\n label: obs.key || signal.display_name || signal.key,\n reason: obs.reason || obs.explanation || '',\n color: groupInfo.color || 'var(--state-present)',\n signalKey: signal.key,\n });\n }\n }\n }\n }\n }\n }\n return map;\n }, [signals.signals]);\n\n // Build timeline segments from transcript messages\n const timelineSegments = transcript.messages?.map((m, i) => {\n const startTime = (m.start ?? m.start_ms) ? (m.start ?? m.start_ms) / 1000 : 0;\n const endTime = (m.end ?? m.end_ms) ? (m.end ?? m.end_ms) / 1000 : startTime + 1;\n const isAgent = m.actor === 'agent';\n const actorName = isAgent ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer');\n\n return {\n startTime,\n endTime,\n actor: actorName,\n actorColor: isAgent ? 'var(--rail-outcome)' : 'var(--rail-discovery)',\n };\n }) || [];\n\n // Compute active turn index based on current playback time\n const activeTurnIndex = useMemo(() => {\n if (!timelinePlaying && currentTimeSeconds === 0) return -1;\n const messages = transcript.messages || [];\n const currentMs = currentTimeSeconds * 1000;\n for (let i = messages.length - 1; i >= 0; i--) {\n const startMs = messages[i].start ?? messages[i].start_ms;\n if (startMs != null && currentMs >= startMs) return i;\n }\n return -1;\n }, [currentTimeSeconds, timelinePlaying, transcript.messages]);\n\n // Timeline event handlers\n const handleTimelineSeek = (seconds) => {\n if (audioRef.current) {\n audioRef.current.currentTime = seconds;\n setCurrentTimeSeconds(seconds);\n }\n };\n\n const handleTimelineTogglePlay = () => {\n if (audioRef.current) {\n if (timelinePlaying) {\n audioRef.current.pause();\n setTimelinePlaying(false);\n } else {\n const p = audioRef.current.play();\n if (p !== undefined) p.catch(() => { }); // ignore AbortError when pause() interrupts play()\n setTimelinePlaying(true);\n }\n }\n };\n\n const handleTimelineSeekBack = () => {\n if (audioRef.current) {\n audioRef.current.currentTime = Math.max(0, audioRef.current.currentTime - 15);\n }\n };\n\n const handleTimelineSeekForward = () => {\n if (audioRef.current) {\n const duration = meta.duration_seconds || audioRef.current.duration || 0;\n audioRef.current.currentTime = Math.min(duration, audioRef.current.currentTime + 15);\n }\n };\n\n const handleSetPlaybackRate = (rate) => {\n if (audioRef.current) {\n audioRef.current.playbackRate = rate;\n setPlaybackRate(rate);\n }\n };\n\n // Update currentTimeSeconds from audio element\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const updateTime = () => setCurrentTimeSeconds(audio.currentTime);\n const handlePlay = () => setTimelinePlaying(true);\n const handlePause = () => setTimelinePlaying(false);\n const handleEnded = () => setTimelinePlaying(false);\n\n audio.addEventListener('timeupdate', updateTime);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n audio.addEventListener('ended', handleEnded);\n\n return () => {\n audio.removeEventListener('timeupdate', updateTime);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.removeEventListener('ended', handleEnded);\n };\n }, [audioUrl]);\n\n const playAudio = (startMs, endMs) => {\n const player = audioRef.current;\n if (!player || startMs == null) return;\n\n const startSec = startMs / 1000;\n player.currentTime = startSec;\n setCurrentTimeSeconds(startSec);\n\n const p = player.play();\n if (p !== undefined) p.catch(() => { }); // ignore AbortError when pause() interrupts play()\n\n // Clear any previous segment end handler so only one is active\n if (segmentEndHandlerRef.current) {\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\n segmentEndHandlerRef.current = null;\n }\n\n if (endMs != null) {\n const endSec = endMs / 1000;\n const handler = () => {\n if (player.currentTime >= endSec) {\n player.pause();\n if (segmentEndHandlerRef.current) {\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\n segmentEndHandlerRef.current = null;\n }\n }\n };\n segmentEndHandlerRef.current = handler;\n player.addEventListener('timeupdate', handler);\n }\n };\n\n // Used by Signals evidence rows: toggle play/pause for a specific segment\n // and scroll the transcript container into view for the related turns.\n const handleEvidencePlayToggle = (startMs, endMs, turnIds) => {\n const player = audioRef.current;\n if (!player || startMs == null) return;\n\n const startSec = startMs / 1000;\n const endSec = endMs != null ? endMs / 1000 : startSec + 1;\n const currentSec = player.currentTime;\n\n const isInSegment =\n timelinePlaying &&\n currentSec >= startSec &&\n (endSec == null || currentSec <= endSec + 0.25);\n\n // If already playing this segment, pause instead of restarting\n if (isInSegment) {\n player.pause();\n return;\n }\n\n // Otherwise, play the requested segment and redirect to transcript\n playAudio(startMs, endMs);\n if (turnIds?.length) {\n highlightTurns(turnIds);\n }\n };\n\n const handleTranscriptTurnPlayPause = (turn, index) => {\n const messages = transcript.messages || [];\n const message = messages[index];\n const player = audioRef.current;\n\n if (!message || !player) return;\n\n const startMs = message.start ?? message.start_ms;\n const endMs = message.end ?? message.end_ms;\n\n // If this turn is already active and playing, pause playback\n if (timelinePlaying && activeTurnIndex === index) {\n player.pause();\n return;\n }\n\n if (startMs == null) return;\n playAudio(startMs, endMs);\n };\n\n const highlightTurns = (turnIds) => {\n setHighlightedTurns(new Set(turnIds));\n // TranscriptCard handles highlight styling via isHighlighted prop\n // Always scroll transcript container into view so highlights are visible\n const container = document.getElementById('transcript-container');\n if (container) {\n container.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n setTimeout(() => setHighlightedTurns(new Set()), 5000);\n };\n\n const toggleSignal = (key) => {\n setExpandedSignals(prev => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key); else next.add(key);\n return next;\n });\n };\n\n const title = ctx.call_purpose?.interaction_driver || summary.one_liner || 'Interaction Detail';\n\n const [rightTab, setRightTab] = useState('signals'); // 'signals' | 'guidance'\n const leftSummaryRef = useRef(null);\n const [rightRailHeight, setRightRailHeight] = useState(null);\n\n // After coaching summary data has loaded and layout has settled,\n // sync right rail height to match ONLY the summary block\n // (InteractionContext + AgentLiftCard + CoachingSummary), not extra padding.\n useLayoutEffect(() => {\n if (coachingLoading) return;\n if (!leftSummaryRef.current) return;\n\n const measure = () => {\n const h = leftSummaryRef.current?.offsetHeight || 0;\n if (h > 0) setRightRailHeight(h);\n };\n\n // Measure immediately and once more on the next frame to catch late layout.\n measure();\n const id = window.requestAnimationFrame(measure);\n return () => window.cancelAnimationFrame(id);\n }, [coachingLoading, coachingData, meta, ctx]);\n\n // MessageThread callbacks.\n // - For gallery: default to console logging\n // - For host apps: pass real handlers via props so APIs are called.\n const handleThreadSend = async (payload) => {\n // payload: { content, parent_message_id }\n if (onThreadSendMessage) {\n await onThreadSendMessage(payload);\n return;\n }\n };\n\n const handleThreadEdit = async (payload) => {\n if (onThreadEditMessage) {\n return onThreadEditMessage(payload);\n }\n };\n\n const handleThreadDelete = async (message) => {\n if (onThreadDeleteMessage) {\n await onThreadDeleteMessage(message);\n return;\n }\n };\n\n const handleCreateNewThread = async (titleText) => {\n if (onThreadCreateNewThread) {\n await onThreadCreateNewThread(titleText);\n return;\n }\n };\n\n // Pass through the host's messageThread as-is. No fallback sample — host apps\n // (e.g. Feedback module) must pass real thread data or leave undefined to show\n // MessageThread's empty state (\"No messages yet\"). Gallery/demos can pass\n // sample data explicitly via the messageThread prop.\n const effectiveMessageThread =\n messageThread && Object.keys(messageThread).length > 0\n ? messageThread\n : undefined;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: '10px',\n flexWrap: 'wrap',\n }}\n >\n {/* Left rail: context → coaching summary */}\n <div ref={leftSummaryRef}\n style={{\n flex: '1 1 420px',\n minWidth: 320,\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n }}>\n {/* Context — metadata + call purpose + dimensions */}\n <InteractionContext\n title={title}\n meta={meta}\n callPurpose={ctx.call_purpose}\n classification={ctx.classification}\n dimensions={dimensions}\n />\n\n {/* Scores */}\n {/* <InteractionScores scores={scores.scores} /> */}\n\n {/* Agent Lift Analysis */}\n <AgentLiftCard outcomeLift={outcomeLift} />\n\n {/* Coaching Synthesis — only show if loading or has data */}\n {(coachingLoading || coachingData || coachingError) && (\n <DetailCard title=\"Coaching Summary\">\n <CoachingSynthesisCard\n data={coachingData}\n loading={coachingLoading}\n error={coachingError}\n />\n </DetailCard>\n )}\n </div>\n\n {/* Right rail: tabs → InteractionSignals/InteractionGuidance → InteractionNBA */}\n <div\n style={{\n flex: '1 1 420px',\n minWidth: 320,\n display: 'flex',\n flexDirection: 'column',\n height: rightRailHeight,\n }}\n >\n {/* Tabs: Signals / Guidance */}\n <Tabs\n tabs={[\n { key: 'signals', label: 'Signals' },\n { key: 'guidance', label: 'Guidance' },\n ]}\n active={rightTab}\n onSelect={setRightTab}\n size=\"compact\"\n borderTopRightRadius={12}\n borderTopLeftRadius={12}\n />\n\n <div\n className=\"custom-thin-scrollbar-library\"\n style={{\n flex: 1,\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n }}\n >\n {rightTab === 'signals' ? (\n <InteractionSignals\n signals={signals}\n expandedSignals={expandedSignals}\n toggleSignal={toggleSignal}\n playEvidence={handleEvidencePlayToggle}\n timelinePlaying={timelinePlaying}\n currentTimeSeconds={currentTimeSeconds}\n highlightTurns={highlightTurns}\n borderRadius={'0px 0px 12px 12px'}\n />\n ) : (\n <InteractionGuidance\n guidance={guidance}\n playEvidence={handleEvidencePlayToggle}\n timelinePlaying={timelinePlaying}\n currentTimeSeconds={currentTimeSeconds}\n highlightTurns={highlightTurns}\n borderRadius={'0px 0px 12px 12px'}\n />\n )}\n\n {/* NBA always visible below tabs */}\n <InteractionNBA nba={nba} />\n </div>\n </div>\n </div>\n {/* Recording / Timeline */}\n <InteractionRecording\n audioUrl={audioUrl}\n timelineSegments={timelineSegments}\n durationSeconds={meta.duration_seconds}\n currentTimeSeconds={currentTimeSeconds}\n timelinePlaying={timelinePlaying}\n playbackRate={playbackRate}\n onSeek={handleTimelineSeek}\n onTogglePlay={handleTimelineTogglePlay}\n onSeekBack={handleTimelineSeekBack}\n onSeekForward={handleTimelineSeekForward}\n onSetPlaybackRate={handleSetPlaybackRate}\n audioRef={audioRef}\n />\n\n {/* Transcript */}\n <InteractionTranscript\n transcript={transcript}\n audioUrl={audioUrl}\n highlightedTurns={highlightedTurns}\n activeTurnIndex={activeTurnIndex}\n timelinePlaying={timelinePlaying}\n turnObservations={turnObservations}\n setExpandedSignals={setExpandedSignals}\n onTurnPlayPause={handleTranscriptTurnPlayPause}\n />\n\n {/* Message Thread — uses common design-system component.\n For gallery/testing, falls back to a sample payload that matches\n the real backend response shape. */}\n <MessageThread\n sessionTitle={title}\n messageThread={effectiveMessageThread}\n currentUser={threadCurrentUser}\n isLoading={threadLoading}\n onSendMessage={handleThreadSend}\n onEditMessage={handleThreadEdit}\n onDeleteMessage={handleThreadDelete}\n onCreateNewThread={handleCreateNewThread}\n onThreadSelect={onThreadSelect}\n />\n </div>\n );\n}\n\nclass ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n componentDidCatch(error, info) {\n console.error('InteractionDetailPanel render error:', error, info?.componentStack);\n }\n render() {\n return this.state.hasError ? this.props.fallback : this.props.children;\n }\n}\n\nexport default function InteractionDetailPanelWrapper(props) {\n return (\n <ErrorBoundary fallback={\n <div style={{ padding: 16, color: 'var(--state-unknown)', fontSize: 12 }}>\n Error rendering detail.\n </div>\n }>\n <InteractionDetailPanel {...props} />\n </ErrorBoundary>\n );\n}","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\n\n/**\n * ExpandPatternComparison Component\n * Demonstrates three different expand/collapse patterns for signal cards.\n */\nexport default function ExpandPatternComparison({ pattern }) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const sampleSignal = {\n name: \"Customer Escalation Likelihood\",\n description:\n \"Based on observed patterns, this session shows indicators consistent with potential escalation.\",\n technicalKey: \"signal.escalation_likelihood\",\n probability: 0.68,\n confidence: 0.81,\n observations: 3,\n };\n\n if (pattern === \"text-link\") {\n return (\n <div\n style={{\n position: \"relative\",\n background: \"rgba(255, 255, 255, 0.82)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\n }}\n >\n {/* Left rail */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: \"5px\",\n background: \"#6B7C93\",\n opacity: 0.6,\n }}\n />\n\n {/* Content - not clickable */}\n <div\n style={{\n padding: \"14px 16px 14px 21px\",\n }}\n >\n <div style={{ marginBottom: \"4px\" }}>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 680,\n color: \"rgba(30, 33, 37, 0.92)\",\n lineHeight: 1.2,\n }}\n >\n {sampleSignal.name}\n </span>\n </div>\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.65)\",\n lineHeight: 1.4,\n marginBottom: \"6px\",\n }}\n >\n {sampleSignal.description}\n </div>\n <div\n style={{\n fontSize: \"11px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n fontFamily: \"ui-monospace, monospace\",\n marginBottom: \"8px\",\n }}\n >\n {sampleSignal.technicalKey}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n fontSize: \"11.5px\",\n marginBottom: \"10px\",\n }}\n >\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\n {sampleSignal.probability.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\n {sampleSignal.confidence.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\n {sampleSignal.observations} observations\n </span>\n </div>\n\n {/* Text link to expand */}\n {!isExpanded && (\n <button\n onClick={() => setIsExpanded(true)}\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.56)\",\n background: \"none\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.4)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.2)\";\n }}\n >\n View contributing observations\n </button>\n )}\n </div>\n\n {/* Expanded content */}\n {isExpanded && (\n <div\n style={{\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\n background: \"rgba(244, 241, 230, 0.25)\",\n padding: \"16px 16px 16px 21px\",\n }}\n >\n <div\n style={{\n fontSize: \"10px\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(30, 33, 37, 0.52)\",\n marginBottom: \"8px\",\n }}\n >\n Contributing Observations\n </div>\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\n [Observations would appear here]\n </div>\n <button\n onClick={() => setIsExpanded(false)}\n style={{\n marginTop: \"10px\",\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.56)\",\n background: \"none\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.4)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.2)\";\n }}\n >\n Hide observations\n </button>\n </div>\n )}\n </div>\n );\n }\n\n if (pattern === \"rotating-chevron\") {\n return (\n <div\n style={{\n position: \"relative\",\n background: \"rgba(255, 255, 255, 0.82)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\n }}\n >\n {/* Left rail */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: \"5px\",\n background: \"#6B7C93\",\n opacity: 0.6,\n }}\n />\n\n {/* Header - Clickable */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n width: \"100%\",\n padding: \"14px 16px 14px 21px\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: \"12px\" }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ marginBottom: \"4px\" }}>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 680,\n color: \"rgba(30, 33, 37, 0.92)\",\n lineHeight: 1.2,\n }}\n >\n {sampleSignal.name}\n </span>\n </div>\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.65)\",\n lineHeight: 1.4,\n marginBottom: \"6px\",\n }}\n >\n {sampleSignal.description}\n </div>\n <div\n style={{\n fontSize: \"11px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n fontFamily: \"ui-monospace, monospace\",\n marginBottom: \"8px\",\n }}\n >\n {sampleSignal.technicalKey}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n fontSize: \"11.5px\",\n }}\n >\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\n {sampleSignal.probability.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\n {sampleSignal.confidence.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\n {sampleSignal.observations} observations\n </span>\n </div>\n </div>\n\n {/* Rotating chevron on right */}\n <div\n style={{\n paddingTop: \"2px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n flexShrink: 0,\n transition: \"transform 0.2s ease\",\n }}\n >\n <ChevronDown\n size={18}\n style={{\n transform: isExpanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </div>\n </div>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div\n style={{\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\n background: \"rgba(244, 241, 230, 0.25)\",\n padding: \"16px 16px 16px 21px\",\n }}\n >\n <div\n style={{\n fontSize: \"10px\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(30, 33, 37, 0.52)\",\n marginBottom: \"8px\",\n }}\n >\n Contributing Observations\n </div>\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\n [Observations would appear here]\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // directional-chevron (current SignalCard pattern)\n return (\n <div\n style={{\n position: \"relative\",\n background: \"rgba(255, 255, 255, 0.82)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\n }}\n >\n {/* Left rail */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: \"5px\",\n background: \"#6B7C93\",\n opacity: 0.6,\n }}\n />\n\n {/* Header - Clickable */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n width: \"100%\",\n padding: \"14px 16px 14px 21px\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"12px\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n {/* Directional chevron on left */}\n <div\n style={{\n paddingTop: \"2px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n flexShrink: 0,\n }}\n >\n {isExpanded ? (\n <ChevronDown size={16} />\n ) : (\n <ChevronRight size={16} />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ marginBottom: \"4px\" }}>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 680,\n color: \"rgba(30, 33, 37, 0.92)\",\n lineHeight: 1.2,\n }}\n >\n {sampleSignal.name}\n </span>\n </div>\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.65)\",\n lineHeight: 1.4,\n marginBottom: \"6px\",\n }}\n >\n {sampleSignal.description}\n </div>\n <div\n style={{\n fontSize: \"11px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n fontFamily: \"ui-monospace, monospace\",\n marginBottom: \"8px\",\n }}\n >\n {sampleSignal.technicalKey}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n fontSize: \"11.5px\",\n }}\n >\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\n {sampleSignal.probability.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\n {sampleSignal.confidence.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\n {sampleSignal.observations} observations\n </span>\n </div>\n </div>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div\n style={{\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\n background: \"rgba(244, 241, 230, 0.25)\",\n padding: \"16px 16px 16px 21px\",\n }}\n >\n <div\n style={{\n fontSize: \"10px\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(30, 33, 37, 0.52)\",\n marginBottom: \"8px\",\n }}\n >\n Contributing Observations\n </div>\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\n [Observations would appear here]\n </div>\n </div>\n )}\n </div>\n );\n}\n\n"],"names":["STYLE_ID","ensureKeyframes","style","CoachingSynthesisCard","data","loading","error","React","jsxs","jsx","w","i","strengths","improvements","organizational","oneLiner","_a","context","_b","CoachingSection","TrendingUp","Lightbulb","Building","icon","label","color","items","item","text","quote","MessageSquareQuote","fmtDur","seconds","m","s","InteractionContext","title","meta","callPurpose","classification","dimensions","cp","cls","CardBase","dim","InteractionScores","scores","DetailCard","val","GROUP_LABELS","Target","FileText","Scale","Zap","MessageSquare","KIND_COLORS","CheckCircle","InteractionSignals","signals","expandedSignals","toggleSignal","playEvidence","timelinePlaying","currentTimeSeconds","highlightTurns","borderRadius","grouped","useMemo","result","g","groupKey","groupSignals","info","SectionLabel","name","delta","hasObs","isExpanded","e","ChevronDown","obs","oi","ev","ei","startMs","endMs","isPlayingSegment","startSec","endSec","cs","EvidenceItem","InteractionGuidance","guidance","ki","ownerBadge","sr","si","CornerDownRight","sMs","eMs","InteractionNBA","nba","r","InteractionRecording","audioUrl","timelineSegments","durationSeconds","playbackRate","onSeek","onTogglePlay","onSeekBack","onSeekForward","onSetPlaybackRate","audioRef","Timeline","InteractionTranscript","transcript","highlightedTurns","activeTurnIndex","turnObservations","setExpandedSignals","onTurnPlayPause","formatTimeRange","formatTime","ms","minutes","start","end","turns","prev","el","TranscriptCard","messageActionButtonStyle","roleColorMap","role","normalized","extractMessagesArray","node","directCandidates","candidate","flattenMessages","rawMessages","parentId","startIndex","out","index","author","authorName","initials","n","roleColor","id","baseMessage","formatTimestamp","value","d","now","sameDay","yesterday","isYesterday","timeStr","diffDays","MessageThread","sessionTitle","sessionSubtitle","threadLabel","initialMessages","messageThread","onSendMessage","onReplyMessage","onEditMessage","onDeleteMessage","onCreateNewThread","onThreadSelect","currentUser","isLoading","messageInput","setMessageInput","useState","isFocused","setIsFocused","messages","setMessages","isSending","setIsSending","hoveredMessageId","setHoveredMessageId","threads","setThreads","activeThreadId","setActiveThreadId","replyingToMessageId","setReplyingToMessageId","replyDraft","setReplyDraft","editingMessageId","setEditingMessageId","editContent","setEditContent","deleteConfirmMessage","setDeleteConfirmMessage","showNewThreadCompose","setShowNewThreadCompose","newThreadInput","setNewThreadInput","isCreatingNewThread","setIsCreatingNewThread","expandedParentIds","setExpandedParentIds","messagesEndRef","useRef","messageInputRef","normalizedRole","displayCurrentUser","canCreateNewThread","childrenByParentId","map","topLevelMessages","isChildReply","isChildEdit","hasHeader","replyingToMessage","useEffect","rawThreads","normalizedThreads","t","rawMessagesForThread","messagesForThread","firstWithMessages","flatMessages","rawFlat","mappedMessages","singleId","singleLabel","thread","container","handleNewThreadSubmit","trimmed","newId","handleNewThreadCancel","handleSend","content","optimisticId","optimisticMessage","msg","handleKeyPress","handleReplyClick","message","handleInlineReplySend","parentMessageId","optimisticReply","handleEditClick","handleEditSubmit","err","handleEditCancel","handleDeleteClick","handleDeleteConfirm","renderMessageTree","depth","children","hasChildren","isEditing","isReplying","Clock","next","ChevronRight","child","isActive","Fragment","Send","findBlock","blocks","b","InteractionDetailPanel","coachingData","coachingLoading","coachingError","onThreadSendMessage","onThreadEditMessage","onThreadDeleteMessage","onThreadCreateNewThread","threadLoading","threadCurrentUser","segmentEndHandlerRef","setHighlightedTurns","setCurrentTimeSeconds","setTimelinePlaying","setPlaybackRate","ctx","summary","_c","_d","_e","_f","_g","_h","_i","outcomeLift","_j","signal","groupInfo","tid","o","_k","startTime","endTime","isAgent","actorName","currentMs","handleTimelineSeek","handleTimelineTogglePlay","p","handleTimelineSeekBack","handleTimelineSeekForward","duration","handleSetPlaybackRate","rate","audio","updateTime","handlePlay","handlePause","handleEnded","playAudio","player","handler","handleEvidencePlayToggle","turnIds","currentSec","handleTranscriptTurnPlayPause","turn","key","_l","rightTab","setRightTab","leftSummaryRef","rightRailHeight","setRightRailHeight","useLayoutEffect","measure","h","handleThreadSend","payload","handleThreadEdit","handleThreadDelete","handleCreateNewThread","titleText","effectiveMessageThread","AgentLiftCard","Tabs","ErrorBoundary","props","InteractionDetailPanelWrapper","ExpandPatternComparison","pattern","setIsExpanded","sampleSignal"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBA6wBAgN,GAAiB,IAAI,CAAC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"}
|
|
1
|
+
{"version":3,"file":"interactionDetails.es.js","sources":["../../src/components/pages/interactionDetails/CoachingSynthesisCard.jsx","../../src/components/pages/interactionDetails/InteractionContext.jsx","../../src/components/pages/interactionDetails/InteractionScores.jsx","../../src/components/pages/interactionDetails/InteractionSignals.jsx","../../src/components/pages/interactionDetails/InteractionGuidance.jsx","../../src/components/pages/interactionDetails/InteractionNBA.jsx","../../src/components/pages/interactionDetails/InteractionRecording.jsx","../../src/components/pages/interactionDetails/InteractionTranscript.jsx","../../src/components/common/MessageThread.jsx","../../src/components/pages/interactionDetails/InteractionDetailPanel.jsx","../../src/components/pages/interactionDetails/ExpandPatternComparison.jsx"],"sourcesContent":["\"use client\";\n\nimport React from \"react\";\nimport { TrendingUp, Lightbulb, Building, MessageSquareQuote } from \"lucide-react\";\n\n/**\n * CoachingSynthesisCard — displays LLM-generated coaching synthesis from Compass.\n *\n * Props:\n * - data object Coaching synthesis response (see shape below)\n * - loading boolean Show shimmer loading state\n * - error string Error message to display\n *\n * Data shape (from compass/summaries/coaching.py):\n * - one_liner string One-sentence summary\n * - context string Situational factors\n * - strengths Array<{ text: string, quote?: string }>\n * - improvements Array<{ text: string, quote?: string }>\n * - organizational Array<{ text: string, quote?: string }> (alias: organizational_insights)\n * - overall string \"effective\" | \"strong\" | \"needs_improvement\" | \"mixed\"\n */\n\nconst STYLE_ID = \"coaching-synthesis-keyframes\";\n\nfunction ensureKeyframes() {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement(\"style\");\n style.id = STYLE_ID;\n style.textContent = `\n @keyframes coaching-shimmer {\n 0% { background-position: -200% 0; }\n 100% { background-position: 200% 0; }\n }\n @keyframes coaching-pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1; }\n }\n `;\n document.head.appendChild(style);\n}\n\nexport default function CoachingSynthesisCard({ data, loading, error }) {\n React.useEffect(() => { ensureKeyframes(); }, []);\n\n // Loading state\n if (loading) {\n return (\n <div style={{\n padding: \"20px 0\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 12,\n }}>\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 8,\n }}>\n <div style={{\n width: 6,\n height: 6,\n borderRadius: \"50%\",\n background: \"var(--rail-tone)\",\n animation: \"coaching-pulse 1.5s ease-in-out infinite\",\n }} />\n <span style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--rail-tone)\",\n fontFamily: \"var(--font-sans)\",\n fontWeight: 500,\n }}>\n Compass is synthesizing coaching insights…\n </span>\n </div>\n {/* Shimmer lines */}\n {[180, 260, 220].map((w, i) => (\n <div\n key={i}\n style={{\n height: 10,\n width: w,\n maxWidth: \"100%\",\n borderRadius: 4,\n background: \"linear-gradient(90deg, var(--hover-warm-subtle) 25%, var(--hover-warm) 50%, var(--hover-warm-subtle) 75%)\",\n backgroundSize: \"200% 100%\",\n animation: `coaching-shimmer 1.8s ease-in-out infinite`,\n animationDelay: `${i * 0.2}s`,\n }}\n />\n ))}\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div style={{\n padding: \"16px 0\",\n fontSize: \"var(--text-base)\",\n color: \"var(--text-faint)\",\n fontFamily: \"var(--font-sans)\",\n }}>\n Unable to generate coaching summary.\n </div>\n );\n }\n\n // No data\n if (!data) return null;\n\n const strengths = data.strengths || [];\n const improvements = data.improvements || [];\n const organizational = data.organizational || data.organizational_insights || [];\n const oneLiner = typeof data.one_liner === \"string\" ? data.one_liner : data.one_liner?.text || \"\";\n const context = typeof data.context === \"string\" ? data.context : data.context?.text || \"\";\n\n return (\n <div style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: 14,\n fontFamily: \"var(--font-sans)\",\n }}>\n {/* One-liner */}\n {oneLiner && (\n <div style={{\n fontSize: \"var(--text-lg)\",\n fontWeight: 600,\n color: \"var(--text-strong)\",\n lineHeight: 1.4,\n }}>\n {oneLiner}\n </div>\n )}\n\n {/* Context */}\n {context && (\n <div style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-muted)\",\n lineHeight: 1.45,\n }}>\n {context}\n </div>\n )}\n\n {/* Strengths */}\n {strengths.length > 0 && (\n <CoachingSection\n icon={<TrendingUp size={13} />}\n label=\"Strengths\"\n color=\"var(--rail-discovery)\"\n items={strengths}\n />\n )}\n\n {/* Improvements */}\n {improvements.length > 0 && (\n <CoachingSection\n icon={<Lightbulb size={13} />}\n label=\"Improvements\"\n color=\"var(--rail-compliance)\"\n items={improvements}\n />\n )}\n\n {/* Organizational */}\n {organizational.length > 0 && (\n <CoachingSection\n icon={<Building size={13} />}\n label=\"Organizational\"\n color=\"var(--rail-outcome)\"\n items={organizational}\n />\n )}\n\n {/* Overall rating */}\n {data.overall && (\n <div style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-faint)\",\n fontStyle: \"italic\",\n marginTop: 2,\n }}>\n Overall: {data.overall.replace(/_/g, \" \")}\n </div>\n )}\n </div>\n );\n}\n\nfunction CoachingSection({ icon, label, color, items }) {\n return (\n <div>\n {/* Section header */}\n <div style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 5,\n marginBottom: 6,\n color,\n fontSize: \"var(--text-base)\",\n fontWeight: 650,\n letterSpacing: \"0.04em\",\n }}>\n {icon}\n {label}\n </div>\n\n {/* Items */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\n {items.map((item, i) => {\n const text = typeof item === \"string\" ? item : item?.text || \"\";\n const quote = typeof item === \"object\" ? item?.quote : null;\n\n return (\n <div key={i} style={{ paddingLeft: 14 }}>\n <div style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-base)\",\n lineHeight: 1.4,\n }}>\n • {text}\n </div>\n {quote && (\n <div style={{\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: 4,\n marginTop: 3,\n paddingLeft: 8,\n }}>\n <MessageSquareQuote\n size={10}\n style={{\n color: \"var(--text-faint)\",\n flexShrink: 0,\n marginTop: 2,\n }}\n />\n <span style={{\n fontSize: \"var(--text-base)\",\n color: \"var(--text-muted)\",\n fontStyle: \"italic\",\n lineHeight: 1.35,\n }}>\n \"{quote}\"\n </span>\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import React from 'react';\nimport CardBase from '../../primitives/Card.jsx';\n\nfunction fmtDur(seconds) {\n const m = Math.floor(seconds / 60);\n const s = Math.round(seconds % 60);\n return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nexport default function InteractionContext({ title, meta, callPurpose, classification, dimensions }) {\n const cp = callPurpose || {};\n const cls = classification || {};\n\n return (\n <CardBase variant=\"elevated\" padding=\"sm\">\n <div style={{ fontSize: 'var(--text-md)', fontWeight: 550, color: 'var(--text-strong)', lineHeight: 1.375, marginBottom: 6 }}>\n {title}\n </div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: '4px 12px', fontSize: 11, color: 'var(--text-muted)' }}>\n {meta.evaluated_dt && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Date</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{new Date(meta.evaluated_dt).toLocaleString()}</div></div>}\n {meta.duration_seconds != null && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Duration</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{fmtDur(meta.duration_seconds)}</div></div>}\n {meta.message_count && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Messages</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{meta.message_count}</div></div>}\n {cp.interaction_direction && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Direction</span><div style={{ color: 'var(--text-base)' }}>{cp.interaction_direction}</div></div>}\n {cp.interaction_driver && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Driver</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{cp.interaction_driver}</div></div>}\n {cp.customer_intent && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Intent</span><div style={{ color: 'var(--text-base)' }}>{cp.customer_intent}</div></div>}\n {cls.interaction_paradigm && <div><span style={{ fontSize: 11, color: 'var(--text-faint)' }}>Paradigm</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{cls.interaction_paradigm}</div></div>}\n {dimensions.map((dim, i) => (\n <div key={i}><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>{dim.label || dim.key}</span><div style={{ fontSize: 12, color: 'var(--text-base)' }}>{dim.value}</div></div>\n ))}\n </div>\n {meta.session_id && (\n <div style={{ fontSize: 10, color: 'var(--text-faint)', fontFamily: 'var(--font-mono)', marginTop: 4, userSelect: 'all' }}>\n {meta.session_id}\n </div>\n )}\n </CardBase>\n );\n}","import React from 'react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\n\nexport default function InteractionScores({ scores }) {\n if (!scores?.length) return null;\n\n return (\n <DetailCard title=\"Scores\">\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\n {scores.map((s, i) => {\n const val = s.value != null ? Math.round(s.value) : null;\n return (\n <div key={i} style={{ textAlign: 'center', minWidth: 48 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: 'var(--text-ink)' }}>{val ?? '—'}</div>\n <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 2 }}>{s.label || s.key}</div>\n </div>\n );\n })}\n </div>\n </DetailCard>\n );\n}","import React, { useMemo } from 'react';\nimport { Target, CheckCircle, Lightbulb, Scale, Zap, MessageSquare, FileText, ChevronDown } from 'lucide-react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport SectionLabel from '../../primitives/SectionLabel.jsx';\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\n\nconst GROUP_LABELS = {\n outcome: { label: 'Outcome', icon: <Target size={12} />, color: 'var(--rail-outcome)' },\n process: { label: 'Process & Protocol', icon: <FileText size={12} />, color: 'var(--rail-discovery)' },\n compliance: { label: 'Compliance', icon: <Scale size={12} />, color: 'var(--rail-compliance)' },\n customer_friction: { label: 'Customer Friction', icon: <Zap size={12} />, color: 'var(--rail-coral)' },\n experience: { label: 'Experience', icon: <MessageSquare size={12} />, color: 'var(--rail-teal)' },\n};\n\nconst KIND_COLORS = {\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\n};\n\nexport default function InteractionSignals({\n signals,\n expandedSignals,\n toggleSignal,\n playEvidence,\n timelinePlaying,\n currentTimeSeconds,\n highlightTurns,\n borderRadius\n}) {\n if (!signals?.signals?.length) return null;\n\n const grouped = useMemo(() => {\n const result = {};\n for (const s of signals.signals) {\n const g = s.group || 'experience';\n if (!result[g]) result[g] = [];\n result[g].push(s);\n }\n return result;\n }, [signals]);\n\n return (\n <DetailCard title={`Signals (${signals.present_count} present / ${signals.total_signals_evaluated} evaluated)`} borderRadius={borderRadius}>\n {Object.entries(grouped).map(([groupKey, groupSignals]) => {\n const info = GROUP_LABELS[groupKey] || GROUP_LABELS.experience;\n\n return (\n <div key={groupKey} style={{ marginBottom: 10 }}>\n <SectionLabel style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {info.icon}\n <span>{info.label}</span>\n </SectionLabel>\n\n <div style={{ marginTop: 4, display: 'flex', flexDirection: 'column', gap: 6 }}>\n {groupSignals.map((s, i) => {\n const name = s.display_name || s.key || '';\n const delta = s.baseline?.delta;\n const hasObs = s.observations?.length > 0;\n const isExpanded = expandedSignals.has(s.key);\n \n // Map signal group to Tag variant\n const getVariant = (group) => {\n switch (group) {\n case 'outcome': return 'phase';\n case 'process': return 'tool';\n case 'compliance': return 'policy';\n case 'customer_friction': return 'default';\n case 'experience': return 'global';\n default: return 'default';\n }\n };\n \n return (\n <div\n key={i}\n id={`signal-${s.key}`}\n style={{\n border: '1px solid var(--border, rgba(52, 58, 64, 0.12))',\n borderRadius: 'var(--radius-md, 8px)',\n background: 'var(--paper, rgba(255, 255, 255, 0.98))',\n overflow: 'hidden',\n }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n if (hasObs) {\n toggleSignal(s.key);\n e.currentTarget.blur();\n }\n }}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '6px 10px',\n background: 'transparent',\n borderTop: '1px solid transparent',\n borderRight: '1px solid transparent',\n borderLeft: '1px solid transparent',\n borderBottom: '1px solid var(--border, rgba(52, 58, 64, 0.08))',\n cursor: hasObs ? 'pointer' : 'default',\n }}\n title={[\n s.confidence != null ? `Confidence: ${Math.round(s.confidence * 100)}%` : '',\n delta != null ? `Δ baseline: ${delta > 0 ? '+' : ''}${(delta * 100).toFixed(1)}%` : '',\n ].filter(Boolean).join(' · ')}\n >\n <span\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n whiteSpace: 'nowrap',\n }}\n >\n {KIND_COLORS[s.kind]?.icon}\n <span>{name}</span>\n {hasObs && (\n <span\n style={{\n marginLeft: 4,\n fontSize: 10,\n opacity: 0.6,\n }}\n >\n ({s.observations.length})\n </span>\n )}\n </span>\n {hasObs && (\n <ChevronDown\n size={14}\n style={{\n color: 'var(--text-muted)',\n flexShrink: 0,\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\n transition: 'transform 0.16s ease',\n }}\n />\n )}\n </button>\n\n {isExpanded && s.observations && (\n <div style={{ width: '100%', margin: '0 0 6px' }}>\n {s.observations.map((obs, oi) => (\n <div key={oi} style={{ marginBottom: 6 }}>\n <div\n style={{\n display: 'flex',\n borderRadius: 'var(--radius-sm, 8px)',\n background: 'var(--paper, #fff)',\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n width: 3,\n background: info.color,\n }}\n />\n <div\n style={{\n flex: 1,\n fontSize: 'var(--text-sm)',\n color: 'var(--text-muted)',\n padding: '8px 12px',\n }}\n >\n <div\n style={{\n fontWeight: 600,\n color: 'var(--text-base)',\n marginBottom: 3,\n fontSize: 'var(--text-base)',\n }}\n >\n {obs.key || ''}\n </div>\n <div style={{ marginBottom: 6, lineHeight: 1.4 }}>\n {obs.reason || obs.explanation || ''}\n </div>\n {obs.evidence?.map((ev, ei) => {\n const startMs = ev.start_ms;\n const endMs = ev.end_ms;\n\n let isPlayingSegment = false;\n if (startMs != null && timelinePlaying) {\n const startSec = startMs / 1000;\n const endSec =\n endMs != null ? endMs / 1000 : startSec + 1;\n const cs = currentTimeSeconds ?? 0;\n isPlayingSegment =\n cs >= startSec && cs <= endSec + 0.25;\n }\n\n return (\n <EvidenceItem\n key={ei}\n ev={ev}\n isPlaying={isPlayingSegment}\n railColor={info.color}\n onPlay={(startMs, endMs) =>\n playEvidence?.(startMs, endMs, ev.turn_ids)\n }\n onHighlight={highlightTurns}\n />\n );\n })}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n })}\n </DetailCard>\n );\n}","import React from 'react';\nimport { CheckCircle, Lightbulb, Zap, CornerDownRight } from 'lucide-react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\n\nconst KIND_COLORS = {\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\n};\n\nexport default function InteractionGuidance({\n guidance,\n playEvidence,\n timelinePlaying,\n currentTimeSeconds,\n highlightTurns,\n borderRadius\n}) {\n if (!guidance?.items?.length) return null;\n\n return (\n <DetailCard title={`Guidance (${guidance.total_items} items)`} borderRadius={borderRadius}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {guidance.items.map((g, i) => {\n const ki = KIND_COLORS[g.guidance_kind] || KIND_COLORS.excellence;\n const ownerBadge = g.owner === 'organization'\n ? { bg: 'color-mix(in srgb, var(--rail-discovery) 15%, transparent)', color: 'var(--rail-discovery)', text: 'ORG' }\n : g.owner === 'shared'\n ? { bg: 'color-mix(in srgb, var(--state-unknown) 15%, transparent)', color: 'var(--state-unknown)', text: 'SHARED' }\n : { bg: 'color-mix(in srgb, var(--rail-teal) 10%, transparent)', color: 'var(--rail-teal)', text: 'AGENT' };\n return (\n <div key={i} style={{\n padding: '10px 12px', borderRadius: 'var(--radius)',\n background: 'var(--paper)', borderLeft: `3px solid ${ki.color}`,\n }}>\n <div style={{ fontSize: 'var(--text-base)', color: 'var(--text-strong)', display: 'flex', alignItems: 'center', gap: 5, fontWeight: 550 }}>\n {ki.icon} {g.title || ''}\n <span style={{\n fontSize: 9, padding: '1px 6px', borderRadius: 8, marginLeft: 4,\n background: ownerBadge.bg, color: ownerBadge.color, fontWeight: 600,\n }}>\n {ownerBadge.text}\n </span>\n </div>\n {g.detail && <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 4, lineHeight: 1.4 }}>{g.detail}</div>}\n {/* Signal refs with evidence */}\n {g.signal_refs?.map((sr, si) => (\n <div key={si} style={{ marginTop: 6 }}>\n <div\n style={{\n fontSize: 10,\n color: 'var(--text-muted)',\n fontWeight: 600,\n marginBottom: 3,\n display: 'flex',\n alignItems: 'center',\n gap: 3,\n }}\n >\n <CornerDownRight size={10} /> {sr.display_name || sr.signal_key}\n {sr.confidence != null && (\n <span style={{ fontWeight: 400, opacity: 0.7 }}>\n {' '}\n ({Math.round(sr.confidence * 100)}%)\n </span>\n )}\n </div>\n {sr.evidence?.map((ev, ei) => {\n const startMs = ev.start_ms;\n const endMs = ev.end_ms;\n\n let isPlayingSegment = false;\n if (startMs != null && timelinePlaying) {\n const startSec = startMs / 1000;\n const endSec =\n endMs != null ? endMs / 1000 : startSec + 1;\n const cs = currentTimeSeconds ?? 0;\n isPlayingSegment =\n cs >= startSec && cs <= endSec + 0.25;\n }\n\n return (\n <EvidenceItem\n key={ei}\n ev={ev}\n isPlaying={isPlayingSegment}\n onPlay={(sMs, eMs) =>\n playEvidence?.(sMs, eMs, ev.turn_ids)\n }\n onHighlight={highlightTurns}\n />\n );\n })}\n </div>\n ))}\n </div>\n );\n })}\n </div>\n </DetailCard>\n );\n}","import React from 'react';\nimport { Target } from 'lucide-react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\n\nexport default function InteractionNBA({ nba }) {\n const items = nba?.recommendations || nba?.actions || [];\n if (!items.length) return null;\n\n return (\n <DetailCard title=\"Next Best Actions\">\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\n {items.slice(0, 8).map((r, i) => (\n <div key={i} style={{ fontSize: 11, color: 'var(--text-muted)', display: 'flex', alignItems: 'center', gap: 4 }}>\n <Target size={12} /> <strong style={{ color: 'var(--text-base)' }}>{r.action || r.title || ''}</strong>\n {r.rationale && ` — ${r.rationale}`}\n </div>\n ))}\n </div>\n </DetailCard>\n );\n}","import React from 'react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport Timeline from '../../media/Timeline.jsx';\n\nexport default function InteractionRecording({ \n audioUrl, \n timelineSegments, \n durationSeconds, \n currentTimeSeconds,\n timelinePlaying,\n playbackRate,\n onSeek,\n onTogglePlay,\n onSeekBack,\n onSeekForward,\n onSetPlaybackRate,\n audioRef\n}) {\n if (!audioUrl) return null;\n\n return (\n <DetailCard title=\"Recording\">\n <Timeline\n segments={timelineSegments}\n durationSeconds={durationSeconds || 0}\n currentTimeSeconds={currentTimeSeconds}\n onSeek={onSeek}\n showControls={true}\n hasRecording={true}\n timelinePlaying={timelinePlaying}\n playbackRate={playbackRate}\n onTogglePlay={onTogglePlay}\n onSeekBack={onSeekBack}\n onSeekForward={onSeekForward}\n onSetPlaybackRate={onSetPlaybackRate}\n />\n {/* Hidden audio element for actual playback */}\n <audio ref={audioRef} preload=\"none\" style={{ display: 'none' }}>\n <source src={audioUrl} type=\"audio/mpeg\" />\n </audio>\n </DetailCard>\n );\n}","import React from 'react';\nimport TranscriptCard from '../../media/TranscriptCard.jsx';\n\nexport default function InteractionTranscript({ \n transcript, \n audioUrl,\n highlightedTurns,\n activeTurnIndex,\n timelinePlaying,\n turnObservations,\n setExpandedSignals,\n onTurnPlayPause,\n}) {\n if (!transcript?.messages?.length) return null;\n\n // Helper function to format time from ms to \"MM:SS–MM:SS\"\n const formatTimeRange = (startMs, endMs) => {\n if (startMs == null) return undefined;\n const formatTime = (ms) => {\n const minutes = Math.floor(ms / 60000);\n const seconds = Math.floor((ms % 60000) / 1000);\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n };\n const start = formatTime(startMs);\n const end = endMs != null ? formatTime(endMs) : start;\n return `${start}–${end}`;\n };\n\n const turns = transcript.messages.map((m, i) => ({\n actor: m.actor === 'agent' ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer'),\n actorType: m.actor === 'agent' ? 'agent' : 'customer',\n text: m.text || '',\n timeRange: formatTimeRange(m.start ?? m.start_ms, m.end ?? m.end_ms),\n isHighlighted: highlightedTurns.has(i),\n highlightColor: (timelinePlaying && activeTurnIndex === i) \n ? (m.actor === 'agent' ? 'var(--rail-outcome)' : 'var(--rail-discovery)')\n : undefined,\n observations: (turnObservations[i] || []).map(obs => ({\n ...obs,\n onClick: () => {\n // Expand the parent signal and scroll to it\n setExpandedSignals(prev => new Set([...prev, obs.signalKey]));\n setTimeout(() => {\n const el = document.getElementById(`signal-${obs.signalKey}`);\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 100);\n },\n })),\n }));\n\n return (\n <div id=\"transcript-container\">\n <TranscriptCard\n turns={turns}\n audioUrl={audioUrl}\n activeTurnIndex={activeTurnIndex}\n autoScrollActiveTurn={timelinePlaying}\n isExternalPlaying={timelinePlaying}\n onTurnPlayPause={onTurnPlayPause}\n />\n </div>\n );\n}","\"use client\";\n\nimport React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { Send, Clock, ChevronRight } from \"lucide-react\";\n\nconst messageActionButtonStyle = {\n padding: 0,\n border: \"none\",\n background: \"transparent\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.65)\",\n cursor: \"pointer\",\n fontFamily: \"inherit\",\n};\n\n// Map author roles to consistent avatar background colors so that\n// supervisors, admins, and agents are visually distinct.\nconst roleColorMap = (role) => {\n if (!role) return null;\n const normalized = String(role).toLowerCase();\n if (normalized === \"supervisor\") return \"var(--rail-compliance)\";\n if (normalized === \"admin\" || normalized === \"administrator\")\n return \"var(--rail-discovery)\";\n if (normalized === \"agent\") return \"var(--rail-outcome)\";\n return null;\n};\n\n// Safely extract an array of messages/comments from a thread or payload,\n// tolerating different backend shapes (messages, comments, thread_messages, items, etc.).\nconst extractMessagesArray = (node) => {\n if (!node) return [];\n\n const directCandidates = [\n node.messages,\n node.comments,\n node.thread_messages,\n node.items,\n node.children,\n ];\n\n for (const candidate of directCandidates) {\n if (Array.isArray(candidate) && candidate.length) {\n return candidate;\n }\n }\n\n // Handle wrapped shapes like { messages: { data: [...] } }\n if (node.messages && Array.isArray(node.messages.data)) {\n return node.messages.data;\n }\n\n return [];\n};\n\n// Flatten a nested messages array (with optional replies) into a linear list\n// while preserving parent/child relationships via parentId and keeping\n// replies immediately after their parent.\nconst flattenMessages = (rawMessages, parentId = null, startIndex = 0) => {\n const out = [];\n\n (rawMessages || []).forEach((m, index) => {\n const author = m.author || {};\n const authorName = author.name || m.author_name || \"Unknown\";\n const initials =\n author.initials ||\n (authorName\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()) ||\n \"U\";\n const role = author.role || m.author_role;\n const roleColor = roleColorMap(role);\n const color = author.color || m.author_color || roleColor || \"#6B7C93\";\n\n const id = m.id || `msg-${startIndex + index}`;\n\n const baseMessage = {\n id,\n author: {\n name: authorName,\n initials,\n color,\n role,\n },\n content: m.content || m.text || \"\",\n timestamp: m.timestamp || m.created_at_display || m.created_at || \"\",\n type: m.type || \"comment\",\n isEdited: m.isEdited || m.is_edited || m.edited || false,\n references: m.references || [],\n parentId: m.parentId || m.parent_message_id || parentId || null,\n };\n\n out.push(baseMessage);\n\n if (Array.isArray(m.replies) && m.replies.length > 0) {\n out.push(\n ...flattenMessages(m.replies, id, startIndex + out.length)\n );\n }\n });\n\n return out;\n};\n\nconst formatTimestamp = (value) => {\n if (!value) return \"\";\n // If it's already a human-friendly string, just return as-is\n if (!/^\\d{4}-\\d{2}-\\d{2}T/.test(value)) return value;\n\n try {\n const d = new Date(value);\n if (Number.isNaN(d.getTime())) return value;\n\n const now = new Date();\n const sameDay =\n d.getFullYear() === now.getFullYear() &&\n d.getMonth() === now.getMonth() &&\n d.getDate() === now.getDate();\n\n const yesterday = new Date(now);\n yesterday.setDate(yesterday.getDate() - 1);\n const isYesterday =\n d.getFullYear() === yesterday.getFullYear() &&\n d.getMonth() === yesterday.getMonth() &&\n d.getDate() === yesterday.getDate();\n\n const timeStr = d.toLocaleTimeString(undefined, {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n });\n\n if (sameDay) {\n return `Today at ${timeStr}`;\n }\n\n if (isYesterday) {\n return `Yesterday at ${timeStr}`;\n }\n\n // Within last 7 days: show weekday name\n const diffMs = now.getTime() - d.getTime();\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\n if (diffDays < 7 && diffDays > 0) {\n const weekday = d.toLocaleDateString(undefined, { weekday: \"long\" });\n return `${weekday} at ${timeStr}`;\n }\n\n // Older: fallback to short date\n const dateStr = d.toLocaleDateString(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: d.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n });\n\n return `${dateStr} at ${timeStr}`;\n } catch {\n return value;\n }\n};\n\n\n\n/**\n * MessageThread (common)\n *\n * Lightweight, UI-only message thread component for session discussion.\n * - Controlled via `messages` + `onSendMessage` (and optional reply/edit/delete callbacks)\n * - onSendMessage(payload) receives { content, parent_message_id } for API use\n * - onEditMessage({ id, content }): on API error return { success: false } or throw to keep edit UI open\n * - No data fetching or app-specific APIs – host app owns data + side effects\n *\n * `messages` items:\n * {\n * id: string;\n * author: { name: string; initials: string; color: string; role?: string };\n * content: string;\n * timestamp: string; // already formatted for display\n * type?: \"comment\" | \"system\";\n * isEdited?: boolean;\n * references?: Array<{ type: \"condition\" | \"timestamp\" | \"observation\"; label: string }>;\n * }\n *\n * When a structured `messageThread` payload is provided (for example from an\n * `interaction-message-thread` block), this component will normalize its\n * threads and messages into the same internal shape so existing threads and\n * comments render without the caller needing to reshape the data.\n */\nexport default function MessageThread({\n sessionTitle,\n sessionSubtitle,\n threadLabel,\n messages: initialMessages,\n messageThread,\n onSendMessage,\n onReplyMessage,\n onEditMessage,\n onDeleteMessage,\n onCreateNewThread, // optional: host can handle new thread creation\n onThreadSelect, // optional: host can react when a thread pill is selected\n currentUser,\n isLoading = false,\n}) {\n const [messageInput, setMessageInput] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [messages, setMessages] = useState(initialMessages || []);\n const [isSending, setIsSending] = useState(false);\n const [hoveredMessageId, setHoveredMessageId] = useState(null);\n // Thread tabs — start empty; callers or messageThread payload define them.\n const [threads, setThreads] = useState([]);\n const [activeThreadId, setActiveThreadId] = useState(null);\n const [replyingToMessageId, setReplyingToMessageId] = useState(null);\n const [replyDraft, setReplyDraft] = useState(\"\");\n const [editingMessageId, setEditingMessageId] = useState(null);\n const [editContent, setEditContent] = useState(\"\");\n const [deleteConfirmMessage, setDeleteConfirmMessage] = useState(null);\n const [showNewThreadCompose, setShowNewThreadCompose] = useState(false);\n const [newThreadInput, setNewThreadInput] = useState(\"\");\n const [isCreatingNewThread, setIsCreatingNewThread] = useState(false);\n const [expandedParentIds, setExpandedParentIds] = useState(new Set());\n\n const messagesEndRef = useRef(null);\n const messageInputRef = useRef(null);\n\n const normalizedRole =\n (currentUser && currentUser.role && String(currentUser.role).toLowerCase()) ||\n \"\";\n\n const displayCurrentUser = useMemo(() => {\n if (!currentUser) {\n return {\n name: \"You\",\n initials: \"YO\",\n color: \"#6B7C93\",\n };\n }\n\n const name = currentUser.name || \"You\";\n const initials =\n currentUser.initials ||\n (name\n .split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase()) ||\n \"YO\";\n\n const role =\n currentUser.role && String(currentUser.role).toLowerCase();\n const roleColor = roleColorMap(role);\n\n const color = currentUser.color || roleColor || \"#6B7C93\";\n\n return {\n ...currentUser,\n name,\n initials,\n color,\n };\n }, [currentUser]);\n const canCreateNewThread =\n normalizedRole === \"supervisor\" || normalizedRole === \"admin\";\n\n const childrenByParentId = useMemo(() => {\n const map = {};\n (messages || []).forEach((m) => {\n if (!m.parentId) return;\n if (!map[m.parentId]) map[m.parentId] = [];\n map[m.parentId].push(m);\n });\n return map;\n }, [messages]);\n\n const topLevelMessages = useMemo(\n () => (messages || []).filter((m) => !m.parentId),\n [messages]\n );\n\n // Shared helpers so reply/edit/delete checks are consistent for\n // both top‑level messages and nested replies.\n const isChildReply = (id) => replyingToMessageId === id;\n const isChildEdit = (id) => editingMessageId === id;\n const isChildDelete = (id) =>\n deleteConfirmMessage && deleteConfirmMessage.id === id;\n\n const hasHeader = threadLabel || sessionTitle || sessionSubtitle;\n const replyingToMessage = replyingToMessageId\n ? messages.find((m) => m.id === replyingToMessageId)\n : null;\n\n useEffect(() => {\n // When caller passes explicit messages (and no structured messageThread),\n // keep internal state in sync. Avoid resetting when using messageThread.\n if (messageThread) return;\n if (!initialMessages) return;\n setMessages(initialMessages);\n }, [initialMessages, messageThread]);\n\n // Normalize an optional `messageThread` payload (e.g. from interaction-detail data)\n // into local threads + messages so existing backend data shows up in the UI.\n useEffect(() => {\n if (!messageThread) return;\n\n const rawThreads = Array.isArray(messageThread.threads)\n ? messageThread.threads\n : Array.isArray(messageThread.items)\n ? messageThread.items\n : [];\n\n // Case 1: multi-thread payload\n if (rawThreads.length > 0) {\n const normalizedThreads = rawThreads.map((t, index) => {\n const id = t.id || t.thread_id || `thread-${index + 1}`;\n const label =\n t.label ||\n t.title ||\n (index === 0 ? threadLabel || \"Session\" : `Thread ${index + 1}`);\n\n const rawMessagesForThread = extractMessagesArray(t);\n const messagesForThread = flattenMessages(rawMessagesForThread);\n\n return { id, label, messages: messagesForThread };\n });\n\n // Prefer payload threads; do not invent a default \"Session\" thread.\n setThreads(normalizedThreads);\n\n const firstWithMessages =\n normalizedThreads.find((t) => (t.messages || []).length > 0) ||\n normalizedThreads[0];\n\n const flatMessages = firstWithMessages?.messages || [];\n setMessages(flatMessages);\n // Start with all replies collapsed; user can expand per‑message.\n setExpandedParentIds(new Set());\n setActiveThreadId(firstWithMessages?.id || null);\n return;\n }\n\n // Case 2: single-thread payload with flat messages\n const rawFlat = extractMessagesArray(messageThread);\n if (rawFlat.length) {\n const mappedMessages = flattenMessages(rawFlat);\n\n setMessages(mappedMessages);\n // Start with all replies collapsed; user can expand per‑message.\n setExpandedParentIds(new Set());\n\n // Single-thread payload without an explicit threads array: create one\n // pill using the thread's own title so we don't show a generic \"Session\".\n const singleId = messageThread.id || \"thread-1\";\n const singleLabel =\n messageThread.title || threadLabel || \"Thread 1\";\n\n setThreads([\n {\n id: singleId,\n label: singleLabel,\n },\n ]);\n setActiveThreadId(singleId);\n }\n }, [messageThread, threadLabel]);\n useEffect(() => {\n // Keep the primary thread label aligned with the provided threadLabel\n if (!threadLabel) return;\n setThreads((prev) =>\n prev.map((thread, index) =>\n index === 0 ? { ...thread, label: threadLabel } : thread\n )\n );\n }, [threadLabel]);\n\n useEffect(() => {\n if (!messagesEndRef.current) return;\n if (!messages || messages.length === 0) return;\n // Keep the messages scrolled to the bottom *within* the thread container\n // without forcing the entire page to scroll.\n const container = messagesEndRef.current.parentElement;\n if (container) {\n container.scrollTop = container.scrollHeight;\n } else {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\", block: \"end\" });\n }\n }, [messages]);\n\n const handleNewThreadSubmit = async () => {\n const trimmed = newThreadInput.trim();\n if (!trimmed) return;\n setIsCreatingNewThread(true);\n try {\n const newId = `thread-${Date.now()}`;\n setThreads((prev) => [\n ...prev,\n {\n id: newId,\n label: trimmed.slice(0, 32) || `Thread ${prev.length + 1}`,\n },\n ]);\n setActiveThreadId(newId);\n await onCreateNewThread?.(trimmed);\n setNewThreadInput(\"\");\n setShowNewThreadCompose(false);\n } finally {\n setIsCreatingNewThread(false);\n }\n };\n\n const handleNewThreadCancel = () => {\n setShowNewThreadCompose(false);\n setNewThreadInput(\"\");\n };\n\n const handleSend = async () => {\n const trimmed = messageInput.trim();\n if (!trimmed) return;\n\n const content = trimmed;\n setMessageInput(\"\");\n\n const optimisticId = `temp-${Date.now()}`;\n const optimisticMessage = {\n id: optimisticId,\n author: displayCurrentUser,\n content,\n timestamp: \"Just now\",\n type: \"comment\",\n isOptimistic: true,\n parentId: replyingToMessageId || null,\n };\n\n setMessages((prev) => [...prev, optimisticMessage]);\n\n if (onSendMessage) {\n setIsSending(true);\n try {\n await onSendMessage({\n content,\n parent_message_id: replyingToMessageId || null,\n });\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\n )\n );\n } catch {\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticId));\n } finally {\n setIsSending(false);\n }\n setReplyingToMessageId(null);\n return;\n }\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\n )\n );\n setReplyingToMessageId(null);\n };\n\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n const handleReplyClick = (message) => {\n setReplyingToMessageId(message.id);\n setReplyDraft(\"\");\n setEditingMessageId(null);\n setEditContent(\"\");\n setHoveredMessageId(null);\n onReplyMessage?.(message);\n };\n\n const handleInlineReplySend = async (parentMessageId) => {\n const trimmed = replyDraft.trim();\n if (!trimmed) return;\n\n const optimisticId = `reply-${Date.now()}`;\n const optimisticReply = {\n id: optimisticId,\n author: displayCurrentUser,\n content: trimmed,\n timestamp: \"Just now\",\n type: \"comment\",\n isOptimistic: !onSendMessage,\n parentId: parentMessageId,\n };\n\n setMessages((prev) => [...prev, optimisticReply]);\n\n setIsSending(true);\n try {\n if (onSendMessage) {\n await onSendMessage({\n content: trimmed,\n parent_message_id: parentMessageId,\n });\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\n )\n );\n }\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n } catch {\n if (onSendMessage) {\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticId));\n }\n } finally {\n setIsSending(false);\n }\n };\n\n const handleEditClick = (message) => {\n setEditingMessageId(message.id);\n setEditContent(message.content || \"\");\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n setHoveredMessageId(null);\n };\n\n const handleEditSubmit = async () => {\n const trimmed = editContent.trim();\n if (!trimmed || !editingMessageId) return;\n try {\n const result = await onEditMessage?.({ id: editingMessageId, content: trimmed });\n // Keep edit UI open if host explicitly reports failure (e.g. API 500).\n // Host can return { success: false } or throw; either way we do not update or close.\n if (result && typeof result === \"object\" && result.success === false) {\n return;\n }\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === editingMessageId\n ? { ...msg, content: trimmed, isEdited: true }\n : msg\n )\n );\n setEditingMessageId(null);\n setEditContent(\"\");\n } catch (err) {\n // Keep edit textarea + Cancel + Save visible on error; host can show a toast.\n // eslint-disable-next-line no-console\n console.error(\"MessageThread edit failed:\", err);\n }\n };\n\n const handleEditCancel = () => {\n setEditingMessageId(null);\n setEditContent(\"\");\n };\n\n const handleDeleteClick = (message) => {\n setDeleteConfirmMessage(message);\n setHoveredMessageId(null);\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteConfirmMessage) return;\n const msg = deleteConfirmMessage;\n setDeleteConfirmMessage(null);\n setMessages((prev) => prev.filter((m) => m.id !== msg.id));\n await onDeleteMessage?.(msg);\n };\n\n // Recursive renderer for a single message + its children\nconst renderMessageTree = (message, depth = 0) => {\n const children = childrenByParentId[message.id] || [];\n const hasChildren = children.length > 0;\n const isExpanded = expandedParentIds.has(message.id);\n const isEditing = isChildEdit(message.id);\n const isReplying = isChildReply(message.id);\n\n return (\n <div key={message.id}>\n <div\n onMouseEnter={() =>\n message.type !== \"system\" && setHoveredMessageId(message.id)\n }\n onMouseLeave={() => setHoveredMessageId(null)}\n style={{\n display: \"flex\",\n gap: \"12px\",\n opacity: message.type === \"system\" ? 0.75 : 1,\n padding: \"4px 0\",\n margin: \"0 -4px\",\n borderRadius: \"8px\",\n marginLeft: depth > 0 ? 16 : 0,\n }}\n >\n {message.type !== \"system\" ? (\n <div\n style={{\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\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 }}\n >\n {message.author.initials}\n </div>\n ) : (\n <div\n style={{\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\n background: \"rgba(30, 33, 37, 0.1)\",\n color: \"rgba(30, 33, 37, 0.55)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n }}\n >\n <Clock size={16} />\n </div>\n )}\n\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* header: name + time + role chip + hover actions */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n marginBottom: \"6px\",\n justifyContent: \"space-between\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n }}\n >\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 650,\n color: \"rgba(30, 33, 37, 0.9)\",\n }}\n >\n {message.author.name}\n </span>\n {message.timestamp && (\n <span\n style={{\n fontSize: \"10px\",\n fontFamily: \"var(--default-mono-font-family)\",\n color: \"rgba(30, 33, 37, 0.5)\",\n }}\n >\n {formatTimestamp(message.timestamp)}\n </span>\n )}\n {message.author?.role && (\n <span\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n fontSize: \"10px\",\n color: \"rgba(30, 33, 37, 0.6)\",\n background: \"rgba(30, 33, 37, 0.08)\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n fontWeight: 600,\n }}\n >\n {String(message.author.role)}\n </span>\n )}\n {(message.isEdited || message.is_edited) && (\n <span\n style={{\n fontSize: \"10px\",\n color: \"rgba(30, 33, 37, 0.5)\",\n fontStyle: \"italic\",\n }}\n >\n (Edited)\n </span>\n )}\n </div>\n\n {message.type !== \"system\" &&\n hoveredMessageId === message.id && (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n flexShrink: 0,\n }}\n >\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleReplyClick(message);\n }}\n style={messageActionButtonStyle}\n >\n Reply\n </button>\n {onEditMessage && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleEditClick(message);\n }}\n style={messageActionButtonStyle}\n >\n Edit\n </button>\n )}\n {onDeleteMessage && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleDeleteClick(message);\n }}\n style={{\n ...messageActionButtonStyle,\n color: \"rgba(198, 99, 99, 0.9)\",\n }}\n >\n Delete\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* body: edit vs text */}\n {isEditing ? (\n <div style={{ marginTop: \"4px\" }}>\n <textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleEditSubmit();\n }\n if (e.key === \"Escape\") handleEditCancel();\n }}\n placeholder=\"Edit message...\"\n autoFocus\n style={{\n width: \"100%\",\n minHeight: \"56px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n background: \"white\",\n border: \"1px solid rgba(52, 58, 64, 0.2)\",\n borderRadius: \"6px\",\n resize: \"vertical\",\n outline: \"none\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n marginBottom: \"8px\",\n }}\n />\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n }}\n >\n <button\n type=\"button\"\n onClick={handleEditCancel}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.45)\",\n background: \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.15)\";\n e.currentTarget.style.color =\n \"rgba(30, 33, 37, 0.7)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.1)\";\n e.currentTarget.style.color =\n \"rgba(30, 33, 37, 0.45)\";\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleEditSubmit}\n disabled={!editContent?.trim()}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: editContent?.trim()\n ? \"white\"\n : \"rgba(30, 33, 37, 0.45)\",\n background: editContent?.trim()\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: editContent?.trim() ? \"pointer\" : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (editContent?.trim()) {\n e.currentTarget.style.background = \"#4d7290\";\n }\n }}\n onMouseLeave={(e) => {\n if (editContent?.trim()) {\n e.currentTarget.style.background = \"#5e88b0\";\n }\n }}\n >\n Save\n </button>\n </div>\n </div>\n ) : (\n <div\n style={{\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n lineHeight: 1.55,\n marginBottom: message.references?.length ? \"8px\" : 0,\n }}\n >\n {message.content}\n </div>\n )}\n\n {/* inline reply box when replying to this id */}\n {isReplying && (\n <div style={{ marginTop: \"12px\" }}>\n <textarea\n value={replyDraft}\n onChange={(e) => setReplyDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") {\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n }\n }}\n placeholder=\"Type your reply...\"\n disabled={isSending}\n autoFocus\n style={{\n width: \"100%\",\n minHeight: \"64px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n background: \"white\",\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\n borderRadius: \"6px\",\n resize: \"vertical\",\n outline: \"none\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n marginBottom: \"10px\",\n }}\n />\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n justifyContent: \"flex-end\",\n alignItems: \"center\",\n }}\n >\n <button\n type=\"button\"\n onClick={() => {\n setReplyingToMessageId(null);\n setReplyDraft(\"\");\n }}\n disabled={isSending}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.45)\",\n background: \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: isSending ? \"not-allowed\" : \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={() => handleInlineReplySend(message.id)}\n disabled={!replyDraft.trim() || isSending}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color:\n replyDraft.trim() && !isSending\n ? \"white\"\n : \"rgba(30, 33, 37, 0.45)\",\n background:\n replyDraft.trim() && !isSending\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.12)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor:\n replyDraft.trim() && !isSending\n ? \"pointer\"\n : \"not-allowed\",\n }}\n >\n Send\n </button>\n </div>\n </div>\n )}\n\n {/* references block (unchanged) */}\n {/* ... your existing references pills ... */}\n\n {/* children: collapse/expand replies */}\n {hasChildren && (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={() =>\n setExpandedParentIds((prev) => {\n const next = new Set(prev);\n next.has(message.id)\n ? next.delete(message.id)\n : next.add(message.id);\n return next;\n })\n }\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 6,\n padding: \"4px 8px\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.6)\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: 6,\n cursor: \"pointer\",\n }}\n title={isExpanded ? \"Collapse replies\" : \"Expand replies\"}\n >\n <ChevronRight\n size={14}\n style={{\n flexShrink: 0,\n transform: isExpanded ? \"rotate(90deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n <span>\n {children.length} {children.length === 1 ? \"reply\" : \"replies\"}\n </span>\n </button>\n\n {isExpanded && (\n <div\n style={{\n marginTop: 8,\n marginLeft: 16,\n paddingLeft: 16,\n borderLeft: \"2px solid rgba(52, 58, 64, 0.14)\",\n }}\n >\n {children.map((child) =>\n renderMessageTree(child, depth + 1)\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"rgba(255, 255, 255, 0.98)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n position: \"relative\",\n }}\n >\n {/* Delete confirmation overlay */}\n {deleteConfirmMessage && (\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(30, 33, 37, 0.35)\",\n borderRadius: \"12px\",\n }}\n onClick={() => setDeleteConfirmMessage(null)}\n >\n <div\n style={{\n background: \"white\",\n borderRadius: \"12px\",\n padding: \"20px 24px\",\n boxShadow: \"0 8px 24px rgba(30, 33, 37, 0.15)\",\n maxWidth: \"320px\",\n width: \"90%\",\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <p\n style={{\n margin: 0,\n marginBottom: \"20px\",\n fontSize: \"14px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.9)\",\n lineHeight: 1.45,\n }}\n >\n Do you really want to delete?\n </p>\n <div\n style={{\n display: \"flex\",\n gap: \"10px\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n type=\"button\"\n onClick={() => setDeleteConfirmMessage(null)}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.45)\",\n background: \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleDeleteConfirm}\n style={{\n padding: \"8px 16px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"white\",\n background: \"#5e88b0\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n }}\n >\n Delete\n </button>\n </div>\n </div>\n </div>\n )}\n\n {/* Header */}\n {hasHeader && (\n <div\n style={{\n padding: \"14px 16px\",\n borderBottom: \"1px solid rgba(52, 58, 64, 0.12)\",\n background: \"rgba(255, 255, 255, 0.98)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n <div>\n <div\n style={{\n fontSize: \"14px\",\n fontWeight: 600,\n color: \"rgba(30, 33, 37, 0.95)\",\n marginBottom: \"4px\",\n }}\n >\n {threadLabel || \"Session Discussion\"}\n </div>\n {(sessionTitle || sessionSubtitle) && (\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n }}\n >\n {sessionTitle || sessionSubtitle}\n </div>\n )}\n {threads.length > 0 && (\n <div\n style={{\n marginTop: \"8px\",\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"8px\",\n }}\n >\n {threads.map((thread) => {\n const isActive = thread.id === activeThreadId;\n return (\n <button\n key={thread.id}\n type=\"button\"\n onClick={() => {\n setActiveThreadId(thread.id);\n if (Array.isArray(thread.messages)) {\n setMessages(thread.messages);\n // On thread switch, start with replies collapsed.\n setExpandedParentIds(new Set());\n }\n setHoveredMessageId(null);\n setReplyingToMessageId(null);\n setEditingMessageId(null);\n onThreadSelect?.(thread);\n }}\n style={{\n padding: \"4px 10px\",\n borderRadius: \"999px\",\n border: \"1px solid rgba(184, 156, 106, 0.35)\",\n background: isActive\n ? \"rgba(184, 156, 106, 0.16)\"\n : \"rgba(255, 255, 255, 0.9)\",\n color: \"rgba(30, 33, 37, 0.85)\",\n fontSize: \"11px\",\n fontWeight: 500,\n cursor: \"pointer\",\n }}\n >\n {thread.label}\n </button>\n );\n })}\n </div>\n )}\n </div>\n\n {/* \"+ New thread\" – only for supervisor/admin roles */}\n {canCreateNewThread && (\n <button\n type=\"button\"\n onClick={() => {\n setShowNewThreadCompose((prev) => !prev);\n }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"6px 12px\",\n fontSize: \"13px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.75)\",\n background: \"transparent\",\n border: \"1px solid rgba(30, 33, 37, 0.12)\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n transition: \"background 0.15s ease, color 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(231, 212, 162, 0.12)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.9)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n title=\"Start a new discussion thread\"\n >\n <span\n style={{\n fontSize: 16,\n lineHeight: 1,\n marginTop: -1,\n }}\n >\n +\n </span>\n New thread\n </button>\n )}\n </div>\n </div>\n )}\n\n {/* Messages list */}\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 {/* Inline \"new thread\" compose */}\n {showNewThreadCompose && (\n <div\n style={{\n marginBottom: \"16px\",\n padding: \"12px\",\n background: \"rgba(30, 33, 37, 0.04)\",\n border: \"1px solid rgba(52, 58, 64, 0.14)\",\n borderRadius: \"8px\",\n }}\n >\n <textarea\n value={newThreadInput}\n onChange={(e) => setNewThreadInput(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleNewThreadSubmit();\n }\n }}\n placeholder=\"Start a new thread...\"\n disabled={isCreatingNewThread}\n style={{\n width: \"100%\",\n minHeight: \"64px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.88)\",\n background: \"white\",\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\n borderRadius: \"6px\",\n resize: \"vertical\",\n outline: \"none\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n marginBottom: \"10px\",\n }}\n />\n <div style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\n <button\n type=\"button\"\n onClick={handleNewThreadCancel}\n disabled={isCreatingNewThread}\n style={{\n padding: \"6px 14px\",\n fontSize: \"12px\",\n fontWeight: 500,\n color: \"rgba(30, 33, 37, 0.7)\",\n background: \"rgba(30, 33, 37, 0.08)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor: isCreatingNewThread ? \"not-allowed\" : \"pointer\",\n }}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={handleNewThreadSubmit}\n disabled={!newThreadInput.trim() || isCreatingNewThread}\n style={{\n padding: \"6px 14px\",\n fontSize: \"12px\",\n fontWeight: 600,\n color: \"white\",\n background:\n newThreadInput.trim() && !isCreatingNewThread\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.25)\",\n border: \"none\",\n borderRadius: \"6px\",\n cursor:\n newThreadInput.trim() && !isCreatingNewThread\n ? \"pointer\"\n : \"not-allowed\",\n }}\n >\n {isCreatingNewThread ? \"Sending...\" : \"Send\"}\n </button>\n </div>\n </div>\n )}\n {isLoading ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n }}\n >\n Loading messages...\n </div>\n ) : topLevelMessages.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n }}\n >\n No messages yet. Start the conversation!\n </div>\n ) : (\n // topLevelMessages.map((message) => (\n // <div\n // key={message.id}\n // onMouseEnter={() =>\n // message.type !== \"system\" && setHoveredMessageId(message.id)\n // }\n // onMouseLeave={() => setHoveredMessageId(null)}\n // style={{\n // display: \"flex\",\n // gap: \"12px\",\n // opacity: message.type === \"system\" ? 0.75 : 1,\n // padding: \"4px 0\",\n // margin: \"0 -4px\",\n // borderRadius: \"8px\",\n // }}\n // >\n // {message.type !== \"system\" ? (\n // <div\n // style={{\n // width: \"36px\",\n // height: \"36px\",\n // borderRadius: \"50%\",\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 // }}\n // >\n // {message.author.initials}\n // </div>\n // ) : (\n // <div\n // style={{\n // width: \"36px\",\n // height: \"36px\",\n // borderRadius: \"50%\",\n // background: \"rgba(30, 33, 37, 0.1)\",\n // color: \"rgba(30, 33, 37, 0.55)\",\n // display: \"flex\",\n // alignItems: \"center\",\n // justifyContent: \"center\",\n // flexShrink: 0,\n // }}\n // >\n // <Clock size={16} />\n // </div>\n // )}\n\n // <div style={{ flex: 1, minWidth: 0 }}>\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // marginBottom: \"6px\",\n // justifyContent: \"space-between\",\n // }}\n // >\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // }}\n // >\n // <span\n // style={{\n // fontSize: \"13px\",\n // fontWeight: 650,\n // color: \"rgba(30, 33, 37, 0.9)\",\n // }}\n // >\n // {message.author.name}\n // </span>\n // {message.timestamp && (\n // <span\n // style={{\n // fontSize: \"10px\",\n // fontFamily: \"var(--default-mono-font-family)\",\n // color: \"rgba(30, 33, 37, 0.5)\",\n // }}\n // >\n // {formatTimestamp(message.timestamp)}\n // </span>\n // )}\n // {message.author?.role && (\n // <span\n // style={{\n // display: \"inline-flex\",\n // alignItems: \"center\",\n // fontSize: \"10px\",\n // color: \"rgba(30, 33, 37, 0.6)\",\n // background: \"rgba(30, 33, 37, 0.08)\",\n // padding: \"3px 8px\",\n // borderRadius: \"6px\",\n // textTransform: \"uppercase\",\n // letterSpacing: \"0.04em\",\n // fontWeight: 600,\n // }}\n // >\n // {String(message.author.role)}\n // </span>\n // )}\n // </div>\n\n // {message.type !== \"system\" &&\n // hoveredMessageId === message.id && (\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"12px\",\n // flexShrink: 0,\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleReplyClick(message);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Reply\n // </button>\n // {onEditMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleEditClick(message);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Edit\n // </button>\n // )}\n // {onDeleteMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleDeleteClick(message);\n // }}\n // style={{\n // ...messageActionButtonStyle,\n // color: \"rgba(198, 99, 99, 0.9)\",\n // }}\n // >\n // Delete\n // </button>\n // )}\n // </div>\n // )}\n // </div>\n\n // {isChildEdit(message.id) ? (\n // <div style={{ marginTop: \"6px\" }}>\n // <textarea\n // value={editContent}\n // onChange={(e) => setEditContent(e.target.value)}\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }\n // }}\n // placeholder=\"Edit message...\"\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border: \"1px solid rgba(52, 58, 64, 0.2)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"8px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: \"rgba(30, 33, 37, 0.45)\",\n // background: \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: \"pointer\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={handleEditSubmit}\n // disabled={!editContent.trim()}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: editContent.trim()\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background: editContent.trim()\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: editContent.trim() ? \"pointer\" : \"not-allowed\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // Save\n // </button>\n // </div>\n // </div>\n // ) : (\n // <div\n // style={{\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // lineHeight: 1.55,\n // }}\n // >\n // {message.content}\n // </div>\n // )}\n\n // {isChildReply(message.id) && (\n // <div style={{ marginTop: \"12px\" }}>\n // <textarea\n // value={replyDraft}\n // onChange={(e) => setReplyDraft(e.target.value)}\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }\n // }}\n // placeholder=\"Type your reply...\"\n // disabled={isSending}\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border: \"1px solid rgba(52, 58, 64, 0.16)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"10px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }}\n // disabled={isSending}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: \"rgba(30, 33, 37, 0.45)\",\n // background: \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: isSending ? \"not-allowed\" : \"pointer\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={() => handleInlineReplySend(message.id)}\n // disabled={!replyDraft.trim() || isSending}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // replyDraft.trim() && !isSending\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background:\n // replyDraft.trim() && !isSending\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.12)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor:\n // replyDraft.trim() && !isSending\n // ? \"pointer\"\n // : \"not-allowed\",\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // transition: \"all 0.15s ease\",\n // }}\n // >\n // {isSending ? \"Sending...\" : \"Send\"}\n // </button>\n // </div>\n // </div>\n // )}\n\n // {childrenByParentId[message.id]?.length ? (\n // <div style={{ marginTop: \"8px\" }}>\n // <button\n // type=\"button\"\n // onClick={() =>\n // setExpandedParentIds((prev) => {\n // const next = new Set(prev);\n // if (next.has(message.id)) next.delete(message.id);\n // else next.add(message.id);\n // return next;\n // })\n // }\n // style={{\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"6px\",\n // padding: 0,\n // border: \"none\",\n // background: \"transparent\",\n // cursor: \"pointer\",\n // fontSize: \"12px\",\n // fontWeight: 500,\n // color: \"rgba(30, 33, 37, 0.55)\",\n // fontFamily: \"inherit\",\n // }}\n // >\n // <ChevronRight\n // size={14}\n // style={{\n // flexShrink: 0,\n // transition: \"transform 0.2s ease\",\n // transform: expandedParentIds.has(message.id)\n // ? \"rotate(90deg)\"\n // : \"rotate(0deg)\",\n // }}\n // />\n // <span>\n // {childrenByParentId[message.id].length}{\" \"}\n // {childrenByParentId[message.id].length === 1\n // ? \"reply\"\n // : \"replies\"}\n // </span>\n // </button>\n // {expandedParentIds.has(message.id) && (\n // <div\n // style={{\n // marginTop: \"8px\",\n // marginLeft: \"16px\",\n // paddingLeft: \"16px\",\n // borderLeft:\n // \"2px solid rgba(52, 58, 64, 0.14)\",\n // }}\n // >\n // {childrenByParentId[message.id].map((reply) => {\n // const isReplyEditing = isChildEdit(reply.id);\n // const isReplyBeingRepliedTo = isChildReply(reply.id);\n\n // return (\n // <div\n // key={reply.id}\n // onMouseEnter={() => {\n // if (reply.type !== \"system\") {\n // setHoveredMessageId(reply.id);\n // }\n // }}\n // onMouseLeave={() => setHoveredMessageId(null)}\n // style={{\n // display: \"flex\",\n // gap: \"12px\",\n // padding: \"4px 0\",\n // margin: \"0 -4px\",\n // borderRadius: \"8px\",\n // }}\n // >\n // <div\n // style={{\n // width: \"28px\",\n // height: \"28px\",\n // borderRadius: \"50%\",\n // background: reply.author.color,\n // color: \"white\",\n // display: \"flex\",\n // alignItems: \"center\",\n // justifyContent: \"center\",\n // fontSize: \"10px\",\n // fontWeight: 650,\n // flexShrink: 0,\n // }}\n // >\n // {reply.author.initials}\n // </div>\n // <div style={{ flex: 1, minWidth: 0 }}>\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // marginBottom: \"4px\",\n // justifyContent: \"space-between\",\n // }}\n // >\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"baseline\",\n // flexWrap: \"wrap\",\n // gap: \"8px\",\n // }}\n // >\n // <span\n // style={{\n // fontSize: \"13px\",\n // fontWeight: 650,\n // color: \"rgba(30, 33, 37, 0.9)\",\n // }}\n // >\n // {reply.author.name}\n // </span>\n // {reply.timestamp && (\n // <span\n // style={{\n // fontSize: \"10px\",\n // fontFamily:\n // \"var(--default-mono-font-family)\",\n // color:\n // \"rgba(30, 33, 37, 0.5)\",\n // }}\n // >\n // {formatTimestamp(\n // reply.timestamp\n // )}\n // </span>\n // )}\n // {reply.author?.role && (\n // <span\n // style={{\n // display: \"inline-flex\",\n // alignItems: \"center\",\n // gap: \"4px\",\n // fontSize: \"10px\",\n // color:\n // \"rgba(30, 33, 37, 0.6)\",\n // background:\n // \"rgba(30, 33, 37, 0.08)\",\n // padding: \"3px 8px\",\n // borderRadius: \"6px\",\n // textTransform: \"uppercase\",\n // letterSpacing: \"0.04em\",\n // fontWeight: 600,\n // }}\n // >\n // {reply.author.role}\n // </span>\n // )}\n // </div>\n\n // {reply.type !== \"system\" &&\n // hoveredMessageId === reply.id && (\n // <div\n // style={{\n // display: \"flex\",\n // alignItems: \"center\",\n // gap: \"12px\",\n // flexShrink: 0,\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleReplyClick(reply);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Reply\n // </button>\n // {onEditMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleEditClick(reply);\n // }}\n // style={messageActionButtonStyle}\n // >\n // Edit\n // </button>\n // )}\n // {onDeleteMessage && (\n // <button\n // type=\"button\"\n // onClick={(e) => {\n // e.preventDefault();\n // e.stopPropagation();\n // handleDeleteClick(reply);\n // }}\n // style={{\n // ...messageActionButtonStyle,\n // color:\n // \"rgba(198, 99, 99, 0.9)\",\n // }}\n // >\n // Delete\n // </button>\n // )}\n // </div>\n // )}\n // </div>\n\n // {isReplyEditing ? (\n // <div style={{ marginTop: \"6px\" }}>\n // <textarea\n // value={editContent}\n // onChange={(e) =>\n // setEditContent(e.target.value)\n // }\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }\n // }}\n // placeholder=\"Edit message...\"\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border:\n // \"1px solid rgba(52, 58, 64, 0.2)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"8px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setEditingMessageId(null);\n // setEditContent(\"\");\n // }}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // \"rgba(30, 33, 37, 0.45)\",\n // background:\n // \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: \"pointer\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={handleEditSubmit}\n // disabled={!editContent.trim()}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color: editContent.trim()\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background: editContent.trim()\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: editContent.trim()\n // ? \"pointer\"\n // : \"not-allowed\",\n // }}\n // >\n // Save\n // </button>\n // </div>\n // </div>\n // ) : (\n // <div\n // style={{\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // lineHeight: 1.55,\n // }}\n // >\n // {reply.content}\n // </div>\n // )}\n\n // {isReplyBeingRepliedTo && (\n // <div style={{ marginTop: \"12px\" }}>\n // <textarea\n // value={replyDraft}\n // onChange={(e) =>\n // setReplyDraft(e.target.value)\n // }\n // onKeyDown={(e) => {\n // if (e.key === \"Escape\") {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }\n // }}\n // placeholder=\"Type your reply...\"\n // disabled={isSending}\n // autoFocus\n // style={{\n // width: \"100%\",\n // minHeight: \"64px\",\n // padding: \"8px 12px\",\n // fontSize: \"13px\",\n // color: \"rgba(30, 33, 37, 0.88)\",\n // background: \"white\",\n // border:\n // \"1px solid rgba(52, 58, 64, 0.16)\",\n // borderRadius: \"6px\",\n // resize: \"vertical\",\n // outline: \"none\",\n // fontFamily: \"inherit\",\n // lineHeight: 1.5,\n // marginBottom: \"10px\",\n // }}\n // />\n // <div\n // style={{\n // display: \"flex\",\n // gap: \"8px\",\n // justifyContent: \"flex-end\",\n // alignItems: \"center\",\n // }}\n // >\n // <button\n // type=\"button\"\n // onClick={() => {\n // setReplyingToMessageId(null);\n // setReplyDraft(\"\");\n // }}\n // disabled={isSending}\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // \"rgba(30, 33, 37, 0.45)\",\n // background:\n // \"rgba(30, 33, 37, 0.1)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor: isSending\n // ? \"not-allowed\"\n // : \"pointer\",\n // }}\n // >\n // Cancel\n // </button>\n // <button\n // type=\"button\"\n // onClick={() =>\n // handleInlineReplySend(reply.id)\n // }\n // disabled={\n // !replyDraft.trim() || isSending\n // }\n // style={{\n // padding: \"8px 16px\",\n // fontSize: \"12px\",\n // fontWeight: 600,\n // color:\n // replyDraft.trim() && !isSending\n // ? \"white\"\n // : \"rgba(30, 33, 37, 0.45)\",\n // background:\n // replyDraft.trim() && !isSending\n // ? \"#5e88b0\"\n // : \"rgba(30, 33, 37, 0.12)\",\n // border: \"none\",\n // borderRadius: \"6px\",\n // cursor:\n // replyDraft.trim() && !isSending\n // ? \"pointer\"\n // : \"not-allowed\",\n // }}\n // >\n // {isSending ? \"Sending...\" : \"Send\"}\n // </button>\n // </div>\n // </div>\n // )}\n // </div>\n // </div>\n // );\n // })}\n // </div>\n // )}\n // </div>\n // ) : null}\n // </div>\n // </div>\n // ))\n topLevelMessages.map((message) => renderMessageTree(message, 0))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input area */}\n <div\n style={{\n padding: \"12px\",\n borderTop: \"1px solid rgba(52, 58, 64, 0.12)\",\n background: \"rgba(255, 255, 255, 0.95)\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-end\",\n }}\n >\n <div\n style={{\n width: \"36px\",\n height: \"36px\",\n borderRadius: \"50%\",\n background: displayCurrentUser.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n }}\n >\n {displayCurrentUser.initials}\n </div>\n\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n }}\n >\n <textarea\n ref={messageInputRef}\n value={messageInput}\n onChange={(e) => setMessageInput(e.target.value)}\n onKeyDown={handleKeyPress}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder={\n replyingToMessage ? \"Type your reply...\" : \"Add a comment...\"\n }\n style={{\n width: \"100%\",\n minHeight: \"38px\",\n maxHeight: \"120px\",\n padding: \"8px 12px\",\n fontSize: \"13px\",\n color: \"rgba(30, 33, 37, 0.85)\",\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: \"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 <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n }}\n >\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!messageInput.trim() || isSending}\n style={{\n padding: \"8px 16px\",\n background:\n messageInput.trim() && !isSending\n ? \"#5e88b0\"\n : \"rgba(30, 33, 37, 0.1)\",\n border: \"none\",\n borderRadius: \"6px\",\n color:\n messageInput.trim() && !isSending\n ? \"white\"\n : \"rgba(30, 33, 37, 0.45)\",\n fontSize: \"12px\",\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 >\n {isSending ? (\n <>\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: \"spin 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 </div>\n );\n}\n\n","\"use client\";\n\nimport React, { useState, useEffect, useLayoutEffect, useRef, useMemo } from 'react';\nimport DetailCard from '../../primitives/DetailCard.jsx';\nimport { Tabs } from '../../index.js';\nimport CoachingSynthesisCard from './CoachingSynthesisCard.jsx';\nimport InteractionContext from './InteractionContext.jsx';\nimport InteractionScores from './InteractionScores.jsx';\nimport AgentLiftCard from '../../common/AgentLiftCard.jsx';\nimport InteractionSignals from './InteractionSignals.jsx';\nimport InteractionGuidance from './InteractionGuidance.jsx';\nimport InteractionNBA from './InteractionNBA.jsx';\nimport InteractionRecording from './InteractionRecording.jsx';\nimport InteractionTranscript from './InteractionTranscript.jsx';\nimport MessageThread from '../../common/MessageThread.jsx';\n\nfunction findBlock(blocks, id) {\n return blocks.find((b) => b.block_id === id);\n}\n\nfunction InteractionDetailPanel({\n data,\n audioUrl,\n coachingData,\n messageThread,\n coachingLoading,\n coachingError,\n // Optional callbacks for host apps to wire MessageThread to real APIs.\n onThreadSendMessage,\n onThreadEditMessage,\n onThreadDeleteMessage,\n onThreadCreateNewThread,\n onThreadSelect,\n threadLoading,\n threadCurrentUser,\n}) {\n const blocks = data.blocks || [];\n const evidenceIndex = data.evidence_index || {};\n const audioRef = useRef(null);\n const segmentEndHandlerRef = useRef(null);\n const [highlightedTurns, setHighlightedTurns] = useState(new Set());\n const [expandedSignals, setExpandedSignals] = useState(new Set());\n\n // Timeline state for audio playback integration\n const [currentTimeSeconds, setCurrentTimeSeconds] = useState(0);\n const [timelinePlaying, setTimelinePlaying] = useState(false);\n const [playbackRate, setPlaybackRate] = useState(1);\n\n // Extract block data\n const meta = findBlock(blocks, 'interaction-metadata')?.payload || {};\n const ctx = findBlock(blocks, 'interaction-context')?.payload || {};\n const summary = findBlock(blocks, 'interaction-summary')?.payload || {};\n const scores = findBlock(blocks, 'interaction-scores')?.payload || {};\n const signals = findBlock(blocks, 'interaction-signals')?.payload || {};\n const guidance = findBlock(blocks, 'interaction-guidance')?.payload || {};\n const transcript = findBlock(blocks, 'interaction-transcript')?.payload || {};\n // const messageThread = findBlock(blocks, 'interaction-message-thread')?.payload || {};\n const nba = findBlock(blocks, 'interaction-nba')?.payload || {};\n const dimensionsBlock = findBlock(blocks, 'interaction-dimensions')?.payload || {};\n const dimensions = (dimensionsBlock.dimensions || []).filter(d => d.value);\n const outcomeLift = findBlock(blocks, 'interaction-outcome-lift')?.payload || {};\n\n // Build turn → observation pills map from signals data\n const turnObservations = useMemo(() => {\n const map = {}; // turnIndex → [{label, reason, color, signalKey}]\n const GROUP_LABELS = {\n outcome: { color: 'var(--rail-outcome)' },\n process: { color: 'var(--rail-discovery)' },\n compliance: { color: 'var(--rail-compliance)' },\n customer_friction: { color: 'var(--rail-coral)' },\n experience: { color: 'var(--rail-teal)' },\n };\n\n for (const signal of (signals.signals || [])) {\n const groupInfo = GROUP_LABELS[signal.group] || {};\n for (const obs of (signal.observations || [])) {\n for (const ev of (obs.evidence || [])) {\n if (ev.turn_ids?.length) {\n for (const tid of ev.turn_ids) {\n if (!map[tid]) map[tid] = [];\n // Deduplicate by observation key per turn\n if (!map[tid].some(o => o.label === (obs.key || signal.display_name || signal.key))) {\n map[tid].push({\n label: obs.key || signal.display_name || signal.key,\n reason: obs.reason || obs.explanation || '',\n color: groupInfo.color || 'var(--state-present)',\n signalKey: signal.key,\n });\n }\n }\n }\n }\n }\n }\n return map;\n }, [signals.signals]);\n\n // Build timeline segments from transcript messages\n const timelineSegments = transcript.messages?.map((m, i) => {\n const startTime = (m.start ?? m.start_ms) ? (m.start ?? m.start_ms) / 1000 : 0;\n const endTime = (m.end ?? m.end_ms) ? (m.end ?? m.end_ms) / 1000 : startTime + 1;\n const isAgent = m.actor === 'agent';\n const actorName = isAgent ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer');\n\n return {\n startTime,\n endTime,\n actor: actorName,\n actorColor: isAgent ? 'var(--rail-outcome)' : 'var(--rail-discovery)',\n };\n }) || [];\n\n // Compute active turn index based on current playback time\n const activeTurnIndex = useMemo(() => {\n if (!timelinePlaying && currentTimeSeconds === 0) return -1;\n const messages = transcript.messages || [];\n const currentMs = currentTimeSeconds * 1000;\n for (let i = messages.length - 1; i >= 0; i--) {\n const startMs = messages[i].start ?? messages[i].start_ms;\n if (startMs != null && currentMs >= startMs) return i;\n }\n return -1;\n }, [currentTimeSeconds, timelinePlaying, transcript.messages]);\n\n // Timeline event handlers\n const handleTimelineSeek = (seconds) => {\n if (audioRef.current) {\n audioRef.current.currentTime = seconds;\n setCurrentTimeSeconds(seconds);\n }\n };\n\n const handleTimelineTogglePlay = () => {\n if (audioRef.current) {\n if (timelinePlaying) {\n audioRef.current.pause();\n setTimelinePlaying(false);\n } else {\n const p = audioRef.current.play();\n if (p !== undefined) p.catch(() => { }); // ignore AbortError when pause() interrupts play()\n setTimelinePlaying(true);\n }\n }\n };\n\n const handleTimelineSeekBack = () => {\n if (audioRef.current) {\n audioRef.current.currentTime = Math.max(0, audioRef.current.currentTime - 15);\n }\n };\n\n const handleTimelineSeekForward = () => {\n if (audioRef.current) {\n const duration = meta.duration_seconds || audioRef.current.duration || 0;\n audioRef.current.currentTime = Math.min(duration, audioRef.current.currentTime + 15);\n }\n };\n\n const handleSetPlaybackRate = (rate) => {\n if (audioRef.current) {\n audioRef.current.playbackRate = rate;\n setPlaybackRate(rate);\n }\n };\n\n // Update currentTimeSeconds from audio element\n useEffect(() => {\n const audio = audioRef.current;\n if (!audio) return;\n\n const updateTime = () => setCurrentTimeSeconds(audio.currentTime);\n const handlePlay = () => setTimelinePlaying(true);\n const handlePause = () => setTimelinePlaying(false);\n const handleEnded = () => setTimelinePlaying(false);\n\n audio.addEventListener('timeupdate', updateTime);\n audio.addEventListener('play', handlePlay);\n audio.addEventListener('pause', handlePause);\n audio.addEventListener('ended', handleEnded);\n\n return () => {\n audio.removeEventListener('timeupdate', updateTime);\n audio.removeEventListener('play', handlePlay);\n audio.removeEventListener('pause', handlePause);\n audio.removeEventListener('ended', handleEnded);\n };\n }, [audioUrl]);\n\n const playAudio = (startMs, endMs) => {\n const player = audioRef.current;\n if (!player || startMs == null) return;\n\n const startSec = startMs / 1000;\n player.currentTime = startSec;\n setCurrentTimeSeconds(startSec);\n\n const p = player.play();\n if (p !== undefined) p.catch(() => { }); // ignore AbortError when pause() interrupts play()\n\n // Clear any previous segment end handler so only one is active\n if (segmentEndHandlerRef.current) {\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\n segmentEndHandlerRef.current = null;\n }\n\n if (endMs != null) {\n const endSec = endMs / 1000;\n const handler = () => {\n if (player.currentTime >= endSec) {\n player.pause();\n if (segmentEndHandlerRef.current) {\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\n segmentEndHandlerRef.current = null;\n }\n }\n };\n segmentEndHandlerRef.current = handler;\n player.addEventListener('timeupdate', handler);\n }\n };\n\n // Used by Signals evidence rows: toggle play/pause for a specific segment\n // and scroll the transcript container into view for the related turns.\n const handleEvidencePlayToggle = (startMs, endMs, turnIds) => {\n const player = audioRef.current;\n if (!player || startMs == null) return;\n\n const startSec = startMs / 1000;\n const endSec = endMs != null ? endMs / 1000 : startSec + 1;\n const currentSec = player.currentTime;\n\n const isInSegment =\n timelinePlaying &&\n currentSec >= startSec &&\n (endSec == null || currentSec <= endSec + 0.25);\n\n // If already playing this segment, pause instead of restarting\n if (isInSegment) {\n player.pause();\n return;\n }\n\n // Otherwise, play the requested segment and redirect to transcript\n playAudio(startMs, endMs);\n if (turnIds?.length) {\n highlightTurns(turnIds);\n }\n };\n\n const handleTranscriptTurnPlayPause = (turn, index) => {\n const messages = transcript.messages || [];\n const message = messages[index];\n const player = audioRef.current;\n\n if (!message || !player) return;\n\n const startMs = message.start ?? message.start_ms;\n const endMs = message.end ?? message.end_ms;\n\n // If this turn is already active and playing, pause playback\n if (timelinePlaying && activeTurnIndex === index) {\n player.pause();\n return;\n }\n\n if (startMs == null) return;\n playAudio(startMs, endMs);\n };\n\n const highlightTurns = (turnIds) => {\n setHighlightedTurns(new Set(turnIds));\n // TranscriptCard handles highlight styling via isHighlighted prop\n // Always scroll transcript container into view so highlights are visible\n const container = document.getElementById('transcript-container');\n if (container) {\n container.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }\n setTimeout(() => setHighlightedTurns(new Set()), 5000);\n };\n\n const toggleSignal = (key) => {\n setExpandedSignals(prev => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key); else next.add(key);\n return next;\n });\n };\n\n const title = ctx.call_purpose?.interaction_driver || summary.one_liner || 'Interaction Detail';\n\n const [rightTab, setRightTab] = useState('signals'); // 'signals' | 'guidance'\n const leftSummaryRef = useRef(null);\n const [rightRailHeight, setRightRailHeight] = useState(null);\n\n // After coaching summary data has loaded and layout has settled,\n // sync right rail height to match ONLY the summary block\n // (InteractionContext + AgentLiftCard + CoachingSummary), not extra padding.\n useLayoutEffect(() => {\n if (coachingLoading) return;\n if (!leftSummaryRef.current) return;\n\n const measure = () => {\n const h = leftSummaryRef.current?.offsetHeight || 0;\n if (h > 0) setRightRailHeight(h);\n };\n\n // Measure immediately and once more on the next frame to catch late layout.\n measure();\n const id = window.requestAnimationFrame(measure);\n return () => window.cancelAnimationFrame(id);\n }, [coachingLoading, coachingData, meta, ctx]);\n\n // MessageThread callbacks.\n // - For gallery: default to console logging\n // - For host apps: pass real handlers via props so APIs are called.\n const handleThreadSend = async (payload) => {\n // payload: { content, parent_message_id }\n if (onThreadSendMessage) {\n await onThreadSendMessage(payload);\n return;\n }\n };\n\n const handleThreadEdit = async (payload) => {\n if (onThreadEditMessage) {\n return onThreadEditMessage(payload);\n }\n };\n\n const handleThreadDelete = async (message) => {\n if (onThreadDeleteMessage) {\n await onThreadDeleteMessage(message);\n return;\n }\n };\n\n const handleCreateNewThread = async (titleText) => {\n if (onThreadCreateNewThread) {\n await onThreadCreateNewThread(titleText);\n return;\n }\n };\n\n // Pass through the host's messageThread as-is. No fallback sample — host apps\n // (e.g. Feedback module) must pass real thread data or leave undefined to show\n // MessageThread's empty state (\"No messages yet\"). Gallery/demos can pass\n // sample data explicitly via the messageThread prop.\n const effectiveMessageThread =\n messageThread && Object.keys(messageThread).length > 0\n ? messageThread\n : undefined;\n\n return (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div\n style={{\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: '10px',\n flexWrap: 'wrap',\n }}\n >\n {/* Left rail: context → coaching summary */}\n <div ref={leftSummaryRef}\n style={{\n flex: '1 1 420px',\n minWidth: 320,\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n }}>\n {/* Context — metadata + call purpose + dimensions */}\n <InteractionContext\n title={title}\n meta={meta}\n callPurpose={ctx.call_purpose}\n classification={ctx.classification}\n dimensions={dimensions}\n />\n\n {/* Scores */}\n {/* <InteractionScores scores={scores.scores} /> */}\n\n {/* Agent Lift Analysis */}\n <AgentLiftCard outcomeLift={outcomeLift} />\n\n {/* Coaching Synthesis — only show if loading or has data */}\n {(coachingLoading || coachingData || coachingError) && (\n <DetailCard title=\"Coaching Summary\">\n <CoachingSynthesisCard\n data={coachingData}\n loading={coachingLoading}\n error={coachingError}\n />\n </DetailCard>\n )}\n </div>\n\n {/* Right rail: tabs → InteractionSignals/InteractionGuidance → InteractionNBA */}\n <div\n style={{\n flex: '1 1 420px',\n minWidth: 320,\n display: 'flex',\n flexDirection: 'column',\n height: rightRailHeight,\n }}\n >\n {/* Tabs: Signals / Guidance */}\n <Tabs\n tabs={[\n { key: 'signals', label: 'Signals' },\n { key: 'guidance', label: 'Guidance' },\n ]}\n active={rightTab}\n onSelect={setRightTab}\n size=\"compact\"\n borderTopRightRadius={12}\n borderTopLeftRadius={12}\n />\n\n <div\n className=\"custom-thin-scrollbar-library\"\n style={{\n flex: 1,\n overflowY: 'auto',\n display: 'flex',\n flexDirection: 'column',\n gap: 10,\n }}\n >\n {rightTab === 'signals' ? (\n <InteractionSignals\n signals={signals}\n expandedSignals={expandedSignals}\n toggleSignal={toggleSignal}\n playEvidence={handleEvidencePlayToggle}\n timelinePlaying={timelinePlaying}\n currentTimeSeconds={currentTimeSeconds}\n highlightTurns={highlightTurns}\n borderRadius={'0px 0px 12px 12px'}\n />\n ) : (\n <InteractionGuidance\n guidance={guidance}\n playEvidence={handleEvidencePlayToggle}\n timelinePlaying={timelinePlaying}\n currentTimeSeconds={currentTimeSeconds}\n highlightTurns={highlightTurns}\n borderRadius={'0px 0px 12px 12px'}\n />\n )}\n\n {/* NBA always visible below tabs */}\n <InteractionNBA nba={nba} />\n </div>\n </div>\n </div>\n {/* Recording / Timeline */}\n <InteractionRecording\n audioUrl={audioUrl}\n timelineSegments={timelineSegments}\n durationSeconds={meta.duration_seconds}\n currentTimeSeconds={currentTimeSeconds}\n timelinePlaying={timelinePlaying}\n playbackRate={playbackRate}\n onSeek={handleTimelineSeek}\n onTogglePlay={handleTimelineTogglePlay}\n onSeekBack={handleTimelineSeekBack}\n onSeekForward={handleTimelineSeekForward}\n onSetPlaybackRate={handleSetPlaybackRate}\n audioRef={audioRef}\n />\n\n {/* Transcript */}\n <InteractionTranscript\n transcript={transcript}\n audioUrl={audioUrl}\n highlightedTurns={highlightedTurns}\n activeTurnIndex={activeTurnIndex}\n timelinePlaying={timelinePlaying}\n turnObservations={turnObservations}\n setExpandedSignals={setExpandedSignals}\n onTurnPlayPause={handleTranscriptTurnPlayPause}\n />\n\n {/* Message Thread — uses common design-system component.\n For gallery/testing, falls back to a sample payload that matches\n the real backend response shape. */}\n <MessageThread\n sessionTitle={title}\n messageThread={effectiveMessageThread}\n currentUser={threadCurrentUser}\n isLoading={threadLoading}\n onSendMessage={handleThreadSend}\n onEditMessage={handleThreadEdit}\n onDeleteMessage={handleThreadDelete}\n onCreateNewThread={handleCreateNewThread}\n onThreadSelect={onThreadSelect}\n />\n </div>\n );\n}\n\nclass ErrorBoundary extends React.Component {\n constructor(props) {\n super(props);\n this.state = { hasError: false };\n }\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n componentDidCatch(error, info) {\n console.error('InteractionDetailPanel render error:', error, info?.componentStack);\n }\n render() {\n return this.state.hasError ? this.props.fallback : this.props.children;\n }\n}\n\nexport default function InteractionDetailPanelWrapper(props) {\n return (\n <ErrorBoundary fallback={\n <div style={{ padding: 16, color: 'var(--state-unknown)', fontSize: 12 }}>\n Error rendering detail.\n </div>\n }>\n <InteractionDetailPanel {...props} />\n </ErrorBoundary>\n );\n}","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\n\n/**\n * ExpandPatternComparison Component\n * Demonstrates three different expand/collapse patterns for signal cards.\n */\nexport default function ExpandPatternComparison({ pattern }) {\n const [isExpanded, setIsExpanded] = useState(false);\n\n const sampleSignal = {\n name: \"Customer Escalation Likelihood\",\n description:\n \"Based on observed patterns, this session shows indicators consistent with potential escalation.\",\n technicalKey: \"signal.escalation_likelihood\",\n probability: 0.68,\n confidence: 0.81,\n observations: 3,\n };\n\n if (pattern === \"text-link\") {\n return (\n <div\n style={{\n position: \"relative\",\n background: \"rgba(255, 255, 255, 0.82)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\n }}\n >\n {/* Left rail */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: \"5px\",\n background: \"#6B7C93\",\n opacity: 0.6,\n }}\n />\n\n {/* Content - not clickable */}\n <div\n style={{\n padding: \"14px 16px 14px 21px\",\n }}\n >\n <div style={{ marginBottom: \"4px\" }}>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 680,\n color: \"rgba(30, 33, 37, 0.92)\",\n lineHeight: 1.2,\n }}\n >\n {sampleSignal.name}\n </span>\n </div>\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.65)\",\n lineHeight: 1.4,\n marginBottom: \"6px\",\n }}\n >\n {sampleSignal.description}\n </div>\n <div\n style={{\n fontSize: \"11px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n fontFamily: \"ui-monospace, monospace\",\n marginBottom: \"8px\",\n }}\n >\n {sampleSignal.technicalKey}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n fontSize: \"11.5px\",\n marginBottom: \"10px\",\n }}\n >\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\n {sampleSignal.probability.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\n {sampleSignal.confidence.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\n {sampleSignal.observations} observations\n </span>\n </div>\n\n {/* Text link to expand */}\n {!isExpanded && (\n <button\n onClick={() => setIsExpanded(true)}\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.56)\",\n background: \"none\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.4)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.2)\";\n }}\n >\n View contributing observations\n </button>\n )}\n </div>\n\n {/* Expanded content */}\n {isExpanded && (\n <div\n style={{\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\n background: \"rgba(244, 241, 230, 0.25)\",\n padding: \"16px 16px 16px 21px\",\n }}\n >\n <div\n style={{\n fontSize: \"10px\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(30, 33, 37, 0.52)\",\n marginBottom: \"8px\",\n }}\n >\n Contributing Observations\n </div>\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\n [Observations would appear here]\n </div>\n <button\n onClick={() => setIsExpanded(false)}\n style={{\n marginTop: \"10px\",\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.56)\",\n background: \"none\",\n border: \"none\",\n padding: 0,\n cursor: \"pointer\",\n textDecoration: \"underline\",\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.4)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\n e.currentTarget.style.textDecorationColor =\n \"rgba(30, 33, 37, 0.2)\";\n }}\n >\n Hide observations\n </button>\n </div>\n )}\n </div>\n );\n }\n\n if (pattern === \"rotating-chevron\") {\n return (\n <div\n style={{\n position: \"relative\",\n background: \"rgba(255, 255, 255, 0.82)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\n }}\n >\n {/* Left rail */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: \"5px\",\n background: \"#6B7C93\",\n opacity: 0.6,\n }}\n />\n\n {/* Header - Clickable */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n width: \"100%\",\n padding: \"14px 16px 14px 21px\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: \"12px\" }}>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ marginBottom: \"4px\" }}>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 680,\n color: \"rgba(30, 33, 37, 0.92)\",\n lineHeight: 1.2,\n }}\n >\n {sampleSignal.name}\n </span>\n </div>\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.65)\",\n lineHeight: 1.4,\n marginBottom: \"6px\",\n }}\n >\n {sampleSignal.description}\n </div>\n <div\n style={{\n fontSize: \"11px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n fontFamily: \"ui-monospace, monospace\",\n marginBottom: \"8px\",\n }}\n >\n {sampleSignal.technicalKey}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n fontSize: \"11.5px\",\n }}\n >\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\n {sampleSignal.probability.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\n {sampleSignal.confidence.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\n {sampleSignal.observations} observations\n </span>\n </div>\n </div>\n\n {/* Rotating chevron on right */}\n <div\n style={{\n paddingTop: \"2px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n flexShrink: 0,\n transition: \"transform 0.2s ease\",\n }}\n >\n <ChevronDown\n size={18}\n style={{\n transform: isExpanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\n transition: \"transform 0.2s ease\",\n }}\n />\n </div>\n </div>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div\n style={{\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\n background: \"rgba(244, 241, 230, 0.25)\",\n padding: \"16px 16px 16px 21px\",\n }}\n >\n <div\n style={{\n fontSize: \"10px\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(30, 33, 37, 0.52)\",\n marginBottom: \"8px\",\n }}\n >\n Contributing Observations\n </div>\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\n [Observations would appear here]\n </div>\n </div>\n )}\n </div>\n );\n }\n\n // directional-chevron (current SignalCard pattern)\n return (\n <div\n style={{\n position: \"relative\",\n background: \"rgba(255, 255, 255, 0.82)\",\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\n borderRadius: \"12px\",\n overflow: \"hidden\",\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\n }}\n >\n {/* Left rail */}\n <div\n style={{\n position: \"absolute\",\n left: 0,\n top: 0,\n bottom: 0,\n width: \"5px\",\n background: \"#6B7C93\",\n opacity: 0.6,\n }}\n />\n\n {/* Header - Clickable */}\n <button\n type=\"button\"\n onClick={() => setIsExpanded(!isExpanded)}\n style={{\n width: \"100%\",\n padding: \"14px 16px 14px 21px\",\n background: \"transparent\",\n border: \"none\",\n cursor: \"pointer\",\n textAlign: \"left\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: \"12px\",\n transition: \"background 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n }}\n >\n {/* Directional chevron on left */}\n <div\n style={{\n paddingTop: \"2px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n flexShrink: 0,\n }}\n >\n {isExpanded ? (\n <ChevronDown size={16} />\n ) : (\n <ChevronRight size={16} />\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ marginBottom: \"4px\" }}>\n <span\n style={{\n fontSize: \"13px\",\n fontWeight: 680,\n color: \"rgba(30, 33, 37, 0.92)\",\n lineHeight: 1.2,\n }}\n >\n {sampleSignal.name}\n </span>\n </div>\n <div\n style={{\n fontSize: \"12px\",\n color: \"rgba(30, 33, 37, 0.65)\",\n lineHeight: 1.4,\n marginBottom: \"6px\",\n }}\n >\n {sampleSignal.description}\n </div>\n <div\n style={{\n fontSize: \"11px\",\n color: \"rgba(30, 33, 37, 0.42)\",\n fontFamily: \"ui-monospace, monospace\",\n marginBottom: \"8px\",\n }}\n >\n {sampleSignal.technicalKey}\n </div>\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n fontSize: \"11.5px\",\n }}\n >\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\n {sampleSignal.probability.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\n {sampleSignal.confidence.toFixed(2)}\n </strong>\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\n {sampleSignal.observations} observations\n </span>\n </div>\n </div>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div\n style={{\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\n background: \"rgba(244, 241, 230, 0.25)\",\n padding: \"16px 16px 16px 21px\",\n }}\n >\n <div\n style={{\n fontSize: \"10px\",\n fontWeight: 650,\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n color: \"rgba(30, 33, 37, 0.52)\",\n marginBottom: \"8px\",\n }}\n >\n Contributing Observations\n </div>\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\n [Observations would appear here]\n </div>\n </div>\n )}\n </div>\n );\n}\n\n"],"names":["STYLE_ID","ensureKeyframes","style","CoachingSynthesisCard","data","loading","error","React","jsxs","jsx","w","i","strengths","improvements","organizational","oneLiner","_a","context","_b","CoachingSection","TrendingUp","Lightbulb","Building","icon","label","color","items","item","text","quote","MessageSquareQuote","fmtDur","seconds","m","s","InteractionContext","title","meta","callPurpose","classification","dimensions","cp","cls","CardBase","dim","InteractionScores","scores","DetailCard","val","GROUP_LABELS","Target","FileText","Scale","Zap","MessageSquare","KIND_COLORS","CheckCircle","InteractionSignals","signals","expandedSignals","toggleSignal","playEvidence","timelinePlaying","currentTimeSeconds","highlightTurns","borderRadius","grouped","useMemo","result","g","groupKey","groupSignals","info","SectionLabel","name","delta","hasObs","isExpanded","e","ChevronDown","obs","oi","ev","ei","startMs","endMs","isPlayingSegment","startSec","endSec","cs","EvidenceItem","InteractionGuidance","guidance","ki","ownerBadge","sr","si","CornerDownRight","sMs","eMs","InteractionNBA","nba","r","InteractionRecording","audioUrl","timelineSegments","durationSeconds","playbackRate","onSeek","onTogglePlay","onSeekBack","onSeekForward","onSetPlaybackRate","audioRef","Timeline","InteractionTranscript","transcript","highlightedTurns","activeTurnIndex","turnObservations","setExpandedSignals","onTurnPlayPause","formatTimeRange","formatTime","ms","minutes","start","end","turns","prev","el","TranscriptCard","messageActionButtonStyle","roleColorMap","role","normalized","extractMessagesArray","node","directCandidates","candidate","flattenMessages","rawMessages","parentId","startIndex","out","index","author","authorName","initials","n","roleColor","id","baseMessage","formatTimestamp","value","d","now","sameDay","yesterday","isYesterday","timeStr","diffDays","MessageThread","sessionTitle","sessionSubtitle","threadLabel","initialMessages","messageThread","onSendMessage","onReplyMessage","onEditMessage","onDeleteMessage","onCreateNewThread","onThreadSelect","currentUser","isLoading","messageInput","setMessageInput","useState","isFocused","setIsFocused","messages","setMessages","isSending","setIsSending","hoveredMessageId","setHoveredMessageId","threads","setThreads","activeThreadId","setActiveThreadId","replyingToMessageId","setReplyingToMessageId","replyDraft","setReplyDraft","editingMessageId","setEditingMessageId","editContent","setEditContent","deleteConfirmMessage","setDeleteConfirmMessage","showNewThreadCompose","setShowNewThreadCompose","newThreadInput","setNewThreadInput","isCreatingNewThread","setIsCreatingNewThread","expandedParentIds","setExpandedParentIds","messagesEndRef","useRef","messageInputRef","normalizedRole","displayCurrentUser","canCreateNewThread","childrenByParentId","map","topLevelMessages","isChildReply","isChildEdit","hasHeader","replyingToMessage","useEffect","rawThreads","normalizedThreads","t","rawMessagesForThread","messagesForThread","firstWithMessages","flatMessages","rawFlat","mappedMessages","singleId","singleLabel","thread","container","handleNewThreadSubmit","trimmed","newId","handleNewThreadCancel","handleSend","content","optimisticId","optimisticMessage","msg","handleKeyPress","handleReplyClick","message","handleInlineReplySend","parentMessageId","optimisticReply","handleEditClick","handleEditSubmit","err","handleEditCancel","handleDeleteClick","handleDeleteConfirm","renderMessageTree","depth","children","hasChildren","isEditing","isReplying","Clock","next","ChevronRight","child","isActive","Fragment","Send","findBlock","blocks","b","InteractionDetailPanel","coachingData","coachingLoading","coachingError","onThreadSendMessage","onThreadEditMessage","onThreadDeleteMessage","onThreadCreateNewThread","threadLoading","threadCurrentUser","segmentEndHandlerRef","setHighlightedTurns","setCurrentTimeSeconds","setTimelinePlaying","setPlaybackRate","ctx","summary","_c","_d","_e","_f","_g","_h","_i","outcomeLift","_j","signal","groupInfo","tid","o","_k","startTime","endTime","isAgent","actorName","currentMs","handleTimelineSeek","handleTimelineTogglePlay","p","handleTimelineSeekBack","handleTimelineSeekForward","duration","handleSetPlaybackRate","rate","audio","updateTime","handlePlay","handlePause","handleEnded","playAudio","player","handler","handleEvidencePlayToggle","turnIds","currentSec","handleTranscriptTurnPlayPause","turn","key","_l","rightTab","setRightTab","leftSummaryRef","rightRailHeight","setRightRailHeight","useLayoutEffect","measure","h","handleThreadSend","payload","handleThreadEdit","handleThreadDelete","handleCreateNewThread","titleText","effectiveMessageThread","AgentLiftCard","Tabs","ErrorBoundary","props","InteractionDetailPanelWrapper","ExpandPatternComparison","pattern","setIsExpanded","sampleSignal"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBA6wBAgN,GAAiB,IAAI,CAA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"}
|