DevtoolsMessage:
    | { payload: WirePayload; state?: string; type: "DISPATCH" }
    | { payload?: unknown; state?: string; type: "ACTION" | "START" | "STOP" }

Wire-level discriminated union over the messages the extension may emit. This is the raw shape we receive from the panel — the protocol-seam decode normalises it into DispatchEvent before routing.

Three of the ten DISPATCH variants — JUMP_TO_STATE, JUMP_TO_ACTION, and IMPORT_STATE — receive a serialised snapshot via the top-level state?: string. The wire-shape declares it optional because the panel sometimes omits it on malformed dispatch; the protocol-seam decode is what enforces presence and produces the narrowed handler input. See DispatchEvent for the post-decode shape.