diff --git a/ROADMAP.md b/ROADMAP.md index 6be4af6..1cbb110 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -4,6 +4,7 @@ ## Completed +- [x] Display cost summary in dashboard stats bar (Overall$) and session cards - [x] Add comprehensive end-to-end tests for dashboard - [x] Auto-set npm version from release tag in CI publish workflow - [x] Optimize dashboard refresh performance (>500ms to ~140ms) diff --git a/src/dashboard/routes/page-route.ts b/src/dashboard/routes/page-route.ts index 3b24652..8d7a2ef 100644 --- a/src/dashboard/routes/page-route.ts +++ b/src/dashboard/routes/page-route.ts @@ -20,6 +20,7 @@ export function createPageRoute( const directories = sessionStats.getDistinctDirectories(); const sessions = sessionStats.getSessionStats(dirFilter); const summary = dailyTokens.getTokenSummary(); + const costSummary = dailyTokens.getCostSummary(); const daily = dailyTokens.getDailyTokens(); const dailyModel = dailyTokens.getDailyTokensByModel(); const toolGroups = repos.toolCalls.getToolUsageSummary(); @@ -27,6 +28,7 @@ export function createPageRoute( renderHTML( sessions, summary, + costSummary, daily, dailyModel, toolGroups, diff --git a/src/dashboard/routes/stats-route.ts b/src/dashboard/routes/stats-route.ts index 7c181e2..592cf28 100644 --- a/src/dashboard/routes/stats-route.ts +++ b/src/dashboard/routes/stats-route.ts @@ -43,12 +43,14 @@ export function createStatsRoute( const directories = sessionStats.getDistinctDirectories(); const sessions = sessionStats.getSessionStats(dirFilter); const summary = dailyTokens.getTokenSummary(); + const costSummary = dailyTokens.getCostSummary(); const daily = dailyTokens.getDailyTokens(); const dailyModel = dailyTokens.getDailyTokensByModel(); const toolGroups = repos.toolCalls.getToolUsageSummary(); const html = renderSessionsFragment( sessions, summary, + costSummary, daily, dailyModel, toolGroups, diff --git a/src/dashboard/services/daily-tokens-service.ts b/src/dashboard/services/daily-tokens-service.ts index ef15b0b..13ab900 100644 --- a/src/dashboard/services/daily-tokens-service.ts +++ b/src/dashboard/services/daily-tokens-service.ts @@ -1,4 +1,5 @@ import type { + CostSummary, DailyModelTokens, TokenSummary, } from "../../db/message/message-repo"; @@ -9,6 +10,7 @@ export interface DailyTokensService { getDailyTokens(): DailyTokens[]; getDailyTokensByModel(): DailyModelTokens[]; getTokenSummary(): TokenSummary; + getCostSummary(): CostSummary; } export function createDailyTokensService(repos: Repos): DailyTokensService { @@ -39,5 +41,9 @@ export function createDailyTokensService(repos: Repos): DailyTokensService { getTokenSummary(): TokenSummary { return repos.messages.getTokenSummary(); }, + + getCostSummary(): CostSummary { + return repos.messages.getCostSummary(); + }, }; } diff --git a/src/dashboard/templates/formatters.ts b/src/dashboard/templates/formatters.ts index da13b9e..9259342 100644 --- a/src/dashboard/templates/formatters.ts +++ b/src/dashboard/templates/formatters.ts @@ -22,6 +22,12 @@ export function fmt(n: number): string { return n.toLocaleString("de-DE"); } +export function fmtCost(n: number): string { + if (n <= 0) return "$0.00"; + if (n < 0.01) return `$${n.toFixed(4)}`; + return `$${n.toFixed(2)}`; +} + export function renderTokens( input: number, cache: number, diff --git a/src/dashboard/templates/page-template.ts b/src/dashboard/templates/page-template.ts index 967ea59..2bcdeb4 100644 --- a/src/dashboard/templates/page-template.ts +++ b/src/dashboard/templates/page-template.ts @@ -1,4 +1,5 @@ import type { + CostSummary, DailyModelTokens, TokenSummary, } from "../../db/message/message-repo"; @@ -83,6 +84,7 @@ export const CLIENT_SCRIPT = ` export function renderHTML( sessions: SessionStats[], summary: TokenSummary, + costSummary: CostSummary, daily: DailyTokens[], dailyModel: DailyModelTokens[], toolGroups: ToolGroupSummary[], @@ -107,7 +109,7 @@ export function renderHTML(