@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.
- package/README.md +7 -5
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +2 -4
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.d.ts +2 -2
- package/dist/src/code_assist/oauth2.js +53 -41
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +65 -33
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/server.d.ts +3 -3
- package/dist/src/code_assist/server.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +2 -2
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/config/config.d.ts +12 -3
- package/dist/src/config/config.js +35 -9
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +58 -21
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +1 -0
- package/dist/src/config/storage.js +3 -0
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/core/client.d.ts +1 -11
- package/dist/src/core/client.js +17 -165
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +70 -405
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +39 -28
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +28 -0
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolScheduler.d.ts +7 -7
- package/dist/src/core/coreToolScheduler.js +312 -183
- package/dist/src/core/coreToolScheduler.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +239 -9
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.d.ts +33 -0
- package/dist/src/core/fakeContentGenerator.js +58 -0
- package/dist/src/core/fakeContentGenerator.js.map +1 -0
- package/dist/src/core/fakeContentGenerator.test.d.ts +6 -0
- package/dist/src/core/fakeContentGenerator.test.js +127 -0
- package/dist/src/core/fakeContentGenerator.test.js.map +1 -0
- package/dist/src/core/loggingContentGenerator.d.ts +1 -0
- package/dist/src/core/loggingContentGenerator.js +113 -33
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/nonInteractiveToolExecutor.js +5 -4
- package/dist/src/core/nonInteractiveToolExecutor.js.map +1 -1
- package/dist/src/core/prompts.test.js +30 -108
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/recordingContentGenerator.d.ts +18 -0
- package/dist/src/core/recordingContentGenerator.js +77 -0
- package/dist/src/core/recordingContentGenerator.js.map +1 -0
- package/dist/src/core/recordingContentGenerator.test.d.ts +6 -0
- package/dist/src/core/recordingContentGenerator.test.js +101 -0
- package/dist/src/core/recordingContentGenerator.test.js.map +1 -0
- package/dist/src/fallback/handler.js +2 -0
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.d.ts +2 -0
- package/dist/src/mcp/google-auth-provider.js +19 -2
- package/dist/src/mcp/google-auth-provider.js.map +1 -1
- package/dist/src/mcp/google-auth-provider.test.js +42 -9
- package/dist/src/mcp/google-auth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-provider.js +2 -2
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +130 -0
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.js +5 -4
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.test.js +17 -11
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
- package/dist/src/mcp/oauth-utils.d.ts +7 -0
- package/dist/src/mcp/oauth-utils.js +19 -0
- package/dist/src/mcp/oauth-utils.js.map +1 -1
- package/dist/src/mcp/oauth-utils.test.js +32 -0
- package/dist/src/mcp/oauth-utils.test.js.map +1 -1
- package/dist/src/mcp/sa-impersonation-provider.d.ts +0 -6
- package/dist/src/mcp/sa-impersonation-provider.js +6 -23
- package/dist/src/mcp/sa-impersonation-provider.js.map +1 -1
- package/dist/src/mcp/token-storage/base-token-storage.test.js +75 -84
- package/dist/src/mcp/token-storage/base-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.d.ts +6 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js +62 -6
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js +54 -3
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
- package/dist/src/mcp/token-storage/types.d.ts +6 -0
- package/dist/src/mcp/token-storage/types.js.map +1 -1
- package/dist/src/policy/policy-engine.js +4 -0
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/services/chatCompressionService.d.ts +32 -0
- package/dist/src/services/chatCompressionService.js +164 -0
- package/dist/src/services/chatCompressionService.js.map +1 -0
- package/dist/src/services/chatCompressionService.test.d.ts +6 -0
- package/dist/src/services/chatCompressionService.test.js +211 -0
- package/dist/src/services/chatCompressionService.test.js.map +1 -0
- package/dist/src/services/fileDiscoveryService.d.ts +0 -8
- package/dist/src/services/fileDiscoveryService.js +5 -33
- package/dist/src/services/fileDiscoveryService.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.test.js +11 -11
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/loopDetectionService.js +19 -9
- package/dist/src/services/loopDetectionService.js.map +1 -1
- package/dist/src/services/loopDetectionService.test.js +40 -11
- package/dist/src/services/loopDetectionService.test.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.d.ts +1 -0
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js +40 -33
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.js.map +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js +1 -1
- package/dist/src/telemetry/clearcut-logger/clearcut-logger.test.js.map +1 -1
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.js +1 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.js +10 -17
- package/dist/src/telemetry/loggers.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +173 -30
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +1 -1
- package/dist/src/telemetry/metrics.js +1 -1
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +2 -2
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/telemetry/semantic.d.ts +82 -0
- package/dist/src/telemetry/semantic.js +269 -0
- package/dist/src/telemetry/semantic.js.map +1 -0
- package/dist/src/telemetry/semantic.test.d.ts +6 -0
- package/dist/src/telemetry/semantic.test.js +387 -0
- package/dist/src/telemetry/semantic.test.js.map +1 -0
- package/dist/src/telemetry/trace.d.ts +46 -0
- package/dist/src/telemetry/trace.js +121 -0
- package/dist/src/telemetry/trace.js.map +1 -0
- package/dist/src/telemetry/types.d.ts +37 -18
- package/dist/src/telemetry/types.js +107 -36
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.js +6 -6
- package/dist/src/telemetry/uiTelemetry.js.map +1 -1
- package/dist/src/telemetry/uiTelemetry.test.js +88 -66
- package/dist/src/telemetry/uiTelemetry.test.js.map +1 -1
- package/dist/src/tools/edit.d.ts +3 -2
- package/dist/src/tools/edit.js +15 -11
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +19 -0
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/glob.js +4 -2
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +203 -199
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.js +2 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/ls.js +2 -1
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +0 -7
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +2 -1
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client.d.ts +4 -1
- package/dist/src/tools/mcp-client.js +71 -92
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +16 -6
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +3 -2
- package/dist/src/tools/mcp-tool.js +12 -10
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +5 -3
- package/dist/src/tools/memoryTool.js +9 -7
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/read-file.js +7 -3
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +25 -2
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +6 -4
- package/dist/src/tools/shell.js +18 -12
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +7 -0
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/smart-edit.d.ts +2 -1
- package/dist/src/tools/smart-edit.js +10 -9
- package/dist/src/tools/smart-edit.js.map +1 -1
- package/dist/src/tools/tool-registry.d.ts +5 -1
- package/dist/src/tools/tool-registry.js +10 -3
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +6 -0
- package/dist/src/tools/tools.js +29 -17
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +1 -12
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +2 -2
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/write-file.d.ts +2 -1
- package/dist/src/tools/write-file.js +6 -6
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-todos.d.ts +2 -1
- package/dist/src/tools/write-todos.js +5 -2
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/utils/environmentContext.d.ts +2 -1
- package/dist/src/utils/environmentContext.js +18 -0
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/errorParsing.d.ts +1 -1
- package/dist/src/utils/errorParsing.js +5 -33
- package/dist/src/utils/errorParsing.js.map +1 -1
- package/dist/src/utils/errorParsing.test.js +0 -88
- package/dist/src/utils/errorParsing.test.js.map +1 -1
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +6 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/events.d.ts +19 -1
- package/dist/src/utils/events.js +9 -0
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/extensionLoader.d.ts +38 -0
- package/dist/src/utils/extensionLoader.js +20 -0
- package/dist/src/utils/extensionLoader.js.map +1 -0
- package/dist/src/utils/flashFallback.test.js +26 -45
- package/dist/src/utils/flashFallback.test.js.map +1 -1
- package/dist/src/utils/getFolderStructure.js +7 -16
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/googleErrors.d.ts +104 -0
- package/dist/src/utils/googleErrors.js +152 -0
- package/dist/src/utils/googleErrors.js.map +1 -0
- package/dist/src/utils/googleErrors.test.d.ts +6 -0
- package/dist/src/utils/googleErrors.test.js +301 -0
- package/dist/src/utils/googleErrors.test.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.d.ts +35 -0
- package/dist/src/utils/googleQuotaErrors.js +131 -0
- package/dist/src/utils/googleQuotaErrors.js.map +1 -0
- package/dist/src/utils/googleQuotaErrors.test.d.ts +6 -0
- package/dist/src/utils/googleQuotaErrors.test.js +281 -0
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -0
- package/dist/src/utils/ignorePatterns.test.js +26 -30
- package/dist/src/utils/ignorePatterns.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +2 -2
- package/dist/src/utils/memoryDiscovery.js +3 -2
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +19 -35
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/paths.js +126 -26
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +200 -68
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.d.ts +0 -2
- package/dist/src/utils/quotaErrorDetection.js +0 -46
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/retry.js +41 -145
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +31 -110
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +70 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/workspaceContext.js +1 -1
- package/dist/src/utils/workspaceContext.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/dist/google-gemini-cli-core-0.12.0-nightly.20251022.0542de95.tgz +0 -0
|
@@ -54,4 +54,22 @@ ${directoryContext}
|
|
|
54
54
|
const initialParts = [{ text: context }];
|
|
55
55
|
return initialParts;
|
|
56
56
|
}
|
|
57
|
+
export async function getInitialChatHistory(config, extraHistory) {
|
|
58
|
+
const envParts = await getEnvironmentContext(config);
|
|
59
|
+
const envContextString = envParts.map((part) => part.text || '').join('\n\n');
|
|
60
|
+
const allSetupText = `
|
|
61
|
+
${envContextString}
|
|
62
|
+
|
|
63
|
+
Reminder: Do not return an empty response when a tool call is required.
|
|
64
|
+
|
|
65
|
+
My setup is complete. I will provide my first command in the next turn.
|
|
66
|
+
`.trim();
|
|
67
|
+
return [
|
|
68
|
+
{
|
|
69
|
+
role: 'user',
|
|
70
|
+
parts: [{ text: allSetupText }],
|
|
71
|
+
},
|
|
72
|
+
...(extraHistory ?? []),
|
|
73
|
+
];
|
|
74
|
+
}
|
|
57
75
|
//# sourceMappingURL=environmentContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"environmentContext.js","sourceRoot":"","sources":["../../../src/utils/environmentContext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAc;IAEd,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACtD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;IAE/D,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/B,kBAAkB,CAAC,GAAG,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE;KACrC,CAAC,CACH,CACF,CAAC;IAEF,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,kBAA0B,CAAC;IAC/B,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,kBAAkB,GAAG,2CAA2C,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,kBAAkB,GAAG,wDAAwD,OAAO,EAAE,CAAC;IACzF,CAAC;IAED,OAAO,GAAG,kBAAkB;;;EAG5B,eAAe,EAAE,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc;IACxD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACrD,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,gBAAgB,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG;;kBAEA,KAAK;0BACG,QAAQ;EAChC,gBAAgB;SACT,CAAC,IAAI,EAAE,CAAC;IAEf,MAAM,YAAY,GAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjD,OAAO,YAAY,CAAC;AACtB,CAAC"}
|
|
1
|
+
{"version":3,"file":"environmentContext.js","sourceRoot":"","sources":["../../../src/utils/environmentContext.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,MAAc;IAEd,MAAM,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACtD,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;IAE/D,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAC/B,kBAAkB,CAAC,GAAG,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC,cAAc,EAAE;KACrC,CAAC,CACH,CACF,CAAC;IAEF,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,kBAA0B,CAAC;IAC/B,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,kBAAkB,GAAG,2CAA2C,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5F,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,kBAAkB,GAAG,wDAAwD,OAAO,EAAE,CAAC;IACzF,CAAC;IAED,OAAO,GAAG,kBAAkB;;;EAG5B,eAAe,EAAE,CAAC;AACpB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAc;IACxD,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,SAAS,EAAE;QACrD,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,gBAAgB,GAAG,MAAM,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG;;kBAEA,KAAK;0BACG,QAAQ;EAChC,gBAAgB;SACT,CAAC,IAAI,EAAE,CAAC;IAEf,MAAM,YAAY,GAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAEjD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,YAAwB;IAExB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE9E,MAAM,YAAY,GAAG;EACrB,gBAAgB;;;;;KAKb,CAAC,IAAI,EAAE,CAAC;IAEX,OAAO;QACL;YACE,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;SAChC;QACD,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { UserTierId } from '../code_assist/types.js';
|
|
6
|
+
import type { UserTierId } from '../code_assist/types.js';
|
|
7
7
|
import { AuthType } from '../core/contentGenerator.js';
|
|
8
8
|
export declare function parseAndFormatApiError(error: unknown, authType?: AuthType, userTier?: UserTierId, currentModel?: string, fallbackModel?: string): string;
|
|
@@ -3,42 +3,14 @@
|
|
|
3
3
|
* Copyright 2025 Google LLC
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { UserTierId } from '../code_assist/types.js';
|
|
6
|
+
import { isApiError, isStructuredError } from './quotaErrorDetection.js';
|
|
7
|
+
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
9
8
|
import { AuthType } from '../core/contentGenerator.js';
|
|
10
|
-
// Free Tier message functions
|
|
11
|
-
const getRateLimitErrorMessageGoogleFree = (fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nPossible quota limitations in place or slow response times detected. Switching to the ${fallbackModel} model for the rest of this session.`;
|
|
12
|
-
const getRateLimitErrorMessageGoogleProQuotaFree = (currentModel = DEFAULT_GEMINI_MODEL, fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nYou have reached your daily ${currentModel} quota limit. You will be switched to the ${fallbackModel} model for the rest of this session. To increase your limits, upgrade to get higher limits at https://goo.gle/set-up-gemini-code-assist, or use /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
|
|
13
|
-
const getRateLimitErrorMessageGoogleGenericQuotaFree = () => `\nYou have reached your daily quota limit. To increase your limits, upgrade to get higher limits at https://goo.gle/set-up-gemini-code-assist, or use /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
|
|
14
|
-
// Legacy/Standard Tier message functions
|
|
15
|
-
const getRateLimitErrorMessageGooglePaid = (fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nPossible quota limitations in place or slow response times detected. Switching to the ${fallbackModel} model for the rest of this session. We appreciate you for choosing Gemini Code Assist and the Gemini CLI.`;
|
|
16
|
-
const getRateLimitErrorMessageGoogleProQuotaPaid = (currentModel = DEFAULT_GEMINI_MODEL, fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nYou have reached your daily ${currentModel} quota limit. You will be switched to the ${fallbackModel} model for the rest of this session. We appreciate you for choosing Gemini Code Assist and the Gemini CLI. To continue accessing the ${currentModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
|
|
17
|
-
const getRateLimitErrorMessageGoogleGenericQuotaPaid = (currentModel = DEFAULT_GEMINI_MODEL) => `\nYou have reached your daily quota limit. We appreciate you for choosing Gemini Code Assist and the Gemini CLI. To continue accessing the ${currentModel} model today, consider using /auth to switch to using a paid API key from AI Studio at https://aistudio.google.com/apikey`;
|
|
18
9
|
const RATE_LIMIT_ERROR_MESSAGE_USE_GEMINI = '\nPlease wait and try again later. To increase your limits, request a quota increase through AI Studio, or switch to another /auth method';
|
|
19
10
|
const RATE_LIMIT_ERROR_MESSAGE_VERTEX = '\nPlease wait and try again later. To increase your limits, request a quota increase through Vertex, or switch to another /auth method';
|
|
20
11
|
const getRateLimitErrorMessageDefault = (fallbackModel = DEFAULT_GEMINI_FLASH_MODEL) => `\nPossible quota limitations in place or slow response times detected. Switching to the ${fallbackModel} model for the rest of this session.`;
|
|
21
|
-
function getRateLimitMessage(authType,
|
|
12
|
+
function getRateLimitMessage(authType, fallbackModel) {
|
|
22
13
|
switch (authType) {
|
|
23
|
-
case AuthType.LOGIN_WITH_GOOGLE: {
|
|
24
|
-
// Determine if user is on a paid tier (Legacy or Standard) - default to FREE if not specified
|
|
25
|
-
const isPaidTier = userTier === UserTierId.LEGACY || userTier === UserTierId.STANDARD;
|
|
26
|
-
if (isProQuotaExceededError(error)) {
|
|
27
|
-
return isPaidTier
|
|
28
|
-
? getRateLimitErrorMessageGoogleProQuotaPaid(currentModel || DEFAULT_GEMINI_MODEL, fallbackModel)
|
|
29
|
-
: getRateLimitErrorMessageGoogleProQuotaFree(currentModel || DEFAULT_GEMINI_MODEL, fallbackModel);
|
|
30
|
-
}
|
|
31
|
-
else if (isGenericQuotaExceededError(error)) {
|
|
32
|
-
return isPaidTier
|
|
33
|
-
? getRateLimitErrorMessageGoogleGenericQuotaPaid(currentModel || DEFAULT_GEMINI_MODEL)
|
|
34
|
-
: getRateLimitErrorMessageGoogleGenericQuotaFree();
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
return isPaidTier
|
|
38
|
-
? getRateLimitErrorMessageGooglePaid(fallbackModel)
|
|
39
|
-
: getRateLimitErrorMessageGoogleFree(fallbackModel);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
14
|
case AuthType.USE_GEMINI:
|
|
43
15
|
return RATE_LIMIT_ERROR_MESSAGE_USE_GEMINI;
|
|
44
16
|
case AuthType.USE_VERTEX_AI:
|
|
@@ -51,7 +23,7 @@ export function parseAndFormatApiError(error, authType, userTier, currentModel,
|
|
|
51
23
|
if (isStructuredError(error)) {
|
|
52
24
|
let text = `[API Error: ${error.message}]`;
|
|
53
25
|
if (error.status === 429) {
|
|
54
|
-
text += getRateLimitMessage(authType,
|
|
26
|
+
text += getRateLimitMessage(authType, fallbackModel);
|
|
55
27
|
}
|
|
56
28
|
return text;
|
|
57
29
|
}
|
|
@@ -78,7 +50,7 @@ export function parseAndFormatApiError(error, authType, userTier, currentModel,
|
|
|
78
50
|
}
|
|
79
51
|
let text = `[API Error: ${finalMessage} (Status: ${parsedError.error.status})]`;
|
|
80
52
|
if (parsedError.error.code === 429) {
|
|
81
|
-
text += getRateLimitMessage(authType,
|
|
53
|
+
text += getRateLimitMessage(authType, fallbackModel);
|
|
82
54
|
}
|
|
83
55
|
return text;
|
|
84
56
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorParsing.js","sourceRoot":"","sources":["../../../src/utils/errorParsing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"errorParsing.js","sourceRoot":"","sources":["../../../src/utils/errorParsing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,mCAAmC,GACvC,2IAA2I,CAAC;AAC9I,MAAM,+BAA+B,GACnC,wIAAwI,CAAC;AAC3I,MAAM,+BAA+B,GAAG,CACtC,gBAAwB,0BAA0B,EAClD,EAAE,CACF,2FAA2F,aAAa,sCAAsC,CAAC;AAEjJ,SAAS,mBAAmB,CAC1B,QAAmB,EACnB,aAAsB;IAEtB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,QAAQ,CAAC,UAAU;YACtB,OAAO,mCAAmC,CAAC;QAC7C,KAAK,QAAQ,CAAC,aAAa;YACzB,OAAO,+BAA+B,CAAC;QACzC;YACE,OAAO,+BAA+B,CAAC,aAAa,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAc,EACd,QAAmB,EACnB,QAAqB,EACrB,YAAqB,EACrB,aAAsB;IAEtB,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,IAAI,GAAG,eAAe,KAAK,CAAC,OAAO,GAAG,CAAC;QAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACzB,IAAI,IAAI,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,OAAO,eAAe,KAAK,GAAG,CAAC,CAAC,kCAAkC;QACpE,CAAC;QAED,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY,CAAC;YACtD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC5B,IAAI,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;gBAC7C,IAAI,CAAC;oBACH,8DAA8D;oBAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAY,CAAC;oBACxD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC5B,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;oBAC3C,CAAC;gBACH,CAAC;gBAAC,OAAO,EAAE,EAAE,CAAC;oBACZ,kEAAkE;gBACpE,CAAC;gBACD,IAAI,IAAI,GAAG,eAAe,YAAY,aAAa,WAAW,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;gBAChF,IAAI,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;oBACnC,IAAI,IAAI,mBAAmB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;gBACvD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,kEAAkE;QACpE,CAAC;QACD,OAAO,eAAe,KAAK,GAAG,CAAC;IACjC,CAAC;IAED,OAAO,yCAAyC,CAAC;AACnD,CAAC"}
|
|
@@ -5,9 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect } from 'vitest';
|
|
7
7
|
import { parseAndFormatApiError } from './errorParsing.js';
|
|
8
|
-
import { isProQuotaExceededError } from './quotaErrorDetection.js';
|
|
9
8
|
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
10
|
-
import { UserTierId } from '../code_assist/types.js';
|
|
11
9
|
import { AuthType } from '../core/contentGenerator.js';
|
|
12
10
|
describe('parseAndFormatApiError', () => {
|
|
13
11
|
const vertexMessage = 'request a quota increase through Vertex';
|
|
@@ -23,12 +21,6 @@ describe('parseAndFormatApiError', () => {
|
|
|
23
21
|
expect(result).toContain('[API Error: Rate limit exceeded');
|
|
24
22
|
expect(result).toContain('Possible quota limitations in place or slow response times detected. Switching to the gemini-2.5-flash model');
|
|
25
23
|
});
|
|
26
|
-
it('should format a 429 API error with the personal message', () => {
|
|
27
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Rate limit exceeded","status":"RESOURCE_EXHAUSTED"}}';
|
|
28
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, undefined, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
29
|
-
expect(result).toContain('[API Error: Rate limit exceeded');
|
|
30
|
-
expect(result).toContain('Possible quota limitations in place or slow response times detected. Switching to the gemini-2.5-flash model');
|
|
31
|
-
});
|
|
32
24
|
it('should format a 429 API error with the vertex message', () => {
|
|
33
25
|
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Rate limit exceeded","status":"RESOURCE_EXHAUSTED"}}';
|
|
34
26
|
const result = parseAndFormatApiError(errorMessage, AuthType.USE_VERTEX_AI);
|
|
@@ -88,85 +80,5 @@ describe('parseAndFormatApiError', () => {
|
|
|
88
80
|
const expected = '[API Error: An unknown error occurred.]';
|
|
89
81
|
expect(parseAndFormatApiError(error)).toBe(expected);
|
|
90
82
|
});
|
|
91
|
-
it('should format a 429 API error with Pro quota exceeded message for Google auth (Free tier)', () => {
|
|
92
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'Gemini 2.5 Pro Requests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
93
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, undefined, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
94
|
-
expect(result).toContain("[API Error: Quota exceeded for quota metric 'Gemini 2.5 Pro Requests'");
|
|
95
|
-
expect(result).toContain('You have reached your daily gemini-2.5-pro quota limit');
|
|
96
|
-
expect(result).toContain('upgrade to get higher limits');
|
|
97
|
-
});
|
|
98
|
-
it('should format a regular 429 API error with standard message for Google auth', () => {
|
|
99
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Rate limit exceeded","status":"RESOURCE_EXHAUSTED"}}';
|
|
100
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, undefined, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
101
|
-
expect(result).toContain('[API Error: Rate limit exceeded');
|
|
102
|
-
expect(result).toContain('Possible quota limitations in place or slow response times detected. Switching to the gemini-2.5-flash model');
|
|
103
|
-
expect(result).not.toContain('You have reached your daily gemini-2.5-pro quota limit');
|
|
104
|
-
});
|
|
105
|
-
it('should format a 429 API error with generic quota exceeded message for Google auth', () => {
|
|
106
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'GenerationRequests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
107
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, undefined, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
108
|
-
expect(result).toContain("[API Error: Quota exceeded for quota metric 'GenerationRequests'");
|
|
109
|
-
expect(result).toContain('You have reached your daily quota limit');
|
|
110
|
-
expect(result).not.toContain('You have reached your daily Gemini 2.5 Pro quota limit');
|
|
111
|
-
});
|
|
112
|
-
it('should prioritize Pro quota message over generic quota message for Google auth', () => {
|
|
113
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'Gemini 2.5 Pro Requests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
114
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, undefined, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
115
|
-
expect(result).toContain("[API Error: Quota exceeded for quota metric 'Gemini 2.5 Pro Requests'");
|
|
116
|
-
expect(result).toContain('You have reached your daily gemini-2.5-pro quota limit');
|
|
117
|
-
expect(result).not.toContain('You have reached your daily quota limit');
|
|
118
|
-
});
|
|
119
|
-
it('should format a 429 API error with Pro quota exceeded message for Google auth (Standard tier)', () => {
|
|
120
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'Gemini 2.5 Pro Requests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
121
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, UserTierId.STANDARD, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
122
|
-
expect(result).toContain("[API Error: Quota exceeded for quota metric 'Gemini 2.5 Pro Requests'");
|
|
123
|
-
expect(result).toContain('You have reached your daily gemini-2.5-pro quota limit');
|
|
124
|
-
expect(result).toContain('We appreciate you for choosing Gemini Code Assist and the Gemini CLI');
|
|
125
|
-
expect(result).not.toContain('upgrade to get higher limits');
|
|
126
|
-
});
|
|
127
|
-
it('should format a 429 API error with Pro quota exceeded message for Google auth (Legacy tier)', () => {
|
|
128
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'Gemini 2.5 Pro Requests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
129
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, UserTierId.LEGACY, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
130
|
-
expect(result).toContain("[API Error: Quota exceeded for quota metric 'Gemini 2.5 Pro Requests'");
|
|
131
|
-
expect(result).toContain('You have reached your daily gemini-2.5-pro quota limit');
|
|
132
|
-
expect(result).toContain('We appreciate you for choosing Gemini Code Assist and the Gemini CLI');
|
|
133
|
-
expect(result).not.toContain('upgrade to get higher limits');
|
|
134
|
-
});
|
|
135
|
-
it('should handle different Gemini 2.5 version strings in Pro quota exceeded errors', () => {
|
|
136
|
-
const errorMessage25 = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'Gemini 2.5 Pro Requests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
137
|
-
const errorMessagePreview = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'Gemini 2.5-preview Pro Requests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
138
|
-
const result25 = parseAndFormatApiError(errorMessage25, AuthType.LOGIN_WITH_GOOGLE, undefined, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
139
|
-
const resultPreview = parseAndFormatApiError(errorMessagePreview, AuthType.LOGIN_WITH_GOOGLE, undefined, 'gemini-2.5-preview-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
140
|
-
expect(result25).toContain('You have reached your daily gemini-2.5-pro quota limit');
|
|
141
|
-
expect(resultPreview).toContain('You have reached your daily gemini-2.5-preview-pro quota limit');
|
|
142
|
-
expect(result25).toContain('upgrade to get higher limits');
|
|
143
|
-
expect(resultPreview).toContain('upgrade to get higher limits');
|
|
144
|
-
});
|
|
145
|
-
it('should not match non-Pro models with similar version strings', () => {
|
|
146
|
-
// Test that Flash models with similar version strings don't match
|
|
147
|
-
expect(isProQuotaExceededError("Quota exceeded for quota metric 'Gemini 2.5 Flash Requests' and limit")).toBe(false);
|
|
148
|
-
expect(isProQuotaExceededError("Quota exceeded for quota metric 'Gemini 2.5-preview Flash Requests' and limit")).toBe(false);
|
|
149
|
-
// Test other model types
|
|
150
|
-
expect(isProQuotaExceededError("Quota exceeded for quota metric 'Gemini 2.5 Ultra Requests' and limit")).toBe(false);
|
|
151
|
-
expect(isProQuotaExceededError("Quota exceeded for quota metric 'Gemini 2.5 Standard Requests' and limit")).toBe(false);
|
|
152
|
-
// Test generic quota messages
|
|
153
|
-
expect(isProQuotaExceededError("Quota exceeded for quota metric 'GenerationRequests' and limit")).toBe(false);
|
|
154
|
-
expect(isProQuotaExceededError("Quota exceeded for quota metric 'EmbeddingRequests' and limit")).toBe(false);
|
|
155
|
-
});
|
|
156
|
-
it('should format a generic quota exceeded message for Google auth (Standard tier)', () => {
|
|
157
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Quota exceeded for quota metric \'GenerationRequests\' and limit \'RequestsPerDay\' of service \'generativelanguage.googleapis.com\' for consumer \'project_number:123456789\'.","status":"RESOURCE_EXHAUSTED"}}';
|
|
158
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, UserTierId.STANDARD, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
159
|
-
expect(result).toContain("[API Error: Quota exceeded for quota metric 'GenerationRequests'");
|
|
160
|
-
expect(result).toContain('You have reached your daily quota limit');
|
|
161
|
-
expect(result).toContain('We appreciate you for choosing Gemini Code Assist and the Gemini CLI');
|
|
162
|
-
expect(result).not.toContain('upgrade to get higher limits');
|
|
163
|
-
});
|
|
164
|
-
it('should format a regular 429 API error with standard message for Google auth (Standard tier)', () => {
|
|
165
|
-
const errorMessage = 'got status: 429 Too Many Requests. {"error":{"code":429,"message":"Rate limit exceeded","status":"RESOURCE_EXHAUSTED"}}';
|
|
166
|
-
const result = parseAndFormatApiError(errorMessage, AuthType.LOGIN_WITH_GOOGLE, UserTierId.STANDARD, 'gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
167
|
-
expect(result).toContain('[API Error: Rate limit exceeded');
|
|
168
|
-
expect(result).toContain('We appreciate you for choosing Gemini Code Assist and the Gemini CLI');
|
|
169
|
-
expect(result).not.toContain('upgrade to get higher limits');
|
|
170
|
-
});
|
|
171
83
|
});
|
|
172
84
|
//# sourceMappingURL=errorParsing.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorParsing.test.js","sourceRoot":"","sources":["../../../src/utils/errorParsing.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"errorParsing.test.js","sourceRoot":"","sources":["../../../src/utils/errorParsing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,9 @@ export declare class FatalToolExecutionError extends FatalError {
|
|
|
30
30
|
export declare class FatalCancellationError extends FatalError {
|
|
31
31
|
constructor(message: string);
|
|
32
32
|
}
|
|
33
|
+
export declare class CanceledError extends Error {
|
|
34
|
+
constructor(message?: string);
|
|
35
|
+
}
|
|
33
36
|
export declare class ForbiddenError extends Error {
|
|
34
37
|
}
|
|
35
38
|
export declare class UnauthorizedError extends Error {
|
package/dist/src/utils/errors.js
CHANGED
|
@@ -59,6 +59,12 @@ export class FatalCancellationError extends FatalError {
|
|
|
59
59
|
super(message, 130); // Standard exit code for SIGINT
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
|
+
export class CanceledError extends Error {
|
|
63
|
+
constructor(message = 'The operation was canceled.') {
|
|
64
|
+
super(message);
|
|
65
|
+
this.name = 'CanceledError';
|
|
66
|
+
}
|
|
67
|
+
}
|
|
62
68
|
export class ForbiddenError extends Error {
|
|
63
69
|
}
|
|
64
70
|
export class UnauthorizedError extends Error {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,8 +29,18 @@ export interface UserFeedbackPayload {
|
|
|
29
29
|
*/
|
|
30
30
|
error?: unknown;
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Payload for the 'fallback-mode-changed' event.
|
|
34
|
+
*/
|
|
35
|
+
export interface FallbackModeChangedPayload {
|
|
36
|
+
/**
|
|
37
|
+
* Whether fallback mode is now active.
|
|
38
|
+
*/
|
|
39
|
+
isInFallbackMode: boolean;
|
|
40
|
+
}
|
|
32
41
|
export declare enum CoreEvent {
|
|
33
|
-
UserFeedback = "user-feedback"
|
|
42
|
+
UserFeedback = "user-feedback",
|
|
43
|
+
FallbackModeChanged = "fallback-mode-changed"
|
|
34
44
|
}
|
|
35
45
|
export declare class CoreEventEmitter extends EventEmitter {
|
|
36
46
|
private _feedbackBacklog;
|
|
@@ -41,13 +51,21 @@ export declare class CoreEventEmitter extends EventEmitter {
|
|
|
41
51
|
* Buffers automatically if the UI hasn't subscribed yet.
|
|
42
52
|
*/
|
|
43
53
|
emitFeedback(severity: FeedbackSeverity, message: string, error?: unknown): void;
|
|
54
|
+
/**
|
|
55
|
+
* Notifies subscribers that fallback mode has changed.
|
|
56
|
+
* This is synchronous and doesn't use backlog (UI should already be initialized).
|
|
57
|
+
*/
|
|
58
|
+
emitFallbackModeChanged(isInFallbackMode: boolean): void;
|
|
44
59
|
/**
|
|
45
60
|
* Flushes buffered messages. Call this immediately after primary UI listener
|
|
46
61
|
* subscribes.
|
|
47
62
|
*/
|
|
48
63
|
drainFeedbackBacklog(): void;
|
|
49
64
|
on(event: CoreEvent.UserFeedback, listener: (payload: UserFeedbackPayload) => void): this;
|
|
65
|
+
on(event: CoreEvent.FallbackModeChanged, listener: (payload: FallbackModeChangedPayload) => void): this;
|
|
50
66
|
off(event: CoreEvent.UserFeedback, listener: (payload: UserFeedbackPayload) => void): this;
|
|
67
|
+
off(event: CoreEvent.FallbackModeChanged, listener: (payload: FallbackModeChangedPayload) => void): this;
|
|
51
68
|
emit(event: CoreEvent.UserFeedback, payload: UserFeedbackPayload): boolean;
|
|
69
|
+
emit(event: CoreEvent.FallbackModeChanged, payload: FallbackModeChangedPayload): boolean;
|
|
52
70
|
}
|
|
53
71
|
export declare const coreEvents: CoreEventEmitter;
|
package/dist/src/utils/events.js
CHANGED
|
@@ -7,6 +7,7 @@ import { EventEmitter } from 'node:events';
|
|
|
7
7
|
export var CoreEvent;
|
|
8
8
|
(function (CoreEvent) {
|
|
9
9
|
CoreEvent["UserFeedback"] = "user-feedback";
|
|
10
|
+
CoreEvent["FallbackModeChanged"] = "fallback-mode-changed";
|
|
10
11
|
})(CoreEvent || (CoreEvent = {}));
|
|
11
12
|
export class CoreEventEmitter extends EventEmitter {
|
|
12
13
|
_feedbackBacklog = [];
|
|
@@ -30,6 +31,14 @@ export class CoreEventEmitter extends EventEmitter {
|
|
|
30
31
|
this.emit(CoreEvent.UserFeedback, payload);
|
|
31
32
|
}
|
|
32
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Notifies subscribers that fallback mode has changed.
|
|
36
|
+
* This is synchronous and doesn't use backlog (UI should already be initialized).
|
|
37
|
+
*/
|
|
38
|
+
emitFallbackModeChanged(isInFallbackMode) {
|
|
39
|
+
const payload = { isInFallbackMode };
|
|
40
|
+
this.emit(CoreEvent.FallbackModeChanged, payload);
|
|
41
|
+
}
|
|
33
42
|
/**
|
|
34
43
|
* Flushes buffered messages. Call this immediately after primary UI listener
|
|
35
44
|
* subscribes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/utils/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/utils/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuC3C,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,2CAA8B,CAAA;IAC9B,0DAA6C,CAAA;AAC/C,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB;AAED,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IACxC,gBAAgB,GAA0B,EAAE,CAAC;IAC7C,MAAM,CAAU,gBAAgB,GAAG,KAAK,CAAC;IAEjD;QACE,KAAK,EAAE,CAAC;IACV,CAAC;IAED;;;OAGG;IACH,YAAY,CACV,QAA0B,EAC1B,OAAe,EACf,KAAe;QAEf,MAAM,OAAO,GAAwB,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAElE,IAAI,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,EAAE,CAAC;gBACtE,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;YAChC,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,uBAAuB,CAAC,gBAAyB;QAC/C,MAAM,OAAO,GAA+B,EAAE,gBAAgB,EAAE,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,oBAAoB;QAClB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB;QACnD,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAUQ,EAAE,CACT,KAAsB;IACtB,8DAA8D;IAC9D,QAAkC;QAElC,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IAUQ,GAAG,CACV,KAAsB;IACtB,8DAA8D;IAC9D,QAAkC;QAElC,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAUD,8DAA8D;IACrD,IAAI,CAAC,KAAsB,EAAE,GAAG,IAAW;QAClD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;;AAGH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'node:events';
|
|
7
|
+
import type { GeminiCLIExtension } from '../config/config.js';
|
|
8
|
+
export interface ExtensionLoader {
|
|
9
|
+
getExtensions(): GeminiCLIExtension[];
|
|
10
|
+
extensionEvents(): EventEmitter<ExtensionEvents>;
|
|
11
|
+
}
|
|
12
|
+
export interface ExtensionEvents {
|
|
13
|
+
extensionEnabled: ExtensionEnableEvent[];
|
|
14
|
+
extensionDisabled: ExtensionDisableEvent[];
|
|
15
|
+
extensionLoaded: ExtensionLoadEvent[];
|
|
16
|
+
extensionUnloaded: ExtensionUnloadEvent[];
|
|
17
|
+
extensionInstalled: ExtensionInstallEvent[];
|
|
18
|
+
extensionUninstalled: ExtensionUninstallEvent[];
|
|
19
|
+
extensionUpdated: ExtensionUpdateEvent[];
|
|
20
|
+
}
|
|
21
|
+
interface BaseExtensionEvent {
|
|
22
|
+
extension: GeminiCLIExtension;
|
|
23
|
+
}
|
|
24
|
+
export type ExtensionDisableEvent = BaseExtensionEvent;
|
|
25
|
+
export type ExtensionEnableEvent = BaseExtensionEvent;
|
|
26
|
+
export type ExtensionInstallEvent = BaseExtensionEvent;
|
|
27
|
+
export type ExtensionLoadEvent = BaseExtensionEvent;
|
|
28
|
+
export type ExtensionUnloadEvent = BaseExtensionEvent;
|
|
29
|
+
export type ExtensionUninstallEvent = BaseExtensionEvent;
|
|
30
|
+
export type ExtensionUpdateEvent = BaseExtensionEvent;
|
|
31
|
+
export declare class SimpleExtensionLoader implements ExtensionLoader {
|
|
32
|
+
private readonly extensions;
|
|
33
|
+
private _eventEmitter;
|
|
34
|
+
constructor(extensions: GeminiCLIExtension[]);
|
|
35
|
+
extensionEvents(): EventEmitter<ExtensionEvents>;
|
|
36
|
+
getExtensions(): GeminiCLIExtension[];
|
|
37
|
+
}
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { EventEmitter } from 'node:events';
|
|
7
|
+
export class SimpleExtensionLoader {
|
|
8
|
+
extensions;
|
|
9
|
+
_eventEmitter = new EventEmitter();
|
|
10
|
+
constructor(extensions) {
|
|
11
|
+
this.extensions = extensions;
|
|
12
|
+
}
|
|
13
|
+
extensionEvents() {
|
|
14
|
+
return this._eventEmitter;
|
|
15
|
+
}
|
|
16
|
+
getExtensions() {
|
|
17
|
+
return this.extensions;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=extensionLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionLoader.js","sourceRoot":"","sources":["../../../src/utils/extensionLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA8B3C,MAAM,OAAO,qBAAqB;IAEH;IADrB,aAAa,GAAG,IAAI,YAAY,EAAmB,CAAC;IAC5D,YAA6B,UAAgC;QAAhC,eAAU,GAAV,UAAU,CAAsB;IAAG,CAAC;IAEjE,eAAe;QACb,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -6,14 +6,16 @@
|
|
|
6
6
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
|
7
7
|
import { Config } from '../config/config.js';
|
|
8
8
|
import fs from 'node:fs';
|
|
9
|
-
import { setSimulate429, disableSimulationAfterFallback, shouldSimulate429,
|
|
9
|
+
import { setSimulate429, disableSimulationAfterFallback, shouldSimulate429, resetRequestCounter, } from './testUtils.js';
|
|
10
10
|
import { DEFAULT_GEMINI_FLASH_MODEL } from '../config/models.js';
|
|
11
11
|
import { retryWithBackoff } from './retry.js';
|
|
12
12
|
import { AuthType } from '../core/contentGenerator.js';
|
|
13
|
+
import { TerminalQuotaError } from './googleQuotaErrors.js';
|
|
13
14
|
vi.mock('node:fs');
|
|
14
15
|
// Update the description to reflect that this tests the retry utility's integration
|
|
15
16
|
describe('Retry Utility Fallback Integration', () => {
|
|
16
17
|
let config;
|
|
18
|
+
let mockGoogleApiError;
|
|
17
19
|
beforeEach(() => {
|
|
18
20
|
vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
19
21
|
vi.mocked(fs.statSync).mockReturnValue({
|
|
@@ -26,6 +28,11 @@ describe('Retry Utility Fallback Integration', () => {
|
|
|
26
28
|
cwd: '/test',
|
|
27
29
|
model: 'gemini-2.5-pro',
|
|
28
30
|
});
|
|
31
|
+
mockGoogleApiError = {
|
|
32
|
+
code: 429,
|
|
33
|
+
message: 'mock error',
|
|
34
|
+
details: [],
|
|
35
|
+
};
|
|
29
36
|
// Reset simulation state for each test
|
|
30
37
|
setSimulate429(false);
|
|
31
38
|
resetRequestCounter();
|
|
@@ -37,75 +44,49 @@ describe('Retry Utility Fallback Integration', () => {
|
|
|
37
44
|
// Use the generalized setter
|
|
38
45
|
config.setFallbackModelHandler(fallbackHandler);
|
|
39
46
|
// Call the handler directly via the config property
|
|
40
|
-
const result = await config.fallbackModelHandler('gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL);
|
|
47
|
+
const result = await config.fallbackModelHandler('gemini-2.5-pro', DEFAULT_GEMINI_FLASH_MODEL, new Error('test'));
|
|
41
48
|
// Verify it returns the correct intent
|
|
42
49
|
expect(result).toBe('retry');
|
|
43
50
|
});
|
|
44
51
|
// This test validates the retry utility's logic for triggering the callback.
|
|
45
|
-
it('should trigger onPersistent429
|
|
52
|
+
it('should trigger onPersistent429 on TerminalQuotaError for OAuth users', async () => {
|
|
46
53
|
let fallbackCalled = false;
|
|
47
|
-
// Removed fallbackModel variable as it's no longer relevant here.
|
|
48
|
-
// Mock function that simulates exactly 2 429 errors, then succeeds after fallback
|
|
49
54
|
const mockApiCall = vi
|
|
50
55
|
.fn()
|
|
51
|
-
.mockRejectedValueOnce(
|
|
52
|
-
.mockRejectedValueOnce(
|
|
56
|
+
.mockRejectedValueOnce(new TerminalQuotaError('Daily limit', mockGoogleApiError))
|
|
57
|
+
.mockRejectedValueOnce(new TerminalQuotaError('Daily limit', mockGoogleApiError))
|
|
53
58
|
.mockResolvedValueOnce('success after fallback');
|
|
54
|
-
// Mock the onPersistent429 callback (this is what client.ts/geminiChat.ts provides)
|
|
55
59
|
const mockPersistent429Callback = vi.fn(async (_authType) => {
|
|
56
60
|
fallbackCalled = true;
|
|
57
|
-
// Return true to signal retryWithBackoff to reset attempts and continue.
|
|
58
61
|
return true;
|
|
59
62
|
});
|
|
60
|
-
// Test with OAuth personal auth type, with maxAttempts = 2 to ensure fallback triggers
|
|
61
63
|
const result = await retryWithBackoff(mockApiCall, {
|
|
62
64
|
maxAttempts: 2,
|
|
63
65
|
initialDelayMs: 1,
|
|
64
66
|
maxDelayMs: 10,
|
|
65
|
-
shouldRetryOnError: (error) => {
|
|
66
|
-
const status = error.status;
|
|
67
|
-
return status === 429;
|
|
68
|
-
},
|
|
69
67
|
onPersistent429: mockPersistent429Callback,
|
|
70
68
|
authType: AuthType.LOGIN_WITH_GOOGLE,
|
|
71
69
|
});
|
|
72
|
-
// Verify fallback mechanism was triggered
|
|
73
70
|
expect(fallbackCalled).toBe(true);
|
|
74
|
-
expect(mockPersistent429Callback).toHaveBeenCalledWith(AuthType.LOGIN_WITH_GOOGLE, expect.any(
|
|
71
|
+
expect(mockPersistent429Callback).toHaveBeenCalledWith(AuthType.LOGIN_WITH_GOOGLE, expect.any(TerminalQuotaError));
|
|
75
72
|
expect(result).toBe('success after fallback');
|
|
76
|
-
// Should have: 2 failures, then fallback triggered, then 1 success after retry reset
|
|
77
73
|
expect(mockApiCall).toHaveBeenCalledTimes(3);
|
|
78
74
|
});
|
|
79
75
|
it('should not trigger onPersistent429 for API key users', async () => {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
76
|
+
const fallbackCallback = vi.fn();
|
|
77
|
+
const mockApiCall = vi
|
|
78
|
+
.fn()
|
|
79
|
+
.mockRejectedValueOnce(new TerminalQuotaError('Daily limit', mockGoogleApiError));
|
|
80
|
+
const promise = retryWithBackoff(mockApiCall, {
|
|
81
|
+
maxAttempts: 2,
|
|
82
|
+
initialDelayMs: 1,
|
|
83
|
+
maxDelayMs: 10,
|
|
84
|
+
onPersistent429: fallbackCallback,
|
|
85
|
+
authType: AuthType.USE_GEMINI, // API key auth type
|
|
87
86
|
});
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
maxAttempts: 5,
|
|
92
|
-
initialDelayMs: 10,
|
|
93
|
-
maxDelayMs: 100,
|
|
94
|
-
shouldRetryOnError: (error) => {
|
|
95
|
-
const status = error.status;
|
|
96
|
-
return status === 429;
|
|
97
|
-
},
|
|
98
|
-
onPersistent429: mockPersistent429Callback,
|
|
99
|
-
authType: AuthType.USE_GEMINI, // API key auth type
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
catch (error) {
|
|
103
|
-
// Expected to throw after max attempts
|
|
104
|
-
expect(error.message).toContain('Rate limit exceeded');
|
|
105
|
-
}
|
|
106
|
-
// Verify fallback was NOT triggered for API key users
|
|
107
|
-
expect(fallbackCalled).toBe(false);
|
|
108
|
-
expect(mockPersistent429Callback).not.toHaveBeenCalled();
|
|
87
|
+
await expect(promise).rejects.toThrow('Daily limit');
|
|
88
|
+
expect(fallbackCallback).not.toHaveBeenCalled();
|
|
89
|
+
expect(mockApiCall).toHaveBeenCalledTimes(1);
|
|
109
90
|
});
|
|
110
91
|
// This test validates the test utilities themselves.
|
|
111
92
|
it('should properly disable simulation state after fallback (Test Utility)', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flashFallback.test.js","sourceRoot":"","sources":["../../../src/utils/flashFallback.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EACL,cAAc,EACd,8BAA8B,EAC9B,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"flashFallback.test.js","sourceRoot":"","sources":["../../../src/utils/flashFallback.test.ts"],"names":[],"mappings":"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"}
|