Create ExtensionManager class which manages all high level extension tasks (#11667)

This commit is contained in:
Jacob MacDonald
2025-10-23 11:39:36 -07:00
committed by GitHub
parent 3a501196f0
commit c4c0c0d182
31 changed files with 1450 additions and 1568 deletions
+24 -7
View File
@@ -26,7 +26,6 @@ import { getStartupWarnings } from './utils/startupWarnings.js';
import { getUserStartupWarnings } from './utils/userStartupWarnings.js';
import { ConsolePatcher } from './ui/utils/ConsolePatcher.js';
import { runNonInteractive } from './nonInteractiveCli.js';
import { loadExtensions } from './config/extension.js';
import {
cleanupCheckpoints,
registerCleanup,
@@ -67,8 +66,9 @@ import {
relaunchOnExitCode,
} from './utils/relaunch.js';
import { loadSandboxConfig } from './config/sandboxConfig.js';
import { ExtensionManager } from './config/extension-manager.js';
import { requestConsentNonInteractive } from './config/extensions/consent.js';
import { createPolicyUpdater } from './config/policy.js';
import { ExtensionEnablementManager } from './config/extensions/extensionEnablement.js';
export function validateDnsResolutionOrder(
order: string | undefined,
@@ -225,7 +225,17 @@ export async function startInteractiveUI(
export async function main() {
setupUnhandledRejectionHandler();
const settings = loadSettings();
migrateDeprecatedSettings(settings);
migrateDeprecatedSettings(
settings,
// Temporary extension manager only used during this non-interactive UI phase.
new ExtensionManager({
workspaceDir: process.cwd(),
loadedSettings: settings,
enabledExtensionOverrides: [],
requestConsent: requestConsentNonInteractive,
requestSetting: null,
}),
);
await cleanupCheckpoints();
const argv = await parseArguments(settings.merged);
@@ -360,10 +370,17 @@ export async function main() {
// to run Gemini CLI. It is now safe to perform expensive initialization that
// may have side effects.
{
const extensionEnablementManager = new ExtensionEnablementManager(
argv.extensions,
);
const extensions = loadExtensions(extensionEnablementManager);
// Eventually, `extensions` should move off of `config` entirely and into
// the UI state instead.
const extensionManager = new ExtensionManager({
loadedSettings: settings,
workspaceDir: process.cwd(),
// At this stage, we still don't have an interactive UI.
requestConsent: requestConsentNonInteractive,
requestSetting: null,
enabledExtensionOverrides: argv.extensions,
});
const extensions = extensionManager.loadExtensions();
const config = await loadCliConfig(
settings.merged,
extensions,