fix(discord): stop phantom typing indicator after agent turn completes (#3003)
Two fixes for a race where Discord's typing indicator lingers after the agent finishes: 1. _keep_typing (root cause): after outer stop_typing() clears the task dict, _keep_typing wakes from its 2s sleep and calls send_typing() again, recreating an orphaned loop. Add a finally block so _keep_typing always calls stop_typing() on exit, cleaning up any loop it recreated. 2. _process_message_background (safety net): add stop_typing() after cancelling the typing task, catching any platform-level persistent typing tasks that slipped through. Combines fixes from PR #2945 by catbusconductor (root cause in _keep_typing) and PR #2832 by subrih (safety net in _process_message_background).
This commit is contained in:
@@ -819,6 +819,16 @@ class BasePlatformAdapter(ABC):
|
|||||||
await asyncio.sleep(interval)
|
await asyncio.sleep(interval)
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
pass # Normal cancellation when handler completes
|
pass # Normal cancellation when handler completes
|
||||||
|
finally:
|
||||||
|
# Ensure the underlying platform typing loop is stopped.
|
||||||
|
# _keep_typing may have called send_typing() after an outer
|
||||||
|
# stop_typing() cleared the task dict, recreating the loop.
|
||||||
|
# Cancelling _keep_typing alone won't clean that up.
|
||||||
|
if hasattr(self, "stop_typing"):
|
||||||
|
try:
|
||||||
|
await self.stop_typing(chat_id)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
async def handle_message(self, event: MessageEvent) -> None:
|
async def handle_message(self, event: MessageEvent) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -1130,6 +1140,13 @@ class BasePlatformAdapter(ABC):
|
|||||||
await typing_task
|
await typing_task
|
||||||
except asyncio.CancelledError:
|
except asyncio.CancelledError:
|
||||||
pass
|
pass
|
||||||
|
# Also cancel any platform-level persistent typing tasks (e.g. Discord)
|
||||||
|
# that may have been recreated by _keep_typing after the last stop_typing()
|
||||||
|
try:
|
||||||
|
if hasattr(self, "stop_typing"):
|
||||||
|
await self.stop_typing(event.source.chat_id)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
# Clean up session tracking
|
# Clean up session tracking
|
||||||
if session_key in self._active_sessions:
|
if session_key in self._active_sessions:
|
||||||
del self._active_sessions[session_key]
|
del self._active_sessions[session_key]
|
||||||
|
|||||||
Reference in New Issue
Block a user