diff --git a/gateway/platforms/base.py b/gateway/platforms/base.py index 505aabbb25..82d09f3a82 100644 --- a/gateway/platforms/base.py +++ b/gateway/platforms/base.py @@ -1579,7 +1579,7 @@ class BasePlatformAdapter(ABC): # session lifecycle and its cleanup races with the running task # (see PR #4926). cmd = event.get_command() - if cmd in ("approve", "deny", "status", "stop", "new", "reset", "background", "restart"): + if cmd in ("approve", "deny", "status", "stop", "new", "reset", "background", "restart", "queue", "q"): logger.debug( "[%s] Command '/%s' bypassing active-session guard for %s", self.name, cmd, session_key, diff --git a/tests/gateway/test_command_bypass_active_session.py b/tests/gateway/test_command_bypass_active_session.py index 318b14dd82..180c15f711 100644 --- a/tests/gateway/test_command_bypass_active_session.py +++ b/tests/gateway/test_command_bypass_active_session.py @@ -176,6 +176,22 @@ class TestCommandBypassActiveSession: "/background response was not sent back to the user" ) + @pytest.mark.asyncio + async def test_queue_bypasses_guard(self): + """/queue must bypass so it can queue without interrupting.""" + adapter = _make_adapter() + sk = _session_key() + adapter._active_sessions[sk] = asyncio.Event() + + await adapter.handle_message(_make_event("/queue follow up")) + + assert sk not in adapter._pending_messages, ( + "/queue was queued as a pending message instead of being dispatched" + ) + assert any("handled:queue" in r for r in adapter.sent_responses), ( + "/queue response was not sent back to the user" + ) + # --------------------------------------------------------------------------- # Tests: non-bypass messages still get queued