diff --git a/gateway/platforms/base.py b/gateway/platforms/base.py index aea73bb09..2e9da3354 100644 --- a/gateway/platforms/base.py +++ b/gateway/platforms/base.py @@ -286,7 +286,7 @@ class BasePlatformAdapter(ABC): def get_pending_message(self, session_key: str) -> Optional[MessageEvent]: """Get and clear any pending message for a session.""" - return self._pending_messages.get(session_key) + return self._pending_messages.pop(session_key, None) def build_source( self, diff --git a/gateway/run.py b/gateway/run.py index 81c5dcf09..bad88fc2b 100644 --- a/gateway/run.py +++ b/gateway/run.py @@ -572,6 +572,13 @@ class GatewayRunner: if pending: print(f"[gateway] 📨 Processing interrupted message: '{pending[:40]}...'") + + # Clear the adapter's interrupt event so the next _run_agent call + # doesn't immediately re-trigger the interrupt before the new agent + # even makes its first API call (this was causing an infinite loop). + if adapter and hasattr(adapter, '_active_sessions') and source.chat_id in adapter._active_sessions: + adapter._active_sessions[source.chat_id].clear() + # Add an indicator to the response if response: response = response + "\n\n---\n_[Interrupted - processing your new message]_"