60e9f706b3
Adds the foundation for working OSC 8 hyperlinks in the transcript: - LinkRegion struct: (row, col_start, col_end, target) for a contiguous run of linked cells on one terminal row - write_osc8_open/close: emit OSC 8 escapes directly through a Write impl (bypassing ratatui's buffer which strips ESC bytes) - FRAME_LINKS thread-local: passes link regions from the render closure to ColorCompatBackend::draw(), where OSC 8 escapes are emitted out-of-band through the backend's Write impl - ColorCompatBackend integration: draw() reads FRAME_LINKS, emits OSC 8 open/close around linked cells The markdown renderer still uses the inline Span::content approach (known broken); the sentinel-color buffer-scan integration is a follow-up. This PR delivers the emission path and thread-local plumbing so the remaining work is confined to link detection in the render closure.