@google/gemini-cli 0.11.0-preview.0 → 0.12.0-nightly.20251023.c4c0c0d1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/google-gemini-cli-0.12.0-nightly.20251022.0542de95.tgz +0 -0
  2. package/dist/package.json +4 -3
  3. package/dist/src/commands/extensions/disable.js +13 -6
  4. package/dist/src/commands/extensions/disable.js.map +1 -1
  5. package/dist/src/commands/extensions/enable.js +13 -6
  6. package/dist/src/commands/extensions/enable.js.map +1 -1
  7. package/dist/src/commands/extensions/install.js +12 -2
  8. package/dist/src/commands/extensions/install.js.map +1 -1
  9. package/dist/src/commands/extensions/install.test.js +11 -3
  10. package/dist/src/commands/extensions/install.test.js.map +1 -1
  11. package/dist/src/commands/extensions/link.js +12 -2
  12. package/dist/src/commands/extensions/link.js.map +1 -1
  13. package/dist/src/commands/extensions/list.js +13 -4
  14. package/dist/src/commands/extensions/list.js.map +1 -1
  15. package/dist/src/commands/extensions/uninstall.js +12 -2
  16. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  17. package/dist/src/commands/extensions/update.js +17 -13
  18. package/dist/src/commands/extensions/update.js.map +1 -1
  19. package/dist/src/commands/extensions.js +1 -0
  20. package/dist/src/commands/extensions.js.map +1 -1
  21. package/dist/src/commands/mcp/list.js +10 -3
  22. package/dist/src/commands/mcp/list.js.map +1 -1
  23. package/dist/src/commands/mcp/list.test.js +12 -6
  24. package/dist/src/commands/mcp/list.test.js.map +1 -1
  25. package/dist/src/config/config.js +12 -0
  26. package/dist/src/config/config.js.map +1 -1
  27. package/dist/src/config/config.test.js +11 -0
  28. package/dist/src/config/config.test.js.map +1 -1
  29. package/dist/src/config/extension-manager.d.ts +38 -0
  30. package/dist/src/config/extension-manager.js +412 -0
  31. package/dist/src/config/extension-manager.js.map +1 -0
  32. package/dist/src/config/extension.d.ts +4 -51
  33. package/dist/src/config/extension.js +1 -535
  34. package/dist/src/config/extension.js.map +1 -1
  35. package/dist/src/config/extension.test.js +316 -159
  36. package/dist/src/config/extension.test.js.map +1 -1
  37. package/dist/src/config/extensions/consent.d.ts +38 -0
  38. package/dist/src/config/extensions/consent.js +123 -0
  39. package/dist/src/config/extensions/consent.js.map +1 -0
  40. package/dist/src/config/extensions/extensionEnablement.js +1 -1
  41. package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
  42. package/dist/src/config/extensions/extensionSettings.d.ts +15 -0
  43. package/dist/src/config/extensions/extensionSettings.js +63 -0
  44. package/dist/src/config/extensions/extensionSettings.js.map +1 -0
  45. package/dist/src/config/extensions/extensionSettings.test.d.ts +6 -0
  46. package/dist/src/config/extensions/extensionSettings.test.js +137 -0
  47. package/dist/src/config/extensions/extensionSettings.test.js.map +1 -0
  48. package/dist/src/config/extensions/github.d.ts +2 -2
  49. package/dist/src/config/extensions/github.js +3 -8
  50. package/dist/src/config/extensions/github.js.map +1 -1
  51. package/dist/src/config/extensions/github.test.js +25 -7
  52. package/dist/src/config/extensions/github.test.js.map +1 -1
  53. package/dist/src/config/extensions/storage.d.ts +14 -0
  54. package/dist/src/config/extensions/storage.js +32 -0
  55. package/dist/src/config/extensions/storage.js.map +1 -0
  56. package/dist/src/config/extensions/update.d.ts +4 -4
  57. package/dist/src/config/extensions/update.js +11 -18
  58. package/dist/src/config/extensions/update.js.map +1 -1
  59. package/dist/src/config/extensions/update.test.js +32 -58
  60. package/dist/src/config/extensions/update.test.js.map +1 -1
  61. package/dist/src/config/extensions/variableSchema.d.ts +0 -6
  62. package/dist/src/config/extensions/variableSchema.js.map +1 -1
  63. package/dist/src/config/extensions/variables.d.ts +4 -0
  64. package/dist/src/config/extensions/variables.js +6 -0
  65. package/dist/src/config/extensions/variables.js.map +1 -1
  66. package/dist/src/config/settings.d.ts +2 -1
  67. package/dist/src/config/settings.js +4 -7
  68. package/dist/src/config/settings.js.map +1 -1
  69. package/dist/src/config/settings.test.js +113 -14
  70. package/dist/src/config/settings.test.js.map +1 -1
  71. package/dist/src/config/settingsSchema.d.ts +9 -0
  72. package/dist/src/config/settingsSchema.js +9 -0
  73. package/dist/src/config/settingsSchema.js.map +1 -1
  74. package/dist/src/gemini.js +22 -5
  75. package/dist/src/gemini.js.map +1 -1
  76. package/dist/src/generated/git-commit.d.ts +2 -2
  77. package/dist/src/generated/git-commit.js +2 -2
  78. package/dist/src/generated/git-commit.js.map +1 -1
  79. package/dist/src/nonInteractiveCli.js +14 -1
  80. package/dist/src/nonInteractiveCli.js.map +1 -1
  81. package/dist/src/nonInteractiveCli.test.js +84 -2
  82. package/dist/src/nonInteractiveCli.test.js.map +1 -1
  83. package/dist/src/test-utils/createExtension.d.ts +3 -1
  84. package/dist/src/test-utils/createExtension.js +3 -3
  85. package/dist/src/test-utils/createExtension.js.map +1 -1
  86. package/dist/src/ui/AppContainer.js +101 -47
  87. package/dist/src/ui/AppContainer.js.map +1 -1
  88. package/dist/src/ui/AppContainer.test.js +138 -79
  89. package/dist/src/ui/AppContainer.test.js.map +1 -1
  90. package/dist/src/ui/commands/extensionsCommand.js +19 -10
  91. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  92. package/dist/src/ui/commands/extensionsCommand.test.js +8 -0
  93. package/dist/src/ui/commands/extensionsCommand.test.js.map +1 -1
  94. package/dist/src/ui/components/HistoryItemDisplay.js +1 -1
  95. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  96. package/dist/src/ui/components/InputPrompt.js +5 -6
  97. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  98. package/dist/src/ui/components/InputPrompt.test.js +249 -393
  99. package/dist/src/ui/components/InputPrompt.test.js.map +1 -1
  100. package/dist/src/ui/components/SettingsDialog.test.js +0 -29
  101. package/dist/src/ui/components/SettingsDialog.test.js.map +1 -1
  102. package/dist/src/ui/components/views/ExtensionsList.d.ts +7 -1
  103. package/dist/src/ui/components/views/ExtensionsList.js +4 -10
  104. package/dist/src/ui/components/views/ExtensionsList.js.map +1 -1
  105. package/dist/src/ui/components/views/ExtensionsList.test.js +34 -21
  106. package/dist/src/ui/components/views/ExtensionsList.test.js.map +1 -1
  107. package/dist/src/ui/contexts/KeypressContext.js +328 -335
  108. package/dist/src/ui/contexts/KeypressContext.js.map +1 -1
  109. package/dist/src/ui/hooks/useAutoAcceptIndicator.js +10 -0
  110. package/dist/src/ui/hooks/useAutoAcceptIndicator.js.map +1 -1
  111. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js +30 -0
  112. package/dist/src/ui/hooks/useAutoAcceptIndicator.test.js.map +1 -1
  113. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +14 -4
  114. package/dist/src/ui/hooks/useExtensionUpdates.js +14 -17
  115. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -1
  116. package/dist/src/ui/hooks/useExtensionUpdates.test.js +23 -30
  117. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -1
  118. package/dist/src/ui/hooks/useGitBranchName.js +4 -0
  119. package/dist/src/ui/hooks/useGitBranchName.js.map +1 -1
  120. package/dist/src/ui/hooks/useGitBranchName.test.js +19 -21
  121. package/dist/src/ui/hooks/useGitBranchName.test.js.map +1 -1
  122. package/dist/src/ui/hooks/useReactToolScheduler.js +22 -8
  123. package/dist/src/ui/hooks/useReactToolScheduler.js.map +1 -1
  124. package/dist/src/ui/hooks/useReactToolScheduler.test.d.ts +6 -0
  125. package/dist/src/ui/hooks/useReactToolScheduler.test.js +65 -0
  126. package/dist/src/ui/hooks/useReactToolScheduler.test.js.map +1 -0
  127. package/dist/src/ui/hooks/useToolScheduler.test.js +30 -48
  128. package/dist/src/ui/hooks/useToolScheduler.test.js.map +1 -1
  129. package/dist/src/ui/types.d.ts +2 -1
  130. package/dist/src/ui/types.js.map +1 -1
  131. package/dist/src/ui/utils/CodeColorizer.js +2 -1
  132. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  133. package/dist/src/utils/envVarResolver.d.ts +2 -2
  134. package/dist/src/utils/envVarResolver.js +10 -7
  135. package/dist/src/utils/envVarResolver.js.map +1 -1
  136. package/dist/src/zed-integration/schema.d.ts +4 -4
  137. package/dist/src/zed-integration/zedIntegration.js +3 -3
  138. package/dist/src/zed-integration/zedIntegration.js.map +1 -1
  139. package/dist/tsconfig.tsbuildinfo +1 -1
  140. package/package.json +4 -3
@@ -0,0 +1,412 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import * as os from 'node:os';
9
+ import chalk from 'chalk';
10
+ import { ExtensionEnablementManager } from './extensions/extensionEnablement.js';
11
+ import { SettingScope } from './settings.js';
12
+ import { createHash, randomUUID } from 'node:crypto';
13
+ import { loadInstallMetadata } from './extension.js';
14
+ import { isWorkspaceTrusted } from './trustedFolders.js';
15
+ import { cloneFromGit, downloadFromGitHubRelease, tryParseGithubUrl, } from './extensions/github.js';
16
+ import { Config, debugLogger, ExtensionDisableEvent, ExtensionEnableEvent, ExtensionInstallEvent, ExtensionUninstallEvent, ExtensionUpdateEvent, getErrorMessage, logExtensionDisable, logExtensionEnable, logExtensionInstallEvent, logExtensionUninstall, logExtensionUpdateEvent, } from '@google/gemini-cli-core';
17
+ import { maybeRequestConsentOrFail } from './extensions/consent.js';
18
+ import { resolveEnvVarsInObject } from '../utils/envVarResolver.js';
19
+ import { ExtensionStorage } from './extensions/storage.js';
20
+ import { EXTENSIONS_CONFIG_FILENAME, INSTALL_METADATA_FILENAME, recursivelyHydrateStrings, } from './extensions/variables.js';
21
+ import { getEnvContents, maybePromptForSettings, } from './extensions/extensionSettings.js';
22
+ export class ExtensionManager {
23
+ extensionEnablementManager;
24
+ loadedSettings;
25
+ requestConsent;
26
+ requestSetting;
27
+ telemetryConfig;
28
+ workspaceDir;
29
+ constructor(options) {
30
+ this.workspaceDir = options.workspaceDir;
31
+ this.extensionEnablementManager = new ExtensionEnablementManager(options.enabledExtensionOverrides);
32
+ this.loadedSettings = options.loadedSettings;
33
+ this.telemetryConfig = new Config({
34
+ telemetry: options.loadedSettings.merged.telemetry,
35
+ interactive: false,
36
+ sessionId: randomUUID(),
37
+ targetDir: options.workspaceDir,
38
+ cwd: options.workspaceDir,
39
+ model: '',
40
+ debugMode: false,
41
+ });
42
+ this.requestConsent = options.requestConsent;
43
+ this.requestSetting = options.requestSetting;
44
+ }
45
+ async installOrUpdateExtension(installMetadata, previousExtensionConfig) {
46
+ const isUpdate = !!previousExtensionConfig;
47
+ let newExtensionConfig = null;
48
+ let localSourcePath;
49
+ try {
50
+ const settings = this.loadedSettings.merged;
51
+ if (!isWorkspaceTrusted(settings).isTrusted) {
52
+ throw new Error(`Could not install extension from untrusted folder at ${installMetadata.source}`);
53
+ }
54
+ const extensionsDir = ExtensionStorage.getUserExtensionsDir();
55
+ await fs.promises.mkdir(extensionsDir, { recursive: true });
56
+ if (!path.isAbsolute(installMetadata.source) &&
57
+ (installMetadata.type === 'local' || installMetadata.type === 'link')) {
58
+ installMetadata.source = path.resolve(this.workspaceDir, installMetadata.source);
59
+ }
60
+ let tempDir;
61
+ if (installMetadata.type === 'git' ||
62
+ installMetadata.type === 'github-release') {
63
+ tempDir = await ExtensionStorage.createTmpDir();
64
+ const parsedGithubParts = tryParseGithubUrl(installMetadata.source);
65
+ if (!parsedGithubParts) {
66
+ await cloneFromGit(installMetadata, tempDir);
67
+ installMetadata.type = 'git';
68
+ }
69
+ else {
70
+ const result = await downloadFromGitHubRelease(installMetadata, tempDir, parsedGithubParts);
71
+ if (result.success) {
72
+ installMetadata.type = result.type;
73
+ installMetadata.releaseTag = result.tagName;
74
+ }
75
+ else if (
76
+ // This repo has no github releases, and wasn't explicitly installed
77
+ // from a github release, unconditionally just clone it.
78
+ (result.failureReason === 'no release data' &&
79
+ installMetadata.type === 'git') ||
80
+ // Otherwise ask the user if they would like to try a git clone.
81
+ (await this.requestConsent(`Error downloading github release for ${installMetadata.source} with the following error: ${result.errorMessage}.\n\nWould you like to attempt to install via "git clone" instead?`))) {
82
+ await cloneFromGit(installMetadata, tempDir);
83
+ installMetadata.type = 'git';
84
+ }
85
+ else {
86
+ throw new Error(`Failed to install extension ${installMetadata.source}: ${result.errorMessage}`);
87
+ }
88
+ }
89
+ localSourcePath = tempDir;
90
+ }
91
+ else if (installMetadata.type === 'local' ||
92
+ installMetadata.type === 'link') {
93
+ localSourcePath = installMetadata.source;
94
+ }
95
+ else {
96
+ throw new Error(`Unsupported install type: ${installMetadata.type}`);
97
+ }
98
+ try {
99
+ newExtensionConfig = this.loadExtensionConfig(localSourcePath);
100
+ if (isUpdate && installMetadata.autoUpdate) {
101
+ const oldSettings = new Set(previousExtensionConfig.settings?.map((s) => s.name) || []);
102
+ const newSettings = new Set(newExtensionConfig.settings?.map((s) => s.name) || []);
103
+ const settingsAreEqual = oldSettings.size === newSettings.size &&
104
+ [...oldSettings].every((value) => newSettings.has(value));
105
+ if (!settingsAreEqual && installMetadata.autoUpdate) {
106
+ throw new Error(`Extension "${newExtensionConfig.name}" has settings changes and cannot be auto-updated. Please update manually.`);
107
+ }
108
+ }
109
+ const newExtensionName = newExtensionConfig.name;
110
+ if (!isUpdate) {
111
+ const installedExtensions = this.loadExtensions();
112
+ if (installedExtensions.some((installed) => installed.name === newExtensionName)) {
113
+ throw new Error(`Extension "${newExtensionName}" is already installed. Please uninstall it first.`);
114
+ }
115
+ }
116
+ await maybeRequestConsentOrFail(newExtensionConfig, this.requestConsent, previousExtensionConfig);
117
+ const extensionStorage = new ExtensionStorage(newExtensionName);
118
+ const destinationPath = extensionStorage.getExtensionDir();
119
+ let previousSettings;
120
+ if (isUpdate) {
121
+ previousSettings = getEnvContents(extensionStorage);
122
+ await this.uninstallExtension(newExtensionName, isUpdate);
123
+ }
124
+ await fs.promises.mkdir(destinationPath, { recursive: true });
125
+ if (this.requestSetting) {
126
+ if (isUpdate) {
127
+ await maybePromptForSettings(newExtensionConfig, this.requestSetting, previousExtensionConfig, previousSettings);
128
+ }
129
+ else {
130
+ await maybePromptForSettings(newExtensionConfig, this.requestSetting);
131
+ }
132
+ }
133
+ if (installMetadata.type === 'local' ||
134
+ installMetadata.type === 'git' ||
135
+ installMetadata.type === 'github-release') {
136
+ await copyExtension(localSourcePath, destinationPath);
137
+ }
138
+ const metadataString = JSON.stringify(installMetadata, null, 2);
139
+ const metadataPath = path.join(destinationPath, INSTALL_METADATA_FILENAME);
140
+ await fs.promises.writeFile(metadataPath, metadataString);
141
+ }
142
+ finally {
143
+ if (tempDir) {
144
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
145
+ }
146
+ }
147
+ if (isUpdate) {
148
+ logExtensionUpdateEvent(this.telemetryConfig, new ExtensionUpdateEvent(hashValue(newExtensionConfig.name), getExtensionId(newExtensionConfig, installMetadata), newExtensionConfig.version, previousExtensionConfig.version, installMetadata.type, 'success'));
149
+ }
150
+ else {
151
+ logExtensionInstallEvent(this.telemetryConfig, new ExtensionInstallEvent(hashValue(newExtensionConfig.name), getExtensionId(newExtensionConfig, installMetadata), newExtensionConfig.version, installMetadata.type, 'success'));
152
+ this.enableExtension(newExtensionConfig.name, SettingScope.User);
153
+ }
154
+ return newExtensionConfig.name;
155
+ }
156
+ catch (error) {
157
+ // Attempt to load config from the source path even if installation fails
158
+ // to get the name and version for logging.
159
+ if (!newExtensionConfig && localSourcePath) {
160
+ try {
161
+ newExtensionConfig = this.loadExtensionConfig(localSourcePath);
162
+ }
163
+ catch {
164
+ // Ignore error, this is just for logging.
165
+ }
166
+ }
167
+ const config = newExtensionConfig ?? previousExtensionConfig;
168
+ const extensionId = config
169
+ ? getExtensionId(config, installMetadata)
170
+ : undefined;
171
+ if (isUpdate) {
172
+ logExtensionUpdateEvent(this.telemetryConfig, new ExtensionUpdateEvent(hashValue(config?.name ?? ''), extensionId ?? '', newExtensionConfig?.version ?? '', previousExtensionConfig.version, installMetadata.type, 'error'));
173
+ }
174
+ else {
175
+ logExtensionInstallEvent(this.telemetryConfig, new ExtensionInstallEvent(hashValue(newExtensionConfig?.name ?? ''), extensionId ?? '', newExtensionConfig?.version ?? '', installMetadata.type, 'error'));
176
+ }
177
+ throw error;
178
+ }
179
+ }
180
+ async uninstallExtension(extensionIdentifier, isUpdate) {
181
+ const installedExtensions = this.loadExtensions();
182
+ const extension = installedExtensions.find((installed) => installed.name.toLowerCase() === extensionIdentifier.toLowerCase() ||
183
+ installed.installMetadata?.source.toLowerCase() ===
184
+ extensionIdentifier.toLowerCase());
185
+ if (!extension) {
186
+ throw new Error(`Extension not found.`);
187
+ }
188
+ const storage = new ExtensionStorage(extension.name);
189
+ await fs.promises.rm(storage.getExtensionDir(), {
190
+ recursive: true,
191
+ force: true,
192
+ });
193
+ // The rest of the cleanup below here is only for true uninstalls, not
194
+ // uninstalls related to updates.
195
+ if (isUpdate)
196
+ return;
197
+ this.extensionEnablementManager.remove(extension.name);
198
+ logExtensionUninstall(this.telemetryConfig, new ExtensionUninstallEvent(hashValue(extension.name), extension.id, 'success'));
199
+ }
200
+ loadExtensions() {
201
+ const extensionsDir = ExtensionStorage.getUserExtensionsDir();
202
+ if (!fs.existsSync(extensionsDir)) {
203
+ return [];
204
+ }
205
+ const extensions = [];
206
+ for (const subdir of fs.readdirSync(extensionsDir)) {
207
+ const extensionDir = path.join(extensionsDir, subdir);
208
+ const extension = this.loadExtension(extensionDir);
209
+ if (extension != null) {
210
+ extensions.push(extension);
211
+ }
212
+ }
213
+ const uniqueExtensions = new Map();
214
+ for (const extension of extensions) {
215
+ if (!uniqueExtensions.has(extension.name)) {
216
+ uniqueExtensions.set(extension.name, extension);
217
+ }
218
+ }
219
+ return Array.from(uniqueExtensions.values());
220
+ }
221
+ loadExtension(extensionDir) {
222
+ if (!fs.statSync(extensionDir).isDirectory()) {
223
+ return null;
224
+ }
225
+ const installMetadata = loadInstallMetadata(extensionDir);
226
+ let effectiveExtensionPath = extensionDir;
227
+ if (installMetadata?.type === 'link') {
228
+ effectiveExtensionPath = installMetadata.source;
229
+ }
230
+ try {
231
+ let config = this.loadExtensionConfig(effectiveExtensionPath);
232
+ const customEnv = getEnvContents(new ExtensionStorage(config.name));
233
+ config = resolveEnvVarsInObject(config, customEnv);
234
+ if (config.mcpServers) {
235
+ config.mcpServers = Object.fromEntries(Object.entries(config.mcpServers).map(([key, value]) => [
236
+ key,
237
+ filterMcpConfig(value),
238
+ ]));
239
+ }
240
+ const contextFiles = getContextFileNames(config)
241
+ .map((contextFileName) => path.join(effectiveExtensionPath, contextFileName))
242
+ .filter((contextFilePath) => fs.existsSync(contextFilePath));
243
+ return {
244
+ name: config.name,
245
+ version: config.version,
246
+ path: effectiveExtensionPath,
247
+ contextFiles,
248
+ installMetadata,
249
+ mcpServers: config.mcpServers,
250
+ excludeTools: config.excludeTools,
251
+ isActive: this.extensionEnablementManager.isEnabled(config.name, this.workspaceDir),
252
+ id: getExtensionId(config, installMetadata),
253
+ };
254
+ }
255
+ catch (e) {
256
+ debugLogger.error(`Warning: Skipping extension in ${effectiveExtensionPath}: ${getErrorMessage(e)}`);
257
+ return null;
258
+ }
259
+ }
260
+ loadExtensionByName(name) {
261
+ const userExtensionsDir = ExtensionStorage.getUserExtensionsDir();
262
+ if (!fs.existsSync(userExtensionsDir)) {
263
+ return null;
264
+ }
265
+ for (const subdir of fs.readdirSync(userExtensionsDir)) {
266
+ const extensionDir = path.join(userExtensionsDir, subdir);
267
+ if (!fs.statSync(extensionDir).isDirectory()) {
268
+ continue;
269
+ }
270
+ const extension = this.loadExtension(extensionDir);
271
+ if (extension && extension.name.toLowerCase() === name.toLowerCase()) {
272
+ return extension;
273
+ }
274
+ }
275
+ return null;
276
+ }
277
+ loadExtensionConfig(extensionDir) {
278
+ const configFilePath = path.join(extensionDir, EXTENSIONS_CONFIG_FILENAME);
279
+ if (!fs.existsSync(configFilePath)) {
280
+ throw new Error(`Configuration file not found at ${configFilePath}`);
281
+ }
282
+ try {
283
+ const configContent = fs.readFileSync(configFilePath, 'utf-8');
284
+ const rawConfig = JSON.parse(configContent);
285
+ if (!rawConfig.name || !rawConfig.version) {
286
+ throw new Error(`Invalid configuration in ${configFilePath}: missing ${!rawConfig.name ? '"name"' : '"version"'}`);
287
+ }
288
+ const installDir = new ExtensionStorage(rawConfig.name).getExtensionDir();
289
+ const config = recursivelyHydrateStrings(rawConfig, {
290
+ extensionPath: installDir,
291
+ workspacePath: this.workspaceDir,
292
+ '/': path.sep,
293
+ pathSeparator: path.sep,
294
+ });
295
+ validateName(config.name);
296
+ return config;
297
+ }
298
+ catch (e) {
299
+ throw new Error(`Failed to load extension config from ${configFilePath}: ${getErrorMessage(e)}`);
300
+ }
301
+ }
302
+ toOutputString(extension) {
303
+ const userEnabled = this.extensionEnablementManager.isEnabled(extension.name, os.homedir());
304
+ const workspaceEnabled = this.extensionEnablementManager.isEnabled(extension.name, this.workspaceDir);
305
+ const status = workspaceEnabled ? chalk.green('✓') : chalk.red('✗');
306
+ let output = `${status} ${extension.name} (${extension.version})`;
307
+ output += `\n ID: ${extension.id}`;
308
+ output += `\n Path: ${extension.path}`;
309
+ if (extension.installMetadata) {
310
+ output += `\n Source: ${extension.installMetadata.source} (Type: ${extension.installMetadata.type})`;
311
+ if (extension.installMetadata.ref) {
312
+ output += `\n Ref: ${extension.installMetadata.ref}`;
313
+ }
314
+ if (extension.installMetadata.releaseTag) {
315
+ output += `\n Release tag: ${extension.installMetadata.releaseTag}`;
316
+ }
317
+ }
318
+ output += `\n Enabled (User): ${userEnabled}`;
319
+ output += `\n Enabled (Workspace): ${workspaceEnabled}`;
320
+ if (extension.contextFiles.length > 0) {
321
+ output += `\n Context files:`;
322
+ extension.contextFiles.forEach((contextFile) => {
323
+ output += `\n ${contextFile}`;
324
+ });
325
+ }
326
+ if (extension.mcpServers) {
327
+ output += `\n MCP servers:`;
328
+ Object.keys(extension.mcpServers).forEach((key) => {
329
+ output += `\n ${key}`;
330
+ });
331
+ }
332
+ if (extension.excludeTools) {
333
+ output += `\n Excluded tools:`;
334
+ extension.excludeTools.forEach((tool) => {
335
+ output += `\n ${tool}`;
336
+ });
337
+ }
338
+ return output;
339
+ }
340
+ disableExtension(name, scope) {
341
+ if (scope === SettingScope.System ||
342
+ scope === SettingScope.SystemDefaults) {
343
+ throw new Error('System and SystemDefaults scopes are not supported.');
344
+ }
345
+ const extension = this.loadExtensionByName(name);
346
+ if (!extension) {
347
+ throw new Error(`Extension with name ${name} does not exist.`);
348
+ }
349
+ const scopePath = scope === SettingScope.Workspace ? this.workspaceDir : os.homedir();
350
+ this.extensionEnablementManager.disable(name, true, scopePath);
351
+ logExtensionDisable(this.telemetryConfig, new ExtensionDisableEvent(hashValue(name), extension.id, scope));
352
+ }
353
+ enableExtension(name, scope) {
354
+ if (scope === SettingScope.System ||
355
+ scope === SettingScope.SystemDefaults) {
356
+ throw new Error('System and SystemDefaults scopes are not supported.');
357
+ }
358
+ const extension = this.loadExtensionByName(name);
359
+ if (!extension) {
360
+ throw new Error(`Extension with name ${name} does not exist.`);
361
+ }
362
+ const scopePath = scope === SettingScope.Workspace ? this.workspaceDir : os.homedir();
363
+ this.extensionEnablementManager.enable(name, true, scopePath);
364
+ logExtensionEnable(this.telemetryConfig, new ExtensionEnableEvent(hashValue(name), extension.id, scope));
365
+ }
366
+ }
367
+ function filterMcpConfig(original) {
368
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
369
+ const { trust, ...rest } = original;
370
+ return Object.freeze(rest);
371
+ }
372
+ export async function copyExtension(source, destination) {
373
+ await fs.promises.cp(source, destination, { recursive: true });
374
+ }
375
+ function getContextFileNames(config) {
376
+ if (!config.contextFileName) {
377
+ return ['GEMINI.md'];
378
+ }
379
+ else if (!Array.isArray(config.contextFileName)) {
380
+ return [config.contextFileName];
381
+ }
382
+ return config.contextFileName;
383
+ }
384
+ function validateName(name) {
385
+ if (!/^[a-zA-Z0-9-]+$/.test(name)) {
386
+ throw new Error(`Invalid extension name: "${name}". Only letters (a-z, A-Z), numbers (0-9), and dashes (-) are allowed.`);
387
+ }
388
+ }
389
+ export function getExtensionId(config, installMetadata) {
390
+ // IDs are created by hashing details of the installation source in order to
391
+ // deduplicate extensions with conflicting names and also obfuscate any
392
+ // potentially sensitive information such as private git urls, system paths,
393
+ // or project names.
394
+ let idValue = config.name;
395
+ const githubUrlParts = installMetadata &&
396
+ (installMetadata.type === 'git' ||
397
+ installMetadata.type === 'github-release')
398
+ ? tryParseGithubUrl(installMetadata.source)
399
+ : null;
400
+ if (githubUrlParts) {
401
+ // For github repos, we use the https URI to the repo as the ID.
402
+ idValue = `https://github.com/${githubUrlParts.owner}/${githubUrlParts.repo}`;
403
+ }
404
+ else {
405
+ idValue = installMetadata?.source ?? config.name;
406
+ }
407
+ return hashValue(idValue);
408
+ }
409
+ export function hashValue(value) {
410
+ return createHash('sha256').update(value).digest('hex');
411
+ }
412
+ //# sourceMappingURL=extension-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-manager.js","sourceRoot":"","sources":["../../../src/config/extension-manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AACjF,OAAO,EAAuB,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAwB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,YAAY,EACZ,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,MAAM,EACN,WAAW,EACX,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,qBAAqB,EACrB,uBAAuB,GAIxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,yBAAyB,GAE1B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,cAAc,EACd,sBAAsB,GAEvB,MAAM,mCAAmC,CAAC;AAU3C,MAAM,OAAO,gBAAgB;IACnB,0BAA0B,CAA6B;IACvD,cAAc,CAAiB;IAC/B,cAAc,CAAwC;IACtD,cAAc,CAEb;IACD,eAAe,CAAS;IACxB,YAAY,CAAS;IAE7B,YAAY,OAA+B;QACzC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QACzC,IAAI,CAAC,0BAA0B,GAAG,IAAI,0BAA0B,CAC9D,OAAO,CAAC,yBAAyB,CAClC,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,MAAM,CAAC;YAChC,SAAS,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS;YAClD,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,UAAU,EAAE;YACvB,SAAS,EAAE,OAAO,CAAC,YAAY;YAC/B,GAAG,EAAE,OAAO,CAAC,YAAY;YACzB,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,eAAyC,EACzC,uBAAyC;QAEzC,MAAM,QAAQ,GAAG,CAAC,CAAC,uBAAuB,CAAC;QAC3C,IAAI,kBAAkB,GAA2B,IAAI,CAAC;QACtD,IAAI,eAAmC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC5C,MAAM,IAAI,KAAK,CACb,wDAAwD,eAAe,CAAC,MAAM,EAAE,CACjF,CAAC;YACJ,CAAC;YAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;YAC9D,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAE5D,IACE,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC;gBACxC,CAAC,eAAe,CAAC,IAAI,KAAK,OAAO,IAAI,eAAe,CAAC,IAAI,KAAK,MAAM,CAAC,EACrE,CAAC;gBACD,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CACnC,IAAI,CAAC,YAAY,EACjB,eAAe,CAAC,MAAM,CACvB,CAAC;YACJ,CAAC;YAED,IAAI,OAA2B,CAAC;YAEhC,IACE,eAAe,CAAC,IAAI,KAAK,KAAK;gBAC9B,eAAe,CAAC,IAAI,KAAK,gBAAgB,EACzC,CAAC;gBACD,OAAO,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,CAAC;gBAChD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;gBACpE,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,MAAM,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;oBAC7C,eAAe,CAAC,IAAI,GAAG,KAAK,CAAC;gBAC/B,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAC5C,eAAe,EACf,OAAO,EACP,iBAAiB,CAClB,CAAC;oBACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,eAAe,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;wBACnC,eAAe,CAAC,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;oBAC9C,CAAC;yBAAM;oBACL,oEAAoE;oBACpE,wDAAwD;oBACxD,CAAC,MAAM,CAAC,aAAa,KAAK,iBAAiB;wBACzC,eAAe,CAAC,IAAI,KAAK,KAAK,CAAC;wBACjC,gEAAgE;wBAChE,CAAC,MAAM,IAAI,CAAC,cAAc,CACxB,wCAAwC,eAAe,CAAC,MAAM,8BAA8B,MAAM,CAAC,YAAY,oEAAoE,CACpL,CAAC,EACF,CAAC;wBACD,MAAM,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;wBAC7C,eAAe,CAAC,IAAI,GAAG,KAAK,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,KAAK,CACb,+BAA+B,eAAe,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,EAAE,CAChF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBACD,eAAe,GAAG,OAAO,CAAC;YAC5B,CAAC;iBAAM,IACL,eAAe,CAAC,IAAI,KAAK,OAAO;gBAChC,eAAe,CAAC,IAAI,KAAK,MAAM,EAC/B,CAAC;gBACD,eAAe,GAAG,eAAe,CAAC,MAAM,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,6BAA6B,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC;YACvE,CAAC;YAED,IAAI,CAAC;gBACH,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;gBAE/D,IAAI,QAAQ,IAAI,eAAe,CAAC,UAAU,EAAE,CAAC;oBAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,uBAAuB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAC3D,CAAC;oBACF,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CACtD,CAAC;oBAEF,MAAM,gBAAgB,GACpB,WAAW,CAAC,IAAI,KAAK,WAAW,CAAC,IAAI;wBACrC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBAE5D,IAAI,CAAC,gBAAgB,IAAI,eAAe,CAAC,UAAU,EAAE,CAAC;wBACpD,MAAM,IAAI,KAAK,CACb,cAAc,kBAAkB,CAAC,IAAI,4EAA4E,CAClH,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,CAAC;gBACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;oBAClD,IACE,mBAAmB,CAAC,IAAI,CACtB,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CACnD,EACD,CAAC;wBACD,MAAM,IAAI,KAAK,CACb,cAAc,gBAAgB,oDAAoD,CACnF,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,MAAM,yBAAyB,CAC7B,kBAAkB,EAClB,IAAI,CAAC,cAAc,EACnB,uBAAuB,CACxB,CAAC;gBAEF,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;gBAChE,MAAM,eAAe,GAAG,gBAAgB,CAAC,eAAe,EAAE,CAAC;gBAC3D,IAAI,gBAAoD,CAAC;gBACzD,IAAI,QAAQ,EAAE,CAAC;oBACb,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,CAAC,CAAC;oBACpD,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;gBAC5D,CAAC;gBAED,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,sBAAsB,CAC1B,kBAAkB,EAClB,IAAI,CAAC,cAAc,EACnB,uBAAuB,EACvB,gBAAgB,CACjB,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,sBAAsB,CAC1B,kBAAkB,EAClB,IAAI,CAAC,cAAc,CACpB,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,IACE,eAAe,CAAC,IAAI,KAAK,OAAO;oBAChC,eAAe,CAAC,IAAI,KAAK,KAAK;oBAC9B,eAAe,CAAC,IAAI,KAAK,gBAAgB,EACzC,CAAC;oBACD,MAAM,aAAa,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;gBACxD,CAAC;gBAED,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,eAAe,EACf,yBAAyB,CAC1B,CAAC;gBACF,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;YAC5D,CAAC;oBAAS,CAAC;gBACT,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,uBAAuB,CACrB,IAAI,CAAC,eAAe,EACpB,IAAI,oBAAoB,CACtB,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAClC,cAAc,CAAC,kBAAkB,EAAE,eAAe,CAAC,EACnD,kBAAkB,CAAC,OAAO,EAC1B,uBAAuB,CAAC,OAAO,EAC/B,eAAe,CAAC,IAAI,EACpB,SAAS,CACV,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,wBAAwB,CACtB,IAAI,CAAC,eAAe,EACpB,IAAI,qBAAqB,CACvB,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAClC,cAAc,CAAC,kBAAkB,EAAE,eAAe,CAAC,EACnD,kBAAkB,CAAC,OAAO,EAC1B,eAAe,CAAC,IAAI,EACpB,SAAS,CACV,CACF,CAAC;gBACF,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;YACnE,CAAC;YAED,OAAO,kBAAmB,CAAC,IAAI,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yEAAyE;YACzE,2CAA2C;YAC3C,IAAI,CAAC,kBAAkB,IAAI,eAAe,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBACH,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;gBACjE,CAAC;gBAAC,MAAM,CAAC;oBACP,0CAA0C;gBAC5C,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,kBAAkB,IAAI,uBAAuB,CAAC;YAC7D,MAAM,WAAW,GAAG,MAAM;gBACxB,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC;gBACzC,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,QAAQ,EAAE,CAAC;gBACb,uBAAuB,CACrB,IAAI,CAAC,eAAe,EACpB,IAAI,oBAAoB,CACtB,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,EAC7B,WAAW,IAAI,EAAE,EACjB,kBAAkB,EAAE,OAAO,IAAI,EAAE,EACjC,uBAAuB,CAAC,OAAO,EAC/B,eAAe,CAAC,IAAI,EACpB,OAAO,CACR,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,wBAAwB,CACtB,IAAI,CAAC,eAAe,EACpB,IAAI,qBAAqB,CACvB,SAAS,CAAC,kBAAkB,EAAE,IAAI,IAAI,EAAE,CAAC,EACzC,WAAW,IAAI,EAAE,EACjB,kBAAkB,EAAE,OAAO,IAAI,EAAE,EACjC,eAAe,CAAC,IAAI,EACpB,OAAO,CACR,CACF,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,mBAA2B,EAC3B,QAAiB;QAEjB,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CACxC,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,mBAAmB,CAAC,WAAW,EAAE;YAClE,SAAS,CAAC,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE;gBAC7C,mBAAmB,CAAC,WAAW,EAAE,CACtC,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAErD,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE;YAC9C,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,sEAAsE;QACtE,iCAAiC;QACjC,IAAI,QAAQ;YAAE,OAAO;QAErB,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEvD,qBAAqB,CACnB,IAAI,CAAC,eAAe,EACpB,IAAI,uBAAuB,CACzB,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EACzB,SAAS,CAAC,EAAE,EACZ,SAAS,CACV,CACF,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,MAAM,aAAa,GAAG,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;QAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAyB,EAAE,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC;YACnD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAEtD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACtB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA8B,CAAC;QAE/D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,aAAa,CAAC,YAAoB;QAChC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,sBAAsB,GAAG,YAAY,CAAC;QAE1C,IAAI,eAAe,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YACrC,sBAAsB,GAAG,eAAe,CAAC,MAAM,CAAC;QAClD,CAAC;QAED,IAAI,CAAC;YACH,IAAI,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;YAE9D,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACpE,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAEnD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW,CACpC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;oBACtD,GAAG;oBACH,eAAe,CAAC,KAAK,CAAC;iBACvB,CAAC,CACH,CAAC;YACJ,CAAC;YAED,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC;iBAC7C,GAAG,CAAC,CAAC,eAAe,EAAE,EAAE,CACvB,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,eAAe,CAAC,CACnD;iBACA,MAAM,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;YAE/D,OAAO;gBACL,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,IAAI,EAAE,sBAAsB;gBAC5B,YAAY;gBACZ,eAAe;gBACf,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,QAAQ,EAAE,IAAI,CAAC,0BAA0B,CAAC,SAAS,CACjD,MAAM,CAAC,IAAI,EACX,IAAI,CAAC,YAAY,CAClB;gBACD,EAAE,EAAE,cAAc,CAAC,MAAM,EAAE,eAAe,CAAC;aAC5C,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,WAAW,CAAC,KAAK,CACf,kCAAkC,sBAAsB,KAAK,eAAe,CAC1E,CAAC,CACF,EAAE,CACJ,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,IAAY;QAC9B,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,oBAAoB,EAAE,CAAC;QAClE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACvD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC7C,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrE,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB,CAAC,YAAoB;QACtC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,0BAA0B,CAAC,CAAC;QAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,cAAc,EAAE,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAoB,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBAC1C,MAAM,IAAI,KAAK,CACb,4BAA4B,cAAc,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAClG,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAG,yBAAyB,CACtC,SAAkC,EAClC;gBACE,aAAa,EAAE,UAAU;gBACzB,aAAa,EAAE,IAAI,CAAC,YAAY;gBAChC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,aAAa,EAAE,IAAI,CAAC,GAAG;aACxB,CAC4B,CAAC;YAEhC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,wCAAwC,cAAc,KAAK,eAAe,CACxE,CAAC,CACF,EAAE,CACJ,CAAC;QACJ,CAAC;IACH,CAAC;IAED,cAAc,CAAC,SAA6B;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAC3D,SAAS,CAAC,IAAI,EACd,EAAE,CAAC,OAAO,EAAE,CACb,CAAC;QACF,MAAM,gBAAgB,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAChE,SAAS,CAAC,IAAI,EACd,IAAI,CAAC,YAAY,CAClB,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,MAAM,GAAG,GAAG,MAAM,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,GAAG,CAAC;QAClE,MAAM,IAAI,UAAU,SAAS,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,YAAY,SAAS,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9B,MAAM,IAAI,cAAc,SAAS,CAAC,eAAe,CAAC,MAAM,WAAW,SAAS,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC;YACrG,IAAI,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;gBAClC,MAAM,IAAI,WAAW,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;YACvD,CAAC;YACD,IAAI,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;gBACzC,MAAM,IAAI,mBAAmB,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;YACtE,CAAC;QACH,CAAC;QACD,MAAM,IAAI,sBAAsB,WAAW,EAAE,CAAC;QAC9C,MAAM,IAAI,2BAA2B,gBAAgB,EAAE,CAAC;QACxD,IAAI,SAAS,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,mBAAmB,CAAC;YAC9B,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;gBAC7C,MAAM,IAAI,OAAO,WAAW,EAAE,CAAC;YACjC,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;YACzB,MAAM,IAAI,iBAAiB,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAChD,MAAM,IAAI,OAAO,GAAG,EAAE,CAAC;YACzB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,IAAI,oBAAoB,CAAC;YAC/B,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACtC,MAAM,IAAI,OAAO,IAAI,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,gBAAgB,CAAC,IAAY,EAAE,KAAmB;QAChD,IACE,KAAK,KAAK,YAAY,CAAC,MAAM;YAC7B,KAAK,KAAK,YAAY,CAAC,cAAc,EACrC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,kBAAkB,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,SAAS,GACb,KAAK,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACtE,IAAI,CAAC,0BAA0B,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC/D,mBAAmB,CACjB,IAAI,CAAC,eAAe,EACpB,IAAI,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAChE,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,IAAY,EAAE,KAAmB;QAC/C,IACE,KAAK,KAAK,YAAY,CAAC,MAAM;YAC7B,KAAK,KAAK,YAAY,CAAC,cAAc,EACrC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,kBAAkB,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,SAAS,GACb,KAAK,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACtE,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QAC9D,kBAAkB,CAChB,IAAI,CAAC,eAAe,EACpB,IAAI,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAC/D,CAAC;IACJ,CAAC;CACF;AAED,SAAS,eAAe,CAAC,QAAyB;IAChD,6DAA6D;IAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,CAAC;IACpC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,WAAmB;IAEnB,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAuB;IAClD,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;QAC5B,OAAO,CAAC,WAAW,CAAC,CAAC;IACvB,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC,eAAe,CAAC;AAChC,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,wEAAwE,CACzG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,MAAuB,EACvB,eAA0C;IAE1C,4EAA4E;IAC5E,uEAAuE;IACvE,4EAA4E;IAC5E,oBAAoB;IACpB,IAAI,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC;IAC1B,MAAM,cAAc,GAClB,eAAe;QACf,CAAC,eAAe,CAAC,IAAI,KAAK,KAAK;YAC7B,eAAe,CAAC,IAAI,KAAK,gBAAgB,CAAC;QAC1C,CAAC,CAAC,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC;QAC3C,CAAC,CAAC,IAAI,CAAC;IACX,IAAI,cAAc,EAAE,CAAC;QACnB,gEAAgE;QAChE,OAAO,GAAG,sBAAsB,cAAc,CAAC,KAAK,IAAI,cAAc,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,OAAO,GAAG,eAAe,EAAE,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
@@ -3,15 +3,8 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import type { MCPServerConfig, GeminiCLIExtension, ExtensionInstallMetadata } from '@google/gemini-cli-core';
7
- import { SettingScope } from '../config/settings.js';
8
- import type { LoadExtensionContext } from './extensions/variableSchema.js';
9
- import { ExtensionEnablementManager } from './extensions/extensionEnablement.js';
10
- import type { ConfirmationRequest } from '../ui/types.js';
11
- export declare const EXTENSIONS_DIRECTORY_NAME: string;
12
- export declare const EXTENSIONS_CONFIG_FILENAME = "gemini-extension.json";
13
- export declare const INSTALL_METADATA_FILENAME = ".gemini-extension-install.json";
14
- export declare const INSTALL_WARNING_MESSAGE = "**The extension you are about to install may have been created by a third-party developer and sourced from a public repository. Google does not vet, endorse, or guarantee the functionality or security of extensions. Please carefully inspect any extension and its source code before installing to understand the permissions it requires and the actions it may perform.**";
6
+ import type { MCPServerConfig, ExtensionInstallMetadata } from '@google/gemini-cli-core';
7
+ import type { ExtensionSetting } from './extensions/extensionSettings.js';
15
8
  /**
16
9
  * Extension definition as written to disk in gemini-extension.json files.
17
10
  * This should *not* be referenced outside of the logic for reading files.
@@ -19,57 +12,17 @@ export declare const INSTALL_WARNING_MESSAGE = "**The extension you are about to
19
12
  * outside of the loading process that data needs to be stored on the
20
13
  * GeminiCLIExtension class defined in Core.
21
14
  */
22
- interface ExtensionConfig {
15
+ export interface ExtensionConfig {
23
16
  name: string;
24
17
  version: string;
25
18
  mcpServers?: Record<string, MCPServerConfig>;
26
19
  contextFileName?: string | string[];
27
20
  excludeTools?: string[];
21
+ settings?: ExtensionSetting[];
28
22
  }
29
23
  export interface ExtensionUpdateInfo {
30
24
  name: string;
31
25
  originalVersion: string;
32
26
  updatedVersion: string;
33
27
  }
34
- export declare class ExtensionStorage {
35
- private readonly extensionName;
36
- constructor(extensionName: string);
37
- getExtensionDir(): string;
38
- getConfigPath(): string;
39
- static getUserExtensionsDir(): string;
40
- static createTmpDir(): Promise<string>;
41
- }
42
- export declare function copyExtension(source: string, destination: string): Promise<void>;
43
- export declare function loadExtensions(extensionEnablementManager: ExtensionEnablementManager, workspaceDir?: string): GeminiCLIExtension[];
44
- export declare function loadExtension(context: LoadExtensionContext): GeminiCLIExtension | null;
45
- export declare function loadExtensionByName(name: string, extensionEnablementManager: ExtensionEnablementManager, workspaceDir?: string): GeminiCLIExtension | null;
46
28
  export declare function loadInstallMetadata(extensionDir: string): ExtensionInstallMetadata | undefined;
47
- /**
48
- * Requests consent from the user to perform an action, by reading a Y/n
49
- * character from stdin.
50
- *
51
- * This should not be called from interactive mode as it will break the CLI.
52
- *
53
- * @param consentDescription The description of the thing they will be consenting to.
54
- * @returns boolean, whether they consented or not.
55
- */
56
- export declare function requestConsentNonInteractive(consentDescription: string): Promise<boolean>;
57
- /**
58
- * Requests consent from the user to perform an action, in interactive mode.
59
- *
60
- * This should not be called from non-interactive mode as it will not work.
61
- *
62
- * @param consentDescription The description of the thing they will be consenting to.
63
- * @param setExtensionUpdateConfirmationRequest A function to actually add a prompt to the UI.
64
- * @returns boolean, whether they consented or not.
65
- */
66
- export declare function requestConsentInteractive(consentDescription: string, addExtensionUpdateConfirmationRequest: (value: ConfirmationRequest) => void): Promise<boolean>;
67
- export declare function hashValue(value: string): string;
68
- export declare function installOrUpdateExtension(installMetadata: ExtensionInstallMetadata, requestConsent: (consent: string) => Promise<boolean>, cwd?: string, previousExtensionConfig?: ExtensionConfig): Promise<string>;
69
- export declare function validateName(name: string): void;
70
- export declare function loadExtensionConfig(context: LoadExtensionContext): ExtensionConfig;
71
- export declare function uninstallExtension(extensionIdentifier: string, isUpdate: boolean, cwd?: string): Promise<void>;
72
- export declare function toOutputString(extension: GeminiCLIExtension, workspaceDir: string): string;
73
- export declare function disableExtension(name: string, scope: SettingScope, extensionEnablementManager: ExtensionEnablementManager, cwd?: string): void;
74
- export declare function enableExtension(name: string, scope: SettingScope, extensionEnablementManager: ExtensionEnablementManager, cwd?: string): void;
75
- export {};