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); the tab pane creates the plugin's surface component dynamically and the PLUGIN wires its own inputs/outputs. The only channel-generic affordance the shell owns is the FOCUS layout: any channel may request it (via its context's SetFocusModeRealtimeSessionService.ChannelFocus$), which collapses the main call column (.board-focus) and shows the floating call pill.

    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
    • OnDestroy
    Index

    Constructors

    Properties

    Accessors

    Methods

    Constructors

    Properties

    ChannelFocusMode: boolean = false

    True while a channel surface is in FOCUS mode: the main call column collapses (.board-focus on the overlay) and a compact floating call pill (orb + state + mute / show-thread / end) rides over the surface.

    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 (reported by the panel).

    PanelWide: boolean = false

    Wide tier active (a content tab is focused) — drives the DEFAULT width only.

    PanelWidthPx: number = SURFACE_PANEL_DEFAULT_WIDTH

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

    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.

    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.

    TextRevealed: EventEmitter<void> = ...

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

    "ɵdir": unknown
    "ɵfac": unknown

    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 RunReportToUse(): IRunReportProvider

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

      Returns IRunReportProvider

    • 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