Skip to content

Commit c86ffac

Browse files
committed
refactor(extension): remove obsolete cloud account listeners
1 parent 179ae6d commit c86ffac

3 files changed

Lines changed: 21 additions & 65 deletions

File tree

src/__tests__/extension.spec.ts

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
// npx vitest run __tests__/extension.spec.ts
22

33
import type * as vscode from "vscode"
4-
import type { AuthState, CloudUserInfo } from "@roo-code/types"
54

65
vi.mock("vscode", () => ({
76
window: {
@@ -189,7 +188,7 @@ vi.mock("../core/webview/ClineProvider", async () => {
189188
resolveWebviewView: vi.fn(),
190189
postMessageToWebview: vi.fn(),
191190
postStateToWebview: vi.fn(),
192-
postStateToWebviewWithoutClineMessages: vi.fn(),
191+
postStateToWebviewWithoutClineMessages: vi.fn().mockResolvedValue(undefined),
193192
getState: vi.fn().mockResolvedValue({}),
194193
initializeCloudProfileSyncWhenReady: vi.fn().mockResolvedValue(undefined),
195194
providerSettingsManager: {},
@@ -221,11 +220,7 @@ vi.mock("../api/providers/fetchers/modelCache", () => ({
221220

222221
describe("extension.ts", () => {
223222
let mockContext: vscode.ExtensionContext
224-
let authStateChangedHandler:
225-
| ((data: { state: AuthState; previousState: AuthState }) => void | Promise<void>)
226-
| undefined
227223
let settingsUpdatedHandler: ((data: Record<string, never>) => void | Promise<void>) | undefined
228-
let userInfoHandler: ((data: { userInfo: CloudUserInfo }) => void | Promise<void>) | undefined
229224

230225
beforeEach(() => {
231226
vi.clearAllMocks()
@@ -239,9 +234,7 @@ describe("extension.ts", () => {
239234
subscriptions: [],
240235
} as unknown as vscode.ExtensionContext
241236

242-
authStateChangedHandler = undefined
243237
settingsUpdatedHandler = undefined
244-
userInfoHandler = undefined
245238
})
246239

247240
test("does not call dotenv.config when optional .env does not exist", async () => {
@@ -274,21 +267,17 @@ describe("extension.ts", () => {
274267
expect(dotenv.config).toHaveBeenCalledTimes(1)
275268
})
276269

277-
describe("cloud auth state handling", () => {
270+
describe("cloud organization settings handling", () => {
278271
beforeEach(() => {
279272
vi.resetModules()
280273
})
281274

282-
test("auth state changes still post webview state without Roo model cache side effects", async () => {
275+
test("settings updates refresh webview state and contain failures", async () => {
283276
const { CloudService } = await import("@roo-code/cloud")
284277
const { ClineProvider } = await import("../core/webview/ClineProvider")
285278

286279
vi.mocked(CloudService.createInstance).mockImplementation(async (_context, _logger, handlers) => {
287-
if (handlers?.["auth-state-changed"]) {
288-
authStateChangedHandler = handlers["auth-state-changed"]
289-
}
290280
settingsUpdatedHandler = handlers?.["settings-updated"]
291-
userInfoHandler = handlers?.["user-info"]
292281
return {
293282
off: vi.fn(),
294283
on: vi.fn(),
@@ -310,29 +299,18 @@ describe("extension.ts", () => {
310299
}
311300
).getVisibleInstance()
312301
provider.postStateToWebviewWithoutClineMessages.mockClear()
302+
const refreshError = new Error("state refresh failed")
303+
provider.postStateToWebviewWithoutClineMessages.mockRejectedValueOnce(refreshError)
313304

314-
let resolveStateRefresh!: () => void
315-
const stateRefreshPromise = new Promise<void>((resolve) => {
316-
resolveStateRefresh = resolve
317-
})
318-
provider.postStateToWebviewWithoutClineMessages.mockReturnValueOnce(stateRefreshPromise)
319-
const handlerPromise = authStateChangedHandler!({
320-
state: "active-session" as AuthState,
321-
previousState: "logged-out" as AuthState,
322-
}) as Promise<void>
323-
let settled = false
324-
void handlerPromise.then(() => {
325-
settled = true
326-
})
305+
settingsUpdatedHandler!({})
327306
await Promise.resolve()
328-
expect(settled).toBe(false)
329-
330-
resolveStateRefresh()
331-
await handlerPromise
332-
await settingsUpdatedHandler!({})
333-
await userInfoHandler!({ userInfo: {} as CloudUserInfo })
334307

335-
expect(provider.postStateToWebviewWithoutClineMessages).toHaveBeenCalledTimes(3)
308+
expect(provider.postStateToWebviewWithoutClineMessages).toHaveBeenCalledTimes(1)
309+
const vscode = await import("vscode")
310+
const channel = vi.mocked(vscode.window.createOutputChannel).mock.results.at(-1)?.value
311+
expect(channel?.appendLine).toHaveBeenCalledWith(
312+
"[CloudService] Failed to refresh state after settings update: state refresh failed",
313+
)
336314
})
337315

338316
test("activation continues when model cache refresh initialization fails", async () => {

src/eslint-suppressions.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,11 +1134,6 @@
11341134
"count": 5
11351135
}
11361136
},
1137-
"extension.ts": {
1138-
"@typescript-eslint/no-explicit-any": {
1139-
"count": 1
1140-
}
1141-
},
11421137
"extension/__tests__/api-delete-queued-message.spec.ts": {
11431138
"@typescript-eslint/no-explicit-any": {
11441139
"count": 1

src/extension.ts

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ if (fs.existsSync(envPath)) {
1515
}
1616
}
1717

18-
import type { CloudUserInfo, AuthState } from "@roo-code/types"
1918
import { isTelemetryOptedIn } from "@roo-code/types"
2019
import { CloudService } from "@roo-code/cloud"
2120
import { TelemetryService, PostHogTelemetryClient } from "@roo-code/telemetry"
@@ -64,9 +63,7 @@ let outputChannel: vscode.OutputChannel
6463
let extensionContext: vscode.ExtensionContext
6564
let cloudService: CloudService | undefined
6665

67-
let authStateChangedHandler: ((data: { state: AuthState; previousState: AuthState }) => Promise<void>) | undefined
68-
let settingsUpdatedHandler: (() => Promise<void>) | undefined
69-
let userInfoHandler: ((data: { userInfo: CloudUserInfo }) => Promise<void>) | undefined
66+
let settingsUpdatedHandler: (() => void) | undefined
7067

7168
/**
7269
* Check if we should auto-open the Zoo Code sidebar after switching to a worktree.
@@ -225,25 +222,19 @@ export async function activate(context: vscode.ExtensionContext) {
225222
const provider = new ClineProvider(context, outputChannel, "sidebar", contextProxy, mdmService)
226223

227224
// Initialize Roo Code Cloud service.
228-
const postStateListener = () => ClineProvider.getVisibleInstance()?.postStateToWebviewWithoutClineMessages()
229-
230-
authStateChangedHandler = async (_data: { state: AuthState; previousState: AuthState }) => {
231-
await postStateListener()
232-
}
233-
234-
settingsUpdatedHandler = async () => {
235-
await postStateListener()
236-
}
237-
238-
userInfoHandler = async ({ userInfo }: { userInfo: CloudUserInfo }) => {
239-
await postStateListener()
225+
settingsUpdatedHandler = () => {
226+
void ClineProvider.getVisibleInstance()
227+
?.postStateToWebviewWithoutClineMessages()
228+
.catch((error) => {
229+
outputChannel.appendLine(
230+
`[CloudService] Failed to refresh state after settings update: ${error instanceof Error ? error.message : String(error)}`,
231+
)
232+
})
240233
}
241234

242235
try {
243236
cloudService = await CloudService.createInstance(context, cloudLogger, {
244-
"auth-state-changed": authStateChangedHandler,
245237
"settings-updated": settingsUpdatedHandler,
246-
"user-info": userInfoHandler,
247238
})
248239

249240
// Add to subscriptions for proper cleanup on deactivate.
@@ -395,18 +386,10 @@ export async function deactivate() {
395386

396387
if (cloudService && CloudService.hasInstance()) {
397388
try {
398-
if (authStateChangedHandler) {
399-
CloudService.instance.off("auth-state-changed", authStateChangedHandler)
400-
}
401-
402389
if (settingsUpdatedHandler) {
403390
CloudService.instance.off("settings-updated", settingsUpdatedHandler)
404391
}
405392

406-
if (userInfoHandler) {
407-
CloudService.instance.off("user-info", userInfoHandler as any)
408-
}
409-
410393
outputChannel.appendLine("CloudService event handlers cleaned up")
411394
} catch (error) {
412395
outputChannel.appendLine(

0 commit comments

Comments
 (0)