fix: suppress Claude 502 provider errors from chat output

This commit is contained in:
Eyejoker
2026-03-26 10:11:24 +09:00
parent bba19b0c0f
commit a330ebdf2a
7 changed files with 239 additions and 2 deletions

View File

@@ -4,6 +4,7 @@ import type { AgentOutput } from './agent-runner.js';
// ── Mocks ──────────────────────────────────────────────────────
vi.mock('./agent-error-detection.js', () => ({
detectClaudeProviderFailureMessage: vi.fn(() => ''),
isClaudeUsageExhaustedMessage: vi.fn(() => false),
isClaudeOrgAccessDeniedMessage: vi.fn(() => false),
isClaudeAuthExpiredMessage: vi.fn(() => false),
@@ -22,6 +23,7 @@ vi.mock('./codex-token-rotation.js', () => ({
}));
import {
detectClaudeProviderFailureMessage,
isClaudeUsageExhaustedMessage,
isClaudeOrgAccessDeniedMessage,
isClaudeAuthExpiredMessage,
@@ -61,6 +63,7 @@ function errorOutput(error: string): AgentOutput {
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(detectClaudeProviderFailureMessage).mockReturnValue('');
vi.mocked(isClaudeUsageExhaustedMessage).mockReturnValue(false);
vi.mocked(isClaudeOrgAccessDeniedMessage).mockReturnValue(false);
vi.mocked(isClaudeAuthExpiredMessage).mockReturnValue(false);
@@ -167,6 +170,25 @@ describe('evaluateStreamedOutput', () => {
});
});
describe('Claude provider failure banner', () => {
it('suppresses Cloudflare 502 HTML and returns newTrigger', () => {
vi.mocked(detectClaudeProviderFailureMessage).mockReturnValue(
'overloaded',
);
const result = evaluateStreamedOutput(
successOutput('API Error: 502 <html><center>cloudflare</center></html>'),
freshState(),
claudeOpts,
);
expect(result.shouldForwardOutput).toBe(false);
expect(result.newTrigger).toEqual({ reason: 'overloaded' });
expect(result.state.streamedTriggerReason).toEqual({
reason: 'overloaded',
});
});
});
describe('Claude org-access-denied banner', () => {
it('suppresses output and returns newTrigger', () => {
vi.mocked(isClaudeOrgAccessDeniedMessage).mockReturnValue(true);