fix: Gate auth-driven Roo model refresh to active provider only (#8915)

This commit is contained in:
Daniel 2025-10-29 15:23:39 -05:00 committed by GitHub
parent ff0c65af10
commit bd5807bac1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 79 additions and 3 deletions

View file

@ -440,12 +440,13 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode
// Watch for authentication state changes and refresh Roo models
useEffect(() => {
const currentAuth = state.cloudIsAuthenticated ?? false
if (!prevCloudIsAuthenticated && currentAuth) {
// User just authenticated - refresh Roo models with the new auth token
const currentProvider = state.apiConfiguration?.apiProvider
if (!prevCloudIsAuthenticated && currentAuth && currentProvider === "roo") {
// User just authenticated and Roo is the active provider - refresh Roo models
vscode.postMessage({ type: "requestRooModels" })
}
setPrevCloudIsAuthenticated(currentAuth)
}, [state.cloudIsAuthenticated, prevCloudIsAuthenticated])
}, [state.cloudIsAuthenticated, prevCloudIsAuthenticated, state.apiConfiguration?.apiProvider])
const contextValue: ExtensionStateContextType = {
...state,

View file

@ -0,0 +1,75 @@
import { render, waitFor } from "@/utils/test-utils"
import React from "react"
vi.mock("@src/utils/vscode", () => ({
vscode: {
postMessage: vi.fn(),
},
}))
import { ExtensionStateContextProvider } from "@src/context/ExtensionStateContext"
import { vscode } from "@src/utils/vscode"
describe("ExtensionStateContext Roo auth gate", () => {
beforeEach(() => {
vi.clearAllMocks()
})
function postStateMessage(state: any) {
window.dispatchEvent(
new MessageEvent("message", {
data: {
type: "state",
state,
},
}),
)
}
it("does not post requestRooModels when auth flips and provider !== 'roo'", async () => {
render(
<ExtensionStateContextProvider>
<div />
</ExtensionStateContextProvider>,
)
// Flip auth to true with a non-roo provider (anthropic)
postStateMessage({
cloudIsAuthenticated: true,
apiConfiguration: { apiProvider: "anthropic" },
})
// Should NOT fire auth-driven Roo refresh
await waitFor(() => {
const calls = (vscode.postMessage as any).mock.calls as any[][]
const hasRequest = calls.some((c) => c[0]?.type === "requestRooModels")
expect(hasRequest).toBe(false)
})
})
it("posts requestRooModels when auth flips and provider === 'roo'", async () => {
render(
<ExtensionStateContextProvider>
<div />
</ExtensionStateContextProvider>,
)
// Ensure prev false (explicit)
postStateMessage({
cloudIsAuthenticated: false,
apiConfiguration: { apiProvider: "roo" },
})
vi.clearAllMocks()
// Flip to true with provider roo - should trigger
postStateMessage({
cloudIsAuthenticated: true,
apiConfiguration: { apiProvider: "roo" },
})
await waitFor(() => {
expect(vscode.postMessage).toHaveBeenCalledWith({ type: "requestRooModels" })
})
})
})