@memberjunction/ng-conversations 5.23.0 → 5.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -188,7 +188,23 @@ export declare class MessageInputComponent implements OnInit, OnDestroy, OnChang
188
188
  */
189
189
  private handleDirectMention;
190
190
  /**
191
- * Handles routing when there's a previous agent - checks intent first
191
+ * Handles routing when there's a previous non-Sage agent in the conversation.
192
+ *
193
+ * LATENCY OPTIMIZATION (PR #2309 / plans/agent-latency-optimization.md — Opt #1):
194
+ * Previously, this method made a separate LLM call via checkContinuityIntent() to decide
195
+ * whether the user's new message was still directed at the previous agent or should be
196
+ * routed to Sage. That call added ~300ms of latency on every message in a conversation
197
+ * with an active agent — the single largest source of non-inference overhead on the client.
198
+ *
199
+ * The heuristic replacement is simple: if a previous non-Sage agent exists, always continue
200
+ * with it. The user can @mention a different agent (or Sage) to explicitly switch. This is
201
+ * more predictable and eliminates a common source of confusion where the intent check
202
+ * incorrectly rerouted messages away from the active agent.
203
+ *
204
+ * The checkContinuityIntent() method and the underlying checkAgentContinuityIntent() service
205
+ * method are preserved (not deleted) so we can reintroduce intent checking in the future
206
+ * when browser-local inference is fast enough (~20-50ms) to do this without blocking the
207
+ * user. See PR #2309 for the full discussion.
192
208
  */
193
209
  private handleAgentContinuity;
194
210
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-input.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts"],"names":[],"mappings":"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"}
@@ -541,16 +541,49 @@ export class MessageInputComponent {
541
541
  await this.executeRouteWithNaming(() => this.invokeAgentDirectly(messageDetail, agentMention, this.conversationId), messageDetail.Message, isFirstMessage);
542
542
  }
543
543
  /**
544
- * Handles routing when there's a previous agent - checks intent first
544
+ * Handles routing when there's a previous non-Sage agent in the conversation.
545
+ *
546
+ * LATENCY OPTIMIZATION (PR #2309 / plans/agent-latency-optimization.md — Opt #1):
547
+ * Previously, this method made a separate LLM call via checkContinuityIntent() to decide
548
+ * whether the user's new message was still directed at the previous agent or should be
549
+ * routed to Sage. That call added ~300ms of latency on every message in a conversation
550
+ * with an active agent — the single largest source of non-inference overhead on the client.
551
+ *
552
+ * The heuristic replacement is simple: if a previous non-Sage agent exists, always continue
553
+ * with it. The user can @mention a different agent (or Sage) to explicitly switch. This is
554
+ * more predictable and eliminates a common source of confusion where the intent check
555
+ * incorrectly rerouted messages away from the active agent.
556
+ *
557
+ * The checkContinuityIntent() method and the underlying checkAgentContinuityIntent() service
558
+ * method are preserved (not deleted) so we can reintroduce intent checking in the future
559
+ * when browser-local inference is fast enough (~20-50ms) to do this without blocking the
560
+ * user. See PR #2309 for the full discussion.
545
561
  */
546
562
  async handleAgentContinuity(messageDetail, lastAgentId, mentionResult, isFirstMessage) {
547
- const intentResult = await this.checkContinuityIntent(lastAgentId, messageDetail.Message);
548
- if (intentResult.decision === 'YES') {
549
- await this.executeRouteWithNaming(() => this.continueWithAgent(messageDetail, lastAgentId, this.conversationId, intentResult.targetArtifactVersionId), messageDetail.Message, isFirstMessage);
550
- }
551
- else {
552
- await this.executeRouteWithNaming(() => this.processMessageThroughAgent(messageDetail, mentionResult), messageDetail.Message, isFirstMessage);
553
- }
563
+ // COMMENTED OUT LLM intent check removed for latency optimization (see JSDoc above).
564
+ // const intentResult = await this.checkContinuityIntent(lastAgentId, messageDetail.Message);
565
+ //
566
+ // if (intentResult.decision === 'YES') {
567
+ // await this.executeRouteWithNaming(
568
+ // () => this.continueWithAgent(
569
+ // messageDetail,
570
+ // lastAgentId,
571
+ // this.conversationId,
572
+ // intentResult.targetArtifactVersionId
573
+ // ),
574
+ // messageDetail.Message,
575
+ // isFirstMessage
576
+ // );
577
+ // } else {
578
+ // await this.executeRouteWithNaming(
579
+ // () => this.processMessageThroughAgent(messageDetail, mentionResult),
580
+ // messageDetail.Message,
581
+ // isFirstMessage
582
+ // );
583
+ // }
584
+ // Always continue with the previous agent — user can @mention another agent to switch.
585
+ await this.executeRouteWithNaming(() => this.continueWithAgent(messageDetail, lastAgentId, this.conversationId, undefined // artifact version targeting unavailable without intent check
586
+ ), messageDetail.Message, isFirstMessage);
554
587
  }
555
588
  /**
556
589
  * Handles routing when there's no previous agent context
@@ -1 +1 @@
1
- {"version":3,"file":"message-input.component.js","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts","../../../../src/lib/components/message/message-input.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy, OnChanges, SimpleChanges, AfterViewInit } from '@angular/core';\nimport { UserInfo, Metadata } from '@memberjunction/core';\nimport { MJConversationDetailEntity, MJEnvironmentEntityExtended, ConversationEngine } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\nimport { ConversationAgentService } from '../../services/conversation-agent.service';\nimport { DataCacheService } from '../../services/data-cache.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { ConversationStreamingService, MessageProgressUpdate, MessageProgressMetadata } from '../../services/conversation-streaming.service';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ExecuteAgentResult, AgentExecutionProgressCallback, AgentResponseForm, ActionableCommand, AutomaticCommand, ConversationUtility } from '@memberjunction/ai-core-plus';\nimport { MentionAutocompleteService, MentionSuggestion } from '../../services/mention-autocomplete.service';\nimport { MentionParserService } from '../../services/mention-parser.service';\nimport { ConversationAttachmentService } from '../../services/conversation-attachment.service';\nimport { Mention, MentionParseResult } from '../../models/conversation-state.model';\nimport { PendingAttachment } from '../mention/mention-editor.component';\nimport { LazyArtifactInfo } from '../../models/lazy-artifact-info';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ConversationBridgeService } from '../../services/conversation-bridge.service';\nimport { Subscription } from 'rxjs';\nimport { MessageInputBoxComponent } from './message-input-box.component';\nimport { UUIDsEqual, CleanAndParseJSON } from '@memberjunction/global';\n\n@Component({\n standalone: false,\n selector: 'mj-message-input',\n templateUrl: './message-input.component.html',\n styleUrl: './message-input.component.scss'\n})\nexport class MessageInputComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\n // Default artifact type ID for JSON (when agent doesn't specify DefaultArtifactTypeID)\n private readonly JSON_ARTIFACT_TYPE_ID = 'ae674c7e-ea0d-49ea-89e4-0649f5eb20d4';\n\n @Input() conversationId!: string;\n @Input() conversationName?: string | null; // For task tracking display\n @Input() currentUser!: UserInfo;\n @Input() disabled: boolean = false;\n @Input() placeholder: string = 'Type a message... (Ctrl+Enter to send)';\n @Input() parentMessageId?: string; // Optional: for replying in threads\n @Input() enableAttachments: boolean = true; // Whether to show attachment button (based on agent modality support)\n @Input() maxAttachments: number = 10; // Maximum number of attachments per message\n @Input() maxAttachmentSizeBytes: number = 20 * 1024 * 1024; // Maximum size per attachment (20MB default)\n @Input() acceptedFileTypes: string = 'image/*'; // Accepted MIME types pattern\n @Input() artifactsByDetailId?: Map<string, LazyArtifactInfo[]>; // Pre-loaded artifact data for performance\n @Input() systemArtifactsByDetailId?: Map<string, LazyArtifactInfo[]>; // Pre-loaded system artifact data (Visibility='System Only')\n @Input() agentRunsByDetailId?: Map<string, MJAIAgentRunEntityExtended>; // Pre-loaded agent run data for performance\n @Input() emptyStateMode: boolean = false; // When true, emits emptyStateSubmit instead of creating messages directly\n @Input() appContext: Record<string, unknown> | null = null; // Application context for AI agent awareness\n\n // Initial message to send automatically - using getter/setter for precise control\n private _initialMessage: string | null = null;\n private _initialAttachments: PendingAttachment[] | null = null;\n private _isComponentReady = false; // Track if component is ready to send\n\n @Input()\n set initialMessage(value: string | null) {\n // Handle case where an object with {text, attachments} is passed instead of just a string\n // This can happen if there's a type mismatch in the binding chain\n let actualValue = value;\n if (value && typeof value === 'object' && 'text' in value) {\n actualValue = (value as { text: string }).text;\n }\n\n const previousValue = this._initialMessage;\n this._initialMessage = actualValue;\n\n // If component is ready and we have a new non-null message, trigger send\n if (this._isComponentReady && actualValue && actualValue !== previousValue) {\n this.triggerInitialSend();\n }\n }\n get initialMessage(): string | null {\n return this._initialMessage;\n }\n\n @Input()\n set initialAttachments(value: PendingAttachment[] | null) {\n this._initialAttachments = value;\n }\n get initialAttachments(): PendingAttachment[] | null {\n return this._initialAttachments;\n }\n\n private _conversationHistory: MJConversationDetailEntity[] = [];\n @Input()\n public get conversationHistory(): MJConversationDetailEntity[] {\n return this._conversationHistory;\n }\n public set conversationHistory(value: MJConversationDetailEntity[]) {\n this._conversationHistory = value;\n }\n\n // Message IDs that are in-progress and need streaming reconnection\n // Using getter/setter to react immediately when value changes (avoids timing issues with ngOnChanges)\n private _inProgressMessageIds?: string[];\n @Input()\n set inProgressMessageIds(value: string[] | undefined) {\n this._inProgressMessageIds = value;\n // React immediately when input changes (after component initialized)\n // This ensures callbacks are registered without relying on ngOnChanges timing\n if (this.streamingService && value && value.length > 0) {\n this.reconnectInProgressMessages();\n }\n }\n get inProgressMessageIds(): string[] | undefined {\n return this._inProgressMessageIds;\n }\n\n @Output() messageSent = new EventEmitter<MJConversationDetailEntity>();\n @Output() agentResponse = new EventEmitter<{message: MJConversationDetailEntity, agentResult: any}>();\n @Output() agentRunDetected = new EventEmitter<{conversationDetailId: string; agentRunId: string}>();\n @Output() agentRunUpdate = new EventEmitter<{conversationDetailId: string; agentRun?: any, agentRunId?: string}>(); // Emits when agent run data updates during progress\n @Output() messageComplete = new EventEmitter<{conversationDetailId: string; agentId?: string}>(); // Emits when message completes (success or error)\n @Output() artifactCreated = new EventEmitter<{artifactId: string; versionId: string; versionNumber: number; conversationDetailId: string; name: string}>();\n @Output() conversationRenamed = new EventEmitter<{conversationId: string; name: string; description: string}>();\n @Output() intentCheckStarted = new EventEmitter<void>(); // Emits when intent checking starts\n @Output() intentCheckCompleted = new EventEmitter<void>(); // Emits when intent checking completes\n @Output() emptyStateSubmit = new EventEmitter<{text: string; attachments: PendingAttachment[]}>(); // Emitted when in emptyStateMode\n @Output() uploadStateChanged = new EventEmitter<{isUploading: boolean; message: string}>(); // Emits when attachment upload state changes\n\n @ViewChild('inputBox') inputBox!: MessageInputBoxComponent;\n\n public messageText: string = '';\n public isSending: boolean = false;\n public isProcessing: boolean = false; // True when waiting for agent/naming response\n public processingMessage: string = 'AI is responding...'; // Message shown during processing\n public isUploadingAttachments: boolean = false; // True when uploading attachments to server\n public uploadingMessage: string = 'Uploading attachments...'; // Message shown during upload\n public converationManagerAgent: MJAIAgentEntityExtended | null = null;\n\n // Track completion timestamps to prevent race conditions with late progress updates\n private completionTimestamps = new Map<string, number>();\n // Track registered streaming callbacks for cleanup\n private registeredCallbacks = new Map<string, (progress: MessageProgressUpdate) => Promise<void>>();\n\n // Track pending attachments from the input box\n private pendingAttachments: PendingAttachment[] = [];\n\n private engine = ConversationEngine.Instance;\n\n constructor(\n private dialogService: DialogService,\n private toastService: ToastService,\n private agentService: ConversationAgentService,\n private dataCache: DataCacheService,\n private activeTasks: ActiveTasksService,\n private streamingService: ConversationStreamingService,\n private mentionParser: MentionParserService,\n private mentionAutocomplete: MentionAutocompleteService,\n private attachmentService: ConversationAttachmentService,\n private bridge: ConversationBridgeService\n ) {}\n\n async ngOnInit() {\n this.converationManagerAgent = await this.agentService.getConversationManagerAgent();\n\n // Initialize mention autocomplete (needed for parsing mentions in messages)\n await this.mentionAutocomplete.initialize(this.currentUser);\n\n // Reconnect to any in-progress messages for streaming updates (via global streaming service)\n this.reconnectInProgressMessages();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // When conversation changes, focus the input\n if (changes['conversationId'] && !changes['conversationId'].firstChange) {\n this.focusInput();\n }\n // Note: initialMessage/initialAttachments handled by setters, inProgressMessageIds handled by setter\n }\n\n ngAfterViewInit() {\n // Focus input on initial load\n this.focusInput();\n\n // Mark component as ready\n this._isComponentReady = true;\n\n // If there's an initial message to send (from empty state), send it automatically\n if (this._initialMessage || (this._initialAttachments && this._initialAttachments.length > 0)) {\n this.triggerInitialSend();\n }\n }\n\n /**\n * Triggers sending of initial message and attachments.\n * Called from setter or ngAfterViewInit when conditions are met.\n */\n private triggerInitialSend(): void {\n const message = this._initialMessage;\n const attachments = this._initialAttachments;\n\n // Set pending attachments before sending\n if (attachments && attachments.length > 0) {\n this.pendingAttachments = [...attachments];\n }\n\n // Use setTimeout to ensure we're outside of change detection cycle\n setTimeout(() => {\n this.sendMessageWithText(message || '');\n }, 100);\n }\n\n ngOnDestroy() {\n // Unregister all streaming callbacks\n this.unregisterAllCallbacks();\n }\n\n /**\n * Focus the message input textarea\n */\n private focusInput(): void {\n // Use setTimeout to ensure DOM is ready\n setTimeout(() => {\n if (this.inputBox) {\n this.inputBox.focus();\n }\n }, 100);\n }\n\n /**\n * Reconnect to in-progress messages for streaming updates via global streaming service.\n * This is called when:\n * 1. Component initializes (ngOnInit)\n * 2. Conversation changes (ngOnChanges)\n * 3. User returns to a conversation with in-progress messages\n * 4. Parent component explicitly triggers reconnection\n */\n public reconnectInProgressMessages(): void {\n if (!this.inProgressMessageIds || this.inProgressMessageIds.length === 0) {\n return;\n }\n\n // Unregister any previously registered callbacks for this component\n this.unregisterAllCallbacks();\n\n // Register new callbacks for each in-progress message\n for (const messageId of this.inProgressMessageIds) {\n // Create callback bound to this message ID\n const callback = this.createMessageProgressCallback(messageId);\n\n // Store reference for cleanup\n this.registeredCallbacks.set(messageId, callback);\n\n // Register with streaming service\n this.streamingService.registerMessageCallback(messageId, callback);\n }\n }\n\n /**\n * Create a progress callback for a specific message ID.\n * This callback will be invoked by the streaming service when progress updates arrive.\n */\n private createMessageProgressCallback(messageId: string): (progress: MessageProgressUpdate) => Promise<void> {\n return async (progress: MessageProgressUpdate) => {\n try {\n // Get message from cache (single source of truth)\n const message = await this.dataCache.getConversationDetail(messageId, this.currentUser);\n\n if (!message) {\n console.warn(`[StreamingCallback] Message ${messageId} not found in cache`);\n return;\n }\n\n // Skip if already complete or errored\n if (message.Status === 'Complete' || message.Status === 'Error') {\n console.log(`[StreamingCallback] Message ${messageId} is ${message.Status}, ignoring progress update`);\n return;\n }\n\n // Check if message was marked as completed (prevents race condition)\n const completionTime = this.completionTimestamps.get(messageId);\n if (completionTime) {\n console.log(`[StreamingCallback] Message ${messageId} marked complete at ${new Date(completionTime).toISOString()}, ignoring late progress update`);\n return;\n }\n\n // Default: plain message (used by RunAIAgentResolver and TaskOrchestrator without step info)\n message.Message = progress.message;\n\n // TaskOrchestrator with step info: add formatted header\n // Prefer hierarchical step (e.g., \"2.1.3\") over flat stepCount\n if (progress.resolver === 'TaskOrchestrator') {\n const stepDisplay = progress.metadata?.progress?.hierarchicalStep || progress.stepCount;\n if (stepDisplay != null) {\n message.Message = `**Step ${stepDisplay}**\\n\\n${progress.message}`;\n }\n }\n\n // Server now saves progress - client only updates in-memory and emits for UI\n // (Prevents race condition where client's late save overwrites server's final Status)\n\n // CRITICAL: Emit update to trigger UI refresh\n this.messageSent.emit(message);\n\n // CRITICAL: Update ActiveTasksService to keep the tasks dropdown in sync\n this.activeTasks.updateStatusByConversationDetailId(message.ID, progress.message);\n\n console.log(`[StreamingCallback] Updated message ${messageId}: ${progress.taskName || 'Agent'}`);\n } catch (error) {\n console.error(`[StreamingCallback] Error updating message ${messageId}:`, error);\n }\n };\n }\n\n /**\n * Unregister all callbacks registered by this component.\n * Called during cleanup and when switching conversations.\n */\n private unregisterAllCallbacks(): void {\n if (this.registeredCallbacks.size === 0) {\n return;\n }\n\n console.log(`🧹 Unregistering ${this.registeredCallbacks.size} message callbacks`);\n\n for (const [messageId, callback] of this.registeredCallbacks) {\n this.streamingService.unregisterMessageCallback(messageId, callback);\n }\n\n this.registeredCallbacks.clear();\n }\n\n get canSend(): boolean {\n return !this.disabled && !this.isSending && this.messageText.trim().length > 0;\n }\n\n /**\n * Handle attachments changed from the input box\n */\n onAttachmentsChanged(attachments: PendingAttachment[]): void {\n this.pendingAttachments = attachments;\n }\n\n /**\n * Handle attachment errors from the input box\n */\n onAttachmentError(error: string): void {\n this.toastService.error(error);\n }\n\n /**\n * Handle text submitted from the input box\n */\n async onTextSubmitted(text: string): Promise<void> {\n // Check if we have either text or attachments\n const hasText = text && text.trim().length > 0;\n const hasAttachments = this.pendingAttachments.length > 0;\n\n if (!hasText && !hasAttachments) {\n return;\n }\n\n // In empty state mode, just emit the data and let parent handle conversation creation\n if (this.emptyStateMode) {\n const attachmentsToEmit = [...this.pendingAttachments];\n this.pendingAttachments = [];\n this.messageText = '';\n this.emptyStateSubmit.emit({ text: text?.trim() || '', attachments: attachmentsToEmit });\n return;\n }\n\n this.isSending = true;\n\n // Store attachments locally since we'll clear them after send\n const attachmentsToSave = [...this.pendingAttachments];\n\n try {\n const messageDetail = await this.createMessageDetailFromText(text?.trim() || '');\n\n const saved = await messageDetail.Save();\n\n if (saved) {\n // Save attachments if any were pending\n // Attachments are stored in ConversationDetailAttachment table and loaded\n // separately when building AI messages - no need to add tokens to Message field\n if (attachmentsToSave.length > 0) {\n // Show upload indicator for attachments\n this.isUploadingAttachments = true;\n this.uploadingMessage = `Uploading ${attachmentsToSave.length} attachment${attachmentsToSave.length > 1 ? 's' : ''}...`;\n this.uploadStateChanged.emit({ isUploading: true, message: this.uploadingMessage });\n\n try {\n await this.attachmentService.saveAttachments(\n messageDetail.ID,\n attachmentsToSave,\n this.currentUser\n );\n } catch (attachmentError) {\n console.error('Failed to save attachments:', attachmentError);\n this.toastService.error('Some attachments could not be saved');\n } finally {\n this.isUploadingAttachments = false;\n this.uploadStateChanged.emit({ isUploading: false, message: '' });\n }\n }\n\n // Clear pending attachments after successful send\n this.pendingAttachments = [];\n\n await this.handleSuccessfulSend(messageDetail);\n } else {\n this.handleSendFailure(messageDetail);\n }\n } catch (error) {\n this.handleSendError(error);\n } finally {\n this.isSending = false;\n }\n }\n\n async onSend(): Promise<void> {\n if (!this.canSend) return;\n\n this.isSending = true;\n try {\n const messageDetail = await this.createMessageDetail();\n const saved = await messageDetail.Save();\n\n if (saved) {\n await this.handleSuccessfulSend(messageDetail);\n } else {\n this.handleSendFailure(messageDetail);\n }\n } catch (error) {\n this.handleSendError(error);\n } finally {\n this.isSending = false;\n }\n }\n\n /**\n * Send a message with custom text WITHOUT modifying the visible messageText input\n * Used for suggested responses and initial messages from empty state.\n * Also saves any pending attachments.\n */\n public async sendMessageWithText(text: string): Promise<void> {\n const hasText = text && text.trim().length > 0;\n const hasAttachments = this.pendingAttachments.length > 0;\n\n if (!hasText && !hasAttachments) {\n return;\n }\n\n if (this.isSending) {\n return;\n }\n\n this.isSending = true;\n const attachmentsToSave = [...this.pendingAttachments];\n\n try {\n const detail = await this.dataCache.createConversationDetail(this.currentUser);\n detail.ConversationID = this.conversationId;\n detail.Message = text?.trim() || '';\n detail.Role = 'User';\n detail.UserID = this.currentUser.ID; // Set the user who sent the message\n\n if (this.parentMessageId) {\n detail.ParentID = this.parentMessageId;\n }\n\n const saved = await detail.Save();\n\n if (saved) {\n // Save attachments if any were pending\n if (attachmentsToSave.length > 0) {\n // Show upload indicator for attachments\n this.isUploadingAttachments = true;\n this.uploadingMessage = `Uploading ${attachmentsToSave.length} attachment${attachmentsToSave.length > 1 ? 's' : ''}...`;\n this.uploadStateChanged.emit({ isUploading: true, message: this.uploadingMessage });\n\n try {\n await this.attachmentService.saveAttachments(\n detail.ID,\n attachmentsToSave,\n this.currentUser\n );\n } catch (attachmentError) {\n console.error('Failed to save attachments:', attachmentError);\n this.toastService.error('Some attachments could not be saved');\n } finally {\n this.isUploadingAttachments = false;\n this.uploadStateChanged.emit({ isUploading: false, message: '' });\n }\n }\n\n // Clear pending attachments after successful send\n this.pendingAttachments = [];\n\n this.messageSent.emit(detail);\n\n const mentionResult = this.parseMentionsFromMessage(detail.Message);\n const isFirstMessage = this.conversationHistory.length === 0;\n await this.routeMessage(detail, mentionResult, isFirstMessage);\n } else {\n this.handleSendFailure(detail);\n }\n } catch (error) {\n this.handleSendError(error);\n } finally {\n this.isSending = false;\n }\n }\n\n /**\n * Creates and configures a new conversation detail message\n */\n private async createMessageDetail(): Promise<MJConversationDetailEntity> {\n const detail = await this.dataCache.createConversationDetail(this.currentUser);\n\n detail.ConversationID = this.conversationId;\n detail.Message = this.messageText.trim();\n detail.Role = 'User';\n detail.UserID = this.currentUser.ID; // Set the user who sent the message\n\n if (this.parentMessageId) {\n detail.ParentID = this.parentMessageId;\n }\n\n return detail;\n }\n\n /**\n * Creates and configures a new conversation detail message from provided text\n */\n private async createMessageDetailFromText(text: string): Promise<MJConversationDetailEntity> {\n const detail = await this.dataCache.createConversationDetail(this.currentUser);\n\n detail.ConversationID = this.conversationId;\n detail.Message = text;\n detail.Role = 'User';\n detail.UserID = this.currentUser.ID; // Set the user who sent the message\n\n if (this.parentMessageId) {\n detail.ParentID = this.parentMessageId;\n }\n\n return detail;\n }\n\n /**\n * Handles successful message send - routes to appropriate agent\n */\n private async handleSuccessfulSend(messageDetail: MJConversationDetailEntity): Promise<void> {\n this.messageSent.emit(messageDetail);\n this.messageText = '';\n\n const mentionResult = this.parseMentionsFromMessage(messageDetail.Message);\n const isFirstMessage = this.conversationHistory.length === 0;\n\n await this.routeMessage(messageDetail, mentionResult, isFirstMessage);\n this.refocusTextarea();\n }\n\n /**\n * Parses mentions from the message for routing decisions\n */\n private parseMentionsFromMessage(message: string): MentionParseResult {\n const mentionResult = this.mentionParser.parseMentions(\n message,\n this.mentionAutocomplete.getAvailableAgents(),\n this.mentionAutocomplete.getAvailableUsers()\n );\n\n return mentionResult;\n }\n\n /**\n * Routes the message to the appropriate agent or Sage based on context\n * Priority: @mention > intent check > Sage\n */\n private async routeMessage(\n messageDetail: MJConversationDetailEntity,\n mentionResult: MentionParseResult,\n isFirstMessage: boolean\n ): Promise<void> {\n // Priority 1: Direct @mention\n if (mentionResult.agentMention) {\n await this.handleDirectMention(messageDetail, mentionResult.agentMention, isFirstMessage);\n return;\n }\n\n // Priority 2: Check for previous agent with intent check\n const lastAgentId = this.findLastNonSageAgentId();\n if (lastAgentId) {\n await this.handleAgentContinuity(messageDetail, lastAgentId, mentionResult, isFirstMessage);\n return;\n }\n\n // Priority 3: Check if Sage was explicitly @mentioned with a config preset\n // If so, treat it like agent continuity so the config preset is preserved\n if (this.converationManagerAgent?.ID) {\n const sageConfigPreset = this.agentService.findConfigurationPresetFromHistory(\n this.converationManagerAgent.ID,\n this.conversationHistory\n );\n if (sageConfigPreset) {\n // User explicitly @mentioned Sage with a config - use the shared execution helper directly\n // Pass the already-found config preset to avoid redundant history search\n await this.executeRouteWithNaming(\n () => this.executeAgentContinuation(\n messageDetail,\n this.converationManagerAgent!.ID,\n this.converationManagerAgent!.Name || 'Sage',\n this.conversationId,\n null, // Sage doesn't use payload continuity\n null, // Sage doesn't use artifact info\n sageConfigPreset // Pass the already-found config preset\n ),\n messageDetail.Message,\n isFirstMessage\n );\n return;\n }\n }\n\n // Priority 4: No context - use Sage with default config\n await this.handleNoAgentContext(messageDetail, mentionResult, isFirstMessage);\n }\n\n /**\n * Handles routing when user directly mentions an agent with @\n */\n private async handleDirectMention(\n messageDetail: MJConversationDetailEntity,\n agentMention: Mention,\n isFirstMessage: boolean\n ): Promise<void> {\n // The agentMention already has configurationId from JSON parsing\n // If it wasn't in JSON (legacy format), try to get from chip data\n if (!agentMention.configurationId) {\n const chipData = this.inputBox?.getMentionChipsData() || [];\n const agentChip = chipData.find(chip => chip.id === agentMention.id && chip.type === 'agent');\n if (agentChip?.presetId) {\n agentMention.configurationId = agentChip.presetId;\n }\n }\n\n if (agentMention.configurationId) {\n //console.log(`🎯 Agent mention has configuration ID: ${agentMention.configurationId}`);\n }\n\n await this.executeRouteWithNaming(\n () => this.invokeAgentDirectly(messageDetail, agentMention, this.conversationId),\n messageDetail.Message,\n isFirstMessage\n );\n }\n\n /**\n * Handles routing when there's a previous agent - checks intent first\n */\n private async handleAgentContinuity(\n messageDetail: MJConversationDetailEntity,\n lastAgentId: string,\n mentionResult: MentionParseResult,\n isFirstMessage: boolean\n ): Promise<void> {\n const intentResult = await this.checkContinuityIntent(lastAgentId, messageDetail.Message);\n\n if (intentResult.decision === 'YES') {\n await this.executeRouteWithNaming(\n () => this.continueWithAgent(\n messageDetail,\n lastAgentId,\n this.conversationId,\n intentResult.targetArtifactVersionId\n ),\n messageDetail.Message,\n isFirstMessage\n );\n } else {\n await this.executeRouteWithNaming(\n () => this.processMessageThroughAgent(messageDetail, mentionResult),\n messageDetail.Message,\n isFirstMessage\n );\n }\n }\n\n /**\n * Handles routing when there's no previous agent context\n */\n private async handleNoAgentContext(\n messageDetail: MJConversationDetailEntity,\n mentionResult: MentionParseResult,\n isFirstMessage: boolean\n ): Promise<void> {\n await this.executeRouteWithNaming(\n () => this.processMessageThroughAgent(messageDetail, mentionResult),\n messageDetail.Message,\n isFirstMessage\n );\n }\n\n /**\n * Finds the last agent ID that isn't Sage\n */\n private findLastNonSageAgentId(): string | null {\n const lastAIMessage = this.conversationHistory\n .slice()\n .reverse()\n .find(msg =>\n msg.Role === 'AI' &&\n msg.AgentID &&\n !UUIDsEqual(msg.AgentID, this.converationManagerAgent?.ID)\n );\n\n return lastAIMessage?.AgentID || null;\n }\n\n /**\n * Checks if message should continue with the previous agent\n * Emits events to show temporary intent checking message in conversation\n */\n private async checkContinuityIntent(agentId: string, message: string) {\n // FAST PATH: If message contains form response syntax, skip the intent check entirely\n // Form responses always continue with the agent that requested the form\n // Don't show \"Analyzing intent...\" message for this obvious case\n if (ConversationUtility.ContainsFormResponse(message)) {\n console.log('✅ Form response detected, skipping intent check UI (fast path)');\n return {\n decision: 'YES' as const,\n reasoning: 'User submitted a form response to the previous agent'\n };\n }\n\n // Emit event to show temporary \"Analyzing intent...\" message in conversation\n this.intentCheckStarted.emit();\n\n try {\n // Build context from pre-loaded maps (if available)\n if (!this.artifactsByDetailId || !this.agentRunsByDetailId) {\n console.warn('⚠️ Artifact/agent run context not available for intent check');\n return { decision: 'UNSURE' as const, reasoning: 'Context not available' };\n }\n\n const intent = await this.agentService.checkAgentContinuityIntent(\n agentId,\n message,\n this.conversationHistory,\n {\n artifactsByDetailId: this.artifactsByDetailId,\n agentRunsByDetailId: this.agentRunsByDetailId\n }\n );\n return intent;\n } catch (error) {\n console.error('❌ Intent check failed, defaulting to UNSURE:', error);\n return { decision: 'UNSURE' as const, reasoning: 'Intent check failed with error' };\n } finally {\n // Emit event to remove temporary intent checking message\n this.intentCheckCompleted.emit();\n }\n }\n\n /**\n * Executes a routing function, optionally with conversation naming for first message\n *\n * IMPORTANT: Conversation naming runs asynchronously in the background and does NOT\n * block the agent invocation. This prevents UI blocking if naming times out.\n */\n private async executeRouteWithNaming(\n routeFunction: () => Promise<void>,\n userMessage: string,\n isFirstMessage: boolean\n ): Promise<void> {\n if (isFirstMessage) {\n // Fire conversation naming in background (don't await)\n // This prevents 2+ minute UI blocking if naming times out\n this.nameConversation(userMessage);\n\n // Execute route immediately (don't wait for naming)\n await routeFunction();\n } else {\n await routeFunction();\n }\n }\n\n /**\n * Returns focus to the message textarea\n */\n private refocusTextarea(): void {\n setTimeout(() => {\n if (this.inputBox) {\n this.inputBox.focus();\n }\n }, 100);\n }\n\n /**\n * Handles message send failure\n */\n private handleSendFailure(messageDetail: MJConversationDetailEntity): void {\n console.error('Failed to send message:', messageDetail.LatestResult?.Message);\n this.toastService.error('Failed to send message. Please try again.');\n }\n\n /**\n * Handles message send error\n */\n private handleSendError(error: unknown): void {\n console.error('Error sending message:', error);\n this.toastService.error('Error sending message. Please try again.');\n }\n\n /**\n * Create a progress callback for agent execution\n * This callback updates both the active task and the ConversationDetail message\n * IMPORTANT: Filters by agentRunId to prevent cross-contamination when multiple agents run in parallel\n */\n private createProgressCallback(\n conversationDetail: MJConversationDetailEntity,\n agentName: string\n ): AgentExecutionProgressCallback {\n // Use closure to capture the agent run ID from the first progress message\n // This allows us to filter out progress messages from other concurrent agents\n let capturedAgentRunId: string | null = null;\n\n return async (progress) => {\n const metadata = progress.metadata as MessageProgressMetadata | undefined;\n const progressAgentRun = metadata?.agentRun;\n const progressAgentRunId = metadata?.agentRun?.ID || metadata?.agentRunId;\n\n // Capture the agent run ID from the first progress message\n if (!capturedAgentRunId && progressAgentRunId) {\n capturedAgentRunId = progressAgentRunId;\n }\n\n // Filter out progress messages from other concurrent agents\n // This prevents cross-contamination when multiple agents run in parallel\n if (capturedAgentRunId && progressAgentRunId && progressAgentRunId !== capturedAgentRunId) {\n return;\n }\n\n // Format progress message with visual indicator\n const progressText = progress.message;\n\n // Update the active task with progress details (if it exists)\n this.activeTasks.updateStatusByConversationDetailId(conversationDetail.ID, progressText);\n\n // Update the ConversationDetail message in real-time\n try {\n if (conversationDetail) {\n // Check 1: Skip if message is already complete or errored\n if (conversationDetail.Status === 'Complete' || conversationDetail.Status === 'Error') {\n return;\n }\n\n // Check 2: Skip if message was marked as completed (prevents race condition)\n // Once a message is marked complete, we reject ALL further progress updates\n const completionTime = this.completionTimestamps.get(conversationDetail.ID);\n if (completionTime) {\n return;\n }\n\n // CRITICAL FIX: Emit FULL agent run object for incremental updates\n // This contains live timestamps, status, and other fields that change during execution\n if (progressAgentRun || progressAgentRunId) {\n this.agentRunUpdate.emit({\n conversationDetailId: conversationDetail.ID,\n agentRun: progressAgentRun,\n agentRunId: progressAgentRunId\n });\n } else if (progressAgentRunId && !capturedAgentRunId) {\n // Fallback: If we don't have the full object but have the ID, emit agentRunDetected\n // This will trigger a database query to load the agent run\n this.agentRunDetected.emit({\n conversationDetailId: conversationDetail.ID,\n agentRunId: progressAgentRunId\n });\n }\n\n if (conversationDetail.Status === 'In-Progress') {\n conversationDetail.Message = progressText;\n // Server now saves progress - client only updates in-memory and emits for UI\n // (Prevents race condition where client's late save overwrites server's final Status)\n this.messageSent.emit(conversationDetail);\n }\n }\n } catch (error) {\n console.warn('Failed to update progress in ConversationDetail:', error);\n }\n };\n }\n\n /**\n * Process the message through agents (multi-stage: Sage -> possible sub-agent)\n * Only called when there's no @mention and no implicit agent context\n */\n private async processMessageThroughAgent(\n userMessage: MJConversationDetailEntity,\n mentionResult: MentionParseResult\n ): Promise<void> {\n let taskId: string | null = null;\n let conversationManagerMessage: MJConversationDetailEntity | null = null;\n\n // CRITICAL: Capture conversationId from user message at start\n // This prevents race condition when user switches conversations during async processing\n const conversationId = userMessage.ConversationID;\n\n try {\n // Create AI message for Sage BEFORE invoking\n conversationManagerMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n conversationManagerMessage.ConversationID = conversationId;\n conversationManagerMessage.Role = 'AI';\n conversationManagerMessage.Message = '⏳ Starting...';\n conversationManagerMessage.ParentID = userMessage.ID;\n conversationManagerMessage.Status = 'In-Progress';\n conversationManagerMessage.HiddenToUser = false;\n // Use the preloaded Sage agent instead of looking it up\n if (this.converationManagerAgent?.ID) {\n conversationManagerMessage.AgentID = this.converationManagerAgent.ID;\n }\n\n await conversationManagerMessage.Save();\n this.messageSent.emit(conversationManagerMessage);\n\n // Use Sage to evaluate and route\n // Stage 1: Sage evaluates the message\n taskId = this.activeTasks.add({\n agentName: 'Sage',\n status: 'Evaluating message...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: conversationManagerMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n const result = await this.agentService.processMessage(\n conversationId,\n userMessage,\n this.conversationHistory,\n conversationManagerMessage.ID,\n this.createProgressCallback(conversationManagerMessage, 'Sage'),\n this.appContext\n );\n\n // Task will be removed automatically in markMessageComplete()\n // DO NOT remove here - agent may still be streaming/processing\n taskId = null; // Clear reference but don't remove from service\n\n if (!result || !result.success) {\n // Evaluation failed - use updateConversationDetail to ensure task cleanup\n const errorMsg = result?.agentRun?.ErrorMessage || 'Agent evaluation failed';\n conversationManagerMessage.Error = errorMsg;\n await this.updateConversationDetail(conversationManagerMessage, `❌ Evaluation failed`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n console.warn('⚠️ Sage failed:', result?.agentRun?.ErrorMessage);\n\n // Clean up completion timestamp\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n return;\n }\n\n // Stage 2: Check for task graph (multi-step orchestration)\n if (result.payload?.taskGraph) {\n await this.handleTaskGraphExecution(userMessage, result, this.conversationId, conversationManagerMessage);\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n // Stage 3: Check for sub-agent invocation (single-step delegation)\n else if (result.agentRun.FinalStep === 'Success' && result.payload?.invokeAgent) {\n // Reuse the existing conversationManagerMessage instead of creating new ones\n await this.handleSubAgentInvocation(userMessage, result, this.conversationId, conversationManagerMessage);\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n // Stage 4: Direct chat response from Agent\n else if (result.agentRun.FinalStep === 'Chat' && result.agentRun.Message) {\n // Normal chat response\n // use update helper to ensure that if there is a race condition with more streaming updates we don't allow that to override this final message\n // Note: updateConversationDetail will call markMessageComplete() for us\n await this.updateConversationDetail(conversationManagerMessage, result.agentRun.Message, 'Complete', result);\n\n // Handle artifacts if any (but NOT task graphs - those are intermediate work products)\n // Server already created artifacts - just emit event to trigger UI reload\n if (result.payload && Object.keys(result.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: conversationManagerMessage.ID,\n name: ''\n });\n this.messageSent.emit(conversationManagerMessage);\n }\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n\n // Clean up completion timestamp after delay\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n }\n // Stage 5: Silent observation - but check for message content first\n else {\n // Check if there's a message to display even without payload/taskGraph\n if (result.agentRun.Message) {\n // Mark message as completing BEFORE setting final content\n this.markMessageComplete(conversationManagerMessage);\n\n conversationManagerMessage.HiddenToUser = false;\n\n // use update helper to ensure that if there is a race condition with more streaming updates we don't allow that to override this final message\n await this.updateConversationDetail(conversationManagerMessage, result.agentRun.Message, 'Complete', result);\n\n this.messageSent.emit(conversationManagerMessage);\n\n // Clean up completion timestamp after delay\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n } else {\n // Mark message as completing\n this.markMessageComplete(conversationManagerMessage);\n\n // Hide the Sage message\n conversationManagerMessage.HiddenToUser = true;\n\n // use update helper to ensure that if there is a race condition with more streaming updates we don't allow that to override this final message\n await this.updateConversationDetail(conversationManagerMessage, conversationManagerMessage.Message, 'Complete', result);\n\n this.messageSent.emit(conversationManagerMessage);\n\n await this.handleSilentObservation(userMessage, this.conversationId);\n\n // Clean up completion timestamp after delay\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n }\n\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n\n } catch (error) {\n console.error('❌ Error processing message through agents:', error);\n\n // Update conversationManagerMessage status to Error\n if (conversationManagerMessage && conversationManagerMessage.ID) {\n // Use updateConversationDetail to ensure task cleanup\n conversationManagerMessage.Error = String(error);\n await this.updateConversationDetail(conversationManagerMessage, `❌ Error: ${String(error)}`, 'Error');\n\n // Clean up completion timestamp\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n // Clean up active task\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n }\n\n /**\n * Handle task graph execution based on Sage's payload\n * Creates tasks and orchestrates their execution\n */\n private async handleTaskGraphExecution(\n userMessage: MJConversationDetailEntity,\n managerResult: ExecuteAgentResult,\n conversationId: string,\n conversationManagerMessage: MJConversationDetailEntity\n ): Promise<void> {\n const taskGraph = managerResult.payload.taskGraph;\n const workflowName = taskGraph.workflowName || 'Workflow';\n const reasoning = taskGraph.reasoning || 'Executing multi-step workflow';\n const taskCount = taskGraph.tasks?.length || 0;\n\n // Deduplicate tasks by tempId (LLM sometimes returns duplicates)\n const seenTempIds = new Set<string>();\n const uniqueTasks = taskGraph.tasks.filter((task: any) => {\n if (seenTempIds.has(task.tempId)) {\n console.warn(`⚠️ Duplicate tempId detected on client, filtering: ${task.tempId} (${task.name})`);\n return false;\n }\n seenTempIds.add(task.tempId);\n return true;\n });\n\n const uniqueTaskCount = uniqueTasks.length;\n\n const isSingleTask = uniqueTaskCount === 1;\n\n // If single task, use direct agent execution (existing pattern with great PubSub support)\n if (isSingleTask) {\n const task = uniqueTasks[0];\n const agentName = task.agentName;\n\n // Update CM message\n const delegationMessage = `👉 Delegating to **${agentName}**`;\n await this.updateConversationDetail(conversationManagerMessage, delegationMessage, 'Complete');\n\n // Execute single agent directly using existing pattern\n await this.handleSingleTaskExecution(\n userMessage,\n task,\n agentName,\n conversationId,\n conversationManagerMessage\n );\n\n return;\n }\n\n // Multi-step workflow - use server-side task orchestration\n console.log(`📋 Multi-step workflow detected (${uniqueTaskCount} tasks), using task orchestration`);\n\n // Update CM message with task summary (use unique tasks only)\n const taskSummary = uniqueTasks.map((t: any) => `• ${t.name}`).join('\\n');\n\n await this.updateConversationDetail(conversationManagerMessage, `📋 Setting up multi-step workflow...\\n\\n**${workflowName}**\\n${taskSummary}`, 'Complete');\n\n // Step 2: Create new ConversationDetail for task execution updates\n const taskExecutionMessage = await this.dataCache.createConversationDetail(this.currentUser);\n taskExecutionMessage.ConversationID = conversationId;\n taskExecutionMessage.Role = 'AI';\n taskExecutionMessage.Message = '⏳ Starting workflow execution...';\n taskExecutionMessage.ParentID = conversationManagerMessage.ID; // Thread under delegation message\n taskExecutionMessage.Status = 'In-Progress';\n taskExecutionMessage.HiddenToUser = false;\n // No AgentID for now - this represents the task orchestration system\n await taskExecutionMessage.Save();\n this.messageSent.emit(taskExecutionMessage);\n\n // Register for streaming updates via global streaming service\n const callback = this.createMessageProgressCallback(taskExecutionMessage.ID);\n this.registeredCallbacks.set(taskExecutionMessage.ID, callback);\n this.streamingService.registerMessageCallback(taskExecutionMessage.ID, callback);\n\n try {\n // Get default environment ID (MJ standard environment used across all installations)\n const environmentId = MJEnvironmentEntityExtended.DefaultEnvironmentID;\n\n // Get session ID for PubSub subscriptions\n const sessionId = GraphQLDataProvider.Instance.sessionId || '';\n \n // Step 3: Call ExecuteTaskGraph mutation (links to taskExecutionMessage)\n const mutation = `\n mutation ExecuteTaskGraph($taskGraphJson: String!, $conversationDetailId: String!, $environmentId: String!, $sessionId: String!, $createNotifications: Boolean) {\n ExecuteTaskGraph(\n taskGraphJson: $taskGraphJson\n conversationDetailId: $conversationDetailId\n environmentId: $environmentId\n sessionId: $sessionId\n createNotifications: $createNotifications\n ) {\n success\n errorMessage\n results {\n taskId\n success\n output\n error\n }\n }\n }\n `;\n\n const variables = {\n taskGraphJson: JSON.stringify(taskGraph),\n conversationDetailId: taskExecutionMessage.ID, // Link tasks to execution message, not CM message\n environmentId: environmentId,\n sessionId: sessionId,\n createNotifications: true\n };\n\n const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, variables);\n\n // Step 4: Update task execution message with results\n // ExecuteGQL returns data directly (not wrapped in {data, errors})\n if (result?.ExecuteTaskGraph?.success) {\n await this.updateConversationDetail(taskExecutionMessage, `✅ **${workflowName}** completed successfully`, 'Complete');\n } else {\n const errorMsg = result?.ExecuteTaskGraph?.errorMessage || 'Unknown error';\n console.error('❌ Task graph execution failed:', errorMsg);\n taskExecutionMessage.Error = errorMsg;\n await this.updateConversationDetail(taskExecutionMessage, `❌ **${workflowName}** failed: ${errorMsg}`, 'Error');\n }\n\n // Trigger artifact reload for this message\n // Artifacts were created on server during task execution and linked to this message\n // This event triggers the parent component to reload artifacts from the database\n this.artifactCreated.emit({\n artifactId: '', // Placeholder - reload will fetch actual artifacts from DB\n versionId: '',\n versionNumber: 1,\n conversationDetailId: taskExecutionMessage.ID,\n name: ''\n });\n\n // Unregister streaming callback (task complete)\n const callback = this.registeredCallbacks.get(taskExecutionMessage.ID);\n if (callback) {\n this.streamingService.unregisterMessageCallback(taskExecutionMessage.ID, callback);\n this.registeredCallbacks.delete(taskExecutionMessage.ID);\n }\n\n // Mark agent response message as complete (removes task from active tasks)\n await this.updateConversationDetail(conversationManagerMessage, conversationManagerMessage.Message, 'Complete');\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n } catch (error) {\n console.error('❌ Error executing task graph:', error);\n taskExecutionMessage.Error = String(error);\n await this.updateConversationDetail(taskExecutionMessage, `❌ **${workflowName}** - Error: ${String(error)}`, 'Error');\n\n // Trigger artifact reload even on error - partial artifacts may have been created\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 1,\n conversationDetailId: taskExecutionMessage.ID,\n name: ''\n });\n\n // Unregister streaming callback (task failed)\n const callback = this.registeredCallbacks.get(taskExecutionMessage.ID);\n if (callback) {\n this.streamingService.unregisterMessageCallback(taskExecutionMessage.ID, callback);\n this.registeredCallbacks.delete(taskExecutionMessage.ID);\n }\n\n // Mark agent response message as complete (removes task from active tasks)\n conversationManagerMessage.Error = String(error);\n await this.updateConversationDetail(conversationManagerMessage, conversationManagerMessage.Message, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n protected async updateConversationDetail(convoDetail: MJConversationDetailEntity, message: string, status: 'In-Progress' | 'Complete' | 'Error', result?: ExecuteAgentResult): Promise<void> {\n // Mark as completing FIRST if status is Complete or Error\n // This ensures task cleanup happens even if we return early due to guard clause\n if (status === 'Complete' || status === 'Error') {\n this.markMessageComplete(convoDetail);\n }\n\n // Race condition guard: Before writing Error, reload from DB to check if the server\n // already completed this record. The server and client write to the same conversation\n // detail record — if the server completed successfully but a client-side timeout or\n // WebSocket disconnect triggered this error path, we must not overwrite the server's\n // successful completion with an error status.\n if (status === 'Error' && convoDetail.ID) {\n await convoDetail.Load(convoDetail.ID);\n if (convoDetail.Status === 'Complete') {\n // Server already completed — emit updated message, don't overwrite with error\n this.messageSent.emit(convoDetail);\n return;\n }\n }\n\n // Guard clause: Don't re-save if already complete/errored (prevents duplicate saves)\n // Task has already been removed by markMessageComplete() above\n if (convoDetail.Status === 'Complete' || convoDetail.Status === 'Error') {\n return; // Already complete, no need to save again\n }\n\n const maxAttempts = 2;\n let attempts = 0, done = false;\n while (attempts < maxAttempts && !done) {\n // Set response form and command fields before saving\n if (result?.responseForm) {\n convoDetail.ResponseForm = JSON.stringify(result.responseForm);\n }\n if (result?.actionableCommands) {\n convoDetail.ActionableCommands = JSON.stringify(result.actionableCommands);\n }\n if (result?.automaticCommands) {\n convoDetail.AutomaticCommands = JSON.stringify(result.automaticCommands);\n }\n\n convoDetail.Message = message;\n convoDetail.Status = status;\n\n await convoDetail.Save();\n\n if (convoDetail.Message === message && convoDetail.Status === status) {\n done = true;\n this.messageSent.emit(convoDetail);\n }\n else {\n console.warn(` ⚠️ ConversationDetail update attempt ${attempts + 1} did not persist. ${attempts + 1 < maxAttempts ? 'Retrying...' : 'Giving up.'}`);\n }\n attempts++;\n }\n\n // Clean up completion timestamp after delay\n if (status === 'Complete' || status === 'Error') {\n this.cleanupCompletionTimestamp(convoDetail.ID);\n }\n }\n\n /**\n * Load previous payload for an agent from its most recent OUTPUT artifact.\n * Searches backwards through all messages from this agent until an artifact is found.\n * This ensures payload continuity even after clarifying exchanges without artifacts.\n * Checks both user-visible and system artifacts to support agents like Agent Manager.\n */\n private async loadPreviousPayloadForAgent(agentId: string): Promise<{\n payload: any;\n artifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null;\n }> {\n // Get all messages from this agent in reverse order (most recent first)\n const agentMessages = this.conversationHistory\n .slice()\n .reverse()\n .filter(msg => msg.Role === 'AI' && UUIDsEqual(msg.AgentID, agentId));\n\n if (agentMessages.length === 0) {\n return { payload: null, artifactInfo: null };\n }\n\n // Search through all agent messages until we find one with an artifact\n for (const message of agentMessages) {\n // Check user-visible artifacts first\n let artifacts = this.artifactsByDetailId?.get(message.ID);\n\n // If not found, check system artifacts (Agent Manager, etc.)\n if (!artifacts || artifacts.length === 0) {\n artifacts = this.systemArtifactsByDetailId?.get(message.ID);\n }\n\n // Try to load artifact content as payload\n if (artifacts && artifacts.length > 0) {\n const artifact = artifacts[0];\n try {\n const version = await artifact.getVersion();\n if (version.Content) {\n console.log(`📦 Loaded previous payload for agent ${agentId} from artifact (message: ${message.ID})`);\n return {\n payload: JSON.parse(version.Content),\n artifactInfo: {\n artifactId: artifact.artifactId,\n versionId: artifact.artifactVersionId,\n versionNumber: artifact.versionNumber\n }\n };\n }\n } catch (error) {\n console.error('Error loading payload from artifact:', error);\n // Continue to next message\n }\n }\n }\n\n console.log(`📦 No previous payload found for agent ${agentId} after searching ${agentMessages.length} messages`);\n return { payload: null, artifactInfo: null };\n }\n\n /**\n * Handle single task execution from task graph using direct agent execution\n * Uses the existing agent execution pattern with PubSub support\n */\n private async handleSingleTaskExecution(\n userMessage: MJConversationDetailEntity,\n task: any, // Task definition from taskGraph\n agentName: string,\n conversationId: string,\n conversationManagerMessage: MJConversationDetailEntity\n ): Promise<void> {\n try {\n // Look up the agent\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n if (!agent) {\n throw new Error(`Agent not found: ${agentName}`);\n }\n\n // Create AI response message for the agent execution\n const agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...';\n agentResponseMessage.ParentID = conversationManagerMessage.ID; // Thread under delegation\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n agentResponseMessage.AgentID = agent.ID;\n\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Add to active tasks\n const newTaskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Starting...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: agentResponseMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Load previous payload if agent has been invoked before\n const { payload: previousPayload, artifactInfo } = await this.loadPreviousPayloadForAgent(agent.ID);\n\n // Merge Sage's task payload with previous agent payload (Sage's takes precedence)\n const mergedPayload = previousPayload\n ? { ...previousPayload, ...task.inputPayload }\n : task.inputPayload;\n\n // Invoke agent with merged payload\n const agentResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n task.description || task.name,\n agentResponseMessage.ID,\n mergedPayload, // Pass merged payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n artifactInfo?.artifactId,\n artifactInfo?.versionId\n );\n\n // Task will be removed automatically in markMessageComplete() when status changes to Complete/Error\n // DO NOT remove here - allows UI to show task during entire execution\n\n if (agentResult && agentResult.success) {\n // Update message with result\n await this.updateConversationDetail(agentResponseMessage, agentResult.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', agentResult);\n\n // Server created artifacts - emit event to trigger UI reload\n if (agentResult.payload && Object.keys(agentResult.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n console.log('🎨 Server created artifact from single task execution');\n this.messageSent.emit(agentResponseMessage);\n }\n } else {\n // Handle failure\n const errorMsg = agentResult?.agentRun?.ErrorMessage || 'Agent execution failed';\n agentResponseMessage.Error = errorMsg;\n await this.updateConversationDetail(agentResponseMessage, `❌ **${agentName}** failed: ${errorMsg}`, 'Error');\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n } catch (error) {\n console.error('❌ Error in single task execution:', error);\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Handle sub-agent invocation based on Sage's payload\n * Reuses the existing conversationManagerMessage to avoid creating multiple records\n */\n private async handleSubAgentInvocation(\n userMessage: MJConversationDetailEntity,\n managerResult: ExecuteAgentResult,\n conversationId: string,\n conversationManagerMessage: MJConversationDetailEntity\n ): Promise<void> {\n const payload = managerResult.payload;\n const agentName = payload.invokeAgent;\n const reasoning = payload.reasoning || 'Delegating to specialist agent';\n\n // Now create a NEW message for the sub-agent execution\n try {\n // Look up the agent to get its ID\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n\n // Create AI response message BEFORE invoking agent (for duration tracking)\n const agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...'; // Initial message\n agentResponseMessage.ParentID = conversationManagerMessage.ID; // Thread under delegation message\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n // Set AgentID immediately for proper attribution\n if (agent?.ID) {\n agentResponseMessage.AgentID = agent.ID;\n }\n\n // Save the record to establish __mj_CreatedAt timestamp\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Add sub-agent to active tasks\n const newTaskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Starting...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: agentResponseMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Load previous payload if agent has been invoked before\n const { payload: previousPayload, artifactInfo } = agent?.ID\n ? await this.loadPreviousPayloadForAgent(agent.ID)\n : { payload: null, artifactInfo: null };\n\n // Find configuration preset from previous @mention in conversation history\n const configurationPresetId = agent?.ID\n ? this.agentService.findConfigurationPresetFromHistory(agent.ID, this.conversationHistory)\n : undefined;\n\n // Invoke the sub-agent with progress callback\n const subResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n reasoning,\n agentResponseMessage.ID,\n previousPayload, // Pass previous payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n artifactInfo?.artifactId,\n artifactInfo?.versionId,\n configurationPresetId // Pass configuration from previous @mention for continuity\n );\n\n // Task will be removed automatically in markMessageComplete() when status changes to Complete/Error\n // DO NOT remove here - allows UI to show task during entire execution\n\n if (subResult && subResult.success) {\n // Update the response message with agent result\n // Store the agent ID for display\n if (subResult.agentRun.AgentID) {\n agentResponseMessage.AgentID = subResult.agentRun.AgentID;\n }\n\n await this.updateConversationDetail(agentResponseMessage, subResult.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', subResult);\n\n // Always emit artifactCreated to trigger UI reload — the server may have created\n // artifacts even when the result payload is empty (e.g., remote stage server).\n // onArtifactCreated will reload from DB and discover any artifacts that exist.\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Sub-agent failed - attempt auto-retry once\n console.log(`⚠️ ${agentName} failed, attempting auto-retry...`);\n\n await this.updateConversationDetail(conversationManagerMessage, `👉 **${agentName}** will handle this request...\\n\\n⚠️ First attempt failed, retrying...`, conversationManagerMessage.Status);\n\n // Update the existing agentResponseMessage to show retry status\n await this.updateConversationDetail(agentResponseMessage, \"Retrying...\", agentResponseMessage.Status);\n\n // Retry the sub-agent (reuse previously loaded payload and config from first attempt)\n const retryResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n reasoning,\n agentResponseMessage.ID,\n previousPayload, // Pass same payload as first attempt\n this.createProgressCallback(agentResponseMessage, `${agentName} (retry)`),\n artifactInfo?.artifactId,\n artifactInfo?.versionId,\n configurationPresetId // Pass same config as first attempt\n );\n\n if (retryResult && retryResult.success) {\n // Retry succeeded - update the same message\n if (retryResult.agentRun.AgentID) {\n agentResponseMessage.AgentID = retryResult.agentRun.AgentID;\n }\n\n await this.updateConversationDetail(agentResponseMessage, retryResult.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', retryResult);\n\n // Always emit artifactCreated to trigger UI reload (same as initial attempt)\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Retry also failed - show error with manual retry option\n conversationManagerMessage.Error = retryResult?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(conversationManagerMessage, `❌ **${agentName}** failed after retry\\n\\n${retryResult?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n } catch (error) {\n console.error(`❌ Error invoking sub-agent ${agentName}:`, error);\n\n conversationManagerMessage.Error = String(error);\n await this.updateConversationDetail(conversationManagerMessage, `❌ **${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Handle silent observation - when Sage stays silent,\n * check if we should continue with the last agent for iterative refinement\n */\n private async handleSilentObservation(\n userMessage: MJConversationDetailEntity,\n conversationId: string\n ): Promise<void> {\n // Find the last AI message (excluding Sage) in the conversation history\n const lastAIMessage = this.conversationHistory\n .slice()\n .reverse()\n .find(msg =>\n msg.Role === 'AI' &&\n msg.AgentID &&\n !UUIDsEqual(msg.AgentID, this.converationManagerAgent?.ID)\n );\n\n if (!lastAIMessage || !lastAIMessage.AgentID) {\n // No previous specialist agent - just mark user message as complete\n console.log('🔇 No previous specialist agent found - marking complete');\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n return;\n }\n\n // Load the agent entity to get its name\n const previousAgent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, lastAIMessage.AgentID));\n if (!previousAgent) {\n console.warn('⚠️ Could not load previous agent - marking complete');\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n return;\n }\n\n const agentName = previousAgent.Name || 'Agent';\n\n let previousPayload: any = null;\n let previousArtifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null = null;\n\n // Use pre-loaded artifact data (no DB queries!)\n // Check both user-visible and system artifacts\n let artifacts = this.artifactsByDetailId?.get(lastAIMessage.ID);\n if (!artifacts || artifacts.length === 0) {\n artifacts = this.systemArtifactsByDetailId?.get(lastAIMessage.ID);\n }\n\n if (artifacts && artifacts.length > 0) {\n try {\n // Use the first artifact (should only be one OUTPUT per message)\n const artifact = artifacts[0];\n const version = await artifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: artifact.artifactId,\n versionId: artifact.artifactVersionId,\n versionNumber: artifact.versionNumber\n };\n console.log('📦 Loaded previous OUTPUT artifact as payload for continuity', previousArtifactInfo);\n }\n } catch (error) {\n console.warn('⚠️ Could not parse previous artifact content:', error);\n }\n }\n\n // Create status message showing agent continuity\n const statusMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n statusMessage.ConversationID = conversationId;\n statusMessage.Role = 'AI';\n statusMessage.Message = `Continuing with **${agentName}** for refinement...`;\n statusMessage.ParentID = userMessage.ID;\n statusMessage.Status = 'Complete';\n statusMessage.HiddenToUser = false;\n statusMessage.AgentID = this.converationManagerAgent?.ID || null;\n\n await statusMessage.Save();\n this.messageSent.emit(statusMessage);\n\n // Add agent to active tasks\n const taskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Processing refinement...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: statusMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n try {\n // Invoke the agent with the previous payload\n const continuityResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n 'Continuing previous work based on user feedback',\n statusMessage.ID,\n previousPayload,\n this.createProgressCallback(statusMessage, agentName),\n previousArtifactInfo?.artifactId,\n previousArtifactInfo?.versionId\n );\n\n // Remove from active tasks\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n if (continuityResult && continuityResult.success) {\n // Create response message\n const agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = continuityResult.agentRun?.Message || `✅ **${agentName}** completed refinement`;\n agentResponseMessage.ParentID = statusMessage.ID;\n agentResponseMessage.Status = 'Complete';\n agentResponseMessage.HiddenToUser = false;\n agentResponseMessage.AgentID = lastAIMessage.AgentID;\n\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Server created artifacts (handles versioning automatically) - emit event to trigger UI reload\n if (continuityResult.payload && Object.keys(continuityResult.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n console.log('🎨 Server created artifact (versioned) from agent continuity');\n this.messageSent.emit(agentResponseMessage);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Agent failed\n statusMessage.Error = continuityResult?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(statusMessage, `❌ **${agentName}** failed during refinement\\n\\n${continuityResult?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } catch (error) {\n console.error(`❌ Error in agent continuity with ${agentName}:`, error);\n\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n statusMessage.Error = String(error);\n await this.updateConversationDetail(statusMessage, `❌ **${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n \n\n /**\n * Invoke an agent directly when mentioned with @ symbol\n * Bypasses Sage completely - no status messages\n */\n private async invokeAgentDirectly(\n userMessage: MJConversationDetailEntity,\n agentMention: Mention,\n conversationId: string\n ): Promise<void> {\n const agentName = agentMention.name;\n\n // Add agent to active tasks\n const taskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Processing...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: userMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Declare agentResponseMessage outside try block so it's accessible in catch\n let agentResponseMessage: MJConversationDetailEntity | undefined = undefined;\n\n try {\n // User message is sent successfully - mark complete immediately\n // (No UI uses User message 'In-Progress' - only AI messages need that status)\n userMessage.Status = 'Complete';\n await userMessage.Save();\n this.messageSent.emit(userMessage);\n\n // Look up the agent to get its ID\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n\n // Create AI response message BEFORE invoking agent (for duration tracking)\n agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...'; // Initial message\n agentResponseMessage.ParentID = userMessage.ID;\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n // Set AgentID immediately for proper attribution\n if (agent?.ID) {\n agentResponseMessage.AgentID = agent.ID;\n }\n\n // Save the record to establish __mj_CreatedAt timestamp\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Load previous payload if agent has been invoked before\n const { payload: previousPayload, artifactInfo } = agent?.ID\n ? await this.loadPreviousPayloadForAgent(agent.ID)\n : { payload: null, artifactInfo: null };\n\n // Invoke the agent directly\n const result = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n `User mentioned agent directly with @${agentName}`,\n agentResponseMessage.ID,\n previousPayload, // Pass previous payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n artifactInfo?.artifactId,\n artifactInfo?.versionId,\n agentMention.configurationId // Pass configuration preset ID\n );\n\n // Remove from active tasks\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n if (result && result.success) {\n if (result.agentRun.AgentID) {\n agentResponseMessage.AgentID = result.agentRun.AgentID;\n }\n\n // Multi-stage response handling (same logic as ambient Sage)\n // Stage 1: Check for task graph (multi-step orchestration)\n if (result.payload?.taskGraph) {\n console.log('📋 Task graph detected from @mention, starting task orchestration');\n await this.handleTaskGraphExecution(userMessage, result, conversationId, agentResponseMessage);\n }\n // Stage 2: Check for sub-agent invocation (single-step delegation)\n else if (result.agentRun.FinalStep === 'Success' && result.payload?.invokeAgent) {\n console.log('🎯 Sub-agent invocation detected from @mention');\n await this.handleSubAgentInvocation(userMessage, result, conversationId, agentResponseMessage);\n }\n // Stage 3: Normal chat response\n else {\n await this.updateConversationDetail(agentResponseMessage, result.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', result)\n\n // Server created artifacts - emit event to trigger UI reload\n if (result.payload && Object.keys(result.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } else {\n // Agent failed - update the existing message instead of creating a new one\n agentResponseMessage.Error = result?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(agentResponseMessage, `❌ **@${agentName}** failed\\n\\n${result?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } catch (error) {\n console.error(`❌ Error invoking mentioned agent ${agentName}:`, error);\n\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n // Update the existing agent response message if it was created\n if (agentResponseMessage) {\n agentResponseMessage.Error = String(error);\n await this.updateConversationDetail(agentResponseMessage, `❌ **@${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n }\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Continue with the same agent from previous message (implicit continuation)\n * Bypasses Sage - no status messages\n *\n * @param targetArtifactVersionId Optional specific artifact version to use as payload (from intent check)\n */\n private async continueWithAgent(\n userMessage: MJConversationDetailEntity,\n agentId: string,\n conversationId: string,\n targetArtifactVersionId?: string\n ): Promise<void> {\n // Load the agent entity to get its name\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, agentId));\n if (!agent) {\n console.warn('⚠️ Could not load agent for continuation - falling back to Sage');\n await this.processMessageThroughAgent(userMessage, { mentions: [], agentMention: null, userMentions: [] });\n return;\n }\n\n const agentName = agent.Name || 'Agent';\n\n let previousPayload: any = null;\n let previousArtifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null = null;\n let previousConfigurationId: string | undefined = undefined;\n\n // Use targetArtifactVersionId if specified (from intent check)\n if (targetArtifactVersionId) {\n // Find the artifact in pre-loaded data (check both user-visible and system artifacts)\n for (const [detailId, artifacts] of (this.artifactsByDetailId?.entries() || [])) {\n const targetArtifact = artifacts.find(a => a.artifactVersionId === targetArtifactVersionId);\n if (targetArtifact) {\n try {\n // Lazy load the full version entity to get Content\n const version = await targetArtifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: targetArtifact.artifactId,\n versionId: targetArtifact.artifactVersionId,\n versionNumber: targetArtifact.versionNumber\n };\n console.log('📦 Loaded target artifact version as payload', previousArtifactInfo);\n }\n } catch (error) {\n console.warn('⚠️ Could not load target artifact version:', error);\n }\n break;\n }\n }\n\n // If not found in user-visible artifacts, check system artifacts\n if (!previousPayload && this.systemArtifactsByDetailId) {\n for (const [detailId, artifacts] of this.systemArtifactsByDetailId.entries()) {\n const targetArtifact = artifacts.find(a => a.artifactVersionId === targetArtifactVersionId);\n if (targetArtifact) {\n try {\n const version = await targetArtifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: targetArtifact.artifactId,\n versionId: targetArtifact.artifactVersionId,\n versionNumber: targetArtifact.versionNumber\n };\n console.log('📦 Loaded target artifact version as payload (from system artifacts)', previousArtifactInfo);\n }\n } catch (error) {\n console.warn('⚠️ Could not load target artifact version:', error);\n }\n break;\n }\n }\n }\n }\n\n // Get all messages from this agent in reverse order (most recent first)\n const agentMessages = this.conversationHistory\n .slice()\n .reverse()\n .filter(msg => msg.Role === 'AI' && UUIDsEqual(msg.AgentID, agentId));\n\n // Extract configuration preset from the User message that @mentioned this agent\n // Uses the shared helper method in the agent service\n previousConfigurationId = this.agentService.findConfigurationPresetFromHistory(agentId, this.conversationHistory);\n\n // Fall back to searching through all agent messages for an artifact\n // This ensures payload continuity even after clarifying exchanges without artifacts\n if (!previousPayload && agentMessages.length > 0) {\n console.log('📦 Searching through agent messages for most recent artifact...');\n\n for (const message of agentMessages) {\n // Get artifacts from pre-loaded data (check both user-visible and system artifacts)\n let artifacts = this.artifactsByDetailId?.get(message.ID);\n if (!artifacts || artifacts.length === 0) {\n artifacts = this.systemArtifactsByDetailId?.get(message.ID);\n }\n\n if (artifacts && artifacts.length > 0) {\n try {\n // Use the first artifact (should only be one OUTPUT per message)\n const artifact = artifacts[0];\n const version = await artifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: artifact.artifactId,\n versionId: artifact.artifactVersionId,\n versionNumber: artifact.versionNumber\n };\n console.log(`📦 Loaded artifact as payload from message ${message.ID}`, previousArtifactInfo);\n break; // Found an artifact, stop searching\n }\n } catch (error) {\n console.warn('⚠️ Could not parse artifact content:', error);\n // Continue to next message\n }\n }\n }\n\n if (!previousPayload) {\n console.log(`📦 No artifact found after searching ${agentMessages.length} messages from agent`);\n }\n }\n\n // Execute the agent with the gathered context\n await this.executeAgentContinuation(\n userMessage,\n agentId,\n agentName,\n conversationId,\n previousPayload,\n previousArtifactInfo,\n previousConfigurationId\n );\n }\n\n /**\n * Executes agent continuation with all context already gathered.\n * This is the shared execution logic used by both continueWithAgent and direct Sage config path.\n *\n * @param userMessage The user's message entity\n * @param agentId The agent ID to invoke\n * @param agentName The agent's display name\n * @param conversationId The conversation ID\n * @param previousPayload Optional payload from previous artifact\n * @param previousArtifactInfo Optional artifact info (id, versionId, versionNumber)\n * @param configurationId Optional configuration preset ID to use\n */\n private async executeAgentContinuation(\n userMessage: MJConversationDetailEntity,\n agentId: string,\n agentName: string,\n conversationId: string,\n previousPayload: Record<string, unknown> | null,\n previousArtifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null,\n configurationId?: string\n ): Promise<void> {\n // Add agent to active tasks\n const taskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Processing...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: userMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Declare agentResponseMessage outside try block so it's accessible in catch\n let agentResponseMessage: MJConversationDetailEntity | undefined = undefined;\n\n try {\n // User message is sent successfully - mark complete immediately\n // (No UI uses User message 'In-Progress' - only AI messages need that status)\n userMessage.Status = 'Complete';\n await userMessage.Save();\n this.messageSent.emit(userMessage);\n\n // Create AI response message BEFORE invoking agent (for duration tracking)\n agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...'; // Initial message\n agentResponseMessage.ParentID = userMessage.ID;\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n agentResponseMessage.AgentID = agentId;\n\n // Save the record to establish __mj_CreatedAt timestamp\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Invoke the agent directly (continuation) with previous payload if available\n const result = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n 'Continuing previous conversation with user',\n agentResponseMessage.ID,\n previousPayload, // Pass previous OUTPUT artifact payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n previousArtifactInfo?.artifactId,\n previousArtifactInfo?.versionId,\n configurationId // Pass configuration for continuity\n );\n\n // Remove from active tasks\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n if (result && result.success) {\n // Update the response message with agent result\n await this.updateConversationDetail(agentResponseMessage,result.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', result);\n\n // Server created artifacts (handles versioning) - emit event to trigger UI reload\n if (result.payload && Object.keys(result.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Agent failed - update the existing message instead of creating a new one\n agentResponseMessage.Error = result?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(agentResponseMessage, `❌ **${agentName}** failed\\n\\n${result?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } catch (error) {\n console.error(`❌ Error continuing with agent ${agentName}:`, error);\n\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n // Update the existing agent response message if it was created\n if (agentResponseMessage) {\n agentResponseMessage.Error = String(error);\n await this.updateConversationDetail(agentResponseMessage, `❌ **${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n }\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Name the conversation based on the first message using GraphQL AI client\n *\n * IMPORTANT: This runs asynchronously in the background and has a 30-second timeout\n * to prevent long delays. Failures are logged but don't affect the user experience.\n */\n private async nameConversation(message: string): Promise<void> {\n try {\n // Load the Name Conversation prompt to get its ID\n await AIEngineBase.Instance.Config(false);\n const p = AIEngineBase.Instance.Prompts.find(pr => pr.Name === 'Name Conversation');\n if (!p) {\n console.warn('⚠️ Name Conversation prompt not found');\n return;\n }\n\n const promptId = p.ID;\n\n // Use GraphQL AI client to run the prompt (same client as agent)\n const provider = Metadata.Provider as GraphQLDataProvider;\n if (!provider) {\n console.warn('⚠️ GraphQLDataProvider not available');\n return;\n }\n\n // Convert message to plain text (strips JSON-encoded mentions like @{\"id\":\"...\",\"name\":\"Sage\"} to @Sage)\n const plainTextMessage = this.mentionParser.toPlainText(\n message,\n this.mentionAutocomplete.getAvailableAgents(),\n this.mentionAutocomplete.getAvailableUsers()\n );\n\n const aiClient = new GraphQLAIClient(provider);\n\n // Add 30-second timeout to prevent long delays\n // If this times out, the conversation will keep its default name\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Conversation naming timed out after 30 seconds')), 30000);\n });\n\n const result = await Promise.race([\n aiClient.RunAIPrompt({\n promptId: promptId,\n messages: [{ role: 'user', content: plainTextMessage }],\n }),\n timeoutPromise\n ]);\n\n if (result && result.success && (result.parsedResult || result.output)) {\n // Use parsedResult if available, otherwise clean and parse output\n // (CleanAndParseJSON handles markdown code blocks like ```json ... ```)\n const parsed = result.parsedResult ||\n (result.output ? CleanAndParseJSON(result.output) : null);\n\n if (parsed) {\n const { name, description } = parsed;\n\n if (name) {\n // Update the conversation name and description in database AND state immediately\n await this.engine.SaveConversation(\n this.conversationId,\n { Name: name, Description: description || '' },\n this.currentUser\n );\n\n // Emit event for animation in conversation list\n this.conversationRenamed.emit({\n conversationId: this.conversationId,\n name: name,\n description: description || ''\n });\n\n console.log(`✅ Conversation renamed to: \"${name}\"`);\n }\n }\n } else {\n console.warn('⚠️ Failed to generate conversation name - using default');\n }\n } catch (error) {\n // Log timeout or other errors but don't disrupt user experience\n if (error instanceof Error && error.message.includes('timed out')) {\n console.warn('⏱️ Conversation naming timed out - conversation will keep default name');\n } else {\n console.error('❌ Error naming conversation:', error);\n }\n // Don't show error to user - naming failures should be silent\n }\n }\n\n /**\n * Marks a conversation detail as complete and records timestamp to prevent race conditions\n * Emits event to parent to refresh agent run data from database\n */\n private markMessageComplete(conversationDetail: MJConversationDetailEntity): void {\n const now = Date.now();\n this.completionTimestamps.set(conversationDetail.ID, now);\n\n // Unregister streaming callback for this message (no more updates needed)\n const callback = this.registeredCallbacks.get(conversationDetail.ID);\n if (callback) {\n this.streamingService.unregisterMessageCallback(conversationDetail.ID, callback);\n this.registeredCallbacks.delete(conversationDetail.ID);\n console.log(`[MarkComplete] Unregistered streaming callback for completed message ${conversationDetail.ID}`);\n }\n\n // Remove task from active tasks if it exists\n const task = this.activeTasks.getByConversationDetailId(conversationDetail.ID);\n if (task) {\n console.log(`✅ Task found for message ${conversationDetail.ID} - removing from active tasks:`, {\n taskId: task.id,\n agentName: task.agentName,\n conversationId: task.conversationId,\n conversationName: task.conversationName\n });\n\n this.activeTasks.remove(task.id);\n\n // Show toast only if the user isn't currently viewing this conversation.\n // If they're watching, the inline completion is sufficient.\n const isConvoVisible = UUIDsEqual(this.bridge.ActiveConversationID$.value, task.conversationId)\n && (this.bridge.OverlayActive$.value || this.bridge.WorkspaceActive$.value);\n if (!isConvoVisible) {\n MJNotificationService.Instance?.CreateSimpleNotification(\n `${task.agentName} completed in ${task.conversationName || 'conversation'}`,\n 'success',\n 3000\n );\n }\n } else {\n console.warn(`⚠️ No task found for completed message ${conversationDetail.ID} - task may have been removed prematurely or not added`);\n }\n\n // Emit completion event to parent so it can refresh agent run data\n this.messageComplete.emit({\n conversationDetailId: conversationDetail.ID,\n agentId: conversationDetail.AgentID || undefined\n });\n }\n\n /**\n * Cleans up completion timestamps for completed messages (prevents memory leak)\n */\n private cleanupCompletionTimestamp(conversationDetailId: string): void {\n // Keep timestamp for a short period to catch any late progress updates\n setTimeout(() => {\n this.completionTimestamps.delete(conversationDetailId);\n }, 5000); // 5 seconds should be more than enough\n }\n}\n","<div class=\"message-input-wrapper\">\n <!-- Processing Indicator Overlay -->\n @if (isProcessing) {\n <div class=\"processing-indicator\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n <span>{{ processingMessage }}</span>\n </div>\n }\n\n <!-- Message Input Box -->\n <mj-message-input-box\n #inputBox\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled || isProcessing\"\n [showCharacterCount]=\"false\"\n [enableMentions]=\"true\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n [currentUser]=\"currentUser\"\n [rows]=\"3\"\n [(value)]=\"messageText\"\n (textSubmitted)=\"onTextSubmitted($event)\"\n (attachmentsChanged)=\"onAttachmentsChanged($event)\"\n (attachmentError)=\"onAttachmentError($event)\">\n </mj-message-input-box>\n</div>"]}
1
+ {"version":3,"file":"message-input.component.js","sourceRoot":"","sources":["../../../../src/lib/components/message/message-input.component.ts","../../../../src/lib/components/message/message-input.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, ViewChild, OnInit, OnDestroy, OnChanges, SimpleChanges, AfterViewInit } from '@angular/core';\nimport { UserInfo, Metadata } from '@memberjunction/core';\nimport { MJConversationDetailEntity, MJEnvironmentEntityExtended, ConversationEngine } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { DialogService } from '../../services/dialog.service';\nimport { ToastService } from '../../services/toast.service';\nimport { ConversationAgentService } from '../../services/conversation-agent.service';\nimport { DataCacheService } from '../../services/data-cache.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { ConversationStreamingService, MessageProgressUpdate, MessageProgressMetadata } from '../../services/conversation-streaming.service';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ExecuteAgentResult, AgentExecutionProgressCallback, AgentResponseForm, ActionableCommand, AutomaticCommand, ConversationUtility } from '@memberjunction/ai-core-plus';\nimport { MentionAutocompleteService, MentionSuggestion } from '../../services/mention-autocomplete.service';\nimport { MentionParserService } from '../../services/mention-parser.service';\nimport { ConversationAttachmentService } from '../../services/conversation-attachment.service';\nimport { Mention, MentionParseResult } from '../../models/conversation-state.model';\nimport { PendingAttachment } from '../mention/mention-editor.component';\nimport { LazyArtifactInfo } from '../../models/lazy-artifact-info';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { ConversationBridgeService } from '../../services/conversation-bridge.service';\nimport { Subscription } from 'rxjs';\nimport { MessageInputBoxComponent } from './message-input-box.component';\nimport { UUIDsEqual, CleanAndParseJSON } from '@memberjunction/global';\n\n@Component({\n standalone: false,\n selector: 'mj-message-input',\n templateUrl: './message-input.component.html',\n styleUrl: './message-input.component.scss'\n})\nexport class MessageInputComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\n // Default artifact type ID for JSON (when agent doesn't specify DefaultArtifactTypeID)\n private readonly JSON_ARTIFACT_TYPE_ID = 'ae674c7e-ea0d-49ea-89e4-0649f5eb20d4';\n\n @Input() conversationId!: string;\n @Input() conversationName?: string | null; // For task tracking display\n @Input() currentUser!: UserInfo;\n @Input() disabled: boolean = false;\n @Input() placeholder: string = 'Type a message... (Ctrl+Enter to send)';\n @Input() parentMessageId?: string; // Optional: for replying in threads\n @Input() enableAttachments: boolean = true; // Whether to show attachment button (based on agent modality support)\n @Input() maxAttachments: number = 10; // Maximum number of attachments per message\n @Input() maxAttachmentSizeBytes: number = 20 * 1024 * 1024; // Maximum size per attachment (20MB default)\n @Input() acceptedFileTypes: string = 'image/*'; // Accepted MIME types pattern\n @Input() artifactsByDetailId?: Map<string, LazyArtifactInfo[]>; // Pre-loaded artifact data for performance\n @Input() systemArtifactsByDetailId?: Map<string, LazyArtifactInfo[]>; // Pre-loaded system artifact data (Visibility='System Only')\n @Input() agentRunsByDetailId?: Map<string, MJAIAgentRunEntityExtended>; // Pre-loaded agent run data for performance\n @Input() emptyStateMode: boolean = false; // When true, emits emptyStateSubmit instead of creating messages directly\n @Input() appContext: Record<string, unknown> | null = null; // Application context for AI agent awareness\n\n // Initial message to send automatically - using getter/setter for precise control\n private _initialMessage: string | null = null;\n private _initialAttachments: PendingAttachment[] | null = null;\n private _isComponentReady = false; // Track if component is ready to send\n\n @Input()\n set initialMessage(value: string | null) {\n // Handle case where an object with {text, attachments} is passed instead of just a string\n // This can happen if there's a type mismatch in the binding chain\n let actualValue = value;\n if (value && typeof value === 'object' && 'text' in value) {\n actualValue = (value as { text: string }).text;\n }\n\n const previousValue = this._initialMessage;\n this._initialMessage = actualValue;\n\n // If component is ready and we have a new non-null message, trigger send\n if (this._isComponentReady && actualValue && actualValue !== previousValue) {\n this.triggerInitialSend();\n }\n }\n get initialMessage(): string | null {\n return this._initialMessage;\n }\n\n @Input()\n set initialAttachments(value: PendingAttachment[] | null) {\n this._initialAttachments = value;\n }\n get initialAttachments(): PendingAttachment[] | null {\n return this._initialAttachments;\n }\n\n private _conversationHistory: MJConversationDetailEntity[] = [];\n @Input()\n public get conversationHistory(): MJConversationDetailEntity[] {\n return this._conversationHistory;\n }\n public set conversationHistory(value: MJConversationDetailEntity[]) {\n this._conversationHistory = value;\n }\n\n // Message IDs that are in-progress and need streaming reconnection\n // Using getter/setter to react immediately when value changes (avoids timing issues with ngOnChanges)\n private _inProgressMessageIds?: string[];\n @Input()\n set inProgressMessageIds(value: string[] | undefined) {\n this._inProgressMessageIds = value;\n // React immediately when input changes (after component initialized)\n // This ensures callbacks are registered without relying on ngOnChanges timing\n if (this.streamingService && value && value.length > 0) {\n this.reconnectInProgressMessages();\n }\n }\n get inProgressMessageIds(): string[] | undefined {\n return this._inProgressMessageIds;\n }\n\n @Output() messageSent = new EventEmitter<MJConversationDetailEntity>();\n @Output() agentResponse = new EventEmitter<{message: MJConversationDetailEntity, agentResult: any}>();\n @Output() agentRunDetected = new EventEmitter<{conversationDetailId: string; agentRunId: string}>();\n @Output() agentRunUpdate = new EventEmitter<{conversationDetailId: string; agentRun?: any, agentRunId?: string}>(); // Emits when agent run data updates during progress\n @Output() messageComplete = new EventEmitter<{conversationDetailId: string; agentId?: string}>(); // Emits when message completes (success or error)\n @Output() artifactCreated = new EventEmitter<{artifactId: string; versionId: string; versionNumber: number; conversationDetailId: string; name: string}>();\n @Output() conversationRenamed = new EventEmitter<{conversationId: string; name: string; description: string}>();\n @Output() intentCheckStarted = new EventEmitter<void>(); // Emits when intent checking starts\n @Output() intentCheckCompleted = new EventEmitter<void>(); // Emits when intent checking completes\n @Output() emptyStateSubmit = new EventEmitter<{text: string; attachments: PendingAttachment[]}>(); // Emitted when in emptyStateMode\n @Output() uploadStateChanged = new EventEmitter<{isUploading: boolean; message: string}>(); // Emits when attachment upload state changes\n\n @ViewChild('inputBox') inputBox!: MessageInputBoxComponent;\n\n public messageText: string = '';\n public isSending: boolean = false;\n public isProcessing: boolean = false; // True when waiting for agent/naming response\n public processingMessage: string = 'AI is responding...'; // Message shown during processing\n public isUploadingAttachments: boolean = false; // True when uploading attachments to server\n public uploadingMessage: string = 'Uploading attachments...'; // Message shown during upload\n public converationManagerAgent: MJAIAgentEntityExtended | null = null;\n\n // Track completion timestamps to prevent race conditions with late progress updates\n private completionTimestamps = new Map<string, number>();\n // Track registered streaming callbacks for cleanup\n private registeredCallbacks = new Map<string, (progress: MessageProgressUpdate) => Promise<void>>();\n\n // Track pending attachments from the input box\n private pendingAttachments: PendingAttachment[] = [];\n\n private engine = ConversationEngine.Instance;\n\n constructor(\n private dialogService: DialogService,\n private toastService: ToastService,\n private agentService: ConversationAgentService,\n private dataCache: DataCacheService,\n private activeTasks: ActiveTasksService,\n private streamingService: ConversationStreamingService,\n private mentionParser: MentionParserService,\n private mentionAutocomplete: MentionAutocompleteService,\n private attachmentService: ConversationAttachmentService,\n private bridge: ConversationBridgeService\n ) {}\n\n async ngOnInit() {\n this.converationManagerAgent = await this.agentService.getConversationManagerAgent();\n\n // Initialize mention autocomplete (needed for parsing mentions in messages)\n await this.mentionAutocomplete.initialize(this.currentUser);\n\n // Reconnect to any in-progress messages for streaming updates (via global streaming service)\n this.reconnectInProgressMessages();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // When conversation changes, focus the input\n if (changes['conversationId'] && !changes['conversationId'].firstChange) {\n this.focusInput();\n }\n // Note: initialMessage/initialAttachments handled by setters, inProgressMessageIds handled by setter\n }\n\n ngAfterViewInit() {\n // Focus input on initial load\n this.focusInput();\n\n // Mark component as ready\n this._isComponentReady = true;\n\n // If there's an initial message to send (from empty state), send it automatically\n if (this._initialMessage || (this._initialAttachments && this._initialAttachments.length > 0)) {\n this.triggerInitialSend();\n }\n }\n\n /**\n * Triggers sending of initial message and attachments.\n * Called from setter or ngAfterViewInit when conditions are met.\n */\n private triggerInitialSend(): void {\n const message = this._initialMessage;\n const attachments = this._initialAttachments;\n\n // Set pending attachments before sending\n if (attachments && attachments.length > 0) {\n this.pendingAttachments = [...attachments];\n }\n\n // Use setTimeout to ensure we're outside of change detection cycle\n setTimeout(() => {\n this.sendMessageWithText(message || '');\n }, 100);\n }\n\n ngOnDestroy() {\n // Unregister all streaming callbacks\n this.unregisterAllCallbacks();\n }\n\n /**\n * Focus the message input textarea\n */\n private focusInput(): void {\n // Use setTimeout to ensure DOM is ready\n setTimeout(() => {\n if (this.inputBox) {\n this.inputBox.focus();\n }\n }, 100);\n }\n\n /**\n * Reconnect to in-progress messages for streaming updates via global streaming service.\n * This is called when:\n * 1. Component initializes (ngOnInit)\n * 2. Conversation changes (ngOnChanges)\n * 3. User returns to a conversation with in-progress messages\n * 4. Parent component explicitly triggers reconnection\n */\n public reconnectInProgressMessages(): void {\n if (!this.inProgressMessageIds || this.inProgressMessageIds.length === 0) {\n return;\n }\n\n // Unregister any previously registered callbacks for this component\n this.unregisterAllCallbacks();\n\n // Register new callbacks for each in-progress message\n for (const messageId of this.inProgressMessageIds) {\n // Create callback bound to this message ID\n const callback = this.createMessageProgressCallback(messageId);\n\n // Store reference for cleanup\n this.registeredCallbacks.set(messageId, callback);\n\n // Register with streaming service\n this.streamingService.registerMessageCallback(messageId, callback);\n }\n }\n\n /**\n * Create a progress callback for a specific message ID.\n * This callback will be invoked by the streaming service when progress updates arrive.\n */\n private createMessageProgressCallback(messageId: string): (progress: MessageProgressUpdate) => Promise<void> {\n return async (progress: MessageProgressUpdate) => {\n try {\n // Get message from cache (single source of truth)\n const message = await this.dataCache.getConversationDetail(messageId, this.currentUser);\n\n if (!message) {\n console.warn(`[StreamingCallback] Message ${messageId} not found in cache`);\n return;\n }\n\n // Skip if already complete or errored\n if (message.Status === 'Complete' || message.Status === 'Error') {\n console.log(`[StreamingCallback] Message ${messageId} is ${message.Status}, ignoring progress update`);\n return;\n }\n\n // Check if message was marked as completed (prevents race condition)\n const completionTime = this.completionTimestamps.get(messageId);\n if (completionTime) {\n console.log(`[StreamingCallback] Message ${messageId} marked complete at ${new Date(completionTime).toISOString()}, ignoring late progress update`);\n return;\n }\n\n // Default: plain message (used by RunAIAgentResolver and TaskOrchestrator without step info)\n message.Message = progress.message;\n\n // TaskOrchestrator with step info: add formatted header\n // Prefer hierarchical step (e.g., \"2.1.3\") over flat stepCount\n if (progress.resolver === 'TaskOrchestrator') {\n const stepDisplay = progress.metadata?.progress?.hierarchicalStep || progress.stepCount;\n if (stepDisplay != null) {\n message.Message = `**Step ${stepDisplay}**\\n\\n${progress.message}`;\n }\n }\n\n // Server now saves progress - client only updates in-memory and emits for UI\n // (Prevents race condition where client's late save overwrites server's final Status)\n\n // CRITICAL: Emit update to trigger UI refresh\n this.messageSent.emit(message);\n\n // CRITICAL: Update ActiveTasksService to keep the tasks dropdown in sync\n this.activeTasks.updateStatusByConversationDetailId(message.ID, progress.message);\n\n console.log(`[StreamingCallback] Updated message ${messageId}: ${progress.taskName || 'Agent'}`);\n } catch (error) {\n console.error(`[StreamingCallback] Error updating message ${messageId}:`, error);\n }\n };\n }\n\n /**\n * Unregister all callbacks registered by this component.\n * Called during cleanup and when switching conversations.\n */\n private unregisterAllCallbacks(): void {\n if (this.registeredCallbacks.size === 0) {\n return;\n }\n\n console.log(`🧹 Unregistering ${this.registeredCallbacks.size} message callbacks`);\n\n for (const [messageId, callback] of this.registeredCallbacks) {\n this.streamingService.unregisterMessageCallback(messageId, callback);\n }\n\n this.registeredCallbacks.clear();\n }\n\n get canSend(): boolean {\n return !this.disabled && !this.isSending && this.messageText.trim().length > 0;\n }\n\n /**\n * Handle attachments changed from the input box\n */\n onAttachmentsChanged(attachments: PendingAttachment[]): void {\n this.pendingAttachments = attachments;\n }\n\n /**\n * Handle attachment errors from the input box\n */\n onAttachmentError(error: string): void {\n this.toastService.error(error);\n }\n\n /**\n * Handle text submitted from the input box\n */\n async onTextSubmitted(text: string): Promise<void> {\n // Check if we have either text or attachments\n const hasText = text && text.trim().length > 0;\n const hasAttachments = this.pendingAttachments.length > 0;\n\n if (!hasText && !hasAttachments) {\n return;\n }\n\n // In empty state mode, just emit the data and let parent handle conversation creation\n if (this.emptyStateMode) {\n const attachmentsToEmit = [...this.pendingAttachments];\n this.pendingAttachments = [];\n this.messageText = '';\n this.emptyStateSubmit.emit({ text: text?.trim() || '', attachments: attachmentsToEmit });\n return;\n }\n\n this.isSending = true;\n\n // Store attachments locally since we'll clear them after send\n const attachmentsToSave = [...this.pendingAttachments];\n\n try {\n const messageDetail = await this.createMessageDetailFromText(text?.trim() || '');\n\n const saved = await messageDetail.Save();\n\n if (saved) {\n // Save attachments if any were pending\n // Attachments are stored in ConversationDetailAttachment table and loaded\n // separately when building AI messages - no need to add tokens to Message field\n if (attachmentsToSave.length > 0) {\n // Show upload indicator for attachments\n this.isUploadingAttachments = true;\n this.uploadingMessage = `Uploading ${attachmentsToSave.length} attachment${attachmentsToSave.length > 1 ? 's' : ''}...`;\n this.uploadStateChanged.emit({ isUploading: true, message: this.uploadingMessage });\n\n try {\n await this.attachmentService.saveAttachments(\n messageDetail.ID,\n attachmentsToSave,\n this.currentUser\n );\n } catch (attachmentError) {\n console.error('Failed to save attachments:', attachmentError);\n this.toastService.error('Some attachments could not be saved');\n } finally {\n this.isUploadingAttachments = false;\n this.uploadStateChanged.emit({ isUploading: false, message: '' });\n }\n }\n\n // Clear pending attachments after successful send\n this.pendingAttachments = [];\n\n await this.handleSuccessfulSend(messageDetail);\n } else {\n this.handleSendFailure(messageDetail);\n }\n } catch (error) {\n this.handleSendError(error);\n } finally {\n this.isSending = false;\n }\n }\n\n async onSend(): Promise<void> {\n if (!this.canSend) return;\n\n this.isSending = true;\n try {\n const messageDetail = await this.createMessageDetail();\n const saved = await messageDetail.Save();\n\n if (saved) {\n await this.handleSuccessfulSend(messageDetail);\n } else {\n this.handleSendFailure(messageDetail);\n }\n } catch (error) {\n this.handleSendError(error);\n } finally {\n this.isSending = false;\n }\n }\n\n /**\n * Send a message with custom text WITHOUT modifying the visible messageText input\n * Used for suggested responses and initial messages from empty state.\n * Also saves any pending attachments.\n */\n public async sendMessageWithText(text: string): Promise<void> {\n const hasText = text && text.trim().length > 0;\n const hasAttachments = this.pendingAttachments.length > 0;\n\n if (!hasText && !hasAttachments) {\n return;\n }\n\n if (this.isSending) {\n return;\n }\n\n this.isSending = true;\n const attachmentsToSave = [...this.pendingAttachments];\n\n try {\n const detail = await this.dataCache.createConversationDetail(this.currentUser);\n detail.ConversationID = this.conversationId;\n detail.Message = text?.trim() || '';\n detail.Role = 'User';\n detail.UserID = this.currentUser.ID; // Set the user who sent the message\n\n if (this.parentMessageId) {\n detail.ParentID = this.parentMessageId;\n }\n\n const saved = await detail.Save();\n\n if (saved) {\n // Save attachments if any were pending\n if (attachmentsToSave.length > 0) {\n // Show upload indicator for attachments\n this.isUploadingAttachments = true;\n this.uploadingMessage = `Uploading ${attachmentsToSave.length} attachment${attachmentsToSave.length > 1 ? 's' : ''}...`;\n this.uploadStateChanged.emit({ isUploading: true, message: this.uploadingMessage });\n\n try {\n await this.attachmentService.saveAttachments(\n detail.ID,\n attachmentsToSave,\n this.currentUser\n );\n } catch (attachmentError) {\n console.error('Failed to save attachments:', attachmentError);\n this.toastService.error('Some attachments could not be saved');\n } finally {\n this.isUploadingAttachments = false;\n this.uploadStateChanged.emit({ isUploading: false, message: '' });\n }\n }\n\n // Clear pending attachments after successful send\n this.pendingAttachments = [];\n\n this.messageSent.emit(detail);\n\n const mentionResult = this.parseMentionsFromMessage(detail.Message);\n const isFirstMessage = this.conversationHistory.length === 0;\n await this.routeMessage(detail, mentionResult, isFirstMessage);\n } else {\n this.handleSendFailure(detail);\n }\n } catch (error) {\n this.handleSendError(error);\n } finally {\n this.isSending = false;\n }\n }\n\n /**\n * Creates and configures a new conversation detail message\n */\n private async createMessageDetail(): Promise<MJConversationDetailEntity> {\n const detail = await this.dataCache.createConversationDetail(this.currentUser);\n\n detail.ConversationID = this.conversationId;\n detail.Message = this.messageText.trim();\n detail.Role = 'User';\n detail.UserID = this.currentUser.ID; // Set the user who sent the message\n\n if (this.parentMessageId) {\n detail.ParentID = this.parentMessageId;\n }\n\n return detail;\n }\n\n /**\n * Creates and configures a new conversation detail message from provided text\n */\n private async createMessageDetailFromText(text: string): Promise<MJConversationDetailEntity> {\n const detail = await this.dataCache.createConversationDetail(this.currentUser);\n\n detail.ConversationID = this.conversationId;\n detail.Message = text;\n detail.Role = 'User';\n detail.UserID = this.currentUser.ID; // Set the user who sent the message\n\n if (this.parentMessageId) {\n detail.ParentID = this.parentMessageId;\n }\n\n return detail;\n }\n\n /**\n * Handles successful message send - routes to appropriate agent\n */\n private async handleSuccessfulSend(messageDetail: MJConversationDetailEntity): Promise<void> {\n this.messageSent.emit(messageDetail);\n this.messageText = '';\n\n const mentionResult = this.parseMentionsFromMessage(messageDetail.Message);\n const isFirstMessage = this.conversationHistory.length === 0;\n\n await this.routeMessage(messageDetail, mentionResult, isFirstMessage);\n this.refocusTextarea();\n }\n\n /**\n * Parses mentions from the message for routing decisions\n */\n private parseMentionsFromMessage(message: string): MentionParseResult {\n const mentionResult = this.mentionParser.parseMentions(\n message,\n this.mentionAutocomplete.getAvailableAgents(),\n this.mentionAutocomplete.getAvailableUsers()\n );\n\n return mentionResult;\n }\n\n /**\n * Routes the message to the appropriate agent or Sage based on context\n * Priority: @mention > intent check > Sage\n */\n private async routeMessage(\n messageDetail: MJConversationDetailEntity,\n mentionResult: MentionParseResult,\n isFirstMessage: boolean\n ): Promise<void> {\n // Priority 1: Direct @mention\n if (mentionResult.agentMention) {\n await this.handleDirectMention(messageDetail, mentionResult.agentMention, isFirstMessage);\n return;\n }\n\n // Priority 2: Check for previous agent with intent check\n const lastAgentId = this.findLastNonSageAgentId();\n if (lastAgentId) {\n await this.handleAgentContinuity(messageDetail, lastAgentId, mentionResult, isFirstMessage);\n return;\n }\n\n // Priority 3: Check if Sage was explicitly @mentioned with a config preset\n // If so, treat it like agent continuity so the config preset is preserved\n if (this.converationManagerAgent?.ID) {\n const sageConfigPreset = this.agentService.findConfigurationPresetFromHistory(\n this.converationManagerAgent.ID,\n this.conversationHistory\n );\n if (sageConfigPreset) {\n // User explicitly @mentioned Sage with a config - use the shared execution helper directly\n // Pass the already-found config preset to avoid redundant history search\n await this.executeRouteWithNaming(\n () => this.executeAgentContinuation(\n messageDetail,\n this.converationManagerAgent!.ID,\n this.converationManagerAgent!.Name || 'Sage',\n this.conversationId,\n null, // Sage doesn't use payload continuity\n null, // Sage doesn't use artifact info\n sageConfigPreset // Pass the already-found config preset\n ),\n messageDetail.Message,\n isFirstMessage\n );\n return;\n }\n }\n\n // Priority 4: No context - use Sage with default config\n await this.handleNoAgentContext(messageDetail, mentionResult, isFirstMessage);\n }\n\n /**\n * Handles routing when user directly mentions an agent with @\n */\n private async handleDirectMention(\n messageDetail: MJConversationDetailEntity,\n agentMention: Mention,\n isFirstMessage: boolean\n ): Promise<void> {\n // The agentMention already has configurationId from JSON parsing\n // If it wasn't in JSON (legacy format), try to get from chip data\n if (!agentMention.configurationId) {\n const chipData = this.inputBox?.getMentionChipsData() || [];\n const agentChip = chipData.find(chip => chip.id === agentMention.id && chip.type === 'agent');\n if (agentChip?.presetId) {\n agentMention.configurationId = agentChip.presetId;\n }\n }\n\n if (agentMention.configurationId) {\n //console.log(`🎯 Agent mention has configuration ID: ${agentMention.configurationId}`);\n }\n\n await this.executeRouteWithNaming(\n () => this.invokeAgentDirectly(messageDetail, agentMention, this.conversationId),\n messageDetail.Message,\n isFirstMessage\n );\n }\n\n /**\n * Handles routing when there's a previous non-Sage agent in the conversation.\n *\n * LATENCY OPTIMIZATION (PR #2309 / plans/agent-latency-optimization.md — Opt #1):\n * Previously, this method made a separate LLM call via checkContinuityIntent() to decide\n * whether the user's new message was still directed at the previous agent or should be\n * routed to Sage. That call added ~300ms of latency on every message in a conversation\n * with an active agent — the single largest source of non-inference overhead on the client.\n *\n * The heuristic replacement is simple: if a previous non-Sage agent exists, always continue\n * with it. The user can @mention a different agent (or Sage) to explicitly switch. This is\n * more predictable and eliminates a common source of confusion where the intent check\n * incorrectly rerouted messages away from the active agent.\n *\n * The checkContinuityIntent() method and the underlying checkAgentContinuityIntent() service\n * method are preserved (not deleted) so we can reintroduce intent checking in the future\n * when browser-local inference is fast enough (~20-50ms) to do this without blocking the\n * user. See PR #2309 for the full discussion.\n */\n private async handleAgentContinuity(\n messageDetail: MJConversationDetailEntity,\n lastAgentId: string,\n mentionResult: MentionParseResult,\n isFirstMessage: boolean\n ): Promise<void> {\n // COMMENTED OUT — LLM intent check removed for latency optimization (see JSDoc above).\n // const intentResult = await this.checkContinuityIntent(lastAgentId, messageDetail.Message);\n //\n // if (intentResult.decision === 'YES') {\n // await this.executeRouteWithNaming(\n // () => this.continueWithAgent(\n // messageDetail,\n // lastAgentId,\n // this.conversationId,\n // intentResult.targetArtifactVersionId\n // ),\n // messageDetail.Message,\n // isFirstMessage\n // );\n // } else {\n // await this.executeRouteWithNaming(\n // () => this.processMessageThroughAgent(messageDetail, mentionResult),\n // messageDetail.Message,\n // isFirstMessage\n // );\n // }\n\n // Always continue with the previous agent — user can @mention another agent to switch.\n await this.executeRouteWithNaming(\n () => this.continueWithAgent(\n messageDetail,\n lastAgentId,\n this.conversationId,\n undefined // artifact version targeting unavailable without intent check\n ),\n messageDetail.Message,\n isFirstMessage\n );\n }\n\n /**\n * Handles routing when there's no previous agent context\n */\n private async handleNoAgentContext(\n messageDetail: MJConversationDetailEntity,\n mentionResult: MentionParseResult,\n isFirstMessage: boolean\n ): Promise<void> {\n await this.executeRouteWithNaming(\n () => this.processMessageThroughAgent(messageDetail, mentionResult),\n messageDetail.Message,\n isFirstMessage\n );\n }\n\n /**\n * Finds the last agent ID that isn't Sage\n */\n private findLastNonSageAgentId(): string | null {\n const lastAIMessage = this.conversationHistory\n .slice()\n .reverse()\n .find(msg =>\n msg.Role === 'AI' &&\n msg.AgentID &&\n !UUIDsEqual(msg.AgentID, this.converationManagerAgent?.ID)\n );\n\n return lastAIMessage?.AgentID || null;\n }\n\n /**\n * Checks if message should continue with the previous agent\n * Emits events to show temporary intent checking message in conversation\n */\n private async checkContinuityIntent(agentId: string, message: string) {\n // FAST PATH: If message contains form response syntax, skip the intent check entirely\n // Form responses always continue with the agent that requested the form\n // Don't show \"Analyzing intent...\" message for this obvious case\n if (ConversationUtility.ContainsFormResponse(message)) {\n console.log('✅ Form response detected, skipping intent check UI (fast path)');\n return {\n decision: 'YES' as const,\n reasoning: 'User submitted a form response to the previous agent'\n };\n }\n\n // Emit event to show temporary \"Analyzing intent...\" message in conversation\n this.intentCheckStarted.emit();\n\n try {\n // Build context from pre-loaded maps (if available)\n if (!this.artifactsByDetailId || !this.agentRunsByDetailId) {\n console.warn('⚠️ Artifact/agent run context not available for intent check');\n return { decision: 'UNSURE' as const, reasoning: 'Context not available' };\n }\n\n const intent = await this.agentService.checkAgentContinuityIntent(\n agentId,\n message,\n this.conversationHistory,\n {\n artifactsByDetailId: this.artifactsByDetailId,\n agentRunsByDetailId: this.agentRunsByDetailId\n }\n );\n return intent;\n } catch (error) {\n console.error('❌ Intent check failed, defaulting to UNSURE:', error);\n return { decision: 'UNSURE' as const, reasoning: 'Intent check failed with error' };\n } finally {\n // Emit event to remove temporary intent checking message\n this.intentCheckCompleted.emit();\n }\n }\n\n /**\n * Executes a routing function, optionally with conversation naming for first message\n *\n * IMPORTANT: Conversation naming runs asynchronously in the background and does NOT\n * block the agent invocation. This prevents UI blocking if naming times out.\n */\n private async executeRouteWithNaming(\n routeFunction: () => Promise<void>,\n userMessage: string,\n isFirstMessage: boolean\n ): Promise<void> {\n if (isFirstMessage) {\n // Fire conversation naming in background (don't await)\n // This prevents 2+ minute UI blocking if naming times out\n this.nameConversation(userMessage);\n\n // Execute route immediately (don't wait for naming)\n await routeFunction();\n } else {\n await routeFunction();\n }\n }\n\n /**\n * Returns focus to the message textarea\n */\n private refocusTextarea(): void {\n setTimeout(() => {\n if (this.inputBox) {\n this.inputBox.focus();\n }\n }, 100);\n }\n\n /**\n * Handles message send failure\n */\n private handleSendFailure(messageDetail: MJConversationDetailEntity): void {\n console.error('Failed to send message:', messageDetail.LatestResult?.Message);\n this.toastService.error('Failed to send message. Please try again.');\n }\n\n /**\n * Handles message send error\n */\n private handleSendError(error: unknown): void {\n console.error('Error sending message:', error);\n this.toastService.error('Error sending message. Please try again.');\n }\n\n /**\n * Create a progress callback for agent execution\n * This callback updates both the active task and the ConversationDetail message\n * IMPORTANT: Filters by agentRunId to prevent cross-contamination when multiple agents run in parallel\n */\n private createProgressCallback(\n conversationDetail: MJConversationDetailEntity,\n agentName: string\n ): AgentExecutionProgressCallback {\n // Use closure to capture the agent run ID from the first progress message\n // This allows us to filter out progress messages from other concurrent agents\n let capturedAgentRunId: string | null = null;\n\n return async (progress) => {\n const metadata = progress.metadata as MessageProgressMetadata | undefined;\n const progressAgentRun = metadata?.agentRun;\n const progressAgentRunId = metadata?.agentRun?.ID || metadata?.agentRunId;\n\n // Capture the agent run ID from the first progress message\n if (!capturedAgentRunId && progressAgentRunId) {\n capturedAgentRunId = progressAgentRunId;\n }\n\n // Filter out progress messages from other concurrent agents\n // This prevents cross-contamination when multiple agents run in parallel\n if (capturedAgentRunId && progressAgentRunId && progressAgentRunId !== capturedAgentRunId) {\n return;\n }\n\n // Format progress message with visual indicator\n const progressText = progress.message;\n\n // Update the active task with progress details (if it exists)\n this.activeTasks.updateStatusByConversationDetailId(conversationDetail.ID, progressText);\n\n // Update the ConversationDetail message in real-time\n try {\n if (conversationDetail) {\n // Check 1: Skip if message is already complete or errored\n if (conversationDetail.Status === 'Complete' || conversationDetail.Status === 'Error') {\n return;\n }\n\n // Check 2: Skip if message was marked as completed (prevents race condition)\n // Once a message is marked complete, we reject ALL further progress updates\n const completionTime = this.completionTimestamps.get(conversationDetail.ID);\n if (completionTime) {\n return;\n }\n\n // CRITICAL FIX: Emit FULL agent run object for incremental updates\n // This contains live timestamps, status, and other fields that change during execution\n if (progressAgentRun || progressAgentRunId) {\n this.agentRunUpdate.emit({\n conversationDetailId: conversationDetail.ID,\n agentRun: progressAgentRun,\n agentRunId: progressAgentRunId\n });\n } else if (progressAgentRunId && !capturedAgentRunId) {\n // Fallback: If we don't have the full object but have the ID, emit agentRunDetected\n // This will trigger a database query to load the agent run\n this.agentRunDetected.emit({\n conversationDetailId: conversationDetail.ID,\n agentRunId: progressAgentRunId\n });\n }\n\n if (conversationDetail.Status === 'In-Progress') {\n conversationDetail.Message = progressText;\n // Server now saves progress - client only updates in-memory and emits for UI\n // (Prevents race condition where client's late save overwrites server's final Status)\n this.messageSent.emit(conversationDetail);\n }\n }\n } catch (error) {\n console.warn('Failed to update progress in ConversationDetail:', error);\n }\n };\n }\n\n /**\n * Process the message through agents (multi-stage: Sage -> possible sub-agent)\n * Only called when there's no @mention and no implicit agent context\n */\n private async processMessageThroughAgent(\n userMessage: MJConversationDetailEntity,\n mentionResult: MentionParseResult\n ): Promise<void> {\n let taskId: string | null = null;\n let conversationManagerMessage: MJConversationDetailEntity | null = null;\n\n // CRITICAL: Capture conversationId from user message at start\n // This prevents race condition when user switches conversations during async processing\n const conversationId = userMessage.ConversationID;\n\n try {\n // Create AI message for Sage BEFORE invoking\n conversationManagerMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n conversationManagerMessage.ConversationID = conversationId;\n conversationManagerMessage.Role = 'AI';\n conversationManagerMessage.Message = '⏳ Starting...';\n conversationManagerMessage.ParentID = userMessage.ID;\n conversationManagerMessage.Status = 'In-Progress';\n conversationManagerMessage.HiddenToUser = false;\n // Use the preloaded Sage agent instead of looking it up\n if (this.converationManagerAgent?.ID) {\n conversationManagerMessage.AgentID = this.converationManagerAgent.ID;\n }\n\n await conversationManagerMessage.Save();\n this.messageSent.emit(conversationManagerMessage);\n\n // Use Sage to evaluate and route\n // Stage 1: Sage evaluates the message\n taskId = this.activeTasks.add({\n agentName: 'Sage',\n status: 'Evaluating message...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: conversationManagerMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n const result = await this.agentService.processMessage(\n conversationId,\n userMessage,\n this.conversationHistory,\n conversationManagerMessage.ID,\n this.createProgressCallback(conversationManagerMessage, 'Sage'),\n this.appContext\n );\n\n // Task will be removed automatically in markMessageComplete()\n // DO NOT remove here - agent may still be streaming/processing\n taskId = null; // Clear reference but don't remove from service\n\n if (!result || !result.success) {\n // Evaluation failed - use updateConversationDetail to ensure task cleanup\n const errorMsg = result?.agentRun?.ErrorMessage || 'Agent evaluation failed';\n conversationManagerMessage.Error = errorMsg;\n await this.updateConversationDetail(conversationManagerMessage, `❌ Evaluation failed`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n console.warn('⚠️ Sage failed:', result?.agentRun?.ErrorMessage);\n\n // Clean up completion timestamp\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n return;\n }\n\n // Stage 2: Check for task graph (multi-step orchestration)\n if (result.payload?.taskGraph) {\n await this.handleTaskGraphExecution(userMessage, result, this.conversationId, conversationManagerMessage);\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n // Stage 3: Check for sub-agent invocation (single-step delegation)\n else if (result.agentRun.FinalStep === 'Success' && result.payload?.invokeAgent) {\n // Reuse the existing conversationManagerMessage instead of creating new ones\n await this.handleSubAgentInvocation(userMessage, result, this.conversationId, conversationManagerMessage);\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n // Stage 4: Direct chat response from Agent\n else if (result.agentRun.FinalStep === 'Chat' && result.agentRun.Message) {\n // Normal chat response\n // use update helper to ensure that if there is a race condition with more streaming updates we don't allow that to override this final message\n // Note: updateConversationDetail will call markMessageComplete() for us\n await this.updateConversationDetail(conversationManagerMessage, result.agentRun.Message, 'Complete', result);\n\n // Handle artifacts if any (but NOT task graphs - those are intermediate work products)\n // Server already created artifacts - just emit event to trigger UI reload\n if (result.payload && Object.keys(result.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: conversationManagerMessage.ID,\n name: ''\n });\n this.messageSent.emit(conversationManagerMessage);\n }\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n\n // Clean up completion timestamp after delay\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n }\n // Stage 5: Silent observation - but check for message content first\n else {\n // Check if there's a message to display even without payload/taskGraph\n if (result.agentRun.Message) {\n // Mark message as completing BEFORE setting final content\n this.markMessageComplete(conversationManagerMessage);\n\n conversationManagerMessage.HiddenToUser = false;\n\n // use update helper to ensure that if there is a race condition with more streaming updates we don't allow that to override this final message\n await this.updateConversationDetail(conversationManagerMessage, result.agentRun.Message, 'Complete', result);\n\n this.messageSent.emit(conversationManagerMessage);\n\n // Clean up completion timestamp after delay\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n } else {\n // Mark message as completing\n this.markMessageComplete(conversationManagerMessage);\n\n // Hide the Sage message\n conversationManagerMessage.HiddenToUser = true;\n\n // use update helper to ensure that if there is a race condition with more streaming updates we don't allow that to override this final message\n await this.updateConversationDetail(conversationManagerMessage, conversationManagerMessage.Message, 'Complete', result);\n\n this.messageSent.emit(conversationManagerMessage);\n\n await this.handleSilentObservation(userMessage, this.conversationId);\n\n // Clean up completion timestamp after delay\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n }\n\n // Remove CM from active tasks\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n\n } catch (error) {\n console.error('❌ Error processing message through agents:', error);\n\n // Update conversationManagerMessage status to Error\n if (conversationManagerMessage && conversationManagerMessage.ID) {\n // Use updateConversationDetail to ensure task cleanup\n conversationManagerMessage.Error = String(error);\n await this.updateConversationDetail(conversationManagerMessage, `❌ Error: ${String(error)}`, 'Error');\n\n // Clean up completion timestamp\n this.cleanupCompletionTimestamp(conversationManagerMessage.ID);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n // Clean up active task\n if (taskId) {\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n }\n }\n }\n\n /**\n * Handle task graph execution based on Sage's payload\n * Creates tasks and orchestrates their execution\n */\n private async handleTaskGraphExecution(\n userMessage: MJConversationDetailEntity,\n managerResult: ExecuteAgentResult,\n conversationId: string,\n conversationManagerMessage: MJConversationDetailEntity\n ): Promise<void> {\n const taskGraph = managerResult.payload.taskGraph;\n const workflowName = taskGraph.workflowName || 'Workflow';\n const reasoning = taskGraph.reasoning || 'Executing multi-step workflow';\n const taskCount = taskGraph.tasks?.length || 0;\n\n // Deduplicate tasks by tempId (LLM sometimes returns duplicates)\n const seenTempIds = new Set<string>();\n const uniqueTasks = taskGraph.tasks.filter((task: any) => {\n if (seenTempIds.has(task.tempId)) {\n console.warn(`⚠️ Duplicate tempId detected on client, filtering: ${task.tempId} (${task.name})`);\n return false;\n }\n seenTempIds.add(task.tempId);\n return true;\n });\n\n const uniqueTaskCount = uniqueTasks.length;\n\n const isSingleTask = uniqueTaskCount === 1;\n\n // If single task, use direct agent execution (existing pattern with great PubSub support)\n if (isSingleTask) {\n const task = uniqueTasks[0];\n const agentName = task.agentName;\n\n // Update CM message\n const delegationMessage = `👉 Delegating to **${agentName}**`;\n await this.updateConversationDetail(conversationManagerMessage, delegationMessage, 'Complete');\n\n // Execute single agent directly using existing pattern\n await this.handleSingleTaskExecution(\n userMessage,\n task,\n agentName,\n conversationId,\n conversationManagerMessage\n );\n\n return;\n }\n\n // Multi-step workflow - use server-side task orchestration\n console.log(`📋 Multi-step workflow detected (${uniqueTaskCount} tasks), using task orchestration`);\n\n // Update CM message with task summary (use unique tasks only)\n const taskSummary = uniqueTasks.map((t: any) => `• ${t.name}`).join('\\n');\n\n await this.updateConversationDetail(conversationManagerMessage, `📋 Setting up multi-step workflow...\\n\\n**${workflowName}**\\n${taskSummary}`, 'Complete');\n\n // Step 2: Create new ConversationDetail for task execution updates\n const taskExecutionMessage = await this.dataCache.createConversationDetail(this.currentUser);\n taskExecutionMessage.ConversationID = conversationId;\n taskExecutionMessage.Role = 'AI';\n taskExecutionMessage.Message = '⏳ Starting workflow execution...';\n taskExecutionMessage.ParentID = conversationManagerMessage.ID; // Thread under delegation message\n taskExecutionMessage.Status = 'In-Progress';\n taskExecutionMessage.HiddenToUser = false;\n // No AgentID for now - this represents the task orchestration system\n await taskExecutionMessage.Save();\n this.messageSent.emit(taskExecutionMessage);\n\n // Register for streaming updates via global streaming service\n const callback = this.createMessageProgressCallback(taskExecutionMessage.ID);\n this.registeredCallbacks.set(taskExecutionMessage.ID, callback);\n this.streamingService.registerMessageCallback(taskExecutionMessage.ID, callback);\n\n try {\n // Get default environment ID (MJ standard environment used across all installations)\n const environmentId = MJEnvironmentEntityExtended.DefaultEnvironmentID;\n\n // Get session ID for PubSub subscriptions\n const sessionId = GraphQLDataProvider.Instance.sessionId || '';\n \n // Step 3: Call ExecuteTaskGraph mutation (links to taskExecutionMessage)\n const mutation = `\n mutation ExecuteTaskGraph($taskGraphJson: String!, $conversationDetailId: String!, $environmentId: String!, $sessionId: String!, $createNotifications: Boolean) {\n ExecuteTaskGraph(\n taskGraphJson: $taskGraphJson\n conversationDetailId: $conversationDetailId\n environmentId: $environmentId\n sessionId: $sessionId\n createNotifications: $createNotifications\n ) {\n success\n errorMessage\n results {\n taskId\n success\n output\n error\n }\n }\n }\n `;\n\n const variables = {\n taskGraphJson: JSON.stringify(taskGraph),\n conversationDetailId: taskExecutionMessage.ID, // Link tasks to execution message, not CM message\n environmentId: environmentId,\n sessionId: sessionId,\n createNotifications: true\n };\n\n const result = await GraphQLDataProvider.Instance.ExecuteGQL(mutation, variables);\n\n // Step 4: Update task execution message with results\n // ExecuteGQL returns data directly (not wrapped in {data, errors})\n if (result?.ExecuteTaskGraph?.success) {\n await this.updateConversationDetail(taskExecutionMessage, `✅ **${workflowName}** completed successfully`, 'Complete');\n } else {\n const errorMsg = result?.ExecuteTaskGraph?.errorMessage || 'Unknown error';\n console.error('❌ Task graph execution failed:', errorMsg);\n taskExecutionMessage.Error = errorMsg;\n await this.updateConversationDetail(taskExecutionMessage, `❌ **${workflowName}** failed: ${errorMsg}`, 'Error');\n }\n\n // Trigger artifact reload for this message\n // Artifacts were created on server during task execution and linked to this message\n // This event triggers the parent component to reload artifacts from the database\n this.artifactCreated.emit({\n artifactId: '', // Placeholder - reload will fetch actual artifacts from DB\n versionId: '',\n versionNumber: 1,\n conversationDetailId: taskExecutionMessage.ID,\n name: ''\n });\n\n // Unregister streaming callback (task complete)\n const callback = this.registeredCallbacks.get(taskExecutionMessage.ID);\n if (callback) {\n this.streamingService.unregisterMessageCallback(taskExecutionMessage.ID, callback);\n this.registeredCallbacks.delete(taskExecutionMessage.ID);\n }\n\n // Mark agent response message as complete (removes task from active tasks)\n await this.updateConversationDetail(conversationManagerMessage, conversationManagerMessage.Message, 'Complete');\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n } catch (error) {\n console.error('❌ Error executing task graph:', error);\n taskExecutionMessage.Error = String(error);\n await this.updateConversationDetail(taskExecutionMessage, `❌ **${workflowName}** - Error: ${String(error)}`, 'Error');\n\n // Trigger artifact reload even on error - partial artifacts may have been created\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 1,\n conversationDetailId: taskExecutionMessage.ID,\n name: ''\n });\n\n // Unregister streaming callback (task failed)\n const callback = this.registeredCallbacks.get(taskExecutionMessage.ID);\n if (callback) {\n this.streamingService.unregisterMessageCallback(taskExecutionMessage.ID, callback);\n this.registeredCallbacks.delete(taskExecutionMessage.ID);\n }\n\n // Mark agent response message as complete (removes task from active tasks)\n conversationManagerMessage.Error = String(error);\n await this.updateConversationDetail(conversationManagerMessage, conversationManagerMessage.Message, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n protected async updateConversationDetail(convoDetail: MJConversationDetailEntity, message: string, status: 'In-Progress' | 'Complete' | 'Error', result?: ExecuteAgentResult): Promise<void> {\n // Mark as completing FIRST if status is Complete or Error\n // This ensures task cleanup happens even if we return early due to guard clause\n if (status === 'Complete' || status === 'Error') {\n this.markMessageComplete(convoDetail);\n }\n\n // Race condition guard: Before writing Error, reload from DB to check if the server\n // already completed this record. The server and client write to the same conversation\n // detail record — if the server completed successfully but a client-side timeout or\n // WebSocket disconnect triggered this error path, we must not overwrite the server's\n // successful completion with an error status.\n if (status === 'Error' && convoDetail.ID) {\n await convoDetail.Load(convoDetail.ID);\n if (convoDetail.Status === 'Complete') {\n // Server already completed — emit updated message, don't overwrite with error\n this.messageSent.emit(convoDetail);\n return;\n }\n }\n\n // Guard clause: Don't re-save if already complete/errored (prevents duplicate saves)\n // Task has already been removed by markMessageComplete() above\n if (convoDetail.Status === 'Complete' || convoDetail.Status === 'Error') {\n return; // Already complete, no need to save again\n }\n\n const maxAttempts = 2;\n let attempts = 0, done = false;\n while (attempts < maxAttempts && !done) {\n // Set response form and command fields before saving\n if (result?.responseForm) {\n convoDetail.ResponseForm = JSON.stringify(result.responseForm);\n }\n if (result?.actionableCommands) {\n convoDetail.ActionableCommands = JSON.stringify(result.actionableCommands);\n }\n if (result?.automaticCommands) {\n convoDetail.AutomaticCommands = JSON.stringify(result.automaticCommands);\n }\n\n convoDetail.Message = message;\n convoDetail.Status = status;\n\n await convoDetail.Save();\n\n if (convoDetail.Message === message && convoDetail.Status === status) {\n done = true;\n this.messageSent.emit(convoDetail);\n }\n else {\n console.warn(` ⚠️ ConversationDetail update attempt ${attempts + 1} did not persist. ${attempts + 1 < maxAttempts ? 'Retrying...' : 'Giving up.'}`);\n }\n attempts++;\n }\n\n // Clean up completion timestamp after delay\n if (status === 'Complete' || status === 'Error') {\n this.cleanupCompletionTimestamp(convoDetail.ID);\n }\n }\n\n /**\n * Load previous payload for an agent from its most recent OUTPUT artifact.\n * Searches backwards through all messages from this agent until an artifact is found.\n * This ensures payload continuity even after clarifying exchanges without artifacts.\n * Checks both user-visible and system artifacts to support agents like Agent Manager.\n */\n private async loadPreviousPayloadForAgent(agentId: string): Promise<{\n payload: any;\n artifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null;\n }> {\n // Get all messages from this agent in reverse order (most recent first)\n const agentMessages = this.conversationHistory\n .slice()\n .reverse()\n .filter(msg => msg.Role === 'AI' && UUIDsEqual(msg.AgentID, agentId));\n\n if (agentMessages.length === 0) {\n return { payload: null, artifactInfo: null };\n }\n\n // Search through all agent messages until we find one with an artifact\n for (const message of agentMessages) {\n // Check user-visible artifacts first\n let artifacts = this.artifactsByDetailId?.get(message.ID);\n\n // If not found, check system artifacts (Agent Manager, etc.)\n if (!artifacts || artifacts.length === 0) {\n artifacts = this.systemArtifactsByDetailId?.get(message.ID);\n }\n\n // Try to load artifact content as payload\n if (artifacts && artifacts.length > 0) {\n const artifact = artifacts[0];\n try {\n const version = await artifact.getVersion();\n if (version.Content) {\n console.log(`📦 Loaded previous payload for agent ${agentId} from artifact (message: ${message.ID})`);\n return {\n payload: JSON.parse(version.Content),\n artifactInfo: {\n artifactId: artifact.artifactId,\n versionId: artifact.artifactVersionId,\n versionNumber: artifact.versionNumber\n }\n };\n }\n } catch (error) {\n console.error('Error loading payload from artifact:', error);\n // Continue to next message\n }\n }\n }\n\n console.log(`📦 No previous payload found for agent ${agentId} after searching ${agentMessages.length} messages`);\n return { payload: null, artifactInfo: null };\n }\n\n /**\n * Handle single task execution from task graph using direct agent execution\n * Uses the existing agent execution pattern with PubSub support\n */\n private async handleSingleTaskExecution(\n userMessage: MJConversationDetailEntity,\n task: any, // Task definition from taskGraph\n agentName: string,\n conversationId: string,\n conversationManagerMessage: MJConversationDetailEntity\n ): Promise<void> {\n try {\n // Look up the agent\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n if (!agent) {\n throw new Error(`Agent not found: ${agentName}`);\n }\n\n // Create AI response message for the agent execution\n const agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...';\n agentResponseMessage.ParentID = conversationManagerMessage.ID; // Thread under delegation\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n agentResponseMessage.AgentID = agent.ID;\n\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Add to active tasks\n const newTaskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Starting...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: agentResponseMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Load previous payload if agent has been invoked before\n const { payload: previousPayload, artifactInfo } = await this.loadPreviousPayloadForAgent(agent.ID);\n\n // Merge Sage's task payload with previous agent payload (Sage's takes precedence)\n const mergedPayload = previousPayload\n ? { ...previousPayload, ...task.inputPayload }\n : task.inputPayload;\n\n // Invoke agent with merged payload\n const agentResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n task.description || task.name,\n agentResponseMessage.ID,\n mergedPayload, // Pass merged payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n artifactInfo?.artifactId,\n artifactInfo?.versionId\n );\n\n // Task will be removed automatically in markMessageComplete() when status changes to Complete/Error\n // DO NOT remove here - allows UI to show task during entire execution\n\n if (agentResult && agentResult.success) {\n // Update message with result\n await this.updateConversationDetail(agentResponseMessage, agentResult.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', agentResult);\n\n // Server created artifacts - emit event to trigger UI reload\n if (agentResult.payload && Object.keys(agentResult.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n console.log('🎨 Server created artifact from single task execution');\n this.messageSent.emit(agentResponseMessage);\n }\n } else {\n // Handle failure\n const errorMsg = agentResult?.agentRun?.ErrorMessage || 'Agent execution failed';\n agentResponseMessage.Error = errorMsg;\n await this.updateConversationDetail(agentResponseMessage, `❌ **${agentName}** failed: ${errorMsg}`, 'Error');\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n\n } catch (error) {\n console.error('❌ Error in single task execution:', error);\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Handle sub-agent invocation based on Sage's payload\n * Reuses the existing conversationManagerMessage to avoid creating multiple records\n */\n private async handleSubAgentInvocation(\n userMessage: MJConversationDetailEntity,\n managerResult: ExecuteAgentResult,\n conversationId: string,\n conversationManagerMessage: MJConversationDetailEntity\n ): Promise<void> {\n const payload = managerResult.payload;\n const agentName = payload.invokeAgent;\n const reasoning = payload.reasoning || 'Delegating to specialist agent';\n\n // Now create a NEW message for the sub-agent execution\n try {\n // Look up the agent to get its ID\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n\n // Create AI response message BEFORE invoking agent (for duration tracking)\n const agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...'; // Initial message\n agentResponseMessage.ParentID = conversationManagerMessage.ID; // Thread under delegation message\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n // Set AgentID immediately for proper attribution\n if (agent?.ID) {\n agentResponseMessage.AgentID = agent.ID;\n }\n\n // Save the record to establish __mj_CreatedAt timestamp\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Add sub-agent to active tasks\n const newTaskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Starting...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: agentResponseMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Load previous payload if agent has been invoked before\n const { payload: previousPayload, artifactInfo } = agent?.ID\n ? await this.loadPreviousPayloadForAgent(agent.ID)\n : { payload: null, artifactInfo: null };\n\n // Find configuration preset from previous @mention in conversation history\n const configurationPresetId = agent?.ID\n ? this.agentService.findConfigurationPresetFromHistory(agent.ID, this.conversationHistory)\n : undefined;\n\n // Invoke the sub-agent with progress callback\n const subResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n reasoning,\n agentResponseMessage.ID,\n previousPayload, // Pass previous payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n artifactInfo?.artifactId,\n artifactInfo?.versionId,\n configurationPresetId // Pass configuration from previous @mention for continuity\n );\n\n // Task will be removed automatically in markMessageComplete() when status changes to Complete/Error\n // DO NOT remove here - allows UI to show task during entire execution\n\n if (subResult && subResult.success) {\n // Update the response message with agent result\n // Store the agent ID for display\n if (subResult.agentRun.AgentID) {\n agentResponseMessage.AgentID = subResult.agentRun.AgentID;\n }\n\n await this.updateConversationDetail(agentResponseMessage, subResult.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', subResult);\n\n // Always emit artifactCreated to trigger UI reload — the server may have created\n // artifacts even when the result payload is empty (e.g., remote stage server).\n // onArtifactCreated will reload from DB and discover any artifacts that exist.\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Sub-agent failed - attempt auto-retry once\n console.log(`⚠️ ${agentName} failed, attempting auto-retry...`);\n\n await this.updateConversationDetail(conversationManagerMessage, `👉 **${agentName}** will handle this request...\\n\\n⚠️ First attempt failed, retrying...`, conversationManagerMessage.Status);\n\n // Update the existing agentResponseMessage to show retry status\n await this.updateConversationDetail(agentResponseMessage, \"Retrying...\", agentResponseMessage.Status);\n\n // Retry the sub-agent (reuse previously loaded payload and config from first attempt)\n const retryResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n reasoning,\n agentResponseMessage.ID,\n previousPayload, // Pass same payload as first attempt\n this.createProgressCallback(agentResponseMessage, `${agentName} (retry)`),\n artifactInfo?.artifactId,\n artifactInfo?.versionId,\n configurationPresetId // Pass same config as first attempt\n );\n\n if (retryResult && retryResult.success) {\n // Retry succeeded - update the same message\n if (retryResult.agentRun.AgentID) {\n agentResponseMessage.AgentID = retryResult.agentRun.AgentID;\n }\n\n await this.updateConversationDetail(agentResponseMessage, retryResult.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', retryResult);\n\n // Always emit artifactCreated to trigger UI reload (same as initial attempt)\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Retry also failed - show error with manual retry option\n conversationManagerMessage.Error = retryResult?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(conversationManagerMessage, `❌ **${agentName}** failed after retry\\n\\n${retryResult?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n } catch (error) {\n console.error(`❌ Error invoking sub-agent ${agentName}:`, error);\n\n conversationManagerMessage.Error = String(error);\n await this.updateConversationDetail(conversationManagerMessage, `❌ **${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Handle silent observation - when Sage stays silent,\n * check if we should continue with the last agent for iterative refinement\n */\n private async handleSilentObservation(\n userMessage: MJConversationDetailEntity,\n conversationId: string\n ): Promise<void> {\n // Find the last AI message (excluding Sage) in the conversation history\n const lastAIMessage = this.conversationHistory\n .slice()\n .reverse()\n .find(msg =>\n msg.Role === 'AI' &&\n msg.AgentID &&\n !UUIDsEqual(msg.AgentID, this.converationManagerAgent?.ID)\n );\n\n if (!lastAIMessage || !lastAIMessage.AgentID) {\n // No previous specialist agent - just mark user message as complete\n console.log('🔇 No previous specialist agent found - marking complete');\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n return;\n }\n\n // Load the agent entity to get its name\n const previousAgent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, lastAIMessage.AgentID));\n if (!previousAgent) {\n console.warn('⚠️ Could not load previous agent - marking complete');\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n return;\n }\n\n const agentName = previousAgent.Name || 'Agent';\n\n let previousPayload: any = null;\n let previousArtifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null = null;\n\n // Use pre-loaded artifact data (no DB queries!)\n // Check both user-visible and system artifacts\n let artifacts = this.artifactsByDetailId?.get(lastAIMessage.ID);\n if (!artifacts || artifacts.length === 0) {\n artifacts = this.systemArtifactsByDetailId?.get(lastAIMessage.ID);\n }\n\n if (artifacts && artifacts.length > 0) {\n try {\n // Use the first artifact (should only be one OUTPUT per message)\n const artifact = artifacts[0];\n const version = await artifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: artifact.artifactId,\n versionId: artifact.artifactVersionId,\n versionNumber: artifact.versionNumber\n };\n console.log('📦 Loaded previous OUTPUT artifact as payload for continuity', previousArtifactInfo);\n }\n } catch (error) {\n console.warn('⚠️ Could not parse previous artifact content:', error);\n }\n }\n\n // Create status message showing agent continuity\n const statusMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n statusMessage.ConversationID = conversationId;\n statusMessage.Role = 'AI';\n statusMessage.Message = `Continuing with **${agentName}** for refinement...`;\n statusMessage.ParentID = userMessage.ID;\n statusMessage.Status = 'Complete';\n statusMessage.HiddenToUser = false;\n statusMessage.AgentID = this.converationManagerAgent?.ID || null;\n\n await statusMessage.Save();\n this.messageSent.emit(statusMessage);\n\n // Add agent to active tasks\n const taskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Processing refinement...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: statusMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n try {\n // Invoke the agent with the previous payload\n const continuityResult = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n 'Continuing previous work based on user feedback',\n statusMessage.ID,\n previousPayload,\n this.createProgressCallback(statusMessage, agentName),\n previousArtifactInfo?.artifactId,\n previousArtifactInfo?.versionId\n );\n\n // Remove from active tasks\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n if (continuityResult && continuityResult.success) {\n // Create response message\n const agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = continuityResult.agentRun?.Message || `✅ **${agentName}** completed refinement`;\n agentResponseMessage.ParentID = statusMessage.ID;\n agentResponseMessage.Status = 'Complete';\n agentResponseMessage.HiddenToUser = false;\n agentResponseMessage.AgentID = lastAIMessage.AgentID;\n\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Server created artifacts (handles versioning automatically) - emit event to trigger UI reload\n if (continuityResult.payload && Object.keys(continuityResult.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n console.log('🎨 Server created artifact (versioned) from agent continuity');\n this.messageSent.emit(agentResponseMessage);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Agent failed\n statusMessage.Error = continuityResult?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(statusMessage, `❌ **${agentName}** failed during refinement\\n\\n${continuityResult?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } catch (error) {\n console.error(`❌ Error in agent continuity with ${agentName}:`, error);\n\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n statusMessage.Error = String(error);\n await this.updateConversationDetail(statusMessage, `❌ **${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n \n\n /**\n * Invoke an agent directly when mentioned with @ symbol\n * Bypasses Sage completely - no status messages\n */\n private async invokeAgentDirectly(\n userMessage: MJConversationDetailEntity,\n agentMention: Mention,\n conversationId: string\n ): Promise<void> {\n const agentName = agentMention.name;\n\n // Add agent to active tasks\n const taskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Processing...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: userMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Declare agentResponseMessage outside try block so it's accessible in catch\n let agentResponseMessage: MJConversationDetailEntity | undefined = undefined;\n\n try {\n // User message is sent successfully - mark complete immediately\n // (No UI uses User message 'In-Progress' - only AI messages need that status)\n userMessage.Status = 'Complete';\n await userMessage.Save();\n this.messageSent.emit(userMessage);\n\n // Look up the agent to get its ID\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n\n // Create AI response message BEFORE invoking agent (for duration tracking)\n agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...'; // Initial message\n agentResponseMessage.ParentID = userMessage.ID;\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n // Set AgentID immediately for proper attribution\n if (agent?.ID) {\n agentResponseMessage.AgentID = agent.ID;\n }\n\n // Save the record to establish __mj_CreatedAt timestamp\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Load previous payload if agent has been invoked before\n const { payload: previousPayload, artifactInfo } = agent?.ID\n ? await this.loadPreviousPayloadForAgent(agent.ID)\n : { payload: null, artifactInfo: null };\n\n // Invoke the agent directly\n const result = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n `User mentioned agent directly with @${agentName}`,\n agentResponseMessage.ID,\n previousPayload, // Pass previous payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n artifactInfo?.artifactId,\n artifactInfo?.versionId,\n agentMention.configurationId // Pass configuration preset ID\n );\n\n // Remove from active tasks\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n if (result && result.success) {\n if (result.agentRun.AgentID) {\n agentResponseMessage.AgentID = result.agentRun.AgentID;\n }\n\n // Multi-stage response handling (same logic as ambient Sage)\n // Stage 1: Check for task graph (multi-step orchestration)\n if (result.payload?.taskGraph) {\n console.log('📋 Task graph detected from @mention, starting task orchestration');\n await this.handleTaskGraphExecution(userMessage, result, conversationId, agentResponseMessage);\n }\n // Stage 2: Check for sub-agent invocation (single-step delegation)\n else if (result.agentRun.FinalStep === 'Success' && result.payload?.invokeAgent) {\n console.log('🎯 Sub-agent invocation detected from @mention');\n await this.handleSubAgentInvocation(userMessage, result, conversationId, agentResponseMessage);\n }\n // Stage 3: Normal chat response\n else {\n await this.updateConversationDetail(agentResponseMessage, result.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', result)\n\n // Server created artifacts - emit event to trigger UI reload\n if (result.payload && Object.keys(result.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } else {\n // Agent failed - update the existing message instead of creating a new one\n agentResponseMessage.Error = result?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(agentResponseMessage, `❌ **@${agentName}** failed\\n\\n${result?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } catch (error) {\n console.error(`❌ Error invoking mentioned agent ${agentName}:`, error);\n\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n // Update the existing agent response message if it was created\n if (agentResponseMessage) {\n agentResponseMessage.Error = String(error);\n await this.updateConversationDetail(agentResponseMessage, `❌ **@${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n }\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Continue with the same agent from previous message (implicit continuation)\n * Bypasses Sage - no status messages\n *\n * @param targetArtifactVersionId Optional specific artifact version to use as payload (from intent check)\n */\n private async continueWithAgent(\n userMessage: MJConversationDetailEntity,\n agentId: string,\n conversationId: string,\n targetArtifactVersionId?: string\n ): Promise<void> {\n // Load the agent entity to get its name\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, agentId));\n if (!agent) {\n console.warn('⚠️ Could not load agent for continuation - falling back to Sage');\n await this.processMessageThroughAgent(userMessage, { mentions: [], agentMention: null, userMentions: [] });\n return;\n }\n\n const agentName = agent.Name || 'Agent';\n\n let previousPayload: any = null;\n let previousArtifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null = null;\n let previousConfigurationId: string | undefined = undefined;\n\n // Use targetArtifactVersionId if specified (from intent check)\n if (targetArtifactVersionId) {\n // Find the artifact in pre-loaded data (check both user-visible and system artifacts)\n for (const [detailId, artifacts] of (this.artifactsByDetailId?.entries() || [])) {\n const targetArtifact = artifacts.find(a => a.artifactVersionId === targetArtifactVersionId);\n if (targetArtifact) {\n try {\n // Lazy load the full version entity to get Content\n const version = await targetArtifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: targetArtifact.artifactId,\n versionId: targetArtifact.artifactVersionId,\n versionNumber: targetArtifact.versionNumber\n };\n console.log('📦 Loaded target artifact version as payload', previousArtifactInfo);\n }\n } catch (error) {\n console.warn('⚠️ Could not load target artifact version:', error);\n }\n break;\n }\n }\n\n // If not found in user-visible artifacts, check system artifacts\n if (!previousPayload && this.systemArtifactsByDetailId) {\n for (const [detailId, artifacts] of this.systemArtifactsByDetailId.entries()) {\n const targetArtifact = artifacts.find(a => a.artifactVersionId === targetArtifactVersionId);\n if (targetArtifact) {\n try {\n const version = await targetArtifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: targetArtifact.artifactId,\n versionId: targetArtifact.artifactVersionId,\n versionNumber: targetArtifact.versionNumber\n };\n console.log('📦 Loaded target artifact version as payload (from system artifacts)', previousArtifactInfo);\n }\n } catch (error) {\n console.warn('⚠️ Could not load target artifact version:', error);\n }\n break;\n }\n }\n }\n }\n\n // Get all messages from this agent in reverse order (most recent first)\n const agentMessages = this.conversationHistory\n .slice()\n .reverse()\n .filter(msg => msg.Role === 'AI' && UUIDsEqual(msg.AgentID, agentId));\n\n // Extract configuration preset from the User message that @mentioned this agent\n // Uses the shared helper method in the agent service\n previousConfigurationId = this.agentService.findConfigurationPresetFromHistory(agentId, this.conversationHistory);\n\n // Fall back to searching through all agent messages for an artifact\n // This ensures payload continuity even after clarifying exchanges without artifacts\n if (!previousPayload && agentMessages.length > 0) {\n console.log('📦 Searching through agent messages for most recent artifact...');\n\n for (const message of agentMessages) {\n // Get artifacts from pre-loaded data (check both user-visible and system artifacts)\n let artifacts = this.artifactsByDetailId?.get(message.ID);\n if (!artifacts || artifacts.length === 0) {\n artifacts = this.systemArtifactsByDetailId?.get(message.ID);\n }\n\n if (artifacts && artifacts.length > 0) {\n try {\n // Use the first artifact (should only be one OUTPUT per message)\n const artifact = artifacts[0];\n const version = await artifact.getVersion();\n if (version.Content) {\n previousPayload = JSON.parse(version.Content);\n previousArtifactInfo = {\n artifactId: artifact.artifactId,\n versionId: artifact.artifactVersionId,\n versionNumber: artifact.versionNumber\n };\n console.log(`📦 Loaded artifact as payload from message ${message.ID}`, previousArtifactInfo);\n break; // Found an artifact, stop searching\n }\n } catch (error) {\n console.warn('⚠️ Could not parse artifact content:', error);\n // Continue to next message\n }\n }\n }\n\n if (!previousPayload) {\n console.log(`📦 No artifact found after searching ${agentMessages.length} messages from agent`);\n }\n }\n\n // Execute the agent with the gathered context\n await this.executeAgentContinuation(\n userMessage,\n agentId,\n agentName,\n conversationId,\n previousPayload,\n previousArtifactInfo,\n previousConfigurationId\n );\n }\n\n /**\n * Executes agent continuation with all context already gathered.\n * This is the shared execution logic used by both continueWithAgent and direct Sage config path.\n *\n * @param userMessage The user's message entity\n * @param agentId The agent ID to invoke\n * @param agentName The agent's display name\n * @param conversationId The conversation ID\n * @param previousPayload Optional payload from previous artifact\n * @param previousArtifactInfo Optional artifact info (id, versionId, versionNumber)\n * @param configurationId Optional configuration preset ID to use\n */\n private async executeAgentContinuation(\n userMessage: MJConversationDetailEntity,\n agentId: string,\n agentName: string,\n conversationId: string,\n previousPayload: Record<string, unknown> | null,\n previousArtifactInfo: {artifactId: string; versionId: string; versionNumber: number} | null,\n configurationId?: string\n ): Promise<void> {\n // Add agent to active tasks\n const taskId = this.activeTasks.add({\n agentName: agentName,\n status: 'Processing...',\n relatedMessageId: userMessage.ID,\n conversationDetailId: userMessage.ID,\n conversationId: this.conversationId,\n conversationName: this.conversationName\n });\n\n // Declare agentResponseMessage outside try block so it's accessible in catch\n let agentResponseMessage: MJConversationDetailEntity | undefined = undefined;\n\n try {\n // User message is sent successfully - mark complete immediately\n // (No UI uses User message 'In-Progress' - only AI messages need that status)\n userMessage.Status = 'Complete';\n await userMessage.Save();\n this.messageSent.emit(userMessage);\n\n // Create AI response message BEFORE invoking agent (for duration tracking)\n agentResponseMessage = await this.dataCache.createConversationDetail(this.currentUser);\n\n agentResponseMessage.ConversationID = conversationId;\n agentResponseMessage.Role = 'AI';\n agentResponseMessage.Message = '⏳ Starting...'; // Initial message\n agentResponseMessage.ParentID = userMessage.ID;\n agentResponseMessage.Status = 'In-Progress';\n agentResponseMessage.HiddenToUser = false;\n agentResponseMessage.AgentID = agentId;\n\n // Save the record to establish __mj_CreatedAt timestamp\n await agentResponseMessage.Save();\n this.messageSent.emit(agentResponseMessage);\n\n // Invoke the agent directly (continuation) with previous payload if available\n const result = await this.agentService.invokeSubAgent(\n agentName,\n conversationId,\n userMessage,\n this.conversationHistory,\n 'Continuing previous conversation with user',\n agentResponseMessage.ID,\n previousPayload, // Pass previous OUTPUT artifact payload for continuity\n this.createProgressCallback(agentResponseMessage, agentName),\n previousArtifactInfo?.artifactId,\n previousArtifactInfo?.versionId,\n configurationId // Pass configuration for continuity\n );\n\n // Remove from active tasks\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n if (result && result.success) {\n // Update the response message with agent result\n await this.updateConversationDetail(agentResponseMessage,result.agentRun?.Message || `✅ **${agentName}** completed`, 'Complete', result);\n\n // Server created artifacts (handles versioning) - emit event to trigger UI reload\n if (result.payload && Object.keys(result.payload).length > 0) {\n this.artifactCreated.emit({\n artifactId: '',\n versionId: '',\n versionNumber: 0,\n conversationDetailId: agentResponseMessage.ID,\n name: ''\n });\n this.messageSent.emit(agentResponseMessage);\n }\n\n // Mark user message as complete\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n } else {\n // Agent failed - update the existing message instead of creating a new one\n agentResponseMessage.Error = result?.agentRun?.ErrorMessage || null;\n await this.updateConversationDetail(agentResponseMessage, `❌ **${agentName}** failed\\n\\n${result?.agentRun?.ErrorMessage || 'Unknown error'}`, 'Error');\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n } catch (error) {\n console.error(`❌ Error continuing with agent ${agentName}:`, error);\n\n // Task removed in markMessageComplete() - this.activeTasks.remove(taskId);\n\n // Update the existing agent response message if it was created\n if (agentResponseMessage) {\n agentResponseMessage.Error = String(error);\n await this.updateConversationDetail(agentResponseMessage, `❌ **${agentName}** encountered an error\\n\\n${String(error)}`, 'Error');\n }\n\n await this.updateConversationDetail(userMessage, userMessage.Message, 'Complete');\n }\n }\n\n /**\n * Name the conversation based on the first message using GraphQL AI client\n *\n * IMPORTANT: This runs asynchronously in the background and has a 30-second timeout\n * to prevent long delays. Failures are logged but don't affect the user experience.\n */\n private async nameConversation(message: string): Promise<void> {\n try {\n // Load the Name Conversation prompt to get its ID\n await AIEngineBase.Instance.Config(false);\n const p = AIEngineBase.Instance.Prompts.find(pr => pr.Name === 'Name Conversation');\n if (!p) {\n console.warn('⚠️ Name Conversation prompt not found');\n return;\n }\n\n const promptId = p.ID;\n\n // Use GraphQL AI client to run the prompt (same client as agent)\n const provider = Metadata.Provider as GraphQLDataProvider;\n if (!provider) {\n console.warn('⚠️ GraphQLDataProvider not available');\n return;\n }\n\n // Convert message to plain text (strips JSON-encoded mentions like @{\"id\":\"...\",\"name\":\"Sage\"} to @Sage)\n const plainTextMessage = this.mentionParser.toPlainText(\n message,\n this.mentionAutocomplete.getAvailableAgents(),\n this.mentionAutocomplete.getAvailableUsers()\n );\n\n const aiClient = new GraphQLAIClient(provider);\n\n // Add 30-second timeout to prevent long delays\n // If this times out, the conversation will keep its default name\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Conversation naming timed out after 30 seconds')), 30000);\n });\n\n const result = await Promise.race([\n aiClient.RunAIPrompt({\n promptId: promptId,\n messages: [{ role: 'user', content: plainTextMessage }],\n }),\n timeoutPromise\n ]);\n\n if (result && result.success && (result.parsedResult || result.output)) {\n // Use parsedResult if available, otherwise clean and parse output\n // (CleanAndParseJSON handles markdown code blocks like ```json ... ```)\n const parsed = result.parsedResult ||\n (result.output ? CleanAndParseJSON(result.output) : null);\n\n if (parsed) {\n const { name, description } = parsed;\n\n if (name) {\n // Update the conversation name and description in database AND state immediately\n await this.engine.SaveConversation(\n this.conversationId,\n { Name: name, Description: description || '' },\n this.currentUser\n );\n\n // Emit event for animation in conversation list\n this.conversationRenamed.emit({\n conversationId: this.conversationId,\n name: name,\n description: description || ''\n });\n\n console.log(`✅ Conversation renamed to: \"${name}\"`);\n }\n }\n } else {\n console.warn('⚠️ Failed to generate conversation name - using default');\n }\n } catch (error) {\n // Log timeout or other errors but don't disrupt user experience\n if (error instanceof Error && error.message.includes('timed out')) {\n console.warn('⏱️ Conversation naming timed out - conversation will keep default name');\n } else {\n console.error('❌ Error naming conversation:', error);\n }\n // Don't show error to user - naming failures should be silent\n }\n }\n\n /**\n * Marks a conversation detail as complete and records timestamp to prevent race conditions\n * Emits event to parent to refresh agent run data from database\n */\n private markMessageComplete(conversationDetail: MJConversationDetailEntity): void {\n const now = Date.now();\n this.completionTimestamps.set(conversationDetail.ID, now);\n\n // Unregister streaming callback for this message (no more updates needed)\n const callback = this.registeredCallbacks.get(conversationDetail.ID);\n if (callback) {\n this.streamingService.unregisterMessageCallback(conversationDetail.ID, callback);\n this.registeredCallbacks.delete(conversationDetail.ID);\n console.log(`[MarkComplete] Unregistered streaming callback for completed message ${conversationDetail.ID}`);\n }\n\n // Remove task from active tasks if it exists\n const task = this.activeTasks.getByConversationDetailId(conversationDetail.ID);\n if (task) {\n console.log(`✅ Task found for message ${conversationDetail.ID} - removing from active tasks:`, {\n taskId: task.id,\n agentName: task.agentName,\n conversationId: task.conversationId,\n conversationName: task.conversationName\n });\n\n this.activeTasks.remove(task.id);\n\n // Show toast only if the user isn't currently viewing this conversation.\n // If they're watching, the inline completion is sufficient.\n const isConvoVisible = UUIDsEqual(this.bridge.ActiveConversationID$.value, task.conversationId)\n && (this.bridge.OverlayActive$.value || this.bridge.WorkspaceActive$.value);\n if (!isConvoVisible) {\n MJNotificationService.Instance?.CreateSimpleNotification(\n `${task.agentName} completed in ${task.conversationName || 'conversation'}`,\n 'success',\n 3000\n );\n }\n } else {\n console.warn(`⚠️ No task found for completed message ${conversationDetail.ID} - task may have been removed prematurely or not added`);\n }\n\n // Emit completion event to parent so it can refresh agent run data\n this.messageComplete.emit({\n conversationDetailId: conversationDetail.ID,\n agentId: conversationDetail.AgentID || undefined\n });\n }\n\n /**\n * Cleans up completion timestamps for completed messages (prevents memory leak)\n */\n private cleanupCompletionTimestamp(conversationDetailId: string): void {\n // Keep timestamp for a short period to catch any late progress updates\n setTimeout(() => {\n this.completionTimestamps.delete(conversationDetailId);\n }, 5000); // 5 seconds should be more than enough\n }\n}\n","<div class=\"message-input-wrapper\">\n <!-- Processing Indicator Overlay -->\n @if (isProcessing) {\n <div class=\"processing-indicator\">\n <i class=\"fas fa-circle-notch fa-spin\"></i>\n <span>{{ processingMessage }}</span>\n </div>\n }\n\n <!-- Message Input Box -->\n <mj-message-input-box\n #inputBox\n [placeholder]=\"placeholder\"\n [disabled]=\"disabled || isProcessing\"\n [showCharacterCount]=\"false\"\n [enableMentions]=\"true\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n [currentUser]=\"currentUser\"\n [rows]=\"3\"\n [(value)]=\"messageText\"\n (textSubmitted)=\"onTextSubmitted($event)\"\n (attachmentsChanged)=\"onAttachmentsChanged($event)\"\n (attachmentError)=\"onAttachmentError($event)\">\n </mj-message-input-box>\n</div>"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-conversations",
3
- "version": "5.23.0",
3
+ "version": "5.24.0",
4
4
  "description": "MemberJunction: Conversation, Collection, and Artifact management components for any Angular application",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -29,28 +29,28 @@
29
29
  "@angular/router": "21.1.3"
30
30
  },
31
31
  "dependencies": {
32
- "@memberjunction/ng-ui-components": "5.23.0",
32
+ "@memberjunction/ng-ui-components": "5.24.0",
33
33
  "@angular/animations": "21.1.3",
34
34
  "@angular/cdk": "21.1.3",
35
- "@memberjunction/ai": "5.23.0",
36
- "@memberjunction/ai-agent-client": "5.23.0",
37
- "@memberjunction/ai-core-plus": "5.23.0",
38
- "@memberjunction/ai-engine-base": "5.23.0",
39
- "@memberjunction/ng-agent-client": "5.23.0",
40
- "@memberjunction/core": "5.23.0",
41
- "@memberjunction/core-entities": "5.23.0",
42
- "@memberjunction/global": "5.23.0",
43
- "@memberjunction/graphql-dataprovider": "5.23.0",
44
- "@memberjunction/ng-artifacts": "5.23.0",
45
- "@memberjunction/ng-base-types": "5.23.0",
46
- "@memberjunction/ng-code-editor": "5.23.0",
47
- "@memberjunction/ng-container-directives": "5.23.0",
48
- "@memberjunction/ng-forms": "5.23.0",
49
- "@memberjunction/ng-markdown": "5.23.0",
50
- "@memberjunction/ng-notifications": "5.23.0",
51
- "@memberjunction/ng-shared-generic": "5.23.0",
52
- "@memberjunction/ng-tasks": "5.23.0",
53
- "@memberjunction/ng-testing": "5.23.0",
35
+ "@memberjunction/ai": "5.24.0",
36
+ "@memberjunction/ai-agent-client": "5.24.0",
37
+ "@memberjunction/ai-core-plus": "5.24.0",
38
+ "@memberjunction/ai-engine-base": "5.24.0",
39
+ "@memberjunction/ng-agent-client": "5.24.0",
40
+ "@memberjunction/core": "5.24.0",
41
+ "@memberjunction/core-entities": "5.24.0",
42
+ "@memberjunction/global": "5.24.0",
43
+ "@memberjunction/graphql-dataprovider": "5.24.0",
44
+ "@memberjunction/ng-artifacts": "5.24.0",
45
+ "@memberjunction/ng-base-types": "5.24.0",
46
+ "@memberjunction/ng-code-editor": "5.24.0",
47
+ "@memberjunction/ng-container-directives": "5.24.0",
48
+ "@memberjunction/ng-forms": "5.24.0",
49
+ "@memberjunction/ng-markdown": "5.24.0",
50
+ "@memberjunction/ng-notifications": "5.24.0",
51
+ "@memberjunction/ng-shared-generic": "5.24.0",
52
+ "@memberjunction/ng-tasks": "5.24.0",
53
+ "@memberjunction/ng-testing": "5.24.0",
54
54
  "rxjs": "^7.8.2",
55
55
  "tslib": "^2.8.1"
56
56
  },