@memberjunction/ng-conversations 5.9.0 → 5.10.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.
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +12 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/message/agent-response-form.component.js +1 -1
- package/dist/lib/components/message/agent-response-form.component.js.map +1 -1
- package/package.json +17 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-chat-area.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"conversation-chat-area.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -1181,7 +1181,18 @@ export class ConversationChatAreaComponent {
|
|
|
1181
1181
|
const existingAgentRun = this.agentRunsByDetailId.get(event.conversationDetailId);
|
|
1182
1182
|
if (existingAgentRun?.ID) {
|
|
1183
1183
|
// Refresh the SAME object by calling Load() - preserves all references
|
|
1184
|
-
|
|
1184
|
+
// duck type check to see if we have a BaseEntity or not
|
|
1185
|
+
if (!!existingAgentRun.Load) {
|
|
1186
|
+
await existingAgentRun.Load(existingAgentRun.ID);
|
|
1187
|
+
}
|
|
1188
|
+
else {
|
|
1189
|
+
// we do NOT have an existingAgentRun base entity, but rather a simple JSON object so we need to create an object here
|
|
1190
|
+
const md = new Metadata();
|
|
1191
|
+
const newEntity = await md.GetEntityObject('MJ: AI Agent Runs');
|
|
1192
|
+
newEntity.LoadFromData(existingAgentRun);
|
|
1193
|
+
// swap the map entry to have this object now
|
|
1194
|
+
this.agentRunsByDetailId.set(event.conversationDetailId, newEntity);
|
|
1195
|
+
}
|
|
1185
1196
|
// Trigger re-render to show updated status
|
|
1186
1197
|
this.messages = [...this.messages];
|
|
1187
1198
|
this.cdr.detectChanges();
|
|
@@ -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, RunView, RunQuery, Metadata, CompositeKey, LogStatusEx } from '@memberjunction/core';\nimport { MJConversationEntity, MJConversationDetailEntity, MJAIAgentRunEntity, MJArtifactEntity, MJTaskEntity, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ConversationDataService } from '../../services/conversation-data.service';\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 { ConversationDetailComplete, parseConversationDetailComplete, AgentRunJSON, RatingJSON } from '../../models/conversation-complete-query.model';\nimport { MessageInputComponent } from '../message/message-input.component';\nimport { PendingAttachment } from '../mention/mention-editor.component';\nimport { ArtifactViewerPanelComponent, NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { TestFeedbackDialogComponent, TestFeedbackDialogData } from '@memberjunction/ng-testing';\nimport { DialogService } from '@progress/kendo-angular-dialog';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ConversationStreamingService } from '../../services/conversation-streaming.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 @Input() isNewConversation: boolean = false;\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 // 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\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 = true; // True while loading initial conversation messages\n\n // Store raw query results and derived data\n private rawConversationData: ConversationDetailComplete[] = [];\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 // Conversation data cache: ConversationID -> Array of ConversationDetailComplete\n // Stores raw query results so we don't need to re-query when switching conversations\n private conversationDataCache = new Map<string, ConversationDetailComplete[]>();\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 // 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 // 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 constructor(\n public conversationData: ConversationDataService,\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 dialogService: DialogService,\n private attachmentService: ConversationAttachmentService,\n private streamingService: ConversationStreamingService\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 ArtifactMetadataEngine is loaded so LazyArtifactInfo can\n // resolve versions from its always-fresh in-memory cache.\n // Config(false) is a no-op if already loaded by another component.\n await ArtifactMetadataEngine.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 // 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 — reload messages to pick up final response and any\n // delegated-agent messages that were created during the run.\n this.invalidateConversationCache(this.conversationId);\n await this.reloadMessagesForActiveConversation();\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 we don't have cached data for this conversation.\n // When switching between previously visited conversations, the cache provides\n // instant display without the loading flash.\n const hasCachedData = this.conversationDataCache.has(conversationId);\n if (!hasCachedData) {\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 * 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 const cachedData = this.conversationDataCache.get(conversationId);\n\n if (cachedData) {\n await this.buildMessagesFromCache(cachedData);\n await this.loadPeripheralData(conversationId);\n } else {\n const rq = new RunQuery();\n const result = await rq.RunQuery({\n QueryName: 'GetConversationComplete',\n CategoryPath: 'MJ/Conversations',\n Parameters: { ConversationID: conversationId }\n }, this.currentUser);\n\n if (!result.Success || !result.Results) {\n console.error('Failed to load conversation data:', result.ErrorMessage);\n this.messages = [];\n return;\n }\n\n const conversationData = result.Results as ConversationDetailComplete[];\n this.conversationDataCache.set(conversationId, conversationData);\n\n await this.buildMessagesFromCache(conversationData);\n\n this.isLoadingPeripheralData = true;\n await this.loadPeripheralData(conversationId);\n this.isLoadingPeripheralData = false;\n this.cdr.detectChanges();\n }\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 * Build message entities from cached conversation data\n * Creates MJConversationDetailEntity objects from the raw query results\n */\n private async buildMessagesFromCache(conversationData: ConversationDetailComplete[]): Promise<void> {\n const md = new Metadata();\n const messages: MJConversationDetailEntity[] = [];\n\n this.rawConversationData = conversationData;\n this.buildUserAvatarMap(conversationData);\n\n for (const row of conversationData) {\n if (!row.ID) continue;\n\n const message = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n message.LoadFromData(row);\n messages.push(message);\n }\n\n this.messages = messages;\n\n // Update attachment support based on agents in this conversation\n this.updateAttachmentSupport();\n\n // Detect in-progress messages for streaming reconnection\n // Always create NEW array reference to trigger Input setter in message-input component\n this.inProgressMessageIds = [...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 // The streaming service stores recent completions so we can handle them\n for (const message of messages) {\n if (message.Status === 'In-Progress' && message.ID) {\n const recentCompletion = this.streamingService.getRecentCompletion(message.ID);\n if (recentCompletion) {\n // This message completed while we were away - handle it\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 LogStatusEx({message: `✅ Built ${messages.length} messages from cache`, verboseOnly: true});\n }\n\n /**\n * Builds a map of UserID -> Avatar data for fast lookups\n * Extracts unique users from conversation data and their avatar settings\n */\n private buildUserAvatarMap(conversationData: ConversationDetailComplete[]): void {\n this.userAvatarMap.clear();\n\n // Get unique users and their avatar data\n const userMap = new Map<string, {imageUrl: string | null; iconClass: string | null}>();\n\n for (const row of conversationData) {\n // Only process user messages that have a UserID\n if (row.Role?.toLowerCase() === 'user' && row.UserID) {\n // Only add if we haven't seen this user yet\n if (!userMap.has(row.UserID)) {\n userMap.set(row.UserID, {\n imageUrl: row.UserImageURL || null,\n iconClass: row.UserImageIconClass || null\n });\n }\n }\n }\n\n this.userAvatarMap = userMap;\n LogStatusEx({message: `👤 Built user avatar map with ${this.userAvatarMap.size} unique users`, verboseOnly: true});\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 const timestamp = new Date().toISOString();\n\n // Skip if we've already processed peripheral data for this conversation\n if (this.lastLoadedConversationId === conversationId) {\n LogStatusEx({message: `[${timestamp}] ⏭️ Skipping peripheral data processing - already processed for conversation ${conversationId}`, verboseOnly: true});\n return;\n }\n\n // Mark this conversation as processed to prevent duplicate processing\n this.lastLoadedConversationId = conversationId;\n LogStatusEx({message: `[${timestamp}] 📊 Processing peripheral data for conversation ${conversationId} from cache`, verboseOnly: true});\n\n try {\n // Get cached data - should always be present by the time we get here\n const conversationData = this.conversationDataCache.get(conversationId);\n if (!conversationData) {\n console.warn(`No cached data found for conversation ${conversationId}`);\n return;\n }\n\n const md = new Metadata();\n\n // Clear and rebuild maps from cached data\n this.agentRunsByDetailId.clear();\n this.artifactsByDetailId.clear();\n\n for (const row of conversationData) {\n // Skip rows without ID (should never happen, but type safety check)\n if (!row.ID) {\n console.warn('Skipping conversation detail row without ID');\n continue;\n }\n\n const parsed = parseConversationDetailComplete(row);\n\n // Build agent runs map\n if (parsed.agentRuns.length > 0) {\n // Convert AgentRunJSON to MJAIAgentRunEntityExtended\n const agentRunData = parsed.agentRuns[0]; // Should only be one per detail\n const agentRun = await md.GetEntityObject<MJAIAgentRunEntityExtended>('MJ: AI Agent Runs', this.currentUser);\n\n // Convert ISO date strings to Date objects\n agentRun.LoadFromData({\n ID: agentRunData.ID,\n AgentID: agentRunData.AgentID,\n Agent: agentRunData.Agent,\n Status: agentRunData.Status,\n __mj_CreatedAt: agentRunData.__mj_CreatedAt,\n __mj_UpdatedAt: agentRunData.__mj_UpdatedAt,\n TotalPromptTokensUsed: agentRunData.TotalPromptTokensUsed,\n TotalCompletionTokensUsed: agentRunData.TotalCompletionTokensUsed,\n TotalCost: agentRunData.TotalCost,\n ConversationDetailID: agentRunData.ConversationDetailID\n });\n\n this.agentRunsByDetailId.set(row.ID, agentRun);\n }\n\n // Build artifacts map - no need to load full entities, just create LazyArtifactInfo\n if (parsed.artifacts.length > 0) {\n const artifactList: LazyArtifactInfo[] = [];\n const systemArtifactList: LazyArtifactInfo[] = [];\n\n for (const artifactData of parsed.artifacts) {\n // Create LazyArtifactInfo with display data from query\n // Full entities will be loaded on-demand when artifact is clicked\n const lazyInfo = new LazyArtifactInfo(artifactData, this.currentUser);\n\n // Separate system-only artifacts from user-visible artifacts\n if (artifactData.Visibility === 'System Only') {\n systemArtifactList.push(lazyInfo);\n } else {\n artifactList.push(lazyInfo);\n }\n }\n\n // Add to appropriate maps\n if (artifactList.length > 0) {\n this.artifactsByDetailId.set(row.ID, artifactList);\n }\n if (systemArtifactList.length > 0) {\n this.systemArtifactsByDetailId.set(row.ID, systemArtifactList);\n }\n }\n\n // Build ratings map\n if (parsed.ratings.length > 0) {\n this.ratingsByDetailId.set(row.ID, parsed.ratings);\n }\n }\n\n // Load attachments for all messages in this conversation\n // Uses the ConversationAttachmentService to batch-load all attachments\n this.attachmentsByDetailId.clear();\n const messageIds = conversationData.map(row => row.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 (unique artifacts, not versions)\n this.artifactCount = this.calculateUniqueArtifactCount();\n this.updateArtifactCountDisplay();\n\n // Debug: Log summary\n const systemArtifactCount = this.systemArtifactsByDetailId.size;\n const attachmentCount = this.attachmentsByDetailId.size;\n LogStatusEx({message: `📊 Processed ${this.agentRunsByDetailId.size} agent runs, ${this.artifactsByDetailId.size} user artifact mappings, ${systemArtifactCount} system artifact mappings (${this.artifactCount} unique user artifacts), ${attachmentCount} messages with attachments`, verboseOnly: true});\n\n // CRITICAL: Trigger message re-render now that agent runs and artifacts are loaded\n // This updates all message components with the newly loaded agent run data\n this.messages = [...this.messages]; // Create new array reference to trigger change detection\n this.cdr.detectChanges();\n\n LogStatusEx({message: `✅ Peripheral data processed successfully for conversation ${conversationId} from cache`, verboseOnly: true});\n } catch (error) {\n console.error('Failed to process peripheral data:', error);\n // Don't set lastLoadedConversationId on error so we can retry\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 // 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.invalidateConversationCache(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\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 await existingAgentRun.Load(existingAgentRun.ID);\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 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 for the active conversation from the database\n * Called when 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 LogStatusEx({message: `🔄 Reloading messages for conversation ${conversationId} to discover delegated agents`, verboseOnly: true});\n\n const md = new Metadata();\n const rv = new RunView();\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 const result = await rv.RunView<MJConversationDetailEntity>({\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `ConversationID='${conversationId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n // Merge DB results with existing client-side messages rather than replacing entirely.\n // This prevents dropping messages added client-side (e.g., by handleSubAgentInvocation)\n // that haven't appeared in the DB query results yet due to timing.\n const merged = new Map<string, MJConversationDetailEntity>();\n\n // Add all DB messages (fresh data)\n for (const msg of result.Results) {\n merged.set(msg.ID, msg);\n }\n\n // Preserve client-side messages not yet in DB\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 = result.Results.filter(m => !existingMessageIds.has(m.ID));\n\n // Load agent runs for new messages so completion detector can reload artifacts\n for (const message of newMessages) {\n if (message.AgentID && message.ID) {\n // Query to find agent run for this conversation detail\n const agentRunResult = await rv.RunView<MJAIAgentRunEntityExtended>({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ConversationDetailID='${message.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (agentRunResult.Success && agentRunResult.Results && agentRunResult.Results.length > 0) {\n const agentRun = agentRunResult.Results[0];\n this.agentRunsByDetailId.set(message.ID, agentRun);\n LogStatusEx({message: `✅ Loaded agent run for new delegated message ${message.ID} (Agent: ${agentRun.Agent})`, verboseOnly: true});\n }\n }\n }\n\n LogStatusEx({message: `✅ Reloaded ${result.Results.length} messages (${newMessages.length} new, ${result.Results.filter(m => m.Status === 'In-Progress').length} in-progress)`, verboseOnly: true});\n }\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.invalidateConversationCache(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 // 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.invalidateConversationCache(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 * Invalidate cached conversation data\n * Called when new messages are added or conversation data changes\n */\n private invalidateConversationCache(conversationId: string): void {\n this.conversationDataCache.delete(conversationId);\n LogStatusEx({message: `🗑️ Invalidated cache for conversation ${conversationId}`, verboseOnly: true});\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 // 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 rq = new RunQuery();\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 // Invalidate cache since artifacts changed\n this.invalidateConversationCache(detail.ConversationID);\n\n // Use optimized single query to reload all conversation data\n const result = await rq.RunQuery({\n QueryName: 'GetConversationComplete',\n CategoryPath: 'MJ/Conversations',\n Parameters: { ConversationID: detail.ConversationID }\n }, this.currentUser);\n\n if (!result.Success || !result.Results) {\n console.error('Failed to reload artifacts:', result.ErrorMessage);\n return;\n }\n\n LogStatusEx({message: `📊 Query result: ${result.Results.length} conversation details loaded`, verboseOnly: true});\n\n // Update cache with fresh data\n const conversationData = result.Results as ConversationDetailComplete[];\n this.conversationDataCache.set(detail.ConversationID, conversationData);\n\n // Process ALL messages in the conversation to pick up artifacts from\n // delegated sub-agent messages (e.g., when Sage delegates to Skip,\n // the artifact is on Skip's message, not Sage's)\n for (const row of conversationData) {\n this.updateArtifactsForRow(row);\n }\n\n // Create new Map reference to trigger Angular change detection\n this.artifactsByDetailId = new Map(this.artifactsByDetailId);\n this._combinedArtifactsMap = null; // Clear cache so effectiveArtifactsMap rebuilds\n\n // Update artifact count\n this.artifactCount = this.calculateUniqueArtifactCount();\n this.updateArtifactCountDisplay();\n } catch (error) {\n console.error('Failed to reload artifacts for message:', error);\n }\n }\n\n /**\n * Update artifact maps for a single conversation detail row.\n * Clears existing entries for the row and rebuilds from parsed data.\n */\n private updateArtifactsForRow(row: ConversationDetailComplete): void {\n const rowId = row.ID;\n if (!rowId) {\n return;\n }\n\n const parsed = parseConversationDetailComplete(row);\n\n // Clear existing artifacts for this detail and rebuild\n this.artifactsByDetailId.delete(rowId);\n this.systemArtifactsByDetailId.delete(rowId);\n\n if (parsed.artifacts.length === 0) {\n return;\n }\n\n const artifactList: LazyArtifactInfo[] = [];\n const systemArtifactList: LazyArtifactInfo[] = [];\n\n for (const artifactData of parsed.artifacts) {\n const lazyInfo = new LazyArtifactInfo(artifactData, this.currentUser);\n\n // Separate system-only artifacts from user-visible artifacts\n if (artifactData.Visibility === 'System Only') {\n systemArtifactList.push(lazyInfo);\n } else {\n artifactList.push(lazyInfo);\n }\n\n LogStatusEx({message: `✅ Loaded artifact ${artifactData.ArtifactID} v${artifactData.VersionNumber} for message ${rowId}`, verboseOnly: true});\n }\n\n // Add to appropriate maps\n if (artifactList.length > 0) {\n this.artifactsByDetailId.set(rowId, artifactList);\n }\n if (systemArtifactList.length > 0) {\n this.systemArtifactsByDetailId.set(rowId, systemArtifactList);\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.conversationData.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.conversationData.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 /**\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 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 }\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 data service\n const newConversation = await this.conversationData.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 onTestFeedbackMessage(message: MJConversationDetailEntity): void {\n if (!message.TestRunID) {\n console.error('Cannot provide test feedback: message has no TestRunID');\n return;\n }\n\n const dialogData: TestFeedbackDialogData = {\n testRunId: message.TestRunID,\n conversationDetailId: message.ID,\n currentUser: this.currentUser\n };\n\n const dialogRef = this.dialogService.open({\n content: TestFeedbackDialogComponent,\n title: 'Provide Test Feedback',\n width: 600,\n minHeight: 500\n });\n\n const dialogInstance = dialogRef.content.instance as TestFeedbackDialogComponent;\n dialogInstance.data = dialogData;\n\n dialogRef.result.subscribe((result) => {\n if (result && typeof result === 'object' && 'success' in result) {\n const feedbackResult = result as {success: boolean; feedbackId?: string};\n if (feedbackResult.success) {\n console.log('Test feedback saved successfully:', feedbackResult.feedbackId);\n // TODO: Optionally show success notification\n }\n }\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 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 <mj-active-agent-indicator\n [conversationId]=\"conversation.ID\"\n [currentUser]=\"currentUser\"\n (togglePanel)=\"onToggleAgentPanel()\"\n (agentSelected)=\"onAgentSelected($event)\">\n </mj-active-agent-indicator>\n </div>\n <div class=\"chat-actions chat-actions-buttons\">\n @if (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 <button class=\"action-btn\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n <span class=\"btn-label\">Export</span>\n </button>\n <button class=\"action-btn share-btn\"\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 <mj-active-agent-indicator\n [conversationId]=\"conversation.ID\"\n [currentUser]=\"currentUser\"\n (togglePanel)=\"onToggleAgentPanel()\"\n (agentSelected)=\"onAgentSelected($event)\">\n </mj-active-agent-indicator>\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 (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 (sidebarToggleClicked)=\"sidebarToggleClicked.emit()\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads -->\n <div class=\"conversation-loading-state\">\n <mj-loading text=\"Loading conversation...\" size=\"large\"></mj-loading>\n </div>\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 (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 </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 [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 </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 </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: #D1D5DB; margin-bottom: 16px;\"></i>\n <p style=\"color: #6B7280; 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<!-- 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, RunView, RunQuery, Metadata, CompositeKey, LogStatusEx } from '@memberjunction/core';\nimport { MJConversationEntity, MJConversationDetailEntity, MJAIAgentRunEntity, MJArtifactEntity, MJTaskEntity, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ConversationDataService } from '../../services/conversation-data.service';\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 { ConversationDetailComplete, parseConversationDetailComplete, AgentRunJSON, RatingJSON } from '../../models/conversation-complete-query.model';\nimport { MessageInputComponent } from '../message/message-input.component';\nimport { PendingAttachment } from '../mention/mention-editor.component';\nimport { ArtifactViewerPanelComponent, NavigationRequest } from '@memberjunction/ng-artifacts';\nimport { TestFeedbackDialogComponent, TestFeedbackDialogData } from '@memberjunction/ng-testing';\nimport { DialogService } from '@progress/kendo-angular-dialog';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ConversationStreamingService } from '../../services/conversation-streaming.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 @Input() isNewConversation: boolean = false;\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 // 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\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 = true; // True while loading initial conversation messages\n\n // Store raw query results and derived data\n private rawConversationData: ConversationDetailComplete[] = [];\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 // Conversation data cache: ConversationID -> Array of ConversationDetailComplete\n // Stores raw query results so we don't need to re-query when switching conversations\n private conversationDataCache = new Map<string, ConversationDetailComplete[]>();\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 // 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 // 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 constructor(\n public conversationData: ConversationDataService,\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 dialogService: DialogService,\n private attachmentService: ConversationAttachmentService,\n private streamingService: ConversationStreamingService\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 ArtifactMetadataEngine is loaded so LazyArtifactInfo can\n // resolve versions from its always-fresh in-memory cache.\n // Config(false) is a no-op if already loaded by another component.\n await ArtifactMetadataEngine.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 // 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 — reload messages to pick up final response and any\n // delegated-agent messages that were created during the run.\n this.invalidateConversationCache(this.conversationId);\n await this.reloadMessagesForActiveConversation();\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 we don't have cached data for this conversation.\n // When switching between previously visited conversations, the cache provides\n // instant display without the loading flash.\n const hasCachedData = this.conversationDataCache.has(conversationId);\n if (!hasCachedData) {\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 * 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 const cachedData = this.conversationDataCache.get(conversationId);\n\n if (cachedData) {\n await this.buildMessagesFromCache(cachedData);\n await this.loadPeripheralData(conversationId);\n } else {\n const rq = new RunQuery();\n const result = await rq.RunQuery({\n QueryName: 'GetConversationComplete',\n CategoryPath: 'MJ/Conversations',\n Parameters: { ConversationID: conversationId }\n }, this.currentUser);\n\n if (!result.Success || !result.Results) {\n console.error('Failed to load conversation data:', result.ErrorMessage);\n this.messages = [];\n return;\n }\n\n const conversationData = result.Results as ConversationDetailComplete[];\n this.conversationDataCache.set(conversationId, conversationData);\n\n await this.buildMessagesFromCache(conversationData);\n\n this.isLoadingPeripheralData = true;\n await this.loadPeripheralData(conversationId);\n this.isLoadingPeripheralData = false;\n this.cdr.detectChanges();\n }\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 * Build message entities from cached conversation data\n * Creates MJConversationDetailEntity objects from the raw query results\n */\n private async buildMessagesFromCache(conversationData: ConversationDetailComplete[]): Promise<void> {\n const md = new Metadata();\n const messages: MJConversationDetailEntity[] = [];\n\n this.rawConversationData = conversationData;\n this.buildUserAvatarMap(conversationData);\n\n for (const row of conversationData) {\n if (!row.ID) continue;\n\n const message = await md.GetEntityObject<MJConversationDetailEntity>('MJ: Conversation Details', this.currentUser);\n message.LoadFromData(row);\n messages.push(message);\n }\n\n this.messages = messages;\n\n // Update attachment support based on agents in this conversation\n this.updateAttachmentSupport();\n\n // Detect in-progress messages for streaming reconnection\n // Always create NEW array reference to trigger Input setter in message-input component\n this.inProgressMessageIds = [...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 // The streaming service stores recent completions so we can handle them\n for (const message of messages) {\n if (message.Status === 'In-Progress' && message.ID) {\n const recentCompletion = this.streamingService.getRecentCompletion(message.ID);\n if (recentCompletion) {\n // This message completed while we were away - handle it\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 LogStatusEx({message: `✅ Built ${messages.length} messages from cache`, verboseOnly: true});\n }\n\n /**\n * Builds a map of UserID -> Avatar data for fast lookups\n * Extracts unique users from conversation data and their avatar settings\n */\n private buildUserAvatarMap(conversationData: ConversationDetailComplete[]): void {\n this.userAvatarMap.clear();\n\n // Get unique users and their avatar data\n const userMap = new Map<string, {imageUrl: string | null; iconClass: string | null}>();\n\n for (const row of conversationData) {\n // Only process user messages that have a UserID\n if (row.Role?.toLowerCase() === 'user' && row.UserID) {\n // Only add if we haven't seen this user yet\n if (!userMap.has(row.UserID)) {\n userMap.set(row.UserID, {\n imageUrl: row.UserImageURL || null,\n iconClass: row.UserImageIconClass || null\n });\n }\n }\n }\n\n this.userAvatarMap = userMap;\n LogStatusEx({message: `👤 Built user avatar map with ${this.userAvatarMap.size} unique users`, verboseOnly: true});\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 const timestamp = new Date().toISOString();\n\n // Skip if we've already processed peripheral data for this conversation\n if (this.lastLoadedConversationId === conversationId) {\n LogStatusEx({message: `[${timestamp}] ⏭️ Skipping peripheral data processing - already processed for conversation ${conversationId}`, verboseOnly: true});\n return;\n }\n\n // Mark this conversation as processed to prevent duplicate processing\n this.lastLoadedConversationId = conversationId;\n LogStatusEx({message: `[${timestamp}] 📊 Processing peripheral data for conversation ${conversationId} from cache`, verboseOnly: true});\n\n try {\n // Get cached data - should always be present by the time we get here\n const conversationData = this.conversationDataCache.get(conversationId);\n if (!conversationData) {\n console.warn(`No cached data found for conversation ${conversationId}`);\n return;\n }\n\n const md = new Metadata();\n\n // Clear and rebuild maps from cached data\n this.agentRunsByDetailId.clear();\n this.artifactsByDetailId.clear();\n\n for (const row of conversationData) {\n // Skip rows without ID (should never happen, but type safety check)\n if (!row.ID) {\n console.warn('Skipping conversation detail row without ID');\n continue;\n }\n\n const parsed = parseConversationDetailComplete(row);\n\n // Build agent runs map\n if (parsed.agentRuns.length > 0) {\n // Convert AgentRunJSON to MJAIAgentRunEntityExtended\n const agentRunData = parsed.agentRuns[0]; // Should only be one per detail\n const agentRun = await md.GetEntityObject<MJAIAgentRunEntityExtended>('MJ: AI Agent Runs', this.currentUser);\n\n // Convert ISO date strings to Date objects\n agentRun.LoadFromData({\n ID: agentRunData.ID,\n AgentID: agentRunData.AgentID,\n Agent: agentRunData.Agent,\n Status: agentRunData.Status,\n __mj_CreatedAt: agentRunData.__mj_CreatedAt,\n __mj_UpdatedAt: agentRunData.__mj_UpdatedAt,\n TotalPromptTokensUsed: agentRunData.TotalPromptTokensUsed,\n TotalCompletionTokensUsed: agentRunData.TotalCompletionTokensUsed,\n TotalCost: agentRunData.TotalCost,\n ConversationDetailID: agentRunData.ConversationDetailID\n });\n\n this.agentRunsByDetailId.set(row.ID, agentRun);\n }\n\n // Build artifacts map - no need to load full entities, just create LazyArtifactInfo\n if (parsed.artifacts.length > 0) {\n const artifactList: LazyArtifactInfo[] = [];\n const systemArtifactList: LazyArtifactInfo[] = [];\n\n for (const artifactData of parsed.artifacts) {\n // Create LazyArtifactInfo with display data from query\n // Full entities will be loaded on-demand when artifact is clicked\n const lazyInfo = new LazyArtifactInfo(artifactData, this.currentUser);\n\n // Separate system-only artifacts from user-visible artifacts\n if (artifactData.Visibility === 'System Only') {\n systemArtifactList.push(lazyInfo);\n } else {\n artifactList.push(lazyInfo);\n }\n }\n\n // Add to appropriate maps\n if (artifactList.length > 0) {\n this.artifactsByDetailId.set(row.ID, artifactList);\n }\n if (systemArtifactList.length > 0) {\n this.systemArtifactsByDetailId.set(row.ID, systemArtifactList);\n }\n }\n\n // Build ratings map\n if (parsed.ratings.length > 0) {\n this.ratingsByDetailId.set(row.ID, parsed.ratings);\n }\n }\n\n // Load attachments for all messages in this conversation\n // Uses the ConversationAttachmentService to batch-load all attachments\n this.attachmentsByDetailId.clear();\n const messageIds = conversationData.map(row => row.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 (unique artifacts, not versions)\n this.artifactCount = this.calculateUniqueArtifactCount();\n this.updateArtifactCountDisplay();\n\n // Debug: Log summary\n const systemArtifactCount = this.systemArtifactsByDetailId.size;\n const attachmentCount = this.attachmentsByDetailId.size;\n LogStatusEx({message: `📊 Processed ${this.agentRunsByDetailId.size} agent runs, ${this.artifactsByDetailId.size} user artifact mappings, ${systemArtifactCount} system artifact mappings (${this.artifactCount} unique user artifacts), ${attachmentCount} messages with attachments`, verboseOnly: true});\n\n // CRITICAL: Trigger message re-render now that agent runs and artifacts are loaded\n // This updates all message components with the newly loaded agent run data\n this.messages = [...this.messages]; // Create new array reference to trigger change detection\n this.cdr.detectChanges();\n\n LogStatusEx({message: `✅ Peripheral data processed successfully for conversation ${conversationId} from cache`, verboseOnly: true});\n } catch (error) {\n console.error('Failed to process peripheral data:', error);\n // Don't set lastLoadedConversationId on error so we can retry\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 // 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.invalidateConversationCache(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\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\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 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 for the active conversation from the database\n * Called when 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 LogStatusEx({message: `🔄 Reloading messages for conversation ${conversationId} to discover delegated agents`, verboseOnly: true});\n\n const md = new Metadata();\n const rv = new RunView();\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 const result = await rv.RunView<MJConversationDetailEntity>({\n EntityName: 'MJ: Conversation Details',\n ExtraFilter: `ConversationID='${conversationId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n // Merge DB results with existing client-side messages rather than replacing entirely.\n // This prevents dropping messages added client-side (e.g., by handleSubAgentInvocation)\n // that haven't appeared in the DB query results yet due to timing.\n const merged = new Map<string, MJConversationDetailEntity>();\n\n // Add all DB messages (fresh data)\n for (const msg of result.Results) {\n merged.set(msg.ID, msg);\n }\n\n // Preserve client-side messages not yet in DB\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 = result.Results.filter(m => !existingMessageIds.has(m.ID));\n\n // Load agent runs for new messages so completion detector can reload artifacts\n for (const message of newMessages) {\n if (message.AgentID && message.ID) {\n // Query to find agent run for this conversation detail\n const agentRunResult = await rv.RunView<MJAIAgentRunEntityExtended>({\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `ConversationDetailID='${message.ID}'`,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (agentRunResult.Success && agentRunResult.Results && agentRunResult.Results.length > 0) {\n const agentRun = agentRunResult.Results[0];\n this.agentRunsByDetailId.set(message.ID, agentRun);\n LogStatusEx({message: `✅ Loaded agent run for new delegated message ${message.ID} (Agent: ${agentRun.Agent})`, verboseOnly: true});\n }\n }\n }\n\n LogStatusEx({message: `✅ Reloaded ${result.Results.length} messages (${newMessages.length} new, ${result.Results.filter(m => m.Status === 'In-Progress').length} in-progress)`, verboseOnly: true});\n }\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.invalidateConversationCache(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 // 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.invalidateConversationCache(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 * Invalidate cached conversation data\n * Called when new messages are added or conversation data changes\n */\n private invalidateConversationCache(conversationId: string): void {\n this.conversationDataCache.delete(conversationId);\n LogStatusEx({message: `🗑️ Invalidated cache for conversation ${conversationId}`, verboseOnly: true});\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 // 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 rq = new RunQuery();\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 // Invalidate cache since artifacts changed\n this.invalidateConversationCache(detail.ConversationID);\n\n // Use optimized single query to reload all conversation data\n const result = await rq.RunQuery({\n QueryName: 'GetConversationComplete',\n CategoryPath: 'MJ/Conversations',\n Parameters: { ConversationID: detail.ConversationID }\n }, this.currentUser);\n\n if (!result.Success || !result.Results) {\n console.error('Failed to reload artifacts:', result.ErrorMessage);\n return;\n }\n\n LogStatusEx({message: `📊 Query result: ${result.Results.length} conversation details loaded`, verboseOnly: true});\n\n // Update cache with fresh data\n const conversationData = result.Results as ConversationDetailComplete[];\n this.conversationDataCache.set(detail.ConversationID, conversationData);\n\n // Process ALL messages in the conversation to pick up artifacts from\n // delegated sub-agent messages (e.g., when Sage delegates to Skip,\n // the artifact is on Skip's message, not Sage's)\n for (const row of conversationData) {\n this.updateArtifactsForRow(row);\n }\n\n // Create new Map reference to trigger Angular change detection\n this.artifactsByDetailId = new Map(this.artifactsByDetailId);\n this._combinedArtifactsMap = null; // Clear cache so effectiveArtifactsMap rebuilds\n\n // Update artifact count\n this.artifactCount = this.calculateUniqueArtifactCount();\n this.updateArtifactCountDisplay();\n } catch (error) {\n console.error('Failed to reload artifacts for message:', error);\n }\n }\n\n /**\n * Update artifact maps for a single conversation detail row.\n * Clears existing entries for the row and rebuilds from parsed data.\n */\n private updateArtifactsForRow(row: ConversationDetailComplete): void {\n const rowId = row.ID;\n if (!rowId) {\n return;\n }\n\n const parsed = parseConversationDetailComplete(row);\n\n // Clear existing artifacts for this detail and rebuild\n this.artifactsByDetailId.delete(rowId);\n this.systemArtifactsByDetailId.delete(rowId);\n\n if (parsed.artifacts.length === 0) {\n return;\n }\n\n const artifactList: LazyArtifactInfo[] = [];\n const systemArtifactList: LazyArtifactInfo[] = [];\n\n for (const artifactData of parsed.artifacts) {\n const lazyInfo = new LazyArtifactInfo(artifactData, this.currentUser);\n\n // Separate system-only artifacts from user-visible artifacts\n if (artifactData.Visibility === 'System Only') {\n systemArtifactList.push(lazyInfo);\n } else {\n artifactList.push(lazyInfo);\n }\n\n LogStatusEx({message: `✅ Loaded artifact ${artifactData.ArtifactID} v${artifactData.VersionNumber} for message ${rowId}`, verboseOnly: true});\n }\n\n // Add to appropriate maps\n if (artifactList.length > 0) {\n this.artifactsByDetailId.set(rowId, artifactList);\n }\n if (systemArtifactList.length > 0) {\n this.systemArtifactsByDetailId.set(rowId, systemArtifactList);\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.conversationData.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.conversationData.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 /**\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 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 }\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 data service\n const newConversation = await this.conversationData.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 onTestFeedbackMessage(message: MJConversationDetailEntity): void {\n if (!message.TestRunID) {\n console.error('Cannot provide test feedback: message has no TestRunID');\n return;\n }\n\n const dialogData: TestFeedbackDialogData = {\n testRunId: message.TestRunID,\n conversationDetailId: message.ID,\n currentUser: this.currentUser\n };\n\n const dialogRef = this.dialogService.open({\n content: TestFeedbackDialogComponent,\n title: 'Provide Test Feedback',\n width: 600,\n minHeight: 500\n });\n\n const dialogInstance = dialogRef.content.instance as TestFeedbackDialogComponent;\n dialogInstance.data = dialogData;\n\n dialogRef.result.subscribe((result) => {\n if (result && typeof result === 'object' && 'success' in result) {\n const feedbackResult = result as {success: boolean; feedbackId?: string};\n if (feedbackResult.success) {\n console.log('Test feedback saved successfully:', feedbackResult.feedbackId);\n // TODO: Optionally show success notification\n }\n }\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 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 <mj-active-agent-indicator\n [conversationId]=\"conversation.ID\"\n [currentUser]=\"currentUser\"\n (togglePanel)=\"onToggleAgentPanel()\"\n (agentSelected)=\"onAgentSelected($event)\">\n </mj-active-agent-indicator>\n </div>\n <div class=\"chat-actions chat-actions-buttons\">\n @if (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 <button class=\"action-btn\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n <span class=\"btn-label\">Export</span>\n </button>\n <button class=\"action-btn share-btn\"\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 <mj-active-agent-indicator\n [conversationId]=\"conversation.ID\"\n [currentUser]=\"currentUser\"\n (togglePanel)=\"onToggleAgentPanel()\"\n (agentSelected)=\"onAgentSelected($event)\">\n </mj-active-agent-indicator>\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 (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 (sidebarToggleClicked)=\"sidebarToggleClicked.emit()\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads -->\n <div class=\"conversation-loading-state\">\n <mj-loading text=\"Loading conversation...\" size=\"large\"></mj-loading>\n </div>\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 (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 </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 [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 </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 </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: #D1D5DB; margin-bottom: 16px;\"></i>\n <p style=\"color: #6B7280; 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<!-- 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}"]}
|
|
@@ -197,7 +197,7 @@ export class AgentResponseFormComponent {
|
|
|
197
197
|
this.cdr = cdr;
|
|
198
198
|
}
|
|
199
199
|
ngOnInit() {
|
|
200
|
-
console.
|
|
200
|
+
console.debug('AgentResponseForm ngOnInit:', {
|
|
201
201
|
hasResponseForm: !!this.responseForm,
|
|
202
202
|
responseForm: this.responseForm,
|
|
203
203
|
disabled: this.disabled,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-response-form.component.js","sourceRoot":"","sources":["../../../../src/lib/components/message/agent-response-form.component.ts","../../../../src/lib/components/message/agent-response-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { FormGroup, FormControl, Validators } from '@angular/forms';\nimport { AgentResponseForm, FormQuestion } from '@memberjunction/ai-core-plus';\n\n/**\n * Component for displaying agent response forms with dynamic questions\n * Handles both simple button choices and complex multi-question forms\n */\n@Component({\n standalone: false,\n selector: 'mj-agent-response-form',\n templateUrl: './agent-response-form.component.html',\n styleUrls: ['./agent-response-form.component.css']\n})\nexport class AgentResponseFormComponent implements OnInit {\n @Input() responseForm!: AgentResponseForm;\n @Input() disabled: boolean = false;\n @Input() isLastMessage: boolean = false;\n @Input() isConversationOwner: boolean = false;\n\n @Output() formSubmitted = new EventEmitter<Record<string, any>>();\n\n public formGroup!: FormGroup;\n public isSubmitting: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n console.log('AgentResponseForm ngOnInit:', {\n hasResponseForm: !!this.responseForm,\n responseForm: this.responseForm,\n disabled: this.disabled,\n isLastMessage: this.isLastMessage,\n isConversationOwner: this.isConversationOwner,\n isVisible: this.isVisible,\n isSimpleChoice: this.isSimpleChoice\n });\n this.buildFormGroup();\n }\n\n /**\n * Check if this is a simple choice (single question with buttongroup/radio, no title)\n * Simple choices render as buttons only, complex forms render as full forms\n */\n public get isSimpleChoice(): boolean {\n if (!this.responseForm) return false;\n\n return (\n this.responseForm.questions.length === 1 &&\n !this.responseForm.title &&\n this.isChoiceQuestion(this.responseForm.questions[0])\n );\n }\n\n /**\n * Get the choice question that should be rendered in the footer (if any)\n * Forms with a buttongroup/radio question have those buttons in the footer instead of Submit\n */\n public get footerChoiceQuestion(): FormQuestion | null {\n if (!this.responseForm || this.isSimpleChoice) return null;\n\n // Find the last buttongroup/radio question - it becomes the footer action\n const choiceQuestions = this.responseForm.questions.filter(q => this.isChoiceQuestion(q));\n return choiceQuestions.length > 0 ? choiceQuestions[choiceQuestions.length - 1] : null;\n }\n\n /**\n * Get questions to render in the main form area (excludes footer choice question)\n */\n public get mainQuestions(): FormQuestion[] {\n if (!this.responseForm) return [];\n\n const footerChoice = this.footerChoiceQuestion;\n if (!footerChoice) return this.responseForm.questions;\n\n return this.responseForm.questions.filter(q => q.id !== footerChoice.id);\n }\n\n /**\n * Check if we should show the standard Submit button (no footer choice question)\n */\n public get showSubmitButton(): boolean {\n return !this.footerChoiceQuestion;\n }\n\n /**\n * Check if component should be visible\n */\n public get isVisible(): boolean {\n return (\n this.isLastMessage &&\n this.isConversationOwner &&\n this.responseForm &&\n this.responseForm.questions.length > 0\n );\n }\n\n /**\n * Get submit button label\n */\n public get submitLabel(): string {\n return this.responseForm.submitLabel || 'Submit';\n }\n\n /**\n * Check if a question is a choice-based question\n */\n private isChoiceQuestion(question: FormQuestion): boolean {\n const type = typeof question.type === 'string' ? question.type : question.type.type;\n return ['buttongroup', 'radio'].includes(type);\n }\n\n /**\n * Build the reactive form group from the response form definition\n */\n private buildFormGroup(): void {\n const controls: Record<string, FormControl> = {};\n\n for (const question of this.responseForm.questions) {\n const validators = [];\n if (question.required) {\n validators.push(Validators.required);\n }\n\n // Add email validator for email questions\n const questionType = typeof question.type === 'string' ? question.type : question.type.type;\n if (questionType === 'email') {\n validators.push(Validators.email);\n }\n\n // Add min/max validators for number/currency questions\n if (['number', 'currency'].includes(questionType) && typeof question.type === 'object') {\n if ('min' in question.type && question.type.min != null) {\n validators.push(Validators.min(question.type.min as number));\n }\n if ('max' in question.type && question.type.max != null) {\n validators.push(Validators.max(question.type.max as number));\n }\n }\n\n // Initialize value based on question type\n let initialValue = question.defaultValue;\n if (!initialValue) {\n // For checkbox with multiple selection, initialize as empty array\n if (questionType === 'checkbox' && typeof question.type === 'object' && 'multiple' in question.type && question.type.multiple) {\n initialValue = [];\n } else {\n initialValue = null;\n }\n }\n\n controls[question.id] = new FormControl(initialValue, validators);\n }\n\n this.formGroup = new FormGroup(controls);\n }\n\n /**\n * Get FormControl for a specific question\n */\n public getControl(questionId: string): FormControl {\n return this.formGroup.get(questionId) as FormControl;\n }\n\n /**\n * Handle simple choice button click (for single question forms)\n */\n public onSimpleChoiceClick(value: any): void {\n if (!this.disabled && !this.isSubmitting) {\n const question = this.responseForm.questions[0];\n this.isSubmitting = true;\n this.formSubmitted.emit({ [question.id]: value });\n\n // Reset submitting state after a short delay\n setTimeout(() => {\n this.isSubmitting = false;\n this.cdr.detectChanges();\n }, 1000);\n }\n }\n\n /**\n * Handle footer choice button click (for forms with choice buttons in footer)\n * Submits the form with all field values plus the selected choice\n */\n public onFooterChoiceClick(value: any): void {\n if (!this.disabled && !this.isSubmitting && this.footerChoiceQuestion) {\n // First validate any required fields in the main form\n const mainControlKeys = this.mainQuestions.map(q => q.id);\n let hasInvalidFields = false;\n\n for (const key of mainControlKeys) {\n const control = this.formGroup.get(key);\n if (control?.invalid) {\n control.markAsTouched();\n hasInvalidFields = true;\n }\n }\n\n if (hasInvalidFields) {\n return;\n }\n\n this.isSubmitting = true;\n\n // Gather all form values and add the choice value\n const formData = { ...this.formGroup.value };\n formData[this.footerChoiceQuestion.id] = value;\n\n this.formSubmitted.emit(formData);\n\n // Reset form and submitting state\n Promise.resolve().then(() => {\n this.formGroup.reset();\n this.isSubmitting = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Handle full form submission\n */\n public onSubmit(): void {\n if (this.formGroup.invalid) {\n // Mark all fields as touched to show validation errors\n Object.keys(this.formGroup.controls).forEach(key => {\n this.formGroup.controls[key].markAsTouched();\n });\n return;\n }\n\n if (!this.disabled && !this.isSubmitting) {\n this.isSubmitting = true;\n this.formSubmitted.emit(this.formGroup.value);\n\n // Reset form and submitting state\n Promise.resolve().then(() => {\n this.formGroup.reset();\n this.isSubmitting = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Get options for a choice question (used in simple choice mode)\n */\n public getOptions(question: FormQuestion): any[] {\n if (typeof question.type === 'object' && 'options' in question.type) {\n return question.type.options;\n }\n return [];\n }\n\n /**\n * Check if question has an icon\n */\n public hasIcon(option: any): boolean {\n return option && option.icon;\n }\n\n /**\n * Track by function for questions list\n */\n public trackByQuestionId(index: number, question: FormQuestion): string {\n return question.id;\n }\n\n /**\n * Track by function for options list\n */\n public trackByValue(index: number, option: any): any {\n return option.value;\n }\n}\n","@if (isVisible) {\n <div class=\"agent-response-form\">\n <!-- Simple Choice Mode (single question, no title, buttongroup/radio) -->\n @if (isSimpleChoice) {\n <div class=\"simple-choice-buttons\">\n @for (option of getOptions(responseForm.questions[0]); track trackByValue($index, option)) {\n <button\n kendoButton\n [disabled]=\"disabled || isSubmitting\"\n (click)=\"onSimpleChoiceClick(option.value)\"\n class=\"choice-button\"\n >\n @if (hasIcon(option)) {\n <i class=\"fa {{ option.icon }}\" aria-hidden=\"true\"></i>\n }\n {{ option.label }}\n </button>\n }\n </div>\n }\n <!-- Full Form Mode (complex forms) -->\n @if (!isSimpleChoice) {\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\" class=\"response-form\">\n <!-- Form Title -->\n @if (responseForm.title) {\n <h3 class=\"form-title\">{{ responseForm.title }}</h3>\n }\n <!-- Form Description -->\n @if (responseForm.description) {\n <p class=\"form-description\">{{ responseForm.description }}</p>\n }\n <!-- Questions (excludes footer choice question) -->\n @if (mainQuestions.length > 0) {\n <div class=\"form-questions\">\n @for (question of mainQuestions; track trackByQuestionId($index, question)) {\n <mj-form-question\n [question]=\"question\"\n [control]=\"getControl(question.id)\"\n [formControlName]=\"question.id\"\n ></mj-form-question>\n }\n </div>\n }\n <!-- Footer Actions -->\n <div class=\"form-actions\">\n <!-- Footer Choice Buttons (replaces Submit when present) -->\n @if (footerChoiceQuestion) {\n @for (option of getOptions(footerChoiceQuestion); track trackByValue($index, option)) {\n <button\n kendoButton\n type=\"button\"\n [themeColor]=\"'primary'\"\n [disabled]=\"disabled || isSubmitting\"\n (click)=\"onFooterChoiceClick(option.value)\"\n class=\"footer-choice-button\"\n >\n @if (!isSubmitting) {\n <span>\n @if (hasIcon(option)) {\n <i class=\"fa {{ option.icon }}\" aria-hidden=\"true\"></i>\n }\n {{ option.label }}\n </span>\n }\n @if (isSubmitting) {\n <span>\n <span class=\"k-icon k-i-loading\"></span>\n </span>\n }\n </button>\n }\n }\n <!-- Standard Submit Button (when no footer choice) -->\n @if (showSubmitButton) {\n <button\n kendoButton\n type=\"submit\"\n [themeColor]=\"'primary'\"\n [disabled]=\"disabled || isSubmitting || formGroup.invalid\"\n class=\"submit-button\"\n >\n @if (!isSubmitting) {\n <span>\n <i class=\"fa fa-check\" aria-hidden=\"true\"></i>\n {{ submitLabel }}\n </span>\n }\n @if (isSubmitting) {\n <span>\n <span class=\"k-icon k-i-loading\"></span>\n Submitting...\n </span>\n }\n </button>\n }\n </div>\n </form>\n }\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-response-form.component.js","sourceRoot":"","sources":["../../../../src/lib/components/message/agent-response-form.component.ts","../../../../src/lib/components/message/agent-response-form.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { FormGroup, FormControl, Validators } from '@angular/forms';\nimport { AgentResponseForm, FormQuestion } from '@memberjunction/ai-core-plus';\n\n/**\n * Component for displaying agent response forms with dynamic questions\n * Handles both simple button choices and complex multi-question forms\n */\n@Component({\n standalone: false,\n selector: 'mj-agent-response-form',\n templateUrl: './agent-response-form.component.html',\n styleUrls: ['./agent-response-form.component.css']\n})\nexport class AgentResponseFormComponent implements OnInit {\n @Input() responseForm!: AgentResponseForm;\n @Input() disabled: boolean = false;\n @Input() isLastMessage: boolean = false;\n @Input() isConversationOwner: boolean = false;\n\n @Output() formSubmitted = new EventEmitter<Record<string, any>>();\n\n public formGroup!: FormGroup;\n public isSubmitting: boolean = false;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n console.debug('AgentResponseForm ngOnInit:', {\n hasResponseForm: !!this.responseForm,\n responseForm: this.responseForm,\n disabled: this.disabled,\n isLastMessage: this.isLastMessage,\n isConversationOwner: this.isConversationOwner,\n isVisible: this.isVisible,\n isSimpleChoice: this.isSimpleChoice\n });\n this.buildFormGroup();\n }\n\n /**\n * Check if this is a simple choice (single question with buttongroup/radio, no title)\n * Simple choices render as buttons only, complex forms render as full forms\n */\n public get isSimpleChoice(): boolean {\n if (!this.responseForm) return false;\n\n return (\n this.responseForm.questions.length === 1 &&\n !this.responseForm.title &&\n this.isChoiceQuestion(this.responseForm.questions[0])\n );\n }\n\n /**\n * Get the choice question that should be rendered in the footer (if any)\n * Forms with a buttongroup/radio question have those buttons in the footer instead of Submit\n */\n public get footerChoiceQuestion(): FormQuestion | null {\n if (!this.responseForm || this.isSimpleChoice) return null;\n\n // Find the last buttongroup/radio question - it becomes the footer action\n const choiceQuestions = this.responseForm.questions.filter(q => this.isChoiceQuestion(q));\n return choiceQuestions.length > 0 ? choiceQuestions[choiceQuestions.length - 1] : null;\n }\n\n /**\n * Get questions to render in the main form area (excludes footer choice question)\n */\n public get mainQuestions(): FormQuestion[] {\n if (!this.responseForm) return [];\n\n const footerChoice = this.footerChoiceQuestion;\n if (!footerChoice) return this.responseForm.questions;\n\n return this.responseForm.questions.filter(q => q.id !== footerChoice.id);\n }\n\n /**\n * Check if we should show the standard Submit button (no footer choice question)\n */\n public get showSubmitButton(): boolean {\n return !this.footerChoiceQuestion;\n }\n\n /**\n * Check if component should be visible\n */\n public get isVisible(): boolean {\n return (\n this.isLastMessage &&\n this.isConversationOwner &&\n this.responseForm &&\n this.responseForm.questions.length > 0\n );\n }\n\n /**\n * Get submit button label\n */\n public get submitLabel(): string {\n return this.responseForm.submitLabel || 'Submit';\n }\n\n /**\n * Check if a question is a choice-based question\n */\n private isChoiceQuestion(question: FormQuestion): boolean {\n const type = typeof question.type === 'string' ? question.type : question.type.type;\n return ['buttongroup', 'radio'].includes(type);\n }\n\n /**\n * Build the reactive form group from the response form definition\n */\n private buildFormGroup(): void {\n const controls: Record<string, FormControl> = {};\n\n for (const question of this.responseForm.questions) {\n const validators = [];\n if (question.required) {\n validators.push(Validators.required);\n }\n\n // Add email validator for email questions\n const questionType = typeof question.type === 'string' ? question.type : question.type.type;\n if (questionType === 'email') {\n validators.push(Validators.email);\n }\n\n // Add min/max validators for number/currency questions\n if (['number', 'currency'].includes(questionType) && typeof question.type === 'object') {\n if ('min' in question.type && question.type.min != null) {\n validators.push(Validators.min(question.type.min as number));\n }\n if ('max' in question.type && question.type.max != null) {\n validators.push(Validators.max(question.type.max as number));\n }\n }\n\n // Initialize value based on question type\n let initialValue = question.defaultValue;\n if (!initialValue) {\n // For checkbox with multiple selection, initialize as empty array\n if (questionType === 'checkbox' && typeof question.type === 'object' && 'multiple' in question.type && question.type.multiple) {\n initialValue = [];\n } else {\n initialValue = null;\n }\n }\n\n controls[question.id] = new FormControl(initialValue, validators);\n }\n\n this.formGroup = new FormGroup(controls);\n }\n\n /**\n * Get FormControl for a specific question\n */\n public getControl(questionId: string): FormControl {\n return this.formGroup.get(questionId) as FormControl;\n }\n\n /**\n * Handle simple choice button click (for single question forms)\n */\n public onSimpleChoiceClick(value: any): void {\n if (!this.disabled && !this.isSubmitting) {\n const question = this.responseForm.questions[0];\n this.isSubmitting = true;\n this.formSubmitted.emit({ [question.id]: value });\n\n // Reset submitting state after a short delay\n setTimeout(() => {\n this.isSubmitting = false;\n this.cdr.detectChanges();\n }, 1000);\n }\n }\n\n /**\n * Handle footer choice button click (for forms with choice buttons in footer)\n * Submits the form with all field values plus the selected choice\n */\n public onFooterChoiceClick(value: any): void {\n if (!this.disabled && !this.isSubmitting && this.footerChoiceQuestion) {\n // First validate any required fields in the main form\n const mainControlKeys = this.mainQuestions.map(q => q.id);\n let hasInvalidFields = false;\n\n for (const key of mainControlKeys) {\n const control = this.formGroup.get(key);\n if (control?.invalid) {\n control.markAsTouched();\n hasInvalidFields = true;\n }\n }\n\n if (hasInvalidFields) {\n return;\n }\n\n this.isSubmitting = true;\n\n // Gather all form values and add the choice value\n const formData = { ...this.formGroup.value };\n formData[this.footerChoiceQuestion.id] = value;\n\n this.formSubmitted.emit(formData);\n\n // Reset form and submitting state\n Promise.resolve().then(() => {\n this.formGroup.reset();\n this.isSubmitting = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Handle full form submission\n */\n public onSubmit(): void {\n if (this.formGroup.invalid) {\n // Mark all fields as touched to show validation errors\n Object.keys(this.formGroup.controls).forEach(key => {\n this.formGroup.controls[key].markAsTouched();\n });\n return;\n }\n\n if (!this.disabled && !this.isSubmitting) {\n this.isSubmitting = true;\n this.formSubmitted.emit(this.formGroup.value);\n\n // Reset form and submitting state\n Promise.resolve().then(() => {\n this.formGroup.reset();\n this.isSubmitting = false;\n this.cdr.detectChanges();\n });\n }\n }\n\n /**\n * Get options for a choice question (used in simple choice mode)\n */\n public getOptions(question: FormQuestion): any[] {\n if (typeof question.type === 'object' && 'options' in question.type) {\n return question.type.options;\n }\n return [];\n }\n\n /**\n * Check if question has an icon\n */\n public hasIcon(option: any): boolean {\n return option && option.icon;\n }\n\n /**\n * Track by function for questions list\n */\n public trackByQuestionId(index: number, question: FormQuestion): string {\n return question.id;\n }\n\n /**\n * Track by function for options list\n */\n public trackByValue(index: number, option: any): any {\n return option.value;\n }\n}\n","@if (isVisible) {\n <div class=\"agent-response-form\">\n <!-- Simple Choice Mode (single question, no title, buttongroup/radio) -->\n @if (isSimpleChoice) {\n <div class=\"simple-choice-buttons\">\n @for (option of getOptions(responseForm.questions[0]); track trackByValue($index, option)) {\n <button\n kendoButton\n [disabled]=\"disabled || isSubmitting\"\n (click)=\"onSimpleChoiceClick(option.value)\"\n class=\"choice-button\"\n >\n @if (hasIcon(option)) {\n <i class=\"fa {{ option.icon }}\" aria-hidden=\"true\"></i>\n }\n {{ option.label }}\n </button>\n }\n </div>\n }\n <!-- Full Form Mode (complex forms) -->\n @if (!isSimpleChoice) {\n <form [formGroup]=\"formGroup\" (ngSubmit)=\"onSubmit()\" class=\"response-form\">\n <!-- Form Title -->\n @if (responseForm.title) {\n <h3 class=\"form-title\">{{ responseForm.title }}</h3>\n }\n <!-- Form Description -->\n @if (responseForm.description) {\n <p class=\"form-description\">{{ responseForm.description }}</p>\n }\n <!-- Questions (excludes footer choice question) -->\n @if (mainQuestions.length > 0) {\n <div class=\"form-questions\">\n @for (question of mainQuestions; track trackByQuestionId($index, question)) {\n <mj-form-question\n [question]=\"question\"\n [control]=\"getControl(question.id)\"\n [formControlName]=\"question.id\"\n ></mj-form-question>\n }\n </div>\n }\n <!-- Footer Actions -->\n <div class=\"form-actions\">\n <!-- Footer Choice Buttons (replaces Submit when present) -->\n @if (footerChoiceQuestion) {\n @for (option of getOptions(footerChoiceQuestion); track trackByValue($index, option)) {\n <button\n kendoButton\n type=\"button\"\n [themeColor]=\"'primary'\"\n [disabled]=\"disabled || isSubmitting\"\n (click)=\"onFooterChoiceClick(option.value)\"\n class=\"footer-choice-button\"\n >\n @if (!isSubmitting) {\n <span>\n @if (hasIcon(option)) {\n <i class=\"fa {{ option.icon }}\" aria-hidden=\"true\"></i>\n }\n {{ option.label }}\n </span>\n }\n @if (isSubmitting) {\n <span>\n <span class=\"k-icon k-i-loading\"></span>\n </span>\n }\n </button>\n }\n }\n <!-- Standard Submit Button (when no footer choice) -->\n @if (showSubmitButton) {\n <button\n kendoButton\n type=\"submit\"\n [themeColor]=\"'primary'\"\n [disabled]=\"disabled || isSubmitting || formGroup.invalid\"\n class=\"submit-button\"\n >\n @if (!isSubmitting) {\n <span>\n <i class=\"fa fa-check\" aria-hidden=\"true\"></i>\n {{ submitLabel }}\n </span>\n }\n @if (isSubmitting) {\n <span>\n <span class=\"k-icon k-i-loading\"></span>\n Submitting...\n </span>\n }\n </button>\n }\n </div>\n </form>\n }\n </div>\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-conversations",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.10.1",
|
|
4
4
|
"description": "MemberJunction: Conversation, Collection, and Artifact management components for any Angular application",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -31,21 +31,21 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@angular/animations": "21.1.3",
|
|
33
33
|
"@angular/cdk": "21.1.3",
|
|
34
|
-
"@memberjunction/ai": "5.
|
|
35
|
-
"@memberjunction/ai-core-plus": "5.
|
|
36
|
-
"@memberjunction/ai-engine-base": "5.
|
|
37
|
-
"@memberjunction/core": "5.
|
|
38
|
-
"@memberjunction/core-entities": "5.
|
|
39
|
-
"@memberjunction/global": "5.
|
|
40
|
-
"@memberjunction/graphql-dataprovider": "5.
|
|
41
|
-
"@memberjunction/ng-artifacts": "5.
|
|
42
|
-
"@memberjunction/ng-base-types": "5.
|
|
43
|
-
"@memberjunction/ng-code-editor": "5.
|
|
44
|
-
"@memberjunction/ng-container-directives": "5.
|
|
45
|
-
"@memberjunction/ng-notifications": "5.
|
|
46
|
-
"@memberjunction/ng-shared-generic": "5.
|
|
47
|
-
"@memberjunction/ng-tasks": "5.
|
|
48
|
-
"@memberjunction/ng-testing": "5.
|
|
34
|
+
"@memberjunction/ai": "5.10.1",
|
|
35
|
+
"@memberjunction/ai-core-plus": "5.10.1",
|
|
36
|
+
"@memberjunction/ai-engine-base": "5.10.1",
|
|
37
|
+
"@memberjunction/core": "5.10.1",
|
|
38
|
+
"@memberjunction/core-entities": "5.10.1",
|
|
39
|
+
"@memberjunction/global": "5.10.1",
|
|
40
|
+
"@memberjunction/graphql-dataprovider": "5.10.1",
|
|
41
|
+
"@memberjunction/ng-artifacts": "5.10.1",
|
|
42
|
+
"@memberjunction/ng-base-types": "5.10.1",
|
|
43
|
+
"@memberjunction/ng-code-editor": "5.10.1",
|
|
44
|
+
"@memberjunction/ng-container-directives": "5.10.1",
|
|
45
|
+
"@memberjunction/ng-notifications": "5.10.1",
|
|
46
|
+
"@memberjunction/ng-shared-generic": "5.10.1",
|
|
47
|
+
"@memberjunction/ng-tasks": "5.10.1",
|
|
48
|
+
"@memberjunction/ng-testing": "5.10.1",
|
|
49
49
|
"@progress/kendo-angular-buttons": "22.0.1",
|
|
50
50
|
"@progress/kendo-angular-dateinputs": "22.0.1",
|
|
51
51
|
"@progress/kendo-angular-dialog": "22.0.1",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@progress/kendo-angular-layout": "22.0.1",
|
|
56
56
|
"@progress/kendo-angular-notification": "22.0.1",
|
|
57
57
|
"@progress/kendo-angular-upload": "22.0.1",
|
|
58
|
-
"@memberjunction/ng-markdown": "5.
|
|
58
|
+
"@memberjunction/ng-markdown": "5.10.1",
|
|
59
59
|
"rxjs": "^7.8.2",
|
|
60
60
|
"tslib": "^2.8.1"
|
|
61
61
|
},
|