Skip to content

Commit bfa9bb2

Browse files
committed
feat(tui): add all-time stats and rename context label
1 parent 9535c43 commit bfa9bb2

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

tui/data/context.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
loadPruneMap,
1111
loadPruneMessagesState,
1212
} from "../../lib/state/utils"
13+
import { loadAllSessionStats } from "../../lib/state/persistence"
1314
import { analyzeTokens, emptyBreakdown } from "../../lib/analysis/tokens"
1415
import type { DcpContextSnapshot, DcpTuiClient } from "../shared/types"
1516

@@ -44,6 +45,7 @@ export const createPlaceholderContextSnapshot = (
4445
activeBlockTopicTotal: 0,
4546
},
4647
messageStatuses: [],
48+
allTimeStats: { totalTokensSaved: 0, sessionCount: 0 },
4749
notes,
4850
loadedAt: Date.now(),
4951
})
@@ -90,7 +92,10 @@ const loadContextSnapshot = async (
9092
})
9193

9294
const { state, persisted } = await buildState(sessionID, messages)
93-
const { breakdown, messageStatuses } = analyzeTokens(state, messages)
95+
const [{ breakdown, messageStatuses }, aggregated] = await Promise.all([
96+
Promise.resolve(analyzeTokens(state, messages)),
97+
loadAllSessionStats(logger),
98+
])
9499

95100
const allTopics = Array.from(state.prune.messages.activeBlockIds)
96101
.map((blockID) => state.prune.messages.blocksById.get(blockID))
@@ -121,6 +126,10 @@ const loadContextSnapshot = async (
121126
lastUpdated: persisted?.lastUpdated,
122127
},
123128
messageStatuses,
129+
allTimeStats: {
130+
totalTokensSaved: aggregated.totalTokens,
131+
sessionCount: aggregated.sessionCount,
132+
},
124133
notes,
125134
loadedAt: Date.now(),
126135
}

tui/shared/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,17 @@ export interface DcpPersistedSummary {
3737
lastUpdated?: string
3838
}
3939

40+
export interface DcpAllTimeStats {
41+
totalTokensSaved: number
42+
sessionCount: number
43+
}
44+
4045
export interface DcpContextSnapshot {
4146
sessionID?: string
4247
breakdown: DcpContextBreakdown
4348
persisted: DcpPersistedSummary
4449
messageStatuses: DcpMessageStatus[]
50+
allTimeStats: DcpAllTimeStats
4551
notes: string[]
4652
loadedAt: number
4753
}

tui/slots/sidebar-top.tsx

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ const CONTENT_WIDTH = 9 + 1 + 4 + 2 + BAR_WIDTH + 2 + 5
2020
const REFRESH_DEBOUNCE_MS = 100
2121

2222
const compactTokenCount = (value: number): string => {
23+
if (value >= 1_000_000) {
24+
const m = (value / 1_000_000).toFixed(2)
25+
return `${m}M`
26+
}
2327
if (value >= 100_000) return `${Math.round(value / 1000)}K`
2428
if (value >= 1_000) {
2529
const k = (value / 1000).toFixed(1)
@@ -458,7 +462,7 @@ const SidebarContext = (props: {
458462
/>
459463
<SummaryRow
460464
palette={props.palette}
461-
label="Context"
465+
label="Current Context"
462466
value={`~${compactTokenCount(snapshot().breakdown.total)}`}
463467
tone="accent"
464468
swatch={props.palette.accent}
@@ -528,6 +532,26 @@ const SidebarContext = (props: {
528532
<text fg={props.palette.muted}>{fallbackNote()}</text>
529533
) : null}
530534
</box>
535+
536+
{snapshot().allTimeStats.sessionCount > 0 && (
537+
<box width="100%" flexDirection="column" paddingTop={1}>
538+
<text fg={props.palette.text}>
539+
<b>All Time</b>
540+
</text>
541+
<SummaryRow
542+
palette={props.palette}
543+
label="Tokens Saved"
544+
value={`~${compactTokenCount(snapshot().allTimeStats.totalTokensSaved)}`}
545+
tone="accent"
546+
/>
547+
<SummaryRow
548+
palette={props.palette}
549+
label="Sessions"
550+
value={`${snapshot().allTimeStats.sessionCount}`}
551+
tone="accent"
552+
/>
553+
</box>
554+
)}
531555
</box>
532556
)
533557
}

0 commit comments

Comments
 (0)