Hermes Agent
Hermes tightens profile routing across desktop and remote gateways
Hermes proposes per-profile remote WebSocket routing while users report profile tabs loading the default session list and a Windows desktop restart killing a scheduled-task gateway. The cluster shows profile isolation crossing UI, transport and process supervision.
NousResearch/hermes-agent PR #85750 is the inspected primary source: “Fix/per profile remote ws routing.” The related records below were inspected as supporting context rather than independent confirmation.
The facts
- NousResearch/hermes-agent PR #85750 was created 2026-08-14T01:35:37Z and was open at inspection; its title is “Fix/per profile remote ws routing.” - NousResearch/hermes-agent issue #85745 was created 2026-08-14T01:30:07Z and was open at inspection; its title is “Desktop: profile tab switch shows wrong session list (default instead of bubu).” - NousResearch/hermes-agent issue #85738 was created 2026-08-14T01:13:34Z and was open at inspection; its title is “Windows: _reap_unsupervised_gateway_orphans kills scheduled-task gateway on desktop backend restart (v0.20.0 regression).” - The repository reported 230152 stars, 31857 open issues, default branch main, and last push 2026-08-14T01:30:15Z. - The latest tagged-release baseline checked was v2026.8.13 published 2026-08-13T20:37:37Z.
What changed
NousResearch/hermes-agent PR #85750 reports: PR: fix(desktop): per-profile remote overrides attach chat WS to the local primary What A Desktop profile configured with its own remote gateway override (connection.json profiles[name] = { mode: "remote", url, token }) silently runs its chat on the **local** primary backend: new sessions on the remote profile identify as the local host (e.g. macOS) resuming a remote-native session fails with "session not found" REST (session list, fs, git) correctly hits the remote via the override Regression from #85665 (d16e2366d), merged 2026-08-13. Root cause sharedPrimaryRoute() (apps/desktop/src/store/gateway.ts) decides a profile is "served by the shared primary" when the descriptor has a.profile field: But **two** routes produce a.profile-tagged descriptor: 1. Shared-primary (case 3, global remote): ensureBackend returns {...connection, profile: route.descriptorProfile } — the intended target of the check. 2. **Per-profile remote override (case 2): spawnPoolBackend returns {...remote, profile,... } (electron/main.ts:8117) — the pool descriptor is tagged with the profile name too.** The check cannot distinguish them, so a per-profile remote override is misclassified as shared-primary → ensureGatewayForProfile activates the PRIMARY (local) socket instead of dialing the profile's remote WS. The commit message claims "per-profile remote overrides are untouched
NousResearch/hermes-agent issue #85745 reports: Problem When switching from the default profile tab to the bubu profile tab in the Hermes desktop app, the session list shows default's sessions instead of bubu's. The bubu backend is running and listening on its own port, but the desktop app never establishes a WS connection to it. Diagnosis Both backends are running: The desktop app connects to default's serve endpoint but never connects to bubu's endpoint when switching tabs. This means the profile tab switch does not trigger a new WS connection to the target profile's backend. This was NOT happening before — it started after a config change session where: 1. Removed volcengine-agent-plan provider from both profiles 2. Switched main model to xiaomi/mimo-v2.5 3. Changed all auxiliary models from volcengine-agent-plan to xiaomi/deepseek 4. Restarted the desktop app Bubu's config.yaml was missing some keys compared to default (tts, wake_word, some agent fields), and had volcengine-agent-plan still in its providers section (now removed). However, the WS connection issue persists even after fixing the config. Steps to Reproduce 1. Have two profiles configured (default + bubu) with different backends 2. Make config changes to both profiles (model/provider changes) 3. Restart
NousResearch/hermes-agent issue #85738 reports: Bug Since updating to v0.20.0, the messaging gateway on Windows dies repeatedly with unclean exits (SIGKILL — no exception, no traceback, no graceful shutdown). The gateway stays up for anywhere from 6 to 78 minutes, then gets killed externally. Root Cause hermes_cli/web_server.py (line ~253) calls _reap_unsupervised_gateway_orphans() from hermes_cli/gateway.py (line ~1528) when the desktop app's hermes serve backend starts with HERMES_DESKTOP=1. This function was added to fix #51325 (duplicate gateways stacking on the same port on WSL/no-systemd hosts). It finds all gateway PIDs via find_gateway_pids() and kills any that aren't supervised by a service manager (systemd/launchd). The problem on Windows:** there is no systemd/launchd equivalent. supports_systemd_services() returns False, so **every** gateway — including ones legitimately started by the Windows Scheduled Task / VBS launcher — is classified as an "unsupervised orphan" and killed. The kill sequence: 1. SIGTERM the gateway PID 2. Wait 5 seconds 3. SIGKILL any survivor This results in the gateway.exit_unclean / gateway.previous_unclean_exit diagnostic entries (SIGKILL / OOM / VM death pattern) with no Python exception path. Reproduction 1. Start the messaging gateway via the Windows scheduled task (or VBS launcher): 2. Confirm it's running: hermes gateway status
Why it matters
Profiles are not isolated if the tab, socket and gateway supervisor disagree about which runtime owns a session. The failure can expose the wrong history or terminate a healthy gateway. The operator test is whether visible state, retained state and authority still describe the same event after retries, switching or restart.
Current
The primary record was open when captured on 2026-08-14. The tagged-release baseline was v2026.8.13 published 2026-08-13T20:37:37Z. Repository metadata, full source bodies, current pull requests and issues, releases, Google News, Hacker News, Lobsters, Metamesh and the rendered ClawCharts row were inspected. ClawCharts selected the subject; it did not prove the claim.
Evidence
The primary URL is https://github.com/NousResearch/hermes-agent/pull/85750. Supporting records are https://github.com/NousResearch/hermes-agent/issues/85745 and https://github.com/NousResearch/hermes-agent/issues/85738. Source bodies, timestamps and states are preserved in the daily evidence bundle. Test counts and reproductions remain attributed to their authors unless identified as independently rerun.
Source boundary
Open work is described as open, closed work as closed, and operator reports as reports. A pull request is evidence of proposed or reviewed direction, not proof of a shipped release. Search residue, package mirrors and historically published source spines were excluded.
Operator take
Bind every remote socket and session query to explicit profile identity, and make orphan reaping distinguish service-managed processes before desktop restarts. Preserve a before-state receipt, make the smallest reversible change, and verify the original failure independently.
Caveat
Public project records are mutable. Status, scope and evidence can change after publication. This brief records the inspected state and does not authorize changes to a reader’s deployment.
Source inspected; source state, environment and release boundary remain explicit.