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