From bacd42715aaddca13ea16f12095a9d394a006868 Mon Sep 17 00:00:00 2001 From: Roo Code Date: Fri, 29 Aug 2025 15:40:28 +0000 Subject: [PATCH 1/3] feat: sync extension bridge settings with cloud - 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 --- src/core/webview/ClineProvider.ts | 26 +++++++++++-- src/core/webview/webviewMessageHandler.ts | 10 ++++- src/extension.ts | 47 ++++++++++++++++++++--- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index a7c59560e49..9f22cdcd04f 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1892,7 +1892,17 @@ export class ClineProvider includeDiagnosticMessages: includeDiagnosticMessages ?? true, maxDiagnosticMessages: maxDiagnosticMessages ?? 50, includeTaskHistoryInEnhance: includeTaskHistoryInEnhance ?? true, - remoteControlEnabled: remoteControlEnabled ?? false, + remoteControlEnabled: (() => { + try { + const cloudSettings = CloudService.instance.getUserSettings() + return cloudSettings?.settings?.extensionBridgeEnabled ?? false + } catch (error) { + console.error( + `[getStateToPostToWebview] failed to get remote control setting from cloud: ${error instanceof Error ? error.message : String(error)}`, + ) + return false + } + })(), } } @@ -2080,8 +2090,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 970c9d0712c..2c52e652fcd 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -950,7 +950,15 @@ export const webviewMessageHandler = async ( await provider.postStateToWebview() break case "remoteControlEnabled": - await updateGlobalState("remoteControlEnabled", message.bool ?? false) + // Update cloud settings instead of local globalState + try { + await CloudService.instance.updateUserSettings({ + extensionBridgeEnabled: message.bool ?? false, + }) + } catch (error) { + provider.log(`Failed to update cloud settings for remote control: ${error}`) + // Don't fall back to local storage - cloud settings are the source of truth + } await provider.remoteControlEnabled(message.bool ?? false) await provider.postStateToWebview() break diff --git a/src/extension.ts b/src/extension.ts index 4aa5ff11133..af7e3d72af7 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -128,7 +128,38 @@ export async function activate(context: vscode.ExtensionContext) { // Initialize Roo Code Cloud service. const postStateListener = () => ClineProvider.getVisibleInstance()?.postStateToWebview() authStateChangedHandler = postStateListener - settingsUpdatedHandler = postStateListener + + // Enhanced settings updated handler that also updates BridgeOrchestrator + settingsUpdatedHandler = async () => { + // Update BridgeOrchestrator when settings change + 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 +177,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)}`, From 55c84c554c1dc1dabb505b45a571bbd6c605d5a7 Mon Sep 17 00:00:00 2001 From: John Richmond <5629+jr@users.noreply.github.com> Date: Fri, 29 Aug 2025 10:57:12 -0700 Subject: [PATCH 2/3] Deduplicate remoteControlEnabled setting --- src/core/webview/ClineProvider.ts | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index 9f22cdcd04f..7b418d9e258 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1892,17 +1892,7 @@ export class ClineProvider includeDiagnosticMessages: includeDiagnosticMessages ?? true, maxDiagnosticMessages: maxDiagnosticMessages ?? 50, includeTaskHistoryInEnhance: includeTaskHistoryInEnhance ?? true, - remoteControlEnabled: (() => { - try { - const cloudSettings = CloudService.instance.getUserSettings() - return cloudSettings?.settings?.extensionBridgeEnabled ?? false - } catch (error) { - console.error( - `[getStateToPostToWebview] failed to get remote control setting from cloud: ${error instanceof Error ? error.message : String(error)}`, - ) - return false - } - })(), + remoteControlEnabled, } } From c51234447be85d16cd8e3111b6afae11da95d124 Mon Sep 17 00:00:00 2001 From: John Richmond <5629+jr@users.noreply.github.com> Date: Fri, 29 Aug 2025 10:59:04 -0700 Subject: [PATCH 3/3] Comment de-slop --- src/core/webview/webviewMessageHandler.ts | 2 -- src/extension.ts | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 2c52e652fcd..0a314edde3c 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -950,14 +950,12 @@ export const webviewMessageHandler = async ( await provider.postStateToWebview() break case "remoteControlEnabled": - // Update cloud settings instead of local globalState try { await CloudService.instance.updateUserSettings({ extensionBridgeEnabled: message.bool ?? false, }) } catch (error) { provider.log(`Failed to update cloud settings for remote control: ${error}`) - // Don't fall back to local storage - cloud settings are the source of truth } await provider.remoteControlEnabled(message.bool ?? false) await provider.postStateToWebview() diff --git a/src/extension.ts b/src/extension.ts index af7e3d72af7..cb765ad718e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -129,9 +129,7 @@ export async function activate(context: vscode.ExtensionContext) { const postStateListener = () => ClineProvider.getVisibleInstance()?.postStateToWebview() authStateChangedHandler = postStateListener - // Enhanced settings updated handler that also updates BridgeOrchestrator settingsUpdatedHandler = async () => { - // Update BridgeOrchestrator when settings change const userInfo = CloudService.instance.getUserInfo() if (userInfo && CloudService.instance.cloudAPI) { try {