chordia-ui 3.3.6 → 3.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentLiftCard.cjs.js.map +1 -1
- package/dist/AgentLiftCard.es.js +3 -5
- package/dist/AgentLiftCard.es.js.map +1 -1
- package/dist/ChartRenderer.cjs.js +31 -0
- package/dist/ChartRenderer.cjs.js.map +1 -0
- package/dist/ChartRenderer.es.js +2210 -0
- package/dist/ChartRenderer.es.js.map +1 -0
- package/dist/CustomFilterChips.cjs.js.map +1 -1
- package/dist/CustomFilterChips.es.js +1 -2
- package/dist/CustomFilterChips.es.js.map +1 -1
- package/dist/FileUploadingState.cjs.js.map +1 -1
- package/dist/FileUploadingState.es.js +10 -16
- package/dist/FileUploadingState.es.js.map +1 -1
- package/dist/GettingStarted.cjs.js +2 -0
- package/dist/GettingStarted.cjs.js.map +1 -0
- package/dist/GettingStarted.es.js +983 -0
- package/dist/GettingStarted.es.js.map +1 -0
- package/dist/InlineConfirm.cjs.js +2 -0
- package/dist/InlineConfirm.cjs.js.map +1 -0
- package/dist/InlineConfirm.es.js +618 -0
- package/dist/InlineConfirm.es.js.map +1 -0
- package/dist/IntegrationCard.cjs.js.map +1 -1
- package/dist/IntegrationCard.es.js +3 -3
- package/dist/IntegrationCard.es.js.map +1 -1
- package/dist/InteractionSummaryCard.cjs.js +2 -0
- package/dist/InteractionSummaryCard.cjs.js.map +1 -0
- package/dist/InteractionSummaryCard.es.js +216 -0
- package/dist/InteractionSummaryCard.es.js.map +1 -0
- package/dist/LoginPage.cjs.js +3 -0
- package/dist/LoginPage.cjs.js.map +1 -0
- package/dist/LoginPage.es.js +2618 -0
- package/dist/LoginPage.es.js.map +1 -0
- package/dist/NavigationBar.cjs.js +2 -0
- package/dist/NavigationBar.cjs.js.map +1 -0
- package/dist/NavigationBar.es.js +762 -0
- package/dist/NavigationBar.es.js.map +1 -0
- package/dist/NotificationPanel.cjs.js +2 -0
- package/dist/NotificationPanel.cjs.js.map +1 -0
- package/dist/NotificationPanel.es.js +371 -0
- package/dist/NotificationPanel.es.js.map +1 -0
- package/dist/OverlayPanel.cjs.js +2 -0
- package/dist/OverlayPanel.cjs.js.map +1 -0
- package/dist/OverlayPanel.es.js +93 -0
- package/dist/OverlayPanel.es.js.map +1 -0
- package/dist/SectionLabel.cjs.js.map +1 -1
- package/dist/SectionLabel.es.js.map +1 -1
- package/dist/SmallButton.cjs.js.map +1 -1
- package/dist/SmallButton.es.js +16 -16
- package/dist/SmallButton.es.js.map +1 -1
- package/dist/SplitPane.cjs.js +4 -0
- package/dist/SplitPane.cjs.js.map +1 -0
- package/dist/SplitPane.es.js +1531 -0
- package/dist/SplitPane.es.js.map +1 -0
- package/dist/SummarySection.cjs.js.map +1 -1
- package/dist/SummarySection.es.js +9 -11
- package/dist/SummarySection.es.js.map +1 -1
- package/dist/SummaryStatsPanel.cjs.js +2 -0
- package/dist/SummaryStatsPanel.cjs.js.map +1 -0
- package/dist/SummaryStatsPanel.es.js +1027 -0
- package/dist/SummaryStatsPanel.es.js.map +1 -0
- package/dist/TextInput.cjs.js.map +1 -1
- package/dist/TextInput.es.js.map +1 -1
- package/dist/Timeline.cjs.js.map +1 -1
- package/dist/Timeline.es.js +8 -14
- package/dist/Timeline.es.js.map +1 -1
- package/dist/Tooltip.cjs.js +1 -1
- package/dist/Tooltip.cjs.js.map +1 -1
- package/dist/Tooltip.es.js +20 -31
- package/dist/Tooltip.es.js.map +1 -1
- package/dist/TourGuideTooltip.cjs.js.map +1 -1
- package/dist/TourGuideTooltip.es.js +1 -2
- package/dist/TourGuideTooltip.es.js.map +1 -1
- package/dist/UpdatedInteractionDetails.cjs.js +11 -0
- package/dist/UpdatedInteractionDetails.cjs.js.map +1 -0
- package/dist/UpdatedInteractionDetails.es.js +1310 -0
- package/dist/UpdatedInteractionDetails.es.js.map +1 -0
- package/dist/UpdatedInteractionRecording.cjs.js.map +1 -1
- package/dist/UpdatedInteractionRecording.es.js +4 -7
- package/dist/UpdatedInteractionRecording.es.js.map +1 -1
- package/dist/UploadInteraction.cjs.js.map +1 -1
- package/dist/UploadInteraction.es.js.map +1 -1
- package/dist/{style.css → chordia-ui.css} +1 -1
- package/dist/components/UpdatedInteractionDetails.cjs.js +1 -10
- package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.es.js +9 -1292
- package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
- package/dist/components/chat.cjs.js +1 -30
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +7 -2222
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/common.cjs.js +1 -1
- package/dist/components/common.es.js +25 -32
- package/dist/components/common.es.js.map +1 -1
- package/dist/components/data.cjs.js +1 -1
- package/dist/components/data.cjs.js.map +1 -1
- package/dist/components/data.es.js +4 -1033
- package/dist/components/data.es.js.map +1 -1
- package/dist/components/layout.cjs.js +1 -3
- package/dist/components/layout.cjs.js.map +1 -1
- package/dist/components/layout.es.js +8 -1533
- package/dist/components/layout.es.js.map +1 -1
- package/dist/components/login.cjs.js +1 -1
- package/dist/components/login.es.js +2 -6
- package/dist/components/login.es.js.map +1 -1
- package/dist/components/media.cjs.js +1 -1
- package/dist/components/media.cjs.js.map +1 -1
- package/dist/components/media.es.js +6 -220
- package/dist/components/media.es.js.map +1 -1
- package/dist/components/models.cjs.js +1 -1
- package/dist/components/models.cjs.js.map +1 -1
- package/dist/components/models.es.js +2 -91
- package/dist/components/models.es.js.map +1 -1
- package/dist/components/navigation.cjs.js +1 -1
- package/dist/components/navigation.cjs.js.map +1 -1
- package/dist/components/navigation.es.js +7 -766
- package/dist/components/navigation.es.js.map +1 -1
- package/dist/components/notifications.cjs.js +1 -1
- package/dist/components/notifications.cjs.js.map +1 -1
- package/dist/components/notifications.es.js +3 -368
- package/dist/components/notifications.es.js.map +1 -1
- package/dist/components/onboarding.cjs.js +1 -1
- package/dist/components/onboarding.cjs.js.map +1 -1
- package/dist/components/onboarding.es.js +7 -986
- package/dist/components/onboarding.es.js.map +1 -1
- package/dist/components/primitives.cjs.js +1 -1
- package/dist/components/primitives.cjs.js.map +1 -1
- package/dist/components/primitives.es.js +25 -635
- package/dist/components/primitives.es.js.map +1 -1
- package/dist/debugger-wc.cjs.js +4 -4
- package/dist/debugger-wc.cjs.js.map +1 -1
- package/dist/debugger-wc.es.js +11 -15
- package/dist/debugger-wc.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs2.js +49 -2
- package/dist/index.cjs2.js.map +1 -1
- package/dist/index.es.js +99 -104
- package/dist/index.es.js.map +1 -1
- package/dist/index.es2.js +1781 -2119
- 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 +47 -70
- package/dist/pages/interactionDetails.es.js.map +1 -1
- package/dist/sortable.esm.cjs.js +1 -1
- package/dist/sortable.esm.cjs.js.map +1 -1
- package/dist/sortable.esm.es.js +53 -55
- package/dist/sortable.esm.es.js.map +1 -1
- package/package.json +1 -1
- package/src/components/UpdatedInteractionDetails/UpdatedCompassScore.jsx +52 -27
- package/src/components/login/LoginPage.jsx +607 -5
- package/src/components/onboarding/GettingStarted.jsx +1 -2
- package/dist/colors.cjs.js +0 -2
- package/dist/colors.cjs.js.map +0 -1
- package/dist/colors.es.js +0 -2
- package/dist/colors.es.js.map +0 -1
- package/dist/index.cjs3.js +0 -50
- package/dist/index.cjs3.js.map +0 -1
- package/dist/index.es3.js +0 -1944
- package/dist/index.es3.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentLiftCard.cjs.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentLiftCard.cjs.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":"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"}
|
package/dist/AgentLiftCard.es.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as t, jsxs as r } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
3
|
import { UserCheck as x, User as v, Pause as m, Play as y, ScrollText as u, TrendingUp as z } from "lucide-react";
|
|
4
|
-
import { S as g,
|
|
4
|
+
import { S as g, D as S, T as _ } from "./SmallButton.es.js";
|
|
5
5
|
function b(e) {
|
|
6
6
|
return `${Math.floor(e / 6e4)}:${String(Math.floor(e % 6e4 / 1e3)).padStart(2, "0")}`;
|
|
7
7
|
}
|
|
@@ -53,11 +53,9 @@ function B({ ev: e, onPlay: a, onHighlight: d, isPlaying: n }) {
|
|
|
53
53
|
}
|
|
54
54
|
function I({ outcomeLift: e }) {
|
|
55
55
|
var p, h;
|
|
56
|
-
if (e.lift == null)
|
|
57
|
-
return null;
|
|
56
|
+
if (e.lift == null) return null;
|
|
58
57
|
const a = e.p_expected, d = e.p_full, n = e.lift_raw ?? (d != null && a != null ? d - a : null), l = e.lift, o = (i) => i != null ? Math.round(i * 100) + "%" : "—", f = (i) => {
|
|
59
|
-
if (i == null)
|
|
60
|
-
return "—";
|
|
58
|
+
if (i == null) return "—";
|
|
61
59
|
const s = (i * 100).toFixed(1);
|
|
62
60
|
return i > 0 ? `+${s}pp` : `${s}pp`;
|
|
63
61
|
}, c = (i) => i > 0 ? "var(--state-present)" : i < 0 ? "#f87171" : "var(--text-muted)";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentLiftCard.es.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":";;;;AAIA,SAASA,EAAMC,GAAI;AACjB,SAAO,GAAG,KAAK,MAAMA,IAAK,GAAK,CAAC,IAAI,OAAO,KAAK,MAAOA,IAAK,MAAS,GAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAC9F;AAEA,SAAwBC,EAAa,EAAE,IAAAC,GAAI,QAAAC,GAAQ,aAAAC,GAAa,WAAAC,KAAa;;AAC3E,QAAMC,IAAQJ,EAAG,UAAU,UAAW,gBAAAK,EAAAC,GAAA,EAAU,MAAM,GAAI,CAAA,IAAK,gBAAAD,EAACE,GAAK,EAAA,MAAM,GAAI,CAAA;AAE7E,SAAA,gBAAAC,EAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IAAkB,SAAS;AAAA,IAAY,cAAc;AAAA,IAC/D,YAAY;AAAA,IAAyB,QAAQ;AAAA,IAA2B,WAAW;AAAA,EAEnF,GAAA,UAAA;AAAA,IAAC,gBAAAA,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,cAAc,EAAA,GACzE,UAAA;AAAA,MAAA,gBAAAH,EAAC,UAAK,OAAO,EAAE,OAAO,uBAAwB,UAAMD,GAAA;AAAA,MACnDJ,EAAG,UAAW,gBAAAK,EAAA,QAAA,EAAK,OAAO,EAAE,OAAO,qBAAqB,YAAY,IAAQ,GAAA,UAAAL,EAAG,OAAO,CAAA;AAAA,MACtF,gBAAAQ,EAAA,QAAA,EAAK,OAAO,EAAE,YAAY,QAAQ,SAAS,QAAQ,KAAK,GAAG,YAAY,SAAA,GACrE,UAAA;AAAA,QAAAR,EAAG,YAAY,QACd,gBAAAK;AAAA,UAACI;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,SAAS,MAAMR,EAAOD,EAAG,UAAUA,EAAG,MAAM;AAAA,YAC5C,OAAOG,IAAY,gBAAgB;AAAA,YACnC,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,SAAS;AAAA,cACT,UAAU;AAAA,cACV,YAAYA,IACR,mCACA;AAAA,cACJ,QAAQA,IACJ,SACA;AAAA,cACJ,OAAOA,IAAY,SAAS;AAAA,YAC9B;AAAA,YAEC,UAAYA,IAAA,gBAAAE,EAACK,GAAM,EAAA,MAAM,IAAI,IAAK,gBAAAL,EAACM,GAAK,EAAA,MAAM,IAAI,OAAO,EAAE,YAAY,OAAO;AAAA,UAAA;AAAA,QACjF;AAAA,UAEDC,IAAAZ,EAAG,aAAH,gBAAAY,EAAa,UAAS,uBACpBH,GAAY,EAAA,SAAQ,SAAQ,MAAK,MAAK,SAAS,MAAMP,EAAYF,EAAG,QAAQ,GAAG,OAAM,sBAAqB,UAAC,gBAAAK,EAAAQ,GAAA,EAAW,MAAM,GAAA,CAAI,EAAE,CAAA;AAAA,QAEpIb,EAAG,YAAY,QACd,gBAAAK,EAAC,UAAK,OAAO,EAAE,UAAU,kBAAkB,OAAO,oBAAoB,GAAI,UAAMR,EAAAG,EAAG,QAAQ,GAAE;AAAA,MAAA,GAEjG;AAAA,IAAA,GACF;AAAA,IACA,gBAAAQ,EAAC,OAAI,EAAA,OAAO,EAAE,OAAO,oBAAoB,WAAW,UAAU,YAAY,IAAA,GAAO,UAAA;AAAA,MAAA;AAAA,OAAGR,EAAG,QAAQ,IAAI,MAAM,GAAG,GAAG;AAAA,MAAE;AAAA,IAAA,GAAC;AAAA,EACpH,EAAA,CAAA;AAEJ;ACjDwB,SAAAc,EAAc,EAAE,aAAAC,KAAe;;AACrD,MAAIA,EAAY,QAAQ;AAAa,WAAA;AAErC,QAAMC,IAAYD,EAAY,YACxBE,IAAQF,EAAY,QACpBG,IAAUH,EAAY,aAAaE,KAAS,QAAQD,KAAa,OAAOC,IAAQD,IAAY,OAC5FG,IAAiBJ,EAAY,MAE7BK,IAAS,CAACC,MAAMA,KAAK,OAAO,KAAK,MAAMA,IAAI,GAAG,IAAI,MAAM,KACxDC,IAAQ,CAACD,MAAM;AACnB,QAAIA,KAAK;AAAa,aAAA;AACtB,UAAME,KAAMF,IAAI,KAAK,QAAQ,CAAC;AAC9B,WAAOA,IAAI,IAAI,IAAIE,CAAE,OAAO,GAAGA,CAAE;AAAA,EAAA,GAG7BC,IAAY,CAACH,MACjBA,IAAI,IAAI,yBAAyBA,IAAI,IAAI,YAAY;AAEvD,SACG,gBAAAb,EAAAiB,GAAA,EAAW,OACV,gBAAAjB,EAAC,OAAI,EAAA,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EACxD,GAAA,UAAA;AAAA,IAAC,gBAAAH,EAAAqB,GAAA,EAAW,MAAM,GAAI,CAAA;AAAA,IAAE;AAAA,EAAA,EAC1B,CAAA,GAGA,UAAA;AAAA,IAAC,gBAAAlB,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,cAAc,GAAA,GAEzE,UAAA;AAAA,MAAA,gBAAAA,EAAC,SAAI,OAAO,EAAE,WAAW,UAAU,MAAM,EACvC,GAAA,UAAA;AAAA,QAAA,gBAAAH,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,oBAAoB,GACrE,UAAOe,EAAAJ,CAAS,EACnB,CAAA;AAAA,QACA,gBAAAX,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,OAAO,qBAAqB,WAAW,EAAE,GAAG,UAAgB,mBAAA,CAAA;AAAA,QACxF,gBAAAA,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,GAAG,OAAO,qBAAqB,WAAW,EAAE,GAAG,UAA+B,kCAAA,CAAA;AAAA,MAAA,GACxG;AAAA,MAGA,gBAAAA,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,OAAO,qBAAqB,YAAY,IAAI,GAAG,UAAC,IAAA,CAAA;AAAA,MAG5E,gBAAAG,EAAC,SAAI,OAAO,EAAE,WAAW,UAAU,MAAM,EACvC,GAAA,UAAA;AAAA,QAAA,gBAAAH,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAOmB,EAAUN,CAAO,EAClE,GAAA,UAAAI,EAAMJ,CAAO,GAChB;AAAA,QACA,gBAAAb,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,OAAO,qBAAqB,WAAW,EAAE,GAAG,UAAY,eAAA,CAAA;AAAA,QACpF,gBAAAA,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,GAAG,OAAO,qBAAqB,WAAW,EAAE,GAAG,UAAsB,yBAAA,CAAA;AAAA,MAAA,GAC/F;AAAA,MAGA,gBAAAA,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,OAAO,qBAAqB,YAAY,IAAI,GAAG,UAAC,IAAA,CAAA;AAAA,MAG5E,gBAAAG,EAAC,SAAI,OAAO,EAAE,WAAW,UAAU,MAAM,EACvC,GAAA,UAAA;AAAA,QAAA,gBAAAH,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,YAAY,KAAK,OAAO,kBAAkB,GACnE,UAAOe,EAAAH,CAAK,EACf,CAAA;AAAA,QACA,gBAAAZ,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,IAAI,OAAO,qBAAqB,WAAW,EAAE,GAAG,UAAiB,oBAAA,CAAA;AAAA,QACzF,gBAAAA,EAAC,OAAI,EAAA,OAAO,EAAE,UAAU,GAAG,OAAO,qBAAqB,WAAW,EAAE,GAAG,UAAoB,uBAAA,CAAA;AAAA,MAAA,GAC7F;AAAA,IAAA,GACF;AAAA,IAGA,gBAAAG,EAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,KAAK;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,IAEd,GAAA,UAAA;AAAA,MAAC,gBAAAH,EAAA,QAAA,EAAK,OAAO,EAAE,UAAU,IAAI,OAAO,oBAAA,GAAuB,UAAkB,qBAAA,CAAA;AAAA,MAC7E,gBAAAG,EAAC,UAAK,OAAO;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAOgB,EAAUL,CAAc;AAAA,QAC/B,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,MAEJ,GAAA,UAAA;AAAA,QAAAG,EAAMH,CAAc;AAAA,0BACpB,OAAI,EAAA,OAAM,MAAK,QAAO,KACpB,UAAiBA,IAAA,IACf,gBAAAd,EAAA,QAAA,EAAK,GAAE,oBAAmB,MAAK,wBAAuB,IACrDc,IAAiB,IACnB,gBAAAd,EAAC,QAAK,EAAA,GAAE,oBAAmB,MAAK,UAAU,CAAA,IAE1C,gBAAAA,EAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,KAAI,QAAO,KAAI,MAAK,oBAAoB,CAAA,GAEtE;AAAA,MAAA,GACF;AAAA,QACCO,IAAAG,EAAY,mBAAZ,gBAAAH,EAA4B,cAC3B,gBAAAP,EAAC,UAAK,OAAO;AAAA,QACX,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAOmB,EAAUL,CAAc;AAAA,QAC/B,eAAe;AAAA,MAAA,GAEd,UAAYJ,EAAA,eAAe,UAAU,QAAQ,MAAM,GAAG,GACzD;AAAA,IAAA,GAEJ;AAAA,MAGCY,IAAAZ,EAAY,uBAAZ,gBAAAY,EAAgC,UAAS,uBACvC,OACC,EAAA,UAAA;AAAA,MAAA,gBAAAtB,EAAC,SAAI,OAAO,EAAE,UAAU,GAAG,YAAY,KAAK,OAAO,qBAAqB,cAAc,GAAG,eAAe,aAAa,eAAe,YAAY,UAEhJ,eAAA;AAAA,MACC,gBAAAA,EAAA,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,KACnD,UAAAU,EAAY,mBAAmB,IAAI,CAACa,GAAKC,MACvC,gBAAAxB,EAAAyB,GAAA,EAAY,SAAQ,WAAU,MAAK,MACjC,YAAI,QAAQ,UAAU,EAAE,EAAE,QAAQ,MAAM,GAAG,KADpCD,CAEV,CACD,GACH;AAAA,IAAA,GACF;AAAA,EAEJ,EAAA,CAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"AgentLiftCard.es.js","sources":["../src/components/common/EvidenceItem.jsx","../src/components/common/AgentLiftCard.jsx"],"sourcesContent":["import React from 'react';\nimport { User, UserCheck, Play, Pause, ScrollText } from 'lucide-react';\nimport SmallButton from '../primitives/SmallButton.jsx';\n\nfunction fmtMs(ms) {\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\n}\n\nexport default function EvidenceItem({ ev, onPlay, onHighlight, isPlaying }) {\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\n return (\n <div style={{\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\n {ev.start_ms != null && (\n <SmallButton\n variant=\"primary\"\n size=\"sm\"\n onClick={() => onPlay(ev.start_ms, ev.end_ms)}\n title={isPlaying ? 'Pause audio' : 'Play audio'}\n style={{\n width: 24,\n height: 24,\n borderRadius: '50%',\n padding: 0,\n minWidth: 24,\n background: isPlaying\n ? 'var(--rail-discovery, #5E88B0)'\n : 'var(--paper, rgba(255,255,255,0.78))',\n border: isPlaying\n ? 'none'\n : '1px solid var(--border, rgba(52,58,64,0.12))',\n color: isPlaying ? '#fff' : 'var(--text-muted)',\n }}\n >\n {isPlaying ? <Pause size={10} /> : <Play size={10} style={{ marginLeft: 0.5 }} />}\n </SmallButton>\n )}\n {ev.turn_ids?.length > 0 && (\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\n )}\n {ev.start_ms != null && (\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\n )}\n </span>\n </div>\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\n </div>\n );\n}\n","import React from 'react';\nimport { TrendingUp } from 'lucide-react';\nimport DetailCard from '../primitives/DetailCard.jsx';\nimport Tag from '../primitives/Tag.jsx';\n\nexport default function AgentLiftCard({ outcomeLift }) {\n if (outcomeLift.lift == null) return null;\n\n const pExpected = outcomeLift.p_expected;\n const pFull = outcomeLift.p_full;\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\n const liftRecentered = outcomeLift.lift;\n\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\n const fmtPp = (v) => {\n if (v == null) return '—';\n const pp = (v * 100).toFixed(1);\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\n };\n\n const liftColor = (v) =>\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\n\n return (\n <DetailCard title={\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <TrendingUp size={12} /> Agent Lift Analysis\n </div>\n }>\n {/* Main equation row: Baseline + Impact = Outcome */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\n {/* Call Difficulty Baseline */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\n {fmtPct(pExpected)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\n </div>\n\n {/* Plus sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\n\n {/* Agent Impact (raw lift) */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\n {fmtPp(liftRaw)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\n </div>\n\n {/* Equals sign */}\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\n\n {/* Agent Outcome */}\n <div style={{ textAlign: 'center', flex: 1 }}>\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\n {fmtPct(pFull)}\n </div>\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\n </div>\n </div>\n\n {/* Recentered lift — the \"so what\" */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n padding: '8px 12px',\n borderRadius: 6,\n background: 'var(--surface-raised, #f5f5f5)',\n marginBottom: 12,\n }}>\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\n <span style={{\n fontSize: 14,\n fontWeight: 700,\n color: liftColor(liftRecentered),\n display: 'flex',\n alignItems: 'center',\n gap: 4,\n }}>\n {fmtPp(liftRecentered)}\n <svg width=\"10\" height=\"7\">\n {liftRecentered > 0 ? (\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\n ) : liftRecentered < 0 ? (\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\n ) : (\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\n )}\n </svg>\n </span>\n {outcomeLift.interpretation?.lift_band && (\n <span style={{\n fontSize: 9,\n fontWeight: 600,\n color: liftColor(liftRecentered),\n textTransform: 'capitalize',\n }}>\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\n </span>\n )}\n </div>\n\n {/* Key Drivers */}\n {outcomeLift.driver_signal_keys?.length > 0 && (\n <div>\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\n Key Drivers\n </div>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {outcomeLift.driver_signal_keys.map((key, i) => (\n <Tag key={i} variant=\"default\" size=\"xs\">\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\n </Tag>\n ))}\n </div>\n </div>\n )}\n </DetailCard>\n );\n}\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","isPlaying","actor","jsx","UserCheck","User","jsxs","SmallButton","Pause","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),h=require("react"),D=require("lucide-react"),g=require("recharts"),ae=({content:f,onCodeBlockClick:y,onFilePathClick:b})=>{const[v,a]=h.useState(new Set),j=async(s,n)=>{try{await navigator.clipboard.writeText(s),a(t=>new Set([...t,n])),setTimeout(()=>{a(t=>{const r=new Set(t);return r.delete(n),r})},2e3)}catch(t){console.error("Failed to copy text:",t)}},L=(s,n,t)=>{const r=v.has(t);return e.jsxs("div",{style:{position:"relative",marginBottom:"16px",borderRadius:"8px",background:"var(--ink, #1E2125)",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",overflow:"hidden"},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 12px",background:"rgba(255,255,255,0.05)",borderBottom:"1px solid rgba(255,255,255,0.1)"},children:[e.jsx("span",{style:{fontSize:"11px",color:"rgba(255,255,255,0.7)",fontFamily:"var(--font-mono, monospace)",textTransform:"uppercase",letterSpacing:"0.05em"},children:n||"code"}),e.jsxs("button",{onClick:()=>j(s,t),style:{background:"none",border:"none",color:"rgba(255,255,255,0.7)",cursor:"pointer",padding:"4px",borderRadius:"4px",display:"flex",alignItems:"center",gap:"4px",fontSize:"11px",transition:"all 0.15s ease"},onMouseEnter:d=>{d.target.style.background="rgba(255,255,255,0.1)",d.target.style.color="rgba(255,255,255,0.9)"},onMouseLeave:d=>{d.target.style.background="none",d.target.style.color="rgba(255,255,255,0.7)"},children:[r?e.jsx(D.Check,{size:12}):e.jsx(D.Copy,{size:12}),r?"Copied!":"Copy"]}),y&&e.jsxs("button",{onClick:()=>y({code:s,language:n}),style:{background:"none",border:"none",color:"rgba(255,255,255,0.7)",cursor:"pointer",padding:"4px",borderRadius:"4px",display:"flex",alignItems:"center",gap:"4px",fontSize:"11px",transition:"all 0.15s ease"},onMouseEnter:d=>{d.currentTarget.style.background="rgba(255,255,255,0.1)",d.currentTarget.style.color="rgba(255,255,255,0.9)"},onMouseLeave:d=>{d.currentTarget.style.background="none",d.currentTarget.style.color="rgba(255,255,255,0.7)"},children:[e.jsx(D.PanelRightOpen,{size:12}),"Canvas"]})]}),e.jsx("pre",{style:{margin:0,padding:"12px",fontFamily:"var(--font-mono, monospace)",fontSize:"13px",lineHeight:1.4,color:"rgba(255,255,255,0.95)",overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:s})]},t)},w=s=>{const n=[],t=s.split(`
|
|
2
|
+
`);let r=0,d=0;for(;r<t.length;){const p=t[r];if(p.trim().startsWith("```")){const c=p.trim().slice(3);let C=[];for(r++;r<t.length&&!t[r].trim().startsWith("```");)C.push(t[r]),r++;r<t.length&&r++,n.push(L(C.join(`
|
|
3
|
+
`),c,`code-${d++}`));continue}if(p.startsWith("#")){const c=p.match(/^#+/)[0].length,C=p.slice(c).trim(),z=c===1?"h2":c===2?"h3":c===3?"h4":"h5";n.push(h.createElement(z,{key:`header-${r}`,style:{fontSize:c===1?"18px":c===2?"16px":"14px",fontWeight:720,color:"var(--text-strong, rgba(30,33,37,0.92))",marginTop:n.length>0?"20px":"0",marginBottom:"8px",lineHeight:1.3}},C)),r++;continue}if(p.trim()==="---"||p.trim()==="***"){n.push(e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",margin:"16px 0"}},`hr-${r}`)),r++;continue}if(p.match(/^(\s*)([-*+]|\d+\.)\s/)){const c=[],C=/^\s*\d+\./.test(p);for(;r<t.length&&(t[r].match(/^(\s*)([-*+]|\d+\.)\s/)||t[r].trim()==="");){if(t[r].trim()!==""){const R=t[r].match(/^(\s*)([-*+]|\d+\.)\s(.*)$/);R&&c.push(R[3])}r++}const z=C?"ol":"ul";n.push(h.createElement(z,{key:`list-${r}`,style:{margin:"8px 0",paddingLeft:"20px",color:"var(--text-strong, rgba(30,33,37,0.92))"}},c.map((R,o)=>h.createElement("li",{key:`item-${o}`,style:{marginBottom:"4px"}},l(R)))));continue}if(p.trim().startsWith("|")&&p.trim().endsWith("|")){const c=[];for(;r<t.length&&t[r].trim().startsWith("|")&&t[r].trim().endsWith("|");)c.push(t[r]),r++;if(c.length>=2){const C=i=>i.trim().slice(1,-1).split("|").map(u=>u.trim()),z=C(c[0]),R=i=>C(i).every(u=>/^[-:]+$/.test(u)),o=c.length>=2&&R(c[1]),k=o?2:1,M=o?C(c[1]).map(i=>i.startsWith(":")&&i.endsWith(":")?"center":i.endsWith(":")?"right":"left"):z.map(()=>"left"),T={padding:"6px 12px",borderBottom:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",fontSize:"13px",lineHeight:1.5,color:"var(--text-strong, rgba(30,33,37,0.92))"};n.push(e.jsx("div",{style:{overflowX:"auto",margin:"8px 0"},children:e.jsxs("table",{style:{borderCollapse:"collapse",width:"100%",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:"6px",overflow:"hidden"},children:[o&&e.jsx("thead",{children:e.jsx("tr",{style:{background:"var(--hover-warm-subtle, rgba(231,212,162,0.08))"},children:z.map((i,u)=>e.jsx("th",{style:{...T,fontWeight:660,textAlign:M[u]||"left",whiteSpace:"nowrap"},children:l(i)},u))})}),e.jsx("tbody",{children:(o?c.slice(k):c).map((i,u)=>e.jsx("tr",{style:{background:u%2===1?"var(--hover-warm-subtle, rgba(231,212,162,0.04))":"transparent"},children:C(i).map((I,S)=>e.jsx("td",{style:{...T,textAlign:M[S]||"left"},children:l(I)},S))},u))})]})},`table-${r}`))}continue}if(p.trim()){const c=[];for(;r<t.length&&t[r].trim()&&!t[r].match(/^(#|```|---|\*\*\*|(\s*)([-*+]|\d+\.)\s)/)&&!(t[r].trim().startsWith("|")&&t[r].trim().endsWith("|"));)c.push(t[r]),r++;c.length>0&&n.push(e.jsx("p",{style:{margin:"8px 0",lineHeight:1.6,color:"var(--text-strong, rgba(30,33,37,0.92))"},children:l(c.join(" "))},`p-${r}`))}else r++}return n},m=s=>{const n=[];let t=s,r=0;for(;t.length>0;){if(b){const R=t.match(/^([^\s`*\[]+(?:\/src\/|\/components\/|\/packages\/)[^\s`*\[]*|[^\s`*\[]*\.(ts|tsx|js|jsx|py|css|scss|sass|json|md|yaml|yml|html|xml|sh|sql|go|rs|php|java|c|cpp|h|hpp)(?:\b|$))/);if(R){const o=R[1];n.push(e.jsx("span",{onClick:()=>b(o),style:{color:"var(--rail-discovery, #5E88B0)",textDecoration:"underline",textDecorationStyle:"dotted",textUnderlineOffset:"2px",cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:"13px",transition:"all 0.15s ease",":hover":{background:"var(--hover-warm-subtle, rgba(231,212,162,0.08))",textDecoration:"underline",textDecorationStyle:"solid"}},onMouseEnter:k=>{k.target.style.background="var(--hover-warm-subtle, rgba(231,212,162,0.08))",k.target.style.textDecorationStyle="solid"},onMouseLeave:k=>{k.target.style.background="none",k.target.style.textDecorationStyle="dotted"},children:o},`file-path-${r++}`)),t=t.slice(R[0].length);continue}}const d=t.match(/^`([^`]+)`/);if(d){n.push(e.jsx("code",{style:{background:"var(--hover-warm-subtle, rgba(231,212,162,0.08))",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:"3px",padding:"2px 4px",fontFamily:"var(--font-mono, monospace)",fontSize:"12px",color:"var(--text-strong, rgba(30,33,37,0.92))"},children:d[1]},`inline-code-${r++}`)),t=t.slice(d[0].length);continue}const p=t.match(/^\*\*([^*]+)\*\*/);if(p){n.push(e.jsx("strong",{style:{fontWeight:720,color:"var(--text-strong, rgba(30,33,37,0.92))"},children:p[1]},`bold-${r++}`)),t=t.slice(p[0].length);continue}const c=t.match(/^\*([^*]+)\*/);if(c){n.push(e.jsx("em",{style:{fontStyle:"italic",color:"var(--text-strong, rgba(30,33,37,0.92))"},children:c[1]},`italic-${r++}`)),t=t.slice(c[0].length);continue}const C=t.match(/^\[([^\]]+)\]\(([^)]+)\)/);if(C){n.push(e.jsx("a",{href:C[2],target:"_blank",rel:"noopener noreferrer",style:{color:"var(--rail-discovery, #5E88B0)",textDecoration:"underline",textUnderlineOffset:"2px"},children:C[1]},`link-${r++}`)),t=t.slice(C[0].length);continue}const z=t.search(/[`*\[]/);if(z===-1){n.push(t);break}else z===0?(n.push(t[0]),t=t.slice(1)):(n.push(t.slice(0,z)),t=t.slice(z))}return n.length===1&&typeof n[0]=="string"?n[0]:n},l=s=>m(s);return e.jsx("div",{children:w(f)})};function re({role:f,content:y,html:b,timestamp:v,toolBadges:a,isStreaming:j,onCodeBlockClick:L,onFilePathClick:w}){const m=f==="user";return e.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:m?"flex-end":"flex-start",marginBottom:"16px",maxWidth:"100%"},children:[e.jsxs("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginBottom:"6px",fontWeight:650,letterSpacing:"0.02em"},children:[m?"You":"Chordia",j&&!m&&e.jsx("span",{style:{marginLeft:"6px",color:"var(--rail-purple, #9B7AA8)"},children:"●"})]}),a&&a.length>0&&e.jsx("div",{style:{marginBottom:"8px",display:"flex",flexWrap:"wrap",gap:"4px",maxWidth:"75%"},children:a.map((l,s)=>e.jsxs("span",{style:{display:"inline-block",fontSize:"11px",padding:"2px 8px",borderRadius:"6px",background:"var(--paper-elevated, rgba(255,255,255,0.82))",border:`1px solid ${l.pending?"var(--rail-discovery, #5A8CC0)":l.success!==!1?"var(--state-present, #5CB85C)":"var(--rail-signal-churn, #C98A5A)"}`,color:l.pending?"var(--rail-discovery, #5A8CC0)":l.success!==!1?"var(--state-present, #5CB85C)":"var(--rail-signal-churn, #C98A5A)"},children:[e.jsx(D.Wrench,{size:10,style:{marginRight:3,verticalAlign:"middle"}}),l.name,l.pending?"...":l.success!==!1?" ✓":" ✗"]},l.id||s))}),e.jsx("div",{style:{maxWidth:"75%",padding:"12px 16px",borderRadius:"var(--radius-lg, 12px)",background:m?"var(--card-customer, rgba(94,136,176,0.08))":"var(--paper-elevated, rgba(255,255,255,0.82))",border:m?"1px solid var(--border-subtle, rgba(52,58,64,0.08))":"1px solid var(--border, rgba(52,58,64,0.12))",fontSize:"var(--text-base, 14px)",lineHeight:1.6,color:"var(--text-strong, rgba(30,33,37,0.92))",wordBreak:"break-word"},children:b?e.jsx("div",{dangerouslySetInnerHTML:{__html:b}}):m?e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:y}):e.jsx(ae,{content:y||"",onCodeBlockClick:L,onFilePathClick:w})}),v&&e.jsx("div",{style:{fontSize:"var(--text-xs-plus, 10.5px)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginTop:"4px",fontFamily:"var(--font-mono, monospace)"},children:v})]})}function se({phase:f="thinking",toolSteps:y=[],label:b,elapsedMs:v,compact:a=!1}){const j=t=>{if(!t||t<1e3)return null;const r=Math.floor(t/1e3);if(r<60)return`${r}s`;const d=Math.floor(r/60),p=r%60;return p>0?`${d}m ${p}s`:`${d}m`},L=()=>{if(b)return b;switch(f){case"thinking":return"Thinking...";case"tool":return null;case"responding":return"Responding...";default:return"Thinking..."}},w=(t,r)=>{const d=()=>{const c={width:a?"4px":"6px",height:a?"4px":"6px",borderRadius:"50%",display:"inline-block",marginRight:a?"6px":"8px"};switch(t.status){case"active":return e.jsx("span",{style:{...c,backgroundColor:"var(--rail-purple, #9B7AA8)",animation:"pulse 1.2s ease-in-out infinite"}});case"done":return e.jsx("span",{style:{...c,backgroundColor:"var(--text-xfaint, rgba(30,33,37,0.28))"}});case"error":return e.jsx("span",{style:{...c,backgroundColor:"var(--rail-compliance, #C98A5A)"}});default:return e.jsx("span",{style:{...c,backgroundColor:"var(--text-xfaint, rgba(30,33,37,0.28))"}})}},p=()=>{switch(t.status){case"done":return e.jsx("span",{style:{color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:a?"9px":"var(--text-xs-plus, 10.5px)"},children:"✓"});case"error":return e.jsx("span",{style:{color:"var(--rail-compliance, #C98A5A)",fontSize:a?"9px":"var(--text-xs-plus, 10.5px)"},children:"failed"});default:return null}};return e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:a?"2px":"4px"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center"},children:[d(),e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:a?"9px":"var(--text-xs-plus, 10.5px)",color:"var(--text-muted)"},children:t.name})]}),p()]},r)},m=()=>e.jsx("div",{style:{width:"100%",height:a?"2px":"3px",backgroundColor:"var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:a?"2px":"3px",overflow:"hidden",position:"relative"},children:e.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,background:"linear-gradient(90deg, transparent 0%, rgba(155,122,168,0.3) 50%, transparent 100%)",animation:"shimmer 2s linear infinite"}})}),l=()=>e.jsx("span",{style:{width:a?"4px":"6px",height:a?"10px":"14px",backgroundColor:"var(--rail-purple, #9B7AA8)",borderRadius:"1px",display:"inline-block",marginLeft:"2px",animation:"cursorBlink 0.8s ease-in-out infinite"}}),s=L(),n=j(v);return e.jsxs("div",{style:{borderLeft:`${a?"3px":"4px"} solid var(--rail-purple, #9B7AA8)`,backgroundColor:"var(--card-assistant, rgba(155,122,168,0.06))",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:a?"8px":"10px",padding:a?"8px 10px 8px 12px":"10px 14px 10px 18px"},children:[e.jsx("style",{children:`
|
|
4
|
+
@keyframes shimmer {
|
|
5
|
+
0% { transform: translateX(-100%); }
|
|
6
|
+
100% { transform: translateX(200%); }
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@keyframes pulse {
|
|
10
|
+
0%, 100% { opacity: 0.4; }
|
|
11
|
+
50% { opacity: 1.0; }
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@keyframes cursorBlink {
|
|
15
|
+
0%, 100% { opacity: 0; }
|
|
16
|
+
50% { opacity: 1; }
|
|
17
|
+
}
|
|
18
|
+
`}),!a&&e.jsx("div",{style:{fontSize:"var(--text-xs-plus, 10.5px)",fontWeight:650,textTransform:"uppercase",letterSpacing:"var(--tracking-label, 0.16em)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginBottom:"8px"},children:"AI ASSISTANT"}),f==="thinking"&&e.jsxs("div",{children:[e.jsxs("div",{style:{color:"var(--text-muted)",fontWeight:400,fontSize:a?"11px":"13px",marginBottom:a?"4px":"8px",display:"flex",alignItems:"center",gap:"6px"},children:[s,n&&e.jsx("span",{style:{fontSize:a?"9px":"10px",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:n})]}),m()]}),f==="tool"&&e.jsxs("div",{children:[s&&e.jsxs("div",{style:{color:"var(--text-muted)",fontWeight:400,fontSize:a?"11px":"13px",marginBottom:a?"4px":"8px",display:"flex",alignItems:"center",gap:"6px"},children:[s,n&&e.jsx("span",{style:{fontSize:a?"9px":"10px",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:n})]}),e.jsx("div",{style:{marginBottom:a?"4px":"8px"},children:y.map((t,r)=>w(t,r))}),m()]}),f==="responding"&&e.jsxs("div",{style:{color:"var(--text-muted)",fontWeight:400,fontSize:a?"11px":"13px",display:"flex",alignItems:"center",gap:"6px"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center"},children:[s,l()]}),n&&e.jsx("span",{style:{fontSize:a?"9px":"10px",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:n})]})]})}const oe={error:(...f)=>console.warn("toast.error:",...f)};function ie({initialMessages:f=[],onSendMessage:y,onStreamMessage:b,onMessagesChange:v,onCodeBlockClick:a,placeholder:j="Ask a question about this interaction...",title:L="Chat with Chordia"}){const[w,m]=h.useState(f||[]),[l,s]=h.useState(""),[n,t]=h.useState(!1),[r,d]=h.useState(!1),[p,c]=h.useState(null),[C,z]=h.useState("thinking"),[R,o]=h.useState(null),[k,M]=h.useState(0),T=h.useRef(null),i=h.useRef(null),u=h.useRef(null),I=h.useRef(null),S=h.useRef(null),[E,_]=h.useState(!1),[O,Y]=h.useState(0);h.useEffect(()=>{var x;(x=T.current)==null||x.scrollIntoView({behavior:"smooth"})},[w,n]),h.useEffect(()=>{i.current&&(i.current.style.height="auto",i.current.style.height=`${Math.min(i.current.scrollHeight,120)}px`)},[l]),h.useEffect(()=>{if(v){const x=[...w];p&&x.push(p),v(x)}},[w,p,v]),h.useEffect(()=>{let x;return n&&R&&(x=setInterval(()=>{if(M(Date.now()-R),S.current){const W=(Date.now()-S.current)/1e3;W>=3?(_(!0),Y(Math.floor(W))):_(!1)}},500)),()=>x&&clearInterval(x)},[n,R]);const H=()=>{t(!1),d(!1),c(null),I.current=null,z("thinking"),_(!1),Y(0),S.current=null,o(null),M(0),u.current&&(u.current.abort(),u.current=null)},K=x=>{if(x.startsWith("data: ")){const W=x.slice(6);if(W==="[DONE]")return{type:"done"};try{return{type:"data",data:JSON.parse(W)}}catch{return null}}return null},q=x=>{var P,B;if(!((B=(P=x.choices)==null?void 0:P[0])!=null&&B.delta))return;S.current=Date.now(),_(!1);const W=x.choices[0].delta;if(W.tool_calls||W.tool_results){z("tool");return}W.content!==void 0&&(z("responding"),c(F=>{const G=F||{id:Date.now().toString(),role:"assistant",content:"",timestamp:new Date().toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}),isStreaming:!0},V={...G,content:(G.content||"")+(W.content||"")};return I.current=V,V}))},U=async x=>{const W=x.getReader(),P=new TextDecoder;let B="";try{for(;;){const{done:F,value:G}=await W.read();if(F)break;B+=P.decode(G,{stream:!0});const V=B.split(`
|
|
19
|
+
`);B=V.pop()||"";for(const ne of V)if(ne.trim()){const Q=K(ne);if(Q){if(Q.type==="done")return;Q.type==="data"&&q(Q.data)}}}}finally{W.releaseLock()}},X=async()=>{if(!l.trim()||r)return;const x=l.trim(),W={id:Date.now().toString(),role:"user",content:x,timestamp:new Date().toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})},P=[...w,W];m(P),s(""),t(!0),d(!0),z("thinking"),o(Date.now()),S.current=Date.now(),u.current=new AbortController;try{let B;if(b)B=await b(x,P);else if(y)B=await y(x,P);else{setTimeout(()=>{const F={id:(Date.now()+1).toString(),role:"assistant",content:"This is a demonstration response. In a real implementation, this would connect to your LLM backend.",timestamp:new Date().toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})};m(G=>[...G,F]),H()},1e3);return}if(B instanceof ReadableStream)await U(B);else if(B instanceof Response&&B.body)await U(B.body);else if(B&&typeof B.then=="function"){const F=await B;F instanceof ReadableStream?await U(F):F instanceof Response&&F.body&&await U(F.body)}I.current&&m(F=>[...F,{...I.current,isStreaming:!1}])}catch(B){B.name!=="AbortError"&&(oe.error("Failed to send message"),console.error("Stream error:",B))}finally{H()}},$=x=>{x.key==="Enter"&&!x.shiftKey&&(x.preventDefault(),X())};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"var(--radius-lg, 12px)",background:"var(--paper-elevated, rgba(255,255,255,0.82))",overflow:"hidden"},children:[L?e.jsxs("div",{style:{padding:"16px 20px",borderBottom:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsx("div",{style:{fontSize:"var(--text-lg, 16px)",fontWeight:720,letterSpacing:"-0.01em",color:"var(--text-strong, rgba(30,33,37,0.92))"},children:L}),e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-muted, rgba(30,33,37,0.56))",marginTop:"2px"},children:"Ask questions, get insights from analyzed interactions"})]}):null,e.jsx("div",{style:{flex:1,minHeight:0,overflowY:"auto",padding:"20px",display:"flex",flexDirection:"column"},children:w.length===0?e.jsx("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"var(--text-md, 13px)",textAlign:"center",padding:"40px"},children:"No messages yet. Start a conversation by asking a question below."}):e.jsxs(e.Fragment,{children:[w.map(x=>e.jsx(re,{role:x.role,content:x.content,html:x.html,timestamp:x.timestamp,toolBadges:x.toolBadges,isStreaming:x.isStreaming,onCodeBlockClick:a},x.id)),p&&e.jsx(re,{role:p.role,content:p.content,timestamp:p.timestamp,isStreaming:!0,onCodeBlockClick:a},p.id),n&&(!p||E)&&e.jsx("div",{style:{marginBottom:"16px"},children:e.jsx(se,{phase:E?"tool":C,elapsedMs:k,label:E&&O>=30?"Compacting conversation — trimming context to stay sharp...":E&&O>=10?"Running background tasks...":E?"Still working...":void 0})}),e.jsx("div",{ref:T})]})}),e.jsxs("div",{style:{borderTop:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",padding:"16px 20px",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsxs("div",{style:{display:"flex",gap:"12px",alignItems:"flex-end"},children:[e.jsx("textarea",{ref:i,value:l,onChange:x=>s(x.target.value),onKeyDown:$,placeholder:j,rows:1,disabled:r,style:{flex:1,padding:"10px 14px",fontSize:"var(--text-base, 14px)",lineHeight:1.5,color:"var(--text-strong, rgba(30,33,37,0.92))",background:"rgba(255, 255, 255, 0.95)",border:"1px solid rgba(52, 58, 64, 0.18)",borderRadius:"var(--radius-md, 8px)",resize:"none",outline:"none",transition:"border-color 0.15s ease",fontFamily:"inherit",minHeight:"42px",maxHeight:"120px",opacity:r?.6:1,cursor:r?"not-allowed":"text"},onFocus:x=>{r||(x.target.style.borderColor="rgba(94, 136, 176, 0.35)")},onBlur:x=>{x.target.style.borderColor="rgba(52, 58, 64, 0.18)"}}),e.jsx("button",{onClick:X,disabled:!l.trim()||r,style:{padding:"10px 16px",background:l.trim()&&!r?"var(--Base-Strong, #0B0B0B)":"#ECEEF2",color:l.trim()&&!r?"white":"var(--text-base)",border:"none",borderRadius:"var(--radius-md, 8px)",cursor:l.trim()&&!r?"pointer":"not-allowed",display:"flex",alignItems:"center",gap:"6px",fontSize:"var(--text-md, 13px)",fontWeight:650,transition:"all 0.15s ease",height:"42px"},children:r?e.jsxs(e.Fragment,{children:[e.jsx("style",{children:`
|
|
20
|
+
@keyframes buttonSpin {
|
|
21
|
+
from { transform: rotate(0deg); }
|
|
22
|
+
to { transform: rotate(360deg); }
|
|
23
|
+
}
|
|
24
|
+
`}),e.jsx("div",{style:{width:"14px",height:"14px",border:"2px solid rgba(255, 255, 255, 0.3)",borderTopColor:"white",borderRadius:"50%",animation:"buttonSpin 0.6s linear infinite"}}),"Sending..."]}):e.jsxs(e.Fragment,{children:[e.jsx(D.Send,{size:16}),"Send"]})})]}),e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginTop:"8px"},children:"Press Enter to send, Shift+Enter for new line"})]})]})}function le({threads:f=[],activeThreadId:y,onSelectThread:b,onNewChat:v,loading:a=!1}){const[j,L]=h.useState(""),m=[...f.filter(s=>{if(!j)return!0;const n=j.toLowerCase();return(s.title||"").toLowerCase().includes(n)||(s.last_message_preview||"").toLowerCase().includes(n)})].sort((s,n)=>{if(s.pinned&&!n.pinned)return-1;if(!s.pinned&&n.pinned)return 1;const t=new Date(s.updated_at||s.created_at||0).getTime();return new Date(n.updated_at||n.created_at||0).getTime()-t}),l=s=>{if(!s)return"";const n=new Date(s),r=new Date().getTime()-n.getTime(),d=Math.floor(r/864e5);return d===0?n.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}):d===1?"Yesterday":d<7?n.toLocaleDateString("en-US",{weekday:"short"}):n.toLocaleDateString("en-US",{month:"short",day:"numeric"})};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"var(--paper, rgba(255,255,255,0.95))",borderRight:"1px solid var(--border, rgba(52,58,64,0.12))",overflow:"hidden"},children:[e.jsxs("div",{style:{padding:"12px 14px",borderBottom:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",flexShrink:0},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"10px"},children:[e.jsx("div",{style:{fontSize:"13px",fontWeight:650,color:"var(--text-ink, rgba(30,33,37,0.92))"},children:"Threads"}),v&&e.jsx("button",{onClick:v,style:{padding:"4px 10px",fontSize:"11px",fontWeight:600,color:"var(--Base-Strong, #0B0B0B)",background:"#ECEEF2",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:"6px",cursor:"pointer",transition:"all 0.15s ease"},onMouseEnter:s=>{s.currentTarget.style.background="#ECEEF2"},onMouseLeave:s=>{s.currentTarget.style.background="rgba(94, 136, 176, 0.08)"},children:"+ New"})]}),e.jsxs("div",{style:{position:"relative"},children:[e.jsx(D.Search,{size:13,style:{position:"absolute",left:"10px",top:"50%",transform:"translateY(-50%)",color:"var(--text-faint, rgba(30,33,37,0.36))",pointerEvents:"none"}}),e.jsx("input",{type:"text",value:j,onChange:s=>L(s.target.value),placeholder:"Search threads...",style:{width:"100%",padding:"7px 10px 7px 32px",fontSize:"12px",color:"var(--text-ink, rgba(30,33,37,0.92))",background:"var(--paper-elevated, rgba(255,255,255,0.82))",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"6px",outline:"none",transition:"border-color 0.15s ease",boxSizing:"border-box"},onFocus:s=>{s.target.style.borderColor="rgba(94, 136, 176, 0.35)"},onBlur:s=>{s.target.style.borderColor="rgba(52, 58, 64, 0.12)"}})]})]}),e.jsx("div",{style:{flex:1,overflowY:"auto",padding:"4px 6px"},children:a?e.jsx("div",{style:{padding:"30px 16px",textAlign:"center",color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"12px"},children:"Loading threads..."}):m.length===0?e.jsx("div",{style:{padding:"30px 16px",textAlign:"center",color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"12px"},children:j?"No threads found":"No threads yet"}):m.map(s=>{const n=s.id===y;return e.jsxs("div",{onClick:()=>b==null?void 0:b(s.id),style:{padding:"10px 10px",marginBottom:"2px",borderRadius:"6px",background:n?"rgba(94, 136, 176, 0.10)":"transparent",border:n?"1px solid rgba(94, 136, 176, 0.15)":"1px solid transparent",cursor:"pointer",transition:"all 0.12s ease"},onMouseEnter:t=>{n||(t.currentTarget.style.background="rgba(0,0,0,0.03)")},onMouseLeave:t=>{n||(t.currentTarget.style.background="transparent")},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px",marginBottom:"4px"},children:[e.jsx(D.MessageSquare,{size:12,style:{color:n?"var(--rail-discovery, #5E88B0)":"var(--text-faint, rgba(30,33,37,0.36))",flexShrink:0}}),e.jsx("div",{style:{flex:1,fontSize:"12px",fontWeight:n?650:550,color:n?"var(--text-ink, rgba(30,33,37,0.92))":"var(--text-base, rgba(30,33,37,0.78))",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.title||"Untitled thread"}),s.pinned&&e.jsx(D.Pin,{size:10,style:{color:"var(--rail-discovery, #5E88B0)",flexShrink:0}})]}),s.last_message_preview&&e.jsx("div",{style:{fontSize:"11px",color:"var(--text-muted, rgba(30,33,37,0.56))",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",marginLeft:"18px",marginBottom:"4px"},children:s.last_message_preview}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px",marginLeft:"18px",fontSize:"10px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:[e.jsx(D.Clock,{size:9}),e.jsx("span",{children:l(s.updated_at||s.created_at)}),s.message_count!=null&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"·"}),e.jsxs("span",{children:[s.message_count," msg",s.message_count!==1?"s":""]})]})]})]},s.id)})})]})}const de={error:(...f)=>console.warn("toast.error:",...f)},ce=()=>({userData:{name:"User",email:""}});function pe({sessionTitle:f,messages:y,onSendMessage:b,currentUser:v}){var R;const[a,j]=h.useState(""),[L,w]=h.useState(!1),[m,l]=h.useState(y||[]),[s,n]=h.useState(!1),[t,r]=h.useState(!1),{userData:d}=ce(),p=h.useRef(null),c=v||{name:d==null?void 0:d.name,initials:((R=d==null?void 0:d.name)==null?void 0:R.split(" ").map(o=>o[0]).join("").toUpperCase())||"YO",color:"#6B7C93"};h.useEffect(()=>{l(y||[])},[y]),h.useEffect(()=>{p.current&&p.current.scrollIntoView({behavior:"smooth"})},[m]);const C=async()=>{if(!a.trim())return;const o=a.trim();j(""),r(!0);const k={id:`temp-${Date.now()}`,author:{name:c.name,role:(d==null?void 0:d.role)||"",initials:c.initials,color:c.color},content:o,timestamp:"Just now",type:"comment",isOptimistic:!0};if(l(M=>[...M,k]),b){try{await b(o),l(M=>M.map(T=>T.id===k.id?{...T,isOptimistic:!1}:T))}catch{l(T=>T.filter(i=>i.id!==k.id)),de.error("Failed to send message")}finally{r(!1)}return}setTimeout(()=>{l(M=>M.map(T=>T.id===k.id?{...T,isOptimistic:!1}:T)),r(!1)},500)},z=o=>{o.key==="Enter"&&!o.shiftKey&&(o.preventDefault(),C())};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"var(--paper-elevated, rgba(255,255,255,0.82))",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"var(--radius-lg, 12px)",overflow:"hidden"},children:[f&&e.jsxs("div",{style:{padding:"14px 16px",borderBottom:"1px solid var(--border, rgba(52,58,64,0.12))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsx("div",{style:{fontSize:"var(--text-md, 13px)",fontWeight:680,color:"var(--text-strong, rgba(30,33,37,0.92))",marginBottom:"3px"},children:"Session Discussion"}),f&&e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-muted, rgba(30,33,37,0.56))",display:"flex",alignItems:"center",gap:"8px"},children:e.jsx("span",{children:f})})]}),e.jsxs("div",{style:{flex:1,overflowY:"auto",padding:"16px",display:"flex",flexDirection:"column",gap:"16px"},children:[s?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:"Loading messages..."}):m.length===0?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:"No messages yet. Start the conversation!"}):m.map(o=>e.jsxs("div",{style:{display:"flex",gap:"12px",opacity:o.type==="system"?.75:1},children:[o.type!=="system"&&e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"8px",background:o.author.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0,opacity:.9},children:o.author.initials}),o.type==="system"&&e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"8px",background:"rgba(30, 33, 37, 0.08)",color:"rgba(30, 33, 37, 0.52)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0},children:e.jsx(D.Clock,{size:14})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"8px",marginBottom:"4px"},children:[e.jsx("span",{style:{fontSize:"var(--text-sm, 11px)",fontWeight:650,color:"var(--text-base, rgba(30,33,37,0.78))"},children:o.author.name}),e.jsx("span",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:o.timestamp}),o.author.role&&e.jsx("span",{style:{fontSize:"var(--text-xs, 10px)",color:"var(--text-muted, rgba(30,33,37,0.56))",background:"rgba(30, 33, 37, 0.06)",padding:"2px 6px",borderRadius:"4px",textTransform:"uppercase",letterSpacing:"0.04em",fontWeight:600},children:o.author.role}),o.isEdited&&e.jsx("span",{style:{fontSize:"var(--text-xs, 10px)",color:"var(--text-faint, rgba(30,33,37,0.36))",fontStyle:"italic"},children:"(edited)"})]}),e.jsx("div",{style:{fontSize:"var(--text-md, 13px)",color:"var(--text-base, rgba(30,33,37,0.78))",lineHeight:1.5,marginBottom:o.references?"8px":0},children:o.content}),o.references&&o.references.length>0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px",marginTop:"8px"},children:o.references.map((k,M)=>e.jsxs("button",{type:"button",style:{fontSize:"11px",padding:"4px 8px",borderRadius:"6px",border:"1px solid rgba(52, 58, 64, 0.16)",background:"rgba(255, 255, 255, 0.7)",color:k.type==="condition"?"rgba(94, 136, 176, 0.85)":k.type==="observation"?"rgba(107, 123, 147, 0.85)":k.type==="timestamp"?"rgba(184, 156, 106, 0.85)":"rgba(30, 33, 37, 0.65)",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"4px",transition:"all 0.15s ease",fontWeight:550},onMouseEnter:T=>{T.currentTarget.style.background="rgba(255, 255, 255, 0.95)",T.currentTarget.style.borderColor="rgba(52, 58, 64, 0.24)"},onMouseLeave:T=>{T.currentTarget.style.background="rgba(255, 255, 255, 0.7)",T.currentTarget.style.borderColor="rgba(52, 58, 64, 0.16)"},children:[k.type==="timestamp"&&e.jsx(D.Clock,{size:12}),(k.type==="condition"||k.type==="observation")&&e.jsx(D.Hash,{size:12}),k.label]},M))})]})]},o.id)),e.jsx("div",{ref:p})]}),e.jsxs("div",{style:{padding:"12px",borderTop:"1px solid var(--border, rgba(52,58,64,0.12))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"flex-end"},children:[e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"var(--radius-md, 8px)",background:c.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"var(--text-sm, 11px)",fontWeight:650,flexShrink:0,opacity:.9},children:c.initials}),e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:"8px"},children:[e.jsx("textarea",{value:a,onChange:o=>j(o.target.value),onKeyDown:z,onFocus:()=>w(!0),onBlur:()=>w(!1),placeholder:"Add a comment...",style:{width:"100%",minHeight:"38px",maxHeight:"120px",padding:"8px 12px",fontSize:"var(--text-md, 13px)",color:"var(--text-base, rgba(30,33,37,0.78))",background:"white",border:`1px solid ${L?"rgba(94, 136, 176, 0.35)":"rgba(52, 58, 64, 0.16)"}`,borderRadius:"var(--radius-md, 8px)",resize:"vertical",outline:"none",transition:"border-color 0.15s ease",fontFamily:"inherit",lineHeight:1.5}}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsxs("div",{style:{display:"flex",gap:"4px"},children:[e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:o=>{o.currentTarget.style.background="rgba(30, 33, 37, 0.06)",o.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:o=>{o.currentTarget.style.background="transparent",o.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Mention user",children:e.jsx(D.AtSign,{size:16})}),e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:o=>{o.currentTarget.style.background="rgba(30, 33, 37, 0.06)",o.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:o=>{o.currentTarget.style.background="transparent",o.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Reference condition",children:e.jsx(D.Hash,{size:16})}),e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:o=>{o.currentTarget.style.background="rgba(30, 33, 37, 0.06)",o.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:o=>{o.currentTarget.style.background="transparent",o.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Attach file",children:e.jsx(D.Paperclip,{size:16})})]}),e.jsx("button",{type:"button",onClick:C,disabled:!a.trim()||t,style:{padding:"6px 12px",background:a.trim()&&!t?"rgba(94, 136, 176, 0.85)":"var(--border-subtle, rgba(52,58,64,0.08))",border:"none",borderRadius:"6px",color:a.trim()&&!t?"white":"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"var(--text-sm, 11px)",fontWeight:600,cursor:a.trim()&&!t?"pointer":"not-allowed",display:"flex",alignItems:"center",gap:"6px",transition:"all 0.15s ease"},onMouseEnter:o=>{a.trim()&&!t&&(o.currentTarget.style.background="rgba(94, 136, 176, 1)")},onMouseLeave:o=>{a.trim()&&!t&&(o.currentTarget.style.background="rgba(94, 136, 176, 0.85)")},children:t?e.jsxs(e.Fragment,{children:[e.jsx("style",{children:`
|
|
25
|
+
@keyframes messageSpin {
|
|
26
|
+
from { transform: rotate(0deg); }
|
|
27
|
+
to { transform: rotate(360deg); }
|
|
28
|
+
}
|
|
29
|
+
`}),e.jsx("div",{style:{width:"14px",height:"14px",border:"2px solid rgba(255, 255, 255, 0.3)",borderTopColor:"white",borderRadius:"50%",animation:"messageSpin 0.6s linear infinite"}}),"Sending..."]}):e.jsxs(e.Fragment,{children:[e.jsx(D.Send,{size:14}),"Send"]})})]})]})]}),e.jsxs("div",{style:{marginTop:"8px",fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",lineHeight:1.4},children:[e.jsx("strong",{children:"Tip:"})," Use"," ",e.jsx("code",{style:{background:"rgba(30, 33, 37, 0.06)",padding:"2px 4px",borderRadius:"3px",fontFamily:"var(--font-mono, monospace)",fontSize:"var(--text-xs, 10px)"},children:"@"})," ","to mention teammates,"," ",e.jsx("code",{style:{background:"rgba(30, 33, 37, 0.06)",padding:"2px 4px",borderRadius:"3px",fontFamily:"var(--font-mono, monospace)",fontSize:"var(--text-xs, 10px)"},children:"#"})," ","to reference conditions"]})]})]})}const A=["#5E88B0","#9B7AA8","#C98A5A","#7BA89D","#D17B6B","#6B7C93","#9B8E6F","#8A9BAF","#B8976A","#A8C76B"],te={fill:"var(--text-muted, #666)",fontSize:12},N={stroke:"var(--border, #e0e0e0)"},Z="var(--border, #e0e0e0)",J={contentStyle:{backgroundColor:"var(--paper-elevated, #fff)",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-sm, 4px)",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)",color:"var(--text-ink, #1e2125)"},labelStyle:{color:"var(--text-strong, #1e2125)"}},ee={color:"var(--text-ink, #1e2125)",fontSize:"12px"},xe=(f,y)=>{if(!f)return!1;const b=f.toLowerCase();return y.filter(a=>String(a).toLowerCase().includes(b)).length<y.length*.5},ge=async(f,y)=>{const b=f.querySelector("svg");if(!b)return;const v=b.cloneNode(!0),a=b.clientWidth||600,j=b.clientHeight||300;v.setAttribute("width",a),v.setAttribute("height",j),v.setAttribute("xmlns","http://www.w3.org/2000/svg");const L=document.createElement("style");L.textContent='text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }',v.insertBefore(L,v.firstChild);const w=new XMLSerializer().serializeToString(v),m=new Blob([w],{type:"image/svg+xml;charset=utf-8"}),l=URL.createObjectURL(m),s=new Image;s.onload=()=>{const n=document.createElement("canvas"),t=2;n.width=a*t,n.height=j*t;const r=n.getContext("2d");r.fillStyle="#ffffff",r.fillRect(0,0,n.width,n.height),r.scale(t,t),r.drawImage(s,0,0,a,j),URL.revokeObjectURL(l);const d=document.createElement("a");d.download=`${(y||"chart").replace(/[^a-z0-9]+/gi,"_")}.png`,d.href=n.toDataURL("image/png"),d.click()},s.src=l},ue=(f,y)=>{const b=["",...f.map(j=>j.name)].join(","),v=y.map(j=>{const L=f.map(w=>{const m=w.data.find(l=>l.x===j);return m?m.y:""});return[j,...L].join(",")}),a=[b,...v].join(`
|
|
30
|
+
`);navigator.clipboard.writeText(a)},he=({onDownload:f,onCopy:y,copied:b})=>e.jsxs("div",{style:{display:"flex",gap:6,justifyContent:"flex-end",marginBottom:8,opacity:.7,transition:"opacity 0.15s"},children:[e.jsx("button",{onClick:y,title:"Copy data as CSV",style:{background:"none",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-sm, 4px)",padding:"3px 8px",fontSize:11,color:"var(--text-muted, #666)",cursor:"pointer",display:"flex",alignItems:"center",gap:4},children:b?"✓ Copied":"📋 CSV"}),e.jsx("button",{onClick:f,title:"Download as PNG",style:{background:"none",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-sm, 4px)",padding:"3px 8px",fontSize:11,color:"var(--text-muted, #666)",cursor:"pointer",display:"flex",alignItems:"center",gap:4},children:"📥 PNG"})]}),fe=({chartType:f,title:y,xLabel:b,yLabel:v,series:a})=>{const j=h.useRef(null),[L,w]=h.useState(!1);if(!a||a.length===0)return null;const m=[...new Set(a.flatMap(i=>i.data.map(u=>u.x)))],l=m.map(i=>{const u={x:i};return a.forEach(I=>{const S=I.data.find(E=>E.x===i);u[I.name]=S?S.y:null}),u}),s=a.map(i=>i.name),n=s.length===1,t=xe(b,m),r=t?20:5,p=Math.max(...m.map(i=>String(i).length))>12||m.length>8,c={background:"var(--paper-elevated, #fff)",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-md, 8px)",padding:"16px",marginBottom:"16px"},C={color:"var(--text-strong, #1e2125)",fontSize:"14px",fontWeight:"600",marginBottom:"12px"},z={dataKey:"x",tick:p?{fill:"var(--text-muted, #666)",fontSize:11,angle:-35,textAnchor:"end"}:te,axisLine:N,tickLine:N,...t?{label:{value:b,position:"insideBottom",offset:-10,style:{textAnchor:"middle",fill:"var(--text-muted, #666)"}}}:{}},R={tick:te,axisLine:N,tickLine:N,...v?{label:{value:v,angle:-90,position:"insideLeft",style:{textAnchor:"middle",fill:"var(--text-muted, #666)"}}}:{}},o=()=>{switch(f){case"bar":return e.jsx(g.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(g.BarChart,{data:l,margin:{top:5,right:30,left:20,bottom:p?40:r},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{...z}),e.jsx(g.YAxis,{...R}),e.jsx(g.Tooltip,{...J}),!n&&e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Bar,{dataKey:i,fill:A[u%A.length],radius:[2,2,0,0],children:n&&l.map((I,S)=>e.jsx(g.Cell,{fill:A[S%A.length]},S))},i))]})});case"horizontal_bar":return e.jsx(g.ResponsiveContainer,{width:"100%",height:Math.max(300,l.length*40),children:e.jsxs(g.BarChart,{data:l,layout:"vertical",margin:{top:5,right:30,left:100,bottom:5},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{type:"number",tick:te,axisLine:N,tickLine:N,...v?{label:{value:v,position:"insideBottom",offset:-5,style:{textAnchor:"middle",fill:"var(--text-muted, #666)"}}}:{}}),e.jsx(g.YAxis,{type:"category",dataKey:"x",tick:{fill:"var(--text-muted, #666)",fontSize:11},width:90,axisLine:N,tickLine:N}),e.jsx(g.Tooltip,{...J}),!n&&e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Bar,{dataKey:i,fill:A[u%A.length],radius:[0,2,2,0],children:n&&l.map((I,S)=>e.jsx(g.Cell,{fill:A[S%A.length]},S))},i))]})});case"line":return e.jsx(g.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(g.LineChart,{data:l,margin:{top:5,right:30,left:20,bottom:p?40:r},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{...z}),e.jsx(g.YAxis,{...R}),e.jsx(g.Tooltip,{...J}),e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Line,{type:"monotone",dataKey:i,stroke:A[u%A.length],strokeWidth:2,dot:{r:4,fill:A[u%A.length]},activeDot:{r:6,fill:A[u%A.length]}},i))]})});case"area":return e.jsx(g.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(g.AreaChart,{data:l,margin:{top:5,right:30,left:20,bottom:p?40:r},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{...z}),e.jsx(g.YAxis,{...R}),e.jsx(g.Tooltip,{...J}),e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Area,{type:"monotone",dataKey:i,stroke:A[u%A.length],strokeWidth:2,fill:A[u%A.length],fillOpacity:.15},i))]})});case"pie":{const i=a[0].data.map((S,E)=>({name:S.x,value:S.y,fill:A[E%A.length]})),u=Math.PI/180,I=({cx:S,cy:E,midAngle:_,innerRadius:O,outerRadius:Y,percent:H,name:K})=>{const q=Y+20,U=S+q*Math.cos(-_*u),X=E+q*Math.sin(-_*u);return H<.04?null:e.jsxs("text",{x:U,y:X,fill:"var(--text-ink, #1e2125)",fontSize:11,textAnchor:U>S?"start":"end",dominantBaseline:"central",children:[K," (",(H*100).toFixed(0),"%)"]})};return e.jsx(g.ResponsiveContainer,{width:"100%",height:320,children:e.jsxs(g.PieChart,{children:[e.jsx(g.Pie,{data:i,cx:"50%",cy:"50%",outerRadius:100,dataKey:"value",label:I,labelLine:{stroke:"var(--text-muted, #666)"},children:i.map((S,E)=>e.jsx(g.Cell,{fill:S.fill},E))}),e.jsx(g.Tooltip,{...J})]})})}case"metric":{const i=a[0],u=i.data[0],I=i.data.length>1?i.data[1]:null,S=u.y,E=u.x||"",_=I!==null,O=_?S-I.y:0,Y=_&&I.y!==0?O/Math.abs(I.y)*100:0,H=O>0,K=O<0,q=H?"#7BA89D":K?"#D17B6B":"var(--text-muted, #666)",U=H?"↑":K?"↓":"→",X=$=>Number.isInteger($)&&Math.abs($)>=1e3?$.toLocaleString():typeof $=="number"?$%1===0?$.toString():$.toFixed($<10?2:1):String($);return e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:12,padding:"8px 0"},children:[e.jsx("div",{style:{fontSize:"36px",fontWeight:700,lineHeight:1,color:"var(--text-strong, #1e2125)",fontVariantNumeric:"tabular-nums"},children:X(S)}),E&&e.jsx("div",{style:{fontSize:"14px",color:"var(--text-muted, #666)",fontWeight:500},children:E}),_&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,fontSize:"13px",fontWeight:600,color:q,background:H?"rgba(123,168,157,0.12)":K?"rgba(209,123,107,0.12)":"rgba(128,128,128,0.08)",padding:"3px 8px",borderRadius:"var(--radius-sm, 4px)"},children:[e.jsx("span",{children:U}),e.jsxs("span",{children:[X(Math.abs(O))," (",Math.abs(Y).toFixed(1),"%)"]})]}),_&&e.jsxs("div",{style:{fontSize:"11px",color:"var(--text-faint, #999)"},children:["vs ",I.x||"previous"]})]})}default:return e.jsxs("div",{style:{color:"var(--text-muted)",fontSize:12,padding:8},children:["Unsupported chart type: ",f]})}},k=h.useCallback(()=>{j.current&&ge(j.current,y)},[y]),M=h.useCallback(()=>{ue(a,m),w(!0),setTimeout(()=>w(!1),2e3)},[a,m]),T=f!=="metric";return e.jsxs("div",{style:c,children:[y&&e.jsx("div",{style:C,children:y}),T&&e.jsx(he,{onDownload:k,onCopy:M,copied:L}),e.jsx("div",{ref:j,children:o()})]})};exports.ChartRenderer=fe;exports.ChatHistoryPanel=le;exports.ChatInterface=ie;exports.ChatMessage=re;exports.MessageThread=pe;exports.ThinkingIndicator=se;
|
|
31
|
+
//# sourceMappingURL=ChartRenderer.cjs.js.map
|