Member Junction
    Preparing search index...

    Server-only Meeting Controls channel — the facilitator surface. ONE instance per session.

    Unlike the whiteboard (resolved from the registry by the host via a parameterless ClassFactory construction), this channel needs a per-session IMeetingControlsEventSource from the bridge, so a bridge driver constructs it directly with MeetingControlsChannelDeps and hands it to the host's per-session plugin set. It has no client surface — the contract's GetServerToolDefinitions / ExecuteServerTool are the entire interface; there is no GetSurfaceComponent on the server half at all.

    Registered under MEETING_CONTROLS_CHANNEL_NAME so a seeded registry row can resolve a default (event-source-less) instance for discovery; a real session always injects the driver's event source.

    Hierarchy (View Summary)

    Index

    Constructors

    Properties

    The bound session context, available from Initialize until Dispose. null outside that window — guard with ?. in any code that can run early/late.

    Accessors

    • get ToolNamePrefix(): string

      The shared name prefix of every server-executed tool this channel contributes (e.g. 'MeetingControls_'). The host routes any tool call whose name starts with this prefix to THIS plugin's ExecuteServerTool, which is what prevents tool-name collisions when multiple channels are active in one session. A channel that contributes no server tools may leave the default empty string (the host then never routes any call to it).

      Mirrors the client half's ToolNamePrefix. Default: '' (no server tools).

      Returns string

    Methods

    • Tears the plugin down: release any per-session resources, then drop the context. Subclasses overriding this MUST call super.Dispose(). Invoked by the host after the post-close linger window elapses (or immediately when the host is configured with no linger).

      Returns void

    • Media tracks this channel can SOURCE — samples flowing from the channel's surface INTO the model. Default []: a channel contributes no media unless it says so.

      This is where the media plane and the semantic plane meet. A channel remains a tool surface; declaring a sourced track additionally lets the model watch that surface live. The whiteboard sourcing inbound video is what lets an agent see what it draws and correct itself mid-stroke, and see what the user draws directly rather than through a described diff. The remote browser sourcing inbound video is what lets the model watch the page continuously while the agent still acts through tools — a different quality of control, not a faster version of polling screenshots.

      Declared in CODE rather than metadata for the same reason GetServerToolDefinitions is: whether a surface can produce frames is a property of the implementation, not a deployment choice. Whether it should on a given session is negotiation (ModelConfiguration.Realtime.RequestedTracks intersected with the model's support), and a model with no video track simply falls back to the channel's tool-only behaviour.

      Returns readonly RealtimeTrackDescriptor[]

      Track descriptors this channel can produce (possibly empty).

    • Media tracks this channel can SINK — samples flowing from the model OUT to the channel's surface. Default [].

      Nothing in play emits non-audio outbound media yet; the contract admits it because direction is a property of a track rather than part of its type. An avatar is the obvious first case: a channel owning a render surface that sinks outbound video.

      Returns readonly RealtimeTrackDescriptor[]

      Track descriptors this channel can consume (possibly empty).

    • Invoked when the client's debounced channel-state save for THIS channel lands on the server, BEFORE the state is persisted onto the session's MJ: AI Agent Session Channels row.

      The plugin may validate/normalize the payload: return a replacement JSON string to persist instead of stateJson, or null to persist the original unchanged (the default). The host treats a thrown error, a non-string, or an empty string as "keep the original" — a plugin can therefore never lose a state save, only improve it.

      Parameters

      • stateJson: string

        The raw state-of-record payload the client submitted (already size-capped host-side).

      Returns Promise<string>

      The normalized payload to persist, or null to keep stateJson as-is.

    • Subclass hook invoked from Initialize once Context is bound — allocate any per-session state here. Default: no-op.

      Returns void

    • Invoked when the session is closed — from ANY close path: the user's explicit hang-up, the janitor's orphan/staleness sweeps, the graceful shutdown drain, or an error-path teardown (the reason says which). Fired once per session; Dispose follows after the host's brief post-close linger window (during which late state saves still route here first). Default: no-op.

      Parameters

      Returns Promise<void>