@google/gemini-cli-core 0.1.7 → 0.1.8-rc.1

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 (127) hide show
  1. package/README.md +8 -2
  2. package/dist/google-gemini-cli-core-0.1.8-rc.1.tgz +0 -0
  3. package/dist/src/code_assist/codeAssist.js +1 -1
  4. package/dist/src/code_assist/codeAssist.js.map +1 -1
  5. package/dist/src/code_assist/oauth2.d.ts +7 -0
  6. package/dist/src/code_assist/oauth2.js +81 -2
  7. package/dist/src/code_assist/oauth2.js.map +1 -1
  8. package/dist/src/code_assist/oauth2.test.js +20 -4
  9. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  10. package/dist/src/code_assist/server.d.ts +8 -7
  11. package/dist/src/code_assist/server.js +24 -20
  12. package/dist/src/code_assist/server.js.map +1 -1
  13. package/dist/src/code_assist/server.test.js +21 -21
  14. package/dist/src/code_assist/server.test.js.map +1 -1
  15. package/dist/src/code_assist/setup.d.ts +1 -1
  16. package/dist/src/code_assist/setup.js +2 -2
  17. package/dist/src/code_assist/setup.js.map +1 -1
  18. package/dist/src/config/config.d.ts +2 -1
  19. package/dist/src/config/config.js +22 -17
  20. package/dist/src/config/config.js.map +1 -1
  21. package/dist/src/core/client.js +38 -47
  22. package/dist/src/core/client.js.map +1 -1
  23. package/dist/src/core/client.test.js +2 -2
  24. package/dist/src/core/client.test.js.map +1 -1
  25. package/dist/src/core/contentGenerator.d.ts +1 -1
  26. package/dist/src/core/contentGenerator.js +3 -3
  27. package/dist/src/core/contentGenerator.js.map +1 -1
  28. package/dist/src/core/contentGenerator.test.js +1 -1
  29. package/dist/src/core/contentGenerator.test.js.map +1 -1
  30. package/dist/src/core/coreToolScheduler.js.map +1 -1
  31. package/dist/src/core/coreToolScheduler.test.js +1 -2
  32. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  33. package/dist/src/core/geminiChat.js +1 -5
  34. package/dist/src/core/geminiChat.js.map +1 -1
  35. package/dist/src/core/prompts.d.ts +6 -0
  36. package/dist/src/core/prompts.js +64 -0
  37. package/dist/src/core/prompts.js.map +1 -1
  38. package/dist/src/core/turn.d.ts +2 -11
  39. package/dist/src/core/turn.js +1 -19
  40. package/dist/src/core/turn.js.map +1 -1
  41. package/dist/src/core/turn.test.js +0 -45
  42. package/dist/src/core/turn.test.js.map +1 -1
  43. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +5 -6
  44. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  45. package/dist/src/telemetry/index.d.ts +1 -0
  46. package/dist/src/telemetry/index.js +1 -0
  47. package/dist/src/telemetry/index.js.map +1 -1
  48. package/dist/src/telemetry/loggers.js +19 -0
  49. package/dist/src/telemetry/loggers.js.map +1 -1
  50. package/dist/src/telemetry/loggers.test.js +41 -0
  51. package/dist/src/telemetry/loggers.test.js.map +1 -1
  52. package/dist/src/telemetry/types.d.ts +1 -0
  53. package/dist/src/telemetry/types.js +2 -0
  54. package/dist/src/telemetry/types.js.map +1 -1
  55. package/dist/src/telemetry/uiTelemetry.d.ts +67 -0
  56. package/dist/src/telemetry/uiTelemetry.js +131 -0
  57. package/dist/src/telemetry/uiTelemetry.js.map +1 -0
  58. package/dist/src/telemetry/uiTelemetry.test.d.ts +6 -0
  59. package/dist/src/telemetry/uiTelemetry.test.js +411 -0
  60. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -0
  61. package/dist/src/tools/edit.d.ts +4 -0
  62. package/dist/src/tools/edit.js +15 -6
  63. package/dist/src/tools/edit.js.map +1 -1
  64. package/dist/src/tools/edit.test.js +41 -3
  65. package/dist/src/tools/edit.test.js.map +1 -1
  66. package/dist/src/tools/grep.js +4 -2
  67. package/dist/src/tools/grep.js.map +1 -1
  68. package/dist/src/tools/grep.test.js +10 -10
  69. package/dist/src/tools/grep.test.js.map +1 -1
  70. package/dist/src/tools/mcp-client.d.ts +1 -1
  71. package/dist/src/tools/mcp-client.js +15 -8
  72. package/dist/src/tools/mcp-client.js.map +1 -1
  73. package/dist/src/tools/mcp-client.test.js +86 -11
  74. package/dist/src/tools/mcp-client.test.js.map +1 -1
  75. package/dist/src/tools/modifiable-tool.js +5 -4
  76. package/dist/src/tools/modifiable-tool.js.map +1 -1
  77. package/dist/src/tools/modifiable-tool.test.js +16 -3
  78. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  79. package/dist/src/tools/read-file.js +1 -2
  80. package/dist/src/tools/read-file.js.map +1 -1
  81. package/dist/src/tools/read-many-files.test.js +27 -2
  82. package/dist/src/tools/read-many-files.test.js.map +1 -1
  83. package/dist/src/tools/shell.d.ts +1 -0
  84. package/dist/src/tools/shell.js +93 -22
  85. package/dist/src/tools/shell.js.map +1 -1
  86. package/dist/src/tools/shell.test.d.ts +6 -0
  87. package/dist/src/tools/shell.test.js +301 -0
  88. package/dist/src/tools/shell.test.js.map +1 -0
  89. package/dist/src/tools/web-fetch.js.map +1 -1
  90. package/dist/src/tools/write-file.d.ts +4 -0
  91. package/dist/src/tools/write-file.js +13 -5
  92. package/dist/src/tools/write-file.js.map +1 -1
  93. package/dist/src/tools/write-file.test.js +35 -0
  94. package/dist/src/tools/write-file.test.js.map +1 -1
  95. package/dist/src/utils/editor.d.ts +1 -1
  96. package/dist/src/utils/editor.js +19 -6
  97. package/dist/src/utils/editor.js.map +1 -1
  98. package/dist/src/utils/editor.test.js +60 -27
  99. package/dist/src/utils/editor.test.js.map +1 -1
  100. package/dist/src/utils/fileUtils.d.ts +2 -2
  101. package/dist/src/utils/fileUtils.js +25 -8
  102. package/dist/src/utils/fileUtils.js.map +1 -1
  103. package/dist/src/utils/fileUtils.test.js +18 -0
  104. package/dist/src/utils/fileUtils.test.js.map +1 -1
  105. package/dist/src/utils/flashFallback.integration.test.js +2 -2
  106. package/dist/src/utils/flashFallback.integration.test.js.map +1 -1
  107. package/dist/src/utils/memoryDiscovery.js +5 -2
  108. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  109. package/dist/src/utils/memoryImportProcessor.d.ts +35 -0
  110. package/dist/src/utils/memoryImportProcessor.js +141 -0
  111. package/dist/src/utils/memoryImportProcessor.js.map +1 -0
  112. package/dist/src/utils/memoryImportProcessor.test.d.ts +6 -0
  113. package/dist/src/utils/memoryImportProcessor.test.js +170 -0
  114. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -0
  115. package/dist/src/utils/retry.js +1 -1
  116. package/dist/src/utils/retry.js.map +1 -1
  117. package/dist/src/utils/user_id.d.ts +9 -3
  118. package/dist/src/utils/user_id.js +37 -16
  119. package/dist/src/utils/user_id.js.map +1 -1
  120. package/dist/src/utils/user_id.test.d.ts +6 -0
  121. package/dist/src/utils/user_id.test.js +38 -0
  122. package/dist/src/utils/user_id.test.js.map +1 -0
  123. package/dist/tsconfig.tsbuildinfo +1 -1
  124. package/package.json +2 -3
  125. package/dist/google-gemini-cli-core-0.1.7.tgz +0 -0
  126. package/dist/src/tools/shell.json +0 -18
  127. package/dist/src/tools/shell.md +0 -16
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Interface for tracking import processing state to prevent circular imports
8
+ */
9
+ interface ImportState {
10
+ processedFiles: Set<string>;
11
+ maxDepth: number;
12
+ currentDepth: number;
13
+ currentFile?: string;
14
+ }
15
+ /**
16
+ * Processes import statements in GEMINI.md content
17
+ * Supports @path/to/file.md syntax for importing content from other files
18
+ *
19
+ * @param content - The content to process for imports
20
+ * @param basePath - The directory path where the current file is located
21
+ * @param debugMode - Whether to enable debug logging
22
+ * @param importState - State tracking for circular import prevention
23
+ * @returns Processed content with imports resolved
24
+ */
25
+ export declare function processImports(content: string, basePath: string, debugMode?: boolean, importState?: ImportState): Promise<string>;
26
+ /**
27
+ * Validates import paths to ensure they are safe and within allowed directories
28
+ *
29
+ * @param importPath - The import path to validate
30
+ * @param basePath - The base directory for resolving relative paths
31
+ * @param allowedDirectories - Array of allowed directory paths
32
+ * @returns Whether the import path is valid
33
+ */
34
+ export declare function validateImportPath(importPath: string, basePath: string, allowedDirectories: string[]): boolean;
35
+ export {};
@@ -0,0 +1,141 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ // Simple console logger for import processing
9
+ const logger = {
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ debug: (...args) => console.debug('[DEBUG] [ImportProcessor]', ...args),
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ warn: (...args) => console.warn('[WARN] [ImportProcessor]', ...args),
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
15
+ error: (...args) => console.error('[ERROR] [ImportProcessor]', ...args),
16
+ };
17
+ /**
18
+ * Processes import statements in GEMINI.md content
19
+ * Supports @path/to/file.md syntax for importing content from other files
20
+ *
21
+ * @param content - The content to process for imports
22
+ * @param basePath - The directory path where the current file is located
23
+ * @param debugMode - Whether to enable debug logging
24
+ * @param importState - State tracking for circular import prevention
25
+ * @returns Processed content with imports resolved
26
+ */
27
+ export async function processImports(content, basePath, debugMode = false, importState = {
28
+ processedFiles: new Set(),
29
+ maxDepth: 10,
30
+ currentDepth: 0,
31
+ }) {
32
+ if (importState.currentDepth >= importState.maxDepth) {
33
+ if (debugMode) {
34
+ logger.warn(`Maximum import depth (${importState.maxDepth}) reached. Stopping import processing.`);
35
+ }
36
+ return content;
37
+ }
38
+ // Regex to match @path/to/file imports (supports any file extension)
39
+ // Supports both @path/to/file.md and @./path/to/file.md syntax
40
+ const importRegex = /@([./]?[^\s\n]+\.[^\s\n]+)/g;
41
+ let processedContent = content;
42
+ let match;
43
+ // Process all imports in the content
44
+ while ((match = importRegex.exec(content)) !== null) {
45
+ const importPath = match[1];
46
+ // Validate import path to prevent path traversal attacks
47
+ if (!validateImportPath(importPath, basePath, [basePath])) {
48
+ processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - Path traversal attempt -->`);
49
+ continue;
50
+ }
51
+ // Check if the import is for a non-md file and warn
52
+ if (!importPath.endsWith('.md')) {
53
+ logger.warn(`Import processor only supports .md files. Attempting to import non-md file: ${importPath}. This will fail.`);
54
+ // Replace the import with a warning comment
55
+ processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - Only .md files are supported -->`);
56
+ continue;
57
+ }
58
+ const fullPath = path.resolve(basePath, importPath);
59
+ if (debugMode) {
60
+ logger.debug(`Processing import: ${importPath} -> ${fullPath}`);
61
+ }
62
+ // Check for circular imports - if we're already processing this file
63
+ if (importState.currentFile === fullPath) {
64
+ if (debugMode) {
65
+ logger.warn(`Circular import detected: ${importPath}`);
66
+ }
67
+ // Replace the import with a warning comment
68
+ processedContent = processedContent.replace(match[0], `<!-- Circular import detected: ${importPath} -->`);
69
+ continue;
70
+ }
71
+ // Check if we've already processed this file in this import chain
72
+ if (importState.processedFiles.has(fullPath)) {
73
+ if (debugMode) {
74
+ logger.warn(`File already processed in this chain: ${importPath}`);
75
+ }
76
+ // Replace the import with a warning comment
77
+ processedContent = processedContent.replace(match[0], `<!-- File already processed: ${importPath} -->`);
78
+ continue;
79
+ }
80
+ // Check for potential circular imports by looking at the import chain
81
+ if (importState.currentFile) {
82
+ const currentFileDir = path.dirname(importState.currentFile);
83
+ const potentialCircularPath = path.resolve(currentFileDir, importPath);
84
+ if (potentialCircularPath === importState.currentFile) {
85
+ if (debugMode) {
86
+ logger.warn(`Circular import detected: ${importPath}`);
87
+ }
88
+ // Replace the import with a warning comment
89
+ processedContent = processedContent.replace(match[0], `<!-- Circular import detected: ${importPath} -->`);
90
+ continue;
91
+ }
92
+ }
93
+ try {
94
+ // Check if the file exists
95
+ await fs.access(fullPath);
96
+ // Read the imported file content
97
+ const importedContent = await fs.readFile(fullPath, 'utf-8');
98
+ if (debugMode) {
99
+ logger.debug(`Successfully read imported file: ${fullPath}`);
100
+ }
101
+ // Recursively process imports in the imported content
102
+ const processedImportedContent = await processImports(importedContent, path.dirname(fullPath), debugMode, {
103
+ ...importState,
104
+ processedFiles: new Set([...importState.processedFiles, fullPath]),
105
+ currentDepth: importState.currentDepth + 1,
106
+ currentFile: fullPath, // Set the current file being processed
107
+ });
108
+ // Replace the import statement with the processed content
109
+ processedContent = processedContent.replace(match[0], `<!-- Imported from: ${importPath} -->\n${processedImportedContent}\n<!-- End of import from: ${importPath} -->`);
110
+ }
111
+ catch (error) {
112
+ const errorMessage = error instanceof Error ? error.message : String(error);
113
+ if (debugMode) {
114
+ logger.error(`Failed to import ${importPath}: ${errorMessage}`);
115
+ }
116
+ // Replace the import with an error comment
117
+ processedContent = processedContent.replace(match[0], `<!-- Import failed: ${importPath} - ${errorMessage} -->`);
118
+ }
119
+ }
120
+ return processedContent;
121
+ }
122
+ /**
123
+ * Validates import paths to ensure they are safe and within allowed directories
124
+ *
125
+ * @param importPath - The import path to validate
126
+ * @param basePath - The base directory for resolving relative paths
127
+ * @param allowedDirectories - Array of allowed directory paths
128
+ * @returns Whether the import path is valid
129
+ */
130
+ export function validateImportPath(importPath, basePath, allowedDirectories) {
131
+ // Reject URLs
132
+ if (/^(file|https?):\/\//.test(importPath)) {
133
+ return false;
134
+ }
135
+ const resolvedPath = path.resolve(basePath, importPath);
136
+ return allowedDirectories.some((allowedDir) => {
137
+ const normalizedAllowedDir = path.resolve(allowedDir);
138
+ return resolvedPath.startsWith(normalizedAllowedDir);
139
+ });
140
+ }
141
+ //# sourceMappingURL=memoryImportProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryImportProcessor.js","sourceRoot":"","sources":["../../../src/utils/memoryImportProcessor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,8CAA8C;AAC9C,MAAM,MAAM,GAAG;IACb,8DAA8D;IAC9D,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,IAAI,CAAC;IACrD,8DAA8D;IAC9D,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,IAAI,CAAC;IAC3E,8DAA8D;IAC9D,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,IAAI,CAAC;CACtD,CAAC;AAYF;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,QAAgB,EAChB,YAAqB,KAAK,EAC1B,cAA2B;IACzB,cAAc,EAAE,IAAI,GAAG,EAAE;IACzB,QAAQ,EAAE,EAAE;IACZ,YAAY,EAAE,CAAC;CAChB;IAED,IAAI,WAAW,CAAC,YAAY,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,IAAI,CACT,yBAAyB,WAAW,CAAC,QAAQ,wCAAwC,CACtF,CAAC;QACJ,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,qEAAqE;IACrE,+DAA+D;IAC/D,MAAM,WAAW,GAAG,6BAA6B,CAAC;IAElD,IAAI,gBAAgB,GAAG,OAAO,CAAC;IAC/B,IAAI,KAA6B,CAAC;IAElC,qCAAqC;IACrC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE5B,yDAAyD;QACzD,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC1D,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,+BAA+B,CACjE,CAAC;YACF,SAAS;QACX,CAAC;QAED,oDAAoD;QACpD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CACT,+EAA+E,UAAU,mBAAmB,CAC7G,CAAC;YACF,4CAA4C;YAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,qCAAqC,CACvE,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEpD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,sBAAsB,UAAU,OAAO,QAAQ,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,qEAAqE;QACrE,IAAI,WAAW,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACzC,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,4CAA4C;YAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,kCAAkC,UAAU,MAAM,CACnD,CAAC;YACF,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,IAAI,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7C,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,yCAAyC,UAAU,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,4CAA4C;YAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,gCAAgC,UAAU,MAAM,CACjD,CAAC;YACF,SAAS;QACX,CAAC;QAED,sEAAsE;QACtE,IAAI,WAAW,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC7D,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YACvE,IAAI,qBAAqB,KAAK,WAAW,CAAC,WAAW,EAAE,CAAC;gBACtD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;gBACzD,CAAC;gBACD,4CAA4C;gBAC5C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,kCAAkC,UAAU,MAAM,CACnD,CAAC;gBACF,SAAS;YACX,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAE1B,iCAAiC;YACjC,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE7D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,oCAAoC,QAAQ,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,sDAAsD;YACtD,MAAM,wBAAwB,GAAG,MAAM,cAAc,CACnD,eAAe,EACf,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EACtB,SAAS,EACT;gBACE,GAAG,WAAW;gBACd,cAAc,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;gBAClE,YAAY,EAAE,WAAW,CAAC,YAAY,GAAG,CAAC;gBAC1C,WAAW,EAAE,QAAQ,EAAE,uCAAuC;aAC/D,CACF,CAAC;YAEF,0DAA0D;YAC1D,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,SAAS,wBAAwB,8BAA8B,UAAU,MAAM,CACjH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,KAAK,CAAC,oBAAoB,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;YAClE,CAAC;YAED,2CAA2C;YAC3C,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,KAAK,CAAC,CAAC,CAAC,EACR,uBAAuB,UAAU,MAAM,YAAY,MAAM,CAC1D,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,UAAkB,EAClB,QAAgB,EAChB,kBAA4B;IAE5B,cAAc;IACd,IAAI,qBAAqB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAExD,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;QAC5C,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACtD,OAAO,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,170 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
+ import * as fs from 'fs/promises';
8
+ import * as path from 'path';
9
+ import { processImports, validateImportPath } from './memoryImportProcessor.js';
10
+ // Mock fs/promises
11
+ vi.mock('fs/promises');
12
+ const mockedFs = vi.mocked(fs);
13
+ // Mock console methods to capture warnings
14
+ const originalConsoleWarn = console.warn;
15
+ const originalConsoleError = console.error;
16
+ const originalConsoleDebug = console.debug;
17
+ describe('memoryImportProcessor', () => {
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ // Mock console methods
21
+ console.warn = vi.fn();
22
+ console.error = vi.fn();
23
+ console.debug = vi.fn();
24
+ });
25
+ afterEach(() => {
26
+ // Restore console methods
27
+ console.warn = originalConsoleWarn;
28
+ console.error = originalConsoleError;
29
+ console.debug = originalConsoleDebug;
30
+ });
31
+ describe('processImports', () => {
32
+ it('should process basic md file imports', async () => {
33
+ const content = 'Some content @./test.md more content';
34
+ const basePath = '/test/path';
35
+ const importedContent = '# Imported Content\nThis is imported.';
36
+ mockedFs.access.mockResolvedValue(undefined);
37
+ mockedFs.readFile.mockResolvedValue(importedContent);
38
+ const result = await processImports(content, basePath, true);
39
+ expect(result).toContain('<!-- Imported from: ./test.md -->');
40
+ expect(result).toContain(importedContent);
41
+ expect(result).toContain('<!-- End of import from: ./test.md -->');
42
+ expect(mockedFs.readFile).toHaveBeenCalledWith(path.resolve(basePath, './test.md'), 'utf-8');
43
+ });
44
+ it('should warn and fail for non-md file imports', async () => {
45
+ const content = 'Some content @./instructions.txt more content';
46
+ const basePath = '/test/path';
47
+ const result = await processImports(content, basePath, true);
48
+ expect(console.warn).toHaveBeenCalledWith('[WARN] [ImportProcessor]', 'Import processor only supports .md files. Attempting to import non-md file: ./instructions.txt. This will fail.');
49
+ expect(result).toContain('<!-- Import failed: ./instructions.txt - Only .md files are supported -->');
50
+ expect(mockedFs.readFile).not.toHaveBeenCalled();
51
+ });
52
+ it('should handle circular imports', async () => {
53
+ const content = 'Content @./circular.md more content';
54
+ const basePath = '/test/path';
55
+ const circularContent = 'Circular @./main.md content';
56
+ mockedFs.access.mockResolvedValue(undefined);
57
+ mockedFs.readFile.mockResolvedValue(circularContent);
58
+ // Set up the import state to simulate we're already processing main.md
59
+ const importState = {
60
+ processedFiles: new Set(),
61
+ maxDepth: 10,
62
+ currentDepth: 0,
63
+ currentFile: '/test/path/main.md', // Simulate we're processing main.md
64
+ };
65
+ const result = await processImports(content, basePath, true, importState);
66
+ // The circular import should be detected when processing the nested import
67
+ expect(result).toContain('<!-- Circular import detected: ./main.md -->');
68
+ });
69
+ it('should handle file not found errors', async () => {
70
+ const content = 'Content @./nonexistent.md more content';
71
+ const basePath = '/test/path';
72
+ mockedFs.access.mockRejectedValue(new Error('File not found'));
73
+ const result = await processImports(content, basePath, true);
74
+ expect(result).toContain('<!-- Import failed: ./nonexistent.md - File not found -->');
75
+ expect(console.error).toHaveBeenCalledWith('[ERROR] [ImportProcessor]', 'Failed to import ./nonexistent.md: File not found');
76
+ });
77
+ it('should respect max depth limit', async () => {
78
+ const content = 'Content @./deep.md more content';
79
+ const basePath = '/test/path';
80
+ const deepContent = 'Deep @./deeper.md content';
81
+ mockedFs.access.mockResolvedValue(undefined);
82
+ mockedFs.readFile.mockResolvedValue(deepContent);
83
+ const importState = {
84
+ processedFiles: new Set(),
85
+ maxDepth: 1,
86
+ currentDepth: 1,
87
+ };
88
+ const result = await processImports(content, basePath, true, importState);
89
+ expect(console.warn).toHaveBeenCalledWith('[WARN] [ImportProcessor]', 'Maximum import depth (1) reached. Stopping import processing.');
90
+ expect(result).toBe(content);
91
+ });
92
+ it('should handle nested imports recursively', async () => {
93
+ const content = 'Main @./nested.md content';
94
+ const basePath = '/test/path';
95
+ const nestedContent = 'Nested @./inner.md content';
96
+ const innerContent = 'Inner content';
97
+ mockedFs.access.mockResolvedValue(undefined);
98
+ mockedFs.readFile
99
+ .mockResolvedValueOnce(nestedContent)
100
+ .mockResolvedValueOnce(innerContent);
101
+ const result = await processImports(content, basePath, true);
102
+ expect(result).toContain('<!-- Imported from: ./nested.md -->');
103
+ expect(result).toContain('<!-- Imported from: ./inner.md -->');
104
+ expect(result).toContain(innerContent);
105
+ });
106
+ it('should handle absolute paths in imports', async () => {
107
+ const content = 'Content @/absolute/path/file.md more content';
108
+ const basePath = '/test/path';
109
+ const importedContent = 'Absolute path content';
110
+ mockedFs.access.mockResolvedValue(undefined);
111
+ mockedFs.readFile.mockResolvedValue(importedContent);
112
+ const result = await processImports(content, basePath, true);
113
+ expect(result).toContain('<!-- Import failed: /absolute/path/file.md - Path traversal attempt -->');
114
+ });
115
+ it('should handle multiple imports in same content', async () => {
116
+ const content = 'Start @./first.md middle @./second.md end';
117
+ const basePath = '/test/path';
118
+ const firstContent = 'First content';
119
+ const secondContent = 'Second content';
120
+ mockedFs.access.mockResolvedValue(undefined);
121
+ mockedFs.readFile
122
+ .mockResolvedValueOnce(firstContent)
123
+ .mockResolvedValueOnce(secondContent);
124
+ const result = await processImports(content, basePath, true);
125
+ expect(result).toContain('<!-- Imported from: ./first.md -->');
126
+ expect(result).toContain('<!-- Imported from: ./second.md -->');
127
+ expect(result).toContain(firstContent);
128
+ expect(result).toContain(secondContent);
129
+ });
130
+ });
131
+ describe('validateImportPath', () => {
132
+ it('should reject URLs', () => {
133
+ expect(validateImportPath('https://example.com/file.md', '/base', [
134
+ '/allowed',
135
+ ])).toBe(false);
136
+ expect(validateImportPath('http://example.com/file.md', '/base', ['/allowed'])).toBe(false);
137
+ expect(validateImportPath('file:///path/to/file.md', '/base', ['/allowed'])).toBe(false);
138
+ });
139
+ it('should allow paths within allowed directories', () => {
140
+ expect(validateImportPath('./file.md', '/base', ['/base'])).toBe(true);
141
+ expect(validateImportPath('../file.md', '/base', ['/allowed'])).toBe(false);
142
+ expect(validateImportPath('/allowed/sub/file.md', '/base', ['/allowed'])).toBe(true);
143
+ });
144
+ it('should reject paths outside allowed directories', () => {
145
+ expect(validateImportPath('/forbidden/file.md', '/base', ['/allowed'])).toBe(false);
146
+ expect(validateImportPath('../../../file.md', '/base', ['/base'])).toBe(false);
147
+ });
148
+ it('should handle multiple allowed directories', () => {
149
+ expect(validateImportPath('./file.md', '/base', ['/allowed1', '/allowed2'])).toBe(false);
150
+ expect(validateImportPath('/allowed1/file.md', '/base', [
151
+ '/allowed1',
152
+ '/allowed2',
153
+ ])).toBe(true);
154
+ expect(validateImportPath('/allowed2/file.md', '/base', [
155
+ '/allowed1',
156
+ '/allowed2',
157
+ ])).toBe(true);
158
+ });
159
+ it('should handle relative paths correctly', () => {
160
+ expect(validateImportPath('file.md', '/base', ['/base'])).toBe(true);
161
+ expect(validateImportPath('./file.md', '/base', ['/base'])).toBe(true);
162
+ expect(validateImportPath('../file.md', '/base', ['/parent'])).toBe(false);
163
+ });
164
+ it('should handle absolute paths correctly', () => {
165
+ expect(validateImportPath('/allowed/file.md', '/base', ['/allowed'])).toBe(true);
166
+ expect(validateImportPath('/forbidden/file.md', '/base', ['/allowed'])).toBe(false);
167
+ });
168
+ });
169
+ });
170
+ //# sourceMappingURL=memoryImportProcessor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryImportProcessor.test.js","sourceRoot":"","sources":["../../../src/utils/memoryImportProcessor.test.ts"],"names":[],"mappings":"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"}
@@ -72,7 +72,7 @@ export async function retryWithBackoff(fn, options) {
72
72
  // If we have persistent 429s and a fallback callback for OAuth
73
73
  if (consecutive429Count >= 2 &&
74
74
  onPersistent429 &&
75
- authType === AuthType.LOGIN_WITH_GOOGLE_PERSONAL) {
75
+ authType === AuthType.LOGIN_WITH_GOOGLE) {
76
76
  try {
77
77
  const fallbackModel = await onPersistent429(authType);
78
78
  if (fallbackModel) {
@@ -1 +1 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/utils/retry.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,14 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  /**
7
- * Retrieves the persistent user ID from a file, creating it if it doesn't exist.
8
- * This ID is used for unique user tracking.
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
9
  * @returns A UUID string for the user.
10
10
  */
11
- export declare function getPersistentUserId(): string;
11
+ export declare function getInstallationId(): string;
12
+ /**
13
+ * Retrieves the obfuscated Google Account ID for the currently authenticated user.
14
+ * When OAuth is available, returns the user's cached Google Account ID. Otherwise, returns the installation ID.
15
+ * @returns A string ID for the user (Google Account ID if available, otherwise installation ID).
16
+ */
17
+ export declare function getObfuscatedGoogleAccountId(): string;
@@ -10,40 +10,61 @@ import { randomUUID } from 'crypto';
10
10
  import { GEMINI_DIR } from './paths.js';
11
11
  const homeDir = os.homedir() ?? '';
12
12
  const geminiDir = path.join(homeDir, GEMINI_DIR);
13
- const userIdFile = path.join(geminiDir, 'user_id');
13
+ const installationIdFile = path.join(geminiDir, 'installation_id');
14
14
  function ensureGeminiDirExists() {
15
15
  if (!fs.existsSync(geminiDir)) {
16
16
  fs.mkdirSync(geminiDir, { recursive: true });
17
17
  }
18
18
  }
19
- function readUserIdFromFile() {
20
- if (fs.existsSync(userIdFile)) {
21
- const userId = fs.readFileSync(userIdFile, 'utf-8').trim();
22
- return userId || null;
19
+ function readInstallationIdFromFile() {
20
+ if (fs.existsSync(installationIdFile)) {
21
+ const installationid = fs.readFileSync(installationIdFile, 'utf-8').trim();
22
+ return installationid || null;
23
23
  }
24
24
  return null;
25
25
  }
26
- function writeUserIdToFile(userId) {
27
- fs.writeFileSync(userIdFile, userId, 'utf-8');
26
+ function writeInstallationIdToFile(installationId) {
27
+ fs.writeFileSync(installationIdFile, installationId, 'utf-8');
28
28
  }
29
29
  /**
30
- * Retrieves the persistent user ID from a file, creating it if it doesn't exist.
31
- * This ID is used for unique user tracking.
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
32
  * @returns A UUID string for the user.
33
33
  */
34
- export function getPersistentUserId() {
34
+ export function getInstallationId() {
35
35
  try {
36
36
  ensureGeminiDirExists();
37
- let userId = readUserIdFromFile();
38
- if (!userId) {
39
- userId = randomUUID();
40
- writeUserIdToFile(userId);
37
+ let installationId = readInstallationIdFromFile();
38
+ if (!installationId) {
39
+ installationId = randomUUID();
40
+ writeInstallationIdToFile(installationId);
41
41
  }
42
- return userId;
42
+ return installationId;
43
43
  }
44
44
  catch (error) {
45
- console.error('Error accessing persistent user ID file, generating ephemeral ID:', error);
45
+ console.error('Error accessing installation ID file, generating ephemeral ID:', error);
46
46
  return '123456789';
47
47
  }
48
48
  }
49
+ /**
50
+ * Retrieves the obfuscated Google Account ID for the currently authenticated user.
51
+ * When OAuth is available, returns the user's cached Google Account ID. Otherwise, returns the installation ID.
52
+ * @returns A string ID for the user (Google Account ID if available, otherwise installation ID).
53
+ */
54
+ export function getObfuscatedGoogleAccountId() {
55
+ // Try to get cached Google Account ID first
56
+ try {
57
+ // Dynamically import to avoid circular dependencies
58
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, no-restricted-syntax
59
+ const { getCachedGoogleAccountId } = require('../code_assist/oauth2.js');
60
+ const googleAccountId = getCachedGoogleAccountId();
61
+ if (googleAccountId) {
62
+ return googleAccountId;
63
+ }
64
+ }
65
+ catch (_error) {
66
+ // If there's any error accessing Google Account ID, just return empty string
67
+ }
68
+ return '';
69
+ }
49
70
  //# sourceMappingURL=user_id.js.map
@@ -1 +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,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAEnD,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,kBAAkB;IACzB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,OAAO,MAAM,IAAI,IAAI,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACH,qBAAqB,EAAE,CAAC;QACxB,IAAI,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAElC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,UAAU,EAAE,CAAC;YACtB,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,mEAAmE,EACnE,KAAK,CACN,CAAC;QACF,OAAO,WAAW,CAAC;IACrB,CAAC;AACH,CAAC"}
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;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B;IAC1C,4CAA4C;IAC5C,IAAI,CAAC;QACH,oDAAoD;QACpD,uFAAuF;QACvF,MAAM,EAAE,wBAAwB,EAAE,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACzE,MAAM,eAAe,GAAG,wBAAwB,EAAE,CAAC;QACnD,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,eAAe,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,OAAO,MAAM,EAAE,CAAC;QAChB,6EAA6E;IAC/E,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ export {};
@@ -0,0 +1,38 @@
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, getObfuscatedGoogleAccountId } 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
+ describe('getObfuscatedGoogleAccountId', () => {
21
+ it('should return a non-empty string', () => {
22
+ const result = getObfuscatedGoogleAccountId();
23
+ expect(result).toBeDefined();
24
+ expect(typeof result).toBe('string');
25
+ // Should be consistent on subsequent calls
26
+ const secondCall = getObfuscatedGoogleAccountId();
27
+ expect(secondCall).toBe(result);
28
+ });
29
+ it('should return empty string when no Google Account ID is cached', () => {
30
+ // In a clean test environment, there should be no cached Google Account ID
31
+ // so getObfuscatedGoogleAccountId should fall back to installation ID
32
+ const googleAccountIdResult = getObfuscatedGoogleAccountId();
33
+ // They should be the same when no Google Account ID is cached
34
+ expect(googleAccountIdResult).toBe('');
35
+ });
36
+ });
37
+ });
38
+ //# 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,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAE/E,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;IAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAC5C,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,MAAM,GAAG,4BAA4B,EAAE,CAAC;YAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAErC,2CAA2C;YAC3C,MAAM,UAAU,GAAG,4BAA4B,EAAE,CAAC;YAClD,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,2EAA2E;YAC3E,sEAAsE;YACtE,MAAM,qBAAqB,GAAG,4BAA4B,EAAE,CAAC;YAE7D,8DAA8D;YAC9D,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}