From 2dfd9d5dce7f22b76bef5e92277927c89123eea8 Mon Sep 17 00:00:00 2001 From: Junyan Qin Date: Sun, 19 Apr 2026 14:26:55 +0800 Subject: [PATCH] fix(box): detect disconnect when handler.run() returns normally The generic Handler.run() catches ConnectionClosedError and breaks out of its loop (normal return) instead of raising, because it has no disconnect_callback. The old code only triggered reconnection in the except branch, so a clean WebSocket close was never detected. Now treat handler.run() returning normally (after successful handshake) as a disconnect event, triggering the reconnection callback. --- src/langbot/pkg/box/connector.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/langbot/pkg/box/connector.py b/src/langbot/pkg/box/connector.py index cec1762a..b75c6bde 100644 --- a/src/langbot/pkg/box/connector.py +++ b/src/langbot/pkg/box/connector.py @@ -251,18 +251,21 @@ class BoxRuntimeConnector(ManagedRuntimeConnector): if not connected.is_set(): connect_error.append(exc) connected.set() + return + + # If we reach here, handler.run() returned normally (connection + # closed) or raised after the initial handshake succeeded. + # Either way, treat it as a disconnect. + if connected.is_set(): + if self._uses_websocket(): + self.ap.logger.error('Disconnected from Box runtime, trying to reconnect...') + if self.runtime_disconnect_callback is not None: + await self.runtime_disconnect_callback(self) else: - # Connection was established but then dropped — this is a - # disconnect after successful handshake. - if self._uses_websocket(): - self.ap.logger.error('Disconnected from Box runtime, trying to reconnect...') - if self.runtime_disconnect_callback is not None: - await self.runtime_disconnect_callback(self) - else: - self.ap.logger.error( - 'Disconnected from Box runtime via stdio. ' - 'Cannot automatically reconnect — please restart LangBot.' - ) + self.ap.logger.error( + 'Disconnected from Box runtime via stdio. ' + 'Cannot automatically reconnect — please restart LangBot.' + ) return new_connection_callback