feat(desktop): 工作台重做为实时仪表盘 + /stats/overview 聚合端点(Tier1 UI 升级)

桌面端首屏原是静态宣传页(stat 全硬编码、唯一活数据是网关在线),"太单调"。
重做为活的驾驶舱:

后端 GET /api/v1/stats/overview(聚合,几条轻量查询):
- 任务今日/累计、7 日趋势、近 7 天终态分布(实例级,Task 无 owner)
- 评测均分 + 忠实度均值 + 计数;知识库文档/库数(owner 级)
- token 今日 + 7 日趋势(Redis 日计数)、近期运行 feed、服务健康(复用 health 口径)
- store.StatsOverview + RecentTasks。

前端 Home 重写为仪表盘:4 指标卡(今日任务/Token/评测均分/知识库)带 SVG 火花线、
近期运行 feed(状态点+相对时间,点进运行观测)、7 日任务量柱图、服务健康灯带、能力入口、
快捷动作。5s 轮询刷新。配色沿用现有 ink 暗底 + brand/accent。

live(vite dev + 预览截图):登录后仪表盘渲染真实活数据(今日任务/Token/评测 1.00/近期运行/
服务全绿),无控制台报错。tsc+vite 构建通过,gateway 全绿。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Blizzard
2026-06-26 16:13:54 +08:00
parent a5fd251fc0
commit 1344bf98a0
5 changed files with 297 additions and 50 deletions
+26
View File
@@ -457,3 +457,29 @@ export async function deleteMemory(id: Identity, key: string): Promise<void> {
throw new Error(d.error ?? `delete memory failed: ${res.status}`);
}
}
// ── 工作台仪表盘聚合(GET /stats/overview)──
export interface KeyCount { key: string; count: number }
export interface RecentRun { task_id: string; status: string; detail: string; at: string }
export interface Overview {
tasks_today: number;
tasks_total: number;
status_count: KeyCount[];
task_trend: KeyCount[];
token_trend: KeyCount[];
eval_avg: number;
faithful_avg: number;
eval_count: number;
kb_docs: number;
kb_count: number;
tokens_today: number;
daily_budget: number;
recent_runs: RecentRun[];
services: Record<string, boolean>;
}
export async function statsOverview(): Promise<Overview> {
const res = guard401(await fetch(`${GATEWAY}/api/v1/stats/overview`, { headers: bearer() }));
if (!res.ok) throw new Error(`stats failed: ${res.status}`);
return res.json() as Promise<Overview>;
}