diff --git a/pkg/providers/claude_cli_provider.go b/pkg/providers/claude_cli_provider.go index f63b6f00d..1183f5618 100644 --- a/pkg/providers/claude_cli_provider.go +++ b/pkg/providers/claude_cli_provider.go @@ -63,6 +63,9 @@ func (p *ClaudeCliProvider) Chat( cmd.Stderr = &stderr if err := cmd.Run(); err != nil { + if ctx.Err() == context.DeadlineExceeded { + return nil, fmt.Errorf("claude cli timed out after %s: %w", p.timeout, context.DeadlineExceeded) + } stderrStr := strings.TrimSpace(stderr.String()) stdoutStr := strings.TrimSpace(stdout.String()) switch { diff --git a/pkg/providers/codex_cli_provider.go b/pkg/providers/codex_cli_provider.go index 5cfca37f8..7d347aa54 100644 --- a/pkg/providers/codex_cli_provider.go +++ b/pkg/providers/codex_cli_provider.go @@ -86,6 +86,9 @@ func (p *CodexCliProvider) Chat( } if err != nil { + if ctx.Err() == context.DeadlineExceeded { + return nil, fmt.Errorf("codex cli timed out after %s: %w", p.timeout, context.DeadlineExceeded) + } if ctx.Err() == context.Canceled { return nil, ctx.Err() } diff --git a/pkg/providers/error_classifier.go b/pkg/providers/error_classifier.go index fd9bf1e81..46d3b4c82 100644 --- a/pkg/providers/error_classifier.go +++ b/pkg/providers/error_classifier.go @@ -2,6 +2,7 @@ package providers import ( "context" + "errors" "regexp" "strings" ) @@ -114,7 +115,7 @@ func ClassifyError(err error, provider, model string) *FailoverError { } // Context deadline exceeded: treat as timeout, always fallback. - if err == context.DeadlineExceeded { + if errors.Is(err, context.DeadlineExceeded) { return &FailoverError{ Reason: FailoverTimeout, Provider: provider, diff --git a/pkg/providers/gemini_cli_provider.go b/pkg/providers/gemini_cli_provider.go index 2c644f378..1a974754f 100644 --- a/pkg/providers/gemini_cli_provider.go +++ b/pkg/providers/gemini_cli_provider.go @@ -63,6 +63,9 @@ func (p *GeminiCliProvider) Chat( cmd.Stderr = &stderr if err := cmd.Run(); err != nil { + if ctx.Err() == context.DeadlineExceeded { + return nil, fmt.Errorf("gemini cli timed out after %s: %w", p.timeout, context.DeadlineExceeded) + } stderrStr := strings.TrimSpace(stderr.String()) stdoutStr := strings.TrimSpace(stdout.String()) switch {