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

This commit is contained in:
konsisumer 2026-04-25 00:35:10 +02:00
parent 00c3d848d8
commit 31fc1d5294
3 changed files with 37 additions and 2 deletions

View file

@ -730,6 +730,41 @@ def test_complete_slash_surfaces_completer_error(monkeypatch):
assert "no completer" in resp["error"]["message"]
def test_complete_slash_display_is_plain_string(monkeypatch):
"""complete.slash must convert prompt_toolkit FormattedText display values
to plain strings before sending them over RPC.
Regression: c.display is a FormattedText object, not a str. Passing it
raw caused JSON serialization failures and broken rendering in the TUI
completion dropdown.
"""
from prompt_toolkit.formatted_text import FormattedText
class _FakeCompletion:
text = "/resume"
display = FormattedText([("class:command", "/resume")])
display_meta = FormattedText([("", "Resume a session")])
with patch("hermes_cli.commands.SlashCommandCompleter") as MockCompleter:
instance = MockCompleter.return_value
instance.get_completions.return_value = [_FakeCompletion()]
resp = server.handle_request(
{"id": "1", "method": "complete.slash", "params": {"text": "/res"}}
)
assert "result" in resp, resp
items = resp["result"]["items"]
assert len(items) >= 1
item = next(i for i in items if i["text"] == "/resume")
assert isinstance(item["display"], str), (
"display must be a plain str — FormattedText breaks JSON serialization"
)
assert item["display"] == "/resume"
assert isinstance(item["meta"], str)
assert item["meta"] == "Resume a session"
def test_input_detect_drop_attaches_image(monkeypatch):
fake_cli = types.ModuleType("cli")
fake_cli._detect_file_drop = lambda raw: {