import { useEffect, useRef, useState } from "react"; const STORAGE_KEY = "reachy-vibe-knowledge"; const MAX_LEN = 20_000; interface KnowledgeDialogProps { open: boolean; onClose: () => void; } export function loadKnowledge(): string { try { return localStorage.getItem(STORAGE_KEY) ?? ""; } catch { return ""; } } export function KnowledgeDialog({ open, onClose }: KnowledgeDialogProps) { const [text, setText] = useState(""); const [saved, setSaved] = useState(false); const textareaRef = useRef(null); useEffect(() => { if (!open) return; setText(loadKnowledge()); setSaved(false); const t = window.setTimeout(() => textareaRef.current?.focus(), 40); return () => window.clearTimeout(t); }, [open]); const handleSave = () => { try { const trimmed = text.slice(0, MAX_LEN); localStorage.setItem(STORAGE_KEY, trimmed); setText(trimmed); setSaved(true); window.setTimeout(() => setSaved(false), 1500); } catch (err) { console.error("[knowledge] save failed", err); } }; const handleClear = () => { try { localStorage.removeItem(STORAGE_KEY); } catch {} setText(""); setSaved(true); window.setTimeout(() => setSaved(false), 1500); }; if (!open) return null; const charCount = text.length; const approxKb = (charCount / 1024).toFixed(1); return (
e.stopPropagation()}>

App Knowledge

Long-lived context the agent sees on every message. Use it for the project goal, constraints, tone, preferred libraries, API keys already in place, etc.