hermes - ✅(Solved) Fix TUI slash-command popups hidden by blocked composer guard [1 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#14907Fetched 2026-04-24 10:44:21
View on GitHub
Comments
0
Participants
1
Timeline
4
Reactions
0
Author
Participants
Timeline (top)
labeled ×3renamed ×1

In the Hermes TUI, slash-command popups/overlays do not appear. This affects more than /resume; it also happens with other popups such as /model and any command that opens a blocking overlay from the composer.

Root Cause

Blocking overlays contribute to $isBlocked in ui-tui/src/app/overlayStore.ts. Examples include picker, modelPicker, skillsHub, pager, etc.

ui-tui/src/components/appLayout.tsx rendered FloatingOverlays inside a !isBlocked guard. So when a slash command opened any blocking popup, that popup immediately made the composer area blocked and hid the FloatingOverlays component that should render it.

A related issue was also seen in slash completions: the TUI gateway returned prompt-toolkit formatted text objects for completion display values instead of plain strings, which can break frontend rendering/selection. Converting c.display with to_plain_text(c.display) fixes that serialization issue.

Fix Action

Fixed

PR fix notes

PR #15140: fix(tui): fix invisible slash-command overlays and FormattedText display serialization

Description (problem / solution / changelog)

Fix two remaining gaps that kept /resume and /model picker overlays invisible in TUI v0.11.0.

What changed and why

  • ui-tui/src/components/appLayout.tsx: pass completions={isBlocked ? [] : composer.completions} to FloatingOverlays. When a blocking overlay (session picker, model picker, pager, skills hub) is open, the normal autocomplete dropdown must not also appear. Previously all completions were passed unconditionally, which could cause the dropdown to overlap the picker.
  • tui_gateway/server.py: in complete.slash, replace c.display or c.text with to_plain_text(c.display) if c.display else c.text. prompt_toolkit Completion.display is a FormattedText object, not a str; the to_plain_text helper was already imported for display_meta but was not applied to display, causing broken rendering in the TUI completion dropdown.
  • tests/test_tui_gateway_server.py: new test test_complete_slash_display_is_plain_string verifies that a FormattedText display value is serialized to a plain str in the RPC response.

How to test

  • Start Hermes TUI and run /resume with no argument — the session picker overlay should appear.
  • Run /model with no argument — the model picker overlay should appear.
  • Type /res in the composer — slash completion dropdown appears; selecting a command should work normally.
  • pytest tests/test_tui_gateway_server.py -q — all 56 tests pass including the new one.

What platforms tested on

  • macOS on darwin-arm64 (local)

Fixes #15094 Fixes #14907

<!-- autocontrib:worker-id=issue-new-3d1034b8 kind=pr-open -->

Changed files

  • tests/test_tui_gateway_server.py (modified, +35/-0)
  • tui_gateway/server.py (modified, +1/-1)
  • ui-tui/src/components/appLayout.tsx (modified, +1/-1)
RAW_BUFFERClick to expand / collapse

Summary

In the Hermes TUI, slash-command popups/overlays do not appear. This affects more than /resume; it also happens with other popups such as /model and any command that opens a blocking overlay from the composer.

Reproduction

  1. Start Hermes TUI.
  2. Run a command that should open a popup, for example:
    • /resume with no argument
    • /model with no argument
  3. Expected: the corresponding popup appears, such as the session picker or model picker.
  4. Actual: no popup is visible, even though the command is handled and the overlay state is set.

Root cause

Blocking overlays contribute to $isBlocked in ui-tui/src/app/overlayStore.ts. Examples include picker, modelPicker, skillsHub, pager, etc.

ui-tui/src/components/appLayout.tsx rendered FloatingOverlays inside a !isBlocked guard. So when a slash command opened any blocking popup, that popup immediately made the composer area blocked and hid the FloatingOverlays component that should render it.

A related issue was also seen in slash completions: the TUI gateway returned prompt-toolkit formatted text objects for completion display values instead of plain strings, which can break frontend rendering/selection. Converting c.display with to_plain_text(c.display) fixes that serialization issue.

Local fix verified

I verified a local fix by:

  • Moving FloatingOverlays outside the !isBlocked composer guard.
  • Passing completions={isBlocked ? [] : composer.completions} so normal autocomplete suggestions do not overlap blocking overlays.
  • Keeping normal text input hidden while blocked.
  • Serializing slash completion display text with to_plain_text(c.display) in tui_gateway/server.py.

Validation:

  • npm run build --prefix ui-tui passes.
  • npm test --prefix ui-tui -- createSlashHandler passes: 16 tests.
  • Manual TUI check: /resume now shows the session picker popup.
  • The same layout fix should apply to /model and other popups rendered through FloatingOverlays.

Affected files

  • ui-tui/src/components/appLayout.tsx
  • tui_gateway/server.py

extent analysis

TL;DR

Move the FloatingOverlays component outside the !isBlocked guard in appLayout.tsx to fix the issue with slash-command popups not appearing.

Guidance

  • Verify that the FloatingOverlays component is correctly rendering outside the !isBlocked guard by checking the component tree in the browser's developer tools.
  • Pass completions={isBlocked ? [] : composer.completions} to prevent normal autocomplete suggestions from overlapping blocking overlays.
  • Ensure that normal text input is hidden while the composer area is blocked.
  • Validate the fix by running npm run build --prefix ui-tui and npm test --prefix ui-tui -- createSlashHandler, and performing a manual TUI check with the /resume command.

Example

// appLayout.tsx
// Before:
{!isBlocked && <FloatingOverlays />}

// After:
<FloatingOverlays />

Notes

This fix assumes that the issue is solely caused by the !isBlocked guard in appLayout.tsx. If other factors are contributing to the issue, additional debugging may be necessary.

Recommendation

Apply the workaround by moving the FloatingOverlays component outside the !isBlocked guard, as this has been verified to fix the issue in the local environment.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - ✅(Solved) Fix TUI slash-command popups hidden by blocked composer guard [1 pull requests, 1 participants]