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

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 (258) hide show
  1. package/README.md +7 -5
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.js +2 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/agents/subagent-tool-wrapper.test.js +2 -4
  6. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
  7. package/dist/src/code_assist/oauth2.d.ts +2 -2
  8. package/dist/src/code_assist/oauth2.js +53 -41
  9. package/dist/src/code_assist/oauth2.js.map +1 -1
  10. package/dist/src/code_assist/oauth2.test.js +65 -33
  11. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  12. package/dist/src/code_assist/server.d.ts +3 -3
  13. package/dist/src/code_assist/server.js.map +1 -1
  14. package/dist/src/code_assist/setup.d.ts +2 -2
  15. package/dist/src/code_assist/setup.js.map +1 -1
  16. package/dist/src/config/config.d.ts +12 -3
  17. package/dist/src/config/config.js +35 -9
  18. package/dist/src/config/config.js.map +1 -1
  19. package/dist/src/config/config.test.js +58 -21
  20. package/dist/src/config/config.test.js.map +1 -1
  21. package/dist/src/config/storage.d.ts +1 -0
  22. package/dist/src/config/storage.js +3 -0
  23. package/dist/src/config/storage.js.map +1 -1
  24. package/dist/src/core/client.d.ts +1 -11
  25. package/dist/src/core/client.js +17 -165
  26. package/dist/src/core/client.js.map +1 -1
  27. package/dist/src/core/client.test.js +70 -405
  28. package/dist/src/core/client.test.js.map +1 -1
  29. package/dist/src/core/contentGenerator.js +39 -28
  30. package/dist/src/core/contentGenerator.js.map +1 -1
  31. package/dist/src/core/contentGenerator.test.js +28 -0
  32. package/dist/src/core/contentGenerator.test.js.map +1 -1
  33. package/dist/src/core/coreToolScheduler.d.ts +7 -7
  34. package/dist/src/core/coreToolScheduler.js +312 -183
  35. package/dist/src/core/coreToolScheduler.js.map +1 -1
  36. package/dist/src/core/coreToolScheduler.test.js +239 -9
  37. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  38. package/dist/src/core/fakeContentGenerator.d.ts +33 -0
  39. package/dist/src/core/fakeContentGenerator.js +58 -0
  40. package/dist/src/core/fakeContentGenerator.js.map +1 -0
  41. package/dist/src/core/fakeContentGenerator.test.d.ts +6 -0
  42. package/dist/src/core/fakeContentGenerator.test.js +127 -0
  43. package/dist/src/core/fakeContentGenerator.test.js.map +1 -0
  44. package/dist/src/core/loggingContentGenerator.d.ts +1 -0
  45. package/dist/src/core/loggingContentGenerator.js +113 -33
  46. package/dist/src/core/loggingContentGenerator.js.map +1 -1
  47. package/dist/src/core/nonInteractiveToolExecutor.js +5 -4
  48. package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
  49. package/dist/src/core/prompts.test.js +30 -108
  50. package/dist/src/core/prompts.test.js.map +1 -1
  51. package/dist/src/core/recordingContentGenerator.d.ts +18 -0
  52. package/dist/src/core/recordingContentGenerator.js +77 -0
  53. package/dist/src/core/recordingContentGenerator.js.map +1 -0
  54. package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
  55. package/dist/src/core/recordingContentGenerator.test.js +101 -0
  56. package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
  57. package/dist/src/fallback/handler.js +2 -0
  58. package/dist/src/fallback/handler.js.map +1 -1
  59. package/dist/src/generated/git-commit.d.ts +2 -2
  60. package/dist/src/generated/git-commit.js +2 -2
  61. package/dist/src/generated/git-commit.js.map +1 -1
  62. package/dist/src/index.d.ts +3 -0
  63. package/dist/src/index.js +3 -0
  64. package/dist/src/index.js.map +1 -1
  65. package/dist/src/mcp/google-auth-provider.d.ts +2 -0
  66. package/dist/src/mcp/google-auth-provider.js +19 -2
  67. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  68. package/dist/src/mcp/google-auth-provider.test.js +42 -9
  69. package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
  70. package/dist/src/mcp/oauth-provider.js +2 -2
  71. package/dist/src/mcp/oauth-provider.js.map +1 -1
  72. package/dist/src/mcp/oauth-provider.test.js +130 -0
  73. package/dist/src/mcp/oauth-provider.test.js.map +1 -1
  74. package/dist/src/mcp/oauth-token-storage.js +5 -4
  75. package/dist/src/mcp/oauth-token-storage.js.map +1 -1
  76. package/dist/src/mcp/oauth-token-storage.test.js +17 -11
  77. package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
  78. package/dist/src/mcp/oauth-utils.d.ts +7 -0
  79. package/dist/src/mcp/oauth-utils.js +19 -0
  80. package/dist/src/mcp/oauth-utils.js.map +1 -1
  81. package/dist/src/mcp/oauth-utils.test.js +32 -0
  82. package/dist/src/mcp/oauth-utils.test.js.map +1 -1
  83. package/dist/src/mcp/sa-impersonation-provider.d.ts +0 -6
  84. package/dist/src/mcp/sa-impersonation-provider.js +6 -23
  85. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
  86. package/dist/src/mcp/token-storage/base-token-storage.test.js +75 -84
  87. package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
  88. package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
  89. package/dist/src/mcp/token-storage/keychain-token-storage.js +62 -6
  90. package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
  91. package/dist/src/mcp/token-storage/keychain-token-storage.test.js +54 -3
  92. package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
  93. package/dist/src/mcp/token-storage/types.d.ts +6 -0
  94. package/dist/src/mcp/token-storage/types.js.map +1 -1
  95. package/dist/src/policy/policy-engine.js +4 -0
  96. package/dist/src/policy/policy-engine.js.map +1 -1
  97. package/dist/src/services/chatCompressionService.d.ts +32 -0
  98. package/dist/src/services/chatCompressionService.js +164 -0
  99. package/dist/src/services/chatCompressionService.js.map +1 -0
  100. package/dist/src/services/chatCompressionService.test.d.ts +6 -0
  101. package/dist/src/services/chatCompressionService.test.js +211 -0
  102. package/dist/src/services/chatCompressionService.test.js.map +1 -0
  103. package/dist/src/services/fileDiscoveryService.d.ts +0 -8
  104. package/dist/src/services/fileDiscoveryService.js +5 -33
  105. package/dist/src/services/fileDiscoveryService.js.map +1 -1
  106. package/dist/src/services/fileDiscoveryService.test.js +11 -11
  107. package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
  108. package/dist/src/services/loopDetectionService.js +19 -9
  109. package/dist/src/services/loopDetectionService.js.map +1 -1
  110. package/dist/src/services/loopDetectionService.test.js +40 -11
  111. package/dist/src/services/loopDetectionService.test.js.map +1 -1
  112. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +1 -0
  113. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +40 -33
  114. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  115. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +1 -1
  116. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  117. package/dist/src/telemetry/index.d.ts +1 -0
  118. package/dist/src/telemetry/index.js +1 -0
  119. package/dist/src/telemetry/index.js.map +1 -1
  120. package/dist/src/telemetry/loggers.js +10 -17
  121. package/dist/src/telemetry/loggers.js.map +1 -1
  122. package/dist/src/telemetry/loggers.test.js +173 -30
  123. package/dist/src/telemetry/loggers.test.js.map +1 -1
  124. package/dist/src/telemetry/metrics.d.ts +1 -1
  125. package/dist/src/telemetry/metrics.js +1 -1
  126. package/dist/src/telemetry/metrics.js.map +1 -1
  127. package/dist/src/telemetry/metrics.test.js +2 -2
  128. package/dist/src/telemetry/metrics.test.js.map +1 -1
  129. package/dist/src/telemetry/semantic.d.ts +82 -0
  130. package/dist/src/telemetry/semantic.js +269 -0
  131. package/dist/src/telemetry/semantic.js.map +1 -0
  132. package/dist/src/telemetry/semantic.test.d.ts +6 -0
  133. package/dist/src/telemetry/semantic.test.js +387 -0
  134. package/dist/src/telemetry/semantic.test.js.map +1 -0
  135. package/dist/src/telemetry/trace.d.ts +46 -0
  136. package/dist/src/telemetry/trace.js +121 -0
  137. package/dist/src/telemetry/trace.js.map +1 -0
  138. package/dist/src/telemetry/types.d.ts +37 -18
  139. package/dist/src/telemetry/types.js +107 -36
  140. package/dist/src/telemetry/types.js.map +1 -1
  141. package/dist/src/telemetry/uiTelemetry.js +6 -6
  142. package/dist/src/telemetry/uiTelemetry.js.map +1 -1
  143. package/dist/src/telemetry/uiTelemetry.test.js +88 -66
  144. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  145. package/dist/src/tools/edit.d.ts +3 -2
  146. package/dist/src/tools/edit.js +15 -11
  147. package/dist/src/tools/edit.js.map +1 -1
  148. package/dist/src/tools/edit.test.js +19 -0
  149. package/dist/src/tools/edit.test.js.map +1 -1
  150. package/dist/src/tools/glob.js +4 -2
  151. package/dist/src/tools/glob.js.map +1 -1
  152. package/dist/src/tools/glob.test.js +203 -199
  153. package/dist/src/tools/glob.test.js.map +1 -1
  154. package/dist/src/tools/grep.js +2 -2
  155. package/dist/src/tools/grep.js.map +1 -1
  156. package/dist/src/tools/ls.js +2 -1
  157. package/dist/src/tools/ls.js.map +1 -1
  158. package/dist/src/tools/ls.test.js +0 -7
  159. package/dist/src/tools/ls.test.js.map +1 -1
  160. package/dist/src/tools/mcp-client-manager.js +2 -1
  161. package/dist/src/tools/mcp-client-manager.js.map +1 -1
  162. package/dist/src/tools/mcp-client.d.ts +4 -1
  163. package/dist/src/tools/mcp-client.js +71 -92
  164. package/dist/src/tools/mcp-client.js.map +1 -1
  165. package/dist/src/tools/mcp-client.test.js +16 -6
  166. package/dist/src/tools/mcp-client.test.js.map +1 -1
  167. package/dist/src/tools/mcp-tool.d.ts +3 -2
  168. package/dist/src/tools/mcp-tool.js +12 -10
  169. package/dist/src/tools/mcp-tool.js.map +1 -1
  170. package/dist/src/tools/memoryTool.d.ts +5 -3
  171. package/dist/src/tools/memoryTool.js +9 -7
  172. package/dist/src/tools/memoryTool.js.map +1 -1
  173. package/dist/src/tools/read-file.js +7 -3
  174. package/dist/src/tools/read-file.js.map +1 -1
  175. package/dist/src/tools/read-file.test.js +25 -2
  176. package/dist/src/tools/read-file.test.js.map +1 -1
  177. package/dist/src/tools/shell.d.ts +6 -4
  178. package/dist/src/tools/shell.js +18 -12
  179. package/dist/src/tools/shell.js.map +1 -1
  180. package/dist/src/tools/shell.test.js +7 -0
  181. package/dist/src/tools/shell.test.js.map +1 -1
  182. package/dist/src/tools/smart-edit.d.ts +2 -1
  183. package/dist/src/tools/smart-edit.js +10 -9
  184. package/dist/src/tools/smart-edit.js.map +1 -1
  185. package/dist/src/tools/tool-registry.d.ts +5 -1
  186. package/dist/src/tools/tool-registry.js +10 -3
  187. package/dist/src/tools/tool-registry.js.map +1 -1
  188. package/dist/src/tools/tools.d.ts +6 -0
  189. package/dist/src/tools/tools.js +29 -17
  190. package/dist/src/tools/tools.js.map +1 -1
  191. package/dist/src/tools/web-fetch.js +1 -12
  192. package/dist/src/tools/web-fetch.js.map +1 -1
  193. package/dist/src/tools/web-fetch.test.js +2 -2
  194. package/dist/src/tools/web-fetch.test.js.map +1 -1
  195. package/dist/src/tools/write-file.d.ts +2 -1
  196. package/dist/src/tools/write-file.js +6 -6
  197. package/dist/src/tools/write-file.js.map +1 -1
  198. package/dist/src/tools/write-todos.d.ts +2 -1
  199. package/dist/src/tools/write-todos.js +5 -2
  200. package/dist/src/tools/write-todos.js.map +1 -1
  201. package/dist/src/utils/environmentContext.d.ts +2 -1
  202. package/dist/src/utils/environmentContext.js +18 -0
  203. package/dist/src/utils/environmentContext.js.map +1 -1
  204. package/dist/src/utils/errorParsing.d.ts +1 -1
  205. package/dist/src/utils/errorParsing.js +5 -33
  206. package/dist/src/utils/errorParsing.js.map +1 -1
  207. package/dist/src/utils/errorParsing.test.js +0 -88
  208. package/dist/src/utils/errorParsing.test.js.map +1 -1
  209. package/dist/src/utils/errors.d.ts +3 -0
  210. package/dist/src/utils/errors.js +6 -0
  211. package/dist/src/utils/errors.js.map +1 -1
  212. package/dist/src/utils/events.d.ts +19 -1
  213. package/dist/src/utils/events.js +9 -0
  214. package/dist/src/utils/events.js.map +1 -1
  215. package/dist/src/utils/extensionLoader.d.ts +38 -0
  216. package/dist/src/utils/extensionLoader.js +20 -0
  217. package/dist/src/utils/extensionLoader.js.map +1 -0
  218. package/dist/src/utils/flashFallback.test.js +26 -45
  219. package/dist/src/utils/flashFallback.test.js.map +1 -1
  220. package/dist/src/utils/getFolderStructure.js +7 -16
  221. package/dist/src/utils/getFolderStructure.js.map +1 -1
  222. package/dist/src/utils/googleErrors.d.ts +104 -0
  223. package/dist/src/utils/googleErrors.js +152 -0
  224. package/dist/src/utils/googleErrors.js.map +1 -0
  225. package/dist/src/utils/googleErrors.test.d.ts +6 -0
  226. package/dist/src/utils/googleErrors.test.js +301 -0
  227. package/dist/src/utils/googleErrors.test.js.map +1 -0
  228. package/dist/src/utils/googleQuotaErrors.d.ts +35 -0
  229. package/dist/src/utils/googleQuotaErrors.js +131 -0
  230. package/dist/src/utils/googleQuotaErrors.js.map +1 -0
  231. package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
  232. package/dist/src/utils/googleQuotaErrors.test.js +281 -0
  233. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
  234. package/dist/src/utils/ignorePatterns.test.js +26 -30
  235. package/dist/src/utils/ignorePatterns.test.js.map +1 -1
  236. package/dist/src/utils/memoryDiscovery.d.ts +2 -2
  237. package/dist/src/utils/memoryDiscovery.js +3 -2
  238. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  239. package/dist/src/utils/memoryDiscovery.test.js +19 -35
  240. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  241. package/dist/src/utils/paths.js +126 -26
  242. package/dist/src/utils/paths.js.map +1 -1
  243. package/dist/src/utils/paths.test.js +200 -68
  244. package/dist/src/utils/paths.test.js.map +1 -1
  245. package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
  246. package/dist/src/utils/quotaErrorDetection.js +0 -46
  247. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  248. package/dist/src/utils/retry.js +41 -145
  249. package/dist/src/utils/retry.js.map +1 -1
  250. package/dist/src/utils/retry.test.js +31 -110
  251. package/dist/src/utils/retry.test.js.map +1 -1
  252. package/dist/src/utils/shell-utils.test.js +70 -0
  253. package/dist/src/utils/shell-utils.test.js.map +1 -1
  254. package/dist/src/utils/workspaceContext.js +1 -1
  255. package/dist/src/utils/workspaceContext.js.map +1 -1
  256. package/dist/tsconfig.tsbuildinfo +1 -1
  257. package/package.json +2 -2
  258. package/dist/google-gemini-cli-core-0.12.0-nightly.20251022.0542de95.tgz +0 -0
@@ -61,6 +61,10 @@ async function readFullStructure(rootPath, options) {
61
61
  }
62
62
  const filesInCurrentDir = [];
63
63
  const subFoldersInCurrentDir = [];
64
+ const filterFileOptions = {
65
+ respectGitIgnore: options.fileFilteringOptions?.respectGitIgnore,
66
+ respectGeminiIgnore: options.fileFilteringOptions?.respectGeminiIgnore,
67
+ };
64
68
  // Process files first in the current directory
65
69
  for (const entry of entries) {
66
70
  if (entry.isFile()) {
@@ -70,14 +74,8 @@ async function readFullStructure(rootPath, options) {
70
74
  }
71
75
  const fileName = entry.name;
72
76
  const filePath = path.join(currentPath, fileName);
73
- if (options.fileService) {
74
- const shouldIgnore = (options.fileFilteringOptions.respectGitIgnore &&
75
- options.fileService.shouldGitIgnoreFile(filePath)) ||
76
- (options.fileFilteringOptions.respectGeminiIgnore &&
77
- options.fileService.shouldGeminiIgnoreFile(filePath));
78
- if (shouldIgnore) {
79
- continue;
80
- }
77
+ if (options.fileService?.shouldIgnoreFile(filePath, filterFileOptions)) {
78
+ continue;
81
79
  }
82
80
  if (!options.fileIncludePattern ||
83
81
  options.fileIncludePattern.test(fileName)) {
@@ -103,14 +101,7 @@ async function readFullStructure(rootPath, options) {
103
101
  // This logic is tricky. Let's try a simpler: if we can't add this item, mark and break.
104
102
  const subFolderName = entry.name;
105
103
  const subFolderPath = path.join(currentPath, subFolderName);
106
- let isIgnored = false;
107
- if (options.fileService) {
108
- isIgnored =
109
- (options.fileFilteringOptions.respectGitIgnore &&
110
- options.fileService.shouldGitIgnoreFile(subFolderPath)) ||
111
- (options.fileFilteringOptions.respectGeminiIgnore &&
112
- options.fileService.shouldGeminiIgnoreFile(subFolderPath));
113
- }
104
+ const isIgnored = options.fileService?.shouldIgnoreFile(subFolderPath, filterFileOptions) ?? false;
114
105
  if (options.ignoredFolders.has(subFolderName) || isIgnored) {
115
106
  const ignoredSubFolder = {
116
107
  name: subFolderName,
@@ -1 +1 @@
1
- {"version":3,"file":"getFolderStructure.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getFolderStructure.js","sourceRoot":"","sources":["../../../src/utils/getFolderStructure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * @fileoverview
8
+ * This file contains types and functions for parsing structured Google API errors.
9
+ */
10
+ /**
11
+ * Based on google/rpc/error_details.proto
12
+ */
13
+ export interface ErrorInfo {
14
+ '@type': 'type.googleapis.com/google.rpc.ErrorInfo';
15
+ reason: string;
16
+ domain: string;
17
+ metadata: {
18
+ [key: string]: string;
19
+ };
20
+ }
21
+ export interface RetryInfo {
22
+ '@type': 'type.googleapis.com/google.rpc.RetryInfo';
23
+ retryDelay: string;
24
+ }
25
+ export interface DebugInfo {
26
+ '@type': 'type.googleapis.com/google.rpc.DebugInfo';
27
+ stackEntries: string[];
28
+ detail: string;
29
+ }
30
+ export interface QuotaFailure {
31
+ '@type': 'type.googleapis.com/google.rpc.QuotaFailure';
32
+ violations: Array<{
33
+ subject?: string;
34
+ description?: string;
35
+ apiService?: string;
36
+ quotaMetric?: string;
37
+ quotaId?: string;
38
+ quotaDimensions?: {
39
+ [key: string]: string;
40
+ };
41
+ quotaValue?: string | number;
42
+ futureQuotaValue?: number;
43
+ }>;
44
+ }
45
+ export interface PreconditionFailure {
46
+ '@type': 'type.googleapis.com/google.rpc.PreconditionFailure';
47
+ violations: Array<{
48
+ type: string;
49
+ subject: string;
50
+ description: string;
51
+ }>;
52
+ }
53
+ export interface LocalizedMessage {
54
+ '@type': 'type.googleapis.com/google.rpc.LocalizedMessage';
55
+ locale: string;
56
+ message: string;
57
+ }
58
+ export interface BadRequest {
59
+ '@type': 'type.googleapis.com/google.rpc.BadRequest';
60
+ fieldViolations: Array<{
61
+ field: string;
62
+ description: string;
63
+ reason?: string;
64
+ localizedMessage?: LocalizedMessage;
65
+ }>;
66
+ }
67
+ export interface RequestInfo {
68
+ '@type': 'type.googleapis.com/google.rpc.RequestInfo';
69
+ requestId: string;
70
+ servingData: string;
71
+ }
72
+ export interface ResourceInfo {
73
+ '@type': 'type.googleapis.com/google.rpc.ResourceInfo';
74
+ resourceType: string;
75
+ resourceName: string;
76
+ owner: string;
77
+ description: string;
78
+ }
79
+ export interface Help {
80
+ '@type': 'type.googleapis.com/google.rpc.Help';
81
+ links: Array<{
82
+ description: string;
83
+ url: string;
84
+ }>;
85
+ }
86
+ export type GoogleApiErrorDetail = ErrorInfo | RetryInfo | DebugInfo | QuotaFailure | PreconditionFailure | BadRequest | RequestInfo | ResourceInfo | Help | LocalizedMessage;
87
+ export interface GoogleApiError {
88
+ code: number;
89
+ message: string;
90
+ details: GoogleApiErrorDetail[];
91
+ }
92
+ /**
93
+ * Parses an error object to check if it's a structured Google API error
94
+ * and extracts all details.
95
+ *
96
+ * This function can handle two formats:
97
+ * 1. Standard Google API errors where `details` is a top-level field.
98
+ * 2. Errors where the entire structured error object is stringified inside
99
+ * the `message` field of a wrapper error.
100
+ *
101
+ * @param error The error object to inspect.
102
+ * @returns A GoogleApiError object if the error matches, otherwise null.
103
+ */
104
+ export declare function parseGoogleApiError(error: unknown): GoogleApiError | null;
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Parses an error object to check if it's a structured Google API error
8
+ * and extracts all details.
9
+ *
10
+ * This function can handle two formats:
11
+ * 1. Standard Google API errors where `details` is a top-level field.
12
+ * 2. Errors where the entire structured error object is stringified inside
13
+ * the `message` field of a wrapper error.
14
+ *
15
+ * @param error The error object to inspect.
16
+ * @returns A GoogleApiError object if the error matches, otherwise null.
17
+ */
18
+ export function parseGoogleApiError(error) {
19
+ if (!error) {
20
+ return null;
21
+ }
22
+ let errorObj = error;
23
+ // If error is a string, try to parse it.
24
+ if (typeof errorObj === 'string') {
25
+ try {
26
+ errorObj = JSON.parse(errorObj);
27
+ }
28
+ catch (_) {
29
+ // Not a JSON string, can't parse.
30
+ return null;
31
+ }
32
+ }
33
+ if (Array.isArray(errorObj) && errorObj.length > 0) {
34
+ errorObj = errorObj[0];
35
+ }
36
+ if (typeof errorObj !== 'object' || errorObj === null) {
37
+ return null;
38
+ }
39
+ let currentError = fromGaxiosError(errorObj) ?? fromApiError(errorObj);
40
+ let depth = 0;
41
+ const maxDepth = 10;
42
+ // Handle cases where the actual error object is stringified inside the message
43
+ // by drilling down until we find an error that doesn't have a stringified message.
44
+ while (currentError &&
45
+ typeof currentError.message === 'string' &&
46
+ depth < maxDepth) {
47
+ try {
48
+ const parsedMessage = JSON.parse(currentError.message.replace(/\u00A0/g, '').replace(/\n/g, ' '));
49
+ if (parsedMessage.error) {
50
+ currentError = parsedMessage.error;
51
+ depth++;
52
+ }
53
+ else {
54
+ // The message is a JSON string, but not a nested error object.
55
+ break;
56
+ }
57
+ }
58
+ catch (_error) {
59
+ // It wasn't a JSON string, so we've drilled down as far as we can.
60
+ break;
61
+ }
62
+ }
63
+ if (!currentError) {
64
+ return null;
65
+ }
66
+ const code = currentError.code;
67
+ const message = currentError.message;
68
+ const errorDetails = currentError.details;
69
+ if (Array.isArray(errorDetails) && code && message) {
70
+ const details = [];
71
+ for (const detail of errorDetails) {
72
+ if (detail && typeof detail === 'object') {
73
+ const detailObj = detail;
74
+ const typeKey = Object.keys(detailObj).find((key) => key.trim() === '@type');
75
+ if (typeKey) {
76
+ if (typeKey !== '@type') {
77
+ detailObj['@type'] = detailObj[typeKey];
78
+ delete detailObj[typeKey];
79
+ }
80
+ // We can just cast it; the consumer will have to switch on @type
81
+ details.push(detailObj);
82
+ }
83
+ }
84
+ }
85
+ if (details.length > 0) {
86
+ return {
87
+ code,
88
+ message,
89
+ details,
90
+ };
91
+ }
92
+ }
93
+ return null;
94
+ }
95
+ function fromGaxiosError(errorObj) {
96
+ const gaxiosError = errorObj;
97
+ let outerError;
98
+ if (gaxiosError.response?.data) {
99
+ let data = gaxiosError.response.data;
100
+ if (typeof data === 'string') {
101
+ try {
102
+ data = JSON.parse(data);
103
+ }
104
+ catch (_) {
105
+ // Not a JSON string, can't parse.
106
+ }
107
+ }
108
+ if (Array.isArray(data) && data.length > 0) {
109
+ data = data[0];
110
+ }
111
+ if (typeof data === 'object' && data !== null) {
112
+ if ('error' in data) {
113
+ outerError = data.error;
114
+ }
115
+ }
116
+ }
117
+ if (!outerError) {
118
+ // If the gaxios structure isn't there, check for a top-level `error` property.
119
+ if (gaxiosError.error) {
120
+ outerError = gaxiosError.error;
121
+ }
122
+ else {
123
+ return undefined;
124
+ }
125
+ }
126
+ return outerError;
127
+ }
128
+ function fromApiError(errorObj) {
129
+ const apiError = errorObj;
130
+ let outerError;
131
+ if (apiError.message) {
132
+ let data = apiError.message;
133
+ if (typeof data === 'string') {
134
+ try {
135
+ data = JSON.parse(data);
136
+ }
137
+ catch (_) {
138
+ // Not a JSON string, can't parse.
139
+ }
140
+ }
141
+ if (Array.isArray(data) && data.length > 0) {
142
+ data = data[0];
143
+ }
144
+ if (typeof data === 'object' && data !== null) {
145
+ if ('error' in data) {
146
+ outerError = data.error;
147
+ }
148
+ }
149
+ }
150
+ return outerError;
151
+ }
152
+ //# sourceMappingURL=googleErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googleErrors.js","sourceRoot":"","sources":["../../../src/utils/googleErrors.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 {};
@@ -0,0 +1,301 @@
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 { parseGoogleApiError } from './googleErrors.js';
8
+ describe('parseGoogleApiError', () => {
9
+ it('should return null for non-gaxios errors', () => {
10
+ expect(parseGoogleApiError(new Error('vanilla error'))).toBeNull();
11
+ expect(parseGoogleApiError(null)).toBeNull();
12
+ expect(parseGoogleApiError({})).toBeNull();
13
+ });
14
+ it('should parse a standard gaxios error', () => {
15
+ const mockError = {
16
+ response: {
17
+ status: 429,
18
+ data: {
19
+ error: {
20
+ code: 429,
21
+ message: 'Quota exceeded',
22
+ details: [
23
+ {
24
+ '@type': 'type.googleapis.com/google.rpc.QuotaFailure',
25
+ violations: [{ subject: 'user', description: 'daily limit' }],
26
+ },
27
+ ],
28
+ },
29
+ },
30
+ },
31
+ };
32
+ const parsed = parseGoogleApiError(mockError);
33
+ expect(parsed).not.toBeNull();
34
+ expect(parsed?.code).toBe(429);
35
+ expect(parsed?.message).toBe('Quota exceeded');
36
+ expect(parsed?.details).toHaveLength(1);
37
+ const detail = parsed?.details[0];
38
+ expect(detail['@type']).toBe('type.googleapis.com/google.rpc.QuotaFailure');
39
+ expect(detail.violations[0].description).toBe('daily limit');
40
+ });
41
+ it('should parse an error with details stringified in the message', () => {
42
+ const innerError = {
43
+ error: {
44
+ code: 429,
45
+ message: 'Inner quota message',
46
+ details: [
47
+ {
48
+ '@type': 'type.googleapis.com/google.rpc.RetryInfo',
49
+ retryDelay: '10s',
50
+ },
51
+ ],
52
+ },
53
+ };
54
+ const mockError = {
55
+ response: {
56
+ status: 429,
57
+ data: {
58
+ error: {
59
+ code: 429,
60
+ message: JSON.stringify(innerError),
61
+ details: [], // Top-level details are empty
62
+ },
63
+ },
64
+ },
65
+ };
66
+ const parsed = parseGoogleApiError(mockError);
67
+ expect(parsed).not.toBeNull();
68
+ expect(parsed?.code).toBe(429);
69
+ expect(parsed?.message).toBe('Inner quota message');
70
+ expect(parsed?.details).toHaveLength(1);
71
+ expect(parsed?.details[0]['@type']).toBe('type.googleapis.com/google.rpc.RetryInfo');
72
+ });
73
+ it('should return null if details are not in the expected format', () => {
74
+ const mockError = {
75
+ response: {
76
+ status: 400,
77
+ data: {
78
+ error: {
79
+ code: 400,
80
+ message: 'Bad Request',
81
+ details: 'just a string', // Invalid details format
82
+ },
83
+ },
84
+ },
85
+ };
86
+ expect(parseGoogleApiError(mockError)).toBeNull();
87
+ });
88
+ it('should return null if there are no valid details', () => {
89
+ const mockError = {
90
+ response: {
91
+ status: 400,
92
+ data: {
93
+ error: {
94
+ code: 400,
95
+ message: 'Bad Request',
96
+ details: [
97
+ {
98
+ // missing '@type'
99
+ reason: 'some reason',
100
+ },
101
+ ],
102
+ },
103
+ },
104
+ },
105
+ };
106
+ expect(parseGoogleApiError(mockError)).toBeNull();
107
+ });
108
+ it('should parse a doubly nested error in the message', () => {
109
+ const innerError = {
110
+ error: {
111
+ code: 429,
112
+ message: 'Innermost quota message',
113
+ details: [
114
+ {
115
+ '@type': 'type.googleapis.com/google.rpc.RetryInfo',
116
+ retryDelay: '20s',
117
+ },
118
+ ],
119
+ },
120
+ };
121
+ const middleError = {
122
+ error: {
123
+ code: 429,
124
+ message: JSON.stringify(innerError),
125
+ details: [],
126
+ },
127
+ };
128
+ const mockError = {
129
+ response: {
130
+ status: 429,
131
+ data: {
132
+ error: {
133
+ code: 429,
134
+ message: JSON.stringify(middleError),
135
+ details: [],
136
+ },
137
+ },
138
+ },
139
+ };
140
+ const parsed = parseGoogleApiError(mockError);
141
+ expect(parsed).not.toBeNull();
142
+ expect(parsed?.code).toBe(429);
143
+ expect(parsed?.message).toBe('Innermost quota message');
144
+ expect(parsed?.details).toHaveLength(1);
145
+ expect(parsed?.details[0]['@type']).toBe('type.googleapis.com/google.rpc.RetryInfo');
146
+ });
147
+ it('should parse an error that is not in a response object', () => {
148
+ const innerError = {
149
+ error: {
150
+ code: 429,
151
+ message: 'Innermost quota message',
152
+ details: [
153
+ {
154
+ '@type': 'type.googleapis.com/google.rpc.RetryInfo',
155
+ retryDelay: '20s',
156
+ },
157
+ ],
158
+ },
159
+ };
160
+ const mockError = {
161
+ error: {
162
+ code: 429,
163
+ message: JSON.stringify(innerError),
164
+ details: [],
165
+ },
166
+ };
167
+ const parsed = parseGoogleApiError(mockError);
168
+ expect(parsed).not.toBeNull();
169
+ expect(parsed?.code).toBe(429);
170
+ expect(parsed?.message).toBe('Innermost quota message');
171
+ expect(parsed?.details).toHaveLength(1);
172
+ expect(parsed?.details[0]['@type']).toBe('type.googleapis.com/google.rpc.RetryInfo');
173
+ });
174
+ it('should parse an error that is a JSON string', () => {
175
+ const innerError = {
176
+ error: {
177
+ code: 429,
178
+ message: 'Innermost quota message',
179
+ details: [
180
+ {
181
+ '@type': 'type.googleapis.com/google.rpc.RetryInfo',
182
+ retryDelay: '20s',
183
+ },
184
+ ],
185
+ },
186
+ };
187
+ const mockError = {
188
+ error: {
189
+ code: 429,
190
+ message: JSON.stringify(innerError),
191
+ details: [],
192
+ },
193
+ };
194
+ const parsed = parseGoogleApiError(JSON.stringify(mockError));
195
+ expect(parsed).not.toBeNull();
196
+ expect(parsed?.code).toBe(429);
197
+ expect(parsed?.message).toBe('Innermost quota message');
198
+ expect(parsed?.details).toHaveLength(1);
199
+ expect(parsed?.details[0]['@type']).toBe('type.googleapis.com/google.rpc.RetryInfo');
200
+ });
201
+ it('should parse the user-provided nested error string', () => {
202
+ const userErrorString = '{"error":{"message":"{\\n \\"error\\": {\\n \\"code\\": 429,\\n \\"message\\": \\"You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.\\\\n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 10000\\\\nPlease retry in 40.025771073s.\\",\\n \\"status\\": \\"RESOURCE_EXHAUSTED\\",\\n \\"details\\": [\\n {\\n \\"@type\\": \\"type.googleapis.com/google.rpc.DebugInfo\\",\\n \\"detail\\": \\"[ORIGINAL ERROR] generic::resource_exhausted: You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.\\\\n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 10000\\\\nPlease retry in 40.025771073s. [google.rpc.error_details_ext] { message: \\\\\\"You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.\\\\\\\\n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count, limit: 10000\\\\\\\\nPlease retry in 40.025771073s.\\\\\\" }\\"\\n },\\n {\\n \\"@type\\": \\"type.googleapis.com/google.rpc.QuotaFailure\\",\\n \\"violations\\": [\\n {\\n \\"quotaMetric\\": \\"generativelanguage.googleapis.com/generate_content_paid_tier_input_token_count\\",\\n \\"quotaId\\": \\"GenerateContentPaidTierInputTokensPerModelPerMinute\\",\\n \\"quotaDimensions\\": {\\n \\"location\\": \\"global\\",\\n \\"model\\": \\"gemini-2.5-pro\\"\\n },\\n \\"quotaValue\\": \\"10000\\"\\n }\\n ]\\n },\\n {\\n \\"@type\\": \\"type.googleapis.com/google.rpc.Help\\",\\n \\"links\\": [\\n {\\n \\"description\\": \\"Learn more about Gemini API quotas\\",\\n \\"url\\": \\"https://ai.google.dev/gemini-api/docs/rate-limits\\"\\n }\\n ]\\n },\\n {\\n \\"@type\\": \\"type.googleapis.com/google.rpc.RetryInfo\\",\\n \\"retryDelay\\": \\"40s\\"\\n }\\n ]\\n }\\n}\\n","code":429,"status":"Too Many Requests"}}';
203
+ const parsed = parseGoogleApiError(userErrorString);
204
+ expect(parsed).not.toBeNull();
205
+ expect(parsed?.code).toBe(429);
206
+ expect(parsed?.message).toContain('You exceeded your current quota');
207
+ expect(parsed?.details).toHaveLength(4);
208
+ expect(parsed?.details.some((d) => d['@type'] === 'type.googleapis.com/google.rpc.QuotaFailure')).toBe(true);
209
+ expect(parsed?.details.some((d) => d['@type'] === 'type.googleapis.com/google.rpc.RetryInfo')).toBe(true);
210
+ });
211
+ it('should parse an error that is an array', () => {
212
+ const mockError = [
213
+ {
214
+ error: {
215
+ code: 429,
216
+ message: 'Quota exceeded',
217
+ details: [
218
+ {
219
+ '@type': 'type.googleapis.com/google.rpc.QuotaFailure',
220
+ violations: [{ subject: 'user', description: 'daily limit' }],
221
+ },
222
+ ],
223
+ },
224
+ },
225
+ ];
226
+ const parsed = parseGoogleApiError(mockError);
227
+ expect(parsed).not.toBeNull();
228
+ expect(parsed?.code).toBe(429);
229
+ expect(parsed?.message).toBe('Quota exceeded');
230
+ });
231
+ it('should parse a gaxios error where data is an array', () => {
232
+ const mockError = {
233
+ response: {
234
+ status: 429,
235
+ data: [
236
+ {
237
+ error: {
238
+ code: 429,
239
+ message: 'Quota exceeded',
240
+ details: [
241
+ {
242
+ '@type': 'type.googleapis.com/google.rpc.QuotaFailure',
243
+ violations: [{ subject: 'user', description: 'daily limit' }],
244
+ },
245
+ ],
246
+ },
247
+ },
248
+ ],
249
+ },
250
+ };
251
+ const parsed = parseGoogleApiError(mockError);
252
+ expect(parsed).not.toBeNull();
253
+ expect(parsed?.code).toBe(429);
254
+ expect(parsed?.message).toBe('Quota exceeded');
255
+ });
256
+ it('should parse a gaxios error where data is a stringified array', () => {
257
+ const mockError = {
258
+ response: {
259
+ status: 429,
260
+ data: JSON.stringify([
261
+ {
262
+ error: {
263
+ code: 429,
264
+ message: 'Quota exceeded',
265
+ details: [
266
+ {
267
+ '@type': 'type.googleapis.com/google.rpc.QuotaFailure',
268
+ violations: [{ subject: 'user', description: 'daily limit' }],
269
+ },
270
+ ],
271
+ },
272
+ },
273
+ ]),
274
+ },
275
+ };
276
+ const parsed = parseGoogleApiError(mockError);
277
+ expect(parsed).not.toBeNull();
278
+ expect(parsed?.code).toBe(429);
279
+ expect(parsed?.message).toBe('Quota exceeded');
280
+ });
281
+ it('should parse an error with a malformed @type key (returned by Gemini API)', () => {
282
+ const malformedError = {
283
+ name: 'API Error',
284
+ message: {
285
+ error: {
286
+ message: '{\n "error": {\n "code": 429,\n "message": "You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.\\n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_free_tier_requests, limit: 2\nPlease retry in 54.887755558s.",\n "status": "RESOURCE_EXHAUSTED",\n "details": [\n {\n " @type": "type.googleapis.com/google.rpc.DebugInfo",\n "detail": "[ORIGINAL ERROR] generic::resource_exhausted: You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.\\n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_free_tier_requests, limit: 2\\nPlease retry in 54.887755558s. [google.rpc.error_details_ext] { message: \\"You exceeded your current quota, please check your plan and billing details. For more information on this error, head to: https://ai.google.dev/gemini-api/docs/rate-limits.\\\\n* Quota exceeded for metric: generativelanguage.googleapis.com/generate_content_free_tier_requests, limit: 2\\\\nPlease retry in 54.887755558s.\\" }"\n },\n {\n" @type": "type.googleapis.com/google.rpc.QuotaFailure",\n "violations": [\n {\n "quotaMetric": "generativelanguage.googleapis.com/generate_content_free_tier_requests",\n "quotaId": "GenerateRequestsPerMinutePerProjectPerModel-FreeTier",\n "quotaDimensions": {\n "location": "global",\n"model": "gemini-2.5-pro"\n },\n "quotaValue": "2"\n }\n ]\n },\n {\n" @type": "type.googleapis.com/google.rpc.Help",\n "links": [\n {\n "description": "Learn more about Gemini API quotas",\n "url": "https://ai.google.dev/gemini-api/docs/rate-limits"\n }\n ]\n },\n {\n" @type": "type.googleapis.com/google.rpc.RetryInfo",\n "retryDelay": "54s"\n }\n ]\n }\n}\n',
287
+ code: 429,
288
+ status: 'Too Many Requests',
289
+ },
290
+ },
291
+ };
292
+ const parsed = parseGoogleApiError(malformedError);
293
+ expect(parsed).not.toBeNull();
294
+ expect(parsed?.code).toBe(429);
295
+ expect(parsed?.message).toContain('You exceeded your current quota');
296
+ expect(parsed?.details).toHaveLength(4);
297
+ expect(parsed?.details.some((d) => d['@type'] === 'type.googleapis.com/google.rpc.QuotaFailure')).toBe(true);
298
+ expect(parsed?.details.some((d) => d['@type'] === 'type.googleapis.com/google.rpc.RetryInfo')).toBe(true);
299
+ });
300
+ });
301
+ //# sourceMappingURL=googleErrors.test.js.map