@google/gemini-cli-core 0.10.0-nightly.20250926.1487841d → 0.10.0-nightly.20251009.ae02236c

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 (252) hide show
  1. package/README.md +108 -71
  2. package/dist/index.d.ts +2 -0
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/agents/codebase-investigator.d.ts +46 -0
  6. package/dist/src/agents/codebase-investigator.js +136 -0
  7. package/dist/src/agents/codebase-investigator.js.map +1 -0
  8. package/dist/src/agents/executor.d.ts +92 -0
  9. package/dist/src/agents/executor.js +580 -0
  10. package/dist/src/agents/executor.js.map +1 -0
  11. package/dist/src/agents/executor.test.d.ts +6 -0
  12. package/dist/src/agents/executor.test.js +595 -0
  13. package/dist/src/agents/executor.test.js.map +1 -0
  14. package/dist/src/agents/invocation.d.ts +46 -0
  15. package/dist/src/agents/invocation.js +102 -0
  16. package/dist/src/agents/invocation.js.map +1 -0
  17. package/dist/src/agents/invocation.test.d.ts +6 -0
  18. package/dist/src/agents/invocation.test.js +215 -0
  19. package/dist/src/agents/invocation.test.js.map +1 -0
  20. package/dist/src/agents/registry.d.ts +36 -0
  21. package/dist/src/agents/registry.js +60 -0
  22. package/dist/src/agents/registry.js.map +1 -0
  23. package/dist/src/agents/registry.test.d.ts +6 -0
  24. package/dist/src/agents/registry.test.js +146 -0
  25. package/dist/src/agents/registry.test.js.map +1 -0
  26. package/dist/src/agents/schema-utils.d.ts +39 -0
  27. package/dist/src/agents/schema-utils.js +57 -0
  28. package/dist/src/agents/schema-utils.js.map +1 -0
  29. package/dist/src/agents/schema-utils.test.d.ts +6 -0
  30. package/dist/src/agents/schema-utils.test.js +144 -0
  31. package/dist/src/agents/schema-utils.test.js.map +1 -0
  32. package/dist/src/agents/subagent-tool-wrapper.d.ts +38 -0
  33. package/dist/src/agents/subagent-tool-wrapper.js +48 -0
  34. package/dist/src/agents/subagent-tool-wrapper.js.map +1 -0
  35. package/dist/src/agents/subagent-tool-wrapper.test.d.ts +6 -0
  36. package/dist/src/agents/subagent-tool-wrapper.test.js +112 -0
  37. package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -0
  38. package/dist/src/agents/types.d.ts +145 -0
  39. package/dist/src/agents/types.js +18 -0
  40. package/dist/src/agents/types.js.map +1 -0
  41. package/dist/src/agents/utils.d.ts +15 -0
  42. package/dist/src/agents/utils.js +29 -0
  43. package/dist/src/agents/utils.js.map +1 -0
  44. package/dist/src/agents/utils.test.d.ts +6 -0
  45. package/dist/src/agents/utils.test.js +87 -0
  46. package/dist/src/agents/utils.test.js.map +1 -0
  47. package/dist/src/code_assist/setup.js +4 -2
  48. package/dist/src/code_assist/setup.js.map +1 -1
  49. package/dist/src/config/config.d.ts +28 -5
  50. package/dist/src/config/config.js +61 -7
  51. package/dist/src/config/config.js.map +1 -1
  52. package/dist/src/config/config.test.js +63 -0
  53. package/dist/src/config/config.test.js.map +1 -1
  54. package/dist/src/core/baseLlmClient.js +19 -21
  55. package/dist/src/core/baseLlmClient.js.map +1 -1
  56. package/dist/src/core/baseLlmClient.test.js +57 -17
  57. package/dist/src/core/baseLlmClient.test.js.map +1 -1
  58. package/dist/src/core/client.d.ts +2 -0
  59. package/dist/src/core/client.js +52 -43
  60. package/dist/src/core/client.js.map +1 -1
  61. package/dist/src/core/client.test.js +300 -95
  62. package/dist/src/core/client.test.js.map +1 -1
  63. package/dist/src/core/contentGenerator.js +3 -1
  64. package/dist/src/core/contentGenerator.js.map +1 -1
  65. package/dist/src/core/coreToolScheduler.test.js +33 -23
  66. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  67. package/dist/src/core/geminiChat.d.ts +6 -0
  68. package/dist/src/core/geminiChat.js +21 -18
  69. package/dist/src/core/geminiChat.js.map +1 -1
  70. package/dist/src/core/geminiChat.test.js +20 -19
  71. package/dist/src/core/geminiChat.test.js.map +1 -1
  72. package/dist/src/core/nonInteractiveToolExecutor.test.js +11 -11
  73. package/dist/src/core/nonInteractiveToolExecutor.test.js.map +1 -1
  74. package/dist/src/core/prompts.d.ts +2 -1
  75. package/dist/src/core/prompts.js +88 -15
  76. package/dist/src/core/prompts.js.map +1 -1
  77. package/dist/src/core/prompts.test.js +73 -24
  78. package/dist/src/core/prompts.test.js.map +1 -1
  79. package/dist/src/core/turn.d.ts +10 -2
  80. package/dist/src/core/turn.js +6 -1
  81. package/dist/src/core/turn.js.map +1 -1
  82. package/dist/src/core/turn.test.js +1 -1
  83. package/dist/src/core/turn.test.js.map +1 -1
  84. package/dist/src/generated/git-commit.d.ts +2 -2
  85. package/dist/src/generated/git-commit.js +2 -2
  86. package/dist/src/ide/detect-ide.d.ts +1 -0
  87. package/dist/src/ide/detect-ide.js +4 -1
  88. package/dist/src/ide/detect-ide.js.map +1 -1
  89. package/dist/src/ide/detect-ide.test.js +11 -0
  90. package/dist/src/ide/detect-ide.test.js.map +1 -1
  91. package/dist/src/ide/ide-client.js +3 -3
  92. package/dist/src/ide/ide-client.test.js +4 -4
  93. package/dist/src/ide/ide-installer.js +1 -1
  94. package/dist/src/ide/ide-installer.js.map +1 -1
  95. package/dist/src/ide/ide-installer.test.js +13 -1
  96. package/dist/src/ide/ide-installer.test.js.map +1 -1
  97. package/dist/src/index.d.ts +1 -0
  98. package/dist/src/index.js +1 -0
  99. package/dist/src/index.js.map +1 -1
  100. package/dist/src/mcp/sa-impersonation-provider.d.ts +33 -0
  101. package/dist/src/mcp/sa-impersonation-provider.js +130 -0
  102. package/dist/src/mcp/sa-impersonation-provider.js.map +1 -0
  103. package/dist/src/mcp/sa-impersonation-provider.test.d.ts +6 -0
  104. package/dist/src/mcp/sa-impersonation-provider.test.js +117 -0
  105. package/dist/src/mcp/sa-impersonation-provider.test.js.map +1 -0
  106. package/dist/src/services/chatRecordingService.d.ts +2 -1
  107. package/dist/src/services/chatRecordingService.js +2 -1
  108. package/dist/src/services/chatRecordingService.js.map +1 -1
  109. package/dist/src/services/fileSystemService.d.ts +9 -0
  110. package/dist/src/services/fileSystemService.js +11 -0
  111. package/dist/src/services/fileSystemService.js.map +1 -1
  112. package/dist/src/services/shellExecutionService.d.ts +2 -0
  113. package/dist/src/services/shellExecutionService.js +48 -7
  114. package/dist/src/services/shellExecutionService.js.map +1 -1
  115. package/dist/src/services/shellExecutionService.test.js +13 -4
  116. package/dist/src/services/shellExecutionService.test.js.map +1 -1
  117. package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +12 -2
  118. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +79 -9
  119. package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
  120. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +99 -1
  121. package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
  122. package/dist/src/telemetry/clearcut-logger/event-metadata-key.d.ts +11 -3
  123. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js +27 -4
  124. package/dist/src/telemetry/clearcut-logger/event-metadata-key.js.map +1 -1
  125. package/dist/src/telemetry/constants.d.ts +6 -24
  126. package/dist/src/telemetry/constants.js +7 -25
  127. package/dist/src/telemetry/constants.js.map +1 -1
  128. package/dist/src/telemetry/index.d.ts +5 -3
  129. package/dist/src/telemetry/index.js +10 -3
  130. package/dist/src/telemetry/index.js.map +1 -1
  131. package/dist/src/telemetry/loggers.d.ts +6 -1
  132. package/dist/src/telemetry/loggers.js +132 -12
  133. package/dist/src/telemetry/loggers.js.map +1 -1
  134. package/dist/src/telemetry/loggers.test.circular.js +3 -3
  135. package/dist/src/telemetry/loggers.test.circular.js.map +1 -1
  136. package/dist/src/telemetry/loggers.test.js +160 -13
  137. package/dist/src/telemetry/loggers.test.js.map +1 -1
  138. package/dist/src/telemetry/memory-monitor.d.ts +149 -0
  139. package/dist/src/telemetry/memory-monitor.js +335 -0
  140. package/dist/src/telemetry/memory-monitor.js.map +1 -0
  141. package/dist/src/telemetry/memory-monitor.test.d.ts +6 -0
  142. package/dist/src/telemetry/memory-monitor.test.js +472 -0
  143. package/dist/src/telemetry/memory-monitor.test.js.map +1 -0
  144. package/dist/src/telemetry/metrics.d.ts +392 -20
  145. package/dist/src/telemetry/metrics.js +463 -235
  146. package/dist/src/telemetry/metrics.js.map +1 -1
  147. package/dist/src/telemetry/metrics.test.js +391 -55
  148. package/dist/src/telemetry/metrics.test.js.map +1 -1
  149. package/dist/src/telemetry/types.d.ts +37 -1
  150. package/dist/src/telemetry/types.js +60 -0
  151. package/dist/src/telemetry/types.js.map +1 -1
  152. package/dist/src/telemetry/uiTelemetry.test.js +2 -2
  153. package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
  154. package/dist/src/test-utils/mock-tool.d.ts +28 -3
  155. package/dist/src/test-utils/mock-tool.js +71 -1
  156. package/dist/src/test-utils/mock-tool.js.map +1 -1
  157. package/dist/src/tools/glob.js +2 -1
  158. package/dist/src/tools/glob.js.map +1 -1
  159. package/dist/src/tools/mcp-client.d.ts +3 -2
  160. package/dist/src/tools/mcp-client.js +44 -30
  161. package/dist/src/tools/mcp-client.js.map +1 -1
  162. package/dist/src/tools/mcp-client.test.js +168 -5
  163. package/dist/src/tools/mcp-client.test.js.map +1 -1
  164. package/dist/src/tools/shell.js +2 -2
  165. package/dist/src/tools/shell.js.map +1 -1
  166. package/dist/src/tools/shell.test.js +1 -1
  167. package/dist/src/tools/shell.test.js.map +1 -1
  168. package/dist/src/tools/smart-edit.d.ts +1 -1
  169. package/dist/src/tools/smart-edit.js +114 -10
  170. package/dist/src/tools/smart-edit.js.map +1 -1
  171. package/dist/src/tools/smart-edit.test.js +91 -29
  172. package/dist/src/tools/smart-edit.test.js.map +1 -1
  173. package/dist/src/tools/tool-names.d.ts +8 -0
  174. package/dist/src/tools/tool-names.js +17 -0
  175. package/dist/src/tools/tool-names.js.map +1 -0
  176. package/dist/src/tools/tool-registry.test.js +10 -10
  177. package/dist/src/tools/tool-registry.test.js.map +1 -1
  178. package/dist/src/tools/web-fetch.js +3 -0
  179. package/dist/src/tools/web-fetch.js.map +1 -1
  180. package/dist/src/tools/web-fetch.test.js +44 -0
  181. package/dist/src/tools/web-fetch.test.js.map +1 -1
  182. package/dist/src/tools/write-file.js +2 -1
  183. package/dist/src/tools/write-file.js.map +1 -1
  184. package/dist/src/tools/write-todos.d.ts +1 -1
  185. package/dist/src/tools/write-todos.js +4 -3
  186. package/dist/src/tools/write-todos.js.map +1 -1
  187. package/dist/src/utils/editCorrector.js +2 -2
  188. package/dist/src/utils/editCorrector.js.map +1 -1
  189. package/dist/src/utils/editor.js +1 -0
  190. package/dist/src/utils/editor.js.map +1 -1
  191. package/dist/src/utils/editor.test.js +1 -0
  192. package/dist/src/utils/editor.test.js.map +1 -1
  193. package/dist/src/utils/errorParsing.d.ts +1 -1
  194. package/dist/src/utils/errorParsing.js +5 -33
  195. package/dist/src/utils/errorParsing.js.map +1 -1
  196. package/dist/src/utils/errorParsing.test.js +0 -88
  197. package/dist/src/utils/errorParsing.test.js.map +1 -1
  198. package/dist/src/utils/flashFallback.test.js +26 -45
  199. package/dist/src/utils/flashFallback.test.js.map +1 -1
  200. package/dist/src/utils/formatters.d.ts +1 -0
  201. package/dist/src/utils/formatters.js +2 -1
  202. package/dist/src/utils/formatters.js.map +1 -1
  203. package/dist/src/utils/formatters.test.d.ts +6 -0
  204. package/dist/src/utils/formatters.test.js +26 -0
  205. package/dist/src/utils/formatters.test.js.map +1 -0
  206. package/dist/src/utils/googleErrors.d.ts +104 -0
  207. package/dist/src/utils/googleErrors.js +108 -0
  208. package/dist/src/utils/googleErrors.js.map +1 -0
  209. package/dist/src/utils/googleErrors.test.d.ts +6 -0
  210. package/dist/src/utils/googleErrors.test.js +212 -0
  211. package/dist/src/utils/googleErrors.test.js.map +1 -0
  212. package/dist/src/utils/googleQuotaErrors.d.ts +35 -0
  213. package/dist/src/utils/googleQuotaErrors.js +108 -0
  214. package/dist/src/utils/googleQuotaErrors.js.map +1 -0
  215. package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
  216. package/dist/src/utils/googleQuotaErrors.test.js +189 -0
  217. package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
  218. package/dist/src/utils/llm-edit-fixer.js +13 -4
  219. package/dist/src/utils/llm-edit-fixer.js.map +1 -1
  220. package/dist/src/utils/llm-edit-fixer.test.js +81 -0
  221. package/dist/src/utils/llm-edit-fixer.test.js.map +1 -1
  222. package/dist/src/utils/memoryDiscovery.d.ts +1 -0
  223. package/dist/src/utils/memoryDiscovery.js +2 -1
  224. package/dist/src/utils/memoryDiscovery.js.map +1 -1
  225. package/dist/src/utils/memoryDiscovery.test.js +99 -21
  226. package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
  227. package/dist/src/utils/memoryImportProcessor.js +13 -20
  228. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  229. package/dist/src/utils/memoryImportProcessor.test.js +14 -0
  230. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  231. package/dist/src/utils/pathCorrector.d.ts +25 -0
  232. package/dist/src/utils/pathCorrector.js +33 -0
  233. package/dist/src/utils/pathCorrector.js.map +1 -0
  234. package/dist/src/utils/pathCorrector.test.d.ts +6 -0
  235. package/dist/src/utils/pathCorrector.test.js +83 -0
  236. package/dist/src/utils/pathCorrector.test.js.map +1 -0
  237. package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
  238. package/dist/src/utils/quotaErrorDetection.js +0 -46
  239. package/dist/src/utils/quotaErrorDetection.js.map +1 -1
  240. package/dist/src/utils/retry.d.ts +3 -1
  241. package/dist/src/utils/retry.js +53 -161
  242. package/dist/src/utils/retry.js.map +1 -1
  243. package/dist/src/utils/retry.test.js +87 -146
  244. package/dist/src/utils/retry.test.js.map +1 -1
  245. package/dist/src/utils/terminalSerializer.d.ts +1 -4
  246. package/dist/src/utils/terminalSerializer.js +3 -3
  247. package/dist/src/utils/terminalSerializer.js.map +1 -1
  248. package/dist/tsconfig.tsbuildinfo +1 -1
  249. package/package.json +1 -1
  250. package/dist/src/test-utils/tools.d.ts +0 -45
  251. package/dist/src/test-utils/tools.js +0 -105
  252. package/dist/src/test-utils/tools.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathCorrector.js","sourceRoot":"","sources":["../../../src/utils/pathCorrector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAwBlC,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,MAAc;IAEd,kEAAkE;IAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9D,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;IACtD,CAAC;IAED,wFAAwF;IACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,oBAAoB,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;IACtD,MAAM,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE/D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,uBAAuB,QAAQ,6BAA6B;SACpE,CAAC;IACJ,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,kBAAkB,QAAQ,4FAA4F,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACrJ,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;AACzD,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,83 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
+ import * as fs from 'node:fs';
8
+ import * as path from 'node:path';
9
+ import * as os from 'node:os';
10
+ import { createMockWorkspaceContext } from '../test-utils/mockWorkspaceContext.js';
11
+ import { StandardFileSystemService } from '../services/fileSystemService.js';
12
+ import { correctPath } from './pathCorrector.js';
13
+ describe('pathCorrector', () => {
14
+ let tempDir;
15
+ let rootDir;
16
+ let otherWorkspaceDir;
17
+ let mockConfig;
18
+ beforeEach(() => {
19
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'path-corrector-test-'));
20
+ rootDir = path.join(tempDir, 'root');
21
+ otherWorkspaceDir = path.join(tempDir, 'other');
22
+ fs.mkdirSync(rootDir, { recursive: true });
23
+ fs.mkdirSync(otherWorkspaceDir, { recursive: true });
24
+ mockConfig = {
25
+ getTargetDir: () => rootDir,
26
+ getWorkspaceContext: () => createMockWorkspaceContext(rootDir, [otherWorkspaceDir]),
27
+ getFileSystemService: () => new StandardFileSystemService(),
28
+ };
29
+ });
30
+ afterEach(() => {
31
+ fs.rmSync(tempDir, { recursive: true, force: true });
32
+ vi.restoreAllMocks();
33
+ });
34
+ it('should correct a relative path if it is unambiguous in the target dir', () => {
35
+ const testFile = 'unique.txt';
36
+ fs.writeFileSync(path.join(rootDir, testFile), 'content');
37
+ const result = correctPath(testFile, mockConfig);
38
+ expect(result.success).toBe(true);
39
+ if (result.success) {
40
+ expect(result.correctedPath).toBe(path.join(rootDir, testFile));
41
+ }
42
+ });
43
+ it('should correct a partial relative path if it is unambiguous in another workspace dir', () => {
44
+ const subDir = path.join(otherWorkspaceDir, 'sub');
45
+ fs.mkdirSync(subDir);
46
+ const testFile = 'file.txt';
47
+ const fullPath = path.join(subDir, testFile);
48
+ fs.writeFileSync(fullPath, 'content');
49
+ const result = correctPath(testFile, mockConfig);
50
+ expect(result.success).toBe(true);
51
+ if (result.success) {
52
+ expect(result.correctedPath).toBe(fullPath);
53
+ }
54
+ });
55
+ it('should return an error for a relative path that does not exist', () => {
56
+ const result = correctPath('nonexistent.txt', mockConfig);
57
+ expect(result.success).toBe(false);
58
+ if (!result.success) {
59
+ expect(result.error).toMatch(/File not found for 'nonexistent.txt' and path is not absolute./);
60
+ }
61
+ else {
62
+ expect.fail('Expected path correction to fail.');
63
+ }
64
+ });
65
+ it('should return an error for an ambiguous path', () => {
66
+ const ambiguousFile = 'component.ts';
67
+ const subDir1 = path.join(rootDir, 'module1');
68
+ const subDir2 = path.join(otherWorkspaceDir, 'module2');
69
+ fs.mkdirSync(subDir1, { recursive: true });
70
+ fs.mkdirSync(subDir2, { recursive: true });
71
+ fs.writeFileSync(path.join(subDir1, ambiguousFile), 'content 1');
72
+ fs.writeFileSync(path.join(subDir2, ambiguousFile), 'content 2');
73
+ const result = correctPath(ambiguousFile, mockConfig);
74
+ expect(result.success).toBe(false);
75
+ if (!result.success) {
76
+ expect(result.error).toMatch(/The file path 'component.ts' is ambiguous and matches multiple files./);
77
+ }
78
+ else {
79
+ expect.fail('Expected path correction to fail.');
80
+ }
81
+ });
82
+ });
83
+ //# sourceMappingURL=pathCorrector.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathCorrector.test.js","sourceRoot":"","sources":["../../../src/utils/pathCorrector.test.ts"],"names":[],"mappings":"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"}
@@ -14,5 +14,3 @@ export interface ApiError {
14
14
  }
15
15
  export declare function isApiError(error: unknown): error is ApiError;
16
16
  export declare function isStructuredError(error: unknown): error is StructuredError;
17
- export declare function isProQuotaExceededError(error: unknown): boolean;
18
- export declare function isGenericQuotaExceededError(error: unknown): boolean;
@@ -16,50 +16,4 @@ export function isStructuredError(error) {
16
16
  'message' in error &&
17
17
  typeof error.message === 'string');
18
18
  }
19
- export function isProQuotaExceededError(error) {
20
- // Check for Pro quota exceeded errors by looking for the specific pattern
21
- // This will match patterns like:
22
- // - "Quota exceeded for quota metric 'Gemini 2.5 Pro Requests'"
23
- // - "Quota exceeded for quota metric 'Gemini 2.5-preview Pro Requests'"
24
- // We use string methods instead of regex to avoid ReDoS vulnerabilities
25
- const checkMessage = (message) => message.includes("Quota exceeded for quota metric 'Gemini") &&
26
- message.includes("Pro Requests'");
27
- if (typeof error === 'string') {
28
- return checkMessage(error);
29
- }
30
- if (isStructuredError(error)) {
31
- return checkMessage(error.message);
32
- }
33
- if (isApiError(error)) {
34
- return checkMessage(error.error.message);
35
- }
36
- // Check if it's a Gaxios error with response data
37
- if (error && typeof error === 'object' && 'response' in error) {
38
- const gaxiosError = error;
39
- if (gaxiosError.response && gaxiosError.response.data) {
40
- if (typeof gaxiosError.response.data === 'string') {
41
- return checkMessage(gaxiosError.response.data);
42
- }
43
- if (typeof gaxiosError.response.data === 'object' &&
44
- gaxiosError.response.data !== null &&
45
- 'error' in gaxiosError.response.data) {
46
- const errorData = gaxiosError.response.data;
47
- return checkMessage(errorData.error?.message || '');
48
- }
49
- }
50
- }
51
- return false;
52
- }
53
- export function isGenericQuotaExceededError(error) {
54
- if (typeof error === 'string') {
55
- return error.includes('Quota exceeded for quota metric');
56
- }
57
- if (isStructuredError(error)) {
58
- return error.message.includes('Quota exceeded for quota metric');
59
- }
60
- if (isApiError(error)) {
61
- return error.error.message.includes('Quota exceeded for quota metric');
62
- }
63
- return false;
64
- }
65
19
  //# sourceMappingURL=quotaErrorDetection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"quotaErrorDetection.js","sourceRoot":"","sources":["../../../src/utils/quotaErrorDetection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,OAAQ,KAAkB,CAAC,KAAK,KAAK,QAAQ;QAC7C,SAAS,IAAK,KAAkB,CAAC,KAAK,CACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAQ,KAAyB,CAAC,OAAO,KAAK,QAAQ,CACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,0EAA0E;IAC1E,iCAAiC;IACjC,gEAAgE;IAChE,wEAAwE;IACxE,wEAAwE;IAExE,MAAM,YAAY,GAAG,CAAC,OAAe,EAAW,EAAE,CAChD,OAAO,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAC3D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IAEpC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,kDAAkD;IAClD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,KAInB,CAAC;QACF,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACtD,IAAI,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAClD,OAAO,YAAY,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC;YACD,IACE,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBAC7C,WAAW,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI;gBAClC,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,EACpC,CAAC;gBACD,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,IAEtC,CAAC;gBACF,OAAO,YAAY,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iCAAiC,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"quotaErrorDetection.js","sourceRoot":"","sources":["../../../src/utils/quotaErrorDetection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,IAAI,KAAK;QAChB,OAAQ,KAAkB,CAAC,KAAK,KAAK,QAAQ;QAC7C,SAAS,IAAK,KAAkB,CAAC,KAAK,CACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,SAAS,IAAI,KAAK;QAClB,OAAQ,KAAyB,CAAC,OAAO,KAAK,QAAQ,CACvD,CAAC;AACJ,CAAC"}
@@ -3,6 +3,7 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import type { GenerateContentResponse } from '@google/genai';
6
7
  export interface HttpError extends Error {
7
8
  status?: number;
8
9
  }
@@ -10,7 +11,8 @@ export interface RetryOptions {
10
11
  maxAttempts: number;
11
12
  initialDelayMs: number;
12
13
  maxDelayMs: number;
13
- shouldRetry: (error: Error) => boolean;
14
+ shouldRetryOnError: (error: Error) => boolean;
15
+ shouldRetryOnContent?: (content: GenerateContentResponse) => boolean;
14
16
  onPersistent429?: (authType?: string, error?: unknown) => Promise<string | boolean | null>;
15
17
  authType?: string;
16
18
  }
@@ -3,13 +3,14 @@
3
3
  * Copyright 2025 Google LLC
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
+ import { ApiError } from '@google/genai';
6
7
  import { AuthType } from '../core/contentGenerator.js';
7
- import { isProQuotaExceededError, isGenericQuotaExceededError, } from './quotaErrorDetection.js';
8
+ import { classifyGoogleError, RetryableQuotaError, TerminalQuotaError, } from './googleQuotaErrors.js';
8
9
  const DEFAULT_RETRY_OPTIONS = {
9
- maxAttempts: 5,
10
+ maxAttempts: 10,
10
11
  initialDelayMs: 5000,
11
12
  maxDelayMs: 30000, // 30 seconds
12
- shouldRetry: defaultShouldRetry,
13
+ shouldRetryOnError: defaultShouldRetry,
13
14
  };
14
15
  /**
15
16
  * Default predicate function to determine if a retry should be attempted.
@@ -18,18 +19,17 @@ const DEFAULT_RETRY_OPTIONS = {
18
19
  * @returns True if the error is a transient error, false otherwise.
19
20
  */
20
21
  function defaultShouldRetry(error) {
21
- // Check for common transient error status codes either in message or a status property
22
- if (error && typeof error.status === 'number') {
23
- const status = error.status;
24
- if (status === 429 || (status >= 500 && status < 600)) {
25
- return true;
26
- }
22
+ // Priority check for ApiError
23
+ if (error instanceof ApiError) {
24
+ // Explicitly do not retry 400 (Bad Request)
25
+ if (error.status === 400)
26
+ return false;
27
+ return error.status === 429 || (error.status >= 500 && error.status < 600);
27
28
  }
28
- if (error instanceof Error && error.message) {
29
- if (error.message.includes('429'))
30
- return true;
31
- if (error.message.match(/5\d{2}/))
32
- return true;
29
+ // Check for status using helper (handles other error shapes)
30
+ const status = getErrorStatus(error);
31
+ if (status !== undefined) {
32
+ return status === 429 || (status >= 500 && status < 600);
33
33
  }
34
34
  return false;
35
35
  }
@@ -55,127 +55,65 @@ export async function retryWithBackoff(fn, options) {
55
55
  const cleanOptions = options
56
56
  ? Object.fromEntries(Object.entries(options).filter(([_, v]) => v != null))
57
57
  : {};
58
- const { maxAttempts, initialDelayMs, maxDelayMs, onPersistent429, authType, shouldRetry, } = {
58
+ const { maxAttempts, initialDelayMs, maxDelayMs, onPersistent429, authType, shouldRetryOnError, shouldRetryOnContent, } = {
59
59
  ...DEFAULT_RETRY_OPTIONS,
60
60
  ...cleanOptions,
61
61
  };
62
62
  let attempt = 0;
63
63
  let currentDelay = initialDelayMs;
64
- let consecutive429Count = 0;
65
64
  while (attempt < maxAttempts) {
66
65
  attempt++;
67
66
  try {
68
- return await fn();
67
+ const result = await fn();
68
+ if (shouldRetryOnContent &&
69
+ shouldRetryOnContent(result)) {
70
+ const jitter = currentDelay * 0.3 * (Math.random() * 2 - 1);
71
+ const delayWithJitter = Math.max(0, currentDelay + jitter);
72
+ await delay(delayWithJitter);
73
+ currentDelay = Math.min(maxDelayMs, currentDelay * 2);
74
+ continue;
75
+ }
76
+ return result;
69
77
  }
70
78
  catch (error) {
71
- const errorStatus = getErrorStatus(error);
72
- // Check for Pro quota exceeded error first - immediate fallback for OAuth users
73
- if (errorStatus === 429 &&
74
- authType === AuthType.LOGIN_WITH_GOOGLE &&
75
- isProQuotaExceededError(error) &&
76
- onPersistent429) {
77
- try {
78
- const fallbackModel = await onPersistent429(authType, error);
79
- if (fallbackModel !== false && fallbackModel !== null) {
80
- // Reset attempt counter and try with new model
81
- attempt = 0;
82
- consecutive429Count = 0;
83
- currentDelay = initialDelayMs;
84
- // With the model updated, we continue to the next attempt
85
- continue;
79
+ const classifiedError = classifyGoogleError(error);
80
+ if (classifiedError instanceof TerminalQuotaError) {
81
+ if (onPersistent429 && authType === AuthType.LOGIN_WITH_GOOGLE) {
82
+ try {
83
+ const fallbackModel = await onPersistent429(authType, classifiedError);
84
+ if (fallbackModel) {
85
+ attempt = 0; // Reset attempts and retry with the new model.
86
+ currentDelay = initialDelayMs;
87
+ continue;
88
+ }
86
89
  }
87
- else {
88
- // Fallback handler returned null/false, meaning don't continue - stop retry process
89
- throw error;
90
+ catch (fallbackError) {
91
+ console.warn('Model fallback failed:', fallbackError);
90
92
  }
91
93
  }
92
- catch (fallbackError) {
93
- // If fallback fails, continue with original error
94
- console.warn('Fallback to Flash model failed:', fallbackError);
95
- }
94
+ throw classifiedError; // Throw if no fallback or fallback failed.
96
95
  }
97
- // Check for generic quota exceeded error (but not Pro, which was handled above) - immediate fallback for OAuth users
98
- if (errorStatus === 429 &&
99
- authType === AuthType.LOGIN_WITH_GOOGLE &&
100
- !isProQuotaExceededError(error) &&
101
- isGenericQuotaExceededError(error) &&
102
- onPersistent429) {
103
- try {
104
- const fallbackModel = await onPersistent429(authType, error);
105
- if (fallbackModel !== false && fallbackModel !== null) {
106
- // Reset attempt counter and try with new model
107
- attempt = 0;
108
- consecutive429Count = 0;
109
- currentDelay = initialDelayMs;
110
- // With the model updated, we continue to the next attempt
111
- continue;
112
- }
113
- else {
114
- // Fallback handler returned null/false, meaning don't continue - stop retry process
115
- throw error;
116
- }
117
- }
118
- catch (fallbackError) {
119
- // If fallback fails, continue with original error
120
- console.warn('Fallback to Flash model failed:', fallbackError);
96
+ if (classifiedError instanceof RetryableQuotaError) {
97
+ if (attempt >= maxAttempts) {
98
+ throw classifiedError;
121
99
  }
100
+ console.warn(`Attempt ${attempt} failed: ${classifiedError.message}. Retrying after ${classifiedError.retryDelayMs}ms...`);
101
+ await delay(classifiedError.retryDelayMs);
102
+ continue;
122
103
  }
123
- // Track consecutive 429 errors
124
- if (errorStatus === 429) {
125
- consecutive429Count++;
126
- }
127
- else {
128
- consecutive429Count = 0;
129
- }
130
- // If we have persistent 429s and a fallback callback for OAuth
131
- if (consecutive429Count >= 2 &&
132
- onPersistent429 &&
133
- authType === AuthType.LOGIN_WITH_GOOGLE) {
134
- try {
135
- const fallbackModel = await onPersistent429(authType, error);
136
- if (fallbackModel !== false && fallbackModel !== null) {
137
- // Reset attempt counter and try with new model
138
- attempt = 0;
139
- consecutive429Count = 0;
140
- currentDelay = initialDelayMs;
141
- // With the model updated, we continue to the next attempt
142
- continue;
143
- }
144
- else {
145
- // Fallback handler returned null/false, meaning don't continue - stop retry process
146
- throw error;
147
- }
148
- }
149
- catch (fallbackError) {
150
- // If fallback fails, continue with original error
151
- console.warn('Fallback to Flash model failed:', fallbackError);
152
- }
153
- }
154
- // Check if we've exhausted retries or shouldn't retry
155
- if (attempt >= maxAttempts || !shouldRetry(error)) {
104
+ // Generic retry logic for other errors
105
+ if (attempt >= maxAttempts || !shouldRetryOnError(error)) {
156
106
  throw error;
157
107
  }
158
- const { delayDurationMs, errorStatus: delayErrorStatus } = getDelayDurationAndStatus(error);
159
- if (delayDurationMs > 0) {
160
- // Respect Retry-After header if present and parsed
161
- console.warn(`Attempt ${attempt} failed with status ${delayErrorStatus ?? 'unknown'}. Retrying after explicit delay of ${delayDurationMs}ms...`, error);
162
- await delay(delayDurationMs);
163
- // Reset currentDelay for next potential non-429 error, or if Retry-After is not present next time
164
- currentDelay = initialDelayMs;
165
- }
166
- else {
167
- // Fall back to exponential backoff with jitter
168
- logRetryAttempt(attempt, error, errorStatus);
169
- // Add jitter: +/- 30% of currentDelay
170
- const jitter = currentDelay * 0.3 * (Math.random() * 2 - 1);
171
- const delayWithJitter = Math.max(0, currentDelay + jitter);
172
- await delay(delayWithJitter);
173
- currentDelay = Math.min(maxDelayMs, currentDelay * 2);
174
- }
108
+ const errorStatus = getErrorStatus(error);
109
+ logRetryAttempt(attempt, error, errorStatus);
110
+ // Exponential backoff with jitter for non-quota errors
111
+ const jitter = currentDelay * 0.3 * (Math.random() * 2 - 1);
112
+ const delayWithJitter = Math.max(0, currentDelay + jitter);
113
+ await delay(delayWithJitter);
114
+ currentDelay = Math.min(maxDelayMs, currentDelay * 2);
175
115
  }
176
116
  }
177
- // This line should theoretically be unreachable due to the throw in the catch block.
178
- // Added for type safety and to satisfy the compiler that a promise is always returned.
179
117
  throw new Error('Retry attempts exhausted');
180
118
  }
181
119
  /**
@@ -200,52 +138,6 @@ export function getErrorStatus(error) {
200
138
  }
201
139
  return undefined;
202
140
  }
203
- /**
204
- * Extracts the Retry-After delay from an error object's headers.
205
- * @param error The error object.
206
- * @returns The delay in milliseconds, or 0 if not found or invalid.
207
- */
208
- function getRetryAfterDelayMs(error) {
209
- if (typeof error === 'object' && error !== null) {
210
- // Check for error.response.headers (common in axios errors)
211
- if ('response' in error &&
212
- typeof error.response === 'object' &&
213
- error.response !== null) {
214
- const response = error.response;
215
- if ('headers' in response &&
216
- typeof response.headers === 'object' &&
217
- response.headers !== null) {
218
- const headers = response.headers;
219
- const retryAfterHeader = headers['retry-after'];
220
- if (typeof retryAfterHeader === 'string') {
221
- const retryAfterSeconds = parseInt(retryAfterHeader, 10);
222
- if (!isNaN(retryAfterSeconds)) {
223
- return retryAfterSeconds * 1000;
224
- }
225
- // It might be an HTTP date
226
- const retryAfterDate = new Date(retryAfterHeader);
227
- if (!isNaN(retryAfterDate.getTime())) {
228
- return Math.max(0, retryAfterDate.getTime() - Date.now());
229
- }
230
- }
231
- }
232
- }
233
- }
234
- return 0;
235
- }
236
- /**
237
- * Determines the delay duration based on the error, prioritizing Retry-After header.
238
- * @param error The error object.
239
- * @returns An object containing the delay duration in milliseconds and the error status.
240
- */
241
- function getDelayDurationAndStatus(error) {
242
- const errorStatus = getErrorStatus(error);
243
- let delayDurationMs = 0;
244
- if (errorStatus === 429) {
245
- delayDurationMs = getRetryAfterDelayMs(error);
246
- }
247
- return { delayDurationMs, errorStatus };
248
- }
249
141
  /**
250
142
  * Logs a message for a retry attempt when using exponential backoff.
251
143
  * @param attempt The current attempt number.
@@ -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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"}