1d4e9a5384
@DylanBohlender's follow-up caught that MCPAuthorizationLinkPrompt.render still ignored `width` and emitted `Copy URL: <full URL>` as one composed row. On any viewport narrower than the row (~272 columns for a Linear-shaped authorize URL), TUI#prepareLine's `truncateToWidth(..., Ellipsis.Omit)` silently clipped the trailing `code_challenge_method=S256` — the exact #4418 fingerprint reappearing inside the remote-safety fix. A remote user on a narrow terminal copying the rendered line would lose the S256 method again; the local shortcut below cannot help them (localhost isn't reachable), and the OSC 52 clipboard staged full URL isn't visible in their local browser. Component-level fix: honor `width` in render. - New `wrapUrlRows(label, url, width)` helper. - When `label + " " + url` fits in `width`, emit one inline row. - Otherwise emit the label on its own row and slice the URL into chunks of `width - indent`, each on its own row. - Floors the effective width at 16 columns so degenerately narrow terminals still emit every character; browsers strip whitespace when a multi-row selection is pasted into the address bar, so the reassembled URL is byte-identical. - `render(width)` now uses the helper for both the primary `Copy URL:` row and the additive `Local shortcut (this machine only):` row. Regression tests in `packages/coding-agent/test/modes/controllers/mcp-authorization-link.test.ts`: - Wide viewport (1000 cols): inline `Copy URL: <url>` layout preserved. - Narrow viewport (80 cols) + Linear-shaped URL: every row's visible width ≤ 80, and the chunks reassemble byte-for-byte to the URL — explicitly asserting the trailing `code_challenge_method=S256` survives. - Launch shortcut also wrapped at 80 cols; every row fits. - Degenerate viewport (4 cols): URL still reconstructs exactly; the 16-col floor governs chunk width. - Full URL remains the primary target even when a launch URL is present, and the shortcut row is omitted when launchUrl is absent or identical to the full URL.