diff options
Diffstat (limited to 'packages/core/src')
| -rw-r--r-- | packages/core/src/config/config.ts | 29 | ||||
| -rw-r--r-- | packages/core/src/core/client.test.ts | 19 | ||||
| -rw-r--r-- | packages/core/src/core/client.ts | 2 | ||||
| -rw-r--r-- | packages/core/src/ide/ide-client.ts | 20 |
4 files changed, 51 insertions, 19 deletions
diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index e62e2962..edb24351 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -184,6 +184,7 @@ export interface ConfigParameters { blockedMcpServers?: Array<{ name: string; extensionName: string }>; noBrowser?: boolean; summarizeToolOutput?: Record<string, SummarizeToolOutputSettings>; + ideModeFeature?: boolean; ideMode?: boolean; ideClient: IdeClient; } @@ -228,8 +229,9 @@ export class Config { private readonly model: string; private readonly extensionContextFilePaths: string[]; private readonly noBrowser: boolean; - private readonly ideMode: boolean; - private readonly ideClient: IdeClient; + private readonly ideModeFeature: boolean; + private ideMode: boolean; + private ideClient: IdeClient; private inFallbackMode = false; private readonly maxSessionTurns: number; private readonly listExtensions: boolean; @@ -298,7 +300,8 @@ export class Config { this._blockedMcpServers = params.blockedMcpServers ?? []; this.noBrowser = params.noBrowser ?? false; this.summarizeToolOutput = params.summarizeToolOutput; - this.ideMode = params.ideMode ?? false; + this.ideModeFeature = params.ideModeFeature ?? false; + this.ideMode = params.ideMode ?? true; this.ideClient = params.ideClient; if (params.contextFileName) { @@ -589,14 +592,30 @@ export class Config { return this.summarizeToolOutput; } - getIdeMode(): boolean { - return this.ideMode; + getIdeModeFeature(): boolean { + return this.ideModeFeature; } getIdeClient(): IdeClient { return this.ideClient; } + getIdeMode(): boolean { + return this.ideMode; + } + + setIdeMode(value: boolean): void { + this.ideMode = value; + } + + setIdeClientDisconnected(): void { + this.ideClient.setDisconnected(); + } + + setIdeClientConnected(): void { + this.ideClient.reconnect(this.ideMode && this.ideModeFeature); + } + async getGitService(): Promise<GitService> { if (!this.gitService) { this.gitService = new GitService(this.targetDir); diff --git a/packages/core/src/core/client.test.ts b/packages/core/src/core/client.test.ts index 96ddec1c..68d8c231 100644 --- a/packages/core/src/core/client.test.ts +++ b/packages/core/src/core/client.test.ts @@ -199,7 +199,8 @@ describe('Gemini Client (client.ts)', () => { setQuotaErrorOccurred: vi.fn(), getNoBrowser: vi.fn().mockReturnValue(false), getUsageStatisticsEnabled: vi.fn().mockReturnValue(true), - getIdeMode: vi.fn().mockReturnValue(false), + getIdeModeFeature: vi.fn().mockReturnValue(false), + getIdeMode: vi.fn().mockReturnValue(true), getWorkspaceContext: vi.fn().mockReturnValue({ getDirectories: vi.fn().mockReturnValue(['/test/dir']), }), @@ -649,7 +650,7 @@ describe('Gemini Client (client.ts)', () => { }); describe('sendMessageStream', () => { - it('should include IDE context when ideMode is enabled', async () => { + it('should include IDE context when ideModeFeature is enabled', async () => { // Arrange vi.mocked(ideContext.getIdeContext).mockReturnValue({ workspaceState: { @@ -673,7 +674,7 @@ describe('Gemini Client (client.ts)', () => { }, }); - vi.spyOn(client['config'], 'getIdeMode').mockReturnValue(true); + vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true); const mockStream = (async function* () { yield { type: 'content', value: 'Hello' }; @@ -724,7 +725,7 @@ Here are some other files the user has open, with the most recent at the top: ); }); - it('should not add context if ideMode is enabled but no open files', async () => { + it('should not add context if ideModeFeature is enabled but no open files', async () => { // Arrange vi.mocked(ideContext.getIdeContext).mockReturnValue({ workspaceState: { @@ -732,7 +733,7 @@ Here are some other files the user has open, with the most recent at the top: }, }); - vi.spyOn(client['config'], 'getIdeMode').mockReturnValue(true); + vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true); const mockStream = (async function* () { yield { type: 'content', value: 'Hello' }; @@ -771,7 +772,7 @@ Here are some other files the user has open, with the most recent at the top: ); }); - it('should add context if ideMode is enabled and there is one active file', async () => { + it('should add context if ideModeFeature is enabled and there is one active file', async () => { // Arrange vi.mocked(ideContext.getIdeContext).mockReturnValue({ workspaceState: { @@ -787,7 +788,7 @@ Here are some other files the user has open, with the most recent at the top: }, }); - vi.spyOn(client['config'], 'getIdeMode').mockReturnValue(true); + vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true); const mockStream = (async function* () { yield { type: 'content', value: 'Hello' }; @@ -835,7 +836,7 @@ This is the selected text in the file: ); }); - it('should add context if ideMode is enabled and there are open files but no active file', async () => { + it('should add context if ideModeFeature is enabled and there are open files but no active file', async () => { // Arrange vi.mocked(ideContext.getIdeContext).mockReturnValue({ workspaceState: { @@ -852,7 +853,7 @@ This is the selected text in the file: }, }); - vi.spyOn(client['config'], 'getIdeMode').mockReturnValue(true); + vi.spyOn(client['config'], 'getIdeModeFeature').mockReturnValue(true); const mockStream = (async function* () { yield { type: 'content', value: 'Hello' }; diff --git a/packages/core/src/core/client.ts b/packages/core/src/core/client.ts index ecc7c242..49a30294 100644 --- a/packages/core/src/core/client.ts +++ b/packages/core/src/core/client.ts @@ -339,7 +339,7 @@ export class GeminiClient { yield { type: GeminiEventType.ChatCompressed, value: compressed }; } - if (this.config.getIdeMode()) { + if (this.config.getIdeModeFeature() && this.config.getIdeMode()) { const ideContextState = ideContext.getIdeContext(); const openFiles = ideContextState?.workspaceState?.openFiles; diff --git a/packages/core/src/ide/ide-client.ts b/packages/core/src/ide/ide-client.ts index 4dd720dd..be24db3e 100644 --- a/packages/core/src/ide/ide-client.ts +++ b/packages/core/src/ide/ide-client.ts @@ -41,14 +41,14 @@ export class IdeClient { private readonly currentIde: DetectedIde | undefined; private readonly currentIdeDisplayName: string | undefined; - private constructor(ideMode: boolean) { - if (!ideMode) { - return; - } + constructor(ideMode: boolean) { this.currentIde = detectIde(); if (this.currentIde) { this.currentIdeDisplayName = getIdeDisplayName(this.currentIde); } + if (!ideMode) { + return; + } this.init().catch((err) => { logger.debug('Failed to initialize IdeClient:', err); }); @@ -130,6 +130,10 @@ export class IdeClient { }; } + async reconnect(ideMode: boolean) { + IdeClient.instance = new IdeClient(ideMode); + } + private async establishConnection(port: string) { let transport: StreamableHTTPClientTransport | undefined; try { @@ -189,7 +193,15 @@ export class IdeClient { await this.establishConnection(port); } + dispose() { + this.client?.close(); + } + getDetectedIdeDisplayName(): string | undefined { return this.currentIdeDisplayName; } + + setDisconnected() { + this.setState(IDEConnectionStatus.Disconnected); + } } |
