style: compact dashboard token usage subtitle

This commit is contained in:
Sycun committed 2026-10-11 23:58:41 +08:00
1 parent 4eda42dc10
commit 5d14daf486
8 files changed
+11 -19

No files matched your search

-2
View File
@@ -47221,8 +47221,6 @@ html[data-theme="dark"] { --tool-blocked-color: #f4bc62; }
}
/* Provider-reported token analysis, scoped by the dashboard project selector. */
.dashboard-kpi-sub--tokens { row-gap: 2px; }
#dashboard-kpi-token-cache-text { flex-basis: 100%; }
.token-usage-panel { margin-bottom: 20px; padding: 18px 22px; }
.token-usage-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.token-usage-toolbar { display: flex; align-items: center; gap: 12px; margin-top: 18px; }
+1 -1
View File
@@ -288,7 +288,7 @@
"successRate": "Tool success rate",
"tokenUsage": "Token usage",
"usageCacheHitRate": "Cache hit {{rate}}",
"tokenUsageSub": "Last {{days}} days: {{calls}} calls · Today {{today}}",
"tokenUsageSub": "Today {{today}} · Cache hit {{rate}}",
"noTokenUsageYet": "No usage yet",
"clickToViewTasks": "Click to view tasks",
"clickToViewChat": "Click to view conversations",
+1 -1
View File
@@ -288,7 +288,7 @@
"successRate": "Успешность инструментов",
"tokenUsage": "Расход токенов",
"usageCacheHitRate": "Попадания в кэш {{rate}}",
"tokenUsageSub": "За {{days}} дней {{calls}} вызовов · сегодня {{today}}",
"tokenUsageSub": "Сегодня {{today}} · Кэш {{rate}}",
"noTokenUsageYet": "Расхода пока нет",
"clickToViewTasks": "Открыть задачи",
"clickToViewChat": "Открыть диалоги",
+1 -1
View File
@@ -288,7 +288,7 @@
"successRate": "工具执行成功率",
"tokenUsage": "Token 用量",
"usageCacheHitRate": "缓存命中 {{rate}}",
"tokenUsageSub": "近 {{days}} 天 {{calls}} 次调用 · 今日 {{today}}",
"tokenUsageSub": "今日 {{today}} · 缓存命中 {{rate}}",
"noTokenUsageYet": "暂无用量",
"clickToViewTasks": "点击查看任务管理",
"clickToViewChat": "点击查看对话",
+2 -8
View File
@@ -72,7 +72,6 @@ async function refreshDashboard() {
setKpiSubText('dashboard-kpi-tools-sub-text', '…');
setKpiSubText('dashboard-kpi-rate-sub-text', '…');
setKpiSubText('dashboard-kpi-token-sub-text', '…');
setKpiSubText('dashboard-kpi-token-cache-text', '…');
hideEl('dashboard-kpi-vuln-critical-badge');
hideEl('dashboard-alert-banner');
setRecentVulnsLoading();
@@ -443,7 +442,6 @@ async function refreshDashboard() {
setEl('dashboard-kpi-tools-calls', '-');
setEl('dashboard-kpi-token-usage', '-');
setKpiSubText('dashboard-kpi-token-sub-text', '-');
setKpiSubText('dashboard-kpi-token-cache-text', '-');
setKpiSubText('dashboard-kpi-tasks-sub-text', '-');
setKpiSubText('dashboard-kpi-vuln-sub-text', '-');
setKpiSubText('dashboard-kpi-tools-sub-text', '-');
@@ -715,13 +713,10 @@ function renderDashboardTokenUsage(res) {
if (!summary) {
setEl('dashboard-kpi-token-usage', '-');
setKpiSubText('dashboard-kpi-token-sub-text', '-');
setKpiSubText('dashboard-kpi-token-cache-text', '-');
return;
}
const cacheRate = tokenUsageCacheRate(summary);
setKpiSubText('dashboard-kpi-token-cache-text', dt('dashboard.usageCacheHitRate', { rate: cacheRate }, '缓存命中 ' + cacheRate));
const total = Number(summary.totalTokens || 0);
const calls = Number(summary.modelCalls || 0);
const today = res && res.today ? Number(res.today.totalTokens || 0) : 0;
if (!Number.isFinite(total) || total <= 0) {
setEl('dashboard-kpi-token-usage', '0');
@@ -731,10 +726,9 @@ function renderDashboardTokenUsage(res) {
setEl('dashboard-kpi-token-usage', formatTokenUsageCompact(total));
setKpiSubText('dashboard-kpi-token-sub-text',
dt('dashboard.tokenUsageSub', {
days: 7,
today: formatTokenUsageCompact(today),
calls: Number.isFinite(calls) ? calls : 0
}, '近 7 天 ' + (Number.isFinite(calls) ? calls : 0) + ' 次调用 · 今日 ' + formatTokenUsageCompact(today)));
rate: cacheRate
}, '今日 ' + formatTokenUsageCompact(today) + ' · 缓存命中 ' + cacheRate));
}
function formatTokenUsageCompact(num) {
+2 -1
View File
@@ -75,7 +75,8 @@ test('all supported languages expose usage labels and interpolation placeholders
for (const key of ['usageView', 'usageScope', 'usageCacheRead', 'usageCacheWrite', 'usageTrend', 'usageCacheHitRate']) assert.ok(data.dashboard[key]);
assert.ok(data.settings.nav.tokenUsage);
assert.match(data.dashboard.usageCacheHitRate, /\{\{rate\}\}/);
assert.match(data.dashboard.tokenUsageSub, /\{\{days\}\}/);
assert.match(data.dashboard.tokenUsageSub, /\{\{today\}\}/);
assert.match(data.dashboard.tokenUsageSub, /\{\{rate\}\}/);
assert.match(data.chat.turnTokenUsageTitle, /\{\{cacheWrite\}\}/);
}
});
+3 -4
View File
@@ -39,7 +39,7 @@
}
})();
</script>
<link rel="stylesheet" href="/static/css/style.css?v=20261011-token-settings">
<link rel="stylesheet" href="/static/css/style.css?v=20261011-token-settings-compact">
<link rel="stylesheet" href="/static/css/tool-guard.css?v=20260907-7">
<link rel="stylesheet" href="/static/css/chat-plan-progress.css?v=20260813-4">
<link rel="stylesheet" href="/static/css/c2.css">
@@ -562,9 +562,8 @@
<span class="dashboard-kpi-icon dashboard-kpi-icon-tokens" aria-hidden="true"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 7h16"/><path d="M4 12h16"/><path d="M4 17h16"/><path d="M8 3 6 21"/><path d="m18 3-2 18"/></svg></span>
</div>
<div class="dashboard-kpi-value" id="dashboard-kpi-token-usage">-</div>
<div class="dashboard-kpi-sub dashboard-kpi-sub--tokens">
<div class="dashboard-kpi-sub">
<span class="dashboard-kpi-sub-text" id="dashboard-kpi-token-sub-text">-</span>
<span class="dashboard-kpi-sub-text" id="dashboard-kpi-token-cache-text">-</span>
</div>
</div>
</div>
@@ -7017,7 +7016,7 @@
<script src="/static/js/info-collect.js?v=20260717-1"></script>
<script src="/static/js/assets.js?v=20260717-7"></script>
<script src="/static/js/agents.js"></script>
<script src="/static/js/dashboard.js?v=20261011-token-settings"></script>
<script src="/static/js/dashboard.js?v=20261011-token-settings-compact"></script>
<script src="/static/js/chat-scroll.js?v=20260815-1"></script>
<script src="/static/js/monitor.js?v=20261011-token-usage"></script>
<script src="/static/js/chat.js?v=20261011-token-usage"></script>