@memberjunction/ng-conversations 5.26.0 → 5.27.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-chat-area.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts","../../../../src/lib/components/conversation/conversation-chat-area.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, ViewChildren, QueryList, ElementRef, AfterViewChecked } from '@angular/core';\nimport { UserInfo, Metadata, CompositeKey, LogStatusEx, RunView } from '@memberjunction/core';\nimport { MJConversationEntity, MJConversationDetailEntity, MJAIAgentRunEntity, MJArtifactEntity, MJTaskEntity, ConversationEngine, ConversationDetailComplete, RatingJSON } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { AgentStateService } from '../../services/agent-state.service';\nimport { ConversationAgentService } from '../../services/conversation-agent.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { ArtifactPermissionService } from '../../services/artifact-permission.service';\nimport { ConversationAttachmentService } from '../../services/conversation-attachment.service';\nimport { MessageAttachment } from '../message/message-item.component';\nimport { LazyArtifactInfo } from '../../models/lazy-artifact-info';\nimport { MessageInputComponent } from '../message/message-input.component';\nimport { PendingAttachment } from '../mention/mention-editor.component';\nimport { ArtifactViewerPanelComponent, NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { ConversationEmptyStateComponent } from './conversation-empty-state.component';\nimport { TestFeedbackDialogData, TestFeedbackDialogResult } from '@memberjunction/ng-testing';\nimport { DialogService as ConversationsDialogService } from '../../services/dialog.service';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ConversationStreamingService } from '../../services/conversation-streaming.service';\nimport { ConversationBridgeService } from '../../services/conversation-bridge.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/** Default width (percentage) for the artifact viewer pane */\nconst DEFAULT_ARTIFACT_PANE_WIDTH = 40;\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-chat-area',\n templateUrl: `./conversation-chat-area.component.html`,\n styleUrls: ['./conversation-chat-area.component.css']\n})\nexport class ConversationChatAreaComponent implements OnInit, OnDestroy, AfterViewChecked {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n // LOCAL STATE INPUTS - passed from parent workspace\n private _conversationId: string | null = null;\n @Input()\n set conversationId(value: string | null) {\n if (value !== this._conversationId) {\n this._conversationId = value;\n // Trigger change handler after initialization is complete\n // Only skip during Angular's initial binding before ngOnInit completes\n if (this.isInitialized) {\n this.onConversationChanged(value);\n }\n }\n }\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n @Input() conversation: MJConversationEntity | null = null;\n @Input() threadId: string | null = null;\n\n private _isNewConversation: boolean = false;\n @Input()\n set isNewConversation(value: boolean) {\n this._isNewConversation = value;\n if (value) {\n this.focusEmptyStateInput();\n }\n }\n get isNewConversation(): boolean {\n return this._isNewConversation;\n }\n\n // Using getter/setter to ensure correct type handling\n private _pendingMessage: string | null = null;\n @Input()\n set pendingMessage(value: string | null) {\n // Handle case where an object is incorrectly passed\n if (value && typeof value === 'object' && 'text' in value) {\n this._pendingMessage = (value as { text: string }).text;\n } else {\n this._pendingMessage = value;\n }\n }\n get pendingMessage(): string | null {\n return this._pendingMessage;\n }\n\n // Using getter/setter to ensure reactivity\n private _pendingAttachments: PendingAttachment[] | null = null;\n @Input()\n set pendingAttachments(value: PendingAttachment[] | null) {\n this._pendingAttachments = value;\n }\n get pendingAttachments(): PendingAttachment[] | null {\n return this._pendingAttachments;\n }\n\n @Input() pendingArtifactId: string | null = null;\n @Input() pendingArtifactVersionNumber: number | null = null;\n\n /** When true, the component is rendered inside the floating overlay (hides suggested topics, etc.) */\n @Input() overlayMode: boolean = false;\n\n /** Show the Export button in the conversation header. Default true. */\n @Input() showExportButton: boolean = true;\n\n /** Show the Share button in the conversation header. Default true. */\n @Input() showShareButton: boolean = true;\n\n /** Show the artifact count indicator in the conversation header. Default true. */\n @Input() showArtifactIndicator: boolean = true;\n\n /** Application context snapshot for AI agent awareness. Included in agent execution data. */\n @Input() appContext: Record<string, unknown> | null = null;\n\n /** Greeting message shown in the empty state when no conversation is active */\n @Input() emptyStateGreeting: string = 'How can I help you?';\n\n // Sidebar toggle - when true, shows toggle button in header to expand sidebar\n @Input() showSidebarToggle: boolean = false;\n\n @Output() conversationRenamed = new EventEmitter<{conversationId: string; name: string; description: string}>();\n @Output() openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() navigationRequest = new EventEmitter<NavigationRequest>();\n @Output() taskClicked = new EventEmitter<MJTaskEntity>();\n @Output() artifactLinkClicked = new EventEmitter<{type: 'conversation' | 'collection'; id: string}>();\n @Output() sidebarToggleClicked = new EventEmitter<void>();\n\n // STATE CHANGE OUTPUTS - notify parent of state changes\n // conversationCreated now includes pendingMessage and pendingAttachments to ensure atomic state update\n @Output() conversationCreated = new EventEmitter<{\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }>();\n @Output() threadOpened = new EventEmitter<string>();\n @Output() threadClosed = new EventEmitter<void>();\n @Output() pendingArtifactConsumed = new EventEmitter<void>();\n @Output() pendingMessageConsumed = new EventEmitter<void>();\n // pendingMessageRequested is deprecated - use conversationCreated with pendingMessage instead\n @Output() pendingMessageRequested = new EventEmitter<{text: string; attachments: PendingAttachment[]}>();\n\n @ViewChild('scrollContainer') private scrollContainer!: ElementRef;\n @ViewChildren('messageInput') private messageInputComponents!: QueryList<MessageInputComponent>;\n @ViewChild(ArtifactViewerPanelComponent) private artifactViewerComponent?: ArtifactViewerPanelComponent;\n @ViewChild(ConversationEmptyStateComponent) private emptyStateComponent?: ConversationEmptyStateComponent;\n\n public messages: MJConversationDetailEntity[] = [];\n public showScrollToBottomIcon = false;\n private scrollToBottom = false;\n private lastLoadedConversationId: string | null = null; // Track which conversation's peripheral data was loaded\n private currentlyLoadingConversationId: string | null = null; // Track which conversation is currently being loaded\n public isProcessing: boolean = false;\n private intentCheckMessage: MJConversationDetailEntity | null = null; // Temporary message shown during intent checking\n public isLoadingConversation: boolean = false; // Set to true only when actively loading conversation data\n\n // User avatar map derived from engine cache\n public userAvatarMap: Map<string, {imageUrl: string | null; iconClass: string | null}> = new Map();\n public memberCount: number = 1;\n public artifactCount: number = 0;\n public artifactCountDisplay: number = 0;\n public isShared: boolean = false;\n public showExportModal: boolean = false;\n public showAgentPanel: boolean = false;\n public showMembersModal: boolean = false;\n public showProjectSelector: boolean = false;\n public showArtifactPanel: boolean = false;\n public showArtifactsModal: boolean = false;\n public showSystemArtifacts: boolean = false; // Toggle for showing system-only artifacts\n public selectedArtifactId: string | null = null;\n public selectedVersionNumber: number | undefined = undefined; // Version to show in artifact viewer\n public artifactPaneWidth: number = DEFAULT_ARTIFACT_PANE_WIDTH;\n public isArtifactPaneMaximized: boolean = false; // Track maximize state\n private artifactPaneWidthBeforeMaximize: number = DEFAULT_ARTIFACT_PANE_WIDTH;\n public expandedArtifactId: string | null = null; // Track which artifact card is expanded in modal\n public showCollectionPicker: boolean = false;\n public collectionPickerArtifactId: string | null = null;\n public collectionPickerExcludedIds: string[] = [];\n\n // Artifact permissions\n public canShareSelectedArtifact: boolean = false;\n public canEditSelectedArtifact: boolean = false;\n\n // Share modal state\n public isArtifactShareModalOpen: boolean = false;\n public artifactToShare: MJArtifactEntity | null = null;\n\n\n // Artifact mapping: ConversationDetailID -> Array of LazyArtifactInfo\n // Uses lazy-loading pattern: display data loaded immediately, full entities on-demand\n // Supports multiple artifacts per conversation detail (0-N relationship)\n public artifactsByDetailId = new Map<string, LazyArtifactInfo[]>();\n\n // System artifacts mapping: ConversationDetailID -> Array of LazyArtifactInfo (Visibility='System Only')\n // Kept separate so we can toggle their display without reloading\n // Made public so it can be passed to MessageInputComponent for payload loading\n public systemArtifactsByDetailId = new Map<string, LazyArtifactInfo[]>();\n\n // Cached combined artifacts map - updated when toggle changes\n private _combinedArtifactsMap: Map<string, LazyArtifactInfo[]> | null = null;\n\n // Agent run mapping: ConversationDetailID -> MJAIAgentRunEntityExtended\n // Loaded once per conversation and kept in sync as new runs are created\n public agentRunsByDetailId = new Map<string, MJAIAgentRunEntityExtended>();\n\n /**\n * Ratings by conversation detail ID (parsed from RatingsJSON)\n */\n public ratingsByDetailId = new Map<string, RatingJSON[]>();\n\n /**\n * Attachments by conversation detail ID (loaded from ConversationDetailAttachments)\n */\n public attachmentsByDetailId = new Map<string, MessageAttachment[]>();\n\n /**\n * In-progress message IDs for streaming reconnection\n * Passed to message-input component to reconnect PubSub updates\n */\n public inProgressMessageIds: string[] = [];\n\n // Subject for cleanup on destroy\n private destroy$ = new Subject<void>();\n\n // Cache of message-input metadata for rendering multiple instances\n // Prevents destruction/recreation when switching conversations for performance\n private messageInputMetadataCache = new Map<string, {conversationId: string; conversationName: string | null}>();\n\n // Empty collections for hidden message-input components\n public readonly emptyArtifactsMap = new Map<string, LazyArtifactInfo[]>();\n public readonly emptyAgentRunsMap = new Map<string, MJAIAgentRunEntityExtended>();\n public readonly emptyInProgressIds: string[] = [];\n\n // Loading state for peripheral data\n public isLoadingPeripheralData: boolean = false;\n\n // Subject to trigger artifact viewer refresh when new version is created\n public artifactViewerRefresh$ = new Subject<{artifactId: string; versionNumber: number}>();\n\n // Track initialization state to prevent loading messages before agents are ready\n private isInitialized: boolean = false;\n\n // Track whether we had active agents on the current conversation's last poll cycle.\n // Used to detect when polling transitions from active → no active agents (completion via poll).\n private hadActiveAgents: boolean = false;\n\n // Resize state\n private isResizing: boolean = false;\n private startX: number = 0;\n private startWidth: number = 0;\n\n // LocalStorage key\n private readonly ARTIFACT_PANE_WIDTH_KEY = 'mj-conversations-artifact-pane-width';\n\n // Pinned messages panel state\n public showPinsPanel: boolean = false;\n\n /** All currently pinned messages in the active conversation, newest pin first */\n get pinnedMessages(): MJConversationDetailEntity[] {\n return this.messages.filter(m => m.IsPinned).reverse();\n }\n\n // Test feedback dialog state\n public showTestFeedbackDialog: boolean = false;\n public testFeedbackDialogData: TestFeedbackDialogData | null = null;\n\n // Image viewer state\n public showImageViewer: boolean = false;\n public selectedImageUrl: string = '';\n public selectedImageAlt: string = '';\n public selectedImageFileName: string = '';\n\n // Upload indicator state (shown centered in conversation area)\n public isUploadingAttachments: boolean = false;\n public uploadingMessage: string = '';\n\n // Artifact picker state\n public showArtifactPickerPanel: boolean = false;\n public artifactPickerItems: Array<{\n artifactId: string; artifactVersionId: string; name: string; description: string;\n contentMode: string; fileID: string | null; mimeType: string | null;\n fileName: string | null; sizeBytes: number; typeName: string; updatedAt: string;\n }> = [];\n public isLoadingArtifactPicker: boolean = false;\n\n // Attachment support based on agent modalities\n // Computed from conversation manager (Sage) and any previous agent in conversation\n public enableAttachments: boolean = false;\n public maxAttachments: number = 10;\n public maxAttachmentSizeBytes: number = 20 * 1024 * 1024; // 20MB default\n public acceptedFileTypes: string = 'image/*';\n private conversationManagerAgent: MJAIAgentEntityExtended | null = null;\n\n private engine = ConversationEngine.Instance;\n\n\n constructor(\n private agentStateService: AgentStateService,\n private conversationAgentService: ConversationAgentService,\n private activeTasks: ActiveTasksService,\n private cdr: ChangeDetectorRef,\n private mentionAutocompleteService: MentionAutocompleteService,\n private artifactPermissionService: ArtifactPermissionService,\n private attachmentService: ConversationAttachmentService,\n private streamingService: ConversationStreamingService,\n private confirmDialog: ConversationsDialogService,\n private bridge: ConversationBridgeService\n ) {}\n\n async ngOnInit() {\n // The workspace component initializes AI Engine and mention service before\n // any child components render, so we can safely skip duplicate initialization.\n // This prevents race conditions and ensures agents are fully loaded.\n\n // Fallback: If workspace didn't initialize (shouldn't happen), initialize now\n if (!this.mentionAutocompleteService['isInitialized']) {\n console.warn('⚠️ Mention autocomplete not initialized by workspace, initializing now...');\n await this.mentionAutocompleteService.initialize(this.currentUser);\n }\n\n // Ensure ConversationEngine and ArtifactMetadataEngine are loaded.\n // Config(false) is a no-op if already loaded by another component.\n // ConversationEngine.Config() also initializes ArtifactMetadataEngine internally.\n await ConversationEngine.Instance.Config(false, this.currentUser);\n\n // Initialize attachment support based on agent modalities\n await this.initializeAttachmentSupport();\n\n // Load saved artifact pane width\n this.loadArtifactPaneWidth();\n\n // Mark as initialized so setter can trigger conversation changes\n this.isInitialized = true;\n\n // Initial load if there's already an active conversation\n if (this.conversationId) {\n await this.onConversationChanged(this.conversationId);\n }\n\n // Setup resize listeners\n window.addEventListener('mousemove', this.onResizeMove.bind(this));\n window.addEventListener('mouseup', this.onResizeEnd.bind(this));\n window.addEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.addEventListener('touchend', this.onResizeTouchEnd.bind(this));\n\n // Handle overlay→workspace handoffs: if the handed-off conversation is already\n // loaded, force a reload from the engine (which has the latest data).\n this.bridge.SwitchEvent$\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n if (event.Target === 'workspace' && event.ConversationID) {\n if (UUIDsEqual(event.ConversationID, this._conversationId)) {\n // Same conversation already displayed — reload from engine\n this.lastLoadedConversationId = null; // Reset so peripheral data reprocesses\n void this.onConversationChanged(event.ConversationID);\n }\n // Different conversation — engine cache is already warm, onConversationChanged\n // will read from it when the parent sets the conversationId input.\n }\n });\n\n // Subscribe to completion events from PubSub\n this.streamingService.completionEvents$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async (event) => {\n // Find the message in our current conversation\n const message = this.messages.find(m => UUIDsEqual(m.ID, event.conversationDetailId));\n if (message) {\n await this.handleMessageCompletion(message, event.agentRunId);\n }\n });\n\n // Subscribe to polling-based agent state as a secondary fallback for completion detection.\n // The sessionId is persisted in localStorage and reused on refresh, so WebSocket events\n // normally arrive correctly. However, there's a brief timing gap between page load and\n // WebSocket reconnection where events can be lost. The catch-up check in\n // detectAndReconcileAgentRuns() is the primary fallback; polling is the last resort.\n this.agentStateService.activeAgents$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async (agents) => {\n if (!this.conversationId) return;\n const conversationAgents = agents.filter(a => UUIDsEqual(a.run.ConversationID, this.conversationId));\n const hasActiveAgents = conversationAgents.length > 0;\n if (this.hadActiveAgents && !hasActiveAgents) {\n // Agents just completed — surgical refresh picks up new messages,\n // updated agent runs, and new artifacts in one query with minimal UI repaint\n await this.engine.RefreshConversationDetails(this.conversationId, this.currentUser);\n\n // Re-read messages from the surgically updated engine cache\n const freshDetails = this.engine.GetCachedDetails(this.conversationId);\n if (freshDetails) {\n this.messages = freshDetails;\n }\n\n // Reprocess peripheral data (artifacts, ratings) from updated cache\n this.lastLoadedConversationId = null;\n await this.loadPeripheralData(this.conversationId);\n\n // Clear active tasks for messages that are no longer in-progress\n for (const message of this.messages) {\n if (message.Status !== 'In-Progress') {\n const task = this.activeTasks.getByConversationDetailId(message.ID);\n if (task) {\n this.activeTasks.remove(task.id);\n }\n }\n }\n\n this.cdr.detectChanges();\n }\n this.hadActiveAgents = hasActiveAgents;\n });\n }\n\n /**\n * Initializes attachment support by checking if the conversation manager agent (Sage)\n * or any recent agent in the conversation supports non-text input modalities.\n */\n private async initializeAttachmentSupport(): Promise<void> {\n try {\n // Ensure AIEngineBase is configured with modality data\n await AIEngineBase.Instance.Config(false);\n\n // Get the conversation manager agent (Sage)\n this.conversationManagerAgent = await this.conversationAgentService.getConversationManagerAgent();\n\n if (this.conversationManagerAgent?.ID) {\n // Get attachment limits from agent metadata (uses Agent → Model → System → Default cascade)\n const limits = AIEngineBase.Instance.GetAgentAttachmentLimits(this.conversationManagerAgent.ID);\n this.enableAttachments = limits.enabled;\n this.maxAttachments = limits.maxAttachments;\n this.maxAttachmentSizeBytes = limits.maxAttachmentSizeBytes;\n this.acceptedFileTypes = limits.acceptedFileTypes;\n LogStatusEx({message: `Attachment support initialized: ${this.enableAttachments} (max ${this.maxAttachments}, ${(this.maxAttachmentSizeBytes / 1024 / 1024).toFixed(0)}MB)`, verboseOnly: true});\n } else {\n // Default to false if we can't determine\n this.enableAttachments = false;\n LogStatusEx({message: 'Attachment support disabled: conversation manager agent not available', verboseOnly: true});\n }\n } catch (error) {\n console.warn('Failed to initialize attachment support:', error);\n this.enableAttachments = false;\n }\n }\n\n /**\n * Updates attachment support based on the current conversation context.\n * Called when conversation changes to check if any agent in the conversation supports attachments.\n */\n private updateAttachmentSupport(): void {\n // Determine which agent to use for limits - prefer last non-Sage agent, fall back to Sage\n let agentIdForLimits = this.conversationManagerAgent?.ID || null;\n\n // Check if any previous non-Sage agent in the conversation supports attachments\n if (this.messages.length > 0) {\n const lastNonSageAgent = this.messages\n .slice()\n .reverse()\n .find(msg =>\n msg.Role === 'AI' &&\n msg.AgentID &&\n !UUIDsEqual(msg.AgentID, this.conversationManagerAgent?.ID)\n );\n\n if (lastNonSageAgent?.AgentID) {\n // Check if this agent supports attachments\n if (AIEngineBase.Instance.AgentSupportsAttachments(lastNonSageAgent.AgentID)) {\n agentIdForLimits = lastNonSageAgent.AgentID;\n }\n }\n }\n\n // Get limits from the determined agent\n if (agentIdForLimits) {\n const limits = AIEngineBase.Instance.GetAgentAttachmentLimits(agentIdForLimits);\n this.enableAttachments = limits.enabled;\n this.maxAttachments = limits.maxAttachments;\n this.maxAttachmentSizeBytes = limits.maxAttachmentSizeBytes;\n this.acceptedFileTypes = limits.acceptedFileTypes;\n } else {\n this.enableAttachments = false;\n }\n }\n\n ngAfterViewChecked() {\n if (this.scrollToBottom) {\n this.scrollToBottom = false;\n setTimeout(() => {\n this.scrollToBottomNow();\n // Check scroll state after scrolling to bottom\n this.checkScroll();\n }, 100);\n }\n // Removed synchronous checkScroll() from else branch to prevent\n // ExpressionChangedAfterItHasBeenCheckedError. Calling detectChanges()\n // inside ngAfterViewChecked re-enters change detection and causes\n // Angular's verification pass to see inconsistent state.\n // Scroll icon visibility is still updated via:\n // 1. (scroll)=\"checkScroll()\" on the scroll container (user scroll events)\n // 2. setTimeout callback above (after programmatic scroll-to-bottom)\n }\n\n ngOnDestroy() {\n // Stop polling when component is destroyed\n this.agentStateService.stopPolling();\n\n // Complete destroy subject to cleanup subscriptions\n this.destroy$.next();\n this.destroy$.complete();\n\n // Remove resize listeners\n window.removeEventListener('mousemove', this.onResizeMove.bind(this));\n window.removeEventListener('mouseup', this.onResizeEnd.bind(this));\n window.removeEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.removeEventListener('touchend', this.onResizeTouchEnd.bind(this));\n }\n\n private async onConversationChanged(conversationId: string | null): Promise<void> {\n // Prevent double-loading if we're already loading this same conversation\n // (ngDoCheck can fire multiple times during state changes)\n if (this.currentlyLoadingConversationId === conversationId && conversationId !== null) {\n return;\n }\n\n // Do NOT clear activeTasks - they are workspace-level and persist across conversations\n // Clearing causes bugs: global tasks panel blanks out, no notifications when switching\n\n this.showArtifactPanel = false;\n this.selectedArtifactId = null;\n // Reset maximize state so it doesn't carry over to the next conversation\n this.isArtifactPaneMaximized = false;\n this.artifactPaneWidth = DEFAULT_ARTIFACT_PANE_WIDTH; // restore default width\n\n // Reset poll-based completion tracking whenever we switch conversations,\n // so the first empty poll on the new conversation doesn't trigger a spurious reload.\n this.hadActiveAgents = false;\n\n if (conversationId) {\n this.currentlyLoadingConversationId = conversationId;\n\n if (!this.messageInputMetadataCache.has(conversationId)) {\n this.messageInputMetadataCache.set(conversationId, {\n conversationId: conversationId,\n conversationName: this.conversation?.Name || null\n });\n }\n\n // Only show loading spinner if the engine doesn't have cached data for this conversation.\n // This prevents the \"no messages\" flash when switching between conversations.\n const hasCachedMessages = this.engine.HasCachedDetails(conversationId);\n if (!hasCachedMessages) {\n this.isLoadingConversation = true;\n this.messages = [];\n this.cdr.detectChanges();\n }\n\n try {\n await this.loadMessages(conversationId);\n await this.restoreActiveTasks(conversationId);\n // TODO: Replace polling with PubSub - see plans/repair-conversations-ui-performance.md\n this.agentStateService.startPolling(this.currentUser, conversationId);\n } catch (error) {\n console.error('Error loading conversation:', error);\n this.messages = [];\n } finally {\n this.currentlyLoadingConversationId = null;\n this.isLoadingConversation = false;\n\n // Create new array reference to trigger Angular change detection\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n\n // Defensive fallback: force another change detection cycle after async ops complete\n setTimeout(() => {\n if (conversationId === this._conversationId && this.messages.length > 0) {\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n }\n }, 50);\n }\n } else {\n // No active conversation - show empty state\n this.messages = [];\n this.isLoadingConversation = false;\n this.currentlyLoadingConversationId = null;\n this.agentStateService.stopPolling();\n }\n }\n\n /**\n * Returns array of cached message-input metadata for rendering\n * This allows multiple message-input components to exist simultaneously (hidden)\n * preserving their state when switching conversations\n */\n public getCachedInputs(): Array<{conversationId: string; conversationName: string | null}> {\n return Array.from(this.messageInputMetadataCache.values());\n }\n\n /**\n * Focus the message input inside the empty state component.\n * Uses a delay to allow Angular to render the empty state if it's being created.\n */\n private focusEmptyStateInput(): void {\n setTimeout(() => {\n if (this.emptyStateComponent) {\n this.emptyStateComponent.FocusInput();\n }\n }, 150);\n }\n\n /**\n * Get the message input component for the current conversation.\n * Since we cache multiple message-input instances (one per visited conversation),\n * we need to find the one that matches the current conversationId.\n */\n private getActiveMessageInputComponent(): MessageInputComponent | undefined {\n if (!this.messageInputComponents || !this.conversationId) {\n return undefined;\n }\n return this.messageInputComponents.find(\n component => component.conversationId === this.conversationId\n );\n }\n\n private async loadMessages(conversationId: string): Promise<void> {\n try {\n // Single source of truth: ConversationEngine handles caching and DB queries.\n // Cache hit = instant (no DB). Cache miss = one GetConversationComplete query.\n // If peripheral data (artifacts/ratings) changed externally, force refresh to pick up joined fields.\n const existingEntry = this.engine.GetCachedDetailEntry(conversationId);\n const forceRefresh = existingEntry?.PeripheralDataStale === true;\n const cacheEntry = await this.engine.LoadConversationDetails(conversationId, this.currentUser, forceRefresh);\n\n // Set messages from engine cache\n this.messages = cacheEntry.Details;\n\n // Copy user avatars from engine cache\n this.userAvatarMap.clear();\n for (const [userId, avatar] of cacheEntry.UserAvatars) {\n this.userAvatarMap.set(userId, {\n imageUrl: avatar.ImageURL,\n iconClass: avatar.IconClass\n });\n }\n\n this.updateAttachmentSupport();\n\n // Detect in-progress messages for streaming reconnection\n this.inProgressMessageIds = [...this.messages\n .filter(m => m.Status === 'In-Progress')\n .map(m => m.ID)];\n\n if (this.inProgressMessageIds.length > 0) {\n LogStatusEx({message: `🔌 Detected ${this.inProgressMessageIds.length} in-progress messages for reconnection`, verboseOnly: true});\n }\n\n // Check for missed completions (user navigated away, agent completed, user returned)\n for (const message of this.messages) {\n if (message.Status === 'In-Progress' && message.ID) {\n const recentCompletion = this.streamingService.getRecentCompletion(message.ID);\n if (recentCompletion) {\n LogStatusEx({message: `📥 Found missed completion for message ${message.ID}, handling...`, verboseOnly: true});\n this.handleMessageCompletion(message, recentCompletion.agentRunId);\n this.streamingService.clearRecentCompletion(message.ID);\n }\n }\n }\n\n this.scrollToBottom = true;\n\n // Process peripheral data (agent runs, artifacts, ratings, attachments) from engine cache\n await this.loadPeripheralData(conversationId);\n\n await this.detectAndReconcileAgentRuns(conversationId);\n await this.handlePendingArtifactNavigation();\n\n } catch (error) {\n console.error('Error loading messages:', error);\n this.messages = [];\n }\n }\n\n\n /**\n * Process peripheral data (agent runs and artifacts) from cached conversation data\n * Parses JSON columns and builds maps for display\n *\n * PERFORMANCE OPTIMIZATION: Uses cached data instead of querying\n * - Data already loaded by loadMessages() - no additional queries needed\n * - Processes cached JSON data to build display maps\n * - Instant when switching between conversations\n */\n private async loadPeripheralData(conversationId: string): Promise<void> {\n // Skip if we've already processed peripheral data for this conversation\n if (this.lastLoadedConversationId === conversationId) {\n return;\n }\n\n this.lastLoadedConversationId = conversationId;\n\n try {\n // Read from engine cache — always present after loadMessages() calls LoadConversationDetails()\n const cacheEntry = this.engine.GetCachedDetailEntry(conversationId);\n if (!cacheEntry) {\n console.warn(`No engine cache found for conversation ${conversationId}`);\n return;\n }\n\n // Clear and rebuild component maps from engine cache\n this.agentRunsByDetailId.clear();\n this.artifactsByDetailId.clear();\n this.systemArtifactsByDetailId.clear();\n this.ratingsByDetailId.clear();\n\n // Copy agent runs from engine (cast to extended type for UI compatibility)\n for (const [detailId, agentRun] of cacheEntry.AgentRunsByDetailId) {\n this.agentRunsByDetailId.set(detailId, agentRun as MJAIAgentRunEntityExtended);\n }\n\n // Convert ArtifactJSON[] from engine cache into LazyArtifactInfo[] for UI\n for (const [detailId, artifacts] of cacheEntry.ArtifactsByDetailId) {\n const artifactList: LazyArtifactInfo[] = [];\n const systemArtifactList: LazyArtifactInfo[] = [];\n\n for (const artifactData of artifacts) {\n const lazyInfo = new LazyArtifactInfo(artifactData, this.currentUser);\n if (artifactData.Visibility === 'System Only') {\n systemArtifactList.push(lazyInfo);\n } else {\n artifactList.push(lazyInfo);\n }\n }\n\n if (artifactList.length > 0) {\n this.artifactsByDetailId.set(detailId, artifactList);\n }\n if (systemArtifactList.length > 0) {\n this.systemArtifactsByDetailId.set(detailId, systemArtifactList);\n }\n }\n\n // Copy ratings from engine cache\n for (const [detailId, ratings] of cacheEntry.RatingsByDetailId) {\n this.ratingsByDetailId.set(detailId, ratings);\n }\n\n // Load attachments (still separate — not part of GetConversationComplete query)\n this.attachmentsByDetailId.clear();\n const messageIds = cacheEntry.Details.map(d => d.ID).filter((id): id is string => !!id);\n if (messageIds.length > 0) {\n const attachmentsMap = await this.attachmentService.loadAttachmentsForMessages(messageIds, this.currentUser);\n for (const [detailId, attachments] of attachmentsMap) {\n this.attachmentsByDetailId.set(detailId, attachments);\n }\n }\n\n // Create new Map references to trigger Angular change detection\n this.agentRunsByDetailId = new Map(this.agentRunsByDetailId);\n this.artifactsByDetailId = new Map(this.artifactsByDetailId);\n this.ratingsByDetailId = new Map(this.ratingsByDetailId);\n this.systemArtifactsByDetailId = new Map(this.systemArtifactsByDetailId);\n this.attachmentsByDetailId = new Map(this.attachmentsByDetailId);\n\n // Clear combined cache since we loaded new artifacts\n this._combinedArtifactsMap = null;\n\n // Update artifact count for header display\n this.artifactCount = this.calculateUniqueArtifactCount();\n this.updateArtifactCountDisplay();\n\n // Trigger message re-render now that peripheral data is loaded\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to process peripheral data:', error);\n this.lastLoadedConversationId = null;\n }\n }\n\n /**\n * REMOVED: Active tasks should only track currently-running tasks in this browser session.\n * Database tasks with 'In-Progress' status are shown in the Tasks dropdown via loadDatabaseTasks().\n * Restoring them here causes duplicate \"Agent Processing...\" entries.\n */\n private async restoreActiveTasks(conversationId: string): Promise<void> {\n // Intentionally empty - ActiveTasksService only tracks in-memory running tasks\n // Database tasks are loaded separately by TasksDropdownComponent\n }\n\n async onMessageSent(message: MJConversationDetailEntity): Promise<void> {\n // Guard: ignore events from hidden message-input instances belonging to other conversations.\n // Multiple inputs are kept alive in the DOM cache (one per visited conversation) and all\n // emit events to this single parent. Without this check, a background agent's response\n // for conversation A would pollute conversation B's message list.\n if (!UUIDsEqual(message.ConversationID, this.conversationId)) {\n // Invalidate that conversation's cache so fresh data loads when the user switches back\n if (message.ConversationID) {\n this.resetComponentState(message.ConversationID);\n }\n return;\n }\n\n // Clear pending message if it was sent - notify parent via output\n if (this.pendingMessage) {\n this.pendingMessageConsumed.emit();\n }\n\n // Check if message already exists in the array (by ID) to prevent duplicates\n // Messages can be emitted multiple times as they're updated (e.g., status changes)\n const existingIndex = this.messages.findIndex(m => UUIDsEqual(m.ID, message.ID));\n\n if (existingIndex >= 0) {\n // Update existing message in place (replace with updated version)\n this.messages = [\n ...this.messages.slice(0, existingIndex),\n message,\n ...this.messages.slice(existingIndex + 1)\n ];\n } else {\n // Add new message to the list\n this.messages = [...this.messages, message];\n\n // Ensure current user is in the avatar map for new messages\n this.ensureCurrentUserInAvatarMap();\n\n // Invalidate cache when new message is added.\n // Without this, navigating away and back would load stale cached data\n // that doesn't include this new message.\n if (this.conversationId) {\n this.resetComponentState(this.conversationId);\n }\n\n // Load attachments for the new message (if any were saved with it)\n // This ensures attachments are displayed immediately after sending\n await this.loadAttachmentsForMessage(message.ID);\n\n // CRITICAL: If this is a new In-Progress AI message, add it to inProgressMessageIds\n // immediately so message-input registers a PubSub streaming callback for it.\n // buildMessagesFromCache handles the nav-away/nav-back reconnection case;\n // this handles the active-session case where the agent just started.\n // Without this, inProgressMessageIds stays [] and the completion event is never received.\n if (message.Status === 'In-Progress' && message.ID && !this.inProgressMessageIds.includes(message.ID)) {\n this.inProgressMessageIds = [...this.inProgressMessageIds, message.ID];\n }\n }\n\n // Scroll to bottom when new message is sent\n this.scrollToBottom = true;\n\n // Force change detection — zone.js 0.15 no longer patches graphql-ws WebSocket callbacks,\n // so progress updates that arrive via PubSub run outside Angular's zone. Without this,\n // the UI does not update when the messages array is modified from a streaming callback.\n this.cdr.detectChanges();\n }\n\n /**\n * Loads attachments for a single message and adds them to the attachmentsByDetailId map.\n * Called after a new message is sent to ensure attachments are displayed immediately.\n */\n private async loadAttachmentsForMessage(messageId: string): Promise<void> {\n try {\n const attachments = await this.attachmentService.loadAttachmentsForMessage(messageId, this.currentUser);\n if (attachments.length > 0) {\n this.attachmentsByDetailId.set(messageId, attachments);\n // Create new map reference to trigger Angular change detection\n this.attachmentsByDetailId = new Map(this.attachmentsByDetailId);\n LogStatusEx({message: `Loaded ${attachments.length} attachment(s) for message ${messageId}`, verboseOnly: true});\n }\n } catch (error) {\n console.warn('Failed to load attachments for message:', error);\n }\n }\n\n /**\n * Ensures the current user is in the avatar map\n * Called when new messages are created to ensure avatar data is available\n */\n private async ensureCurrentUserInAvatarMap(): Promise<void> {\n const userId = this.currentUser.ID;\n\n // If user already in map, skip\n if (this.userAvatarMap.has(userId)) {\n return;\n }\n\n // Load the current user's avatar data\n const md = new Metadata();\n const userEntity = await md.GetEntityObject<any>('MJ: Users');\n await userEntity.Load(userId);\n\n this.userAvatarMap.set(userId, {\n imageUrl: userEntity.UserImageURL || null,\n iconClass: userEntity.UserImageIconClass || null\n });\n\n LogStatusEx({message: `👤 Added current user to avatar map`, verboseOnly: true});\n }\n\n /**\n * Handle agent run detected event from progress updates\n * This is called when the first progress update arrives with an agent run ID\n */\n async onAgentRunDetected(event: {conversationDetailId: string; agentRunId: string}): Promise<void> {\n await this.addAgentRunToMap(event.conversationDetailId, event.agentRunId);\n }\n\n /**\n * Handle message completion event from message-input\n * Refreshes the agent run data in-place to get final status and timestamps\n * Also reloads attachments created during agent execution (e.g., generated images)\n */\n async onMessageComplete(event: {conversationDetailId: string; agentId?: string}): Promise<void> {\n // Get existing agent run from map\n const existingAgentRun = this.agentRunsByDetailId.get(event.conversationDetailId);\n\n if (existingAgentRun?.ID) {\n // Refresh the SAME object by calling Load() - preserves all references\n // duck type check to see if we have a BaseEntity or not\n if (!!existingAgentRun.Load) {\n await existingAgentRun.Load(existingAgentRun.ID); \n }\n else {\n // we do NOT have an existingAgentRun base entity, but rather a simple JSON object so we need to create an object here\n const md = new Metadata();\n const newEntity = await md.GetEntityObject<MJAIAgentRunEntityExtended>('MJ: AI Agent Runs');\n newEntity.LoadFromData(existingAgentRun);\n // swap the map entry to have this object now\n this.agentRunsByDetailId.set(event.conversationDetailId, newEntity);\n\n // Also update ConversationEngine's cache\n if (this.conversationId) {\n ConversationEngine.Instance.SetAgentRunForDetail(this.conversationId, event.conversationDetailId, newEntity);\n }\n }\n\n // Trigger re-render to show updated status\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n }\n\n // Reload attachments for this message to pick up newly created media attachments\n // (e.g., images generated by agent via Generate Image action)\n // This must be done after agent completion because attachments are created by AgentRunner\n // after the agent execution finishes\n await this.loadAttachmentsForMessage(event.conversationDetailId);\n\n // Trigger change detection after async attachment loading to ensure UI updates\n this.cdr.detectChanges();\n }\n\n /**\n * Handle agent run update event from progress updates\n * This is called on EVERY progress update with the full, live agent run object\n * Provides real-time updates of status, timestamps, tokens, cost during execution\n */\n async onAgentRunUpdate(event: {conversationDetailId: string; agentRun?: MJAIAgentRunEntityExtended, agentRunId?: string}): Promise<void> {\n if (event.agentRun) {\n // Directly update map with fresh data from progress (no database query needed)\n // Don't create new Map - message-list component needs to keep the same reference\n this.agentRunsByDetailId.set(event.conversationDetailId, event.agentRun);\n\n // Also update ConversationEngine's cache for other consumers\n if (this.conversationId) {\n ConversationEngine.Instance.SetAgentRunForDetail(this.conversationId, event.conversationDetailId, event.agentRun);\n }\n }\n else {\n // no agent run, should have agentRunId\n await this.addAgentRunToMap(event.conversationDetailId, event.agentRunId!);\n }\n\n // Force message list to re-render with updated agent run\n // This ensures message components receive the fresh agent run data\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n }\n\n /**\n * Public entry point to reload messages in the active conversation.\n * Called by the parent resource wrapper when the user clicks the Refresh button,\n * so that new agent responses are visible without a full page reload.\n */\n public async reloadMessages(): Promise<void> {\n await this.reloadMessagesForActiveConversation();\n }\n\n /**\n * Reload messages from the ConversationEngine cache (no DB round-trip).\n * The engine cache is kept warm by entity event handlers that auto-sync on save/delete.\n * Called when agent completion is detected to discover newly delegated agent messages.\n */\n private async reloadMessagesForActiveConversation(): Promise<void> {\n const conversationId = this.conversationId;\n if (!conversationId) {\n return;\n }\n\n try {\n // Read from engine cache — already warm from entity event handler auto-sync\n const engineDetails = this.engine.GetCachedDetails(conversationId);\n if (!engineDetails || engineDetails.length === 0) {\n return;\n }\n\n // Track existing message IDs before reload to identify new messages\n const existingMessageIds = new Set(this.messages.map(m => m.ID));\n\n // Merge engine cache with existing client-side messages.\n // Preserves messages added client-side (e.g., by handleSubAgentInvocation)\n // that haven't been picked up by entity events yet due to timing.\n const merged = new Map<string, MJConversationDetailEntity>();\n\n for (const msg of engineDetails) {\n merged.set(msg.ID, msg);\n }\n\n // Preserve client-side messages not yet in engine cache\n for (const msg of this.messages) {\n if (!merged.has(msg.ID)) {\n merged.set(msg.ID, msg);\n }\n }\n\n this.messages = Array.from(merged.values())\n .sort((a, b) => (a.__mj_CreatedAt?.getTime() || 0) - (b.__mj_CreatedAt?.getTime() || 0));\n\n // Find newly discovered messages (delegated agents)\n const newMessages = engineDetails.filter(m => !existingMessageIds.has(m.ID));\n\n // Check engine cache for agent runs on new messages\n for (const message of newMessages) {\n if (message.AgentID && message.ID) {\n const agentRun = this.engine.GetAgentRunForDetail(conversationId, message.ID);\n if (agentRun) {\n this.agentRunsByDetailId.set(message.ID, agentRun as MJAIAgentRunEntityExtended);\n LogStatusEx({message: `✅ Found cached agent run for new delegated message ${message.ID}`, verboseOnly: true});\n }\n }\n }\n\n LogStatusEx({message: `✅ Refreshed ${engineDetails.length} messages from engine cache (${newMessages.length} new)`, verboseOnly: true});\n } catch (error) {\n console.error('Failed to reload messages for active conversation:', error);\n }\n }\n\n /**\n * Handle message completion triggered by PubSub completion event\n * Reloads message, agent run, and artifacts, then updates UI\n * @param message The message that completed\n * @param agentRunId The ID of the agent run that completed\n */\n private async handleMessageCompletion(message: MJConversationDetailEntity, _agentRunId: string): Promise<void> {\n try {\n LogStatusEx({message: `🎉 Handling completion for message ${message.ID}`, verboseOnly: true});\n\n // Snapshot artifact IDs before reload to detect newly created artifacts\n const artifactIdsBefore = this.collectAllArtifactIds();\n\n // Reload message from database to get final content and status\n await message.Load(message.ID);\n\n // Reload agent run to get final status, timestamps, and cost\n const agentRun = this.agentRunsByDetailId.get(message.ID);\n if (agentRun?.ID) {\n await agentRun.Load(agentRun.ID);\n }\n\n // Reload artifacts for this completed message\n await this.reloadArtifactsForMessage(message.ID);\n\n // Reload messages to pick up newly delegated agent messages\n // When Sage delegates to Marketing Agent, a new message is created\n await this.reloadMessagesForActiveConversation();\n\n // Invalidate cache since reloadMessages may have loaded new delegated-agent messages\n // that are not in the cache set by reloadArtifactsForMessage().\n // Without this, navigating away and back would show stale data.\n if (message.ConversationID) {\n this.resetComponentState(message.ConversationID);\n }\n\n // Update inProgressMessageIds to include new delegated agents\n // This triggers callback registration via the setter in message-input\n this.inProgressMessageIds = [...this.messages\n .filter(m => m.Status === 'In-Progress')\n .map(m => m.ID)];\n\n // Auto-open artifact panel if NEW artifacts were discovered (not just the triggering message).\n // When Sage delegates to a sub-agent (e.g., Skip), the artifact is on the sub-agent's\n // message, not Sage's. Checking only the triggering message would miss delegated artifacts.\n if (!this.showArtifactPanel) {\n await this.autoOpenNewArtifact(artifactIdsBefore);\n }\n\n // Remove task from ActiveTasksService (clears spinner in conversation list)\n const task = this.activeTasks.getByConversationDetailId(message.ID);\n if (task) {\n this.activeTasks.remove(task.id);\n }\n\n // Force re-render with updated agent run and artifacts\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n\n LogStatusEx({message: `✅ Completion handled for message ${message.ID}`, verboseOnly: true});\n } catch (error) {\n console.error(`Error handling message completion for ${message.ID}:`, error);\n this.cdr.detectChanges();\n }\n }\n\n async onAgentResponse(event: {message: MJConversationDetailEntity, agentResult: any}): Promise<void> {\n // Guard: ignore agent responses from background inputs for other conversations.\n // See onMessageSent() for the full explanation.\n if (!UUIDsEqual(event.message.ConversationID, this.conversationId)) {\n if (event.message.ConversationID) {\n this.resetComponentState(event.message.ConversationID);\n }\n return;\n }\n\n // Add the agent's response message to the conversation\n this.messages = [...this.messages, event.message];\n\n // Invalidate cache for this conversation since we have new messages\n if (this.conversationId) {\n this.resetComponentState(this.conversationId);\n }\n\n // Scroll to bottom when agent responds\n this.scrollToBottom = true;\n\n // CRITICAL FIX: Always refresh the agent run data when agent completes\n // This ensures we get the final status and timestamps, replacing any stale data from when agent started\n // agentResult is ExecuteAgentResult which contains agentRun property\n if (event.agentResult?.agentRun?.ID) {\n await this.addAgentRunToMap(event.message.ID, event.agentResult.agentRun.ID, true); // forceRefresh = true\n }\n\n // Snapshot artifact IDs before reload to detect newly created artifacts\n const artifactIdsBefore = this.collectAllArtifactIds();\n\n // Reload artifact mapping for this message to pick up newly created artifacts\n await this.reloadArtifactsForMessage(event.message.ID);\n\n // Auto-open artifact panel if NEW artifacts were discovered\n if (!this.showArtifactPanel) {\n await this.autoOpenNewArtifact(artifactIdsBefore);\n }\n\n // Force change detection to update the UI\n this.cdr.detectChanges();\n }\n\n /**\n * Reset component-level UI state so peripheral data reprocesses on next load.\n * Does NOT invalidate ConversationEngine cache — the engine is the single source of truth\n * and is kept warm via AddDetailToCache/UpdateDetailInCache.\n */\n private resetComponentState(conversationId: string): void {\n // Reset so loadPeripheralData re-runs on next conversation load\n if (this.lastLoadedConversationId === conversationId) {\n this.lastLoadedConversationId = null;\n }\n }\n\n /**\n * Add or update an agent run in the map\n * Called when a new agent run completes to keep the map in sync\n * @param forceRefresh If true, always reload from database even if already in map (used when status changes)\n */\n private async addAgentRunToMap(conversationDetailId: string, agentRunId: string, forceRefresh: boolean = false): Promise<MJAIAgentRunEntityExtended> {\n try {\n // Always refresh if forced, or if not in map yet\n if (forceRefresh || !this.agentRunsByDetailId.has(conversationDetailId)) {\n const md = new Metadata();\n const agentRun = await md.GetEntityObject<MJAIAgentRunEntityExtended>('MJ: AI Agent Runs', this.currentUser);\n if (await agentRun.Load(agentRunId)) {\n this.agentRunsByDetailId.set(conversationDetailId, agentRun);\n\n // Also update ConversationEngine's cache for other consumers\n if (this.conversationId) {\n ConversationEngine.Instance.SetAgentRunForDetail(this.conversationId, conversationDetailId, agentRun);\n }\n\n // Force message list to re-render with updated agent run\n // Keep same Map reference so message-list component can access updates\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n\n }\n return agentRun;\n } \n else {\n return this.agentRunsByDetailId.get(conversationDetailId)!;\n }\n } catch (error) {\n console.error('Failed to load agent run for map:', error);\n throw error;\n }\n }\n\n /**\n * Reload artifacts for a conversation, triggered by a specific message ID.\n * Processes ALL messages in the conversation (not just the trigger message)\n * so that artifacts from delegated sub-agent messages are also picked up.\n * Called after an artifact is created to update the UI immediately.\n * Invalidates and refreshes the conversation cache.\n */\n private async reloadArtifactsForMessage(conversationDetailId: string): Promise<void> {\n LogStatusEx({message: `🔄 Reloading artifacts for message ${conversationDetailId}`, verboseOnly: true});\n try {\n const md = new Metadata();\n\n // Get the ConversationID for this detail\n const detail = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n if (!(await detail.Load(conversationDetailId))) {\n console.error('Failed to load conversation detail');\n return;\n }\n\n // Surgical refresh — merges new artifacts into existing cache without replacing objects\n await this.engine.RefreshConversationDetails(detail.ConversationID, this.currentUser);\n\n // Reprocess peripheral data from the updated engine cache\n this.lastLoadedConversationId = null;\n await this.loadPeripheralData(detail.ConversationID);\n } catch (error) {\n console.error('Failed to reload artifacts for message:', error);\n }\n }\n\n openProjectSelector(): void {\n this.showProjectSelector = true;\n }\n\n toggleMembersModal(): void {\n this.showMembersModal = !this.showMembersModal;\n }\n\n viewArtifacts(): void {\n this.showArtifactsModal = true;\n }\n\n /**\n * Recompute the cached artifactCountDisplay from the effective artifacts map.\n * Must be called whenever artifactsByDetailId, systemArtifactsByDetailId,\n * or showSystemArtifacts changes, instead of using a getter that can produce\n * different values between Angular change-detection passes (NG0100).\n */\n private updateArtifactCountDisplay(): void {\n const uniqueArtifactIds = new Set<string>();\n for (const artifactList of this.effectiveArtifactsMap.values()) {\n for (const info of artifactList) {\n uniqueArtifactIds.add(info.artifactId);\n }\n }\n this.artifactCountDisplay = uniqueArtifactIds.size;\n }\n\n /**\n * Calculate count of unique artifacts (not versions) - user-visible only\n * Used for initial artifact count (doesn't change with toggle)\n */\n private calculateUniqueArtifactCount(): number {\n const uniqueArtifactIds = new Set<string>();\n for (const artifactList of this.artifactsByDetailId.values()) {\n for (const info of artifactList) {\n uniqueArtifactIds.add(info.artifactId);\n }\n }\n return uniqueArtifactIds.size;\n }\n\n /**\n * Collect all currently known artifact IDs across all messages.\n * Used as a \"before\" snapshot to detect newly created artifacts after a reload.\n */\n private collectAllArtifactIds(): Set<string> {\n const ids = new Set<string>();\n for (const artifactList of this.artifactsByDetailId.values()) {\n for (const info of artifactList) {\n ids.add(info.artifactId);\n }\n }\n return ids;\n }\n\n /**\n * Auto-open the artifact panel for the most recent NEW artifact.\n * Compares current artifacts against a pre-reload snapshot to find\n * only artifacts that were just discovered (avoiding re-opening for old artifacts).\n * Searches artifactsByDetailId directly rather than iterating this.messages,\n * because reloadMessagesForActiveConversation can temporarily remove messages\n * from this.messages during concurrent operations.\n */\n private async autoOpenNewArtifact(artifactIdsBefore: Set<string>): Promise<void> {\n for (const [detailId, artifactList] of this.artifactsByDetailId) {\n const newArtifact = artifactList.find(a => !artifactIdsBefore.has(a.artifactId));\n if (newArtifact) {\n this.selectedArtifactId = newArtifact.artifactId;\n this.showArtifactPanel = true;\n await this.loadArtifactPermissions(newArtifact.artifactId);\n LogStatusEx({message: `🎨 Auto-opening new artifact ${newArtifact.artifactId} from detail ${detailId}`, verboseOnly: true});\n return;\n }\n }\n }\n\n /**\n * Get the effective artifacts map based on showSystemArtifacts toggle\n * Combines user-visible and system artifacts when toggle is on\n * Uses caching to prevent infinite change detection loops\n */\n public get effectiveArtifactsMap(): Map<string, LazyArtifactInfo[]> {\n if (!this.showSystemArtifacts) {\n // Only user-visible artifacts - no need to cache\n return this.artifactsByDetailId;\n }\n\n // Return cached combined map if available\n if (this._combinedArtifactsMap) {\n return this._combinedArtifactsMap;\n }\n\n // Combine both maps when showing system artifacts\n const combined = new Map<string, LazyArtifactInfo[]>();\n\n // Add all user-visible artifacts\n for (const [key, value] of this.artifactsByDetailId) {\n combined.set(key, [...value]);\n }\n\n // Add system artifacts\n for (const [key, value] of this.systemArtifactsByDetailId) {\n if (combined.has(key)) {\n // Merge with existing artifacts for this detail\n combined.get(key)!.push(...value);\n } else {\n combined.set(key, [...value]);\n }\n }\n\n // Cache the result\n this._combinedArtifactsMap = combined;\n return combined;\n }\n\n /**\n * Toggles system artifacts visibility\n * Clears the cache so the map will be rebuilt on next access\n */\n public toggleSystemArtifacts(): void {\n this.showSystemArtifacts = !this.showSystemArtifacts;\n this._combinedArtifactsMap = null; // Clear cache\n this.updateArtifactCountDisplay();\n this.cdr.detectChanges(); // Force update\n }\n\n /**\n * Check if there are any system artifacts in this conversation\n * Used to conditionally show/hide the \"Show System\" toggle button\n */\n public get hasSystemArtifacts(): boolean {\n return this.systemArtifactsByDetailId.size > 0;\n }\n\n /**\n * Get unique artifacts grouped by artifact ID (not by conversation detail)\n * Returns the latest version info for each unique artifact with all versions\n * Works with LazyArtifactInfo - uses display data without loading full entities\n * Respects showSystemArtifacts toggle\n */\n getArtifactsArray(): Array<{\n artifactId: string;\n versionId: string;\n name: string;\n versionCount: number;\n visibility: string;\n versions: Array<{versionId: string; versionNumber: number}>\n }> {\n const artifactMap = new Map<string, {\n artifactId: string;\n versionId: string;\n name: string;\n visibility: string;\n versions: Array<{versionId: string; versionNumber: number}>\n }>();\n\n // Group by artifactId, collecting all version details\n // Use effectiveArtifactsMap to respect showSystemArtifacts toggle\n for (const artifactList of this.effectiveArtifactsMap.values()) {\n for (const info of artifactList) {\n const artifactId = info.artifactId;\n const versionId = info.artifactVersionId;\n const versionNumber = info.versionNumber || 1;\n const name = info.artifactName || 'Untitled';\n\n if (!artifactMap.has(artifactId)) {\n artifactMap.set(artifactId, {\n artifactId: artifactId,\n versionId: versionId, // Latest version ID\n name: name,\n visibility: info.visibility,\n versions: [{versionId: versionId, versionNumber: versionNumber}]\n });\n } else {\n // Add version if not already present\n const existing = artifactMap.get(artifactId)!;\n if (!existing.versions.some(v => v.versionId === versionId)) {\n existing.versions.push({versionId: versionId, versionNumber: versionNumber});\n // Update to latest version ID (assuming versions are added chronologically)\n existing.versionId = versionId;\n }\n }\n }\n }\n\n // Convert to array with version count, sorted by version number descending\n return Array.from(artifactMap.values()).map(item => ({\n artifactId: item.artifactId,\n versionId: item.versionId,\n name: item.name,\n visibility: item.visibility,\n versionCount: item.versions.length,\n versions: item.versions.sort((a, b) => b.versionNumber - a.versionNumber)\n }));\n }\n\n toggleArtifactExpansion(artifactId: string, event: Event): void {\n event.stopPropagation(); // Prevent opening artifact when clicking expand button\n this.expandedArtifactId = this.expandedArtifactId === artifactId ? null : artifactId;\n }\n\n async openArtifactFromModal(artifactId: string, versionNumber?: number): Promise<void> {\n this.selectedArtifactId = artifactId;\n this.selectedVersionNumber = versionNumber;\n this.showArtifactPanel = true;\n this.showArtifactsModal = false;\n\n // Load permissions for the selected artifact\n await this.loadArtifactPermissions(artifactId);\n this.cdr.detectChanges();\n }\n\n exportConversation(): void {\n if (this.conversation) {\n this.showExportModal = true;\n }\n }\n\n onExportModalCancelled(): void {\n this.showExportModal = false;\n }\n\n onExportModalComplete(): void {\n this.showExportModal = false;\n }\n\n async onProjectSelected(project: any): Promise<void> {\n if (this.conversation && project) {\n try {\n await this.engine.SaveConversation(\n this.conversation.ID,\n { ProjectID: project.ID },\n this.currentUser\n );\n this.showProjectSelector = false;\n } catch (error) {\n console.error('Failed to assign project:', error);\n }\n } else if (this.conversation && !project) {\n // Remove project assignment\n try {\n await this.engine.SaveConversation(\n this.conversation.ID,\n { ProjectID: null },\n this.currentUser\n );\n this.showProjectSelector = false;\n } catch (error) {\n console.error('Failed to remove project:', error);\n }\n }\n }\n\n shareConversation(): void {\n // TODO: Implement share functionality\n LogStatusEx({message: 'Share conversation', verboseOnly: true});\n }\n\n onReplyInThread(message: MJConversationDetailEntity): void {\n // Open thread panel for this message - emit to parent\n this.threadOpened.emit(message.ID);\n }\n\n onViewThread(message: MJConversationDetailEntity): void {\n // Open thread panel for this message - emit to parent\n this.threadOpened.emit(message.ID);\n }\n\n onLocalThreadClosed(): void {\n // Close the thread panel - emit to parent\n this.threadClosed.emit();\n }\n\n onThreadReplyAdded(reply: MJConversationDetailEntity): void {\n // Optionally refresh the message list to update thread counts\n // For now, we'll just log it\n LogStatusEx({message: 'Thread reply added', verboseOnly: true, additionalArgs: [reply]});\n\n // Reload messages to get updated thread counts\n if (this.conversationId) {\n this.loadMessages(this.conversationId);\n }\n }\n\n onToggleAgentPanel(): void {\n this.showAgentPanel = !this.showAgentPanel;\n // The agent panel component handles its own visibility\n // This could be used to toggle a modal or different view\n }\n\n onAgentSelected(agentRun: MJAIAgentRunEntity): void {\n // When an agent is clicked in the indicator, could show details\n LogStatusEx({message: 'Agent selected', verboseOnly: true, additionalArgs: [agentRun.ID]});\n // Could open a modal or navigate to agent details\n }\n\n onMessageEdited(message: MJConversationDetailEntity): void {\n // Message was edited and saved, trigger change detection\n LogStatusEx({message: 'Message edited', verboseOnly: true, additionalArgs: [message.ID]});\n // The message entity is already updated in place, so no need to reload\n // Just ensure the UI reflects the changes\n }\n\n onMessagePinToggled(message: MJConversationDetailEntity): void {\n // The entity object is already mutated by .Save() and the engine cache holds the same\n // object reference, so no explicit cache update is needed here.\n // Update engine's raw data cache to stay in sync\n if (this.conversationId) {\n const cacheEntry = this.engine.GetCachedDetailEntry(this.conversationId);\n if (cacheEntry) {\n const row = cacheEntry.RawData.find((r: ConversationDetailComplete) => UUIDsEqual(r.ID, message.ID));\n if (row) {\n row.IsPinned = message.IsPinned;\n }\n }\n }\n // Auto-close the panel when the last pin is removed\n if (this.showPinsPanel && this.pinnedMessages.length === 0) {\n setTimeout(() => { this.showPinsPanel = false; this.cdr.detectChanges(); }, 600);\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Scrolls the message list to the target message and plays the beacon animation.\n * Called when the user clicks \"Jump to message\" in the pins panel.\n */\n onJumpToMessage(messageId: string): void {\n const el = this.scrollContainer?.nativeElement?.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (!el) return;\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n // Add beacon animation after scroll settles\n setTimeout(() => {\n el.classList.add('pin-beacon');\n setTimeout(() => el.classList.remove('pin-beacon'), 1500);\n }, 350);\n }\n\n /**\n * Unpins a message from the pins panel — saves to DB and patches the cache.\n */\n async onUnpinFromPanel(message: MJConversationDetailEntity): Promise<void> {\n const previous = message.IsPinned;\n message.IsPinned = false;\n this.cdr.detectChanges();\n try {\n await message.Save();\n this.onMessagePinToggled(message);\n } catch (err) {\n console.error('Failed to unpin message from panel:', err);\n message.IsPinned = previous;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle suggested response selection from user\n * Sends the selected response as a new user message WITHOUT modifying the visible input\n */\n async onSuggestedResponseSelected(event: {text: string; customInput?: string}): Promise<void> {\n const messageText = event.customInput || event.text;\n\n // Get the active message input for the current conversation\n // (we cache multiple instances, one per visited conversation)\n const activeInput = this.getActiveMessageInputComponent();\n\n // If we have an active conversation with message input available, use it\n if (activeInput && !this.isNewConversation) {\n await activeInput.sendMessageWithText(messageText);\n } else if (!this.conversation || this.isNewConversation) {\n // If no conversation or in new unsaved state, route through empty state handler\n // This will create the conversation and send the message\n await this.onEmptyStateMessageSent({ text: messageText, attachments: [] });\n } else {\n console.error('MessageInputComponent not available and not in a valid state to create conversation');\n }\n }\n\n async onDeleteMessage(message: MJConversationDetailEntity): Promise<void> {\n if (!UUIDsEqual(this.conversation?.UserID, this.currentUser?.ID)) return;\n\n // Find this message and all messages after it sorted by creation time\n const sortedMessages = [...this.messages].sort((a, b) =>\n new Date(a.__mj_CreatedAt!).getTime() - new Date(b.__mj_CreatedAt!).getTime()\n );\n const targetIndex = sortedMessages.findIndex(m => UUIDsEqual(m.ID, message.ID));\n if (targetIndex === -1) return;\n\n const toHide = sortedMessages.slice(targetIndex);\n const count = toHide.length;\n\n const confirmed = await this.confirmDialog.confirm({\n title: 'Delete Messages',\n message: count === 1\n ? 'Delete this message? This cannot be undone.'\n : `Delete this message and the ${count - 1} message${count - 1 === 1 ? '' : 's'} after it? This cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n if (!confirmed) return;\n\n // Load all entities in parallel, then delete in parallel.\n // entity.Delete() calls spDeleteConversationDetail which handles all FK children:\n // hard-deletes junction tables (Artifact/Attachment/Rating), nullifies FKs on AI* records.\n const md = new Metadata();\n const loadResults = await Promise.all(\n toHide.map(async msg => {\n const entity = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n const loaded = await entity.Load(msg.ID);\n return loaded ? entity : null;\n })\n );\n const entities = loadResults.filter((e): e is MJConversationDetailEntity => e !== null);\n if (entities.length === 0) return;\n\n // Sequential deletes — parallel fires concurrent server-side transactions which race on\n // SQLServerDataProvider's singleton _transactionDepth counter and fail with SAVE TRANSACTION errors.\n for (const e of entities) {\n const ok = await e.Delete();\n if (!ok) {\n const last = e.ResultHistory[e.ResultHistory.length - 1];\n console.error(`Failed to delete ConversationDetail ${e.ID}: ${last?.Message ?? 'unknown error'}`, last?.Error ?? '');\n }\n }\n\n const hideIds = new Set(toHide.map(m => m.ID));\n this.messages = this.messages.filter(m => !hideIds.has(m.ID));\n this.resetComponentState(this.conversationId!);\n this.cdr.detectChanges();\n }\n\n onRetryMessage(message: MJConversationDetailEntity): void {\n // TODO: Implement retry logic\n // This should find the parent user message and re-trigger the agent invocation\n LogStatusEx({message: 'Retry requested for message', verboseOnly: true, additionalArgs: [message.ID]});\n // For now, just log it - full implementation would require refactoring agent invocation\n }\n\n /**\n * Handle attachment click - opens the image viewer for images\n */\n onAttachmentClicked(attachment: MessageAttachment): void {\n if (attachment.type === 'Image' && attachment.contentUrl) {\n this.selectedImageUrl = attachment.contentUrl;\n this.selectedImageAlt = attachment.fileName || 'Image attachment';\n this.selectedImageFileName = attachment.fileName || 'image';\n this.showImageViewer = true;\n } else {\n // For non-image attachments, could trigger download or other action\n console.log('Non-image attachment clicked:', attachment);\n }\n }\n\n /**\n * Handle image viewer close\n */\n onImageViewerClosed(): void {\n this.showImageViewer = false;\n this.selectedImageUrl = '';\n this.selectedImageAlt = '';\n this.selectedImageFileName = '';\n }\n\n /**\n * Handle upload state changes from message input component\n */\n onUploadStateChanged(event: {isUploading: boolean; message: string}): void {\n this.isUploadingAttachments = event.isUploading;\n this.uploadingMessage = event.message;\n }\n\n async onArtifactClicked(data: {artifactId: string; versionId?: string}): Promise<void> {\n this.selectedArtifactId = data.artifactId;\n\n // If versionId is provided, find the version number from display data (no lazy load needed)\n if (data.versionId) {\n for (const artifactList of this.artifactsByDetailId.values()) {\n for (const artifactInfo of artifactList) {\n if (artifactInfo.artifactVersionId === data.versionId) {\n this.selectedVersionNumber = artifactInfo.versionNumber;\n LogStatusEx({message: `📦 Opening artifact viewer for v${this.selectedVersionNumber}`, verboseOnly: true});\n break;\n }\n }\n }\n } else {\n // No specific version, let viewer default to latest\n this.selectedVersionNumber = undefined;\n }\n\n this.showArtifactPanel = true;\n\n // Load permissions for the selected artifact\n await this.loadArtifactPermissions(data.artifactId);\n\n // Trigger detectChanges after all state is settled (showArtifactPanel, permissions)\n // to prevent ExpressionChangedAfterItHasBeenCheckedError from zone-triggered CD\n // seeing partial state between the await boundaries\n this.cdr.detectChanges();\n }\n\n async onArtifactCreated(data: {conversationDetailId: string, artifactId: string; versionId: string; versionNumber: number; name: string}): Promise<void> {\n // Snapshot artifact IDs before reload to detect newly created artifacts\n const artifactIdsBefore = this.collectAllArtifactIds();\n\n // Reload artifacts to get full entities (processes ALL messages in the conversation)\n await this.reloadArtifactsForMessage(data.conversationDetailId);\n\n // Auto-open artifact panel if no artifact currently shown\n if (!this.showArtifactPanel) {\n // Use robust auto-open that checks ALL messages for new artifacts.\n // When a sub-agent (e.g., Skip) creates an artifact on a different ConversationDetail\n // than the one specified in the event, checking only data.conversationDetailId would miss it.\n await this.autoOpenNewArtifact(artifactIdsBefore);\n } else if (this.selectedArtifactId) {\n // Panel is already open - check if new artifact is a new version of currently displayed artifact\n const artifactList = this.artifactsByDetailId.get(data.conversationDetailId);\n if (artifactList && artifactList.length > 0) {\n const currentArtifact = artifactList.find(a => a.artifactId === this.selectedArtifactId);\n if (currentArtifact) {\n // New version of the same artifact - refresh to show latest version\n const latestVersion = artifactList[artifactList.length - 1];\n this.artifactViewerRefresh$.next({\n artifactId: latestVersion.artifactId,\n versionNumber: latestVersion.versionNumber\n });\n }\n }\n }\n\n // Force change detection to update the UI immediately\n this.cdr.detectChanges();\n }\n\n onCloseArtifactPanel(): void {\n this.showArtifactPanel = false;\n this.selectedArtifactId = null;\n // Clear permissions\n this.canShareSelectedArtifact = false;\n this.canEditSelectedArtifact = false;\n // Reset maximize state and width when closing so the next artifact opens at default size\n this.isArtifactPaneMaximized = false;\n this.artifactPaneWidth = DEFAULT_ARTIFACT_PANE_WIDTH;\n this.cdr.detectChanges();\n }\n\n toggleMaximizeArtifactPane(): void {\n if (this.isArtifactPaneMaximized) {\n // Restore to previous width\n this.artifactPaneWidth = this.artifactPaneWidthBeforeMaximize;\n this.isArtifactPaneMaximized = false;\n } else {\n // Maximize - store current width and set to 100%\n this.artifactPaneWidthBeforeMaximize = this.artifactPaneWidth;\n this.artifactPaneWidth = 100;\n this.isArtifactPaneMaximized = true;\n }\n }\n\n onSaveToCollectionRequested(event: {artifactId: string; excludedCollectionIds: string[]}): void {\n this.collectionPickerArtifactId = event.artifactId;\n this.collectionPickerExcludedIds = event.excludedCollectionIds;\n this.showCollectionPicker = true;\n }\n\n async onCollectionPickerSaved(collectionIds: string[]): Promise<void> {\n if (!this.collectionPickerArtifactId || !this.artifactViewerComponent) {\n return;\n }\n\n // Call the artifact viewer's save method\n const success = await this.artifactViewerComponent.saveToCollections(collectionIds);\n if (success) {\n this.showCollectionPicker = false;\n this.collectionPickerArtifactId = null;\n this.collectionPickerExcludedIds = [];\n this.cdr.detectChanges();\n }\n }\n\n onCollectionPickerCancelled(): void {\n this.showCollectionPicker = false;\n this.collectionPickerArtifactId = null;\n this.collectionPickerExcludedIds = [];\n }\n\n /**\n * Helper method to check if a conversation detail has an artifact\n * Used by message components to determine whether to show artifact card\n */\n public conversationDetailHasArtifact(conversationDetailId: string): boolean {\n return this.artifactsByDetailId.has(conversationDetailId);\n }\n\n /**\n * Get artifact info for a conversation detail\n * Returns the LAST (most recent) artifact if multiple exist\n * Returns LazyArtifactInfo - caller can trigger lazy load if full entities needed\n */\n public getArtifactInfo(conversationDetailId: string): LazyArtifactInfo | undefined {\n const artifactList = this.artifactsByDetailId.get(conversationDetailId);\n return artifactList && artifactList.length > 0\n ? artifactList[artifactList.length - 1]\n : undefined;\n }\n\n /**\n * Get ALL artifacts for a conversation detail\n * Use this when you need to display all artifacts (e.g., in a list)\n * Returns LazyArtifactInfo array - caller can trigger lazy load if full entities needed\n */\n public getAllArtifactsForDetail(conversationDetailId: string): LazyArtifactInfo[] {\n return this.artifactsByDetailId.get(conversationDetailId) || [];\n }\n\n /**\n * Resize handle methods for artifact pane\n */\n onResizeStart(event: MouseEvent): void {\n this.isResizing = true;\n this.startX = event.clientX;\n this.startWidth = this.artifactPaneWidth;\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.isResizing) return;\n\n const containerWidth = (event.currentTarget as Window).innerWidth;\n const deltaX = this.startX - event.clientX; // Reversed: drag left = wider artifact pane\n const deltaPercent = (deltaX / containerWidth) * 100;\n let newWidth = this.startWidth + deltaPercent;\n\n // Constrain between 20% and 70%\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPaneWidth = newWidth;\n }\n\n private onResizeEnd(event: MouseEvent): void {\n if (this.isResizing) {\n this.isResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n\n // Save to localStorage\n this.saveArtifactPaneWidth();\n }\n }\n\n /**\n * Touch event handlers for mobile resize support\n */\n onResizeTouchStart(event: TouchEvent): void {\n this.isResizing = true;\n const touch = event.touches[0];\n this.startX = touch.clientX;\n this.startWidth = this.artifactPaneWidth;\n event.preventDefault();\n }\n\n private onResizeTouchMove(event: TouchEvent): void {\n if (!this.isResizing) return;\n\n const touch = event.touches[0];\n const containerWidth = window.innerWidth;\n const deltaX = this.startX - touch.clientX;\n const deltaPercent = (deltaX / containerWidth) * 100;\n let newWidth = this.startWidth + deltaPercent;\n\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPaneWidth = newWidth;\n }\n\n private onResizeTouchEnd(event: TouchEvent): void {\n if (this.isResizing) {\n this.isResizing = false;\n this.saveArtifactPaneWidth();\n }\n }\n\n /**\n * LocalStorage persistence methods for artifact pane\n */\n private loadArtifactPaneWidth(): void {\n try {\n const saved = localStorage.getItem(this.ARTIFACT_PANE_WIDTH_KEY);\n if (saved) {\n const width = parseFloat(saved);\n if (!isNaN(width) && width >= 20 && width <= 70) {\n this.artifactPaneWidth = width;\n }\n }\n } catch (error) {\n console.warn('Failed to load artifact pane width from localStorage:', error);\n }\n }\n\n private saveArtifactPaneWidth(): void {\n try {\n localStorage.setItem(this.ARTIFACT_PANE_WIDTH_KEY, this.artifactPaneWidth.toString());\n } catch (error) {\n console.warn('Failed to save artifact pane width to localStorage:', error);\n }\n }\n\n onConversationRenamed(event: {conversationId: string; name: string; description: string}): void {\n LogStatusEx({message: '🎉 Conversation renamed', verboseOnly: true, additionalArgs: [event]});\n // Pass the event up to workspace component for animation\n this.conversationRenamed.emit(event);\n }\n\n /**\n * Handle message sent from empty state component\n * Creates a new conversation and emits to parent to update selection\n */\n async onEmptyStateMessageSent(event: {text: string; attachments: PendingAttachment[]}): Promise<void> {\n const { text, attachments } = event;\n if (!text?.trim() && (!attachments || attachments.length === 0)) {\n return;\n }\n\n LogStatusEx({message: '📨 Empty state message received', verboseOnly: true, additionalArgs: [text, `${attachments?.length || 0} attachments`]});\n\n try {\n this.isProcessing = true;\n\n // Create a new conversation using the engine\n const newConversation = await this.engine.CreateConversation(\n 'New Conversation', // Temporary name - will be auto-named after first message\n this.environmentId,\n this.currentUser\n );\n\n if (!newConversation) {\n console.error('Failed to create new conversation');\n this.isProcessing = false;\n return;\n }\n\n LogStatusEx({message: '✅ Created new conversation', verboseOnly: true, additionalArgs: [newConversation.ID]});\n\n // Emit to parent with the new conversation AND the pending message/attachments in a single event\n // This ensures atomic state update - workspace sets all state before Angular change detection\n // creates the new message-input component\n const pendingMessage = text?.trim() || '';\n const pendingAttachments = attachments || [];\n this.conversationCreated.emit({\n conversation: newConversation,\n pendingMessage,\n pendingAttachments\n });\n\n } catch (error) {\n console.error('Error creating conversation from empty state:', error);\n } finally {\n this.isProcessing = false;\n }\n }\n\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n // Pass the event up to the parent component (workspace or explorer wrapper)\n this.openEntityRecord.emit(event);\n }\n\n onNavigationRequest(event: NavigationRequest): void {\n // Pass the event up to the parent component for app-level navigation\n this.navigationRequest.emit(event);\n }\n\n viewTestRun(testRunId: string): void {\n // Open the test run record in the entity viewer\n const compositeKey = new CompositeKey();\n compositeKey.KeyValuePairs.push({ FieldName: 'ID', Value: testRunId });\n this.openEntityRecord.emit({\n entityName: 'MJ: Test Runs',\n compositeKey\n });\n }\n\n /**\n * Handles Shift+Click on an AI message bubble.\n * Dumps a live snapshot of in-memory streaming and agent-run state to the browser\n * console so engineers can debug stuck/forever-spinning conversations without\n * needing to add any temporary code.\n *\n * Usage: Hold Shift and click any AI message bubble. Open DevTools Console to see the dump.\n */\n onDiagnosticRequested(messageId: string): void {\n const streaming = this.streamingService.getDiagnosticSnapshot(messageId);\n const agentRun = this.agentRunsByDetailId.get(messageId);\n const isInProgress = this.inProgressMessageIds.includes(messageId);\n\n console.group(`%c[MJ Diagnostic Dump] Message ${messageId}`, 'color: #0076b6; font-weight: bold');\n console.log('Timestamp:', new Date().toISOString());\n console.log('ConversationID:', this.conversationId);\n console.log('isInProgress (UI):', isInProgress);\n console.log('All inProgressMessageIds:', [...this.inProgressMessageIds]);\n console.log('Streaming connection:', streaming.connectionStatus);\n console.log('Streaming callbacks registered:', streaming.callbackCount);\n if (streaming.recentCompletion) {\n console.log('Recent completion (not yet processed):', streaming.recentCompletion);\n }\n if (agentRun) {\n console.log('Agent run:', { id: agentRun.ID, status: agentRun.Status, name: agentRun.Agent });\n } else {\n console.log('Agent run: none loaded for this message');\n }\n console.groupEnd();\n }\n\n onTestFeedbackMessage(message: MJConversationDetailEntity): void {\n if (!message.TestRunID) {\n console.error('Cannot provide test feedback: message has no TestRunID');\n return;\n }\n\n this.testFeedbackDialogData = {\n testRunId: message.TestRunID,\n conversationDetailId: message.ID,\n currentUser: this.currentUser\n };\n this.showTestFeedbackDialog = true;\n }\n\n onTestFeedbackDialogClosed(result: TestFeedbackDialogResult): void {\n this.showTestFeedbackDialog = false;\n if (result.success) {\n console.log('Test feedback saved successfully:', result.feedbackId);\n }\n }\n\n onTaskClicked(task: MJTaskEntity): void {\n // Pass task click up to workspace to navigate to Tasks tab\n this.taskClicked.emit(task);\n }\n\n onNavigateToConversation(event: {conversationId: string; taskId: string}): void {\n // Navigate to the conversation with the active task - emit to parent\n // Parent will update its selection state\n // For now, we can't navigate to a different conversation from within chat area\n // This would require emitting an event to the parent\n console.log('Navigate to conversation requested:', event.conversationId);\n }\n\n /**\n * Handle navigation request from artifact viewer Links tab\n */\n onArtifactLinkNavigation(event: {type: 'conversation' | 'collection'; id: string}): void {\n LogStatusEx({message: '🔗 Chat area: Artifact link clicked', verboseOnly: true, additionalArgs: [event]});\n this.artifactLinkClicked.emit(event);\n }\n\n /**\n * Load permissions for the given artifact\n */\n private async loadArtifactPermissions(artifactId: string): Promise<void> {\n // Guard against null/undefined\n if (!artifactId) {\n this.canShareSelectedArtifact = false;\n this.canEditSelectedArtifact = false;\n return;\n }\n\n try {\n const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.currentUser);\n this.canShareSelectedArtifact = permissions.canShare;\n this.canEditSelectedArtifact = permissions.canEdit;\n } catch (error) {\n console.error('Failed to load artifact permissions:', error);\n this.canShareSelectedArtifact = false;\n this.canEditSelectedArtifact = false;\n }\n }\n\n /**\n * Handle artifact picker request from message input\n */\n async onArtifactPickerRequested(): Promise<void> {\n this.showArtifactPickerPanel = true;\n this.isLoadingArtifactPicker = true;\n this.cdr.detectChanges();\n\n try {\n // Load user's recent artifact versions (both text and file-backed)\n const rv = new RunView();\n const result = await rv.RunView<{\n ID: string; ArtifactID: string; VersionNumber: number;\n Name: string; Description: string; ContentMode: string;\n FileID: string | null; MimeType: string | null;\n FileName: string | null; ContentSizeBytes: number;\n Artifact: string; __mj_UpdatedAt: string;\n }>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID IN (SELECT ID FROM __mj.Artifact WHERE Visibility <> 'System Only')`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 50,\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results) {\n this.artifactPickerItems = result.Results.map(r => ({\n artifactId: r.ArtifactID,\n artifactVersionId: r.ID,\n name: r.Name || r.Artifact || 'Untitled',\n description: r.Description || '',\n contentMode: r.ContentMode || 'Text',\n fileID: r.FileID,\n mimeType: r.MimeType,\n fileName: r.FileName,\n sizeBytes: r.ContentSizeBytes || 0,\n typeName: r.ContentMode === 'File' ? (r.MimeType || 'File') : 'Text',\n updatedAt: r.__mj_UpdatedAt\n }));\n } else {\n this.artifactPickerItems = [];\n }\n } catch (error) {\n console.error('Failed to load artifacts for picker:', error);\n this.artifactPickerItems = [];\n } finally {\n this.isLoadingArtifactPicker = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle artifact selection from the picker panel.\n * Adds the artifact as a pending attachment so it appears in the message input.\n * The ConversationDetailArtifact with Direction='Input' is created when the message is sent.\n */\n OnArtifactSelected(item: {\n artifactId: string; artifactVersionId: string; name: string;\n contentMode: string; fileID: string | null; mimeType: string | null;\n fileName: string | null; sizeBytes: number;\n }): void {\n const activeInput = this.messageInputComponents?.find(\n (input: MessageInputComponent) => input.conversationId === this.conversationId\n );\n if (activeInput?.inputBox) {\n activeInput.inputBox.AddArtifactAttachment({\n fileID: item.fileID || item.artifactVersionId,\n fileName: item.fileName || item.name,\n mimeType: item.mimeType || 'text/plain',\n sizeBytes: item.sizeBytes,\n artifactVersionId: item.artifactVersionId\n });\n }\n this.showArtifactPickerPanel = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Close artifact picker panel\n */\n CloseArtifactPicker(): void {\n this.showArtifactPickerPanel = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share request from artifact viewer\n */\n async onArtifactShareRequested(artifactId: string): Promise<void> {\n // Load the artifact entity to pass to the modal\n const md = new Metadata();\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts');\n await artifact.Load(artifactId);\n\n if (artifact) {\n this.artifactToShare = artifact;\n this.isArtifactShareModalOpen = true;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle close of artifact share modal\n */\n onArtifactShareModalClose(): void {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle successful share - refresh permissions\n */\n async onArtifactShared(): Promise<void> {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n\n // Refresh permissions for the active artifact\n if (this.selectedArtifactId) {\n await this.loadArtifactPermissions(this.selectedArtifactId);\n }\n this.cdr.detectChanges();\n }\n\n // Scroll functionality (pattern from skip-chat)\n checkScroll(): void {\n if (!this.scrollContainer) return;\n\n const element = this.scrollContainer.nativeElement;\n const buffer = 15; // Tolerance in pixels\n const scrollDifference = element.scrollHeight - (element.scrollTop + element.clientHeight);\n const hasScrollableContent = element.scrollHeight > element.clientHeight + 50;\n const atBottom = scrollDifference <= buffer;\n\n const newValue = !atBottom && hasScrollableContent;\n\n // Only update if value changed to prevent unnecessary change detection\n if (this.showScrollToBottomIcon !== newValue) {\n this.showScrollToBottomIcon = newValue;\n this.cdr.detectChanges();\n }\n }\n\n scrollToBottomNow(retryCount: number = 0): void {\n try {\n if (!this.scrollContainer) {\n if (retryCount < 10) {\n setTimeout(() => this.scrollToBottomNow(retryCount + 1), 50);\n }\n return;\n }\n\n const element = this.scrollContainer.nativeElement;\n if (element.scrollHeight === 0 && retryCount < 10) {\n setTimeout(() => this.scrollToBottomNow(retryCount + 1), 50);\n } else if (element.scrollHeight > 0) {\n element.scrollTop = element.scrollHeight;\n }\n } catch (err) {\n console.error('Error scrolling to bottom:', err);\n }\n }\n\n scrollToBottomAnimate(): void {\n if (this.scrollContainer) {\n const element = this.scrollContainer.nativeElement;\n element.scroll({ top: element.scrollHeight, behavior: 'smooth' });\n }\n }\n\n /**\n * Detect and reconcile agent run states against conversation detail statuses.\n * Called after loading a conversation to handle two scenarios:\n *\n * 1. **In-progress catch-up**: If an agent completed between page refresh and\n * WebSocket reconnection, the completion PubSub event is lost. We catch this\n * by comparing message status against the agent run status from the database.\n *\n * 2. **Stale error correction**: If the client previously marked a conversation\n * detail as 'Error' (e.g., due to WebSocket timeout) but the server actually\n * completed successfully, we detect the mismatch and correct it. This prevents\n * the race condition where the client overwrites a server-completed record.\n */\n private async detectAndReconcileAgentRuns(conversationId: string): Promise<void> {\n await this.reconnectInProgressRuns();\n await this.correctStaleErrorMessages();\n }\n\n /**\n * Reconnect to in-progress agent runs whose completion events were missed.\n */\n private async reconnectInProgressRuns(): Promise<void> {\n const inProgressMessages = this.messages.filter(\n m => m.Status === 'In-Progress' && m.Role === 'AI'\n );\n\n if (inProgressMessages.length === 0) {\n return;\n }\n\n LogStatusEx({message: `🔄 Found ${inProgressMessages.length} in-progress messages, checking status...`, verboseOnly: true});\n\n const completedStatuses = ['Completed', 'Failed', 'Error', 'Cancelled'];\n\n for (const message of inProgressMessages) {\n const agentRun = this.agentRunsByDetailId.get(message.ID);\n\n if (!agentRun) {\n // No agent run yet — fire-and-forget may not have created it.\n // Polling will pick this up once the server creates the run.\n LogStatusEx({message: `⏳ No agent run found for in-progress message ${message.ID}, waiting for server...`, verboseOnly: true});\n continue;\n }\n\n if (completedStatuses.includes(agentRun.Status)) {\n // Agent completed during the WebSocket reconnection gap — handle now\n LogStatusEx({message: `🔄 Agent run ${agentRun.ID} already completed (${agentRun.Status}) for message ${message.ID}, handling catch-up...`, verboseOnly: true});\n await this.handleMessageCompletion(message, agentRun.ID);\n } else {\n LogStatusEx({message: `🔌 Agent run ${agentRun.ID} still ${agentRun.Status} for message ${message.ID}, WebSocket will receive updates`, verboseOnly: true});\n }\n }\n }\n\n /**\n * Detect conversation details marked as 'Error' by the client whose corresponding\n * agent run actually completed successfully on the server. This corrects the race\n * condition where the client overwrote a server-completed record with an error status.\n */\n private async correctStaleErrorMessages(): Promise<void> {\n const errorMessages = this.messages.filter(\n m => m.Status === 'Error' && m.Role === 'AI'\n );\n\n if (errorMessages.length === 0) {\n return;\n }\n\n for (const message of errorMessages) {\n const agentRun = this.agentRunsByDetailId.get(message.ID);\n if (agentRun && agentRun.Status === 'Completed') {\n LogStatusEx({message: `🔧 Correcting stale error: message ${message.ID} shows Error but agent run ${agentRun.ID} completed successfully`, verboseOnly: true});\n await this.handleMessageCompletion(message, agentRun.ID);\n }\n }\n }\n\n /**\n * Handle pending artifact navigation from collection\n * Opens the artifact and scrolls to the message containing it\n */\n private async handlePendingArtifactNavigation(): Promise<void> {\n if (!this.pendingArtifactId) {\n return; // No pending navigation\n }\n\n console.log('📦 Processing pending artifact navigation:', this.pendingArtifactId, 'v' + this.pendingArtifactVersionNumber);\n\n // Capture values before emitting consumed event\n const artifactIdToOpen = this.pendingArtifactId;\n const versionNumberToOpen = this.pendingArtifactVersionNumber;\n\n // Notify parent that we consumed the pending artifact\n this.pendingArtifactConsumed.emit();\n\n // Find the message containing this artifact version\n let messageIdWithArtifact: string | null = null;\n\n for (const [detailId, artifactList] of this.artifactsByDetailId.entries()) {\n for (const artifactInfo of artifactList) {\n if (artifactInfo.artifactId === artifactIdToOpen) {\n // Found the artifact - check if version matches (if specified)\n if (versionNumberToOpen == null || artifactInfo.versionNumber === versionNumberToOpen) {\n messageIdWithArtifact = detailId;\n console.log('✅ Found artifact in message:', detailId);\n break;\n }\n }\n }\n if (messageIdWithArtifact) break;\n }\n\n if (!messageIdWithArtifact) {\n console.warn('⚠️ Could not find message containing artifact:', artifactIdToOpen);\n return;\n }\n\n // Open the artifact panel\n this.selectedArtifactId = artifactIdToOpen;\n this.selectedVersionNumber = versionNumberToOpen ?? undefined;\n this.showArtifactPanel = true;\n\n // Load permissions for the artifact\n await this.loadArtifactPermissions(artifactIdToOpen);\n this.cdr.detectChanges();\n\n // Scroll to the message\n this.scrollToMessage(messageIdWithArtifact);\n\n console.log('✅ Opened artifact and scrolled to message:', messageIdWithArtifact);\n }\n\n /**\n * Scroll to a specific message in the conversation\n * @param messageId The conversation detail ID to scroll to\n */\n private scrollToMessage(messageId: string): void {\n // Wait for DOM to update, then scroll\n setTimeout(() => {\n const messageElement = document.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (messageElement) {\n messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n console.log('📍 Scrolled to message:', messageId);\n } else {\n console.warn('⚠️ Message element not found for ID:', messageId);\n }\n }, 300); // Give time for artifact panel to open and DOM to render\n }\n\n /**\n * Handle intent check started - show temporary \"Analyzing intent...\" message\n */\n async onIntentCheckStarted(): Promise<void> {\n const md = new Metadata();\n const tempMessage = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n\n // Create a temporary message that looks like an AI response in-progress\n tempMessage.Message = '🔍 Analyzing your request to determine the best agent...';\n tempMessage.Role = 'AI';\n tempMessage.Status = 'In-Progress';\n // Set created date using LoadFromData to bypass read-only protection\n tempMessage.LoadFromData({\n Message: tempMessage.Message,\n Role: tempMessage.Role,\n Status: tempMessage.Status,\n __mj_CreatedAt: new Date()\n });\n // No ID means it's temporary (won't be saved)\n\n this.intentCheckMessage = tempMessage;\n this.messages = [...this.messages, tempMessage];\n this.scrollToBottom = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle intent check completed - remove temporary message\n */\n onIntentCheckCompleted(): void {\n if (this.intentCheckMessage) {\n // Remove the temporary intent check message\n this.messages = this.messages.filter(m => m !== this.intentCheckMessage);\n this.intentCheckMessage = null;\n this.cdr.detectChanges();\n }\n }\n}","<div class=\"chat-area\">\n <!-- Fixed Header -->\n @if (conversation) {\n <div class=\"chat-header\">\n <div class=\"chat-info\" [class.with-sidebar-toggle]=\"showSidebarToggle\">\n @if (showSidebarToggle) {\n <button class=\"sidebar-toggle-btn\"\n (click)=\"sidebarToggleClicked.emit()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n <div class=\"chat-title\">{{ conversation.Name || '' }}</div>\n @if (conversation.ProjectID) {\n <button class=\"project-tag\" (click)=\"openProjectSelector()\" title=\"Assign to project\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ conversation.Project || 'Project' }}</span>\n </button>\n }\n @if (conversation.TestRunID) {\n <button class=\"test-indicator\" (click)=\"viewTestRun(conversation.TestRunID)\" title=\"View Test Run\">\n <i class=\"fas fa-flask\"></i>\n <span>Test</span>\n </button>\n }\n </div>\n <div class=\"chat-actions chat-actions-buttons\">\n @if (pinnedMessages.length > 0) {\n <button class=\"pin-chip\" [class.active]=\"showPinsPanel\" (click)=\"showPinsPanel = !showPinsPanel\" title=\"View pinned messages\">\n <i class=\"fas fa-thumbtack\"></i>\n <span class=\"pin-chip-count\">{{ pinnedMessages.length }}</span>\n </button>\n }\n @if (showArtifactIndicator && artifactCountDisplay > 0) {\n <button class=\"artifact-indicator\" (click)=\"viewArtifacts()\" title=\"View artifacts\">\n <i class=\"fas fa-cube\"></i>\n <span class=\"artifact-badge\">{{ artifactCountDisplay }}</span>\n </button>\n }\n @if (memberCount > 1) {\n <button class=\"chat-members\" (click)=\"toggleMembersModal()\" title=\"View members\">\n <i class=\"fas fa-users\"></i>\n <span class=\"members-badge\">{{ memberCount }}</span>\n </button>\n }\n @if (showExportButton) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n <span class=\"btn-label\">Export</span>\n </button>\n }\n @if (showShareButton) {\n <button mjButton variant=\"flat\" size=\"sm\"\n [class.shared]=\"isShared\"\n (click)=\"shareConversation()\"\n [title]=\"isShared ? 'Manage sharing' : 'Share conversation'\">\n <i class=\"fas fa-share-nodes\"></i>\n <span class=\"btn-label\">Share</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages and Artifact Split Layout -->\n <div class=\"chat-content-area\">\n <!-- Messages Pane -->\n <div class=\"chat-messages-pane\"\n [class.full-width]=\"!showArtifactPanel\"\n [class.hidden]=\"isArtifactPaneMaximized\">\n @if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads (checked FIRST to prevent empty state flash) -->\n <div class=\"conversation-loading-state\">\n <mj-loading text=\"Loading conversation...\" size=\"large\"></mj-loading>\n </div>\n } @else if (isNewConversation || !conversationId) {\n <!-- Empty State - No conversation selected OR new unsaved conversation -->\n <mj-conversation-empty-state\n [currentUser]=\"currentUser\"\n [disabled]=\"isProcessing\"\n [showSidebarToggle]=\"showSidebarToggle\"\n [overlayMode]=\"overlayMode\"\n [greeting]=\"emptyStateGreeting\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n (sidebarToggleClicked)=\"sidebarToggleClicked.emit()\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else {\n <!-- Normal Message View -->\n <div class=\"chat-messages-wrapper\">\n <!-- Upload Indicator Overlay (centered in conversation area) -->\n @if (isUploadingAttachments) {\n <div class=\"upload-indicator-overlay\">\n <mj-loading [text]=\"uploadingMessage\" size=\"medium\"></mj-loading>\n </div>\n }\n <div class=\"chat-messages-container\" #scrollContainer (scroll)=\"checkScroll()\">\n <mj-conversation-message-list\n [messages]=\"messages\"\n [conversation]=\"conversation\"\n [currentUser]=\"currentUser\"\n [isProcessing]=\"isProcessing\"\n [artifactMap]=\"effectiveArtifactsMap\"\n [agentRunMap]=\"agentRunsByDetailId\"\n [ratingsMap]=\"ratingsByDetailId\"\n [userAvatarMap]=\"userAvatarMap\"\n [attachmentsMap]=\"attachmentsByDetailId\"\n (replyInThread)=\"onReplyInThread($event)\"\n (viewThread)=\"onViewThread($event)\"\n (deleteMessage)=\"onDeleteMessage($event)\"\n (retryMessage)=\"onRetryMessage($event)\"\n (testFeedbackMessage)=\"onTestFeedbackMessage($event)\"\n (artifactClicked)=\"onArtifactClicked($event)\"\n (messageEdited)=\"onMessageEdited($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (suggestedResponseSelected)=\"onSuggestedResponseSelected($event)\"\n (attachmentClicked)=\"onAttachmentClicked($event)\"\n (diagnosticRequested)=\"onDiagnosticRequested($event)\"\n (messagePinToggled)=\"onMessagePinToggled($event)\">\n </mj-conversation-message-list>\n\n <!-- Scroll to Bottom Icon (positioned within scroll container for proper centering) -->\n @if (showScrollToBottomIcon && messages && messages.length > 0) {\n <span class=\"scroll-to-bottom-icon\" style=\"left: 50%;\"\n (click)=\"scrollToBottomAnimate()\">\n <i class=\"fas fa-arrow-down\"></i>\n </span>\n }\n </div>\n\n <!-- Fixed Input Area -->\n <div class=\"chat-input-container\">\n @if (isLoadingPeripheralData) {\n <!-- Loading State -->\n <div class=\"loading-peripheral-placeholder\">\n <mj-loading text=\"Loading conversation data...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <!-- Input Component - Multiple instances cached, only one visible -->\n <div class=\"message-input-container-wrapper\">\n @for (inputRef of getCachedInputs(); track inputRef.conversationId) {\n <mj-message-input\n #messageInput\n [hidden]=\"inputRef.conversationId !== conversationId\"\n [conversationId]=\"inputRef.conversationId\"\n [conversationName]=\"inputRef.conversationName\"\n [currentUser]=\"currentUser\"\n [conversationHistory]=\"inputRef.conversationId === conversationId ? messages : []\"\n [artifactsByDetailId]=\"inputRef.conversationId === conversationId ? artifactsByDetailId : emptyArtifactsMap\"\n [systemArtifactsByDetailId]=\"inputRef.conversationId === conversationId ? systemArtifactsByDetailId : emptyArtifactsMap\"\n [agentRunsByDetailId]=\"inputRef.conversationId === conversationId ? agentRunsByDetailId : emptyAgentRunsMap\"\n [appContext]=\"appContext\"\n [inProgressMessageIds]=\"inputRef.conversationId === conversationId ? inProgressMessageIds : emptyInProgressIds\"\n [disabled]=\"isProcessing\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n [initialMessage]=\"inputRef.conversationId === conversationId ? pendingMessage : null\"\n [initialAttachments]=\"inputRef.conversationId === conversationId ? pendingAttachments : null\"\n (messageSent)=\"onMessageSent($event)\"\n (agentResponse)=\"onAgentResponse($event)\"\n (agentRunDetected)=\"onAgentRunDetected($event)\"\n (agentRunUpdate)=\"onAgentRunUpdate($event)\"\n (messageComplete)=\"onMessageComplete($event)\"\n (artifactCreated)=\"onArtifactCreated($event)\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (intentCheckStarted)=\"onIntentCheckStarted()\"\n (intentCheckCompleted)=\"onIntentCheckCompleted()\"\n (uploadStateChanged)=\"onUploadStateChanged($event)\"\n (artifactPickerRequested)=\"onArtifactPickerRequested()\">\n </mj-message-input>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Artifact Viewer Pane -->\n @if (showArtifactPanel && selectedArtifactId) {\n @if (!isArtifactPaneMaximized) {\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event)\" (touchstart)=\"onResizeTouchStart($event)\"></div>\n }\n <div class=\"chat-artifact-pane\"\n [style.width.%]=\"artifactPaneWidth\"\n [class.maximized]=\"isArtifactPaneMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"selectedVersionNumber\"\n [viewContext]=\"'conversation'\"\n [canShare]=\"canShareSelectedArtifact\"\n [canEdit]=\"canEditSelectedArtifact\"\n [isMaximized]=\"isArtifactPaneMaximized\"\n [refreshTrigger]=\"artifactViewerRefresh$\"\n (closed)=\"onCloseArtifactPanel()\"\n (saveToCollectionRequested)=\"onSaveToCollectionRequested($event)\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPane()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n\n <!-- Pinned Messages Panel (overlay) -->\n @if (showPinsPanel) {\n <mj-pinned-messages-panel\n [pinnedMessages]=\"pinnedMessages\"\n (closed)=\"showPinsPanel = false\"\n (jumpRequested)=\"onJumpToMessage($event)\"\n (unpinRequested)=\"onUnpinFromPanel($event)\">\n </mj-pinned-messages-panel>\n }\n </div>\n</div>\n\n<!-- Thread Panel -->\n@if (threadId) {\n <mj-thread-panel\n [parentMessageId]=\"threadId\"\n [conversationId]=\"conversationId || ''\"\n [currentUser]=\"currentUser\"\n (closed)=\"onLocalThreadClosed()\"\n (replyAdded)=\"onThreadReplyAdded($event)\">\n </mj-thread-panel>\n}\n\n<!-- Export Modal -->\n<mj-export-modal\n [isVisible]=\"showExportModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"onExportModalCancelled()\"\n (exported)=\"onExportModalComplete()\">\n</mj-export-modal>\n\n<!-- Members Modal -->\n<mj-members-modal\n [isVisible]=\"showMembersModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"showMembersModal = false\"\n (membersChanged)=\"showMembersModal = false\">\n</mj-members-modal>\n\n<!-- Project Selector Modal -->\n@if (showProjectSelector && conversation) {\n <div class=\"modal-overlay\" (click)=\"showProjectSelector = false\">\n <div class=\"modal-content project-selector-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Assign Project</h3>\n <button class=\"modal-close-btn\" (click)=\"showProjectSelector = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <mj-project-selector\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedProjectId]=\"conversation.ProjectID\"\n (projectSelected)=\"onProjectSelected($event)\">\n </mj-project-selector>\n </div>\n </div>\n </div>\n}\n\n<!-- Artifacts Modal -->\n@if (showArtifactsModal) {\n <div class=\"modal-overlay\" (click)=\"showArtifactsModal = false\">\n <div class=\"modal-content artifacts-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Conversation Artifacts</h3>\n <div class=\"modal-header-actions\">\n @if (hasSystemArtifacts) {\n <button class=\"toggle-system-btn\"\n [class.active]=\"showSystemArtifacts\"\n (click)=\"toggleSystemArtifacts()\"\n title=\"Toggle system artifacts visibility\">\n <i class=\"fas fa-cog\"></i>\n <span>{{ showSystemArtifacts ? 'Hide' : 'Show' }} System</span>\n </button>\n }\n <button class=\"modal-close-btn\" (click)=\"showArtifactsModal = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body artifacts-grid\">\n @if (artifactsByDetailId.size === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-cube\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <p style=\"color: var(--mj-text-muted); font-size: 14px;\">No artifacts in this conversation yet</p>\n </div>\n }\n @for (artifact of getArtifactsArray(); track artifact.artifactId) {\n <div class=\"artifact-modal-card\"\n [class.expanded]=\"expandedArtifactId === artifact.artifactId\"\n [class.system-artifact]=\"artifact.visibility === 'System Only'\">\n <!-- Main card header - click to open latest version -->\n <div class=\"artifact-card-header\" (click)=\"openArtifactFromModal(artifact.artifactId)\">\n <div class=\"artifact-modal-icon\">\n <i class=\"fas fa-file-code\"></i>\n </div>\n <div class=\"artifact-modal-info\">\n <div class=\"artifact-modal-title\">{{artifact.name}}</div>\n <div class=\"artifact-modal-meta\">\n @if (artifact.versionCount > 1) {\n {{artifact.versionCount}} versions\n } @else {\n 1 version\n }\n </div>\n </div>\n @if (artifact.versionCount > 1) {\n <button class=\"expand-btn\" (click)=\"toggleArtifactExpansion(artifact.artifactId, $event)\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedArtifactId !== artifact.artifactId\"\n [class.fa-chevron-up]=\"expandedArtifactId === artifact.artifactId\"></i>\n </button>\n }\n <div class=\"artifact-modal-action\">\n <i class=\"fas fa-external-link-alt\"></i>\n </div>\n </div>\n\n <!-- Expanded version list -->\n @if (expandedArtifactId === artifact.artifactId && artifact.versionCount > 1) {\n <div class=\"artifact-versions-list\">\n @for (version of artifact.versions; track version.versionId) {\n <div class=\"artifact-version-item\" (click)=\"openArtifactFromModal(artifact.artifactId, version.versionNumber); $event.stopPropagation()\">\n <span class=\"version-badge\">v{{version.versionNumber}}</span>\n <span class=\"version-open-text\">Open this version</span>\n <i class=\"fas fa-arrow-right\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Collection Picker Modal -->\n@if (showCollectionPicker) {\n <mj-artifact-collection-picker-modal\n [isOpen]=\"showCollectionPicker\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [excludeCollectionIds]=\"collectionPickerExcludedIds\"\n (saved)=\"onCollectionPickerSaved($event)\"\n (cancelled)=\"onCollectionPickerCancelled()\">\n </mj-artifact-collection-picker-modal>\n}\n\n<!-- Artifact Picker Slide-in Panel -->\n@if (showArtifactPickerPanel) {\n <div class=\"artifact-picker-overlay\" (click)=\"CloseArtifactPicker()\"></div>\n <div class=\"artifact-picker-panel\">\n <div class=\"artifact-picker-header\">\n <h3>Attach Artifact</h3>\n <button class=\"artifact-picker-close\" (click)=\"CloseArtifactPicker()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"artifact-picker-body\">\n @if (isLoadingArtifactPicker) {\n <mj-loading text=\"Loading artifacts...\" size=\"medium\"></mj-loading>\n } @else if (artifactPickerItems.length === 0) {\n <div class=\"artifact-picker-empty\">\n <i class=\"fa-solid fa-cube\" style=\"font-size: 2rem; opacity: 0.3;\"></i>\n <p>No file artifacts found</p>\n <p class=\"artifact-picker-hint\">File artifacts are created when agents generate PDF, Excel, or Word documents.</p>\n </div>\n } @else {\n <div class=\"artifact-picker-list\">\n @for (item of artifactPickerItems; track item.artifactVersionId) {\n <button class=\"artifact-picker-item\" (click)=\"OnArtifactSelected(item)\">\n @if (item.contentMode === 'File') {\n <i class=\"fa-solid\" [class.fa-file-pdf]=\"item.mimeType === 'application/pdf'\"\n [class.fa-file-excel]=\"item.mimeType && item.mimeType.includes('spreadsheet')\"\n [class.fa-file-word]=\"item.mimeType && item.mimeType.includes('wordprocessing')\"\n [class.fa-file]=\"!item.mimeType || (!item.mimeType.includes('pdf') && !item.mimeType.includes('spreadsheet') && !item.mimeType.includes('wordprocessing'))\">\n </i>\n } @else {\n <i class=\"fa-solid fa-file-lines\"></i>\n }\n <div class=\"artifact-picker-item-info\">\n <span class=\"artifact-picker-item-name\">{{ item.name }}</span>\n <span class=\"artifact-picker-item-meta\">\n {{ item.contentMode === 'File' ? (item.fileName || '') : 'Text artifact' }}\n @if (item.sizeBytes) {\n · {{ (item.sizeBytes / 1024) | number:'1.0-0' }} KB\n }\n </span>\n </div>\n </button>\n }\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Test Feedback Dialog -->\n@if (testFeedbackDialogData) {\n <mj-test-feedback-dialog\n [visible]=\"showTestFeedbackDialog\"\n [data]=\"testFeedbackDialogData\"\n (closed)=\"onTestFeedbackDialogClosed($event)\">\n </mj-test-feedback-dialog>\n}\n\n<!-- Image Viewer Modal -->\n@if (showImageViewer) {\n <mj-image-viewer\n [imageUrl]=\"selectedImageUrl\"\n [alt]=\"selectedImageAlt\"\n [fileName]=\"selectedImageFileName\"\n [visible]=\"showImageViewer\"\n (closed)=\"onImageViewerClosed()\">\n </mj-image-viewer>\n}"]}
1
+ {"version":3,"file":"conversation-chat-area.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts","../../../../src/lib/components/conversation/conversation-chat-area.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, ViewChildren, QueryList, ElementRef, AfterViewChecked } from '@angular/core';\nimport { UserInfo, Metadata, CompositeKey, LogStatusEx, RunView } from '@memberjunction/core';\nimport { MJConversationEntity, MJConversationDetailEntity, MJAIAgentRunEntity, MJArtifactEntity, MJTaskEntity, ConversationEngine, ConversationDetailComplete, RatingJSON } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { AgentStateService } from '../../services/agent-state.service';\nimport { ConversationAgentService } from '../../services/conversation-agent.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { ArtifactPermissionService } from '../../services/artifact-permission.service';\nimport { ConversationAttachmentService } from '../../services/conversation-attachment.service';\nimport { MessageAttachment } from '../message/message-item.component';\nimport { LazyArtifactInfo } from '../../models/lazy-artifact-info';\nimport { MessageInputComponent } from '../message/message-input.component';\nimport { PendingAttachment } from '../mention/mention-editor.component';\nimport { ArtifactViewerPanelComponent, NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { ConversationEmptyStateComponent } from './conversation-empty-state.component';\nimport { TestFeedbackDialogData, TestFeedbackDialogResult } from '@memberjunction/ng-testing';\nimport { DialogService as ConversationsDialogService } from '../../services/dialog.service';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ConversationStreamingService } from '../../services/conversation-streaming.service';\nimport { ConversationBridgeService } from '../../services/conversation-bridge.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/** Default width (percentage) for the artifact viewer pane */\nconst DEFAULT_ARTIFACT_PANE_WIDTH = 40;\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-chat-area',\n templateUrl: `./conversation-chat-area.component.html`,\n styleUrls: ['./conversation-chat-area.component.css']\n})\nexport class ConversationChatAreaComponent implements OnInit, OnDestroy, AfterViewChecked {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n\n // LOCAL STATE INPUTS - passed from parent workspace\n private _conversationId: string | null = null;\n @Input()\n set conversationId(value: string | null) {\n if (value !== this._conversationId) {\n this._conversationId = value;\n // Trigger change handler after initialization is complete\n // Only skip during Angular's initial binding before ngOnInit completes\n if (this.isInitialized) {\n this.onConversationChanged(value);\n }\n }\n }\n get conversationId(): string | null {\n return this._conversationId;\n }\n\n @Input() conversation: MJConversationEntity | null = null;\n @Input() threadId: string | null = null;\n\n private _isNewConversation: boolean = false;\n @Input()\n set isNewConversation(value: boolean) {\n this._isNewConversation = value;\n if (value) {\n this.focusEmptyStateInput();\n }\n }\n get isNewConversation(): boolean {\n return this._isNewConversation;\n }\n\n // Using getter/setter to ensure correct type handling\n private _pendingMessage: string | null = null;\n @Input()\n set pendingMessage(value: string | null) {\n // Handle case where an object is incorrectly passed\n if (value && typeof value === 'object' && 'text' in value) {\n this._pendingMessage = (value as { text: string }).text;\n } else {\n this._pendingMessage = value;\n }\n }\n get pendingMessage(): string | null {\n return this._pendingMessage;\n }\n\n // Using getter/setter to ensure reactivity\n private _pendingAttachments: PendingAttachment[] | null = null;\n @Input()\n set pendingAttachments(value: PendingAttachment[] | null) {\n this._pendingAttachments = value;\n }\n get pendingAttachments(): PendingAttachment[] | null {\n return this._pendingAttachments;\n }\n\n @Input() pendingArtifactId: string | null = null;\n @Input() pendingArtifactVersionNumber: number | null = null;\n\n /** When true, the component is rendered inside the floating overlay (hides suggested topics, etc.) */\n @Input() overlayMode: boolean = false;\n\n /** Show the Export button in the conversation header. Default true. */\n @Input() showExportButton: boolean = true;\n\n /** Show the Share button in the conversation header. Default true. */\n @Input() showShareButton: boolean = true;\n\n /** Show the artifact count indicator in the conversation header. Default true. */\n @Input() showArtifactIndicator: boolean = true;\n\n /** Application context snapshot for AI agent awareness. Included in agent execution data. */\n @Input() appContext: Record<string, unknown> | null = null;\n\n /** Greeting message shown in the empty state when no conversation is active */\n @Input() emptyStateGreeting: string = 'How can I help you?';\n\n // Sidebar toggle - when true, shows toggle button in header to expand sidebar\n @Input() showSidebarToggle: boolean = false;\n\n @Output() conversationRenamed = new EventEmitter<{conversationId: string; name: string; description: string}>();\n @Output() openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() navigationRequest = new EventEmitter<NavigationRequest>();\n @Output() taskClicked = new EventEmitter<MJTaskEntity>();\n @Output() artifactLinkClicked = new EventEmitter<{type: 'conversation' | 'collection'; id: string}>();\n @Output() sidebarToggleClicked = new EventEmitter<void>();\n\n // STATE CHANGE OUTPUTS - notify parent of state changes\n // conversationCreated now includes pendingMessage and pendingAttachments to ensure atomic state update\n @Output() conversationCreated = new EventEmitter<{\n conversation: MJConversationEntity;\n pendingMessage?: string;\n pendingAttachments?: PendingAttachment[];\n }>();\n @Output() threadOpened = new EventEmitter<string>();\n @Output() threadClosed = new EventEmitter<void>();\n @Output() pendingArtifactConsumed = new EventEmitter<void>();\n @Output() pendingMessageConsumed = new EventEmitter<void>();\n // pendingMessageRequested is deprecated - use conversationCreated with pendingMessage instead\n @Output() pendingMessageRequested = new EventEmitter<{text: string; attachments: PendingAttachment[]}>();\n\n @ViewChild('scrollContainer') private scrollContainer!: ElementRef;\n @ViewChildren('messageInput') private messageInputComponents!: QueryList<MessageInputComponent>;\n @ViewChild(ArtifactViewerPanelComponent) private artifactViewerComponent?: ArtifactViewerPanelComponent;\n @ViewChild(ConversationEmptyStateComponent) private emptyStateComponent?: ConversationEmptyStateComponent;\n\n public messages: MJConversationDetailEntity[] = [];\n public showScrollToBottomIcon = false;\n private scrollToBottom = false;\n private lastLoadedConversationId: string | null = null; // Track which conversation's peripheral data was loaded\n private currentlyLoadingConversationId: string | null = null; // Track which conversation is currently being loaded\n public isProcessing: boolean = false;\n private intentCheckMessage: MJConversationDetailEntity | null = null; // Temporary message shown during intent checking\n public isLoadingConversation: boolean = false; // Set to true only when actively loading conversation data\n\n // User avatar map derived from engine cache\n public userAvatarMap: Map<string, {imageUrl: string | null; iconClass: string | null}> = new Map();\n public memberCount: number = 1;\n public artifactCount: number = 0;\n public artifactCountDisplay: number = 0;\n public isShared: boolean = false;\n public showExportModal: boolean = false;\n public showAgentPanel: boolean = false;\n public showMembersModal: boolean = false;\n public showProjectSelector: boolean = false;\n public showArtifactPanel: boolean = false;\n public showArtifactsModal: boolean = false;\n public showSystemArtifacts: boolean = false; // Toggle for showing system-only artifacts\n public selectedArtifactId: string | null = null;\n public selectedVersionNumber: number | undefined = undefined; // Version to show in artifact viewer\n public artifactPaneWidth: number = DEFAULT_ARTIFACT_PANE_WIDTH;\n public isArtifactPaneMaximized: boolean = false; // Track maximize state\n private artifactPaneWidthBeforeMaximize: number = DEFAULT_ARTIFACT_PANE_WIDTH;\n public expandedArtifactId: string | null = null; // Track which artifact card is expanded in modal\n public showCollectionPicker: boolean = false;\n public collectionPickerArtifactId: string | null = null;\n public collectionPickerExcludedIds: string[] = [];\n\n // Artifact permissions\n public canShareSelectedArtifact: boolean = false;\n public canEditSelectedArtifact: boolean = false;\n\n // Share modal state\n public isArtifactShareModalOpen: boolean = false;\n public artifactToShare: MJArtifactEntity | null = null;\n\n\n // Artifact mapping: ConversationDetailID -> Array of LazyArtifactInfo\n // Uses lazy-loading pattern: display data loaded immediately, full entities on-demand\n // Supports multiple artifacts per conversation detail (0-N relationship)\n public artifactsByDetailId = new Map<string, LazyArtifactInfo[]>();\n\n // System artifacts mapping: ConversationDetailID -> Array of LazyArtifactInfo (Visibility='System Only')\n // Kept separate so we can toggle their display without reloading\n // Made public so it can be passed to MessageInputComponent for payload loading\n public systemArtifactsByDetailId = new Map<string, LazyArtifactInfo[]>();\n\n // Cached combined artifacts map - updated when toggle changes\n private _combinedArtifactsMap: Map<string, LazyArtifactInfo[]> | null = null;\n\n // Agent run mapping: ConversationDetailID -> MJAIAgentRunEntityExtended\n // Loaded once per conversation and kept in sync as new runs are created\n public agentRunsByDetailId = new Map<string, MJAIAgentRunEntityExtended>();\n\n /**\n * Ratings by conversation detail ID (parsed from RatingsJSON)\n */\n public ratingsByDetailId = new Map<string, RatingJSON[]>();\n\n /**\n * Attachments by conversation detail ID (loaded from ConversationDetailAttachments)\n */\n public attachmentsByDetailId = new Map<string, MessageAttachment[]>();\n\n /**\n * In-progress message IDs for streaming reconnection\n * Passed to message-input component to reconnect PubSub updates\n */\n public inProgressMessageIds: string[] = [];\n\n // Subject for cleanup on destroy\n private destroy$ = new Subject<void>();\n\n // Cache of message-input metadata for rendering multiple instances\n // Prevents destruction/recreation when switching conversations for performance\n private messageInputMetadataCache = new Map<string, {conversationId: string; conversationName: string | null}>();\n\n // Empty collections for hidden message-input components\n public readonly emptyArtifactsMap = new Map<string, LazyArtifactInfo[]>();\n public readonly emptyAgentRunsMap = new Map<string, MJAIAgentRunEntityExtended>();\n public readonly emptyInProgressIds: string[] = [];\n\n // Loading state for peripheral data\n public isLoadingPeripheralData: boolean = false;\n\n // Subject to trigger artifact viewer refresh when new version is created\n public artifactViewerRefresh$ = new Subject<{artifactId: string; versionNumber: number}>();\n\n // Track initialization state to prevent loading messages before agents are ready\n private isInitialized: boolean = false;\n\n // Track whether we had active agents on the current conversation's last poll cycle.\n // Used to detect when polling transitions from active → no active agents (completion via poll).\n private hadActiveAgents: boolean = false;\n\n // Resize state\n private isResizing: boolean = false;\n private startX: number = 0;\n private startWidth: number = 0;\n\n // LocalStorage key\n private readonly ARTIFACT_PANE_WIDTH_KEY = 'mj-conversations-artifact-pane-width';\n\n // Pinned messages panel state\n public showPinsPanel: boolean = false;\n\n /** All currently pinned messages in the active conversation, newest pin first */\n get pinnedMessages(): MJConversationDetailEntity[] {\n return this.messages.filter(m => m.IsPinned).reverse();\n }\n\n // Test feedback dialog state\n public showTestFeedbackDialog: boolean = false;\n public testFeedbackDialogData: TestFeedbackDialogData | null = null;\n\n // Image viewer state\n public showImageViewer: boolean = false;\n public selectedImageUrl: string = '';\n public selectedImageAlt: string = '';\n public selectedImageFileName: string = '';\n\n // Upload indicator state (shown centered in conversation area)\n public isUploadingAttachments: boolean = false;\n public uploadingMessage: string = '';\n\n // Artifact picker state\n public showArtifactPickerPanel: boolean = false;\n public artifactPickerItems: Array<{\n artifactId: string; artifactVersionId: string; name: string; description: string;\n contentMode: string; fileID: string | null; mimeType: string | null;\n fileName: string | null; sizeBytes: number; typeName: string; updatedAt: string;\n }> = [];\n public isLoadingArtifactPicker: boolean = false;\n\n // Attachment support based on agent modalities\n // Computed from conversation manager (Sage) and any previous agent in conversation\n public enableAttachments: boolean = false;\n public maxAttachments: number = 10;\n public maxAttachmentSizeBytes: number = 20 * 1024 * 1024; // 20MB default\n public acceptedFileTypes: string = 'image/*';\n private conversationManagerAgent: MJAIAgentEntityExtended | null = null;\n\n private engine = ConversationEngine.Instance;\n\n\n constructor(\n private agentStateService: AgentStateService,\n private conversationAgentService: ConversationAgentService,\n private activeTasks: ActiveTasksService,\n private cdr: ChangeDetectorRef,\n private mentionAutocompleteService: MentionAutocompleteService,\n private artifactPermissionService: ArtifactPermissionService,\n private attachmentService: ConversationAttachmentService,\n private streamingService: ConversationStreamingService,\n private confirmDialog: ConversationsDialogService,\n private bridge: ConversationBridgeService\n ) {}\n\n async ngOnInit() {\n // The workspace component initializes AI Engine and mention service before\n // any child components render, so we can safely skip duplicate initialization.\n // This prevents race conditions and ensures agents are fully loaded.\n\n // Fallback: If workspace didn't initialize (shouldn't happen), initialize now\n if (!this.mentionAutocompleteService['isInitialized']) {\n console.warn('⚠️ Mention autocomplete not initialized by workspace, initializing now...');\n await this.mentionAutocompleteService.initialize(this.currentUser);\n }\n\n // Ensure ConversationEngine and ArtifactMetadataEngine are loaded.\n // Config(false) is a no-op if already loaded by another component.\n // ConversationEngine.Config() also initializes ArtifactMetadataEngine internally.\n await ConversationEngine.Instance.Config(false, this.currentUser);\n\n // Initialize attachment support based on agent modalities\n await this.initializeAttachmentSupport();\n\n // Load saved artifact pane width\n this.loadArtifactPaneWidth();\n\n // Mark as initialized so setter can trigger conversation changes\n this.isInitialized = true;\n\n // Initial load if there's already an active conversation\n if (this.conversationId) {\n await this.onConversationChanged(this.conversationId);\n }\n\n // Setup resize listeners\n window.addEventListener('mousemove', this.onResizeMove.bind(this));\n window.addEventListener('mouseup', this.onResizeEnd.bind(this));\n window.addEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.addEventListener('touchend', this.onResizeTouchEnd.bind(this));\n\n // Handle overlay→workspace handoffs: if the handed-off conversation is already\n // loaded, force a reload from the engine (which has the latest data).\n this.bridge.SwitchEvent$\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n if (event.Target === 'workspace' && event.ConversationID) {\n if (UUIDsEqual(event.ConversationID, this._conversationId)) {\n // Same conversation already displayed — reload from engine\n this.lastLoadedConversationId = null; // Reset so peripheral data reprocesses\n void this.onConversationChanged(event.ConversationID);\n }\n // Different conversation — engine cache is already warm, onConversationChanged\n // will read from it when the parent sets the conversationId input.\n }\n });\n\n // Subscribe to completion events from PubSub\n this.streamingService.completionEvents$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async (event) => {\n // Find the message in our current conversation\n const message = this.messages.find(m => UUIDsEqual(m.ID, event.conversationDetailId));\n if (message) {\n await this.handleMessageCompletion(message, event.agentRunId);\n }\n });\n\n // Subscribe to polling-based agent state as a secondary fallback for completion detection.\n // The sessionId is persisted in localStorage and reused on refresh, so WebSocket events\n // normally arrive correctly. However, there's a brief timing gap between page load and\n // WebSocket reconnection where events can be lost. The catch-up check in\n // detectAndReconcileAgentRuns() is the primary fallback; polling is the last resort.\n this.agentStateService.activeAgents$\n .pipe(takeUntil(this.destroy$))\n .subscribe(async (agents) => {\n if (!this.conversationId) return;\n const conversationAgents = agents.filter(a => UUIDsEqual(a.run.ConversationID, this.conversationId));\n const hasActiveAgents = conversationAgents.length > 0;\n if (this.hadActiveAgents && !hasActiveAgents) {\n // Agents just completed — surgical refresh picks up new messages,\n // updated agent runs, and new artifacts in one query with minimal UI repaint\n await this.engine.RefreshConversationDetails(this.conversationId, this.currentUser);\n\n // Re-read messages from the surgically updated engine cache\n const freshDetails = this.engine.GetCachedDetails(this.conversationId);\n if (freshDetails) {\n this.messages = freshDetails;\n }\n\n // Reprocess peripheral data (artifacts, ratings) from updated cache\n this.lastLoadedConversationId = null;\n await this.loadPeripheralData(this.conversationId);\n\n // Clear active tasks for messages that are no longer in-progress\n for (const message of this.messages) {\n if (message.Status !== 'In-Progress') {\n const task = this.activeTasks.getByConversationDetailId(message.ID);\n if (task) {\n this.activeTasks.remove(task.id);\n }\n }\n }\n\n this.cdr.detectChanges();\n }\n this.hadActiveAgents = hasActiveAgents;\n });\n }\n\n /**\n * Initializes attachment support by checking if the conversation manager agent (Sage)\n * or any recent agent in the conversation supports non-text input modalities.\n */\n private async initializeAttachmentSupport(): Promise<void> {\n try {\n // Ensure AIEngineBase is configured with modality data\n await AIEngineBase.Instance.Config(false);\n\n // Get the conversation manager agent (Sage)\n this.conversationManagerAgent = await this.conversationAgentService.getConversationManagerAgent();\n\n if (this.conversationManagerAgent?.ID) {\n // Get attachment limits from agent metadata (uses Agent → Model → System → Default cascade)\n const limits = AIEngineBase.Instance.GetAgentAttachmentLimits(this.conversationManagerAgent.ID);\n this.enableAttachments = limits.enabled;\n this.maxAttachments = limits.maxAttachments;\n this.maxAttachmentSizeBytes = limits.maxAttachmentSizeBytes;\n this.acceptedFileTypes = limits.acceptedFileTypes;\n LogStatusEx({message: `Attachment support initialized: ${this.enableAttachments} (max ${this.maxAttachments}, ${(this.maxAttachmentSizeBytes / 1024 / 1024).toFixed(0)}MB)`, verboseOnly: true});\n } else {\n // Default to false if we can't determine\n this.enableAttachments = false;\n LogStatusEx({message: 'Attachment support disabled: conversation manager agent not available', verboseOnly: true});\n }\n } catch (error) {\n console.warn('Failed to initialize attachment support:', error);\n this.enableAttachments = false;\n }\n }\n\n /**\n * Updates attachment support based on the current conversation context.\n * Called when conversation changes to check if any agent in the conversation supports attachments.\n */\n private updateAttachmentSupport(): void {\n // Determine which agent to use for limits - prefer last non-Sage agent, fall back to Sage\n let agentIdForLimits = this.conversationManagerAgent?.ID || null;\n\n // Check if any previous non-Sage agent in the conversation supports attachments\n if (this.messages.length > 0) {\n const lastNonSageAgent = this.messages\n .slice()\n .reverse()\n .find(msg =>\n msg.Role === 'AI' &&\n msg.AgentID &&\n !UUIDsEqual(msg.AgentID, this.conversationManagerAgent?.ID)\n );\n\n if (lastNonSageAgent?.AgentID) {\n // Check if this agent supports attachments\n if (AIEngineBase.Instance.AgentSupportsAttachments(lastNonSageAgent.AgentID)) {\n agentIdForLimits = lastNonSageAgent.AgentID;\n }\n }\n }\n\n // Get limits from the determined agent\n if (agentIdForLimits) {\n const limits = AIEngineBase.Instance.GetAgentAttachmentLimits(agentIdForLimits);\n this.enableAttachments = limits.enabled;\n this.maxAttachments = limits.maxAttachments;\n this.maxAttachmentSizeBytes = limits.maxAttachmentSizeBytes;\n this.acceptedFileTypes = limits.acceptedFileTypes;\n } else {\n this.enableAttachments = false;\n }\n }\n\n ngAfterViewChecked() {\n if (this.scrollToBottom) {\n this.scrollToBottom = false;\n setTimeout(() => {\n this.scrollToBottomNow();\n // Check scroll state after scrolling to bottom\n this.checkScroll();\n }, 100);\n }\n // Removed synchronous checkScroll() from else branch to prevent\n // ExpressionChangedAfterItHasBeenCheckedError. Calling detectChanges()\n // inside ngAfterViewChecked re-enters change detection and causes\n // Angular's verification pass to see inconsistent state.\n // Scroll icon visibility is still updated via:\n // 1. (scroll)=\"checkScroll()\" on the scroll container (user scroll events)\n // 2. setTimeout callback above (after programmatic scroll-to-bottom)\n }\n\n ngOnDestroy() {\n // Stop polling when component is destroyed\n this.agentStateService.stopPolling();\n\n // Complete destroy subject to cleanup subscriptions\n this.destroy$.next();\n this.destroy$.complete();\n\n // Remove resize listeners\n window.removeEventListener('mousemove', this.onResizeMove.bind(this));\n window.removeEventListener('mouseup', this.onResizeEnd.bind(this));\n window.removeEventListener('touchmove', this.onResizeTouchMove.bind(this));\n window.removeEventListener('touchend', this.onResizeTouchEnd.bind(this));\n }\n\n private async onConversationChanged(conversationId: string | null): Promise<void> {\n // Prevent double-loading if we're already loading this same conversation\n // (ngDoCheck can fire multiple times during state changes)\n if (this.currentlyLoadingConversationId === conversationId && conversationId !== null) {\n return;\n }\n\n // Do NOT clear activeTasks - they are workspace-level and persist across conversations\n // Clearing causes bugs: global tasks panel blanks out, no notifications when switching\n\n this.showArtifactPanel = false;\n this.selectedArtifactId = null;\n // Reset maximize state so it doesn't carry over to the next conversation\n this.isArtifactPaneMaximized = false;\n this.artifactPaneWidth = DEFAULT_ARTIFACT_PANE_WIDTH; // restore default width\n\n // Reset poll-based completion tracking whenever we switch conversations,\n // so the first empty poll on the new conversation doesn't trigger a spurious reload.\n this.hadActiveAgents = false;\n\n if (conversationId) {\n this.currentlyLoadingConversationId = conversationId;\n\n if (!this.messageInputMetadataCache.has(conversationId)) {\n this.messageInputMetadataCache.set(conversationId, {\n conversationId: conversationId,\n conversationName: this.conversation?.Name || null\n });\n }\n\n // Only show loading spinner if the engine doesn't have cached data for this conversation.\n // This prevents the \"no messages\" flash when switching between conversations.\n const hasCachedMessages = this.engine.HasCachedDetails(conversationId);\n if (!hasCachedMessages) {\n this.isLoadingConversation = true;\n this.messages = [];\n this.cdr.detectChanges();\n }\n\n try {\n await this.loadMessages(conversationId);\n await this.restoreActiveTasks(conversationId);\n // TODO: Replace polling with PubSub - see plans/repair-conversations-ui-performance.md\n this.agentStateService.startPolling(this.currentUser, conversationId);\n } catch (error) {\n console.error('Error loading conversation:', error);\n this.messages = [];\n } finally {\n this.currentlyLoadingConversationId = null;\n this.isLoadingConversation = false;\n\n // Create new array reference to trigger Angular change detection\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n\n // Defensive fallback: force another change detection cycle after async ops complete\n setTimeout(() => {\n if (conversationId === this._conversationId && this.messages.length > 0) {\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n }\n }, 50);\n }\n } else {\n // No active conversation - show empty state\n this.messages = [];\n this.isLoadingConversation = false;\n this.currentlyLoadingConversationId = null;\n this.agentStateService.stopPolling();\n }\n }\n\n /**\n * Returns array of cached message-input metadata for rendering\n * This allows multiple message-input components to exist simultaneously (hidden)\n * preserving their state when switching conversations\n */\n public getCachedInputs(): Array<{conversationId: string; conversationName: string | null}> {\n return Array.from(this.messageInputMetadataCache.values());\n }\n\n /**\n * Focus the message input inside the empty state component.\n * Uses a delay to allow Angular to render the empty state if it's being created.\n */\n private focusEmptyStateInput(): void {\n setTimeout(() => {\n if (this.emptyStateComponent) {\n this.emptyStateComponent.FocusInput();\n }\n }, 150);\n }\n\n /**\n * Get the message input component for the current conversation.\n * Since we cache multiple message-input instances (one per visited conversation),\n * we need to find the one that matches the current conversationId.\n */\n private getActiveMessageInputComponent(): MessageInputComponent | undefined {\n if (!this.messageInputComponents || !this.conversationId) {\n return undefined;\n }\n return this.messageInputComponents.find(\n component => component.conversationId === this.conversationId\n );\n }\n\n private async loadMessages(conversationId: string): Promise<void> {\n try {\n // Single source of truth: ConversationEngine handles caching and DB queries.\n // Cache hit = instant (no DB). Cache miss = one GetConversationComplete query.\n // If peripheral data (artifacts/ratings) changed externally, force refresh to pick up joined fields.\n const existingEntry = this.engine.GetCachedDetailEntry(conversationId);\n const forceRefresh = existingEntry?.PeripheralDataStale === true;\n const cacheEntry = await this.engine.LoadConversationDetails(conversationId, this.currentUser, forceRefresh);\n\n // Set messages from engine cache\n this.messages = cacheEntry.Details;\n\n // Copy user avatars from engine cache\n this.userAvatarMap.clear();\n for (const [userId, avatar] of cacheEntry.UserAvatars) {\n this.userAvatarMap.set(userId, {\n imageUrl: avatar.ImageURL,\n iconClass: avatar.IconClass\n });\n }\n\n this.updateAttachmentSupport();\n\n // Detect in-progress messages for streaming reconnection\n this.inProgressMessageIds = [...this.messages\n .filter(m => m.Status === 'In-Progress')\n .map(m => m.ID)];\n\n if (this.inProgressMessageIds.length > 0) {\n LogStatusEx({message: `🔌 Detected ${this.inProgressMessageIds.length} in-progress messages for reconnection`, verboseOnly: true});\n }\n\n // Check for missed completions (user navigated away, agent completed, user returned)\n for (const message of this.messages) {\n if (message.Status === 'In-Progress' && message.ID) {\n const recentCompletion = this.streamingService.getRecentCompletion(message.ID);\n if (recentCompletion) {\n LogStatusEx({message: `📥 Found missed completion for message ${message.ID}, handling...`, verboseOnly: true});\n this.handleMessageCompletion(message, recentCompletion.agentRunId);\n this.streamingService.clearRecentCompletion(message.ID);\n }\n }\n }\n\n this.scrollToBottom = true;\n\n // Process peripheral data (agent runs, artifacts, ratings, attachments) from engine cache\n await this.loadPeripheralData(conversationId);\n\n await this.detectAndReconcileAgentRuns(conversationId);\n await this.handlePendingArtifactNavigation();\n\n } catch (error) {\n console.error('Error loading messages:', error);\n this.messages = [];\n }\n }\n\n\n /**\n * Process peripheral data (agent runs and artifacts) from cached conversation data\n * Parses JSON columns and builds maps for display\n *\n * PERFORMANCE OPTIMIZATION: Uses cached data instead of querying\n * - Data already loaded by loadMessages() - no additional queries needed\n * - Processes cached JSON data to build display maps\n * - Instant when switching between conversations\n */\n private async loadPeripheralData(conversationId: string): Promise<void> {\n // Skip if we've already processed peripheral data for this conversation\n if (this.lastLoadedConversationId === conversationId) {\n return;\n }\n\n this.lastLoadedConversationId = conversationId;\n\n try {\n // Read from engine cache — always present after loadMessages() calls LoadConversationDetails()\n const cacheEntry = this.engine.GetCachedDetailEntry(conversationId);\n if (!cacheEntry) {\n console.warn(`No engine cache found for conversation ${conversationId}`);\n return;\n }\n\n // Clear and rebuild component maps from engine cache\n this.agentRunsByDetailId.clear();\n this.artifactsByDetailId.clear();\n this.systemArtifactsByDetailId.clear();\n this.ratingsByDetailId.clear();\n\n // Copy agent runs from engine (cast to extended type for UI compatibility)\n for (const [detailId, agentRun] of cacheEntry.AgentRunsByDetailId) {\n this.agentRunsByDetailId.set(detailId, agentRun as MJAIAgentRunEntityExtended);\n }\n\n // Convert ArtifactJSON[] from engine cache into LazyArtifactInfo[] for UI\n for (const [detailId, artifacts] of cacheEntry.ArtifactsByDetailId) {\n const artifactList: LazyArtifactInfo[] = [];\n const systemArtifactList: LazyArtifactInfo[] = [];\n\n for (const artifactData of artifacts) {\n const lazyInfo = new LazyArtifactInfo(artifactData, this.currentUser);\n if (artifactData.Visibility === 'System Only') {\n systemArtifactList.push(lazyInfo);\n } else {\n artifactList.push(lazyInfo);\n }\n }\n\n if (artifactList.length > 0) {\n this.artifactsByDetailId.set(detailId, artifactList);\n }\n if (systemArtifactList.length > 0) {\n this.systemArtifactsByDetailId.set(detailId, systemArtifactList);\n }\n }\n\n // Copy ratings from engine cache\n for (const [detailId, ratings] of cacheEntry.RatingsByDetailId) {\n this.ratingsByDetailId.set(detailId, ratings);\n }\n\n // Load attachments (still separate — not part of GetConversationComplete query)\n this.attachmentsByDetailId.clear();\n const messageIds = cacheEntry.Details.map(d => d.ID).filter((id): id is string => !!id);\n if (messageIds.length > 0) {\n const attachmentsMap = await this.attachmentService.loadAttachmentsForMessages(messageIds, this.currentUser);\n for (const [detailId, attachments] of attachmentsMap) {\n this.attachmentsByDetailId.set(detailId, attachments);\n }\n }\n\n // Create new Map references to trigger Angular change detection\n this.agentRunsByDetailId = new Map(this.agentRunsByDetailId);\n this.artifactsByDetailId = new Map(this.artifactsByDetailId);\n this.ratingsByDetailId = new Map(this.ratingsByDetailId);\n this.systemArtifactsByDetailId = new Map(this.systemArtifactsByDetailId);\n this.attachmentsByDetailId = new Map(this.attachmentsByDetailId);\n\n // Clear combined cache since we loaded new artifacts\n this._combinedArtifactsMap = null;\n\n // Update artifact count for header display\n this.artifactCount = this.calculateUniqueArtifactCount();\n this.updateArtifactCountDisplay();\n\n // Trigger message re-render now that peripheral data is loaded\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n } catch (error) {\n console.error('Failed to process peripheral data:', error);\n this.lastLoadedConversationId = null;\n }\n }\n\n /**\n * REMOVED: Active tasks should only track currently-running tasks in this browser session.\n * Database tasks with 'In-Progress' status are shown in the Tasks dropdown via loadDatabaseTasks().\n * Restoring them here causes duplicate \"Agent Processing...\" entries.\n */\n private async restoreActiveTasks(conversationId: string): Promise<void> {\n // Intentionally empty - ActiveTasksService only tracks in-memory running tasks\n // Database tasks are loaded separately by TasksDropdownComponent\n }\n\n async onMessageSent(message: MJConversationDetailEntity): Promise<void> {\n // Guard: ignore events from hidden message-input instances belonging to other conversations.\n // Multiple inputs are kept alive in the DOM cache (one per visited conversation) and all\n // emit events to this single parent. Without this check, a background agent's response\n // for conversation A would pollute conversation B's message list.\n if (!UUIDsEqual(message.ConversationID, this.conversationId)) {\n // Invalidate that conversation's cache so fresh data loads when the user switches back\n if (message.ConversationID) {\n this.resetComponentState(message.ConversationID);\n }\n return;\n }\n\n // Clear pending message if it was sent - notify parent via output\n if (this.pendingMessage) {\n this.pendingMessageConsumed.emit();\n }\n\n // Check if message already exists in the array (by ID) to prevent duplicates\n // Messages can be emitted multiple times as they're updated (e.g., status changes)\n const existingIndex = this.messages.findIndex(m => UUIDsEqual(m.ID, message.ID));\n\n if (existingIndex >= 0) {\n // Update existing message in place (replace with updated version)\n this.messages = [\n ...this.messages.slice(0, existingIndex),\n message,\n ...this.messages.slice(existingIndex + 1)\n ];\n } else {\n // Add new message to the list\n this.messages = [...this.messages, message];\n\n // Ensure current user is in the avatar map for new messages\n this.ensureCurrentUserInAvatarMap();\n\n // Invalidate cache when new message is added.\n // Without this, navigating away and back would load stale cached data\n // that doesn't include this new message.\n if (this.conversationId) {\n this.resetComponentState(this.conversationId);\n }\n\n // Load attachments for the new message (if any were saved with it)\n // This ensures attachments are displayed immediately after sending\n await this.loadAttachmentsForMessage(message.ID);\n\n // CRITICAL: If this is a new In-Progress AI message, add it to inProgressMessageIds\n // immediately so message-input registers a PubSub streaming callback for it.\n // buildMessagesFromCache handles the nav-away/nav-back reconnection case;\n // this handles the active-session case where the agent just started.\n // Without this, inProgressMessageIds stays [] and the completion event is never received.\n if (message.Status === 'In-Progress' && message.ID && !this.inProgressMessageIds.includes(message.ID)) {\n this.inProgressMessageIds = [...this.inProgressMessageIds, message.ID];\n }\n }\n\n // Scroll to bottom when new message is sent\n this.scrollToBottom = true;\n\n // Force change detection — zone.js 0.15 no longer patches graphql-ws WebSocket callbacks,\n // so progress updates that arrive via PubSub run outside Angular's zone. Without this,\n // the UI does not update when the messages array is modified from a streaming callback.\n this.cdr.detectChanges();\n }\n\n /**\n * Loads attachments for a single message and adds them to the attachmentsByDetailId map.\n * Called after a new message is sent to ensure attachments are displayed immediately.\n */\n private async loadAttachmentsForMessage(messageId: string): Promise<void> {\n try {\n const attachments = await this.attachmentService.loadAttachmentsForMessage(messageId, this.currentUser);\n if (attachments.length > 0) {\n this.attachmentsByDetailId.set(messageId, attachments);\n // Create new map reference to trigger Angular change detection\n this.attachmentsByDetailId = new Map(this.attachmentsByDetailId);\n LogStatusEx({message: `Loaded ${attachments.length} attachment(s) for message ${messageId}`, verboseOnly: true});\n }\n } catch (error) {\n console.warn('Failed to load attachments for message:', error);\n }\n }\n\n /**\n * Ensures the current user is in the avatar map\n * Called when new messages are created to ensure avatar data is available\n */\n private async ensureCurrentUserInAvatarMap(): Promise<void> {\n const userId = this.currentUser.ID;\n\n // If user already in map, skip\n if (this.userAvatarMap.has(userId)) {\n return;\n }\n\n // Load the current user's avatar data\n const md = new Metadata();\n const userEntity = await md.GetEntityObject<any>('MJ: Users');\n await userEntity.Load(userId);\n\n this.userAvatarMap.set(userId, {\n imageUrl: userEntity.UserImageURL || null,\n iconClass: userEntity.UserImageIconClass || null\n });\n\n LogStatusEx({message: `👤 Added current user to avatar map`, verboseOnly: true});\n }\n\n /**\n * Handle agent run detected event from progress updates\n * This is called when the first progress update arrives with an agent run ID\n */\n async onAgentRunDetected(event: {conversationDetailId: string; agentRunId: string}): Promise<void> {\n await this.addAgentRunToMap(event.conversationDetailId, event.agentRunId);\n }\n\n /**\n * Handle message completion event from message-input\n * Refreshes the agent run data in-place to get final status and timestamps\n * Also reloads attachments created during agent execution (e.g., generated images)\n */\n async onMessageComplete(event: {conversationDetailId: string; agentId?: string}): Promise<void> {\n // Get existing agent run from map\n const existingAgentRun = this.agentRunsByDetailId.get(event.conversationDetailId);\n\n if (existingAgentRun?.ID) {\n // Refresh the SAME object by calling Load() - preserves all references\n // duck type check to see if we have a BaseEntity or not\n if (!!existingAgentRun.Load) {\n await existingAgentRun.Load(existingAgentRun.ID); \n }\n else {\n // we do NOT have an existingAgentRun base entity, but rather a simple JSON object so we need to create an object here\n const md = new Metadata();\n const newEntity = await md.GetEntityObject<MJAIAgentRunEntityExtended>('MJ: AI Agent Runs');\n newEntity.LoadFromData(existingAgentRun);\n // swap the map entry to have this object now\n this.agentRunsByDetailId.set(event.conversationDetailId, newEntity);\n\n // Also update ConversationEngine's cache\n if (this.conversationId) {\n ConversationEngine.Instance.SetAgentRunForDetail(this.conversationId, event.conversationDetailId, newEntity);\n }\n }\n\n // Trigger re-render to show updated status\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n }\n\n // Reload attachments for this message to pick up newly created media attachments\n // (e.g., images generated by agent via Generate Image action)\n // This must be done after agent completion because attachments are created by AgentRunner\n // after the agent execution finishes\n await this.loadAttachmentsForMessage(event.conversationDetailId);\n\n // Trigger change detection after async attachment loading to ensure UI updates\n this.cdr.detectChanges();\n }\n\n /**\n * Handle agent run update event from progress updates\n * This is called on EVERY progress update with the full, live agent run object\n * Provides real-time updates of status, timestamps, tokens, cost during execution\n */\n async onAgentRunUpdate(event: {conversationDetailId: string; agentRun?: MJAIAgentRunEntityExtended, agentRunId?: string}): Promise<void> {\n if (event.agentRun) {\n // Directly update map with fresh data from progress (no database query needed)\n // Don't create new Map - message-list component needs to keep the same reference\n this.agentRunsByDetailId.set(event.conversationDetailId, event.agentRun);\n\n // Also update ConversationEngine's cache for other consumers\n if (this.conversationId) {\n ConversationEngine.Instance.SetAgentRunForDetail(this.conversationId, event.conversationDetailId, event.agentRun);\n }\n }\n else {\n // no agent run, should have agentRunId\n await this.addAgentRunToMap(event.conversationDetailId, event.agentRunId!);\n }\n\n // Force message list to re-render with updated agent run\n // This ensures message components receive the fresh agent run data\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n }\n\n /**\n * Public entry point to reload messages in the active conversation.\n * Called by the parent resource wrapper when the user clicks the Refresh button,\n * so that new agent responses are visible without a full page reload.\n */\n public async reloadMessages(): Promise<void> {\n await this.reloadMessagesForActiveConversation();\n }\n\n /**\n * Reload messages from the ConversationEngine cache (no DB round-trip).\n * The engine cache is kept warm by entity event handlers that auto-sync on save/delete.\n * Called when agent completion is detected to discover newly delegated agent messages.\n */\n private async reloadMessagesForActiveConversation(): Promise<void> {\n const conversationId = this.conversationId;\n if (!conversationId) {\n return;\n }\n\n try {\n // Read from engine cache — already warm from entity event handler auto-sync\n const engineDetails = this.engine.GetCachedDetails(conversationId);\n if (!engineDetails || engineDetails.length === 0) {\n return;\n }\n\n // Track existing message IDs before reload to identify new messages\n const existingMessageIds = new Set(this.messages.map(m => m.ID));\n\n // Merge engine cache with existing client-side messages.\n // Preserves messages added client-side (e.g., by handleSubAgentInvocation)\n // that haven't been picked up by entity events yet due to timing.\n const merged = new Map<string, MJConversationDetailEntity>();\n\n for (const msg of engineDetails) {\n merged.set(msg.ID, msg);\n }\n\n // Preserve client-side messages not yet in engine cache\n for (const msg of this.messages) {\n if (!merged.has(msg.ID)) {\n merged.set(msg.ID, msg);\n }\n }\n\n this.messages = Array.from(merged.values())\n .sort((a, b) => (a.__mj_CreatedAt?.getTime() || 0) - (b.__mj_CreatedAt?.getTime() || 0));\n\n // Find newly discovered messages (delegated agents)\n const newMessages = engineDetails.filter(m => !existingMessageIds.has(m.ID));\n\n // Check engine cache for agent runs on new messages\n for (const message of newMessages) {\n if (message.AgentID && message.ID) {\n const agentRun = this.engine.GetAgentRunForDetail(conversationId, message.ID);\n if (agentRun) {\n this.agentRunsByDetailId.set(message.ID, agentRun as MJAIAgentRunEntityExtended);\n LogStatusEx({message: `✅ Found cached agent run for new delegated message ${message.ID}`, verboseOnly: true});\n }\n }\n }\n\n LogStatusEx({message: `✅ Refreshed ${engineDetails.length} messages from engine cache (${newMessages.length} new)`, verboseOnly: true});\n } catch (error) {\n console.error('Failed to reload messages for active conversation:', error);\n }\n }\n\n /**\n * Handle message completion triggered by PubSub completion event\n * Reloads message, agent run, and artifacts, then updates UI\n * @param message The message that completed\n * @param agentRunId The ID of the agent run that completed\n */\n private async handleMessageCompletion(message: MJConversationDetailEntity, _agentRunId: string): Promise<void> {\n try {\n LogStatusEx({message: `🎉 Handling completion for message ${message.ID}`, verboseOnly: true});\n\n // Snapshot artifact IDs before reload to detect newly created artifacts\n const artifactIdsBefore = this.collectAllArtifactIds();\n\n // Reload message from database to get final content and status\n await message.Load(message.ID);\n\n // Reload agent run to get final status, timestamps, and cost\n const agentRun = this.agentRunsByDetailId.get(message.ID);\n if (agentRun?.ID) {\n await agentRun.Load(agentRun.ID);\n }\n\n // Reload artifacts for this completed message\n await this.reloadArtifactsForMessage(message.ID);\n\n // Reload messages to pick up newly delegated agent messages\n // When Sage delegates to Marketing Agent, a new message is created\n await this.reloadMessagesForActiveConversation();\n\n // Invalidate cache since reloadMessages may have loaded new delegated-agent messages\n // that are not in the cache set by reloadArtifactsForMessage().\n // Without this, navigating away and back would show stale data.\n if (message.ConversationID) {\n this.resetComponentState(message.ConversationID);\n }\n\n // Update inProgressMessageIds to include new delegated agents\n // This triggers callback registration via the setter in message-input\n this.inProgressMessageIds = [...this.messages\n .filter(m => m.Status === 'In-Progress')\n .map(m => m.ID)];\n\n // Auto-open artifact panel if NEW artifacts were discovered (not just the triggering message).\n // When Sage delegates to a sub-agent (e.g., Skip), the artifact is on the sub-agent's\n // message, not Sage's. Checking only the triggering message would miss delegated artifacts.\n if (!this.showArtifactPanel) {\n await this.autoOpenNewArtifact(artifactIdsBefore);\n }\n\n // Remove task from ActiveTasksService (clears spinner in conversation list)\n const task = this.activeTasks.getByConversationDetailId(message.ID);\n if (task) {\n this.activeTasks.remove(task.id);\n }\n\n // Force re-render with updated agent run and artifacts\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n\n LogStatusEx({message: `✅ Completion handled for message ${message.ID}`, verboseOnly: true});\n } catch (error) {\n console.error(`Error handling message completion for ${message.ID}:`, error);\n this.cdr.detectChanges();\n }\n }\n\n async onAgentResponse(event: {message: MJConversationDetailEntity, agentResult: any}): Promise<void> {\n // Guard: ignore agent responses from background inputs for other conversations.\n // See onMessageSent() for the full explanation.\n if (!UUIDsEqual(event.message.ConversationID, this.conversationId)) {\n if (event.message.ConversationID) {\n this.resetComponentState(event.message.ConversationID);\n }\n return;\n }\n\n // Add the agent's response message to the conversation\n this.messages = [...this.messages, event.message];\n\n // Invalidate cache for this conversation since we have new messages\n if (this.conversationId) {\n this.resetComponentState(this.conversationId);\n }\n\n // Scroll to bottom when agent responds\n this.scrollToBottom = true;\n\n // CRITICAL FIX: Always refresh the agent run data when agent completes\n // This ensures we get the final status and timestamps, replacing any stale data from when agent started\n // agentResult is ExecuteAgentResult which contains agentRun property\n if (event.agentResult?.agentRun?.ID) {\n await this.addAgentRunToMap(event.message.ID, event.agentResult.agentRun.ID, true); // forceRefresh = true\n }\n\n // Snapshot artifact IDs before reload to detect newly created artifacts\n const artifactIdsBefore = this.collectAllArtifactIds();\n\n // Reload artifact mapping for this message to pick up newly created artifacts\n await this.reloadArtifactsForMessage(event.message.ID);\n\n // Auto-open artifact panel if NEW artifacts were discovered\n if (!this.showArtifactPanel) {\n await this.autoOpenNewArtifact(artifactIdsBefore);\n }\n\n // Force change detection to update the UI\n this.cdr.detectChanges();\n }\n\n /**\n * Reset component-level UI state so peripheral data reprocesses on next load.\n * Does NOT invalidate ConversationEngine cache — the engine is the single source of truth\n * and is kept warm via AddDetailToCache/UpdateDetailInCache.\n */\n private resetComponentState(conversationId: string): void {\n // Reset so loadPeripheralData re-runs on next conversation load\n if (this.lastLoadedConversationId === conversationId) {\n this.lastLoadedConversationId = null;\n }\n }\n\n /**\n * Add or update an agent run in the map\n * Called when a new agent run completes to keep the map in sync\n * @param forceRefresh If true, always reload from database even if already in map (used when status changes)\n */\n private async addAgentRunToMap(conversationDetailId: string, agentRunId: string, forceRefresh: boolean = false): Promise<MJAIAgentRunEntityExtended> {\n try {\n // Always refresh if forced, or if not in map yet\n if (forceRefresh || !this.agentRunsByDetailId.has(conversationDetailId)) {\n const md = new Metadata();\n const agentRun = await md.GetEntityObject<MJAIAgentRunEntityExtended>('MJ: AI Agent Runs', this.currentUser);\n if (await agentRun.Load(agentRunId)) {\n this.agentRunsByDetailId.set(conversationDetailId, agentRun);\n\n // Also update ConversationEngine's cache for other consumers\n if (this.conversationId) {\n ConversationEngine.Instance.SetAgentRunForDetail(this.conversationId, conversationDetailId, agentRun);\n }\n\n // Force message list to re-render with updated agent run\n // Keep same Map reference so message-list component can access updates\n this.messages = [...this.messages];\n this.cdr.detectChanges();\n\n }\n return agentRun;\n } \n else {\n return this.agentRunsByDetailId.get(conversationDetailId)!;\n }\n } catch (error) {\n console.error('Failed to load agent run for map:', error);\n throw error;\n }\n }\n\n /**\n * Reload artifacts for a conversation, triggered by a specific message ID.\n * Processes ALL messages in the conversation (not just the trigger message)\n * so that artifacts from delegated sub-agent messages are also picked up.\n * Called after an artifact is created to update the UI immediately.\n * Invalidates and refreshes the conversation cache.\n */\n private async reloadArtifactsForMessage(conversationDetailId: string): Promise<void> {\n LogStatusEx({message: `🔄 Reloading artifacts for message ${conversationDetailId}`, verboseOnly: true});\n try {\n const md = new Metadata();\n\n // Get the ConversationID for this detail\n const detail = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n if (!(await detail.Load(conversationDetailId))) {\n console.error('Failed to load conversation detail');\n return;\n }\n\n // Surgical refresh — merges new artifacts into existing cache without replacing objects\n await this.engine.RefreshConversationDetails(detail.ConversationID, this.currentUser);\n\n // Reprocess peripheral data from the updated engine cache\n this.lastLoadedConversationId = null;\n await this.loadPeripheralData(detail.ConversationID);\n } catch (error) {\n console.error('Failed to reload artifacts for message:', error);\n }\n }\n\n openProjectSelector(): void {\n this.showProjectSelector = true;\n }\n\n toggleMembersModal(): void {\n this.showMembersModal = !this.showMembersModal;\n }\n\n viewArtifacts(): void {\n this.showArtifactsModal = true;\n }\n\n /**\n * Recompute the cached artifactCountDisplay from the effective artifacts map.\n * Must be called whenever artifactsByDetailId, systemArtifactsByDetailId,\n * or showSystemArtifacts changes, instead of using a getter that can produce\n * different values between Angular change-detection passes (NG0100).\n */\n private updateArtifactCountDisplay(): void {\n const uniqueArtifactIds = new Set<string>();\n for (const artifactList of this.effectiveArtifactsMap.values()) {\n for (const info of artifactList) {\n uniqueArtifactIds.add(info.artifactId);\n }\n }\n this.artifactCountDisplay = uniqueArtifactIds.size;\n }\n\n /**\n * Calculate count of unique artifacts (not versions) - user-visible only\n * Used for initial artifact count (doesn't change with toggle)\n */\n private calculateUniqueArtifactCount(): number {\n const uniqueArtifactIds = new Set<string>();\n for (const artifactList of this.artifactsByDetailId.values()) {\n for (const info of artifactList) {\n uniqueArtifactIds.add(info.artifactId);\n }\n }\n return uniqueArtifactIds.size;\n }\n\n /**\n * Collect all currently known artifact IDs across all messages.\n * Used as a \"before\" snapshot to detect newly created artifacts after a reload.\n */\n private collectAllArtifactIds(): Set<string> {\n const ids = new Set<string>();\n for (const artifactList of this.artifactsByDetailId.values()) {\n for (const info of artifactList) {\n ids.add(info.artifactId);\n }\n }\n return ids;\n }\n\n /**\n * Auto-open the artifact panel for the most recent NEW artifact.\n * Compares current artifacts against a pre-reload snapshot to find\n * only artifacts that were just discovered (avoiding re-opening for old artifacts).\n * Searches artifactsByDetailId directly rather than iterating this.messages,\n * because reloadMessagesForActiveConversation can temporarily remove messages\n * from this.messages during concurrent operations.\n */\n private async autoOpenNewArtifact(artifactIdsBefore: Set<string>): Promise<void> {\n for (const [detailId, artifactList] of this.artifactsByDetailId) {\n const newArtifact = artifactList.find(a => !artifactIdsBefore.has(a.artifactId));\n if (newArtifact) {\n this.selectedArtifactId = newArtifact.artifactId;\n this.showArtifactPanel = true;\n await this.loadArtifactPermissions(newArtifact.artifactId);\n LogStatusEx({message: `🎨 Auto-opening new artifact ${newArtifact.artifactId} from detail ${detailId}`, verboseOnly: true});\n return;\n }\n }\n }\n\n /**\n * Get the effective artifacts map based on showSystemArtifacts toggle\n * Combines user-visible and system artifacts when toggle is on\n * Uses caching to prevent infinite change detection loops\n */\n public get effectiveArtifactsMap(): Map<string, LazyArtifactInfo[]> {\n if (!this.showSystemArtifacts) {\n // Only user-visible artifacts - no need to cache\n return this.artifactsByDetailId;\n }\n\n // Return cached combined map if available\n if (this._combinedArtifactsMap) {\n return this._combinedArtifactsMap;\n }\n\n // Combine both maps when showing system artifacts\n const combined = new Map<string, LazyArtifactInfo[]>();\n\n // Add all user-visible artifacts\n for (const [key, value] of this.artifactsByDetailId) {\n combined.set(key, [...value]);\n }\n\n // Add system artifacts\n for (const [key, value] of this.systemArtifactsByDetailId) {\n if (combined.has(key)) {\n // Merge with existing artifacts for this detail\n combined.get(key)!.push(...value);\n } else {\n combined.set(key, [...value]);\n }\n }\n\n // Cache the result\n this._combinedArtifactsMap = combined;\n return combined;\n }\n\n /**\n * Toggles system artifacts visibility\n * Clears the cache so the map will be rebuilt on next access\n */\n public toggleSystemArtifacts(): void {\n this.showSystemArtifacts = !this.showSystemArtifacts;\n this._combinedArtifactsMap = null; // Clear cache\n this.updateArtifactCountDisplay();\n this.cdr.detectChanges(); // Force update\n }\n\n /**\n * Check if there are any system artifacts in this conversation\n * Used to conditionally show/hide the \"Show System\" toggle button\n */\n public get hasSystemArtifacts(): boolean {\n return this.systemArtifactsByDetailId.size > 0;\n }\n\n /**\n * Get unique artifacts grouped by artifact ID (not by conversation detail)\n * Returns the latest version info for each unique artifact with all versions\n * Works with LazyArtifactInfo - uses display data without loading full entities\n * Respects showSystemArtifacts toggle\n */\n getArtifactsArray(): Array<{\n artifactId: string;\n versionId: string;\n name: string;\n versionCount: number;\n visibility: string;\n versions: Array<{versionId: string; versionNumber: number}>\n }> {\n const artifactMap = new Map<string, {\n artifactId: string;\n versionId: string;\n name: string;\n visibility: string;\n versions: Array<{versionId: string; versionNumber: number}>\n }>();\n\n // Group by artifactId, collecting all version details\n // Use effectiveArtifactsMap to respect showSystemArtifacts toggle\n for (const artifactList of this.effectiveArtifactsMap.values()) {\n for (const info of artifactList) {\n const artifactId = info.artifactId;\n const versionId = info.artifactVersionId;\n const versionNumber = info.versionNumber || 1;\n const name = info.artifactName || 'Untitled';\n\n if (!artifactMap.has(artifactId)) {\n artifactMap.set(artifactId, {\n artifactId: artifactId,\n versionId: versionId, // Latest version ID\n name: name,\n visibility: info.visibility,\n versions: [{versionId: versionId, versionNumber: versionNumber}]\n });\n } else {\n // Add version if not already present\n const existing = artifactMap.get(artifactId)!;\n if (!existing.versions.some(v => v.versionId === versionId)) {\n existing.versions.push({versionId: versionId, versionNumber: versionNumber});\n // Update to latest version ID (assuming versions are added chronologically)\n existing.versionId = versionId;\n }\n }\n }\n }\n\n // Convert to array with version count, sorted by version number descending\n return Array.from(artifactMap.values()).map(item => ({\n artifactId: item.artifactId,\n versionId: item.versionId,\n name: item.name,\n visibility: item.visibility,\n versionCount: item.versions.length,\n versions: item.versions.sort((a, b) => b.versionNumber - a.versionNumber)\n }));\n }\n\n toggleArtifactExpansion(artifactId: string, event: Event): void {\n event.stopPropagation(); // Prevent opening artifact when clicking expand button\n this.expandedArtifactId = this.expandedArtifactId === artifactId ? null : artifactId;\n }\n\n async openArtifactFromModal(artifactId: string, versionNumber?: number): Promise<void> {\n this.selectedArtifactId = artifactId;\n this.selectedVersionNumber = versionNumber;\n this.showArtifactPanel = true;\n this.showArtifactsModal = false;\n\n // Load permissions for the selected artifact\n await this.loadArtifactPermissions(artifactId);\n this.cdr.detectChanges();\n }\n\n exportConversation(): void {\n if (this.conversation) {\n this.showExportModal = true;\n }\n }\n\n onExportModalCancelled(): void {\n this.showExportModal = false;\n }\n\n onExportModalComplete(): void {\n this.showExportModal = false;\n }\n\n async onProjectSelected(project: any): Promise<void> {\n if (this.conversation && project) {\n try {\n await this.engine.SaveConversation(\n this.conversation.ID,\n { ProjectID: project.ID },\n this.currentUser\n );\n this.showProjectSelector = false;\n } catch (error) {\n console.error('Failed to assign project:', error);\n }\n } else if (this.conversation && !project) {\n // Remove project assignment\n try {\n await this.engine.SaveConversation(\n this.conversation.ID,\n { ProjectID: null },\n this.currentUser\n );\n this.showProjectSelector = false;\n } catch (error) {\n console.error('Failed to remove project:', error);\n }\n }\n }\n\n shareConversation(): void {\n // TODO: Implement share functionality\n LogStatusEx({message: 'Share conversation', verboseOnly: true});\n }\n\n onReplyInThread(message: MJConversationDetailEntity): void {\n // Open thread panel for this message - emit to parent\n this.threadOpened.emit(message.ID);\n }\n\n onViewThread(message: MJConversationDetailEntity): void {\n // Open thread panel for this message - emit to parent\n this.threadOpened.emit(message.ID);\n }\n\n onLocalThreadClosed(): void {\n // Close the thread panel - emit to parent\n this.threadClosed.emit();\n }\n\n onThreadReplyAdded(reply: MJConversationDetailEntity): void {\n // Optionally refresh the message list to update thread counts\n // For now, we'll just log it\n LogStatusEx({message: 'Thread reply added', verboseOnly: true, additionalArgs: [reply]});\n\n // Reload messages to get updated thread counts\n if (this.conversationId) {\n this.loadMessages(this.conversationId);\n }\n }\n\n onToggleAgentPanel(): void {\n this.showAgentPanel = !this.showAgentPanel;\n // The agent panel component handles its own visibility\n // This could be used to toggle a modal or different view\n }\n\n onAgentSelected(agentRun: MJAIAgentRunEntity): void {\n // When an agent is clicked in the indicator, could show details\n LogStatusEx({message: 'Agent selected', verboseOnly: true, additionalArgs: [agentRun.ID]});\n // Could open a modal or navigate to agent details\n }\n\n onMessageEdited(message: MJConversationDetailEntity): void {\n // Message was edited and saved, trigger change detection\n LogStatusEx({message: 'Message edited', verboseOnly: true, additionalArgs: [message.ID]});\n // The message entity is already updated in place, so no need to reload\n // Just ensure the UI reflects the changes\n }\n\n onMessagePinToggled(message: MJConversationDetailEntity): void {\n // The entity object is already mutated by .Save() and the engine cache holds the same\n // object reference, so no explicit cache update is needed here.\n // Update engine's raw data cache to stay in sync\n if (this.conversationId) {\n const cacheEntry = this.engine.GetCachedDetailEntry(this.conversationId);\n if (cacheEntry) {\n const row = cacheEntry.RawData.find((r: ConversationDetailComplete) => UUIDsEqual(r.ID, message.ID));\n if (row) {\n row.IsPinned = message.IsPinned;\n }\n }\n }\n // Auto-close the panel when the last pin is removed\n if (this.showPinsPanel && this.pinnedMessages.length === 0) {\n setTimeout(() => { this.showPinsPanel = false; this.cdr.detectChanges(); }, 600);\n }\n this.cdr.detectChanges();\n }\n\n /**\n * Scrolls the message list to the target message and plays the beacon animation.\n * Called when the user clicks \"Jump to message\" in the pins panel.\n */\n onJumpToMessage(messageId: string): void {\n const el = this.scrollContainer?.nativeElement?.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (!el) return;\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\n // Add beacon animation after scroll settles\n setTimeout(() => {\n el.classList.add('pin-beacon');\n setTimeout(() => el.classList.remove('pin-beacon'), 1500);\n }, 350);\n }\n\n /**\n * Unpins a message from the pins panel — saves to DB and patches the cache.\n */\n async onUnpinFromPanel(message: MJConversationDetailEntity): Promise<void> {\n const previous = message.IsPinned;\n message.IsPinned = false;\n this.cdr.detectChanges();\n try {\n await message.Save();\n this.onMessagePinToggled(message);\n } catch (err) {\n console.error('Failed to unpin message from panel:', err);\n message.IsPinned = previous;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle suggested response selection from user\n * Sends the selected response as a new user message WITHOUT modifying the visible input\n */\n async onSuggestedResponseSelected(event: {text: string; customInput?: string}): Promise<void> {\n const messageText = event.customInput || event.text;\n\n // Get the active message input for the current conversation\n // (we cache multiple instances, one per visited conversation)\n const activeInput = this.getActiveMessageInputComponent();\n\n // If we have an active conversation with message input available, use it\n if (activeInput && !this.isNewConversation) {\n await activeInput.sendMessageWithText(messageText);\n } else if (!this.conversation || this.isNewConversation) {\n // If no conversation or in new unsaved state, route through empty state handler\n // This will create the conversation and send the message\n await this.onEmptyStateMessageSent({ text: messageText, attachments: [] });\n } else {\n console.error('MessageInputComponent not available and not in a valid state to create conversation');\n }\n }\n\n async onDeleteMessage(message: MJConversationDetailEntity): Promise<void> {\n if (!UUIDsEqual(this.conversation?.UserID, this.currentUser?.ID)) return;\n\n // Find this message and all messages after it sorted by creation time\n const sortedMessages = [...this.messages].sort((a, b) =>\n new Date(a.__mj_CreatedAt!).getTime() - new Date(b.__mj_CreatedAt!).getTime()\n );\n const targetIndex = sortedMessages.findIndex(m => UUIDsEqual(m.ID, message.ID));\n if (targetIndex === -1) return;\n\n const toHide = sortedMessages.slice(targetIndex);\n const count = toHide.length;\n\n const confirmed = await this.confirmDialog.confirm({\n title: 'Delete Messages',\n message: count === 1\n ? 'Delete this message? This cannot be undone.'\n : `Delete this message and the ${count - 1} message${count - 1 === 1 ? '' : 's'} after it? This cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n if (!confirmed) return;\n\n // Load all entities in parallel, then delete in parallel.\n // entity.Delete() calls spDeleteConversationDetail which handles all FK children:\n // hard-deletes junction tables (Artifact/Attachment/Rating), nullifies FKs on AI* records.\n const md = new Metadata();\n const loadResults = await Promise.all(\n toHide.map(async msg => {\n const entity = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n const loaded = await entity.Load(msg.ID);\n return loaded ? entity : null;\n })\n );\n const entities = loadResults.filter((e): e is MJConversationDetailEntity => e !== null);\n if (entities.length === 0) return;\n\n // Sequential deletes — parallel fires concurrent server-side transactions which race on\n // SQLServerDataProvider's singleton _transactionDepth counter and fail with SAVE TRANSACTION errors.\n for (const e of entities) {\n const ok = await e.Delete();\n if (!ok) {\n const last = e.ResultHistory[e.ResultHistory.length - 1];\n console.error(`Failed to delete ConversationDetail ${e.ID}: ${last?.Message ?? 'unknown error'}`, last?.Error ?? '');\n }\n }\n\n const hideIds = new Set(toHide.map(m => m.ID));\n this.messages = this.messages.filter(m => !hideIds.has(m.ID));\n this.resetComponentState(this.conversationId!);\n this.cdr.detectChanges();\n }\n\n onRetryMessage(message: MJConversationDetailEntity): void {\n // TODO: Implement retry logic\n // This should find the parent user message and re-trigger the agent invocation\n LogStatusEx({message: 'Retry requested for message', verboseOnly: true, additionalArgs: [message.ID]});\n // For now, just log it - full implementation would require refactoring agent invocation\n }\n\n /**\n * Handle attachment click - opens the image viewer for images\n */\n onAttachmentClicked(attachment: MessageAttachment): void {\n if (attachment.type === 'Image' && attachment.contentUrl) {\n this.selectedImageUrl = attachment.contentUrl;\n this.selectedImageAlt = attachment.fileName || 'Image attachment';\n this.selectedImageFileName = attachment.fileName || 'image';\n this.showImageViewer = true;\n } else {\n // For non-image attachments, could trigger download or other action\n console.log('Non-image attachment clicked:', attachment);\n }\n }\n\n /**\n * Handle image viewer close\n */\n onImageViewerClosed(): void {\n this.showImageViewer = false;\n this.selectedImageUrl = '';\n this.selectedImageAlt = '';\n this.selectedImageFileName = '';\n }\n\n /**\n * Handle upload state changes from message input component\n */\n onUploadStateChanged(event: {isUploading: boolean; message: string}): void {\n this.isUploadingAttachments = event.isUploading;\n this.uploadingMessage = event.message;\n }\n\n async onArtifactClicked(data: {artifactId: string; versionId?: string}): Promise<void> {\n this.selectedArtifactId = data.artifactId;\n\n // If versionId is provided, find the version number from display data (no lazy load needed)\n if (data.versionId) {\n for (const artifactList of this.artifactsByDetailId.values()) {\n for (const artifactInfo of artifactList) {\n if (artifactInfo.artifactVersionId === data.versionId) {\n this.selectedVersionNumber = artifactInfo.versionNumber;\n LogStatusEx({message: `📦 Opening artifact viewer for v${this.selectedVersionNumber}`, verboseOnly: true});\n break;\n }\n }\n }\n } else {\n // No specific version, let viewer default to latest\n this.selectedVersionNumber = undefined;\n }\n\n this.showArtifactPanel = true;\n\n // Load permissions for the selected artifact\n await this.loadArtifactPermissions(data.artifactId);\n\n // Trigger detectChanges after all state is settled (showArtifactPanel, permissions)\n // to prevent ExpressionChangedAfterItHasBeenCheckedError from zone-triggered CD\n // seeing partial state between the await boundaries\n this.cdr.detectChanges();\n }\n\n async onArtifactCreated(data: {conversationDetailId: string, artifactId: string; versionId: string; versionNumber: number; name: string}): Promise<void> {\n // Snapshot artifact IDs before reload to detect newly created artifacts\n const artifactIdsBefore = this.collectAllArtifactIds();\n\n // Reload artifacts to get full entities (processes ALL messages in the conversation)\n await this.reloadArtifactsForMessage(data.conversationDetailId);\n\n // Auto-open artifact panel if no artifact currently shown\n if (!this.showArtifactPanel) {\n // Use robust auto-open that checks ALL messages for new artifacts.\n // When a sub-agent (e.g., Skip) creates an artifact on a different ConversationDetail\n // than the one specified in the event, checking only data.conversationDetailId would miss it.\n await this.autoOpenNewArtifact(artifactIdsBefore);\n } else if (this.selectedArtifactId) {\n // Panel is already open - check if new artifact is a new version of currently displayed artifact\n const artifactList = this.artifactsByDetailId.get(data.conversationDetailId);\n if (artifactList && artifactList.length > 0) {\n const currentArtifact = artifactList.find(a => a.artifactId === this.selectedArtifactId);\n if (currentArtifact) {\n // New version of the same artifact - refresh to show latest version\n const latestVersion = artifactList[artifactList.length - 1];\n this.artifactViewerRefresh$.next({\n artifactId: latestVersion.artifactId,\n versionNumber: latestVersion.versionNumber\n });\n }\n }\n }\n\n // Force change detection to update the UI immediately\n this.cdr.detectChanges();\n }\n\n onCloseArtifactPanel(): void {\n this.showArtifactPanel = false;\n this.selectedArtifactId = null;\n // Clear permissions\n this.canShareSelectedArtifact = false;\n this.canEditSelectedArtifact = false;\n // Reset maximize state and width when closing so the next artifact opens at default size\n this.isArtifactPaneMaximized = false;\n this.artifactPaneWidth = DEFAULT_ARTIFACT_PANE_WIDTH;\n this.cdr.detectChanges();\n }\n\n toggleMaximizeArtifactPane(): void {\n if (this.isArtifactPaneMaximized) {\n // Restore to previous width\n this.artifactPaneWidth = this.artifactPaneWidthBeforeMaximize;\n this.isArtifactPaneMaximized = false;\n } else {\n // Maximize - store current width and set to 100%\n this.artifactPaneWidthBeforeMaximize = this.artifactPaneWidth;\n this.artifactPaneWidth = 100;\n this.isArtifactPaneMaximized = true;\n }\n }\n\n onSaveToCollectionRequested(event: {artifactId: string; excludedCollectionIds: string[]}): void {\n this.collectionPickerArtifactId = event.artifactId;\n this.collectionPickerExcludedIds = event.excludedCollectionIds;\n this.showCollectionPicker = true;\n }\n\n async onCollectionPickerSaved(collectionIds: string[]): Promise<void> {\n if (!this.collectionPickerArtifactId || !this.artifactViewerComponent) {\n return;\n }\n\n // Call the artifact viewer's save method\n const success = await this.artifactViewerComponent.saveToCollections(collectionIds);\n if (success) {\n this.showCollectionPicker = false;\n this.collectionPickerArtifactId = null;\n this.collectionPickerExcludedIds = [];\n this.cdr.detectChanges();\n }\n }\n\n onCollectionPickerCancelled(): void {\n this.showCollectionPicker = false;\n this.collectionPickerArtifactId = null;\n this.collectionPickerExcludedIds = [];\n }\n\n /**\n * Helper method to check if a conversation detail has an artifact\n * Used by message components to determine whether to show artifact card\n */\n public conversationDetailHasArtifact(conversationDetailId: string): boolean {\n return this.artifactsByDetailId.has(conversationDetailId);\n }\n\n /**\n * Get artifact info for a conversation detail\n * Returns the LAST (most recent) artifact if multiple exist\n * Returns LazyArtifactInfo - caller can trigger lazy load if full entities needed\n */\n public getArtifactInfo(conversationDetailId: string): LazyArtifactInfo | undefined {\n const artifactList = this.artifactsByDetailId.get(conversationDetailId);\n return artifactList && artifactList.length > 0\n ? artifactList[artifactList.length - 1]\n : undefined;\n }\n\n /**\n * Get ALL artifacts for a conversation detail\n * Use this when you need to display all artifacts (e.g., in a list)\n * Returns LazyArtifactInfo array - caller can trigger lazy load if full entities needed\n */\n public getAllArtifactsForDetail(conversationDetailId: string): LazyArtifactInfo[] {\n return this.artifactsByDetailId.get(conversationDetailId) || [];\n }\n\n /**\n * Resize handle methods for artifact pane\n */\n onResizeStart(event: MouseEvent): void {\n this.isResizing = true;\n this.startX = event.clientX;\n this.startWidth = this.artifactPaneWidth;\n event.preventDefault();\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n private onResizeMove(event: MouseEvent): void {\n if (!this.isResizing) return;\n\n const containerWidth = (event.currentTarget as Window).innerWidth;\n const deltaX = this.startX - event.clientX; // Reversed: drag left = wider artifact pane\n const deltaPercent = (deltaX / containerWidth) * 100;\n let newWidth = this.startWidth + deltaPercent;\n\n // Constrain between 20% and 70%\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPaneWidth = newWidth;\n }\n\n private onResizeEnd(event: MouseEvent): void {\n if (this.isResizing) {\n this.isResizing = false;\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n\n // Save to localStorage\n this.saveArtifactPaneWidth();\n }\n }\n\n /**\n * Touch event handlers for mobile resize support\n */\n onResizeTouchStart(event: TouchEvent): void {\n this.isResizing = true;\n const touch = event.touches[0];\n this.startX = touch.clientX;\n this.startWidth = this.artifactPaneWidth;\n event.preventDefault();\n }\n\n private onResizeTouchMove(event: TouchEvent): void {\n if (!this.isResizing) return;\n\n const touch = event.touches[0];\n const containerWidth = window.innerWidth;\n const deltaX = this.startX - touch.clientX;\n const deltaPercent = (deltaX / containerWidth) * 100;\n let newWidth = this.startWidth + deltaPercent;\n\n newWidth = Math.max(20, Math.min(70, newWidth));\n this.artifactPaneWidth = newWidth;\n }\n\n private onResizeTouchEnd(event: TouchEvent): void {\n if (this.isResizing) {\n this.isResizing = false;\n this.saveArtifactPaneWidth();\n }\n }\n\n /**\n * LocalStorage persistence methods for artifact pane\n */\n private loadArtifactPaneWidth(): void {\n try {\n const saved = localStorage.getItem(this.ARTIFACT_PANE_WIDTH_KEY);\n if (saved) {\n const width = parseFloat(saved);\n if (!isNaN(width) && width >= 20 && width <= 70) {\n this.artifactPaneWidth = width;\n }\n }\n } catch (error) {\n console.warn('Failed to load artifact pane width from localStorage:', error);\n }\n }\n\n private saveArtifactPaneWidth(): void {\n try {\n localStorage.setItem(this.ARTIFACT_PANE_WIDTH_KEY, this.artifactPaneWidth.toString());\n } catch (error) {\n console.warn('Failed to save artifact pane width to localStorage:', error);\n }\n }\n\n onConversationRenamed(event: {conversationId: string; name: string; description: string}): void {\n LogStatusEx({message: '🎉 Conversation renamed', verboseOnly: true, additionalArgs: [event]});\n // Pass the event up to workspace component for animation\n this.conversationRenamed.emit(event);\n }\n\n /**\n * Handle message sent from empty state component\n * Creates a new conversation and emits to parent to update selection\n */\n async onEmptyStateMessageSent(event: {text: string; attachments: PendingAttachment[]}): Promise<void> {\n const { text, attachments } = event;\n if (!text?.trim() && (!attachments || attachments.length === 0)) {\n return;\n }\n\n LogStatusEx({message: '📨 Empty state message received', verboseOnly: true, additionalArgs: [text, `${attachments?.length || 0} attachments`]});\n\n try {\n this.isProcessing = true;\n\n // Create a new conversation using the engine\n const newConversation = await this.engine.CreateConversation(\n 'New Conversation', // Temporary name - will be auto-named after first message\n this.environmentId,\n this.currentUser\n );\n\n if (!newConversation) {\n console.error('Failed to create new conversation');\n this.isProcessing = false;\n return;\n }\n\n LogStatusEx({message: '✅ Created new conversation', verboseOnly: true, additionalArgs: [newConversation.ID]});\n\n // Emit to parent with the new conversation AND the pending message/attachments in a single event\n // This ensures atomic state update - workspace sets all state before Angular change detection\n // creates the new message-input component\n const pendingMessage = text?.trim() || '';\n const pendingAttachments = attachments || [];\n this.conversationCreated.emit({\n conversation: newConversation,\n pendingMessage,\n pendingAttachments\n });\n\n } catch (error) {\n console.error('Error creating conversation from empty state:', error);\n } finally {\n this.isProcessing = false;\n }\n }\n\n onOpenEntityRecord(event: {entityName: string; compositeKey: CompositeKey}): void {\n // Pass the event up to the parent component (workspace or explorer wrapper)\n this.openEntityRecord.emit(event);\n }\n\n onNavigationRequest(event: NavigationRequest): void {\n // Pass the event up to the parent component for app-level navigation\n this.navigationRequest.emit(event);\n }\n\n viewTestRun(testRunId: string): void {\n // Open the test run record in the entity viewer\n const compositeKey = new CompositeKey();\n compositeKey.KeyValuePairs.push({ FieldName: 'ID', Value: testRunId });\n this.openEntityRecord.emit({\n entityName: 'MJ: Test Runs',\n compositeKey\n });\n }\n\n /**\n * Handles Shift+Click on an AI message bubble.\n * Dumps a live snapshot of in-memory streaming and agent-run state to the browser\n * console so engineers can debug stuck/forever-spinning conversations without\n * needing to add any temporary code.\n *\n * Usage: Hold Shift and click any AI message bubble. Open DevTools Console to see the dump.\n */\n onDiagnosticRequested(messageId: string): void {\n const streaming = this.streamingService.getDiagnosticSnapshot(messageId);\n const agentRun = this.agentRunsByDetailId.get(messageId);\n const isInProgress = this.inProgressMessageIds.includes(messageId);\n\n console.group(`%c[MJ Diagnostic Dump] Message ${messageId}`, 'color: #0076b6; font-weight: bold');\n console.log('Timestamp:', new Date().toISOString());\n console.log('ConversationID:', this.conversationId);\n console.log('isInProgress (UI):', isInProgress);\n console.log('All inProgressMessageIds:', [...this.inProgressMessageIds]);\n console.log('Streaming connection:', streaming.connectionStatus);\n console.log('Streaming callbacks registered:', streaming.callbackCount);\n if (streaming.recentCompletion) {\n console.log('Recent completion (not yet processed):', streaming.recentCompletion);\n }\n if (agentRun) {\n console.log('Agent run:', { id: agentRun.ID, status: agentRun.Status, name: agentRun.Agent });\n } else {\n console.log('Agent run: none loaded for this message');\n }\n console.groupEnd();\n }\n\n onTestFeedbackMessage(message: MJConversationDetailEntity): void {\n if (!message.TestRunID) {\n console.error('Cannot provide test feedback: message has no TestRunID');\n return;\n }\n\n this.testFeedbackDialogData = {\n testRunId: message.TestRunID,\n conversationDetailId: message.ID,\n currentUser: this.currentUser\n };\n this.showTestFeedbackDialog = true;\n }\n\n onTestFeedbackDialogClosed(result: TestFeedbackDialogResult): void {\n this.showTestFeedbackDialog = false;\n this.testFeedbackDialogData = null;\n if (result.success) {\n console.log('Test feedback saved successfully:', result.feedbackId);\n }\n }\n\n onTaskClicked(task: MJTaskEntity): void {\n // Pass task click up to workspace to navigate to Tasks tab\n this.taskClicked.emit(task);\n }\n\n onNavigateToConversation(event: {conversationId: string; taskId: string}): void {\n // Navigate to the conversation with the active task - emit to parent\n // Parent will update its selection state\n // For now, we can't navigate to a different conversation from within chat area\n // This would require emitting an event to the parent\n console.log('Navigate to conversation requested:', event.conversationId);\n }\n\n /**\n * Handle navigation request from artifact viewer Links tab\n */\n onArtifactLinkNavigation(event: {type: 'conversation' | 'collection'; id: string}): void {\n LogStatusEx({message: '🔗 Chat area: Artifact link clicked', verboseOnly: true, additionalArgs: [event]});\n this.artifactLinkClicked.emit(event);\n }\n\n /**\n * Load permissions for the given artifact\n */\n private async loadArtifactPermissions(artifactId: string): Promise<void> {\n // Guard against null/undefined\n if (!artifactId) {\n this.canShareSelectedArtifact = false;\n this.canEditSelectedArtifact = false;\n return;\n }\n\n try {\n const permissions = await this.artifactPermissionService.getUserPermissions(artifactId, this.currentUser);\n this.canShareSelectedArtifact = permissions.canShare;\n this.canEditSelectedArtifact = permissions.canEdit;\n } catch (error) {\n console.error('Failed to load artifact permissions:', error);\n this.canShareSelectedArtifact = false;\n this.canEditSelectedArtifact = false;\n }\n }\n\n /**\n * Handle artifact picker request from message input\n */\n async onArtifactPickerRequested(): Promise<void> {\n this.showArtifactPickerPanel = true;\n this.isLoadingArtifactPicker = true;\n this.cdr.detectChanges();\n\n try {\n // Load user's recent artifact versions (both text and file-backed)\n const rv = new RunView();\n const result = await rv.RunView<{\n ID: string; ArtifactID: string; VersionNumber: number;\n Name: string; Description: string; ContentMode: string;\n FileID: string | null; MimeType: string | null;\n FileName: string | null; ContentSizeBytes: number;\n Artifact: string; __mj_UpdatedAt: string;\n }>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID IN (SELECT ID FROM __mj.Artifact WHERE Visibility <> 'System Only')`,\n OrderBy: '__mj_UpdatedAt DESC',\n MaxRows: 50,\n ResultType: 'simple'\n });\n\n if (result.Success && result.Results) {\n this.artifactPickerItems = result.Results.map(r => ({\n artifactId: r.ArtifactID,\n artifactVersionId: r.ID,\n name: r.Name || r.Artifact || 'Untitled',\n description: r.Description || '',\n contentMode: r.ContentMode || 'Text',\n fileID: r.FileID,\n mimeType: r.MimeType,\n fileName: r.FileName,\n sizeBytes: r.ContentSizeBytes || 0,\n typeName: r.ContentMode === 'File' ? (r.MimeType || 'File') : 'Text',\n updatedAt: r.__mj_UpdatedAt\n }));\n } else {\n this.artifactPickerItems = [];\n }\n } catch (error) {\n console.error('Failed to load artifacts for picker:', error);\n this.artifactPickerItems = [];\n } finally {\n this.isLoadingArtifactPicker = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle artifact selection from the picker panel.\n * Adds the artifact as a pending attachment so it appears in the message input.\n * The ConversationDetailArtifact with Direction='Input' is created when the message is sent.\n */\n OnArtifactSelected(item: {\n artifactId: string; artifactVersionId: string; name: string;\n contentMode: string; fileID: string | null; mimeType: string | null;\n fileName: string | null; sizeBytes: number;\n }): void {\n const activeInput = this.messageInputComponents?.find(\n (input: MessageInputComponent) => input.conversationId === this.conversationId\n );\n if (activeInput?.inputBox) {\n activeInput.inputBox.AddArtifactAttachment({\n fileID: item.fileID || item.artifactVersionId,\n fileName: item.fileName || item.name,\n mimeType: item.mimeType || 'text/plain',\n sizeBytes: item.sizeBytes,\n artifactVersionId: item.artifactVersionId\n });\n }\n this.showArtifactPickerPanel = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Close artifact picker panel\n */\n CloseArtifactPicker(): void {\n this.showArtifactPickerPanel = false;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle share request from artifact viewer\n */\n async onArtifactShareRequested(artifactId: string): Promise<void> {\n // Load the artifact entity to pass to the modal\n const md = new Metadata();\n const artifact = await md.GetEntityObject<MJArtifactEntity>('MJ: Artifacts');\n await artifact.Load(artifactId);\n\n if (artifact) {\n this.artifactToShare = artifact;\n this.isArtifactShareModalOpen = true;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle close of artifact share modal\n */\n onArtifactShareModalClose(): void {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle successful share - refresh permissions\n */\n async onArtifactShared(): Promise<void> {\n this.isArtifactShareModalOpen = false;\n this.artifactToShare = null;\n\n // Refresh permissions for the active artifact\n if (this.selectedArtifactId) {\n await this.loadArtifactPermissions(this.selectedArtifactId);\n }\n this.cdr.detectChanges();\n }\n\n // Scroll functionality (pattern from skip-chat)\n checkScroll(): void {\n if (!this.scrollContainer) return;\n\n const element = this.scrollContainer.nativeElement;\n const buffer = 15; // Tolerance in pixels\n const scrollDifference = element.scrollHeight - (element.scrollTop + element.clientHeight);\n const hasScrollableContent = element.scrollHeight > element.clientHeight + 50;\n const atBottom = scrollDifference <= buffer;\n\n const newValue = !atBottom && hasScrollableContent;\n\n // Only update if value changed to prevent unnecessary change detection\n if (this.showScrollToBottomIcon !== newValue) {\n this.showScrollToBottomIcon = newValue;\n this.cdr.detectChanges();\n }\n }\n\n scrollToBottomNow(retryCount: number = 0): void {\n try {\n if (!this.scrollContainer) {\n if (retryCount < 10) {\n setTimeout(() => this.scrollToBottomNow(retryCount + 1), 50);\n }\n return;\n }\n\n const element = this.scrollContainer.nativeElement;\n if (element.scrollHeight === 0 && retryCount < 10) {\n setTimeout(() => this.scrollToBottomNow(retryCount + 1), 50);\n } else if (element.scrollHeight > 0) {\n element.scrollTop = element.scrollHeight;\n }\n } catch (err) {\n console.error('Error scrolling to bottom:', err);\n }\n }\n\n scrollToBottomAnimate(): void {\n if (this.scrollContainer) {\n const element = this.scrollContainer.nativeElement;\n element.scroll({ top: element.scrollHeight, behavior: 'smooth' });\n }\n }\n\n /**\n * Detect and reconcile agent run states against conversation detail statuses.\n * Called after loading a conversation to handle two scenarios:\n *\n * 1. **In-progress catch-up**: If an agent completed between page refresh and\n * WebSocket reconnection, the completion PubSub event is lost. We catch this\n * by comparing message status against the agent run status from the database.\n *\n * 2. **Stale error correction**: If the client previously marked a conversation\n * detail as 'Error' (e.g., due to WebSocket timeout) but the server actually\n * completed successfully, we detect the mismatch and correct it. This prevents\n * the race condition where the client overwrites a server-completed record.\n */\n private async detectAndReconcileAgentRuns(conversationId: string): Promise<void> {\n await this.reconnectInProgressRuns();\n await this.correctStaleErrorMessages();\n }\n\n /**\n * Reconnect to in-progress agent runs whose completion events were missed.\n */\n private async reconnectInProgressRuns(): Promise<void> {\n const inProgressMessages = this.messages.filter(\n m => m.Status === 'In-Progress' && m.Role === 'AI'\n );\n\n if (inProgressMessages.length === 0) {\n return;\n }\n\n LogStatusEx({message: `🔄 Found ${inProgressMessages.length} in-progress messages, checking status...`, verboseOnly: true});\n\n const completedStatuses = ['Completed', 'Failed', 'Error', 'Cancelled'];\n\n for (const message of inProgressMessages) {\n const agentRun = this.agentRunsByDetailId.get(message.ID);\n\n if (!agentRun) {\n // No agent run yet — fire-and-forget may not have created it.\n // Polling will pick this up once the server creates the run.\n LogStatusEx({message: `⏳ No agent run found for in-progress message ${message.ID}, waiting for server...`, verboseOnly: true});\n continue;\n }\n\n if (completedStatuses.includes(agentRun.Status)) {\n // Agent completed during the WebSocket reconnection gap — handle now\n LogStatusEx({message: `🔄 Agent run ${agentRun.ID} already completed (${agentRun.Status}) for message ${message.ID}, handling catch-up...`, verboseOnly: true});\n await this.handleMessageCompletion(message, agentRun.ID);\n } else {\n LogStatusEx({message: `🔌 Agent run ${agentRun.ID} still ${agentRun.Status} for message ${message.ID}, WebSocket will receive updates`, verboseOnly: true});\n }\n }\n }\n\n /**\n * Detect conversation details marked as 'Error' by the client whose corresponding\n * agent run actually completed successfully on the server. This corrects the race\n * condition where the client overwrote a server-completed record with an error status.\n */\n private async correctStaleErrorMessages(): Promise<void> {\n const errorMessages = this.messages.filter(\n m => m.Status === 'Error' && m.Role === 'AI'\n );\n\n if (errorMessages.length === 0) {\n return;\n }\n\n for (const message of errorMessages) {\n const agentRun = this.agentRunsByDetailId.get(message.ID);\n if (agentRun && agentRun.Status === 'Completed') {\n LogStatusEx({message: `🔧 Correcting stale error: message ${message.ID} shows Error but agent run ${agentRun.ID} completed successfully`, verboseOnly: true});\n await this.handleMessageCompletion(message, agentRun.ID);\n }\n }\n }\n\n /**\n * Handle pending artifact navigation from collection\n * Opens the artifact and scrolls to the message containing it\n */\n private async handlePendingArtifactNavigation(): Promise<void> {\n if (!this.pendingArtifactId) {\n return; // No pending navigation\n }\n\n console.log('📦 Processing pending artifact navigation:', this.pendingArtifactId, 'v' + this.pendingArtifactVersionNumber);\n\n // Capture values before emitting consumed event\n const artifactIdToOpen = this.pendingArtifactId;\n const versionNumberToOpen = this.pendingArtifactVersionNumber;\n\n // Notify parent that we consumed the pending artifact\n this.pendingArtifactConsumed.emit();\n\n // Find the message containing this artifact version\n let messageIdWithArtifact: string | null = null;\n\n for (const [detailId, artifactList] of this.artifactsByDetailId.entries()) {\n for (const artifactInfo of artifactList) {\n if (artifactInfo.artifactId === artifactIdToOpen) {\n // Found the artifact - check if version matches (if specified)\n if (versionNumberToOpen == null || artifactInfo.versionNumber === versionNumberToOpen) {\n messageIdWithArtifact = detailId;\n console.log('✅ Found artifact in message:', detailId);\n break;\n }\n }\n }\n if (messageIdWithArtifact) break;\n }\n\n if (!messageIdWithArtifact) {\n console.warn('⚠️ Could not find message containing artifact:', artifactIdToOpen);\n return;\n }\n\n // Open the artifact panel\n this.selectedArtifactId = artifactIdToOpen;\n this.selectedVersionNumber = versionNumberToOpen ?? undefined;\n this.showArtifactPanel = true;\n\n // Load permissions for the artifact\n await this.loadArtifactPermissions(artifactIdToOpen);\n this.cdr.detectChanges();\n\n // Scroll to the message\n this.scrollToMessage(messageIdWithArtifact);\n\n console.log('✅ Opened artifact and scrolled to message:', messageIdWithArtifact);\n }\n\n /**\n * Scroll to a specific message in the conversation\n * @param messageId The conversation detail ID to scroll to\n */\n private scrollToMessage(messageId: string): void {\n // Wait for DOM to update, then scroll\n setTimeout(() => {\n const messageElement = document.querySelector(`[data-message-id=\"${messageId}\"]`);\n if (messageElement) {\n messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n console.log('📍 Scrolled to message:', messageId);\n } else {\n console.warn('⚠️ Message element not found for ID:', messageId);\n }\n }, 300); // Give time for artifact panel to open and DOM to render\n }\n\n /**\n * Handle intent check started - show temporary \"Analyzing intent...\" message\n */\n async onIntentCheckStarted(): Promise<void> {\n const md = new Metadata();\n const tempMessage = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n\n // Create a temporary message that looks like an AI response in-progress\n tempMessage.Message = '🔍 Analyzing your request to determine the best agent...';\n tempMessage.Role = 'AI';\n tempMessage.Status = 'In-Progress';\n // Set created date using LoadFromData to bypass read-only protection\n tempMessage.LoadFromData({\n Message: tempMessage.Message,\n Role: tempMessage.Role,\n Status: tempMessage.Status,\n __mj_CreatedAt: new Date()\n });\n // No ID means it's temporary (won't be saved)\n\n this.intentCheckMessage = tempMessage;\n this.messages = [...this.messages, tempMessage];\n this.scrollToBottom = true;\n this.cdr.detectChanges();\n }\n\n /**\n * Handle intent check completed - remove temporary message\n */\n onIntentCheckCompleted(): void {\n if (this.intentCheckMessage) {\n // Remove the temporary intent check message\n this.messages = this.messages.filter(m => m !== this.intentCheckMessage);\n this.intentCheckMessage = null;\n this.cdr.detectChanges();\n }\n }\n}","<div class=\"chat-area\">\n <!-- Fixed Header -->\n @if (conversation) {\n <div class=\"chat-header\">\n <div class=\"chat-info\" [class.with-sidebar-toggle]=\"showSidebarToggle\">\n @if (showSidebarToggle) {\n <button class=\"sidebar-toggle-btn\"\n (click)=\"sidebarToggleClicked.emit()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n <div class=\"chat-title\">{{ conversation.Name || '' }}</div>\n @if (conversation.ProjectID) {\n <button class=\"project-tag\" (click)=\"openProjectSelector()\" title=\"Assign to project\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ conversation.Project || 'Project' }}</span>\n </button>\n }\n @if (conversation.TestRunID) {\n <button class=\"test-indicator\" (click)=\"viewTestRun(conversation.TestRunID)\" title=\"View Test Run\">\n <i class=\"fas fa-flask\"></i>\n <span>Test</span>\n </button>\n }\n </div>\n <div class=\"chat-actions chat-actions-buttons\">\n @if (pinnedMessages.length > 0) {\n <button class=\"pin-chip\" [class.active]=\"showPinsPanel\" (click)=\"showPinsPanel = !showPinsPanel\" title=\"View pinned messages\">\n <i class=\"fas fa-thumbtack\"></i>\n <span class=\"pin-chip-count\">{{ pinnedMessages.length }}</span>\n </button>\n }\n @if (showArtifactIndicator && artifactCountDisplay > 0) {\n <button class=\"artifact-indicator\" (click)=\"viewArtifacts()\" title=\"View artifacts\">\n <i class=\"fas fa-cube\"></i>\n <span class=\"artifact-badge\">{{ artifactCountDisplay }}</span>\n </button>\n }\n @if (memberCount > 1) {\n <button class=\"chat-members\" (click)=\"toggleMembersModal()\" title=\"View members\">\n <i class=\"fas fa-users\"></i>\n <span class=\"members-badge\">{{ memberCount }}</span>\n </button>\n }\n @if (showExportButton) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n <span class=\"btn-label\">Export</span>\n </button>\n }\n @if (showShareButton) {\n <button mjButton variant=\"flat\" size=\"sm\"\n [class.shared]=\"isShared\"\n (click)=\"shareConversation()\"\n [title]=\"isShared ? 'Manage sharing' : 'Share conversation'\">\n <i class=\"fas fa-share-nodes\"></i>\n <span class=\"btn-label\">Share</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages and Artifact Split Layout -->\n <div class=\"chat-content-area\">\n <!-- Messages Pane -->\n <div class=\"chat-messages-pane\"\n [class.full-width]=\"!showArtifactPanel\"\n [class.hidden]=\"isArtifactPaneMaximized\">\n @if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads (checked FIRST to prevent empty state flash) -->\n <div class=\"conversation-loading-state\">\n <mj-loading text=\"Loading conversation...\" size=\"large\"></mj-loading>\n </div>\n } @else if (isNewConversation || !conversationId) {\n <!-- Empty State - No conversation selected OR new unsaved conversation -->\n <mj-conversation-empty-state\n [currentUser]=\"currentUser\"\n [disabled]=\"isProcessing\"\n [showSidebarToggle]=\"showSidebarToggle\"\n [overlayMode]=\"overlayMode\"\n [greeting]=\"emptyStateGreeting\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n (sidebarToggleClicked)=\"sidebarToggleClicked.emit()\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else {\n <!-- Normal Message View -->\n <div class=\"chat-messages-wrapper\">\n <!-- Upload Indicator Overlay (centered in conversation area) -->\n @if (isUploadingAttachments) {\n <div class=\"upload-indicator-overlay\">\n <mj-loading [text]=\"uploadingMessage\" size=\"medium\"></mj-loading>\n </div>\n }\n <div class=\"chat-messages-container\" #scrollContainer (scroll)=\"checkScroll()\">\n <mj-conversation-message-list\n [messages]=\"messages\"\n [conversation]=\"conversation\"\n [currentUser]=\"currentUser\"\n [isProcessing]=\"isProcessing\"\n [artifactMap]=\"effectiveArtifactsMap\"\n [agentRunMap]=\"agentRunsByDetailId\"\n [ratingsMap]=\"ratingsByDetailId\"\n [userAvatarMap]=\"userAvatarMap\"\n [attachmentsMap]=\"attachmentsByDetailId\"\n (replyInThread)=\"onReplyInThread($event)\"\n (viewThread)=\"onViewThread($event)\"\n (deleteMessage)=\"onDeleteMessage($event)\"\n (retryMessage)=\"onRetryMessage($event)\"\n (testFeedbackMessage)=\"onTestFeedbackMessage($event)\"\n (artifactClicked)=\"onArtifactClicked($event)\"\n (messageEdited)=\"onMessageEdited($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (suggestedResponseSelected)=\"onSuggestedResponseSelected($event)\"\n (attachmentClicked)=\"onAttachmentClicked($event)\"\n (diagnosticRequested)=\"onDiagnosticRequested($event)\"\n (messagePinToggled)=\"onMessagePinToggled($event)\">\n </mj-conversation-message-list>\n\n <!-- Scroll to Bottom Icon (positioned within scroll container for proper centering) -->\n @if (showScrollToBottomIcon && messages && messages.length > 0) {\n <span class=\"scroll-to-bottom-icon\" style=\"left: 50%;\"\n (click)=\"scrollToBottomAnimate()\">\n <i class=\"fas fa-arrow-down\"></i>\n </span>\n }\n </div>\n\n <!-- Fixed Input Area -->\n <div class=\"chat-input-container\">\n @if (isLoadingPeripheralData) {\n <!-- Loading State -->\n <div class=\"loading-peripheral-placeholder\">\n <mj-loading text=\"Loading conversation data...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <!-- Input Component - Multiple instances cached, only one visible -->\n <div class=\"message-input-container-wrapper\">\n @for (inputRef of getCachedInputs(); track inputRef.conversationId) {\n <mj-message-input\n #messageInput\n [hidden]=\"inputRef.conversationId !== conversationId\"\n [conversationId]=\"inputRef.conversationId\"\n [conversationName]=\"inputRef.conversationName\"\n [currentUser]=\"currentUser\"\n [conversationHistory]=\"inputRef.conversationId === conversationId ? messages : []\"\n [artifactsByDetailId]=\"inputRef.conversationId === conversationId ? artifactsByDetailId : emptyArtifactsMap\"\n [systemArtifactsByDetailId]=\"inputRef.conversationId === conversationId ? systemArtifactsByDetailId : emptyArtifactsMap\"\n [agentRunsByDetailId]=\"inputRef.conversationId === conversationId ? agentRunsByDetailId : emptyAgentRunsMap\"\n [appContext]=\"appContext\"\n [inProgressMessageIds]=\"inputRef.conversationId === conversationId ? inProgressMessageIds : emptyInProgressIds\"\n [disabled]=\"isProcessing\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n [initialMessage]=\"inputRef.conversationId === conversationId ? pendingMessage : null\"\n [initialAttachments]=\"inputRef.conversationId === conversationId ? pendingAttachments : null\"\n (messageSent)=\"onMessageSent($event)\"\n (agentResponse)=\"onAgentResponse($event)\"\n (agentRunDetected)=\"onAgentRunDetected($event)\"\n (agentRunUpdate)=\"onAgentRunUpdate($event)\"\n (messageComplete)=\"onMessageComplete($event)\"\n (artifactCreated)=\"onArtifactCreated($event)\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (intentCheckStarted)=\"onIntentCheckStarted()\"\n (intentCheckCompleted)=\"onIntentCheckCompleted()\"\n (uploadStateChanged)=\"onUploadStateChanged($event)\"\n (artifactPickerRequested)=\"onArtifactPickerRequested()\">\n </mj-message-input>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Artifact Viewer Pane -->\n @if (showArtifactPanel && selectedArtifactId) {\n @if (!isArtifactPaneMaximized) {\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event)\" (touchstart)=\"onResizeTouchStart($event)\"></div>\n }\n <div class=\"chat-artifact-pane\"\n [style.width.%]=\"artifactPaneWidth\"\n [class.maximized]=\"isArtifactPaneMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"selectedVersionNumber\"\n [viewContext]=\"'conversation'\"\n [canShare]=\"canShareSelectedArtifact\"\n [canEdit]=\"canEditSelectedArtifact\"\n [isMaximized]=\"isArtifactPaneMaximized\"\n [refreshTrigger]=\"artifactViewerRefresh$\"\n (closed)=\"onCloseArtifactPanel()\"\n (saveToCollectionRequested)=\"onSaveToCollectionRequested($event)\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPane()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n\n <!-- Pinned Messages Panel (overlay) -->\n @if (showPinsPanel) {\n <mj-pinned-messages-panel\n [pinnedMessages]=\"pinnedMessages\"\n (closed)=\"showPinsPanel = false\"\n (jumpRequested)=\"onJumpToMessage($event)\"\n (unpinRequested)=\"onUnpinFromPanel($event)\">\n </mj-pinned-messages-panel>\n }\n </div>\n</div>\n\n<!-- Thread Panel -->\n@if (threadId) {\n <mj-thread-panel\n [parentMessageId]=\"threadId\"\n [conversationId]=\"conversationId || ''\"\n [currentUser]=\"currentUser\"\n (closed)=\"onLocalThreadClosed()\"\n (replyAdded)=\"onThreadReplyAdded($event)\">\n </mj-thread-panel>\n}\n\n<!-- Export Modal -->\n<mj-export-modal\n [isVisible]=\"showExportModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"onExportModalCancelled()\"\n (exported)=\"onExportModalComplete()\">\n</mj-export-modal>\n\n<!-- Members Modal -->\n<mj-members-modal\n [isVisible]=\"showMembersModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"showMembersModal = false\"\n (membersChanged)=\"showMembersModal = false\">\n</mj-members-modal>\n\n<!-- Project Selector Modal -->\n@if (showProjectSelector && conversation) {\n <div class=\"modal-overlay\" (click)=\"showProjectSelector = false\">\n <div class=\"modal-content project-selector-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Assign Project</h3>\n <button class=\"modal-close-btn\" (click)=\"showProjectSelector = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <mj-project-selector\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedProjectId]=\"conversation.ProjectID\"\n (projectSelected)=\"onProjectSelected($event)\">\n </mj-project-selector>\n </div>\n </div>\n </div>\n}\n\n<!-- Artifacts Modal -->\n@if (showArtifactsModal) {\n <div class=\"modal-overlay\" (click)=\"showArtifactsModal = false\">\n <div class=\"modal-content artifacts-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Conversation Artifacts</h3>\n <div class=\"modal-header-actions\">\n @if (hasSystemArtifacts) {\n <button class=\"toggle-system-btn\"\n [class.active]=\"showSystemArtifacts\"\n (click)=\"toggleSystemArtifacts()\"\n title=\"Toggle system artifacts visibility\">\n <i class=\"fas fa-cog\"></i>\n <span>{{ showSystemArtifacts ? 'Hide' : 'Show' }} System</span>\n </button>\n }\n <button class=\"modal-close-btn\" (click)=\"showArtifactsModal = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body artifacts-grid\">\n @if (artifactsByDetailId.size === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-cube\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <p style=\"color: var(--mj-text-muted); font-size: 14px;\">No artifacts in this conversation yet</p>\n </div>\n }\n @for (artifact of getArtifactsArray(); track artifact.artifactId) {\n <div class=\"artifact-modal-card\"\n [class.expanded]=\"expandedArtifactId === artifact.artifactId\"\n [class.system-artifact]=\"artifact.visibility === 'System Only'\">\n <!-- Main card header - click to open latest version -->\n <div class=\"artifact-card-header\" (click)=\"openArtifactFromModal(artifact.artifactId)\">\n <div class=\"artifact-modal-icon\">\n <i class=\"fas fa-file-code\"></i>\n </div>\n <div class=\"artifact-modal-info\">\n <div class=\"artifact-modal-title\">{{artifact.name}}</div>\n <div class=\"artifact-modal-meta\">\n @if (artifact.versionCount > 1) {\n {{artifact.versionCount}} versions\n } @else {\n 1 version\n }\n </div>\n </div>\n @if (artifact.versionCount > 1) {\n <button class=\"expand-btn\" (click)=\"toggleArtifactExpansion(artifact.artifactId, $event)\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedArtifactId !== artifact.artifactId\"\n [class.fa-chevron-up]=\"expandedArtifactId === artifact.artifactId\"></i>\n </button>\n }\n <div class=\"artifact-modal-action\">\n <i class=\"fas fa-external-link-alt\"></i>\n </div>\n </div>\n\n <!-- Expanded version list -->\n @if (expandedArtifactId === artifact.artifactId && artifact.versionCount > 1) {\n <div class=\"artifact-versions-list\">\n @for (version of artifact.versions; track version.versionId) {\n <div class=\"artifact-version-item\" (click)=\"openArtifactFromModal(artifact.artifactId, version.versionNumber); $event.stopPropagation()\">\n <span class=\"version-badge\">v{{version.versionNumber}}</span>\n <span class=\"version-open-text\">Open this version</span>\n <i class=\"fas fa-arrow-right\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Collection Picker Modal -->\n@if (showCollectionPicker) {\n <mj-artifact-collection-picker-modal\n [isOpen]=\"showCollectionPicker\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [excludeCollectionIds]=\"collectionPickerExcludedIds\"\n (saved)=\"onCollectionPickerSaved($event)\"\n (cancelled)=\"onCollectionPickerCancelled()\">\n </mj-artifact-collection-picker-modal>\n}\n\n<!-- Artifact Picker Slide-in Panel -->\n@if (showArtifactPickerPanel) {\n <div class=\"artifact-picker-overlay\" (click)=\"CloseArtifactPicker()\"></div>\n <div class=\"artifact-picker-panel\">\n <div class=\"artifact-picker-header\">\n <h3>Attach Artifact</h3>\n <button class=\"artifact-picker-close\" (click)=\"CloseArtifactPicker()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"artifact-picker-body\">\n @if (isLoadingArtifactPicker) {\n <mj-loading text=\"Loading artifacts...\" size=\"medium\"></mj-loading>\n } @else if (artifactPickerItems.length === 0) {\n <div class=\"artifact-picker-empty\">\n <i class=\"fa-solid fa-cube\" style=\"font-size: 2rem; opacity: 0.3;\"></i>\n <p>No file artifacts found</p>\n <p class=\"artifact-picker-hint\">File artifacts are created when agents generate PDF, Excel, or Word documents.</p>\n </div>\n } @else {\n <div class=\"artifact-picker-list\">\n @for (item of artifactPickerItems; track item.artifactVersionId) {\n <button class=\"artifact-picker-item\" (click)=\"OnArtifactSelected(item)\">\n @if (item.contentMode === 'File') {\n <i class=\"fa-solid\" [class.fa-file-pdf]=\"item.mimeType === 'application/pdf'\"\n [class.fa-file-excel]=\"item.mimeType && item.mimeType.includes('spreadsheet')\"\n [class.fa-file-word]=\"item.mimeType && item.mimeType.includes('wordprocessing')\"\n [class.fa-file]=\"!item.mimeType || (!item.mimeType.includes('pdf') && !item.mimeType.includes('spreadsheet') && !item.mimeType.includes('wordprocessing'))\">\n </i>\n } @else {\n <i class=\"fa-solid fa-file-lines\"></i>\n }\n <div class=\"artifact-picker-item-info\">\n <span class=\"artifact-picker-item-name\">{{ item.name }}</span>\n <span class=\"artifact-picker-item-meta\">\n {{ item.contentMode === 'File' ? (item.fileName || '') : 'Text artifact' }}\n @if (item.sizeBytes) {\n · {{ (item.sizeBytes / 1024) | number:'1.0-0' }} KB\n }\n </span>\n </div>\n </button>\n }\n </div>\n }\n </div>\n </div>\n}\n\n<!-- Test Feedback Dialog -->\n@if (testFeedbackDialogData) {\n <mj-test-feedback-dialog\n [data]=\"testFeedbackDialogData\"\n [visible]=\"showTestFeedbackDialog\"\n (closed)=\"onTestFeedbackDialogClosed($event)\">\n </mj-test-feedback-dialog>\n}\n\n<!-- Image Viewer Modal -->\n@if (showImageViewer) {\n <mj-image-viewer\n [imageUrl]=\"selectedImageUrl\"\n [alt]=\"selectedImageAlt\"\n [fileName]=\"selectedImageFileName\"\n [visible]=\"showImageViewer\"\n (closed)=\"onImageViewerClosed()\">\n </mj-image-viewer>\n}"]}