Feishu adapter's disconnect() cancelled WSS-thread tasks but never called the lark_oapi client's _disconnect() coroutine, so no WebSocket CLOSE frame was sent. Feishu's server kept routing messages to the stale endpoint for minutes (CLOSE-WAIT timeout), silencing the channel across every shutdown path — systemd restart, hermes update, hermes gateway restart, and the --replace takeover during 'hermes dashboard' invocations. Schedule ws_client._disconnect() on the WSS thread loop via run_coroutine_threadsafe with a 5s timeout before the existing task-cancel + loop-stop sequence. Defensive hasattr guard + broad except keeps disconnect() resilient if lark_oapi's internals shift. Fixes #10202 |
||
|---|---|---|
| .. | ||
| browser | ||
| context_engine | ||
| cron_providers | ||
| dashboard_auth | ||
| disk-cleanup | ||
| google_meet | ||
| hermes-achievements | ||
| image_gen | ||
| kanban | ||
| memory | ||
| model-providers | ||
| observability | ||
| platforms | ||
| security-guidance | ||
| spotify | ||
| teams_pipeline | ||
| video_gen | ||
| web | ||
| __init__.py | ||
| plugin_utils.py | ||