diff --git a/packages/cli/src/ui/components/DetailedMessagesDisplay.tsx b/packages/cli/src/ui/components/DetailedMessagesDisplay.tsx
index 2daa1c39e3..7cf719383d 100644
--- a/packages/cli/src/ui/components/DetailedMessagesDisplay.tsx
+++ b/packages/cli/src/ui/components/DetailedMessagesDisplay.tsx
@@ -76,7 +76,7 @@ export const DetailedMessagesDisplay: React.FC<
>
- Debug Console (F12 to close)
+ Debug console (F12 to close)
diff --git a/packages/cli/src/ui/components/LoadingIndicator.tsx b/packages/cli/src/ui/components/LoadingIndicator.tsx
index a48451b26c..673ab8c998 100644
--- a/packages/cli/src/ui/components/LoadingIndicator.tsx
+++ b/packages/cli/src/ui/components/LoadingIndicator.tsx
@@ -65,10 +65,10 @@ export const LoadingIndicator: React.FC = ({
currentLoadingPhrase === INTERACTIVE_SHELL_WAITING_PHRASE
? currentLoadingPhrase
: thought?.subject
- ? (thoughtLabel ?? thought.subject)
+ ? `Gemini is thinking about ${thoughtLabel ?? thought.subject.trim()}`
: currentLoadingPhrase ||
(streamingState === StreamingState.Responding
- ? 'Thinking...'
+ ? 'Gemini is thinking...'
: undefined);
const cancelAndTimerContent =
@@ -81,7 +81,7 @@ export const LoadingIndicator: React.FC = ({
!forceRealStatusOnly &&
showWit &&
wittyPhrase &&
- primaryText === 'Thinking...' ? (
+ (primaryText === 'Thinking...' || primaryText === 'Gemini is thinking...') ? (
{wittyPhrase}
diff --git a/packages/cli/src/ui/hooks/useGeminiStream.test.tsx b/packages/cli/src/ui/hooks/useGeminiStream.test.tsx
index 7858ad6ede..50e1119d9b 100644
--- a/packages/cli/src/ui/hooks/useGeminiStream.test.tsx
+++ b/packages/cli/src/ui/hooks/useGeminiStream.test.tsx
@@ -1048,7 +1048,7 @@ describe('useGeminiStream', () => {
).toBe(false);
expect(
infoTexts.some((text) =>
- text.includes('This request failed. Press F12 for diagnostics'),
+ text.includes('Request failed. Press F12 for diagnostics'),
),
).toBe(false);
});
@@ -1108,15 +1108,13 @@ describe('useGeminiStream', () => {
([item]) => (item as { text?: string }).text ?? '',
);
const noteIndex = infoTexts.findIndex((text) =>
- text.includes(
- 'Some internal tool attempts failed before this final error',
- ),
+ text.includes('Previous tool attempts failed'),
);
const stopIndex = infoTexts.findIndex((text) =>
text.includes('Agent execution stopped: Stop reason from hook'),
);
const failureHintIndex = infoTexts.findIndex((text) =>
- text.includes('This request failed. Press F12 for diagnostics'),
+ text.includes('Request failed. Press F12 for diagnostics'),
);
expect(noteIndex).toBeGreaterThanOrEqual(0);
expect(stopIndex).toBeGreaterThanOrEqual(0);
diff --git a/packages/cli/src/ui/hooks/useGeminiStream.ts b/packages/cli/src/ui/hooks/useGeminiStream.ts
index 54006d2ab2..2fff2576aa 100644
--- a/packages/cli/src/ui/hooks/useGeminiStream.ts
+++ b/packages/cli/src/ui/hooks/useGeminiStream.ts
@@ -110,9 +110,9 @@ enum StreamProcessingStatus {
}
const SUPPRESSED_TOOL_ERRORS_NOTE =
- 'Some internal tool attempts failed before this final error. Press F12 for diagnostics, or run /settings and change "Error Verbosity" to full for details.';
+ 'Previous tool attempts failed. Press F12 for diagnostics or set ui.errorVerbosity=full for details';
const LOW_VERBOSITY_FAILURE_NOTE =
- 'This request failed. Press F12 for diagnostics, or run /settings and change "Error Verbosity" to full for full details.';
+ 'Request failed. Press F12 for diagnostics or set ui.errorVerbosity=full for details';
function getBackgroundedToolInfo(
toolCall: TrackedCompletedToolCall | TrackedCancelledToolCall,
diff --git a/packages/cli/src/ui/hooks/useLoadingIndicator.test.tsx b/packages/cli/src/ui/hooks/useLoadingIndicator.test.tsx
index db6dc3f1e9..140b7aeed0 100644
--- a/packages/cli/src/ui/hooks/useLoadingIndicator.test.tsx
+++ b/packages/cli/src/ui/hooks/useLoadingIndicator.test.tsx
@@ -237,7 +237,7 @@ describe('useLoadingIndicator', () => {
retryStatus,
);
- expect(result.current.currentLoadingPhrase).toContain('Trying to reach');
+ expect(result.current.currentLoadingPhrase).toContain('Retrying');
expect(result.current.currentLoadingPhrase).toContain('Attempt 3/3');
});
@@ -258,7 +258,7 @@ describe('useLoadingIndicator', () => {
);
expect(result.current.currentLoadingPhrase).not.toBe(
- "This is taking a bit longer, we're still on it.",
+ 'System busy. Retrying...',
);
});
@@ -279,7 +279,7 @@ describe('useLoadingIndicator', () => {
);
expect(result.current.currentLoadingPhrase).toBe(
- "This is taking a bit longer, we're still on it.",
+ 'System busy. Retrying...',
);
});
diff --git a/packages/cli/src/ui/hooks/useLoadingIndicator.ts b/packages/cli/src/ui/hooks/useLoadingIndicator.ts
index 6d13615761..aa7a9cbcff 100644
--- a/packages/cli/src/ui/hooks/useLoadingIndicator.ts
+++ b/packages/cli/src/ui/hooks/useLoadingIndicator.ts
@@ -82,9 +82,9 @@ export const useLoadingIndicator = ({
const retryPhrase = retryStatus
? errorVerbosity === 'low'
? retryStatus.attempt >= LOW_VERBOSITY_RETRY_HINT_ATTEMPT_THRESHOLD
- ? "This is taking a bit longer, we're still on it."
+ ? 'System busy. Retrying...'
: null
- : `Trying to reach ${getDisplayString(retryStatus.model)} (Attempt ${retryStatus.attempt + 1}/${retryStatus.maxAttempts})`
+ : `Retrying ${getDisplayString(retryStatus.model)} (Attempt ${retryStatus.attempt + 1}/${retryStatus.maxAttempts})`
: null;
return {
diff --git a/packages/core/src/utils/errorParsing.test.ts b/packages/core/src/utils/errorParsing.test.ts
index 291145d2e8..39e1634a88 100644
--- a/packages/core/src/utils/errorParsing.test.ts
+++ b/packages/core/src/utils/errorParsing.test.ts
@@ -11,8 +11,8 @@ import { AuthType } from '../core/contentGenerator.js';
import type { StructuredError } from '../core/turn.js';
describe('parseAndFormatApiError', () => {
- const vertexMessage = 'request a quota increase through Vertex';
- const geminiMessage = 'request a quota increase through AI Studio';
+ const vertexMessage = 'request a quota increase in Vertex';
+ const geminiMessage = 'request a quota increase in AI Studio';
it('should format a valid API error JSON', () => {
const errorMessage =
@@ -34,7 +34,7 @@ describe('parseAndFormatApiError', () => {
);
expect(result).toContain('[API Error: Rate limit exceeded');
expect(result).toContain(
- 'Possible quota limitations in place or slow response times detected. Switching to the gemini-2.5-flash model',
+ 'System busy or quota limit reached. Switching to gemini-2.5-flash for the rest of this session.',
);
});
diff --git a/packages/core/src/utils/errorParsing.ts b/packages/core/src/utils/errorParsing.ts
index bad61ea9e2..4eda62e2d5 100644
--- a/packages/core/src/utils/errorParsing.ts
+++ b/packages/core/src/utils/errorParsing.ts
@@ -10,13 +10,13 @@ import type { UserTierId } from '../code_assist/types.js';
import { AuthType } from '../core/contentGenerator.js';
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';
+ '\nRate limit reached. Try again later, request a quota increase in AI Studio, or switch /auth method';
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';
+ '\nRate limit reached. Try again later, request a quota increase in Vertex, or switch /auth method';
const getRateLimitErrorMessageDefault = (
fallbackModel: string = 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.`;
+ `\nSystem busy or quota limit reached. Switching to ${fallbackModel} for the rest of this session.`;
function getRateLimitMessage(
authType?: AuthType,
diff --git a/pr_keith_thinking b/pr_keith_thinking
new file mode 160000
index 0000000000..83c24a5189
--- /dev/null
+++ b/pr_keith_thinking
@@ -0,0 +1 @@
+Subproject commit 83c24a518927b399d89b89437b01298831dee742