Skip to content

Commit 3a5e8b8

Browse files
committed
feat: surface max mode % in overview table and fix badge detection
Add max_mode_pct to dashboard rankedUsers query and RankedUser type. Enrich $/req tooltip in members table with max mode percentage. Fix deep-thinker and premium-model badge logic to use actual max_mode flag from usage_events instead of just matching model name for '-max'. This catches users like Moshik who enable max mode on standard models. Made-with: Cursor
1 parent da791f2 commit 3a5e8b8

3 files changed

Lines changed: 25 additions & 7 deletions

File tree

src/components/dashboard/members-table.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,10 @@ export function MembersTable({
467467
const color =
468468
cpr > 5 ? "text-red-400" : cpr > 2 ? "text-amber-400" : "text-zinc-400";
469469
return (
470-
<span className={color} title={`$${cpr.toFixed(2)} per request`}>
470+
<span
471+
className={color}
472+
title={`$${cpr.toFixed(2)} per request${row.max_mode_pct > 0 ? ` (${row.max_mode_pct}% max mode)` : ""}`}
473+
>
471474
${cpr.toFixed(2)}
472475
</span>
473476
);

src/lib/data/sqlite.ts

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -948,9 +948,11 @@ export function getFullDashboard(days: number = 7): FullDashboard {
948948
GROUP BY user_email
949949
),
950950
user_cache AS (
951-
SELECT user_email as email, ROUND(AVG(cache_read_tokens)) as avg_cache_read
951+
SELECT user_email as email,
952+
ROUND(AVG(CASE WHEN cache_read_tokens > 0 THEN cache_read_tokens END)) as avg_cache_read,
953+
ROUND(100.0 * SUM(CASE WHEN max_mode = 1 THEN 1 ELSE 0 END) / COUNT(*)) as max_mode_pct
952954
FROM usage_events
953-
WHERE date(timestamp/1000, 'unixepoch') >= date('now', ?) AND cache_read_tokens > 0
955+
WHERE date(timestamp/1000, 'unixepoch') >= date('now', ?)
954956
GROUP BY user_email
955957
),
956958
activity AS (
@@ -980,6 +982,7 @@ export function getFullDashboard(days: number = 7): FullDashboard {
980982
COALESCE(a.total_applies, 0) as total_applies,
981983
COALESCE(a.total_accepts, 0) as total_accepts,
982984
COALESCE(uc.avg_cache_read, 0) as avg_cache_read,
985+
COALESCE(uc.max_mode_pct, 0) as max_mode_pct,
983986
RANK() OVER (ORDER BY COALESCE(us.spend_cents, 0) DESC) as spend_rank,
984987
RANK() OVER (ORDER BY COALESCE(a.agent_requests, 0) DESC) as activity_rank
985988
FROM members m
@@ -1025,6 +1028,7 @@ export function getFullDashboard(days: number = 7): FullDashboard {
10251028
COALESCE(a.total_applies, 0) as total_applies,
10261029
COALESCE(a.total_accepts, 0) as total_accepts,
10271030
0 as avg_cache_read,
1031+
0 as max_mode_pct,
10281032
RANK() OVER (ORDER BY COALESCE(us.spend_cents, 0) DESC) as spend_rank,
10291033
RANK() OVER (ORDER BY COALESCE(a.agent_requests, 0) DESC) as activity_rank
10301034
FROM members m
@@ -1050,6 +1054,7 @@ export function getFullDashboard(days: number = 7): FullDashboard {
10501054
total_applies: number;
10511055
total_accepts: number;
10521056
avg_cache_read: number;
1057+
max_mode_pct: number;
10531058
spend_rank: number;
10541059
activity_rank: number;
10551060
}>;
@@ -1214,6 +1219,7 @@ function assignBadges(
12141219
total_applies: number;
12151220
total_accepts: number;
12161221
avg_cache_read: number;
1222+
max_mode_pct: number;
12171223
spend_rank: number;
12181224
activity_rank: number;
12191225
}>,
@@ -1261,7 +1267,7 @@ function assignBadges(
12611267
usage_badge = "light-user";
12621268
} else {
12631269
const reqsPerDay = u.active_days > 0 ? u.agent_requests / u.active_days : 0;
1264-
const usesMax = isMaxModel(u.most_used_model);
1270+
const usesMax = u.max_mode_pct > 50 || isMaxModel(u.most_used_model);
12651271

12661272
if (usesMax) {
12671273
usage_badge = "deep-thinker";
@@ -1278,7 +1284,7 @@ function assignBadges(
12781284

12791285
if (overBudget) {
12801286
spend_badge = "over-budget";
1281-
} else if (isMaxModel(u.most_used_model) && medianCpr > 0 && cpr > medianCpr * 3) {
1287+
} else if ((u.max_mode_pct > 50 || isMaxModel(u.most_used_model)) && medianCpr > 0 && cpr > medianCpr * 3) {
12821288
spend_badge = "premium-model";
12831289
} else if (u.agent_requests >= p80Reqs && medianCpr > 0 && cpr <= medianCpr * 0.5) {
12841290
spend_badge = "cost-efficient";
@@ -1362,6 +1368,14 @@ export function getUserBadges(
13621368
)
13631369
.get(email, dateFilter) as { spend_cents: number };
13641370

1371+
const maxModeRow = db
1372+
.prepare(
1373+
`SELECT ROUND(100.0 * SUM(CASE WHEN max_mode = 1 THEN 1 ELSE 0 END) / COUNT(*)) as pct
1374+
FROM usage_events WHERE user_email = ? AND date(timestamp/1000, 'unixepoch') >= date('now', ?)`,
1375+
)
1376+
.get(email, dateFilter) as { pct: number | null };
1377+
const userMaxModePct = maxModeRow?.pct ?? 0;
1378+
13651379
const teamStats = db
13661380
.prepare(
13671381
`SELECT email, SUM(agent_requests) as reqs, COALESCE(us.spend, 0) as spend
@@ -1395,7 +1409,7 @@ export function getUserBadges(
13951409
usage = "light-user";
13961410
} else {
13971411
const reqsPerDay = userRow.active_days > 0 ? userRow.agent_requests / userRow.active_days : 0;
1398-
const usesMax = isMaxModel(userRow.most_used_model);
1412+
const usesMax = userMaxModePct > 50 || isMaxModel(userRow.most_used_model);
13991413
if (usesMax) usage = "deep-thinker";
14001414
else if (reqsPerDay >= 80) usage = "power-user";
14011415
else usage = null;
@@ -1406,7 +1420,7 @@ export function getUserBadges(
14061420
const cpr = spendRow.spend_cents / userRow.agent_requests;
14071421
if (spendRow.spend_cents > medianSpend * 5 && spendRow.spend_cents > 10000) {
14081422
spend = "over-budget";
1409-
} else if (isMaxModel(userRow.most_used_model) && medianCpr > 0 && cpr > medianCpr * 3) {
1423+
} else if ((userMaxModePct > 50 || isMaxModel(userRow.most_used_model)) && medianCpr > 0 && cpr > medianCpr * 3) {
14101424
spend = "premium-model";
14111425
} else if (userRow.agent_requests >= p80Reqs && medianCpr > 0 && cpr <= medianCpr * 0.5) {
14121426
spend = "cost-efficient";

src/lib/data/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface RankedUser {
2828
total_applies: number;
2929
total_accepts: number;
3030
avg_cache_read: number;
31+
max_mode_pct: number;
3132
usage_badge: UsageBadge | null;
3233
spend_badge: SpendBadge | null;
3334
context_badge: ContextBadge | null;

0 commit comments

Comments
 (0)