@memberjunction/ng-conversations 5.29.0 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-list.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-list.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, ChangeDetectorRef } from '@angular/core';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJConversationEntity } from '@memberjunction/core-entities';\nimport { ConversationEngine } from '@memberjunction/core-entities';\nimport { DialogService } from '../../services/dialog.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-list',\n template: `\n <div class=\"conversation-list\">\n <div class=\"list-header\">\n <div class=\"header-top\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"searchQuery\">\n @if (!isSelectionMode) {\n <div class=\"header-menu-container\">\n <button class=\"btn-menu\" (click)=\"toggleHeaderMenu($event)\" title=\"Options\">\n <i class=\"fas fa-ellipsis-v\"></i>\n </button>\n @if (isHeaderMenuOpen) {\n <div class=\"header-dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"onRefreshConversationsClick($event)\" [disabled]=\"isRefreshing\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"isRefreshing\"></i>\n <span>{{ isRefreshing ? 'Refreshing...' : 'Refresh' }}</span>\n </button>\n <button class=\"dropdown-item\" (click)=\"onSelectConversationsClick($event)\">\n <i class=\"fas fa-check-square\"></i>\n <span>Select Conversations</span>\n </button>\n @if (!isMobileView) {\n <button class=\"dropdown-item\" (click)=\"onUnpinSidebarClick($event)\">\n <i class=\"fas fa-table-columns\"></i>\n <span>Hide Sidebar</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n <button class=\"btn-new-conversation\" (click)=\"createNewConversation()\" title=\"New Conversation\">\n <i class=\"fas fa-plus\"></i>\n <span>New Conversation</span>\n </button>\n <div class=\"list-content\">\n <!-- Pinned Section (only show if there are pinned conversations) -->\n @if (pinnedConversations.length > 0) {\n <div class=\"sidebar-section pinned-section\">\n <div class=\"section-header\" [class.expanded]=\"pinnedExpanded\" (click)=\"togglePinned()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <i class=\"fas fa-thumbtack section-icon\"></i>\n <span>Pinned</span>\n </div>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"pinnedExpanded\">\n @for (conversation of pinnedConversations; track conversation.ID) {\n <div class=\"conversation-item\"\n [class.active]=\"IsConversationActive(conversation)\"\n [class.renamed]=\"IsConversationRenamed(conversation)\"\n (click)=\"handleConversationClick(conversation)\">\n @if (isSelectionMode) {\n <div class=\"conversation-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"selectedConversationIds.has(conversation.ID)\"\n (click)=\"$event.stopPropagation(); toggleConversationSelection(conversation.ID)\">\n </div>\n }\n <div class=\"conversation-icon-wrapper\">\n @if (hasActiveTasks(conversation.ID)) {\n <div class=\"conversation-icon has-tasks\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n </div>\n }\n <div class=\"badge-overlay\">\n <mj-notification-badge [conversationId]=\"conversation.ID\"></mj-notification-badge>\n </div>\n </div>\n <div class=\"conversation-info\" [title]=\"conversation.Name + (conversation.Description ? '\\n' + conversation.Description : '')\">\n <div class=\"conversation-name\">{{ conversation.Name }}</div>\n <div class=\"conversation-preview\">{{ conversation.Description }}</div>\n </div>\n @if (!isSelectionMode) {\n <div class=\"conversation-actions\">\n <button class=\"menu-btn\" (click)=\"toggleMenu(conversation.ID, $event)\" title=\"More options\">\n <i class=\"fas fa-ellipsis\"></i>\n </button>\n @if (IsMenuOpen(conversation)) {\n <div class=\"context-menu\" (click)=\"$event.stopPropagation()\">\n <button class=\"menu-item\" (click)=\"togglePin(conversation, $event)\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Unpin</span>\n </button>\n <button class=\"menu-item\" (click)=\"renameConversation(conversation); closeMenu()\">\n <i class=\"fas fa-edit\"></i>\n <span>Rename</span>\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"deleteConversation(conversation); closeMenu()\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Messages Section -->\n <div class=\"sidebar-section\">\n <div class=\"section-header\" [class.expanded]=\"directMessagesExpanded\" (click)=\"toggleDirectMessages()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>Messages</span>\n </div>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"directMessagesExpanded\">\n @for (conversation of unpinnedConversations; track conversation.ID) {\n <div class=\"conversation-item\"\n [class.active]=\"IsConversationActive(conversation)\"\n [class.renamed]=\"IsConversationRenamed(conversation)\"\n (click)=\"handleConversationClick(conversation)\">\n @if (isSelectionMode) {\n <div class=\"conversation-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"selectedConversationIds.has(conversation.ID)\"\n (click)=\"$event.stopPropagation(); toggleConversationSelection(conversation.ID)\">\n </div>\n }\n <div class=\"conversation-icon-wrapper\">\n @if (hasActiveTasks(conversation.ID)) {\n <div class=\"conversation-icon has-tasks\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n </div>\n }\n <div class=\"badge-overlay\">\n <mj-notification-badge [conversationId]=\"conversation.ID\"></mj-notification-badge>\n </div>\n </div>\n <div class=\"conversation-info\" [title]=\"conversation.Name + (conversation.Description ? '\\n' + conversation.Description : '')\">\n <div class=\"conversation-name\">{{ conversation.Name }}</div>\n <div class=\"conversation-preview\">{{ conversation.Description }}</div>\n </div>\n @if (!isSelectionMode) {\n <div class=\"conversation-actions\">\n <button class=\"menu-btn\" (click)=\"toggleMenu(conversation.ID, $event)\" title=\"More options\">\n <i class=\"fas fa-ellipsis\"></i>\n </button>\n @if (IsMenuOpen(conversation)) {\n <div class=\"context-menu\" (click)=\"$event.stopPropagation()\">\n <button class=\"menu-item\" (click)=\"togglePin(conversation, $event)\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Pin</span>\n </button>\n <button class=\"menu-item\" (click)=\"renameConversation(conversation); closeMenu()\">\n <i class=\"fas fa-edit\"></i>\n <span>Rename</span>\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"deleteConversation(conversation); closeMenu()\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Selection Action Bar -->\n @if (isSelectionMode) {\n <div class=\"selection-action-bar\">\n <div class=\"selection-info\">\n <span class=\"selection-count\">{{ selectedConversationIds.size }} selected</span>\n @if (selectedConversationIds.size < filteredConversations.length) {\n <button class=\"link-btn\" (click)=\"selectAll()\">Select All</button>\n } @else {\n <button class=\"link-btn\" (click)=\"deselectAll()\">Deselect All</button>\n }\n </div>\n <div class=\"selection-actions\">\n <button class=\"btn-delete-bulk\"\n (click)=\"bulkDeleteConversations()\"\n [disabled]=\"selectedConversationIds.size === 0\">\n <i class=\"fas fa-trash\"></i>\n Delete ({{ selectedConversationIds.size }})\n </button>\n <button class=\"btn-cancel\" (click)=\"toggleSelectionMode()\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host { display: block; height: 100%; }\n .conversation-list { display: flex; flex-direction: column; height: 100%; background: var(--mj-brand-secondary); }\n .list-header { padding: 8px; border-bottom: 1px solid rgba(255,255,255,0.1); }\n .search-input {\n width: 100%;\n padding: 8px 12px;\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: white;\n font-size: 13px;\n transition: all 0.2s;\n }\n .search-input::placeholder { color: rgba(255,255,255,0.5); }\n .search-input:focus { outline: none; background: rgba(255,255,255,0.15); border-color: var(--mj-brand-primary); }\n .btn-new-conversation {\n width: calc(100% - 16px);\n margin: 8px;\n padding: 10px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: background 0.2s;\n flex-shrink: 0;\n }\n .btn-new-conversation:hover { background: var(--mj-brand-primary-hover); }\n .btn-new-conversation i { font-size: 14px; }\n .list-content { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 0; }\n\n /* Collapsible Sections */\n .sidebar-section { margin-bottom: 20px; }\n .pinned-section .section-header {\n background: rgba(255, 193, 7, 0.08);\n border-radius: 4px;\n margin: 0 4px;\n }\n .pinned-section .section-title .section-icon {\n color: var(--mj-status-warning);\n font-size: 11px;\n margin-left: 2px;\n }\n .section-header {\n padding: 4px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.7);\n font-size: 13px;\n font-weight: 500;\n transition: color 0.2s;\n user-select: none;\n }\n .section-header:hover { color: white; }\n .section-title {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .section-title i {\n font-size: 10px;\n transition: transform 0.2s;\n }\n .section-header.expanded .section-title i { transform: rotate(90deg); }\n .chat-list {\n padding: 4px 0;\n display: none;\n }\n .chat-list.expanded { display: block; }\n\n .conversation-item {\n padding: 6px 5px 6px 16px;\n cursor: pointer;\n display: flex;\n gap: 8px;\n align-items: center;\n transition: all 0.2s;\n position: relative;\n color: rgba(255,255,255,0.7);\n font-size: 14px;\n min-height: 45px;\n }\n .conversation-item:hover { background: rgba(255,255,255,0.08); color: white; }\n .conversation-item:hover .conversation-actions { opacity: 1; }\n .conversation-item.active { background: var(--mj-brand-primary); color: white; }\n .conversation-icon-wrapper { position: relative; flex-shrink: 0; }\n .conversation-icon { font-size: 12px; width: 16px; text-align: center; }\n .conversation-icon.has-tasks { color: var(--mj-status-warning); }\n .badge-overlay { position: absolute; top: -4px; right: -4px; }\n .conversation-info { flex: 1; min-width: 0; }\n .conversation-name { font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .conversation-preview { font-size: 12px; color: rgba(255,255,255,0.5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .conversation-item.active .conversation-preview { color: rgba(255,255,255,0.8); }\n .conversation-meta { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }\n\n /* Project Badge */\n .project-badge {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n margin-left: auto;\n background-color: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.6);\n white-space: nowrap;\n max-width: 80px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .conversation-item:hover .project-badge {\n background-color: rgba(255, 255, 255, 0.15);\n color: rgba(255, 255, 255, 0.8);\n }\n .conversation-item.active .project-badge {\n background-color: rgba(255, 255, 255, 0.2);\n color: white;\n }\n\n .conversation-actions {\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n z-index: 10;\n }\n .conversation-item:hover .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-item.active .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-actions > * { pointer-events: auto; }\n .pinned-icon { color: var(--mj-brand-accent); font-size: 12px; }\n\n /* Task Indicator */\n .task-indicator {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-right: 8px;\n flex-shrink: 0;\n animation: pulse-glow 2s ease-in-out infinite;\n }\n @keyframes pulse-glow {\n 0%, 100% {\n opacity: 1;\n filter: drop-shadow(0 0 2px #fb923c);\n }\n 50% {\n opacity: 0.6;\n filter: drop-shadow(0 0 4px #fb923c);\n }\n }\n .conversation-item.active .task-indicator {\n color: var(--mj-status-warning);\n }\n\n .menu-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n background: var(--mj-brand-secondary) !important;\n border: none;\n cursor: pointer;\n transition: all 0.2s;\n }\n .menu-btn:hover {\n background: rgba(255,255,255,0.15) !important;\n color: white;\n }\n .conversation-item.active .menu-btn {\n background: var(--mj-brand-primary-hover) !important;\n color: white;\n }\n .menu-btn i { font-size: 14px; }\n\n .context-menu {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 4px;\n min-width: 160px;\n background: var(--mj-brand-secondary);\n border: 1px solid rgba(255,255,255,0.15);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n z-index: 1001;\n overflow: hidden;\n pointer-events: auto;\n }\n\n .menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: rgba(255,255,255,0.85);\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .menu-item:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .menu-item i {\n width: 16px;\n font-size: 13px;\n color: rgba(255,255,255,0.6);\n }\n\n .menu-item:hover i {\n color: white;\n }\n\n .menu-item.danger {\n color: rgba(239, 68, 68, 0.9);\n }\n\n .menu-item.danger:hover {\n background: rgba(239, 68, 68, 0.15);\n color: #ff6b6b;\n }\n\n .menu-item.danger i {\n color: rgba(239, 68, 68, 0.8);\n }\n\n .menu-item.danger:hover i {\n color: #ff6b6b;\n }\n\n .menu-divider {\n height: 1px;\n background: rgba(255,255,255,0.1);\n margin: 4px 0;\n }\n\n /* Rename Animation */\n .conversation-item.renamed {\n animation: renameHighlight 1500ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes renameHighlight {\n 0% {\n background: linear-gradient(90deg, rgba(59, 130, 246, 0.4), rgba(147, 51, 234, 0.4));\n transform: scale(1.03);\n box-shadow: 0 0 20px rgba(59, 130, 246, 0.5);\n }\n 25% {\n background: linear-gradient(90deg, rgba(59, 130, 246, 0.35), rgba(147, 51, 234, 0.35));\n box-shadow: 0 0 15px rgba(59, 130, 246, 0.4);\n }\n 50% {\n background: linear-gradient(90deg, rgba(16, 185, 129, 0.3), rgba(59, 130, 246, 0.3));\n transform: scale(1.02);\n box-shadow: 0 0 10px rgba(16, 185, 129, 0.3);\n }\n 75% {\n background: linear-gradient(90deg, rgba(16, 185, 129, 0.2), rgba(59, 130, 246, 0.2));\n box-shadow: 0 0 5px rgba(16, 185, 129, 0.2);\n }\n 100% {\n background: transparent;\n transform: scale(1);\n box-shadow: none;\n }\n }\n\n /* Selection Mode Styles */\n .header-top {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n /* Header menu button and dropdown */\n .header-menu-container {\n position: relative;\n flex-shrink: 0;\n }\n\n .btn-menu {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .btn-menu:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n border-color: rgba(255,255,255,0.3);\n }\n\n .header-dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n min-width: 200px;\n background: var(--mj-brand-secondary);\n border: 1px solid rgba(255,255,255,0.15);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n z-index: 1001;\n overflow: hidden;\n padding: 4px 0;\n }\n\n .header-dropdown-menu .dropdown-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: rgba(255,255,255,0.85);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .header-dropdown-menu .dropdown-item:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .header-dropdown-menu .dropdown-item i {\n width: 16px;\n font-size: 13px;\n color: rgba(255,255,255,0.6);\n }\n\n .header-dropdown-menu .dropdown-item:hover i {\n color: white;\n }\n\n .header-dropdown-menu .dropdown-item .shortcut {\n margin-left: auto;\n font-size: 11px;\n color: rgba(255,255,255,0.4);\n font-family: system-ui, -apple-system, sans-serif;\n }\n\n .btn-select {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n font-size: 13px;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n .btn-select:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n border-color: rgba(255,255,255,0.3);\n }\n\n .conversation-checkbox {\n display: flex;\n align-items: center;\n margin-right: 8px;\n flex-shrink: 0;\n }\n\n .conversation-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .selection-action-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-brand-secondary);\n border-top: 1px solid rgba(255,255,255,0.15);\n gap: 12px;\n flex-wrap: wrap;\n flex-shrink: 0;\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n color: rgba(255,255,255,0.9);\n font-size: 14px;\n font-weight: 500;\n flex: 1 1 auto;\n min-width: 150px;\n }\n\n .selection-count {\n color: white;\n }\n\n .link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-accent);\n cursor: pointer;\n font-size: 13px;\n text-decoration: underline;\n padding: 0;\n transition: color 0.2s;\n }\n\n .link-btn:hover {\n color: white;\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n flex: 0 0 auto;\n }\n\n .btn-cancel {\n padding: 8px 16px;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n }\n\n .btn-cancel:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .btn-delete-bulk {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-status-error);\n border: none;\n border-radius: 6px;\n color: white;\n cursor: pointer;\n font-size: 13px;\n font-weight: 600;\n transition: all 0.2s;\n }\n\n .btn-delete-bulk:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 80%, black);\n }\n\n .btn-delete-bulk:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-delete-bulk i {\n font-size: 12px;\n }\n `]\n})\nexport class ConversationListComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() selectedConversationId: string | null = null;\n @Input() renamedConversationId: string | null = null;\n @Input() isSidebarPinned: boolean = true; // Whether sidebar is pinned (stays open after selection)\n @Input() isMobileView: boolean = false; // Whether we're on mobile (no pin options)\n\n @Output() conversationSelected = new EventEmitter<string>();\n @Output() conversationDeleted = new EventEmitter<string>(); // Emits the deleted conversation ID\n @Output() newConversationRequested = new EventEmitter<void>();\n @Output() pinSidebarRequested = new EventEmitter<void>(); // Request to pin sidebar\n @Output() unpinSidebarRequested = new EventEmitter<void>(); // Request to unpin (collapse) sidebar\n @Output() refreshRequested = new EventEmitter<void>(); // Emitted after list refresh so chat area can also reload\n\n public directMessagesExpanded: boolean = true;\n public pinnedExpanded: boolean = true;\n public openMenuConversationId: string | null = null;\n public conversationIdsWithTasks = new Set<string>();\n public isSelectionMode: boolean = false;\n public selectedConversationIds = new Set<string>();\n public searchQuery: string = '';\n public isHeaderMenuOpen: boolean = false;\n public isRefreshing: boolean = false;\n\n private destroy$ = new Subject<void>();\n\n private engine = ConversationEngine.Instance;\n\n // Local UI state for loading/refreshing\n public IsLoading: boolean = false;\n\n constructor(\n private dialogService: DialogService,\n private notificationService: NotificationService,\n private activeTasksService: ActiveTasksService,\n private cdr: ChangeDetectorRef\n ) {}\n\n get filteredConversations(): MJConversationEntity[] {\n if (!this.searchQuery || this.searchQuery.trim() === '') {\n return this.engine.Conversations;\n }\n const lowerQuery = this.searchQuery.toLowerCase();\n return this.engine.Conversations.filter(c =>\n (c.Name?.toLowerCase().includes(lowerQuery)) ||\n (c.Description?.toLowerCase().includes(lowerQuery))\n );\n }\n\n get pinnedConversations() {\n return this.filteredConversations.filter(c => c.IsPinned);\n }\n\n get unpinnedConversations() {\n return this.filteredConversations.filter(c => !c.IsPinned);\n }\n\n ngOnInit() {\n // Load conversations on init\n this.engine.LoadConversations(this.environmentId, this.currentUser, false);\n\n // Re-run change detection whenever the conversations list changes (pin, archive, rename, etc.).\n // filteredConversations/pinnedConversations/unpinnedConversations are pure getters that read\n // engine.Conversations directly, so Angular doesn't know to re-evaluate them unless\n // we explicitly trigger a check here.\n this.engine.Conversations$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.cdr.detectChanges();\n });\n\n // Subscribe to conversation IDs with active tasks (hot set)\n this.activeTasksService.conversationIdsWithTasks$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(conversationIds => {\n this.conversationIdsWithTasks = conversationIds;\n this.cdr.detectChanges(); // Force change detection to ensure spinner icons update reliably\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:click')\n onDocumentClick(): void {\n // Close menus when clicking outside\n if (this.openMenuConversationId) {\n this.closeMenu();\n }\n if (this.isHeaderMenuOpen) {\n this.closeHeaderMenu();\n }\n }\n\n public toggleHeaderMenu(event: Event): void {\n event.stopPropagation();\n this.isHeaderMenuOpen = !this.isHeaderMenuOpen;\n }\n\n public closeHeaderMenu(): void {\n this.isHeaderMenuOpen = false;\n }\n\n public onSelectConversationsClick(event: Event): void {\n event.stopPropagation();\n this.toggleSelectionMode();\n this.closeHeaderMenu();\n }\n\n public async onRefreshConversationsClick(event: Event): Promise<void> {\n event.stopPropagation();\n if (this.isRefreshing) return;\n\n this.isRefreshing = true;\n try {\n await this.engine.LoadConversations(this.environmentId, this.currentUser, true);\n // Signal parent to also reload messages in the active conversation\n this.refreshRequested.emit();\n } catch (error) {\n console.error('Error refreshing conversations:', error);\n await this.dialogService.alert('Error', 'Failed to refresh conversations. Please try again.');\n } finally {\n this.isRefreshing = false;\n this.cdr.detectChanges();\n this.closeHeaderMenu();\n }\n }\n\n public onPinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.closeHeaderMenu();\n this.pinSidebarRequested.emit();\n }\n\n public onUnpinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.closeHeaderMenu();\n this.unpinSidebarRequested.emit();\n }\n\n public toggleDirectMessages(): void {\n this.directMessagesExpanded = !this.directMessagesExpanded;\n }\n\n public togglePinned(): void {\n this.pinnedExpanded = !this.pinnedExpanded;\n }\n\n IsConversationActive(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.selectedConversationId);\n }\n\n IsConversationRenamed(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.renamedConversationId);\n }\n\n IsMenuOpen(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(this.openMenuConversationId, conversation.ID);\n }\n\n selectConversation(conversation: MJConversationEntity): void {\n this.conversationSelected.emit(conversation.ID);\n // Clear unread notifications when conversation is opened\n this.notificationService.markConversationAsRead(conversation.ID);\n }\n\n async createNewConversation(): Promise<void> {\n // Don't create DB record yet - just show the welcome screen\n // Conversation will be created when user sends first message\n this.newConversationRequested.emit();\n }\n\n async renameConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const result = await this.dialogService.input({\n title: 'Edit Conversation',\n message: 'Update the name and description for this conversation',\n inputLabel: 'Conversation Name',\n inputValue: conversation.Name || '',\n placeholder: 'My Conversation',\n required: true,\n secondInputLabel: 'Description',\n secondInputValue: conversation.Description || '',\n secondInputPlaceholder: 'Optional description',\n secondInputRequired: false,\n okText: 'Save',\n cancelText: 'Cancel'\n });\n\n if (result) {\n const newName = typeof result === 'string' ? result : result.value;\n const newDescription = typeof result === 'string' ? conversation.Description : result.secondValue;\n\n if (newName !== conversation.Name || newDescription !== conversation.Description) {\n await this.engine.SaveConversation(\n conversation.ID,\n { Name: newName, Description: newDescription || '' },\n this.currentUser\n );\n }\n }\n } catch (error) {\n console.error('Error renaming conversation:', error);\n await this.dialogService.alert('Error', 'Failed to update conversation. Please try again.');\n }\n }\n\n async deleteConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversation',\n message: `Are you sure you want to delete \"${conversation.Name}\"? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n const deletedId = conversation.ID;\n await this.engine.DeleteConversation(deletedId, this.currentUser);\n this.cdr.detectChanges();\n this.conversationDeleted.emit(deletedId);\n }\n } catch (error) {\n console.error('Error deleting conversation:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversation. Please try again.');\n }\n }\n\n toggleMenu(conversationId: string, event: Event): void {\n event.stopPropagation();\n this.openMenuConversationId = this.openMenuConversationId === conversationId ? null : conversationId;\n }\n\n closeMenu(): void {\n this.openMenuConversationId = null;\n }\n\n async togglePin(conversation: MJConversationEntity, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n this.closeMenu(); // Close immediately on user action — don't wait for the async op\n try {\n await this.engine.PinConversation(conversation.ID, !conversation.IsPinned, this.currentUser);\n } catch (error) {\n console.error('Error toggling pin:', error);\n await this.dialogService.alert('Error', 'Failed to pin/unpin conversation. Please try again.');\n }\n }\n\n hasActiveTasks(conversationId: string): boolean {\n return this.conversationIdsWithTasks.has(conversationId);\n }\n\n toggleSelectionMode(): void {\n this.isSelectionMode = !this.isSelectionMode;\n if (!this.isSelectionMode) {\n this.selectedConversationIds.clear();\n }\n }\n\n toggleConversationSelection(conversationId: string): void {\n if (this.selectedConversationIds.has(conversationId)) {\n this.selectedConversationIds.delete(conversationId);\n } else {\n this.selectedConversationIds.add(conversationId);\n }\n }\n\n selectAll(): void {\n this.filteredConversations.forEach(c => {\n this.selectedConversationIds.add(c.ID);\n });\n }\n\n deselectAll(): void {\n this.selectedConversationIds.clear();\n }\n\n async bulkDeleteConversations(): Promise<void> {\n const count = this.selectedConversationIds.size;\n\n if (count === 0) return;\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversations',\n message: `Are you sure you want to delete ${count} conversation${count > 1 ? 's' : ''}? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n try {\n const result = await this.engine.DeleteMultipleConversations(\n Array.from(this.selectedConversationIds),\n this.currentUser\n );\n\n if (result.Failed.length > 0 && result.Successful.length > 0) {\n // Partial success\n const failedNames = result.Failed.map(f => `\"${f.Name}\"`).join(', ');\n await this.dialogService.alert(\n 'Partial Success',\n `Deleted ${result.Successful.length} of ${count} conversations.\\n\\n` +\n `${result.Failed.length} could not be deleted: ${failedNames}`\n );\n } else if (result.Failed.length > 0 && result.Successful.length === 0) {\n // All failed\n await this.dialogService.alert(\n 'Delete Failed',\n `None of the ${count} conversations could be deleted. They may have already been removed.`\n );\n }\n\n // Emit deleted events for successful deletions\n for (const id of result.Successful) {\n this.conversationDeleted.emit(id);\n }\n\n } catch (error) {\n console.error('Error deleting conversations:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversations. Please try again.');\n } finally {\n // Always exit selection mode after an attempt, whether success or failure\n this.selectedConversationIds.clear();\n this.isSelectionMode = false;\n this.cdr.detectChanges();\n }\n }\n }\n\n handleConversationClick(conversation: MJConversationEntity): void {\n if (this.isSelectionMode) {\n this.toggleConversationSelection(conversation.ID);\n } else {\n this.selectConversation(conversation);\n }\n }\n}"]}
1
+ {"version":3,"file":"conversation-list.component.js","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-list.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy, HostListener, ChangeDetectorRef } from '@angular/core';\nimport { UserInfo } from '@memberjunction/core';\nimport { MJConversationEntity } from '@memberjunction/core-entities';\nimport { ConversationEngine } from '@memberjunction/core-entities';\nimport { DialogService } from '../../services/dialog.service';\nimport { NotificationService } from '../../services/notification.service';\nimport { ActiveTasksService } from '../../services/active-tasks.service';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n@Component({\n standalone: false,\n selector: 'mj-conversation-list',\n template: `\n <div class=\"conversation-list\">\n <div class=\"list-header\">\n <div class=\"header-top\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"searchQuery\">\n @if (!isSelectionMode) {\n <div class=\"header-menu-container\">\n <button class=\"btn-menu\" (click)=\"toggleHeaderMenu($event)\" title=\"Options\">\n <i class=\"fas fa-ellipsis-v\"></i>\n </button>\n @if (isHeaderMenuOpen) {\n <div class=\"header-dropdown-menu\">\n <button class=\"dropdown-item\" (click)=\"onRefreshConversationsClick($event)\" [disabled]=\"isRefreshing\">\n <i class=\"fas fa-sync-alt\" [class.fa-spin]=\"isRefreshing\"></i>\n <span>{{ isRefreshing ? 'Refreshing...' : 'Refresh' }}</span>\n </button>\n <button class=\"dropdown-item\" (click)=\"onSelectConversationsClick($event)\">\n <i class=\"fas fa-check-square\"></i>\n <span>Select Conversations</span>\n </button>\n @if (!isMobileView) {\n <button class=\"dropdown-item\" (click)=\"onUnpinSidebarClick($event)\">\n <i class=\"fas fa-table-columns\"></i>\n <span>Hide Sidebar</span>\n </button>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n <button class=\"btn-new-conversation\" (click)=\"createNewConversation()\" title=\"New Conversation\">\n <i class=\"fas fa-plus\"></i>\n <span>New Conversation</span>\n </button>\n <div class=\"list-content\">\n <!-- Pinned Section (only show if there are pinned conversations) -->\n @if (pinnedConversations.length > 0) {\n <div class=\"sidebar-section pinned-section\">\n <div class=\"section-header\" [class.expanded]=\"pinnedExpanded\" (click)=\"togglePinned()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <i class=\"fas fa-thumbtack section-icon\"></i>\n <span>Pinned</span>\n </div>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"pinnedExpanded\">\n @for (conversation of pinnedConversations; track conversation.ID) {\n <div class=\"conversation-item\"\n [class.active]=\"IsConversationActive(conversation)\"\n [class.renamed]=\"IsConversationRenamed(conversation)\"\n (click)=\"handleConversationClick(conversation)\">\n @if (isSelectionMode) {\n <div class=\"conversation-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"selectedConversationIds.has(conversation.ID)\"\n (click)=\"$event.stopPropagation(); toggleConversationSelection(conversation.ID)\">\n </div>\n }\n <div class=\"conversation-icon-wrapper\">\n @if (hasActiveTasks(conversation.ID)) {\n <div class=\"conversation-icon has-tasks\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n </div>\n }\n <div class=\"badge-overlay\">\n <mj-notification-badge [conversationId]=\"conversation.ID\"></mj-notification-badge>\n </div>\n </div>\n <div class=\"conversation-info\" [title]=\"conversation.Name + (conversation.Description ? '\\n' + conversation.Description : '')\">\n <div class=\"conversation-name\">\n {{ conversation.Name }}\n @if (isSharedWithMe(conversation)) {\n <i class=\"fas fa-share-nodes shared-indicator\"\n [title]=\"sharedWithMeTooltip(conversation)\"></i>\n }\n </div>\n <div class=\"conversation-preview\">{{ conversation.Description }}</div>\n </div>\n @if (!isSelectionMode) {\n <div class=\"conversation-actions\">\n <button class=\"menu-btn\" (click)=\"toggleMenu(conversation.ID, $event)\" title=\"More options\">\n <i class=\"fas fa-ellipsis\"></i>\n </button>\n @if (IsMenuOpen(conversation)) {\n <div class=\"context-menu\" (click)=\"$event.stopPropagation()\">\n <button class=\"menu-item\" (click)=\"togglePin(conversation, $event)\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Unpin</span>\n </button>\n <button class=\"menu-item\" (click)=\"renameConversation(conversation); closeMenu()\">\n <i class=\"fas fa-edit\"></i>\n <span>Rename</span>\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"deleteConversation(conversation); closeMenu()\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Messages Section -->\n <div class=\"sidebar-section\">\n <div class=\"section-header\" [class.expanded]=\"directMessagesExpanded\" (click)=\"toggleDirectMessages()\">\n <div class=\"section-title\">\n <i class=\"fas fa-chevron-right\"></i>\n <span>Messages</span>\n </div>\n </div>\n <div class=\"chat-list\" [class.expanded]=\"directMessagesExpanded\">\n @for (conversation of unpinnedConversations; track conversation.ID) {\n <div class=\"conversation-item\"\n [class.active]=\"IsConversationActive(conversation)\"\n [class.renamed]=\"IsConversationRenamed(conversation)\"\n (click)=\"handleConversationClick(conversation)\">\n @if (isSelectionMode) {\n <div class=\"conversation-checkbox\">\n <input type=\"checkbox\"\n [checked]=\"selectedConversationIds.has(conversation.ID)\"\n (click)=\"$event.stopPropagation(); toggleConversationSelection(conversation.ID)\">\n </div>\n }\n <div class=\"conversation-icon-wrapper\">\n @if (hasActiveTasks(conversation.ID)) {\n <div class=\"conversation-icon has-tasks\">\n <i class=\"fas fa-spinner fa-pulse\"></i>\n </div>\n }\n <div class=\"badge-overlay\">\n <mj-notification-badge [conversationId]=\"conversation.ID\"></mj-notification-badge>\n </div>\n </div>\n <div class=\"conversation-info\" [title]=\"conversation.Name + (conversation.Description ? '\\n' + conversation.Description : '')\">\n <div class=\"conversation-name\">\n {{ conversation.Name }}\n @if (isSharedWithMe(conversation)) {\n <i class=\"fas fa-share-nodes shared-indicator\"\n [title]=\"sharedWithMeTooltip(conversation)\"></i>\n }\n </div>\n <div class=\"conversation-preview\">{{ conversation.Description }}</div>\n </div>\n @if (!isSelectionMode) {\n <div class=\"conversation-actions\">\n <button class=\"menu-btn\" (click)=\"toggleMenu(conversation.ID, $event)\" title=\"More options\">\n <i class=\"fas fa-ellipsis\"></i>\n </button>\n @if (IsMenuOpen(conversation)) {\n <div class=\"context-menu\" (click)=\"$event.stopPropagation()\">\n <button class=\"menu-item\" (click)=\"togglePin(conversation, $event)\">\n <i class=\"fas fa-thumbtack\"></i>\n <span>Pin</span>\n </button>\n <button class=\"menu-item\" (click)=\"renameConversation(conversation); closeMenu()\">\n <i class=\"fas fa-edit\"></i>\n <span>Rename</span>\n </button>\n <div class=\"menu-divider\"></div>\n <button class=\"menu-item danger\" (click)=\"deleteConversation(conversation); closeMenu()\">\n <i class=\"fas fa-trash\"></i>\n <span>Delete</span>\n </button>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Selection Action Bar -->\n @if (isSelectionMode) {\n <div class=\"selection-action-bar\">\n <div class=\"selection-info\">\n <span class=\"selection-count\">{{ selectedConversationIds.size }} selected</span>\n @if (selectedConversationIds.size < filteredConversations.length) {\n <button class=\"link-btn\" (click)=\"selectAll()\">Select All</button>\n } @else {\n <button class=\"link-btn\" (click)=\"deselectAll()\">Deselect All</button>\n }\n </div>\n <div class=\"selection-actions\">\n <button class=\"btn-delete-bulk\"\n (click)=\"bulkDeleteConversations()\"\n [disabled]=\"selectedConversationIds.size === 0\">\n <i class=\"fas fa-trash\"></i>\n Delete ({{ selectedConversationIds.size }})\n </button>\n <button class=\"btn-cancel\" (click)=\"toggleSelectionMode()\">\n Cancel\n </button>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n :host { display: block; height: 100%; }\n .conversation-list { display: flex; flex-direction: column; height: 100%; background: var(--mj-brand-secondary); }\n .list-header { padding: 8px; border-bottom: 1px solid rgba(255,255,255,0.1); }\n .search-input {\n width: 100%;\n padding: 8px 12px;\n background: rgba(255,255,255,0.1);\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: white;\n font-size: 13px;\n transition: all 0.2s;\n }\n .search-input::placeholder { color: rgba(255,255,255,0.5); }\n .search-input:focus { outline: none; background: rgba(255,255,255,0.15); border-color: var(--mj-brand-primary); }\n .btn-new-conversation {\n width: calc(100% - 16px);\n margin: 8px;\n padding: 10px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 6px;\n cursor: pointer;\n font-size: 14px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: background 0.2s;\n flex-shrink: 0;\n }\n .btn-new-conversation:hover { background: var(--mj-brand-primary-hover); }\n .btn-new-conversation i { font-size: 14px; }\n .list-content { flex: 1; min-height: 0; overflow-y: auto; padding: 4px 0; }\n\n /* Collapsible Sections */\n .sidebar-section { margin-bottom: 20px; }\n .pinned-section .section-header {\n background: rgba(255, 193, 7, 0.08);\n border-radius: 4px;\n margin: 0 4px;\n }\n .pinned-section .section-title .section-icon {\n color: var(--mj-status-warning);\n font-size: 11px;\n margin-left: 2px;\n }\n .section-header {\n padding: 4px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.7);\n font-size: 13px;\n font-weight: 500;\n transition: color 0.2s;\n user-select: none;\n }\n .section-header:hover { color: white; }\n .section-title {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n .section-title i {\n font-size: 10px;\n transition: transform 0.2s;\n }\n .section-header.expanded .section-title i { transform: rotate(90deg); }\n .chat-list {\n padding: 4px 0;\n display: none;\n }\n .chat-list.expanded { display: block; }\n\n .conversation-item {\n padding: 6px 5px 6px 16px;\n cursor: pointer;\n display: flex;\n gap: 8px;\n align-items: center;\n transition: all 0.2s;\n position: relative;\n color: rgba(255,255,255,0.7);\n font-size: 14px;\n min-height: 45px;\n }\n .conversation-item:hover { background: rgba(255,255,255,0.08); color: white; }\n .conversation-item:hover .conversation-actions { opacity: 1; }\n .conversation-item.active { background: var(--mj-brand-primary); color: white; }\n .conversation-icon-wrapper { position: relative; flex-shrink: 0; }\n .conversation-icon { font-size: 12px; width: 16px; text-align: center; }\n .conversation-icon.has-tasks { color: var(--mj-status-warning); }\n .badge-overlay { position: absolute; top: -4px; right: -4px; }\n .conversation-info { flex: 1; min-width: 0; }\n .conversation-name { font-weight: 600; font-size: 14px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: flex; align-items: center; gap: 6px; }\n .shared-indicator { font-size: 10px; color: rgba(255, 255, 255, 0.55); flex-shrink: 0; }\n .conversation-item.active .shared-indicator { color: rgba(255, 255, 255, 0.85); }\n .conversation-preview { font-size: 12px; color: rgba(255,255,255,0.5); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n .conversation-item.active .conversation-preview { color: rgba(255,255,255,0.8); }\n .conversation-meta { display: flex; align-items: center; gap: 4px; flex-shrink: 0; }\n\n /* Project Badge */\n .project-badge {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n margin-left: auto;\n background-color: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.6);\n white-space: nowrap;\n max-width: 80px;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n .conversation-item:hover .project-badge {\n background-color: rgba(255, 255, 255, 0.15);\n color: rgba(255, 255, 255, 0.8);\n }\n .conversation-item.active .project-badge {\n background-color: rgba(255, 255, 255, 0.2);\n color: white;\n }\n\n .conversation-actions {\n position: absolute;\n right: 5px;\n top: 50%;\n transform: translateY(-50%);\n display: flex;\n align-items: center;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s;\n z-index: 10;\n }\n .conversation-item:hover .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-item.active .conversation-actions { opacity: 1; pointer-events: auto; }\n .conversation-actions > * { pointer-events: auto; }\n .pinned-icon { color: var(--mj-brand-accent); font-size: 12px; }\n\n /* Task Indicator */\n .task-indicator {\n color: var(--mj-status-warning);\n font-size: 12px;\n margin-right: 8px;\n flex-shrink: 0;\n animation: pulse-glow 2s ease-in-out infinite;\n }\n @keyframes pulse-glow {\n 0%, 100% {\n opacity: 1;\n filter: drop-shadow(0 0 2px #fb923c);\n }\n 50% {\n opacity: 0.6;\n filter: drop-shadow(0 0 4px #fb923c);\n }\n }\n .conversation-item.active .task-indicator {\n color: var(--mj-status-warning);\n }\n\n .menu-btn {\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n background: var(--mj-brand-secondary) !important;\n border: none;\n cursor: pointer;\n transition: all 0.2s;\n }\n .menu-btn:hover {\n background: rgba(255,255,255,0.15) !important;\n color: white;\n }\n .conversation-item.active .menu-btn {\n background: var(--mj-brand-primary-hover) !important;\n color: white;\n }\n .menu-btn i { font-size: 14px; }\n\n .context-menu {\n position: absolute;\n top: 100%;\n right: 0;\n margin-top: 4px;\n min-width: 160px;\n background: var(--mj-brand-secondary);\n border: 1px solid rgba(255,255,255,0.15);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n z-index: 1001;\n overflow: hidden;\n pointer-events: auto;\n }\n\n .menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: rgba(255,255,255,0.85);\n font-size: 14px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .menu-item:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .menu-item i {\n width: 16px;\n font-size: 13px;\n color: rgba(255,255,255,0.6);\n }\n\n .menu-item:hover i {\n color: white;\n }\n\n .menu-item.danger {\n color: rgba(239, 68, 68, 0.9);\n }\n\n .menu-item.danger:hover {\n background: rgba(239, 68, 68, 0.15);\n color: #ff6b6b;\n }\n\n .menu-item.danger i {\n color: rgba(239, 68, 68, 0.8);\n }\n\n .menu-item.danger:hover i {\n color: #ff6b6b;\n }\n\n .menu-divider {\n height: 1px;\n background: rgba(255,255,255,0.1);\n margin: 4px 0;\n }\n\n /* Rename Animation */\n .conversation-item.renamed {\n animation: renameHighlight 1500ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n\n @keyframes renameHighlight {\n 0% {\n background: linear-gradient(90deg, rgba(59, 130, 246, 0.4), rgba(147, 51, 234, 0.4));\n transform: scale(1.03);\n box-shadow: 0 0 20px rgba(59, 130, 246, 0.5);\n }\n 25% {\n background: linear-gradient(90deg, rgba(59, 130, 246, 0.35), rgba(147, 51, 234, 0.35));\n box-shadow: 0 0 15px rgba(59, 130, 246, 0.4);\n }\n 50% {\n background: linear-gradient(90deg, rgba(16, 185, 129, 0.3), rgba(59, 130, 246, 0.3));\n transform: scale(1.02);\n box-shadow: 0 0 10px rgba(16, 185, 129, 0.3);\n }\n 75% {\n background: linear-gradient(90deg, rgba(16, 185, 129, 0.2), rgba(59, 130, 246, 0.2));\n box-shadow: 0 0 5px rgba(16, 185, 129, 0.2);\n }\n 100% {\n background: transparent;\n transform: scale(1);\n box-shadow: none;\n }\n }\n\n /* Selection Mode Styles */\n .header-top {\n display: flex;\n gap: 8px;\n align-items: center;\n }\n\n /* Header menu button and dropdown */\n .header-menu-container {\n position: relative;\n flex-shrink: 0;\n }\n\n .btn-menu {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .btn-menu:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n border-color: rgba(255,255,255,0.3);\n }\n\n .header-dropdown-menu {\n position: absolute;\n top: calc(100% + 4px);\n right: 0;\n min-width: 200px;\n background: var(--mj-brand-secondary);\n border: 1px solid rgba(255,255,255,0.15);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);\n z-index: 1001;\n overflow: hidden;\n padding: 4px 0;\n }\n\n .header-dropdown-menu .dropdown-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: transparent;\n border: none;\n color: rgba(255,255,255,0.85);\n font-size: 13px;\n text-align: left;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .header-dropdown-menu .dropdown-item:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .header-dropdown-menu .dropdown-item i {\n width: 16px;\n font-size: 13px;\n color: rgba(255,255,255,0.6);\n }\n\n .header-dropdown-menu .dropdown-item:hover i {\n color: white;\n }\n\n .header-dropdown-menu .dropdown-item .shortcut {\n margin-left: auto;\n font-size: 11px;\n color: rgba(255,255,255,0.4);\n font-family: system-ui, -apple-system, sans-serif;\n }\n\n .btn-select {\n padding: 8px 12px;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n font-size: 13px;\n font-weight: 500;\n display: flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n flex-shrink: 0;\n }\n\n .btn-select:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n border-color: rgba(255,255,255,0.3);\n }\n\n .conversation-checkbox {\n display: flex;\n align-items: center;\n margin-right: 8px;\n flex-shrink: 0;\n }\n\n .conversation-checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--mj-brand-primary);\n }\n\n .selection-action-bar {\n position: sticky;\n bottom: 0;\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 16px;\n background: var(--mj-brand-secondary);\n border-top: 1px solid rgba(255,255,255,0.15);\n gap: 12px;\n flex-wrap: wrap;\n flex-shrink: 0;\n }\n\n .selection-info {\n display: flex;\n align-items: center;\n gap: 12px;\n color: rgba(255,255,255,0.9);\n font-size: 14px;\n font-weight: 500;\n flex: 1 1 auto;\n min-width: 150px;\n }\n\n .selection-count {\n color: white;\n }\n\n .link-btn {\n background: none;\n border: none;\n color: var(--mj-brand-accent);\n cursor: pointer;\n font-size: 13px;\n text-decoration: underline;\n padding: 0;\n transition: color 0.2s;\n }\n\n .link-btn:hover {\n color: white;\n }\n\n .selection-actions {\n display: flex;\n gap: 8px;\n flex: 0 0 auto;\n }\n\n .btn-cancel {\n padding: 8px 16px;\n background: transparent;\n border: 1px solid rgba(255,255,255,0.2);\n border-radius: 6px;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n }\n\n .btn-cancel:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .btn-delete-bulk {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n background: var(--mj-status-error);\n border: none;\n border-radius: 6px;\n color: white;\n cursor: pointer;\n font-size: 13px;\n font-weight: 600;\n transition: all 0.2s;\n }\n\n .btn-delete-bulk:hover:not(:disabled) {\n background: color-mix(in srgb, var(--mj-status-error) 80%, black);\n }\n\n .btn-delete-bulk:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .btn-delete-bulk i {\n font-size: 12px;\n }\n `]\n})\nexport class ConversationListComponent implements OnInit, OnDestroy {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() selectedConversationId: string | null = null;\n @Input() renamedConversationId: string | null = null;\n @Input() isSidebarPinned: boolean = true; // Whether sidebar is pinned (stays open after selection)\n @Input() isMobileView: boolean = false; // Whether we're on mobile (no pin options)\n\n @Output() conversationSelected = new EventEmitter<string>();\n @Output() conversationDeleted = new EventEmitter<string>(); // Emits the deleted conversation ID\n @Output() newConversationRequested = new EventEmitter<void>();\n @Output() pinSidebarRequested = new EventEmitter<void>(); // Request to pin sidebar\n @Output() unpinSidebarRequested = new EventEmitter<void>(); // Request to unpin (collapse) sidebar\n @Output() refreshRequested = new EventEmitter<void>(); // Emitted after list refresh so chat area can also reload\n\n public directMessagesExpanded: boolean = true;\n public pinnedExpanded: boolean = true;\n public openMenuConversationId: string | null = null;\n public conversationIdsWithTasks = new Set<string>();\n public isSelectionMode: boolean = false;\n public selectedConversationIds = new Set<string>();\n public searchQuery: string = '';\n public isHeaderMenuOpen: boolean = false;\n public isRefreshing: boolean = false;\n\n private destroy$ = new Subject<void>();\n\n private engine = ConversationEngine.Instance;\n\n // Local UI state for loading/refreshing\n public IsLoading: boolean = false;\n\n constructor(\n private dialogService: DialogService,\n private notificationService: NotificationService,\n private activeTasksService: ActiveTasksService,\n private cdr: ChangeDetectorRef\n ) {}\n\n get filteredConversations(): MJConversationEntity[] {\n if (!this.searchQuery || this.searchQuery.trim() === '') {\n return this.engine.Conversations;\n }\n const lowerQuery = this.searchQuery.toLowerCase();\n return this.engine.Conversations.filter(c =>\n (c.Name?.toLowerCase().includes(lowerQuery)) ||\n (c.Description?.toLowerCase().includes(lowerQuery))\n );\n }\n\n get pinnedConversations() {\n return this.filteredConversations.filter(c => c.IsPinned);\n }\n\n get unpinnedConversations() {\n return this.filteredConversations.filter(c => !c.IsPinned);\n }\n\n ngOnInit() {\n // Load conversations on init\n this.engine.LoadConversations(this.environmentId, this.currentUser, false);\n\n // Re-run change detection whenever the conversations list changes (pin, archive, rename, etc.).\n // filteredConversations/pinnedConversations/unpinnedConversations are pure getters that read\n // engine.Conversations directly, so Angular doesn't know to re-evaluate them unless\n // we explicitly trigger a check here.\n this.engine.Conversations$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(() => {\n this.cdr.detectChanges();\n });\n\n // Subscribe to conversation IDs with active tasks (hot set)\n this.activeTasksService.conversationIdsWithTasks$.pipe(\n takeUntil(this.destroy$)\n ).subscribe(conversationIds => {\n this.conversationIdsWithTasks = conversationIds;\n this.cdr.detectChanges(); // Force change detection to ensure spinner icons update reliably\n });\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n @HostListener('document:click')\n onDocumentClick(): void {\n // Close menus when clicking outside\n if (this.openMenuConversationId) {\n this.closeMenu();\n }\n if (this.isHeaderMenuOpen) {\n this.closeHeaderMenu();\n }\n }\n\n public toggleHeaderMenu(event: Event): void {\n event.stopPropagation();\n this.isHeaderMenuOpen = !this.isHeaderMenuOpen;\n }\n\n public closeHeaderMenu(): void {\n this.isHeaderMenuOpen = false;\n }\n\n public onSelectConversationsClick(event: Event): void {\n event.stopPropagation();\n this.toggleSelectionMode();\n this.closeHeaderMenu();\n }\n\n public async onRefreshConversationsClick(event: Event): Promise<void> {\n event.stopPropagation();\n if (this.isRefreshing) return;\n\n this.isRefreshing = true;\n try {\n await this.engine.LoadConversations(this.environmentId, this.currentUser, true);\n // Signal parent to also reload messages in the active conversation\n this.refreshRequested.emit();\n } catch (error) {\n console.error('Error refreshing conversations:', error);\n await this.dialogService.alert('Error', 'Failed to refresh conversations. Please try again.');\n } finally {\n this.isRefreshing = false;\n this.cdr.detectChanges();\n this.closeHeaderMenu();\n }\n }\n\n public onPinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.closeHeaderMenu();\n this.pinSidebarRequested.emit();\n }\n\n public onUnpinSidebarClick(event: Event): void {\n event.stopPropagation();\n this.closeHeaderMenu();\n this.unpinSidebarRequested.emit();\n }\n\n public toggleDirectMessages(): void {\n this.directMessagesExpanded = !this.directMessagesExpanded;\n }\n\n public togglePinned(): void {\n this.pinnedExpanded = !this.pinnedExpanded;\n }\n\n IsConversationActive(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.selectedConversationId);\n }\n\n IsConversationRenamed(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(conversation.ID, this.renamedConversationId);\n }\n\n IsMenuOpen(conversation: MJConversationEntity): boolean {\n return UUIDsEqual(this.openMenuConversationId, conversation.ID);\n }\n\n selectConversation(conversation: MJConversationEntity): void {\n this.conversationSelected.emit(conversation.ID);\n // Clear unread notifications when conversation is opened\n this.notificationService.markConversationAsRead(conversation.ID);\n }\n\n async createNewConversation(): Promise<void> {\n // Don't create DB record yet - just show the welcome screen\n // Conversation will be created when user sends first message\n this.newConversationRequested.emit();\n }\n\n async renameConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const result = await this.dialogService.input({\n title: 'Edit Conversation',\n message: 'Update the name and description for this conversation',\n inputLabel: 'Conversation Name',\n inputValue: conversation.Name || '',\n placeholder: 'My Conversation',\n required: true,\n secondInputLabel: 'Description',\n secondInputValue: conversation.Description || '',\n secondInputPlaceholder: 'Optional description',\n secondInputRequired: false,\n okText: 'Save',\n cancelText: 'Cancel'\n });\n\n if (result) {\n const newName = typeof result === 'string' ? result : result.value;\n const newDescription = typeof result === 'string' ? conversation.Description : result.secondValue;\n\n if (newName !== conversation.Name || newDescription !== conversation.Description) {\n await this.engine.SaveConversation(\n conversation.ID,\n { Name: newName, Description: newDescription || '' },\n this.currentUser\n );\n }\n }\n } catch (error) {\n console.error('Error renaming conversation:', error);\n await this.dialogService.alert('Error', 'Failed to update conversation. Please try again.');\n }\n }\n\n async deleteConversation(conversation: MJConversationEntity): Promise<void> {\n try {\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversation',\n message: `Are you sure you want to delete \"${conversation.Name}\"? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n const deletedId = conversation.ID;\n await this.engine.DeleteConversation(deletedId, this.currentUser);\n this.cdr.detectChanges();\n this.conversationDeleted.emit(deletedId);\n }\n } catch (error) {\n console.error('Error deleting conversation:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversation. Please try again.');\n }\n }\n\n toggleMenu(conversationId: string, event: Event): void {\n event.stopPropagation();\n this.openMenuConversationId = this.openMenuConversationId === conversationId ? null : conversationId;\n }\n\n closeMenu(): void {\n this.openMenuConversationId = null;\n }\n\n async togglePin(conversation: MJConversationEntity, event?: Event): Promise<void> {\n if (event) event.stopPropagation();\n this.closeMenu(); // Close immediately on user action — don't wait for the async op\n try {\n await this.engine.PinConversation(conversation.ID, !conversation.IsPinned, this.currentUser);\n } catch (error) {\n console.error('Error toggling pin:', error);\n await this.dialogService.alert('Error', 'Failed to pin/unpin conversation. Please try again.');\n }\n }\n\n hasActiveTasks(conversationId: string): boolean {\n return this.conversationIdsWithTasks.has(conversationId);\n }\n\n /** True when this conversation was shared with the current user by someone else. */\n isSharedWithMe(conversation: MJConversationEntity): boolean {\n return this.engine.GetSharedByInfo(conversation.ID) !== null;\n }\n\n /** Tooltip for the sidebar share icon: \"Shared by {email or name}\". */\n sharedWithMeTooltip(conversation: MJConversationEntity): string {\n const info = this.engine.GetSharedByInfo(conversation.ID);\n if (!info) return 'Shared with you';\n return `Shared by ${info.Email ?? info.Name ?? 'another user'}`;\n }\n\n toggleSelectionMode(): void {\n this.isSelectionMode = !this.isSelectionMode;\n if (!this.isSelectionMode) {\n this.selectedConversationIds.clear();\n }\n }\n\n toggleConversationSelection(conversationId: string): void {\n if (this.selectedConversationIds.has(conversationId)) {\n this.selectedConversationIds.delete(conversationId);\n } else {\n this.selectedConversationIds.add(conversationId);\n }\n }\n\n selectAll(): void {\n this.filteredConversations.forEach(c => {\n this.selectedConversationIds.add(c.ID);\n });\n }\n\n deselectAll(): void {\n this.selectedConversationIds.clear();\n }\n\n async bulkDeleteConversations(): Promise<void> {\n const count = this.selectedConversationIds.size;\n\n if (count === 0) return;\n\n const confirmed = await this.dialogService.confirm({\n title: 'Delete Conversations',\n message: `Are you sure you want to delete ${count} conversation${count > 1 ? 's' : ''}? This action cannot be undone.`,\n okText: 'Delete',\n cancelText: 'Cancel'\n });\n\n if (confirmed) {\n try {\n const result = await this.engine.DeleteMultipleConversations(\n Array.from(this.selectedConversationIds),\n this.currentUser\n );\n\n if (result.Failed.length > 0 && result.Successful.length > 0) {\n // Partial success\n const failedNames = result.Failed.map(f => `\"${f.Name}\"`).join(', ');\n await this.dialogService.alert(\n 'Partial Success',\n `Deleted ${result.Successful.length} of ${count} conversations.\\n\\n` +\n `${result.Failed.length} could not be deleted: ${failedNames}`\n );\n } else if (result.Failed.length > 0 && result.Successful.length === 0) {\n // All failed\n await this.dialogService.alert(\n 'Delete Failed',\n `None of the ${count} conversations could be deleted. They may have already been removed.`\n );\n }\n\n // Emit deleted events for successful deletions\n for (const id of result.Successful) {\n this.conversationDeleted.emit(id);\n }\n\n } catch (error) {\n console.error('Error deleting conversations:', error);\n await this.dialogService.alert('Error', 'Failed to delete conversations. Please try again.');\n } finally {\n // Always exit selection mode after an attempt, whether success or failure\n this.selectedConversationIds.clear();\n this.isSelectionMode = false;\n this.cdr.detectChanges();\n }\n }\n }\n\n handleConversationClick(conversation: MJConversationEntity): void {\n if (this.isSelectionMode) {\n this.toggleConversationSelection(conversation.ID);\n } else {\n this.selectConversation(conversation);\n }\n }\n}"]}
@@ -88,12 +88,15 @@ export declare class MessageItemComponent extends BaseAngularComponent implement
88
88
  private originalText;
89
89
  private _previousMessageStatus;
90
90
  /**
91
- * Cached CSS class string for the message container. Updated explicitly in
92
- * ngDoCheck to avoid ExpressionChangedAfterItHasBeenCheckedError a getter
93
- * would recompute between Angular's check and verify passes when message.Status
94
- * changes mid-cycle (e.g., from a WebSocket update).
91
+ * Cached values updated in ngDoCheck so they stay stable through Angular's
92
+ * dev-mode verify pass. The underlying message entity properties (Status,
93
+ * Message) can mutate between the check and verify passes (e.g., from
94
+ * WebSocket streaming updates), which causes ExpressionChangedAfterItHasBeenCheckedError
95
+ * if templates read the live properties directly.
95
96
  */
96
97
  private _messageClasses;
98
+ private _stableDisplayMessage;
99
+ private _stableIsInProgressAIMessage;
97
100
  isAgentDetailsExpanded: boolean;
98
101
  detailTasks: MJTaskEntity[];
99
102
  private tasksLoaded;
@@ -156,6 +159,11 @@ export declare class MessageItemComponent extends BaseAngularComponent implement
156
159
  get userAvatarIconClass(): string | null;
157
160
  get isConversationManager(): boolean;
158
161
  get displayMessage(): string;
162
+ /**
163
+ * Computes the display message from the current message text. Called from
164
+ * ngDoCheck to snapshot the value; templates read _stableDisplayMessage.
165
+ */
166
+ private computeDisplayMessage;
159
167
  /**
160
168
  * Transform @mentions in text to HTML badge elements
161
169
  * Supports both JSON format (@{type:"agent",id:"uuid",...}) and legacy text format (@AgentName)
@@ -1 +1 @@
1
- {"version":3,"file":"message-item.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-item.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-item.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-item.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,MAAM,EACN,SAAS,EACT,aAAa,EACb,OAAO,EACR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AACtK,OAAO,EAAE,QAAQ,EAAW,YAAY,EAAgB,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAoC,iBAAiB,EAAyC,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAEzL,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;;AAIpF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0FAA0F;IAC1F,MAAM,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC/B,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,wGAAwG;IACxG,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;GAIG;AACH,qBASa,oBAAqB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO;IA2D1H,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,gBAAgB;IA7DV,OAAO,EAAG,0BAA0B,CAAC;IACrC,YAAY,EAAG,oBAAoB,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAG,QAAQ,CAAC;IACvB,WAAW,EAAG,0BAA0B,EAAE,CAAC;IAC3C,YAAY,EAAE,OAAO,CAAS;IAC9B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,QAAQ,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IACnD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAC,CAAC,CAAa;IAC5F,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,aAAa,EAAE,OAAO,CAAS;IAC/B,WAAW,EAAE,iBAAiB,EAAE,CAAM;IAErC,WAAW,2CAAkD;IAC7D,aAAa,2CAAkD;IAC/D,YAAY,2CAAkD;IAC9D,mBAAmB,2CAAkD;IACrE,eAAe;oBAAiC,MAAM;oBAAc,MAAM;OAAK;IAC/E,uBAAuB;gBAA6B,MAAM;oBAAc,MAAM;OAAK;IACnF,aAAa,2CAAkD;IAC/D,gBAAgB;oBAAiC,MAAM;sBAAgB,YAAY;OAAK;IACxF,yBAAyB;cAA2B,MAAM;sBAAgB,MAAM;OAAK;IACrF,iBAAiB,kCAAyC;IAC1D,mBAAmB,uBAA8B;IACjD,iBAAiB,2CAAkD;IAEpF,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,oBAAoB,CAAa;IAClC,qBAAqB,EAAE,MAAM,CAAU;IACvC,0BAA0B,EAAE,MAAM,CAAU;IAC5C,SAAS,EAAE,OAAO,CAAS;IAC3B,UAAU,EAAE,MAAM,CAAM;IAC/B,OAAO,CAAC,YAAY,CAAc;IAGlC,OAAO,CAAC,sBAAsB,CAA+D;IAE7F;;;;;;OAMG;IACH,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,qBAAqB,CAAc;IAC3C,OAAO,CAAC,4BAA4B,CAAkB;IAG/C,sBAAsB,EAAE,OAAO,CAAS;IACxC,WAAW,EAAE,YAAY,EAAE,CAAM;IACxC,OAAO,CAAC,WAAW,CAAkB;IAGrC,OAAO,CAAC,qBAAqB,CAAc;IAC3C,OAAO,CAAC,kBAAkB,CAAc;gBAG9B,KAAK,EAAE,iBAAiB,EACxB,aAAa,EAAE,oBAAoB,EACnC,mBAAmB,EAAE,0BAA0B,EAC/C,gBAAgB,EAAE,uBAAuB;IAK7C,QAAQ;IAKd,WAAW,CAAC,QAAQ,EAAE,aAAa;IAMnC;;;;OAIG;IACH,SAAS;IAgCT,eAAe;IAYf,WAAW;IAOX;;;;;OAKG;IACI,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOpD;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAoB/B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,oBAAoB;IAgB5B,IAAW,oBAAoB,IAAI,MAAM,CAExC;IAED,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,IAAW,WAAW,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CA8BjF;IAED,IAAW,aAAa,IAAI,OAAO,CAElC;IAED;;;;OAIG;IACH,IAAW,iBAAiB,IAAI,MAAM,CASrC;IAED;;;OAGG;IACH,IAAW,aAAa,IAAI,MAAM,GAAG,IAAI,CAMxC;IAED;;;OAGG;IACH,IAAW,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAM9C;IAED,IAAW,qBAAqB,IAAI,OAAO,CAE1C;IAED,IAAW,cAAc,IAAI,MAAM,CAElC;IAED;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAmC/B,OAAO,CAAC,iBAAiB;IAmDzB,OAAO,CAAC,cAAc;IA0CtB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,UAAU;IAIlB,IAAW,qBAAqB,IAAI,OAAO,CAE1C;IAED,IAAW,gBAAgB,IAAI,OAAO,CAMrC;IAED,IAAW,aAAa,IAAI,UAAU,GAAG,aAAa,GAAG,OAAO,CAE/D;IAEM,aAAa,IAAI,MAAM;IAW9B,IAAW,4BAA4B,IAAI,OAAO,CAEjD;IAED,IAAW,2BAA2B,IAAI,OAAO,CAEhD;IAED;;;;OAIG;IACI,gBAAgB,IAAI,OAAO;IA0BlC;;OAEG;IACI,UAAU,IAAI,OAAO;IAI5B;;OAEG;IACI,cAAc,IAAI,MAAM;IAI/B;;OAEG;IACI,gBAAgB,IAAI,MAAM;IAIjC;;OAEG;IACI,kBAAkB,IAAI,MAAM;IAInC;;;OAGG;IACI,uBAAuB,IAAI,OAAO;IAKzC,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED;;OAEG;IACH,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAED;;;;;;;OAOG;IACH,IAAW,YAAY,IAAI,MAAM,GAAG,IAAI,CAEvC;IAED,OAAO,CAAC,qBAAqB;IA2B7B,IAAW,uBAAuB,IAAI,MAAM,GAAG,IAAI,CA2BlD;IAED;;;;OAIG;IACH,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,OAAO,CAAC,mBAAmB;IAmB3B,IAAW,eAAe,IAAI,OAAO,CAOpC;IAEM,WAAW,IAAI,IAAI;IAMnB,YAAY,IAAI,IAAI;IAgBpB,aAAa,IAAI,IAAI;IAOf,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B/B,aAAa,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAUzC,aAAa,IAAI,IAAI;IAMf,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC,mBAAmB,IAAI,IAAI;IAM3B,YAAY,IAAI,IAAI;IAMpB,eAAe,IAAI,IAAI;IASvB,yBAAyB,CAAC,KAAK,EAAE;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,gBAAgB,CAAC;QAAC,OAAO,CAAC,EAAE,uBAAuB,CAAA;KAAC,GAAG,IAAI;IAavH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK9C,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMlC,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMnC,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAM3C;;;OAGG;IACI,iBAAiB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI;IAI7D;;OAEG;IACH,IAAW,cAAc,IAAI,OAAO,CAEnC;IAED;;OAEG;IACH,IAAW,gBAAgB,IAAI,iBAAiB,EAAE,CAEjD;IAED;;OAEG;IACI,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAM5C,mFAAmF;IAC5E,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,MAAM;IAI1D;;;OAGG;IACH,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED;;OAEG;IACU,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhD;;OAEG;YACW,SAAS;IA0BvB;;;;OAIG;IACH,IAAW,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAwB3C;IAED;;OAEG;IACH,IAAW,mBAAmB,IAAI,MAAM,CAKvC;IAED;;OAEG;IACH,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED;;OAEG;IACH,IAAW,iBAAiB,IAAI,MAAM,CAMrC;IAED;;OAEG;IACI,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIxC;;OAEG;IACI,kBAAkB,IAAI,IAAI;IAajC;;OAEG;IACI,eAAe,IAAI,IAAI;IAa9B;;;OAGG;IACH,IAAW,kBAAkB,IAAI,iBAAiB,EAAE,CAanD;IAED;;OAEG;IACH,IAAW,mBAAmB,IAAI,OAAO,CAExC;IAED;;OAEG;IACI,2BAA2B,CAAC,KAAK,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAIrF;;;OAGG;IACH,IAAW,YAAY,IAAI,iBAAiB,GAAG,IAAI,CAelD;IAED;;;OAGG;IACH,IAAW,kBAAkB,IAAI,iBAAiB,EAAE,CAYnD;IAED;;;OAGG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAsC3D;;OAEG;IACU,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzE;;;OAGG;YACW,wBAAwB;IAwBtC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;yCAzrClB,oBAAoB;2CAApB,oBAAoB;CAqtChC"}
@@ -523,12 +523,15 @@ export class MessageItemComponent extends BaseAngularComponent {
523
523
  // Track previous status for DoCheck comparison
524
524
  _previousMessageStatus = undefined;
525
525
  /**
526
- * Cached CSS class string for the message container. Updated explicitly in
527
- * ngDoCheck to avoid ExpressionChangedAfterItHasBeenCheckedError a getter
528
- * would recompute between Angular's check and verify passes when message.Status
529
- * changes mid-cycle (e.g., from a WebSocket update).
526
+ * Cached values updated in ngDoCheck so they stay stable through Angular's
527
+ * dev-mode verify pass. The underlying message entity properties (Status,
528
+ * Message) can mutate between the check and verify passes (e.g., from
529
+ * WebSocket streaming updates), which causes ExpressionChangedAfterItHasBeenCheckedError
530
+ * if templates read the live properties directly.
530
531
  */
531
532
  _messageClasses = 'message-item';
533
+ _stableDisplayMessage = '';
534
+ _stableIsInProgressAIMessage = false;
532
535
  // Agent run details
533
536
  isAgentDetailsExpanded = false;
534
537
  detailTasks = [];
@@ -576,8 +579,12 @@ export class MessageItemComponent extends BaseAngularComponent {
576
579
  }
577
580
  // Update previous status for next check
578
581
  this._previousMessageStatus = currentStatus;
579
- // Rebuild cached class string so it's stable during Angular's check/verify cycle
582
+ // Rebuild cached values so they're stable during Angular's check/verify cycle.
583
+ // ngDoCheck runs once per CD pass but NOT during the dev-mode verify pass, so
584
+ // snapshotting here produces values that don't change between the two reads.
580
585
  this._messageClasses = this.buildMessageClasses();
586
+ this._stableIsInProgressAIMessage = this.isAIMessage && currentStatus === 'In-Progress';
587
+ this._stableDisplayMessage = this.computeDisplayMessage();
581
588
  }
582
589
  ngAfterViewInit() {
583
590
  // Use message creation timestamp if available (for reconnecting to in-progress messages)
@@ -754,6 +761,13 @@ export class MessageItemComponent extends BaseAngularComponent {
754
761
  return this.aiAgentInfo?.name === 'Sage';
755
762
  }
756
763
  get displayMessage() {
764
+ return this._stableDisplayMessage;
765
+ }
766
+ /**
767
+ * Computes the display message from the current message text. Called from
768
+ * ngDoCheck to snapshot the value; templates read _stableDisplayMessage.
769
+ */
770
+ computeDisplayMessage() {
757
771
  let text = this.message.Message || '';
758
772
  // For Sage, only show the delegation line (starts with emoji)
759
773
  if (this.isConversationManager && text) {
@@ -762,7 +776,7 @@ export class MessageItemComponent extends BaseAngularComponent {
762
776
  text = delegationMatch[0];
763
777
  }
764
778
  }
765
- // Use cached result if message text hasn't changed
779
+ // Use cached result if message text hasn't changed (avoids re-parsing mentions)
766
780
  if (this._cachedMessageText === text && this._cachedDisplayMessage) {
767
781
  return this._cachedDisplayMessage;
768
782
  }
@@ -914,7 +928,7 @@ export class MessageItemComponent extends BaseAngularComponent {
914
928
  return FormResponseUtils.EscapeHtml(text);
915
929
  }
916
930
  get isInProgressAIMessage() {
917
- return this.isAIMessage && this.message.Status === 'In-Progress';
931
+ return this._stableIsInProgressAIMessage;
918
932
  }
919
933
  get isAgentRunActive() {
920
934
  if (!this.agentRun) {