fix: notify all open tabs when MCP settings change

- Modified McpHub.notifyWebviewOfServerChanges() to use McpServerManager.notifyProviders()
- This ensures all open tabs receive updates when MCP settings change
- Updated tests to mock McpServerManager instead of direct provider calls
- Fixes #8634
This commit is contained in:
Roo Code 2025-10-13 02:23:46 +00:00
parent 6b8c21f873
commit afc8e073f7
2 changed files with 30 additions and 22 deletions

View file

@ -1319,27 +1319,19 @@ export class McpHub {
return aIsGlobal ? 1 : -1
})
// Send sorted servers to webview
const targetProvider: ClineProvider | undefined = this.providerRef.deref()
// Send sorted servers to all registered providers (all open tabs)
const serversToSend = sortedConnections.map((connection) => connection.server)
if (targetProvider) {
const serversToSend = sortedConnections.map((connection) => connection.server)
const message = {
type: "mcpServers" as const,
mcpServers: serversToSend,
}
try {
await targetProvider.postMessageToWebview(message)
} catch (error) {
console.error("[McpHub] Error calling targetProvider.postMessageToWebview:", error)
}
} else {
console.error(
"[McpHub] No target provider available (neither from getInstance nor providerRef) - cannot send mcpServers message to webview",
)
const message = {
type: "mcpServers" as const,
mcpServers: serversToSend,
}
// Import McpServerManager dynamically to avoid circular dependency
const { McpServerManager } = await import("./McpServerManager")
// Notify all registered providers to ensure all tabs are synchronized
McpServerManager.notifyProviders(message)
}
public async toggleServerDisabled(

View file

@ -49,6 +49,16 @@ vi.mock("../../../utils/safeWriteJson", () => ({
}),
}))
// Mock McpServerManager
vi.mock("../McpServerManager", () => ({
McpServerManager: {
notifyProviders: vi.fn(),
getInstance: vi.fn(),
unregisterProvider: vi.fn(),
cleanup: vi.fn(),
},
}))
vi.mock("vscode", () => ({
workspace: {
createFileSystemWatcher: vi.fn().mockReturnValue({
@ -1502,9 +1512,12 @@ describe("McpHub", () => {
}
mcpHub.connections = [mockConnection]
// Get the mock McpServerManager
const { McpServerManager } = await import("../McpServerManager")
await mcpHub.updateServerTimeout("test-server", 120)
expect(mockProvider.postMessageToWebview).toHaveBeenCalledWith(
expect(McpServerManager.notifyProviders).toHaveBeenCalledWith(
expect.objectContaining({
type: "mcpServers",
}),
@ -1733,6 +1746,9 @@ describe("McpHub", () => {
const mcpHub = new McpHub(disabledMockProvider as unknown as ClineProvider)
await new Promise((resolve) => setTimeout(resolve, 100))
// Get the mock McpServerManager
const { McpServerManager } = await import("../McpServerManager")
// Clear previous calls
vi.clearAllMocks()
@ -1746,8 +1762,8 @@ describe("McpHub", () => {
expect(server!.client).toBeNull()
expect(server!.transport).toBeNull()
// Verify postMessageToWebview was called to update the UI
expect(disabledMockProvider.postMessageToWebview).toHaveBeenCalledWith(
// Verify McpServerManager.notifyProviders was called to update the UI
expect(McpServerManager.notifyProviders).toHaveBeenCalledWith(
expect.objectContaining({
type: "mcpServers",
}),