فهرست منبع

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 <[email protected]>
Co-authored-by: John Richmond <[email protected]>
roomote[bot] 4 ماه پیش
والد
کامیت
01458f1646
3فایلهای تغییر یافته به همراه59 افزوده شده و 10 حذف شده
  1. 13 3
      src/core/webview/ClineProvider.ts
  2. 7 1
      src/core/webview/webviewMessageHandler.ts
  3. 39 6
      src/extension.ts

+ 13 - 3
src/core/webview/ClineProvider.ts

@@ -1892,7 +1892,7 @@ export class ClineProvider
 			includeDiagnosticMessages: includeDiagnosticMessages ?? true,
 			maxDiagnosticMessages: maxDiagnosticMessages ?? 50,
 			includeTaskHistoryInEnhance: includeTaskHistoryInEnhance ?? true,
-			remoteControlEnabled: remoteControlEnabled ?? false,
+			remoteControlEnabled,
 		}
 	}
 
@@ -2080,8 +2080,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
+				}
+			})(),
 		}
 	}
 

+ 7 - 1
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

+ 39 - 6
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)}`,