Skip to content

Commit 5d895ae

Browse files
rajbosCopilot
andcommitted
feat: show actual tokens in log viewer header for CLI sessions
Add session-level actual token count to SessionLogData so the log viewer can display it in the header when per-turn actual data is unavailable (e.g. Copilot CLI sessions where actual totals come from session.shutdown rather than individual turn events). - types.ts: add actualTokens? to SessionLogData - extension.ts: populate actualTokens from cache in getSessionLogData - logviewer/main.ts: add actualTokens? to local type; show '✅ Actual Tokens' card when hasSessionActualOnly (CLI sessions); also rename per-turn actual card label to '✅ Actual Tokens' for consistency Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 14fce65 commit 5d895ae

3 files changed

Lines changed: 20 additions & 3 deletions

File tree

vscode-extension/src/extension.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4319,6 +4319,8 @@ class CopilotTokenTracker implements vscode.Disposable {
43194319
this.warn(`Error loading usage analysis for ${sessionFile}: ${usageError}`);
43204320
}
43214321

4322+
const sessionCache = this.getCachedSessionData(sessionFile);
4323+
43224324
return {
43234325
file: details.file,
43244326
title: details.title || null,
@@ -4331,7 +4333,8 @@ class CopilotTokenTracker implements vscode.Disposable {
43314333
firstInteraction: details.firstInteraction,
43324334
lastInteraction: details.lastInteraction,
43334335
turns,
4334-
usageAnalysis
4336+
usageAnalysis,
4337+
actualTokens: sessionCache?.actualTokens || 0
43354338
};
43364339
}
43374340

vscode-extension/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,8 @@ export interface SessionLogData {
372372
lastInteraction: string | null;
373373
turns: ChatTurn[];
374374
usageAnalysis?: SessionUsageAnalysis;
375+
/** Session-level actual token count from LLM API (e.g. session.shutdown in CLI format). 0 when unavailable. */
376+
actualTokens?: number;
375377
}
376378

377379
// Local summary type for customization files (mirrors webview/shared/contextRefUtils.ts)

vscode-extension/src/webview/logviewer/main.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Log Viewer webview - displays session file details and chat turns
1+
// Log Viewer webview - displays session file details and chat turns
22
import { ContextReferenceUsage, getTotalContextRefs, getImplicitContextRefs, getExplicitContextRefs, getContextRefsSummary } from '../shared/contextRefUtils';
33
import { formatCompact, setCompactNumbers } from '../shared/formatUtils';
44
// CSS imported as text via esbuild
@@ -60,6 +60,8 @@ type SessionLogData = {
6060
lastInteraction: string | null;
6161
turns: ChatTurn[];
6262
usageAnalysis?: SessionUsageAnalysis;
63+
/** Session-level actual token count from LLM API (e.g. CLI session.shutdown). 0 when unavailable. */
64+
actualTokens?: number;
6365
compactNumbers?: boolean;
6466
};
6567

@@ -561,6 +563,10 @@ function renderLayout(data: SessionLogData): void {
561563
const actualPromptTotal = turnsWithActual.reduce((s, t) => s + (t.actualUsage?.promptTokens || 0), 0);
562564
const actualCompletionTotal = turnsWithActual.reduce((s, t) => s + (t.actualUsage?.completionTokens || 0), 0);
563565
const actualTotal = actualPromptTotal + actualCompletionTotal;
566+
567+
// Session-level actual tokens (from session.shutdown in CLI sessions) when no per-turn data
568+
const sessionActualTokens = data.actualTokens || 0;
569+
const hasSessionActualOnly = !hasAnyActualUsage && sessionActualTokens > 0;
564570

565571
// Aggregate prompt breakdown across all turns
566572
const aggregatedBreakdown: { [key: string]: { category: string; label: string; totalTokens: number; totalPct: number; count: number } } = {};
@@ -624,10 +630,16 @@ function renderLayout(data: SessionLogData): void {
624630
</div>
625631
${hasAnyActualUsage ? `
626632
<div class="summary-card actual-usage-card">
627-
<div class="summary-label">📊 Actual Tokens</div>
633+
<div class="summary-label"> Actual Tokens</div>
628634
<div class="summary-value">${formatCompact(actualTotal)}</div>
629635
<div class="summary-sub">↑${formatCompact(actualPromptTotal)} prompt, ↓${formatCompact(actualCompletionTotal)} completion</div>
630636
</div>
637+
` : hasSessionActualOnly ? `
638+
<div class="summary-card actual-usage-card">
639+
<div class="summary-label">✅ Actual Tokens</div>
640+
<div class="summary-value">${formatCompact(sessionActualTokens)}</div>
641+
<div class="summary-sub">Total from session shutdown event</div>
642+
</div>
631643
` : ''}
632644
${totalThinkingTokens > 0 ? `<div class="summary-card">
633645
<div class="summary-label">🧠 Thinking Tokens</div>

0 commit comments

Comments
 (0)