From eb36d954bee8fccacf45899675088326f8a468db Mon Sep 17 00:00:00 2001 From: Roo Code Date: Tue, 28 Oct 2025 15:28:12 +0000 Subject: [PATCH] fix: detect newly added folders in workspace dynamically - Added workspace folder change listener in extension.ts - Convert codeIndexManagers from array to Map for better tracking - Implement logic to create CodeIndexManager for added folders - Implement logic to dispose CodeIndexManager for removed folders - Add handleWorkspaceFoldersChanged method to ClineProvider - Fixes #8886 --- src/core/webview/ClineProvider.ts | 9 ++++ src/extension.ts | 71 ++++++++++++++++++++++++------- 2 files changed, 65 insertions(+), 15 deletions(-) diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index ec1781d79f..7375b319aa 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1614,6 +1614,15 @@ export class ClineProvider await this.postStateToWebview() } + async handleWorkspaceFoldersChanged() { + // Update the current workspace path when folders change + this.currentWorkspacePath = getWorkspacePath() + // Notify the webview about the state change + await this.postStateToWebview() + // Log the workspace change for debugging + this.log("Workspace folders changed - updated workspace path and notified webview") + } + async postStateToWebview() { const state = await this.getStateToPostToWebview() this.postMessageToWebview({ type: "state", state }) diff --git a/src/extension.ts b/src/extension.ts index 6281f5d447..1f1452dc54 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -101,28 +101,69 @@ export async function activate(context: vscode.ExtensionContext) { const contextProxy = await ContextProxy.getInstance(context) // Initialize code index managers for all workspace folders. - const codeIndexManagers: CodeIndexManager[] = [] + const codeIndexManagers: Map = new Map() - if (vscode.workspace.workspaceFolders) { - for (const folder of vscode.workspace.workspaceFolders) { - const manager = CodeIndexManager.getInstance(context, folder.uri.fsPath) + // Helper function to initialize a CodeIndexManager for a folder + async function initializeCodeIndexManagerForFolder(folder: vscode.WorkspaceFolder): Promise { + const manager = CodeIndexManager.getInstance(context, folder.uri.fsPath) - if (manager) { - codeIndexManagers.push(manager) + if (manager) { + codeIndexManagers.set(folder.uri.fsPath, manager) - try { - await manager.initialize(contextProxy) - } catch (error) { - outputChannel.appendLine( - `[CodeIndexManager] Error during background CodeIndexManager configuration/indexing for ${folder.uri.fsPath}: ${error.message || error}`, - ) - } - - context.subscriptions.push(manager) + try { + await manager.initialize(contextProxy) + } catch (error) { + outputChannel.appendLine( + `[CodeIndexManager] Error during background CodeIndexManager configuration/indexing for ${folder.uri.fsPath}: ${error.message || error}`, + ) } + + context.subscriptions.push(manager) } } + // Initialize managers for existing workspace folders + if (vscode.workspace.workspaceFolders) { + for (const folder of vscode.workspace.workspaceFolders) { + await initializeCodeIndexManagerForFolder(folder) + } + } + + // Listen for workspace folder changes + context.subscriptions.push( + vscode.workspace.onDidChangeWorkspaceFolders(async (event) => { + // Handle removed folders + for (const removedFolder of event.removed) { + const manager = codeIndexManagers.get(removedFolder.uri.fsPath) + if (manager) { + outputChannel.appendLine( + `[CodeIndexManager] Removing CodeIndexManager for removed folder: ${removedFolder.uri.fsPath}`, + ) + // Dispose the manager + manager.dispose() + // Remove from our map + codeIndexManagers.delete(removedFolder.uri.fsPath) + // Remove from context subscriptions + const index = context.subscriptions.indexOf(manager) + if (index > -1) { + context.subscriptions.splice(index, 1) + } + } + } + + // Handle added folders + for (const addedFolder of event.added) { + outputChannel.appendLine( + `[CodeIndexManager] Adding CodeIndexManager for new folder: ${addedFolder.uri.fsPath}`, + ) + await initializeCodeIndexManagerForFolder(addedFolder) + } + + // Notify the provider about workspace changes + provider.handleWorkspaceFoldersChanged() + }), + ) + // Initialize the provider *before* the Roo Code Cloud service. const provider = new ClineProvider(context, outputChannel, "sidebar", contextProxy, mdmService)