Skip to content

feat(voice): chat UX polish — busy-aware silence, stop hint, thinking sounds, barge-in fix - #74000

Merged
teknium1 merged 8 commits into
mainfrom
feat/voice-chat-ux-polish
Jul 29, 2026
Merged

feat(voice): chat UX polish — busy-aware silence, stop hint, thinking sounds, barge-in fix#74000
teknium1 merged 8 commits into
mainfrom
feat/voice-chat-ux-polish

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Voice chat UX polish — four live-tested fixes (one branch)

Branch: feat/voice-chat-ux-polish @ c407f90 (5 commits off current main)

Summary

Four voice-chat UX improvements from Teknium's live testing of the new voice
stack, plus a salvage of PR #71083 (@beardedeagle, authorship preserved):

  1. Silence never ends the chat while the agent is busy or TTS is playing.
  2. "Say "stop" to end the voice chat." notice on voice-mode start — CLI,
    TUI, and desktop, i18n'd, sourced from voice.stop_phrases.
  3. Ambient "thinking" sound — calm synthesized bubble blips while the
    agent works with no audio flowing (config off-switch, volume-respecting,
    macOS-TCC-safe).
  4. Spoken barge-in fixed on every TTS playback path — CLI whole-file
    fallback, gateway fallback speak, voice.tts RPC; plus fix(voice): rolling-window VAD to prevent false barge-in during TTS #71083's
    rolling-window VAD against false barges during streaming playback.

Item 1 — silent cycles never end the chat while the agent works

Root cause. Both no-speech counters (the shared continuous loop in
hermes_cli/voice.py _CONTINUOUS_NO_SPEECH_LIMIT=3, and cli.py's
_no_speech_count >= 3) counted every silent capture cycle unconditionally.
During a multi-minute agent turn or while TTS plays, the user is CORRECTLY
silent — three cycles later the voice chat shut off under them.

Fix.

  • hermes_cli/voice.py: new set_voice_busy_probe(probe) seam +
    _voice_activity_held() — held while TTS plays (existing _tts_playing
    Event) or the registered probe says the agent is mid-turn. Both strike
    paths (continuous-loop and force-transcribe single-shot) skip counting
    while held; they keep listening. Fail-open: a broken probe counts cycles
    as before, so the chat can never become immortal.
  • tui_gateway/server.py: registers _any_session_running() (any session's
    running flag — voice is process-global) as the probe on voice.record
    start.
  • cli.py: classic-CLI strike path skips counting while _agent_running
    or _voice_tts_done is unset.
  • Stop phrase and barge-in still work during the hold (dedicated tests).

Live-test. Start a voice chat, ask for something that runs tools for
2+ minutes, stay silent → chat stays alive; after the reply, stay silent for
3 cycles → chat ends as before. Say "stop" mid-turn → chat ends immediately.

Item 2 — stop-phrase notice on voice-mode start

One owner for the wording: voice_stop_hint() in tools/voice_mode.py
Say "<first stop phrase>" to end the voice chat.; returns "" when
stop_phrases: [] (feature disabled → no hint anywhere).

  • CLI: printed in /voice on output (dim, style-matched).
  • TUI: voice.toggle action=on response now carries stop_hint; the Ink
    client renders it in the "Voice mode enabled" block. Older gateways omit
    the field — no hint, no crash.
  • Desktop: the renderer voice loop never touches tools/voice_mode.py,
    so the phrase is read from config (voice.stop_phrases
    $voiceStopPhrase store, seeded in use-hermes-config) and shown as an
    info toast when a voice conversation starts.

i18n coverage: desktop en, ja, zh, zh-hant, ar
(notifications.voice.sayStopToEnd(phrase)). ui-tui has no i18n catalog
(all transcript strings are English) — hint follows suit.

Live-test. /voice on (CLI/TUI) and desktop voice button → hint shows;
set voice.stop_phrases: ["goodbye hermes"] → hint shows the custom phrase;
set [] → no hint.

Item 3 — ambient "thinking" sound

New: while the agent processes a voice-mode turn and no speech audio is
flowing, quiet repeating "blub blub" bubbles play so the user knows the agent
is alive.

  • Synthesis (tools/voice_mode.py): pure numpy — two alternating low
    pitches (G4/E4) with a downward pitch glide, smooth attack + exponential
    decay (no clicks), ~0.8–1.2 s randomized spacing. No binary assets.
  • Volume: voice.beep_volume × 0.5 (deliberately quieter than beeps).
  • Config: voice.thinking_sound: true|false (default true) — added
    to DEFAULT_CONFIG; desktop reads the same key.
  • macOS TCC: _sounddevice_output_allowed() gate → the loop exits
    silently on macOS (per-second afplay churn judged worse than silence;
    documented in the code).
  • Lifecycle: daemon thread with a stop Event.
    • CLI: started when a voice-mode turn begins in chat(); per-blip gate
      skips while TTS speaks / mic records / barge capture owns the mic;
      stopped in the finally on every exit path.
    • Gateway: same seams around _run_prompt_submit (voice mode on), gated
      on the new is_audio_output_active() ref-count + continuous capture.
    • New mark_audio_output_active() ref-count brackets play_audio_file
      and the streaming OutputStream sentence writes, so "audio is flowing"
      is accurate rather than inferred from per-turn events.
  • Desktop decision: the desktop voice conversation renders audio in the
    RENDERER (WebRTC mic + WebAudio/audio-element playback), not through the
    backend — so it gets a matching renderer implementation
    (src/lib/thinking-sound.ts, WebAudio oscillators, same envelope/pitches)
    driven by conversation status === 'thinking'; honors
    voice.thinking_sound and the shared sound-mute toggle; stops instantly
    on speaking/listening/end. No voice.thinking gateway event needed.

Live-test. Voice chat, ask a long question → soft bubbles while it
thinks; they stop the instant speech starts; voice.thinking_sound: false
silences them; on macOS CLI they are (deliberately) absent.

Item 4 — spoken barge-in

Premise check on live main (what actually existed vs. what was broken):

Path Barge monitor on main? Verdict
CLI streaming pipeline (chat() use_streaming_tts) YES (_voice_barge_in_monitor) worked
CLI whole-file fallback (_voice_speak_response_async — fires whenever streaming can't start: sounddevice missing, probe fails) NO broken — nothing armed; speech uninterruptible
Gateway streaming pipeline (_tts_stream_begin) YES (#73933) worked
Gateway fallback speak (tts_queue is None → speak_text) + voice.tts RPC NO broken — speak_text's internal streaming dispatch even created a PRIVATE stop event nothing could reach
Desktop renderer conversation (voice-barge-in.ts) YES (live-stream + fallback both wired via openBargeMonitor) verified, no change
False barges during TTS (stale one-shot VAD calibration) broken class fixed by salvaged #71083

This composition explains "interruption does not work in practice": whenever
the streaming pipeline didn't engage (very common — sounddevice missing or
provider probe failing routes to fallback), speech was un-barge-able; and
when streaming DID engage, the old one-shot VAD floor caused false trips or
mis-calibration.

Fixes.

  • Salvaged fix(voice): rolling-window VAD to prevent false barge-in during TTS #71083 (@beardedeagle, cherry-picked with authorship):
    rolling-window VAD (90th-percentile deque floor, 8× multiplier, 4000-RMS
    trigger ceiling, min-floor clamp), voice.barge_in_grace_seconds
    (default 2.0 s, now documented in DEFAULT_CONFIG) before the mic opens,
    duplicate-render suppression, TTS-CUT diagnostics. Fixture follow-up: the
    fake tools.tts_tool module needed _load_tts_config (main's
    tts_streaming now imports it).
  • CLI fallback: _voice_speak_response_async arms
    _voice_barge_in_monitor in continuous voice mode (stop_playback()
    kills the file player, so the same machinery covers this path).
  • Gateway: new _speak_text_with_barge() — runs
    _tts_stream_barge_in_monitor beside the speak thread; used by both the
    fallback whole-reply path and the voice.tts RPC.
    hermes_cli.voice.speak_text / _speak_text_streaming accept an external
    stop_event so a barge cuts an internal streaming dispatch too
    (mark_speech_interrupted latch preserved; stop-phrase check inherited
    from the shared monitor — merged fix(voice): saying or typing 'stop' ends the voice chat on every surface #73933 behavior).

Live-test. CLI /voice on + TTS with and WITHOUT a streaming provider
configured → talk over the reply → playback cuts, your interruption is
transcribed and submitted; say "stop" over the reply → chat ends. Desktop:
same over both streamed and fallback speech.

Validation

Check Result
tests/hermes_cli/test_voice_wrapper.py (59)
tests/tools/test_voice_mode.py (129, incl. #71083's 4 new VAD tests)
tests/tools/test_voice_stop_phrase.py (+3 hint tests)
tests/tools/test_voice_thinking_sound.py (13, new)
tests/tools/test_voice_cli_integration.py (+3 fallback-barge tests)
tests/tools/test_tts_streaming.py + _e2e
tests/test_tui_gateway_server.py (491, incl. +1 stop_hint, +2 barge) ✅ (full file)
Combined targeted run 864 passed
Sabotage-verified item 1 (hold removed → 3 tests fail), item 2 (hardcoded phrase → custom-phrase test fails), item 3 (TCC gate removed → macOS test fails), item 4 (monitor arming removed → CLI + gateway tests fail)
ruff (all touched py) ✅ clean
desktop npm run typecheck
desktop vitest (voice suites + composer, 31 files / 223 tests)
desktop eslint 0 errors (67 pre-existing warnings)
ui-tui typecheck + vitest (131 files / 1417 tests)
Pre-push gate rebased onto main, behind=0, only intended files in diff

Note: two full-tests/hermes_cli runs showed thousands of OSError errors —
traced to /tmp tmpfs filling up mid-run (No space left on device), not
code; scoped re-runs of every affected file pass.

Config keys added / documented

i18n coverage

  • Desktop: sayStopToEnd added to en, ja, zh, zh-hant, ar
    (+ types.ts contract).
  • ui-tui: no i18n catalog exists; hint is backend-provided English text like
    every other transcript system note.

Decisions / deferred

  • Desktop thinking sound is renderer-side (WebAudio), not a
    voice.thinking gateway event — desktop voice audio renders entirely in
    the renderer, and the backend blips would play on the wrong machine for
    remote gateways. Matches the wake-sound/completion-sound pattern.
  • Two stop matchers remain (backend is_voice_stop_phrase exact-match
    vs desktop voice-stop-word.ts wider list) — known consolidation target
    per the voice skill; NOT unified here (out of scope, the notice sources
    each surface's own config phrase).
  • macOS thinking sound: silent skip (TCC gate). Routing per-blip audio
    through afplay would spawn a subprocess every second; judged worse than
    silence. Revisit if macOS users ask for it.
  • fix(voice): rolling-window VAD to prevent false barge-in during TTS #71083: salvaged in full (all 5 files, clean cherry-pick, author
    beardedeagle). Original PR can be closed with credit once this merges.

Salvage credit

Infographic

Voice chat UX polish

beardedeagle and others added 6 commits July 29, 2026 01:35
…eway mirror

Replace one-shot VAD calibration with a rolling deque window that
continuously recalibrates the noise floor throughout TTS playback,
preventing false barge-in triggers from stale calibration. Add a
grace period before VAD activates so TTS playback establishes first.
Suppress duplicate text rendering when token streaming is enabled.
Mirror the barge-in and TTS stream stop logic to the TUI gateway path
so both CLI and gateway use the same VAD semantics.

Rolling-window VAD:
- 90th percentile of rolling window (~3s) for noise floor
- 8x multiplier (was 5x) for TTS volume variation headroom
- 4000 RMS trigger ceiling so genuine speech can still trip
- min_floor clamped to SILENCE_RMS_THRESHOLD * 2
- sustained_ms=1000, calibration_ms=800

Barge-in grace period (barge_in_grace_seconds, default 2.0s):
Delays VAD activation so TTS playback establishes before the mic opens.

Duplicate render suppression:
When streaming_enabled, pass display_callback=None to
stream_tts_to_speaker so the token stream is the sole display path.

TUI gateway mirror:
Mirror _tts_stream_stop and _tts_stream_barge_in_monitor changes to
tui_gateway/server.py so both code paths use the same VAD parameters,
grace period, and TTS CUT diagnostic logging.

Profile-scoped session DB and MoA progress events in tui_gateway/server.py
were necessitated by the TTS pipeline changes affecting session state
and event routing.

Normal-exit flag and TTS CUT diagnostic logging at all cut paths.

Regression tests:
- test_quiet_then_loud_playback_does_not_trip
- test_8x_multiplier_absorbs_tts_volume_spikes
- test_trigger_ceiling_lets_genuine_speech_trip
- test_silence_calibration_does_not_false_trip_on_tts
- test_tts_stream_stop_latches_interruption_for_next_turn
- test_tts_stream_stop_after_natural_finish_does_not_latch
- Profile-scoped session DB tests (10 tests)
…or TTS is playing

The continuous-voice no-speech counter (3 strikes -> voice off) counted
every silent capture cycle unconditionally. During a long agent turn
(thinking/tool-calling for minutes) or while TTS is speaking, the user
is CORRECTLY silent — those cycles ended the voice chat under them.

- hermes_cli/voice.py: new set_voice_busy_probe() seam + _voice_activity_held()
  (TTS-playing via the existing _tts_playing Event, agent-busy via the
  registered probe). Both the continuous-loop strike path and the
  force-transcribe single-shot strike path skip counting while held.
  Fail-open: a broken probe counts cycles as before.
- tui_gateway/server.py: registers _any_session_running() as the probe
  on voice.record start (voice is process-global; any running session holds).
- cli.py: classic CLI strike path skips counting while _agent_running
  or TTS playback is in flight.

Stop phrase and barge-in still work during the hold (own paths).
Includes a fixture fix for the #71083 cherry-pick: the fake tools.tts_tool
module needs _load_tts_config (main's tts_streaming imports it).
…e-mode start (CLI/TUI/desktop, i18n)

One owner for the wording: voice_stop_hint() in tools/voice_mode.py —
sources the phrase from voice.stop_phrases (first entry) so a custom
phrase renders correctly, and returns "" when the feature is disabled
(stop_phrases: []) so no surface shows a hint.

- CLI: printed in /voice on output (style-matched dim notice).
- TUI: voice.toggle action=on now carries stop_hint; the Ink client
  renders it in the "Voice mode enabled" block (older gateways omit
  the field — no hint, no crash).
- Desktop: the renderer voice loop never touches tools/voice_mode.py,
  so the phrase is read from config (voice.stop_phrases → $voiceStopPhrase
  store, seeded in use-hermes-config) and shown as an info toast when a
  voice conversation starts. i18n: en/ja/zh/zh-hant/ar.
…oice chat

Long thinking/tool stretches in a voice conversation are dead air — the
user cannot tell whether the agent is alive. New: quiet, repeating soft
bubble blips while the agent works and no speech audio is flowing.

- tools/voice_mode.py: numpy-synthesized blips (no binary assets) — two
  alternating low pitches (G4/E4) with pitch glide + smooth attack/decay
  envelopes, ~0.8-1.2s randomized spacing, volume = voice.beep_volume * 0.5.
  start_thinking_sound(should_play=...) / stop_thinking_sound() daemon-loop
  lifecycle; macOS-TCC-safe (sounddevice output gated there → silent skip,
  no per-second afplay churn). New mark_audio_output_active()/
  is_audio_output_active() ref-count wraps play_audio_file and the
  streaming OutputStream sentence writes so "audio is flowing" is accurate.
- Config: voice.thinking_sound (default true) off-switch.
- cli.py: starts when a voice-mode turn begins, per-blip gate skips while
  TTS speaks / mic records / barge capture owns the mic; stopped in the
  chat() finally on every exit path.
- tui_gateway/server.py: same lifecycle around _run_prompt_submit turns
  (voice mode on), gated on is_audio_output_active + continuous capture.
- Desktop: renderer owns voice-conversation audio, so a matching WebAudio
  implementation (src/lib/thinking-sound.ts, same envelope/pitches) runs
  while conversation status === "thinking"; honors voice.thinking_sound
  (via config store) and the shared sound-mute toggle; stops instantly on
  speaking/listening/end.
…ateway/desktop backends)

Premise check on live main: barge-in machinery EXISTS for the per-turn
STREAMING pipeline only — cli.py chat() arms _voice_barge_in_monitor and
tui_gateway _tts_stream_begin arms _tts_stream_barge_in_monitor. What was
actually broken for spoken interruptions:

1. CLI whole-file fallback (_voice_speak_response_async — used whenever
   streaming TTS cannot start: sounddevice missing, requirement probe
   fails): NO monitor was ever armed, so talking over the reply did
   nothing. Now arms _voice_barge_in_monitor in continuous voice mode.
2. Gateway fallback speak (tts_queue None → speak_text thread) and the
   voice.tts RPC (desktop-triggered speech): speak_text ran bare, and
   its internal streaming dispatch created a PRIVATE stop event nothing
   could reach — uninterruptible even by stop_playback(). New
   _speak_text_with_barge() runs the same barge monitor beside the speak
   thread; hermes_cli.voice.speak_text/_speak_text_streaming accept an
   external stop_event so a barge cuts the streaming pipeline too.
   Stop-phrase handling and voice.transcript submission are inherited
   from the shared monitor (merged #73933 behavior preserved).
3. False barge during TTS (the reason interruption "worked" then
   self-cancelled or fired randomly): salvaged PR #71083 by @beardedeagle
   (previous commit, kept authorship) — rolling-window VAD floor, 8x
   multiplier, 4000-RMS trigger ceiling, barge_in_grace_seconds (2s)
   before the mic opens, min-floor clamp. barge_in_grace_seconds is now
   documented in DEFAULT_CONFIG.

Desktop spoken barge (renderer mic via voice-barge-in.ts) already covers
both its live-stream and fallback speech paths — verified, no change.
@github-actions

github-actions Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

૮ >ﻌ< ა ci review

ran on 7e22f78

all good!

@alt-glitch alt-glitch added type/feature New feature or request comp/cli CLI entry point, hermes_cli/, setup wizard comp/tui Terminal UI (ui-tui/ + tui_gateway/) comp/desktop Electron desktop app (apps/desktop/*) tool/tts Text-to-speech and transcription area/config Config system, migrations, profiles sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades P3 Low — cosmetic, nice to have labels Jul 29, 2026
@teknium1
teknium1 merged commit b6729ba into main Jul 29, 2026
48 checks passed
@teknium1
teknium1 deleted the feat/voice-chat-ux-polish branch July 29, 2026 15:24
gabrielcosi pushed a commit to gabrielcosi/home-ops that referenced this pull request Aug 5, 2026
….7.30 ➔ v2026.8.3) (#253)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/gabrielcosi/hermes-agent](https://github.com/NousResearch/hermes-agent) | minor | `v2026.7.30` → `v2026.8.3` |

---

### Release Notes

<details>
<summary>NousResearch/hermes-agent (ghcr.io/gabrielcosi/hermes-agent)</summary>

### [`v2026.8.3`](https://github.com/NousResearch/hermes-agent/releases/tag/v2026.8.3): Hermes Agent v0.20.0 (2026.8.3)

[Compare Source](https://github.com/NousResearch/hermes-agent/compare/v2026.7.30...v2026.8.3)

##### Hermes Agent v0.20.0 (v2026.8.3)

**Release Date:** August 3, 2026
**Since v0.19.0:** \~3,650 commits · \~1,400 merged PRs · \~5,200 files changed · \~559,000 insertions · \~405,000 deletions · **\~1,200 issues closed** · 650+ contributors

> **The Herald Release.** Hermes is the herald of the gods, and this release makes him one in earnest: he **speaks** (real-time conversational voice with streaming TTS, barge-in, on-device wake words, and hands-free control across the CLI, desktop, and every audio-capable gateway platform), he **carries word to other agents** (A2A v1.0), he **announces events to your systems** (signed outbound webhooks), and he **cites his sources** (grounded research with verifiable citations and fact-checking). Around that spine: the desktop app became a platform (artifacts with live preview, a plugin SDK, quick-entry from anywhere, multiple windows), the CLI got a wave of power commands (`!` shell mode, `/init`, `/diff`, `/context`, `/focus`), compression got smarter and gentler, and the tools themselves now recover from their own failures instead of making the model guess. This release rolls up everything from the v0.19.1 infrastructure patch tag — that window is fully documented here.

***

##### ✨ Highlights

- **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 interrupt it mid-sentence by just talking (it stops, listens, and the model is told you cut in), and busy-aware silence detection means it doesn't talk over you. This works in CLI voice mode, on the desktop, and through gateway adapters. Talking to Hermes finally feels like a conversation, not a voicemail exchange. ([#&#8203;69511](https://github.com/NousResearch/hermes-agent/pull/69511), [#&#8203;73862](https://github.com/NousResearch/hermes-agent/pull/73862), [#&#8203;74223](https://github.com/NousResearch/hermes-agent/pull/74223), [#&#8203;74000](https://github.com/NousResearch/hermes-agent/pull/74000), [#&#8203;69602](https://github.com/NousResearch/hermes-agent/pull/69602) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **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 routing means different wake words can reach different profiles, and saying "stop" ends the voice chat on every surface without touching the keyboard. Your terminal is now something you can talk to from across the room. ([#&#8203;70509](https://github.com/NousResearch/hermes-agent/pull/70509), [#&#8203;73106](https://github.com/NousResearch/hermes-agent/pull/73106), [#&#8203;73933](https://github.com/NousResearch/hermes-agent/pull/73933) — [@&#8203;teknium1](https://github.com/teknium1))

- **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 attached correctly). STT is now fully configurable — its own `hermes tools` category, GUI toggles, dashboard dropdowns, unified language resolution so transcripts stop coming back in the wrong language, and OpenAI's gpt-transcribe support. One unified spoken-text preprocessor cleans markdown, code, and URLs out of speech across all TTS providers. ([#&#8203;73515](https://github.com/NousResearch/hermes-agent/pull/73515), [#&#8203;73508](https://github.com/NousResearch/hermes-agent/pull/73508), [#&#8203;73910](https://github.com/NousResearch/hermes-agent/pull/73910), [#&#8203;73513](https://github.com/NousResearch/hermes-agent/pull/73513), [#&#8203;73067](https://github.com/NousResearch/hermes-agent/pull/73067) — [@&#8203;teknium1](https://github.com/teknium1))

- **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 hallucinated), citations link to the exact evidence, and a fact-checking mode turns the same machinery on any document or claim you hand it — it tells you what checks out, what doesn't, and what couldn't be verified. If you use Hermes for research, this is the difference between "sounds right" and "provably sourced." ([#&#8203;71698](https://github.com/NousResearch/hermes-agent/pull/71698), [#&#8203;77104](https://github.com/NousResearch/hermes-agent/pull/77104) — [@&#8203;teknium1](https://github.com/teknium1))

- **Outbound webhooks — Hermes pushes events to your systems** — Until now, integrating with Hermes meant polling or listening on a platform. Now Hermes pushes **signed lifecycle events** (session activity, turn completions, tool events) to any HTTP endpoint you register — with HMAC signatures so your receiver can verify authenticity. Wire Hermes into your CI, your home automation, your dashboards, or any service that speaks HTTP, with no polling loop. ([#&#8203;69406](https://github.com/NousResearch/hermes-agent/pull/69406) — [@&#8203;teknium1](https://github.com/teknium1))

- **The desktop app becomes a platform — artifacts, plugin SDK, quick entry** — Hermes desktop now renders **artifacts**: versioned cards with sandboxed live preview in a right-rail viewer, so generated HTML/apps run safely next to the chat. A real **plugin SDK** landed with Kanban as its founding plugin, `ctx.download` for handing users files, floating pane placement, and multiple GUI windows. A global-hotkey **quick-entry window** captures a thought into any session from anywhere in your OS. The desktop stopped being a chat client and started being a workbench. ([#&#8203;72345](https://github.com/NousResearch/hermes-agent/pull/72345), [#&#8203;61173](https://github.com/NousResearch/hermes-agent/pull/61173), [#&#8203;74413](https://github.com/NousResearch/hermes-agent/pull/74413), [#&#8203;72315](https://github.com/NousResearch/hermes-agent/pull/72315), [#&#8203;68259](https://github.com/NousResearch/hermes-agent/pull/68259), [#&#8203;73143](https://github.com/NousResearch/hermes-agent/pull/73143) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))

- **Hermes speaks Agent-to-Agent — A2A v1.0** — A new bundled plugin implements the Agent-to-Agent protocol, so Hermes can discover, talk to, and be driven by other A2A-compatible agents. This closes issue [#&#8203;514](https://github.com/NousResearch/hermes-agent/issues/514) — one of the oldest open feature requests in the repo. If you're building multi-agent systems with heterogeneous stacks, Hermes now has a standard wire protocol for joining them. ([#&#8203;77109](https://github.com/NousResearch/hermes-agent/pull/77109) — [@&#8203;teknium1](https://github.com/teknium1))

- **CLI power-user wave** — `!command` runs a shell command instantly without spending a model turn. `/init` scans your project and generates (or updates) an `AGENTS.md`. `/diff` shows staged/all/session changes from any surface, `/context` breaks down exactly what's filling your context window, `/focus` gives you a reduced-output view with hidden-line recovery, and Ctrl+S stashes a half-written prompt into a browsable panel. Plus `hermes import-agent` migrates your Claude Code or Codex CLI setup into Hermes in one command. ([#&#8203;72257](https://github.com/NousResearch/hermes-agent/pull/72257), [#&#8203;72178](https://github.com/NousResearch/hermes-agent/pull/72178), [#&#8203;72240](https://github.com/NousResearch/hermes-agent/pull/72240), [#&#8203;72242](https://github.com/NousResearch/hermes-agent/pull/72242), [#&#8203;72302](https://github.com/NousResearch/hermes-agent/pull/72302), [#&#8203;72262](https://github.com/NousResearch/hermes-agent/pull/72262), [#&#8203;72190](https://github.com/NousResearch/hermes-agent/pull/72190) — [@&#8203;teknium1](https://github.com/teknium1), several salvaging long-standing community PRs)

- **Correct the agent mid-turn — redirects** — If Hermes is heading the wrong way, you no longer have to `/stop` and re-explain. Type a correction while it works and the active turn is redirected: work in flight is preserved, the original prompt is kept, and the agent course-corrects with your new guidance. Paired with double-ESC draft discard and a composer undo stack, steering feels like editing, not restarting. ([#&#8203;63104](https://github.com/NousResearch/hermes-agent/pull/63104), [#&#8203;72339](https://github.com/NousResearch/hermes-agent/pull/72339), [#&#8203;74736](https://github.com/NousResearch/hermes-agent/pull/74736) — [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **Tools that fix themselves** — A sweep of self-recovery upgrades means the agent wastes far fewer turns on tool friction: truncated terminal output spills to a file the agent can read back, `patch` detects already-applied edits and diagnoses whitespace mismatches, `write_file` verifies content on disk, searches that match nothing probe for near-misses and recover, and common failure classes come back with actionable hints. The default tool-calling iteration limit also jumped 90 → 500 — long autonomous runs stopped hitting an artificial wall. ([#&#8203;77041](https://github.com/NousResearch/hermes-agent/pull/77041), [#&#8203;76998](https://github.com/NousResearch/hermes-agent/pull/76998), [#&#8203;77024](https://github.com/NousResearch/hermes-agent/pull/77024), [#&#8203;77055](https://github.com/NousResearch/hermes-agent/pull/77055), [#&#8203;77011](https://github.com/NousResearch/hermes-agent/pull/77011), [#&#8203;76992](https://github.com/NousResearch/hermes-agent/pull/76992), [#&#8203;72176](https://github.com/NousResearch/hermes-agent/pull/72176) — [@&#8203;teknium1](https://github.com/teknium1))

- **Compression that respects your conversation** — Context compression got a deep overhaul: proactive tool-result pruning for large-window models, per-turn micro-compaction that amortizes the cost instead of one giant pause, a guaranteed N-user-message tail so recent conversation always survives, progress-aware timeouts that stop punishing slow summary models, and ghost-skill defense so a pruned skill can never silently haunt a session. Thresholds are now configurable per-model and in absolute tokens. Long sessions stay coherent and stop stalling. ([#&#8203;70254](https://github.com/NousResearch/hermes-agent/pull/70254), [#&#8203;75345](https://github.com/NousResearch/hermes-agent/pull/75345), [#&#8203;70250](https://github.com/NousResearch/hermes-agent/pull/70250), [#&#8203;71508](https://github.com/NousResearch/hermes-agent/pull/71508), [#&#8203;70275](https://github.com/NousResearch/hermes-agent/pull/70275) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), salvaging multiple community PRs)

- **Smart approvals grow up** — `hermes approvals suggest` mines your approval history into allowlist proposals, operators can customize the smart-approval policy, a consecutive-denial circuit breaker stops a misbehaving loop cold, and desktop pairing approvals are profile-correct with a proper surface to answer them from. Plus a new approval gate for docker/podman daemon-redirect commands. Less clicking "approve", without giving an inch of control. ([#&#8203;72259](https://github.com/NousResearch/hermes-agent/pull/72259), [#&#8203;72186](https://github.com/NousResearch/hermes-agent/pull/72186), [#&#8203;72203](https://github.com/NousResearch/hermes-agent/pull/72203), [#&#8203;74446](https://github.com/NousResearch/hermes-agent/pull/74446), [#&#8203;71092](https://github.com/NousResearch/hermes-agent/pull/71092) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **Faster everywhere, again** — Prompt caching now covers tool schemas on native Anthropic without history loss. `hermes -w` cold start dropped \~14s → \~1.8s, `hermes update` no-ops got 2–6s faster, heavy SDKs lazy-load off the import path, config reads stopped deep-copying (54× faster on the telemetry gate), and the desktop shipped a second 60fps wave — streaming cost independent of transcript length, drag at 60fps with five streaming tabs, idle CPU near zero in the background. ([#&#8203;76032](https://github.com/NousResearch/hermes-agent/pull/76032), [#&#8203;71637](https://github.com/NousResearch/hermes-agent/pull/71637), [#&#8203;74218](https://github.com/NousResearch/hermes-agent/pull/74218), [#&#8203;74204](https://github.com/NousResearch/hermes-agent/pull/74204), [#&#8203;71835](https://github.com/NousResearch/hermes-agent/pull/71835), [#&#8203;72346](https://github.com/NousResearch/hermes-agent/pull/72346), [#&#8203;75218](https://github.com/NousResearch/hermes-agent/pull/75218) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))

- **New places to run and be reached** — Buzz lands as a bundled gateway platform (Block's Nostr-based messenger, with native WebSocket transport and NIP-42 auth), the Vercel AI Gateway provider and Vercel Sandbox terminal backend return modernized, desktop gains an SSH remote-backend connection mode, and the Relay shipped four phases of parity — media, interactive prompts, thread lifecycle, typing indicators — plus HSP personal + org skill sync. ([#&#8203;73610](https://github.com/NousResearch/hermes-agent/pull/73610), [#&#8203;73761](https://github.com/NousResearch/hermes-agent/pull/73761), [#&#8203;74518](https://github.com/NousResearch/hermes-agent/pull/74518), [#&#8203;68130](https://github.com/NousResearch/hermes-agent/pull/68130), [#&#8203;71300](https://github.com/NousResearch/hermes-agent/pull/71300)–[#&#8203;71624](https://github.com/NousResearch/hermes-agent/pull/71624), [#&#8203;66730](https://github.com/NousResearch/hermes-agent/pull/66730) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;yoniebans](https://github.com/yoniebans), [@&#8203;benbarclay](https://github.com/benbarclay))

***

##### 🎙️ Voice & Speech

##### Conversational voice

- Streaming, conversational TTS with barge-in across all surfaces; clause-by-clause synthesis for CLI voice mode + gateway adapters ([#&#8203;69511](https://github.com/NousResearch/hermes-agent/pull/69511), [#&#8203;73862](https://github.com/NousResearch/hermes-agent/pull/73862) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))
- Voice chat UX polish — busy-aware silence, stop hint, thinking sounds, barge-in fix; full-duplex turn listener (interrupt by voice during generation AND playback) ([#&#8203;74000](https://github.com/NousResearch/hermes-agent/pull/74000), [#&#8203;74223](https://github.com/NousResearch/hermes-agent/pull/74223) — [@&#8203;teknium1](https://github.com/teknium1))
- On-device wake words with open-vocabulary phrases + multi-profile voice routing; say "stop" to end voice chat hands-free on every surface ([#&#8203;70509](https://github.com/NousResearch/hermes-agent/pull/70509), [#&#8203;73106](https://github.com/NousResearch/hermes-agent/pull/73106), [#&#8203;73933](https://github.com/NousResearch/hermes-agent/pull/73933) — [@&#8203;teknium1](https://github.com/teknium1))
- The model is told when the user interrupts its spoken reply; desktop speaks the whole turn and idle-flushes held narration ([#&#8203;69602](https://github.com/NousResearch/hermes-agent/pull/69602), [#&#8203;69936](https://github.com/NousResearch/hermes-agent/pull/69936) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))
- 15-item CLI/TUI voice-mode UX and environment fix wave ([#&#8203;73520](https://github.com/NousResearch/hermes-agent/pull/73520) — [@&#8203;teknium1](https://github.com/teknium1))

##### TTS / STT infrastructure

- Unified spoken-text preprocessing + speed/instructions/provider tool params; unified STT language resolution (fixes the wrong-language transcription class); global `stt.language` defaults to `en` ([#&#8203;73513](https://github.com/NousResearch/hermes-agent/pull/73513), [#&#8203;73067](https://github.com/NousResearch/hermes-agent/pull/73067), [#&#8203;73100](https://github.com/NousResearch/hermes-agent/pull/73100) — [@&#8203;teknium1](https://github.com/teknium1))
- Fully configurable STT — `hermes tools` category, GUI toggle/matrix, dashboard dropdowns, setup status; OpenAI gpt-transcribe support ([#&#8203;73910](https://github.com/NousResearch/hermes-agent/pull/73910), [#&#8203;73853](https://github.com/NousResearch/hermes-agent/pull/73853) — [@&#8203;teknium1](https://github.com/teknium1))
- Platform-aware auto-TTS voice delivery (opus platforms, streamed/global gap, captions); inbound voice classification/routing for Feishu, DingTalk, LINE, QQ, Photon, WhatsApp, Weixin ([#&#8203;73508](https://github.com/NousResearch/hermes-agent/pull/73508), [#&#8203;73515](https://github.com/NousResearch/hermes-agent/pull/73515) — [@&#8203;teknium1](https://github.com/teknium1))
- Command TTS/STT provider hardening — idle timeouts, env scrubbing, no-shell, path guards ([#&#8203;73514](https://github.com/NousResearch/hermes-agent/pull/73514) — [@&#8203;teknium1](https://github.com/teknium1))
- Sync per-sentence TTS synthesis pipelined with playback — the next sentence renders while the current one speaks ([#&#8203;77355](https://github.com/NousResearch/hermes-agent/pull/77355) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Discord voice PCM streams to ffmpeg stdin instead of a temp file ([#&#8203;76970](https://github.com/NousResearch/hermes-agent/pull/76970) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### 🏗️ Core Agent & Architecture

##### Compression & context

- Proactive tool-result pruning for large-window models; per-turn micro-compaction; N-user tail guarantee (`compression.min_tail_user_messages`); bounded summarizer input with head+tail retention ([#&#8203;70254](https://github.com/NousResearch/hermes-agent/pull/70254), [#&#8203;75345](https://github.com/NousResearch/hermes-agent/pull/75345), [#&#8203;70250](https://github.com/NousResearch/hermes-agent/pull/70250), [#&#8203;70249](https://github.com/NousResearch/hermes-agent/pull/70249) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Ghost-skill defense — `[SKILL_PRUNED]` markers, protected prune, deterministic survival; progress-aware timeouts; lock-contended compression soft-defers instead of exhausting ([#&#8203;70275](https://github.com/NousResearch/hermes-agent/pull/70275), [#&#8203;71508](https://github.com/NousResearch/hermes-agent/pull/71508), [#&#8203;70285](https://github.com/NousResearch/hermes-agent/pull/70285) — [@&#8203;teknium1](https://github.com/teknium1))
- Per-model threshold overrides; absolute token threshold (`compression.threshold_tokens`); opt-in idle-triggered compaction; opt-in progress notices; structured local logging for compression attempts ([#&#8203;69339](https://github.com/NousResearch/hermes-agent/pull/69339), [#&#8203;69335](https://github.com/NousResearch/hermes-agent/pull/69335), [#&#8203;69360](https://github.com/NousResearch/hermes-agent/pull/69360), [#&#8203;70457](https://github.com/NousResearch/hermes-agent/pull/70457), [#&#8203;69338](https://github.com/NousResearch/hermes-agent/pull/69338) — [@&#8203;teknium1](https://github.com/teknium1))
- Context-engine ABC grows `select_context()` + `on_turn_complete()` verbs (salvage of [@&#8203;chaos-xxl](https://github.com/chaos-xxl)'s RFC work); engines can suppress or customize compaction status ([#&#8203;70458](https://github.com/NousResearch/hermes-agent/pull/70458), [#&#8203;69859](https://github.com/NousResearch/hermes-agent/pull/69859) — [@&#8203;teknium1](https://github.com/teknium1))
- Strict redaction applied at every compaction text boundary ([#&#8203;69294](https://github.com/NousResearch/hermes-agent/pull/69294) — [@&#8203;teknium1](https://github.com/teknium1))

##### Prompt caching & hot-path performance

- Tool schemas cached on native Anthropic without history loss + consolidated cache-plan internals ([#&#8203;76032](https://github.com/NousResearch/hermes-agent/pull/76032), [#&#8203;76067](https://github.com/NousResearch/hermes-agent/pull/76067) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- DeepSeek prompt caching on OpenCode gateways; per-API-call token accounting off the turn thread; OpenAI wire client reused across sequential LLM calls; send-path tool-call canonicalization memoized ([#&#8203;75886](https://github.com/NousResearch/hermes-agent/pull/75886), [#&#8203;73359](https://github.com/NousResearch/hermes-agent/pull/73359), [#&#8203;73375](https://github.com/NousResearch/hermes-agent/pull/73375), [#&#8203;76880](https://github.com/NousResearch/hermes-agent/pull/76880) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Readonly config loader at 29 call sites (28× cheaper reads); per-turn config deepcopies killed (telemetry gate 54×); one raw config.yaml parse per process; inter-tool delay removed ([#&#8203;74322](https://github.com/NousResearch/hermes-agent/pull/74322), [#&#8203;74211](https://github.com/NousResearch/hermes-agent/pull/74211), [#&#8203;74228](https://github.com/NousResearch/hermes-agent/pull/74228), [#&#8203;64172](https://github.com/NousResearch/hermes-agent/pull/64172) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;Soju06](https://github.com/Soju06))
- Lazy heavy-SDK imports (−8-10% import cost on top of the mcp/tool-discovery diet); streaming hot loop drops per-chunk repr() (\~3× cheaper accounting); cursor/memo optimizations for per-iteration history walks ([#&#8203;74204](https://github.com/NousResearch/hermes-agent/pull/74204), [#&#8203;74194](https://github.com/NousResearch/hermes-agent/pull/74194), [#&#8203;74221](https://github.com/NousResearch/hermes-agent/pull/74221), [#&#8203;74231](https://github.com/NousResearch/hermes-agent/pull/74231) — [@&#8203;teknium1](https://github.com/teknium1))
- Cold-start \~14s GIL stall during backend init mitigated; turn flush batched into one SQLite transaction; provider-capability-gated prompt cache keys (implied for api.openai.com) ([#&#8203;77814](https://github.com/NousResearch/hermes-agent/pull/77814), [#&#8203;77619](https://github.com/NousResearch/hermes-agent/pull/77619), [#&#8203;77609](https://github.com/NousResearch/hermes-agent/pull/77609) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- AIAgent hot-path salvage — prompt-cache copy, reasoning-timeout precompute, lazy compressor init ([#&#8203;57229](https://github.com/NousResearch/hermes-agent/pull/57229) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### Approvals & the agent loop

- `hermes approvals suggest` mines approval history into allowlist proposals; operator-customizable `approvals.smart_policy`; consecutive-denial circuit breaker; cross-surface approvals mode command ([#&#8203;72259](https://github.com/NousResearch/hermes-agent/pull/72259), [#&#8203;72186](https://github.com/NousResearch/hermes-agent/pull/72186), [#&#8203;72203](https://github.com/NousResearch/hermes-agent/pull/72203), [#&#8203;63517](https://github.com/NousResearch/hermes-agent/pull/63517) — [@&#8203;teknium1](https://github.com/teknium1))
- Docker/podman daemon-redirect commands require approval; session-wide runaway-loop caps for web\_search + delegate\_task (Claude Code-inspired) ([#&#8203;71092](https://github.com/NousResearch/hermes-agent/pull/71092), [#&#8203;66600](https://github.com/NousResearch/hermes-agent/pull/66600) — [@&#8203;teknium1](https://github.com/teknium1))
- Mid-turn redirects — user corrections steer the active turn, preserving in-flight work and the original prompt ([#&#8203;63104](https://github.com/NousResearch/hermes-agent/pull/63104), [#&#8203;72339](https://github.com/NousResearch/hermes-agent/pull/72339) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Delegation: structured timeout/stall metadata + live per-child status in `/agents`; subagents can use `execute_code`; redacted child tool history exposed in `subagent_stop`; public subagent lifecycle API for plugins ([#&#8203;72300](https://github.com/NousResearch/hermes-agent/pull/72300), [#&#8203;69325](https://github.com/NousResearch/hermes-agent/pull/69325), [#&#8203;72403](https://github.com/NousResearch/hermes-agent/pull/72403), [#&#8203;72501](https://github.com/NousResearch/hermes-agent/pull/72501) — [@&#8203;teknium1](https://github.com/teknium1))
- Single-owner refactors for backend identity + failure-scoped skips, empty-content wire repair, call\_id/reasoning sanitization, model-switch parsing ([#&#8203;72505](https://github.com/NousResearch/hermes-agent/pull/72505), [#&#8203;73071](https://github.com/NousResearch/hermes-agent/pull/73071), [#&#8203;74319](https://github.com/NousResearch/hermes-agent/pull/74319), [#&#8203;74229](https://github.com/NousResearch/hermes-agent/pull/74229) — [@&#8203;teknium1](https://github.com/teknium1))
- Labeled reasoning excerpt surfaced at the empty-response terminal; tool\_search probe-validates blind tool\_call args ([#&#8203;65144](https://github.com/NousResearch/hermes-agent/pull/65144), [#&#8203;59267](https://github.com/NousResearch/hermes-agent/pull/59267) — [@&#8203;teknium1](https://github.com/teknium1))

##### Tool self-recovery wave

- Terminal: recoverable truncation (full output spilled + pre-truncation size), cwd echoed when a command changes directory, output-pattern failure hints ([#&#8203;77041](https://github.com/NousResearch/hermes-agent/pull/77041), [#&#8203;77004](https://github.com/NousResearch/hermes-agent/pull/77004), [#&#8203;76992](https://github.com/NousResearch/hermes-agent/pull/76992) — [@&#8203;teknium1](https://github.com/teknium1))
- Patch: already-applied edits return success no-op, whitespace-visualized no-match diagnosis, ambiguous-match locations listed ([#&#8203;76998](https://github.com/NousResearch/hermes-agent/pull/76998), [#&#8203;77024](https://github.com/NousResearch/hermes-agent/pull/77024), [#&#8203;77001](https://github.com/NousResearch/hermes-agent/pull/77001) — [@&#8203;teknium1](https://github.com/teknium1))
- Search: zero-match probes + multi-path recovery, auto-multiline for newline patterns; read\_file default limit 500 → 2000 lines; negative-result cache for read/search misses; write\_file verifies on-disk content ([#&#8203;77011](https://github.com/NousResearch/hermes-agent/pull/77011), [#&#8203;77102](https://github.com/NousResearch/hermes-agent/pull/77102), [#&#8203;76996](https://github.com/NousResearch/hermes-agent/pull/76996), [#&#8203;76945](https://github.com/NousResearch/hermes-agent/pull/76945), [#&#8203;77055](https://github.com/NousResearch/hermes-agent/pull/77055) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- execute\_code recovery hints; skill\_view dedup stub for unchanged re-reads; terminal/execute\_code schema prose trimmed \~40%; tiered tool disclosure scales with catalog size; default iteration limit 90 → 500 ([#&#8203;77106](https://github.com/NousResearch/hermes-agent/pull/77106), [#&#8203;77095](https://github.com/NousResearch/hermes-agent/pull/77095), [#&#8203;77023](https://github.com/NousResearch/hermes-agent/pull/77023), [#&#8203;67034](https://github.com/NousResearch/hermes-agent/pull/67034), [#&#8203;72176](https://github.com/NousResearch/hermes-agent/pull/72176) — [@&#8203;teknium1](https://github.com/teknium1))

##### Providers & models

- Vercel AI Gateway provider + Vercel Sandbox terminal backend return, modernized (SDK 0.7.2, telemetry off) ([#&#8203;74518](https://github.com/NousResearch/hermes-agent/pull/74518) — [@&#8203;teknium1](https://github.com/teknium1))
- Gemini 3.1 Pro + 3.6 Flash in catalogs; Gemini salvage cluster (3.6-flash aux default, Vertex catalog, direct cost tracking); claude-opus-5 in OpenRouter + Nous Portal; deepseek-v4-flash-0731 ([#&#8203;73479](https://github.com/NousResearch/hermes-agent/pull/73479), [#&#8203;73516](https://github.com/NousResearch/hermes-agent/pull/73516), [#&#8203;70946](https://github.com/NousResearch/hermes-agent/pull/70946), [#&#8203;75501](https://github.com/NousResearch/hermes-agent/pull/75501) — [@&#8203;teknium1](https://github.com/teknium1))
- Bedrock Converse API prompt caching (cachePoint) ([#&#8203;70231](https://github.com/NousResearch/hermes-agent/pull/70231) — [@&#8203;JoaoMarcos44](https://github.com/JoaoMarcos44))
- OpenAI data-residency endpoints get declared transport + correct catalog; provider-aware API-server request routing; backend-acknowledged session model lock; Nous sticky routing via top-level session\_id ([#&#8203;74958](https://github.com/NousResearch/hermes-agent/pull/74958), [#&#8203;70853](https://github.com/NousResearch/hermes-agent/pull/70853), [#&#8203;70950](https://github.com/NousResearch/hermes-agent/pull/70950), [#&#8203;69253](https://github.com/NousResearch/hermes-agent/pull/69253) — [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos), [@&#8203;teknium1](https://github.com/teknium1))
- Model picker: curated defaults + collapsible providers + select-all; stale caches served instantly with background refresh; custom-endpoint probe capped at 1.5s; honcho OAuth device-code login ([#&#8203;73172](https://github.com/NousResearch/hermes-agent/pull/73172), [#&#8203;76430](https://github.com/NousResearch/hermes-agent/pull/76430), [#&#8203;76922](https://github.com/NousResearch/hermes-agent/pull/76922), [#&#8203;61608](https://github.com/NousResearch/hermes-agent/pull/61608) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), [@&#8203;akattelu](https://github.com/akattelu))
- ACP: named custom providers in the model selector; authenticated cross-provider model choices; non-blocking startup via background MCP discovery ([#&#8203;70082](https://github.com/NousResearch/hermes-agent/pull/70082), [#&#8203;70404](https://github.com/NousResearch/hermes-agent/pull/70404), [#&#8203;75985](https://github.com/NousResearch/hermes-agent/pull/75985) — [@&#8203;israellot](https://github.com/israellot), [@&#8203;amanning3390](https://github.com/amanning3390), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### Secrets & config

- Command-helper secret source (composes with all vaults); one-command token rotation + actionable startup errors; opt-in encrypted break-glass cache for Bitwarden; vault-injected keys scoped per profile home; orchestrator preserve\_existing + profile aliasing ([#&#8203;69266](https://github.com/NousResearch/hermes-agent/pull/69266), [#&#8203;68605](https://github.com/NousResearch/hermes-agent/pull/68605), [#&#8203;69251](https://github.com/NousResearch/hermes-agent/pull/69251), [#&#8203;69250](https://github.com/NousResearch/hermes-agent/pull/69250), [#&#8203;69058](https://github.com/NousResearch/hermes-agent/pull/69058) — [@&#8203;teknium1](https://github.com/teknium1))
- `${env:VAR}` SecretRef parity between config.yaml and MCP config; secret-source env vars reach stdio MCP servers ([#&#8203;69267](https://github.com/NousResearch/hermes-agent/pull/69267), [#&#8203;69053](https://github.com/NousResearch/hermes-agent/pull/69053) — [@&#8203;teknium1](https://github.com/teknium1))
- Canonical config loaders for behavioral reads; table-driven config migration registry; DEFAULT\_CONFIG extracted to config\_defaults.py; auto-migration support floor at v12 ([#&#8203;74237](https://github.com/NousResearch/hermes-agent/pull/74237), [#&#8203;74200](https://github.com/NousResearch/hermes-agent/pull/74200), [#&#8203;74182](https://github.com/NousResearch/hermes-agent/pull/74182), [#&#8203;74433](https://github.com/NousResearch/hermes-agent/pull/74433) — [@&#8203;teknium1](https://github.com/teknium1))

##### 🌐 Gateway, Relay & Fleet

- Session activity heartbeats, stall watchdog, and bounded compression waits — re-landed hardened after an in-window revert cycle (originally [#&#8203;72424](https://github.com/NousResearch/hermes-agent/issues/72424) by [@&#8203;fangliquanflq](https://github.com/fangliquanflq)) ([#&#8203;76354](https://github.com/NousResearch/hermes-agent/pull/76354) — [@&#8203;teknium1](https://github.com/teknium1))
- SessionState consolidation (19 session-keyed dicts → one turn/conversation/persistent-scoped object); TurnContext/TurnRunner seam extraction; declarative busy\_policy on CommandDef ([#&#8203;74289](https://github.com/NousResearch/hermes-agent/pull/74289), [#&#8203;74353](https://github.com/NousResearch/hermes-agent/pull/74353), [#&#8203;74197](https://github.com/NousResearch/hermes-agent/pull/74197) — [@&#8203;teknium1](https://github.com/teknium1))
- Relay parity waves: Phase 1 (supported\_ops discovery, identity fields, /handoff aliasing), Phase 2 media, Phase 3 interactive prompts, Phase 4 thread lifecycle; egress typing indicators ([#&#8203;71300](https://github.com/NousResearch/hermes-agent/pull/71300), [#&#8203;71363](https://github.com/NousResearch/hermes-agent/pull/71363), [#&#8203;71404](https://github.com/NousResearch/hermes-agent/pull/71404), [#&#8203;71624](https://github.com/NousResearch/hermes-agent/pull/71624), [#&#8203;69721](https://github.com/NousResearch/hermes-agent/pull/69721) — [@&#8203;benbarclay](https://github.com/benbarclay))
- HSP skill sync: personal client (M1) + org-skills client (M2) + org-skill namespace with token-gated discovery ([#&#8203;66730](https://github.com/NousResearch/hermes-agent/pull/66730), [#&#8203;70024](https://github.com/NousResearch/hermes-agent/pull/70024), [#&#8203;70459](https://github.com/NousResearch/hermes-agent/pull/70459) — [@&#8203;benbarclay](https://github.com/benbarclay))
- Buzz (Block/Nostr) platform adapter with native WebSocket inbound transport + NIP-42 auth ([#&#8203;73610](https://github.com/NousResearch/hermes-agent/pull/73610), [#&#8203;73761](https://github.com/NousResearch/hermes-agent/pull/73761) — [@&#8203;teknium1](https://github.com/teknium1))
- Photon: native polls, effects, clarify-as-poll, rich links (4-PR salvage) ([#&#8203;73614](https://github.com/NousResearch/hermes-agent/pull/73614) — [@&#8203;teknium1](https://github.com/teknium1))
- Slack: native Block Kit clarify buttons; opt-in reaction triggers; outbound payload sanitization; thread-context lifecycle fixes ([#&#8203;69318](https://github.com/NousResearch/hermes-agent/pull/69318), [#&#8203;70195](https://github.com/NousResearch/hermes-agent/pull/70195), [#&#8203;69317](https://github.com/NousResearch/hermes-agent/pull/69317), [#&#8203;69320](https://github.com/NousResearch/hermes-agent/pull/69320) — [@&#8203;teknium1](https://github.com/teknium1))
- Discord auto-thread sessions keyed on prospective\_thread\_id; reply references built from ids (no fetch\_message); WhatsApp configurable inbound read receipts ([#&#8203;76513](https://github.com/NousResearch/hermes-agent/pull/76513), [#&#8203;76875](https://github.com/NousResearch/hermes-agent/pull/76875), [#&#8203;73322](https://github.com/NousResearch/hermes-agent/pull/73322) — [@&#8203;benbarclay](https://github.com/benbarclay), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Kanban wakes resume the creator's DM/thread session; kanban/delegate wake-ups reach api\_server sessions; per-task model + thinking-depth from the board ([#&#8203;72191](https://github.com/NousResearch/hermes-agent/pull/72191), [#&#8203;70171](https://github.com/NousResearch/hermes-agent/pull/70171), [#&#8203;69876](https://github.com/NousResearch/hermes-agent/pull/69876), [#&#8203;76417](https://github.com/NousResearch/hermes-agent/pull/76417) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Relay: Discord tool-progress routed into the auto-thread instead of the parent channel ([#&#8203;77830](https://github.com/NousResearch/hermes-agent/pull/77830) — [@&#8203;benbarclay](https://github.com/benbarclay))
- Outbound webhooks — push signed lifecycle events to external endpoints; simplex channel enumeration in `hermes send --list` ([#&#8203;69406](https://github.com/NousResearch/hermes-agent/pull/69406), [#&#8203;77110](https://github.com/NousResearch/hermes-agent/pull/77110) — [@&#8203;teknium1](https://github.com/teknium1))

##### 🖥️ Hermes Desktop App

##### The platform wave

- **Artifacts** — versioned cards, sandboxed live preview, right-rail viewer ([#&#8203;72345](https://github.com/NousResearch/hermes-agent/pull/72345) — [@&#8203;teknium1](https://github.com/teknium1))
- **Plugin SDK** — Kanban as the founding desktop plugin; `ctx.download` hands the user a file; widget-app SDK (apps as state+reducer+render) with three reference apps; widget-grid layout engine + background-aware theme engine ([#&#8203;61173](https://github.com/NousResearch/hermes-agent/pull/61173), [#&#8203;74413](https://github.com/NousResearch/hermes-agent/pull/74413), [#&#8203;68306](https://github.com/NousResearch/hermes-agent/pull/68306), [#&#8203;20379](https://github.com/NousResearch/hermes-agent/pull/20379) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Quick-entry window (global hotkey → any session); multiple GUI windows; floating pane placement; pane toggles anywhere + hidden header; ⌘O open-folder-as-project ([#&#8203;72315](https://github.com/NousResearch/hermes-agent/pull/72315), [#&#8203;68259](https://github.com/NousResearch/hermes-agent/pull/68259), [#&#8203;73143](https://github.com/NousResearch/hermes-agent/pull/73143), [#&#8203;75848](https://github.com/NousResearch/hermes-agent/pull/75848), [#&#8203;74623](https://github.com/NousResearch/hermes-agent/pull/74623) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- SSH remote-backend connection mode; event-driven live sync replaces always-on polls; remote profile routing/sessions/pool lifecycle repaired ([#&#8203;68130](https://github.com/NousResearch/hermes-agent/pull/68130), [#&#8203;73673](https://github.com/NousResearch/hermes-agent/pull/73673), [#&#8203;72835](https://github.com/NousResearch/hermes-agent/pull/72835) — [@&#8203;yoniebans](https://github.com/yoniebans), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Let the agent drive the shell (preview pane + pane focus) AND inspect the desktop app it's developing; find-in-page (Ctrl+F); GUI terminal copy/paste + font picker ([#&#8203;69519](https://github.com/NousResearch/hermes-agent/pull/69519), [#&#8203;73121](https://github.com/NousResearch/hermes-agent/pull/73121), [#&#8203;72235](https://github.com/NousResearch/hermes-agent/pull/72235), [#&#8203;73705](https://github.com/NousResearch/hermes-agent/pull/73705), [#&#8203;76395](https://github.com/NousResearch/hermes-agent/pull/76395) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))

##### Composer & UX

- Attach files/folders/links via picker; composer chips for @&#8203; paths and pasted links; composer undo stack; double-ESC discards draft; double-Enter sends the queued turn; type-to-focus ([#&#8203;74668](https://github.com/NousResearch/hermes-agent/pull/74668), [#&#8203;73110](https://github.com/NousResearch/hermes-agent/pull/73110), [#&#8203;72201](https://github.com/NousResearch/hermes-agent/pull/72201), [#&#8203;72288](https://github.com/NousResearch/hermes-agent/pull/72288), [#&#8203;74736](https://github.com/NousResearch/hermes-agent/pull/74736), [#&#8203;73101](https://github.com/NousResearch/hermes-agent/pull/73101), [#&#8203;68918](https://github.com/NousResearch/hermes-agent/pull/68918) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- 2-keypress model switching (⌘⇧M); YOLO in ⌘K with live toggle state; keyboard-first pickers; keyboard navigation for clarify choices; server-owned pins that follow you between apps ([#&#8203;74545](https://github.com/NousResearch/hermes-agent/pull/74545), [#&#8203;74674](https://github.com/NousResearch/hermes-agent/pull/74674), [#&#8203;74602](https://github.com/NousResearch/hermes-agent/pull/74602), [#&#8203;69799](https://github.com/NousResearch/hermes-agent/pull/69799), [#&#8203;74234](https://github.com/NousResearch/hermes-agent/pull/74234) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Grouped, live-ticking tool-activity line; improved tool call detail views; [@&#8203;session](https://github.com/session) links resolve to clickable titles; brand icons on known-domain links; iMessage-style emoji reactions (opt-in, two-way); double-click to heart ([#&#8203;72893](https://github.com/NousResearch/hermes-agent/pull/72893), [#&#8203;69868](https://github.com/NousResearch/hermes-agent/pull/69868), [#&#8203;71162](https://github.com/NousResearch/hermes-agent/pull/71162), [#&#8203;73047](https://github.com/NousResearch/hermes-agent/pull/73047), [#&#8203;74533](https://github.com/NousResearch/hermes-agent/pull/74533), [#&#8203;74644](https://github.com/NousResearch/hermes-agent/pull/74644) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))
- Sidebar date dividers + pinned section + opt-in stale-session auto-archive; sessions stop lying about running state; credit-usage toasts; configurable attachment size limit; Cron Blueprints + Webhooks pages; searchable timezone picker ([#&#8203;70822](https://github.com/NousResearch/hermes-agent/pull/70822), [#&#8203;72303](https://github.com/NousResearch/hermes-agent/pull/72303), [#&#8203;69828](https://github.com/NousResearch/hermes-agent/pull/69828), [#&#8203;73221](https://github.com/NousResearch/hermes-agent/pull/73221), [#&#8203;70066](https://github.com/NousResearch/hermes-agent/pull/70066), [#&#8203;69687](https://github.com/NousResearch/hermes-agent/pull/69687), [#&#8203;73505](https://github.com/NousResearch/hermes-agent/pull/73505) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;austinpickett](https://github.com/austinpickett), [@&#8203;Adolanium](https://github.com/Adolanium), [@&#8203;teknium1](https://github.com/teknium1))
- RFC 8252 native desktop sign-in (system browser + PKCE, no webview cookies); "Connect to existing Hermes" in first-run onboarding; profile-correct pairing approvals with a desktop surface ([#&#8203;67920](https://github.com/NousResearch/hermes-agent/pull/67920), [#&#8203;70907](https://github.com/NousResearch/hermes-agent/pull/70907), [#&#8203;74446](https://github.com/NousResearch/hermes-agent/pull/74446) — [@&#8203;benbarclay](https://github.com/benbarclay), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Keep-computer-awake toggle + notch wake indicator; /battery status-bar toggle; UI zoom 90% default preset; status bar hideable ([#&#8203;68140](https://github.com/NousResearch/hermes-agent/pull/68140), [#&#8203;76396](https://github.com/NousResearch/hermes-agent/pull/76396), [#&#8203;68860](https://github.com/NousResearch/hermes-agent/pull/68860), [#&#8203;73161](https://github.com/NousResearch/hermes-agent/pull/73161), [#&#8203;72960](https://github.com/NousResearch/hermes-agent/pull/72960) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1))

##### Desktop performance (60fps wave 2)

- Streaming cost independent of transcript length; 60fps on real sessions (reflow-gated pins, adaptive flush); drag at 60fps with five streaming tabs; multitab streaming made fast ([#&#8203;71835](https://github.com/NousResearch/hermes-agent/pull/71835), [#&#8203;72504](https://github.com/NousResearch/hermes-agent/pull/72504), [#&#8203;72346](https://github.com/NousResearch/hermes-agent/pull/72346), [#&#8203;71780](https://github.com/NousResearch/hermes-agent/pull/71780) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Hidden-pane timers paused (agents view, cron sidebar, floating pet), scroll/status loops stopped in busy sessions ([#&#8203;77651](https://github.com/NousResearch/hermes-agent/pull/77651) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor)); idle CPU near zero in the background; sidebar/overlay render churn killed; statusbar + transcript stop re-rendering per token/sash-drag/session-switch; ⌘K opens instantly; renderer cold start keeps shiki/mermaid off the boot path ([#&#8203;75218](https://github.com/NousResearch/hermes-agent/pull/75218), [#&#8203;73698](https://github.com/NousResearch/hermes-agent/pull/73698), [#&#8203;72163](https://github.com/NousResearch/hermes-agent/pull/72163), [#&#8203;72245](https://github.com/NousResearch/hermes-agent/pull/72245), [#&#8203;72524](https://github.com/NousResearch/hermes-agent/pull/72524), [#&#8203;74665](https://github.com/NousResearch/hermes-agent/pull/74665), [#&#8203;73024](https://github.com/NousResearch/hermes-agent/pull/73024) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- State diagnostics (render + store churn counters) + a lint rule banning atom-mirrored refs so the stale-read bug class cannot return; Playwright E2E suite with visual regression diffs ([#&#8203;71925](https://github.com/NousResearch/hermes-agent/pull/71925), [#&#8203;71560](https://github.com/NousResearch/hermes-agent/pull/71560), [#&#8203;65805](https://github.com/NousResearch/hermes-agent/pull/65805) — [@&#8203;OutThisLife](https://github.com/OutThisLife), [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;ethernet8023](https://github.com/ethernet8023))

##### 🖥️ CLI, TUI & Dashboard

- `!` shell mode; `/init` AGENTS.md generation; `/diff` (staged/all/session, cross-surface); `/context` breakdown; `/focus` reduced-output view; Ctrl+S prompt stash; persistent `/goal` indicator; multi-select clarify (checkboxes) across CLI/gateway/TUI ([#&#8203;72257](https://github.com/NousResearch/hermes-agent/pull/72257), [#&#8203;72178](https://github.com/NousResearch/hermes-agent/pull/72178), [#&#8203;72240](https://github.com/NousResearch/hermes-agent/pull/72240), [#&#8203;72242](https://github.com/NousResearch/hermes-agent/pull/72242), [#&#8203;72302](https://github.com/NousResearch/hermes-agent/pull/72302), [#&#8203;72262](https://github.com/NousResearch/hermes-agent/pull/72262), [#&#8203;72244](https://github.com/NousResearch/hermes-agent/pull/72244), [#&#8203;72188](https://github.com/NousResearch/hermes-agent/pull/72188) — [@&#8203;teknium1](https://github.com/teknium1), salvaging [@&#8203;SHL0MS](https://github.com/SHL0MS), [@&#8203;iRonin](https://github.com/iRonin), [@&#8203;gigi206](https://github.com/gigi206) + more)
- `hermes import-agent` — one-command migration from Claude Code / Codex CLI setups ([#&#8203;72190](https://github.com/NousResearch/hermes-agent/pull/72190) — [@&#8203;teknium1](https://github.com/teknium1))
- Per-turn summary line + live token flow in the spinner; cross-surface theme SDK (one skin themes CLI, TUI, and desktop, live) ([#&#8203;72246](https://github.com/NousResearch/hermes-agent/pull/72246), [#&#8203;68857](https://github.com/NousResearch/hermes-agent/pull/68857) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- TUI: reach the model picker without wrecking your draft + mid-turn switching; slash menu leads with your most-used skills; attachments live in the composer; Arabic (ar) locale with RTL across desktop/dashboard/agent ([#&#8203;74756](https://github.com/NousResearch/hermes-agent/pull/74756), [#&#8203;75931](https://github.com/NousResearch/hermes-agent/pull/75931), [#&#8203;75210](https://github.com/NousResearch/hermes-agent/pull/75210), [#&#8203;70870](https://github.com/NousResearch/hermes-agent/pull/70870) — [@&#8203;OutThisLife](https://github.com/OutThisLife))
- `hermes -w` startup \~14s → \~1.8s; global `--version` fast path; banner update-check 6× faster; dashboard lazy-loads routes + GROUP BY session stats; session filtering tabs (Chats/Automation/All) ([#&#8203;71637](https://github.com/NousResearch/hermes-agent/pull/71637), [#&#8203;62096](https://github.com/NousResearch/hermes-agent/pull/62096), [#&#8203;74188](https://github.com/NousResearch/hermes-agent/pull/74188), [#&#8203;72294](https://github.com/NousResearch/hermes-agent/pull/72294), [#&#8203;73362](https://github.com/NousResearch/hermes-agent/pull/73362), [#&#8203;73865](https://github.com/NousResearch/hermes-agent/pull/73865) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Runtime: Node 26 required across installers/heal/upgrade, managed Node/uv resolve before bare PATH, outdated managed trees heal to target major; brew + pip/PyPI wheel channels retired (shell installer / Docker / Nix are the supported channels) ([#&#8203;76459](https://github.com/NousResearch/hermes-agent/pull/76459), [#&#8203;68217](https://github.com/NousResearch/hermes-agent/pull/68217) — [@&#8203;ethernet8023](https://github.com/ethernet8023))

##### 🧩 Skills, Plugins & MCP

- **A2A v1.0** — Agent-to-Agent protocol plugin (closes [#&#8203;514](https://github.com/NousResearch/hermes-agent/issues/514)) ([#&#8203;77109](https://github.com/NousResearch/hermes-agent/pull/77109) — [@&#8203;teknium1](https://github.com/teknium1))
- Curator: surface unmanaged skills + `curator adopt`; skill-description truncation surfaced to authors; grounded-citations skill (+ fact-checking mode); simplify-code v1.1; tldraw-offline scripting skill ([#&#8203;71648](https://github.com/NousResearch/hermes-agent/pull/71648), [#&#8203;70519](https://github.com/NousResearch/hermes-agent/pull/70519), [#&#8203;71698](https://github.com/NousResearch/hermes-agent/pull/71698), [#&#8203;77104](https://github.com/NousResearch/hermes-agent/pull/77104), [#&#8203;70440](https://github.com/NousResearch/hermes-agent/pull/70440), [#&#8203;66896](https://github.com/NousResearch/hermes-agent/pull/66896) — [@&#8203;teknium1](https://github.com/teknium1))
- Office skills bundled: docx, xlsx, pdf + refreshed powerpoint; skills-tree debloat continues (yuanbao, segment-anything, jupyter, heartmula, audiocraft → optional-skills; claude-marketplace source removed; hub restructure absorbing themes/desktop-plugins/tui-widgets) ([#&#8203;68595](https://github.com/NousResearch/hermes-agent/pull/68595), [#&#8203;70452](https://github.com/NousResearch/hermes-agent/pull/70452)–[#&#8203;70456](https://github.com/NousResearch/hermes-agent/pull/70456), [#&#8203;73903](https://github.com/NousResearch/hermes-agent/pull/73903) — [@&#8203;teknium1](https://github.com/teknium1))
- MCP: Comfy Cloud catalog entry with curated 20-tool default; hidden-whitespace warnings in MCP config; pinecone-research optional skill ([#&#8203;66112](https://github.com/NousResearch/hermes-agent/pull/66112), [#&#8203;75736](https://github.com/NousResearch/hermes-agent/pull/75736), [#&#8203;70512](https://github.com/NousResearch/hermes-agent/pull/70512) — [@&#8203;teknium1](https://github.com/teknium1))
- MCP lazy server startup from a fingerprint-keyed on-disk tool-schema cache — configured servers no longer all boot at session start (design from [#&#8203;56832](https://github.com/NousResearch/hermes-agent/issues/56832)) ([#&#8203;77511](https://github.com/NousResearch/hermes-agent/pull/77511) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- NeMo Relay observability integration — re-landed after an in-window revert, on stable NeMo Relay 0.6 ([#&#8203;67607](https://github.com/NousResearch/hermes-agent/pull/67607) — [@&#8203;afourniernv](https://github.com/afourniernv))
- Gateway health & diagnostics OTLP export ([#&#8203;64536](https://github.com/NousResearch/hermes-agent/pull/64536) — [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos))

##### 🔒 Security & Reliability

- Iron-proxy credential-injection egress firewall re-landed ([#&#8203;70848](https://github.com/NousResearch/hermes-agent/pull/70848) — [@&#8203;teknium1](https://github.com/teknium1))
- DNS-pinned SSRF-safe fetches + Slack CDN allowlist; strict redaction at compaction boundaries; ReDoS eliminated in config-key redaction patterns; prose words embedding a secret keyword no longer masked ([#&#8203;70193](https://github.com/NousResearch/hermes-agent/pull/70193), [#&#8203;69294](https://github.com/NousResearch/hermes-agent/pull/69294), [#&#8203;76083](https://github.com/NousResearch/hermes-agent/pull/76083), [#&#8203;67776](https://github.com/NousResearch/hermes-agent/pull/67776) — [@&#8203;teknium1](https://github.com/teknium1))
- Tier-3 credential reads scoped (FAL/XAI/VERCEL/DAYTONA/GITHUB presence checks etc.); CVE dependency pins refreshed (cryptography, starlette, python-multipart); hindsight env file 0600; /model moved off the gateway event loop ([#&#8203;75888](https://github.com/NousResearch/hermes-agent/pull/75888), [#&#8203;72362](https://github.com/NousResearch/hermes-agent/pull/72362) — [@&#8203;teknium1](https://github.com/teknium1))
- Windows hardening wave: text-mode subprocess decode bug class closed repo-wide, console flashes hidden across daemons/env probes/LSP/installer paths, residual encoding gaps (MCP stdio, gateway update I/O, STT/TTS, desktop spawn) ([#&#8203;70875](https://github.com/NousResearch/hermes-agent/pull/70875), [#&#8203;70205](https://github.com/NousResearch/hermes-agent/pull/70205), [#&#8203;70264](https://github.com/NousResearch/hermes-agent/pull/70264), [#&#8203;71014](https://github.com/NousResearch/hermes-agent/pull/71014) — [@&#8203;teknium1](https://github.com/teknium1), salvaging several community PRs)
- State/session integrity: four session-state fixes (safe close tracking, flush-cursor class fix, row-retry, usage-PK healer); compact v23 FTS layout + `hermes sessions optimize` + CJK-bigram FTS; read-path split with per-thread read-only connections ([#&#8203;75883](https://github.com/NousResearch/hermes-agent/pull/75883), [#&#8203;65798](https://github.com/NousResearch/hermes-agent/pull/65798), [#&#8203;69423](https://github.com/NousResearch/hermes-agent/pull/69423), [#&#8203;73344](https://github.com/NousResearch/hermes-agent/pull/73344) — [@&#8203;teknium1](https://github.com/teknium1), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- OpenViking memory-provider hardening — fail closed on blocked endpoints, server verification before credentials are sent, config.yaml-first settings ([#&#8203;77747](https://github.com/NousResearch/hermes-agent/pull/77747) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Credential pool: reset-aware primary restore (stay on fallback until the rate-limit window resets) + deferred-refresh locking fixes; FTS UPDATE triggers narrowed with fail-closed CJK migration ([#&#8203;77631](https://github.com/NousResearch/hermes-agent/pull/77631), [#&#8203;77628](https://github.com/NousResearch/hermes-agent/pull/77628) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))
- Config-driven memory allocator trim with telemetry; holographic memory vectors stored float32; loop-invariant HRR encodes hoisted ([#&#8203;76905](https://github.com/NousResearch/hermes-agent/pull/76905), [#&#8203;76917](https://github.com/NousResearch/hermes-agent/pull/76917), [#&#8203;76881](https://github.com/NousResearch/hermes-agent/pull/76881) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor))

##### 🐛 Notable Bug Fixes

- Voice: full-duplex interruption during generation AND playback; whole-turn desktop speech; auto-TTS delivery gaps ([#&#8203;74223](https://github.com/NousResearch/hermes-agent/pull/74223), [#&#8203;69936](https://github.com/NousResearch/hermes-agent/pull/69936), [#&#8203;73508](https://github.com/NousResearch/hermes-agent/pull/73508) — [@&#8203;teknium1](https://github.com/teknium1))
- Desktop: Stop parks the queue instead of firing the next queued prompt; branch-in-new-chat restart loss; false remote-gateway reauthentication; cross-session composer leaks ([#&#8203;68725](https://github.com/NousResearch/hermes-agent/pull/68725), [#&#8203;71960](https://github.com/NousResearch/hermes-agent/pull/71960), [#&#8203;68250](https://github.com/NousResearch/hermes-agent/pull/68250), [#&#8203;70986](https://github.com/NousResearch/hermes-agent/pull/70986) — [@&#8203;SHL0MS](https://github.com/SHL0MS), [@&#8203;alelpoan](https://github.com/alelpoan), [@&#8203;helix4u](https://github.com/helix4u), [@&#8203;OutThisLife](https://github.com/OutThisLife))
- Gateway: session lists scoped before limiting; relay-backed home delivery after restart; timeline display events persisted ([#&#8203;65509](https://github.com/NousResearch/hermes-agent/pull/65509), [#&#8203;70102](https://github.com/NousResearch/hermes-agent/pull/70102), [#&#8203;69771](https://github.com/NousResearch/hermes-agent/pull/69771) — [@&#8203;GodsBoy](https://github.com/GodsBoy), [@&#8203;victor-kyriazakos](https://github.com/victor-kyriazakos), [@&#8203;ethernet8023](https://github.com/ethernet8023))
- Agent: context-length fallback logging + batch trajectory durability; Codex OAuth context windows revalidated against the live catalog ([#&#8203;76027](https://github.com/NousResearch/hermes-agent/pull/76027), [#&#8203;68554](https://github.com/NousResearch/hermes-agent/pull/68554) — [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor), [@&#8203;teknium1](https://github.com/teknium1))
- ...plus roughly 770 more `fix:` PRs across every subsystem this window.

##### 👥 Contributors

**647 contributors** shipped this release (commit authors, co-authors, and salvaged-PR credits).

##### Core

[@&#8203;teknium1](https://github.com/teknium1), [@&#8203;OutThisLife](https://github.com/OutThisLife) (desktop, voice, perf), [@&#8203;kshitijk4poor](https://github.com/kshitijk4poor) (perf, caching, salvage), [@&#8203;ethernet8023](https://github.com/ethernet8023) (runtime, E2E, desktop), [@&#8203;benbarclay](https://github.com/benbarclay) (relay, HSP, auth)

##### All Contributors (alphabetical)

[@&#8203;02356abc](https://github.com/02356abc), [@&#8203;0301chris](https://github.com/0301chris), [@&#8203;0xAlcibiades](https://github.com/0xAlcibiades), [@&#8203;0xDevNinja](https://github.com/0xDevNinja), [@&#8203;0xLeathery](https://github.com/0xLeathery), [@&#8203;0xprincess](https://github.com/0xprincess), [@&#8203;0xr00tf3rr3t](https://github.com/0xr00tf3rr3t), [@&#8203;100yenadmin](https://github.com/100yenadmin),
[@&#8203;2001Y](https://github.com/2001Y), [@&#8203;3ssiri](https://github.com/3ssiri), [@&#8203;55nx954gn6-debug](https://github.com/55nx954gn6-debug), [@&#8203;686f6c61](https://github.com/686f6c61), [@&#8203;87degrees](https://github.com/87degrees), [@&#8203;aaronlab](https://github.com/aaronlab), [@&#8203;abundantbeing](https://github.com/abundantbeing), [@&#8203;Adolanium](https://github.com/Adolanium),
[@&#8203;adriansotomora](https://github.com/adriansotomora), [@&#8203;adurham](https://github.com/adurham), [@&#8203;afourniernv](https://github.com/afourniernv), [@&#8203;afurm](https://github.com/afurm), [@&#8203;AgenticSpark](https://github.com/AgenticSpark), [@&#8203;ahmadashfq](https://github.com/ahmadashfq), [@&#8203;AhmetArif0](https://github.com/AhmetArif0), [@&#8203;ai-ag2026](https://github.com/ai-ag2026),
[@&#8203;AIalliAI](https://github.com/AIalliAI), [@&#8203;aider4ryder](https://github.com/aider4ryder), [@&#8203;airclear](https://github.com/airclear), [@&#8203;ajzrva-sys](https://github.com/ajzrva-sys), [@&#8203;akattelu](https://github.com/akattelu), [@&#8203;AKAZIK-py](https://github.com/AKAZIK-py), [@&#8203;akb4q](https://github.com/akb4q), [@&#8203;akshan-main](https://github.com/akshan-main), [@&#8203;AlanBurningsuit](https://github.com/AlanBurningsuit),
[@&#8203;alelpoan](https://github.com/alelpoan), [@&#8203;AlexFucuson9](https://github.com/AlexFucuson9), [@&#8203;AlexxRussell](https://github.com/AlexxRussell), [@&#8203;AllardQuek](https://github.com/AllardQuek), [@&#8203;alt-glitch](https://github.com/alt-glitch), [@&#8203;aman-merchant](https://github.com/aman-merchant), [@&#8203;amanning3390](https://github.com/amanning3390), [@&#8203;amathxbt](https://github.com/amathxbt),
[@&#8203;aml1973](https://github.com/aml1973), [@&#8203;amoreno16003](https://github.com/amoreno16003), [@&#8203;AndrewMoryakov](https://github.com/AndrewMoryakov), [@&#8203;andrexibiza](https://github.com/andrexibiza), [@&#8203;andynguyendk](https://github.com/andynguyendk), [@&#8203;andyylin](https://github.com/andyylin), [@&#8203;aneym](https://github.com/aneym), [@&#8203;angelos](https://github.com/angelos),
[@&#8203;aniruddhaadak80](https://github.com/aniruddhaadak80), [@&#8203;AnnasMazhar](https://github.com/AnnasMazhar), [@&#8203;annguyenNous](https://github.com/annguyenNous), [@&#8203;anoopmehendale-cue](https://github.com/anoopmehendale-cue), [@&#8203;AnthonyFrancis](https://github.com/AnthonyFrancis), [@&#8203;arcabotai](https://github.com/arcabotai), [@&#8203;ArcherQAQ](https://github.com/ArcherQAQ),
[@&#8203;Ares4Tech](https://github.com/Ares4Tech), [@&#8203;arimu1](https://github.com/arimu1), [@&#8203;arnoldfrancisca](https://github.com/arnoldfrancisca), [@&#8203;asimons81](https://github.com/asimons81), [@&#8203;asorry75](https://github.com/asorry75), [@&#8203;AtakanGs](https://github.com/AtakanGs), [@&#8203;ATran28](https://github.com/ATran28), [@&#8203;austinpickett](https://github.com/austinpickett),
[@&#8203;Automata-intelligentsia](https://github.com/Automata-intelligentsia), [@&#8203;awain7](https://github.com/awain7), [@&#8203;aweiker](https://github.com/aweiker), [@&#8203;aydnOktay](https://github.com/aydnOktay), [@&#8203;ayushere](https://github.com/ayushere), [@&#8203;b](https://github.com/b), [@&#8203;baau](https://github.com/baau), [@&#8203;baauzi](https://github.com/baauzi), [@&#8203;baenregod](https://github.com/baenregod),
[@&#8203;bakhtiersizhaev](https://github.com/bakhtiersizhaev), [@&#8203;Baophan00](https://github.com/Baophan00), [@&#8203;baoyu0](https://github.com/baoyu0), [@&#8203;Bartok9](https://github.com/Bartok9), [@&#8203;basilalshukaili](https://github.com/basilalshukaili), [@&#8203;BB-light](https://github.com/BB-light), [@&#8203;bbopen](https://github.com/bbopen), [@&#8203;Beandon13](https://github.com/Beandon13),
[@&#8203;beardedeagle](https://github.com/beardedeagle), [@&#8203;bedirhancode](https://github.com/bedirhancode), [@&#8203;benbarclay](https://github.com/benbarclay), [@&#8203;benegessarit](https://github.com/benegessarit), [@&#8203;benjamin2026-dot](https://github.com/benjamin2026-dot), [@&#8203;bennybuoy](https://github.com/bennybuoy), [@&#8203;BenSheridanEdwards](https://github.com/BenSheridanEdwards),
[@&#8203;BKStock](https://github.com/BKStock), [@&#8203;BlackishGreen33](https://github.com/BlackishGreen33), [@&#8203;bnikanjam](https://github.com/bnikanjam), [@&#8203;bounce12340](https://github.com/bounce12340), [@&#8203;Bounty13](https://github.com/Bounty13), [@&#8203;bpross](https://github.com/bpross), [@&#8203;briandevans](https://github.com/briandevans), [@&#8203;bricelb](https://github.com/bricelb), [@&#8203;brunopirz](https://github.com/brunopirz),
[@&#8203;bryanneva](https://github.com/bryanneva), [@&#8203;byshubham](https://github.com/byshubham), [@&#8203;camaleonidas](https://github.com/camaleonidas), [@&#8203;canorionen](https://github.com/canorionen), [@&#8203;carbongotfound](https://github.com/carbongotfound), [@&#8203;carljborg](https://github.com/carljborg), [@&#8203;carlotestor](https://github.com/carlotestor), [@&#8203;carrion256](https://github.com/carrion256),
[@&#8203;caseyanthony](https://github.com/caseyanthony), [@&#8203;cat-thats-fat](https://github.com/cat-thats-fat), [@&#8203;Cdddo](https://github.com/Cdddo), [@&#8203;ceverson70](https://github.com/ceverson70), [@&#8203;chancelu](https://github.com/chancelu), [@&#8203;chaos-xxl](https://github.com/chaos-xxl), [@&#8203;CharlesMcquade](https://github.com/CharlesMcquade), [@&#8203;chazmaniandinkle](https://github.com/chazmaniandinkle),
[@&#8203;chefboyrdave21](https://github.com/chefboyrdave21), [@&#8203;chelsealong](https://github.com/chelsealong), [@&#8203;Christopher-Schulze](https://github.com/Chr…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config Config system, migrations, profiles comp/cli CLI entry point, hermes_cli/, setup wizard comp/desktop Electron desktop app (apps/desktop/*) comp/tui Terminal UI (ui-tui/ + tui_gateway/) P3 Low — cosmetic, nice to have sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades tool/tts Text-to-speech and transcription type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants