diff --git a/src/components/codex/CodexSessionManager.tsx b/src/components/codex/CodexSessionManager.tsx index f38d2c1a..ad6a8cb5 100644 --- a/src/components/codex/CodexSessionManager.tsx +++ b/src/components/codex/CodexSessionManager.tsx @@ -94,6 +94,30 @@ function formatTokenStats(stats?: CodexSessionTokenStats): string { return ''; } +function formatGroupTokenStats( + sessionIds: string[], + tokenStatsBySessionId: SessionTokenStatsMap, +): string { + let totalInput = 0; + let totalOutput = 0; + let hasAnyData = false; + + for (const id of sessionIds) { + const stats = tokenStatsBySessionId[id]; + if (stats) { + hasAnyData = true; + totalInput += stats.inputTokens; + totalOutput += stats.outputTokens; + } + } + + if (!hasAnyData) { + return ''; + } + + return `${formatLargeNumber(totalInput)} / ${formatLargeNumber(totalOutput)} tokens`; +} + export function CodexSessionManager() { const { t, i18n } = useTranslation(); const instances = useCodexInstanceStore((state) => state.instances); @@ -564,6 +588,7 @@ export function CodexSessionManager() { const allSelected = groupSessionIds.every((id) => selectedIdSet.has(id)); const isExpanded = expandedGroups.includes(group.cwd); const isTokenStatsLoading = loadingTokenGroupSet.has(group.cwd); + const groupTokenText = formatGroupTokenStats(groupSessionIds, tokenStatsBySessionId); return (
@@ -596,9 +621,20 @@ export function CodexSessionManager() { {resolveGroupLabel(group.cwd)}
- - {formatRelativeTime(group.latestUpdatedAt, isZh)} - +
+ {groupTokenText ? ( + + {groupTokenText} + + ) : isTokenStatsLoading ? ( + + + + ) : null} + + {formatRelativeTime(group.latestUpdatedAt, isZh)} + +
{isExpanded ? (
diff --git a/src/styles/pages/codex.css b/src/styles/pages/codex.css index 86552299..b47e4e9e 100644 --- a/src/styles/pages/codex.css +++ b/src/styles/pages/codex.css @@ -5487,6 +5487,20 @@ flex-shrink: 0; } +.codex-session-folder__right { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; +} + +.codex-session-folder__tokens { + font-size: 11px; + color: var(--text-muted); + white-space: nowrap; + opacity: 0.85; +} + .codex-session-folder__children { margin-left: 44px; }