/* 회의록 브레인 — 화면 ② RAG 검색 */ function ScreenSearch({ onOpenMeeting }) { const DS = window.CalComDesignSystem_436c9d; const { Button } = DS; const D = window.MB_DATA; const [q, setQ] = React.useState(""); const [phase, setPhase] = React.useState("idle"); // idle | searching | done | empty | error const [res, setRes] = React.useState(null); const [errorCode, setErrorCode] = React.useState(null); const inputRef = React.useRef(null); const ask = async (question) => { const query = (question != null ? question : q).trim(); if (!query || phase === "searching") return; if (question != null) setQ(query); setPhase("searching"); setRes(null); setErrorCode(null); try { const out = await window.MB_AI.ragSearch(query); if (!out || !out.sources || out.sources.length === 0) { setPhase("empty"); setRes(out); return; } setRes(out); setPhase("done"); } catch (err) { setErrorCode(err.message || "network"); setPhase("error"); } }; const onKey = (e) => { if (e.key === "Enter" && (e.metaKey || e.ctrlKey || !e.shiftKey)) { e.preventDefault(); ask(); } }; const busy = phase === "searching"; return (
RAG 검색
자연어로 질문하면 관련 회의록을 찾아 출처와 함께 답하고, 과거 결정이 어긋나면 교차점검해 드립니다.
검색 중…
관련 회의록을 찾아 답변을 정리하고 있어요
{renderRich(res.answer)}
{/* 출처 */} {res.sources && res.sources.length > 0 && (