diff --git a/packages/ui/src/components/ContextUsage.tsx b/packages/ui/src/components/ContextUsage.tsx index aa1585f..120f53d 100644 --- a/packages/ui/src/components/ContextUsage.tsx +++ b/packages/ui/src/components/ContextUsage.tsx @@ -152,9 +152,27 @@ export function ContextUsage({ {/* 数值 */} {formatted} - {/* 警告图标 */} - {shouldCompress && ( - + {/* 压缩按钮 */} + {showCompressButton && ( + )} ); diff --git a/packages/ui/src/components/StatusBar.tsx b/packages/ui/src/components/StatusBar.tsx index b0107df..ddb0905 100644 --- a/packages/ui/src/components/StatusBar.tsx +++ b/packages/ui/src/components/StatusBar.tsx @@ -5,9 +5,9 @@ */ import { useState, useEffect, useCallback } from 'react'; -import { GitBranch, AlertTriangle, AlertCircle, Wifi, WifiOff, RefreshCw, CheckCircle } from 'lucide-react'; +import { GitBranch, AlertTriangle, AlertCircle, WifiOff, RefreshCw, CheckCircle } from 'lucide-react'; import { cn } from '../utils/cn.js'; -import { getLSPDiagnostics, getGitInfo, type DiagnosticsSummary, type GitInfo } from '../api/client.js'; +import { getLSPDiagnostics, getGitInfo, getHealth, type DiagnosticsSummary, type GitInfo } from '../api/client.js'; interface StatusBarProps { className?: string; @@ -21,13 +21,17 @@ interface StatusBarProps { export function StatusBar({ className, - isConnected = true, + isConnected: isConnectedProp, onDiagnosticsClick, refreshInterval = 30000, }: StatusBarProps) { const [diagnostics, setDiagnostics] = useState(null); const [gitInfo, setGitInfo] = useState(null); const [loading, setLoading] = useState(false); + const [connectionStatus, setConnectionStatus] = useState(true); + + // 如果外部传入了 isConnected,使用外部值;否则使用内部检测 + const isConnected = isConnectedProp ?? connectionStatus; // 加载诊断信息和 Git 信息 const loadData = useCallback(async () => { @@ -45,12 +49,37 @@ export function StatusBar({ if (gitResult.success && gitResult.data) { setGitInfo(gitResult.data); } + + // 如果没有外部传入连接状态,内部检测 + if (isConnectedProp === undefined) { + setConnectionStatus(true); + } } catch { - // 忽略错误 + // 请求失败说明可能断开连接 + if (isConnectedProp === undefined) { + setConnectionStatus(false); + } } finally { setLoading(false); } - }, []); + }, [isConnectedProp]); + + // 检测连接状态(如果没有外部传入) + const checkConnection = useCallback(async () => { + if (isConnectedProp !== undefined) return; + + try { + await getHealth(); + setConnectionStatus(true); + } catch { + setConnectionStatus(false); + } + }, [isConnectedProp]); + + // 初始连接检测 + useEffect(() => { + checkConnection(); + }, [checkConnection]); // 初始加载和定时刷新 useEffect(() => { @@ -94,6 +123,30 @@ export function StatusBar({ + {/* 中间 - 连接状态 */} +
+ {isConnected ? ( + <> + + + + + Connected + + ) : ( + <> + + Disconnected + + )} +
+ {/* 右侧 */}
{/* 诊断信息 */} @@ -123,17 +176,6 @@ export function StatusBar({ )} - - {/* 连接状态 */} -
- {isConnected ? : } -
); diff --git a/packages/web/src/pages/Chat.tsx b/packages/web/src/pages/Chat.tsx index db7a799..684fba3 100644 --- a/packages/web/src/pages/Chat.tsx +++ b/packages/web/src/pages/Chat.tsx @@ -3,7 +3,7 @@ */ import { useEffect, useRef } from 'react'; -import { WifiOff, MessageSquare, Terminal, Plug, Zap, Bot, History, Server, MessagesSquare } from 'lucide-react'; +import { MessageSquare, Terminal, Plug, Zap, Bot, History, Server, MessagesSquare } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; import { toast } from 'sonner'; import { @@ -129,30 +129,6 @@ export function ChatPage({ ); - // 连接状态指示器 - const ConnectionStatus = () => ( -
- {isConnected ? ( - - - - - - Connected - - ) : ( -
- - Disconnected -
- )} -
- ); - return (
{/* Header */} @@ -164,14 +140,11 @@ export function ChatPage({ )} - {/* 连接状态 */} - - {/* 工具栏按钮 */} {(onOpenCommands || onOpenMCP || onOpenHooks || onOpenAgents || onOpenCheckpoints || onOpenProviders || onOpenLSP || onOpenDiagnostics || onOpenSessions) && (