OptionalClientApp-scoped static client tools, by tool-definition reference. Surfaced to every agent acting in this app and resolved by the unified client-tool resolver.
OptionalClientToolDefinitionID?: stringReferences MJ: AI Client Tool Definitions by ID (preferred) or Name.
OptionalName?: stringOptionalPriority?: numberOptional app-level priority for first-match-wins resolution.
OptionalDefaultThe app's default/lead agent (conversational default AND realtime lead identity). Agent ID.
OptionalRealtimeRealtime co-agent overrides that layer into the config cascade above the agent's own TypeConfiguration (and below runtime overrides). Only keys set here override; unset keys fall through to the agent / type defaults.
OptionalChannels?: {Which interactive realtime channels (Whiteboard, Remote Browser, an Open App's own widget, …)
this app's sessions get. Layers into the same per-channel scoping cascade as the agent's own
realtime.channels configuration (see @memberjunction/ai-core-plus ResolveRealtimeChannelScope):
a layer's Include turns a channel on (the only way to get an opt-in channel), its Exclude
turns one off, and the MOST SPECIFIC layer to mention a channel wins; within one layer Exclude
beats Include. A channel's registry row IsActive = false remains a master kill switch that
nothing here can override. Channel keys match the channel's name, case-insensitively.
OptionalConfig?: { [channelKey: string]: { [key: string]: unknown } }Per-channel opaque configuration, keyed by channel key; delivered to the channel at session start.
OptionalDisplayPolicy?: { [channelKey: string]: "open-on-start" | "on-demand" | "headless" }Per-channel display override, keyed by channel key.
OptionalExclude?: string[]Channel keys to turn OFF. Beats Include within the same layer.
OptionalInclude?: string[]Channel keys to turn ON (required for opt-in channels; a no-op for all-sessions ones).
OptionalRequireZeroDataRetentionFor?: ("state" | "pixels")[]Exposure levels that need a zero-data-retention model. When the session model's configuration
does not declare Privacy.ZeroDataRetention: true, exposure is lowered to below the lowest level
listed, and the agent is told why. Applies to every channel in the session.
OptionalDisclosure?: "silent" | "mention" | "hand-voice"Default delegation disclosure for this app's co-agent.
OptionalModelPreference?: stringModel preference override (AI Models Name or ID).
OptionalPersona?: { SpeakingStyle?: string; Tone?: string }Persona override folded into the session system prompt at mint.
OptionalRelevantAgents relevant to this app — the static allowed-target set for the co-agent. Union-accumulated at runtime with agent-type defaults and dynamic (channel) registrations.
OptionalAdvertised?: booleanIf true, surfaced in pickers / proactively offered; if false, available but not advertised.
Agent ID (loop or flow — transparent to the co-agent).
OptionalDisclosure?: "silent" | "mention" | "hand-voice"Per-target disclosure override; falls back to the effective default disclosure.
OptionalLabel?: stringOptional friendly label for the capability manifest / disclosure ("Skip", "Query Builder").
App-scoped agent configuration.
Stored as a JSON object in the
AgentSettingscolumn of theApplicationsentity. CodeGen emits a strongly-typedAgentSettingsObjectaccessor onApplicationEntitythat returnsMJApplicationEntity_IAgentSettings | null.Read by the conversations default-agent resolver (for the app's default/lead agent) and by the realtime co-agent cascade (relevant agents, app-scoped client tools, and realtime persona/disclosure overrides). Every field is optional — an app opts into exactly what it needs.
Disclosure values ('silent' | 'mention' | 'hand-voice') mirror the RealtimeDisclosurePolicy union declared in @memberjunction/ai-agents.
Lockstep contract: this interface is mirrored, field for field, by
MJApplicationEntity_IAgentSettingsinpackages/AI/CorePlus/src/agent-settings.ts(@memberjunction/ai-core-plus). Runtime code parses the column with that mirror (ParseAgentSettings) rather than the CodeGen-generatedAgentSettingsObjectaccessor, so a field added here is usable at runtime before CodeGen next regenerates the inline copy. Edit both in the same commit.