/* 회의록 브레인 — 화면 ④ 누적 대시보드 */ function ScreenDashboard({ meetings, actions }) { const D = window.MB_DATA; // 연도별 회의록 건수 — 데모 비주얼 유지(시드). RAG 검색만 실제 DB를 사용. const yearly = D.YEARLY; const maxCount = Math.max(...yearly.map((y) => y.count)); const totalSeed = yearly.reduce((s, y) => s + y.count, 0); // 라이브 합계 = 시드 누적 + 데모 중 새로 추가된 회의 const newCount = meetings.filter((m) => String(m.id).startsWith("new-")).length; const total = totalSeed + newCount; const doneRate = actions.length ? Math.round((actions.filter((a) => a.status === "done").length / actions.length) * 100) : 0; // 막대 애니메이션 트리거 const [grown, setGrown] = React.useState(false); React.useEffect(() => { const t = setTimeout(() => setGrown(true), 60); return () => clearTimeout(t); }, []); const flow = [ { ic: "file-text", title: "회의록 입력", sub: "원문 붙여넣기" }, { ic: "layers", title: "임베딩", sub: "문장 단위 벡터화" }, { ic: "database", title: "Vector DB", sub: "의미 기반 저장" }, { ic: "search", title: "RAG 검색", sub: "출처와 함께 답변" }, ]; return (

누적 대시보드

회사의 기억이 이렇게 쌓였습니다

연도별 회의록 누적량과, 입력된 회의록이 검색 가능한 기억이 되기까지의 흐름입니다.

{/* 스탯 카드 */}
{/* 연도별 막대 */}
연도별 회의록 건수 2026년은 진행 중
{yearly.map((y, i) => { const h = (y.count / maxCount) * 100; const isCurrent = i === yearly.length - 1; return (
{y.count}
{y.year}
); })}
{/* 파이프라인 흐름 */}
임베딩 → Vector DB → RAG 흐름
{flow.map((n, i) => (
{n.title}
{n.sub}
{i < flow.length - 1 && (
)}
))}

저장된 회의록은 문장 단위로 임베딩되어 Vector DB에 쌓이고, 질문이 들어오면 의미가 가까운 회의를 찾아 출처와 함께 답합니다.

); } function StatCard({ label, value, unit, icon, accent }) { return (
{value} {unit}
{label}
); } window.ScreenDashboard = ScreenDashboard;