# NousResearch/hermes-agent · CLI process loop freeze and input unresponsiveness

## Open now

- 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.

## TL;DR

- 3 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #55964. Verify it addresses your case.
- **Recommended:** read PR #55964 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-55964`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.67`: the share of member 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.

## Closed / duplicate issues

- #16803: \[Bug\]: hermes-cli enter a dummy status, it ignore any input, and ctl-c, only can kill it

## Prior & competing PRs

- **#55964: fix(cli): prevent process_loop freeze from MCP reload join and voice flag leak (#16803)**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `cli.py`
  - fix hunks:
  - `cli.py`

    ```diff
    @@ -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
    ```

    ```diff
    @@ -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).
    ```
- **#16931: fix: make process_loop never die, preventing TUI input black hole**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `972aa33d3`, `#55964`

## Fix status

- Merged to main in PR #55964 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-07-01`.
- Subsystem: `hermes_cli`
