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:
@@ -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>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user