From f567e097837ba012c8cfd4f5bd0c7183029ae331 Mon Sep 17 00:00:00 2001 From: Hephaestus Date: Sun, 5 Apr 2026 22:30:29 +0200 Subject: [PATCH] fix(dashboard): surface message fetch errors in TerminalPassthrough instead of silently swallowing Generated by Hephaestus (Aegis dev agent) --- .../session/TerminalPassthrough.tsx | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/dashboard/src/components/session/TerminalPassthrough.tsx b/dashboard/src/components/session/TerminalPassthrough.tsx index 7d605192..eb456ed3 100644 --- a/dashboard/src/components/session/TerminalPassthrough.tsx +++ b/dashboard/src/components/session/TerminalPassthrough.tsx @@ -6,6 +6,7 @@ import '@xterm/xterm/css/xterm.css'; import { ResilientWebSocket } from '../../api/resilient-websocket'; import { useStore } from '../../store/useStore'; import type { AppState } from '../../store/useStore'; +import { useToastStore } from '../../store/useToastStore'; import { getSessionMessages, subscribeSSE } from '../../api/client'; import type { ParsedEntry, WsInboundMessage, UIState } from '../../types'; @@ -41,6 +42,7 @@ function formatTranscriptEntry(entry: ParsedEntry): string { export function TerminalPassthrough({ sessionId, status }: TerminalPassthroughProps) { const token = useStore((s: AppState) => s.token); + const addToast = useToastStore((s) => s.addToast); const terminalRef = useRef(null); const xtermRef = useRef(null); const fitAddonRef = useRef(null); @@ -51,6 +53,7 @@ export function TerminalPassthrough({ sessionId, status }: TerminalPassthroughPr // Message state const [messages, setMessages] = useState([]); const [loadingMessages, setLoadingMessages] = useState(true); + const [fetchError, setFetchError] = useState(null); const [filters, setFilters] = useState({ thinking: false, tool_use: true, @@ -95,6 +98,14 @@ export function TerminalPassthrough({ sessionId, status }: TerminalPassthroughPr : msgs; setMessages(capped); seenKeys.current = new Set(capped.map(dedupKey)); + setFetchError(null); + } + }) + .catch((err) => { + if (!cancelled) { + const message = err instanceof Error ? err.message : String(err); + setFetchError(message); + addToast('error', 'Failed to load session messages', message); } }) .finally(() => { @@ -102,7 +113,7 @@ export function TerminalPassthrough({ sessionId, status }: TerminalPassthroughPr }); return () => { cancelled = true; }; - }, [sessionId]); + }, [sessionId, addToast]); // Subscribe to SSE for real-time message updates useEffect(() => { @@ -398,6 +409,13 @@ export function TerminalPassthrough({ sessionId, status }: TerminalPassthroughPr )} + {/* Message fetch error banner */} + {fetchError && ( +
+ Failed to load session messages: {fetchError} +
+ )} + {/* Terminal */}