@@ -16,7 +16,7 @@ import { ContinueCompletionProvider } from "../continuedev/core/vscode-test-harn
1616import OpenRouter from "../continuedev/core/llm/llms/OpenRouter"
1717
1818export class AutocompleteProvider {
19- private static instance : AutocompleteProvider | null = null
19+ private completionProviderDisposable : vscode . Disposable | null = null
2020 private model : AutocompleteModel
2121 private providerSettingsManager : ProviderSettingsManager
2222 private settings : GhostServiceSettings | null = null
@@ -29,7 +29,7 @@ export class AutocompleteProvider {
2929 // VSCode Providers
3030 public inlineCompletionProvider : any
3131
32- private constructor (
32+ constructor (
3333 private context : vscode . ExtensionContext ,
3434 private cline : ClineProvider ,
3535 ) {
@@ -40,21 +40,7 @@ export class AutocompleteProvider {
4040 void this . load ( )
4141 }
4242
43- // Singleton Management
44- public static initialize ( context : vscode . ExtensionContext , cline : ClineProvider ) : AutocompleteProvider {
45- if ( AutocompleteProvider . instance ) {
46- throw new Error ( "AutocompleteProvider is already initialized. Use getInstance() instead." )
47- }
48- AutocompleteProvider . instance = new AutocompleteProvider ( context , cline )
49- return AutocompleteProvider . instance
50- }
51-
52- public static getInstance ( ) : AutocompleteProvider {
53- if ( ! AutocompleteProvider . instance ) {
54- throw new Error ( "AutocompleteProvider is not initialized. Call initialize() first." )
55- }
56- return AutocompleteProvider . instance
57- }
43+ // Instance is created and managed by the registration function
5844
5945 // Settings Management
6046 private loadSettings ( ) {
@@ -77,15 +63,21 @@ export class AutocompleteProvider {
7763
7864 private async loadCodeCompletion ( ) {
7965 try {
66+ // Dispose any existing registration up front to keep logic centralized
67+ this . dispose ( )
68+
69+ // Decide whether the provider should be registered at all based on settings
70+ if ( ! this . settings ?. enableAutoTrigger ) {
71+ return
72+ }
73+
8074 // The model.reload() has already loaded the profile, so we can get the ILLM
8175 const llm = this . model . getILLM ( )
82-
8376 if ( ! llm ) {
8477 console . warn ( "[AutocompleteProvider] No valid autocomplete provider found" )
8578 return
8679 }
8780
88- // Register the Continue completion provider with the selected LLM
8981 const minimalConfigProvider = new MinimalConfigProvider ( {
9082 selectedModelByRole : {
9183 autocomplete : llm ,
@@ -94,9 +86,13 @@ export class AutocompleteProvider {
9486 const ide = new VsCodeIde ( this . context )
9587 const usingFullFileDiff = false
9688 const continueProvider = new ContinueCompletionProvider ( minimalConfigProvider , ide , usingFullFileDiff )
97- this . context . subscriptions . push (
98- vscode . languages . registerInlineCompletionItemProvider ( [ { pattern : "**" } ] , continueProvider ) ,
89+
90+ // Register provider and hold onto disposable to prevent duplicates
91+ this . completionProviderDisposable = vscode . languages . registerInlineCompletionItemProvider (
92+ [ { pattern : "**" } ] ,
93+ continueProvider ,
9994 )
95+ this . context . subscriptions . push ( this . completionProviderDisposable )
10096
10197 console . log ( "[AutocompleteProvider] Successfully registered autocomplete" )
10298 } catch ( error ) {
@@ -150,9 +146,12 @@ export class AutocompleteProvider {
150146 }
151147
152148 /**
153- * Dispose of all resources used by the GhostProvider
149+ * Dispose of all resources used by the AutocompleteProvider
154150 */
155151 public dispose ( ) : void {
156- AutocompleteProvider . instance = null // Reset singleton
152+ if ( this . completionProviderDisposable ) {
153+ this . completionProviderDisposable . dispose ( )
154+ this . completionProviderDisposable = null
155+ }
157156 }
158157}
0 commit comments