diff --git a/docs/extensions/index.md b/docs/extensions/index.md index 2c8bc9b22e..af886026d7 100644 --- a/docs/extensions/index.md +++ b/docs/extensions/index.md @@ -187,6 +187,9 @@ precedence. ### Settings +_Note: This is an experimental feature. We do not yet recommend extension +authors introduce settings as part of their core flows._ + Extensions can define settings that the user will be prompted to provide upon installation. This is useful for things like API keys, URLs, or other configuration that the extension needs to function. diff --git a/packages/cli/src/config/extensions/extensionSettings.ts b/packages/cli/src/config/extensions/extensionSettings.ts index f625ef5ea8..89209e58ec 100644 --- a/packages/cli/src/config/extensions/extensionSettings.ts +++ b/packages/cli/src/config/extensions/extensionSettings.ts @@ -22,6 +22,11 @@ export interface ExtensionSetting { sensitive?: boolean; } +const getKeychainStorageName = ( + extensionName: string, + extensionId: string, +): string => `Gemini CLI Extensions ${extensionName} ${extensionId}`; + export async function maybePromptForSettings( extensionConfig: ExtensionConfig, extensionId: string, @@ -38,7 +43,9 @@ export async function maybePromptForSettings( return; } const envFilePath = new ExtensionStorage(extensionName).getEnvFilePath(); - const keychain = new KeychainTokenStorage(extensionId); + const keychain = new KeychainTokenStorage( + getKeychainStorageName(extensionName, extensionId), + ); if (!settings || settings.length === 0) { await clearSettings(envFilePath, keychain); @@ -107,7 +114,9 @@ export async function getEnvContents( return Promise.resolve({}); } const extensionStorage = new ExtensionStorage(extensionConfig.name); - const keychain = new KeychainTokenStorage(extensionId); + const keychain = new KeychainTokenStorage( + getKeychainStorageName(extensionConfig.name, extensionId), + ); let customEnv: Record = {}; if (fsSync.existsSync(extensionStorage.getEnvFilePath())) { const envFile = fsSync.readFileSync(