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 the response form's values have been submitted. Carries the form id (using the message ID as a stable per-message identifier) and the submitted values map. Not fired when beforeResponseFormSubmitted was canceled.
Allow deleting the user's own messages (the per-message delete button).
Allow editing the user's own messages (the per-message edit button).
Allow pinning messages (the per-message pin button).
Whether the Stop control is offered on an in-progress agent reply, and the Continue control on a stopped one. A host can turn stopping off for a surface without making the conversation read-only. Default true.
OptionalArtifactUse ArtifactClicked.
The same emitter under the old binding name, so a template still binding (artifactClicked) keeps working. Must stay AFTER ArtifactClicked: class fields initialise in order, and the other way round this captures undefined.
All distinct artifacts attached to this message, each at its latest version.
Preferred over the single artifact/artifactVersion inputs above (which are
retained for backward compatibility and kept pointed at the first entry).
OptionalartifactThe last assistantAvatarUrl failed to load — fall back to the icon branch.
Host override for the AI message display name (white-label persona). Null = the agent record's name.
Use AttachmentClicked.
The same emitter under the old binding name, so a template still binding (attachmentClicked) keeps working. Must stay AFTER AttachmentClicked: class fields initialise in order, and the other way round this captures undefined.
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 the response form's values are sent back as a new
conversation message. Listeners may set event.Cancel = true to halt the
submission (e.g., a validation pass that finds required fields unfilled).
When canceled, the corresponding afterResponseFormSubmitted event is
NOT fired and suggestedResponseSelected is NOT emitted.
Follows MJ's established Before/After cancelable event pattern.
Fired BEFORE a stop is requested, when the person clicks Stop on this in-progress agent
reply. Listeners may set event.Cancel = true to keep the run going; the control then
stays available and nothing else happens. Carries the reply's detail id and the run id
when the chat has seen the run row.
True when the person may start forks; false hides "Fork from here", and Edit and Regenerate then work in place (EditMode, InPlaceRole). Set by the message list.
Use DeleteClicked.
The same emitter under the old binding name, so a template still binding (deleteClicked) keeps working. Must stay AFTER DeleteClicked: class fields initialise in order, and the other way round this captures undefined.
Use DiagnosticRequested.
The same emitter under the old binding name, so a template still binding (diagnosticRequested) keeps working. Must stay AFTER DiagnosticRequested: class fields initialise in order, and the other way round this captures undefined.
Use EditClicked.
The same emitter under the old binding name, so a template still binding (editClicked) keeps working. Must stay AFTER EditClicked: class fields initialise in order, and the other way round this captures undefined.
Emits true when this row's inline editor opens and false when it closes.
True while another message of the view is being edited; this row's footer then hides. Set by the message list.
Emits the edited text of this message; the host saves it as a new fork.
The chips under this message: the forks placed under it and, on a fork's first own message, the fork's alternatives (an original chip and the other forks of the replaced message). Set by the message list.
The fork marker shown under this row (the last inherited row of a fork view); null for none. Set by the message list.
A chip was clicked: the host opens that fork, or for an original chip, its view at the replaced message.
The rail a fork view draws this row on: 'Inherited' (faded, dashed) or 'Own' (solid); null in Main. Set by the message list.
"Fork from here" was clicked.
How many agent replies are in flight in the open view. The per-reply Stop control is offered only above one: with a single run the composer's send slot is the stop control, so a pill here would be a second control for the same thing. With several runs the pill is the only way to say which one, and the composer stops them all.
The row's role in the latest turn when forking is off: its user message ('User') or its answer ('Answer'); null otherwise. Set by the message list.
True for the latest user message and the last message of the view; their actions show labels. Set by the message list.
True from the moment Stop was clicked until the message leaves In-Progress, so the button reads "Stopping…" and cannot be clicked twice while the server catches up. Falls back to false after STOP_RETRY_AFTER_MS if the run is still going, so a stop that did not take (the row write was refused, the owning process is gone) can be tried again.
Set by the list while this in-progress bubble shows streamed reply text rather than a status
line. Rendered as the streaming class, which the stylesheet uses to lift the status cap.
Whether the Supporting Artifacts grid is expanded when a message has multiple artifacts.
Defaults to false (collapsed) when unset and persists the user's global preference via UserInfoEngine.
Whether the completed workflow step list is expanded (always expanded while Running).
Raised when this message's run has gone quiet long enough that the displayed state may be fiction (MJ #4222). The parent answers by re-reading durable state; if the run really is alive its heartbeat advances and the pill returns to 'live' on the next tick.
Use MessageEdited.
The same emitter under the old binding name, so a template still binding (messageEdited) keeps working. Must stay AFTER MessageEdited: class fields initialise in order, and the other way round this captures undefined.
Optional additive per-message slot template (forwarded from chat-area's
mjChatSlot="messageExtra"). Rendered inside the bubble after the message
content, before attachments. Receives the message as $implicit + a named
message context binding. Null when no consumer template is projected.
Use MessagePinToggled.
The same emitter under the old binding name, so a template still binding (messagePinToggled) keeps working. Must stay AFTER MessagePinToggled: class fields initialise in order, and the other way round this captures undefined.
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 this message is a bottom continuation reply (this.message.ParentID points to the
originating workflow message), holds the root MJ: Tasks row for that workflow so the UI
can render a relational Workflow Context Header without string-parsing.
Artifacts attached to this message whose entity rows have not arrived yet.
The parent knows these synchronously — the message-to-artifact map is already in memory — while loading each artifact and version row is not. Without them the message rendered as finished with nothing where the image belonged, then the card appeared unannounced seconds later, which reads as "generation failed" rather than "still loading".
Set alongside, not instead of, artifacts: on a message that already shows a report and is still loading an image, both render at once. Entries whose artifact has since loaded are filtered out by pendingArtifactPlaceholders.
True for the answer that "Save and resend" will replace while that edit is open; the row dims. Set by the message list.
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.
OptionalRatingsHides the response form and actionable commands on this message.
Emits this AI reply when the user asks for a new one; the host regenerates it on a new branch.
Asks the host to rerun this user message's turn in place, after "Save and resend" saved the new text.
Use RegenerateRequested.
The same emitter under the old binding name, so a template still binding (retryClicked) keeps working. Must stay AFTER RetryClicked: class fields initialise in order, and the other way round this captures undefined.
Use RegenerateRequested.
The same emitter under the old binding name, so a template still binding (RetryClicked) keeps working. Must stay AFTER RegenerateRequested: class fields initialise in order, and the other way round this captures undefined.
Fired when the user clicks the Workflow Context Header chip to jump to the originating
workflow message (message.ParentID). Allows the virtualized message list / chat area to
materialize off-screen messages before scrolling and highlighting.
Show the per-message agent run-detail grid (run ID, step/token counts, $ cost).
Show the per-message thumbs rating control on completed AI messages.
Show the per-message reaction buttons (like / comment).
Fired when a stop was requested and no BeforeStopClicked listener canceled it. Carries
the reply's conversation detail; the host resolves the run behind it, stops it, and fires
its AfterStopClicked with the outcome.
Use SuggestedResponseSelected.
The same emitter under the old binding name, so a template still binding (suggestedResponseSelected) keeps working. Must stay AFTER SuggestedResponseSelected: class fields initialise in order, and the other way round this captures undefined.
Fired when the user clicks the Task Graph button on the inline workflow card to view
the visual <mj-task-graph-run-view> flowchart in the conversation's right-side panel.
Use TestFeedbackClicked.
The same emitter under the old binding name, so a template still binding (testFeedbackClicked) keeps working. Must stay AFTER TestFeedbackClicked: class fields initialise in order, and the other way round this captures undefined.
Static ReadonlyContinueThe message the Continue control sends; the next turn then resumes the stopped run.
StaticɵdirStaticɵfacUse ElapsedTimeFormatted.
Use ActionableCommands.
Use AgentRun.
Use AgentRunDuration.
Get formatted duration for the agent run (including any child workflow task graph). For active runs or active workflow task graphs: returns the 1s interval-updated string. For completed runs: spans from earliest start (agentRun or task) to latest end (agentRun or task).
Use AgentRunStepCount.
Get number of steps in the agent run
Use AgentRunTotalCost.
Get total cost of the agent run
Use AgentRunTotalTokens.
Get total tokens used in the agent run
Use AiAgentInfo.
The agent identity as shown in the UI: the ENGINE-resolved identity (see
engineAgentInfo) with the host's assistantDisplayName override
applied to the name when set. Internal logic that must compare against the
real agent name (e.g. isConversationManager) uses engineAgentInfo
directly, so a display override can never change routing/behavior decisions.
Use AllMessages.
Use AllowMessageDelete.
Use AllowMessageEdit.
Use AllowPinning.
Use Artifact.
Use Artifacts.
Use AssistantAvatarUrl.
Host image URL for the AI message avatar. Null = the agent's Font Awesome icon.
Use AssistantDisplayName.
Use Attachments.
Whether the Continue control is offered: the last message in the conversation is a reply the user stopped, the viewer may write, and the host allows stopping (AllowStopRun). Any message resumes the run; this one says so.
Edit: only the author of a finished user message who may write, when the host allows edits and EditMode is not null.
True for an AI reply that is finished and not being edited, for a person who may write, so a new reply can be asked for: as a fork while the person may fork, else in place on the latest answer only.
Fork from here (a new fork that replaces this message): only on a finished user message the current person wrote (the author rule of Edit), when the person may write and may fork, not while processing or editing. Not on agent answers; Regenerate covers those.
Whether this message offers a Stop control: an AI reply still in progress, in a conversation the viewer may write to, while more than one reply is in flight (see InFlightCount). The server's permission check is the real gate; this only decides whether the control is shown.
Use Conversation.
Use CurrentUser.
Use DetailTasks.
Use DisplayArtifacts.
The artifacts to render under this message, one card each, ordered chronologically
(version.__mj_CreatedAt / artifact.__mj_CreatedAt ascending) so intermediate
step outputs appear first and the final deliverable appears last.
Prefers the artifacts array; falls back to the legacy single artifact/artifactVersion
inputs so older callers that set only those keep working.
Use DisplayMessage.
Use EditedText.
The keyboard hint under the editor.
How a saved edit is applied: 'Fork' while the person may fork; with forking off, 'Resend' on the latest user message and 'Save' on an earlier one; null on an inherited row of a fork view (the row belongs to the parent path, so Fork from here is offered there instead).
The note on the editor's button row: what the save does to the conversation; null for a plain Save.
The icon of the edit's save button.
The label of the edit's save button.
The avatar image URL actually rendered: trimmed, and null after a load error so a broken/whitespace URL degrades to the agent icon instead of a broken-image glyph.
Use ElapsedTimeSinceLoad.
ProtectedengineThe engine-resolved agent identity — no host display overrides applied. Protected (not private) so the template's run-details header — which labels the REAL agent's diagnostics and record link — can read it directly.
Whether any workflow step is still pending or actively executing.
Whether the agent-run gear's expanded panel would actually render anything —
used to gate the gear button itself so it doesn't appear as a dead control
that opens an empty popup. The panel hosts, in order: the run-details section
(only when showAgentRunDetails), associated tasks, and (non-last messages
only) the delete / rating / pin overflow. With showAgentRunDetails=false and
none of those enabled — a white-labeled end-user surface — the gear vanishes
entirely instead of opening onto nothing.
Each arm below mirrors the corresponding template condition EXACTLY; keep them
in lockstep with message-item.component.html's .agent-details-panel block.
Defaults leave it unchanged: with showAgentRunDetails=true (the default) this
is unconditionally true, so the gear renders exactly as before — including the
pre-existing window where agentRun hasn't loaded yet and the panel is briefly
empty. That window is deliberately preserved (byte-identical defaults) rather
than fixed here.
Use HasAgentRun.
Whether this message has an associated agent run Based on whether the message has an AgentID (not whether agentRun object is loaded)
Use HasArtifact.
Use HasAttachments.
Check if message has any attachments
Use ImageAttachments.
Get only image attachments
Use IsAgentRunActive.
Use IsAIMessage.
Use IsConversationOwner.
Check if current user is the conversation owner
Use IsEditing.
Use IsLastMessage.
Use IsMessageEdited.
Use IsProcessing.
True when the reply's run was cancelled, by the user or otherwise.
Use IsSystemArtifact.
Check if the artifact is a system-only artifact
Use IsUserMessage.
How much the displayed progress can still be trusted. See MessageLivenessState.
Use MessageClasses.
Returns the cached CSS class string. Updated in ngDoCheck so the value is stable within a single change detection cycle, preventing ExpressionChangedAfterItHasBeenCheckedError.
Use MessageExtraTemplate.
Use MessageSenderName.
Get the actual sender name for user messages Uses the denormalized User field from the view if available, otherwise falls back to current user name
Use MessageStatus.
The pending artifacts that still have no card of their own, filtered per artifact rather than
suppressed wholesale: a message can hold a loaded report and an in-flight image at once, and
gating on displayArtifacts.length would leave that image's window silent.
Use PendingArtifacts.
The final deliverable artifact (created last) when this message carries multiple artifacts, or the sole artifact when there is only one.
Returns either the default Metadata provider or the one specified in the Provider property, if it was specified
Use Ratings.
The tooltip of the Regenerate button.
Use ResponseForm.
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 ShowAgentRunDetails.
Use ShowMessageRating.
Use ShowReactions.
True when the row shows its action group (Edit and Fork from here on a user message, Regenerate on an older answer): a finished row, not being edited, while nothing is processing, for a person who may write.
True when the last message shows its footer: not while this row or another row of the view is being edited.
Regenerate in the footer of the last message.
Regenerate in the header's action group: an answer that is not the last message (the last one carries it in its footer).
The "N steps kept" line under a stopped reply; null when the run kept nothing or was not stopped.
Earlier step-output artifacts (#1 .. #N-1) when this message carries multiple artifacts.
Rendered in a compact, collapsible 2-column grid above the featured final deliverable.
Use TimePillText.
Unified time pill text for all AI message states Returns the appropriate time display based on message state:
Use UserAvatarIconClass.
Get the user's avatar icon class from the userAvatarMap Uses fast O(1) lookup by UserID
Use UserAvatarMap.
Use UserAvatarMap.
Use UserAvatarUrl.
Get the user's avatar image URL from the userAvatarMap Uses fast O(1) lookup by UserID
True when the user stopped the reply's run (the stopped reply, as against a timeout).
Number of completed workflow steps.
Formatted total duration for the workflow execution card.
Returns the parent workflow container task when DetailTasks contains a parent-child hierarchy.
Prevents rendering the container parent task as a duplicate step card alongside its child steps.
Parent task ID for opening <mj-task-graph-run-view> in the right-side panel.
Overall completion percentage (0-100) across all workflow steps.
Number of conditionally skipped workflow steps.
Aggregate status of the workflow ('Running' | 'Complete' | 'Failed' | 'Cancelled').
Ordered executable workflow steps for this message (excluding the container parent row).
Title shown in the inline Workflow Execution Card header.
Compact UPPERCASE badge label (artifact-type name wins over file extension).
Use CancelEditing.
Format file size for display
Format number with commas
Use GetRatingCount.
Get rating count for badge display on gear icon
Use GetStatusText.
Use GetThumbsDownCount.
Get thumbs down count (ratings <= 3)
Use GetThumbsUpCount.
Get thumbs up count (ratings >= 8)
Use HasRatings.
Check if message has any ratings (for gear icon badge)
A callback method that is invoked immediately after Angular has completed initialization of a component's view. It is invoked only once when the view is instantiated.
DoCheck lifecycle hook - detects changes to message properties This runs on every change detection cycle, so we check if Status actually changed This is more reliable than ngOnChanges when the message object reference doesn't change
A callback method that is invoked immediately after the default change detector has checked data-bound properties if at least one has changed, and before the view and content children are checked.
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.
Use OnArtifactClick.
Handle attachment thumbnail click Emits the attachment for the parent to display in the image viewer
The Continue control: sends ContinueMessage the way a suggested response is sent.
Use OnDeleteClick.
Use OnEditClick.
Opens the chip's fork, or the original chip's view at the replaced message; the click does not reach the message bubble.
Asks the host to fork the conversation at this message; the click does not reach the message bubble.
Handle agent response form submission Converts form data to the new @{_mode:"form",...} format
Handles clicks on the message bubble. Shift+Click on any AI message emits a diagnosticRequested event so the parent can dump live streaming state to the browser console — useful for debugging stuck or forever-spinning conversations without any code changes.
Asks the host for a new reply in place of this one, when CanRegenerate allows it.
Use OnRegenerateClick.
Use OnRegenerateClick.
Stop button handler: marks the message as stopping and hands the request to the host.
Use OnTestFeedbackClick.
Use OpenAgentRecord.
Open the agent entity record in a new tab
Use OpenAgentRunRecord.
Open the agent run entity record in a new tab
Optionalevent: EventLabel for a pending artifact. Says what is happening as well as to what — a bare artifact name beside a spinner reads as a title, not as progress, which is the confusion this whole change exists to remove. Matches the media previews' "Loading image..." phrasing.
Use SaveEdit.
Saves the edit. With forking on, hands the text to the host, which saves it as a new fork; this row is not changed. With forking off, saves the text on this row (the server marks it edited) and, for the latest user message, then asks the host to rerun its turn. A failed save keeps the editor open.
Smoothly scrolls the chat viewport to the originating workflow message (this.message.ParentID)
and briefly highlights it when the user clicks the Workflow Context Header chip.
Determine if pin/delete actions should show inline (with rating buttons). Show for latest completed AI message that user hasn't rated yet.
Use ShouldShowRating.
Determine if rating component should be shown inline (Option C - Hybrid). Show for latest completed AI message that user hasn't rated yet. For older/already-rated messages, ratings accessible via gear menu.
Use StartEditing.
Use ToggleAgentDetails.
Toggle the agent details panel expansion
Optionalevent: EventOptionalevent: Event
Component for displaying a single message in a conversation Follows the dynamic rendering pattern from skip-chat for optimal performance This component is created dynamically via ViewContainerRef.createComponent()