Member Junction
    Preparing search index...

    The "call mode" overlay for a live real-time voice session. Hosted by the conversation chat area (<mj-conversation-chat-area>) behind Active$, it fills the conversation panel IN PLACE (position:absolute; inset:0 over the panel — not a fixed app-wide dialog), replacing the conversation view including the composer.

    Two-column layout:

    • MAIN column — RealtimeAgentBannerComponent (the unified APP-BAR: identity + turn-state + the disclosure-gated action cluster), the unified RealtimeSessionThreadComponent (or the level-0 pure-audio hero), the channel strip, and RealtimeComposerComponent (the bottom dock: phone-call strip ⇄ fused minis+composer).
    • RIGHT PANEL — RealtimeSurfaceTabsComponent: the TABBED surface panel. Tab 1 "Activity" hosts the session activity rail; one tab opens per ARTIFACT a delegated run produces (auto-focused + flashed on arrival, viewed read-only via the standard artifact viewer); ONE TAB PER INTERACTIVE CHANNEL the session resolved from the MJ: AI Agent Channels registry. Collapsible to a slim strip at the panel level.

    INTERACTIVE CHANNELS ARE PLUGINS — this shell is channel-agnostic. It subscribes RealtimeSessionService.ActiveChannels$ and registers one surface tab per BaseRealtimeChannelClient (key/title/icon from the plugin). Every plugin's surface lives on ONE STAGE (mj-media-stage) over the whole overlay: created the first time it is seen, laid over its tab's pane while that tab is active, and kept until its channel leaves (see RealtimeSurfaceStageModel). The PLUGIN wires its own inputs/outputs. Each surface starts where its channel's registry row places it (its tab unless the row says otherwise). The user moves it with "Move to…" (beside its tab, in the call pill, or on a picture-in-picture box): to the STAGE, a picture-in-picture box, its tab, or out of sight, as far as its channel allows. The moves are saved per user and carry over to later sessions. A surface on the stage is the FOCUS layout: the main call column collapses (.board-focus), the surface fills the overlay and the floating call pill appears. A channel may ask for it too (via its context's SetFocusMode → RealtimeSessionService.ChannelFocus$), which moves its surface to the stage or back.

    Owns the shared RealtimeSessionState — the SINGLE merge of the service's caption/delegation/narration streams — and passes it to both thread and rail via inputs, so neither duplicates subscription logic.

    DEVELOPER MODE: the controls row's gear toggles DevMode (per-session, off by default, never persisted), revealing "Open run" links on delegation cards / rail items and an "Open session" link in the banner. Clicking one emits NavigateRequest and MINIMIZES the call (via RealtimeSessionService.SetMinimized) — the session stays live while the host navigates to the record.

    SESSION REVIEW MODE: when the host supplies ReviewData (a loaded RealtimeSessionReview) and NO live session is active, the overlay renders what went down in that PAST session instead of a live call: the banner shows a "Session review" badge + lifecycle range + close-reason chip; the SAME thread/rail components render the historical caption turns and delegated-run cards (via RealtimeSessionState.LoadHistoricalItems); a read-only Whiteboard tab is registered ONLY when the session saved a parseable Whiteboard channel state. Everything live is DEAD in review — no mic, no captions stream, no composer, no channel strip; the controls collapse to a single "Start live session" button (StartLiveRequested, which resumes by chaining lastSessionId) and a Close button (ReviewClosed).

    Hierarchy (View Summary)

    Implements

    • AfterViewInit
    • AfterViewChecked
    • OnDestroy
    Index

    Constructors

    Properties

    Accessors

    Methods

    Constructors

    Properties

    AllowStartLive: boolean = true

    Review mode: whether the "Start live session" action is offered. A host turns it off where a voice session cannot start (the chat area does so while a draft fork is open).

    AvatarNoticeLabels:
        | Partial<
            Readonly<Record<"unknown" | RealtimeAvatarUnavailableReason, string>>,
        >
        | null = null

    The host's own words for why the call shows no avatar, per reason (for example its product's name for "this app"). A reason it leaves out keeps the stock line from ng-realtime-media (AVATAR_NOTICE_TEXT). unknown words a reason this version doesn't know, such as a newer server's, in place of AVATAR_NOTICE_CALL_UNKNOWN_REASON_TEXT.

    CallDevices: readonly MediaDevice[] = []

    The microphones and cameras the composer's device menu offers: the call's microphones, and its cameras while the camera is open (a browser names cameras only once the user has allowed one).

    CaptureOffers: RealtimeCaptureOffers = REALTIME_CAPTURE_OFFERS_NONE

    Which captures the call offers (see RealtimeSessionService.CaptureOffers$); the composer shows Camera and Share from it.

    CaptureStates: RealtimeCaptureStates = REALTIME_CAPTURES_OFF

    The user's camera and screen share (see RealtimeSessionService.Captures$).

    ChromeChanged: EventEmitter<"orb" | "console"> = ...

    Emitted whenever the EFFECTIVE chrome flips between 'orb' and 'console'.

    ComposerOpen: boolean = false

    Whether the typed-input dock is open — a TWO-WAY user door (the strip's Type control / the T hotkey open it; the dock's hide control closes it), volatile and reset per session. Typing never becomes permanent chrome.

    ConnectionState$: Observable<RealtimeConnectionState> = ...

    Live turn-state from the session service — drives the banner + connecting screen.

    ConnectionStateChanged: EventEmitter<RealtimeUiConnectionState> = ...

    Emitted when the connection lifecycle state changes (e.g. connecting → listening).

    ControlInvoked: EventEmitter<RealtimeControlId> = ...

    A generic hook fired when ANY control is invoked — even one the host hid via inputs and re-rendered itself. Lets a host observe/react to the full control surface from a single binding.

    CurrentUser: UserInfo | null = null

    The signed-in user, threaded to the surface panel's artifact viewer.

    DensityChanged: EventEmitter<RealtimeUxDensity> = ...

    Emitted when the interface density changes.

    DetailsPeek: boolean = false

    The strip's Details peek: shows the surface panel ON DEMAND while it isn't earned yet (disclosure level < 2) — Activity and channel surfaces exist before their content does. Cleared automatically once content earns the panel for real.

    DevMode: boolean = false

    Whether developer affordances (open-record links) are revealed. Per-session view state on this shell — off by default, reset with the overlay, never persisted.

    Disclosure: RealtimeDisclosureModel = ...

    PROGRESSIVE DISCLOSURE: the levels/milestones model behind the pure-audio-first UX (see RealtimeDisclosureModel). Loaded from UserInfoEngine at construction; content events (onSessionStateChanged, onChannelActivity) raise the volatile session level; milestones ratchet + persist when the call ends. REVIEW mode bypasses disclosure entirely — a past session always renders the full console.

    Ended: EventEmitter<void> = ...

    Emitted after the call ends so the host can react (visibility is driven by Active$).

    EnvironmentID: string = ''

    The active environment id, threaded to the surface panel's artifact viewer.

    FocusPillMuted: boolean = false

    Mic-muted state reflected on the focus pill's mute button.

    Hidden: boolean = false

    True while the call is MINIMIZED: the overlay hides itself (CSS, not destruction) so the host can show its floating "on call" pill WITHOUT losing this shell's merged session state (delegation cards ride non-replaying streams) or view state (dev mode, expanded chips, scroll position). The host binds this from Minimized$.

    IsPanelResizing: boolean = false

    True while the resize handle is mid-drag (brand-tints the handle).

    Minimized: EventEmitter<void> = ...

    Emitted when the user minimizes the call view (the call stays live).

    ModelName$: Observable<string | null> = ...

    Server-reported realtime model name for the active session — shown subtly in the banner.

    MuteChanged: EventEmitter<boolean> = ...

    Emitted when the mic mute is toggled; payload is the new muted state.

    Muted: boolean = false

    Local mic-muted state, the single source the resolver-independent controls reflect.

    NavigateRequest: EventEmitter<RealtimeNavigateRequest> = ...

    Emitted when a gear-gated developer link asks to open an entity record. The host is expected to bubble this through its standard record-open path (the chat area re-emits it on openEntityRecord, which Explorer routes via NavigationService). The overlay minimizes itself first so the live call survives the navigation.

    PanelCollapsed: boolean = false

    Whether the surface panel is collapsed to its slim strip, as the panel reports it. A panel created again starts this way (the overlay binds the panel's Collapsed). Back to false while the panel's area is hidden for any reason but room, so the panel comes back expanded after Details, a channel on the stage or a review turning into a live call, and as the user left it when only the call's width hid it.

    PanelWide: boolean = false

    Wide tier active (a content tab is focused) — drives the DEFAULT width only. The panel reports it when it flips; a panel created again also sets it from the tab it lands on.

    PanelWidthPx: number = SURFACE_PANEL_DEFAULT_WIDTH

    Current expanded panel width in px (rendered as the panel's inline width).

    PipRects: ReadonlyMap<string, MediaPipRect> = ...

    Where the user put each picture-in-picture box, by channel key, as fractions of the stage.

    PresenterSlot: HTMLElement | null = null

    The agent's place in the call, as last reported to the stage, or null while the call shows none.

    Provider: IMetadataProvider | null

    If specified, this provider will be used for communication and for all metadata purposes. By default, if not provided, the Metadata and RunView classes are used for this and the default GraphQLDataProvider is used which is connected to the same back-end MJAPI instance as the Metadata and RunView classes. If you want to have this component connect to a different MJAPI back-end, create an instance of a ProviderBase sub-class like GraphQLDataProvider/etc, and configure it as appropriate to connect to the MJAPI back-end you want to use, and then pass it in here.

    ReviewClosed: EventEmitter<void> = ...

    Review mode's Close: the host clears its review state, returning to the conversation.

    ReviewCues: MediaTranscriptCue[] = []

    The reviewed session's transcript cues (built from its turns) for the recording player's transcript panel. Empty outside review.

    ReviewWhiteboard: WhiteboardState | null = null

    The reviewed session's rehydrated whiteboard, when it saved a parseable Whiteboard channel state — rendered read-only by the review whiteboard tab. Null = no tab.

    SharePanels: readonly MediaSharePanel[] = []

    The panels of the page the Share menu offers under "This panel": those on screen, in page order, leaving out any that holds this call. Empty where the browser cannot share a single panel.

    ShowCaptions: boolean = false

    Whether the conversation renders as TEXT (the thread) or stays voice-first (the orb hero). A PERSISTED per-user preference (mj.realtimeVoice.captions.v1) — default OFF: voice-first, the orb owns the screen until the user opts into text.

    StartLiveRequested: EventEmitter<RealtimeStartLiveRequest> = ...

    Review mode's "Start live session": the host clears its review state and resumes the reviewed session as a new live call (chaining LastSessionId to restore channel states).

    Shared session state — single source for the thread AND the activity rail.

    SurfacePanelResized: EventEmitter<number> = ...

    Emitted (px) when the user finishes resizing the surface panel.

    SurfaceStage: RealtimeSurfaceStageModel = ...

    Which channel surfaces the stage holds and where each shows.

    TextRevealed: EventEmitter<void> = ...

    Emitted when the user reveals the transcript (opens text from the orb).

    VideoSources: readonly VideoSourceState[] = []

    The video sources the agent can or could see right now (see RealtimeSessionService.VideoSources$).

    "ɵdir": unknown
    "ɵfac": ɵɵFactoryDeclaration<BaseAngularComponent, never>

    Accessors

    • get PanelResizeDisabled(): boolean

      Resizing is meaningless while collapsed or when the surface fills (focus mode), and a host may hard-disable it via [AllowResize]="false" — in review the resolver's allowResize is false (no live surface to resize), so this also reads the host flag directly (defaulting to the historical true) rather than the resolved value, keeping drag available in review exactly as before.

      Returns boolean

    • get ProviderToUse(): IMetadataProvider

      Returns either the default Metadata provider or the one specified in the Provider property, if it was specified

      Returns IMetadataProvider

    • get RunQueryToUse(): IRunQueryProvider

      Returns either the default RunQuery provider or the one specified in the Provider property, if it was specified

      Returns IRunQueryProvider

    • get RunViewToUse(): IRunViewProvider

      Returns either the default RunView provider or the one specified in the Provider property, if it was specified

      Returns IRunViewProvider

    Methods

    • The gear popover picked an interface density — apply + persist + emit. Simple IS the "pure audio" surface (the standalone headphones control was folded into the gear here): it returns to the orb-only view AND makes it stick across refresh/next call, so picking it also closes any open Details peek so the surface is genuinely orb-only — matching the old app-bar "Pure audio" button exactly. In-session reveals ("Show the conversation", T-to-type, Details) stay available and ephemeral; switching density back to Standard/Pro/Auto restores the console.

      Parameters

      Returns void

    • TYPE-TO-COMPOSE: during a live call, pressing any single printable character (with nothing focused) reveals the composer, raises disclosure to the engaged level, AND seeds that very character into the draft — the user just starts typing and their first key is captured (the old dedicated "T" key is gone; "t"/"T" now types like any other letter, and the visible "press T to type" hint was removed in favour of this natural behaviour). Ignored while review/minimized/inactive, with Ctrl/Cmd/Alt modifiers (don't hijack shortcuts), for non-printable named keys (Enter/Tab/Arrow/Escape/F-keys → key.length > 1), for a bare Space (ambiguous — no message starts with a space), or when an editable element / a keyboard-capturing surface (the remote-browser canvas) already holds focus.

      Parameters

      • event: KeyboardEvent

      Returns void