v2.2.1 — Test pillar: assertions, CI runner, regression coverage
A patch release rolling up four workbench fixes surfaced during v2.2.0 hands-on testing. No API, package, or wire changes — workspaces, collections, recordings and flows load identically.
Fixes
Response Map pane no longer appears for methods with no coordinates
The split JSON | Map response layout was showing an empty Map pane for methods whose response carries no coordinate data (e.g. Petstore's getPetById). preferredSplitExtensionForMethod fell through to a race-only fallback — which returns the map split whenever the Map plugin is loaded — even when the effective-annotation cache for the method was resolved and carried no split-kind. It now treats a resolved cache as authoritative and returns no split, so the JSON viewer fills the full response width and the empty Map (and the dead space it created) are gone. The fallback still applies during the genuine first-render race before /api/semantics/effective lands.
Request/Response splitter matched to the sidebar splitter
The divider between the request and response panes is now visually and behaviourally aligned with the sidebar splitter: a 1 px hairline with a 0-footprint ±5 px hit overlay (replacing the earlier 10 px bar whose transparent half left a gap between the line and the response pane), a single centred 3-dot grip, and the same dwell-gated accent-on-hover. The two directional maximize chevrons stay — the request/response divider collapses in both directions (request-only / response-only), unlike the one-way sidebar splitter.
New segmented pane view-switcher
A segmented Request · Split · Response control now sits in the statusbar next to the split-orientation toggle — the explicit, discoverable counterpart to the splitter's drag + edge chevrons. It drives the same maximize state (window.__bowirePaneView, rebound per render), so the switcher, the chevrons, and a splitter drag stay in sync with no new state model.
Compose parameter / header inputs no longer jump
Typing into a new Compose Parameter or Header row could tear focus off the field ("two clicks to activate") and shuffle the row's cells ("the input springs"). The KV rows lacked stable ids, so morphdom matched them positionally and replaced the input nodes on the focus-out render that appends a fresh trailing row. Each row now carries a stable, non-enumerable per-row id, so morphdom preserves the input nodes across that render — focus survives and the cells stay aligned. The id never leaks into saved presets or request exports.
Acknowledgements
Thanks for the fast hands-on feedback on the v2.2.0 build that surfaced all four.
The full commit list, contributors, and compare-URL diff are auto-generated below.
Full Changelog: v2.2.0...v2.2.1