diff --git a/packages/cloud/src/bridge/BridgeOrchestrator.ts b/packages/cloud/src/bridge/BridgeOrchestrator.ts index 952c4b3e217d..69a6f5a57d02 100644 --- a/packages/cloud/src/bridge/BridgeOrchestrator.ts +++ b/packages/cloud/src/bridge/BridgeOrchestrator.ts @@ -61,13 +61,19 @@ export class BridgeOrchestrator { public static async connectOrDisconnect( userInfo: CloudUserInfo | null, remoteControlEnabled: boolean | undefined, - options: BridgeOrchestratorOptions, + options?: BridgeOrchestratorOptions, ): Promise { const isEnabled = BridgeOrchestrator.isEnabled(userInfo, remoteControlEnabled) const instance = BridgeOrchestrator.instance if (isEnabled) { if (!instance) { + if (!options) { + console.error( + `[BridgeOrchestrator#connectOrDisconnect] Cannot connect: options are required for connection`, + ) + return + } try { console.log(`[BridgeOrchestrator#connectOrDisconnect] Connecting...`) BridgeOrchestrator.instance = new BridgeOrchestrator(options) diff --git a/src/extension.ts b/src/extension.ts index cb765ad718e8..8cb739922edf 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -12,7 +12,7 @@ try { console.warn("Failed to load environment variables:", e) } -import type { CloudUserInfo } from "@roo-code/types" +import type { CloudUserInfo, AuthState } from "@roo-code/types" import { CloudService, BridgeOrchestrator } from "@roo-code/cloud" import { TelemetryService, PostHogTelemetryClient } from "@roo-code/telemetry" @@ -53,7 +53,7 @@ let outputChannel: vscode.OutputChannel let extensionContext: vscode.ExtensionContext let cloudService: CloudService | undefined -let authStateChangedHandler: (() => void) | undefined +let authStateChangedHandler: ((data: { state: AuthState; previousState: AuthState }) => Promise) | undefined let settingsUpdatedHandler: (() => void) | undefined let userInfoHandler: ((data: { userInfo: CloudUserInfo }) => Promise) | undefined @@ -127,7 +127,28 @@ export async function activate(context: vscode.ExtensionContext) { // Initialize Roo Code Cloud service. const postStateListener = () => ClineProvider.getVisibleInstance()?.postStateToWebview() - authStateChangedHandler = postStateListener + + authStateChangedHandler = async (data: { state: AuthState; previousState: AuthState }) => { + postStateListener() + + // Check if user has logged out + if (data.state === "logged-out") { + try { + // Disconnect the bridge when user logs out + // When userInfo is null and remoteControlEnabled is false, BridgeOrchestrator + // will disconnect. The options parameter is not needed for disconnection. + await BridgeOrchestrator.connectOrDisconnect(null, false) + + cloudLogger("[CloudService] BridgeOrchestrator disconnected on logout") + } catch (error) { + cloudLogger( + `[CloudService] Failed to disconnect BridgeOrchestrator on logout: ${ + error instanceof Error ? error.message : String(error) + }`, + ) + } + } + } settingsUpdatedHandler = async () => { const userInfo = CloudService.instance.getUserInfo()