Skip to content

Commit a0ce446

Browse files
authored
chat - properly dispose all panel agents on error (#246586)
1 parent 541ae30 commit a0ce446

File tree

1 file changed

+22
-23
lines changed

1 file changed

+22
-23
lines changed

Diff for: src/vs/workbench/contrib/chat/browser/chatSetup.ts

+22-23
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ const ToolsAgentWhen = ContextKeyExpr.and(
9494
ContextKeyExpr.not(`previewFeaturesDisabled`) // Set by extension
9595
);
9696

97-
class SetupChatAgentImplementation extends Disposable implements IChatAgentImplementation {
97+
class SetupChatAgent extends Disposable implements IChatAgentImplementation {
9898

99-
static register(instantiationService: IInstantiationService, location: ChatAgentLocation, mode: ChatMode | undefined, context: ChatEntitlementContext, controller: Lazy<ChatSetupController>): { disposable: IDisposable; agent: SetupChatAgentImplementation } {
99+
static register(instantiationService: IInstantiationService, location: ChatAgentLocation, mode: ChatMode | undefined, context: ChatEntitlementContext, controller: Lazy<ChatSetupController>): { disposable: IDisposable; agent: SetupChatAgent } {
100100
return instantiationService.invokeFunction(accessor => {
101101
const chatAgentService = accessor.get(IChatAgentService);
102102

@@ -125,9 +125,9 @@ class SetupChatAgentImplementation extends Disposable implements IChatAgentImple
125125
break;
126126
}
127127

128-
const disposable = new DisposableStore();
128+
const disposables = new DisposableStore();
129129

130-
disposable.add(chatAgentService.registerAgent(id, {
130+
disposables.add(chatAgentService.registerAgent(id, {
131131
id,
132132
name: `${defaultChat.providerName} Copilot`,
133133
isDefault: true,
@@ -137,19 +137,17 @@ class SetupChatAgentImplementation extends Disposable implements IChatAgentImple
137137
slashCommands: [],
138138
disambiguation: [],
139139
locations: [location],
140-
metadata: {
141-
helpTextPrefix: SetupChatAgentImplementation.SETUP_NEEDED_MESSAGE
142-
},
140+
metadata: { helpTextPrefix: SetupChatAgent.SETUP_NEEDED_MESSAGE },
143141
description,
144142
extensionId: nullExtensionDescription.identifier,
145143
extensionDisplayName: nullExtensionDescription.name,
146144
extensionPublisherId: nullExtensionDescription.publisher
147145
}));
148146

149-
const agent = disposable.add(instantiationService.createInstance(SetupChatAgentImplementation, context, controller, location));
150-
disposable.add(chatAgentService.registerAgentImplementation(id, agent));
147+
const agent = disposables.add(instantiationService.createInstance(SetupChatAgent, context, controller, location));
148+
disposables.add(chatAgentService.registerAgentImplementation(id, agent));
151149

152-
return { agent, disposable };
150+
return { agent, disposable: disposables };
153151
});
154152
}
155153

@@ -366,7 +364,7 @@ class SetupChatAgentImplementation extends Disposable implements IChatAgentImple
366364
else {
367365
progress({
368366
kind: 'markdownContent',
369-
content: SetupChatAgentImplementation.SETUP_NEEDED_MESSAGE,
367+
content: SetupChatAgent.SETUP_NEEDED_MESSAGE,
370368
});
371369
}
372370

@@ -575,34 +573,35 @@ export class ChatSetupContribution extends Disposable implements IWorkbenchContr
575573
}
576574

577575
private registerSetupAgents(context: ChatEntitlementContext, controller: Lazy<ChatSetupController>): void {
578-
const registration = markAsSingleton(new MutableDisposable()); // prevents flicker on window reload
576+
const agentDisposables = markAsSingleton(new MutableDisposable()); // prevents flicker on window reload
579577

580578
const updateRegistration = () => {
581579
const disabled = context.state.hidden;
582-
if (!disabled && !registration.value) {
583-
const disposables = registration.value = new DisposableStore();
580+
if (!disabled && !agentDisposables.value) {
581+
const disposables = agentDisposables.value = new DisposableStore();
584582

585583
// Panel Agents
584+
const panelAgentDisposables = disposables.add(new DisposableStore());
586585
for (const mode of [ChatMode.Ask, ChatMode.Edit, ChatMode.Agent]) {
587-
const { agent, disposable } = SetupChatAgentImplementation.register(this.instantiationService, ChatAgentLocation.Panel, mode, context, controller);
588-
disposables.add(disposable);
589-
disposables.add(agent.onUnresolvableError(() => {
586+
const { agent, disposable } = SetupChatAgent.register(this.instantiationService, ChatAgentLocation.Panel, mode, context, controller);
587+
panelAgentDisposables.add(disposable);
588+
panelAgentDisposables.add(agent.onUnresolvableError(() => {
590589
// An unresolvable error from our agent registrations means that
591590
// Copilot is unhealthy for some reason. We clear our panel
592591
// registration to give Copilot a chance to show a custom message
593592
// to the user from the views and stop pretending as if there was
594593
// a functional agent.
595594
this.logService.error('[chat setup] Unresolvable error from Copilot agent registration, clearing registration.');
596-
disposable.dispose();
595+
panelAgentDisposables.dispose();
597596
}));
598597
}
599598

600599
// Inline Agents
601-
disposables.add(SetupChatAgentImplementation.register(this.instantiationService, ChatAgentLocation.Terminal, undefined, context, controller).disposable);
602-
disposables.add(SetupChatAgentImplementation.register(this.instantiationService, ChatAgentLocation.Notebook, undefined, context, controller).disposable);
603-
disposables.add(SetupChatAgentImplementation.register(this.instantiationService, ChatAgentLocation.Editor, undefined, context, controller).disposable);
604-
} else if (disabled && registration.value) {
605-
registration.clear();
600+
disposables.add(SetupChatAgent.register(this.instantiationService, ChatAgentLocation.Terminal, undefined, context, controller).disposable);
601+
disposables.add(SetupChatAgent.register(this.instantiationService, ChatAgentLocation.Notebook, undefined, context, controller).disposable);
602+
disposables.add(SetupChatAgent.register(this.instantiationService, ChatAgentLocation.Editor, undefined, context, controller).disposable);
603+
} else if (disabled && agentDisposables.value) {
604+
agentDisposables.clear();
606605
}
607606
};
608607

0 commit comments

Comments
 (0)