Commit Graph

285 Commits

Author SHA1 Message Date
晴天
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
晴天
7b32b533fb feat(channels): add Tlon config compatibility 2026-05-24 02:03:55 +08:00
晴天
7e3bb71fca feat(channels): add IRC config compatibility 2026-05-24 00:57:37 +08:00
晴天
326c5597df feat(channels): add Nostr config compatibility 2026-05-23 09:25:07 +08:00
晴天
dcc3751ded feat(channels): add Twitch config compatibility 2026-05-23 08:42:54 +08:00
晴天
8623efd49c feat(channels): add Nextcloud Talk config compatibility 2026-05-23 08:25:34 +08:00
晴天
579d706075 feat(channels): add ClickClack config compatibility 2026-05-23 08:07:39 +08:00
晴天
d933177ec3 feat(channels): restore WhatsApp config compatibility 2026-05-23 07:51:16 +08:00
晴天
8d745e7543 feat(channels): add iMessage config compatibility 2026-05-23 07:31:06 +08:00
晴天
6c947a1fec feat(hermes): support Discord plugin runtime config 2026-05-23 06:41:49 +08:00
晴天
f188bb85f7 feat(channels): improve Microsoft Teams config compatibility 2026-05-23 06:22:23 +08:00
晴天
49be118c5f feat(channels): improve Signal config compatibility 2026-05-23 05:56:59 +08:00
晴天
09bc45ae4c feat(channels): add Synology and Google Chat config 2026-05-23 05:37:06 +08:00
晴天
53fe25a277 feat(channels): add LINE and Mattermost config 2026-05-23 05:08:51 +08:00
晴天
780b1bdde5 feat(channels): add Zalo channel configuration 2026-05-23 04:38:49 +08:00
晴天
067389d65f fix(channels): add generic channel diagnostics 2026-05-23 04:14:45 +08:00
晴天
d3d527ca34 feat(hermes): add dingtalk channel config 2026-05-23 03:48:33 +08:00
晴天
449dbc3862 fix(channels): validate binding accounts by credential fields 2026-05-23 03:35:02 +08:00
晴天
e2eee18e05 fix(channels): preserve Discord application id 2026-05-23 03:25:22 +08:00
晴天
b6a353d622 fix(channels): stabilize default account selection 2026-05-23 03:12:40 +08:00
晴天
01dff38a97 fix(channels): save multi-account platform configs 2026-05-23 03:06:52 +08:00
晴天
f7518ae4b3 fix(hermes): align channel secrets with runtime env 2026-05-23 02:49:31 +08:00
晴天
6aa7a05f36 fix(channels): preserve SecretRef credentials 2026-05-23 02:23:52 +08:00
晴天
eccf91ed1e feat(hermes): add channel configuration editor 2026-05-23 01:51:08 +08:00
晴天
27b35b6298 fix(channels): normalize OpenClaw channel config policies 2026-05-23 01:14:42 +08:00
晴天
d0f0d1f6b7 fix(gateway): release 0.16.5 2026-05-22 20:42:16 +08:00
晴天
4d82395b90 fix(engine-select): release 0.16.4 2026-05-22 19:46:07 +08:00
晴天
76c4a56302 fix: stabilize gateway startup and kernel i18n 2026-05-22 15:38:56 +08:00
晴天
41e688843e chore: release v0.16.2 2026-05-21 19:23:43 +08:00
晴天
14525c50e4 chore: release v0.16.1 2026-05-21 14:33:33 +08:00
晴天
14a5b1ee9a chore: release v0.16.0 2026-05-16 15:11:02 +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
晴天
7d75486a53 feat(gateway): surface negotiated handshake protocol version in UI
Users have reported confusion about "when will ClawPanel update its
gateway protocol to v4". This is actually a misreading: ClawPanel v0.15+
already advertises `minProtocol=3, maxProtocol=4` in its connect frame,
and negotiates v4 transparently when the kernel is >= 2026.5.12. The
`v3|` prefix users were seeing in dev-api.js is the device signature
payload string schema version, which is a completely separate concept
from the handshake protocol version.

Make this visible and unambiguous:

UI
- Add a "Proto v4" badge next to the Gateway service name in
  /services once the WS handshake succeeds, with a tooltip explaining
  that this is the WS handshake protocol version (not the device
  signature payload v3 format).
- Add the same protocol info to the WebSocket row in /chat-debug.

API
- WsClient now exposes `negotiatedProtocol` which prefers the explicit
  field from the hello payload (`protocol` / `protocolVersion` /
  `negotiatedProtocol`) and falls back to inferring from serverVersion:
  kernels >= 2026.5.12 are reported as v4, older as v3. This matches
  the panel's advertised range of [3, 4].
- KernelSnapshot grows a `protocol` field so feature gates and UIs that
  already consume the snapshot can read it without touching wsClient.

Comments
- Expand the KERNEL_TARGET comment in feature-catalog.js to spell out
  the two-distinct-version-numbers rule explicitly.
- Add matching clarifying comments next to the `v3|...` payload string
  in both scripts/dev-api.js and src-tauri/src/commands/device.rs, so
  the next reader does not confuse payload schema with handshake.

## Verification
- node --check on all touched JS files
- npm run build
- cargo fmt --check && cargo check (clippy errors that surface are
  pre-existing debt in config.rs, untouched here)
- Playwright /services: mock wsClient state, observe `协议 v4` badge
  rendered with `rgba(99, 102, 241, 0.1)` background and accent color,
  for both the explicit-protocol path and the version-inferred path.
2026-05-16 13:02:08 +08:00
晴天
207b1c7c55 fix(windows): make gateway terminal window actually visible
The previous implementation passed CREATE_NEW_CONSOLE to a Rust
StdCommand spawning cmd.exe directly, but Rust's default Stdio::inherit
copies the parent stdio handles into STARTUPINFO with
STARTF_USESTDHANDLES, which neutralizes CREATE_NEW_CONSOLE. The cmd
process then ran without a visible window (MainWindowHandle = 0), so
users only saw the OpenClaw node child started by runner.cmd in Task
Manager and got the impression that "the terminal does not pop up".

Wrap the launch in `cmd /c start "OpenClaw Gateway" /D <dir> cmd /D /K
runner.cmd` so the new console is created by the `start` builtin via a
fresh CreateProcess call without inherited stdio. The outer cmd /c
itself is short-lived and uses CREATE_NO_WINDOW so it does not flash a
window, and the inner cmd hosting runner.cmd reliably becomes a normal
visible terminal that the user can close to stop Gateway.

Because the visible terminal is now detached from our process tree,
spawn().id() can no longer be tracked. Instead, poll netstat after the
launch and record the listener PID as the active Gateway PID, which is
what the stop path actually needs to send a precise kill to.

## Verification
- cargo fmt --manifest-path src-tauri/Cargo.toml --all -- --check
- cargo check --manifest-path src-tauri/Cargo.toml
2026-05-16 12:07:04 +08:00