"use client"; import { useEffect, useState, useRef, useCallback } from "react"; import { MessageSquare, Plus, MoreHorizontal, Pencil, Trash2, ChevronDown, ChevronRight, FileCode, Check, X, Maximize2, Minimize2, RefreshCw, Wrench, Loader2, Database, Building2, Target, Search, Shield, FileText, Users, Bot, Blocks, } from "lucide-react"; import { useApp } from "@/lib/store"; import { getSessionTokenCount } from "@/lib/api"; export default function Sidebar() { const { sessionId, setSessionId, sessions, createSession, renameSession, deleteSession, rawMessages, loadRawMessages, isCompressing, compressCurrentSession, ragMode, toggleRagMode, } = useApp(); const [rawOpen, setRawOpen] = useState(false); const [rawExpanded, setRawExpanded] = useState(false); const [sessionTokens, setSessionTokens] = useState(null); const [showCompressModal, setShowCompressModal] = useState(false); // Load raw messages when section is opened or session changes useEffect(() => { if (rawOpen) { loadRawMessages(); getSessionTokenCount(sessionId) .then((data) => setSessionTokens(data.total_tokens)) .catch(() => setSessionTokens(null)); } }, [rawOpen, sessionId, loadRawMessages]); return ( ); } // ── Session Item ──────────────────────────────────────── function SessionItem({ id, title, isActive, onSelect, onRename, onDelete, }: { id: string; title: string; isActive: boolean; onSelect: () => void; onRename: (title: string) => void; onDelete: () => void; }) { const [renaming, setRenaming] = useState(false); const [renameValue, setRenameValue] = useState(title); const inputRef = useRef(null); // Focus input when renaming useEffect(() => { if (renaming && inputRef.current) { inputRef.current.focus(); inputRef.current.select(); } }, [renaming]); const handleRenameSubmit = useCallback(() => { const trimmed = renameValue.trim(); if (trimmed && trimmed !== title) { onRename(trimmed); } setRenaming(false); }, [renameValue, title, onRename]); const handleDelete = useCallback(() => { if (confirm("删除该会话?此操作不可恢复。")) { onDelete(); } }, [onDelete]); if (renaming) { return (
setRenameValue(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") handleRenameSubmit(); if (e.key === "Escape") setRenaming(false); }} onBlur={handleRenameSubmit} />
); } return (
{/* Action buttons: Rename and Delete */}
); } // ── Raw Message Viewer ────────────────────────────────── function RawMessageViewer({ messages, truncate = true, }: { messages: Array<{ role: string; content: string }> | null; truncate?: boolean; }) { if (!messages) { return (
No messages yet
); } return (
{messages.map((msg, i) => { const roleClass = msg.role === "system" ? "msg-system" : msg.role === "user" ? "msg-user" : "msg-assistant"; const displayContent = truncate && msg.content.length > 500 ? msg.content.slice(0, 500) + "..." : msg.content; return (
{msg.role}
{displayContent}
); })}
); }