β¨ feat(hermes): implement hermes agent chain logic#15189
Conversation
Replace the broken HTTP gateway approach with direct CLI spawn (matching openclaw's architecture). Hermes chat -q --quiet outputs session_id + response to stdout β we capture it and relay via sendAutoNotify/sendDoneSignal, no buildNotifyProtocol injection needed. - heteroTask (CLI): spawn hermes chat -q --quiet [--resume <id>], capture stdout, persist session_id to ~/.lobehub/hermes-sessions.json per topicId, kill concurrent same-topic tasks by PID before spawning - GatewayConnectionCtr (desktop): mirror CLI logic, store hermes session IDs in-memory hermesSessionMap, remove unused HTTP gateway helpers - getAgentProfile: implement hermes profile fetch via `hermes profile list` + SOUL.md description parsing - checkPlatformCapability: fix hermes check to use `hermes --version` instead of non-existent HTTP /health endpoint Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Sorry @ONLY-yours, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
π‘ Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: ae1caab4f7
βΉοΈ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with π.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codecov Reportβ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## canary #15189 +/- ##
==========================================
- Coverage 70.92% 70.92% -0.01%
==========================================
Files 3149 3149
Lines 313896 313893 -3
Branches 33311 33311
==========================================
- Hits 222628 222623 -5
- Misses 91100 91102 +2
Partials 168 168
Flags with carried forward coverage won't be shown. Click here to find out more.
π New features to boost your workflow:
|
β¦nsion - readHermesSoulDescription: loop comment-stripping regex until stable to prevent residual `<!--` from malformed/nested sequences (CodeQL High) - getHermesProfilePath: expand leading `~` via os.homedir() before fs.join in case hermes profile show returns a tilde-prefixed path (CLI + desktop) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
β¦zation check After stripping HTML comments, add .replaceAll(/[<>]/g, '') inside the loop to ensure no partial `<!--` delimiters survive, resolving the CodeQL 'Incomplete multi-character sanitization' High warning. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
β¦on platforms - Enable Hermes in CreatePlatformAgent (remove from COMING_SOON_PLATFORMS) - Add Amp and OpenCode to REMOTE_HETEROGENEOUS_AGENT_CONFIGS (coming-soon disabled) - Extend RemoteHeterogeneousAgentType and HeterogeneousProviderConfig.type - Use isRemoteHeterogeneousType() in HeterogeneousAgentStatusCard to future-proof remote agent detection guard (removes hardcoded openclaw/hermes check) - Export isRemoteHeterogeneousType from heterogeneous-agents/client entrypoint - Broaden agentType to string in device-gateway-client (AgentRunRequestMessage, dispatchAgentRun) so new remote types pass without package updates - Add i18n keys for amp/opencode platform descriptions (en-US, zh-CN) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* β¨ feat(hermes): implement hermes agent chain logic Replace the broken HTTP gateway approach with direct CLI spawn (matching openclaw's architecture). Hermes chat -q --quiet outputs session_id + response to stdout β we capture it and relay via sendAutoNotify/sendDoneSignal, no buildNotifyProtocol injection needed. - heteroTask (CLI): spawn hermes chat -q --quiet [--resume <id>], capture stdout, persist session_id to ~/.lobehub/hermes-sessions.json per topicId, kill concurrent same-topic tasks by PID before spawning - GatewayConnectionCtr (desktop): mirror CLI logic, store hermes session IDs in-memory hermesSessionMap, remove unused HTTP gateway helpers - getAgentProfile: implement hermes profile fetch via `hermes profile list` + SOUL.md description parsing - checkPlatformCapability: fix hermes check to use `hermes --version` instead of non-existent HTTP /health endpoint Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * π fix(hermes): fix CodeQL incomplete sanitization and tilde path expansion - readHermesSoulDescription: loop comment-stripping regex until stable to prevent residual `<!--` from malformed/nested sequences (CodeQL High) - getHermesProfilePath: expand leading `~` via os.homedir() before fs.join in case hermes profile show returns a tilde-prefixed path (CLI + desktop) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * π fix(hermes): strip residual angle brackets to satisfy CodeQL sanitization check After stripping HTML comments, add .replaceAll(/[<>]/g, '') inside the loop to ensure no partial `<!--` delimiters survive, resolving the CodeQL 'Incomplete multi-character sanitization' High warning. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * β¨ feat(platform-agent): enable Hermes + add Amp/OpenCode as coming-soon platforms - Enable Hermes in CreatePlatformAgent (remove from COMING_SOON_PLATFORMS) - Add Amp and OpenCode to REMOTE_HETEROGENEOUS_AGENT_CONFIGS (coming-soon disabled) - Extend RemoteHeterogeneousAgentType and HeterogeneousProviderConfig.type - Use isRemoteHeterogeneousType() in HeterogeneousAgentStatusCard to future-proof remote agent detection guard (removes hardcoded openclaw/hermes check) - Export isRemoteHeterogeneousType from heterogeneous-agents/client entrypoint - Broaden agentType to string in device-gateway-client (AgentRunRequestMessage, dispatchAgentRun) so new remote types pass without package updates - Add i18n keys for amp/opencode platform descriptions (en-US, zh-CN) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * π fix(test): add isRemoteHeterogeneousType to heterogeneous-agents/client mock --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
# π LobeHub Release (20260528) **Release Date:** May 28, 2026 **Since v2.2.0:** 220 merged PRs Β· 15 contributors > This cycle brings heterogeneous "platform agents" you can dispatch to local or remote devices, a rebuilt onboarding flow, document-centric chat, and a unified model-runtime error model β with new DeepSeek V4 and Gemini 3.5 Flash support along the way. --- ## β¨ Highlights - **More Hetero Agents (OpenClaw / Hermes)** β Create heterogeneous agents and dispatch them to local or remote devices through the device gateway, with an execution-target switcher in the composer and persistent CLI sessions. (#15065, #15179, #15022) - **iMessage on Desktop** β New iMessage setup and bridge on desktop, plus bot attachments across every platform. (#15228, #15227, #15029) - **Skills in the Composer** β Drag skill chips into chat, trigger installed skills from the slash menu mid-line, and surface project-level skills in the homogeneous agent runtime. (#15095, #15061, #15110) - **New Models** β DeepSeek V4 Flash/Pro and Gemini 3.5 Flash across providers, with thinking params for structured output and chat cost estimates. (#15031, #15001, #15051, #14876) - **Agent Runtime Observability** β OpenTelemetry GenAI semantic conventions plus per-call generation tracing. (#15123, #15124) --- ## π€ Agents & Heterogeneous Runtime - **Platform agent creation** β OpenClaw/Hermes creation UI, device guard, and remote dispatch backend. (#15065) - **Execution-target switcher** β Pick local vs remote execution directly in the composer; device-selection UX with actionable guidance. (#15179, #15111) - **CLI hetero dispatch** β OpenClaw/Hermes dispatch with persistent sessions and a notify protocol. (#15022) - **Gateway snapshot as source of truth** β Consume the gateway `uiMessages` snapshot at step boundaries to keep chat state consistent. (#15153, #15152) - **Client sub-agent as a normal tool call** β Simplifies the sub-agent execution path. (#15281) - **Hermes agent chain** β Implements the Hermes agent chain logic. (#15189) - **Device registry** β TRPC endpoints to register, list, update, and remove devices. (#15299) - **Desktop device routing** β Route gateway agent runs through `lh hetero exec`; restore `userId` in gateway dispatch and gate local-system by execution target. (#15132, #15232) - **Agent signals** β Anchor agent-signal receipts to messages and isolate memory-agent messages into a child thread. (#14969, #14921) --- ## π Onboarding - **Simplified first screen** β Defer topic creation to first send. (#15090) - **Market Agent Picker** β Added as a classic onboarding step, with template prefetch. (#14980, #15041) - **Welcome guidance** β Show agent welcome guidance on first run. (#15098) - **Mobile** β Adapt agent onboarding UI and restore Classic-step padding on mobile. (#15019, #15032) - **Discovery** β Streamline discovery to a single profession question. (#14987) - **Analytics** β Track onboarding step events and create-agent modal source. (#15133, #15028) --- ## π Documents, Pages & Knowledge - **Thread chat in preview** β Embed thread chat in the document preview portal. (#15216) - **Non-markdown rendering** β Render non-markdown docs as a read-only highlight. (#15272) - **Multi-select** β Multi-select delete in the document tree. (#15125) - **Page-agent streaming** β Preview `initPage` streaming arguments. (#15039) - **Per-agent topics** β Per-agent topic management page. (#15207) - **Server-side category** β Derive document category server-side and drop frontend predicates. (#15076) --- ## π§© Skills & Tools - **Drag skill chips** β Drag skills into chat input and register agent-document skills. (#15095) - **Slash menu** β Installed skills appear in the slash menu with a mid-line trigger. (#15061) - **Project skills** β Recognize project-level skills in the homogeneous agent runtime and surface them regardless of active device. (#15110, #15177) - **VFS archiving** β Archive oversized tool results to VFS instead of truncating. (#15074) - **@localfile mentions** β Drag folders into chat input as `@localFile` mentions on desktop. (#15071) --- ## π§ Model Runtime & Providers - **Error spec registry** β Unify error codes into a spec + pattern registry, split `ProviderBizError` into finer codes, classify Cloud-only codes via a tier digit, and add `DatabasePersistError`. (#15262, #15286, #15278, #15279) - **New models** β DeepSeek V4 Flash/Pro (opencode-go) and Gemini 3.5 Flash; DeepSeek V4 Pro on SiliconCloud. (#15031, #15001, #15017, #15267) - **Structured output** β Thinking params for structured output, Bedrock structured generation, and DeepSeek `generateObject` tool choice. (#15051, #15174, #15054) - **Cost** β Chat cost estimate support; preserve usage cost in custom streams. (#14876, #15218) --- ## π¬ Chat & User Experience - **Follow-up chips** β Extend follow-up chip suggestions to general chat with scene-specific model config. (#15101, #14797) - **Input drafts** β Persist unsent input drafts across tab switches and prevent repeated draft restore. (#14992, #15024) - **Command menu** β Order topic/message search by recency and promote inline type filters. (#15094, #14986) - **Zoom HUD** β Show a zoom-level HUD on Cmd +/β and Cmd 0. (#15294) - **Copy** β Unescape markdown escapes when copying user messages. (#15253) --- ## π₯οΈ Desktop - **App Nap fix** β Prevent App Nap from dropping the gateway WebSocket during display sleep. (#14994) - **File preview** β Preview `.cjs`/`.mjs`/no-extension files instead of binary fallback and expand `~` when opening local files. (#15168, #15284) - **Cross-platform settings** β Open settings via main-window navigation on Windows/Linux and restore the route after an update restart. (#15036, #14922) - **Token refresh** β Prevent frequent logout from token-refresh retries. (#14928) --- ## π Observability - **OTel GenAI** β Instrument Agent Runtime with OpenTelemetry GenAI semantic conventions. (#15123) - **Generation tracing** β Per-call `llm_generation_tracing` with a pre-allocated tracingId and recordFeedback router. (#15124, #15146) - **Error classification** β Persist `ERROR_CODE_SPECS` classification on operation errors. (#15273) --- ## ποΈ Database Migrations - **Batch migrations** β Topic usage stats, push tokens, `tasks.editor_data`, and document shares. (#15280) - **Tracing & eval tables** β Add `llm_generation_tracing` and agent eval experiment tables. (#15126) > Self-hosted operators should run the database migration (`pnpm db:migrate`, or restart with auto-migrate enabled) after upgrading. The changes are additive and backwards-compatible. --- ## π Security & Reliability - **Security:** Remove the `getPlaintextCred` tool to prevent plaintext credential exposure. (#14998) - **Security:** Prompt account selection for Google OAuth and add `prompt=consent` to the OIDC authorization URL to fix missing refresh tokens. (#15234, #15010) - **Reliability:** Preserve streamed content across a mid-stream cancel. (#15173) - **Reliability:** Bound the Redis command timeout and configure the Anthropic client timeout. (#15091, #15042) - **Reliability:** Prevent infinite recursion in the assistant chain. (#15288) --- ## π₯ Contributors Huge thanks to **15 contributors** who shipped **220 merged PRs** this cycle. @AnotiaWang Β· @sxjeru Β· @algojogacor Β· @hardy-one Β· @arvinxx Β· @Innei Β· @tjx666 Β· @lijian Β· @AmAzing129 Β· @rdmclin2 Β· @neko Β· @cy948 Β· @CanisMinor Β· @sudongyuer Β· @rivertwilight Plus @lobehubbot and renovate[bot] for maintenance. --- **Full Changelog**: v2.2.0...release/weekly-20260528
π» Change Type
π Related Issue
π Description of Change
Replaces the broken HTTP gateway approach for Hermes with direct CLI spawn β the correct architecture that mirrors how openclaw works.
Root cause of previous implementation:
hermes gatewayis a messaging platform gateway for Telegram/Discord/WhatsApp. It does not expose a/messageHTTP endpoint. The prior code was posting to a non-existent endpoint and had no response channel back to the UI.New architecture:
Hermes is spawned as a child process using
hermes chat --query <prompt> --quiet --accept-hooks [--resume <session_id>]. In quiet mode, Hermes printssession_id: <id>\n<response>to stdout. We capture this, relay the response viasendAutoNotify, and close withsendDoneSignalβ nobuildNotifyProtocolinjection needed.Files changed:
apps/cli/src/tools/heteroTask.tsβ rewrite Hermes branch: spawn CLI, capture stdout, persistsession_idto~/.lobehub/hermes-sessions.jsonfor multi-turn continuity, kill concurrent same-topic tasks by PID before spawning, unifycancelHeteroTaskto kill-by-PID for both agentsapps/desktop/src/main/controllers/GatewayConnectionCtr.tsβ mirror CLI logic, in-memoryhermesSessionMapfor session continuity, remove unusedgetHermesPort/isHermesRunning/startHermesGatewayhelpers, addgetHermesProfile+readHermesSoulDescriptionapps/cli/src/tools/getAgentProfile.tsβ implement Hermes profile:hermes profile listto find active profile (β),hermes profile showfor path, SOUL.md for descriptionapps/cli/src/tools/checkPlatformCapability.tsβ fix Hermes capability check: usehermes --versioninstead of the non-existent HTTP/healthendpointπ§ͺ How to Test
lh device checkCapability --platform hermesreturns the installed versionlh device getAgentProfile --platform hermesreturns profile name + avatarπ Additional Information
Session continuity for CLI is backed by
~/.lobehub/hermes-sessions.json(persists acrosslh connectrestarts). Desktop uses an in-memory map (lost on app restart β acceptable, creates a new session on next turn).