""" Command-format shims — applied to clean_msg (protocol fields already stripped) before forwarding to the native host, and to responses before sending back. Add one entry per breaking command-format change: ("X.Y.Z", request_fn, response_fn) - request_fn(msg: dict) -> dict or None - response_fn(resp: bytes, command: str) -> bytes or None Entries must stay in ascending version order. adapt_request walks forward (oldest first); adapt_response walks backward. Current baseline: 0.9.3 — no command-format shims needed yet. """ from __future__ import annotations from typing import Callable from browser_cli.version_manager import parse_version # ── registry ────────────────────────────────────────────────────────────────── _COMPAT: list[tuple[str, Callable[[dict], dict] | None, Callable[[bytes, str], bytes] | None]] = [ # ("1.0.0", _req_1_0_0, _resp_1_0_0), ] def adapt_request(msg: dict, client_version: str) -> dict: """Upgrade a client message to the current browser command format.""" cv = parse_version(client_version) for version, req_fn, _ in _COMPAT: if cv < parse_version(version) and req_fn is not None: msg = req_fn(msg) return msg def adapt_response(resp: bytes, command: str, client_version: str) -> bytes: """Downgrade a native-host response to the format the client expects.""" cv = parse_version(client_version) for version, _, resp_fn in reversed(_COMPAT): if cv < parse_version(version) and resp_fn is not None: resp = resp_fn(resp, command) return resp