From 9d25e6120c3b11e22be79f5294612381dc98f138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Thu, 8 Oct 2026 21:54:38 +0800 Subject: [PATCH] feat(desktop): order the token usage page usage, activity, then models The per-model table moves below the activity heatmap and insights under its own "Usage by model" heading. --- desktop/src/i18n/locales/en.ts | 1 + desktop/src/i18n/locales/jp.ts | 1 + desktop/src/i18n/locales/kr.ts | 1 + desktop/src/i18n/locales/zh-TW.ts | 1 + desktop/src/i18n/locales/zh.ts | 1 + desktop/src/pages/ActivitySettings.test.tsx | 16 ++++++ desktop/src/pages/ActivitySettings.tsx | 58 +++++++++++---------- 7 files changed, 51 insertions(+), 28 deletions(-) diff --git a/desktop/src/i18n/locales/en.ts b/desktop/src/i18n/locales/en.ts index 5e0ef1fb..5e42b6e8 100644 --- a/desktop/src/i18n/locales/en.ts +++ b/desktop/src/i18n/locales/en.ts @@ -1197,6 +1197,7 @@ Row 9, all 8 cells: continuing from straight down, turning left through lower-le 'settings.activity.messages': 'Messages', 'settings.activity.tools': 'Tools', 'settings.activity.activityInsights': 'Activity insights', + 'settings.activity.modelUsage': 'Usage by model', 'settings.activity.activeRate': 'Active rate', 'settings.activity.mostUsedModel': 'Most used model', 'settings.activity.exploredSkills': 'Skills explored', diff --git a/desktop/src/i18n/locales/jp.ts b/desktop/src/i18n/locales/jp.ts index 91ea7aba..88c3ffc7 100644 --- a/desktop/src/i18n/locales/jp.ts +++ b/desktop/src/i18n/locales/jp.ts @@ -1198,6 +1198,7 @@ export const jp: Record = { 'settings.activity.messages': 'メッセージ', 'settings.activity.tools': 'ツール', 'settings.activity.activityInsights': 'アクティビティ分析', + 'settings.activity.modelUsage': 'モデル別の使用量', 'settings.activity.activeRate': 'アクティブ率', 'settings.activity.mostUsedModel': '最も使ったモデル', 'settings.activity.exploredSkills': '使用したスキル', diff --git a/desktop/src/i18n/locales/kr.ts b/desktop/src/i18n/locales/kr.ts index 311b760c..0d14cece 100644 --- a/desktop/src/i18n/locales/kr.ts +++ b/desktop/src/i18n/locales/kr.ts @@ -1200,6 +1200,7 @@ export const kr: Record = { 'settings.activity.messages': '메시지', 'settings.activity.tools': '도구', 'settings.activity.activityInsights': '활동 인사이트', + 'settings.activity.modelUsage': '모델별 사용량', 'settings.activity.activeRate': '활성 비율', 'settings.activity.mostUsedModel': '가장 많이 쓴 모델', 'settings.activity.exploredSkills': '사용한 스킬', diff --git a/desktop/src/i18n/locales/zh-TW.ts b/desktop/src/i18n/locales/zh-TW.ts index dd258043..4f990439 100644 --- a/desktop/src/i18n/locales/zh-TW.ts +++ b/desktop/src/i18n/locales/zh-TW.ts @@ -1197,6 +1197,7 @@ export const zh: Record = { 'settings.activity.messages': '訊息', 'settings.activity.tools': '工具', 'settings.activity.activityInsights': '活動洞察', + 'settings.activity.modelUsage': '模型用量', 'settings.activity.activeRate': '活躍率', 'settings.activity.mostUsedModel': '最常用模型', 'settings.activity.exploredSkills': '已使用的技能', diff --git a/desktop/src/i18n/locales/zh.ts b/desktop/src/i18n/locales/zh.ts index c120af9b..3b1447ca 100644 --- a/desktop/src/i18n/locales/zh.ts +++ b/desktop/src/i18n/locales/zh.ts @@ -1196,6 +1196,7 @@ export const zh: Record = { 'settings.activity.messages': '消息', 'settings.activity.tools': '工具', 'settings.activity.activityInsights': '活动洞察', + 'settings.activity.modelUsage': '模型用量', 'settings.activity.activeRate': '活跃率', 'settings.activity.mostUsedModel': '最常用模型', 'settings.activity.exploredSkills': '已使用的技能', diff --git a/desktop/src/pages/ActivitySettings.test.tsx b/desktop/src/pages/ActivitySettings.test.tsx index e3cb31d6..7df91fa3 100644 --- a/desktop/src/pages/ActivitySettings.test.tsx +++ b/desktop/src/pages/ActivitySettings.test.tsx @@ -412,6 +412,22 @@ describe('ActivitySettings', () => { ]) }) + it('orders the page usage, then activity, then the per-model breakdown', async () => { + render() + + await flushActivityLoad() + + const usage = screen.getByRole('list', { name: 'Token usage by day' }) + const activity = screen.getByRole('heading', { name: 'Token Activity' }) + const insights = screen.getByRole('heading', { name: 'Activity insights' }) + const models = screen.getByRole('heading', { name: 'Usage by model' }) + const follows = (a: Node, b: Node) => Boolean(a.compareDocumentPosition(b) & Node.DOCUMENT_POSITION_FOLLOWING) + expect(follows(usage, activity)).toBe(true) + expect(follows(activity, insights)).toBe(true) + expect(follows(insights, models)).toBe(true) + expect(follows(models, screen.getByRole('table'))).toBe(true) + }) + it('supports localized heatmap mode switches and persisted display name edits', async () => { useSettingsStore.setState({ locale: 'zh' }) render() diff --git a/desktop/src/pages/ActivitySettings.tsx b/desktop/src/pages/ActivitySettings.tsx index 731c8131..01aa2417 100644 --- a/desktop/src/pages/ActivitySettings.tsx +++ b/desktop/src/pages/ActivitySettings.tsx @@ -1001,34 +1001,6 @@ export function ActivitySettings() { )} - {!isLoading && !error && hasUsage && modelRows.length > 0 && ( - -
- {t('settings.agents.model')} - {t('settings.activity.freshTokens')} - {t('settings.activity.cachedTokens')} - {t('settings.activity.estimatedCost')} -
- {modelRows.map((row) => ( -
- {row.model} - {formatTokens(row.fresh)} - {formatTokens(row.cached)} - - {row.unpriced ? — : formatCostUSD(row.costUSD, locale)} - -
- ))} -
- )} - + {modelRows.length > 0 && ( + + +
+ {t('settings.agents.model')} + {t('settings.activity.freshTokens')} + {t('settings.activity.cachedTokens')} + {t('settings.activity.estimatedCost')} +
+ {modelRows.map((row) => ( +
+ {row.model} + {formatTokens(row.fresh)} + {formatTokens(row.cached)} + + {row.unpriced ? — : formatCostUSD(row.costUSD, locale)} + +
+ ))} +
+
+ )} + {topPluginItems.length > 0 && (