feat: Web哨兵监控面板桌面端视图改进三栏布局·低噪声·渐进披露 (#1025)

- 桌面端(≥1024px)三栏 master-detail:Runs | Detail | Findings,点击 run 无需滚动
- 状态摘要条替换 4 metric cards,单行 ~48px,合并 status-pill/overall 重复值
- overview checks 全绿折叠为单 pill,点击展开明细
- runs/findings filter 默认折叠为单行摘要 chip,展开功能不变
- Detail 分 5 tab(概要/发现项/多轮摘要/Trace/证据与命令),URL 支持 ?run=&tab=
- Finding 默认显示聚合,点击 chip drill-down 到列表;item 默认折叠只显示 title+severity+count
- Runs 行级 severity 色条(red/amber/info 左 border),一眼定位问题行
- Timeline 升级为底部紧凑条,加相对时间刻度,可折叠
- auto-refresh 交互暂停:hover runs/detail 时暂停刷新
- CLI 命令改可复制按钮+toast,detailCommands 不再纯文本
- 快捷键 j/k 上下选 run、Enter 打开、r 刷新、/ 聚焦搜索
- 降权标签:减少 uppercase/font-weight:800 滥用,只在 red/blocked 强调
- 去冗余 box-shadow:panel 用 1px border,只在 modal/overlay 用阴影
- contract version 升级 draft-2026-06-26-p9-desktop-view-density
- 保持纯 vanilla JS + 原生 CSS,无框架/无构建步骤,API 契约不变
This commit is contained in:
Codex
2026-06-26 12:30:42 +00:00
parent c304a2b69c
commit 92f20ed978
4 changed files with 1241 additions and 678 deletions
@@ -1,6 +1,6 @@
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-25-p0-web-probe-sentinel.
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p7-web-probe-sentinel-dashboard.
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p8-web-probe-sentinel-recovery.
// SPEC: PJ2026-01060508 Web哨兵 draft-2026-06-26-p9-desktop-view-density.
// Responsibility: Persistent HTTP wrapper service for web-probe observe scheduling, index, health, metrics, maintenance, and dashboard.
import { Buffer } from "node:buffer";
import { createHash, randomUUID } from "node:crypto";
@@ -12,7 +12,7 @@ import { renderWebProbeSentinelDashboardHtml, webProbeSentinelDashboardAssetResp
import { webProbeSentinelConfigPlan, type WebProbeSentinelConfigPlan } from "./hwlab-node-web-sentinel-config";
import type { HwlabRuntimeLaneSpec } from "./hwlab-node-lanes";
const DASHBOARD_CONTRACT_VERSION = "draft-2026-06-26-p8-web-probe-sentinel-recovery";
const DASHBOARD_CONTRACT_VERSION = "draft-2026-06-26-p9-desktop-view-density";
const DASHBOARD_MAX_TEXT_BYTES = 16_000;
export interface WebProbeSentinelServiceConfig {