@google/gemini-cli-core 0.2.0-preview.1 → 0.2.0-preview.2

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 (210) hide show
  1. package/README.md +2 -32
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.js +15 -9
  6. package/dist/src/code_assist/oauth2.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.test.js +4 -6
  8. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  9. package/dist/src/config/config.d.ts +2 -12
  10. package/dist/src/config/config.js +11 -30
  11. package/dist/src/config/config.js.map +1 -1
  12. package/dist/src/config/config.test.js +2 -33
  13. package/dist/src/config/config.test.js.map +1 -1
  14. package/dist/src/core/contentGenerator.js +2 -3
  15. package/dist/src/core/contentGenerator.js.map +1 -1
  16. package/dist/src/core/coreToolScheduler.d.ts +3 -2
  17. package/dist/src/core/coreToolScheduler.js +1 -1
  18. package/dist/src/core/coreToolScheduler.js.map +1 -1
  19. package/dist/src/core/coreToolScheduler.test.js +11 -10
  20. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  21. package/dist/src/core/geminiChat.d.ts +1 -2
  22. package/dist/src/core/geminiChat.js +16 -43
  23. package/dist/src/core/geminiChat.js.map +1 -1
  24. package/dist/src/core/logger.d.ts +1 -3
  25. package/dist/src/core/logger.js +3 -4
  26. package/dist/src/core/logger.js.map +1 -1
  27. package/dist/src/core/logger.test.js +16 -17
  28. package/dist/src/core/logger.test.js.map +1 -1
  29. package/dist/src/core/nonInteractiveToolExecutor.d.ts +5 -3
  30. package/dist/src/core/nonInteractiveToolExecutor.js +122 -14
  31. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  32. package/dist/src/core/nonInteractiveToolExecutor.test.js +53 -56
  33. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  34. package/dist/src/core/turn.js +4 -4
  35. package/dist/src/core/turn.js.map +1 -1
  36. package/dist/src/core/turn.test.js +0 -19
  37. package/dist/src/core/turn.test.js.map +1 -1
  38. package/dist/src/generated/git-commit.d.ts +2 -2
  39. package/dist/src/generated/git-commit.js +2 -2
  40. package/dist/src/ide/ide-client.d.ts +2 -4
  41. package/dist/src/ide/ide-client.js +16 -81
  42. package/dist/src/ide/ide-client.js.map +1 -1
  43. package/dist/src/ide/ide-client.test.js +33 -141
  44. package/dist/src/ide/ide-client.test.js.map +1 -1
  45. package/dist/src/ide/ideContext.d.ts +11 -11
  46. package/dist/src/index.d.ts +0 -3
  47. package/dist/src/index.js +0 -3
  48. package/dist/src/index.js.map +1 -1
  49. package/dist/src/mcp/oauth-token-storage.d.ts +2 -0
  50. package/dist/src/mcp/oauth-token-storage.js +5 -2
  51. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  52. package/dist/src/mcp/oauth-token-storage.test.js +0 -1
  53. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  54. package/dist/src/services/chatRecordingService.js +2 -2
  55. package/dist/src/services/chatRecordingService.js.map +1 -1
  56. package/dist/src/services/chatRecordingService.test.js +3 -5
  57. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  58. package/dist/src/services/gitService.d.ts +1 -3
  59. package/dist/src/services/gitService.js +10 -19
  60. package/dist/src/services/gitService.js.map +1 -1
  61. package/dist/src/services/gitService.test.js +14 -17
  62. package/dist/src/services/gitService.test.js.map +1 -1
  63. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +2 -6
  64. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +7 -75
  65. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  66. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +9 -66
  67. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  68. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +1 -9
  69. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +0 -19
  70. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  71. package/dist/src/telemetry/loggers.d.ts +1 -2
  72. package/dist/src/telemetry/loggers.js +1 -10
  73. package/dist/src/telemetry/loggers.js.map +1 -1
  74. package/dist/src/telemetry/loggers.test.js +0 -4
  75. package/dist/src/telemetry/loggers.test.js.map +1 -1
  76. package/dist/src/telemetry/metrics.d.ts +1 -1
  77. package/dist/src/telemetry/metrics.js +1 -4
  78. package/dist/src/telemetry/metrics.js.map +1 -1
  79. package/dist/src/telemetry/types.d.ts +3 -21
  80. package/dist/src/telemetry/types.js +2 -38
  81. package/dist/src/telemetry/types.js.map +1 -1
  82. package/dist/src/tools/edit.js +4 -25
  83. package/dist/src/tools/edit.js.map +1 -1
  84. package/dist/src/tools/edit.test.js +0 -24
  85. package/dist/src/tools/edit.test.js.map +1 -1
  86. package/dist/src/tools/glob.js +2 -13
  87. package/dist/src/tools/glob.js.map +1 -1
  88. package/dist/src/tools/glob.test.js +1 -23
  89. package/dist/src/tools/glob.test.js.map +1 -1
  90. package/dist/src/tools/grep.js +0 -5
  91. package/dist/src/tools/grep.js.map +1 -1
  92. package/dist/src/tools/grep.test.js +0 -11
  93. package/dist/src/tools/grep.test.js.map +1 -1
  94. package/dist/src/tools/ls.js +4 -9
  95. package/dist/src/tools/ls.js.map +1 -1
  96. package/dist/src/tools/ls.test.js +0 -5
  97. package/dist/src/tools/ls.test.js.map +1 -1
  98. package/dist/src/tools/mcp-client.d.ts +0 -7
  99. package/dist/src/tools/mcp-client.js +21 -26
  100. package/dist/src/tools/mcp-client.js.map +1 -1
  101. package/dist/src/tools/mcp-client.test.js +1 -26
  102. package/dist/src/tools/mcp-client.test.js.map +1 -1
  103. package/dist/src/tools/mcp-tool.js +2 -12
  104. package/dist/src/tools/mcp-tool.js.map +1 -1
  105. package/dist/src/tools/mcp-tool.test.js +3 -20
  106. package/dist/src/tools/mcp-tool.test.js.map +1 -1
  107. package/dist/src/tools/memoryTool.js +2 -7
  108. package/dist/src/tools/memoryTool.js.map +1 -1
  109. package/dist/src/tools/memoryTool.test.js +1 -13
  110. package/dist/src/tools/memoryTool.test.js.map +1 -1
  111. package/dist/src/tools/read-file.js +32 -10
  112. package/dist/src/tools/read-file.js.map +1 -1
  113. package/dist/src/tools/read-file.test.js +2 -5
  114. package/dist/src/tools/read-file.test.js.map +1 -1
  115. package/dist/src/tools/read-many-files.js +11 -21
  116. package/dist/src/tools/read-many-files.js.map +1 -1
  117. package/dist/src/tools/read-many-files.test.js +4 -42
  118. package/dist/src/tools/read-many-files.test.js.map +1 -1
  119. package/dist/src/tools/shell.js +2 -2
  120. package/dist/src/tools/shell.js.map +1 -1
  121. package/dist/src/tools/shell.test.js +1 -2
  122. package/dist/src/tools/shell.test.js.map +1 -1
  123. package/dist/src/tools/tool-error.d.ts +1 -16
  124. package/dist/src/tools/tool-error.js +0 -24
  125. package/dist/src/tools/tool-error.js.map +1 -1
  126. package/dist/src/tools/tool-registry.js +1 -7
  127. package/dist/src/tools/tool-registry.js.map +1 -1
  128. package/dist/src/tools/tool-registry.test.js +1 -71
  129. package/dist/src/tools/tool-registry.test.js.map +1 -1
  130. package/dist/src/tools/tools.d.ts +5 -1
  131. package/dist/src/tools/tools.js.map +1 -1
  132. package/dist/src/tools/tools.test.js +1 -0
  133. package/dist/src/tools/tools.test.js.map +1 -1
  134. package/dist/src/tools/web-fetch.js +6 -9
  135. package/dist/src/tools/web-fetch.js.map +1 -1
  136. package/dist/src/tools/web-fetch.test.js +16 -55
  137. package/dist/src/tools/web-fetch.test.js.map +1 -1
  138. package/dist/src/tools/web-search.js +5 -26
  139. package/dist/src/tools/web-search.js.map +1 -1
  140. package/dist/src/tools/web-search.test.js +1 -69
  141. package/dist/src/tools/web-search.test.js.map +1 -1
  142. package/dist/src/tools/write-file.js +3 -7
  143. package/dist/src/tools/write-file.js.map +1 -1
  144. package/dist/src/tools/write-file.test.js +0 -3
  145. package/dist/src/tools/write-file.test.js.map +1 -1
  146. package/dist/src/utils/editCorrector.test.js +0 -1
  147. package/dist/src/utils/editCorrector.test.js.map +1 -1
  148. package/dist/src/utils/editor.js +1 -1
  149. package/dist/src/utils/editor.js.map +1 -1
  150. package/dist/src/utils/editor.test.js +1 -1
  151. package/dist/src/utils/editor.test.js.map +1 -1
  152. package/dist/src/utils/fileUtils.d.ts +7 -2
  153. package/dist/src/utils/fileUtils.js +17 -14
  154. package/dist/src/utils/fileUtils.js.map +1 -1
  155. package/dist/src/utils/filesearch/fileSearch.d.ts +0 -1
  156. package/dist/src/utils/filesearch/fileSearch.js +2 -3
  157. package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
  158. package/dist/src/utils/filesearch/fileSearch.test.js +0 -90
  159. package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
  160. package/dist/src/utils/memoryDiscovery.js +20 -54
  161. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  162. package/dist/src/utils/memoryDiscovery.test.js +0 -37
  163. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  164. package/dist/src/utils/paths.d.ts +17 -0
  165. package/dist/src/utils/paths.js +26 -0
  166. package/dist/src/utils/paths.js.map +1 -1
  167. package/dist/src/utils/user_account.d.ts +9 -0
  168. package/dist/src/utils/user_account.js +109 -0
  169. package/dist/src/utils/user_account.js.map +1 -0
  170. package/dist/src/utils/{userAccountManager.test.js → user_account.test.js} +30 -33
  171. package/dist/src/utils/user_account.test.js.map +1 -0
  172. package/dist/src/utils/user_id.d.ts +11 -0
  173. package/dist/src/utils/user_id.js +49 -0
  174. package/dist/src/utils/user_id.js.map +1 -0
  175. package/dist/src/utils/user_id.test.js +21 -0
  176. package/dist/src/utils/user_id.test.js.map +1 -0
  177. package/dist/tsconfig.tsbuildinfo +1 -1
  178. package/package.json +1 -1
  179. package/dist/src/config/storage.d.ts +0 -32
  180. package/dist/src/config/storage.js +0 -90
  181. package/dist/src/config/storage.js.map +0 -1
  182. package/dist/src/config/storage.test.js +0 -43
  183. package/dist/src/config/storage.test.js.map +0 -1
  184. package/dist/src/telemetry/telemetry-utils.d.ts +0 -6
  185. package/dist/src/telemetry/telemetry-utils.js +0 -14
  186. package/dist/src/telemetry/telemetry-utils.js.map +0 -1
  187. package/dist/src/telemetry/telemetry-utils.test.js +0 -40
  188. package/dist/src/telemetry/telemetry-utils.test.js.map +0 -1
  189. package/dist/src/tools/ripGrep.d.ts +0 -46
  190. package/dist/src/tools/ripGrep.js +0 -368
  191. package/dist/src/tools/ripGrep.js.map +0 -1
  192. package/dist/src/tools/ripGrep.test.d.ts +0 -6
  193. package/dist/src/tools/ripGrep.test.js +0 -874
  194. package/dist/src/tools/ripGrep.test.js.map +0 -1
  195. package/dist/src/utils/installationManager.d.ts +0 -16
  196. package/dist/src/utils/installationManager.js +0 -50
  197. package/dist/src/utils/installationManager.js.map +0 -1
  198. package/dist/src/utils/installationManager.test.d.ts +0 -6
  199. package/dist/src/utils/installationManager.test.js +0 -83
  200. package/dist/src/utils/installationManager.test.js.map +0 -1
  201. package/dist/src/utils/language-detection.d.ts +0 -6
  202. package/dist/src/utils/language-detection.js +0 -101
  203. package/dist/src/utils/language-detection.js.map +0 -1
  204. package/dist/src/utils/userAccountManager.d.ts +0 -20
  205. package/dist/src/utils/userAccountManager.js +0 -114
  206. package/dist/src/utils/userAccountManager.js.map +0 -1
  207. package/dist/src/utils/userAccountManager.test.d.ts +0 -6
  208. package/dist/src/utils/userAccountManager.test.js.map +0 -1
  209. /package/dist/src/{config/storage.test.d.ts → utils/user_account.test.d.ts} +0 -0
  210. /package/dist/src/{telemetry/telemetry-utils.test.d.ts → utils/user_id.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/utils/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export declare function cacheGoogleAccount(email: string): Promise<void>;
7
+ export declare function getCachedGoogleAccount(): string | null;
8
+ export declare function getLifetimeGoogleAccounts(): number;
9
+ export declare function clearCachedGoogleAccount(): Promise<void>;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import path from 'node:path';
7
+ import { promises as fsp, readFileSync } from 'node:fs';
8
+ import * as os from 'os';
9
+ import { GEMINI_DIR, GOOGLE_ACCOUNTS_FILENAME } from './paths.js';
10
+ function getGoogleAccountsCachePath() {
11
+ return path.join(os.homedir(), GEMINI_DIR, GOOGLE_ACCOUNTS_FILENAME);
12
+ }
13
+ /**
14
+ * Parses and validates the string content of an accounts file.
15
+ * @param content The raw string content from the file.
16
+ * @returns A valid UserAccounts object.
17
+ */
18
+ function parseAndValidateAccounts(content) {
19
+ const defaultState = { active: null, old: [] };
20
+ if (!content.trim()) {
21
+ return defaultState;
22
+ }
23
+ const parsed = JSON.parse(content);
24
+ // Inlined validation logic
25
+ if (typeof parsed !== 'object' || parsed === null) {
26
+ console.log('Invalid accounts file schema, starting fresh.');
27
+ return defaultState;
28
+ }
29
+ const { active, old } = parsed;
30
+ const isValid = (active === undefined || active === null || typeof active === 'string') &&
31
+ (old === undefined ||
32
+ (Array.isArray(old) && old.every((i) => typeof i === 'string')));
33
+ if (!isValid) {
34
+ console.log('Invalid accounts file schema, starting fresh.');
35
+ return defaultState;
36
+ }
37
+ return {
38
+ active: parsed.active ?? null,
39
+ old: parsed.old ?? [],
40
+ };
41
+ }
42
+ function readAccountsSync(filePath) {
43
+ const defaultState = { active: null, old: [] };
44
+ try {
45
+ const content = readFileSync(filePath, 'utf-8');
46
+ return parseAndValidateAccounts(content);
47
+ }
48
+ catch (error) {
49
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
50
+ return defaultState;
51
+ }
52
+ console.log('Error during sync read of accounts, starting fresh.', error);
53
+ return defaultState;
54
+ }
55
+ }
56
+ async function readAccounts(filePath) {
57
+ const defaultState = { active: null, old: [] };
58
+ try {
59
+ const content = await fsp.readFile(filePath, 'utf-8');
60
+ return parseAndValidateAccounts(content);
61
+ }
62
+ catch (error) {
63
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
64
+ return defaultState;
65
+ }
66
+ console.log('Could not parse accounts file, starting fresh.', error);
67
+ return defaultState;
68
+ }
69
+ }
70
+ export async function cacheGoogleAccount(email) {
71
+ const filePath = getGoogleAccountsCachePath();
72
+ await fsp.mkdir(path.dirname(filePath), { recursive: true });
73
+ const accounts = await readAccounts(filePath);
74
+ if (accounts.active && accounts.active !== email) {
75
+ if (!accounts.old.includes(accounts.active)) {
76
+ accounts.old.push(accounts.active);
77
+ }
78
+ }
79
+ // If the new email was in the old list, remove it
80
+ accounts.old = accounts.old.filter((oldEmail) => oldEmail !== email);
81
+ accounts.active = email;
82
+ await fsp.writeFile(filePath, JSON.stringify(accounts, null, 2), 'utf-8');
83
+ }
84
+ export function getCachedGoogleAccount() {
85
+ const filePath = getGoogleAccountsCachePath();
86
+ const accounts = readAccountsSync(filePath);
87
+ return accounts.active;
88
+ }
89
+ export function getLifetimeGoogleAccounts() {
90
+ const filePath = getGoogleAccountsCachePath();
91
+ const accounts = readAccountsSync(filePath);
92
+ const allAccounts = new Set(accounts.old);
93
+ if (accounts.active) {
94
+ allAccounts.add(accounts.active);
95
+ }
96
+ return allAccounts.size;
97
+ }
98
+ export async function clearCachedGoogleAccount() {
99
+ const filePath = getGoogleAccountsCachePath();
100
+ const accounts = await readAccounts(filePath);
101
+ if (accounts.active) {
102
+ if (!accounts.old.includes(accounts.active)) {
103
+ accounts.old.push(accounts.active);
104
+ }
105
+ accounts.active = null;
106
+ }
107
+ await fsp.writeFile(filePath, JSON.stringify(accounts, null, 2), 'utf-8');
108
+ }
109
+ //# sourceMappingURL=user_account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_account.js","sourceRoot":"","sources":["../../../src/utils/user_account.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
7
- import { UserAccountManager } from './userAccountManager.js';
7
+ import { cacheGoogleAccount, getCachedGoogleAccount, clearCachedGoogleAccount, getLifetimeGoogleAccounts, } from './user_account.js';
8
8
  import * as fs from 'node:fs';
9
9
  import * as os from 'node:os';
10
10
  import path from 'node:path';
@@ -15,15 +15,12 @@ vi.mock('os', async (importOriginal) => {
15
15
  homedir: vi.fn(),
16
16
  };
17
17
  });
18
- describe('UserAccountManager', () => {
18
+ describe('user_account', () => {
19
19
  let tempHomeDir;
20
- let userAccountManager;
21
- let accountsFile;
20
+ const accountsFile = () => path.join(tempHomeDir, '.gemini', 'google_accounts.json');
22
21
  beforeEach(() => {
23
22
  tempHomeDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gemini-cli-test-home-'));
24
23
  os.homedir.mockReturnValue(tempHomeDir);
25
- accountsFile = () => path.join(tempHomeDir, '.gemini', 'google_accounts.json');
26
- userAccountManager = new UserAccountManager();
27
24
  });
28
25
  afterEach(() => {
29
26
  fs.rmSync(tempHomeDir, { recursive: true, force: true });
@@ -31,7 +28,7 @@ describe('UserAccountManager', () => {
31
28
  });
32
29
  describe('cacheGoogleAccount', () => {
33
30
  it('should create directory and write initial account file', async () => {
34
- await userAccountManager.cacheGoogleAccount('test1@google.com');
31
+ await cacheGoogleAccount('test1@google.com');
35
32
  // Verify Google Account ID was cached
36
33
  expect(fs.existsSync(accountsFile())).toBe(true);
37
34
  expect(fs.readFileSync(accountsFile(), 'utf-8')).toBe(JSON.stringify({ active: 'test1@google.com', old: [] }, null, 2));
@@ -39,7 +36,7 @@ describe('UserAccountManager', () => {
39
36
  it('should update active account and move previous to old', async () => {
40
37
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
41
38
  fs.writeFileSync(accountsFile(), JSON.stringify({ active: 'test2@google.com', old: ['test1@google.com'] }, null, 2));
42
- await userAccountManager.cacheGoogleAccount('test3@google.com');
39
+ await cacheGoogleAccount('test3@google.com');
43
40
  expect(fs.readFileSync(accountsFile(), 'utf-8')).toBe(JSON.stringify({
44
41
  active: 'test3@google.com',
45
42
  old: ['test1@google.com', 'test2@google.com'],
@@ -48,8 +45,8 @@ describe('UserAccountManager', () => {
48
45
  it('should not add a duplicate to the old list', async () => {
49
46
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
50
47
  fs.writeFileSync(accountsFile(), JSON.stringify({ active: 'test1@google.com', old: ['test2@google.com'] }, null, 2));
51
- await userAccountManager.cacheGoogleAccount('test2@google.com');
52
- await userAccountManager.cacheGoogleAccount('test1@google.com');
48
+ await cacheGoogleAccount('test2@google.com');
49
+ await cacheGoogleAccount('test1@google.com');
53
50
  expect(fs.readFileSync(accountsFile(), 'utf-8')).toBe(JSON.stringify({ active: 'test1@google.com', old: ['test2@google.com'] }, null, 2));
54
51
  });
55
52
  it('should handle corrupted JSON by starting fresh', async () => {
@@ -58,7 +55,7 @@ describe('UserAccountManager', () => {
58
55
  const consoleLogSpy = vi
59
56
  .spyOn(console, 'log')
60
57
  .mockImplementation(() => { });
61
- await userAccountManager.cacheGoogleAccount('test1@google.com');
58
+ await cacheGoogleAccount('test1@google.com');
62
59
  expect(consoleLogSpy).toHaveBeenCalled();
63
60
  expect(JSON.parse(fs.readFileSync(accountsFile(), 'utf-8'))).toEqual({
64
61
  active: 'test1@google.com',
@@ -71,7 +68,7 @@ describe('UserAccountManager', () => {
71
68
  const consoleLogSpy = vi
72
69
  .spyOn(console, 'log')
73
70
  .mockImplementation(() => { });
74
- await userAccountManager.cacheGoogleAccount('test2@google.com');
71
+ await cacheGoogleAccount('test2@google.com');
75
72
  expect(consoleLogSpy).toHaveBeenCalled();
76
73
  expect(JSON.parse(fs.readFileSync(accountsFile(), 'utf-8'))).toEqual({
77
74
  active: 'test2@google.com',
@@ -83,17 +80,17 @@ describe('UserAccountManager', () => {
83
80
  it('should return the active account if file exists and is valid', () => {
84
81
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
85
82
  fs.writeFileSync(accountsFile(), JSON.stringify({ active: 'active@google.com', old: [] }, null, 2));
86
- const account = userAccountManager.getCachedGoogleAccount();
83
+ const account = getCachedGoogleAccount();
87
84
  expect(account).toBe('active@google.com');
88
85
  });
89
86
  it('should return null if file does not exist', () => {
90
- const account = userAccountManager.getCachedGoogleAccount();
87
+ const account = getCachedGoogleAccount();
91
88
  expect(account).toBeNull();
92
89
  });
93
90
  it('should return null if file is empty', () => {
94
91
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
95
92
  fs.writeFileSync(accountsFile(), '');
96
- const account = userAccountManager.getCachedGoogleAccount();
93
+ const account = getCachedGoogleAccount();
97
94
  expect(account).toBeNull();
98
95
  });
99
96
  it('should return null and log if file is corrupted', () => {
@@ -102,14 +99,14 @@ describe('UserAccountManager', () => {
102
99
  const consoleLogSpy = vi
103
100
  .spyOn(console, 'log')
104
101
  .mockImplementation(() => { });
105
- const account = userAccountManager.getCachedGoogleAccount();
102
+ const account = getCachedGoogleAccount();
106
103
  expect(account).toBeNull();
107
104
  expect(consoleLogSpy).toHaveBeenCalled();
108
105
  });
109
106
  it('should return null if active key is missing', () => {
110
107
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
111
108
  fs.writeFileSync(accountsFile(), JSON.stringify({ old: [] }));
112
- const account = userAccountManager.getCachedGoogleAccount();
109
+ const account = getCachedGoogleAccount();
113
110
  expect(account).toBeNull();
114
111
  });
115
112
  });
@@ -117,7 +114,7 @@ describe('UserAccountManager', () => {
117
114
  it('should set active to null and move it to old', async () => {
118
115
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
119
116
  fs.writeFileSync(accountsFile(), JSON.stringify({ active: 'active@google.com', old: ['old1@google.com'] }, null, 2));
120
- await userAccountManager.clearCachedGoogleAccount();
117
+ await clearCachedGoogleAccount();
121
118
  const stored = JSON.parse(fs.readFileSync(accountsFile(), 'utf-8'));
122
119
  expect(stored.active).toBeNull();
123
120
  expect(stored.old).toEqual(['old1@google.com', 'active@google.com']);
@@ -125,7 +122,7 @@ describe('UserAccountManager', () => {
125
122
  it('should handle empty file gracefully', async () => {
126
123
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
127
124
  fs.writeFileSync(accountsFile(), '');
128
- await userAccountManager.clearCachedGoogleAccount();
125
+ await clearCachedGoogleAccount();
129
126
  const stored = JSON.parse(fs.readFileSync(accountsFile(), 'utf-8'));
130
127
  expect(stored.active).toBeNull();
131
128
  expect(stored.old).toEqual([]);
@@ -136,7 +133,7 @@ describe('UserAccountManager', () => {
136
133
  const consoleLogSpy = vi
137
134
  .spyOn(console, 'log')
138
135
  .mockImplementation(() => { });
139
- await userAccountManager.clearCachedGoogleAccount();
136
+ await clearCachedGoogleAccount();
140
137
  expect(consoleLogSpy).toHaveBeenCalled();
141
138
  const stored = JSON.parse(fs.readFileSync(accountsFile(), 'utf-8'));
142
139
  expect(stored.active).toBeNull();
@@ -145,7 +142,7 @@ describe('UserAccountManager', () => {
145
142
  it('should be idempotent if active account is already null', async () => {
146
143
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
147
144
  fs.writeFileSync(accountsFile(), JSON.stringify({ active: null, old: ['old1@google.com'] }, null, 2));
148
- await userAccountManager.clearCachedGoogleAccount();
145
+ await clearCachedGoogleAccount();
149
146
  const stored = JSON.parse(fs.readFileSync(accountsFile(), 'utf-8'));
150
147
  expect(stored.active).toBeNull();
151
148
  expect(stored.old).toEqual(['old1@google.com']);
@@ -156,7 +153,7 @@ describe('UserAccountManager', () => {
156
153
  active: 'active@google.com',
157
154
  old: ['active@google.com'],
158
155
  }, null, 2));
159
- await userAccountManager.clearCachedGoogleAccount();
156
+ await clearCachedGoogleAccount();
160
157
  const stored = JSON.parse(fs.readFileSync(accountsFile(), 'utf-8'));
161
158
  expect(stored.active).toBeNull();
162
159
  expect(stored.old).toEqual(['active@google.com']);
@@ -164,26 +161,26 @@ describe('UserAccountManager', () => {
164
161
  });
165
162
  describe('getLifetimeGoogleAccounts', () => {
166
163
  it('should return 0 if the file does not exist', () => {
167
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(0);
164
+ expect(getLifetimeGoogleAccounts()).toBe(0);
168
165
  });
169
166
  it('should return 0 if the file is empty', () => {
170
167
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
171
168
  fs.writeFileSync(accountsFile(), '');
172
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(0);
169
+ expect(getLifetimeGoogleAccounts()).toBe(0);
173
170
  });
174
171
  it('should return 0 if the file is corrupted', () => {
175
172
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
176
173
  fs.writeFileSync(accountsFile(), 'invalid json');
177
- const consoleDebugSpy = vi
174
+ const consoleLogSpy = vi
178
175
  .spyOn(console, 'log')
179
176
  .mockImplementation(() => { });
180
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(0);
181
- expect(consoleDebugSpy).toHaveBeenCalled();
177
+ expect(getLifetimeGoogleAccounts()).toBe(0);
178
+ expect(consoleLogSpy).toHaveBeenCalled();
182
179
  });
183
180
  it('should return 1 if there is only an active account', () => {
184
181
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
185
182
  fs.writeFileSync(accountsFile(), JSON.stringify({ active: 'test1@google.com', old: [] }));
186
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(1);
183
+ expect(getLifetimeGoogleAccounts()).toBe(1);
187
184
  });
188
185
  it('should correctly count old accounts when active is null', () => {
189
186
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
@@ -191,7 +188,7 @@ describe('UserAccountManager', () => {
191
188
  active: null,
192
189
  old: ['test1@google.com', 'test2@google.com'],
193
190
  }));
194
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(2);
191
+ expect(getLifetimeGoogleAccounts()).toBe(2);
195
192
  });
196
193
  it('should correctly count both active and old accounts', () => {
197
194
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
@@ -199,7 +196,7 @@ describe('UserAccountManager', () => {
199
196
  active: 'test3@google.com',
200
197
  old: ['test1@google.com', 'test2@google.com'],
201
198
  }));
202
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(3);
199
+ expect(getLifetimeGoogleAccounts()).toBe(3);
203
200
  });
204
201
  it('should handle valid JSON with incorrect schema by returning 0', () => {
205
202
  fs.mkdirSync(path.dirname(accountsFile()), { recursive: true });
@@ -207,7 +204,7 @@ describe('UserAccountManager', () => {
207
204
  const consoleLogSpy = vi
208
205
  .spyOn(console, 'log')
209
206
  .mockImplementation(() => { });
210
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(0);
207
+ expect(getLifetimeGoogleAccounts()).toBe(0);
211
208
  expect(consoleLogSpy).toHaveBeenCalled();
212
209
  });
213
210
  it('should not double count if active account is also in old list', () => {
@@ -216,8 +213,8 @@ describe('UserAccountManager', () => {
216
213
  active: 'test1@google.com',
217
214
  old: ['test1@google.com', 'test2@google.com'],
218
215
  }));
219
- expect(userAccountManager.getLifetimeGoogleAccounts()).toBe(2);
216
+ expect(getLifetimeGoogleAccounts()).toBe(2);
220
217
  });
221
218
  });
222
219
  });
223
- //# sourceMappingURL=userAccountManager.test.js.map
220
+ //# sourceMappingURL=user_account.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_account.test.js","sourceRoot":"","sources":["../../../src/utils/user_account.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Retrieves the installation ID from a file, creating it if it doesn't exist.
8
+ * This ID is used for unique user installation tracking.
9
+ * @returns A UUID string for the user.
10
+ */
11
+ export declare function getInstallationId(): string;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as os from 'os';
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { randomUUID } from 'crypto';
10
+ import { GEMINI_DIR } from './paths.js';
11
+ const homeDir = os.homedir() ?? '';
12
+ const geminiDir = path.join(homeDir, GEMINI_DIR);
13
+ const installationIdFile = path.join(geminiDir, 'installation_id');
14
+ function ensureGeminiDirExists() {
15
+ if (!fs.existsSync(geminiDir)) {
16
+ fs.mkdirSync(geminiDir, { recursive: true });
17
+ }
18
+ }
19
+ function readInstallationIdFromFile() {
20
+ if (fs.existsSync(installationIdFile)) {
21
+ const installationid = fs.readFileSync(installationIdFile, 'utf-8').trim();
22
+ return installationid || null;
23
+ }
24
+ return null;
25
+ }
26
+ function writeInstallationIdToFile(installationId) {
27
+ fs.writeFileSync(installationIdFile, installationId, 'utf-8');
28
+ }
29
+ /**
30
+ * Retrieves the installation ID from a file, creating it if it doesn't exist.
31
+ * This ID is used for unique user installation tracking.
32
+ * @returns A UUID string for the user.
33
+ */
34
+ export function getInstallationId() {
35
+ try {
36
+ ensureGeminiDirExists();
37
+ let installationId = readInstallationIdFromFile();
38
+ if (!installationId) {
39
+ installationId = randomUUID();
40
+ writeInstallationIdToFile(installationId);
41
+ }
42
+ return installationId;
43
+ }
44
+ catch (error) {
45
+ console.error('Error accessing installation ID file, generating ephemeral ID:', error);
46
+ return '123456789';
47
+ }
48
+ }
49
+ //# sourceMappingURL=user_id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_id.js","sourceRoot":"","sources":["../../../src/utils/user_id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;AACnC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACjD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;AAEnE,SAAS,qBAAqB;IAC5B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B;IACjC,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3E,OAAO,cAAc,IAAI,IAAI,CAAC;IAChC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,cAAsB;IACvD,EAAE,CAAC,aAAa,CAAC,kBAAkB,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,qBAAqB,EAAE,CAAC;QACxB,IAAI,cAAc,GAAG,0BAA0B,EAAE,CAAC;QAElD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,cAAc,GAAG,UAAU,EAAE,CAAC;YAC9B,yBAAyB,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,gEAAgE,EAChE,KAAK,CACN,CAAC;QACF,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect } from 'vitest';
7
+ import { getInstallationId } from './user_id.js';
8
+ describe('user_id', () => {
9
+ describe('getInstallationId', () => {
10
+ it('should return a valid UUID format string', () => {
11
+ const installationId = getInstallationId();
12
+ expect(installationId).toBeDefined();
13
+ expect(typeof installationId).toBe('string');
14
+ expect(installationId.length).toBeGreaterThan(0);
15
+ // Should return the same ID on subsequent calls (consistent)
16
+ const secondCall = getInstallationId();
17
+ expect(secondCall).toBe(installationId);
18
+ });
19
+ });
20
+ });
21
+ //# sourceMappingURL=user_id.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_id.test.js","sourceRoot":"","sources":["../../../src/utils/user_id.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAClD,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;YAE3C,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC7C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEjD,6DAA6D;YAC7D,MAAM,UAAU,GAAG,iBAAiB,EAAE,CAAC;YACvC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}