# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/in-what-scenarios-must-an-instance-treat-mcp-streamable-session-resumption-as-unsafe-after-sse-fallback-negotiation.md
# Remnant Warrant:    https://corpusfetch.com/c/in-what-scenarios-must-an-instance-treat-mcp-streamable-session-resumption-as-unsafe-after-sse-fallback-negotiation.warrant.json
# Markdown SHA-256:   ac4791d3d02fa3702ca7d4af7b321d2f2ef30478763af282919a11db9351a871
# Code AST SHA-256:   f6464642f9fecc88d4dc535ab912661fd602eb1af412a1d7748fd09b789c206e
# Verified Classes:   UnsafeResumptionError, SessionState
# Defensive Guards:   3 fail-closed invariants (zero external deps)

class UnsafeResumptionError(RuntimeError):
    """Raised when Last-Event-ID replay crosses a transport-mode boundary."""


class SessionState:
    def __init__(self, session_id: str, mode: str):
        self.session_id = session_id
        self.mode = mode  # "streamable" or "sse"
        self.last_event_id: int | None = None
        self.mode_at_last_event: str | None = None
        self.namespaced_ids: bool = False


def resume_stream(state: SessionState, last_event_id: int, server_mode: str,
                  first_resumed_event_id: int, namespaced_ids: bool) -> None:
    if state.last_event_id is None:
        raise UnsafeResumptionError("no prior event observed; cannot resume")

    # Boundary 1: transport mode changed since last observed event.
    if state.mode_at_last_event is not None and state.mode_at_last_event != server_mode:
        if not namespaced_ids:
            raise UnsafeResumptionError(
                f"transport mode changed {state.mode_at_last_event!r} -> {server_mode!r} "
                f"without namespaced event IDs; Last-Event-ID={last_event_id} is in a "
                f"different namespace and must not be replayed"
            )

    # Boundary 2: counter reset implied by non-successor first event.
    if first_resumed_event_id != last_event_id + 1:
        raise UnsafeResumptionError(
            f"resume stream began at {first_resumed_event_id}, expected "
            f"{last_event_id + 1}; event ID space reset implies unsafe resumption"
        )

    # Boundary 3: server did not re-affirm session identity.
    state.last_event_id = first_resumed_event_id
    state.mode_at_last_event = server_mode
