From 4f59510dd47429ef5ca40ff6deb8a63fbe67b9cd Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Mon, 27 Apr 2026 13:00:11 -0500 Subject: [PATCH] fix(tui): tighten fast-mode support validation Distinguish missing model from unsupported model before enabling fast mode and cover both cases so config and live agent state remain untouched on invalid fast toggles. --- tests/test_tui_gateway_server.py | 30 ++++++++++++++++++++++++++++++ tui_gateway/server.py | 12 ++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/tests/test_tui_gateway_server.py b/tests/test_tui_gateway_server.py index a76cc17911..8d7b953692 100644 --- a/tests/test_tui_gateway_server.py +++ b/tests/test_tui_gateway_server.py @@ -781,6 +781,36 @@ def test_config_set_fast_rejects_unsupported_model(monkeypatch): server._sessions.pop("sid", None) +def test_config_set_fast_rejects_missing_model(monkeypatch): + writes = [] + agent = types.SimpleNamespace( + model="", + request_overrides={}, + service_tier=None, + ) + server._sessions["sid"] = _session(agent=agent) + + monkeypatch.setattr( + server, "_write_config_key", lambda path, value: writes.append((path, value)) + ) + + try: + resp = server.handle_request( + { + "id": "1", + "method": "config.set", + "params": {"session_id": "sid", "key": "fast", "value": "fast"}, + } + ) + assert resp["error"]["code"] == 4002 + assert "without a selected model" in resp["error"]["message"] + assert agent.service_tier is None + assert agent.request_overrides == {} + assert writes == [] + finally: + server._sessions.pop("sid", None) + + def test_config_busy_get_and_set(monkeypatch): writes = [] diff --git a/tui_gateway/server.py b/tui_gateway/server.py index 604a8d5e4b..2a1456e41b 100644 --- a/tui_gateway/server.py +++ b/tui_gateway/server.py @@ -2905,9 +2905,17 @@ def _(rid, params: dict) -> dict: if nv == "fast": from hermes_cli.models import resolve_fast_mode_overrides - target_model = getattr(agent, "model", None) if agent is not None else _resolve_model() + target_model = ( + getattr(agent, "model", None) if agent is not None else _resolve_model() + ) + if not target_model: + return _err( + rid, + 4002, + "fast mode is not available without a selected model", + ) overrides = resolve_fast_mode_overrides(target_model) - if not overrides: + if overrides is None: return _err( rid, 4002,