mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-10 18:06:07 +00:00
* fix(qqbot): publish disconnected channel status when the gateway closes or gives up The QQBot channel only ever set connected: true (onReady/onResumed); no close path updated the status, so a fatal close (bot banned or offline, 4914/4915) or reconnect exhaustion left channels.status claiming a live connection forever, and the channel-health monitor never saw connected=false for a dead gateway. Thread an onDisconnected callback from GatewayConnection.handleClose (fatal and pre-reconnect branches) and the reconnect-exhaustion path through the engine/bridge layers into channel.ts, which now records connected: false and, for fatal closes, the close reason as lastError. The running flag stays owned by the gateway lifecycle store, matching the sibling channel convention. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(qqbot): import ChannelAccountSnapshot from the channel-contract subpath The monolithic openclaw/plugin-sdk root entry is a legacy surface; plugin-sdk contract guardrails and extension boundary checks require focused subpath imports in bundled plugin sources. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(qqbot): ignore stale socket closes from superseded gateway connections A server-driven RECONNECT / INVALID_SESSION tears the old socket down and brings up a replacement; the old socket's close event can arrive after the replacement is live. Reacting to it again would tear down the new socket and regress the connected status, so the close handler now ignores closes from sockets that are no longer current. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(qqbot): harden disconnect status recovery * fix(qqbot): report opcode-driven reconnects * fix(qqbot): keep fatal disconnect health visible --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: Vincent Koc <vincentkoc@ieee.org>