From 666db9a7f446f7603ebe03971dc4b7e3150459d0 Mon Sep 17 00:00:00 2001 From: "roomote[bot]" <219738659+roomote[bot]@users.noreply.github.com> Date: Fri, 29 Aug 2025 11:08:58 -0700 Subject: [PATCH] feat: sync extension bridge settings with cloud (#7535) - Use CloudService.getUserSettings() for remoteControlEnabled instead of global state - Update CloudService.updateUserSettings when toggling remote control - Add BridgeOrchestrator.connectOrDisconnect handling in settings update handler - Remove dependency on contentProxy/globalSettings for remote control state --------- Co-authored-by: Roo Code Co-authored-by: John Richmond <5629+jr@users.noreply.github.com> --- src/core/webview/ClineProvider.ts | 18 +++++++-- src/core/webview/webviewMessageHandler.ts | 8 +++- src/extension.ts | 45 ++++++++++++++++++++--- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 8d6ac76e27..003b4fe84c 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1950,8 +1950,8 @@ export class ClineProvider includeDiagnosticMessages: includeDiagnosticMessages ?? true, maxDiagnosticMessages: maxDiagnosticMessages ?? 50, includeTaskHistoryInEnhance: includeTaskHistoryInEnhance ?? true, - remoteControlEnabled: remoteControlEnabled ?? false, - filesChangedEnabled: this.getGlobalState("filesChangedEnabled") ?? true, + remoteControlEnabled, + filesChangedEnabled: this.getGlobalState("filesChangedEnabled") ?? true, } } @@ -2139,8 +2139,18 @@ export class ClineProvider maxDiagnosticMessages: stateValues.maxDiagnosticMessages ?? 50, // Add includeTaskHistoryInEnhance setting includeTaskHistoryInEnhance: stateValues.includeTaskHistoryInEnhance ?? true, - // Add remoteControlEnabled setting - remoteControlEnabled: stateValues.remoteControlEnabled ?? false, + // Add remoteControlEnabled setting - get from cloud settings + remoteControlEnabled: (() => { + try { + const cloudSettings = CloudService.instance.getUserSettings() + return cloudSettings?.settings?.extensionBridgeEnabled ?? false + } catch (error) { + console.error( + `[getState] failed to get remote control setting from cloud: ${error instanceof Error ? error.message : String(error)}`, + ) + return false + } + })(), } } diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 54d64cd618..8b024f2223 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -950,7 +950,13 @@ export const webviewMessageHandler = async ( await provider.postStateToWebview() break case "remoteControlEnabled": - await updateGlobalState("remoteControlEnabled", message.bool ?? false) + try { + await CloudService.instance.updateUserSettings({ + extensionBridgeEnabled: message.bool ?? false, + }) + } catch (error) { + provider.log(`Failed to update cloud settings for remote control: ${error}`) + } await provider.remoteControlEnabled(message.bool ?? false) await provider.postStateToWebview() break diff --git a/src/extension.ts b/src/extension.ts index 4aa5ff1113..cb765ad718 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -128,7 +128,36 @@ export async function activate(context: vscode.ExtensionContext) { // Initialize Roo Code Cloud service. const postStateListener = () => ClineProvider.getVisibleInstance()?.postStateToWebview() authStateChangedHandler = postStateListener - settingsUpdatedHandler = postStateListener + + settingsUpdatedHandler = async () => { + const userInfo = CloudService.instance.getUserInfo() + if (userInfo && CloudService.instance.cloudAPI) { + try { + const config = await CloudService.instance.cloudAPI.bridgeConfig() + + const isCloudAgent = + typeof process.env.ROO_CODE_CLOUD_TOKEN === "string" && process.env.ROO_CODE_CLOUD_TOKEN.length > 0 + + const remoteControlEnabled = isCloudAgent + ? true + : (CloudService.instance.getUserSettings()?.settings?.extensionBridgeEnabled ?? false) + + cloudLogger(`[CloudService] Settings updated - remoteControlEnabled = ${remoteControlEnabled}`) + + await BridgeOrchestrator.connectOrDisconnect(userInfo, remoteControlEnabled, { + ...config, + provider, + sessionId: vscode.env.sessionId, + }) + } catch (error) { + cloudLogger( + `[CloudService] Failed to update BridgeOrchestrator on settings change: ${error instanceof Error ? error.message : String(error)}`, + ) + } + } + + postStateListener() + } userInfoHandler = async ({ userInfo }: { userInfo: CloudUserInfo }) => { postStateListener() @@ -146,11 +175,15 @@ export async function activate(context: vscode.ExtensionContext) { cloudLogger(`[CloudService] isCloudAgent = ${isCloudAgent}, socketBridgeUrl = ${config.socketBridgeUrl}`) - await BridgeOrchestrator.connectOrDisconnect( - userInfo, - isCloudAgent ? true : contextProxy.getValue("remoteControlEnabled"), - { ...config, provider, sessionId: vscode.env.sessionId }, - ) + const remoteControlEnabled = isCloudAgent + ? true + : (CloudService.instance.getUserSettings()?.settings?.extensionBridgeEnabled ?? false) + + await BridgeOrchestrator.connectOrDisconnect(userInfo, remoteControlEnabled, { + ...config, + provider, + sessionId: vscode.env.sessionId, + }) } catch (error) { cloudLogger( `[CloudService] Failed to fetch bridgeConfig: ${error instanceof Error ? error.message : String(error)}`,