Talk to Hermes — streaming, conversational voice with barge-in — Voice mode used to mean: speak, wait for the whole reply to generate, then listen to one long audio file. Now Hermes speaks clause-by-clause as the response streams, you can i
Wake words and hands-free control — Say your own open-vocabulary wake phrase ("hey Hermes", or anything you pick) and Hermes starts listening — detection runs on-device, so no audio leaves your machine while it waits. Multi-profile voice ro
Voice on every platform — Send a voice note to Hermes on WhatsApp, Feishu, DingTalk, LINE, QQ, Photon, or Weixin and it's transcribed and answered; auto-TTS replies are delivered platform-aware (opus where platforms want opus, captions atta
Research you can trust — grounded citations with fact-checking — The new grounded-citations skill makes Hermes produce research where every claim is backed by a verifiable source: quotes are matched against the actual page text (not halluci
## What does this PR do? The classic CLI spinner now remains on one physical terminal row instead of pushing every timed repaint into Windows Terminal scrollback. The widget clips long status text before the terminal autowrap cell, preserving live progress while keeping the prompt stable. ### Symptom On Windows 10 with Windows Terminal and PowerShell, a long
## What does this PR do? Stops a Kanban worker immediately after it successfully hands custody off through `complete`, `block`, `request-review`, or `request-changes`, and binds the actual runtime provider/model/API mode/session to the corresponding durable run receipt. This closes two concrete failure modes observed in a bounded native-Kanban campaign: - a
## What Give embedded Hindsight package installs a 600-second budget while keeping the existing 120-second timeout for lightweight memory-provider SDKs. This applies consistently to: - `hermes memory setup` for `local_embedded` - active-provider restoration during `hermes update` - the Intel macOS slim embedded stack proposed in #81530 ## Why Hermes already
## Problem `.mailmap` line 89 maps `jonny@nousresearch.com` to `jquesnelle`, so all 62 commits authored with that email (54 as `yoniebans`, 8 as `jonny`) display under the wrong name in every mailmapped view: `git shortlog`, `git log --use-mailmap`, changelog generators, contributor stats. The raw commit metadata is correct; only the display mapping is wrong
## Summary On a Windows host with `terminal.backend: docker`, `vision_analyze` failed for every local image path routing to the in-container exec-read: `Path()` on Windows converts POSIX separators into backslashes, so `shlex.quote(str(p))` injected `\workspace\...\vision_test.png` into the Linux container command → "Only base64 data is allowed". ## Change (
## What does this PR do? Fixes `vision_analyze` failing on Windows hosts under the Docker terminal backend for any local path that routes to the in-container exec-read (sandbox paths like `/workspace/...`, container cache paths). The resolver built the read command from `str(Path(...))`, which on Windows yields backslash separators; the Linux container canno
## Summary `get-windows@9.3.0` was in `dependencies` of the desktop app — on Linux its install script (`node-pre-gyp install --fallback-to-build`) fails (404 prebuilt + gyp ModuleNotFoundError in the venv), breaking `npm ci` and the whole desktop build during `hermes update`. ## Change (platform-gated) - `apps/desktop/package.json`: `get-windows` moved from
## Summary On macOS, TCC permission grants (microphone, screen recording, etc.) are keyed to the resolved client binary path. The uv-managed Python interpreter lives in `~/.local/share/uv/python/cpython-<patch>-macos-*/bin/python3.11` — every patch bump creates a new directory → orphaned grants → permission prompts return after **every** update. Symlinks don
## Summary - Canonical root lock-held OAuth refresh/writeback with a random rotation-invariant grant identity. - Stale aliases converge; terminal failures quarantine matching aliases without touching independent grants/providers. - Native-Codex implementation/review preflight is strictly read-only, fail-closed, and runs before claim/spawn. - Compatibility is
Root cause for #85272, plus a three-line fix. ## What happens `check_telegram_requirements()` re-imports python-telegram-bot after a lazy install and rebinds the module-level aliases that the top-level `except ImportError` block set to `typing.Any`. **`TypeHandler` is missing from all three places**: the `global` declaration, the `from telegram.ext import (.
## What does this PR do? WeChat's CDN (novac2c.cdn.weixin.qq.com) rejects Python's default restrictive cipher list with SSLV3_ALERT_HANDSHAKE_FAILURE, causing all media file downloads (documents, images) to fail. Text messages work fine because they don't hit the CDN. The root cause is in gateway/platforms/weixin.py::_make_ssl_connector(). It creates an ssl.
Turning YOLO on in the settings page flips the real switch: approvals stop immediately. But the status-bar pill never updates, and switching sessions repaints it from a stale cached "off." The broken indicator then baits you into clicking the toggle again, which turns the bypass you already had **off**, and approvals mysteriously come back. From the user's c
## Summary Users who ran `grok-4.6` before its 500K catalog entry landed keep a stale persisted 256K context length forever — this drops that leftover so it re-resolves, and generalizes the guard so the whole class (MiniMax-M3, Grok-4.3/-4.6/-4-fast/-4.20, qwen3.6-plus) is covered by one rule instead of per-model patches. Salvages #84341 by @Julientalbot (ch
## Summary Widens the bundled Langfuse observability plugin from 6 hooks to 11 and fixes two attribution bugs, salvaged from PR #83437 by @erosika with adopted fixes from 8 prior community PRs. ## Changes - **Model attribution:** `on_pre_llm_request`/`on_post_llm_call` now prefer the wire value (`request["body"]["model"]`, `response_model`) over the stale ag
## Summary A `.drain_request.json` marker orphaned **without a machine restart** wedges the gateway in `draining` indefinitely — every inbound message on every platform is bounced with *"⏳ This agent is draining for a maintenance action…"* until someone manually deletes the marker. Observed in the field: a Hermes Cloud instance refused all Telegram turns for
## What does this PR do? Fixes #85431: in a native multiplex gateway, an active-session lease routed to a named profile leaks its slot on release, so after `max_concurrent_sessions` routed turns every new session is rejected — *"Hermes is at the active session limit (N/N)"* — even though no agent turn is running. ## Root cause `try_acquire_active_session()`
Fixes #78770. The forum-topic whitelist (`telegram.allowed_topics` / `TELEGRAM_ALLOWED_TOPICS`) and the two free-response gates (`free_response_chats` / `free_response_topics`) are fully implemented in `plugins/platforms/telegram/adapter.py` but were not discoverable from any documentation. This adds the three env vars to the reference table in `environment-
## Summary Consolidates and salvages three Honcho plugin PRs by @erosika (#83500, #83508, #83525) onto latest main, with review follow-up fixes applied on top. All three address distinct bug classes in the Honcho memory plugin that cause silent data corruption in multi-profile/self-hosted setups. ## What this PR makes true The Honcho plugin correctly isolate
Fixes #78697. `TELEGRAM_WEBHOOK_HOST` is read in `plugins/platforms/telegram/adapter.py` and controls the webhook bind host — critical for IPv6-only deployments (Fly.io 6PN) — but appeared nowhere in `website/docs/`. A scan of the adapter shows it reads ~22 `TELEGRAM_*` and `HERMES_TELEGRAM_*` env vars, of which several were undocumented. This PR adds: - `TE
Fixes #78710. Telegram inbound media routing is table-driven (`_TELEGRAM_IMAGE_EXTENSIONS`, `_TELEGRAM_IMAGE_MIME_TO_EXT`, `_TELEGRAM_IMAGE_EXT_TO_MIME`, `_TELEGRAM_VOICE_EXTS`, `_TELEGRAM_AUDIO_ATTACHMENT_EXTS`) and the three batch-debounce knobs (`HERMES_TELEGRAM_MEDIA_BATCH_DELAY_SECONDS`, `HERMES_TELEGRAM_TEXT_BATCH_DELAY_SECONDS`, `HERMES_TELEGRAM_TEXT_
## Summary - add an opt-in Slack shared-channel approval gate before normal message dispatch, including Slack slash-command dispatch - store local approval/pending/revoked channel state per Hermes profile with team-scoped keys where Slack team IDs are available - honor configured approval owners/agent aliases with exact `approve <agent> here` / `revoke <agen
## Summary Adds the foundation of **Hermes Enterprise**: a standalone control-plane core (resource model, fail-closed resource store, audit log, and driver contracts) for deploying and operating fleets of Hermes agents multi-tenant on Kubernetes — with the hermes-agent runtime as the Harness. Part of the one-wave Enterprise draft series; this PR defines the
## Summary Docs for #85232: the delegation feature page now documents the model-facing `delegate_task` control actions (`action='list'/'steer'/'stop'`) alongside the existing TUI/gateway `subagent.steer` RPC section. ## Changes - `website/docs/user-guide/features/delegation.md`: "Steering a Running Subagent" split into model-facing (delegate_task action para
## Summary Slack adapter now reads real slack_sdk response objects — user name resolution, bot detection, ephemeral send confirmation, and thread `ts` reads all work again. Salvage of #74658 by @nikitaBarkov onto current main, authorship preserved. Root cause: commits from #69483/#70196/#69479 added `isinstance(resp, dict)` gates on Web API responses, but `S
## Summary Auxiliary tasks (titles, compression, vision) work again on `custom` providers whose base_url ends in `/anthropic` (MiniMax, Zhipu, LiteLLM proxies). Salvage of #64891 by @AlexanderPrendota onto current main, authorship preserved. Fixes #16254 (dup #17086). Root cause: the explicit-base branch of `resolve_provider_client()` rewrote `/anthropic` →
## Summary Salvage of #85009 by @victor-kyriazakos: opt-in Relay session-scope segmentation so continuous gateway sessions export session-level telemetry at turn boundaries instead of holding one unexported span open for weeks — plus a LIFO-safety fix and docs on top. Relay export is close-driven; a Telegram/Slack session that never ends means the session ro
## Summary Native IAM for the Hermes Enterprise control plane: Principals, ServicePrincipals, WorkloadIdentities, Groups, Roles, AccessBindings, and Restrictions, with a deny-by-default `OCCIAMAdapter` implementing the `IAMAdapter` contract from #85461. Stacked on #85461 (`ent/core`). Part of the one-wave Enterprise draft series. ## Changes - `enterprise/iam
## Summary The v1 `ComputeDriver`: provisions candidate workloads on Kubernetes via `kubectl` (no python k8s dependency). Candidates are created at `replicas: 0` — the harness literally cannot start until the controller activates the revision and the driver scales to 1. Stacked on #85461 (`ent/core`). Part of the one-wave Enterprise draft series. ## Changes
## Summary Packaging to run Hermes Enterprise on a cluster: one multi-stage image serving both the controller (`python -m enterprise.cli`) and per-namespace gateways, a Helm chart with least-privilege RBAC scoped to `hermes-*` namespaces, and a guarded smoke script. Stacked on #85461 (`ent/core`). Part of the one-wave Enterprise draft series. ## Changes - `d
## Summary Docs-site section for Hermes Enterprise: five pages (overview, concepts, deployment, installation, security) registered as a new **Enterprise** sidebar category. All pages carry a draft-status admonition since they document the in-flight `ent/*` series. Stacked on #85461 (`ent/core`). Part of the one-wave Enterprise draft series. ## Changes - `web
## Summary Makes DeepSeek wire replay token- and cache-efficient: `reasoning_content` is only serialized on assistant turns that carried tool calls (the official thinking-mode passback rule), assistant `content` is normalized to `""` (never null), and `reasoning_effort` uses the official DeepSeek vocabulary `off|high|max`. Root cause: Hermes replayed `reason
## Summary Adds a key-gated integration test that proves prompt-cache hits on multi-step DeepSeek conversations: after the first request, every subsequent request must report `cache_read_tokens > 0` because it shares a byte-identical prefix with its predecessor. Root cause: Hermes has no regression guard for prompt-cache stability. A silent prefix-breaking c
## Summary Prunes oversized tool results in their own message node — same position, same role, same `tool_call_id` — down to `head + marker + tail`, as a no-LLM pre-pass that runs BEFORE the summarization region is selected. Shrinking oversized tool bodies often makes the transcript fit the tail budget, skipping the summarizer entirely. Root cause: giant too
## Summary When `tools.spill.enabled` is true and a tool result's UTF-8 size exceeds `tools.spill.max_inline_bytes`, the full text is written ONCE to a session-scoped file and the inline message becomes a bounded head/tail preview plus a locator notice the model follows with `read_file`. Root cause: large unique tool outputs (web extractions, dumps) grow the
## Summary Summarization calls now replay a genuine prefix of the last routed request: the conversation's own system prompt, the real tool schemas, the protected head + compacted region as actual chat messages in order, with the summarization instruction as the final user message. Auxiliary session-title calls force thinking OFF so the titler never burns its
## Summary Adds advisory loop hygiene: consecutive identical tool calls (same tool name + canonically identical arguments) get a soft reminder appended to the tail of the current tool result when the run length hits a threshold — escalating tone at 3, 5, and 8 repeats. Root cause: models can loop on the same tool call with identical arguments, burning tokens
## Summary A failing delegation child (model error, timeout, user cancel, token budget) now settles into a structured result entry instead of surfacing as a lost failure: each `delegate_task` result gains an additive `stop_reason` (`completed|aborted|error|max-tokens`; `refusal` is reserved — Hermes has no refusal signal today) and, when the failure would ot
## Summary Adds a single `jobs` tool (action enum `start|list|output|kill`) that gives the agent owned background jobs with async collection, reusing the existing process registry (terminal background infrastructure) — no new process-management layer. Root cause: Hermes could run background processes via the terminal tool, but the agent had no owned job life
## Summary Adds an opt-in `continuable` flag to `delegate_task` that gives every child a durable identity without changing the default delegation model: result entries carry `child_session_id` (the child's persisted session id, linked to the parent via `parent_session_id`) plus the ephemeral `subagent_id`, the async completion event renders a settlement noti
## Summary Extends `delegate_task` with a `workflow` mode: the parent describes an ordered list of steps, each either a `parallel` fan-out (independent items under a semaphore) or a `pipeline` of sequential stages (output of stage N is appended to the context of stage N+1's prompts). Item failure never kills the batch — a failed item becomes a structured err
## Summary A `kimi-coding` streaming request blocked **forever** in httpcore header read — no timeout applied, fallback never engaged, the run had to be killed externally. ## Root cause Two layers: (1) the keepalive HTTP clients had `httpx.Timeout(read=None)` as a floor (per-request timeout still applied for most providers, but the floor made any path that s
## Summary Adds Azure Foundry as a backend provider for the `image_generate` tool. Organizations using Azure-hosted GPT Image deployments can now keep image generation in-platform instead of switching out. ## Change (plugin, per Contributing guide) - `plugins/image_gen/azure-foundry/` (new): `plugin.yaml` (backend manifest, `requires_env: AZURE_FOUNDRY_IMAGE
## Problem In a mention-gated WhatsApp group (`require_mention: true`), messages that don't address the bot never reach the session transcript. When someone finally @-mentions the bot, it answers **blind to the conversation around it** — it can't even see the message immediately above the one that tagged it. Every other group-capable platform already solves
## Summary Timed-out (or exception-failed) subagents stay stuck as **"running"** in the desktop Agents panel and status-bar count forever — spinner glyph, counted in "Agents N running", never pruned — even though the parent conversation already received the failure. ## Root cause Status-vocabulary drift between the Python backend and the desktop store. The b
## Summary - reject empty or malformed successful size/line-count probes instead of coercing them to zero - reject empty in-range content for a known nonempty regular file - add transport-shaped regressions for linked-worktree and delegation-summary false empties ## Verification - `scripts/run_tests.sh tests/tools/test_file_operations_edge_cases.py tests/too