From 5b4fc18339e9e59ecfce5ce007cf8e4d1b934813 Mon Sep 17 00:00:00 2001 From: Sehoon Shon Date: Mon, 23 Mar 2026 19:03:24 -0400 Subject: [PATCH] perf(core): parallelize tool discovery and background IDE client to speed up initialization --- packages/cli/src/core/initializer.test.ts | 3 +++ packages/cli/src/core/initializer.ts | 16 +++++++++++++--- packages/core/src/config/config.ts | 15 ++++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/packages/cli/src/core/initializer.test.ts b/packages/cli/src/core/initializer.test.ts index e4fdb2cba5..9093ad54ee 100644 --- a/packages/cli/src/core/initializer.test.ts +++ b/packages/cli/src/core/initializer.test.ts @@ -105,6 +105,9 @@ describe('initializer', () => { mockSettings, ); + // Wait for the background promise to resolve + await new Promise((resolve) => setTimeout(resolve, 0)); + expect(result).toEqual({ authError: null, accountSuspensionInfo: null, diff --git a/packages/cli/src/core/initializer.ts b/packages/cli/src/core/initializer.ts index f27e9a9511..607129ae3e 100644 --- a/packages/cli/src/core/initializer.ts +++ b/packages/cli/src/core/initializer.ts @@ -13,6 +13,7 @@ import { StartSessionEvent, logCliConfiguration, startupProfiler, + debugLogger, } from '@google/gemini-cli-core'; import { type LoadedSettings } from '../config/settings.js'; import { performInitialAuth } from './auth.js'; @@ -55,9 +56,18 @@ export async function initializeApp( ); if (config.getIdeMode()) { - const ideClient = await IdeClient.getInstance(); - await ideClient.connect(); - logIdeConnection(config, new IdeConnectionEvent(IdeConnectionType.START)); + IdeClient.getInstance() + .then(async (ideClient) => { + await ideClient.connect(); + logIdeConnection( + config, + new IdeConnectionEvent(IdeConnectionType.START), + ); + }) + .catch((e) => { + // We log locally if IDE connection setup fails in the background. + debugLogger.error('Failed to initialize IDE client:', e); + }); } return { diff --git a/packages/core/src/config/config.ts b/packages/core/src/config/config.ts index e52a286e7a..5e9f6af653 100644 --- a/packages/core/src/config/config.ts +++ b/packages/core/src/config/config.ts @@ -1288,18 +1288,27 @@ export class Config implements McpContext, AgentLoopContext { // Initialize centralized FileDiscoveryService const discoverToolsHandle = startupProfiler.start('discover_tools'); this.getFileService(); + + const discoveryPromises: Array> = []; + if (this.getCheckpointingEnabled()) { - await this.getGitService(); + discoveryPromises.push(this.getGitService()); } + this._promptRegistry = new PromptRegistry(); this._resourceRegistry = new ResourceRegistry(); this.agentRegistry = new AgentRegistry(this); - await this.agentRegistry.initialize(); + discoveryPromises.push(this.agentRegistry.initialize()); coreEvents.on(CoreEvent.AgentsRefreshed, this.onAgentsRefreshed); - this._toolRegistry = await this.createToolRegistry(); + const toolRegistryPromise = this.createToolRegistry().then((registry) => { + this._toolRegistry = registry; + }); + discoveryPromises.push(toolRegistryPromise); + + await Promise.all(discoveryPromises); discoverToolsHandle?.end(); this.mcpClientManager = new McpClientManager( this.clientVersion,