@google/gemini-cli 0.0.888888 → 0.0.899999

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 (148) hide show
  1. package/dist/package.json +2 -3
  2. package/dist/src/commands/extensions/disable.d.ts +1 -2
  3. package/dist/src/commands/extensions/disable.js +17 -3
  4. package/dist/src/commands/extensions/disable.js.map +1 -1
  5. package/dist/src/commands/extensions/enable.d.ts +1 -2
  6. package/dist/src/commands/extensions/enable.js +17 -4
  7. package/dist/src/commands/extensions/enable.js.map +1 -1
  8. package/dist/src/commands/extensions/install.d.ts +1 -0
  9. package/dist/src/commands/extensions/install.js +9 -1
  10. package/dist/src/commands/extensions/install.js.map +1 -1
  11. package/dist/src/commands/extensions/install.test.js +5 -1
  12. package/dist/src/commands/extensions/install.test.js.map +1 -1
  13. package/dist/src/commands/extensions/link.js +1 -1
  14. package/dist/src/commands/extensions/link.js.map +1 -1
  15. package/dist/src/commands/extensions/uninstall.js +1 -1
  16. package/dist/src/commands/extensions/uninstall.js.map +1 -1
  17. package/dist/src/commands/extensions/update.js +24 -4
  18. package/dist/src/commands/extensions/update.js.map +1 -1
  19. package/dist/src/config/config.js +46 -43
  20. package/dist/src/config/config.js.map +1 -1
  21. package/dist/src/config/extension.d.ts +4 -17
  22. package/dist/src/config/extension.js +36 -154
  23. package/dist/src/config/extension.js.map +1 -1
  24. package/dist/src/config/extensions/extensionEnablement.d.ts +14 -0
  25. package/dist/src/config/extensions/extensionEnablement.js +81 -33
  26. package/dist/src/config/extensions/extensionEnablement.js.map +1 -1
  27. package/dist/src/config/extensions/extensionEnablement.test.js +164 -19
  28. package/dist/src/config/extensions/extensionEnablement.test.js.map +1 -1
  29. package/dist/src/config/extensions/github.d.ts +25 -0
  30. package/dist/src/config/extensions/github.js +274 -0
  31. package/dist/src/config/extensions/github.js.map +1 -0
  32. package/dist/src/config/extensions/github.test.d.ts +6 -0
  33. package/dist/src/config/extensions/github.test.js +267 -0
  34. package/dist/src/config/extensions/github.test.js.map +1 -0
  35. package/dist/src/config/extensions/update.d.ts +20 -0
  36. package/dist/src/config/extensions/update.js +94 -0
  37. package/dist/src/config/extensions/update.js.map +1 -0
  38. package/dist/src/config/extensions/update.test.d.ts +6 -0
  39. package/dist/src/config/extensions/update.test.js +292 -0
  40. package/dist/src/config/extensions/update.test.js.map +1 -0
  41. package/dist/src/config/policy-engine.integration.test.d.ts +6 -0
  42. package/dist/src/config/policy-engine.integration.test.js +270 -0
  43. package/dist/src/config/policy-engine.integration.test.js.map +1 -0
  44. package/dist/src/config/policy.d.ts +8 -0
  45. package/dist/src/config/policy.js +150 -0
  46. package/dist/src/config/policy.js.map +1 -0
  47. package/dist/src/config/policy.test.d.ts +6 -0
  48. package/dist/src/config/policy.test.js +336 -0
  49. package/dist/src/config/policy.test.js.map +1 -0
  50. package/dist/src/gemini.js +3 -2
  51. package/dist/src/gemini.js.map +1 -1
  52. package/dist/src/generated/git-commit.d.ts +2 -2
  53. package/dist/src/generated/git-commit.js +2 -2
  54. package/dist/src/nonInteractiveCli.d.ts +2 -1
  55. package/dist/src/nonInteractiveCli.js +29 -16
  56. package/dist/src/nonInteractiveCli.js.map +1 -1
  57. package/dist/src/nonInteractiveCliCommands.d.ts +17 -0
  58. package/dist/src/nonInteractiveCliCommands.js +79 -0
  59. package/dist/src/nonInteractiveCliCommands.js.map +1 -0
  60. package/dist/src/test-utils/createExtension.d.ts +15 -0
  61. package/dist/src/test-utils/createExtension.js +25 -0
  62. package/dist/src/test-utils/createExtension.js.map +1 -0
  63. package/dist/src/test-utils/mockCommandContext.js +2 -0
  64. package/dist/src/test-utils/mockCommandContext.js.map +1 -1
  65. package/dist/src/ui/App.js +3 -2
  66. package/dist/src/ui/App.js.map +1 -1
  67. package/dist/src/ui/AppContainer.js +33 -35
  68. package/dist/src/ui/AppContainer.js.map +1 -1
  69. package/dist/src/ui/AppContainer.test.js +99 -0
  70. package/dist/src/ui/AppContainer.test.js.map +1 -1
  71. package/dist/src/ui/IdeIntegrationNudge.d.ts +2 -2
  72. package/dist/src/ui/IdeIntegrationNudge.js +1 -2
  73. package/dist/src/ui/IdeIntegrationNudge.js.map +1 -1
  74. package/dist/src/ui/commands/clearCommand.js +1 -1
  75. package/dist/src/ui/commands/clearCommand.js.map +1 -1
  76. package/dist/src/ui/commands/extensionsCommand.js +22 -6
  77. package/dist/src/ui/commands/extensionsCommand.js.map +1 -1
  78. package/dist/src/ui/commands/ideCommand.js +1 -1
  79. package/dist/src/ui/commands/ideCommand.js.map +1 -1
  80. package/dist/src/ui/commands/mcpCommand.js +9 -2
  81. package/dist/src/ui/commands/mcpCommand.js.map +1 -1
  82. package/dist/src/ui/commands/types.d.ts +2 -2
  83. package/dist/src/ui/components/Composer.js +9 -10
  84. package/dist/src/ui/components/Composer.js.map +1 -1
  85. package/dist/src/ui/components/Composer.test.js +18 -21
  86. package/dist/src/ui/components/Composer.test.js.map +1 -1
  87. package/dist/src/ui/components/HistoryItemDisplay.js +2 -1
  88. package/dist/src/ui/components/HistoryItemDisplay.js.map +1 -1
  89. package/dist/src/ui/components/InputPrompt.d.ts +6 -0
  90. package/dist/src/ui/components/InputPrompt.js +42 -14
  91. package/dist/src/ui/components/InputPrompt.js.map +1 -1
  92. package/dist/src/ui/components/QueuedMessageDisplay.d.ts +9 -0
  93. package/dist/src/ui/components/QueuedMessageDisplay.js +20 -0
  94. package/dist/src/ui/components/QueuedMessageDisplay.js.map +1 -0
  95. package/dist/src/ui/components/QueuedMessageDisplay.test.d.ts +6 -0
  96. package/dist/src/ui/components/QueuedMessageDisplay.test.js +56 -0
  97. package/dist/src/ui/components/QueuedMessageDisplay.test.js.map +1 -0
  98. package/dist/src/ui/components/messages/WarningMessage.d.ts +11 -0
  99. package/dist/src/ui/components/messages/WarningMessage.js +10 -0
  100. package/dist/src/ui/components/messages/WarningMessage.js.map +1 -0
  101. package/dist/src/ui/components/shared/text-buffer.d.ts +6 -0
  102. package/dist/src/ui/components/shared/text-buffer.js +71 -4
  103. package/dist/src/ui/components/shared/text-buffer.js.map +1 -1
  104. package/dist/src/ui/contexts/FocusContext.d.ts +7 -0
  105. package/dist/src/ui/contexts/FocusContext.js +9 -0
  106. package/dist/src/ui/contexts/FocusContext.js.map +1 -0
  107. package/dist/src/ui/contexts/SessionContext.d.ts +6 -0
  108. package/dist/src/ui/contexts/SessionContext.js +107 -5
  109. package/dist/src/ui/contexts/SessionContext.js.map +1 -1
  110. package/dist/src/ui/contexts/UIStateContext.d.ts +2 -3
  111. package/dist/src/ui/contexts/UIStateContext.js.map +1 -1
  112. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +2 -1
  113. package/dist/src/ui/hooks/slashCommandProcessor.js +1 -1
  114. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  115. package/dist/src/ui/hooks/useExtensionUpdates.d.ts +12 -0
  116. package/dist/src/ui/hooks/useExtensionUpdates.js +64 -0
  117. package/dist/src/ui/hooks/useExtensionUpdates.js.map +1 -0
  118. package/dist/src/ui/hooks/useExtensionUpdates.test.d.ts +6 -0
  119. package/dist/src/ui/hooks/useExtensionUpdates.test.js +167 -0
  120. package/dist/src/ui/hooks/useExtensionUpdates.test.js.map +1 -0
  121. package/dist/src/ui/hooks/useGeminiStream.js +2 -5
  122. package/dist/src/ui/hooks/useGeminiStream.js.map +1 -1
  123. package/dist/src/ui/hooks/useMemoryMonitor.d.ts +13 -0
  124. package/dist/src/ui/hooks/useMemoryMonitor.js +28 -0
  125. package/dist/src/ui/hooks/useMemoryMonitor.js.map +1 -0
  126. package/dist/src/ui/hooks/useMemoryMonitor.test.d.ts +6 -0
  127. package/dist/src/ui/hooks/useMemoryMonitor.test.js +57 -0
  128. package/dist/src/ui/hooks/useMemoryMonitor.test.js.map +1 -0
  129. package/dist/src/ui/hooks/useStateAndRef.d.ts +1 -1
  130. package/dist/src/ui/hooks/useStateAndRef.js +2 -2
  131. package/dist/src/ui/hooks/useStateAndRef.js.map +1 -1
  132. package/dist/src/ui/noninteractive/nonInteractiveUi.d.ts +12 -0
  133. package/dist/src/ui/noninteractive/nonInteractiveUi.js +27 -0
  134. package/dist/src/ui/noninteractive/nonInteractiveUi.js.map +1 -0
  135. package/dist/src/ui/state/extensions.d.ts +2 -1
  136. package/dist/src/ui/state/extensions.js +1 -0
  137. package/dist/src/ui/state/extensions.js.map +1 -1
  138. package/dist/src/ui/types.d.ts +6 -1
  139. package/dist/src/ui/types.js +1 -0
  140. package/dist/src/ui/types.js.map +1 -1
  141. package/dist/src/ui/utils/highlight.d.ts +1 -0
  142. package/dist/src/ui/utils/highlight.js +28 -0
  143. package/dist/src/ui/utils/highlight.js.map +1 -1
  144. package/dist/src/utils/events.d.ts +2 -1
  145. package/dist/src/utils/events.js +1 -0
  146. package/dist/src/utils/events.js.map +1 -1
  147. package/dist/tsconfig.tsbuildinfo +1 -1
  148. package/package.json +3 -4
@@ -0,0 +1,267 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
+ import { checkForExtensionUpdate, cloneFromGit, findReleaseAsset, parseGitHubRepoForReleases, } from './github.js';
8
+ import { simpleGit } from 'simple-git';
9
+ import { ExtensionUpdateState } from '../../ui/state/extensions.js';
10
+ const mockPlatform = vi.hoisted(() => vi.fn());
11
+ const mockArch = vi.hoisted(() => vi.fn());
12
+ vi.mock('node:os', async (importOriginal) => {
13
+ const actual = await importOriginal();
14
+ return {
15
+ ...actual,
16
+ platform: mockPlatform,
17
+ arch: mockArch,
18
+ };
19
+ });
20
+ vi.mock('simple-git');
21
+ describe('git extension helpers', () => {
22
+ afterEach(() => {
23
+ vi.restoreAllMocks();
24
+ });
25
+ describe('cloneFromGit', () => {
26
+ const mockGit = {
27
+ clone: vi.fn(),
28
+ getRemotes: vi.fn(),
29
+ fetch: vi.fn(),
30
+ checkout: vi.fn(),
31
+ };
32
+ beforeEach(() => {
33
+ vi.mocked(simpleGit).mockReturnValue(mockGit);
34
+ });
35
+ it('should clone, fetch and checkout a repo', async () => {
36
+ const installMetadata = {
37
+ source: 'http://my-repo.com',
38
+ ref: 'my-ref',
39
+ type: 'git',
40
+ };
41
+ const destination = '/dest';
42
+ mockGit.getRemotes.mockResolvedValue([
43
+ { name: 'origin', refs: { fetch: 'http://my-repo.com' } },
44
+ ]);
45
+ await cloneFromGit(installMetadata, destination);
46
+ expect(mockGit.clone).toHaveBeenCalledWith('http://my-repo.com', './', [
47
+ '--depth',
48
+ '1',
49
+ ]);
50
+ expect(mockGit.getRemotes).toHaveBeenCalledWith(true);
51
+ expect(mockGit.fetch).toHaveBeenCalledWith('origin', 'my-ref');
52
+ expect(mockGit.checkout).toHaveBeenCalledWith('FETCH_HEAD');
53
+ });
54
+ it('should use HEAD if ref is not provided', async () => {
55
+ const installMetadata = {
56
+ source: 'http://my-repo.com',
57
+ type: 'git',
58
+ };
59
+ const destination = '/dest';
60
+ mockGit.getRemotes.mockResolvedValue([
61
+ { name: 'origin', refs: { fetch: 'http://my-repo.com' } },
62
+ ]);
63
+ await cloneFromGit(installMetadata, destination);
64
+ expect(mockGit.fetch).toHaveBeenCalledWith('origin', 'HEAD');
65
+ });
66
+ it('should throw if no remotes are found', async () => {
67
+ const installMetadata = {
68
+ source: 'http://my-repo.com',
69
+ type: 'git',
70
+ };
71
+ const destination = '/dest';
72
+ mockGit.getRemotes.mockResolvedValue([]);
73
+ await expect(cloneFromGit(installMetadata, destination)).rejects.toThrow('Failed to clone Git repository from http://my-repo.com');
74
+ });
75
+ it('should throw on clone error', async () => {
76
+ const installMetadata = {
77
+ source: 'http://my-repo.com',
78
+ type: 'git',
79
+ };
80
+ const destination = '/dest';
81
+ mockGit.clone.mockRejectedValue(new Error('clone failed'));
82
+ await expect(cloneFromGit(installMetadata, destination)).rejects.toThrow('Failed to clone Git repository from http://my-repo.com');
83
+ });
84
+ });
85
+ describe('checkForExtensionUpdate', () => {
86
+ const mockGit = {
87
+ getRemotes: vi.fn(),
88
+ listRemote: vi.fn(),
89
+ revparse: vi.fn(),
90
+ };
91
+ beforeEach(() => {
92
+ vi.mocked(simpleGit).mockReturnValue(mockGit);
93
+ });
94
+ it('should return NOT_UPDATABLE for non-git extensions', async () => {
95
+ const extension = {
96
+ name: 'test',
97
+ path: '/ext',
98
+ version: '1.0.0',
99
+ isActive: true,
100
+ installMetadata: {
101
+ type: 'local',
102
+ source: '',
103
+ },
104
+ };
105
+ let result = undefined;
106
+ await checkForExtensionUpdate(extension, (newState) => (result = newState));
107
+ expect(result).toBe(ExtensionUpdateState.NOT_UPDATABLE);
108
+ });
109
+ it('should return ERROR if no remotes found', async () => {
110
+ const extension = {
111
+ name: 'test',
112
+ path: '/ext',
113
+ version: '1.0.0',
114
+ isActive: true,
115
+ installMetadata: {
116
+ type: 'git',
117
+ source: '',
118
+ },
119
+ };
120
+ mockGit.getRemotes.mockResolvedValue([]);
121
+ let result = undefined;
122
+ await checkForExtensionUpdate(extension, (newState) => (result = newState));
123
+ expect(result).toBe(ExtensionUpdateState.ERROR);
124
+ });
125
+ it('should return UPDATE_AVAILABLE when remote hash is different', async () => {
126
+ const extension = {
127
+ name: 'test',
128
+ path: '/ext',
129
+ version: '1.0.0',
130
+ isActive: true,
131
+ installMetadata: {
132
+ type: 'git',
133
+ source: 'my/ext',
134
+ },
135
+ };
136
+ mockGit.getRemotes.mockResolvedValue([
137
+ { name: 'origin', refs: { fetch: 'http://my-repo.com' } },
138
+ ]);
139
+ mockGit.listRemote.mockResolvedValue('remote-hash\tHEAD');
140
+ mockGit.revparse.mockResolvedValue('local-hash');
141
+ let result = undefined;
142
+ await checkForExtensionUpdate(extension, (newState) => (result = newState));
143
+ expect(result).toBe(ExtensionUpdateState.UPDATE_AVAILABLE);
144
+ });
145
+ it('should return UP_TO_DATE when remote and local hashes are the same', async () => {
146
+ const extension = {
147
+ name: 'test',
148
+ path: '/ext',
149
+ version: '1.0.0',
150
+ isActive: true,
151
+ installMetadata: {
152
+ type: 'git',
153
+ source: 'my/ext',
154
+ },
155
+ };
156
+ mockGit.getRemotes.mockResolvedValue([
157
+ { name: 'origin', refs: { fetch: 'http://my-repo.com' } },
158
+ ]);
159
+ mockGit.listRemote.mockResolvedValue('same-hash\tHEAD');
160
+ mockGit.revparse.mockResolvedValue('same-hash');
161
+ let result = undefined;
162
+ await checkForExtensionUpdate(extension, (newState) => (result = newState));
163
+ expect(result).toBe(ExtensionUpdateState.UP_TO_DATE);
164
+ });
165
+ it('should return ERROR on git error', async () => {
166
+ const extension = {
167
+ name: 'test',
168
+ path: '/ext',
169
+ version: '1.0.0',
170
+ isActive: true,
171
+ installMetadata: {
172
+ type: 'git',
173
+ source: 'my/ext',
174
+ },
175
+ };
176
+ mockGit.getRemotes.mockRejectedValue(new Error('git error'));
177
+ let result = undefined;
178
+ await checkForExtensionUpdate(extension, (newState) => (result = newState));
179
+ expect(result).toBe(ExtensionUpdateState.ERROR);
180
+ });
181
+ });
182
+ describe('findReleaseAsset', () => {
183
+ const assets = [
184
+ { name: 'darwin.arm64.extension.tar.gz', browser_download_url: 'url1' },
185
+ { name: 'darwin.x64.extension.tar.gz', browser_download_url: 'url2' },
186
+ { name: 'linux.x64.extension.tar.gz', browser_download_url: 'url3' },
187
+ { name: 'win32.x64.extension.tar.gz', browser_download_url: 'url4' },
188
+ { name: 'extension-generic.tar.gz', browser_download_url: 'url5' },
189
+ ];
190
+ it('should find asset matching platform and architecture', () => {
191
+ mockPlatform.mockReturnValue('darwin');
192
+ mockArch.mockReturnValue('arm64');
193
+ const result = findReleaseAsset(assets);
194
+ expect(result).toEqual(assets[0]);
195
+ });
196
+ it('should find asset matching platform if arch does not match', () => {
197
+ mockPlatform.mockReturnValue('linux');
198
+ mockArch.mockReturnValue('arm64');
199
+ const result = findReleaseAsset(assets);
200
+ expect(result).toEqual(assets[2]);
201
+ });
202
+ it('should return undefined if no matching asset is found', () => {
203
+ mockPlatform.mockReturnValue('sunos');
204
+ mockArch.mockReturnValue('x64');
205
+ const result = findReleaseAsset(assets);
206
+ expect(result).toBeUndefined();
207
+ });
208
+ it('should find generic asset if it is the only one', () => {
209
+ const singleAsset = [
210
+ { name: 'extension.tar.gz', browser_download_url: 'url' },
211
+ ];
212
+ mockPlatform.mockReturnValue('darwin');
213
+ mockArch.mockReturnValue('arm64');
214
+ const result = findReleaseAsset(singleAsset);
215
+ expect(result).toEqual(singleAsset[0]);
216
+ });
217
+ it('should return undefined if multiple generic assets exist', () => {
218
+ const multipleGenericAssets = [
219
+ { name: 'extension-1.tar.gz', browser_download_url: 'url1' },
220
+ { name: 'extension-2.tar.gz', browser_download_url: 'url2' },
221
+ ];
222
+ mockPlatform.mockReturnValue('darwin');
223
+ mockArch.mockReturnValue('arm64');
224
+ const result = findReleaseAsset(multipleGenericAssets);
225
+ expect(result).toBeUndefined();
226
+ });
227
+ });
228
+ describe('parseGitHubRepoForReleases', () => {
229
+ it('should parse owner and repo from a full GitHub URL', () => {
230
+ const source = 'https://github.com/owner/repo.git';
231
+ const { owner, repo } = parseGitHubRepoForReleases(source);
232
+ expect(owner).toBe('owner');
233
+ expect(repo).toBe('repo');
234
+ });
235
+ it('should parse owner and repo from a full GitHub UR without .git', () => {
236
+ const source = 'https://github.com/owner/repo';
237
+ const { owner, repo } = parseGitHubRepoForReleases(source);
238
+ expect(owner).toBe('owner');
239
+ expect(repo).toBe('repo');
240
+ });
241
+ it('should fail on a GitHub SSH URL', () => {
242
+ const source = 'git@github.com:owner/repo.git';
243
+ expect(() => parseGitHubRepoForReleases(source)).toThrow('GitHub release-based extensions are not supported for SSH. You must use an HTTPS URI with a personal access token to download releases from private repositories. You can set your personal access token in the GITHUB_TOKEN environment variable and install the extension via SSH.');
244
+ });
245
+ it('should parse owner and repo from a shorthand string', () => {
246
+ const source = 'owner/repo';
247
+ const { owner, repo } = parseGitHubRepoForReleases(source);
248
+ expect(owner).toBe('owner');
249
+ expect(repo).toBe('repo');
250
+ });
251
+ it('should handle .git suffix in repo name', () => {
252
+ const source = 'owner/repo.git';
253
+ const { owner, repo } = parseGitHubRepoForReleases(source);
254
+ expect(owner).toBe('owner');
255
+ expect(repo).toBe('repo');
256
+ });
257
+ it('should throw error for invalid source format', () => {
258
+ const source = 'invalid-format';
259
+ expect(() => parseGitHubRepoForReleases(source)).toThrow('Invalid GitHub repository source: invalid-format. Expected "owner/repo" or a github repo uri.');
260
+ });
261
+ it('should throw error for source with too many parts', () => {
262
+ const source = 'https://github.com/owner/repo/extra';
263
+ expect(() => parseGitHubRepoForReleases(source)).toThrow('Invalid GitHub repository source: https://github.com/owner/repo/extra. Expected "owner/repo" or a github repo uri.');
264
+ });
265
+ });
266
+ });
267
+ //# sourceMappingURL=github.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.test.js","sourceRoot":"","sources":["../../../../src/config/extensions/github.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { GeminiCLIExtension } from '@google/gemini-cli-core';
7
+ import { ExtensionUpdateState } from '../../ui/state/extensions.js';
8
+ import { type Dispatch, type SetStateAction } from 'react';
9
+ export interface ExtensionUpdateInfo {
10
+ name: string;
11
+ originalVersion: string;
12
+ updatedVersion: string;
13
+ }
14
+ export declare function updateExtension(extension: GeminiCLIExtension, cwd: string | undefined, currentState: ExtensionUpdateState, setExtensionUpdateState: (updateState: ExtensionUpdateState) => void): Promise<ExtensionUpdateInfo | undefined>;
15
+ export declare function updateAllUpdatableExtensions(cwd: string | undefined, extensions: GeminiCLIExtension[], extensionsState: Map<string, ExtensionUpdateState>, setExtensionsUpdateState: Dispatch<SetStateAction<Map<string, ExtensionUpdateState>>>): Promise<ExtensionUpdateInfo[]>;
16
+ export interface ExtensionUpdateCheckResult {
17
+ state: ExtensionUpdateState;
18
+ error?: string;
19
+ }
20
+ export declare function checkForAllExtensionUpdates(extensions: GeminiCLIExtension[], extensionsUpdateState: Map<string, ExtensionUpdateState>, setExtensionsUpdateState: Dispatch<SetStateAction<Map<string, ExtensionUpdateState>>>): Promise<Map<string, ExtensionUpdateState>>;
@@ -0,0 +1,94 @@
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 { getErrorMessage } from '../../utils/errors.js';
8
+ import { ExtensionUpdateState } from '../../ui/state/extensions.js';
9
+ import {} from 'react';
10
+ import { copyExtension, installExtension, uninstallExtension, loadExtension, loadInstallMetadata, ExtensionStorage, } from '../extension.js';
11
+ import { checkForExtensionUpdate } from './github.js';
12
+ export async function updateExtension(extension, cwd = process.cwd(), currentState, setExtensionUpdateState) {
13
+ if (currentState === ExtensionUpdateState.UPDATING) {
14
+ return undefined;
15
+ }
16
+ setExtensionUpdateState(ExtensionUpdateState.UPDATING);
17
+ const installMetadata = loadInstallMetadata(extension.path);
18
+ if (!installMetadata?.type) {
19
+ setExtensionUpdateState(ExtensionUpdateState.ERROR);
20
+ throw new Error(`Extension ${extension.name} cannot be updated, type is unknown.`);
21
+ }
22
+ if (installMetadata?.type === 'link') {
23
+ setExtensionUpdateState(ExtensionUpdateState.UP_TO_DATE);
24
+ throw new Error(`Extension is linked so does not need to be updated`);
25
+ }
26
+ const originalVersion = extension.version;
27
+ const tempDir = await ExtensionStorage.createTmpDir();
28
+ try {
29
+ await copyExtension(extension.path, tempDir);
30
+ await uninstallExtension(extension.name, cwd);
31
+ await installExtension(installMetadata, false, cwd);
32
+ const updatedExtensionStorage = new ExtensionStorage(extension.name);
33
+ const updatedExtension = loadExtension({
34
+ extensionDir: updatedExtensionStorage.getExtensionDir(),
35
+ workspaceDir: cwd,
36
+ });
37
+ if (!updatedExtension) {
38
+ setExtensionUpdateState(ExtensionUpdateState.ERROR);
39
+ throw new Error('Updated extension not found after installation.');
40
+ }
41
+ const updatedVersion = updatedExtension.config.version;
42
+ setExtensionUpdateState(ExtensionUpdateState.UPDATED_NEEDS_RESTART);
43
+ return {
44
+ name: extension.name,
45
+ originalVersion,
46
+ updatedVersion,
47
+ };
48
+ }
49
+ catch (e) {
50
+ console.error(`Error updating extension, rolling back. ${getErrorMessage(e)}`);
51
+ setExtensionUpdateState(ExtensionUpdateState.ERROR);
52
+ await copyExtension(tempDir, extension.path);
53
+ throw e;
54
+ }
55
+ finally {
56
+ await fs.promises.rm(tempDir, { recursive: true, force: true });
57
+ }
58
+ }
59
+ export async function updateAllUpdatableExtensions(cwd = process.cwd(), extensions, extensionsState, setExtensionsUpdateState) {
60
+ return (await Promise.all(extensions
61
+ .filter((extension) => extensionsState.get(extension.name) ===
62
+ ExtensionUpdateState.UPDATE_AVAILABLE)
63
+ .map((extension) => updateExtension(extension, cwd, extensionsState.get(extension.name), (updateState) => {
64
+ setExtensionsUpdateState((prev) => {
65
+ const finalState = new Map(prev);
66
+ finalState.set(extension.name, updateState);
67
+ return finalState;
68
+ });
69
+ })))).filter((updateInfo) => !!updateInfo);
70
+ }
71
+ export async function checkForAllExtensionUpdates(extensions, extensionsUpdateState, setExtensionsUpdateState) {
72
+ for (const extension of extensions) {
73
+ const initialState = extensionsUpdateState.get(extension.name);
74
+ if (initialState === undefined) {
75
+ if (!extension.installMetadata) {
76
+ setExtensionsUpdateState((prev) => {
77
+ extensionsUpdateState = new Map(prev);
78
+ extensionsUpdateState.set(extension.name, ExtensionUpdateState.NOT_UPDATABLE);
79
+ return extensionsUpdateState;
80
+ });
81
+ continue;
82
+ }
83
+ await checkForExtensionUpdate(extension, (updatedState) => {
84
+ setExtensionsUpdateState((prev) => {
85
+ extensionsUpdateState = new Map(prev);
86
+ extensionsUpdateState.set(extension.name, updatedState);
87
+ return extensionsUpdateState;
88
+ });
89
+ });
90
+ }
91
+ }
92
+ return extensionsUpdateState;
93
+ }
94
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/config/extensions/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};