Sanity bounds for tear-off window dimensions. Frontend caps via
window.outerWidth/Height (CSS/DIP) but a malformed or hostile
arg should not be able to size the new window absurdly.
Phase 6 — frontend signal that a pool window’s renderer is
ready to receive pool:promote. Called from awaitPoolPromote
AFTER the listener is installed. Only after this signal does
the window enter the pool queue (otherwise emit_event_to_window
would race the listener install and lose promote events).
Phase 6 — promote a pre-warmed pool window for tear-off.
Returns the promoted window’s label, or an error string if the
pool was empty (caller should fall back to open_window_at_position).
Args: { workspaceId, screenX, screenY }.
Poll state.browsers for label until its host’s HWND is non-null
or the deadline elapses. Returns the HWND as a raw pointer.
Releases the browsers mutex between polls so on_after_created can
register on the UI thread.