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.
Use AfterAgentTurn.
The same emitter under the old binding name, so a template still binding (afterAgentTurn) keeps working. Must stay AFTER AfterAgentTurn: class fields initialise in order, and the other way round this captures undefined.
Fired AFTER a successful agent turn completes, on every route.
Use AfterResponseFormSubmitted.
The same emitter under the old binding name, so a template still binding (afterResponseFormSubmitted) keeps working. Must stay AFTER AfterResponseFormSubmitted: class fields initialise in order, and the other way round this captures undefined.
Fired AFTER a response form's values have been sent.
Fired AFTER a stop was attempted, with whether the run's row was marked Cancelled.
Not fired when BeforeStopClicked was canceled.
Use AfterToolInvoked.
The same emitter under the old binding name, so a template still binding (afterToolInvoked) keeps working. Must stay AFTER AfterToolInvoked: class fields initialise in order, and the other way round this captures undefined.
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.
The first moment of the conversation an agent turn may read. The server loads the agent's history from there and uses no summary of earlier messages. Null (the default) reads the whole conversation.
When a message starts an agent turn. 'Always' (the default) answers every message;
'MentionOnly' answers only a message that tags an agent, and posts any other message
with no turn at all (no reply row, no placeholder, no turn events).
Runs agent turns on the host's server instead of MJ's own path, after routing and
BeforeAgentTurn, before any reply row exists. Null (the default) runs them on MJ's path.
Per-type caps under allowMentions, all default true. Let a host keep
one trigger while dropping another — e.g. a white-label surface pinned to a
default agent that wants to offer / skill-commands but NOT @ agent
mentions (an @ overrides the pinned default agent in message routing).
Effective only when allowMentions is also true.
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.
The agents that may answer in this chat: narrows the '@' list, every route, the conversation manager's delegation, and the pin and voice pickers. Null (the default) allows every agent the user can run; an empty list allows none.
Host-level cap for starting conversation forks: Fork from here, and Edit or
Regenerate as a fork. Defaults true (current behavior). Hosts with no forking
experience set false; Edit and Regenerate then change the latest turn in place,
as for a person without the Conversations: Fork authorization. UI only: deny
that authorization to a role to stop the server creating forks as well.
Host-level MASTER cap for the composer's mention/command triggers. Defaults true. When false, ALL triggers (@ agents, # entities, / skills) are off regardless of the per-type flags below. Hosts addressing a single fixed agent (e.g. Form Builder cockpit) can set false wholesale.
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.
Host-level cap for stopping and continuing agent runs: the composer's Stop and Stop all, the Stop pill on an in-progress reply, the Continue button on a stopped reply, and the "Continue, or tell {agent} what to do differently" placeholder. Defaults true (current behavior). Hosts with no stop experience (a review surface, a space whose runs are managed elsewhere) set false without making the conversation read-only. UI only: a run stopped from another client still shows as stopped, and the next message still continues it. The composer's status line (StatusText) is not part of the cap: it reports that a reply is in flight either way.
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.
Use ArtifactLinkClicked.
The same emitter under the old binding name, so a template still binding (artifactLinkClicked) keeps working. Must stay AFTER ArtifactLinkClicked: class fields initialise in order, and the other way round this captures undefined.
Image URL for the AI message avatar. Null = the agent's Font Awesome icon.
Display name for AI messages (e.g. a per-tenant persona). Null = the agent record's name.
Attachments by conversation detail ID (loaded from ConversationDetailAttachments)
Whether MJ names a new conversation from its first message or its first voice utterance. True (the default) keeps today's behavior; a host that names its own chats turns it off.
Use BeforeAgentTurn.
The same emitter under the old binding name, so a template still binding (beforeAgentTurn) keeps working. Must stay AFTER BeforeAgentTurn: class fields initialise in order, and the other way round this captures undefined.
Cancelable — fired once per agent turn, on every route, after routing picked the agent and
before any reply row exists. Cancel it to write nothing more, or set RedirectAgentId to
send the turn to another allowed agent. A message that starts no turn fires nothing.
Use BeforeResponseFormSubmitted.
The same emitter under the old binding name, so a template still binding (beforeResponseFormSubmitted) keeps working. Must stay AFTER BeforeResponseFormSubmitted: class fields initialise in order, and the other way round this captures undefined.
Cancelable — fired BEFORE a response form's submitted values are sent.
Fired BEFORE an in-progress agent run is stopped from its reply. Cancelable: set
event.Cancel = true to keep the run going; AfterStopClicked then does not fire.
Use BeforeToolInvoked.
The same emitter under the old binding name, so a template still binding (beforeToolInvoked) keeps working. Must stay AFTER BeforeToolInvoked: class fields initialise in order, and the other way round this captures undefined.
Cancelable — fired BEFORE a registered client tool is invoked by the agent.
Use ComposerAgentMentionConsumed.
The same emitter under the old binding name, so a template still binding (composerAgentMentionConsumed) keeps working. Must stay AFTER ComposerAgentMentionConsumed: class fields initialise in order, and the other way round this captures undefined.
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).
Use ConversationCreated.
The same emitter under the old binding name, so a template still binding (conversationCreated) keeps working. Must stay AFTER ConversationCreated: class fields initialise in order, and the other way round this captures undefined.
Use ConversationRenamed.
The same emitter under the old binding name, so a template still binding (conversationRenamed) keeps working. Must stay AFTER ConversationRenamed: class fields initialise in order, and the other way round this captures undefined.
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
Whether an untagged message asks one fast typed decision which agent in the conversation
should answer it, instead of always going back to the last agent that answered. It replaces
that agent only when the answer is confident and arrives within DECISION_ROUTING_TIMEOUT_MS
(250 ms). False (the default)
changes nothing: no decision call, and today's routing. See
MessageInputComponent.EnableDecisionRouting.
Turning it on sends conversation text to the model behind the Default Decision prompt, which
can be a different vendor from the agents' own: the first 1,000 characters of the new message,
the last 6 turns (150 characters each), each participant's name, description and last reply,
and the names of their artifact versions. Each call writes an MJ: AI Prompt Runs row, even
when the answer comes too late to be used.
Branding applied to exported files (theme tokens / logo / title) — forwarded
to the export modal, where it also defaults the "Include branding" checkbox
on. See ExportBranding in the export service. Null (default) keeps the
stock unthemed export.
Font Awesome class(es) for the header Export button's icon.
Label for the header Export button (white-label hosts relabel it, e.g. "Download").
ReadonlyForksThe id of this chat area's forks popover; the header Forks button points at it.
The fork summaries of the active conversation: chips, the fork header and the forks list read them.
Spinner state for the panel's first open — the rows now arrive after the panel does.
True while the header title (the conversation name in Main, the fork name in a fork) is edited.
"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.
The people the '@' list offers, such as the chat's members. Null (the default) offers only the current user, as before.
Use OpenEntityRecord.
The same emitter under the old binding name, so a template still binding (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields initialise in order, and the other way round this captures undefined.
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)
Host-forced read-only. Hides every composer. A View share (IsReadOnlyView) with this left false keeps today's disabled composer.
Banner copy when ReadOnly is set. Null uses the View-share text.
Read each reply from its top instead of its bottom.
Default false (current behaviour): the pane follows the tail, so a run ends with the reader looking at the END of the answer and scrolling back up to start reading it.
When true, sending and the run itself behave as before, but when the reply lands and the reader was following it, the turn — the reader's own message with the reply under it — is scrolled so it starts at the top of the pane, IF it is taller than the pane. A turn that fits stays where it is: it is all on screen anyway. A reader who scrolled up during the run is never moved; the scroll-to-bottom button is their way back.
Use RealtimeConversationReady.
The same emitter under the old binding name, so a template still binding (realtimeConversationReady) keeps working. Must stay AFTER RealtimeConversationReady: class fields initialise in order, and the other way round this captures undefined.
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.
The elapsed time of the in-flight reply, ticked once a second while one is in flight.
Use SessionChannelStateChanged.
The same emitter under the old binding name, so a template still binding (sessionChannelStateChanged) keeps working. Must stay AFTER SessionChannelStateChanged: class fields initialise in order, and the other way round this captures undefined.
Informational.
Use SessionEnded.
The same emitter under the old binding name, so a template still binding (sessionEnded) keeps working. Must stay AFTER SessionEnded: class fields initialise in order, and the other way round this captures undefined.
Informational.
Use SessionStarted.
The same emitter under the old binding name, so a template still binding (sessionStarted) keeps working. Must stay AFTER SessionStarted: class fields initialise in order, and the other way round this captures undefined.
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.
True while the forks list is open.
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
Use SidebarToggleClicked.
The same emitter under the old binding name, so a template still binding (sidebarToggleClicked) keeps working. Must stay AFTER SidebarToggleClicked: class fields initialise in order, and the other way round this captures undefined.
Replies the person asked to stop that have not left In-Progress yet.
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.
Use TaskClicked.
The same emitter under the old binding name, so a template still binding (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields initialise in order, and the other way round this captures undefined.
The text of the title name field.
StaticɵdirStaticɵfacUse AcceptedFileTypes.
Use AgentCharacterConfig.
Use AgentRunsByDetailId.
Use AgentRunsByDetailId.
Use AllowAgentMentions.
Use AllowAttachments.
Use AllowEntityMentions.
Use AllowMentions.
Use AllowMessageDelete.
Use AllowMessageEdit.
Use AllowPinning.
Use AllowPlanMode.
Use AllowRealtime.
Use AllowSkillCommands.
Use AppContext.
Use ApplicationId.
Use ApplicationScope.
Use ArtifactCount.
Use ArtifactCountDisplay.
Use ArtifactPaneWidth.
Use ArtifactsByDetailId.
Use ArtifactToShare.
The open view's scope, passed to the artifact viewer; null with no conversation.
Use AssistantAvatarUrl.
Use AssistantDisplayName.
The fork the back button opens; null is Main. A fork's parent fork, or a draft's ParentBranchID (the view it started from).
The label and aria-label of the back button: "Back to
True when this person may start forks in the open conversation: the host allows forking
(AllowForking), the person holds Conversations: Fork, has not switched forking off in My
Profile, and may write. When false, no fork action is offered and Edit and Regenerate change the
latest turn in place.
True when the conversation may be renamed from the header: Main is open and the person may write to it.
True when the open fork may be renamed: a saved fork (not a draft) of a conversation the person may write to.
True when the header title may be renamed: the conversation in Main, the fork in a fork.
Use CanShareConversation.
true when the current user is allowed to create new shares on this
conversation: the owner, or a user with an Owner-level grant. Uses the same
rule as the sidebar's Share action.
True when the session review may offer "Start live session": not while a draft fork is open, the same rule as the composer's voice control (a session started there would run on the draft's parent path).
Use ComposerAgentMention.
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.
Use ComposerDraft.
The hint under the composer while a fork or draft window is shown; null in Main.
Use Conversation.
Use ConversationId.
Use CurrentUser.
Use DefaultAgentId.
The rows the message list shows for the window view; the same array until the rows or the view change. Main shows every loaded row; a fork shows every inherited row, then its own rows; a draft shows the rows up to its anchor.
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).
Read-only for any reason: the host said so, or the conversation is shared with View access.
Use EmptyAgentRunsMap.
Use EmptyArtifactsMap.
Use EmptyInProgressIds.
Use EmptyStateConfig.
Use EmptyStateGreeting.
Use EnableAttachments.
Use EnvironmentId.
Use ExpandedArtifactId.
Use ExportBranding.
Use ExportButtonIcon.
Use ExportButtonLabel.
The open view's scope, passed to the export modal; null with no conversation.
The breadcrumb of the header in a fork: the conversation, each ancestor fork, then the open fork ("New fork" in a draft). Empty in Main. The same array until the view, the fork rows, the summaries or the conversation name change.
The chips of each message, from the fork summaries; the same map until the summaries, the window view, the fork's first own row or the avatar map change. In a fork's full view, that fork's own chip is left out (it would open the view already open), and its first own row shows the fork's alternatives: the original view of the message it replaced and the other forks placed there.
How the message list draws the rows shown; null in Main.
Use HasMoreMessagesAbove.
True when older transcript pages remain above the loaded window (drives the sentinel).
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.
Use HasSystemArtifacts.
Check if there are any system artifacts in this conversation Used to conditionally show/hide the "Show System" toggle button
The header path of the open fork or draft: the breadcrumb with the crumbs that collapse into an ellipsis.
The header title: the conversation name in Main, the open fork's display name in a fork or draft.
How many agent replies are in flight in the open view.
The latest turn that in-place Edit and Regenerate may change: the window view's last own user message and its answer. Null while the person may fork, in a draft, and when a fork depends on the turn's answer rows. The same object until the rows, the window view, the fork rows or CanFork change.
Use InProgressMessageIds.
In-progress message IDs for streaming reconnection Passed to message-input component to reconnect PubSub updates
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 while an older transcript page is being fetched.
Use IsLoadingPins.
Use IsNewConversation.
Use IsProcessing.
Use IsReadOnlyView.
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.
Use IsShared.
Use LinkedEntityId.
Use LinkedRecordId.
True when older rows remain above the loaded window of the open view's path, in every view.
Use MaxAttachments.
Use MemberCount.
Use MessageScrollRoot.
The element that actually scrolls the transcript, handed to the message list so its "earlier messages" observer has a correct root.
The list's own container does not scroll — this one carries the overflow-y: auto and
min-height: 0 that make it a real scroller. Passing it down beats having the list
discover it, which depends on layout having settled.
The summary of the open fork; null in Main, in a draft, or before the summaries load.
The open view; Main when none was set.
The branch whose path the open view reads; null is Main.
The kind icon of the open fork.
The kind of the open fork (a draft is a Fork).
The title of the open fork: its display name, "New fork" for a draft.
Use OverlayMode.
Use PendingArtifactId.
Use PendingAttachments.
Use PendingMessage.
Use PinnedMessageCount.
TRUE pin count for the chip. Deliberately NOT pinnedMessages.length, which is 0 until
the panel has been opened and would hide the chip on a conversation full of pins.
Use PinnedMessages.
The pinned messages on the open view's path, newest pin first.
Read from the window store's separate pin set, NOT filtered out of messages — a pin
older than the loaded window would otherwise vanish from the panel. Loaded by
hydratePinnedMessages when the pins panel first opens, already ordered Sequence DESC.
This and the three getters around it are TEMPLATE-BOUND, so they run on every change
detection cycle. They read the store's cheap single-value accessors rather than
GetSnapshot(), which copies the whole loaded window on every call — four of those per
cycle, during streaming per token, is exactly the length-proportional work this feature
exists to remove.
Returns either the default Metadata provider or the one specified in the Provider property, if it was specified
Use RatingsByDetailId.
Use ReadReplyFromTop.
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 RunView provider or the one specified in the Provider property, if it was specified
Use SelectedArtifactId.
Use SelectedImageAlt.
Use SelectedImageUrl.
What the composer's send slot is: Stop while replies are in flight and the viewer may stop them.
Use ShareAdapter.
Use ShareContext.
Use SharedByBadge.
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).
Use ShowAgentCharacter.
Use ShowAgentModePicker.
Use ShowAgentPanel.
Use ShowAgentPicker.
Use ShowAgentRunDetails.
Use ShowArtifactPanel.
Use ShowArtifactsModal.
Use ShowCollectionPicker.
Use ShowDateNavigation.
Use ShowEmptyFill.
Use ShowExportButton.
Use ShowExportModal.
Use ShowImageViewer.
Use ShowLoadingState.
Use ShowMembersModal.
Use ShowMessageRating.
Use ShowPinsPanel.
Use ShowProjectSelector.
Use ShowReactions.
Use ShowShareButton.
Use ShowShareModal.
Use ShowSidebarToggle.
Use ShowSuggestedPrompts.
Use ShowSystemArtifacts.
The elapsed time after the status line, for a single run that is working (not one being stopped).
The composer's status line: who is working, or what is being stopped. Null with nothing in flight. It is information, not a control, so it shows whenever a reply is in flight, whether or not the viewer may stop it (a read-only viewer, or a host with AllowStopRun off); only the send slot is gated. The stopping text likewise reads the stopping state itself, not the slot's mode.
The count the slot shows: the in-flight replies, or none when the slot is Send.
The slot's tooltip and accessible name: "Stop {agent}", or "Stop all N runs".
The label of the title rename button and name field.
Use UploadingMessage.
Use UserAvatarMap.
Use UserAvatarMap.
The view the loaded rows belong to; Main when none was set.
Shows Main of the active conversation.
Closes the title name field without saving (Escape) and puts focus back on the rename button.
Use CheckScroll.
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.
Closes the forks list and puts focus back on the header Forks button when it is on the page.
The composer placeholder of a conversation's composer: "Message this fork" in a fork or draft of the active conversation.
Helper method to check if a conversation detail has an artifact Used by message components to determine whether to show artifact card
Use ExportConversation.
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
Use GetArtifactInfo.
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
Use GetArtifactsArray.
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
Use GetCachedInputs.
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
Goes up one level: opens the parent fork of the open fork or draft, else Main.
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.
Use OnAgentResponse.
Use OnAgentRunDetected.
Handle agent run detected event from progress updates This is called when the first progress update arrives with an agent run ID
Use OnAgentRunUpdate.
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 for the current user — an EntityFormOverride for a whole form, a form contribution for a panel. The service picks the path, handles the Create-vs-Modify decision, confirms via dialog, and notifies.
The agent context names the record form the user has open (AdditionalContext.Form,
published by the record tab). The service reads that form's full composition from the
FormCompositionRegistry, to check a panel's placement against the live form and detect
an installed contribution holding the same key. With no open form it asks the server for
the composition instead.
Use OnArtifactClicked.
Use OnArtifactCreated.
Handle navigation request from artifact viewer Links tab
Use OnArtifactShared.
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
Use OnCloseArtifactPanel.
Blur = a natural save point — persist immediately.
The empty-state input applied the staged draft — clear + inform the host.
The composer's stop control. Every in-flight reply is stopped through the same path as the
per-reply pill: BeforeStopClicked first (a listener that cancels keeps that run going),
then OnStopMessage, which fires AfterStopClicked with the outcome. Each reply asked
to stop reads as stopping until it leaves In-Progress, or until the retry window passes,
when the slot offers Stop again and a toast says the stop did not take.
Pages older history until a date jump can be satisfied, then scrolls to it.
Windowing is exactly what broke the old implementation: the transcript no longer holds every day, so "jump to last month" targets messages that are simply not loaded. This pages until the target is in the loaded set, history runs out, or the page cap is hit — and always reports the outcome, because the plan forbids a silent no-op here.
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).
Saves an edit as a fork: creates an Edit fork at the row before the edited message, opens it, then sends the edited text into it. The original message stays where it was. Ignored while another start action runs and when the person may not fork (CanFork); makes no fork while the composer cannot send.
Handle message sent from empty state component Creates a new conversation and emits to parent to update selection
A chip was clicked: opens its fork. An original chip opens its view (a fork, or Main) positioned at the replaced message, as a search hit does (OpenMessage).
Fork from here: opens a new fork that replaces the message (the draft view, OpenDraftFork). Nothing is created until the first send, which creates the fork through ResolveComposerBranch; with no name, the fork is named from that first message. Only for a user message the current person wrote. Ignored while another start action runs and when the person may not fork (CanFork).
A row of the forks list was chosen: close the list and open that fork.
Use OnImageViewerClosed.
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.
A message reports that its run has gone quiet (MJ #4222).
The reconciliation triggers all fire on transport events — a socket retry, a tab regaining focus. This one fires on the symptom itself: a run that simply stopped reporting, with no event anywhere to notice it. Each pass covers every in-progress message, so the request goes through the runtime's coalescing trigger: quiet rows asking at about the same time share one pass.
Use OnMessageComplete.
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 streamed delta landed on an in-progress message (MessageInputComponent.MessageStreamed).
Unlike OnMessageSent this does not replace the messages array: that rebuilt the
whole timeline, re-measured the mounted range and armed a scroll-to-bottom timer on every
delta, which is what made a streaming reply flash and jump. The bubble is refreshed in place
and the viewport is kept steady. With ReadReplyFromTop the turn lands at its top once, on
the first delta, and the reply grows beneath it; otherwise the bottom is pinned in the same
frame as the DOM update, so the growth and the scroll paint together.
Loads the next older page — fired by the message list's "earlier messages" sentinel.
LoadOlder already no-ops when nothing is above or a load is in flight, so repeated
observer fires during a fast scroll are harmless. messages is reassigned to a NEW
array so the list's ngOnChanges runs; the list then detects the prepend and holds the
user's scroll position rather than jumping.
Use OnOpenEntityRecord.
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.
Regenerates an answer as a fork: creates a Regenerate fork at the user message the answer replied to, opens it, then runs the agent for that message again inside it. The first answer stays where it was. Ignored while another start action runs; makes no fork while the composer cannot send or when the user message is not in the loaded window. When the person may not fork (CanFork), reruns the latest answer's turn in place instead (InPlaceTurn).
"Save and resend": the message item saved the new text of the latest user message; reruns its turn in place.
Resize handle methods for artifact pane
Touch event handlers for mobile resize support
Use OnReviewClosed.
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. Starts nothing, and keeps the review, while
CanStartVoiceFromReview is false.
Persists the currently displayed Task Graph in the chat side-panel as a reusable
Draft Flow Agent workflow via WorkflowSaveOperation and opens the new
MJ: AI Agents record.
Stop the agent run behind an in-progress AI reply. Uses the run already mapped to the reply when there is one; otherwise looks it up by the reply's detail id, since the run row appears a moment after the placeholder. The run's own completion event then flows through the normal path and the message leaves In-Progress on its own.
Handle suggested response selection from user Sends the selected response as a new user message WITHOUT modifying the visible input
Use OnToggleAgentPanel.
Unpins a message from the pins panel — saves to DB and patches the cache.
Use OnUploadStateChanged.
Handle upload state changes from message input component
Escape in the header or the transcript of a fork view: closes the forks list when it is open, else goes up one level (GoBack). Ignored when an inner control handled the key (the rename field, a message editor, an open menu), in a text field, and in Main.
OptionalversionNumber: numberOpens the matching (or most recent) artifact in the current conversation's artifact viewer panel. Returns true if a conversation artifact was found and opened.
A crumb was chosen: opens its fork, or Main for the conversation crumb. The last crumb opens nothing.
Opens a new fork that replaces message (Fork from here): the full fork view with no own rows,
starting at the row before the message on its path (the same fork point as an edit). Nothing is
created until the first send. Ends a voice session of the conversation first, then puts the
message's text in the composer unless the composer holds unsent text.
false for a message of another conversation, when the row before it cannot be found (after a notice), or when the view change is ignored.
Opens a fork of the active conversation in the full view.
Opens a message, such as a search hit, in the active conversation: waits for the
conversation's load to end, opens the hit's fork (a Main hit opens Main) when it is not the
open view, pages older history until the window holds sequence, then scrolls to the row and
highlights it for 2 s.
The conversation of the message. The caller activates it first.
The message's fork; null is Main. Compared without case.
The message's sequence in its conversation.
true when the row was found and scrolled to; false when the conversation is not the active one, the view change was ignored or failed, or the row is not on the view's path.
Use OpenProjectSelector.
ENTRY 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.
Reconcile in-progress messages against durable server state, on demand.
This is the recovery path for the case the five close-event-driven mechanisms all miss: a completion published while the client's transport was silently dead. Tier 0 makes the socket close; this is what recovers the event that was dropped while it was down.
Only one pass runs at a time. A request that arrives during a pass shares it and schedules one follow-up pass, so every caller resolves after a pass that started after its request.
What prompted it — carried only for logging.
Reads the active conversation's fork rows again, keeps them, then reloads the fork summaries. Keeps the earlier rows and the summaries when the rows cannot be read.
Use ReloadMessages.
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.
ReadonlyResolveAnswers the active composer's "which branch does this new message go to": the open fork, or null for Main. In a draft fork, creates the fork first and opens it; undefined (the send stops) when that fails. Bound to the composer's ResolveTargetBranch input, so it is one stable function.
Saves the title name field (Enter, or leaving the field) to the conversation in Main or to the open
fork. With restoreFocus (Enter), focus goes back to the rename button.
true when saved or unchanged; false when nothing was being renamed or the save failed.
Use ShareConversation.
The path's ellipsis was chosen: opens the forks list, which shows the whole chain.
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.
Turns the header title into a text field holding its current name, and focuses it.
The branch a composer of conversationId writes to: the open view's for the active conversation, else Main.
Opens or closes the forks list. Opening it closes the pinned messages panel.
Use ToggleMembersModal.
Opens/closes the pins panel, hydrating its rows on first open. Opening it closes the forks list.
Lazy on purpose: the panel is closed by default, so loading pin entities during conversation open costs every user for a panel most never open.
Toggles system artifacts visibility Clears the cache so the map will be rebuilt on next access
Use ViewArtifacts.
StaticFormatm:ss (or h:mm:ss), the same shape as the reply's time pill.
Base class for all Angular components in the MemberJunction system.