NousResearch/hermes-agent

CLI process loop freeze and input unresponsiveness

Cluster 16803 · hermes cli. Data as of

Nothing open on GitHub. Fix merged in #55964 on 1 Jul 2026. Check it covers your case.

The short answer

0open issues
0open PRs
3items grouped
Known?
Yes. 3 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #55964. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this resolved, deciding PR #55964. That is separate from the fix event.
Still open
Nothing open on GitHub.

These members address a bug where the CLI process loop becomes unresponsive, ignoring user input and resisting interrupts like Ctrl-C. Fixes target the process loop lifecycle, MCP reload join behavior, and related flag handling.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #55964 fix(cli): prevent process_loop freeze from MCP reload join and voice flag leak (#16803)

    merged to main

    files: cli.py

    Show the diff
    • cli.py
      @@ -10107,9 +10107,11 @@ def _check_config_mcp_changes(self) -> None:
                   target=self._reload_mcp, daemon=True
               )
               _reload_thread.start()
      -        _reload_thread.join(timeout=30)
      -        if _reload_thread.is_alive():
      -            print("  ⚠️  MCP reload timed out (30s). Some servers may not have reconnected.")
      +        # Do NOT join here — process_loop calls this from its idle branch, so a
      +        # blocking join would freeze input consumption for up to 30s (and a hung
      +        # MCP server could block far longer). The reload runs purely in the
      +        # background daemon thread, which reports its own progress/completion
      +        # status via print() inside _reload_mcp().
       
           # Inline-skip tokens that bypass the destructive-slash confirmation modal.
           # A general escape hatch for non-interactive use (scripting/automation) and
      @@ -10737,8 +10739,16 @@ def _voice_start_recording(self):
               except Exception:
                   pass
       
      +        # Recorder creation can fail (no input device, PortAudio init error).
      +        # Reset the flag on failure or _voice_recording stays True forever and
      +        # every future voice start is silently skipped by the guard above.
               if self._voice_recorder is None:
      -            self._voice_recorder = create_audio_recorder()
      +            try:
      +                self._voice_recorder = create_audio_recorder()
      +            except Exception:
      +                with self._voice_lock:
      +                    self._voice_recording = False
      +                raise
       
               # Apply config-driven silence params (numeric-guarded so YAML
               # scalar corruption doesn't break recording start-up).

1 PR closed without merging

From the close comments: merged via another change 1

  • #16931 fix: make process_loop never die, preventing TUI input black hole · merged via another change → 972aa33, #55964
Closed issues · 1
  • Closed#16803[Bug]: hermes-cli enter a dummy status, it ignore any input, and ctl-c, only can kill it
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.67: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Subsystem
hermes cli
Merged PRs
#55964
Closed issues
1
Attempts
1 PR closed without merging
Fix link checked
1 Jul 2026

For your agent

The same facts, typed.