chordia-ui 0.1.0

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.
@@ -0,0 +1,11 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const j=require("../Timeline.cjs.js"),e=require("react/jsx-runtime"),g=require("react"),m=require("lucide-react");function Re(t){return`${Math.floor(t/6e4)}:${String(Math.floor(t%6e4/1e3)).padStart(2,"0")}`}function ye({ev:t,onPlay:o,onHighlight:l}){var n;const s=t.actor==="agent"?e.jsx(m.UserCheck,{size:11}):e.jsx(m.User,{size:11});return e.jsxs("div",{style:{fontSize:"var(--text-sm)",padding:"6px 10px",borderRadius:"var(--radius-sm)",background:"var(--paper-elevated)",border:"1px solid var(--border)",marginTop:4},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:5,marginBottom:3},children:[e.jsx("span",{style:{color:"var(--text-muted)"},children:s}),t.source&&e.jsx("span",{style:{color:"var(--text-muted)",fontWeight:500},children:t.source}),e.jsxs("span",{style:{marginLeft:"auto",display:"flex",gap:4,alignItems:"center"},children:[t.start_ms!=null&&e.jsx(j.SmallButton,{variant:"ghost",size:"sm",onClick:()=>o(t.start_ms,t.end_ms),title:"Play audio",children:e.jsx(m.Play,{size:10})}),((n=t.turn_ids)==null?void 0:n.length)>0&&e.jsx(j.SmallButton,{variant:"ghost",size:"sm",onClick:()=>l(t.turn_ids),title:"Show in transcript",children:e.jsx(m.ScrollText,{size:10})}),t.start_ms!=null&&e.jsx("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-faint)"},children:Re(t.start_ms)})]})]}),e.jsxs("div",{style:{color:"var(--text-base)",fontStyle:"italic",lineHeight:1.4},children:['"',(t.text||"").slice(0,200),'"']})]})}function je({outcomeLift:t}){var v,f;if(t.lift==null)return null;const o=t.p_expected,l=t.p_full,s=t.lift_raw??(l!=null&&o!=null?l-o:null),n=t.lift,d=p=>p!=null?Math.round(p*100)+"%":"—",a=p=>{if(p==null)return"—";const x=(p*100).toFixed(1);return p>0?`+${x}pp`:`${x}pp`},c=p=>p>0?"var(--state-present)":p<0?"#f87171":"var(--text-muted)";return e.jsxs(j.DetailCard,{title:e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4},children:[e.jsx(m.TrendingUp,{size:12})," Agent Lift Analysis"]}),children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8,marginBottom:16},children:[e.jsxs("div",{style:{textAlign:"center",flex:1},children:[e.jsx("div",{style:{fontSize:20,fontWeight:600,color:"var(--text-faint)"},children:d(o)}),e.jsx("div",{style:{fontSize:10,color:"var(--text-faint)",marginTop:2},children:"Expected Outcome"}),e.jsx("div",{style:{fontSize:9,color:"var(--text-faint)",marginTop:1},children:"Based on call type & difficulty"})]}),e.jsx("div",{style:{fontSize:16,color:"var(--text-faint)",fontWeight:300},children:"+"}),e.jsxs("div",{style:{textAlign:"center",flex:1},children:[e.jsx("div",{style:{fontSize:20,fontWeight:700,color:c(s)},children:a(s)}),e.jsx("div",{style:{fontSize:10,color:"var(--text-muted)",marginTop:2},children:"Agent Impact"}),e.jsx("div",{style:{fontSize:9,color:"var(--text-faint)",marginTop:1},children:"Behavior-driven change"})]}),e.jsx("div",{style:{fontSize:16,color:"var(--text-faint)",fontWeight:300},children:"="}),e.jsxs("div",{style:{textAlign:"center",flex:1},children:[e.jsx("div",{style:{fontSize:20,fontWeight:600,color:"var(--text-ink)"},children:d(l)}),e.jsx("div",{style:{fontSize:10,color:"var(--text-muted)",marginTop:2},children:"Predicted Outcome"}),e.jsx("div",{style:{fontSize:9,color:"var(--text-faint)",marginTop:1},children:"With agent behaviors"})]})]}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",gap:8,padding:"8px 12px",borderRadius:6,background:"var(--surface-raised, #f5f5f5)",marginBottom:12},children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-muted)"},children:"vs. Average Agent:"}),e.jsxs("span",{style:{fontSize:14,fontWeight:700,color:c(n),display:"flex",alignItems:"center",gap:4},children:[a(n),e.jsx("svg",{width:"10",height:"7",children:n>0?e.jsx("path",{d:"M5 0 L9 6 L1 6 Z",fill:"var(--state-present)"}):n<0?e.jsx("path",{d:"M5 6 L9 0 L1 0 Z",fill:"#f87171"}):e.jsx("rect",{x:"1",y:"2.5",width:"8",height:"1",fill:"var(--text-muted)"})})]}),((v=t.interpretation)==null?void 0:v.lift_band)&&e.jsx("span",{style:{fontSize:9,fontWeight:600,color:c(n),textTransform:"capitalize"},children:t.interpretation.lift_band.replace(/_/g," ")})]}),((f=t.driver_signal_keys)==null?void 0:f.length)>0&&e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:9,fontWeight:600,color:"var(--text-muted)",marginBottom:6,textTransform:"uppercase",letterSpacing:"0.04em"},children:"Key Drivers"}),e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:4},children:t.driver_signal_keys.map((p,x)=>e.jsx(j.Tag,{variant:"default",size:"xs",children:p.replace(/^sig\./,"").replace(/_/g," ")},x))})]})]})}const me="coaching-synthesis-keyframes";function Be(){if(typeof document>"u"||document.getElementById(me))return;const t=document.createElement("style");t.id=me,t.textContent=`
2
+ @keyframes coaching-shimmer {
3
+ 0% { background-position: -200% 0; }
4
+ 100% { background-position: 200% 0; }
5
+ }
6
+ @keyframes coaching-pulse {
7
+ 0%, 100% { opacity: 0.4; }
8
+ 50% { opacity: 1; }
9
+ }
10
+ `,document.head.appendChild(t)}function Se({data:t,loading:o,error:l}){var v,f;if(g.useEffect(()=>{Be()},[]),o)return e.jsxs("div",{style:{padding:"20px 0",display:"flex",flexDirection:"column",gap:12},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:8},children:[e.jsx("div",{style:{width:6,height:6,borderRadius:"50%",background:"var(--rail-tone)",animation:"coaching-pulse 1.5s ease-in-out infinite"}}),e.jsx("span",{style:{fontSize:"var(--text-base)",color:"var(--rail-tone)",fontFamily:"var(--font-sans)",fontWeight:500},children:"Compass is synthesizing coaching insights…"})]}),[180,260,220].map((p,x)=>e.jsx("div",{style:{height:10,width:p,maxWidth:"100%",borderRadius:4,background:"linear-gradient(90deg, var(--hover-warm-subtle) 25%, var(--hover-warm) 50%, var(--hover-warm-subtle) 75%)",backgroundSize:"200% 100%",animation:"coaching-shimmer 1.8s ease-in-out infinite",animationDelay:`${x*.2}s`}},x))]});if(l)return e.jsx("div",{style:{padding:"16px 0",fontSize:"var(--text-base)",color:"var(--text-faint)",fontFamily:"var(--font-sans)"},children:"Unable to generate coaching summary."});if(!t)return null;const s=t.strengths||[],n=t.improvements||[],d=t.organizational||t.organizational_insights||[],a=typeof t.one_liner=="string"?t.one_liner:((v=t.one_liner)==null?void 0:v.text)||"",c=typeof t.context=="string"?t.context:((f=t.context)==null?void 0:f.text)||"";return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:14,fontFamily:"var(--font-sans)"},children:[a&&e.jsx("div",{style:{fontSize:"var(--text-lg)",fontWeight:600,color:"var(--text-strong)",lineHeight:1.4},children:a}),c&&e.jsx("div",{style:{fontSize:"var(--text-base)",color:"var(--text-muted)",lineHeight:1.45},children:c}),s.length>0&&e.jsx(he,{icon:e.jsx(m.TrendingUp,{size:13}),label:"Strengths",color:"var(--rail-discovery)",items:s}),n.length>0&&e.jsx(he,{icon:e.jsx(m.Lightbulb,{size:13}),label:"Improvements",color:"var(--rail-compliance)",items:n}),d.length>0&&e.jsx(he,{icon:e.jsx(m.Building,{size:13}),label:"Organizational",color:"var(--rail-outcome)",items:d}),t.overall&&e.jsxs("div",{style:{fontSize:"var(--text-base)",color:"var(--text-faint)",fontStyle:"italic",marginTop:2},children:["Overall: ",t.overall.replace(/_/g," ")]})]})}function he({icon:t,label:o,color:l,items:s}){return e.jsxs("div",{children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:5,marginBottom:6,color:l,fontSize:"var(--text-base)",fontWeight:650,letterSpacing:"0.04em"},children:[t,o]}),e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:s.map((n,d)=>{const a=typeof n=="string"?n:(n==null?void 0:n.text)||"",c=typeof n=="object"?n==null?void 0:n.quote:null;return e.jsxs("div",{style:{paddingLeft:14},children:[e.jsxs("div",{style:{fontSize:"var(--text-base)",color:"var(--text-base)",lineHeight:1.4},children:["• ",a]}),c&&e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:4,marginTop:3,paddingLeft:8},children:[e.jsx(m.MessageSquareQuote,{size:10,style:{color:"var(--text-faint)",flexShrink:0,marginTop:2}}),e.jsxs("span",{style:{fontSize:"var(--text-base)",color:"var(--text-muted)",fontStyle:"italic",lineHeight:1.35},children:['"',c,'"']})]})]},d)})})]})}function Ee(t){const o=Math.floor(t/60),l=Math.round(t%60);return`${o}:${l.toString().padStart(2,"0")}`}function ke({title:t,meta:o,callPurpose:l,classification:s,dimensions:n}){const d=l||{},a=s||{};return e.jsxs(j.Card,{variant:"elevated",padding:"sm",children:[e.jsx("div",{style:{fontSize:"var(--text-md)",fontWeight:550,color:"var(--text-strong)",lineHeight:1.375,marginBottom:6},children:t}),e.jsxs("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr",gap:"4px 12px",fontSize:11,color:"var(--text-muted)"},children:[o.evaluated_dt&&e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:"Date"}),e.jsx("div",{style:{color:"var(--text-base)"},children:new Date(o.evaluated_dt).toLocaleString()})]}),o.duration_seconds!=null&&e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:"Duration"}),e.jsx("div",{style:{color:"var(--text-base)"},children:Ee(o.duration_seconds)})]}),o.message_count&&e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:"Messages"}),e.jsx("div",{style:{color:"var(--text-base)"},children:o.message_count})]}),d.interaction_direction&&e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:"Direction"}),e.jsx("div",{style:{color:"var(--text-base)"},children:d.interaction_direction})]}),d.interaction_driver&&e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:"Driver"}),e.jsx("div",{style:{color:"var(--text-base)"},children:d.interaction_driver})]}),d.customer_intent&&e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:"Intent"}),e.jsx("div",{style:{color:"var(--text-base)"},children:d.customer_intent})]}),a.interaction_paradigm&&e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:"Paradigm"}),e.jsx("div",{style:{color:"var(--text-base)"},children:a.interaction_paradigm})]}),n.map((c,v)=>e.jsxs("div",{children:[e.jsx("span",{style:{fontSize:10,color:"var(--text-faint)"},children:c.label||c.key}),e.jsx("div",{style:{color:"var(--text-base)"},children:c.value})]},v))]}),o.session_id&&e.jsx("div",{style:{fontSize:9,color:"var(--text-faint)",fontFamily:"var(--font-mono)",marginTop:4,userSelect:"all"},children:o.session_id})]})}function ze({scores:t}){return t!=null&&t.length?e.jsx(j.DetailCard,{title:"Scores",children:e.jsx("div",{style:{display:"flex",gap:24,flexWrap:"wrap"},children:t.map((o,l)=>{const s=o.value!=null?Math.round(o.value):null;return e.jsxs("div",{style:{textAlign:"center",minWidth:48},children:[e.jsx("div",{style:{fontSize:20,fontWeight:700,color:"var(--text-ink)"},children:s??"—"}),e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)",marginTop:2},children:o.label||o.key})]},l)})})}):null}const ve={outcome:{label:"Outcome",icon:e.jsx(m.Target,{size:12}),color:"var(--rail-outcome)"},process:{label:"Process & Protocol",icon:e.jsx(m.FileText,{size:12}),color:"var(--rail-discovery)"},compliance:{label:"Compliance",icon:e.jsx(m.Scale,{size:12}),color:"var(--rail-compliance)"},customer_friction:{label:"Customer Friction",icon:e.jsx(m.Zap,{size:12}),color:"var(--rail-coral)"},experience:{label:"Experience",icon:e.jsx(m.MessageSquare,{size:12}),color:"var(--rail-teal)"}},We={risk:{icon:e.jsx(m.Zap,{size:10}),color:"var(--rail-signal-churn)"},opportunity:{icon:e.jsx(m.Lightbulb,{size:10}),color:"var(--state-unknown)"},excellence:{icon:e.jsx(m.CheckCircle,{size:10}),color:"var(--rail-teal)"}};function Ce({signals:t,expandedSignals:o,toggleSignal:l,playAudio:s,highlightTurns:n}){var a;if(!((a=t==null?void 0:t.signals)!=null&&a.length))return null;const d=g.useMemo(()=>{const c={};for(const v of t.signals){const f=v.group||"experience";c[f]||(c[f]=[]),c[f].push(v)}return c},[t]);return e.jsx(j.DetailCard,{title:`Signals (${t.present_count} present / ${t.total_signals_evaluated} evaluated)`,children:Object.entries(d).map(([c,v])=>{const f=ve[c]||ve.experience;return e.jsxs("div",{style:{marginBottom:10},children:[e.jsxs(j.SectionLabel,{style:{display:"flex",alignItems:"center",gap:4},children:[f.icon,e.jsx("span",{children:f.label})]}),e.jsx("div",{style:{marginTop:4,display:"flex",flexDirection:"column",gap:6},children:v.map((p,x)=>{var C,T,I;const z=p.display_name||p.key||"",w=(C=p.baseline)==null?void 0:C.delta,k=((T=p.observations)==null?void 0:T.length)>0,S=o.has(p.key);return e.jsxs("div",{id:`signal-${p.key}`,style:{border:"1px solid var(--border)",borderRadius:"var(--radius-md)",background:"var(--paper)",overflow:"hidden"},children:[e.jsxs("button",{type:"button",onClick:R=>{k&&(l(p.key),R.currentTarget.blur())},style:{width:"100%",display:"flex",alignItems:"center",justifyContent:"space-between",padding:"6px 10px",background:"transparent",border:"none",cursor:k?"pointer":"default"},title:[p.confidence!=null?`Confidence: ${Math.round(p.confidence*100)}%`:"",w!=null?`Δ baseline: ${w>0?"+":""}${(w*100).toFixed(1)}%`:""].filter(Boolean).join(" · "),children:[e.jsxs("span",{style:{display:"flex",alignItems:"center",gap:6,whiteSpace:"nowrap"},children:[(I=We[p.kind])==null?void 0:I.icon,e.jsx("span",{children:z}),k&&e.jsxs("span",{style:{marginLeft:4,fontSize:10,opacity:.6},children:["(",p.observations.length,")"]})]}),k&&e.jsx(m.ChevronDown,{size:14,style:{color:"var(--text-muted)",flexShrink:0,transform:S?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.16s ease"}})]}),S&&p.observations&&e.jsx("div",{style:{width:"100%",margin:"0 0 6px"},children:p.observations.map((R,P)=>{var F;return e.jsxs("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)",padding:"8px 12px",background:"var(--paper)",borderLeft:`3px solid ${f.color}`,marginBottom:6,borderRadius:"0 var(--radius-sm) var(--radius-sm) 0"},children:[e.jsx("div",{style:{fontWeight:600,color:"var(--text-base)",marginBottom:3,fontSize:"var(--text-base)"},children:R.key||""}),e.jsx("div",{style:{marginBottom:6,lineHeight:1.4},children:R.reason||R.explanation||""}),(F=R.evidence)==null?void 0:F.map((W,K)=>e.jsx(ye,{ev:W,onPlay:s,onHighlight:n},K))]},P)})})]},x)})})]},c)})})}const be={risk:{icon:e.jsx(m.Zap,{size:10}),color:"var(--rail-signal-churn)"},opportunity:{icon:e.jsx(m.Lightbulb,{size:10}),color:"var(--state-unknown)"},excellence:{icon:e.jsx(m.CheckCircle,{size:10}),color:"var(--rail-teal)"}};function we({guidance:t,playAudio:o,highlightTurns:l}){var s;return(s=t==null?void 0:t.items)!=null&&s.length?e.jsx(j.DetailCard,{title:`Guidance (${t.total_items} items)`,children:e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:8},children:t.items.map((n,d)=>{var v;const a=be[n.guidance_kind]||be.excellence,c=n.owner==="organization"?{bg:"color-mix(in srgb, var(--rail-discovery) 15%, transparent)",color:"var(--rail-discovery)",text:"ORG"}:n.owner==="shared"?{bg:"color-mix(in srgb, var(--state-unknown) 15%, transparent)",color:"var(--state-unknown)",text:"SHARED"}:{bg:"color-mix(in srgb, var(--rail-teal) 10%, transparent)",color:"var(--rail-teal)",text:"AGENT"};return e.jsxs("div",{style:{padding:"10px 12px",borderRadius:"var(--radius)",background:"var(--paper)",borderLeft:`3px solid ${a.color}`},children:[e.jsxs("div",{style:{fontSize:"var(--text-base)",color:"var(--text-strong)",display:"flex",alignItems:"center",gap:5,fontWeight:550},children:[a.icon," ",n.title||"",e.jsx("span",{style:{fontSize:9,padding:"1px 6px",borderRadius:8,marginLeft:4,background:c.bg,color:c.color,fontWeight:600},children:c.text})]}),n.detail&&e.jsx("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)",marginTop:4,lineHeight:1.4},children:n.detail}),(v=n.signal_refs)==null?void 0:v.map((f,p)=>{var x;return e.jsxs("div",{style:{marginTop:6},children:[e.jsxs("div",{style:{fontSize:10,color:"var(--text-muted)",fontWeight:600,marginBottom:3,display:"flex",alignItems:"center",gap:3},children:[e.jsx(m.CornerDownRight,{size:10})," ",f.display_name||f.signal_key,f.confidence!=null&&e.jsxs("span",{style:{fontWeight:400,opacity:.7},children:[" (",Math.round(f.confidence*100),"%)"]})]}),(x=f.evidence)==null?void 0:x.map((z,w)=>e.jsx(ye,{ev:z,onPlay:o,onHighlight:l},w))]},p)})]},d)})})}):null}function Te({nba:t}){const o=(t==null?void 0:t.recommendations)||(t==null?void 0:t.actions)||[];return o.length?e.jsx(j.DetailCard,{title:"Next Best Actions",children:e.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6},children:o.slice(0,8).map((l,s)=>e.jsxs("div",{style:{fontSize:11,color:"var(--text-muted)",display:"flex",alignItems:"center",gap:4},children:[e.jsx(m.Target,{size:12})," ",e.jsx("strong",{style:{color:"var(--text-base)"},children:l.action||l.title||""}),l.rationale&&` — ${l.rationale}`]},s))})}):null}function Ie({audioUrl:t,timelineSegments:o,durationSeconds:l,currentTimeSeconds:s,timelinePlaying:n,playbackRate:d,onSeek:a,onTogglePlay:c,onSeekBack:v,onSeekForward:f,onSetPlaybackRate:p,audioRef:x}){return t?e.jsxs(j.DetailCard,{title:"Recording",children:[e.jsx(j.Timeline,{segments:o,durationSeconds:l||0,currentTimeSeconds:s,onSeek:a,showControls:!0,hasRecording:!0,timelinePlaying:n,playbackRate:d,onTogglePlay:c,onSeekBack:v,onSeekForward:f,onSetPlaybackRate:p}),e.jsx("audio",{ref:x,preload:"none",style:{display:"none"},children:e.jsx("source",{src:t,type:"audio/mpeg"})})]}):null}function _e({transcript:t,audioUrl:o,highlightedTurns:l,activeTurnIndex:s,timelinePlaying:n,turnObservations:d,setExpandedSignals:a,onTurnPlayPause:c}){var p;if(!((p=t==null?void 0:t.messages)!=null&&p.length))return null;const v=(x,z)=>{if(x==null)return;const w=C=>{const T=Math.floor(C/6e4),I=Math.floor(C%6e4/1e3);return`${T.toString().padStart(2,"0")}:${I.toString().padStart(2,"0")}`},k=w(x),S=z!=null?w(z):k;return`${k}–${S}`},f=t.messages.map((x,z)=>{var w,k;return{actor:x.actor==="agent"?((w=t.actor_map)==null?void 0:w.agent)||"Agent":((k=t.actor_map)==null?void 0:k.customer)||"Customer",actorType:x.actor==="agent"?"agent":"customer",text:x.text||"",timeRange:v(x.start??x.start_ms,x.end??x.end_ms),isHighlighted:l.has(z),highlightColor:n&&s===z?x.actor==="agent"?"var(--rail-outcome)":"var(--rail-discovery)":void 0,observations:(d[z]||[]).map(S=>({...S,onClick:()=>{a(C=>new Set([...C,S.signalKey])),setTimeout(()=>{const C=document.getElementById(`signal-${S.signalKey}`);C&&C.scrollIntoView({behavior:"smooth",block:"nearest"})},100)}}))}});return e.jsx("div",{id:"transcript-container",children:e.jsx(j.TranscriptCard,{turns:f,audioUrl:o,activeTurnIndex:s,autoScrollActiveTurn:n,isExternalPlaying:n,onTurnPlayPause:c})})}const fe={padding:0,border:"none",background:"transparent",fontSize:"12px",fontWeight:500,color:"rgba(30, 33, 37, 0.65)",cursor:"pointer",fontFamily:"inherit"};function Le({sessionTitle:t,sessionSubtitle:o,threadLabel:l,messages:s=[],onSendMessage:n,onReplyMessage:d,onEditMessage:a,onDeleteMessage:c,onCreateNewThread:v,currentUser:f,isLoading:p=!1}){const[x,z]=g.useState(""),[w,k]=g.useState(!1),[S,C]=g.useState(s),[T,I]=g.useState(!1),[R,P]=g.useState(null),[F,W]=g.useState(null),[K,_]=g.useState(""),[V,N]=g.useState(null),[xe,O]=g.useState(""),[U,q]=g.useState(null),[ue,G]=g.useState(!1),[A,Z]=g.useState(""),[H,te]=g.useState(!1),Y=g.useRef(null),J=g.useRef(null),Q=f||{name:"You",initials:"YO",color:"#6B7C93"},ne=l||t||o,ge=F?S.find(r=>r.id===F):null;g.useEffect(()=>{C(s)},[s]),g.useEffect(()=>{Y.current&&(!S||S.length===0||Y.current.scrollIntoView({behavior:"smooth"}))},[S]);const X=async()=>{const r=A.trim();if(r){te(!0);try{await(v==null?void 0:v(r)),Z(""),G(!1)}finally{te(!1)}}},re=()=>{G(!1),Z("")},ee=async()=>{const r=x.trim();if(!r)return;const u=r;z("");const $=`temp-${Date.now()}`,pe={id:$,author:Q,content:u,timestamp:"Just now",type:"comment",isOptimistic:!0};if(C(i=>[...i,pe]),n){I(!0);try{await n(u),C(i=>i.map(y=>y.id===$?{...y,isOptimistic:!1}:y))}catch{C(i=>i.filter(y=>y.id!==$))}finally{I(!1)}return}C(i=>i.map(y=>y.id===$?{...y,isOptimistic:!1}:y))},ie=r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),ee())},oe=r=>{W(r.id),_(""),N(null),O(""),P(null),d==null||d(r)},se=async r=>{const u=K.trim();if(u){I(!0);try{await(n==null?void 0:n(u,r)),W(null),_("")}finally{I(!1)}}},ae=r=>{N(r.id),O(r.content||""),W(null),_(""),P(null),a==null||a(r)},le=async()=>{const r=xe.trim();!r||!V||(await(a==null?void 0:a({id:V,content:r})),N(null),O(""))},ce=r=>{q(r),P(null)},de=async()=>{if(!U)return;const r=U;q(null),await(c==null?void 0:c(r))};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"rgba(255, 255, 255, 0.98)",border:"1px solid rgba(52, 58, 64, 0.12)",borderRadius:"12px",overflow:"hidden",position:"relative"},children:[U&&e.jsx("div",{style:{position:"absolute",inset:0,zIndex:50,display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(30, 33, 37, 0.35)",borderRadius:"12px"},onClick:()=>q(null),children:e.jsxs("div",{style:{background:"white",borderRadius:"12px",padding:"20px 24px",boxShadow:"0 8px 24px rgba(30, 33, 37, 0.15)",maxWidth:"320px",width:"90%"},onClick:r=>r.stopPropagation(),children:[e.jsx("p",{style:{margin:0,marginBottom:"20px",fontSize:"14px",fontWeight:500,color:"rgba(30, 33, 37, 0.9)",lineHeight:1.45},children:"Do you really want to delete?"}),e.jsxs("div",{style:{display:"flex",gap:"10px",justifyContent:"flex-end"},children:[e.jsx("button",{type:"button",onClick:()=>q(null),style:{padding:"8px 16px",fontSize:"12px",fontWeight:600,color:"rgba(30, 33, 37, 0.45)",background:"rgba(30, 33, 37, 0.1)",border:"none",borderRadius:"6px",cursor:"pointer"},children:"Cancel"}),e.jsx("button",{type:"button",onClick:de,style:{padding:"8px 16px",fontSize:"12px",fontWeight:600,color:"white",background:"#5e88b0",border:"none",borderRadius:"6px",cursor:"pointer"},children:"Delete"})]})]})}),ne&&e.jsx("div",{style:{padding:"14px 16px",borderBottom:"1px solid rgba(52, 58, 64, 0.12)",background:"rgba(255, 255, 255, 0.98)"},children:e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",gap:"8px"},children:[e.jsxs("div",{children:[e.jsx("div",{style:{fontSize:"14px",fontWeight:600,color:"rgba(30, 33, 37, 0.95)",marginBottom:"4px"},children:l||"Session Discussion"}),(t||o)&&e.jsx("div",{style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.52)"},children:t||o})]}),e.jsxs("button",{type:"button",onClick:()=>{G(r=>!r)},style:{display:"inline-flex",alignItems:"center",gap:"6px",padding:"6px 12px",fontSize:"13px",fontWeight:500,color:"rgba(30, 33, 37, 0.75)",background:"transparent",border:"1px solid rgba(30, 33, 37, 0.12)",borderRadius:"6px",cursor:"pointer",transition:"background 0.15s ease, color 0.15s ease"},onMouseEnter:r=>{r.currentTarget.style.background="rgba(231, 212, 162, 0.12)",r.currentTarget.style.color="rgba(30, 33, 37, 0.9)"},onMouseLeave:r=>{r.currentTarget.style.background="transparent",r.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},title:"Start a new discussion thread",children:[e.jsx("span",{style:{fontSize:16,lineHeight:1,marginTop:-1},children:"+"}),"New thread"]})]})}),e.jsxs("div",{style:{flex:1,overflowY:"auto",padding:"16px",display:"flex",flexDirection:"column",gap:"16px"},children:[ue&&e.jsxs("div",{style:{marginBottom:"16px",padding:"12px",background:"rgba(30, 33, 37, 0.04)",border:"1px solid rgba(52, 58, 64, 0.14)",borderRadius:"8px"},children:[e.jsx("textarea",{value:A,onChange:r=>Z(r.target.value),onKeyDown:r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),X())},placeholder:"Start a new thread...",disabled:H,style:{width:"100%",minHeight:"64px",padding:"8px 12px",fontSize:"13px",color:"rgba(30, 33, 37, 0.88)",background:"white",border:"1px solid rgba(52, 58, 64, 0.16)",borderRadius:"6px",resize:"vertical",outline:"none",fontFamily:"inherit",lineHeight:1.5,marginBottom:"10px"}}),e.jsxs("div",{style:{display:"flex",gap:"8px",justifyContent:"flex-end"},children:[e.jsx("button",{type:"button",onClick:re,disabled:H,style:{padding:"6px 14px",fontSize:"12px",fontWeight:500,color:"rgba(30, 33, 37, 0.7)",background:"rgba(30, 33, 37, 0.08)",border:"none",borderRadius:"6px",cursor:H?"not-allowed":"pointer"},children:"Cancel"}),e.jsx("button",{type:"button",onClick:X,disabled:!A.trim()||H,style:{padding:"6px 14px",fontSize:"12px",fontWeight:600,color:"white",background:A.trim()&&!H?"#5e88b0":"rgba(30, 33, 37, 0.25)",border:"none",borderRadius:"6px",cursor:A.trim()&&!H?"pointer":"not-allowed"},children:H?"Sending...":"Send"})]})]}),p?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"rgba(30, 33, 37, 0.42)"},children:"Loading messages..."}):S.length===0?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"rgba(30, 33, 37, 0.42)"},children:"No messages yet. Start the conversation!"}):S.map(r=>e.jsxs("div",{onMouseEnter:()=>r.type!=="system"&&P(r.id),onMouseLeave:()=>P(null),style:{display:"flex",gap:"12px",opacity:r.type==="system"?.75:1,padding:"4px 0",margin:"0 -4px",borderRadius:"8px"},children:[r.type!=="system"?e.jsx("div",{style:{width:"36px",height:"36px",borderRadius:"50%",background:r.author.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0},children:r.author.initials}):e.jsx("div",{style:{width:"36px",height:"36px",borderRadius:"50%",background:"rgba(30, 33, 37, 0.1)",color:"rgba(30, 33, 37, 0.55)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:e.jsx(m.Clock,{size:16})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",flexWrap:"wrap",gap:"8px",marginBottom:"6px",justifyContent:"space-between"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",flexWrap:"wrap",gap:"8px"},children:[e.jsx("span",{style:{fontSize:"13px",fontWeight:650,color:"rgba(30, 33, 37, 0.9)"},children:r.author.name}),e.jsx("span",{style:{fontSize:"10px",fontFamily:"var(--default-mono-font-family)",color:"rgba(30, 33, 37, 0.5)"},children:r.timestamp})]}),r.type!=="system"&&R===r.id&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"12px",flexShrink:0},children:[d&&e.jsx("button",{type:"button",onClick:u=>{u.preventDefault(),u.stopPropagation(),oe(r)},style:fe,children:"Reply"}),a&&e.jsx("button",{type:"button",onClick:u=>{u.preventDefault(),u.stopPropagation(),ae(r)},style:fe,children:"Edit"}),c&&e.jsx("button",{type:"button",onClick:u=>{u.preventDefault(),u.stopPropagation(),ce(r)},style:{...fe,color:"rgba(198, 99, 99, 0.9)"},children:"Delete"})]})]}),V===r.id?e.jsx("div",{style:{marginTop:"6px"},children:e.jsx("textarea",{value:xe,onChange:u=>O(u.target.value),onKeyDown:u=>{u.key==="Enter"&&!u.shiftKey&&(u.preventDefault(),le()),u.key==="Escape"&&(N(null),O(""))},placeholder:"Edit message...",autoFocus:!0,style:{width:"100%",minHeight:"64px",padding:"8px 12px",fontSize:"13px",color:"rgba(30, 33, 37, 0.88)",background:"white",border:"1px solid rgba(52, 58, 64, 0.2)",borderRadius:"6px",resize:"vertical",outline:"none",fontFamily:"inherit",lineHeight:1.5,marginBottom:"8px"}})}):e.jsx("div",{style:{fontSize:"13px",color:"rgba(30, 33, 37, 0.88)",lineHeight:1.55},children:r.content}),F===r.id&&e.jsx("div",{style:{marginTop:"12px"},children:e.jsx("textarea",{value:K,onChange:u=>_(u.target.value),onKeyDown:u=>{u.key==="Enter"&&!u.shiftKey&&(u.preventDefault(),se(r.id)),u.key==="Escape"&&(W(null),_(""))},placeholder:"Type your reply...",disabled:T,autoFocus:!0,style:{width:"100%",minHeight:"64px",padding:"8px 12px",fontSize:"13px",color:"rgba(30, 33, 37, 0.88)",background:"white",border:"1px solid rgba(52, 58, 64, 0.16)",borderRadius:"6px",resize:"vertical",outline:"none",fontFamily:"inherit",lineHeight:1.5,marginBottom:"10px"}})})]})]},r.id)),e.jsx("div",{ref:Y})]}),e.jsx("div",{style:{padding:"12px",borderTop:"1px solid rgba(52, 58, 64, 0.12)",background:"rgba(255, 255, 255, 0.95)"},children:e.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"flex-end"},children:[e.jsx("div",{style:{width:"36px",height:"36px",borderRadius:"50%",background:Q.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0},children:Q.initials}),e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:"8px"},children:[e.jsx("textarea",{ref:J,value:x,onChange:r=>z(r.target.value),onKeyDown:ie,onFocus:()=>k(!0),onBlur:()=>k(!1),placeholder:ge?"Type your reply...":"Add a comment...",style:{width:"100%",minHeight:"38px",maxHeight:"120px",padding:"8px 12px",fontSize:"13px",color:"rgba(30, 33, 37, 0.85)",background:"white",border:`1px solid ${w?"rgba(94, 136, 176, 0.35)":"rgba(52, 58, 64, 0.16)"}`,borderRadius:"8px",resize:"vertical",outline:"none",transition:"border-color 0.15s ease",fontFamily:"inherit",lineHeight:1.5}}),e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end"},children:e.jsx("button",{type:"button",onClick:ee,disabled:!x.trim()||T,style:{padding:"8px 16px",background:x.trim()&&!T?"#5e88b0":"rgba(30, 33, 37, 0.1)",border:"none",borderRadius:"6px",color:x.trim()&&!T?"white":"rgba(30, 33, 37, 0.45)",fontSize:"12px",fontWeight:600,cursor:x.trim()&&!T?"pointer":"not-allowed",display:"flex",alignItems:"center",gap:"6px",transition:"all 0.15s ease"},children:T?e.jsxs(e.Fragment,{children:[e.jsx("div",{style:{width:"14px",height:"14px",border:"2px solid rgba(255, 255, 255, 0.3)",borderTopColor:"white",borderRadius:"50%",animation:"spin 0.6s linear infinite"}}),"Sending..."]}):e.jsxs(e.Fragment,{children:[e.jsx(m.Send,{size:14}),"Send"]})})})]})]})})]})}function E(t,o){return t.find(l=>l.block_id===o)}function Pe({data:t,audioUrl:o,coachingData:l,coachingLoading:s,coachingError:n}){var re,ee,ie,oe,se,ae,le,ce,de,r,u,$,pe;const d=t.blocks||[];t.evidence_index;const a=g.useRef(null),c=g.useRef(null),[v,f]=g.useState(new Set),[p,x]=g.useState(new Set),[z,w]=g.useState(0),[k,S]=g.useState(!1),[C,T]=g.useState(1),I=((re=E(d,"interaction-metadata"))==null?void 0:re.payload)||{},R=((ee=E(d,"interaction-context"))==null?void 0:ee.payload)||{},P=((ie=E(d,"interaction-summary"))==null?void 0:ie.payload)||{},F=((oe=E(d,"interaction-scores"))==null?void 0:oe.payload)||{},W=((se=E(d,"interaction-signals"))==null?void 0:se.payload)||{},K=((ae=E(d,"interaction-guidance"))==null?void 0:ae.payload)||{},_=((le=E(d,"interaction-transcript"))==null?void 0:le.payload)||{},V=((ce=E(d,"interaction-message-thread"))==null?void 0:ce.payload)||{},N=((de=E(d,"interaction-nba"))==null?void 0:de.payload)||{},O=((((r=E(d,"interaction-dimensions"))==null?void 0:r.payload)||{}).dimensions||[]).filter(i=>i.value),U=((u=E(d,"interaction-outcome-lift"))==null?void 0:u.payload)||{},q=g.useMemo(()=>{var h;const i={},y={outcome:{color:"var(--rail-outcome)"},process:{color:"var(--rail-discovery)"},compliance:{color:"var(--rail-compliance)"},customer_friction:{color:"var(--rail-coral)"},experience:{color:"var(--rail-teal)"}};for(const b of W.signals||[]){const D=y[b.group]||{};for(const B of b.observations||[])for(const L of B.evidence||[])if((h=L.turn_ids)!=null&&h.length)for(const M of L.turn_ids)i[M]||(i[M]=[]),i[M].some(De=>De.label===(B.key||b.display_name||b.key))||i[M].push({label:B.key||b.display_name||b.key,reason:B.reason||B.explanation||"",color:D.color||"var(--state-present)",signalKey:b.key})}return i},[W.signals]),ue=(($=_.messages)==null?void 0:$.map((i,y)=>{var L,M;const h=i.start??i.start_ms?(i.start??i.start_ms)/1e3:0,b=i.end??i.end_ms?(i.end??i.end_ms)/1e3:h+1,D=i.actor==="agent",B=D?((L=_.actor_map)==null?void 0:L.agent)||"Agent":((M=_.actor_map)==null?void 0:M.customer)||"Customer";return{startTime:h,endTime:b,actor:B,actorColor:D?"var(--rail-outcome)":"var(--rail-discovery)"}}))||[],G=g.useMemo(()=>{if(!k&&z===0)return-1;const i=_.messages||[],y=z*1e3;for(let h=i.length-1;h>=0;h--){const b=i[h].start??i[h].start_ms;if(b!=null&&y>=b)return h}return-1},[z,k,_.messages]),A=i=>{a.current&&(a.current.currentTime=i,w(i))},Z=()=>{if(a.current)if(k)a.current.pause(),S(!1);else{const i=a.current.play();i!==void 0&&i.catch(()=>{}),S(!0)}},H=()=>{a.current&&(a.current.currentTime=Math.max(0,a.current.currentTime-15))},te=()=>{if(a.current){const i=I.duration_seconds||a.current.duration||0;a.current.currentTime=Math.min(i,a.current.currentTime+15)}},Y=i=>{a.current&&(a.current.playbackRate=i,T(i))};g.useEffect(()=>{const i=a.current;if(!i)return;const y=()=>w(i.currentTime),h=()=>S(!0),b=()=>S(!1),D=()=>S(!1);return i.addEventListener("timeupdate",y),i.addEventListener("play",h),i.addEventListener("pause",b),i.addEventListener("ended",D),()=>{i.removeEventListener("timeupdate",y),i.removeEventListener("play",h),i.removeEventListener("pause",b),i.removeEventListener("ended",D)}},[o]);const J=(i,y)=>{const h=a.current;if(!h)return;const b=i/1e3;h.currentTime=b,w(b);const D=h.play();if(D!==void 0&&D.catch(()=>{}),c.current&&(h.removeEventListener("timeupdate",c.current),c.current=null),y!=null){const B=y/1e3,L=()=>{h.currentTime>=B&&(h.pause(),c.current&&(h.removeEventListener("timeupdate",c.current),c.current=null))};c.current=L,h.addEventListener("timeupdate",L)}},Q=(i,y)=>{const b=(_.messages||[])[y],D=a.current;if(!b||!D)return;const B=b.start??b.start_ms,L=b.end??b.end_ms;if(k&&G===y){D.pause();return}B!=null&&J(B,L)},ne=i=>{f(new Set(i));const y=document.getElementById("transcript-container");y&&y.scrollIntoView({behavior:"smooth",block:"nearest"}),setTimeout(()=>f(new Set),5e3)},ge=i=>{x(y=>{const h=new Set(y);return h.has(i)?h.delete(i):h.add(i),h})},X=((pe=R.call_purpose)==null?void 0:pe.interaction_driver)||P.one_liner||"Interaction Detail";return e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[e.jsx(ke,{title:X,meta:I,callPurpose:R.call_purpose,classification:R.classification,dimensions:O}),e.jsx(ze,{scores:F.scores}),e.jsx(je,{outcomeLift:U}),(s||l||n)&&e.jsx(j.DetailCard,{title:"Coaching Summary",children:e.jsx(Se,{data:l,loading:s,error:n})}),e.jsx(Ce,{signals:W,expandedSignals:p,toggleSignal:ge,playAudio:J,highlightTurns:ne}),e.jsx(we,{guidance:K,playAudio:J,highlightTurns:ne}),e.jsx(Te,{nba:N}),e.jsx(Ie,{audioUrl:o,timelineSegments:ue,durationSeconds:I.duration_seconds,currentTimeSeconds:z,timelinePlaying:k,playbackRate:C,onSeek:A,onTogglePlay:Z,onSeekBack:H,onSeekForward:te,onSetPlaybackRate:Y,audioRef:a}),e.jsx(_e,{transcript:_,audioUrl:o,highlightedTurns:v,activeTurnIndex:G,timelinePlaying:k,turnObservations:q,setExpandedSignals:x,onTurnPlayPause:Q}),e.jsx(Le,{messageThread:V,sessionTitle:X,messages:[]})]})}class He extends g.Component{constructor(o){super(o),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(o,l){console.error("InteractionDetailPanel render error:",o,l==null?void 0:l.componentStack)}render(){return this.state.hasError?this.props.fallback:this.props.children}}function Fe(t){return e.jsx(He,{fallback:e.jsx("div",{style:{padding:16,color:"var(--state-unknown)",fontSize:12},children:"Error rendering detail."}),children:e.jsx(Pe,{...t})})}function Oe({pattern:t}){const[o,l]=g.useState(!1),s={name:"Customer Escalation Likelihood",description:"Based on observed patterns, this session shows indicators consistent with potential escalation.",technicalKey:"signal.escalation_likelihood",probability:.68,confidence:.81,observations:3};return t==="text-link"?e.jsxs("div",{style:{position:"relative",background:"rgba(255, 255, 255, 0.82)",border:"1px solid rgba(52, 58, 64, 0.12)",borderRadius:"12px",overflow:"hidden",boxShadow:"0 2px 4px rgba(30, 33, 37, 0.06)"},children:[e.jsx("div",{style:{position:"absolute",left:0,top:0,bottom:0,width:"5px",background:"#6B7C93",opacity:.6}}),e.jsxs("div",{style:{padding:"14px 16px 14px 21px"},children:[e.jsx("div",{style:{marginBottom:"4px"},children:e.jsx("span",{style:{fontSize:"13px",fontWeight:680,color:"rgba(30, 33, 37, 0.92)",lineHeight:1.2},children:s.name})}),e.jsx("div",{style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.65)",lineHeight:1.4,marginBottom:"6px"},children:s.description}),e.jsx("div",{style:{fontSize:"11px",color:"rgba(30, 33, 37, 0.42)",fontFamily:"ui-monospace, monospace",marginBottom:"8px"},children:s.technicalKey}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"12px",fontSize:"11.5px",marginBottom:"10px"},children:[e.jsx("span",{style:{color:"rgba(139, 157, 127, 0.65)"},children:"prob"}),e.jsx("strong",{style:{color:"rgba(139, 157, 127, 0.85)"},children:s.probability.toFixed(2)}),e.jsx("span",{style:{color:"rgba(30, 33, 37, 0.24)"},children:"·"}),e.jsx("span",{style:{color:"rgba(184, 156, 106, 0.65)"},children:"conf"}),e.jsx("strong",{style:{color:"rgba(184, 156, 106, 0.85)"},children:s.confidence.toFixed(2)}),e.jsx("span",{style:{color:"rgba(30, 33, 37, 0.24)"},children:"·"}),e.jsxs("span",{style:{color:"rgba(30, 33, 37, 0.52)"},children:[s.observations," observations"]})]}),!o&&e.jsx("button",{onClick:()=>l(!0),style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.56)",background:"none",border:"none",padding:0,cursor:"pointer",textDecoration:"underline",textDecorationColor:"rgba(30, 33, 37, 0.2)"},onMouseEnter:n=>{n.currentTarget.style.color="rgba(30, 33, 37, 0.78)",n.currentTarget.style.textDecorationColor="rgba(30, 33, 37, 0.4)"},onMouseLeave:n=>{n.currentTarget.style.color="rgba(30, 33, 37, 0.56)",n.currentTarget.style.textDecorationColor="rgba(30, 33, 37, 0.2)"},children:"View contributing observations"})]}),o&&e.jsxs("div",{style:{borderTop:"1px solid rgba(52, 58, 64, 0.08)",background:"rgba(244, 241, 230, 0.25)",padding:"16px 16px 16px 21px"},children:[e.jsx("div",{style:{fontSize:"10px",fontWeight:650,letterSpacing:"0.08em",textTransform:"uppercase",color:"rgba(30, 33, 37, 0.52)",marginBottom:"8px"},children:"Contributing Observations"}),e.jsx("div",{style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.62)"},children:"[Observations would appear here]"}),e.jsx("button",{onClick:()=>l(!1),style:{marginTop:"10px",fontSize:"12px",color:"rgba(30, 33, 37, 0.56)",background:"none",border:"none",padding:0,cursor:"pointer",textDecoration:"underline",textDecorationColor:"rgba(30, 33, 37, 0.2)"},onMouseEnter:n=>{n.currentTarget.style.color="rgba(30, 33, 37, 0.78)",n.currentTarget.style.textDecorationColor="rgba(30, 33, 37, 0.4)"},onMouseLeave:n=>{n.currentTarget.style.color="rgba(30, 33, 37, 0.56)",n.currentTarget.style.textDecorationColor="rgba(30, 33, 37, 0.2)"},children:"Hide observations"})]})]}):t==="rotating-chevron"?e.jsxs("div",{style:{position:"relative",background:"rgba(255, 255, 255, 0.82)",border:"1px solid rgba(52, 58, 64, 0.12)",borderRadius:"12px",overflow:"hidden",boxShadow:"0 2px 4px rgba(30, 33, 37, 0.06)"},children:[e.jsx("div",{style:{position:"absolute",left:0,top:0,bottom:0,width:"5px",background:"#6B7C93",opacity:.6}}),e.jsx("button",{type:"button",onClick:()=>l(!o),style:{width:"100%",padding:"14px 16px 14px 21px",background:"transparent",border:"none",cursor:"pointer",textAlign:"left",transition:"background 0.15s ease"},onMouseEnter:n=>{n.currentTarget.style.background="rgba(231, 212, 162, 0.08)"},onMouseLeave:n=>{n.currentTarget.style.background="transparent"},children:e.jsxs("div",{style:{display:"flex",alignItems:"flex-start",gap:"12px"},children:[e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{marginBottom:"4px"},children:e.jsx("span",{style:{fontSize:"13px",fontWeight:680,color:"rgba(30, 33, 37, 0.92)",lineHeight:1.2},children:s.name})}),e.jsx("div",{style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.65)",lineHeight:1.4,marginBottom:"6px"},children:s.description}),e.jsx("div",{style:{fontSize:"11px",color:"rgba(30, 33, 37, 0.42)",fontFamily:"ui-monospace, monospace",marginBottom:"8px"},children:s.technicalKey}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"12px",fontSize:"11.5px"},children:[e.jsx("span",{style:{color:"rgba(139, 157, 127, 0.65)"},children:"prob"}),e.jsx("strong",{style:{color:"rgba(139, 157, 127, 0.85)"},children:s.probability.toFixed(2)}),e.jsx("span",{style:{color:"rgba(30, 33, 37, 0.24)"},children:"·"}),e.jsx("span",{style:{color:"rgba(184, 156, 106, 0.65)"},children:"conf"}),e.jsx("strong",{style:{color:"rgba(184, 156, 106, 0.85)"},children:s.confidence.toFixed(2)}),e.jsx("span",{style:{color:"rgba(30, 33, 37, 0.24)"},children:"·"}),e.jsxs("span",{style:{color:"rgba(30, 33, 37, 0.52)"},children:[s.observations," observations"]})]})]}),e.jsx("div",{style:{paddingTop:"2px",color:"rgba(30, 33, 37, 0.42)",flexShrink:0,transition:"transform 0.2s ease"},children:e.jsx(m.ChevronDown,{size:18,style:{transform:o?"rotate(180deg)":"rotate(0deg)",transition:"transform 0.2s ease"}})})]})}),o&&e.jsxs("div",{style:{borderTop:"1px solid rgba(52, 58, 64, 0.08)",background:"rgba(244, 241, 230, 0.25)",padding:"16px 16px 16px 21px"},children:[e.jsx("div",{style:{fontSize:"10px",fontWeight:650,letterSpacing:"0.08em",textTransform:"uppercase",color:"rgba(30, 33, 37, 0.52)",marginBottom:"8px"},children:"Contributing Observations"}),e.jsx("div",{style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.62)"},children:"[Observations would appear here]"})]})]}):e.jsxs("div",{style:{position:"relative",background:"rgba(255, 255, 255, 0.82)",border:"1px solid rgba(52, 58, 64, 0.12)",borderRadius:"12px",overflow:"hidden",boxShadow:"0 2px 4px rgba(30, 33, 37, 0.06)"},children:[e.jsx("div",{style:{position:"absolute",left:0,top:0,bottom:0,width:"5px",background:"#6B7C93",opacity:.6}}),e.jsxs("button",{type:"button",onClick:()=>l(!o),style:{width:"100%",padding:"14px 16px 14px 21px",background:"transparent",border:"none",cursor:"pointer",textAlign:"left",display:"flex",alignItems:"flex-start",gap:"12px",transition:"background 0.15s ease"},onMouseEnter:n=>{n.currentTarget.style.background="rgba(231, 212, 162, 0.08)"},onMouseLeave:n=>{n.currentTarget.style.background="transparent"},children:[e.jsx("div",{style:{paddingTop:"2px",color:"rgba(30, 33, 37, 0.42)",flexShrink:0},children:o?e.jsx(m.ChevronDown,{size:16}):e.jsx(m.ChevronRight,{size:16})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsx("div",{style:{marginBottom:"4px"},children:e.jsx("span",{style:{fontSize:"13px",fontWeight:680,color:"rgba(30, 33, 37, 0.92)",lineHeight:1.2},children:s.name})}),e.jsx("div",{style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.65)",lineHeight:1.4,marginBottom:"6px"},children:s.description}),e.jsx("div",{style:{fontSize:"11px",color:"rgba(30, 33, 37, 0.42)",fontFamily:"ui-monospace, monospace",marginBottom:"8px"},children:s.technicalKey}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"12px",fontSize:"11.5px"},children:[e.jsx("span",{style:{color:"rgba(139, 157, 127, 0.65)"},children:"prob"}),e.jsx("strong",{style:{color:"rgba(139, 157, 127, 0.85)"},children:s.probability.toFixed(2)}),e.jsx("span",{style:{color:"rgba(30, 33, 37, 0.24)"},children:"·"}),e.jsx("span",{style:{color:"rgba(184, 156, 106, 0.65)"},children:"conf"}),e.jsx("strong",{style:{color:"rgba(184, 156, 106, 0.85)"},children:s.confidence.toFixed(2)}),e.jsx("span",{style:{color:"rgba(30, 33, 37, 0.24)"},children:"·"}),e.jsxs("span",{style:{color:"rgba(30, 33, 37, 0.52)"},children:[s.observations," observations"]})]})]})]}),o&&e.jsxs("div",{style:{borderTop:"1px solid rgba(52, 58, 64, 0.08)",background:"rgba(244, 241, 230, 0.25)",padding:"16px 16px 16px 21px"},children:[e.jsx("div",{style:{fontSize:"10px",fontWeight:650,letterSpacing:"0.08em",textTransform:"uppercase",color:"rgba(30, 33, 37, 0.52)",marginBottom:"8px"},children:"Contributing Observations"}),e.jsx("div",{style:{fontSize:"12px",color:"rgba(30, 33, 37, 0.62)"},children:"[Observations would appear here]"})]})]})}exports.ConditionCard=j.ConditionCard;exports.ModelScoreCard=j.ModelScoreCard;exports.ObservationCard=j.ObservationCard;exports.ScoreDriverCard=j.ScoreDriverCard;exports.ScoreDriverCardVariant=j.ScoreDriverCardVariant;exports.SignalCard=j.SignalCard;exports.SmallObservationCard=j.SmallObservationCard;exports.SummarySection=j.SummarySection;exports.AgentLiftCard=je;exports.CoachingSynthesisCard=Se;exports.EvidenceItem=ye;exports.ExpandPatternComparison=Oe;exports.InteractionContext=ke;exports.InteractionDetailPanel=Fe;exports.InteractionGuidance=we;exports.InteractionNBA=Te;exports.InteractionRecording=Ie;exports.InteractionScores=ze;exports.InteractionSignals=Ce;exports.InteractionTranscript=_e;
11
+ //# sourceMappingURL=interactionDetails.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactionDetails.cjs.js","sources":["../../src/components/common/EvidenceItem.jsx","../../src/components/common/AgentLiftCard.jsx","../../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":["import React from 'react';\r\nimport { User, UserCheck, Play, ScrollText } from 'lucide-react';\r\nimport SmallButton from '../primitives/SmallButton.jsx';\r\n\r\nfunction fmtMs(ms) {\r\n return `${Math.floor(ms / 60000)}:${String(Math.floor((ms % 60000) / 1000)).padStart(2, '0')}`;\r\n}\r\n\r\nexport default function EvidenceItem({ ev, onPlay, onHighlight }) {\r\n const actor = ev.actor === 'agent' ? <UserCheck size={11} /> : <User size={11} />;\r\n return (\r\n <div style={{\r\n fontSize: 'var(--text-sm)', padding: '6px 10px', borderRadius: 'var(--radius-sm)',\r\n background: 'var(--paper-elevated)', border: '1px solid var(--border)', marginTop: 4,\r\n }}>\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 5, marginBottom: 3 }}>\r\n <span style={{ color: 'var(--text-muted)' }}>{actor}</span>\r\n {ev.source && <span style={{ color: 'var(--text-muted)', fontWeight: 500 }}>{ev.source}</span>}\r\n <span style={{ marginLeft: 'auto', display: 'flex', gap: 4, alignItems: 'center' }}>\r\n {ev.start_ms != null && (\r\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onPlay(ev.start_ms, ev.end_ms)} title=\"Play audio\"><Play size={10} /></SmallButton>\r\n )}\r\n {ev.turn_ids?.length > 0 && (\r\n <SmallButton variant=\"ghost\" size=\"sm\" onClick={() => onHighlight(ev.turn_ids)} title=\"Show in transcript\"><ScrollText size={10} /></SmallButton>\r\n )}\r\n {ev.start_ms != null && (\r\n <span style={{ fontSize: 'var(--text-xs)', color: 'var(--text-faint)' }}>{fmtMs(ev.start_ms)}</span>\r\n )}\r\n </span>\r\n </div>\r\n <div style={{ color: 'var(--text-base)', fontStyle: 'italic', lineHeight: 1.4 }}>\"{(ev.text || '').slice(0, 200)}\"</div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport { TrendingUp } from 'lucide-react';\r\nimport DetailCard from '../primitives/DetailCard.jsx';\r\nimport Tag from '../primitives/Tag.jsx';\r\n\r\nexport default function AgentLiftCard({ outcomeLift }) {\r\n if (outcomeLift.lift == null) return null;\r\n\r\n const pExpected = outcomeLift.p_expected;\r\n const pFull = outcomeLift.p_full;\r\n const liftRaw = outcomeLift.lift_raw ?? (pFull != null && pExpected != null ? pFull - pExpected : null);\r\n const liftRecentered = outcomeLift.lift;\r\n\r\n const fmtPct = (v) => v != null ? Math.round(v * 100) + '%' : '—';\r\n const fmtPp = (v) => {\r\n if (v == null) return '—';\r\n const pp = (v * 100).toFixed(1);\r\n return v > 0 ? `+${pp}pp` : `${pp}pp`;\r\n };\r\n\r\n const liftColor = (v) =>\r\n v > 0 ? 'var(--state-present)' : v < 0 ? '#f87171' : 'var(--text-muted)';\r\n\r\n return (\r\n <DetailCard title={\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\r\n <TrendingUp size={12} /> Agent Lift Analysis\r\n </div>\r\n }>\r\n {/* Main equation row: Baseline + Impact = Outcome */}\r\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 16 }}>\r\n {/* Call Difficulty Baseline */}\r\n <div style={{ textAlign: 'center', flex: 1 }}>\r\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-faint)' }}>\r\n {fmtPct(pExpected)}\r\n </div>\r\n <div style={{ fontSize: 10, color: 'var(--text-faint)', marginTop: 2 }}>Expected Outcome</div>\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Based on call type & difficulty</div>\r\n </div>\r\n\r\n {/* Plus sign */}\r\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>+</div>\r\n\r\n {/* Agent Impact (raw lift) */}\r\n <div style={{ textAlign: 'center', flex: 1 }}>\r\n <div style={{ fontSize: 20, fontWeight: 700, color: liftColor(liftRaw) }}>\r\n {fmtPp(liftRaw)}\r\n </div>\r\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Agent Impact</div>\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>Behavior-driven change</div>\r\n </div>\r\n\r\n {/* Equals sign */}\r\n <div style={{ fontSize: 16, color: 'var(--text-faint)', fontWeight: 300 }}>=</div>\r\n\r\n {/* Agent Outcome */}\r\n <div style={{ textAlign: 'center', flex: 1 }}>\r\n <div style={{ fontSize: 20, fontWeight: 600, color: 'var(--text-ink)' }}>\r\n {fmtPct(pFull)}\r\n </div>\r\n <div style={{ fontSize: 10, color: 'var(--text-muted)', marginTop: 2 }}>Predicted Outcome</div>\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', marginTop: 1 }}>With agent behaviors</div>\r\n </div>\r\n </div>\r\n\r\n {/* Recentered lift — the \"so what\" */}\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 8,\r\n padding: '8px 12px',\r\n borderRadius: 6,\r\n background: 'var(--surface-raised, #f5f5f5)',\r\n marginBottom: 12,\r\n }}>\r\n <span style={{ fontSize: 10, color: 'var(--text-muted)' }}>vs. Average Agent:</span>\r\n <span style={{\r\n fontSize: 14,\r\n fontWeight: 700,\r\n color: liftColor(liftRecentered),\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 4,\r\n }}>\r\n {fmtPp(liftRecentered)}\r\n <svg width=\"10\" height=\"7\">\r\n {liftRecentered > 0 ? (\r\n <path d=\"M5 0 L9 6 L1 6 Z\" fill=\"var(--state-present)\" />\r\n ) : liftRecentered < 0 ? (\r\n <path d=\"M5 6 L9 0 L1 0 Z\" fill=\"#f87171\" />\r\n ) : (\r\n <rect x=\"1\" y=\"2.5\" width=\"8\" height=\"1\" fill=\"var(--text-muted)\" />\r\n )}\r\n </svg>\r\n </span>\r\n {outcomeLift.interpretation?.lift_band && (\r\n <span style={{\r\n fontSize: 9,\r\n fontWeight: 600,\r\n color: liftColor(liftRecentered),\r\n textTransform: 'capitalize',\r\n }}>\r\n {outcomeLift.interpretation.lift_band.replace(/_/g, ' ')}\r\n </span>\r\n )}\r\n </div>\r\n\r\n {/* Key Drivers */}\r\n {outcomeLift.driver_signal_keys?.length > 0 && (\r\n <div>\r\n <div style={{ fontSize: 9, fontWeight: 600, color: 'var(--text-muted)', marginBottom: 6, textTransform: 'uppercase', letterSpacing: '0.04em' }}>\r\n Key Drivers\r\n </div>\r\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\r\n {outcomeLift.driver_signal_keys.map((key, i) => (\r\n <Tag key={i} variant=\"default\" size=\"xs\">\r\n {key.replace(/^sig\\./, '').replace(/_/g, ' ')}\r\n </Tag>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </DetailCard>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport React from \"react\";\r\nimport { TrendingUp, Lightbulb, Building, MessageSquareQuote } from \"lucide-react\";\r\n\r\n/**\r\n * CoachingSynthesisCard — displays LLM-generated coaching synthesis from Compass.\r\n *\r\n * Props:\r\n * - data object Coaching synthesis response (see shape below)\r\n * - loading boolean Show shimmer loading state\r\n * - error string Error message to display\r\n *\r\n * Data shape (from compass/summaries/coaching.py):\r\n * - one_liner string One-sentence summary\r\n * - context string Situational factors\r\n * - strengths Array<{ text: string, quote?: string }>\r\n * - improvements Array<{ text: string, quote?: string }>\r\n * - organizational Array<{ text: string, quote?: string }> (alias: organizational_insights)\r\n * - overall string \"effective\" | \"strong\" | \"needs_improvement\" | \"mixed\"\r\n */\r\n\r\nconst STYLE_ID = \"coaching-synthesis-keyframes\";\r\n\r\nfunction ensureKeyframes() {\r\n if (typeof document === \"undefined\") return;\r\n if (document.getElementById(STYLE_ID)) return;\r\n const style = document.createElement(\"style\");\r\n style.id = STYLE_ID;\r\n style.textContent = `\r\n @keyframes coaching-shimmer {\r\n 0% { background-position: -200% 0; }\r\n 100% { background-position: 200% 0; }\r\n }\r\n @keyframes coaching-pulse {\r\n 0%, 100% { opacity: 0.4; }\r\n 50% { opacity: 1; }\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\nexport default function CoachingSynthesisCard({ data, loading, error }) {\r\n React.useEffect(() => { ensureKeyframes(); }, []);\r\n\r\n // Loading state\r\n if (loading) {\r\n return (\r\n <div style={{\r\n padding: \"20px 0\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 12,\r\n }}>\r\n <div style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 8,\r\n }}>\r\n <div style={{\r\n width: 6,\r\n height: 6,\r\n borderRadius: \"50%\",\r\n background: \"var(--rail-tone)\",\r\n animation: \"coaching-pulse 1.5s ease-in-out infinite\",\r\n }} />\r\n <span style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--rail-tone)\",\r\n fontFamily: \"var(--font-sans)\",\r\n fontWeight: 500,\r\n }}>\r\n Compass is synthesizing coaching insights…\r\n </span>\r\n </div>\r\n {/* Shimmer lines */}\r\n {[180, 260, 220].map((w, i) => (\r\n <div\r\n key={i}\r\n style={{\r\n height: 10,\r\n width: w,\r\n maxWidth: \"100%\",\r\n borderRadius: 4,\r\n background: \"linear-gradient(90deg, var(--hover-warm-subtle) 25%, var(--hover-warm) 50%, var(--hover-warm-subtle) 75%)\",\r\n backgroundSize: \"200% 100%\",\r\n animation: `coaching-shimmer 1.8s ease-in-out infinite`,\r\n animationDelay: `${i * 0.2}s`,\r\n }}\r\n />\r\n ))}\r\n </div>\r\n );\r\n }\r\n\r\n // Error state\r\n if (error) {\r\n return (\r\n <div style={{\r\n padding: \"16px 0\",\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-faint)\",\r\n fontFamily: \"var(--font-sans)\",\r\n }}>\r\n Unable to generate coaching summary.\r\n </div>\r\n );\r\n }\r\n\r\n // No data\r\n if (!data) return null;\r\n\r\n const strengths = data.strengths || [];\r\n const improvements = data.improvements || [];\r\n const organizational = data.organizational || data.organizational_insights || [];\r\n const oneLiner = typeof data.one_liner === \"string\" ? data.one_liner : data.one_liner?.text || \"\";\r\n const context = typeof data.context === \"string\" ? data.context : data.context?.text || \"\";\r\n\r\n return (\r\n <div style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: 14,\r\n fontFamily: \"var(--font-sans)\",\r\n }}>\r\n {/* One-liner */}\r\n {oneLiner && (\r\n <div style={{\r\n fontSize: \"var(--text-lg)\",\r\n fontWeight: 600,\r\n color: \"var(--text-strong)\",\r\n lineHeight: 1.4,\r\n }}>\r\n {oneLiner}\r\n </div>\r\n )}\r\n\r\n {/* Context */}\r\n {context && (\r\n <div style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-muted)\",\r\n lineHeight: 1.45,\r\n }}>\r\n {context}\r\n </div>\r\n )}\r\n\r\n {/* Strengths */}\r\n {strengths.length > 0 && (\r\n <CoachingSection\r\n icon={<TrendingUp size={13} />}\r\n label=\"Strengths\"\r\n color=\"var(--rail-discovery)\"\r\n items={strengths}\r\n />\r\n )}\r\n\r\n {/* Improvements */}\r\n {improvements.length > 0 && (\r\n <CoachingSection\r\n icon={<Lightbulb size={13} />}\r\n label=\"Improvements\"\r\n color=\"var(--rail-compliance)\"\r\n items={improvements}\r\n />\r\n )}\r\n\r\n {/* Organizational */}\r\n {organizational.length > 0 && (\r\n <CoachingSection\r\n icon={<Building size={13} />}\r\n label=\"Organizational\"\r\n color=\"var(--rail-outcome)\"\r\n items={organizational}\r\n />\r\n )}\r\n\r\n {/* Overall rating */}\r\n {data.overall && (\r\n <div style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-faint)\",\r\n fontStyle: \"italic\",\r\n marginTop: 2,\r\n }}>\r\n Overall: {data.overall.replace(/_/g, \" \")}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CoachingSection({ icon, label, color, items }) {\r\n return (\r\n <div>\r\n {/* Section header */}\r\n <div style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: 5,\r\n marginBottom: 6,\r\n color,\r\n fontSize: \"var(--text-base)\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.04em\",\r\n }}>\r\n {icon}\r\n {label}\r\n </div>\r\n\r\n {/* Items */}\r\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 6 }}>\r\n {items.map((item, i) => {\r\n const text = typeof item === \"string\" ? item : item?.text || \"\";\r\n const quote = typeof item === \"object\" ? item?.quote : null;\r\n\r\n return (\r\n <div key={i} style={{ paddingLeft: 14 }}>\r\n <div style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-base)\",\r\n lineHeight: 1.4,\r\n }}>\r\n • {text}\r\n </div>\r\n {quote && (\r\n <div style={{\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: 4,\r\n marginTop: 3,\r\n paddingLeft: 8,\r\n }}>\r\n <MessageSquareQuote\r\n size={10}\r\n style={{\r\n color: \"var(--text-faint)\",\r\n flexShrink: 0,\r\n marginTop: 2,\r\n }}\r\n />\r\n <span style={{\r\n fontSize: \"var(--text-base)\",\r\n color: \"var(--text-muted)\",\r\n fontStyle: \"italic\",\r\n lineHeight: 1.35,\r\n }}>\r\n \"{quote}\"\r\n </span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import React from 'react';\r\nimport CardBase from '../../primitives/Card.jsx';\r\n\r\nfunction fmtDur(seconds) {\r\n const m = Math.floor(seconds / 60);\r\n const s = Math.round(seconds % 60);\r\n return `${m}:${s.toString().padStart(2, '0')}`;\r\n}\r\n\r\nexport default function InteractionContext({ title, meta, callPurpose, classification, dimensions }) {\r\n const cp = callPurpose || {};\r\n const cls = classification || {};\r\n\r\n return (\r\n <CardBase variant=\"elevated\" padding=\"sm\">\r\n <div style={{ fontSize: 'var(--text-md)', fontWeight: 550, color: 'var(--text-strong)', lineHeight: 1.375, marginBottom: 6 }}>\r\n {title}\r\n </div>\r\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: '4px 12px', fontSize: 11, color: 'var(--text-muted)' }}>\r\n {meta.evaluated_dt && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Date</span><div style={{ color: 'var(--text-base)' }}>{new Date(meta.evaluated_dt).toLocaleString()}</div></div>}\r\n {meta.duration_seconds != null && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Duration</span><div style={{ color: 'var(--text-base)' }}>{fmtDur(meta.duration_seconds)}</div></div>}\r\n {meta.message_count && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Messages</span><div style={{ color: 'var(--text-base)' }}>{meta.message_count}</div></div>}\r\n {cp.interaction_direction && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Direction</span><div style={{ color: 'var(--text-base)' }}>{cp.interaction_direction}</div></div>}\r\n {cp.interaction_driver && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Driver</span><div style={{ color: 'var(--text-base)' }}>{cp.interaction_driver}</div></div>}\r\n {cp.customer_intent && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Intent</span><div style={{ color: 'var(--text-base)' }}>{cp.customer_intent}</div></div>}\r\n {cls.interaction_paradigm && <div><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>Paradigm</span><div style={{ color: 'var(--text-base)' }}>{cls.interaction_paradigm}</div></div>}\r\n {dimensions.map((dim, i) => (\r\n <div key={i}><span style={{ fontSize: 10, color: 'var(--text-faint)' }}>{dim.label || dim.key}</span><div style={{ color: 'var(--text-base)' }}>{dim.value}</div></div>\r\n ))}\r\n </div>\r\n {meta.session_id && (\r\n <div style={{ fontSize: 9, color: 'var(--text-faint)', fontFamily: 'var(--font-mono)', marginTop: 4, userSelect: 'all' }}>\r\n {meta.session_id}\r\n </div>\r\n )}\r\n </CardBase>\r\n );\r\n}","import React from 'react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\n\r\nexport default function InteractionScores({ scores }) {\r\n if (!scores?.length) return null;\r\n\r\n return (\r\n <DetailCard title=\"Scores\">\r\n <div style={{ display: 'flex', gap: 24, flexWrap: 'wrap' }}>\r\n {scores.map((s, i) => {\r\n const val = s.value != null ? Math.round(s.value) : null;\r\n return (\r\n <div key={i} style={{ textAlign: 'center', minWidth: 48 }}>\r\n <div style={{ fontSize: 20, fontWeight: 700, color: 'var(--text-ink)' }}>{val ?? '—'}</div>\r\n <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 2 }}>{s.label || s.key}</div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </DetailCard>\r\n );\r\n}","import React, { useMemo } from 'react';\r\nimport { Target, CheckCircle, Lightbulb, Scale, Zap, MessageSquare, FileText, ChevronDown } from 'lucide-react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport SectionLabel from '../../primitives/SectionLabel.jsx';\r\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\r\n\r\nconst GROUP_LABELS = {\r\n outcome: { label: 'Outcome', icon: <Target size={12} />, color: 'var(--rail-outcome)' },\r\n process: { label: 'Process & Protocol', icon: <FileText size={12} />, color: 'var(--rail-discovery)' },\r\n compliance: { label: 'Compliance', icon: <Scale size={12} />, color: 'var(--rail-compliance)' },\r\n customer_friction: { label: 'Customer Friction', icon: <Zap size={12} />, color: 'var(--rail-coral)' },\r\n experience: { label: 'Experience', icon: <MessageSquare size={12} />, color: 'var(--rail-teal)' },\r\n};\r\n\r\nconst KIND_COLORS = {\r\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\r\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\r\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\r\n};\r\n\r\nexport default function InteractionSignals({ signals, expandedSignals, toggleSignal, playAudio, highlightTurns }) {\r\n if (!signals?.signals?.length) return null;\r\n\r\n const grouped = useMemo(() => {\r\n const result = {};\r\n for (const s of signals.signals) {\r\n const g = s.group || 'experience';\r\n if (!result[g]) result[g] = [];\r\n result[g].push(s);\r\n }\r\n return result;\r\n }, [signals]);\r\n\r\n return (\r\n <DetailCard title={`Signals (${signals.present_count} present / ${signals.total_signals_evaluated} evaluated)`}>\r\n {Object.entries(grouped).map(([groupKey, groupSignals]) => {\r\n const info = GROUP_LABELS[groupKey] || GROUP_LABELS.experience;\r\n\r\n return (\r\n <div key={groupKey} style={{ marginBottom: 10 }}>\r\n <SectionLabel style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\r\n {info.icon}\r\n <span>{info.label}</span>\r\n </SectionLabel>\r\n\r\n <div style={{ marginTop: 4, display: 'flex', flexDirection: 'column', gap: 6 }}>\r\n {groupSignals.map((s, i) => {\r\n const name = s.display_name || s.key || '';\r\n const delta = s.baseline?.delta;\r\n const hasObs = s.observations?.length > 0;\r\n const isExpanded = expandedSignals.has(s.key);\r\n \r\n // Map signal group to Tag variant\r\n const getVariant = (group) => {\r\n switch (group) {\r\n case 'outcome': return 'phase';\r\n case 'process': return 'tool';\r\n case 'compliance': return 'policy';\r\n case 'customer_friction': return 'default';\r\n case 'experience': return 'global';\r\n default: return 'default';\r\n }\r\n };\r\n \r\n return (\r\n <div\r\n key={i}\r\n id={`signal-${s.key}`}\r\n style={{\r\n border: '1px solid var(--border)',\r\n borderRadius: 'var(--radius-md)',\r\n background: 'var(--paper)',\r\n overflow: 'hidden',\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n if (hasObs) {\r\n toggleSignal(s.key);\r\n e.currentTarget.blur();\r\n }\r\n }}\r\n style={{\r\n width: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n padding: '6px 10px',\r\n background: 'transparent',\r\n border: 'none',\r\n cursor: hasObs ? 'pointer' : 'default',\r\n }}\r\n title={[\r\n s.confidence != null ? `Confidence: ${Math.round(s.confidence * 100)}%` : '',\r\n delta != null ? `Δ baseline: ${delta > 0 ? '+' : ''}${(delta * 100).toFixed(1)}%` : '',\r\n ].filter(Boolean).join(' · ')}\r\n >\r\n <span\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: 6,\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {KIND_COLORS[s.kind]?.icon}\r\n <span>{name}</span>\r\n {hasObs && (\r\n <span\r\n style={{\r\n marginLeft: 4,\r\n fontSize: 10,\r\n opacity: 0.6,\r\n }}\r\n >\r\n ({s.observations.length})\r\n </span>\r\n )}\r\n </span>\r\n {hasObs && (\r\n <ChevronDown\r\n size={14}\r\n style={{\r\n color: 'var(--text-muted)',\r\n flexShrink: 0,\r\n transform: isExpanded ? 'rotate(180deg)' : 'rotate(0deg)',\r\n transition: 'transform 0.16s ease',\r\n }}\r\n />\r\n )}\r\n </button>\r\n\r\n {isExpanded && s.observations && (\r\n <div style={{ width: '100%', margin: '0 0 6px' }}>\r\n {s.observations.map((obs, oi) => (\r\n <div key={oi} style={{\r\n fontSize: 'var(--text-sm)', color: 'var(--text-muted)', padding: '8px 12px',\r\n background: 'var(--paper)', borderLeft: `3px solid ${info.color}`,\r\n marginBottom: 6, borderRadius: '0 var(--radius-sm) var(--radius-sm) 0',\r\n }}>\r\n <div style={{ fontWeight: 600, color: 'var(--text-base)', marginBottom: 3, fontSize: 'var(--text-base)' }}>{obs.key || ''}</div>\r\n <div style={{ marginBottom: 6, lineHeight: 1.4 }}>{obs.reason || obs.explanation || ''}</div>\r\n {obs.evidence?.map((ev, ei) => (\r\n <EvidenceItem key={ei} ev={ev} onPlay={playAudio} onHighlight={highlightTurns} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport { CheckCircle, Lightbulb, Zap, CornerDownRight } from 'lucide-react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport EvidenceItem from '../../common/EvidenceItem.jsx';\r\n\r\nconst KIND_COLORS = {\r\n risk: { icon: <Zap size={10} />, color: 'var(--rail-signal-churn)' },\r\n opportunity: { icon: <Lightbulb size={10} />, color: 'var(--state-unknown)' },\r\n excellence: { icon: <CheckCircle size={10} />, color: 'var(--rail-teal)' },\r\n};\r\n\r\nexport default function InteractionGuidance({ guidance, playAudio, highlightTurns }) {\r\n if (!guidance?.items?.length) return null;\r\n\r\n return (\r\n <DetailCard title={`Guidance (${guidance.total_items} items)`}>\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\r\n {guidance.items.map((g, i) => {\r\n const ki = KIND_COLORS[g.guidance_kind] || KIND_COLORS.excellence;\r\n const ownerBadge = g.owner === 'organization'\r\n ? { bg: 'color-mix(in srgb, var(--rail-discovery) 15%, transparent)', color: 'var(--rail-discovery)', text: 'ORG' }\r\n : g.owner === 'shared'\r\n ? { bg: 'color-mix(in srgb, var(--state-unknown) 15%, transparent)', color: 'var(--state-unknown)', text: 'SHARED' }\r\n : { bg: 'color-mix(in srgb, var(--rail-teal) 10%, transparent)', color: 'var(--rail-teal)', text: 'AGENT' };\r\n return (\r\n <div key={i} style={{\r\n padding: '10px 12px', borderRadius: 'var(--radius)',\r\n background: 'var(--paper)', borderLeft: `3px solid ${ki.color}`,\r\n }}>\r\n <div style={{ fontSize: 'var(--text-base)', color: 'var(--text-strong)', display: 'flex', alignItems: 'center', gap: 5, fontWeight: 550 }}>\r\n {ki.icon} {g.title || ''}\r\n <span style={{\r\n fontSize: 9, padding: '1px 6px', borderRadius: 8, marginLeft: 4,\r\n background: ownerBadge.bg, color: ownerBadge.color, fontWeight: 600,\r\n }}>\r\n {ownerBadge.text}\r\n </span>\r\n </div>\r\n {g.detail && <div style={{ fontSize: 'var(--text-sm)', color: 'var(--text-muted)', marginTop: 4, lineHeight: 1.4 }}>{g.detail}</div>}\r\n {/* Signal refs with evidence */}\r\n {g.signal_refs?.map((sr, si) => (\r\n <div key={si} style={{ marginTop: 6 }}>\r\n <div style={{ fontSize: 10, color: 'var(--text-muted)', fontWeight: 600, marginBottom: 3, display: 'flex', alignItems: 'center', gap: 3 }}>\r\n <CornerDownRight size={10} /> {sr.display_name || sr.signal_key}\r\n {sr.confidence != null && <span style={{ fontWeight: 400, opacity: 0.7 }}> ({Math.round(sr.confidence * 100)}%)</span>}\r\n </div>\r\n {sr.evidence?.map((ev, ei) => (\r\n <EvidenceItem key={ei} ev={ev} onPlay={playAudio} onHighlight={highlightTurns} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport { Target } from 'lucide-react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\n\r\nexport default function InteractionNBA({ nba }) {\r\n const items = nba?.recommendations || nba?.actions || [];\r\n if (!items.length) return null;\r\n\r\n return (\r\n <DetailCard title=\"Next Best Actions\">\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6 }}>\r\n {items.slice(0, 8).map((r, i) => (\r\n <div key={i} style={{ fontSize: 11, color: 'var(--text-muted)', display: 'flex', alignItems: 'center', gap: 4 }}>\r\n <Target size={12} /> <strong style={{ color: 'var(--text-base)' }}>{r.action || r.title || ''}</strong>\r\n {r.rationale && ` — ${r.rationale}`}\r\n </div>\r\n ))}\r\n </div>\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport Timeline from '../../media/Timeline.jsx';\r\n\r\nexport default function InteractionRecording({ \r\n audioUrl, \r\n timelineSegments, \r\n durationSeconds, \r\n currentTimeSeconds,\r\n timelinePlaying,\r\n playbackRate,\r\n onSeek,\r\n onTogglePlay,\r\n onSeekBack,\r\n onSeekForward,\r\n onSetPlaybackRate,\r\n audioRef\r\n}) {\r\n if (!audioUrl) return null;\r\n\r\n return (\r\n <DetailCard title=\"Recording\">\r\n <Timeline\r\n segments={timelineSegments}\r\n durationSeconds={durationSeconds || 0}\r\n currentTimeSeconds={currentTimeSeconds}\r\n onSeek={onSeek}\r\n showControls={true}\r\n hasRecording={true}\r\n timelinePlaying={timelinePlaying}\r\n playbackRate={playbackRate}\r\n onTogglePlay={onTogglePlay}\r\n onSeekBack={onSeekBack}\r\n onSeekForward={onSeekForward}\r\n onSetPlaybackRate={onSetPlaybackRate}\r\n />\r\n {/* Hidden audio element for actual playback */}\r\n <audio ref={audioRef} preload=\"none\" style={{ display: 'none' }}>\r\n <source src={audioUrl} type=\"audio/mpeg\" />\r\n </audio>\r\n </DetailCard>\r\n );\r\n}","import React from 'react';\r\nimport TranscriptCard from '../../media/TranscriptCard.jsx';\r\n\r\nexport default function InteractionTranscript({ \r\n transcript, \r\n audioUrl,\r\n highlightedTurns,\r\n activeTurnIndex,\r\n timelinePlaying,\r\n turnObservations,\r\n setExpandedSignals,\r\n onTurnPlayPause,\r\n}) {\r\n if (!transcript?.messages?.length) return null;\r\n\r\n // Helper function to format time from ms to \"MM:SS–MM:SS\"\r\n const formatTimeRange = (startMs, endMs) => {\r\n if (startMs == null) return undefined;\r\n const formatTime = (ms) => {\r\n const minutes = Math.floor(ms / 60000);\r\n const seconds = Math.floor((ms % 60000) / 1000);\r\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n };\r\n const start = formatTime(startMs);\r\n const end = endMs != null ? formatTime(endMs) : start;\r\n return `${start}–${end}`;\r\n };\r\n\r\n const turns = transcript.messages.map((m, i) => ({\r\n actor: m.actor === 'agent' ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer'),\r\n actorType: m.actor === 'agent' ? 'agent' : 'customer',\r\n text: m.text || '',\r\n timeRange: formatTimeRange(m.start ?? m.start_ms, m.end ?? m.end_ms),\r\n isHighlighted: highlightedTurns.has(i),\r\n highlightColor: (timelinePlaying && activeTurnIndex === i) \r\n ? (m.actor === 'agent' ? 'var(--rail-outcome)' : 'var(--rail-discovery)')\r\n : undefined,\r\n observations: (turnObservations[i] || []).map(obs => ({\r\n ...obs,\r\n onClick: () => {\r\n // Expand the parent signal and scroll to it\r\n setExpandedSignals(prev => new Set([...prev, obs.signalKey]));\r\n setTimeout(() => {\r\n const el = document.getElementById(`signal-${obs.signalKey}`);\r\n if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n }, 100);\r\n },\r\n })),\r\n }));\r\n\r\n return (\r\n <div id=\"transcript-container\">\r\n <TranscriptCard\r\n turns={turns}\r\n audioUrl={audioUrl}\r\n activeTurnIndex={activeTurnIndex}\r\n autoScrollActiveTurn={timelinePlaying}\r\n isExternalPlaying={timelinePlaying}\r\n onTurnPlayPause={onTurnPlayPause}\r\n />\r\n </div>\r\n );\r\n}","\"use client\";\r\n\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { Send, Clock } from \"lucide-react\";\r\n\r\nconst messageActionButtonStyle = {\r\n padding: 0,\r\n border: \"none\",\r\n background: \"transparent\",\r\n fontSize: \"12px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n cursor: \"pointer\",\r\n fontFamily: \"inherit\",\r\n};\r\n\r\n/**\r\n * MessageThread (common)\r\n *\r\n * Lightweight, UI-only message thread component for session discussion.\r\n * - Controlled via `messages` + `onSendMessage` (and optional reply/edit/delete callbacks)\r\n * - No data fetching or app-specific APIs – host app owns data + side effects\r\n *\r\n * `messages` items:\r\n * {\r\n * id: string;\r\n * author: { name: string; initials: string; color: string; role?: string };\r\n * content: string;\r\n * timestamp: string; // already formatted for display\r\n * type?: \"comment\" | \"system\";\r\n * isEdited?: boolean;\r\n * references?: Array<{ type: \"condition\" | \"timestamp\" | \"observation\"; label: string }>;\r\n * }\r\n */\r\nexport default function MessageThread({\r\n sessionTitle,\r\n sessionSubtitle,\r\n threadLabel,\r\n messages: initialMessages = [],\r\n onSendMessage,\r\n onReplyMessage,\r\n onEditMessage,\r\n onDeleteMessage,\r\n onCreateNewThread, // optional: host can handle new thread creation\r\n currentUser,\r\n isLoading = false,\r\n}) {\r\n const [messageInput, setMessageInput] = useState(\"\");\r\n const [isFocused, setIsFocused] = useState(false);\r\n const [messages, setMessages] = useState(initialMessages);\r\n const [isSending, setIsSending] = useState(false);\r\n const [hoveredMessageId, setHoveredMessageId] = useState(null);\r\n const [replyingToMessageId, setReplyingToMessageId] = useState(null);\r\n const [replyDraft, setReplyDraft] = useState(\"\");\r\n const [editingMessageId, setEditingMessageId] = useState(null);\r\n const [editContent, setEditContent] = useState(\"\");\r\n const [deleteConfirmMessage, setDeleteConfirmMessage] = useState(null);\r\n const [showNewThreadCompose, setShowNewThreadCompose] = useState(false);\r\n const [newThreadInput, setNewThreadInput] = useState(\"\");\r\n const [isCreatingNewThread, setIsCreatingNewThread] = useState(false);\r\n\r\n const messagesEndRef = useRef(null);\r\n const messageInputRef = useRef(null);\r\n\r\n const displayCurrentUser = currentUser || {\r\n name: \"You\",\r\n initials: \"YO\",\r\n color: \"#6B7C93\",\r\n };\r\n\r\n const hasHeader = threadLabel || sessionTitle || sessionSubtitle;\r\n const replyingToMessage = replyingToMessageId\r\n ? messages.find((m) => m.id === replyingToMessageId)\r\n : null;\r\n\r\n useEffect(() => {\r\n setMessages(initialMessages);\r\n }, [initialMessages]);\r\n\r\n useEffect(() => {\r\n if (!messagesEndRef.current) return;\r\n if (!messages || messages.length === 0) return;\r\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\r\n }, [messages]);\r\n\r\n const handleNewThreadSubmit = async () => {\r\n const trimmed = newThreadInput.trim();\r\n if (!trimmed) return;\r\n setIsCreatingNewThread(true);\r\n try {\r\n await onCreateNewThread?.(trimmed);\r\n setNewThreadInput(\"\");\r\n setShowNewThreadCompose(false);\r\n } finally {\r\n setIsCreatingNewThread(false);\r\n }\r\n };\r\n\r\n const handleNewThreadCancel = () => {\r\n setShowNewThreadCompose(false);\r\n setNewThreadInput(\"\");\r\n };\r\n\r\n const handleSend = async () => {\r\n const trimmed = messageInput.trim();\r\n if (!trimmed) return;\r\n\r\n const content = trimmed;\r\n setMessageInput(\"\");\r\n\r\n const optimisticId = `temp-${Date.now()}`;\r\n const optimisticMessage = {\r\n id: optimisticId,\r\n author: displayCurrentUser,\r\n content,\r\n timestamp: \"Just now\",\r\n type: \"comment\",\r\n isOptimistic: true,\r\n };\r\n\r\n setMessages((prev) => [...prev, optimisticMessage]);\r\n\r\n if (onSendMessage) {\r\n setIsSending(true);\r\n try {\r\n await onSendMessage(content);\r\n setMessages((prev) =>\r\n prev.map((msg) =>\r\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\r\n )\r\n );\r\n } catch {\r\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticId));\r\n } finally {\r\n setIsSending(false);\r\n }\r\n return;\r\n }\r\n\r\n setMessages((prev) =>\r\n prev.map((msg) =>\r\n msg.id === optimisticId ? { ...msg, isOptimistic: false } : msg\r\n )\r\n );\r\n };\r\n\r\n const handleKeyPress = (e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleSend();\r\n }\r\n };\r\n\r\n const handleReplyClick = (message) => {\r\n setReplyingToMessageId(message.id);\r\n setReplyDraft(\"\");\r\n setEditingMessageId(null);\r\n setEditContent(\"\");\r\n setHoveredMessageId(null);\r\n onReplyMessage?.(message);\r\n };\r\n\r\n const handleInlineReplySend = async (parentMessageId) => {\r\n const trimmed = replyDraft.trim();\r\n if (!trimmed) return;\r\n setIsSending(true);\r\n try {\r\n await onSendMessage?.(trimmed, parentMessageId);\r\n setReplyingToMessageId(null);\r\n setReplyDraft(\"\");\r\n } finally {\r\n setIsSending(false);\r\n }\r\n };\r\n\r\n const handleEditClick = (message) => {\r\n setEditingMessageId(message.id);\r\n setEditContent(message.content || \"\");\r\n setReplyingToMessageId(null);\r\n setReplyDraft(\"\");\r\n setHoveredMessageId(null);\r\n onEditMessage?.(message);\r\n };\r\n\r\n const handleEditSubmit = async () => {\r\n const trimmed = editContent.trim();\r\n if (!trimmed || !editingMessageId) return;\r\n await onEditMessage?.({ id: editingMessageId, content: trimmed });\r\n setEditingMessageId(null);\r\n setEditContent(\"\");\r\n };\r\n\r\n const handleDeleteClick = (message) => {\r\n setDeleteConfirmMessage(message);\r\n setHoveredMessageId(null);\r\n };\r\n\r\n const handleDeleteConfirm = async () => {\r\n if (!deleteConfirmMessage) return;\r\n const msg = deleteConfirmMessage;\r\n setDeleteConfirmMessage(null);\r\n await onDeleteMessage?.(msg);\r\n };\r\n\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100%\",\r\n background: \"rgba(255, 255, 255, 0.98)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n position: \"relative\",\r\n }}\r\n >\r\n {/* Delete confirmation overlay */}\r\n {deleteConfirmMessage && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n zIndex: 50,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n background: \"rgba(30, 33, 37, 0.35)\",\r\n borderRadius: \"12px\",\r\n }}\r\n onClick={() => setDeleteConfirmMessage(null)}\r\n >\r\n <div\r\n style={{\r\n background: \"white\",\r\n borderRadius: \"12px\",\r\n padding: \"20px 24px\",\r\n boxShadow: \"0 8px 24px rgba(30, 33, 37, 0.15)\",\r\n maxWidth: \"320px\",\r\n width: \"90%\",\r\n }}\r\n onClick={(e) => e.stopPropagation()}\r\n >\r\n <p\r\n style={{\r\n margin: 0,\r\n marginBottom: \"20px\",\r\n fontSize: \"14px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.9)\",\r\n lineHeight: 1.45,\r\n }}\r\n >\r\n Do you really want to delete?\r\n </p>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: \"10px\",\r\n justifyContent: \"flex-end\",\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={() => setDeleteConfirmMessage(null)}\r\n style={{\r\n padding: \"8px 16px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n color: \"rgba(30, 33, 37, 0.45)\",\r\n background: \"rgba(30, 33, 37, 0.1)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleDeleteConfirm}\r\n style={{\r\n padding: \"8px 16px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n color: \"white\",\r\n background: \"#5e88b0\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n Delete\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Header */}\r\n {hasHeader && (\r\n <div\r\n style={{\r\n padding: \"14px 16px\",\r\n borderBottom: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n background: \"rgba(255, 255, 255, 0.98)\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n <div>\r\n <div\r\n style={{\r\n fontSize: \"14px\",\r\n fontWeight: 600,\r\n color: \"rgba(30, 33, 37, 0.95)\",\r\n marginBottom: \"4px\",\r\n }}\r\n >\r\n {threadLabel || \"Session Discussion\"}\r\n </div>\r\n {(sessionTitle || sessionSubtitle) && (\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n }}\r\n >\r\n {sessionTitle || sessionSubtitle}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {/* Always show \"+ New thread\" button */}\r\n <button\r\n type=\"button\"\r\n onClick={() => {\r\n setShowNewThreadCompose((prev) => !prev);\r\n }}\r\n style={{\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n gap: \"6px\",\r\n padding: \"6px 12px\",\r\n fontSize: \"13px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.75)\",\r\n background: \"transparent\",\r\n border: \"1px solid rgba(30, 33, 37, 0.12)\",\r\n borderRadius: \"6px\",\r\n cursor: \"pointer\",\r\n transition: \"background 0.15s ease, color 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.12)\";\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.9)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.background = \"transparent\";\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\r\n }}\r\n title=\"Start a new discussion thread\"\r\n >\r\n <span\r\n style={{\r\n fontSize: 16,\r\n lineHeight: 1,\r\n marginTop: -1,\r\n }}\r\n >\r\n +\r\n </span>\r\n New thread\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* Messages list */}\r\n <div\r\n style={{\r\n flex: 1,\r\n overflowY: \"auto\",\r\n padding: \"16px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"16px\",\r\n }}\r\n >\r\n {/* Inline \"new thread\" compose */}\r\n {showNewThreadCompose && (\r\n <div\r\n style={{\r\n marginBottom: \"16px\",\r\n padding: \"12px\",\r\n background: \"rgba(30, 33, 37, 0.04)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.14)\",\r\n borderRadius: \"8px\",\r\n }}\r\n >\r\n <textarea\r\n value={newThreadInput}\r\n onChange={(e) => setNewThreadInput(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleNewThreadSubmit();\r\n }\r\n }}\r\n placeholder=\"Start a new thread...\"\r\n disabled={isCreatingNewThread}\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"64px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n background: \"white\",\r\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\r\n borderRadius: \"6px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n marginBottom: \"10px\",\r\n }}\r\n />\r\n <div style={{ display: \"flex\", gap: \"8px\", justifyContent: \"flex-end\" }}>\r\n <button\r\n type=\"button\"\r\n onClick={handleNewThreadCancel}\r\n disabled={isCreatingNewThread}\r\n style={{\r\n padding: \"6px 14px\",\r\n fontSize: \"12px\",\r\n fontWeight: 500,\r\n color: \"rgba(30, 33, 37, 0.7)\",\r\n background: \"rgba(30, 33, 37, 0.08)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor: isCreatingNewThread ? \"not-allowed\" : \"pointer\",\r\n }}\r\n >\r\n Cancel\r\n </button>\r\n <button\r\n type=\"button\"\r\n onClick={handleNewThreadSubmit}\r\n disabled={!newThreadInput.trim() || isCreatingNewThread}\r\n style={{\r\n padding: \"6px 14px\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n color: \"white\",\r\n background:\r\n newThreadInput.trim() && !isCreatingNewThread\r\n ? \"#5e88b0\"\r\n : \"rgba(30, 33, 37, 0.25)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n cursor:\r\n newThreadInput.trim() && !isCreatingNewThread\r\n ? \"pointer\"\r\n : \"not-allowed\",\r\n }}\r\n >\r\n {isCreatingNewThread ? \"Sending...\" : \"Send\"}\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n {isLoading ? (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"40px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n }}\r\n >\r\n Loading messages...\r\n </div>\r\n ) : messages.length === 0 ? (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n padding: \"40px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n }}\r\n >\r\n No messages yet. Start the conversation!\r\n </div>\r\n ) : (\r\n messages.map((message) => (\r\n <div\r\n key={message.id}\r\n onMouseEnter={() =>\r\n message.type !== \"system\" && setHoveredMessageId(message.id)\r\n }\r\n onMouseLeave={() => setHoveredMessageId(null)}\r\n style={{\r\n display: \"flex\",\r\n gap: \"12px\",\r\n opacity: message.type === \"system\" ? 0.75 : 1,\r\n padding: \"4px 0\",\r\n margin: \"0 -4px\",\r\n borderRadius: \"8px\",\r\n }}\r\n >\r\n {message.type !== \"system\" ? (\r\n <div\r\n style={{\r\n width: \"36px\",\r\n height: \"36px\",\r\n borderRadius: \"50%\",\r\n background: message.author.color,\r\n color: \"white\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"11px\",\r\n fontWeight: 650,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {message.author.initials}\r\n </div>\r\n ) : (\r\n <div\r\n style={{\r\n width: \"36px\",\r\n height: \"36px\",\r\n borderRadius: \"50%\",\r\n background: \"rgba(30, 33, 37, 0.1)\",\r\n color: \"rgba(30, 33, 37, 0.55)\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n <Clock size={16} />\r\n </div>\r\n )}\r\n\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n flexWrap: \"wrap\",\r\n gap: \"8px\",\r\n marginBottom: \"6px\",\r\n justifyContent: \"space-between\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"baseline\",\r\n flexWrap: \"wrap\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 650,\r\n color: \"rgba(30, 33, 37, 0.9)\",\r\n }}\r\n >\r\n {message.author.name}\r\n </span>\r\n <span\r\n style={{\r\n fontSize: \"10px\",\r\n fontFamily: \"var(--default-mono-font-family)\",\r\n color: \"rgba(30, 33, 37, 0.5)\",\r\n }}\r\n >\r\n {message.timestamp}\r\n </span>\r\n </div>\r\n\r\n {message.type !== \"system\" &&\r\n hoveredMessageId === message.id && (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n {onReplyMessage && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleReplyClick(message);\r\n }}\r\n style={messageActionButtonStyle}\r\n >\r\n Reply\r\n </button>\r\n )}\r\n {onEditMessage && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleEditClick(message);\r\n }}\r\n style={messageActionButtonStyle}\r\n >\r\n Edit\r\n </button>\r\n )}\r\n {onDeleteMessage && (\r\n <button\r\n type=\"button\"\r\n onClick={(e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n handleDeleteClick(message);\r\n }}\r\n style={{\r\n ...messageActionButtonStyle,\r\n color: \"rgba(198, 99, 99, 0.9)\",\r\n }}\r\n >\r\n Delete\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n {editingMessageId === message.id ? (\r\n <div style={{ marginTop: \"6px\" }}>\r\n <textarea\r\n value={editContent}\r\n onChange={(e) => setEditContent(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleEditSubmit();\r\n }\r\n if (e.key === \"Escape\") {\r\n setEditingMessageId(null);\r\n setEditContent(\"\");\r\n }\r\n }}\r\n placeholder=\"Edit message...\"\r\n autoFocus\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"64px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n background: \"white\",\r\n border: \"1px solid rgba(52, 58, 64, 0.2)\",\r\n borderRadius: \"6px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n marginBottom: \"8px\",\r\n }}\r\n />\r\n </div>\r\n ) : (\r\n <div\r\n style={{\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n lineHeight: 1.55,\r\n }}\r\n >\r\n {message.content}\r\n </div>\r\n )}\r\n\r\n {replyingToMessageId === message.id && (\r\n <div style={{ marginTop: \"12px\" }}>\r\n <textarea\r\n value={replyDraft}\r\n onChange={(e) => setReplyDraft(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n handleInlineReplySend(message.id);\r\n }\r\n if (e.key === \"Escape\") {\r\n setReplyingToMessageId(null);\r\n setReplyDraft(\"\");\r\n }\r\n }}\r\n placeholder=\"Type your reply...\"\r\n disabled={isSending}\r\n autoFocus\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"64px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.88)\",\r\n background: \"white\",\r\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\r\n borderRadius: \"6px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n marginBottom: \"10px\",\r\n }}\r\n />\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n ))\r\n )}\r\n <div ref={messagesEndRef} />\r\n </div>\r\n\r\n {/* Input area */}\r\n <div\r\n style={{\r\n padding: \"12px\",\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n background: \"rgba(255, 255, 255, 0.95)\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: \"8px\",\r\n alignItems: \"flex-end\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n width: \"36px\",\r\n height: \"36px\",\r\n borderRadius: \"50%\",\r\n background: displayCurrentUser.color,\r\n color: \"white\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n fontSize: \"11px\",\r\n fontWeight: 650,\r\n flexShrink: 0,\r\n }}\r\n >\r\n {displayCurrentUser.initials}\r\n </div>\r\n\r\n <div\r\n style={{\r\n flex: 1,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n <textarea\r\n ref={messageInputRef}\r\n value={messageInput}\r\n onChange={(e) => setMessageInput(e.target.value)}\r\n onKeyDown={handleKeyPress}\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={() => setIsFocused(false)}\r\n placeholder={\r\n replyingToMessage ? \"Type your reply...\" : \"Add a comment...\"\r\n }\r\n style={{\r\n width: \"100%\",\r\n minHeight: \"38px\",\r\n maxHeight: \"120px\",\r\n padding: \"8px 12px\",\r\n fontSize: \"13px\",\r\n color: \"rgba(30, 33, 37, 0.85)\",\r\n background: \"white\",\r\n border: `1px solid ${\r\n isFocused\r\n ? \"rgba(94, 136, 176, 0.35)\"\r\n : \"rgba(52, 58, 64, 0.16)\"\r\n }`,\r\n borderRadius: \"8px\",\r\n resize: \"vertical\",\r\n outline: \"none\",\r\n transition: \"border-color 0.15s ease\",\r\n fontFamily: \"inherit\",\r\n lineHeight: 1.5,\r\n }}\r\n />\r\n\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n }}\r\n >\r\n <button\r\n type=\"button\"\r\n onClick={handleSend}\r\n disabled={!messageInput.trim() || isSending}\r\n style={{\r\n padding: \"8px 16px\",\r\n background:\r\n messageInput.trim() && !isSending\r\n ? \"#5e88b0\"\r\n : \"rgba(30, 33, 37, 0.1)\",\r\n border: \"none\",\r\n borderRadius: \"6px\",\r\n color:\r\n messageInput.trim() && !isSending\r\n ? \"white\"\r\n : \"rgba(30, 33, 37, 0.45)\",\r\n fontSize: \"12px\",\r\n fontWeight: 600,\r\n cursor:\r\n messageInput.trim() && !isSending\r\n ? \"pointer\"\r\n : \"not-allowed\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"6px\",\r\n transition: \"all 0.15s ease\",\r\n }}\r\n >\r\n {isSending ? (\r\n <>\r\n <div\r\n style={{\r\n width: \"14px\",\r\n height: \"14px\",\r\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\r\n borderTopColor: \"white\",\r\n borderRadius: \"50%\",\r\n animation: \"spin 0.6s linear infinite\",\r\n }}\r\n />\r\n Sending...\r\n </>\r\n ) : (\r\n <>\r\n <Send size={14} />\r\n Send\r\n </>\r\n )}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n","\"use client\";\r\n\r\nimport React, { useState, useEffect, useRef, useMemo } from 'react';\r\nimport DetailCard from '../../primitives/DetailCard.jsx';\r\nimport CoachingSynthesisCard from './CoachingSynthesisCard.jsx';\r\nimport InteractionContext from './InteractionContext.jsx';\r\nimport InteractionScores from './InteractionScores.jsx';\r\nimport AgentLiftCard from '../../common/AgentLiftCard.jsx';\r\nimport InteractionSignals from './InteractionSignals.jsx';\r\nimport InteractionGuidance from './InteractionGuidance.jsx';\r\nimport InteractionNBA from './InteractionNBA.jsx';\r\nimport InteractionRecording from './InteractionRecording.jsx';\r\nimport InteractionTranscript from './InteractionTranscript.jsx';\r\nimport MessageThread from '../../common/MessageThread.jsx';\r\n\r\nfunction findBlock(blocks, id) {\r\n return blocks.find((b) => b.block_id === id);\r\n}\r\n\r\nfunction InteractionDetailPanel({ data, audioUrl, coachingData, coachingLoading, coachingError }) {\r\n const blocks = data.blocks || [];\r\n const evidenceIndex = data.evidence_index || {};\r\n const audioRef = useRef(null);\r\n const segmentEndHandlerRef = useRef(null);\r\n const [highlightedTurns, setHighlightedTurns] = useState(new Set());\r\n const [expandedSignals, setExpandedSignals] = useState(new Set());\r\n \r\n // Timeline state for audio playback integration\r\n const [currentTimeSeconds, setCurrentTimeSeconds] = useState(0);\r\n const [timelinePlaying, setTimelinePlaying] = useState(false);\r\n const [playbackRate, setPlaybackRate] = useState(1);\r\n\r\n // Extract block data\r\n const meta = findBlock(blocks, 'interaction-metadata')?.payload || {};\r\n const ctx = findBlock(blocks, 'interaction-context')?.payload || {};\r\n const summary = findBlock(blocks, 'interaction-summary')?.payload || {};\r\n const scores = findBlock(blocks, 'interaction-scores')?.payload || {};\r\n const signals = findBlock(blocks, 'interaction-signals')?.payload || {};\r\n const guidance = findBlock(blocks, 'interaction-guidance')?.payload || {};\r\n const transcript = findBlock(blocks, 'interaction-transcript')?.payload || {};\r\n const messageThread = findBlock(blocks, 'interaction-message-thread')?.payload || {};\r\n const nba = findBlock(blocks, 'interaction-nba')?.payload || {};\r\n const dimensionsBlock = findBlock(blocks, 'interaction-dimensions')?.payload || {};\r\n const dimensions = (dimensionsBlock.dimensions || []).filter(d => d.value);\r\n const outcomeLift = findBlock(blocks, 'interaction-outcome-lift')?.payload || {};\r\n\r\n // Build turn → observation pills map from signals data\r\n const turnObservations = useMemo(() => {\r\n const map = {}; // turnIndex → [{label, reason, color, signalKey}]\r\n const GROUP_LABELS = {\r\n outcome: { color: 'var(--rail-outcome)' },\r\n process: { color: 'var(--rail-discovery)' },\r\n compliance: { color: 'var(--rail-compliance)' },\r\n customer_friction: { color: 'var(--rail-coral)' },\r\n experience: { color: 'var(--rail-teal)' },\r\n };\r\n\r\n for (const signal of (signals.signals || [])) {\r\n const groupInfo = GROUP_LABELS[signal.group] || {};\r\n for (const obs of (signal.observations || [])) {\r\n for (const ev of (obs.evidence || [])) {\r\n if (ev.turn_ids?.length) {\r\n for (const tid of ev.turn_ids) {\r\n if (!map[tid]) map[tid] = [];\r\n // Deduplicate by observation key per turn\r\n if (!map[tid].some(o => o.label === (obs.key || signal.display_name || signal.key))) {\r\n map[tid].push({\r\n label: obs.key || signal.display_name || signal.key,\r\n reason: obs.reason || obs.explanation || '',\r\n color: groupInfo.color || 'var(--state-present)',\r\n signalKey: signal.key,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return map;\r\n }, [signals.signals]);\r\n\r\n // Build timeline segments from transcript messages\r\n const timelineSegments = transcript.messages?.map((m, i) => {\r\n const startTime = (m.start ?? m.start_ms) ? (m.start ?? m.start_ms) / 1000 : 0;\r\n const endTime = (m.end ?? m.end_ms) ? (m.end ?? m.end_ms) / 1000 : startTime + 1;\r\n const isAgent = m.actor === 'agent';\r\n const actorName = isAgent ? (transcript.actor_map?.agent || 'Agent') : (transcript.actor_map?.customer || 'Customer');\r\n \r\n return {\r\n startTime,\r\n endTime,\r\n actor: actorName,\r\n actorColor: isAgent ? 'var(--rail-outcome)' : 'var(--rail-discovery)',\r\n };\r\n }) || [];\r\n\r\n // Compute active turn index based on current playback time\r\n const activeTurnIndex = useMemo(() => {\r\n if (!timelinePlaying && currentTimeSeconds === 0) return -1;\r\n const messages = transcript.messages || [];\r\n const currentMs = currentTimeSeconds * 1000;\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const startMs = messages[i].start ?? messages[i].start_ms;\r\n if (startMs != null && currentMs >= startMs) return i;\r\n }\r\n return -1;\r\n }, [currentTimeSeconds, timelinePlaying, transcript.messages]);\r\n\r\n // Timeline event handlers\r\n const handleTimelineSeek = (seconds) => {\r\n if (audioRef.current) {\r\n audioRef.current.currentTime = seconds;\r\n setCurrentTimeSeconds(seconds);\r\n }\r\n };\r\n\r\n const handleTimelineTogglePlay = () => {\r\n if (audioRef.current) {\r\n if (timelinePlaying) {\r\n audioRef.current.pause();\r\n setTimelinePlaying(false);\r\n } else {\r\n const p = audioRef.current.play();\r\n if (p !== undefined) p.catch(() => {}); // ignore AbortError when pause() interrupts play()\r\n setTimelinePlaying(true);\r\n }\r\n }\r\n };\r\n\r\n const handleTimelineSeekBack = () => {\r\n if (audioRef.current) {\r\n audioRef.current.currentTime = Math.max(0, audioRef.current.currentTime - 15);\r\n }\r\n };\r\n\r\n const handleTimelineSeekForward = () => {\r\n if (audioRef.current) {\r\n const duration = meta.duration_seconds || audioRef.current.duration || 0;\r\n audioRef.current.currentTime = Math.min(duration, audioRef.current.currentTime + 15);\r\n }\r\n };\r\n\r\n const handleSetPlaybackRate = (rate) => {\r\n if (audioRef.current) {\r\n audioRef.current.playbackRate = rate;\r\n setPlaybackRate(rate);\r\n }\r\n };\r\n\r\n // Update currentTimeSeconds from audio element\r\n useEffect(() => {\r\n const audio = audioRef.current;\r\n if (!audio) return;\r\n\r\n const updateTime = () => setCurrentTimeSeconds(audio.currentTime);\r\n const handlePlay = () => setTimelinePlaying(true);\r\n const handlePause = () => setTimelinePlaying(false);\r\n const handleEnded = () => setTimelinePlaying(false);\r\n\r\n audio.addEventListener('timeupdate', updateTime);\r\n audio.addEventListener('play', handlePlay);\r\n audio.addEventListener('pause', handlePause);\r\n audio.addEventListener('ended', handleEnded);\r\n\r\n return () => {\r\n audio.removeEventListener('timeupdate', updateTime);\r\n audio.removeEventListener('play', handlePlay);\r\n audio.removeEventListener('pause', handlePause);\r\n audio.removeEventListener('ended', handleEnded);\r\n };\r\n }, [audioUrl]);\r\n\r\n const playAudio = (startMs, endMs) => {\r\n const player = audioRef.current;\r\n if (!player) return;\r\n\r\n const startSec = startMs / 1000;\r\n player.currentTime = startSec;\r\n setCurrentTimeSeconds(startSec);\r\n\r\n const p = player.play();\r\n if (p !== undefined) p.catch(() => {}); // ignore AbortError when pause() interrupts play()\r\n\r\n // Clear any previous segment end handler so only one is active\r\n if (segmentEndHandlerRef.current) {\r\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\r\n segmentEndHandlerRef.current = null;\r\n }\r\n\r\n if (endMs != null) {\r\n const endSec = endMs / 1000;\r\n const handler = () => {\r\n if (player.currentTime >= endSec) {\r\n player.pause();\r\n if (segmentEndHandlerRef.current) {\r\n player.removeEventListener('timeupdate', segmentEndHandlerRef.current);\r\n segmentEndHandlerRef.current = null;\r\n }\r\n }\r\n };\r\n segmentEndHandlerRef.current = handler;\r\n player.addEventListener('timeupdate', handler);\r\n }\r\n };\r\n\r\n const handleTranscriptTurnPlayPause = (turn, index) => {\r\n const messages = transcript.messages || [];\r\n const message = messages[index];\r\n const player = audioRef.current;\r\n\r\n if (!message || !player) return;\r\n\r\n const startMs = message.start ?? message.start_ms;\r\n const endMs = message.end ?? message.end_ms;\r\n\r\n // If this turn is already active and playing, pause playback\r\n if (timelinePlaying && activeTurnIndex === index) {\r\n player.pause();\r\n return;\r\n }\r\n\r\n if (startMs == null) return;\r\n playAudio(startMs, endMs);\r\n };\r\n\r\n const highlightTurns = (turnIds) => {\r\n setHighlightedTurns(new Set(turnIds));\r\n // TranscriptCard handles highlight styling via isHighlighted prop\r\n // Always scroll transcript container into view so highlights are visible\r\n const container = document.getElementById('transcript-container');\r\n if (container) {\r\n container.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\r\n }\r\n setTimeout(() => setHighlightedTurns(new Set()), 5000);\r\n };\r\n\r\n const toggleSignal = (key) => {\r\n setExpandedSignals(prev => {\r\n const next = new Set(prev);\r\n if (next.has(key)) next.delete(key); else next.add(key);\r\n return next;\r\n });\r\n };\r\n\r\n const title = ctx.call_purpose?.interaction_driver || summary.one_liner || 'Interaction Detail';\r\n\r\n return (\r\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\r\n {/* Context — metadata + call purpose + dimensions */}\r\n <InteractionContext\r\n title={title}\r\n meta={meta}\r\n callPurpose={ctx.call_purpose}\r\n classification={ctx.classification}\r\n dimensions={dimensions}\r\n />\r\n\r\n {/* Scores */}\r\n <InteractionScores scores={scores.scores} />\r\n\r\n {/* Agent Lift Analysis */}\r\n <AgentLiftCard outcomeLift={outcomeLift} />\r\n\r\n {/* Coaching Synthesis — only show if loading or has data */}\r\n {(coachingLoading || coachingData || coachingError) && (\r\n <DetailCard title=\"Coaching Summary\">\r\n <CoachingSynthesisCard \r\n data={coachingData} \r\n loading={coachingLoading} \r\n error={coachingError} \r\n />\r\n </DetailCard>\r\n )}\r\n\r\n {/* Signals */}\r\n <InteractionSignals\r\n signals={signals}\r\n expandedSignals={expandedSignals}\r\n toggleSignal={toggleSignal}\r\n playAudio={playAudio}\r\n highlightTurns={highlightTurns}\r\n />\r\n\r\n {/* Guidance */}\r\n <InteractionGuidance\r\n guidance={guidance}\r\n playAudio={playAudio}\r\n highlightTurns={highlightTurns}\r\n />\r\n\r\n {/* NBA */}\r\n <InteractionNBA nba={nba} />\r\n\r\n {/* Recording / Timeline */}\r\n <InteractionRecording\r\n audioUrl={audioUrl}\r\n timelineSegments={timelineSegments}\r\n durationSeconds={meta.duration_seconds}\r\n currentTimeSeconds={currentTimeSeconds}\r\n timelinePlaying={timelinePlaying}\r\n playbackRate={playbackRate}\r\n onSeek={handleTimelineSeek}\r\n onTogglePlay={handleTimelineTogglePlay}\r\n onSeekBack={handleTimelineSeekBack}\r\n onSeekForward={handleTimelineSeekForward}\r\n onSetPlaybackRate={handleSetPlaybackRate}\r\n audioRef={audioRef}\r\n />\r\n\r\n {/* Transcript */}\r\n <InteractionTranscript\r\n transcript={transcript}\r\n audioUrl={audioUrl}\r\n highlightedTurns={highlightedTurns}\r\n activeTurnIndex={activeTurnIndex}\r\n timelinePlaying={timelinePlaying}\r\n turnObservations={turnObservations}\r\n setExpandedSignals={setExpandedSignals}\r\n onTurnPlayPause={handleTranscriptTurnPlayPause}\r\n />\r\n\r\n <MessageThread\r\n messageThread={messageThread}\r\n sessionTitle={title}\r\n messages={[]}\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nclass ErrorBoundary extends React.Component {\r\n constructor(props) { \r\n super(props); \r\n this.state = { hasError: false }; \r\n }\r\n static getDerivedStateFromError() { \r\n return { hasError: true }; \r\n }\r\n componentDidCatch(error, info) { \r\n console.error('InteractionDetailPanel render error:', error, info?.componentStack); \r\n }\r\n render() { \r\n return this.state.hasError ? this.props.fallback : this.props.children; \r\n }\r\n}\r\n\r\nexport default function InteractionDetailPanelWrapper(props) {\r\n return (\r\n <ErrorBoundary fallback={\r\n <div style={{ padding: 16, color: 'var(--state-unknown)', fontSize: 12 }}>\r\n Error rendering detail.\r\n </div>\r\n }>\r\n <InteractionDetailPanel {...props} />\r\n </ErrorBoundary>\r\n );\r\n}","\"use client\";\r\n\r\nimport React, { useState } from \"react\";\r\nimport { ChevronDown, ChevronRight } from \"lucide-react\";\r\n\r\n/**\r\n * ExpandPatternComparison Component\r\n * Demonstrates three different expand/collapse patterns for signal cards.\r\n */\r\nexport default function ExpandPatternComparison({ pattern }) {\r\n const [isExpanded, setIsExpanded] = useState(false);\r\n\r\n const sampleSignal = {\r\n name: \"Customer Escalation Likelihood\",\r\n description:\r\n \"Based on observed patterns, this session shows indicators consistent with potential escalation.\",\r\n technicalKey: \"signal.escalation_likelihood\",\r\n probability: 0.68,\r\n confidence: 0.81,\r\n observations: 3,\r\n };\r\n\r\n if (pattern === \"text-link\") {\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n background: \"rgba(255, 255, 255, 0.82)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\r\n }}\r\n >\r\n {/* Left rail */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: \"5px\",\r\n background: \"#6B7C93\",\r\n opacity: 0.6,\r\n }}\r\n />\r\n\r\n {/* Content - not clickable */}\r\n <div\r\n style={{\r\n padding: \"14px 16px 14px 21px\",\r\n }}\r\n >\r\n <div style={{ marginBottom: \"4px\" }}>\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 680,\r\n color: \"rgba(30, 33, 37, 0.92)\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {sampleSignal.name}\r\n </span>\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n lineHeight: 1.4,\r\n marginBottom: \"6px\",\r\n }}\r\n >\r\n {sampleSignal.description}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n fontFamily: \"ui-monospace, monospace\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n {sampleSignal.technicalKey}\r\n </div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n fontSize: \"11.5px\",\r\n marginBottom: \"10px\",\r\n }}\r\n >\r\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\r\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\r\n {sampleSignal.probability.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\r\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\r\n {sampleSignal.confidence.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\r\n {sampleSignal.observations} observations\r\n </span>\r\n </div>\r\n\r\n {/* Text link to expand */}\r\n {!isExpanded && (\r\n <button\r\n onClick={() => setIsExpanded(true)}\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.56)\",\r\n background: \"none\",\r\n border: \"none\",\r\n padding: 0,\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.4)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.2)\";\r\n }}\r\n >\r\n View contributing observations\r\n </button>\r\n )}\r\n </div>\r\n\r\n {/* Expanded content */}\r\n {isExpanded && (\r\n <div\r\n style={{\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\r\n background: \"rgba(244, 241, 230, 0.25)\",\r\n padding: \"16px 16px 16px 21px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: \"10px\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.08em\",\r\n textTransform: \"uppercase\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n Contributing Observations\r\n </div>\r\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\r\n [Observations would appear here]\r\n </div>\r\n <button\r\n onClick={() => setIsExpanded(false)}\r\n style={{\r\n marginTop: \"10px\",\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.56)\",\r\n background: \"none\",\r\n border: \"none\",\r\n padding: 0,\r\n cursor: \"pointer\",\r\n textDecoration: \"underline\",\r\n textDecorationColor: \"rgba(30, 33, 37, 0.2)\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.78)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.4)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.56)\";\r\n e.currentTarget.style.textDecorationColor =\r\n \"rgba(30, 33, 37, 0.2)\";\r\n }}\r\n >\r\n Hide observations\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n if (pattern === \"rotating-chevron\") {\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n background: \"rgba(255, 255, 255, 0.82)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\r\n }}\r\n >\r\n {/* Left rail */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: \"5px\",\r\n background: \"#6B7C93\",\r\n opacity: 0.6,\r\n }}\r\n />\r\n\r\n {/* Header - Clickable */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 16px 14px 21px\",\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n textAlign: \"left\",\r\n transition: \"background 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.background = \"transparent\";\r\n }}\r\n >\r\n <div style={{ display: \"flex\", alignItems: \"flex-start\", gap: \"12px\" }}>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{ marginBottom: \"4px\" }}>\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 680,\r\n color: \"rgba(30, 33, 37, 0.92)\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {sampleSignal.name}\r\n </span>\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n lineHeight: 1.4,\r\n marginBottom: \"6px\",\r\n }}\r\n >\r\n {sampleSignal.description}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n fontFamily: \"ui-monospace, monospace\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n {sampleSignal.technicalKey}\r\n </div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n fontSize: \"11.5px\",\r\n }}\r\n >\r\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\r\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\r\n {sampleSignal.probability.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\r\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\r\n {sampleSignal.confidence.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\r\n {sampleSignal.observations} observations\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Rotating chevron on right */}\r\n <div\r\n style={{\r\n paddingTop: \"2px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n flexShrink: 0,\r\n transition: \"transform 0.2s ease\",\r\n }}\r\n >\r\n <ChevronDown\r\n size={18}\r\n style={{\r\n transform: isExpanded ? \"rotate(180deg)\" : \"rotate(0deg)\",\r\n transition: \"transform 0.2s ease\",\r\n }}\r\n />\r\n </div>\r\n </div>\r\n </button>\r\n\r\n {/* Expanded content */}\r\n {isExpanded && (\r\n <div\r\n style={{\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\r\n background: \"rgba(244, 241, 230, 0.25)\",\r\n padding: \"16px 16px 16px 21px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: \"10px\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.08em\",\r\n textTransform: \"uppercase\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n Contributing Observations\r\n </div>\r\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\r\n [Observations would appear here]\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n }\r\n\r\n // directional-chevron (current SignalCard pattern)\r\n return (\r\n <div\r\n style={{\r\n position: \"relative\",\r\n background: \"rgba(255, 255, 255, 0.82)\",\r\n border: \"1px solid rgba(52, 58, 64, 0.12)\",\r\n borderRadius: \"12px\",\r\n overflow: \"hidden\",\r\n boxShadow: \"0 2px 4px rgba(30, 33, 37, 0.06)\",\r\n }}\r\n >\r\n {/* Left rail */}\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n bottom: 0,\r\n width: \"5px\",\r\n background: \"#6B7C93\",\r\n opacity: 0.6,\r\n }}\r\n />\r\n\r\n {/* Header - Clickable */}\r\n <button\r\n type=\"button\"\r\n onClick={() => setIsExpanded(!isExpanded)}\r\n style={{\r\n width: \"100%\",\r\n padding: \"14px 16px 14px 21px\",\r\n background: \"transparent\",\r\n border: \"none\",\r\n cursor: \"pointer\",\r\n textAlign: \"left\",\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n gap: \"12px\",\r\n transition: \"background 0.15s ease\",\r\n }}\r\n onMouseEnter={(e) => {\r\n e.currentTarget.style.background = \"rgba(231, 212, 162, 0.08)\";\r\n }}\r\n onMouseLeave={(e) => {\r\n e.currentTarget.style.background = \"transparent\";\r\n }}\r\n >\r\n {/* Directional chevron on left */}\r\n <div\r\n style={{\r\n paddingTop: \"2px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n flexShrink: 0,\r\n }}\r\n >\r\n {isExpanded ? (\r\n <ChevronDown size={16} />\r\n ) : (\r\n <ChevronRight size={16} />\r\n )}\r\n </div>\r\n <div style={{ flex: 1, minWidth: 0 }}>\r\n <div style={{ marginBottom: \"4px\" }}>\r\n <span\r\n style={{\r\n fontSize: \"13px\",\r\n fontWeight: 680,\r\n color: \"rgba(30, 33, 37, 0.92)\",\r\n lineHeight: 1.2,\r\n }}\r\n >\r\n {sampleSignal.name}\r\n </span>\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"12px\",\r\n color: \"rgba(30, 33, 37, 0.65)\",\r\n lineHeight: 1.4,\r\n marginBottom: \"6px\",\r\n }}\r\n >\r\n {sampleSignal.description}\r\n </div>\r\n <div\r\n style={{\r\n fontSize: \"11px\",\r\n color: \"rgba(30, 33, 37, 0.42)\",\r\n fontFamily: \"ui-monospace, monospace\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n {sampleSignal.technicalKey}\r\n </div>\r\n <div\r\n style={{\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n gap: \"12px\",\r\n fontSize: \"11.5px\",\r\n }}\r\n >\r\n <span style={{ color: \"rgba(139, 157, 127, 0.65)\" }}>prob</span>\r\n <strong style={{ color: \"rgba(139, 157, 127, 0.85)\" }}>\r\n {sampleSignal.probability.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(184, 156, 106, 0.65)\" }}>conf</span>\r\n <strong style={{ color: \"rgba(184, 156, 106, 0.85)\" }}>\r\n {sampleSignal.confidence.toFixed(2)}\r\n </strong>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.24)\" }}>·</span>\r\n <span style={{ color: \"rgba(30, 33, 37, 0.52)\" }}>\r\n {sampleSignal.observations} observations\r\n </span>\r\n </div>\r\n </div>\r\n </button>\r\n\r\n {/* Expanded content */}\r\n {isExpanded && (\r\n <div\r\n style={{\r\n borderTop: \"1px solid rgba(52, 58, 64, 0.08)\",\r\n background: \"rgba(244, 241, 230, 0.25)\",\r\n padding: \"16px 16px 16px 21px\",\r\n }}\r\n >\r\n <div\r\n style={{\r\n fontSize: \"10px\",\r\n fontWeight: 650,\r\n letterSpacing: \"0.08em\",\r\n textTransform: \"uppercase\",\r\n color: \"rgba(30, 33, 37, 0.52)\",\r\n marginBottom: \"8px\",\r\n }}\r\n >\r\n Contributing Observations\r\n </div>\r\n <div style={{ fontSize: \"12px\", color: \"rgba(30, 33, 37, 0.62)\" }}>\r\n [Observations would appear here]\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n"],"names":["fmtMs","ms","EvidenceItem","ev","onPlay","onHighlight","actor","jsx","UserCheck","User","jsxs","SmallButton","Play","_a","ScrollText","AgentLiftCard","outcomeLift","pExpected","pFull","liftRaw","liftRecentered","fmtPct","v","fmtPp","pp","liftColor","DetailCard","TrendingUp","_b","key","i","Tag","STYLE_ID","ensureKeyframes","style","CoachingSynthesisCard","data","loading","error","React","w","strengths","improvements","organizational","oneLiner","context","CoachingSection","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","val","GROUP_LABELS","Target","FileText","Scale","Zap","MessageSquare","KIND_COLORS","CheckCircle","InteractionSignals","signals","expandedSignals","toggleSignal","playAudio","highlightTurns","grouped","useMemo","result","g","groupKey","groupSignals","info","SectionLabel","name","delta","hasObs","isExpanded","e","ChevronDown","obs","oi","ei","InteractionGuidance","guidance","ki","ownerBadge","sr","si","CornerDownRight","InteractionNBA","nba","r","InteractionRecording","audioUrl","timelineSegments","durationSeconds","currentTimeSeconds","timelinePlaying","playbackRate","onSeek","onTogglePlay","onSeekBack","onSeekForward","onSetPlaybackRate","audioRef","Timeline","InteractionTranscript","transcript","highlightedTurns","activeTurnIndex","turnObservations","setExpandedSignals","onTurnPlayPause","formatTimeRange","startMs","endMs","formatTime","minutes","start","end","turns","prev","el","TranscriptCard","messageActionButtonStyle","MessageThread","sessionTitle","sessionSubtitle","threadLabel","initialMessages","onSendMessage","onReplyMessage","onEditMessage","onDeleteMessage","onCreateNewThread","currentUser","isLoading","messageInput","setMessageInput","useState","isFocused","setIsFocused","messages","setMessages","isSending","setIsSending","hoveredMessageId","setHoveredMessageId","replyingToMessageId","setReplyingToMessageId","replyDraft","setReplyDraft","editingMessageId","setEditingMessageId","editContent","setEditContent","deleteConfirmMessage","setDeleteConfirmMessage","showNewThreadCompose","setShowNewThreadCompose","newThreadInput","setNewThreadInput","isCreatingNewThread","setIsCreatingNewThread","messagesEndRef","useRef","messageInputRef","displayCurrentUser","hasHeader","replyingToMessage","useEffect","handleNewThreadSubmit","trimmed","handleNewThreadCancel","handleSend","content","optimisticId","optimisticMessage","msg","handleKeyPress","handleReplyClick","message","handleInlineReplySend","parentMessageId","handleEditClick","handleEditSubmit","handleDeleteClick","handleDeleteConfirm","Clock","Fragment","Send","findBlock","blocks","id","b","InteractionDetailPanel","coachingData","coachingLoading","coachingError","segmentEndHandlerRef","setHighlightedTurns","setCurrentTimeSeconds","setTimelinePlaying","setPlaybackRate","ctx","summary","_c","_d","_e","_f","_g","messageThread","_h","_i","_j","d","_k","map","signal","groupInfo","tid","o","_l","startTime","endTime","isAgent","actorName","currentMs","handleTimelineSeek","handleTimelineTogglePlay","p","handleTimelineSeekBack","handleTimelineSeekForward","duration","handleSetPlaybackRate","rate","audio","updateTime","handlePlay","handlePause","handleEnded","player","startSec","endSec","handler","handleTranscriptTurnPlayPause","turn","index","turnIds","container","next","_m","ErrorBoundary","props","InteractionDetailPanelWrapper","ExpandPatternComparison","pattern","setIsExpanded","sampleSignal","ChevronRight"],"mappings":"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"}