Fix opaque Socket.IO failures (issue #1).
- Default transports to ["websocket", "polling"] so connections fall
back to HTTP long-polling when the MCP subprocess runs behind a
proxy/firewall that blocks raw WebSocket upgrades (the actual
failure mode reported in #1, where REST worked but Socket.IO did
not). Honor PINE_TRANSPORTS env var to override.
- Surface the full exception chain (cause_chain) and exception_type
in error responses. Previous "unexpected_error: One or more
namespaces failed to connect:" hid the underlying engine.io status
code; now callers see e.g. "Unexpected status code 502 in server
response" in cause_chain.
- Consolidate per-tool try/except duplication into format_error()
helper.
E2E tested against live backend: session_create, Socket.IO connect,
join_session, send_message, get_history all succeed with the new
defaults.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>