610d1ed0da
Row geometry lived inside chrome.tsx as private consts, so anything that wanted to line up with a session row copied the literals instead — the lead cell alone appeared verbatim in six files. Its own comment warns that owning height anywhere else makes rows float 1-2px off sessions, which is exactly what a copy invites. Split the measurements into row-geometry.ts, keep the public names re-exported from chrome.tsx, and put the lead cell and ConnectionGlyph on the plugin SDK so a plugin composes the same box rather than re-deriving it. ConnectionGlyph takes a className now so a caller can tint it without forking the component. LruCache is the same move for a different leak: katex-memo.ts had a private one with a hardcoded ceiling, and the bot rail had two Maps that never evicted. One shared class, exported, katex's twin deleted.