OptionalAllowedWhere the user may move the channel's surface. Null or empty → anywhere. A Placement missing from this list is replaced by the first placement listed here.
OptionalColorChrome accent. Prefer a semantic design-token name (e.g. "--mj-brand-primary"); hex allowed but discouraged.
OptionalDisplayHuman label for the tab/chrome. Null → fall back to the channel's Name.
OptionalGroupOptional group for clustering channels in the UI. Null → ungrouped.
OptionalIconFont Awesome class, e.g. "fa-solid fa-satellite-dish".
OptionalPlacementWhere the channel's surface shows when a call starts: "stage" fills the call, "pip" floats in a picture-in-picture box over it, "tab" sits on its tab in the side panel, "hidden" shows nowhere until the user moves it. Null → "tab". The user's own move wins over this, when AllowedPlacements allows it.
OptionalSortDisplay order within a group/list.
Channel-definition-level presentation/chrome config.
Stored as a JSON object in the
UIConfigcolumn of theMJ: AI Agent Channelsentity. CodeGen emits a strongly-typedUIConfigObjectaccessor onAIAgentChannelEntitythat returnsMJAIAgentChannelEntity_IChannelUIConfig | null.Distinct from the channel's
ConfigSchemacolumn, which validates the per-sessionAIAgentSessionChannel.Configstate-of-record. This bag is the channel-definition's own UI chrome, read in-memory by the host when rendering channel tabs and placing the channel's surface. Extensible with no DB change — add future chrome fields here.