Handle budget_reached as a terminal session budget error (#59228)

## What changed

Map provider `budget_reached` errors to `SessionBudgetExceeded` for HTTP 400 responses and streaming failures. End SSE streams immediately on this error, ignoring retry headers and later completion events, and display `budget reached` in the TUI.

## Testing

Add coverage for HTTP error classification, immediate SSE termination without retries, WebSocket error delivery and subsequent request recovery, and TUI error rendering and task-state cleanup.

GitOrigin-RevId: 6a62d699cdb9cb446214cacfacd0c9ed68bf21a6
This commit is contained in:
yuning-oai
2026-11-03 21:02:34 +00:00
committed by copyberry
parent 8960c363c6
commit 0ed9d6fa4b
13 changed files with 143 additions and 77 deletions
@@ -82,6 +82,7 @@ pub fn telemetry_api_error_message(error: &ApiError) -> String {
ApiError::ContextWindowExceeded => "context window exceeded".to_string(),
ApiError::QuotaExceeded => "quota exceeded".to_string(),
ApiError::UsageNotIncluded => "usage not included".to_string(),
ApiError::SessionBudgetExceeded => "session budget exceeded".to_string(),
ApiError::Retryable { .. } => "retryable error".to_string(),
ApiError::RateLimitExceeded { .. } => "rate limit exceeded".to_string(),
ApiError::RateLimit(_) => "rate limit".to_string(),