{
  "id": "agent-data-analyst",
  "name": "Data Analyst Agent",
  "category": "agents",
  "tags": [
    "agent",
    "data",
    "analyst",
    "ai",
    "csv",
    "insights",
    "chart",
    "employees",
    "titan"
  ],
  "description": "Drop a CSV, the agent profiles the data, surfaces insights, and renders a chart. Uses TITAN's data_analysis skill.",
  "triggers": [
    "data analyst",
    "agent analyst",
    "csv analyst",
    "analyze csv",
    "data agent",
    "data insights"
  ],
  "defaultSize": {
    "w": 6,
    "h": 5
  },
  "source": "function DataAnalystAgent() {\n  const [csv, setCsv] = React.useState('');\n  const [insights, setInsights] = React.useState(null);\n  const [chartData, setChartData] = React.useState([]);\n  const [busy, setBusy] = React.useState(false);\n  const onFile = (e) => {\n    const f = e.target.files?.[0]; if (!f) return;\n    const reader = new FileReader();\n    reader.onload = () => setCsv(String(reader.result || ''));\n    reader.readAsText(f);\n  };\n  const analyze = async () => {\n    if (!csv.trim()) return;\n    setBusy(true); setInsights(null);\n    try {\n      const r = await titan.api.call('/api/message', { content: `Profile this CSV and return JSON: { \"rows\": <int>, \"columns\": [<names>], \"insights\": [<5 bullets>], \"chart\": { \"label\": <col>, \"value\": <col> }, \"chartData\": [{ \"label\": \"...\", \"value\": <num> }, ... up to 12] }\\n\\nCSV:\\n${csv.slice(0, 8000)}` });\n      const text = r?.body?.content || r?.content || r?.body?.text || r?.text || '';\n      const m = text.match(/\\{[\\s\\S]*\\}/);\n      if (m) {\n        const p = JSON.parse(m[0]);\n        setInsights(p);\n        setChartData(p.chartData || []);\n      }\n    } catch (e) { setInsights({ error: String(e?.message||e) }); }\n    setBusy(false);\n  };\n  const max = Math.max(...chartData.map(d=>Number(d.value)||0), 1);\n  return (\n    <div style={{padding:12,fontFamily:'system-ui',height:'100%',display:'flex',flexDirection:'column',gap:8}}>\n      <div style={{fontSize:16,fontWeight:600}}>\ud83d\udcca Data Analyst</div>\n      <div style={{display:'flex',gap:6}}>\n        <input type=\"file\" accept=\".csv\" onChange={onFile} style={{flex:1,fontSize:12}}/>\n        <button onClick={analyze} disabled={busy||!csv} style={{padding:'6px 14px',border:'none',borderRadius:6,background:'#007AFF',color:'#fff',cursor:busy?'wait':'pointer',fontWeight:600}}>{busy?'\u2026':'Analyze'}</button>\n      </div>\n      <textarea value={csv} onChange={e=>setCsv(e.target.value)} placeholder=\"Paste CSV or upload a file\" rows={3} style={{padding:8,border:'1px solid #ccc',borderRadius:6,fontSize:11,fontFamily:'ui-monospace,monospace',resize:'vertical'}}/>\n      <div style={{flex:1,overflow:'auto'}}>\n        {insights && !insights.error && (\n          <>\n            <div style={{display:'flex',gap:8,marginBottom:8}}>\n              <div style={{padding:'6px 10px',background:'#E3F2FD',borderRadius:6,fontSize:12}}><b>{insights.rows}</b> rows</div>\n              <div style={{padding:'6px 10px',background:'#F3E5F5',borderRadius:6,fontSize:12}}><b>{insights.columns?.length||0}</b> cols</div>\n            </div>\n            {insights.insights?.map((it,i) => <div key={i} style={{padding:'6px 10px',marginBottom:4,background:'#FFF7E6',borderLeft:'3px solid #FF9500',borderRadius:4,fontSize:12}}>{it}</div>)}\n            {chartData.length > 0 && (\n              <div style={{marginTop:10,padding:8,background:'#fff',border:'1px solid #eee',borderRadius:8}}>\n                {chartData.map((d,i) => (\n                  <div key={i} style={{display:'grid',gridTemplateColumns:'80px 1fr 60px',alignItems:'center',gap:6,padding:'2px 0',fontSize:11}}>\n                    <div style={{overflow:'hidden',textOverflow:'ellipsis',whiteSpace:'nowrap'}}>{d.label}</div>\n                    <div style={{height:14,background:'#eee',borderRadius:4}}><div style={{width:`${(Number(d.value)/max)*100}%`,height:'100%',background:'#007AFF',borderRadius:4}}/></div>\n                    <div style={{textAlign:'right',fontVariantNumeric:'tabular-nums'}}>{Number(d.value).toLocaleString()}</div>\n                  </div>\n                ))}\n              </div>\n            )}\n          </>\n        )}\n        {insights?.error && <div style={{color:'#FF3B30'}}>{insights.error}</div>}\n      </div>\n    </div>\n  );\n}\nrender(<DataAnalystAgent/>);",
  "placeholders": []
}
