From 1b95d0ef2dcfc2860c43d0a00dc219c44a185a68 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Sun, 27 Sep 2026 23:20:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(webui):=20=E4=BF=AE=E6=80=BB=E8=A7=88=20KPI?= =?UTF-8?q?=20=E9=95=BF=E6=9C=9F=E7=A9=BA=E5=80=BC=EF=BC=88=E6=88=91?= =?UTF-8?q?=E4=B8=8A=E8=BD=AE=E6=87=92=E5=8A=A0=E8=BD=BD=E6=94=B9=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E7=9A=84=EF=BC=89=EF=BC=8B=E6=98=9F=E5=9B=BE=E6=94=B9?= =?UTF-8?q?=E9=93=B6=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### ★ 严重问题:总览页 8 个 KPI 里有 5 个是空的 线上实测(https://homeagent.jianfgit.xyz): ["运行中状态","1h 22m 18s运行","0插件","v1.4.0…版本","—LLM", "—记忆","—文档","—运行时"] 对照 state:{"status":true,"kernel":false,"settings":0,"runtime":true} 根因是**我上一个提交(8a36be0 按页签懒加载)引入的**: 总览的插件数/版本/LLM/记忆/文档/运行时全部读 `state.kernel` (`updateOverview` 里写作 `(k && k.plugins)` 这类安全取值), 而我把 kernel 从 overview 的数据块里删掉了。 ⇒ 缺数据时不报错、**只显示「插件 0、记忆 —、文档 —」**, 看起来像「服务坏了」而不是像 bug —— 这类静默降级最难自查。 ★ 教训(已写进代码注释):依赖分析必须覆盖**整个调用链**。 我当初只 grep 了 `renderOverview` **直接**读的 state.*,漏了它间接 调用的 `updateOverview`。逐页重核后确认只有 overview 漏配,其余页签 (plugins/settings/kernel 各自要的)本来就是对的。 修复:overview 的 fetch 补回 kernel。kernel 拉过一次后不再重拉 (starmapFetchBlock 的节流),152KB 只在首屏付一次。 实测:["运行中状态","1m 15s运行","17插件","v1.4.0HomeAgent版本", "deepseekLLM","1200/893记忆","0文档","39 · 11M运行时"] ### 星图配色改银色(用户裁定) SM_COLOR_DIM: 0x7d8a9e(灰蓝)→ 0xc8ced8(银色)。 实测 colors: ["7d8a9e"] → ["c8ced8"] ### 关于「页面还是绿色」这个现象 线上内联的颜色实测已是 0x7d8a9e,缓存头也正确 (cache-control: no-cache, no-store, must-revalidate), 浏览器复现同样是灰蓝色 ⇒ 那是**已打开标签页里的旧 JS**: 页面 HTML 变了,但没重新加载的标签页不会自己换。 本提交部署后需**刷新页面**(Ctrl+Shift+R 强刷)才会看到新配色。 Co-Authored-By: Claude Opus 4.8 (1M context) --- internal/plugins/webui/dashboard.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/internal/plugins/webui/dashboard.js b/internal/plugins/webui/dashboard.js index 2597ca3..e4fa82b 100644 --- a/internal/plugins/webui/dashboard.js +++ b/internal/plugins/webui/dashboard.js @@ -516,7 +516,19 @@ function toggleSidebar() { // // 于是「切到哪页才拉哪页的数据」成为结构性正确,而不是靠 if 串联。 var TABS = { - overview: { fetch: ["status", "runtime"], render: ["renderOverview"] }, + // ★ overview 必须拉 kernel:总览的 8 个 KPI 里有 5 个读它 + // (插件数 / 版本 / LLM / 记忆 / 文档 / 运行时),取值都写成 + // `(k && k.plugins)` 这种安全形式——于是缺数据时不报错, + // **只显示「插件 0、记忆 —、文档 —」**,看起来像“服务坏了”。 + // + // 我先前只 grep 了 renderOverview 直接读的 state.*,**漏了它间接 + // 调用的 updateOverview**,就把 kernel 从总览的数据块里删掉了。 + // 线上实测印证:state.kernel=false 而 status/runtime 有值。 + // + // 教训:依赖分析必须覆盖**整个调用链**(render → 内部调用的 update*), + // 只看入口函数的直接引用会漏。kernel 拉过一次后不再重拉 + // (见 starmapFetchBlock 的节流),152KB 只在首屏付一次。 + overview: { fetch: ["status", "runtime", "kernel"], render: ["renderOverview"] }, chat: { fetch: ["status", "proxyServices", "terminals", "cmdHistory"], render: ["renderChat"], @@ -5491,7 +5503,7 @@ var starmapLabelEl = null; // 1. 默认色改为低饱和灰蓝(全图统一,不假装在分类) // 2. 类型色只在**真的存在多种类型**时才按类型区分(见 smColorFor) // 3. 图例按实际节点集合动态生成,不列出永不出现的类型 -var SM_COLOR_DIM = 0x7d8a9e; // 中性灰蓝:单一类型时的全图色 +var SM_COLOR_DIM = 0xc8ced8; // 银色:单一类型时的全图色(用户裁定) var smTypeColors = { // 以下类型在真实数据里几乎不出现(仅 social.go 会产出 person), // 但保留定义:万一出现就能自动获得区分色 + 动态图例条目。