The mode/preset picker's selected configuration ID, forwarded to
<mj-message-input> so non-mention routes apply it on the next
send. Past messages are NOT retroactively re-routed — the picker
only affects subsequent requests. Updated when the user picks a
row in the mode picker; the picker itself persists the choice
per-user, per-agent via UserInfoEngine.
Fired AFTER a successful agent turn completes.
Fired AFTER a response form's values have been sent.
Fired AFTER a client tool invocation completes.
Visualization data forwarded to the agentPresence slot's default
component (or to any consumer-projected template via slot context).
Includes avatar URL, character name, voice state, and visual intensity.
Host-level cap for attachments. Defaults true. When false, the host disables attachments regardless of agent modality support — useful for surfaces where attachments don't make sense (cockpit text-only flows). When true (default), attachment availability still depends on the agent's modality support, computed at runtime.
Host-level cap for @-mention autocomplete (agents and users). Defaults true. Hosts addressing a single fixed agent (e.g. Form Builder cockpit pinned to the Form Builder agent) should set false so the user can't accidentally redirect a turn to a different agent.
Allow deleting the user's own messages (per-message delete button).
Allow editing the user's own messages (per-message edit button).
Allow pinning messages (per-message pin button, the header pin chip, and the pinned-messages panel).
Host-level cap for the composer's Plan Mode toggle. Defaults true (current behavior). White-labeled / end-user hosts that don't expose plan-mode workflows set false to remove the button entirely.
Host-level cap for the composer's realtime voice-call launcher (and its options caret). Defaults true (current behavior). Hosts with no voice experience set false to remove the buttons entirely.
Application context snapshot for AI agent awareness. Included in agent execution data.
Application ID to bind a newly-created conversation to. REQUIRED when
applicationScope is 'Application' or 'Both' (DB CHECK constraint
enforces it). Used by embedded chat surfaces to scope their
conversations to their owning Application.
Scope to apply when this surface CREATES a new conversation. Forwarded
to ConversationEngine.CreateConversation so the new row's
ApplicationScope column is stamped correctly. Embedded surfaces
(e.g. the Form Builder cockpit) set this to 'Application' so their
conversations don't pollute the main Chat app list. Main Chat leaves
it as the default 'Global'. Has no effect on existing conversations.
Attachments by conversation detail ID (loaded from ConversationDetailAttachments)
Cancelable — fired BEFORE a user message is sent to the agent.
Cancelable — fired BEFORE a response form's submitted values are sent.
Cancelable — fired BEFORE a registered client tool is invoked by the agent.
Prefill the composer with draft text (NOT sent — unlike pendingMessage) and focus it. Targets the empty-state input for new/unsaved conversations, else the active conversation's cached input. Emits composerDraftConsumed once applied. Retries briefly because the target input mounts asynchronously (config params can arrive before the first render).
Optional default agent ID for the conversation. Forwarded to
<mj-message-input> as its [defaultAgentId] so the first message
routes directly to this agent instead of Sage. See
MessageInputComponent.routeMessage priority rules — explicit
Content payload forwarded to the demonstrationSurface slot via
$implicit + named content context. Shape is consumer-defined per the
IMJChatDemonstrationSurfaceComponent interface — the widget
doesn't introspect or render it directly, just hands it through.
ReadonlyemptyReadonlyemptyReadonlyemptyStructured config for the emptyState slot's default component —
greeting, subtext, and optional suggested prompts. Backwards-compatible
with the existing emptyStateGreeting input (which still wins when
emptyStateConfig is null).
Greeting message shown in the empty state when no conversation is active
In-progress message IDs for streaming reconnection Passed to message-input component to reconnect PubSub updates
"What is this conversation about?" — the Entity ID this conversation
references. Forwarded to ConversationEngine.CreateConversation so
the new row's LinkedEntityID is stamped at creation time. Paired
with linkedRecordId (DB CHECK requires both populated or both
null). Form Builder cockpit passes the MJ: Components entity ID;
Component Studio's AI panel does the same. Surfaces use this to
later list "prior conversations about THIS form/component."
Has no effect on existing conversations.
Primary key of the linked record, serialized as a string. Used with linkedEntityId. Form Builder cockpit passes the active form's ComponentID; Component Studio's AI panel passes the currently-selected component's ID.
When true, the component is rendered inside the floating overlay (hides suggested topics, etc.)
The conversation the pendingMessage was created FOR. The pending message's auto-send is delivered ONLY to the cached input whose conversationId matches this — NOT the live-active conversationId. Without this, swapping conversations during the (async) auto-send window lets the swapped-to conversation's input grab the still-set pendingMessage and send it too, duplicating the message into the wrong conversation.
Hosts MAY set this explicitly; it also self-resolves from _pendingMessageTargetId (captured in onEmptyStateMessageSent) so the guard works regardless of host wiring.
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.
Ratings by conversation detail ID (parsed from RatingsJSON)
A realtime session that CREATED its own conversation has ended — the new conversation is named (background, shared helper) and ready. The workspace folds it into the cached list and selects it when the conversation list is visible.
The PAST realtime session currently under review, or null. While set (and no live call is active) the realtime overlay renders in SESSION REVIEW mode over this conversation panel. Populated via OpenRealtimeSessionReview; cleared when the user closes the review or resumes it as a new live call.
ReadonlyRealtimeVoice session service — exposed to the template so the realtime "call mode"
overlay can be hosted here (it fills this conversation panel in place while
Active$ is true). The trigger wiring lives in
Session-row enrichment for the timeline's realtime SESSION BLOCKS (details stamped
with an AgentSessionID collapse to one card per session — see the message list's
timeline pass). Keyed by NormalizeUUID(sessionId); loaded with ONE batched
MJ: AI Agent Sessions lookup per conversation, only when stamped rows exist.
Tolerant: a failed lookup leaves the map empty and cards render their generic label.
Informational.
Informational.
Informational.
When true, the agentPresence slot is allowed to render (using the
supplied agentCharacterConfig for visualization data). Off by default
so existing embeds (Form Builder, Component Studio AI Assistant, the
corner overlay) see no UI change.
Whether the chat header should render the per-agent mode/quality picker (Draft / Standard / High, etc.). Default true. The picker auto-hides when the bound agent has fewer than 2 configured presets, so embedders rarely need to set this explicitly — turn off only when the surface should never expose model-tier choice (kiosks, specialty embeds).
Whether the conversation header should render the per-conversation
agent picker. Default true. The picker lets a user pin a default
agent on the active conversation (saved to
MJConversationEntity.DefaultAgentID), so non-mention messages route
to that agent instead of through Sage. Surfaces with no meaningful
agent-choice UX can set this to false to hide the widget.
Show the per-message agent run-detail grid (run ID, step/token counts, $ cost).
Show the artifact count indicator in the conversation header. Default true.
Show the message list's sticky date header + jump-to-date navigation.
Activate the demonstrationSurface slot layout-mode. Per Matt's 06-10
placement design: when true AND a consumer has projected
mjChatSlot="demonstrationSurface", the chat-content-area restructures
into [stage | conversation-rail] — the stage takes the main pane, the
messages pane shrinks to a side rail (below the stage on mobile). When
false (default), no layout change; the chat-area renders as normal.
The consumer is expected to drive this from their own state (e.g., an agent emits a demonstration intent → host sets this true; user dismisses → host sets it false). The widget itself doesn't decide.
Whether the message list renders its built-in "No messages yet" filler when a conversation has zero messages. Defaults true. Hosts that render their own empty-state chrome around the chat area set false.
Show the Export button in the conversation header. Default true.
Whether the built-in centered loading indicator renders while a conversation loads. Defaults true. When false the pane stays blank during the load (the loading branch still short-circuits rendering, so no premature empty-state flash). Hosts with their own loading chrome set false.
Show the per-message thumbs rating control on completed AI messages.
Show the per-message reaction buttons (like / comment).
Show the Share button in the conversation header. Default true.
Show the empty-state's built-in suggested-prompt chips (and the
When true, render the normal message-list + message-input layout even before a conversation exists, instead of the centered empty-state welcome card. Lets host pages (e.g. Form Builder cockpit) put the chat header + mode picker front-and-center on first open and let the user pick a mode before typing. The first send still routes through MessageInputComponent and triggers conversationCreated as usual.
StaticɵdirStaticɵfactrue when the current user is allowed to create new shares on this
conversation. Only the conversation's owner — or a user with an existing
Owner-level grant — may do so. Matches the server-side gate in
MJResourcePermissionEntityExtended.callerMayGrantShare, so the UI
doesn't offer an action the save would refuse.
Pre-address the composer to an AGENT as a resolved mention pill (+ space + focus) — the chip-resolving sibling of composerDraft. Value = the agent's name. Emits composerAgentMentionConsumed once applied.
Get the effective artifacts map based on showSystemArtifacts toggle Combines user-visible and system artifacts when toggle is on Uses caching to prevent infinite change detection loops
The conversation a pending message must be delivered to. Prefers the explicit host input, then the internally-captured new-conversation target, finally the active conversation (legacy fallback for single-conversation hosts that never swap).
True when the chat header should render even before a conversation row exists. Currently means: the embedder has enabled the mode picker AND we resolved a target agent for it (so there's actually something to put in the header). Lets surfaces like the Form Builder cockpit show the mode picker on top of the empty-state instead of waiting for the first message to create a conversation.
Check if there are any system artifacts in this conversation Used to conditionally show/hide the "Show System" toggle button
True when the demonstrationSurface layout-mode is BOTH opted-in
(showDemonstrationSurface) AND has a slot template projected to render
into. Both conditions must hold for the layout restructure to kick in.
true when the current user only has View access to this conversation
(i.e., it was shared with them read-only). Gates the message input and
any other write-capable UI.
All currently pinned messages in the active conversation, newest pin first
Returns either the default Metadata provider or the one specified in the Provider property, if it was specified
Agent name the overlay banner shows: the reviewed session's agent while reviewing, else the live call's.
Returns either the default RunQuery provider or the one specified in the Provider property, if it was specified
Returns either the default RunReport provider or the one specified in the Provider property, if it was specified
Returns either the default RunView provider or the one specified in the Provider property, if it was specified
Display info for the header "Shared by {email}" badge. Returns null
when the current user owns the conversation or when the share has no
recorded grantor (legacy share pre-dating SharedByUserID).
Drops any hosted SESSION REVIEW so the overlay unhosts itself. Safe to call at any
time: a LIVE call's overlay is unaffected (it renders off RealtimeSession.Active$).
Called on every conversation change, on the overlay's Close, and available to hosts
that need to programmatically dismiss a review.
Helper method to check if a conversation detail has an artifact Used by message components to determine whether to show artifact card
Get ALL artifacts for a conversation detail Use this when you need to display all artifacts (e.g., in a list) Returns LazyArtifactInfo array - caller can trigger lazy load if full entities needed
Get artifact info for a conversation detail Returns the LAST (most recent) artifact if multiple exist Returns LazyArtifactInfo - caller can trigger lazy load if full entities needed
Get unique artifacts grouped by artifact ID (not by conversation detail) Returns the latest version info for each unique artifact with all versions Works with LazyArtifactInfo - uses display data without loading full entities Respects showSystemArtifacts toggle
Returns array of cached message-input metadata for rendering This allows multiple message-input components to exist simultaneously (hidden) preserving their state when switching conversations
A callback method that is invoked immediately after the default change detector has completed one change-check cycle for a component's view.
A callback method that performs custom clean-up, invoked immediately before a directive, pipe, or service instance is destroyed.
A callback method that is invoked immediately after the default change detector has checked the directive's data-bound properties for the first time, and before any of the view or content children have been checked. It is invoked only once when the directive is instantiated.
Mode picker emitted a new selection. Store it; the next message's
route picks it up via <mj-message-input>'s
[agentConfigurationPresetId] binding. Past messages stay routed
as they were — the change is forward-only.
Handle agent run detected event from progress updates This is called when the first progress update arrives with an agent run ID
Handle agent run update event from progress updates This is called on EVERY progress update with the full, live agent run object Provides real-time updates of status, timestamps, tokens, cost during execution
Handle Analyze button click from the artifact viewer panel.
Persists the captured snapshot as a new Data Snapshot artifact and attaches
it to the user's in-progress message as a pending attachment chip (same UX
as image/file uploads). On send, the existing attachment pipeline creates
a ConversationDetailArtifact with Direction='Input'; AgentRunner then
picks it up via gatherConversationArtifacts and resolves the
DataSnapshotToolLibrary for tool calls.
Falls back to plain message prefill if snapshot persistence fails — the user can still ask questions about the artifact that's already attached to the prior conversation turn.
Apply a form-role artifact's spec as an EntityFormOverride for the current user. The service handles the Create-vs-Modify decision (based on whether an Active override already exists), confirms via dialog, and surfaces success/failure via notification.
Handle navigation request from artifact viewer Links tab
Handle successful share - refresh permissions
Handle close of artifact share modal
Handle share request from artifact viewer
Handle attachment click - opens the image viewer for images
Blur = a natural save point — persist immediately.
The empty-state input applied the staged draft — clear + inform the host.
Handles Shift+Click on an AI message bubble. Dumps a live snapshot of in-memory streaming and agent-run state to the browser console so engineers can debug stuck/forever-spinning conversations without needing to add any temporary code.
Usage: Hold Shift and click any AI message bubble. Open DevTools Console to see the dump.
Live draft persistence (store debounces the server write).
Handle message sent from empty state component Creates a new conversation and emits to parent to update selection
Handle image viewer close
Handle intent check completed - remove temporary message
Handle intent check started - show temporary "Analyzing intent..." message
Scrolls the message list to the target message and plays the beacon animation. Called when the user clicks "Jump to message" in the pins panel.
Handle message completion event from message-input Refreshes the agent run data in-place to get final status and timestamps Also reloads attachments created during agent execution (e.g., generated images)
A gear-gated developer link in the live call overlay asked to open a record
(delegated agent run / agent session). The overlay has already minimized itself
(the call stays live behind the floating "on call" pill); re-emit on the SAME
openEntityRecord chain every other chat record-open uses, so the Explorer
wrapper routes it through NavigationService.OpenEntityRecord.
Resize handle methods for artifact pane
Touch event handlers for mobile resize support
Review mode's Close: drop the review state (the overlay unhosts itself).
Review mode's "Start live session": RESUMES the reviewed session as a new live call
through the SAME start path the composer's mic uses, chaining lastSessionId so the
server restores saved channel states (e.g. the whiteboard) via PriorChannelStatesJson.
The start flips Active$ synchronously, so clearing the review immediately after
never unhosts the overlay mid-transition.
Handle suggested response selection from user Sends the selected response as a new user message WITHOUT modifying the visible input
Unpins a message from the pins panel — saves to DB and patches the cache.
Handle upload state changes from message input component
OptionalversionNumber: numberENTRY API for SESSION REVIEW: opens the realtime overlay in review mode over this conversation panel, rendering what went down in a PAST agent session (caption turns, delegated-run cards, the saved read-only whiteboard). Intended for conversation timeline affordances that reopen historical realtime sessions.
The MJ: AI Agent Sessions.ID to review.
true when the session loaded and the review opened; false when it
couldn't be loaded (missing/unreadable session) or a live call is already active.
Public entry point to reload messages in the active conversation. Called by the parent resource wrapper when the user clicks the Refresh button, so that new agent responses are visible without a full page reload.
Public helper for the template + consumers — resolve a slot name to the
consumer-supplied TemplateRef, or null if no consumer template was
projected for that slot. When null, the template should render the
slot's default standalone component.
Toggles system artifacts visibility Clears the cache so the map will be rebuilt on next access
Base class for all Angular components in the MemberJunction system.