@@ -37,18 +37,16 @@ import { formatLanguage } from "../../shared/language"
3737import { Terminal } from "../../integrations/terminal/Terminal"
3838import { downloadTask } from "../../integrations/misc/export-markdown"
3939import { getTheme } from "../../integrations/theme/getTheme"
40- import WorkspaceTracker from "../../integrations/workspace/WorkspaceTracker"
4140import { McpHub } from "../../services/mcp/McpHub"
42- import { McpServerManager } from "../../services/mcp/McpServerManager"
4341import { ShadowCheckpointService } from "../../services/checkpoints/ShadowCheckpointService"
4442import { CodeIndexManager } from "../../services/code-index/manager"
4543import type { IndexProgressUpdate } from "../../services/code-index/interfaces/manager"
4644import { fileExistsAtPath } from "../../utils/fs"
4745import { setTtsEnabled , setTtsSpeed } from "../../utils/tts"
4846import { ContextProxy } from "../config/ContextProxy"
4947import { ProviderSettingsManager } from "../config/ProviderSettingsManager"
50- import { CustomModesManager } from "../config/CustomModesManager"
5148import { buildApiHandler } from "../../api"
49+ import { ComponentManager } from "./ComponentManager"
5250import { Task , TaskOptions } from "../task/Task"
5351import { getNonce } from "./getNonce"
5452import { getUri } from "./getUri"
@@ -82,17 +80,24 @@ export class ClineProvider
8280 private view ?: vscode . WebviewView | vscode . WebviewPanel
8381 private clineStack : Task [ ] = [ ]
8482 private codeIndexStatusSubscription ?: vscode . Disposable
85- private _workspaceTracker ?: WorkspaceTracker // workSpaceTracker read-only for access outside this class
86- public get workspaceTracker ( ) : WorkspaceTracker | undefined {
87- return this . _workspaceTracker
83+ private componentManager : ComponentManager
84+
85+ public get workspaceTracker ( ) {
86+ return this . componentManager . workspaceTracker
87+ }
88+
89+ private get mcpHub ( ) {
90+ return this . componentManager . mcpHub
91+ }
92+
93+ public get customModesManager ( ) {
94+ return this . componentManager . customModesManager
8895 }
89- protected mcpHub ?: McpHub // Change from private to protected
9096
9197 public isViewLaunched = false
9298 public settingsImportedAt ?: number
9399 public readonly latestAnnouncementId = "may-21-2025-3-18" // Update for v3.18.0 announcement
94100 public readonly providerSettingsManager : ProviderSettingsManager
95- public readonly customModesManager : CustomModesManager
96101
97102 constructor (
98103 readonly context : vscode . ExtensionContext ,
@@ -116,23 +121,10 @@ export class ClineProvider
116121 // properties like mode and provider.
117122 telemetryService . setProvider ( this )
118123
119- this . _workspaceTracker = new WorkspaceTracker ( this )
120-
121124 this . providerSettingsManager = new ProviderSettingsManager ( this . context )
122125
123- this . customModesManager = new CustomModesManager ( this . context , async ( ) => {
124- await this . postStateToWebview ( )
125- } )
126-
127- // Initialize MCP Hub through the singleton manager
128- McpServerManager . getInstance ( this . context , this )
129- . then ( ( hub ) => {
130- this . mcpHub = hub
131- this . mcpHub . registerClient ( )
132- } )
133- . catch ( ( error ) => {
134- this . log ( `Failed to initialize MCP Hub: ${ error } ` )
135- } )
126+ // Initialize ComponentManager to handle workspaceTracker, mcpHub, and customModesManager
127+ this . componentManager = new ComponentManager ( this . context , this )
136128 }
137129
138130 // Adds a new Cline instance to clineStack, marking the start of a new task.
@@ -217,8 +209,6 @@ export class ClineProvider
217209 */
218210 async dispose ( ) {
219211 this . log ( "Disposing ClineProvider..." )
220- await this . removeClineFromStack ( )
221- this . log ( "Cleared task" )
222212
223213 if ( this . view && "dispose" in this . view ) {
224214 this . view . dispose ( )
@@ -233,16 +223,17 @@ export class ClineProvider
233223 }
234224 }
235225
236- this . _workspaceTracker ? .dispose ( )
237- this . _workspaceTracker = undefined
238- await this . mcpHub ?. unregisterClient ( )
239- this . mcpHub = undefined
240- this . customModesManager ?. dispose ( )
226+ await this . componentManager . dispose ( )
227+
228+ await this . removeClineFromStack ( )
229+ this . log ( "Cleared task" )
230+
241231 this . log ( "Disposed all disposables" )
242- ClineProvider . activeInstances . delete ( this )
243232
244- // Unregister from McpServerManager
245- McpServerManager . unregisterProvider ( this )
233+ if ( this . componentManager . isDisposed ) {
234+ // As resolveWebviewView is not executed during dispose, the instance can be safely removed.
235+ ClineProvider . activeInstances . delete ( this )
236+ }
246237 }
247238
248239 public static getVisibleInstance ( ) : ClineProvider | undefined {
@@ -336,6 +327,11 @@ export class ClineProvider
336327 async resolveWebviewView ( webviewView : vscode . WebviewView | vscode . WebviewPanel ) {
337328 this . log ( "Resolving webview view" )
338329
330+ ClineProvider . activeInstances . add ( this )
331+ if ( this . componentManager . isDisposed ) {
332+ this . componentManager = new ComponentManager ( this . context , this )
333+ }
334+
339335 this . view = webviewView
340336
341337 // Set panel reference according to webview type
0 commit comments