diff --git a/packages/cli/src/ui/AppContainer.tsx b/packages/cli/src/ui/AppContainer.tsx index b0f4c768f4..4f8cdc9f94 100644 --- a/packages/cli/src/ui/AppContainer.tsx +++ b/packages/cli/src/ui/AppContainer.tsx @@ -2297,14 +2297,11 @@ Logging in with Google... Restarting Gemini CLI to continue. } setNewAgents(null); }, -<<<<<<< HEAD -======= getPreferredEditor, clearAccountSuspension: () => { setAccountSuspensionInfo(null); setAuthState(AuthState.Updating); }, ->>>>>>> ea48bd941 (feat: better error messages (#20577)) }), [ handleThemeSelect, @@ -2356,6 +2353,7 @@ Logging in with Google... Restarting Gemini CLI to continue. newAgents, config, historyManager, + getPreferredEditor, ], ); diff --git a/packages/cli/src/ui/contexts/UIActionsContext.tsx b/packages/cli/src/ui/contexts/UIActionsContext.tsx index 95adb51c03..69981f83c6 100644 --- a/packages/cli/src/ui/contexts/UIActionsContext.tsx +++ b/packages/cli/src/ui/contexts/UIActionsContext.tsx @@ -82,11 +82,8 @@ export interface UIActions { setAuthContext: (context: { requiresRestart?: boolean }) => void; handleRestart: () => void; handleNewAgentsSelect: (choice: NewAgentsChoice) => Promise; -<<<<<<< HEAD -======= getPreferredEditor: () => EditorType | undefined; clearAccountSuspension: () => void; ->>>>>>> ea48bd941 (feat: better error messages (#20577)) } export const UIActionsContext = createContext(null); diff --git a/packages/core/src/utils/errors.test.ts b/packages/core/src/utils/errors.test.ts index 2cab277b36..ad4f8019fa 100644 --- a/packages/core/src/utils/errors.test.ts +++ b/packages/core/src/utils/errors.test.ts @@ -13,6 +13,14 @@ import { ForbiddenError, AccountSuspendedError, getErrorMessage, + getErrorType, + FatalAuthenticationError, + FatalCancellationError, + FatalConfigError, + FatalInputError, + FatalSandboxError, + FatalToolExecutionError, + FatalTurnLimitedError, } from './errors.js'; describe('getErrorMessage', () => { @@ -279,8 +287,6 @@ describe('toFriendlyError', () => { expect(toFriendlyError(error)).toBe(error); }); }); -<<<<<<< HEAD -======= describe('getErrorType', () => { it('should return error name for standard errors', () => { @@ -325,4 +331,3 @@ describe('getErrorType', () => { expect(getErrorType(undefined)).toBe('unknown'); }); }); ->>>>>>> ea48bd941 (feat: better error messages (#20577)) diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index 5b0a804ccc..13b840301f 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -12,6 +12,16 @@ interface GaxiosError { }; } +function isGaxiosError(error: unknown): error is GaxiosError { + return ( + typeof error === 'object' && + error !== null && + 'response' in error && + typeof (error as { response: unknown }).response === 'object' && + (error as { response: unknown }).response !== null + ); +} + export function isNodeError(error: unknown): error is NodeJS.ErrnoException { return error instanceof Error && 'code' in error; } @@ -28,6 +38,15 @@ export function getErrorMessage(error: unknown): string { } } +export function getErrorType(error: unknown): string { + if (!(error instanceof Error)) return 'unknown'; + + // Return constructor name if the generic 'Error' name is used (for custom errors) + return error.name === 'Error' + ? (error.constructor?.name ?? 'Error') + : error.name; +} + export class FatalError extends Error { constructor( message: string, @@ -110,12 +129,6 @@ interface ResponseData { } export function toFriendlyError(error: unknown): unknown { -<<<<<<< HEAD - if (error && typeof error === 'object' && 'response' in error) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion - const gaxiosError = error as GaxiosError; - const data = parseResponseData(gaxiosError); -======= // First, try structured parsing for TOS_VIOLATION detection. const googleApiError = parseGoogleApiError(error); if (googleApiError && googleApiError.code === 403) { @@ -136,7 +149,6 @@ export function toFriendlyError(error: unknown): unknown { // Fall back to basic Gaxios error parsing for other HTTP errors. if (isGaxiosError(error)) { const data = parseResponseData(error); ->>>>>>> ea48bd941 (feat: better error messages (#20577)) if (data && data.error && data.error.message && data.error.code) { switch (data.error.code) { case 400: