The dedicated line window

Featurekamo-internal
Shipped
August 26, 2026 at 3:37 AM UTC
Author
kamo
Commit
e4d2c18

The call now lives in a window a refresh of the workspace cannot touch. SoftphoneProvider becomes owner-or-follower. Only the owner REGISTERs and opens the STOMP socket; a follower renders mirrored state, sends commands over the bridge, and stays silent — no ringtone, no ringback, no event sounds, because it holds no session and its Answer button would do nothing. Where Web Locks is unavailable the tab simply owns the line and there is no window, which is today's behaviour: never degrade into two registrations. /phone renders through a third AuthedChrome branch carrying SoundProvider and SoftphoneProvider and nothing else. Excluding ToolWindowRestore is load-bearing — its guard is module scope, so a fresh document would replay the member's whole dock inside the popup — and so is excluding SessionManager, which navigates to /logout on expiry and would delete the shared Redis session out from under the workspace tab. For the same reason useUserInfo and apiClient now refuse to self-navigate from this route; a lost session is rendered, not redirected. The window opens synchronously from a click in NavTop (transient activation does not survive an await), is named so a second click focuses rather than duplicating, and reports a blocked popup instead of failing silently — the in-page softphone keeps working either way. Inside: a Start gate that buys sticky activation before anything needs it, reload-key swallowing, a close confirm, and a screen wake lock.

All changes

Like what you see shipping?

Every one of these updates lands in your workspace automatically. Start free and watch it grow week after week.

Start Free ForeverView Pricing