Commit Graph

95 Commits

Author SHA1 Message Date
晴天
66375d2807 feat(hermes): add base model config 2026-05-26 05:25:30 +08:00
晴天
1e56a54aeb feat(hermes): add display defaults config 2026-05-26 05:06:15 +08:00
晴天
fc8f209e01 feat(hermes): add display skin config 2026-05-26 04:55:29 +08:00
晴天
2a23b682be feat(hermes): add agent quality config 2026-05-26 04:42:28 +08:00
晴天
a34d7befb6 feat(hermes): add model aliases config 2026-05-26 04:28:33 +08:00
晴天
59d7833203 feat(hermes): add shell hooks config 2026-05-26 04:04:22 +08:00
晴天
be7aca03fa feat(hermes): add mcp servers config 2026-05-26 03:48:31 +08:00
晴天
b768a14942 feat(hermes): add provider timeout overrides config 2026-05-26 03:26:46 +08:00
晴天
ac2282591d feat(hermes): add provider routing config 2026-05-26 03:00:31 +08:00
晴天
fb7ae3f15c feat(hermes): add openrouter cache config 2026-05-26 02:36:37 +08:00
晴天
a52b70ade7 feat(hermes): add auxiliary model config 2026-05-26 02:18:03 +08:00
晴天
c5ed3ba5aa feat(hermes): add platform toolsets config 2026-05-26 01:50:06 +08:00
晴天
30dd6cc2e2 feat(hermes): add stt config form 2026-05-26 01:29:32 +08:00
晴天
bc7fa7b11b fix(hermes): improve dashboard touch targets 2026-05-26 01:05:17 +08:00
晴天
f4f65449f8 fix(hermes): stabilize chat health banner 2026-05-25 07:44:56 +08:00
晴天
c41340a9e0 feat(hermes): add prompt caching settings 2026-05-25 07:07:47 +08:00
晴天
e091a975c0 feat(hermes): add display output controls 2026-05-25 04:09:55 +08:00
晴天
a22b5b503d feat(hermes): add display run controls 2026-05-25 03:49:41 +08:00
晴天
054e45a8b3 feat(hermes): add logging settings 2026-05-25 03:29:56 +08:00
晴天
92d64efd8e feat(hermes): add cron output settings 2026-05-25 03:01:14 +08:00
晴天
e74df5f288 feat(hermes): add approval safety settings 2026-05-25 02:26:50 +08:00
晴天
ae1208d856 feat(hermes): add checkpoint rollback settings 2026-05-25 02:00:24 +08:00
晴天
77cadf9e0a feat(hermes): add agent runtime guard settings 2026-05-25 01:29:28 +08:00
晴天
4766a99d87 feat(hermes): add global toolset disable settings 2026-05-25 01:03:14 +08:00
晴天
8d5d21f908 feat(hermes): add browser tool settings 2026-05-25 00:27:06 +08:00
晴天
26d6ad18bc feat(hermes): add privacy redaction setting 2026-05-24 23:54:46 +08:00
晴天
459811b188 feat(hermes): add input output safety settings 2026-05-24 23:33:03 +08:00
晴天
d245d2e320 feat(hermes): add display reliability settings 2026-05-24 23:03:41 +08:00
晴天
8c963cd3d4 feat(hermes): add human delay settings 2026-05-24 22:31:52 +08:00
晴天
b2146b54cb feat(hermes): add tirith security settings 2026-05-24 22:08:12 +08:00
晴天
7be0ec66cc feat(hermes): add unauthorized dm policy form 2026-05-24 21:41:17 +08:00
晴天
2de5d1e38a feat(hermes): add quick commands config form 2026-05-24 21:21:16 +08:00
晴天
01f17f0a2a feat(hermes): add skills config form 2026-05-24 20:54:29 +08:00
晴天
d9fc9a8783 feat(hermes): add memory flush setting 2026-05-24 20:34:12 +08:00
晴天
56e41dd512 feat(hermes): add terminal execution config form 2026-05-24 20:06:50 +08:00
晴天
122d7a63be feat(hermes): add execution limits config form 2026-05-24 19:28:30 +08:00
晴天
c0b40070c0 feat(hermes): add channel display settings form 2026-05-24 18:42:34 +08:00
晴天
a1307716dd feat(hermes): add streaming config form 2026-05-24 08:40:53 +08:00
晴天
1883e18f02 feat(hermes): add memory config form 2026-05-24 08:04:31 +08:00
晴天
18ca140af8 feat(hermes): add tool loop guardrails form 2026-05-24 07:38:42 +08:00
晴天
5dd6f1be40 feat(hermes): add compression config form 2026-05-24 07:16:00 +08:00
晴天
f500da39c1 feat(hermes): add session runtime config form 2026-05-24 06:49:17 +08:00
晴天
4c29ed68ab fix(hermes): validate raw config saves 2026-05-24 06:10:07 +08:00
晴天
ff4da27eeb feat(hermes): add bundled plugin channel configs 2026-05-24 05:12:17 +08:00
晴天
6c947a1fec feat(hermes): support Discord plugin runtime config 2026-05-23 06:41:49 +08:00
晴天
d3d527ca34 feat(hermes): add dingtalk channel config 2026-05-23 03:48:33 +08:00
晴天
f7518ae4b3 fix(hermes): align channel secrets with runtime env 2026-05-23 02:49:31 +08:00
晴天
eccf91ed1e feat(hermes): add channel configuration editor 2026-05-23 01:51:08 +08:00
晴天
12cc9cd6ce fix(assistant): give assistant a Hermes identity, surface raw install hint, unblock CI
Three follow-ups the user spotted in one round.

assistant.js — assistant did not know it was on Hermes
  Both engines (OpenClaw and Hermes Agent) reuse the same /assistant
  page (engines/hermes/index.js comments it as "共用页面/引擎无关"),
  but getSystemPromptBase() hard-coded the OpenClaw self-introduction:
  "你帮助用户管理和排障 OpenClaw AI Agent 平台 / 你精通 OpenClaw 的架
  构…", followed by a CLI cheatsheet for `openclaw gateway start` and
  `openclaw config apply`. Result: under the Hermes engine, the
  assistant happily told users to run `openclaw doctor` and edit
  `~/.openclaw/openclaw.json` — neither of which exists in the Hermes
  world.

  Split into a per-engine dispatcher:
    getSystemPromptBase()
      └ if hermes  → getHermesSystemPromptBase()  (new)
      └ else       → getOpenclawSystemPromptBase() (renamed, same body)

  The new Hermes base prompt covers the facts that actually matter:
   - dual-process layout: Gateway 8642 (chat API, what ClawPanel
     mostly drives) vs Dashboard 9119 (admin/profiles/skills/oauth/
     kanban — must be started separately)
   - Profile system (independent workspaces, switchProfile restarts
     dashboard, multi-gateway view)
   - lazy_deps allowlist and why pre-installing matters
   - paths: ~/.hermes (data) and ~/.hermes-venv (interpreter), with a
     reminder that ~/.openclaw/clawpanel.json is the panel config
     shared with the OpenClaw engine — not Hermes data
   - Top-5 problem playbook (9119 not running, venv missing, channels
     hanging on first launch, gateway crashing, profile drift)
   - Explicit "do not give the user `openclaw …` commands"

  Two more spots in buildSystemPrompt() are also engine-aware now:
   - the "ClawPanel 工具能力" bullet list inside the soul-cache branch
   - the "跨平台路径" reminder (Hermes points to .hermes / .hermes-venv)

lazy-deps.js — "请确认目标资源是否仍存在" was masking the real hint
  When the user has not installed Hermes yet, Rust's
  `hermes_lazy_deps_features` returns the very actionable string
  "Hermes venv 未找到(~/.hermes-venv 不存在)。请先安装 Hermes。".
  humanize-error.js then sees "未找到", classifies the error as
  notFound, and replaces the message with the generic template
  "请确认目标资源是否仍存在" — which tells the user nothing about
  installing Hermes.

  Take humanizeError() but render `message + raw` instead of
  `message + hint`. The user now sees both the friendly title and the
  exact Rust-side instruction. Drop the unused humanizeErrorText
  import that this commit replaces.

config.rs — unblock CI (clippy too_many_arguments on existing code)
  The clippy gate has been red on main since e1eda2d ("import external
  client configs") because two helpers in commands/config.rs take >7
  positional parameters:
    - push_client_candidate (14 params)
    - scan_json_client_file (10 params)

  Both helpers exist purely to push a flat record into a Vec<Value>.
  Wrapping them in a struct just to satisfy clippy would force every
  caller to first build that struct, hurting readability. Suppress
  clippy::too_many_arguments locally on these two functions with an
  inline comment explaining why.

## Verification
- node --check + npm run build: clean
- cargo clippy --all-targets -- -D warnings: now compiles to
  "Finished `dev` profile" with zero errors/warnings (previously
  failed with two too_many_arguments)
- Playwright: import lazy-deps with api.hermesLazyDepsFeatures mocked
  to throw "Hermes venv 未找到 … 请先安装 Hermes。", rendered content
  contains "请先安装 Hermes" (hasRaw=true), does not contain the
  generic "请确认目标资源是否仍存在" (hasGenericNotFound=false), and
  does not contain "[object Object]"
2026-05-16 14:24:45 +08:00
晴天
4b0d8e5042 fix(ui): hide useless docker manager on desktop, auto-start hermes dashboard, polish layout
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
  <div class="config-actions"> nested in <div class="page-header">,
  but the existing flex layout rule only matched .page-actions. The
  buttons therefore stacked directly under .page-desc with zero
  visible gap. Add .config-actions to both the desktop flex selector
  and the @media (max-width:768px) column-stack selector so all
  these pages get the same title-left / actions-right layout.

## Verification
- npm run build (no warnings beyond the existing chunk size note)
- Playwright on /services in browser mode: docker section present;
  same page after mocking window.__TAURI_INTERNALS__: section gone
- Playwright on /lazy-deps: rendered content does not contain the
  string "[object Object]"
- Playwright dynamic-imports profiles / lazy-deps / files render():
  computed style on .page-header is display:flex, flex-direction:row,
  title and button share the same getBoundingClientRect().top, button
  pushed to the right edge (justify-content:space-between effective)
2026-05-16 13:46:24 +08:00