a565e2d493
Relocated onto the decomposed module layout and hardened: - Trigger covers the rejection CLASS, not just literal 400: SSE-only servers' load balancers answer the chunked Streamable HTTP initialize POST with 400/405/406/411, and the mcp>=2.0 SDK surfaces many such rejections as an opaque -32603 'Server returned an error response' (error class per #104363 by @RohithPariki). Timeouts and 5xx never trigger the fallback: they are not transport mismatches. - Reconnect exclusion via _ever_connected instead of _ready: run() clears _ready before re-entering the transport, so the original guard also fired on reconnects after a proven session. - Successful fallback latches _sse_fallback so reconnects go straight to SSE, and logs a warning suggesting the user pin transport: sse. - Both transports failing raises a ConnectionError naming both errors and suggesting transport: sse / checking the URL. - No fallback with strict_redirect_headers (SSE cannot enforce that boundary) or when transport is explicitly configured. - Tests trimmed to 3 invariant contracts (proven red on base): fallback connects + latches; no fallback on reconnect/timeout/5xx; both-fail error is actionable. The extracted SSE path reuses _sse_transport/_serve_transport from main, preserving the bounded handshake timeout and reconnect-retry semantics. Fixes #53676