+ {/* Total messages */}
+
+ Messages
+ {summary.totalMessages}
+
+
+ {/* Per-role breakdown */}
+ {roles.length > 0 && (
+
+
By role
+
+ {roles.map(([role, count]) => (
+
+ {role}{' '}{count}
+
+ ))}
+
+
+ )}
+
+ {/* Status */}
+
+ Status
+
+ {STATUS_LABELS[summary.status] ?? summary.status}
+
+
+ {/* Session age */}
+
+ Age
+ {formatTimeAgo(summary.createdAt)}
+
+
+ );
+}
diff --git a/dashboard/src/hooks/useSessionPolling.ts b/dashboard/src/hooks/useSessionPolling.ts
index bf02cd21..d0e4131f 100644
--- a/dashboard/src/hooks/useSessionPolling.ts
+++ b/dashboard/src/hooks/useSessionPolling.ts
@@ -1,10 +1,11 @@
-import { useState, useEffect, useRef, useCallback } from 'react';
-import type { SessionInfo, SessionHealth, SessionMetrics } from '../types';
+import { useState, useEffect, useRef, useCallback } from 'react';
+import type { SessionInfo, SessionHealth, SessionMetrics, SessionSummary } from '../types';
import {
getSession,
getSessionHealth,
getSessionPane,
getSessionMetrics,
+ getSessionSummary,
subscribeSSE,
} from '../api/client';
import { useStore } from '../store/useStore';
@@ -24,6 +25,8 @@ interface UseSessionPollingReturn {
paneLoading: boolean;
metrics: SessionMetrics | null;
metricsLoading: boolean;
+ summary: SessionSummary | null;
+ summaryLoading: boolean;
refetchPaneAndMetrics: () => void;
}
@@ -45,6 +48,10 @@ export function useSessionPolling(sessionId: string): UseSessionPollingReturn {
const [metrics, setMetrics] = useState