diff --git a/packages/core/src/qwen/qwenOAuth2.test.ts b/packages/core/src/qwen/qwenOAuth2.test.ts index 6596e12d3..920ca85e3 100644 --- a/packages/core/src/qwen/qwenOAuth2.test.ts +++ b/packages/core/src/qwen/qwenOAuth2.test.ts @@ -751,6 +751,7 @@ describe('getQwenOAuthClient', () => { beforeEach(() => { mockConfig = { isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false), + isInteractive: vi.fn().mockReturnValue(true), } as unknown as Config; originalFetch = global.fetch; @@ -839,9 +840,7 @@ describe('getQwenOAuthClient', () => { requireCachedCredentials: true, }), ), - ).rejects.toThrow( - 'No cached Qwen-OAuth credentials found. Please re-authenticate.', - ); + ).rejects.toThrow('Please use /auth to re-authenticate.'); expect(global.fetch).not.toHaveBeenCalled(); @@ -1007,6 +1006,7 @@ describe('getQwenOAuthClient - Enhanced Error Scenarios', () => { beforeEach(() => { mockConfig = { isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false), + isInteractive: vi.fn().mockReturnValue(true), } as unknown as Config; originalFetch = global.fetch; @@ -1202,6 +1202,7 @@ describe('authWithQwenDeviceFlow - Comprehensive Testing', () => { beforeEach(() => { mockConfig = { isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false), + isInteractive: vi.fn().mockReturnValue(true), } as unknown as Config; originalFetch = global.fetch; @@ -1405,6 +1406,7 @@ describe('Browser Launch and Error Handling', () => { beforeEach(() => { mockConfig = { isBrowserLaunchSuppressed: vi.fn().mockReturnValue(false), + isInteractive: vi.fn().mockReturnValue(true), } as unknown as Config; originalFetch = global.fetch; @@ -2043,6 +2045,7 @@ describe('SharedTokenManager Integration in QwenOAuth2Client', () => { it('should handle TokenManagerError types correctly in getQwenOAuthClient', async () => { const mockConfig = { isBrowserLaunchSuppressed: vi.fn().mockReturnValue(true), + isInteractive: vi.fn().mockReturnValue(true), } as unknown as Config; // Test different TokenManagerError types diff --git a/packages/core/src/qwen/qwenOAuth2.ts b/packages/core/src/qwen/qwenOAuth2.ts index ab89cdfcf..b18c0319d 100644 --- a/packages/core/src/qwen/qwenOAuth2.ts +++ b/packages/core/src/qwen/qwenOAuth2.ts @@ -516,9 +516,7 @@ export async function getQwenOAuthClient( } if (options?.requireCachedCredentials) { - throw new Error( - 'No cached Qwen-OAuth credentials found. Please re-authenticate.', - ); + throw new Error('Please use /auth to re-authenticate.'); } // If we couldn't obtain valid credentials via SharedTokenManager, fall back to @@ -740,11 +738,9 @@ async function authWithQwenDeviceFlow( // Emit device authorization event for UI integration immediately qwenOAuth2Events.emit(QwenOAuth2Event.AuthUri, deviceAuth); - // Always show the fallback message in non-interactive environments to ensure - // users can see the authorization URL even if browser launching is attempted. - // This is critical for headless/remote environments where browser launching - // may silently fail without throwing an error. - showFallbackMessage(deviceAuth.verification_uri_complete); + if (config.isBrowserLaunchSuppressed() || !config.isInteractive()) { + showFallbackMessage(deviceAuth.verification_uri_complete); + } // Try to open browser if not suppressed if (!config.isBrowserLaunchSuppressed()) {