From 4b0d8e5042a5d0dafa533823926ef2215432f426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E5=A4=A9?= Date: Sat, 16 May 2026 13:46:24 +0800 Subject: [PATCH] fix(ui): hide useless docker manager on desktop, auto-start hermes dashboard, polish layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four independent UI fixes the user spotted in one screenshot tour: services.js — desktop docker manager ClawPanel is not a docker management tool. The "Docker 多实例管理" block on the OpenClaw services page only makes sense for users who deployed ClawPanel itself in Web mode (serve.js / dev-api) and want to orchestrate multiple OpenClaw containers from one panel. On desktop Tauri this block always degrades to either "未启用" with a connect ENOENT error (no docker daemon on the user box) or to a generic "unavailable" placeholder — pure visual noise. Skip the whole config-section in render() and bail out of loadDockerManager() when isTauriRuntime() is true. Web mode keeps the feature. profiles.js — Hermes Profile manager could not load Profile API only exists on the Hermes Dashboard process at 9119, which the user has to start by hand. When it is offline, the page showed a raw "由于目标计算机积极拒绝, 无法连接 (10061)" error which is useless: users do not know they need to start a separate process. load() now does the same probe → auto-start dance that extensions.js / dashboard.js use for their 9119 links: probe first, call hermesDashboardStart() if not running, only then issue the /api/profiles request. If the start itself fails, we fall through to the original catch and humanize-error renders a real reason. lazy-deps.js — "[object Object]" on load failure humanizeError() returns { message, hint, raw, action? }, not a string. The catch branch passed the object straight into escapeHtml(), so String(obj) coerced to "[object Object]". Switch to humanizeErrorText() which is exactly the (message + hint) one-liner string variant. layout.css — header buttons crammed against the description Several pages (hermes profiles / lazy-deps / files / gateways / group-chat / kanban / oauth) put their header buttons inside
nested in
+ ${isTauriRuntime() ? '' : `
${t('services.dockerManager')}
${t('services.dockerManagerHint')}
-
+
`}