Skip to content

Commit f58e28c

Browse files
roblourensCopilot
andauthored
sessions: fix TypeError when copilot pickers react to non-copilot sessions (#310353)
* sessions: fix TypeError when copilot pickers react to non-copilot sessions The copilot-specific pickers (BranchPicker, IsolationPicker, ModePicker, ModelPicker, PermissionPicker) use autorun observers that react to activeSession changes. They used getProvider<CopilotChatSessionsProvider>() which is a compile-time-only generic at runtime, when a non-Copilotcast provider's session becomes active, the returned object doesn't have getSession(), causing a TypeError. Replace all unsafe generic casts with instanceof CopilotChatSessionsProvider runtime checks across 6 files, so the pickers safely return undefined for non-Copilot providers. (Written by Copilot) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix isolationPicker test stub to pass instanceof check Use Object.create(CopilotChatSessionsProvider.prototype) so the test stub passes the runtime instanceof guard. (Written by Copilot) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 070960a commit f58e28c

File tree

7 files changed

+25
-11
lines changed

7 files changed

+25
-11
lines changed

src/vs/sessions/contrib/copilotChatSessions/browser/branchPicker.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ export class BranchPicker extends Disposable {
4141

4242
this._register(autorun(reader => {
4343
const session = this.sessionsManagementService.activeSession.read(reader);
44-
const providerSession = session ? this.sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId) : undefined;
44+
const provider = session ? this.sessionsProvidersService.getProvider(session.providerId) : undefined;
45+
const providerSession = provider instanceof CopilotChatSessionsProvider ? provider.getSession(session!.sessionId) : undefined;
4546
if (providerSession) {
4647
providerSession.loading.read(reader);
4748
providerSession.branches.read(reader);
@@ -57,7 +58,8 @@ export class BranchPicker extends Disposable {
5758
if (!session) {
5859
return undefined;
5960
}
60-
return this.sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId);
61+
const provider = this.sessionsProvidersService.getProvider(session.providerId);
62+
return provider instanceof CopilotChatSessionsProvider ? provider.getSession(session.sessionId) : undefined;
6163
}
6264

6365
render(container: HTMLElement): void {

src/vs/sessions/contrib/copilotChatSessions/browser/copilotChatSessionsActions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,8 @@ class CopilotActiveSessionContribution extends Disposable implements IWorkbenchC
315315
this._register(autorun((reader: IReader) => {
316316
const session = sessionsManagementService.activeSession.read(reader);
317317
if (session?.providerId === COPILOT_PROVIDER_ID) {
318-
const providerSession = sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId);
318+
const provider = sessionsProvidersService.getProvider(session.providerId);
319+
const providerSession = provider instanceof CopilotChatSessionsProvider ? provider.getSession(session.sessionId) : undefined;
319320
const isLoading = providerSession?.loading.read(reader);
320321
hasRepositoryKey.set(!isLoading && !!providerSession?.gitRepository);
321322
} else {

src/vs/sessions/contrib/copilotChatSessions/browser/isolationPicker.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ export class IsolationPicker extends Disposable {
6666
this._register(autorun(reader => {
6767
const session = this.sessionsManagementService.activeSession.read(reader);
6868
const isLoading = session?.loading.read(reader);
69-
const providerSession = session ? this.sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId) : undefined;
69+
const provider = session ? this.sessionsProvidersService.getProvider(session.providerId) : undefined;
70+
const providerSession = provider instanceof CopilotChatSessionsProvider ? provider.getSession(session!.sessionId) : undefined;
7071
if (providerSession) {
7172
const gitRepo = providerSession.gitRepository;
7273
const repoState = gitRepo?.state?.read?.(reader);
@@ -84,7 +85,8 @@ export class IsolationPicker extends Disposable {
8485

8586
private _getSessionIsolationMode(): IsolationMode {
8687
const session = this.sessionsManagementService.activeSession.get();
87-
const providerSession = session ? this.sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId) : undefined;
88+
const provider = session ? this.sessionsProvidersService.getProvider(session.providerId) : undefined;
89+
const providerSession = provider instanceof CopilotChatSessionsProvider ? provider.getSession(session!.sessionId) : undefined;
8890
return providerSession?.isolationMode.get() ?? 'worktree';
8991
}
9092

@@ -165,7 +167,8 @@ export class IsolationPicker extends Disposable {
165167

166168
private _setModeOnSession(mode: IsolationMode): void {
167169
const session = this.sessionsManagementService.activeSession.get();
168-
const providerSession = session ? this.sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId) : undefined;
170+
const provider = session ? this.sessionsProvidersService.getProvider(session.providerId) : undefined;
171+
const providerSession = provider instanceof CopilotChatSessionsProvider ? provider.getSession(session!.sessionId) : undefined;
169172
providerSession?.setIsolationMode(mode);
170173
}
171174

src/vs/sessions/contrib/copilotChatSessions/browser/modePicker.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,10 @@ export class ModePicker extends Disposable {
218218
return;
219219
}
220220

221-
this.sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId)?.setMode(mode);
221+
const provider = this.sessionsProvidersService.getProvider(session.providerId);
222+
if (provider instanceof CopilotChatSessionsProvider) {
223+
provider.getSession(session.sessionId)?.setMode(mode);
224+
}
222225
}
223226

224227
private _updateTriggerLabel(): void {

src/vs/sessions/contrib/copilotChatSessions/browser/modelPicker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ export class CloudModelPicker extends Disposable {
5858

5959
this._register(autorun(reader => {
6060
const session = sessionsManagementService.activeSession.read(reader);
61-
const providerSession = session ? sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId) : undefined;
61+
const provider = session ? sessionsProvidersService.getProvider(session.providerId) : undefined;
62+
const providerSession = provider instanceof CopilotChatSessionsProvider ? provider.getSession(session!.sessionId) : undefined;
6263
if (providerSession instanceof RemoteNewSession) {
6364
this._setSession(providerSession);
6465
}

src/vs/sessions/contrib/copilotChatSessions/browser/permissionPicker.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,10 @@ export class PermissionPicker extends Disposable {
6767
if (!session) {
6868
return;
6969
}
70-
this.sessionsProvidersService.getProvider<CopilotChatSessionsProvider>(session.providerId)?.getSession(session.sessionId)?.setPermissionLevel(level);
70+
const provider = this.sessionsProvidersService.getProvider(session.providerId);
71+
if (provider instanceof CopilotChatSessionsProvider) {
72+
provider.getSession(session.sessionId)?.setPermissionLevel(level);
73+
}
7174
}));
7275
}
7376

src/vs/sessions/contrib/copilotChatSessions/test/browser/isolationPicker.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { TestInstantiationService } from '../../../../../platform/instantiation/
1616
import { GitRefType } from '../../../../../workbench/contrib/git/common/gitService.js';
1717
import { ISessionsProvidersService } from '../../../../services/sessions/browser/sessionsProvidersService.js';
1818
import { IActiveSession, ISessionsManagementService } from '../../../../services/sessions/common/sessionsManagement.js';
19+
import { CopilotChatSessionsProvider } from '../../browser/copilotChatSessionsProvider.js';
1920
import { IsolationMode, IsolationPicker } from '../../browser/isolationPicker.js';
2021

2122
interface IIsolationActionItem {
@@ -49,12 +50,12 @@ function createPicker(
4950
workingTreeChanges: [],
5051
untrackedChanges: [],
5152
});
52-
const provider = {
53+
const provider = Object.assign(Object.create(CopilotChatSessionsProvider.prototype), {
5354
getSession: () => ({
5455
gitRepository: { state: gitState },
5556
isolationMode,
5657
}),
57-
};
58+
});
5859

5960
instantiationService.stub(IActionWidgetService, {
6061
isVisible: false,

0 commit comments

Comments
 (0)