chordia-ui 3.3.8 → 3.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentLiftCard.cjs.js.map +1 -1
- package/dist/AgentLiftCard.es.js +5 -3
- package/dist/AgentLiftCard.es.js.map +1 -1
- package/dist/CustomFilterChips.cjs.js.map +1 -1
- package/dist/CustomFilterChips.es.js +2 -1
- package/dist/CustomFilterChips.es.js.map +1 -1
- package/dist/FileUploadingState.cjs.js.map +1 -1
- package/dist/FileUploadingState.es.js +16 -10
- package/dist/FileUploadingState.es.js.map +1 -1
- package/dist/IntegrationCard.cjs.js.map +1 -1
- package/dist/IntegrationCard.es.js +3 -3
- package/dist/IntegrationCard.es.js.map +1 -1
- package/dist/SectionLabel.cjs.js.map +1 -1
- package/dist/SectionLabel.es.js.map +1 -1
- package/dist/SmallButton.cjs.js.map +1 -1
- package/dist/SmallButton.es.js +16 -16
- package/dist/SmallButton.es.js.map +1 -1
- package/dist/SummarySection.cjs.js.map +1 -1
- package/dist/SummarySection.es.js +11 -9
- package/dist/SummarySection.es.js.map +1 -1
- package/dist/TextInput.cjs.js.map +1 -1
- package/dist/TextInput.es.js.map +1 -1
- package/dist/Timeline.cjs.js.map +1 -1
- package/dist/Timeline.es.js +14 -8
- package/dist/Timeline.es.js.map +1 -1
- package/dist/Tooltip.cjs.js +1 -1
- package/dist/Tooltip.cjs.js.map +1 -1
- package/dist/Tooltip.es.js +31 -20
- package/dist/Tooltip.es.js.map +1 -1
- package/dist/TourGuideTooltip.cjs.js.map +1 -1
- package/dist/TourGuideTooltip.es.js +2 -1
- package/dist/TourGuideTooltip.es.js.map +1 -1
- package/dist/UpdatedInteractionRecording.cjs.js +1 -1
- package/dist/UpdatedInteractionRecording.cjs.js.map +1 -1
- package/dist/UpdatedInteractionRecording.es.js +79 -97
- package/dist/UpdatedInteractionRecording.es.js.map +1 -1
- package/dist/UploadInteraction.cjs.js.map +1 -1
- package/dist/UploadInteraction.es.js.map +1 -1
- package/dist/colors.cjs.js +2 -0
- package/dist/colors.cjs.js.map +1 -0
- package/dist/colors.es.js +2 -0
- package/dist/colors.es.js.map +1 -0
- package/dist/components/UpdatedInteractionDetails.cjs.js +10 -1
- package/dist/components/UpdatedInteractionDetails.cjs.js.map +1 -1
- package/dist/components/UpdatedInteractionDetails.es.js +1531 -9
- package/dist/components/UpdatedInteractionDetails.es.js.map +1 -1
- package/dist/components/chat.cjs.js +30 -1
- package/dist/components/chat.cjs.js.map +1 -1
- package/dist/components/chat.es.js +2222 -7
- package/dist/components/chat.es.js.map +1 -1
- package/dist/components/common.cjs.js +1 -1
- package/dist/components/common.es.js +32 -25
- package/dist/components/common.es.js.map +1 -1
- package/dist/components/data.cjs.js +1 -1
- package/dist/components/data.cjs.js.map +1 -1
- package/dist/components/data.es.js +1033 -4
- package/dist/components/data.es.js.map +1 -1
- package/dist/components/layout.cjs.js +3 -1
- package/dist/components/layout.cjs.js.map +1 -1
- package/dist/components/layout.es.js +1533 -8
- package/dist/components/layout.es.js.map +1 -1
- package/dist/components/login.cjs.js +1 -1
- package/dist/components/login.es.js +6 -2
- package/dist/components/login.es.js.map +1 -1
- package/dist/components/media.cjs.js +1 -1
- package/dist/components/media.cjs.js.map +1 -1
- package/dist/components/media.es.js +220 -6
- package/dist/components/media.es.js.map +1 -1
- package/dist/components/models.cjs.js +1 -1
- package/dist/components/models.cjs.js.map +1 -1
- package/dist/components/models.es.js +91 -2
- package/dist/components/models.es.js.map +1 -1
- package/dist/components/navigation.cjs.js +1 -1
- package/dist/components/navigation.cjs.js.map +1 -1
- package/dist/components/navigation.es.js +766 -7
- package/dist/components/navigation.es.js.map +1 -1
- package/dist/components/notifications.cjs.js +1 -1
- package/dist/components/notifications.cjs.js.map +1 -1
- package/dist/components/notifications.es.js +368 -3
- package/dist/components/notifications.es.js.map +1 -1
- package/dist/components/onboarding.cjs.js +1 -1
- package/dist/components/onboarding.cjs.js.map +1 -1
- package/dist/components/onboarding.es.js +985 -7
- package/dist/components/onboarding.es.js.map +1 -1
- package/dist/components/primitives.cjs.js +1 -1
- package/dist/components/primitives.cjs.js.map +1 -1
- package/dist/components/primitives.es.js +635 -25
- package/dist/components/primitives.es.js.map +1 -1
- package/dist/debugger-wc.cjs.js +4 -4
- package/dist/debugger-wc.cjs.js.map +1 -1
- package/dist/debugger-wc.es.js +15 -11
- package/dist/debugger-wc.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs2.js +2 -49
- package/dist/index.cjs2.js.map +1 -1
- package/dist/index.cjs3.js +50 -0
- package/dist/index.cjs3.js.map +1 -0
- package/dist/index.es.js +104 -99
- package/dist/index.es.js.map +1 -1
- package/dist/index.es2.js +2632 -1776
- package/dist/index.es2.js.map +1 -1
- package/dist/index.es3.js +1944 -0
- package/dist/index.es3.js.map +1 -0
- package/dist/pages/interactionDetails.cjs.js +1 -1
- package/dist/pages/interactionDetails.cjs.js.map +1 -1
- package/dist/pages/interactionDetails.es.js +70 -47
- package/dist/pages/interactionDetails.es.js.map +1 -1
- package/dist/sortable.esm.cjs.js +1 -1
- package/dist/sortable.esm.cjs.js.map +1 -1
- package/dist/sortable.esm.es.js +55 -53
- package/dist/sortable.esm.es.js.map +1 -1
- package/dist/{chordia-ui.css → style.css} +1 -1
- package/package.json +1 -1
- package/src/components/UpdatedInteractionDetails/UpdatedInteractionDetails.jsx +318 -77
- package/src/components/UpdatedInteractionDetails/UpdatedInteractionRecording.jsx +7 -17
- package/dist/ChartRenderer.cjs.js +0 -31
- package/dist/ChartRenderer.cjs.js.map +0 -1
- package/dist/ChartRenderer.es.js +0 -2210
- package/dist/ChartRenderer.es.js.map +0 -1
- package/dist/GettingStarted.cjs.js +0 -2
- package/dist/GettingStarted.cjs.js.map +0 -1
- package/dist/GettingStarted.es.js +0 -983
- package/dist/GettingStarted.es.js.map +0 -1
- package/dist/InlineConfirm.cjs.js +0 -2
- package/dist/InlineConfirm.cjs.js.map +0 -1
- package/dist/InlineConfirm.es.js +0 -618
- package/dist/InlineConfirm.es.js.map +0 -1
- package/dist/InteractionSummaryCard.cjs.js +0 -2
- package/dist/InteractionSummaryCard.cjs.js.map +0 -1
- package/dist/InteractionSummaryCard.es.js +0 -216
- package/dist/InteractionSummaryCard.es.js.map +0 -1
- package/dist/LoginPage.cjs.js +0 -3
- package/dist/LoginPage.cjs.js.map +0 -1
- package/dist/LoginPage.es.js +0 -2618
- package/dist/LoginPage.es.js.map +0 -1
- package/dist/NavigationBar.cjs.js +0 -2
- package/dist/NavigationBar.cjs.js.map +0 -1
- package/dist/NavigationBar.es.js +0 -762
- package/dist/NavigationBar.es.js.map +0 -1
- package/dist/NotificationPanel.cjs.js +0 -2
- package/dist/NotificationPanel.cjs.js.map +0 -1
- package/dist/NotificationPanel.es.js +0 -371
- package/dist/NotificationPanel.es.js.map +0 -1
- package/dist/OverlayPanel.cjs.js +0 -2
- package/dist/OverlayPanel.cjs.js.map +0 -1
- package/dist/OverlayPanel.es.js +0 -93
- package/dist/OverlayPanel.es.js.map +0 -1
- package/dist/SplitPane.cjs.js +0 -4
- package/dist/SplitPane.cjs.js.map +0 -1
- package/dist/SplitPane.es.js +0 -1531
- package/dist/SplitPane.es.js.map +0 -1
- package/dist/SummaryStatsPanel.cjs.js +0 -2
- package/dist/SummaryStatsPanel.cjs.js.map +0 -1
- package/dist/SummaryStatsPanel.es.js +0 -1027
- package/dist/SummaryStatsPanel.es.js.map +0 -1
- package/dist/UpdatedInteractionDetails.cjs.js +0 -11
- package/dist/UpdatedInteractionDetails.cjs.js.map +0 -1
- package/dist/UpdatedInteractionDetails.es.js +0 -1310
- package/dist/UpdatedInteractionDetails.es.js.map +0 -1
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),h=require("react"),D=require("lucide-react"),g=require("recharts"),ae=({content:f,onCodeBlockClick:y,onFilePathClick:b})=>{const[v,a]=h.useState(new Set),j=async(s,n)=>{try{await navigator.clipboard.writeText(s),a(t=>new Set([...t,n])),setTimeout(()=>{a(t=>{const r=new Set(t);return r.delete(n),r})},2e3)}catch(t){console.error("Failed to copy text:",t)}},L=(s,n,t)=>{const r=v.has(t);return e.jsxs("div",{style:{position:"relative",marginBottom:"16px",borderRadius:"8px",background:"var(--ink, #1E2125)",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",overflow:"hidden"},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",padding:"8px 12px",background:"rgba(255,255,255,0.05)",borderBottom:"1px solid rgba(255,255,255,0.1)"},children:[e.jsx("span",{style:{fontSize:"11px",color:"rgba(255,255,255,0.7)",fontFamily:"var(--font-mono, monospace)",textTransform:"uppercase",letterSpacing:"0.05em"},children:n||"code"}),e.jsxs("button",{onClick:()=>j(s,t),style:{background:"none",border:"none",color:"rgba(255,255,255,0.7)",cursor:"pointer",padding:"4px",borderRadius:"4px",display:"flex",alignItems:"center",gap:"4px",fontSize:"11px",transition:"all 0.15s ease"},onMouseEnter:d=>{d.target.style.background="rgba(255,255,255,0.1)",d.target.style.color="rgba(255,255,255,0.9)"},onMouseLeave:d=>{d.target.style.background="none",d.target.style.color="rgba(255,255,255,0.7)"},children:[r?e.jsx(D.Check,{size:12}):e.jsx(D.Copy,{size:12}),r?"Copied!":"Copy"]}),y&&e.jsxs("button",{onClick:()=>y({code:s,language:n}),style:{background:"none",border:"none",color:"rgba(255,255,255,0.7)",cursor:"pointer",padding:"4px",borderRadius:"4px",display:"flex",alignItems:"center",gap:"4px",fontSize:"11px",transition:"all 0.15s ease"},onMouseEnter:d=>{d.currentTarget.style.background="rgba(255,255,255,0.1)",d.currentTarget.style.color="rgba(255,255,255,0.9)"},onMouseLeave:d=>{d.currentTarget.style.background="none",d.currentTarget.style.color="rgba(255,255,255,0.7)"},children:[e.jsx(D.PanelRightOpen,{size:12}),"Canvas"]})]}),e.jsx("pre",{style:{margin:0,padding:"12px",fontFamily:"var(--font-mono, monospace)",fontSize:"13px",lineHeight:1.4,color:"rgba(255,255,255,0.95)",overflow:"auto",whiteSpace:"pre-wrap",wordBreak:"break-word"},children:s})]},t)},w=s=>{const n=[],t=s.split(`
|
|
2
|
-
`);let r=0,d=0;for(;r<t.length;){const p=t[r];if(p.trim().startsWith("```")){const c=p.trim().slice(3);let C=[];for(r++;r<t.length&&!t[r].trim().startsWith("```");)C.push(t[r]),r++;r<t.length&&r++,n.push(L(C.join(`
|
|
3
|
-
`),c,`code-${d++}`));continue}if(p.startsWith("#")){const c=p.match(/^#+/)[0].length,C=p.slice(c).trim(),z=c===1?"h2":c===2?"h3":c===3?"h4":"h5";n.push(h.createElement(z,{key:`header-${r}`,style:{fontSize:c===1?"18px":c===2?"16px":"14px",fontWeight:720,color:"var(--text-strong, rgba(30,33,37,0.92))",marginTop:n.length>0?"20px":"0",marginBottom:"8px",lineHeight:1.3}},C)),r++;continue}if(p.trim()==="---"||p.trim()==="***"){n.push(e.jsx("hr",{style:{border:"none",borderTop:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",margin:"16px 0"}},`hr-${r}`)),r++;continue}if(p.match(/^(\s*)([-*+]|\d+\.)\s/)){const c=[],C=/^\s*\d+\./.test(p);for(;r<t.length&&(t[r].match(/^(\s*)([-*+]|\d+\.)\s/)||t[r].trim()==="");){if(t[r].trim()!==""){const R=t[r].match(/^(\s*)([-*+]|\d+\.)\s(.*)$/);R&&c.push(R[3])}r++}const z=C?"ol":"ul";n.push(h.createElement(z,{key:`list-${r}`,style:{margin:"8px 0",paddingLeft:"20px",color:"var(--text-strong, rgba(30,33,37,0.92))"}},c.map((R,o)=>h.createElement("li",{key:`item-${o}`,style:{marginBottom:"4px"}},l(R)))));continue}if(p.trim().startsWith("|")&&p.trim().endsWith("|")){const c=[];for(;r<t.length&&t[r].trim().startsWith("|")&&t[r].trim().endsWith("|");)c.push(t[r]),r++;if(c.length>=2){const C=i=>i.trim().slice(1,-1).split("|").map(u=>u.trim()),z=C(c[0]),R=i=>C(i).every(u=>/^[-:]+$/.test(u)),o=c.length>=2&&R(c[1]),k=o?2:1,M=o?C(c[1]).map(i=>i.startsWith(":")&&i.endsWith(":")?"center":i.endsWith(":")?"right":"left"):z.map(()=>"left"),T={padding:"6px 12px",borderBottom:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",fontSize:"13px",lineHeight:1.5,color:"var(--text-strong, rgba(30,33,37,0.92))"};n.push(e.jsx("div",{style:{overflowX:"auto",margin:"8px 0"},children:e.jsxs("table",{style:{borderCollapse:"collapse",width:"100%",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:"6px",overflow:"hidden"},children:[o&&e.jsx("thead",{children:e.jsx("tr",{style:{background:"var(--hover-warm-subtle, rgba(231,212,162,0.08))"},children:z.map((i,u)=>e.jsx("th",{style:{...T,fontWeight:660,textAlign:M[u]||"left",whiteSpace:"nowrap"},children:l(i)},u))})}),e.jsx("tbody",{children:(o?c.slice(k):c).map((i,u)=>e.jsx("tr",{style:{background:u%2===1?"var(--hover-warm-subtle, rgba(231,212,162,0.04))":"transparent"},children:C(i).map((I,S)=>e.jsx("td",{style:{...T,textAlign:M[S]||"left"},children:l(I)},S))},u))})]})},`table-${r}`))}continue}if(p.trim()){const c=[];for(;r<t.length&&t[r].trim()&&!t[r].match(/^(#|```|---|\*\*\*|(\s*)([-*+]|\d+\.)\s)/)&&!(t[r].trim().startsWith("|")&&t[r].trim().endsWith("|"));)c.push(t[r]),r++;c.length>0&&n.push(e.jsx("p",{style:{margin:"8px 0",lineHeight:1.6,color:"var(--text-strong, rgba(30,33,37,0.92))"},children:l(c.join(" "))},`p-${r}`))}else r++}return n},m=s=>{const n=[];let t=s,r=0;for(;t.length>0;){if(b){const R=t.match(/^([^\s`*\[]+(?:\/src\/|\/components\/|\/packages\/)[^\s`*\[]*|[^\s`*\[]*\.(ts|tsx|js|jsx|py|css|scss|sass|json|md|yaml|yml|html|xml|sh|sql|go|rs|php|java|c|cpp|h|hpp)(?:\b|$))/);if(R){const o=R[1];n.push(e.jsx("span",{onClick:()=>b(o),style:{color:"var(--rail-discovery, #5E88B0)",textDecoration:"underline",textDecorationStyle:"dotted",textUnderlineOffset:"2px",cursor:"pointer",fontFamily:"var(--font-mono, monospace)",fontSize:"13px",transition:"all 0.15s ease",":hover":{background:"var(--hover-warm-subtle, rgba(231,212,162,0.08))",textDecoration:"underline",textDecorationStyle:"solid"}},onMouseEnter:k=>{k.target.style.background="var(--hover-warm-subtle, rgba(231,212,162,0.08))",k.target.style.textDecorationStyle="solid"},onMouseLeave:k=>{k.target.style.background="none",k.target.style.textDecorationStyle="dotted"},children:o},`file-path-${r++}`)),t=t.slice(R[0].length);continue}}const d=t.match(/^`([^`]+)`/);if(d){n.push(e.jsx("code",{style:{background:"var(--hover-warm-subtle, rgba(231,212,162,0.08))",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:"3px",padding:"2px 4px",fontFamily:"var(--font-mono, monospace)",fontSize:"12px",color:"var(--text-strong, rgba(30,33,37,0.92))"},children:d[1]},`inline-code-${r++}`)),t=t.slice(d[0].length);continue}const p=t.match(/^\*\*([^*]+)\*\*/);if(p){n.push(e.jsx("strong",{style:{fontWeight:720,color:"var(--text-strong, rgba(30,33,37,0.92))"},children:p[1]},`bold-${r++}`)),t=t.slice(p[0].length);continue}const c=t.match(/^\*([^*]+)\*/);if(c){n.push(e.jsx("em",{style:{fontStyle:"italic",color:"var(--text-strong, rgba(30,33,37,0.92))"},children:c[1]},`italic-${r++}`)),t=t.slice(c[0].length);continue}const C=t.match(/^\[([^\]]+)\]\(([^)]+)\)/);if(C){n.push(e.jsx("a",{href:C[2],target:"_blank",rel:"noopener noreferrer",style:{color:"var(--rail-discovery, #5E88B0)",textDecoration:"underline",textUnderlineOffset:"2px"},children:C[1]},`link-${r++}`)),t=t.slice(C[0].length);continue}const z=t.search(/[`*\[]/);if(z===-1){n.push(t);break}else z===0?(n.push(t[0]),t=t.slice(1)):(n.push(t.slice(0,z)),t=t.slice(z))}return n.length===1&&typeof n[0]=="string"?n[0]:n},l=s=>m(s);return e.jsx("div",{children:w(f)})};function re({role:f,content:y,html:b,timestamp:v,toolBadges:a,isStreaming:j,onCodeBlockClick:L,onFilePathClick:w}){const m=f==="user";return e.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:m?"flex-end":"flex-start",marginBottom:"16px",maxWidth:"100%"},children:[e.jsxs("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginBottom:"6px",fontWeight:650,letterSpacing:"0.02em"},children:[m?"You":"Chordia",j&&!m&&e.jsx("span",{style:{marginLeft:"6px",color:"var(--rail-purple, #9B7AA8)"},children:"●"})]}),a&&a.length>0&&e.jsx("div",{style:{marginBottom:"8px",display:"flex",flexWrap:"wrap",gap:"4px",maxWidth:"75%"},children:a.map((l,s)=>e.jsxs("span",{style:{display:"inline-block",fontSize:"11px",padding:"2px 8px",borderRadius:"6px",background:"var(--paper-elevated, rgba(255,255,255,0.82))",border:`1px solid ${l.pending?"var(--rail-discovery, #5A8CC0)":l.success!==!1?"var(--state-present, #5CB85C)":"var(--rail-signal-churn, #C98A5A)"}`,color:l.pending?"var(--rail-discovery, #5A8CC0)":l.success!==!1?"var(--state-present, #5CB85C)":"var(--rail-signal-churn, #C98A5A)"},children:[e.jsx(D.Wrench,{size:10,style:{marginRight:3,verticalAlign:"middle"}}),l.name,l.pending?"...":l.success!==!1?" ✓":" ✗"]},l.id||s))}),e.jsx("div",{style:{maxWidth:"75%",padding:"12px 16px",borderRadius:"var(--radius-lg, 12px)",background:m?"var(--card-customer, rgba(94,136,176,0.08))":"var(--paper-elevated, rgba(255,255,255,0.82))",border:m?"1px solid var(--border-subtle, rgba(52,58,64,0.08))":"1px solid var(--border, rgba(52,58,64,0.12))",fontSize:"var(--text-base, 14px)",lineHeight:1.6,color:"var(--text-strong, rgba(30,33,37,0.92))",wordBreak:"break-word"},children:b?e.jsx("div",{dangerouslySetInnerHTML:{__html:b}}):m?e.jsx("div",{style:{whiteSpace:"pre-wrap"},children:y}):e.jsx(ae,{content:y||"",onCodeBlockClick:L,onFilePathClick:w})}),v&&e.jsx("div",{style:{fontSize:"var(--text-xs-plus, 10.5px)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginTop:"4px",fontFamily:"var(--font-mono, monospace)"},children:v})]})}function se({phase:f="thinking",toolSteps:y=[],label:b,elapsedMs:v,compact:a=!1}){const j=t=>{if(!t||t<1e3)return null;const r=Math.floor(t/1e3);if(r<60)return`${r}s`;const d=Math.floor(r/60),p=r%60;return p>0?`${d}m ${p}s`:`${d}m`},L=()=>{if(b)return b;switch(f){case"thinking":return"Thinking...";case"tool":return null;case"responding":return"Responding...";default:return"Thinking..."}},w=(t,r)=>{const d=()=>{const c={width:a?"4px":"6px",height:a?"4px":"6px",borderRadius:"50%",display:"inline-block",marginRight:a?"6px":"8px"};switch(t.status){case"active":return e.jsx("span",{style:{...c,backgroundColor:"var(--rail-purple, #9B7AA8)",animation:"pulse 1.2s ease-in-out infinite"}});case"done":return e.jsx("span",{style:{...c,backgroundColor:"var(--text-xfaint, rgba(30,33,37,0.28))"}});case"error":return e.jsx("span",{style:{...c,backgroundColor:"var(--rail-compliance, #C98A5A)"}});default:return e.jsx("span",{style:{...c,backgroundColor:"var(--text-xfaint, rgba(30,33,37,0.28))"}})}},p=()=>{switch(t.status){case"done":return e.jsx("span",{style:{color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:a?"9px":"var(--text-xs-plus, 10.5px)"},children:"✓"});case"error":return e.jsx("span",{style:{color:"var(--rail-compliance, #C98A5A)",fontSize:a?"9px":"var(--text-xs-plus, 10.5px)"},children:"failed"});default:return null}};return e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:a?"2px":"4px"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center"},children:[d(),e.jsx("span",{style:{fontFamily:"var(--font-mono)",fontSize:a?"9px":"var(--text-xs-plus, 10.5px)",color:"var(--text-muted)"},children:t.name})]}),p()]},r)},m=()=>e.jsx("div",{style:{width:"100%",height:a?"2px":"3px",backgroundColor:"var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:a?"2px":"3px",overflow:"hidden",position:"relative"},children:e.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,background:"linear-gradient(90deg, transparent 0%, rgba(155,122,168,0.3) 50%, transparent 100%)",animation:"shimmer 2s linear infinite"}})}),l=()=>e.jsx("span",{style:{width:a?"4px":"6px",height:a?"10px":"14px",backgroundColor:"var(--rail-purple, #9B7AA8)",borderRadius:"1px",display:"inline-block",marginLeft:"2px",animation:"cursorBlink 0.8s ease-in-out infinite"}}),s=L(),n=j(v);return e.jsxs("div",{style:{borderLeft:`${a?"3px":"4px"} solid var(--rail-purple, #9B7AA8)`,backgroundColor:"var(--card-assistant, rgba(155,122,168,0.06))",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:a?"8px":"10px",padding:a?"8px 10px 8px 12px":"10px 14px 10px 18px"},children:[e.jsx("style",{children:`
|
|
4
|
-
@keyframes shimmer {
|
|
5
|
-
0% { transform: translateX(-100%); }
|
|
6
|
-
100% { transform: translateX(200%); }
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
@keyframes pulse {
|
|
10
|
-
0%, 100% { opacity: 0.4; }
|
|
11
|
-
50% { opacity: 1.0; }
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
@keyframes cursorBlink {
|
|
15
|
-
0%, 100% { opacity: 0; }
|
|
16
|
-
50% { opacity: 1; }
|
|
17
|
-
}
|
|
18
|
-
`}),!a&&e.jsx("div",{style:{fontSize:"var(--text-xs-plus, 10.5px)",fontWeight:650,textTransform:"uppercase",letterSpacing:"var(--tracking-label, 0.16em)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginBottom:"8px"},children:"AI ASSISTANT"}),f==="thinking"&&e.jsxs("div",{children:[e.jsxs("div",{style:{color:"var(--text-muted)",fontWeight:400,fontSize:a?"11px":"13px",marginBottom:a?"4px":"8px",display:"flex",alignItems:"center",gap:"6px"},children:[s,n&&e.jsx("span",{style:{fontSize:a?"9px":"10px",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:n})]}),m()]}),f==="tool"&&e.jsxs("div",{children:[s&&e.jsxs("div",{style:{color:"var(--text-muted)",fontWeight:400,fontSize:a?"11px":"13px",marginBottom:a?"4px":"8px",display:"flex",alignItems:"center",gap:"6px"},children:[s,n&&e.jsx("span",{style:{fontSize:a?"9px":"10px",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:n})]}),e.jsx("div",{style:{marginBottom:a?"4px":"8px"},children:y.map((t,r)=>w(t,r))}),m()]}),f==="responding"&&e.jsxs("div",{style:{color:"var(--text-muted)",fontWeight:400,fontSize:a?"11px":"13px",display:"flex",alignItems:"center",gap:"6px"},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center"},children:[s,l()]}),n&&e.jsx("span",{style:{fontSize:a?"9px":"10px",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:n})]})]})}const oe={error:(...f)=>console.warn("toast.error:",...f)};function ie({initialMessages:f=[],onSendMessage:y,onStreamMessage:b,onMessagesChange:v,onCodeBlockClick:a,placeholder:j="Ask a question about this interaction...",title:L="Chat with Chordia"}){const[w,m]=h.useState(f||[]),[l,s]=h.useState(""),[n,t]=h.useState(!1),[r,d]=h.useState(!1),[p,c]=h.useState(null),[C,z]=h.useState("thinking"),[R,o]=h.useState(null),[k,M]=h.useState(0),T=h.useRef(null),i=h.useRef(null),u=h.useRef(null),I=h.useRef(null),S=h.useRef(null),[E,_]=h.useState(!1),[O,Y]=h.useState(0);h.useEffect(()=>{var x;(x=T.current)==null||x.scrollIntoView({behavior:"smooth"})},[w,n]),h.useEffect(()=>{i.current&&(i.current.style.height="auto",i.current.style.height=`${Math.min(i.current.scrollHeight,120)}px`)},[l]),h.useEffect(()=>{if(v){const x=[...w];p&&x.push(p),v(x)}},[w,p,v]),h.useEffect(()=>{let x;return n&&R&&(x=setInterval(()=>{if(M(Date.now()-R),S.current){const W=(Date.now()-S.current)/1e3;W>=3?(_(!0),Y(Math.floor(W))):_(!1)}},500)),()=>x&&clearInterval(x)},[n,R]);const H=()=>{t(!1),d(!1),c(null),I.current=null,z("thinking"),_(!1),Y(0),S.current=null,o(null),M(0),u.current&&(u.current.abort(),u.current=null)},K=x=>{if(x.startsWith("data: ")){const W=x.slice(6);if(W==="[DONE]")return{type:"done"};try{return{type:"data",data:JSON.parse(W)}}catch{return null}}return null},q=x=>{var P,B;if(!((B=(P=x.choices)==null?void 0:P[0])!=null&&B.delta))return;S.current=Date.now(),_(!1);const W=x.choices[0].delta;if(W.tool_calls||W.tool_results){z("tool");return}W.content!==void 0&&(z("responding"),c(F=>{const G=F||{id:Date.now().toString(),role:"assistant",content:"",timestamp:new Date().toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}),isStreaming:!0},V={...G,content:(G.content||"")+(W.content||"")};return I.current=V,V}))},U=async x=>{const W=x.getReader(),P=new TextDecoder;let B="";try{for(;;){const{done:F,value:G}=await W.read();if(F)break;B+=P.decode(G,{stream:!0});const V=B.split(`
|
|
19
|
-
`);B=V.pop()||"";for(const ne of V)if(ne.trim()){const Q=K(ne);if(Q){if(Q.type==="done")return;Q.type==="data"&&q(Q.data)}}}}finally{W.releaseLock()}},X=async()=>{if(!l.trim()||r)return;const x=l.trim(),W={id:Date.now().toString(),role:"user",content:x,timestamp:new Date().toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})},P=[...w,W];m(P),s(""),t(!0),d(!0),z("thinking"),o(Date.now()),S.current=Date.now(),u.current=new AbortController;try{let B;if(b)B=await b(x,P);else if(y)B=await y(x,P);else{setTimeout(()=>{const F={id:(Date.now()+1).toString(),role:"assistant",content:"This is a demonstration response. In a real implementation, this would connect to your LLM backend.",timestamp:new Date().toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"})};m(G=>[...G,F]),H()},1e3);return}if(B instanceof ReadableStream)await U(B);else if(B instanceof Response&&B.body)await U(B.body);else if(B&&typeof B.then=="function"){const F=await B;F instanceof ReadableStream?await U(F):F instanceof Response&&F.body&&await U(F.body)}I.current&&m(F=>[...F,{...I.current,isStreaming:!1}])}catch(B){B.name!=="AbortError"&&(oe.error("Failed to send message"),console.error("Stream error:",B))}finally{H()}},$=x=>{x.key==="Enter"&&!x.shiftKey&&(x.preventDefault(),X())};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"var(--radius-lg, 12px)",background:"var(--paper-elevated, rgba(255,255,255,0.82))",overflow:"hidden"},children:[L?e.jsxs("div",{style:{padding:"16px 20px",borderBottom:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsx("div",{style:{fontSize:"var(--text-lg, 16px)",fontWeight:720,letterSpacing:"-0.01em",color:"var(--text-strong, rgba(30,33,37,0.92))"},children:L}),e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-muted, rgba(30,33,37,0.56))",marginTop:"2px"},children:"Ask questions, get insights from analyzed interactions"})]}):null,e.jsx("div",{style:{flex:1,minHeight:0,overflowY:"auto",padding:"20px",display:"flex",flexDirection:"column"},children:w.length===0?e.jsx("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"var(--text-md, 13px)",textAlign:"center",padding:"40px"},children:"No messages yet. Start a conversation by asking a question below."}):e.jsxs(e.Fragment,{children:[w.map(x=>e.jsx(re,{role:x.role,content:x.content,html:x.html,timestamp:x.timestamp,toolBadges:x.toolBadges,isStreaming:x.isStreaming,onCodeBlockClick:a},x.id)),p&&e.jsx(re,{role:p.role,content:p.content,timestamp:p.timestamp,isStreaming:!0,onCodeBlockClick:a},p.id),n&&(!p||E)&&e.jsx("div",{style:{marginBottom:"16px"},children:e.jsx(se,{phase:E?"tool":C,elapsedMs:k,label:E&&O>=30?"Compacting conversation — trimming context to stay sharp...":E&&O>=10?"Running background tasks...":E?"Still working...":void 0})}),e.jsx("div",{ref:T})]})}),e.jsxs("div",{style:{borderTop:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",padding:"16px 20px",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsxs("div",{style:{display:"flex",gap:"12px",alignItems:"flex-end"},children:[e.jsx("textarea",{ref:i,value:l,onChange:x=>s(x.target.value),onKeyDown:$,placeholder:j,rows:1,disabled:r,style:{flex:1,padding:"10px 14px",fontSize:"var(--text-base, 14px)",lineHeight:1.5,color:"var(--text-strong, rgba(30,33,37,0.92))",background:"rgba(255, 255, 255, 0.95)",border:"1px solid rgba(52, 58, 64, 0.18)",borderRadius:"var(--radius-md, 8px)",resize:"none",outline:"none",transition:"border-color 0.15s ease",fontFamily:"inherit",minHeight:"42px",maxHeight:"120px",opacity:r?.6:1,cursor:r?"not-allowed":"text"},onFocus:x=>{r||(x.target.style.borderColor="rgba(94, 136, 176, 0.35)")},onBlur:x=>{x.target.style.borderColor="rgba(52, 58, 64, 0.18)"}}),e.jsx("button",{onClick:X,disabled:!l.trim()||r,style:{padding:"10px 16px",background:l.trim()&&!r?"var(--Base-Strong, #0B0B0B)":"#ECEEF2",color:l.trim()&&!r?"white":"var(--text-base)",border:"none",borderRadius:"var(--radius-md, 8px)",cursor:l.trim()&&!r?"pointer":"not-allowed",display:"flex",alignItems:"center",gap:"6px",fontSize:"var(--text-md, 13px)",fontWeight:650,transition:"all 0.15s ease",height:"42px"},children:r?e.jsxs(e.Fragment,{children:[e.jsx("style",{children:`
|
|
20
|
-
@keyframes buttonSpin {
|
|
21
|
-
from { transform: rotate(0deg); }
|
|
22
|
-
to { transform: rotate(360deg); }
|
|
23
|
-
}
|
|
24
|
-
`}),e.jsx("div",{style:{width:"14px",height:"14px",border:"2px solid rgba(255, 255, 255, 0.3)",borderTopColor:"white",borderRadius:"50%",animation:"buttonSpin 0.6s linear infinite"}}),"Sending..."]}):e.jsxs(e.Fragment,{children:[e.jsx(D.Send,{size:16}),"Send"]})})]}),e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",marginTop:"8px"},children:"Press Enter to send, Shift+Enter for new line"})]})]})}function le({threads:f=[],activeThreadId:y,onSelectThread:b,onNewChat:v,loading:a=!1}){const[j,L]=h.useState(""),m=[...f.filter(s=>{if(!j)return!0;const n=j.toLowerCase();return(s.title||"").toLowerCase().includes(n)||(s.last_message_preview||"").toLowerCase().includes(n)})].sort((s,n)=>{if(s.pinned&&!n.pinned)return-1;if(!s.pinned&&n.pinned)return 1;const t=new Date(s.updated_at||s.created_at||0).getTime();return new Date(n.updated_at||n.created_at||0).getTime()-t}),l=s=>{if(!s)return"";const n=new Date(s),r=new Date().getTime()-n.getTime(),d=Math.floor(r/864e5);return d===0?n.toLocaleTimeString("en-US",{hour:"2-digit",minute:"2-digit"}):d===1?"Yesterday":d<7?n.toLocaleDateString("en-US",{weekday:"short"}):n.toLocaleDateString("en-US",{month:"short",day:"numeric"})};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"var(--paper, rgba(255,255,255,0.95))",borderRight:"1px solid var(--border, rgba(52,58,64,0.12))",overflow:"hidden"},children:[e.jsxs("div",{style:{padding:"12px 14px",borderBottom:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",flexShrink:0},children:[e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"10px"},children:[e.jsx("div",{style:{fontSize:"13px",fontWeight:650,color:"var(--text-ink, rgba(30,33,37,0.92))"},children:"Threads"}),v&&e.jsx("button",{onClick:v,style:{padding:"4px 10px",fontSize:"11px",fontWeight:600,color:"var(--Base-Strong, #0B0B0B)",background:"#ECEEF2",border:"1px solid var(--border-subtle, rgba(52,58,64,0.08))",borderRadius:"6px",cursor:"pointer",transition:"all 0.15s ease"},onMouseEnter:s=>{s.currentTarget.style.background="#ECEEF2"},onMouseLeave:s=>{s.currentTarget.style.background="rgba(94, 136, 176, 0.08)"},children:"+ New"})]}),e.jsxs("div",{style:{position:"relative"},children:[e.jsx(D.Search,{size:13,style:{position:"absolute",left:"10px",top:"50%",transform:"translateY(-50%)",color:"var(--text-faint, rgba(30,33,37,0.36))",pointerEvents:"none"}}),e.jsx("input",{type:"text",value:j,onChange:s=>L(s.target.value),placeholder:"Search threads...",style:{width:"100%",padding:"7px 10px 7px 32px",fontSize:"12px",color:"var(--text-ink, rgba(30,33,37,0.92))",background:"var(--paper-elevated, rgba(255,255,255,0.82))",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"6px",outline:"none",transition:"border-color 0.15s ease",boxSizing:"border-box"},onFocus:s=>{s.target.style.borderColor="rgba(94, 136, 176, 0.35)"},onBlur:s=>{s.target.style.borderColor="rgba(52, 58, 64, 0.12)"}})]})]}),e.jsx("div",{style:{flex:1,overflowY:"auto",padding:"4px 6px"},children:a?e.jsx("div",{style:{padding:"30px 16px",textAlign:"center",color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"12px"},children:"Loading threads..."}):m.length===0?e.jsx("div",{style:{padding:"30px 16px",textAlign:"center",color:"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"12px"},children:j?"No threads found":"No threads yet"}):m.map(s=>{const n=s.id===y;return e.jsxs("div",{onClick:()=>b==null?void 0:b(s.id),style:{padding:"10px 10px",marginBottom:"2px",borderRadius:"6px",background:n?"rgba(94, 136, 176, 0.10)":"transparent",border:n?"1px solid rgba(94, 136, 176, 0.15)":"1px solid transparent",cursor:"pointer",transition:"all 0.12s ease"},onMouseEnter:t=>{n||(t.currentTarget.style.background="rgba(0,0,0,0.03)")},onMouseLeave:t=>{n||(t.currentTarget.style.background="transparent")},children:[e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px",marginBottom:"4px"},children:[e.jsx(D.MessageSquare,{size:12,style:{color:n?"var(--rail-discovery, #5E88B0)":"var(--text-faint, rgba(30,33,37,0.36))",flexShrink:0}}),e.jsx("div",{style:{flex:1,fontSize:"12px",fontWeight:n?650:550,color:n?"var(--text-ink, rgba(30,33,37,0.92))":"var(--text-base, rgba(30,33,37,0.78))",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:s.title||"Untitled thread"}),s.pinned&&e.jsx(D.Pin,{size:10,style:{color:"var(--rail-discovery, #5E88B0)",flexShrink:0}})]}),s.last_message_preview&&e.jsx("div",{style:{fontSize:"11px",color:"var(--text-muted, rgba(30,33,37,0.56))",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",marginLeft:"18px",marginBottom:"4px"},children:s.last_message_preview}),e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"6px",marginLeft:"18px",fontSize:"10px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:[e.jsx(D.Clock,{size:9}),e.jsx("span",{children:l(s.updated_at||s.created_at)}),s.message_count!=null&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"·"}),e.jsxs("span",{children:[s.message_count," msg",s.message_count!==1?"s":""]})]})]})]},s.id)})})]})}const de={error:(...f)=>console.warn("toast.error:",...f)},ce=()=>({userData:{name:"User",email:""}});function pe({sessionTitle:f,messages:y,onSendMessage:b,currentUser:v}){var R;const[a,j]=h.useState(""),[L,w]=h.useState(!1),[m,l]=h.useState(y||[]),[s,n]=h.useState(!1),[t,r]=h.useState(!1),{userData:d}=ce(),p=h.useRef(null),c=v||{name:d==null?void 0:d.name,initials:((R=d==null?void 0:d.name)==null?void 0:R.split(" ").map(o=>o[0]).join("").toUpperCase())||"YO",color:"#6B7C93"};h.useEffect(()=>{l(y||[])},[y]),h.useEffect(()=>{p.current&&p.current.scrollIntoView({behavior:"smooth"})},[m]);const C=async()=>{if(!a.trim())return;const o=a.trim();j(""),r(!0);const k={id:`temp-${Date.now()}`,author:{name:c.name,role:(d==null?void 0:d.role)||"",initials:c.initials,color:c.color},content:o,timestamp:"Just now",type:"comment",isOptimistic:!0};if(l(M=>[...M,k]),b){try{await b(o),l(M=>M.map(T=>T.id===k.id?{...T,isOptimistic:!1}:T))}catch{l(T=>T.filter(i=>i.id!==k.id)),de.error("Failed to send message")}finally{r(!1)}return}setTimeout(()=>{l(M=>M.map(T=>T.id===k.id?{...T,isOptimistic:!1}:T)),r(!1)},500)},z=o=>{o.key==="Enter"&&!o.shiftKey&&(o.preventDefault(),C())};return e.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"var(--paper-elevated, rgba(255,255,255,0.82))",border:"1px solid var(--border, rgba(52,58,64,0.12))",borderRadius:"var(--radius-lg, 12px)",overflow:"hidden"},children:[f&&e.jsxs("div",{style:{padding:"14px 16px",borderBottom:"1px solid var(--border, rgba(52,58,64,0.12))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsx("div",{style:{fontSize:"var(--text-md, 13px)",fontWeight:680,color:"var(--text-strong, rgba(30,33,37,0.92))",marginBottom:"3px"},children:"Session Discussion"}),f&&e.jsx("div",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-muted, rgba(30,33,37,0.56))",display:"flex",alignItems:"center",gap:"8px"},children:e.jsx("span",{children:f})})]}),e.jsxs("div",{style:{flex:1,overflowY:"auto",padding:"16px",display:"flex",flexDirection:"column",gap:"16px"},children:[s?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:"Loading messages..."}):m.length===0?e.jsx("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"40px",color:"var(--text-faint, rgba(30,33,37,0.36))"},children:"No messages yet. Start the conversation!"}):m.map(o=>e.jsxs("div",{style:{display:"flex",gap:"12px",opacity:o.type==="system"?.75:1},children:[o.type!=="system"&&e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"8px",background:o.author.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0,opacity:.9},children:o.author.initials}),o.type==="system"&&e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"8px",background:"rgba(30, 33, 37, 0.08)",color:"rgba(30, 33, 37, 0.52)",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"11px",fontWeight:650,flexShrink:0},children:e.jsx(D.Clock,{size:14})}),e.jsxs("div",{style:{flex:1,minWidth:0},children:[e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:"8px",marginBottom:"4px"},children:[e.jsx("span",{style:{fontSize:"var(--text-sm, 11px)",fontWeight:650,color:"var(--text-base, rgba(30,33,37,0.78))"},children:o.author.name}),e.jsx("span",{style:{fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",fontFamily:"var(--font-mono, monospace)"},children:o.timestamp}),o.author.role&&e.jsx("span",{style:{fontSize:"var(--text-xs, 10px)",color:"var(--text-muted, rgba(30,33,37,0.56))",background:"rgba(30, 33, 37, 0.06)",padding:"2px 6px",borderRadius:"4px",textTransform:"uppercase",letterSpacing:"0.04em",fontWeight:600},children:o.author.role}),o.isEdited&&e.jsx("span",{style:{fontSize:"var(--text-xs, 10px)",color:"var(--text-faint, rgba(30,33,37,0.36))",fontStyle:"italic"},children:"(edited)"})]}),e.jsx("div",{style:{fontSize:"var(--text-md, 13px)",color:"var(--text-base, rgba(30,33,37,0.78))",lineHeight:1.5,marginBottom:o.references?"8px":0},children:o.content}),o.references&&o.references.length>0&&e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:"6px",marginTop:"8px"},children:o.references.map((k,M)=>e.jsxs("button",{type:"button",style:{fontSize:"11px",padding:"4px 8px",borderRadius:"6px",border:"1px solid rgba(52, 58, 64, 0.16)",background:"rgba(255, 255, 255, 0.7)",color:k.type==="condition"?"rgba(94, 136, 176, 0.85)":k.type==="observation"?"rgba(107, 123, 147, 0.85)":k.type==="timestamp"?"rgba(184, 156, 106, 0.85)":"rgba(30, 33, 37, 0.65)",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"4px",transition:"all 0.15s ease",fontWeight:550},onMouseEnter:T=>{T.currentTarget.style.background="rgba(255, 255, 255, 0.95)",T.currentTarget.style.borderColor="rgba(52, 58, 64, 0.24)"},onMouseLeave:T=>{T.currentTarget.style.background="rgba(255, 255, 255, 0.7)",T.currentTarget.style.borderColor="rgba(52, 58, 64, 0.16)"},children:[k.type==="timestamp"&&e.jsx(D.Clock,{size:12}),(k.type==="condition"||k.type==="observation")&&e.jsx(D.Hash,{size:12}),k.label]},M))})]})]},o.id)),e.jsx("div",{ref:p})]}),e.jsxs("div",{style:{padding:"12px",borderTop:"1px solid var(--border, rgba(52,58,64,0.12))",background:"var(--paper-elevated, rgba(255,255,255,0.82))"},children:[e.jsxs("div",{style:{display:"flex",gap:"8px",alignItems:"flex-end"},children:[e.jsx("div",{style:{width:"32px",height:"32px",borderRadius:"var(--radius-md, 8px)",background:c.color,color:"white",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"var(--text-sm, 11px)",fontWeight:650,flexShrink:0,opacity:.9},children:c.initials}),e.jsxs("div",{style:{flex:1,display:"flex",flexDirection:"column",gap:"8px"},children:[e.jsx("textarea",{value:a,onChange:o=>j(o.target.value),onKeyDown:z,onFocus:()=>w(!0),onBlur:()=>w(!1),placeholder:"Add a comment...",style:{width:"100%",minHeight:"38px",maxHeight:"120px",padding:"8px 12px",fontSize:"var(--text-md, 13px)",color:"var(--text-base, rgba(30,33,37,0.78))",background:"white",border:`1px solid ${L?"rgba(94, 136, 176, 0.35)":"rgba(52, 58, 64, 0.16)"}`,borderRadius:"var(--radius-md, 8px)",resize:"vertical",outline:"none",transition:"border-color 0.15s ease",fontFamily:"inherit",lineHeight:1.5}}),e.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[e.jsxs("div",{style:{display:"flex",gap:"4px"},children:[e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:o=>{o.currentTarget.style.background="rgba(30, 33, 37, 0.06)",o.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:o=>{o.currentTarget.style.background="transparent",o.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Mention user",children:e.jsx(D.AtSign,{size:16})}),e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:o=>{o.currentTarget.style.background="rgba(30, 33, 37, 0.06)",o.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:o=>{o.currentTarget.style.background="transparent",o.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Reference condition",children:e.jsx(D.Hash,{size:16})}),e.jsx("button",{type:"button",style:{padding:"6px",background:"transparent",border:"none",borderRadius:"6px",color:"rgba(30, 33, 37, 0.52)",cursor:"pointer",display:"flex",alignItems:"center",transition:"all 0.15s ease"},onMouseEnter:o=>{o.currentTarget.style.background="rgba(30, 33, 37, 0.06)",o.currentTarget.style.color="rgba(30, 33, 37, 0.75)"},onMouseLeave:o=>{o.currentTarget.style.background="transparent",o.currentTarget.style.color="rgba(30, 33, 37, 0.52)"},title:"Attach file",children:e.jsx(D.Paperclip,{size:16})})]}),e.jsx("button",{type:"button",onClick:C,disabled:!a.trim()||t,style:{padding:"6px 12px",background:a.trim()&&!t?"rgba(94, 136, 176, 0.85)":"var(--border-subtle, rgba(52,58,64,0.08))",border:"none",borderRadius:"6px",color:a.trim()&&!t?"white":"var(--text-faint, rgba(30,33,37,0.36))",fontSize:"var(--text-sm, 11px)",fontWeight:600,cursor:a.trim()&&!t?"pointer":"not-allowed",display:"flex",alignItems:"center",gap:"6px",transition:"all 0.15s ease"},onMouseEnter:o=>{a.trim()&&!t&&(o.currentTarget.style.background="rgba(94, 136, 176, 1)")},onMouseLeave:o=>{a.trim()&&!t&&(o.currentTarget.style.background="rgba(94, 136, 176, 0.85)")},children:t?e.jsxs(e.Fragment,{children:[e.jsx("style",{children:`
|
|
25
|
-
@keyframes messageSpin {
|
|
26
|
-
from { transform: rotate(0deg); }
|
|
27
|
-
to { transform: rotate(360deg); }
|
|
28
|
-
}
|
|
29
|
-
`}),e.jsx("div",{style:{width:"14px",height:"14px",border:"2px solid rgba(255, 255, 255, 0.3)",borderTopColor:"white",borderRadius:"50%",animation:"messageSpin 0.6s linear infinite"}}),"Sending..."]}):e.jsxs(e.Fragment,{children:[e.jsx(D.Send,{size:14}),"Send"]})})]})]})]}),e.jsxs("div",{style:{marginTop:"8px",fontSize:"var(--text-sm, 11px)",color:"var(--text-faint, rgba(30,33,37,0.36))",lineHeight:1.4},children:[e.jsx("strong",{children:"Tip:"})," Use"," ",e.jsx("code",{style:{background:"rgba(30, 33, 37, 0.06)",padding:"2px 4px",borderRadius:"3px",fontFamily:"var(--font-mono, monospace)",fontSize:"var(--text-xs, 10px)"},children:"@"})," ","to mention teammates,"," ",e.jsx("code",{style:{background:"rgba(30, 33, 37, 0.06)",padding:"2px 4px",borderRadius:"3px",fontFamily:"var(--font-mono, monospace)",fontSize:"var(--text-xs, 10px)"},children:"#"})," ","to reference conditions"]})]})]})}const A=["#5E88B0","#9B7AA8","#C98A5A","#7BA89D","#D17B6B","#6B7C93","#9B8E6F","#8A9BAF","#B8976A","#A8C76B"],te={fill:"var(--text-muted, #666)",fontSize:12},N={stroke:"var(--border, #e0e0e0)"},Z="var(--border, #e0e0e0)",J={contentStyle:{backgroundColor:"var(--paper-elevated, #fff)",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-sm, 4px)",boxShadow:"0 2px 8px rgba(0, 0, 0, 0.1)",color:"var(--text-ink, #1e2125)"},labelStyle:{color:"var(--text-strong, #1e2125)"}},ee={color:"var(--text-ink, #1e2125)",fontSize:"12px"},xe=(f,y)=>{if(!f)return!1;const b=f.toLowerCase();return y.filter(a=>String(a).toLowerCase().includes(b)).length<y.length*.5},ge=async(f,y)=>{const b=f.querySelector("svg");if(!b)return;const v=b.cloneNode(!0),a=b.clientWidth||600,j=b.clientHeight||300;v.setAttribute("width",a),v.setAttribute("height",j),v.setAttribute("xmlns","http://www.w3.org/2000/svg");const L=document.createElement("style");L.textContent='text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }',v.insertBefore(L,v.firstChild);const w=new XMLSerializer().serializeToString(v),m=new Blob([w],{type:"image/svg+xml;charset=utf-8"}),l=URL.createObjectURL(m),s=new Image;s.onload=()=>{const n=document.createElement("canvas"),t=2;n.width=a*t,n.height=j*t;const r=n.getContext("2d");r.fillStyle="#ffffff",r.fillRect(0,0,n.width,n.height),r.scale(t,t),r.drawImage(s,0,0,a,j),URL.revokeObjectURL(l);const d=document.createElement("a");d.download=`${(y||"chart").replace(/[^a-z0-9]+/gi,"_")}.png`,d.href=n.toDataURL("image/png"),d.click()},s.src=l},ue=(f,y)=>{const b=["",...f.map(j=>j.name)].join(","),v=y.map(j=>{const L=f.map(w=>{const m=w.data.find(l=>l.x===j);return m?m.y:""});return[j,...L].join(",")}),a=[b,...v].join(`
|
|
30
|
-
`);navigator.clipboard.writeText(a)},he=({onDownload:f,onCopy:y,copied:b})=>e.jsxs("div",{style:{display:"flex",gap:6,justifyContent:"flex-end",marginBottom:8,opacity:.7,transition:"opacity 0.15s"},children:[e.jsx("button",{onClick:y,title:"Copy data as CSV",style:{background:"none",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-sm, 4px)",padding:"3px 8px",fontSize:11,color:"var(--text-muted, #666)",cursor:"pointer",display:"flex",alignItems:"center",gap:4},children:b?"✓ Copied":"📋 CSV"}),e.jsx("button",{onClick:f,title:"Download as PNG",style:{background:"none",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-sm, 4px)",padding:"3px 8px",fontSize:11,color:"var(--text-muted, #666)",cursor:"pointer",display:"flex",alignItems:"center",gap:4},children:"📥 PNG"})]}),fe=({chartType:f,title:y,xLabel:b,yLabel:v,series:a})=>{const j=h.useRef(null),[L,w]=h.useState(!1);if(!a||a.length===0)return null;const m=[...new Set(a.flatMap(i=>i.data.map(u=>u.x)))],l=m.map(i=>{const u={x:i};return a.forEach(I=>{const S=I.data.find(E=>E.x===i);u[I.name]=S?S.y:null}),u}),s=a.map(i=>i.name),n=s.length===1,t=xe(b,m),r=t?20:5,p=Math.max(...m.map(i=>String(i).length))>12||m.length>8,c={background:"var(--paper-elevated, #fff)",border:"1px solid var(--border, #e0e0e0)",borderRadius:"var(--radius-md, 8px)",padding:"16px",marginBottom:"16px"},C={color:"var(--text-strong, #1e2125)",fontSize:"14px",fontWeight:"600",marginBottom:"12px"},z={dataKey:"x",tick:p?{fill:"var(--text-muted, #666)",fontSize:11,angle:-35,textAnchor:"end"}:te,axisLine:N,tickLine:N,...t?{label:{value:b,position:"insideBottom",offset:-10,style:{textAnchor:"middle",fill:"var(--text-muted, #666)"}}}:{}},R={tick:te,axisLine:N,tickLine:N,...v?{label:{value:v,angle:-90,position:"insideLeft",style:{textAnchor:"middle",fill:"var(--text-muted, #666)"}}}:{}},o=()=>{switch(f){case"bar":return e.jsx(g.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(g.BarChart,{data:l,margin:{top:5,right:30,left:20,bottom:p?40:r},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{...z}),e.jsx(g.YAxis,{...R}),e.jsx(g.Tooltip,{...J}),!n&&e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Bar,{dataKey:i,fill:A[u%A.length],radius:[2,2,0,0],children:n&&l.map((I,S)=>e.jsx(g.Cell,{fill:A[S%A.length]},S))},i))]})});case"horizontal_bar":return e.jsx(g.ResponsiveContainer,{width:"100%",height:Math.max(300,l.length*40),children:e.jsxs(g.BarChart,{data:l,layout:"vertical",margin:{top:5,right:30,left:100,bottom:5},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{type:"number",tick:te,axisLine:N,tickLine:N,...v?{label:{value:v,position:"insideBottom",offset:-5,style:{textAnchor:"middle",fill:"var(--text-muted, #666)"}}}:{}}),e.jsx(g.YAxis,{type:"category",dataKey:"x",tick:{fill:"var(--text-muted, #666)",fontSize:11},width:90,axisLine:N,tickLine:N}),e.jsx(g.Tooltip,{...J}),!n&&e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Bar,{dataKey:i,fill:A[u%A.length],radius:[0,2,2,0],children:n&&l.map((I,S)=>e.jsx(g.Cell,{fill:A[S%A.length]},S))},i))]})});case"line":return e.jsx(g.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(g.LineChart,{data:l,margin:{top:5,right:30,left:20,bottom:p?40:r},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{...z}),e.jsx(g.YAxis,{...R}),e.jsx(g.Tooltip,{...J}),e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Line,{type:"monotone",dataKey:i,stroke:A[u%A.length],strokeWidth:2,dot:{r:4,fill:A[u%A.length]},activeDot:{r:6,fill:A[u%A.length]}},i))]})});case"area":return e.jsx(g.ResponsiveContainer,{width:"100%",height:300,children:e.jsxs(g.AreaChart,{data:l,margin:{top:5,right:30,left:20,bottom:p?40:r},children:[e.jsx(g.CartesianGrid,{strokeDasharray:"3 3",stroke:Z}),e.jsx(g.XAxis,{...z}),e.jsx(g.YAxis,{...R}),e.jsx(g.Tooltip,{...J}),e.jsx(g.Legend,{wrapperStyle:ee}),s.map((i,u)=>e.jsx(g.Area,{type:"monotone",dataKey:i,stroke:A[u%A.length],strokeWidth:2,fill:A[u%A.length],fillOpacity:.15},i))]})});case"pie":{const i=a[0].data.map((S,E)=>({name:S.x,value:S.y,fill:A[E%A.length]})),u=Math.PI/180,I=({cx:S,cy:E,midAngle:_,innerRadius:O,outerRadius:Y,percent:H,name:K})=>{const q=Y+20,U=S+q*Math.cos(-_*u),X=E+q*Math.sin(-_*u);return H<.04?null:e.jsxs("text",{x:U,y:X,fill:"var(--text-ink, #1e2125)",fontSize:11,textAnchor:U>S?"start":"end",dominantBaseline:"central",children:[K," (",(H*100).toFixed(0),"%)"]})};return e.jsx(g.ResponsiveContainer,{width:"100%",height:320,children:e.jsxs(g.PieChart,{children:[e.jsx(g.Pie,{data:i,cx:"50%",cy:"50%",outerRadius:100,dataKey:"value",label:I,labelLine:{stroke:"var(--text-muted, #666)"},children:i.map((S,E)=>e.jsx(g.Cell,{fill:S.fill},E))}),e.jsx(g.Tooltip,{...J})]})})}case"metric":{const i=a[0],u=i.data[0],I=i.data.length>1?i.data[1]:null,S=u.y,E=u.x||"",_=I!==null,O=_?S-I.y:0,Y=_&&I.y!==0?O/Math.abs(I.y)*100:0,H=O>0,K=O<0,q=H?"#7BA89D":K?"#D17B6B":"var(--text-muted, #666)",U=H?"↑":K?"↓":"→",X=$=>Number.isInteger($)&&Math.abs($)>=1e3?$.toLocaleString():typeof $=="number"?$%1===0?$.toString():$.toFixed($<10?2:1):String($);return e.jsxs("div",{style:{display:"flex",alignItems:"baseline",gap:12,padding:"8px 0"},children:[e.jsx("div",{style:{fontSize:"36px",fontWeight:700,lineHeight:1,color:"var(--text-strong, #1e2125)",fontVariantNumeric:"tabular-nums"},children:X(S)}),E&&e.jsx("div",{style:{fontSize:"14px",color:"var(--text-muted, #666)",fontWeight:500},children:E}),_&&e.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,fontSize:"13px",fontWeight:600,color:q,background:H?"rgba(123,168,157,0.12)":K?"rgba(209,123,107,0.12)":"rgba(128,128,128,0.08)",padding:"3px 8px",borderRadius:"var(--radius-sm, 4px)"},children:[e.jsx("span",{children:U}),e.jsxs("span",{children:[X(Math.abs(O))," (",Math.abs(Y).toFixed(1),"%)"]})]}),_&&e.jsxs("div",{style:{fontSize:"11px",color:"var(--text-faint, #999)"},children:["vs ",I.x||"previous"]})]})}default:return e.jsxs("div",{style:{color:"var(--text-muted)",fontSize:12,padding:8},children:["Unsupported chart type: ",f]})}},k=h.useCallback(()=>{j.current&&ge(j.current,y)},[y]),M=h.useCallback(()=>{ue(a,m),w(!0),setTimeout(()=>w(!1),2e3)},[a,m]),T=f!=="metric";return e.jsxs("div",{style:c,children:[y&&e.jsx("div",{style:C,children:y}),T&&e.jsx(he,{onDownload:k,onCopy:M,copied:L}),e.jsx("div",{ref:j,children:o()})]})};exports.ChartRenderer=fe;exports.ChatHistoryPanel=le;exports.ChatInterface=ie;exports.ChatMessage=re;exports.MessageThread=pe;exports.ThinkingIndicator=se;
|
|
31
|
-
//# sourceMappingURL=ChartRenderer.cjs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ChartRenderer.cjs.js","sources":["../src/components/chat/ChatMessage.jsx","../src/components/chat/ThinkingIndicator.jsx","../src/components/chat/ChatInterface.jsx","../src/components/chat/ChatHistoryPanel.jsx","../src/components/chat/MessageThread.jsx","../src/components/chat/ChartRenderer.jsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState } from \"react\";\nimport { Wrench, Copy, Check, PanelRightOpen } from \"lucide-react\";\n\n/**\n * Lightweight Markdown Renderer\n * Handles: code blocks, inline code, bold, italic, links, lists, headers, horizontal rules, file paths\n */\nconst MarkdownRenderer = ({ content, onCodeBlockClick, onFilePathClick }) => {\n const [copiedBlocks, setCopiedBlocks] = useState(new Set());\n\n const copyToClipboard = async (text, blockId) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set([...prev, blockId]));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text:', err);\n }\n };\n\n const renderCodeBlock = (code, language, blockId) => {\n const isCopied = copiedBlocks.has(blockId);\n \n return (\n <div \n key={blockId}\n style={{\n position: 'relative',\n marginBottom: '16px',\n borderRadius: '8px',\n background: 'var(--ink, #1E2125)',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n overflow: 'hidden',\n }}\n >\n {/* Header with language and copy button */}\n <div style={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n padding: '8px 12px',\n background: 'rgba(255,255,255,0.05)',\n borderBottom: '1px solid rgba(255,255,255,0.1)',\n }}>\n <span style={{\n fontSize: '11px',\n color: 'rgba(255,255,255,0.7)',\n fontFamily: 'var(--font-mono, monospace)',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n }}>\n {language || 'code'}\n </span>\n <button\n onClick={() => copyToClipboard(code, blockId)}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'rgba(255,255,255,0.1)';\n e.target.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n {isCopied ? <Check size={12} /> : <Copy size={12} />}\n {isCopied ? 'Copied!' : 'Copy'}\n </button>\n {onCodeBlockClick && (\n <button\n onClick={() => onCodeBlockClick({ code, language })}\n style={{\n background: 'none',\n border: 'none',\n color: 'rgba(255,255,255,0.7)',\n cursor: 'pointer',\n padding: '4px',\n borderRadius: '4px',\n display: 'flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '11px',\n transition: 'all 0.15s ease',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255,255,255,0.1)';\n e.currentTarget.style.color = 'rgba(255,255,255,0.9)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'none';\n e.currentTarget.style.color = 'rgba(255,255,255,0.7)';\n }}\n >\n <PanelRightOpen size={12} />\n Canvas\n </button>\n )}\n </div>\n {/* Code content */}\n <pre style={{\n margin: 0,\n padding: '12px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n lineHeight: 1.4,\n color: 'rgba(255,255,255,0.95)',\n overflow: 'auto',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}>\n {code}\n </pre>\n </div>\n );\n };\n\n const parseMarkdown = (text) => {\n const elements = [];\n const lines = text.split('\\n');\n let i = 0;\n let blockId = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n \n // Code blocks (```language)\n if (line.trim().startsWith('```')) {\n const language = line.trim().slice(3);\n let codeLines = [];\n i++;\n \n while (i < lines.length && !lines[i].trim().startsWith('```')) {\n codeLines.push(lines[i]);\n i++;\n }\n \n if (i < lines.length) i++; // Skip closing ```\n \n elements.push(renderCodeBlock(codeLines.join('\\n'), language, `code-${blockId++}`));\n continue;\n }\n \n // Headers\n if (line.startsWith('#')) {\n const level = line.match(/^#+/)[0].length;\n const text = line.slice(level).trim();\n const HeaderTag = level === 1 ? 'h2' : level === 2 ? 'h3' : level === 3 ? 'h4' : 'h5';\n \n elements.push(\n React.createElement(HeaderTag, {\n key: `header-${i}`,\n style: {\n fontSize: level === 1 ? '18px' : level === 2 ? '16px' : '14px',\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n marginTop: elements.length > 0 ? '20px' : '0',\n marginBottom: '8px',\n lineHeight: 1.3,\n }\n }, text)\n );\n i++;\n continue;\n }\n \n // Horizontal rule\n if (line.trim() === '---' || line.trim() === '***') {\n elements.push(\n <hr key={`hr-${i}`} style={{\n border: 'none',\n borderTop: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n margin: '16px 0',\n }} />\n );\n i++;\n continue;\n }\n \n // Lists\n if (line.match(/^(\\s*)([-*+]|\\d+\\.)\\s/)) {\n const listItems = [];\n const isOrdered = /^\\s*\\d+\\./.test(line);\n \n while (i < lines.length && (lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s/) || lines[i].trim() === '')) {\n if (lines[i].trim() !== '') {\n const match = lines[i].match(/^(\\s*)([-*+]|\\d+\\.)\\s(.*)$/);\n if (match) {\n listItems.push(match[3]);\n }\n }\n i++;\n }\n \n const ListTag = isOrdered ? 'ol' : 'ul';\n elements.push(\n React.createElement(ListTag, {\n key: `list-${i}`,\n style: {\n margin: '8px 0',\n paddingLeft: '20px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }\n }, listItems.map((item, idx) => \n React.createElement('li', {\n key: `item-${idx}`,\n style: { marginBottom: '4px' }\n }, parseInlineMarkdownWithContext(item))\n ))\n );\n continue;\n }\n \n // Tables (lines starting with |)\n if (line.trim().startsWith('|') && line.trim().endsWith('|')) {\n const tableRows = [];\n while (i < lines.length && lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|')) {\n tableRows.push(lines[i]);\n i++;\n }\n \n if (tableRows.length >= 2) {\n // Parse cells from each row\n const parseCells = (row) => row.trim().slice(1, -1).split('|').map(c => c.trim());\n const headerCells = parseCells(tableRows[0]);\n \n // Check if row 1 is a separator (---|---|---)\n const isSeparator = (row) => parseCells(row).every(c => /^[-:]+$/.test(c));\n const hasSeparator = tableRows.length >= 2 && isSeparator(tableRows[1]);\n const bodyStart = hasSeparator ? 2 : 1;\n \n // Parse alignment from separator\n const alignments = hasSeparator ? parseCells(tableRows[1]).map(c => {\n if (c.startsWith(':') && c.endsWith(':')) return 'center';\n if (c.endsWith(':')) return 'right';\n return 'left';\n }) : headerCells.map(() => 'left');\n \n const cellStyle = {\n padding: '6px 12px',\n borderBottom: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n fontSize: '13px',\n lineHeight: 1.5,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n };\n \n elements.push(\n <div key={`table-${i}`} style={{ overflowX: 'auto', margin: '8px 0' }}>\n <table style={{\n borderCollapse: 'collapse',\n width: '100%',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '6px',\n overflow: 'hidden',\n }}>\n {hasSeparator && (\n <thead>\n <tr style={{ background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))' }}>\n {headerCells.map((cell, ci) => (\n <th key={ci} style={{ ...cellStyle, fontWeight: 660, textAlign: alignments[ci] || 'left', whiteSpace: 'nowrap' }}>\n {parseInlineMarkdownWithContext(cell)}\n </th>\n ))}\n </tr>\n </thead>\n )}\n <tbody>\n {(hasSeparator ? tableRows.slice(bodyStart) : tableRows).map((row, ri) => (\n <tr key={ri} style={{ background: ri % 2 === 1 ? 'var(--hover-warm-subtle, rgba(231,212,162,0.04))' : 'transparent' }}>\n {parseCells(row).map((cell, ci) => (\n <td key={ci} style={{ ...cellStyle, textAlign: alignments[ci] || 'left' }}>\n {parseInlineMarkdownWithContext(cell)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n }\n continue;\n }\n \n // Regular paragraphs\n if (line.trim()) {\n const paragraph = [];\n while (i < lines.length && lines[i].trim() && !lines[i].match(/^(#|```|---|\\*\\*\\*|(\\s*)([-*+]|\\d+\\.)\\s)/) && !(lines[i].trim().startsWith('|') && lines[i].trim().endsWith('|'))) {\n paragraph.push(lines[i]);\n i++;\n }\n \n if (paragraph.length > 0) {\n elements.push(\n <p key={`p-${i}`} style={{ \n margin: '8px 0',\n lineHeight: 1.6,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {parseInlineMarkdownWithContext(paragraph.join(' '))}\n </p>\n );\n }\n } else {\n i++;\n }\n }\n \n return elements;\n };\n\n const parseInlineMarkdown = (text) => {\n const elements = [];\n let remaining = text;\n let key = 0;\n\n while (remaining.length > 0) {\n // File paths (before other patterns to catch them first)\n if (onFilePathClick) {\n // Match file paths: containing /src/, /components/, /packages/ or ending in common extensions\n const filePathMatch = remaining.match(/^([^\\s`*\\[]+(?:\\/src\\/|\\/components\\/|\\/packages\\/)[^\\s`*\\[]*|[^\\s`*\\[]*\\.(ts|tsx|js|jsx|py|css|scss|sass|json|md|yaml|yml|html|xml|sh|sql|go|rs|php|java|c|cpp|h|hpp)(?:\\b|$))/);\n if (filePathMatch) {\n const filePath = filePathMatch[1];\n elements.push(\n <span\n key={`file-path-${key++}`}\n onClick={() => onFilePathClick(filePath)}\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textDecorationStyle: 'dotted',\n textUnderlineOffset: '2px',\n cursor: 'pointer',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '13px',\n transition: 'all 0.15s ease',\n ':hover': {\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n textDecoration: 'underline',\n textDecorationStyle: 'solid'\n }\n }}\n onMouseEnter={(e) => {\n e.target.style.background = 'var(--hover-warm-subtle, rgba(231,212,162,0.08))';\n e.target.style.textDecorationStyle = 'solid';\n }}\n onMouseLeave={(e) => {\n e.target.style.background = 'none';\n e.target.style.textDecorationStyle = 'dotted';\n }}\n >\n {filePath}\n </span>\n );\n remaining = remaining.slice(filePathMatch[0].length);\n continue;\n }\n }\n\n // Inline code\n const inlineCodeMatch = remaining.match(/^`([^`]+)`/);\n if (inlineCodeMatch) {\n elements.push(\n <code key={`inline-code-${key++}`} style={{\n background: 'var(--hover-warm-subtle, rgba(231,212,162,0.08))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: '3px',\n padding: '2px 4px',\n fontFamily: 'var(--font-mono, monospace)',\n fontSize: '12px',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {inlineCodeMatch[1]}\n </code>\n );\n remaining = remaining.slice(inlineCodeMatch[0].length);\n continue;\n }\n\n // Bold\n const boldMatch = remaining.match(/^\\*\\*([^*]+)\\*\\*/);\n if (boldMatch) {\n elements.push(\n <strong key={`bold-${key++}`} style={{\n fontWeight: 720,\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {boldMatch[1]}\n </strong>\n );\n remaining = remaining.slice(boldMatch[0].length);\n continue;\n }\n\n // Italic\n const italicMatch = remaining.match(/^\\*([^*]+)\\*/);\n if (italicMatch) {\n elements.push(\n <em key={`italic-${key++}`} style={{\n fontStyle: 'italic',\n color: 'var(--text-strong, rgba(30,33,37,0.92))',\n }}>\n {italicMatch[1]}\n </em>\n );\n remaining = remaining.slice(italicMatch[0].length);\n continue;\n }\n\n // Links\n const linkMatch = remaining.match(/^\\[([^\\]]+)\\]\\(([^)]+)\\)/);\n if (linkMatch) {\n elements.push(\n <a key={`link-${key++}`} \n href={linkMatch[2]} \n target=\"_blank\" \n rel=\"noopener noreferrer\"\n style={{\n color: 'var(--rail-discovery, #5E88B0)',\n textDecoration: 'underline',\n textUnderlineOffset: '2px',\n }}>\n {linkMatch[1]}\n </a>\n );\n remaining = remaining.slice(linkMatch[0].length);\n continue;\n }\n\n // Regular text — consume up to the next special char, or consume the special char itself if no pattern matched\n const nextSpecialChar = remaining.search(/[`*\\[]/);\n if (nextSpecialChar === -1) {\n // No more special chars — add rest and break\n elements.push(remaining);\n break;\n } else if (nextSpecialChar === 0) {\n // Special char at position 0 but no pattern matched — consume it as text\n elements.push(remaining[0]);\n remaining = remaining.slice(1);\n } else {\n elements.push(remaining.slice(0, nextSpecialChar));\n remaining = remaining.slice(nextSpecialChar);\n }\n }\n\n return elements.length === 1 && typeof elements[0] === 'string' ? elements[0] : elements;\n };\n\n // Helper to pass context to parseInlineMarkdown calls within parseMarkdown\n const parseInlineMarkdownWithContext = (text) => parseInlineMarkdown(text);\n \n return <div>{parseMarkdown(content)}</div>;\n};\n\n/**\n * ChatMessage Component\n * Individual message in chat interface with markdown support for assistant messages\n */\nexport default function ChatMessage({ \n role, \n content, \n html, \n timestamp, \n toolBadges, \n isStreaming,\n onCodeBlockClick,\n onFilePathClick,\n}) {\n const isUser = role === \"user\";\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: isUser ? \"flex-end\" : \"flex-start\",\n marginBottom: \"16px\",\n maxWidth: \"100%\",\n }}\n >\n {/* Role label */}\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginBottom: \"6px\",\n fontWeight: 650,\n letterSpacing: \"0.02em\",\n }}\n >\n {isUser ? \"You\" : \"Chordia\"}\n {isStreaming && !isUser && (\n <span style={{ marginLeft: \"6px\", color: \"var(--rail-purple, #9B7AA8)\" }}>\n ●\n </span>\n )}\n </div>\n\n {/* Tool badges */}\n {toolBadges && toolBadges.length > 0 && (\n <div style={{ \n marginBottom: \"8px\", \n display: \"flex\", \n flexWrap: \"wrap\", \n gap: \"4px\",\n maxWidth: \"75%\" \n }}>\n {toolBadges.map((badge, index) => (\n <span \n key={badge.id || index}\n style={{\n display: \"inline-block\",\n fontSize: \"11px\",\n padding: \"2px 8px\",\n borderRadius: \"6px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: `1px solid ${\n badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\"\n }`,\n color: badge.pending \n ? \"var(--rail-discovery, #5A8CC0)\" \n : badge.success !== false \n ? \"var(--state-present, #5CB85C)\" \n : \"var(--rail-signal-churn, #C98A5A)\",\n }}\n >\n <Wrench size={10} style={{ marginRight: 3, verticalAlign: \"middle\" }} />\n {badge.name}\n {badge.pending ? \"...\" : badge.success !== false ? \" ✓\" : \" ✗\"}\n </span>\n ))}\n </div>\n )}\n\n {/* Message bubble */}\n <div\n style={{\n maxWidth: \"75%\",\n padding: \"12px 16px\",\n borderRadius: \"var(--radius-lg, 12px)\",\n background: isUser\n ? \"var(--card-customer, rgba(94,136,176,0.08))\"\n : \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: isUser\n ? \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\"\n : \"1px solid var(--border, rgba(52,58,64,0.12))\",\n fontSize: \"var(--text-base, 14px)\",\n lineHeight: 1.6,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n wordBreak: \"break-word\",\n }}\n >\n {html ? (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n ) : isUser ? (\n // User messages stay plain text\n <div style={{ whiteSpace: \"pre-wrap\" }}>{content}</div>\n ) : (\n // Assistant messages get markdown rendering\n <MarkdownRenderer content={content || \"\"} onCodeBlockClick={onCodeBlockClick} onFilePathClick={onFilePathClick} />\n )}\n </div>\n\n {/* Timestamp */}\n {timestamp && (\n <div\n style={{\n fontSize: \"var(--text-xs-plus, 10.5px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginTop: \"4px\",\n fontFamily: \"var(--font-mono, monospace)\",\n }}\n >\n {timestamp}\n </div>\n )}\n </div>\n );\n}","\"use client\";\n\nexport default function ThinkingIndicator({ \n phase = \"thinking\", \n toolSteps = [], \n label,\n elapsedMs,\n compact = false\n}) {\n const formatElapsedTime = (ms) => {\n if (!ms || ms < 1000) return null;\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) return `${seconds}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;\n };\n\n const getPhaseLabel = () => {\n if (label) return label;\n switch (phase) {\n case \"thinking\": return \"Thinking...\";\n case \"tool\": return null;\n case \"responding\": return \"Responding...\";\n default: return \"Thinking...\";\n }\n };\n\n const renderToolStep = (step, index) => {\n const getStatusDot = () => {\n const baseDotStyle = {\n width: compact ? '4px' : '6px',\n height: compact ? '4px' : '6px',\n borderRadius: '50%',\n display: 'inline-block',\n marginRight: compact ? '6px' : '8px'\n };\n\n switch (step.status) {\n case 'active':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--rail-purple, #9B7AA8)',\n animation: 'pulse 1.2s ease-in-out infinite'\n }}\n />\n );\n case 'done':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--text-xfaint, rgba(30,33,37,0.28))'\n }}\n />\n );\n case 'error':\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--rail-compliance, #C98A5A)'\n }}\n />\n );\n default:\n return (\n <span \n style={{\n ...baseDotStyle,\n backgroundColor: 'var(--text-xfaint, rgba(30,33,37,0.28))'\n }}\n />\n );\n }\n };\n\n const getStatusText = () => {\n switch (step.status) {\n case 'done':\n return (\n <span style={{ \n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)'\n }}>\n ✓\n </span>\n );\n case 'error':\n return (\n <span style={{ \n color: 'var(--rail-compliance, #C98A5A)',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)'\n }}>\n failed\n </span>\n );\n default:\n return null;\n }\n };\n\n return (\n <div \n key={index}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: compact ? '2px' : '4px'\n }}\n >\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {getStatusDot()}\n <span style={{\n fontFamily: 'var(--font-mono)',\n fontSize: compact ? '9px' : 'var(--text-xs-plus, 10.5px)',\n color: 'var(--text-muted)'\n }}>\n {step.name}\n </span>\n </div>\n {getStatusText()}\n </div>\n );\n };\n\n const renderShimmerBar = () => (\n <div style={{\n width: '100%',\n height: compact ? '2px' : '3px',\n backgroundColor: 'var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: compact ? '2px' : '3px',\n overflow: 'hidden',\n position: 'relative'\n }}>\n <div style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n background: 'linear-gradient(90deg, transparent 0%, rgba(155,122,168,0.3) 50%, transparent 100%)',\n animation: 'shimmer 2s linear infinite'\n }} />\n </div>\n );\n\n const renderCursor = () => (\n <span style={{\n width: compact ? '4px' : '6px',\n height: compact ? '10px' : '14px',\n backgroundColor: 'var(--rail-purple, #9B7AA8)',\n borderRadius: '1px',\n display: 'inline-block',\n marginLeft: '2px',\n animation: 'cursorBlink 0.8s ease-in-out infinite'\n }} />\n );\n\n const phaseLabel = getPhaseLabel();\n const elapsedTime = formatElapsedTime(elapsedMs);\n\n return (\n <div style={{\n borderLeft: `${compact ? '3px' : '4px'} solid var(--rail-purple, #9B7AA8)`,\n backgroundColor: 'var(--card-assistant, rgba(155,122,168,0.06))',\n border: '1px solid var(--border-subtle, rgba(52,58,64,0.08))',\n borderRadius: compact ? '8px' : '10px',\n padding: compact ? '8px 10px 8px 12px' : '10px 14px 10px 18px'\n }}>\n <style>\n {`\n @keyframes shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(200%); }\n }\n \n @keyframes pulse {\n 0%, 100% { opacity: 0.4; }\n 50% { opacity: 1.0; }\n }\n \n @keyframes cursorBlink {\n 0%, 100% { opacity: 0; }\n 50% { opacity: 1; }\n }\n `}\n </style>\n \n {/* Header */}\n {!compact && (\n <div style={{\n fontSize: 'var(--text-xs-plus, 10.5px)',\n fontWeight: 650,\n textTransform: 'uppercase',\n letterSpacing: 'var(--tracking-label, 0.16em)',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n marginBottom: '8px'\n }}>\n AI ASSISTANT\n </div>\n )}\n\n {/* Content based on phase */}\n {phase === \"thinking\" && (\n <div>\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n marginBottom: compact ? '4px' : '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n {phaseLabel}\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n {renderShimmerBar()}\n </div>\n )}\n\n {phase === \"tool\" && (\n <div>\n {phaseLabel && (\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n marginBottom: compact ? '4px' : '8px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n {phaseLabel}\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n )}\n <div style={{ marginBottom: compact ? '4px' : '8px' }}>\n {toolSteps.map((step, index) => renderToolStep(step, index))}\n </div>\n {renderShimmerBar()}\n </div>\n )}\n\n {phase === \"responding\" && (\n <div style={{\n color: 'var(--text-muted)',\n fontWeight: 400,\n fontSize: compact ? '11px' : '13px',\n display: 'flex',\n alignItems: 'center',\n gap: '6px'\n }}>\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {phaseLabel}\n {renderCursor()}\n </div>\n {elapsedTime && (\n <span style={{\n fontSize: compact ? '9px' : '10px',\n color: 'var(--text-faint, rgba(30,33,37,0.36))',\n fontFamily: 'var(--font-mono, monospace)',\n }}>\n {elapsedTime}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}","\"use client\";\n\nimport React, { useState, useRef, useEffect } from \"react\";\nimport { Send } from \"lucide-react\";\nimport ChatMessage from \"./ChatMessage\";\nimport ThinkingIndicator from \"./ThinkingIndicator\";\n// TODO: replace with framework-agnostic toast\nconst toast = { error: (...args) => console.warn(\"toast.error:\", ...args) };\n\n/**\n * ChatInterface Component\n * Interactive chat interface with streaming SSE support, thinking phases, and tool visibility.\n */\nexport default function ChatInterface({\n initialMessages = [],\n onSendMessage,\n onStreamMessage, // NEW: streaming version of onSendMessage\n onMessagesChange, // NEW: callback when messages array changes\n onCodeBlockClick, // callback when \"Canvas\" button clicked on a code block: ({ code, language }) => void\n placeholder = \"Ask a question about this interaction...\",\n title = \"Chat with Chordia\",\n}) {\n const [messages, setMessages] = useState(initialMessages || []);\n const [inputValue, setInputValue] = useState(\"\");\n const [isProcessing, setIsProcessing] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const [currentAssistantMessage, setCurrentAssistantMessage] = useState(null);\n const [thinkingPhase, setThinkingPhase] = useState(\"thinking\");\n const [thinkingStartTime, setThinkingStartTime] = useState(null);\n const [elapsedMs, setElapsedMs] = useState(0);\n const messagesEndRef = useRef(null);\n const inputRef = useRef(null);\n const streamAbortController = useRef(null);\n const currentAssistantRef = useRef(null);\n const lastChunkTimeRef = useRef(null);\n const [streamSilent, setStreamSilent] = useState(false);\n const [silenceSeconds, setSilenceSeconds] = useState(0);\n\n // Auto-scroll to bottom when messages change\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: \"smooth\" });\n }, [messages, isProcessing]);\n\n // Auto-resize textarea\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.style.height = \"auto\";\n inputRef.current.style.height = `${Math.min(\n inputRef.current.scrollHeight,\n 120\n )}px`;\n }\n }, [inputValue]);\n\n // Update messages and notify parent\n useEffect(() => {\n if (onMessagesChange) {\n const allMessages = [...messages];\n if (currentAssistantMessage) {\n allMessages.push(currentAssistantMessage);\n }\n onMessagesChange(allMessages);\n }\n }, [messages, currentAssistantMessage, onMessagesChange]);\n\n // Elapsed time tracker + silence detector\n useEffect(() => {\n let interval;\n if (isProcessing && thinkingStartTime) {\n interval = setInterval(() => {\n setElapsedMs(Date.now() - thinkingStartTime);\n // Detect stream silence (no chunks for 3s+)\n if (lastChunkTimeRef.current) {\n const gap = (Date.now() - lastChunkTimeRef.current) / 1000;\n if (gap >= 3) {\n setStreamSilent(true);\n setSilenceSeconds(Math.floor(gap));\n } else {\n setStreamSilent(false);\n }\n }\n }, 500);\n }\n return () => interval && clearInterval(interval);\n }, [isProcessing, thinkingStartTime]);\n\n const resetProcessingState = () => {\n setIsProcessing(false);\n setIsSending(false);\n setCurrentAssistantMessage(null);\n currentAssistantRef.current = null;\n setThinkingPhase(\"thinking\");\n setStreamSilent(false);\n setSilenceSeconds(0);\n lastChunkTimeRef.current = null;\n setThinkingStartTime(null);\n setElapsedMs(0);\n if (streamAbortController.current) {\n streamAbortController.current.abort();\n streamAbortController.current = null;\n }\n };\n\n const parseSSELine = (line) => {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6);\n if (data === \"[DONE]\") {\n return { type: \"done\" };\n }\n try {\n const parsed = JSON.parse(data);\n return { type: \"data\", data: parsed };\n } catch (e) {\n return null;\n }\n }\n return null;\n };\n\n const handleStreamChunk = (chunk) => {\n if (!chunk.choices?.[0]?.delta) return;\n\n lastChunkTimeRef.current = Date.now();\n setStreamSilent(false);\n\n const delta = chunk.choices[0].delta;\n \n // Check for tool use/result indicators\n if (delta.tool_calls || delta.tool_results) {\n setThinkingPhase(\"tool\");\n return;\n }\n\n // If we get content, switch to responding phase\n if (delta.content !== undefined) {\n setThinkingPhase(\"responding\");\n \n // Initialize or update current assistant message\n setCurrentAssistantMessage(prev => {\n const baseMessage = prev || {\n id: Date.now().toString(),\n role: \"assistant\",\n content: \"\",\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n isStreaming: true,\n };\n \n const updated = {\n ...baseMessage,\n content: (baseMessage.content || \"\") + (delta.content || \"\"),\n };\n currentAssistantRef.current = updated;\n return updated;\n });\n }\n };\n\n const processStream = async (stream) => {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\"; // Keep incomplete line in buffer\n\n for (const line of lines) {\n if (line.trim()) {\n const parsed = parseSSELine(line);\n if (parsed) {\n if (parsed.type === \"done\") {\n return; // Stream complete\n } else if (parsed.type === \"data\") {\n handleStreamChunk(parsed.data);\n }\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n };\n\n const handleSend = async () => {\n if (!inputValue.trim() || isSending) return;\n\n const userContent = inputValue.trim();\n const userMessage = {\n id: Date.now().toString(),\n role: \"user\",\n content: userContent,\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n\n // Add user message and start processing\n const newMessages = [...messages, userMessage];\n setMessages(newMessages);\n setInputValue(\"\");\n setIsProcessing(true);\n setIsSending(true);\n setThinkingPhase(\"thinking\");\n setThinkingStartTime(Date.now());\n lastChunkTimeRef.current = Date.now();\n\n // Create abort controller for this stream\n streamAbortController.current = new AbortController();\n\n try {\n let result;\n \n // Use streaming version if provided, otherwise fall back to regular\n if (onStreamMessage) {\n result = await onStreamMessage(userContent, newMessages);\n } else if (onSendMessage) {\n result = await onSendMessage(userContent, newMessages);\n } else {\n // Fallback to dummy response\n setTimeout(() => {\n const assistantMessage = {\n id: (Date.now() + 1).toString(),\n role: \"assistant\",\n content: \"This is a demonstration response. In a real implementation, this would connect to your LLM backend.\",\n timestamp: new Date().toLocaleTimeString(\"en-US\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n };\n setMessages(prev => [...prev, assistantMessage]);\n resetProcessingState();\n }, 1000);\n return;\n }\n\n // Handle ReadableStream response\n if (result instanceof ReadableStream) {\n await processStream(result);\n } \n // Handle Response with SSE body\n else if (result instanceof Response && result.body) {\n await processStream(result.body);\n }\n // Handle Promise that resolves to a stream\n else if (result && typeof result.then === \"function\") {\n const resolved = await result;\n if (resolved instanceof ReadableStream) {\n await processStream(resolved);\n } else if (resolved instanceof Response && resolved.body) {\n await processStream(resolved.body);\n }\n }\n\n // Finalize the assistant message using ref (state is stale in this closure)\n if (currentAssistantRef.current) {\n setMessages(prev => [...prev, { \n ...currentAssistantRef.current, \n isStreaming: false \n }]);\n }\n\n } catch (error) {\n if (error.name !== \"AbortError\") {\n toast.error(\"Failed to send message\");\n console.error(\"Stream error:\", error);\n }\n } finally {\n resetProcessingState();\n }\n };\n\n const handleKeyDown = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"var(--radius-lg, 12px)\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n overflow: \"hidden\",\n }}\n >\n {/* Header — hidden when title is empty */}\n {title ? <div\n style={{\n padding: \"16px 20px\",\n borderBottom: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n fontSize: \"var(--text-lg, 16px)\",\n fontWeight: 720,\n letterSpacing: \"-0.01em\",\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n }}\n >\n {title}\n </div>\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n marginTop: \"2px\",\n }}\n >\n Ask questions, get insights from analyzed interactions\n </div>\n </div> : null}\n\n {/* Messages area */}\n <div\n style={{\n flex: 1,\n minHeight: 0,\n overflowY: \"auto\",\n padding: \"20px\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n {messages.length === 0 ? (\n <div\n style={{\n flex: 1,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"var(--text-md, 13px)\",\n textAlign: \"center\",\n padding: \"40px\",\n }}\n >\n No messages yet. Start a conversation by asking a question below.\n </div>\n ) : (\n <>\n {messages.map((message) => (\n <ChatMessage\n key={message.id}\n role={message.role}\n content={message.content}\n html={message.html}\n timestamp={message.timestamp}\n toolBadges={message.toolBadges}\n isStreaming={message.isStreaming}\n onCodeBlockClick={onCodeBlockClick}\n />\n ))}\n \n {/* Current streaming message */}\n {currentAssistantMessage && (\n <ChatMessage\n key={currentAssistantMessage.id}\n role={currentAssistantMessage.role}\n content={currentAssistantMessage.content}\n timestamp={currentAssistantMessage.timestamp}\n isStreaming={true}\n onCodeBlockClick={onCodeBlockClick}\n />\n )}\n \n {/* Thinking indicator — shows during initial thinking or stream silence */}\n {isProcessing && (!currentAssistantMessage || streamSilent) && (\n <div style={{ marginBottom: \"16px\" }}>\n <ThinkingIndicator \n phase={streamSilent ? \"tool\" : thinkingPhase}\n elapsedMs={elapsedMs}\n label={\n streamSilent && silenceSeconds >= 30\n ? \"Compacting conversation — trimming context to stay sharp...\"\n : streamSilent && silenceSeconds >= 10\n ? \"Running background tasks...\"\n : streamSilent\n ? \"Still working...\"\n : undefined\n }\n />\n </div>\n )}\n \n <div ref={messagesEndRef} />\n </>\n )}\n </div>\n\n {/* Input area */}\n <div\n style={{\n borderTop: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n padding: \"16px 20px\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"flex-end\",\n }}\n >\n <textarea\n ref={inputRef}\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={1}\n disabled={isSending}\n style={{\n flex: 1,\n padding: \"10px 14px\",\n fontSize: \"var(--text-base, 14px)\",\n lineHeight: 1.5,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n background: \"rgba(255, 255, 255, 0.95)\",\n border: \"1px solid rgba(52, 58, 64, 0.18)\",\n borderRadius: \"var(--radius-md, 8px)\",\n resize: \"none\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n fontFamily: \"inherit\",\n minHeight: \"42px\",\n maxHeight: \"120px\",\n opacity: isSending ? 0.6 : 1,\n cursor: isSending ? \"not-allowed\" : \"text\",\n }}\n onFocus={(e) => {\n if (!isSending) {\n e.target.style.borderColor = \"rgba(94, 136, 176, 0.35)\";\n }\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"rgba(52, 58, 64, 0.18)\";\n }}\n />\n <button\n onClick={handleSend}\n disabled={!inputValue.trim() || isSending}\n style={{\n padding: \"10px 16px\",\n background:\n inputValue.trim() && !isSending\n ? \"var(--Base-Strong, #0B0B0B)\"\n : \"#ECEEF2\",\n color:\n inputValue.trim() && !isSending\n ? \"white\"\n : \"var(--text-base)\",\n border: \"none\",\n borderRadius: \"var(--radius-md, 8px)\",\n cursor:\n inputValue.trim() && !isSending ? \"pointer\" : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontSize: \"var(--text-md, 13px)\",\n fontWeight: 650,\n transition: \"all 0.15s ease\",\n height: \"42px\",\n }}\n // onMouseEnter={(e) => {\n // if (inputValue.trim() && !isSending) {\n // e.currentTarget.style.background = \"var(--Base-Strong, #0B0B0B)\";\n // }\n // }}\n // onMouseLeave={(e) => {\n // if (inputValue.trim() && !isSending) {\n // e.currentTarget.style.background = \"#ECEEF2\";\n // }\n // }}\n >\n {isSending ? (\n <>\n <style>\n {`\n @keyframes buttonSpin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <div\n style={{\n width: \"14px\",\n height: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"white\",\n borderRadius: \"50%\",\n animation: \"buttonSpin 0.6s linear infinite\",\n }}\n />\n Sending...\n </>\n ) : (\n <>\n <Send size={16} />\n Send\n </>\n )}\n </button>\n </div>\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n marginTop: \"8px\",\n }}\n >\n Press Enter to send, Shift+Enter for new line\n </div>\n </div>\n </div>\n );\n}","\"use client\";\n\nimport React, { useState } from \"react\";\nimport { MessageSquare, Search, Clock, Pin } from \"lucide-react\";\n\n/**\n * ChatHistoryPanel Component\n * Panel showing chat thread history with search functionality.\n * \n * Props:\n * threads - Array of thread objects: { id, title, created_at, updated_at, message_count, last_message_preview, pinned, archived, tags }\n * activeThreadId - Currently selected thread id\n * onSelectThread - (threadId) => void\n * onNewChat - () => void\n * loading - boolean\n */\nexport default function ChatHistoryPanel({\n threads = [],\n activeThreadId,\n onSelectThread,\n onNewChat,\n loading = false,\n}) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n const filteredThreads = threads.filter((thread) => {\n if (!searchQuery) return true;\n const q = searchQuery.toLowerCase();\n return (\n (thread.title || \"\").toLowerCase().includes(q) ||\n (thread.last_message_preview || \"\").toLowerCase().includes(q)\n );\n });\n\n // Sort: pinned first, then by updated_at descending\n const sortedThreads = [...filteredThreads].sort((a, b) => {\n if (a.pinned && !b.pinned) return -1;\n if (!a.pinned && b.pinned) return 1;\n const aTime = new Date(a.updated_at || a.created_at || 0).getTime();\n const bTime = new Date(b.updated_at || b.created_at || 0).getTime();\n return bTime - aTime;\n });\n\n const formatTime = (dateStr) => {\n if (!dateStr) return \"\";\n const d = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n if (diffDays === 0) {\n return d.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (diffDays === 1) {\n return \"Yesterday\";\n } else if (diffDays < 7) {\n return d.toLocaleDateString(\"en-US\", { weekday: \"short\" });\n } else {\n return d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"var(--paper, rgba(255,255,255,0.95))\",\n borderRight: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: \"12px 14px\",\n borderBottom: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n flexShrink: 0,\n }}\n >\n <div\n style={{\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n marginBottom: \"10px\",\n }}\n >\n <div\n style={{\n fontSize: \"13px\",\n fontWeight: 650,\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n }}\n >\n Threads\n </div>\n {onNewChat && (\n <button\n onClick={onNewChat}\n style={{\n padding: \"4px 10px\",\n fontSize: \"11px\",\n fontWeight: 600,\n color: \"var(--Base-Strong, #0B0B0B)\",\n background: \"#ECEEF2\",\n border: \"1px solid var(--border-subtle, rgba(52,58,64,0.08))\",\n borderRadius: \"6px\",\n cursor: \"pointer\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = \"#ECEEF2\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 0.08)\";\n }}\n >\n + New\n </button>\n )}\n </div>\n\n {/* Search */}\n <div style={{ position: \"relative\" }}>\n <Search\n size={13}\n style={{\n position: \"absolute\",\n left: \"10px\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n pointerEvents: \"none\",\n }}\n />\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search threads...\"\n style={{\n width: \"100%\",\n padding: \"7px 10px 7px 32px\",\n fontSize: \"12px\",\n color: \"var(--text-ink, rgba(30,33,37,0.92))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"6px\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n boxSizing: \"border-box\",\n }}\n onFocus={(e) => {\n e.target.style.borderColor = \"rgba(94, 136, 176, 0.35)\";\n }}\n onBlur={(e) => {\n e.target.style.borderColor = \"rgba(52, 58, 64, 0.12)\";\n }}\n />\n </div>\n </div>\n\n {/* Thread List */}\n <div style={{ flex: 1, overflowY: \"auto\", padding: \"4px 6px\" }}>\n {loading ? (\n <div\n style={{\n padding: \"30px 16px\",\n textAlign: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"12px\",\n }}\n >\n Loading threads...\n </div>\n ) : sortedThreads.length === 0 ? (\n <div\n style={{\n padding: \"30px 16px\",\n textAlign: \"center\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"12px\",\n }}\n >\n {searchQuery ? \"No threads found\" : \"No threads yet\"}\n </div>\n ) : (\n sortedThreads.map((thread) => {\n const isActive = thread.id === activeThreadId;\n return (\n <div\n key={thread.id}\n onClick={() => onSelectThread?.(thread.id)}\n style={{\n padding: \"10px 10px\",\n marginBottom: \"2px\",\n borderRadius: \"6px\",\n background: isActive\n ? \"rgba(94, 136, 176, 0.10)\"\n : \"transparent\",\n border: isActive\n ? \"1px solid rgba(94, 136, 176, 0.15)\"\n : \"1px solid transparent\",\n cursor: \"pointer\",\n transition: \"all 0.12s ease\",\n }}\n onMouseEnter={(e) => {\n if (!isActive) e.currentTarget.style.background = \"rgba(0,0,0,0.03)\";\n }}\n onMouseLeave={(e) => {\n if (!isActive) e.currentTarget.style.background = \"transparent\";\n }}\n >\n {/* Title row */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"6px\", marginBottom: \"4px\" }}>\n <MessageSquare\n size={12}\n style={{\n color: isActive ? \"var(--rail-discovery, #5E88B0)\" : \"var(--text-faint, rgba(30,33,37,0.36))\",\n flexShrink: 0,\n }}\n />\n <div\n style={{\n flex: 1,\n fontSize: \"12px\",\n fontWeight: isActive ? 650 : 550,\n color: isActive\n ? \"var(--text-ink, rgba(30,33,37,0.92))\"\n : \"var(--text-base, rgba(30,33,37,0.78))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {thread.title || \"Untitled thread\"}\n </div>\n {thread.pinned && (\n <Pin size={10} style={{ color: \"var(--rail-discovery, #5E88B0)\", flexShrink: 0 }} />\n )}\n </div>\n\n {/* Preview */}\n {thread.last_message_preview && (\n <div\n style={{\n fontSize: \"11px\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n marginLeft: \"18px\",\n marginBottom: \"4px\",\n }}\n >\n {thread.last_message_preview}\n </div>\n )}\n\n {/* Meta */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n marginLeft: \"18px\",\n fontSize: \"10px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n <Clock size={9} />\n <span>{formatTime(thread.updated_at || thread.created_at)}</span>\n {thread.message_count != null && (\n <>\n <span>·</span>\n <span>{thread.message_count} msg{thread.message_count !== 1 ? \"s\" : \"\"}</span>\n </>\n )}\n </div>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n","/**\n * NOTE: Deprecated component.\n *\n * This chat-scoped `MessageThread` was an early demo implementation and\n * is tightly coupled to app-specific context (`useUserContext`, `toast`, etc.).\n *\n * For new work and for consumers of the `chordia-ui` library, prefer the\n * framework-agnostic, reusable version exported from:\n *\n * `src/components/common/MessageThread.jsx`\n *\n * which is re-exported via the main package entry:\n *\n * import { MessageThread } from \"chordia-ui\";\n *\n * This file is kept only for backwards compatibility within the app.\n */\n\"use client\";\n\nimport React, { useState, useEffect, useRef } from \"react\";\nimport { Send, Paperclip, AtSign, Hash, Clock } from \"lucide-react\";\n// TODO: replace with framework-agnostic toast\nconst toast = { error: (...args) => console.warn(\"toast.error:\", ...args) };\n// TODO: replace with framework-agnostic context\nconst useUserContext = () => ({ userData: { name: \"User\", email: \"\" } });\n\n/**\n * MessageThread Component\n * Threaded messaging interface for team collaboration around sessions.\n * Supports mentions, condition references, and timestamp links.\n * Uses dummy data for demonstration purposes.\n */\nexport default function MessageThread({\n sessionTitle,\n messages: initialMessages,\n onSendMessage,\n currentUser,\n}) {\n const [messageInput, setMessageInput] = useState(\"\");\n const [isFocused, setIsFocused] = useState(false);\n const [messages, setMessages] = useState(initialMessages || []);\n const [isLoading, setIsLoading] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const { userData } = useUserContext();\n const messagesEndRef = useRef(null);\n\n // Get current user from context if not provided\n const displayCurrentUser = currentUser || {\n name: userData?.name || \"You\",\n initials: userData?.name\n ?.split(\" \")\n .map((n) => n[0])\n .join(\"\")\n .toUpperCase() || \"YO\",\n color: \"#6B7C93\",\n };\n\n // Use initialMessages if provided, otherwise use empty array (no API fetching)\n useEffect(() => {\n if (initialMessages) {\n setMessages(initialMessages);\n } else {\n setMessages([]);\n }\n }, [initialMessages]);\n\n // Scroll to bottom when new messages arrive\n useEffect(() => {\n if (messagesEndRef.current) {\n messagesEndRef.current.scrollIntoView({ behavior: \"smooth\" });\n }\n }, [messages]);\n\n const handleSend = async () => {\n if (!messageInput.trim()) return;\n\n const content = messageInput.trim();\n setMessageInput(\"\");\n setIsSending(true);\n\n // Create optimistic message\n const optimisticMessage = {\n id: `temp-${Date.now()}`,\n author: {\n name: displayCurrentUser.name,\n role: userData?.role || \"\",\n initials: displayCurrentUser.initials,\n color: displayCurrentUser.color,\n },\n content: content,\n timestamp: \"Just now\",\n type: \"comment\",\n isOptimistic: true,\n };\n\n // Optimistically add message\n setMessages((prev) => [...prev, optimisticMessage]);\n\n // If onSendMessage callback is provided, use it\n if (onSendMessage) {\n try {\n await onSendMessage(content);\n // Remove optimistic flag after callback succeeds\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticMessage.id\n ? { ...msg, isOptimistic: false }\n : msg\n )\n );\n } catch (error) {\n // Remove optimistic message on error\n setMessages((prev) => prev.filter((msg) => msg.id !== optimisticMessage.id));\n toast.error(\"Failed to send message\");\n } finally {\n setIsSending(false);\n }\n return;\n }\n\n // No API - just confirm the optimistic message\n setTimeout(() => {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === optimisticMessage.id\n ? { ...msg, isOptimistic: false }\n : msg\n )\n );\n setIsSending(false);\n }, 500);\n };\n\n const handleKeyPress = (e) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n };\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n border: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n borderRadius: \"var(--radius-lg, 12px)\",\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n {sessionTitle && (\n <div\n style={{\n padding: \"14px 16px\",\n borderBottom: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n fontSize: \"var(--text-md, 13px)\",\n fontWeight: 680,\n color: \"var(--text-strong, rgba(30,33,37,0.92))\",\n marginBottom: \"3px\",\n }}\n >\n Session Discussion\n </div>\n {sessionTitle && (\n <div\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n }}\n >\n <span>{sessionTitle}</span>\n </div>\n )}\n </div>\n )}\n\n {/* Messages */}\n <div\n style={{\n flex: 1,\n overflowY: \"auto\",\n padding: \"16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"16px\",\n }}\n >\n {isLoading ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n Loading messages...\n </div>\n ) : messages.length === 0 ? (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"40px\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n }}\n >\n No messages yet. Start the conversation!\n </div>\n ) : (\n messages.map((message) => (\n <div\n key={message.id}\n style={{\n display: \"flex\",\n gap: \"12px\",\n opacity: message.type === \"system\" ? 0.75 : 1,\n }}\n >\n {/* Avatar */}\n {message.type !== \"system\" && (\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"8px\",\n background: message.author.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n opacity: 0.9,\n }}\n >\n {message.author.initials}\n </div>\n )}\n {message.type === \"system\" && (\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"8px\",\n background: \"rgba(30, 33, 37, 0.08)\",\n color: \"rgba(30, 33, 37, 0.52)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"11px\",\n fontWeight: 650,\n flexShrink: 0,\n }}\n >\n <Clock size={14} />\n </div>\n )}\n\n {/* Message content */}\n <div style={{ flex: 1, minWidth: 0 }}>\n {/* Author and timestamp */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"baseline\",\n gap: \"8px\",\n marginBottom: \"4px\",\n }}\n >\n <span\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 650,\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n }}\n >\n {message.author.name}\n </span>\n <span\n style={{\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontFamily: \"var(--font-mono, monospace)\",\n }}\n >\n {message.timestamp}\n </span>\n {message.author.role && (\n <span\n style={{\n fontSize: \"var(--text-xs, 10px)\",\n color: \"var(--text-muted, rgba(30,33,37,0.56))\",\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n textTransform: \"uppercase\",\n letterSpacing: \"0.04em\",\n fontWeight: 600,\n }}\n >\n {message.author.role}\n </span>\n )}\n {message.isEdited && (\n <span\n style={{\n fontSize: \"var(--text-xs, 10px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontStyle: \"italic\",\n }}\n >\n (edited)\n </span>\n )}\n </div>\n\n {/* Message text */}\n <div\n style={{\n fontSize: \"var(--text-md, 13px)\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n lineHeight: 1.5,\n marginBottom: message.references ? \"8px\" : 0,\n }}\n >\n {message.content}\n </div>\n\n {/* References */}\n {message.references && message.references.length > 0 && (\n <div\n style={{\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: \"6px\",\n marginTop: \"8px\",\n }}\n >\n {message.references.map((ref, idx) => (\n <button\n key={idx}\n type=\"button\"\n style={{\n fontSize: \"11px\",\n padding: \"4px 8px\",\n borderRadius: \"6px\",\n border: \"1px solid rgba(52, 58, 64, 0.16)\",\n background: \"rgba(255, 255, 255, 0.7)\",\n color:\n ref.type === \"condition\"\n ? \"rgba(94, 136, 176, 0.85)\"\n : ref.type === \"observation\"\n ? \"rgba(107, 123, 147, 0.85)\"\n : ref.type === \"timestamp\"\n ? \"rgba(184, 156, 106, 0.85)\"\n : \"rgba(30, 33, 37, 0.65)\",\n cursor: \"pointer\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n transition: \"all 0.15s ease\",\n fontWeight: 550,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(255, 255, 255, 0.95)\";\n e.currentTarget.style.borderColor =\n \"rgba(52, 58, 64, 0.24)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background =\n \"rgba(255, 255, 255, 0.7)\";\n e.currentTarget.style.borderColor =\n \"rgba(52, 58, 64, 0.16)\";\n }}\n >\n {ref.type === \"timestamp\" && <Clock size={12} />}\n {(ref.type === \"condition\" ||\n ref.type === \"observation\") && <Hash size={12} />}\n {ref.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n ))\n )}\n <div ref={messagesEndRef} />\n </div>\n\n {/* Input area */}\n <div\n style={{\n padding: \"12px\",\n borderTop: \"1px solid var(--border, rgba(52,58,64,0.12))\",\n background: \"var(--paper-elevated, rgba(255,255,255,0.82))\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"8px\",\n alignItems: \"flex-end\",\n }}\n >\n {/* Current user avatar */}\n <div\n style={{\n width: \"32px\",\n height: \"32px\",\n borderRadius: \"var(--radius-md, 8px)\",\n background: displayCurrentUser.color,\n color: \"white\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 650,\n flexShrink: 0,\n opacity: 0.9,\n }}\n >\n {displayCurrentUser.initials}\n </div>\n\n {/* Input field */}\n <div\n style={{\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n }}\n >\n <textarea\n value={messageInput}\n onChange={(e) => setMessageInput(e.target.value)}\n onKeyDown={handleKeyPress}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n placeholder=\"Add a comment...\"\n style={{\n width: \"100%\",\n minHeight: \"38px\",\n maxHeight: \"120px\",\n padding: \"8px 12px\",\n fontSize: \"var(--text-md, 13px)\",\n color: \"var(--text-base, rgba(30,33,37,0.78))\",\n background: \"white\",\n border: `1px solid ${\n isFocused\n ? \"rgba(94, 136, 176, 0.35)\"\n : \"rgba(52, 58, 64, 0.16)\"\n }`,\n borderRadius: \"var(--radius-md, 8px)\",\n resize: \"vertical\",\n outline: \"none\",\n transition: \"border-color 0.15s ease\",\n fontFamily: \"inherit\",\n lineHeight: 1.5,\n }}\n />\n\n {/* Toolbar */}\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n }}\n >\n <div style={{ display: \"flex\", gap: \"4px\" }}>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Mention user\"\n >\n <AtSign size={16} />\n </button>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Reference condition\"\n >\n <Hash size={16} />\n </button>\n <button\n type=\"button\"\n style={{\n padding: \"6px\",\n background: \"transparent\",\n border: \"none\",\n borderRadius: \"6px\",\n color: \"rgba(30, 33, 37, 0.52)\",\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background =\n \"rgba(30, 33, 37, 0.06)\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.75)\";\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = \"transparent\";\n e.currentTarget.style.color = \"rgba(30, 33, 37, 0.52)\";\n }}\n title=\"Attach file\"\n >\n <Paperclip size={16} />\n </button>\n </div>\n <button\n type=\"button\"\n onClick={handleSend}\n disabled={!messageInput.trim() || isSending}\n style={{\n padding: \"6px 12px\",\n background:\n messageInput.trim() && !isSending\n ? \"rgba(94, 136, 176, 0.85)\"\n : \"var(--border-subtle, rgba(52,58,64,0.08))\",\n border: \"none\",\n borderRadius: \"6px\",\n color:\n messageInput.trim() && !isSending\n ? \"white\"\n : \"var(--text-faint, rgba(30,33,37,0.36))\",\n fontSize: \"var(--text-sm, 11px)\",\n fontWeight: 600,\n cursor:\n messageInput.trim() && !isSending\n ? \"pointer\"\n : \"not-allowed\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n transition: \"all 0.15s ease\",\n }}\n onMouseEnter={(e) => {\n if (messageInput.trim() && !isSending) {\n e.currentTarget.style.background = \"rgba(94, 136, 176, 1)\";\n }\n }}\n onMouseLeave={(e) => {\n if (messageInput.trim() && !isSending) {\n e.currentTarget.style.background =\n \"rgba(94, 136, 176, 0.85)\";\n }\n }}\n >\n {isSending ? (\n <>\n <style>\n {`\n @keyframes messageSpin {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n }\n `}\n </style>\n <div\n style={{\n width: \"14px\",\n height: \"14px\",\n border: \"2px solid rgba(255, 255, 255, 0.3)\",\n borderTopColor: \"white\",\n borderRadius: \"50%\",\n animation: \"messageSpin 0.6s linear infinite\",\n }}\n />\n Sending...\n </>\n ) : (\n <>\n <Send size={14} />\n Send\n </>\n )}\n </button>\n </div>\n </div>\n </div>\n <div\n style={{\n marginTop: \"8px\",\n fontSize: \"var(--text-sm, 11px)\",\n color: \"var(--text-faint, rgba(30,33,37,0.36))\",\n lineHeight: 1.4,\n }}\n >\n <strong>Tip:</strong> Use{\" \"}\n <code\n style={{\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 4px\",\n borderRadius: \"3px\",\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"var(--text-xs, 10px)\",\n }}\n >\n @\n </code>{\" \"}\n to mention teammates,{\" \"}\n <code\n style={{\n background: \"rgba(30, 33, 37, 0.06)\",\n padding: \"2px 4px\",\n borderRadius: \"3px\",\n fontFamily: \"var(--font-mono, monospace)\",\n fontSize: \"var(--text-xs, 10px)\",\n }}\n >\n #\n </code>{\" \"}\n to reference conditions\n </div>\n </div>\n </div>\n );\n}\n\n","\"use client\";\nimport React, { useRef, useCallback } from 'react';\nimport {\n ResponsiveContainer, BarChart, Bar, Cell, LineChart, Line,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n PieChart, Pie, AreaChart, Area,\n} from 'recharts';\n\n// Chordia design system rail colors — ordered for max visual distinction\nconst COLORS = [\n '#5E88B0', // rail-discovery / rail-blue\n '#9B7AA8', // rail-purple / rail-tone\n '#C98A5A', // rail-compliance / rail-orange\n '#7BA89D', // rail-signal-upsell (teal-green)\n '#D17B6B', // rail-coral / rail-signal-churn\n '#6B7C93', // rail-slate / rail-outcome\n '#9B8E6F', // rail-olive / rail-signal-satisfaction\n '#8A9BAF', // rail-quality\n '#B8976A', // rail-teal (warm gold)\n '#A8C76B', // green accent (complementary)\n];\n\n// Shared axis/tooltip/legend styling\nconst AXIS_TICK = { fill: 'var(--text-muted, #666)', fontSize: 12 };\nconst AXIS_LINE = { stroke: 'var(--border, #e0e0e0)' };\nconst GRID_STROKE = 'var(--border, #e0e0e0)';\nconst TOOLTIP_STYLE = {\n contentStyle: {\n backgroundColor: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',\n color: 'var(--text-ink, #1e2125)',\n },\n labelStyle: { color: 'var(--text-strong, #1e2125)' },\n};\nconst LEGEND_STYLE = { color: 'var(--text-ink, #1e2125)', fontSize: '12px' };\n\n// Smart label: skip x_label if tick values already contain the label text\nconst shouldShowAxisLabel = (label, tickValues) => {\n if (!label) return false;\n const lower = label.toLowerCase();\n // If most ticks contain the label word, it's redundant\n const matches = tickValues.filter(v => String(v).toLowerCase().includes(lower));\n return matches.length < tickValues.length * 0.5;\n};\n\n// --- Export utilities ---\nconst downloadPng = async (containerEl, title) => {\n const svg = containerEl.querySelector('svg');\n if (!svg) return;\n const clone = svg.cloneNode(true);\n // Ensure dimensions\n const w = svg.clientWidth || 600;\n const h = svg.clientHeight || 300;\n clone.setAttribute('width', w);\n clone.setAttribute('height', h);\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n // Inline computed styles for export fidelity\n const styleEl = document.createElement('style');\n styleEl.textContent = `text { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }`;\n clone.insertBefore(styleEl, clone.firstChild);\n const xml = new XMLSerializer().serializeToString(clone);\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n const img = new Image();\n img.onload = () => {\n const canvas = document.createElement('canvas');\n const scale = 2; // retina\n canvas.width = w * scale;\n canvas.height = h * scale;\n const ctx = canvas.getContext('2d');\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n ctx.scale(scale, scale);\n ctx.drawImage(img, 0, 0, w, h);\n URL.revokeObjectURL(url);\n const link = document.createElement('a');\n link.download = `${(title || 'chart').replace(/[^a-z0-9]+/gi, '_')}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n };\n img.src = url;\n};\n\nconst copyAsCsv = (series, allXValues) => {\n const header = ['', ...series.map(s => s.name)].join(',');\n const rows = allXValues.map(x => {\n const vals = series.map(s => {\n const match = s.data.find(d => d.x === x);\n return match ? match.y : '';\n });\n return [x, ...vals].join(',');\n });\n const csv = [header, ...rows].join('\\n');\n navigator.clipboard.writeText(csv);\n};\n\nconst ActionBar = ({ onDownload, onCopy, copied }) => (\n <div style={{\n display: 'flex', gap: 6, justifyContent: 'flex-end',\n marginBottom: 8, opacity: 0.7, transition: 'opacity 0.15s',\n }}>\n <button onClick={onCopy} title=\"Copy data as CSV\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n {copied ? '✓ Copied' : '📋 CSV'}\n </button>\n <button onClick={onDownload} title=\"Download as PNG\" style={{\n background: 'none', border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-sm, 4px)', padding: '3px 8px',\n fontSize: 11, color: 'var(--text-muted, #666)', cursor: 'pointer',\n display: 'flex', alignItems: 'center', gap: 4,\n }}>\n 📥 PNG\n </button>\n </div>\n);\n\nconst ChartRenderer = ({ chartType, title, xLabel, yLabel, series }) => {\n const chartRef = useRef(null);\n const [copied, setCopied] = React.useState(false);\n\n if (!series || series.length === 0) return null;\n\n // Transform: merge all series into [{x, series1: val, series2: val}, ...]\n const allXValues = [...new Set(series.flatMap(s => s.data.map(d => d.x)))];\n const chartData = allXValues.map(x => {\n const point = { x };\n series.forEach(s => {\n const match = s.data.find(d => d.x === x);\n point[s.name] = match ? match.y : null;\n });\n return point;\n });\n\n const seriesNames = series.map(s => s.name);\n const isSingleSeries = seriesNames.length === 1;\n\n // Determine if axis labels are redundant\n const showXLabel = shouldShowAxisLabel(xLabel, allXValues);\n const bottomMargin = showXLabel ? 20 : 5;\n\n // Check if x-axis labels are long (rotate them)\n const maxTickLen = Math.max(...allXValues.map(v => String(v).length));\n const rotateXTicks = maxTickLen > 12 || allXValues.length > 8;\n\n const containerStyle = {\n background: 'var(--paper-elevated, #fff)',\n border: '1px solid var(--border, #e0e0e0)',\n borderRadius: 'var(--radius-md, 8px)',\n padding: '16px',\n marginBottom: '16px',\n };\n\n const titleStyle = {\n color: 'var(--text-strong, #1e2125)',\n fontSize: '14px',\n fontWeight: '600',\n marginBottom: '12px',\n };\n\n const xAxisProps = {\n dataKey: 'x',\n tick: rotateXTicks\n ? { fill: 'var(--text-muted, #666)', fontSize: 11, angle: -35, textAnchor: 'end' }\n : AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(showXLabel ? {\n label: { value: xLabel, position: 'insideBottom', offset: -10, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } }\n } : {}),\n };\n\n const yAxisProps = {\n tick: AXIS_TICK,\n axisLine: AXIS_LINE,\n tickLine: AXIS_LINE,\n ...(yLabel ? {\n label: { value: yLabel, angle: -90, position: 'insideLeft', style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } }\n } : {}),\n };\n\n const renderChart = () => {\n switch (chartType) {\n case 'bar':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n {!isSingleSeries && <Legend wrapperStyle={LEGEND_STYLE} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[2, 2, 0, 0]}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n\n case 'horizontal_bar': {\n // Horizontal bar: swap X/Y, use YAxis for categories\n return (\n <ResponsiveContainer width=\"100%\" height={Math.max(300, chartData.length * 40)}>\n <BarChart data={chartData} layout=\"vertical\" margin={{ top: 5, right: 30, left: 100, bottom: 5 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis type=\"number\" tick={AXIS_TICK} axisLine={AXIS_LINE} tickLine={AXIS_LINE}\n {...(yLabel ? { label: { value: yLabel, position: 'insideBottom', offset: -5, style: { textAnchor: 'middle', fill: 'var(--text-muted, #666)' } } } : {})}\n />\n <YAxis type=\"category\" dataKey=\"x\" tick={{ fill: 'var(--text-muted, #666)', fontSize: 11 }} width={90} axisLine={AXIS_LINE} tickLine={AXIS_LINE} />\n <Tooltip {...TOOLTIP_STYLE} />\n {!isSingleSeries && <Legend wrapperStyle={LEGEND_STYLE} />}\n {seriesNames.map((name, i) => (\n <Bar key={name} dataKey={name} fill={COLORS[i % COLORS.length]} radius={[0, 2, 2, 0]}>\n {isSingleSeries && chartData.map((_, idx) => (\n <Cell key={idx} fill={COLORS[idx % COLORS.length]} />\n ))}\n </Bar>\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n }\n\n case 'line':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n <Legend wrapperStyle={LEGEND_STYLE} />\n {seriesNames.map((name, i) => (\n <Line key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n dot={{ r: 4, fill: COLORS[i % COLORS.length] }}\n activeDot={{ r: 6, fill: COLORS[i % COLORS.length] }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n );\n\n case 'area':\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <AreaChart data={chartData} margin={{ top: 5, right: 30, left: 20, bottom: rotateXTicks ? 40 : bottomMargin }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID_STROKE} />\n <XAxis {...xAxisProps} />\n <YAxis {...yAxisProps} />\n <Tooltip {...TOOLTIP_STYLE} />\n <Legend wrapperStyle={LEGEND_STYLE} />\n {seriesNames.map((name, i) => (\n <Area key={name} type=\"monotone\" dataKey={name}\n stroke={COLORS[i % COLORS.length]} strokeWidth={2}\n fill={COLORS[i % COLORS.length]} fillOpacity={0.15}\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n );\n\n case 'pie': {\n // Pie uses first series only\n const pieData = series[0].data.map((d, i) => ({\n name: d.x,\n value: d.y,\n fill: COLORS[i % COLORS.length],\n }));\n const RADIAN = Math.PI / 180;\n const renderLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, name }) => {\n const radius = outerRadius + 20;\n const x = cx + radius * Math.cos(-midAngle * RADIAN);\n const y = cy + radius * Math.sin(-midAngle * RADIAN);\n if (percent < 0.04) return null;\n return (\n <text x={x} y={y} fill=\"var(--text-ink, #1e2125)\" fontSize={11}\n textAnchor={x > cx ? 'start' : 'end'} dominantBaseline=\"central\">\n {name} ({(percent * 100).toFixed(0)}%)\n </text>\n );\n };\n return (\n <ResponsiveContainer width=\"100%\" height={320}>\n <PieChart>\n <Pie data={pieData} cx=\"50%\" cy=\"50%\" outerRadius={100}\n dataKey=\"value\" label={renderLabel} labelLine={{ stroke: 'var(--text-muted, #666)' }}>\n {pieData.map((entry, i) => (\n <Cell key={i} fill={entry.fill} />\n ))}\n </Pie>\n <Tooltip {...TOOLTIP_STYLE} />\n </PieChart>\n </ResponsiveContainer>\n );\n }\n\n case 'metric': {\n const s = series[0];\n const current = s.data[0];\n const previous = s.data.length > 1 ? s.data[1] : null;\n const value = current.y;\n const unit = current.x || '';\n const hasTrend = previous !== null;\n const change = hasTrend ? value - previous.y : 0;\n const pctChange = hasTrend && previous.y !== 0 ? ((change / Math.abs(previous.y)) * 100) : 0;\n const isPositive = change > 0;\n const isNegative = change < 0;\n const trendColor = isPositive ? '#7BA89D' : isNegative ? '#D17B6B' : 'var(--text-muted, #666)';\n const trendArrow = isPositive ? '↑' : isNegative ? '↓' : '→';\n\n // Format large numbers nicely\n const fmt = (n) => {\n if (Number.isInteger(n) && Math.abs(n) >= 1000) return n.toLocaleString();\n if (typeof n === 'number') return n % 1 === 0 ? n.toString() : n.toFixed(n < 10 ? 2 : 1);\n return String(n);\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 12, padding: '8px 0' }}>\n <div style={{\n fontSize: '36px', fontWeight: 700, lineHeight: 1,\n color: 'var(--text-strong, #1e2125)',\n fontVariantNumeric: 'tabular-nums',\n }}>\n {fmt(value)}\n </div>\n {unit && (\n <div style={{ fontSize: '14px', color: 'var(--text-muted, #666)', fontWeight: 500 }}>\n {unit}\n </div>\n )}\n {hasTrend && (\n <div style={{\n display: 'flex', alignItems: 'center', gap: 4,\n fontSize: '13px', fontWeight: 600, color: trendColor,\n background: isPositive ? 'rgba(123,168,157,0.12)' : isNegative ? 'rgba(209,123,107,0.12)' : 'rgba(128,128,128,0.08)',\n padding: '3px 8px', borderRadius: 'var(--radius-sm, 4px)',\n }}>\n <span>{trendArrow}</span>\n <span>{fmt(Math.abs(change))} ({Math.abs(pctChange).toFixed(1)}%)</span>\n </div>\n )}\n {hasTrend && (\n <div style={{ fontSize: '11px', color: 'var(--text-faint, #999)' }}>\n vs {previous.x || 'previous'}\n </div>\n )}\n </div>\n );\n }\n\n default:\n return <div style={{ color: 'var(--text-muted)', fontSize: 12, padding: 8 }}>Unsupported chart type: {chartType}</div>;\n }\n };\n\n const handleDownload = useCallback(() => {\n if (chartRef.current) downloadPng(chartRef.current, title);\n }, [title]);\n\n const handleCopy = useCallback(() => {\n copyAsCsv(series, allXValues);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [series, allXValues]);\n\n const showActions = chartType !== 'metric';\n\n return (\n <div style={containerStyle}>\n {title && <div style={titleStyle}>{title}</div>}\n {showActions && <ActionBar onDownload={handleDownload} onCopy={handleCopy} copied={copied} />}\n <div ref={chartRef}>\n {renderChart()}\n </div>\n </div>\n );\n};\n\nexport default ChartRenderer;\n"],"names":["MarkdownRenderer","content","onCodeBlockClick","onFilePathClick","copiedBlocks","setCopiedBlocks","useState","copyToClipboard","text","blockId","prev","newSet","err","renderCodeBlock","code","language","isCopied","jsxs","jsx","e","Check","Copy","PanelRightOpen","parseMarkdown","elements","lines","i","line","codeLines","level","HeaderTag","React","listItems","isOrdered","match","ListTag","item","idx","parseInlineMarkdownWithContext","tableRows","parseCells","row","c","headerCells","isSeparator","hasSeparator","bodyStart","alignments","cellStyle","cell","ci","ri","paragraph","parseInlineMarkdown","remaining","key","filePathMatch","filePath","inlineCodeMatch","boldMatch","italicMatch","linkMatch","nextSpecialChar","ChatMessage","role","html","timestamp","toolBadges","isStreaming","isUser","badge","index","Wrench","ThinkingIndicator","phase","toolSteps","label","elapsedMs","compact","formatElapsedTime","ms","seconds","minutes","remainingSeconds","getPhaseLabel","renderToolStep","step","getStatusDot","baseDotStyle","getStatusText","renderShimmerBar","renderCursor","phaseLabel","elapsedTime","toast","args","ChatInterface","initialMessages","onSendMessage","onStreamMessage","onMessagesChange","placeholder","title","messages","setMessages","inputValue","setInputValue","isProcessing","setIsProcessing","isSending","setIsSending","currentAssistantMessage","setCurrentAssistantMessage","thinkingPhase","setThinkingPhase","thinkingStartTime","setThinkingStartTime","setElapsedMs","messagesEndRef","useRef","inputRef","streamAbortController","currentAssistantRef","lastChunkTimeRef","streamSilent","setStreamSilent","silenceSeconds","setSilenceSeconds","useEffect","_a","allMessages","interval","gap","resetProcessingState","parseSSELine","data","handleStreamChunk","chunk","_b","delta","baseMessage","updated","processStream","stream","reader","decoder","buffer","done","value","parsed","handleSend","userContent","userMessage","newMessages","result","assistantMessage","resolved","error","handleKeyDown","Fragment","message","Send","ChatHistoryPanel","threads","activeThreadId","onSelectThread","onNewChat","loading","searchQuery","setSearchQuery","sortedThreads","thread","q","a","b","aTime","formatTime","dateStr","d","diffMs","diffDays","Search","isActive","MessageSquare","Pin","Clock","useUserContext","MessageThread","sessionTitle","currentUser","messageInput","setMessageInput","isFocused","setIsFocused","isLoading","setIsLoading","userData","displayCurrentUser","n","optimisticMessage","msg","handleKeyPress","ref","Hash","AtSign","Paperclip","COLORS","AXIS_TICK","AXIS_LINE","GRID_STROKE","TOOLTIP_STYLE","LEGEND_STYLE","shouldShowAxisLabel","tickValues","lower","v","downloadPng","containerEl","svg","clone","w","h","styleEl","xml","blob","url","img","canvas","scale","ctx","link","copyAsCsv","series","allXValues","header","s","rows","x","vals","csv","ActionBar","onDownload","onCopy","copied","ChartRenderer","chartType","xLabel","yLabel","chartRef","setCopied","chartData","point","seriesNames","isSingleSeries","showXLabel","bottomMargin","rotateXTicks","containerStyle","titleStyle","xAxisProps","yAxisProps","renderChart","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","name","Bar","_","Cell","LineChart","Line","AreaChart","Area","pieData","RADIAN","renderLabel","cx","cy","midAngle","innerRadius","outerRadius","percent","radius","y","PieChart","Pie","entry","current","previous","unit","hasTrend","change","pctChange","isPositive","isNegative","trendColor","trendArrow","fmt","handleDownload","useCallback","handleCopy","showActions"],"mappings":"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"}
|