Key of the currently focused tab.
ReadonlyChanged$Emits after every model change so the owning component can mark for check.
Key of the tab currently "flashing" (the brief highlight a just-revealed channel tab gets when the agent first acts on it). Cleared by the owning component after a beat via ClearFlash.
Static ReadonlyActivityThe fixed key of the session-activity tab (pinned LAST, right-aligned).
The currently focused tab. Resolves to the active key when it still exists, else falls back to the Activity tab (when shown), else the first channel tab, else the Activity tab definition (so a consumer always has SOMETHING to render even on an empty strip).
Whether the Activity tab is currently part of the strip.
The ordered tabs: channel tabs (left), then the Activity tab LAST when shown. The strip right-aligns the Activity tab via a flex spacer, so this order also matches reading order.
Clears the transient flash highlight (called by the component after a beat).
Marks the tab with key as the FlashKey (the brief "just arrived" highlight)
WITHOUT changing focus — used by the auto-reveal path when the agent first acts on a
channel, so the user's eye lands on the tab that just came alive. No-op for unknown
keys; the owning component clears it after a beat via ClearFlash.
Focuses the tab with key (no-op when it doesn't exist or is already active).
Registers (or updates) an interactive-channel tab. Re-registering an existing key replaces its title/icon/color/plugin/content in place (this is how a placeholder upgrades to the real surface once the channel comes online). New channel tabs join the left cluster in registration order. A registration without an explicit RealtimeChannelTabRegistration.Color gets a deterministic color from its key.
The channel tab registration.
The (new or updated) tab.
Removes the channel tab with key. Rules:
false);The tab key to remove.
true when a tab was removed.
Shows or hides the gated Activity tab. Turning it ON when an empty strip was implicitly focusing Activity keeps focus on Activity; turning it OFF while it was focused falls focus back to the first channel tab (if any). No-op (no emission) when unchanged.
Whether ≥1 agent run has occurred (or review mode) — the gate.
Framework-free state for the call overlay's tabbed surface panel: the ordered tab list (CHANNEL tabs first — the marquee surfaces, left cluster — with the session-activity tab pinned LAST and right-aligned by the strip), the active tab, and the transient "flash" highlight for a just-revealed channel tab.
The Activity tab is GATED: it isn't listed until SetShowActivityTab(true) — i.e. once ≥1 agent run has occurred (or in review mode). Channel tabs appear only as channels come into play (the whiteboard up-front; every other channel on first use), so an idle voice-first session shows an empty/near-empty strip rather than a row of unused tabs.
Owned by
RealtimeSurfaceTabsComponent; kept free of Angular runtime imports so the add / focus / dedupe / flash logic is unit-testable in isolation. All collections are REPLACED (never mutated) on change, and every change emits Changed$.