%% 3-layer resilience model
%% Reflects: src/shared/utils/circuitBreaker.ts, src/sse/services/auth.ts,
%% open-sse/services/accountFallback.ts
%% v3.8.0
flowchart TB
Req["Request"] --> L1{"Provider Circuit Breaker
(scope: whole provider)"}
L1 -->|CLOSED| L2
L1 -->|OPEN| Block1["Skip provider
(or 503 retry-after)"]
L1 -->|HALF_OPEN| Probe["Allow probe"]
Probe --> L2
L2{"Connection Cooldown
(scope: one account/key)"} -->|available| L3
L2 -->|cooling down| Skip2["Skip this connection
fall back to next"]
L3{"Model Lockout
(scope: provider × conn × model)"} -->|allowed| Exec["Execute upstream"]
L3 -->|locked| Skip3["Fall back to next model"]
Exec -->|success| Clear["Clear cooldowns/lockouts"]
Exec -->|"408 / 500 / 502 / 503 / 504"| TripL1["Trip provider breaker"]
Exec -->|"401 / 403 (account)"| TripL2["Start connection cooldown"]
Exec -->|"429 quota (model)"| TripL3["Start model lockout"]