"use client"; import Image from "next/image"; import React from "react"; import { motion } from "framer-motion"; import { Avatar, Box, IconButton, Stack, TextField, Tooltip, Typography, alpha, useTheme, } from "@mui/material"; import CheckRounded from "@mui/icons-material/CheckRounded"; import CloseRounded from "@mui/icons-material/CloseRounded"; import EditRounded from "@mui/icons-material/EditRounded"; import EditNoteRounded from "@mui/icons-material/EditNoteRounded"; import HistoryRounded from "@mui/icons-material/HistoryRounded"; import type { AgentRuntimeState } from "@/lib/agentRuntime"; type AgentHeaderProps = { sessionTitle?: string; canRenameSessionTitle?: boolean; isHydrating?: boolean; isStreaming: boolean; runtimeState?: AgentRuntimeState; isHistoryOpen: boolean; onHistoryToggle: () => void; onRenameSessionTitle?: (title: string) => void; onNewConversation: () => void; onClose: () => void; }; export const AgentHeader = ({ sessionTitle, canRenameSessionTitle = false, isHydrating = false, isStreaming, runtimeState = "ready", isHistoryOpen, onHistoryToggle, onRenameSessionTitle, onNewConversation, onClose, }: AgentHeaderProps) => { const theme = useTheme(); const displayTitle = sessionTitle?.trim() || "新对话"; const [isEditingTitle, setIsEditingTitle] = React.useState(false); const [draftTitle, setDraftTitle] = React.useState(sessionTitle?.trim() || ""); const runtimeStatus = runtimeState === "unavailable" || runtimeState === "models_unavailable" ? { color: "#e53935", label: "Agent 服务未就绪" } : runtimeState === "checking" ? { color: "#ffb300", label: "正在连接 Agent 服务" } : isStreaming ? { color: "#ff9800", label: "Agent 正在生成" } : { color: "#00e676", label: "Agent 已就绪" }; React.useEffect(() => { if (!isEditingTitle) { setDraftTitle(sessionTitle?.trim() || ""); } }, [isEditingTitle, sessionTitle]); const handleStartEditing = () => { if (!canRenameSessionTitle || isHydrating || isStreaming) return; setDraftTitle(sessionTitle?.trim() || ""); setIsEditingTitle(true); }; const handleCancelEditing = () => { setDraftTitle(sessionTitle?.trim() || ""); setIsEditingTitle(false); }; const handleConfirmEditing = () => { const normalizedTitle = draftTitle.trim(); if (!normalizedTitle) return; onRenameSessionTitle?.(normalizedTitle); setIsEditingTitle(false); }; return ( TJWater Agent {isEditingTitle ? ( setDraftTitle(event.target.value)} size="small" autoFocus placeholder="请输入对话标题" onKeyDown={(event) => { if (event.key === "Enter") { event.preventDefault(); handleConfirmEditing(); } else if (event.key === "Escape") { event.preventDefault(); handleCancelEditing(); } }} sx={{ flex: 1, minWidth: 0, "& .MuiOutlinedInput-root": { padding: "6px 8px", bgcolor: "transparent", borderRadius: 1.5, transition: "all 0.2s ease-in-out", "&.Mui-focused": { bgcolor: alpha("#fff", 0.6), boxShadow: `0 2px 10px ${alpha("#000", 0.05)}`, }, "& fieldset": { borderColor: "transparent", }, "&:hover fieldset": { borderColor: alpha(theme.palette.primary.main, 0.2), }, "&.Mui-focused fieldset": { borderColor: alpha(theme.palette.primary.main, 0.5), borderWidth: "1px", }, }, "& .MuiInputBase-input": { padding: 0, height: "auto", fontSize: "1.25rem", fontWeight: 800, letterSpacing: -0.3, lineHeight: "1.2", background: `linear-gradient(90deg, #01579b, #00838f)`, WebkitBackgroundClip: "text", WebkitTextFillColor: "transparent", } }} /> ) : ( {displayTitle} {canRenameSessionTitle ? ( ) : null} )} ); };