@memberjunction/ng-conversations 5.30.1 → 5.32.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.
Files changed (124) hide show
  1. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +2 -1
  2. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +9 -6
  4. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  5. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +2 -1
  6. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  7. package/dist/lib/components/collection/artifact-create-modal.component.js +9 -6
  8. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  9. package/dist/lib/components/collection/collection-form-modal.component.d.ts +2 -1
  10. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  11. package/dist/lib/components/collection/collection-form-modal.component.js +8 -5
  12. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  13. package/dist/lib/components/collection/collection-tree.component.d.ts +2 -1
  14. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  15. package/dist/lib/components/collection/collection-tree.component.js +9 -6
  16. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  17. package/dist/lib/components/collection/collection-view.component.d.ts +2 -1
  18. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  19. package/dist/lib/components/collection/collection-view.component.js +12 -10
  20. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  21. package/dist/lib/components/collection/collections-full-view.component.d.ts +2 -1
  22. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  23. package/dist/lib/components/collection/collections-full-view.component.js +18 -12
  24. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  25. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +2 -1
  26. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  27. package/dist/lib/components/conversation/conversation-chat-area.component.js +22 -11
  28. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  29. package/dist/lib/components/library/library-full-view.component.d.ts +2 -1
  30. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  31. package/dist/lib/components/library/library-full-view.component.js +8 -5
  32. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  33. package/dist/lib/components/message/conversation-message-rating.component.d.ts +2 -1
  34. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  35. package/dist/lib/components/message/conversation-message-rating.component.js +9 -7
  36. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  37. package/dist/lib/components/message/message-input.component.d.ts +2 -1
  38. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  39. package/dist/lib/components/message/message-input.component.js +12 -5
  40. package/dist/lib/components/message/message-input.component.js.map +1 -1
  41. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-item.component.js +6 -1
  43. package/dist/lib/components/message/message-item.component.js.map +1 -1
  44. package/dist/lib/components/overlay/chat-overlay.component.d.ts +2 -1
  45. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  46. package/dist/lib/components/overlay/chat-overlay.component.js +6 -6
  47. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  48. package/dist/lib/components/project/project-form-modal.component.d.ts +2 -1
  49. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  50. package/dist/lib/components/project/project-form-modal.component.js +6 -5
  51. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  52. package/dist/lib/components/project/project-selector.component.d.ts +2 -1
  53. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  54. package/dist/lib/components/project/project-selector.component.js +8 -6
  55. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  56. package/dist/lib/components/share/share-modal.component.d.ts +2 -1
  57. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  58. package/dist/lib/components/share/share-modal.component.js +11 -9
  59. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  60. package/dist/lib/components/shared/user-picker.component.d.ts +2 -1
  61. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  62. package/dist/lib/components/shared/user-picker.component.js +6 -4
  63. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  64. package/dist/lib/components/task/tasks-full-view.component.d.ts +2 -1
  65. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  66. package/dist/lib/components/task/tasks-full-view.component.js +9 -8
  67. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  68. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  69. package/dist/lib/components/tasks/tasks-dropdown.component.js +5 -0
  70. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  71. package/dist/lib/components/thread/thread-panel.component.d.ts +2 -1
  72. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  73. package/dist/lib/components/thread/thread-panel.component.js +7 -4
  74. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  75. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  76. package/dist/lib/components/workspace/conversation-workspace.component.js +8 -4
  77. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  78. package/dist/lib/models/lazy-artifact-info.js +1 -1
  79. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  80. package/dist/lib/services/active-tasks.service.d.ts +7 -1
  81. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  82. package/dist/lib/services/active-tasks.service.js +12 -2
  83. package/dist/lib/services/active-tasks.service.js.map +1 -1
  84. package/dist/lib/services/agent-state.service.d.ts +7 -1
  85. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  86. package/dist/lib/services/agent-state.service.js +12 -2
  87. package/dist/lib/services/agent-state.service.js.map +1 -1
  88. package/dist/lib/services/artifact-permission.service.d.ts +8 -1
  89. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  90. package/dist/lib/services/artifact-permission.service.js +21 -7
  91. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  92. package/dist/lib/services/artifact-state.service.d.ts +8 -1
  93. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  94. package/dist/lib/services/artifact-state.service.js +25 -11
  95. package/dist/lib/services/artifact-state.service.js.map +1 -1
  96. package/dist/lib/services/artifact-use-tracking.service.d.ts +7 -1
  97. package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -1
  98. package/dist/lib/services/artifact-use-tracking.service.js +12 -2
  99. package/dist/lib/services/artifact-use-tracking.service.js.map +1 -1
  100. package/dist/lib/services/collection-permission.service.d.ts +7 -1
  101. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  102. package/dist/lib/services/collection-permission.service.js +19 -9
  103. package/dist/lib/services/collection-permission.service.js.map +1 -1
  104. package/dist/lib/services/conversation-agent.service.d.ts +8 -0
  105. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  106. package/dist/lib/services/conversation-agent.service.js +15 -3
  107. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  108. package/dist/lib/services/conversation-attachment.service.d.ts +7 -1
  109. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  110. package/dist/lib/services/conversation-attachment.service.js +12 -2
  111. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  112. package/dist/lib/services/data-cache.service.d.ts +7 -1
  113. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  114. package/dist/lib/services/data-cache.service.js +16 -7
  115. package/dist/lib/services/data-cache.service.js.map +1 -1
  116. package/dist/lib/services/export.service.d.ts +7 -1
  117. package/dist/lib/services/export.service.d.ts.map +1 -1
  118. package/dist/lib/services/export.service.js +12 -2
  119. package/dist/lib/services/export.service.js.map +1 -1
  120. package/dist/lib/services/search.service.d.ts +7 -1
  121. package/dist/lib/services/search.service.d.ts.map +1 -1
  122. package/dist/lib/services/search.service.js +16 -6
  123. package/dist/lib/services/search.service.js.map +1 -1
  124. package/package.json +22 -22
@@ -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":"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"}
@@ -547,6 +547,11 @@ export class MessageItemComponent extends BaseAngularComponent {
547
547
  this.uiCommandHandler = uiCommandHandler;
548
548
  }
549
549
  async ngOnInit() {
550
+ // AIEngineBase is deferred at startup; kick off the load early so the
551
+ // template-bound aiAgentInfo getter finds populated .Agents data when
552
+ // change detection asks for it. Fire-and-forget — the getter falls back
553
+ // to defaults until it's loaded.
554
+ AIEngineBase.Instance.EnsureLoaded();
550
555
  // Execute automatic commands if present
551
556
  await this.executeAutomaticCommands();
552
557
  }
@@ -1317,7 +1322,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1317
1322
  return;
1318
1323
  }
1319
1324
  try {
1320
- const rv = new RunView();
1325
+ const rv = RunView.FromMetadataProvider(this.ProviderToUse);
1321
1326
  const result = await rv.RunView({
1322
1327
  EntityName: 'MJ: Tasks',
1323
1328
  ExtraFilter: `ConversationDetailID='${this.message.ID}'`,
@@ -1 +1 @@
1
- {"version":3,"file":"message-item.component.js","sourceRoot":"","sources":["../../../../src/lib/components/message/message-item.component.ts","../../../../src/lib/components/message/message-item.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n OnDestroy,\n AfterViewInit,\n OnInit,\n OnChanges,\n SimpleChanges,\n DoCheck\n} from '@angular/core';\nimport { MJConversationDetailEntity, MJConversationEntity, MJArtifactEntity, MJArtifactVersionEntity, MJTaskEntity, RatingJSON } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, CompositeKey, KeyValuePair } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { AgentResponseForm, FormQuestion, ChoiceQuestionType, ActionableCommand, AutomaticCommand, ConversationUtility, MJAIAgentRunEntityExtended } from '@memberjunction/ai-core-plus';\nimport { FormResponseUtils } from '@memberjunction/ng-forms';\nimport { MentionParserService } from '../../services/mention-parser.service';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { SuggestedResponse } from '../../models/conversation-state.model';\nimport { UICommandHandlerService } from '../../services/ui-command-handler.service';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BadgeTextForAttachment } from '../../util/attachment-badge';\n\n/**\n * Represents an attachment on a message for display\n */\nexport interface MessageAttachment {\n id: string;\n type: 'Image' | 'Video' | 'Audio' | 'Document';\n mimeType: string;\n fileName: string | null;\n sizeBytes: number;\n width?: number;\n height?: number;\n thumbnailUrl?: string;\n contentUrl?: string;\n /** Source of the attachment: 'upload' for chat uploads, 'artifact' for artifact picker */\n source?: 'upload' | 'artifact';\n /** For source='artifact': the underlying MJArtifact.ID so clicks can open the viewer. */\n artifactId?: string;\n /** For source='artifact': the underlying MJArtifactVersion.ID. */\n artifactVersionId?: string;\n /** For source='artifact': resolved MJArtifactType.Name, e.g. \"Data Snapshot\". Drives the type badge. */\n artifactTypeName?: string;\n}\n\n/**\n * Component for displaying a single message in a conversation\n * Follows the dynamic rendering pattern from skip-chat for optimal performance\n * This component is created dynamically via ViewContainerRef.createComponent()\n */\n@Component({\n standalone: false,\n selector: 'mj-conversation-message-item',\n templateUrl: './message-item.component.html',\n styleUrls: [\n './message-item.component.css',\n '../../styles/custom-agent-icons.css'\n ]\n})\nexport class MessageItemComponent extends BaseAngularComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges, DoCheck {\n @Input() public message!: MJConversationDetailEntity;\n @Input() public conversation!: MJConversationEntity | null;\n @Input() public currentUser!: UserInfo;\n @Input() public allMessages!: MJConversationDetailEntity[];\n @Input() public isProcessing: boolean = false;\n @Input() public artifact?: MJArtifactEntity;\n @Input() public artifactVersion?: MJArtifactVersionEntity;\n @Input() public agentRun: MJAIAgentRunEntityExtended | null = null; // Passed from parent, loaded once per conversation\n @Input() public userAvatarMap: Map<string, {imageUrl: string | null; iconClass: string | null}> = new Map();\n @Input() public ratings?: RatingJSON[]; // Pre-loaded ratings from parent (RatingsJSON from query)\n @Input() public isLastMessage: boolean = false; // Whether this is the last message in the conversation\n @Input() public attachments: MessageAttachment[] = []; // Attachments for this message\n\n @Output() public editClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public deleteClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public retryClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public testFeedbackClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public artifactClicked = new EventEmitter<{artifactId: string; versionId?: string}>();\n @Output() public artifactActionPerformed = new EventEmitter<{action: string; artifactId: string}>();\n @Output() public messageEdited = new EventEmitter<MJConversationDetailEntity>();\n @Output() public openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() public suggestedResponseSelected = new EventEmitter<{text: string; customInput?: string}>();\n @Output() public attachmentClicked = new EventEmitter<MessageAttachment>();\n @Output() public diagnosticRequested = new EventEmitter<string>(); // emits messageId on Shift+Click\n @Output() public messagePinToggled = new EventEmitter<MJConversationDetailEntity>();\n\n private _loadTime: number = Date.now();\n private _elapsedTimeInterval: any = null;\n public _elapsedTimeFormatted: string = '0:00';\n public _agentRunDurationFormatted: string = '0:00';\n public isEditing: boolean = false;\n public editedText: string = '';\n private originalText: string = '';\n\n // Track previous status for DoCheck comparison\n private _previousMessageStatus: 'Complete' | 'In-Progress' | 'Error' | undefined = undefined;\n\n /**\n * Cached values updated in ngDoCheck so they stay stable through Angular's\n * dev-mode verify pass. The underlying message entity properties (Status,\n * Message) can mutate between the check and verify passes (e.g., from\n * WebSocket streaming updates), which causes ExpressionChangedAfterItHasBeenCheckedError\n * if templates read the live properties directly.\n */\n private _messageClasses: string = 'message-item';\n private _stableDisplayMessage: string = '';\n private _stableIsInProgressAIMessage: boolean = false;\n\n // Agent run details\n public isAgentDetailsExpanded: boolean = false;\n public detailTasks: MJTaskEntity[] = [];\n private tasksLoaded: boolean = false;\n\n // Memoization for mention parsing to prevent repeated parsing on change detection\n private _cachedDisplayMessage: string = '';\n private _cachedMessageText: string = '';\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private mentionParser: MentionParserService,\n private mentionAutocomplete: MentionAutocompleteService,\n private uiCommandHandler: UICommandHandlerService\n ) {\n super();\n }\n\n async ngOnInit() {\n // Execute automatic commands if present\n await this.executeAutomaticCommands();\n }\n\n ngOnChanges(_changes: SimpleChanges) {\n // No longer need to manage timer for agentRun changes\n // Parent's 1-second timer + agentRunDuration getter handles all agent run timing\n // Component's timer only runs for temporary messages (handled in ngAfterViewInit)\n }\n\n /**\n * DoCheck lifecycle hook - detects changes to message properties\n * This runs on every change detection cycle, so we check if Status actually changed\n * This is more reliable than ngOnChanges when the message object reference doesn't change\n */\n ngDoCheck() {\n if (!this.message) {\n return;\n }\n\n const currentStatus = this.message.Status;\n\n // Check if status changed from non-Complete to Complete\n if (this._previousMessageStatus !== 'Complete' && currentStatus === 'Complete') {\n // Stop the elapsed time interval\n if (this._elapsedTimeInterval !== null) {\n clearInterval(this._elapsedTimeInterval);\n this._elapsedTimeInterval = null;\n }\n\n // Force immediate synchronous change detection for dynamically created components\n // markForCheck() only schedules a check which may not run for dynamic components\n // detectChanges() forces immediate view update so UI shows timer stopped right away\n this.cdRef.detectChanges();\n }\n\n // Update previous status for next check\n this._previousMessageStatus = currentStatus;\n\n // Rebuild cached values so they're stable during Angular's check/verify cycle.\n // ngDoCheck runs once per CD pass but NOT during the dev-mode verify pass, so\n // snapshotting here produces values that don't change between the two reads.\n this._messageClasses = this.buildMessageClasses();\n this._stableIsInProgressAIMessage = this.isAIMessage && currentStatus === 'In-Progress';\n this._stableDisplayMessage = this.computeDisplayMessage();\n }\n\n ngAfterViewInit() {\n // Use message creation timestamp if available (for reconnecting to in-progress messages)\n // Otherwise use current time for brand new messages\n if (this.message?.__mj_CreatedAt) {\n this._loadTime = new Date(this.message.__mj_CreatedAt).getTime();\n } else {\n this._loadTime = Date.now();\n }\n this.startElapsedTimeUpdater();\n this.cdRef.detectChanges();\n }\n\n ngOnDestroy() {\n if (this._elapsedTimeInterval !== null) {\n clearInterval(this._elapsedTimeInterval);\n this._elapsedTimeInterval = null;\n }\n }\n\n /**\n * Handles clicks on the message bubble.\n * Shift+Click on any AI message emits a diagnosticRequested event so the parent\n * can dump live streaming state to the browser console — useful for debugging\n * stuck or forever-spinning conversations without any code changes.\n */\n public onMessageBubbleClick(event: MouseEvent): void {\n if (!event.shiftKey || !this.isAIMessage) return;\n event.preventDefault();\n event.stopPropagation();\n this.diagnosticRequested.emit(this.message.ID);\n }\n\n /**\n * Starts the elapsed time updater interval for temporary messages only\n * For agent runs with IDs, the parent's timer + agentRunDuration getter handles updates\n * Updates every second for temporary messages that use _elapsedTimeFormatted\n */\n private startElapsedTimeUpdater(): void {\n // Start timer for temporary messages (in-progress, no ID) OR active agent runs\n // Both need periodic updates to _elapsedTimeFormatted / _agentRunDurationFormatted\n if (this.isInProgressAIMessage || this.isAgentRunActive) {\n // Initial update\n this.updateTimers();\n this.cdRef.markForCheck();\n\n // Start interval if not already running\n if (this._elapsedTimeInterval === null) {\n this._elapsedTimeInterval = setInterval(() => {\n this.updateTimers();\n // Use detectChanges to force immediate synchronous view update\n // markForCheck only schedules a check which may not happen if parent already checked\n this.cdRef.detectChanges();\n }, 1000);\n }\n }\n }\n\n /**\n * Update all timer displays\n * Called every second by the interval timer\n */\n private updateTimers(): void {\n // Update temporary message elapsed time\n if (this.isInProgressAIMessage) {\n this._elapsedTimeFormatted = this.formatElapsedTime(this.elapsedTimeSinceLoad);\n }\n\n // Update agent run duration for active runs\n if (this.isAgentRunActive && this.agentRun?.__mj_CreatedAt) {\n const createdAt = new Date(this.agentRun.__mj_CreatedAt);\n const now = new Date();\n const diffMs = now.getTime() - createdAt.getTime();\n this._agentRunDurationFormatted = this.formatDurationFromMs(diffMs);\n }\n }\n\n private formatElapsedTime(elapsedTime: number): string {\n let seconds = Math.floor(elapsedTime / 1000);\n let minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n let hours = Math.floor(minutes / 60);\n minutes = minutes % 60;\n let formattedTime = (hours > 0 ? hours + ':' : '') +\n (minutes < 10 && hours > 0 ? '0' : '') + minutes + ':' +\n (seconds < 10 ? '0' : '') + seconds;\n return formattedTime;\n }\n\n private formatDurationFromMs(diffMs: number): string {\n if (diffMs <= 0) {\n return '0:00';\n }\n\n let seconds = Math.floor(diffMs / 1000);\n let minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n let hours = Math.floor(minutes / 60);\n minutes = minutes % 60;\n let formattedTime = (hours > 0 ? hours + ':' : '') +\n (minutes < 10 && hours > 0 ? '0' : '') + minutes + ':' +\n (seconds < 10 ? '0' : '') + seconds;\n return formattedTime;\n }\n\n public get elapsedTimeSinceLoad(): number {\n return Date.now() - this._loadTime;\n }\n\n public get isAIMessage(): boolean {\n return this.message.Role?.trim().toLowerCase() === 'ai';\n }\n\n public get aiAgentInfo(): { name: string; iconClass: string; role: string } | null {\n if (!this.isAIMessage) return null;\n\n // Get agent ID from denormalized field (populated when message is created)\n const agentID = (this.message as any).AgentID;\n\n // Look up agent from AIEngineBase cache\n if (agentID && AIEngineBase.Instance?.Agents) {\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, agentID));\n if (agent) {\n return {\n name: agent.Name || 'AI Assistant',\n iconClass: agent.IconClass || 'fa-robot',\n role: agent.Description || 'AI Assistant'\n };\n } else {\n // Only log if the message is complete (should have AgentID by then)\n if (this.message.Status === 'Complete') {\n console.warn('⚠️ Agent not found in cache for ID:', agentID);\n }\n }\n }\n // Note: In-progress messages won't have AgentID yet, so we don't log warnings for them\n\n // Default fallback for AI messages without agent info\n return {\n name: 'AI Assistant',\n iconClass: 'fa-robot',\n role: 'AI Assistant'\n };\n }\n\n public get isUserMessage(): boolean {\n return this.message.Role?.trim().toLowerCase() === 'user';\n }\n\n /**\n * Get the actual sender name for user messages\n * Uses the denormalized User field from the view if available,\n * otherwise falls back to current user name\n */\n public get messageSenderName(): string {\n // Use the denormalized User field from the ConversationDetail view\n // This is populated from the UserID (if present) or falls back to Conversation.UserID\n if (this.message.User) {\n return this.message.User;\n }\n\n // Fallback to current user name (for backwards compatibility)\n return this.currentUser.Name;\n }\n\n /**\n * Get the user's avatar image URL from the userAvatarMap\n * Uses fast O(1) lookup by UserID\n */\n public get userAvatarUrl(): string | null {\n if (!this.isUserMessage || !this.message.UserID) {\n return null;\n }\n const avatarData = this.userAvatarMap.get(this.message.UserID);\n return avatarData?.imageUrl || null;\n }\n\n /**\n * Get the user's avatar icon class from the userAvatarMap\n * Uses fast O(1) lookup by UserID\n */\n public get userAvatarIconClass(): string | null {\n if (!this.isUserMessage || !this.message.UserID) {\n return null;\n }\n const avatarData = this.userAvatarMap.get(this.message.UserID);\n return avatarData?.iconClass || null;\n }\n\n public get isConversationManager(): boolean {\n return this.aiAgentInfo?.name === 'Sage';\n }\n\n public get displayMessage(): string {\n return this._stableDisplayMessage;\n }\n\n /**\n * Computes the display message from the current message text. Called from\n * ngDoCheck to snapshot the value; templates read _stableDisplayMessage.\n */\n private computeDisplayMessage(): string {\n let text = this.message.Message || '';\n\n // For Sage, only show the delegation line (starts with emoji)\n if (this.isConversationManager && text) {\n const delegationMatch = text.match(/🤖.*Delegating to.*Agent.*/);\n if (delegationMatch) {\n text = delegationMatch[0];\n }\n }\n\n // Use cached result if message text hasn't changed (avoids re-parsing mentions)\n if (this._cachedMessageText === text && this._cachedDisplayMessage) {\n return this._cachedDisplayMessage;\n }\n\n // Transform @mentions to HTML pills\n const transformed = this.transformMentionsToHTML(text);\n\n // Cache the result\n this._cachedMessageText = text;\n this._cachedDisplayMessage = transformed;\n\n return transformed;\n }\n\n /**\n * Transform @mentions in text to HTML badge elements\n * Supports both JSON format (@{type:\"agent\",id:\"uuid\",...}) and legacy text format (@AgentName)\n * Uses inline HTML that markdown will preserve\n */\n private transformMentionsToHTML(text: string): string {\n if (!text) return '';\n\n // Get available agents and users for name/icon lookup\n const agents = this.mentionAutocomplete.getAvailableAgents();\n const users = this.mentionAutocomplete.getAvailableUsers();\n\n // Parse all @{...} tokens\n const tokens = ConversationUtility.ParseSpecialContent(text);\n if (tokens.length === 0) return text; // No tokens found, return original text\n\n // Replace tokens in reverse order to maintain indices\n let result = text;\n for (let i = tokens.length - 1; i >= 0; i--) {\n const token = tokens[i];\n let html = '';\n\n switch (token.mode) {\n case 'mention':\n html = this.renderMentionHTML(token.content as any, agents, users);\n break;\n case 'form':\n html = this.renderFormHTML(token.content as any);\n break;\n default:\n // Unknown mode, leave original text as-is\n html = token.originalText;\n }\n\n result = result.substring(0, token.startIndex) + html + result.substring(token.endIndex);\n }\n\n return result;\n }\n\n private renderMentionHTML(content: any, agents: any[], users: any[]): string {\n let name = content.name;\n let iconClass = '';\n let logoURL = '';\n let configPresetName = '';\n\n // Look up actual name and icon if ID provided\n if (content.type === 'agent' && agents) {\n const agent = agents.find(a => UUIDsEqual(a.ID, content.id));\n if (agent) {\n name = agent.Name;\n iconClass = agent.IconClass || '';\n logoURL = agent.LogoURL || '';\n\n // Check for configuration preset (only show if non-default)\n if (content.configId && AIEngineBase.Instance) {\n const presets = AIEngineBase.Instance.GetAgentConfigurationPresets(content.id, true);\n if (presets && presets.length > 0) {\n const defaultPreset = presets.find(p => p.IsDefault) || presets[0];\n const isNonDefault = content.configId !== defaultPreset?.ID;\n\n // Only include preset name if it's not the default\n if (isNonDefault && content.config) {\n configPresetName = content.config;\n }\n }\n }\n }\n } else if (content.type === 'user' && users) {\n const user = users.find(u => UUIDsEqual(u.ID, content.id));\n if (user) name = user.Name;\n }\n\n const escapedName = this.escapeHtml(name);\n const typeClass = content.type === 'agent' ? 'agent' : 'user';\n\n // Build preset indicator HTML if present\n const presetIndicator = configPresetName\n ? `<span class=\"preset-indicator\">${this.escapeHtml(configPresetName)}</span>`\n : '';\n\n // Generate HTML based on whether we have an icon\n if (logoURL) {\n return `<span class=\"mention-badge ${typeClass}\"><img src=\"${this.escapeHtml(logoURL)}\" alt=\"\" />${escapedName}${presetIndicator}</span>`;\n } else if (iconClass) {\n return `<span class=\"mention-badge ${typeClass}\"><i class=\"${this.escapeHtml(iconClass)}\" aria-hidden=\"true\"></i>${escapedName}${presetIndicator}</span>`;\n } else {\n return `<span class=\"mention-badge ${typeClass}\">${escapedName}${presetIndicator}</span>`;\n }\n }\n\n private renderFormHTML(content: { title?: string; fields?: Array<{ name?: string; value: unknown; label?: string; type?: string; displayValue?: string }> }): string {\n if (!content.fields || content.fields.length === 0) {\n return FormResponseUtils.EscapeHtml(JSON.stringify(content));\n }\n\n // Filter out fields with empty/null/undefined values (optional fields not provided)\n const nonEmptyFields = content.fields.filter(f => {\n const value = f.value;\n return value != null && value !== '' && !(Array.isArray(value) && value.length === 0);\n });\n\n if (nonEmptyFields.length === 0) {\n return FormResponseUtils.EscapeHtml(JSON.stringify(content));\n }\n\n if (nonEmptyFields.length === 1) {\n // Single field - simple inline pill\n const field = nonEmptyFields[0];\n const value = this.formatFieldValueHtml(field);\n return `<span class=\"form-response-pill single-field\"><i class=\"fa fa-check\" aria-hidden=\"true\"></i>${value}</span>`;\n } else {\n // Multiple fields - vertical question/answer layout\n const title = content.title ? FormResponseUtils.EscapeHtml(content.title) : 'Form Response';\n const fieldsHTML = nonEmptyFields.map(f => {\n const label = FormResponseUtils.EscapeHtml(f.label || f.name || '');\n const value = this.formatFieldValueHtml(f);\n return `<div class=\"pill-field\">\n <div class=\"field-question\">${label}</div>\n <div class=\"field-answer\">${value}</div>\n </div>`;\n }).join('');\n\n return `<div class=\"form-response-pill multi-field\">\n <div class=\"pill-header\">\n <i class=\"fa fa-check-square\" aria-hidden=\"true\"></i>\n ${title}\n </div>\n <div class=\"pill-fields\">${fieldsHTML}</div>\n </div>`;\n }\n }\n\n /**\n * Format a field value for HTML display using the shared FormResponseUtils.\n * This handles the inline-HTML context where values need HTML escaping.\n */\n private formatFieldValueHtml(field: { name?: string; value: unknown; label?: string; type?: string; displayValue?: string }): string {\n if (field.value == null) return '';\n\n // For choice types with displayValue, use it directly\n const choiceTypes = ['buttongroup', 'radio', 'dropdown', 'checkbox'];\n if (field.type && choiceTypes.includes(field.type) && field.displayValue) {\n return FormResponseUtils.EscapeHtml(field.displayValue);\n }\n\n // Delegate type-aware formatting to shared utility (no schema question available here)\n const formatted = FormResponseUtils.FormatValue(field.value, null, field.type || null);\n return FormResponseUtils.EscapeHtml(formatted);\n }\n\n private escapeHtml(text: string): string {\n return FormResponseUtils.EscapeHtml(text);\n }\n\n public get isInProgressAIMessage(): boolean {\n return this._stableIsInProgressAIMessage;\n }\n\n public get isAgentRunActive(): boolean {\n if (!this.agentRun) {\n return false;\n }\n const status = this.agentRun.Status?.toLowerCase();\n return status === 'in-progress' || status === 'running';\n }\n\n public get messageStatus(): 'Complete' | 'In-Progress' | 'Error' {\n return this.message.Status || 'Complete';\n }\n\n public getStatusText(): string {\n switch (this.messageStatus) {\n case 'In-Progress':\n return 'Processing...';\n case 'Error':\n return 'Failed';\n default:\n return '';\n }\n }\n\n public get isFirstMessageInConversation(): boolean {\n return this.allMessages.indexOf(this.message) === 0;\n }\n\n public get isLastMessageInConversation(): boolean {\n return this.allMessages.indexOf(this.message) === this.allMessages.length - 1;\n }\n\n /**\n * Determine if rating component should be shown inline (Option C - Hybrid).\n * Show for latest completed AI message that user hasn't rated yet.\n * For older/already-rated messages, ratings accessible via gear menu.\n */\n public shouldShowRating(): boolean {\n // Must be an AI message\n if (!this.isAIMessage) return false;\n\n // Must be completed (not in progress or failed)\n if (this.messageStatus !== 'Complete') return false;\n\n // Must not be editing\n if (this.isEditing) return false;\n\n // Must be the last message in conversation\n if (!this.isLastMessageInConversation) return false;\n\n // Check if current user has already rated this message\n if (this.ratings && this.ratings.length > 0) {\n const currentUserId = this.currentUser?.ID;\n const userHasRated = this.ratings.some(r => UUIDsEqual(r.UserID, currentUserId));\n\n // If user already rated, don't show inline (accessible via gear menu)\n if (userHasRated) return false;\n }\n\n // Show inline rating for latest completed AI message not yet rated by user\n return true;\n }\n\n /**\n * Check if message has any ratings (for gear icon badge)\n */\n public hasRatings(): boolean {\n return !!(this.ratings && this.ratings.length > 0);\n }\n\n /**\n * Get rating count for badge display on gear icon\n */\n public getRatingCount(): number {\n return this.ratings?.length || 0;\n }\n\n /**\n * Get thumbs up count (ratings >= 8)\n */\n public getThumbsUpCount(): number {\n return this.ratings?.filter(r => r.Rating ? r.Rating >= 8 : false).length || 0;\n }\n\n /**\n * Get thumbs down count (ratings <= 3)\n */\n public getThumbsDownCount(): number {\n return this.ratings?.filter(r => r.Rating ? r.Rating <= 3 : false).length || 0;\n }\n\n /**\n * Determine if pin/delete actions should show inline (with rating buttons).\n * Show for latest completed AI message that user hasn't rated yet.\n */\n public shouldShowInlineActions(): boolean {\n // Same logic as shouldShowRating - latest unrated message\n return this.shouldShowRating();\n }\n\n public get hasArtifact(): boolean {\n return !!this.artifactVersion;\n }\n\n /**\n * Check if the artifact is a system-only artifact\n */\n public get isSystemArtifact(): boolean {\n return this.artifact?.Visibility === 'System Only';\n }\n\n /**\n * Unified time pill text for all AI message states\n * Returns the appropriate time display based on message state:\n * - Temporary messages (in-progress): Live elapsed time\n * - Active agent runs: Live agent run duration (calculated on-demand)\n * - Completed messages: Final generation time\n * - Failed messages: Time before failure\n */\n public get timePillText(): string | null {\n return this.calculateTimePillText();\n }\n\n private calculateTimePillText(): string | null {\n if (this.isUserMessage) {\n return null;\n }\n\n // For temporary messages (in-progress), show live elapsed time\n if (this.isInProgressAIMessage) {\n return this._elapsedTimeFormatted;\n }\n\n // For active agent runs, calculate live duration from agentRun timestamps\n // This getter recalculates every time using new Date(), so it updates smoothly\n if (this.isAgentRunActive && this.agentRun?.__mj_CreatedAt) {\n return this.agentRunDuration;\n }\n\n // For completed/failed messages with an agent run, use agentRun timestamps.\n // These are set when the run finishes and never change, so pin/edit saves on the\n // message entity cannot corrupt the displayed duration.\n if (this.agentRun?.__mj_CreatedAt && this.agentRun?.__mj_UpdatedAt) {\n return this.agentRunDuration;\n }\n\n // No agent run — fall back to message entity timestamps\n return this.formattedGenerationTime;\n }\n\n public get formattedGenerationTime(): string | null {\n // Only show generation time for AI messages\n if (this.isUserMessage || !this.message.__mj_CreatedAt || !this.message.__mj_UpdatedAt) {\n return null;\n }\n\n // Calculate generation time from created -> updated timestamps\n const createdAt = new Date(this.message.__mj_CreatedAt);\n const updatedAt = new Date(this.message.__mj_UpdatedAt);\n const diffMs = updatedAt.getTime() - createdAt.getTime();\n\n // If no time difference, don't show (e.g., not yet completed)\n if (diffMs <= 0) {\n return null;\n }\n\n const seconds = diffMs / 1000;\n\n if (seconds < 1) {\n return `${Math.round(diffMs)}ms`;\n } else if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n } else {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n }\n\n /**\n * Returns the cached CSS class string. Updated in ngDoCheck so the value\n * is stable within a single change detection cycle, preventing\n * ExpressionChangedAfterItHasBeenCheckedError.\n */\n public get messageClasses(): string {\n return this._messageClasses;\n }\n\n private buildMessageClasses(): string {\n const classes: string[] = ['message-item'];\n if (this.isAIMessage) {\n classes.push('ai-message');\n if (this.isInProgressAIMessage) {\n classes.push('in-progress');\n }\n } else if (this.isUserMessage) {\n classes.push('user-message');\n }\n if (this.message?.IsPinned) {\n classes.push('pinned');\n }\n if (this.isEditing) {\n classes.push('editing');\n }\n return classes.join(' ');\n }\n\n public get isMessageEdited(): boolean {\n // Only show edited badge if user actually edited the message content\n // The OriginalMessageChanged flag is set server-side when the Message field changes on update\n if (!this.isUserMessage) {\n return false;\n }\n return this.message.OriginalMessageChanged === true;\n }\n\n public onEditClick(): void {\n if (!this.isProcessing && !this.isEditing) {\n this.startEditing();\n }\n }\n\n public startEditing(): void {\n this.originalText = this.message.Message || '';\n this.editedText = this.originalText;\n this.isEditing = true;\n\n // Focus textarea after Angular renders it\n Promise.resolve().then(() => {\n const textarea = document.querySelector('.message-edit-textarea') as HTMLTextAreaElement;\n if (textarea) {\n textarea.focus();\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }\n this.cdRef.detectChanges();\n });\n }\n\n public cancelEditing(): void {\n this.isEditing = false;\n this.editedText = '';\n this.originalText = '';\n this.cdRef.detectChanges();\n }\n\n public async saveEdit(): Promise<void> {\n if (!this.editedText.trim() || this.editedText === this.originalText) {\n this.cancelEditing();\n return;\n }\n\n try {\n // Update the message entity\n this.message.Message = this.editedText;\n const saveResult = await this.message.Save();\n\n if (saveResult) {\n this.isEditing = false;\n this.editedText = '';\n this.originalText = '';\n // Invalidate display message cache since message changed\n this._cachedMessageText = '';\n this._cachedDisplayMessage = '';\n this.messageEdited.emit(this.message);\n this.cdRef.detectChanges();\n } else {\n console.error('Failed to save message edit');\n alert('Failed to save message. Please try again.');\n }\n } catch (error) {\n console.error('Error saving message edit:', error);\n alert('Error saving message. Please try again.');\n }\n }\n\n public onEditKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancelEditing();\n } else if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.saveEdit();\n }\n }\n\n public onDeleteClick(): void {\n if (!this.isProcessing) {\n this.deleteClicked.emit(this.message);\n }\n }\n\n public async PinMessage(): Promise<void> {\n // Optimistic update — toggle immediately so the UI responds at once\n const previousValue = this.message.IsPinned;\n this.message.IsPinned = !previousValue;\n this.cdRef.detectChanges();\n\n const saved = await this.message.Save();\n if (!saved) {\n // Revert on failure\n this.message.IsPinned = previousValue;\n this.cdRef.detectChanges();\n console.error('Failed to save pin state for message', this.message.ID);\n } else {\n // Notify parent so it can patch the conversation cache in-place.\n // Without this, navigating away and back rebuilds entities from stale cache data,\n // causing the pin state to appear lost until the next full page reload.\n this.messagePinToggled.emit(this.message);\n }\n }\n\n public onTestFeedbackClick(): void {\n if (!this.isProcessing) {\n this.testFeedbackClicked.emit(this.message);\n }\n }\n\n public onRetryClick(): void {\n if (!this.isProcessing && this.messageStatus === 'Error') {\n this.retryClicked.emit(this.message);\n }\n }\n\n public onArtifactClick(): void {\n if (this.hasArtifact && this.artifact) {\n this.artifactClicked.emit({\n artifactId: this.artifact.ID,\n versionId: this.artifactVersion?.ID\n });\n }\n }\n\n public onArtifactActionPerformed(event: {action: string; artifact: MJArtifactEntity; version?: MJArtifactVersionEntity}): void {\n // Handle artifact actions from inline-artifact component\n if (event.action === 'open') {\n this.artifactClicked.emit({\n artifactId: event.artifact.ID,\n versionId: event.version?.ID\n });\n } else {\n // Emit other actions to parent\n this.artifactActionPerformed.emit({ action: event.action, artifactId: event.artifact.ID });\n }\n }\n\n public toggleReaction(type: 'like' | 'comment'): void {\n // TODO: Implement reaction toggling\n console.log('Toggle reaction:', type, 'for message:', this.message.ID);\n }\n\n public onSaveArtifact(event: Event): void {\n event.stopPropagation();\n // TODO: Implement artifact save\n console.log('Save artifact for message:', this.message.ID);\n }\n\n public onShareArtifact(event: Event): void {\n event.stopPropagation();\n // TODO: Implement artifact share\n console.log('Share artifact for message:', this.message.ID);\n }\n\n public onExportArtifact(event: Event): void {\n event.stopPropagation();\n // TODO: Implement artifact export\n console.log('Export artifact for message:', this.message.ID);\n }\n\n /**\n * Handle attachment thumbnail click\n * Emits the attachment for the parent to display in the image viewer\n */\n public onAttachmentClick(attachment: MessageAttachment): void {\n this.attachmentClicked.emit(attachment);\n }\n\n /**\n * Check if message has any attachments\n */\n public get hasAttachments(): boolean {\n return this.attachments && this.attachments.length > 0;\n }\n\n /**\n * Get only image attachments\n */\n public get imageAttachments(): MessageAttachment[] {\n return this.attachments?.filter(a => a.type === 'Image') || [];\n }\n\n /**\n * Format file size for display\n */\n public formatFileSize(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n /** Compact UPPERCASE badge label (artifact-type name wins over file extension). */\n public badgeTextFor(attachment: MessageAttachment): string {\n return BadgeTextForAttachment(attachment);\n }\n\n /**\n * Whether this message has an associated agent run\n * Based on whether the message has an AgentID (not whether agentRun object is loaded)\n */\n public get hasAgentRun(): boolean {\n return !!this.message?.AgentID;\n }\n\n /**\n * Toggle the agent details panel expansion\n */\n public async toggleAgentDetails(): Promise<void> {\n this.isAgentDetailsExpanded = !this.isAgentDetailsExpanded;\n\n // Load tasks when expanding if not already loaded\n if (this.isAgentDetailsExpanded && !this.tasksLoaded) {\n await this.loadTasks();\n }\n\n this.cdRef.detectChanges();\n }\n\n /**\n * Load tasks associated with this conversation detail\n */\n private async loadTasks(): Promise<void> {\n if (!this.message?.ID) {\n return;\n }\n\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ConversationDetailID='${this.message.ID}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n this.detailTasks = result.Results || [];\n this.tasksLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load tasks for conversation detail:', error);\n }\n }\n\n /**\n * Get formatted duration for the agent run\n * For active runs: Calculate from created to NOW (live updates)\n * For completed runs: Calculate from created to updated timestamp (static)\n */\n public get agentRunDuration(): string | null {\n if (!this.agentRun || !this.agentRun.__mj_CreatedAt) {\n return null;\n }\n\n // For active runs, return the interval-updated field to avoid\n // ExpressionChangedAfterItHasBeenCheckedError (new Date() changes between CD cycles)\n if (this.isAgentRunActive) {\n return this._agentRunDurationFormatted;\n }\n\n // For completed runs, calculate static duration from timestamps\n if (!this.agentRun.__mj_UpdatedAt) {\n return null;\n }\n const createdAt = new Date(this.agentRun.__mj_CreatedAt);\n const endTime = new Date(this.agentRun.__mj_UpdatedAt);\n const diffMs = endTime.getTime() - createdAt.getTime();\n\n if (diffMs <= 0) {\n return null;\n }\n\n return this.formatDurationFromMs(diffMs);\n }\n\n /**\n * Get total tokens used in the agent run\n */\n public get agentRunTotalTokens(): number {\n if (!this.agentRun) {\n return 0;\n }\n return (this.agentRun.TotalPromptTokensUsed || 0) + (this.agentRun.TotalCompletionTokensUsed || 0);\n }\n\n /**\n * Get total cost of the agent run\n */\n public get agentRunTotalCost(): number {\n return this.agentRun?.TotalCost || 0;\n }\n\n /**\n * Get number of steps in the agent run\n */\n public get agentRunStepCount(): number {\n // Count from the Steps array if available\n if (this.agentRun && (this.agentRun as any).Steps) {\n return (this.agentRun as any).Steps.length;\n }\n return 0;\n }\n\n /**\n * Format number with commas\n */\n public formatNumber(num: number): string {\n return num.toLocaleString();\n }\n\n /**\n * Open the agent run entity record in a new tab\n */\n public openAgentRunRecord(): void {\n if (!this.agentRun?.ID) return;\n\n const compositeKey = new CompositeKey([\n new KeyValuePair('ID', this.agentRun.ID)\n ]);\n\n this.openEntityRecord.emit({\n entityName: 'MJ: AI Agent Runs',\n compositeKey\n });\n }\n\n /**\n * Open the agent entity record in a new tab\n */\n public openAgentRecord(): void {\n if (!this.agentRun?.AgentID) return;\n\n const compositeKey = new CompositeKey([\n new KeyValuePair('ID', this.agentRun.AgentID)\n ]);\n\n this.openEntityRecord.emit({\n entityName: 'MJ: AI Agents',\n compositeKey\n });\n }\n\n /**\n * Parse and return suggested responses from message data\n * Uses strongly-typed SuggestedResponses property from MJConversationDetailEntity\n */\n public get suggestedResponses(): SuggestedResponse[] {\n try {\n const rawData = this.message.SuggestedResponses;\n if (!rawData) return [];\n\n // Parse JSON string to array of SuggestedResponse objects\n const responses = JSON.parse(rawData);\n\n return Array.isArray(responses) ? responses : [];\n } catch (error) {\n console.error('Failed to parse suggested responses:', error);\n return [];\n }\n }\n\n /**\n * Check if current user is the conversation owner\n */\n public get isConversationOwner(): boolean {\n return UUIDsEqual(this.conversation?.UserID, this.currentUser.ID);\n }\n\n /**\n * Handle suggested response selection\n */\n public onSuggestedResponseSelected(event: {text: string; customInput?: string}): void {\n this.suggestedResponseSelected.emit(event);\n }\n\n /**\n * Get agent response form from message\n * Uses ResponseForm property from MJConversationDetailEntity\n */\n public get responseForm(): AgentResponseForm | null {\n try {\n const rawData = this.message.ResponseForm;\n if (!rawData) {\n return null;\n }\n\n // Parse JSON string to AgentResponseForm object\n const form = JSON.parse(rawData);\n\n return form || null;\n } catch (error) {\n console.error('Failed to parse response form:', error, 'Raw data:', this.message.ResponseForm);\n return null;\n }\n }\n\n /**\n * Get actionable commands from message\n * Uses ActionableCommands property from MJConversationDetailEntity\n */\n public get actionableCommands(): ActionableCommand[] {\n try {\n const rawData = this.message.ActionableCommands;\n if (!rawData) return [];\n\n // Parse JSON string to array of ActionableCommand objects\n const commands = JSON.parse(rawData);\n return Array.isArray(commands) ? commands : [];\n } catch (error) {\n console.error('Failed to parse actionable commands:', error);\n return [];\n }\n }\n\n /**\n * Handle agent response form submission\n * Converts form data to the new @{_mode:\"form\",...} format\n */\n public onFormSubmitted(formData: Record<string, any>): void {\n const form = this.responseForm;\n if (!form) {\n console.error('No response form available for submission');\n return;\n }\n\n // Build fields array with proper labels and type metadata\n const fields = Object.entries(formData).map(([questionId, value]) => {\n const question = form.questions.find(q => q.id === questionId);\n const questionType = typeof question?.type === 'string' ? question.type : question?.type?.type;\n\n // Look up display value for choice types (buttongroup, radio, dropdown, checkbox)\n const displayValue = this.getChoiceDisplayValue(question, value);\n\n return {\n name: questionId,\n value: value,\n label: question?.label || questionId,\n type: questionType, // Include type for proper formatting\n displayValue: displayValue // Include friendly display text for choice fields\n };\n });\n\n // Create formatted message using ConversationUtility\n const formMessage = ConversationUtility.CreateFormResponse(\n 'formSubmit', // Generic action name\n fields,\n form.title\n );\n\n // Emit the formatted message\n this.suggestedResponseSelected.emit({\n text: formMessage,\n customInput: undefined // No longer needed with new format\n });\n }\n\n /**\n * Handle actionable command execution\n */\n public async onCommandExecuted(command: ActionableCommand): Promise<void> {\n try {\n await this.uiCommandHandler.executeActionableCommand(command);\n } catch (error) {\n console.error('Failed to execute command:', command, error);\n }\n }\n\n /**\n * Execute automatic commands when message loads\n * This is called after a message with automatic commands is received\n */\n private async executeAutomaticCommands(): Promise<void> {\n try {\n if (!this.isLastMessage)\n return; // we only do this when the message is the last one in the conversation\n\n // TODO - IMPORTANT\n // BELOW, after doing the commands,\n // we need to mark the message as haveing completed its automatic commands to avoid re-running on reload\n\n\n // For now, check if the property exists (will be added to schema)\n const rawData = (this.message as any).AutomaticCommands;\n if (!rawData) return;\n\n // Parse JSON string to array of AutomaticCommand objects\n const commands: AutomaticCommand[] = JSON.parse(rawData);\n if (Array.isArray(commands) && commands.length > 0) {\n await this.uiCommandHandler.executeAutomaticCommands(commands);\n }\n } catch (error) {\n console.error('Failed to execute automatic commands:', error);\n }\n }\n\n /**\n * Get the display value for choice-type questions (buttongroup, radio, dropdown, checkbox)\n * This looks up the option's label based on the selected value\n */\n private getChoiceDisplayValue(question: FormQuestion | undefined, value: string | number | boolean | string[]): string | undefined {\n if (!question) return undefined;\n\n // Get the question type object\n const typeObj = question.type;\n if (typeof typeObj === 'string') return undefined;\n\n // Check if it's a choice type with options\n const choiceTypes = ['buttongroup', 'radio', 'dropdown', 'checkbox'];\n if (!choiceTypes.includes(typeObj.type)) return undefined;\n\n const choiceType = typeObj as ChoiceQuestionType;\n if (!choiceType.options || choiceType.options.length === 0) return undefined;\n\n // Handle array values (checkbox with multiple selections)\n if (Array.isArray(value)) {\n const labels = value.map(v => {\n const option = choiceType.options.find(opt => opt.value === v);\n return option?.label || String(v);\n });\n return labels.join(', ');\n }\n\n // Handle single value\n const option = choiceType.options.find(opt => opt.value === value);\n return option?.label;\n }\n\n}","<div [class]=\"messageClasses\" [attr.data-message-id]=\"message.ID\" (click)=\"onMessageBubbleClick($event)\">\n <div class=\"message-avatar\">\n <div class=\"avatar-circle\" [class.ai-avatar]=\"isAIMessage\" [class.user-avatar]=\"isUserMessage\">\n @if (isUserMessage) {\n @if (userAvatarUrl) {\n <img [src]=\"userAvatarUrl\" alt=\"User avatar\" class=\"avatar-image\" />\n } @else if (userAvatarIconClass) {\n <i [class]=\"userAvatarIconClass\"></i>\n } @else {\n <i class=\"fas fa-user\"></i>\n }\n } @else if (isAIMessage) {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\n </div>\n </div>\n\n <div class=\"message-content\">\n <div class=\"message-header\">\n <span class=\"message-sender\" [title]=\"isAIMessage ? (aiAgentInfo?.role || 'AI Assistant') : ''\">\n {{ isAIMessage ? (aiAgentInfo?.name || 'AI Assistant') : messageSenderName }}\n </span>\n <span class=\"message-time\">{{ message.__mj_CreatedAt | date:'short' }}</span>\n\n <!-- Status indicator for user messages -->\n @if (isUserMessage && messageStatus !== 'Complete') {\n <span class=\"message-status\" [class.error]=\"messageStatus === 'Error'\">\n <i class=\"fas\" [ngClass]=\"messageStatus === 'Error' ? 'fa-exclamation-triangle' : 'fa-circle-notch fa-spin'\"></i>\n <span class=\"status-text\">{{ getStatusText() }}</span>\n </span>\n }\n\n <!-- Time pill - shows for AI messages in all states (in-progress, active, complete, failed) -->\n @if (!isUserMessage && timePillText) {\n <span\n class=\"time-pill\"\n [class.in-progress]=\"isInProgressAIMessage\"\n [class.active]=\"!isInProgressAIMessage && isAgentRunActive\"\n [class.complete]=\"!isInProgressAIMessage && !isAgentRunActive && messageStatus === 'Complete'\"\n [class.failed]=\"messageStatus === 'Error'\">\n <i class=\"fas fa-clock\"></i>\n {{ timePillText }}\n </span>\n }\n\n <!-- Test feedback icon (appears for test runs only) -->\n @if (message.TestRunID) {\n <span\n class=\"test-feedback-icon\"\n (click)=\"onTestFeedbackClick()\"\n title=\"Provide Test Feedback\">\n <i class=\"fas fa-flask\"></i>\n </span>\n }\n\n <!-- Agent run icon (clickable to expand details) - always rightmost when present -->\n @if (hasAgentRun) {\n <span\n class=\"agent-run-icon\"\n (click)=\"toggleAgentDetails()\"\n [class.expanded]=\"isAgentDetailsExpanded\"\n [title]=\"hasRatings() ? 'Agent details & ' + getRatingCount() + ' rating(s)' : 'Click to view agent execution details'\">\n <i class=\"fas fa-cog\"></i>\n @if (hasRatings()) {\n <span class=\"rating-badge\">{{ getRatingCount() }}</span>\n }\n </span>\n }\n </div>\n\n <div class=\"message-body\">\n @if (!isEditing) {\n <div class=\"message-text\">\n <mj-markdown [data]=\"displayMessage\" [enableCollapsibleHeadings]=\"true\"></mj-markdown>\n @if (isMessageEdited) {\n <span class=\"edited-badge\">(edited)</span>\n }\n </div>\n\n <!-- Message Attachments -->\n @if (hasAttachments) {\n <div class=\"message-attachments\">\n @for (attachment of attachments; track attachment.id) {\n @if (attachment.type === 'Image') {\n <div class=\"attachment-item image-attachment\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'Image attachment'\">\n <img\n [src]=\"attachment.thumbnailUrl || attachment.contentUrl\"\n [alt]=\"attachment.fileName || 'Image attachment'\"\n class=\"attachment-thumbnail\"\n loading=\"lazy\">\n <div class=\"attachment-overlay\">\n <i class=\"fas fa-expand\"></i>\n </div>\n </div>\n } @else {\n <div class=\"attachment-strip\"\n [class.is-artifact]=\"!!attachment.artifactTypeName\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'File'\">\n <div class=\"attachment-badge\">{{ badgeTextFor(attachment) }}</div>\n <div class=\"attachment-meta\">\n <span class=\"file-name\">{{ attachment.fileName || 'File' }}</span>\n <span class=\"file-size\">{{ formatFileSize(attachment.sizeBytes) }}</span>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Artifact Message Card -->\n @if (hasArtifact && artifact && artifactVersion) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"isSystemArtifact\">\n <mj-artifact-message-card\n [artifactId]=\"artifact.ID\"\n [artifact]=\"artifact\"\n [artifactVersion]=\"artifactVersion\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- Suggested Responses (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && suggestedResponses.length > 0) {\n <mj-suggested-responses\n [suggestedResponses]=\"suggestedResponses\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (responseSelected)=\"onSuggestedResponseSelected($event)\">\n </mj-suggested-responses>\n }\n\n <!-- Agent Response Form (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && responseForm) {\n <mj-dynamic-form\n [FormDefinition]=\"responseForm\"\n [Disabled]=\"isProcessing\"\n (FormSubmitted)=\"onFormSubmitted($event)\">\n </mj-dynamic-form>\n }\n\n <!-- Actionable Commands (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && actionableCommands.length > 0) {\n <mj-actionable-commands\n [commands]=\"actionableCommands\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (commandExecuted)=\"onCommandExecuted($event)\">\n </mj-actionable-commands>\n }\n }\n\n @if (isEditing) {\n <div class=\"message-edit-container\">\n <textarea\n class=\"message-edit-textarea\"\n [(ngModel)]=\"editedText\"\n (keydown)=\"onEditKeydown($event)\"\n rows=\"4\"\n placeholder=\"Edit your message...\"></textarea>\n <div class=\"edit-actions\">\n <button class=\"edit-action-btn save\" (click)=\"saveEdit()\">\n <i class=\"fas fa-check\"></i>\n Save\n </button>\n <button class=\"edit-action-btn cancel\" (click)=\"cancelEditing()\">\n <i class=\"fas fa-times\"></i>\n Cancel\n </button>\n </div>\n <div class=\"edit-hint\">\n Press Enter to save, Shift+Enter for new line, Escape to cancel\n </div>\n </div>\n }\n </div>\n\n <!-- Message Footer: only rendered on the last message.\n Non-last messages have no footer — pin/delete/rating live in the gear panel. -->\n @if (!isEditing && isLastMessage && (isConversationOwner || (isAIMessage && messageStatus === 'Complete'))) {\n <div class=\"message-footer\">\n @if (isConversationOwner) {\n <button class=\"action-bar-btn danger inline-delete\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (isAIMessage && messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n <!-- Thumbs visible inline only on the latest AI message, left of pin -->\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\">\n </mj-conversation-message-rating>\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Agent details content section -->\n <div class=\"agent-details-section\">\n <!-- Agent Run Details Panel (expandable) -->\n @if (isAgentDetailsExpanded && hasAgentRun) {\n <!-- Agent Run Details Panel -->\n <div class=\"agent-details-panel\">\n @if (agentRun) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ aiAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <div class=\"agent-details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Run ID:</span>\n <span class=\"detail-value\">\n <a class=\"run-id-link\" (click)=\"openAgentRunRecord()\" title=\"Open agent run details\">\n {{ agentRun.ID }}\n <i class=\"fas fa-external-link-alt\"></i>\n </a>\n </span>\n </div>\n\n @if (agentRunStepCount > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Steps:</span>\n <span class=\"detail-value\">{{ agentRunStepCount }}</span>\n </div>\n }\n\n @if (agentRunTotalTokens > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tokens:</span>\n <span class=\"detail-value\">{{ formatNumber(agentRunTotalTokens) }}</span>\n </div>\n }\n\n @if (agentRunTotalCost > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Cost:</span>\n <span class=\"detail-value\">\\${{ agentRunTotalCost.toFixed(4) }}</span>\n </div>\n }\n\n @if (agentRun.Status) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Status:</span>\n <span class=\"detail-value status-badge\" [class]=\"'status-' + agentRun.Status.toLowerCase()\">\n {{ agentRun.Status }}\n </span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Delete + Rating + Pin in gear panel for non-last messages — mirrors last-message footer layout -->\n @if (!isLastMessage) {\n <div class=\"agent-panel-actions\">\n @if (isConversationOwner) {\n <button class=\"action-bar-btn danger\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\">\n </mj-conversation-message-rating>\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n </div>\n } @else {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Tasks Section -->\n @if (detailTasks.length > 0) {\n <div class=\"agent-details-tasks\">\n <div class=\"tasks-section-header\">\n <i class=\"fas fa-tasks\"></i>\n <span>Associated Tasks ({{ detailTasks.length }})</span>\n </div>\n <div class=\"tasks-list\">\n @for (task of detailTasks; track task) {\n <mj-task-widget\n [task]=\"task\"\n [compact]=\"false\"\n [clickable]=\"false\"\n [showProgress]=\"true\"\n [showDuration]=\"true\">\n </mj-task-widget>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Rating component moved to message footer (lines 113-134) -->\n\n <!-- Removed message-actions hover panel - actions now in gear icon dropdown -->\n <!-- Retry button kept for critical error recovery on failed messages -->\n @if (messageStatus === 'Error' && isAIMessage && !isProcessing && !isEditing) {\n <div class=\"message-actions\">\n <button class=\"message-action-btn retry-btn\" (click)=\"onRetryClick()\" title=\"Retry\">\n <i class=\"fas fa-redo\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Reaction Buttons -->\n @if (!isProcessing && !isInProgressAIMessage && !isEditing) {\n <div class=\"message-reactions\">\n <button class=\"reaction-btn\" (click)=\"toggleReaction('like')\">\n <i class=\"far fa-thumbs-up\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n <button class=\"reaction-btn\" (click)=\"toggleReaction('comment')\">\n <i class=\"far fa-comment\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n </div>\n }\n </div>\n</div>"]}
1
+ {"version":3,"file":"message-item.component.js","sourceRoot":"","sources":["../../../../src/lib/components/message/message-item.component.ts","../../../../src/lib/components/message/message-item.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ChangeDetectorRef,\n OnDestroy,\n AfterViewInit,\n OnInit,\n OnChanges,\n SimpleChanges,\n DoCheck\n} from '@angular/core';\nimport { MJConversationDetailEntity, MJConversationEntity, MJArtifactEntity, MJArtifactVersionEntity, MJTaskEntity, RatingJSON } from '@memberjunction/core-entities';\nimport { UserInfo, RunView, CompositeKey, KeyValuePair } from '@memberjunction/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { AgentResponseForm, FormQuestion, ChoiceQuestionType, ActionableCommand, AutomaticCommand, ConversationUtility, MJAIAgentRunEntityExtended } from '@memberjunction/ai-core-plus';\nimport { FormResponseUtils } from '@memberjunction/ng-forms';\nimport { MentionParserService } from '../../services/mention-parser.service';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { SuggestedResponse } from '../../models/conversation-state.model';\nimport { UICommandHandlerService } from '../../services/ui-command-handler.service';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { BadgeTextForAttachment } from '../../util/attachment-badge';\n\n/**\n * Represents an attachment on a message for display\n */\nexport interface MessageAttachment {\n id: string;\n type: 'Image' | 'Video' | 'Audio' | 'Document';\n mimeType: string;\n fileName: string | null;\n sizeBytes: number;\n width?: number;\n height?: number;\n thumbnailUrl?: string;\n contentUrl?: string;\n /** Source of the attachment: 'upload' for chat uploads, 'artifact' for artifact picker */\n source?: 'upload' | 'artifact';\n /** For source='artifact': the underlying MJArtifact.ID so clicks can open the viewer. */\n artifactId?: string;\n /** For source='artifact': the underlying MJArtifactVersion.ID. */\n artifactVersionId?: string;\n /** For source='artifact': resolved MJArtifactType.Name, e.g. \"Data Snapshot\". Drives the type badge. */\n artifactTypeName?: string;\n}\n\n/**\n * Component for displaying a single message in a conversation\n * Follows the dynamic rendering pattern from skip-chat for optimal performance\n * This component is created dynamically via ViewContainerRef.createComponent()\n */\n@Component({\n standalone: false,\n selector: 'mj-conversation-message-item',\n templateUrl: './message-item.component.html',\n styleUrls: [\n './message-item.component.css',\n '../../styles/custom-agent-icons.css'\n ]\n})\nexport class MessageItemComponent extends BaseAngularComponent implements OnInit, AfterViewInit, OnDestroy, OnChanges, DoCheck {\n @Input() public message!: MJConversationDetailEntity;\n @Input() public conversation!: MJConversationEntity | null;\n @Input() public currentUser!: UserInfo;\n @Input() public allMessages!: MJConversationDetailEntity[];\n @Input() public isProcessing: boolean = false;\n @Input() public artifact?: MJArtifactEntity;\n @Input() public artifactVersion?: MJArtifactVersionEntity;\n @Input() public agentRun: MJAIAgentRunEntityExtended | null = null; // Passed from parent, loaded once per conversation\n @Input() public userAvatarMap: Map<string, {imageUrl: string | null; iconClass: string | null}> = new Map();\n @Input() public ratings?: RatingJSON[]; // Pre-loaded ratings from parent (RatingsJSON from query)\n @Input() public isLastMessage: boolean = false; // Whether this is the last message in the conversation\n @Input() public attachments: MessageAttachment[] = []; // Attachments for this message\n\n @Output() public editClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public deleteClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public retryClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public testFeedbackClicked = new EventEmitter<MJConversationDetailEntity>();\n @Output() public artifactClicked = new EventEmitter<{artifactId: string; versionId?: string}>();\n @Output() public artifactActionPerformed = new EventEmitter<{action: string; artifactId: string}>();\n @Output() public messageEdited = new EventEmitter<MJConversationDetailEntity>();\n @Output() public openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() public suggestedResponseSelected = new EventEmitter<{text: string; customInput?: string}>();\n @Output() public attachmentClicked = new EventEmitter<MessageAttachment>();\n @Output() public diagnosticRequested = new EventEmitter<string>(); // emits messageId on Shift+Click\n @Output() public messagePinToggled = new EventEmitter<MJConversationDetailEntity>();\n\n private _loadTime: number = Date.now();\n private _elapsedTimeInterval: any = null;\n public _elapsedTimeFormatted: string = '0:00';\n public _agentRunDurationFormatted: string = '0:00';\n public isEditing: boolean = false;\n public editedText: string = '';\n private originalText: string = '';\n\n // Track previous status for DoCheck comparison\n private _previousMessageStatus: 'Complete' | 'In-Progress' | 'Error' | undefined = undefined;\n\n /**\n * Cached values updated in ngDoCheck so they stay stable through Angular's\n * dev-mode verify pass. The underlying message entity properties (Status,\n * Message) can mutate between the check and verify passes (e.g., from\n * WebSocket streaming updates), which causes ExpressionChangedAfterItHasBeenCheckedError\n * if templates read the live properties directly.\n */\n private _messageClasses: string = 'message-item';\n private _stableDisplayMessage: string = '';\n private _stableIsInProgressAIMessage: boolean = false;\n\n // Agent run details\n public isAgentDetailsExpanded: boolean = false;\n public detailTasks: MJTaskEntity[] = [];\n private tasksLoaded: boolean = false;\n\n // Memoization for mention parsing to prevent repeated parsing on change detection\n private _cachedDisplayMessage: string = '';\n private _cachedMessageText: string = '';\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private mentionParser: MentionParserService,\n private mentionAutocomplete: MentionAutocompleteService,\n private uiCommandHandler: UICommandHandlerService\n ) {\n super();\n }\n\n async ngOnInit() {\n // AIEngineBase is deferred at startup; kick off the load early so the\n // template-bound aiAgentInfo getter finds populated .Agents data when\n // change detection asks for it. Fire-and-forget — the getter falls back\n // to defaults until it's loaded.\n AIEngineBase.Instance.EnsureLoaded();\n\n // Execute automatic commands if present\n await this.executeAutomaticCommands();\n }\n\n ngOnChanges(_changes: SimpleChanges) {\n // No longer need to manage timer for agentRun changes\n // Parent's 1-second timer + agentRunDuration getter handles all agent run timing\n // Component's timer only runs for temporary messages (handled in ngAfterViewInit)\n }\n\n /**\n * DoCheck lifecycle hook - detects changes to message properties\n * This runs on every change detection cycle, so we check if Status actually changed\n * This is more reliable than ngOnChanges when the message object reference doesn't change\n */\n ngDoCheck() {\n if (!this.message) {\n return;\n }\n\n const currentStatus = this.message.Status;\n\n // Check if status changed from non-Complete to Complete\n if (this._previousMessageStatus !== 'Complete' && currentStatus === 'Complete') {\n // Stop the elapsed time interval\n if (this._elapsedTimeInterval !== null) {\n clearInterval(this._elapsedTimeInterval);\n this._elapsedTimeInterval = null;\n }\n\n // Force immediate synchronous change detection for dynamically created components\n // markForCheck() only schedules a check which may not run for dynamic components\n // detectChanges() forces immediate view update so UI shows timer stopped right away\n this.cdRef.detectChanges();\n }\n\n // Update previous status for next check\n this._previousMessageStatus = currentStatus;\n\n // Rebuild cached values so they're stable during Angular's check/verify cycle.\n // ngDoCheck runs once per CD pass but NOT during the dev-mode verify pass, so\n // snapshotting here produces values that don't change between the two reads.\n this._messageClasses = this.buildMessageClasses();\n this._stableIsInProgressAIMessage = this.isAIMessage && currentStatus === 'In-Progress';\n this._stableDisplayMessage = this.computeDisplayMessage();\n }\n\n ngAfterViewInit() {\n // Use message creation timestamp if available (for reconnecting to in-progress messages)\n // Otherwise use current time for brand new messages\n if (this.message?.__mj_CreatedAt) {\n this._loadTime = new Date(this.message.__mj_CreatedAt).getTime();\n } else {\n this._loadTime = Date.now();\n }\n this.startElapsedTimeUpdater();\n this.cdRef.detectChanges();\n }\n\n ngOnDestroy() {\n if (this._elapsedTimeInterval !== null) {\n clearInterval(this._elapsedTimeInterval);\n this._elapsedTimeInterval = null;\n }\n }\n\n /**\n * Handles clicks on the message bubble.\n * Shift+Click on any AI message emits a diagnosticRequested event so the parent\n * can dump live streaming state to the browser console — useful for debugging\n * stuck or forever-spinning conversations without any code changes.\n */\n public onMessageBubbleClick(event: MouseEvent): void {\n if (!event.shiftKey || !this.isAIMessage) return;\n event.preventDefault();\n event.stopPropagation();\n this.diagnosticRequested.emit(this.message.ID);\n }\n\n /**\n * Starts the elapsed time updater interval for temporary messages only\n * For agent runs with IDs, the parent's timer + agentRunDuration getter handles updates\n * Updates every second for temporary messages that use _elapsedTimeFormatted\n */\n private startElapsedTimeUpdater(): void {\n // Start timer for temporary messages (in-progress, no ID) OR active agent runs\n // Both need periodic updates to _elapsedTimeFormatted / _agentRunDurationFormatted\n if (this.isInProgressAIMessage || this.isAgentRunActive) {\n // Initial update\n this.updateTimers();\n this.cdRef.markForCheck();\n\n // Start interval if not already running\n if (this._elapsedTimeInterval === null) {\n this._elapsedTimeInterval = setInterval(() => {\n this.updateTimers();\n // Use detectChanges to force immediate synchronous view update\n // markForCheck only schedules a check which may not happen if parent already checked\n this.cdRef.detectChanges();\n }, 1000);\n }\n }\n }\n\n /**\n * Update all timer displays\n * Called every second by the interval timer\n */\n private updateTimers(): void {\n // Update temporary message elapsed time\n if (this.isInProgressAIMessage) {\n this._elapsedTimeFormatted = this.formatElapsedTime(this.elapsedTimeSinceLoad);\n }\n\n // Update agent run duration for active runs\n if (this.isAgentRunActive && this.agentRun?.__mj_CreatedAt) {\n const createdAt = new Date(this.agentRun.__mj_CreatedAt);\n const now = new Date();\n const diffMs = now.getTime() - createdAt.getTime();\n this._agentRunDurationFormatted = this.formatDurationFromMs(diffMs);\n }\n }\n\n private formatElapsedTime(elapsedTime: number): string {\n let seconds = Math.floor(elapsedTime / 1000);\n let minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n let hours = Math.floor(minutes / 60);\n minutes = minutes % 60;\n let formattedTime = (hours > 0 ? hours + ':' : '') +\n (minutes < 10 && hours > 0 ? '0' : '') + minutes + ':' +\n (seconds < 10 ? '0' : '') + seconds;\n return formattedTime;\n }\n\n private formatDurationFromMs(diffMs: number): string {\n if (diffMs <= 0) {\n return '0:00';\n }\n\n let seconds = Math.floor(diffMs / 1000);\n let minutes = Math.floor(seconds / 60);\n seconds = seconds % 60;\n let hours = Math.floor(minutes / 60);\n minutes = minutes % 60;\n let formattedTime = (hours > 0 ? hours + ':' : '') +\n (minutes < 10 && hours > 0 ? '0' : '') + minutes + ':' +\n (seconds < 10 ? '0' : '') + seconds;\n return formattedTime;\n }\n\n public get elapsedTimeSinceLoad(): number {\n return Date.now() - this._loadTime;\n }\n\n public get isAIMessage(): boolean {\n return this.message.Role?.trim().toLowerCase() === 'ai';\n }\n\n public get aiAgentInfo(): { name: string; iconClass: string; role: string } | null {\n if (!this.isAIMessage) return null;\n\n // Get agent ID from denormalized field (populated when message is created)\n const agentID = (this.message as any).AgentID;\n\n // Look up agent from AIEngineBase cache\n if (agentID && AIEngineBase.Instance?.Agents) {\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, agentID));\n if (agent) {\n return {\n name: agent.Name || 'AI Assistant',\n iconClass: agent.IconClass || 'fa-robot',\n role: agent.Description || 'AI Assistant'\n };\n } else {\n // Only log if the message is complete (should have AgentID by then)\n if (this.message.Status === 'Complete') {\n console.warn('⚠️ Agent not found in cache for ID:', agentID);\n }\n }\n }\n // Note: In-progress messages won't have AgentID yet, so we don't log warnings for them\n\n // Default fallback for AI messages without agent info\n return {\n name: 'AI Assistant',\n iconClass: 'fa-robot',\n role: 'AI Assistant'\n };\n }\n\n public get isUserMessage(): boolean {\n return this.message.Role?.trim().toLowerCase() === 'user';\n }\n\n /**\n * Get the actual sender name for user messages\n * Uses the denormalized User field from the view if available,\n * otherwise falls back to current user name\n */\n public get messageSenderName(): string {\n // Use the denormalized User field from the ConversationDetail view\n // This is populated from the UserID (if present) or falls back to Conversation.UserID\n if (this.message.User) {\n return this.message.User;\n }\n\n // Fallback to current user name (for backwards compatibility)\n return this.currentUser.Name;\n }\n\n /**\n * Get the user's avatar image URL from the userAvatarMap\n * Uses fast O(1) lookup by UserID\n */\n public get userAvatarUrl(): string | null {\n if (!this.isUserMessage || !this.message.UserID) {\n return null;\n }\n const avatarData = this.userAvatarMap.get(this.message.UserID);\n return avatarData?.imageUrl || null;\n }\n\n /**\n * Get the user's avatar icon class from the userAvatarMap\n * Uses fast O(1) lookup by UserID\n */\n public get userAvatarIconClass(): string | null {\n if (!this.isUserMessage || !this.message.UserID) {\n return null;\n }\n const avatarData = this.userAvatarMap.get(this.message.UserID);\n return avatarData?.iconClass || null;\n }\n\n public get isConversationManager(): boolean {\n return this.aiAgentInfo?.name === 'Sage';\n }\n\n public get displayMessage(): string {\n return this._stableDisplayMessage;\n }\n\n /**\n * Computes the display message from the current message text. Called from\n * ngDoCheck to snapshot the value; templates read _stableDisplayMessage.\n */\n private computeDisplayMessage(): string {\n let text = this.message.Message || '';\n\n // For Sage, only show the delegation line (starts with emoji)\n if (this.isConversationManager && text) {\n const delegationMatch = text.match(/🤖.*Delegating to.*Agent.*/);\n if (delegationMatch) {\n text = delegationMatch[0];\n }\n }\n\n // Use cached result if message text hasn't changed (avoids re-parsing mentions)\n if (this._cachedMessageText === text && this._cachedDisplayMessage) {\n return this._cachedDisplayMessage;\n }\n\n // Transform @mentions to HTML pills\n const transformed = this.transformMentionsToHTML(text);\n\n // Cache the result\n this._cachedMessageText = text;\n this._cachedDisplayMessage = transformed;\n\n return transformed;\n }\n\n /**\n * Transform @mentions in text to HTML badge elements\n * Supports both JSON format (@{type:\"agent\",id:\"uuid\",...}) and legacy text format (@AgentName)\n * Uses inline HTML that markdown will preserve\n */\n private transformMentionsToHTML(text: string): string {\n if (!text) return '';\n\n // Get available agents and users for name/icon lookup\n const agents = this.mentionAutocomplete.getAvailableAgents();\n const users = this.mentionAutocomplete.getAvailableUsers();\n\n // Parse all @{...} tokens\n const tokens = ConversationUtility.ParseSpecialContent(text);\n if (tokens.length === 0) return text; // No tokens found, return original text\n\n // Replace tokens in reverse order to maintain indices\n let result = text;\n for (let i = tokens.length - 1; i >= 0; i--) {\n const token = tokens[i];\n let html = '';\n\n switch (token.mode) {\n case 'mention':\n html = this.renderMentionHTML(token.content as any, agents, users);\n break;\n case 'form':\n html = this.renderFormHTML(token.content as any);\n break;\n default:\n // Unknown mode, leave original text as-is\n html = token.originalText;\n }\n\n result = result.substring(0, token.startIndex) + html + result.substring(token.endIndex);\n }\n\n return result;\n }\n\n private renderMentionHTML(content: any, agents: any[], users: any[]): string {\n let name = content.name;\n let iconClass = '';\n let logoURL = '';\n let configPresetName = '';\n\n // Look up actual name and icon if ID provided\n if (content.type === 'agent' && agents) {\n const agent = agents.find(a => UUIDsEqual(a.ID, content.id));\n if (agent) {\n name = agent.Name;\n iconClass = agent.IconClass || '';\n logoURL = agent.LogoURL || '';\n\n // Check for configuration preset (only show if non-default)\n if (content.configId && AIEngineBase.Instance) {\n const presets = AIEngineBase.Instance.GetAgentConfigurationPresets(content.id, true);\n if (presets && presets.length > 0) {\n const defaultPreset = presets.find(p => p.IsDefault) || presets[0];\n const isNonDefault = content.configId !== defaultPreset?.ID;\n\n // Only include preset name if it's not the default\n if (isNonDefault && content.config) {\n configPresetName = content.config;\n }\n }\n }\n }\n } else if (content.type === 'user' && users) {\n const user = users.find(u => UUIDsEqual(u.ID, content.id));\n if (user) name = user.Name;\n }\n\n const escapedName = this.escapeHtml(name);\n const typeClass = content.type === 'agent' ? 'agent' : 'user';\n\n // Build preset indicator HTML if present\n const presetIndicator = configPresetName\n ? `<span class=\"preset-indicator\">${this.escapeHtml(configPresetName)}</span>`\n : '';\n\n // Generate HTML based on whether we have an icon\n if (logoURL) {\n return `<span class=\"mention-badge ${typeClass}\"><img src=\"${this.escapeHtml(logoURL)}\" alt=\"\" />${escapedName}${presetIndicator}</span>`;\n } else if (iconClass) {\n return `<span class=\"mention-badge ${typeClass}\"><i class=\"${this.escapeHtml(iconClass)}\" aria-hidden=\"true\"></i>${escapedName}${presetIndicator}</span>`;\n } else {\n return `<span class=\"mention-badge ${typeClass}\">${escapedName}${presetIndicator}</span>`;\n }\n }\n\n private renderFormHTML(content: { title?: string; fields?: Array<{ name?: string; value: unknown; label?: string; type?: string; displayValue?: string }> }): string {\n if (!content.fields || content.fields.length === 0) {\n return FormResponseUtils.EscapeHtml(JSON.stringify(content));\n }\n\n // Filter out fields with empty/null/undefined values (optional fields not provided)\n const nonEmptyFields = content.fields.filter(f => {\n const value = f.value;\n return value != null && value !== '' && !(Array.isArray(value) && value.length === 0);\n });\n\n if (nonEmptyFields.length === 0) {\n return FormResponseUtils.EscapeHtml(JSON.stringify(content));\n }\n\n if (nonEmptyFields.length === 1) {\n // Single field - simple inline pill\n const field = nonEmptyFields[0];\n const value = this.formatFieldValueHtml(field);\n return `<span class=\"form-response-pill single-field\"><i class=\"fa fa-check\" aria-hidden=\"true\"></i>${value}</span>`;\n } else {\n // Multiple fields - vertical question/answer layout\n const title = content.title ? FormResponseUtils.EscapeHtml(content.title) : 'Form Response';\n const fieldsHTML = nonEmptyFields.map(f => {\n const label = FormResponseUtils.EscapeHtml(f.label || f.name || '');\n const value = this.formatFieldValueHtml(f);\n return `<div class=\"pill-field\">\n <div class=\"field-question\">${label}</div>\n <div class=\"field-answer\">${value}</div>\n </div>`;\n }).join('');\n\n return `<div class=\"form-response-pill multi-field\">\n <div class=\"pill-header\">\n <i class=\"fa fa-check-square\" aria-hidden=\"true\"></i>\n ${title}\n </div>\n <div class=\"pill-fields\">${fieldsHTML}</div>\n </div>`;\n }\n }\n\n /**\n * Format a field value for HTML display using the shared FormResponseUtils.\n * This handles the inline-HTML context where values need HTML escaping.\n */\n private formatFieldValueHtml(field: { name?: string; value: unknown; label?: string; type?: string; displayValue?: string }): string {\n if (field.value == null) return '';\n\n // For choice types with displayValue, use it directly\n const choiceTypes = ['buttongroup', 'radio', 'dropdown', 'checkbox'];\n if (field.type && choiceTypes.includes(field.type) && field.displayValue) {\n return FormResponseUtils.EscapeHtml(field.displayValue);\n }\n\n // Delegate type-aware formatting to shared utility (no schema question available here)\n const formatted = FormResponseUtils.FormatValue(field.value, null, field.type || null);\n return FormResponseUtils.EscapeHtml(formatted);\n }\n\n private escapeHtml(text: string): string {\n return FormResponseUtils.EscapeHtml(text);\n }\n\n public get isInProgressAIMessage(): boolean {\n return this._stableIsInProgressAIMessage;\n }\n\n public get isAgentRunActive(): boolean {\n if (!this.agentRun) {\n return false;\n }\n const status = this.agentRun.Status?.toLowerCase();\n return status === 'in-progress' || status === 'running';\n }\n\n public get messageStatus(): 'Complete' | 'In-Progress' | 'Error' {\n return this.message.Status || 'Complete';\n }\n\n public getStatusText(): string {\n switch (this.messageStatus) {\n case 'In-Progress':\n return 'Processing...';\n case 'Error':\n return 'Failed';\n default:\n return '';\n }\n }\n\n public get isFirstMessageInConversation(): boolean {\n return this.allMessages.indexOf(this.message) === 0;\n }\n\n public get isLastMessageInConversation(): boolean {\n return this.allMessages.indexOf(this.message) === this.allMessages.length - 1;\n }\n\n /**\n * Determine if rating component should be shown inline (Option C - Hybrid).\n * Show for latest completed AI message that user hasn't rated yet.\n * For older/already-rated messages, ratings accessible via gear menu.\n */\n public shouldShowRating(): boolean {\n // Must be an AI message\n if (!this.isAIMessage) return false;\n\n // Must be completed (not in progress or failed)\n if (this.messageStatus !== 'Complete') return false;\n\n // Must not be editing\n if (this.isEditing) return false;\n\n // Must be the last message in conversation\n if (!this.isLastMessageInConversation) return false;\n\n // Check if current user has already rated this message\n if (this.ratings && this.ratings.length > 0) {\n const currentUserId = this.currentUser?.ID;\n const userHasRated = this.ratings.some(r => UUIDsEqual(r.UserID, currentUserId));\n\n // If user already rated, don't show inline (accessible via gear menu)\n if (userHasRated) return false;\n }\n\n // Show inline rating for latest completed AI message not yet rated by user\n return true;\n }\n\n /**\n * Check if message has any ratings (for gear icon badge)\n */\n public hasRatings(): boolean {\n return !!(this.ratings && this.ratings.length > 0);\n }\n\n /**\n * Get rating count for badge display on gear icon\n */\n public getRatingCount(): number {\n return this.ratings?.length || 0;\n }\n\n /**\n * Get thumbs up count (ratings >= 8)\n */\n public getThumbsUpCount(): number {\n return this.ratings?.filter(r => r.Rating ? r.Rating >= 8 : false).length || 0;\n }\n\n /**\n * Get thumbs down count (ratings <= 3)\n */\n public getThumbsDownCount(): number {\n return this.ratings?.filter(r => r.Rating ? r.Rating <= 3 : false).length || 0;\n }\n\n /**\n * Determine if pin/delete actions should show inline (with rating buttons).\n * Show for latest completed AI message that user hasn't rated yet.\n */\n public shouldShowInlineActions(): boolean {\n // Same logic as shouldShowRating - latest unrated message\n return this.shouldShowRating();\n }\n\n public get hasArtifact(): boolean {\n return !!this.artifactVersion;\n }\n\n /**\n * Check if the artifact is a system-only artifact\n */\n public get isSystemArtifact(): boolean {\n return this.artifact?.Visibility === 'System Only';\n }\n\n /**\n * Unified time pill text for all AI message states\n * Returns the appropriate time display based on message state:\n * - Temporary messages (in-progress): Live elapsed time\n * - Active agent runs: Live agent run duration (calculated on-demand)\n * - Completed messages: Final generation time\n * - Failed messages: Time before failure\n */\n public get timePillText(): string | null {\n return this.calculateTimePillText();\n }\n\n private calculateTimePillText(): string | null {\n if (this.isUserMessage) {\n return null;\n }\n\n // For temporary messages (in-progress), show live elapsed time\n if (this.isInProgressAIMessage) {\n return this._elapsedTimeFormatted;\n }\n\n // For active agent runs, calculate live duration from agentRun timestamps\n // This getter recalculates every time using new Date(), so it updates smoothly\n if (this.isAgentRunActive && this.agentRun?.__mj_CreatedAt) {\n return this.agentRunDuration;\n }\n\n // For completed/failed messages with an agent run, use agentRun timestamps.\n // These are set when the run finishes and never change, so pin/edit saves on the\n // message entity cannot corrupt the displayed duration.\n if (this.agentRun?.__mj_CreatedAt && this.agentRun?.__mj_UpdatedAt) {\n return this.agentRunDuration;\n }\n\n // No agent run — fall back to message entity timestamps\n return this.formattedGenerationTime;\n }\n\n public get formattedGenerationTime(): string | null {\n // Only show generation time for AI messages\n if (this.isUserMessage || !this.message.__mj_CreatedAt || !this.message.__mj_UpdatedAt) {\n return null;\n }\n\n // Calculate generation time from created -> updated timestamps\n const createdAt = new Date(this.message.__mj_CreatedAt);\n const updatedAt = new Date(this.message.__mj_UpdatedAt);\n const diffMs = updatedAt.getTime() - createdAt.getTime();\n\n // If no time difference, don't show (e.g., not yet completed)\n if (diffMs <= 0) {\n return null;\n }\n\n const seconds = diffMs / 1000;\n\n if (seconds < 1) {\n return `${Math.round(diffMs)}ms`;\n } else if (seconds < 60) {\n return `${seconds.toFixed(1)}s`;\n } else {\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}m ${secs}s`;\n }\n }\n\n /**\n * Returns the cached CSS class string. Updated in ngDoCheck so the value\n * is stable within a single change detection cycle, preventing\n * ExpressionChangedAfterItHasBeenCheckedError.\n */\n public get messageClasses(): string {\n return this._messageClasses;\n }\n\n private buildMessageClasses(): string {\n const classes: string[] = ['message-item'];\n if (this.isAIMessage) {\n classes.push('ai-message');\n if (this.isInProgressAIMessage) {\n classes.push('in-progress');\n }\n } else if (this.isUserMessage) {\n classes.push('user-message');\n }\n if (this.message?.IsPinned) {\n classes.push('pinned');\n }\n if (this.isEditing) {\n classes.push('editing');\n }\n return classes.join(' ');\n }\n\n public get isMessageEdited(): boolean {\n // Only show edited badge if user actually edited the message content\n // The OriginalMessageChanged flag is set server-side when the Message field changes on update\n if (!this.isUserMessage) {\n return false;\n }\n return this.message.OriginalMessageChanged === true;\n }\n\n public onEditClick(): void {\n if (!this.isProcessing && !this.isEditing) {\n this.startEditing();\n }\n }\n\n public startEditing(): void {\n this.originalText = this.message.Message || '';\n this.editedText = this.originalText;\n this.isEditing = true;\n\n // Focus textarea after Angular renders it\n Promise.resolve().then(() => {\n const textarea = document.querySelector('.message-edit-textarea') as HTMLTextAreaElement;\n if (textarea) {\n textarea.focus();\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n }\n this.cdRef.detectChanges();\n });\n }\n\n public cancelEditing(): void {\n this.isEditing = false;\n this.editedText = '';\n this.originalText = '';\n this.cdRef.detectChanges();\n }\n\n public async saveEdit(): Promise<void> {\n if (!this.editedText.trim() || this.editedText === this.originalText) {\n this.cancelEditing();\n return;\n }\n\n try {\n // Update the message entity\n this.message.Message = this.editedText;\n const saveResult = await this.message.Save();\n\n if (saveResult) {\n this.isEditing = false;\n this.editedText = '';\n this.originalText = '';\n // Invalidate display message cache since message changed\n this._cachedMessageText = '';\n this._cachedDisplayMessage = '';\n this.messageEdited.emit(this.message);\n this.cdRef.detectChanges();\n } else {\n console.error('Failed to save message edit');\n alert('Failed to save message. Please try again.');\n }\n } catch (error) {\n console.error('Error saving message edit:', error);\n alert('Error saving message. Please try again.');\n }\n }\n\n public onEditKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancelEditing();\n } else if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.saveEdit();\n }\n }\n\n public onDeleteClick(): void {\n if (!this.isProcessing) {\n this.deleteClicked.emit(this.message);\n }\n }\n\n public async PinMessage(): Promise<void> {\n // Optimistic update — toggle immediately so the UI responds at once\n const previousValue = this.message.IsPinned;\n this.message.IsPinned = !previousValue;\n this.cdRef.detectChanges();\n\n const saved = await this.message.Save();\n if (!saved) {\n // Revert on failure\n this.message.IsPinned = previousValue;\n this.cdRef.detectChanges();\n console.error('Failed to save pin state for message', this.message.ID);\n } else {\n // Notify parent so it can patch the conversation cache in-place.\n // Without this, navigating away and back rebuilds entities from stale cache data,\n // causing the pin state to appear lost until the next full page reload.\n this.messagePinToggled.emit(this.message);\n }\n }\n\n public onTestFeedbackClick(): void {\n if (!this.isProcessing) {\n this.testFeedbackClicked.emit(this.message);\n }\n }\n\n public onRetryClick(): void {\n if (!this.isProcessing && this.messageStatus === 'Error') {\n this.retryClicked.emit(this.message);\n }\n }\n\n public onArtifactClick(): void {\n if (this.hasArtifact && this.artifact) {\n this.artifactClicked.emit({\n artifactId: this.artifact.ID,\n versionId: this.artifactVersion?.ID\n });\n }\n }\n\n public onArtifactActionPerformed(event: {action: string; artifact: MJArtifactEntity; version?: MJArtifactVersionEntity}): void {\n // Handle artifact actions from inline-artifact component\n if (event.action === 'open') {\n this.artifactClicked.emit({\n artifactId: event.artifact.ID,\n versionId: event.version?.ID\n });\n } else {\n // Emit other actions to parent\n this.artifactActionPerformed.emit({ action: event.action, artifactId: event.artifact.ID });\n }\n }\n\n public toggleReaction(type: 'like' | 'comment'): void {\n // TODO: Implement reaction toggling\n console.log('Toggle reaction:', type, 'for message:', this.message.ID);\n }\n\n public onSaveArtifact(event: Event): void {\n event.stopPropagation();\n // TODO: Implement artifact save\n console.log('Save artifact for message:', this.message.ID);\n }\n\n public onShareArtifact(event: Event): void {\n event.stopPropagation();\n // TODO: Implement artifact share\n console.log('Share artifact for message:', this.message.ID);\n }\n\n public onExportArtifact(event: Event): void {\n event.stopPropagation();\n // TODO: Implement artifact export\n console.log('Export artifact for message:', this.message.ID);\n }\n\n /**\n * Handle attachment thumbnail click\n * Emits the attachment for the parent to display in the image viewer\n */\n public onAttachmentClick(attachment: MessageAttachment): void {\n this.attachmentClicked.emit(attachment);\n }\n\n /**\n * Check if message has any attachments\n */\n public get hasAttachments(): boolean {\n return this.attachments && this.attachments.length > 0;\n }\n\n /**\n * Get only image attachments\n */\n public get imageAttachments(): MessageAttachment[] {\n return this.attachments?.filter(a => a.type === 'Image') || [];\n }\n\n /**\n * Format file size for display\n */\n public formatFileSize(bytes: number): string {\n if (bytes < 1024) return bytes + ' B';\n if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';\n return (bytes / (1024 * 1024)).toFixed(1) + ' MB';\n }\n\n /** Compact UPPERCASE badge label (artifact-type name wins over file extension). */\n public badgeTextFor(attachment: MessageAttachment): string {\n return BadgeTextForAttachment(attachment);\n }\n\n /**\n * Whether this message has an associated agent run\n * Based on whether the message has an AgentID (not whether agentRun object is loaded)\n */\n public get hasAgentRun(): boolean {\n return !!this.message?.AgentID;\n }\n\n /**\n * Toggle the agent details panel expansion\n */\n public async toggleAgentDetails(): Promise<void> {\n this.isAgentDetailsExpanded = !this.isAgentDetailsExpanded;\n\n // Load tasks when expanding if not already loaded\n if (this.isAgentDetailsExpanded && !this.tasksLoaded) {\n await this.loadTasks();\n }\n\n this.cdRef.detectChanges();\n }\n\n /**\n * Load tasks associated with this conversation detail\n */\n private async loadTasks(): Promise<void> {\n if (!this.message?.ID) {\n return;\n }\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: `ConversationDetailID='${this.message.ID}'`,\n OrderBy: '__mj_CreatedAt DESC',\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n this.detailTasks = result.Results || [];\n this.tasksLoaded = true;\n }\n } catch (error) {\n console.error('Failed to load tasks for conversation detail:', error);\n }\n }\n\n /**\n * Get formatted duration for the agent run\n * For active runs: Calculate from created to NOW (live updates)\n * For completed runs: Calculate from created to updated timestamp (static)\n */\n public get agentRunDuration(): string | null {\n if (!this.agentRun || !this.agentRun.__mj_CreatedAt) {\n return null;\n }\n\n // For active runs, return the interval-updated field to avoid\n // ExpressionChangedAfterItHasBeenCheckedError (new Date() changes between CD cycles)\n if (this.isAgentRunActive) {\n return this._agentRunDurationFormatted;\n }\n\n // For completed runs, calculate static duration from timestamps\n if (!this.agentRun.__mj_UpdatedAt) {\n return null;\n }\n const createdAt = new Date(this.agentRun.__mj_CreatedAt);\n const endTime = new Date(this.agentRun.__mj_UpdatedAt);\n const diffMs = endTime.getTime() - createdAt.getTime();\n\n if (diffMs <= 0) {\n return null;\n }\n\n return this.formatDurationFromMs(diffMs);\n }\n\n /**\n * Get total tokens used in the agent run\n */\n public get agentRunTotalTokens(): number {\n if (!this.agentRun) {\n return 0;\n }\n return (this.agentRun.TotalPromptTokensUsed || 0) + (this.agentRun.TotalCompletionTokensUsed || 0);\n }\n\n /**\n * Get total cost of the agent run\n */\n public get agentRunTotalCost(): number {\n return this.agentRun?.TotalCost || 0;\n }\n\n /**\n * Get number of steps in the agent run\n */\n public get agentRunStepCount(): number {\n // Count from the Steps array if available\n if (this.agentRun && (this.agentRun as any).Steps) {\n return (this.agentRun as any).Steps.length;\n }\n return 0;\n }\n\n /**\n * Format number with commas\n */\n public formatNumber(num: number): string {\n return num.toLocaleString();\n }\n\n /**\n * Open the agent run entity record in a new tab\n */\n public openAgentRunRecord(): void {\n if (!this.agentRun?.ID) return;\n\n const compositeKey = new CompositeKey([\n new KeyValuePair('ID', this.agentRun.ID)\n ]);\n\n this.openEntityRecord.emit({\n entityName: 'MJ: AI Agent Runs',\n compositeKey\n });\n }\n\n /**\n * Open the agent entity record in a new tab\n */\n public openAgentRecord(): void {\n if (!this.agentRun?.AgentID) return;\n\n const compositeKey = new CompositeKey([\n new KeyValuePair('ID', this.agentRun.AgentID)\n ]);\n\n this.openEntityRecord.emit({\n entityName: 'MJ: AI Agents',\n compositeKey\n });\n }\n\n /**\n * Parse and return suggested responses from message data\n * Uses strongly-typed SuggestedResponses property from MJConversationDetailEntity\n */\n public get suggestedResponses(): SuggestedResponse[] {\n try {\n const rawData = this.message.SuggestedResponses;\n if (!rawData) return [];\n\n // Parse JSON string to array of SuggestedResponse objects\n const responses = JSON.parse(rawData);\n\n return Array.isArray(responses) ? responses : [];\n } catch (error) {\n console.error('Failed to parse suggested responses:', error);\n return [];\n }\n }\n\n /**\n * Check if current user is the conversation owner\n */\n public get isConversationOwner(): boolean {\n return UUIDsEqual(this.conversation?.UserID, this.currentUser.ID);\n }\n\n /**\n * Handle suggested response selection\n */\n public onSuggestedResponseSelected(event: {text: string; customInput?: string}): void {\n this.suggestedResponseSelected.emit(event);\n }\n\n /**\n * Get agent response form from message\n * Uses ResponseForm property from MJConversationDetailEntity\n */\n public get responseForm(): AgentResponseForm | null {\n try {\n const rawData = this.message.ResponseForm;\n if (!rawData) {\n return null;\n }\n\n // Parse JSON string to AgentResponseForm object\n const form = JSON.parse(rawData);\n\n return form || null;\n } catch (error) {\n console.error('Failed to parse response form:', error, 'Raw data:', this.message.ResponseForm);\n return null;\n }\n }\n\n /**\n * Get actionable commands from message\n * Uses ActionableCommands property from MJConversationDetailEntity\n */\n public get actionableCommands(): ActionableCommand[] {\n try {\n const rawData = this.message.ActionableCommands;\n if (!rawData) return [];\n\n // Parse JSON string to array of ActionableCommand objects\n const commands = JSON.parse(rawData);\n return Array.isArray(commands) ? commands : [];\n } catch (error) {\n console.error('Failed to parse actionable commands:', error);\n return [];\n }\n }\n\n /**\n * Handle agent response form submission\n * Converts form data to the new @{_mode:\"form\",...} format\n */\n public onFormSubmitted(formData: Record<string, any>): void {\n const form = this.responseForm;\n if (!form) {\n console.error('No response form available for submission');\n return;\n }\n\n // Build fields array with proper labels and type metadata\n const fields = Object.entries(formData).map(([questionId, value]) => {\n const question = form.questions.find(q => q.id === questionId);\n const questionType = typeof question?.type === 'string' ? question.type : question?.type?.type;\n\n // Look up display value for choice types (buttongroup, radio, dropdown, checkbox)\n const displayValue = this.getChoiceDisplayValue(question, value);\n\n return {\n name: questionId,\n value: value,\n label: question?.label || questionId,\n type: questionType, // Include type for proper formatting\n displayValue: displayValue // Include friendly display text for choice fields\n };\n });\n\n // Create formatted message using ConversationUtility\n const formMessage = ConversationUtility.CreateFormResponse(\n 'formSubmit', // Generic action name\n fields,\n form.title\n );\n\n // Emit the formatted message\n this.suggestedResponseSelected.emit({\n text: formMessage,\n customInput: undefined // No longer needed with new format\n });\n }\n\n /**\n * Handle actionable command execution\n */\n public async onCommandExecuted(command: ActionableCommand): Promise<void> {\n try {\n await this.uiCommandHandler.executeActionableCommand(command);\n } catch (error) {\n console.error('Failed to execute command:', command, error);\n }\n }\n\n /**\n * Execute automatic commands when message loads\n * This is called after a message with automatic commands is received\n */\n private async executeAutomaticCommands(): Promise<void> {\n try {\n if (!this.isLastMessage)\n return; // we only do this when the message is the last one in the conversation\n\n // TODO - IMPORTANT\n // BELOW, after doing the commands,\n // we need to mark the message as haveing completed its automatic commands to avoid re-running on reload\n\n\n // For now, check if the property exists (will be added to schema)\n const rawData = (this.message as any).AutomaticCommands;\n if (!rawData) return;\n\n // Parse JSON string to array of AutomaticCommand objects\n const commands: AutomaticCommand[] = JSON.parse(rawData);\n if (Array.isArray(commands) && commands.length > 0) {\n await this.uiCommandHandler.executeAutomaticCommands(commands);\n }\n } catch (error) {\n console.error('Failed to execute automatic commands:', error);\n }\n }\n\n /**\n * Get the display value for choice-type questions (buttongroup, radio, dropdown, checkbox)\n * This looks up the option's label based on the selected value\n */\n private getChoiceDisplayValue(question: FormQuestion | undefined, value: string | number | boolean | string[]): string | undefined {\n if (!question) return undefined;\n\n // Get the question type object\n const typeObj = question.type;\n if (typeof typeObj === 'string') return undefined;\n\n // Check if it's a choice type with options\n const choiceTypes = ['buttongroup', 'radio', 'dropdown', 'checkbox'];\n if (!choiceTypes.includes(typeObj.type)) return undefined;\n\n const choiceType = typeObj as ChoiceQuestionType;\n if (!choiceType.options || choiceType.options.length === 0) return undefined;\n\n // Handle array values (checkbox with multiple selections)\n if (Array.isArray(value)) {\n const labels = value.map(v => {\n const option = choiceType.options.find(opt => opt.value === v);\n return option?.label || String(v);\n });\n return labels.join(', ');\n }\n\n // Handle single value\n const option = choiceType.options.find(opt => opt.value === value);\n return option?.label;\n }\n\n}","<div [class]=\"messageClasses\" [attr.data-message-id]=\"message.ID\" (click)=\"onMessageBubbleClick($event)\">\n <div class=\"message-avatar\">\n <div class=\"avatar-circle\" [class.ai-avatar]=\"isAIMessage\" [class.user-avatar]=\"isUserMessage\">\n @if (isUserMessage) {\n @if (userAvatarUrl) {\n <img [src]=\"userAvatarUrl\" alt=\"User avatar\" class=\"avatar-image\" />\n } @else if (userAvatarIconClass) {\n <i [class]=\"userAvatarIconClass\"></i>\n } @else {\n <i class=\"fas fa-user\"></i>\n }\n } @else if (isAIMessage) {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\n </div>\n </div>\n\n <div class=\"message-content\">\n <div class=\"message-header\">\n <span class=\"message-sender\" [title]=\"isAIMessage ? (aiAgentInfo?.role || 'AI Assistant') : ''\">\n {{ isAIMessage ? (aiAgentInfo?.name || 'AI Assistant') : messageSenderName }}\n </span>\n <span class=\"message-time\">{{ message.__mj_CreatedAt | date:'short' }}</span>\n\n <!-- Status indicator for user messages -->\n @if (isUserMessage && messageStatus !== 'Complete') {\n <span class=\"message-status\" [class.error]=\"messageStatus === 'Error'\">\n <i class=\"fas\" [ngClass]=\"messageStatus === 'Error' ? 'fa-exclamation-triangle' : 'fa-circle-notch fa-spin'\"></i>\n <span class=\"status-text\">{{ getStatusText() }}</span>\n </span>\n }\n\n <!-- Time pill - shows for AI messages in all states (in-progress, active, complete, failed) -->\n @if (!isUserMessage && timePillText) {\n <span\n class=\"time-pill\"\n [class.in-progress]=\"isInProgressAIMessage\"\n [class.active]=\"!isInProgressAIMessage && isAgentRunActive\"\n [class.complete]=\"!isInProgressAIMessage && !isAgentRunActive && messageStatus === 'Complete'\"\n [class.failed]=\"messageStatus === 'Error'\">\n <i class=\"fas fa-clock\"></i>\n {{ timePillText }}\n </span>\n }\n\n <!-- Test feedback icon (appears for test runs only) -->\n @if (message.TestRunID) {\n <span\n class=\"test-feedback-icon\"\n (click)=\"onTestFeedbackClick()\"\n title=\"Provide Test Feedback\">\n <i class=\"fas fa-flask\"></i>\n </span>\n }\n\n <!-- Agent run icon (clickable to expand details) - always rightmost when present -->\n @if (hasAgentRun) {\n <span\n class=\"agent-run-icon\"\n (click)=\"toggleAgentDetails()\"\n [class.expanded]=\"isAgentDetailsExpanded\"\n [title]=\"hasRatings() ? 'Agent details & ' + getRatingCount() + ' rating(s)' : 'Click to view agent execution details'\">\n <i class=\"fas fa-cog\"></i>\n @if (hasRatings()) {\n <span class=\"rating-badge\">{{ getRatingCount() }}</span>\n }\n </span>\n }\n </div>\n\n <div class=\"message-body\">\n @if (!isEditing) {\n <div class=\"message-text\">\n <mj-markdown [data]=\"displayMessage\" [enableCollapsibleHeadings]=\"true\"></mj-markdown>\n @if (isMessageEdited) {\n <span class=\"edited-badge\">(edited)</span>\n }\n </div>\n\n <!-- Message Attachments -->\n @if (hasAttachments) {\n <div class=\"message-attachments\">\n @for (attachment of attachments; track attachment.id) {\n @if (attachment.type === 'Image') {\n <div class=\"attachment-item image-attachment\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'Image attachment'\">\n <img\n [src]=\"attachment.thumbnailUrl || attachment.contentUrl\"\n [alt]=\"attachment.fileName || 'Image attachment'\"\n class=\"attachment-thumbnail\"\n loading=\"lazy\">\n <div class=\"attachment-overlay\">\n <i class=\"fas fa-expand\"></i>\n </div>\n </div>\n } @else {\n <div class=\"attachment-strip\"\n [class.is-artifact]=\"!!attachment.artifactTypeName\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'File'\">\n <div class=\"attachment-badge\">{{ badgeTextFor(attachment) }}</div>\n <div class=\"attachment-meta\">\n <span class=\"file-name\">{{ attachment.fileName || 'File' }}</span>\n <span class=\"file-size\">{{ formatFileSize(attachment.sizeBytes) }}</span>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Artifact Message Card -->\n @if (hasArtifact && artifact && artifactVersion) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"isSystemArtifact\">\n <mj-artifact-message-card\n [artifactId]=\"artifact.ID\"\n [artifact]=\"artifact\"\n [artifactVersion]=\"artifactVersion\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- Suggested Responses (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && suggestedResponses.length > 0) {\n <mj-suggested-responses\n [suggestedResponses]=\"suggestedResponses\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (responseSelected)=\"onSuggestedResponseSelected($event)\">\n </mj-suggested-responses>\n }\n\n <!-- Agent Response Form (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && responseForm) {\n <mj-dynamic-form\n [FormDefinition]=\"responseForm\"\n [Disabled]=\"isProcessing\"\n (FormSubmitted)=\"onFormSubmitted($event)\">\n </mj-dynamic-form>\n }\n\n <!-- Actionable Commands (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && actionableCommands.length > 0) {\n <mj-actionable-commands\n [commands]=\"actionableCommands\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (commandExecuted)=\"onCommandExecuted($event)\">\n </mj-actionable-commands>\n }\n }\n\n @if (isEditing) {\n <div class=\"message-edit-container\">\n <textarea\n class=\"message-edit-textarea\"\n [(ngModel)]=\"editedText\"\n (keydown)=\"onEditKeydown($event)\"\n rows=\"4\"\n placeholder=\"Edit your message...\"></textarea>\n <div class=\"edit-actions\">\n <button class=\"edit-action-btn save\" (click)=\"saveEdit()\">\n <i class=\"fas fa-check\"></i>\n Save\n </button>\n <button class=\"edit-action-btn cancel\" (click)=\"cancelEditing()\">\n <i class=\"fas fa-times\"></i>\n Cancel\n </button>\n </div>\n <div class=\"edit-hint\">\n Press Enter to save, Shift+Enter for new line, Escape to cancel\n </div>\n </div>\n }\n </div>\n\n <!-- Message Footer: only rendered on the last message.\n Non-last messages have no footer — pin/delete/rating live in the gear panel. -->\n @if (!isEditing && isLastMessage && (isConversationOwner || (isAIMessage && messageStatus === 'Complete'))) {\n <div class=\"message-footer\">\n @if (isConversationOwner) {\n <button class=\"action-bar-btn danger inline-delete\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (isAIMessage && messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n <!-- Thumbs visible inline only on the latest AI message, left of pin -->\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\">\n </mj-conversation-message-rating>\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Agent details content section -->\n <div class=\"agent-details-section\">\n <!-- Agent Run Details Panel (expandable) -->\n @if (isAgentDetailsExpanded && hasAgentRun) {\n <!-- Agent Run Details Panel -->\n <div class=\"agent-details-panel\">\n @if (agentRun) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ aiAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <div class=\"agent-details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Run ID:</span>\n <span class=\"detail-value\">\n <a class=\"run-id-link\" (click)=\"openAgentRunRecord()\" title=\"Open agent run details\">\n {{ agentRun.ID }}\n <i class=\"fas fa-external-link-alt\"></i>\n </a>\n </span>\n </div>\n\n @if (agentRunStepCount > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Steps:</span>\n <span class=\"detail-value\">{{ agentRunStepCount }}</span>\n </div>\n }\n\n @if (agentRunTotalTokens > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tokens:</span>\n <span class=\"detail-value\">{{ formatNumber(agentRunTotalTokens) }}</span>\n </div>\n }\n\n @if (agentRunTotalCost > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Cost:</span>\n <span class=\"detail-value\">\\${{ agentRunTotalCost.toFixed(4) }}</span>\n </div>\n }\n\n @if (agentRun.Status) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Status:</span>\n <span class=\"detail-value status-badge\" [class]=\"'status-' + agentRun.Status.toLowerCase()\">\n {{ agentRun.Status }}\n </span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Delete + Rating + Pin in gear panel for non-last messages — mirrors last-message footer layout -->\n @if (!isLastMessage) {\n <div class=\"agent-panel-actions\">\n @if (isConversationOwner) {\n <button class=\"action-bar-btn danger\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\">\n </mj-conversation-message-rating>\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n </div>\n } @else {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Tasks Section -->\n @if (detailTasks.length > 0) {\n <div class=\"agent-details-tasks\">\n <div class=\"tasks-section-header\">\n <i class=\"fas fa-tasks\"></i>\n <span>Associated Tasks ({{ detailTasks.length }})</span>\n </div>\n <div class=\"tasks-list\">\n @for (task of detailTasks; track task) {\n <mj-task-widget\n [task]=\"task\"\n [compact]=\"false\"\n [clickable]=\"false\"\n [showProgress]=\"true\"\n [showDuration]=\"true\">\n </mj-task-widget>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Rating component moved to message footer (lines 113-134) -->\n\n <!-- Removed message-actions hover panel - actions now in gear icon dropdown -->\n <!-- Retry button kept for critical error recovery on failed messages -->\n @if (messageStatus === 'Error' && isAIMessage && !isProcessing && !isEditing) {\n <div class=\"message-actions\">\n <button class=\"message-action-btn retry-btn\" (click)=\"onRetryClick()\" title=\"Retry\">\n <i class=\"fas fa-redo\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Reaction Buttons -->\n @if (!isProcessing && !isInProgressAIMessage && !isEditing) {\n <div class=\"message-reactions\">\n <button class=\"reaction-btn\" (click)=\"toggleReaction('like')\">\n <i class=\"far fa-thumbs-up\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n <button class=\"reaction-btn\" (click)=\"toggleReaction('comment')\">\n <i class=\"far fa-comment\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n </div>\n }\n </div>\n</div>"]}
@@ -14,6 +14,7 @@
14
14
  * preserves conversation continuity.
15
15
  */
16
16
  import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
17
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
17
18
  import { UserInfo, CompositeKey } from '@memberjunction/core';
18
19
  import { MJConversationEntity, MJTaskEntity } from '@memberjunction/core-entities';
19
20
  import { ClientToolResultEvent } from '@memberjunction/ai-agent-client';
@@ -27,7 +28,7 @@ export interface OverlayConversationSwitchedEvent {
27
28
  PreviousConversationID: string | null;
28
29
  NewConversationID: string | null;
29
30
  }
30
- export declare class ChatAgentsOverlayComponent implements OnInit, OnDestroy {
31
+ export declare class ChatAgentsOverlayComponent extends BaseAngularComponent implements OnInit, OnDestroy {
31
32
  private cdr;
32
33
  private bridge;
33
34
  private agentClient;
@@ -1 +1 @@
1
- {"version":3,"file":"chat-overlay.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/overlay/chat-overlay.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAEH,YAAY,EAEZ,SAAS,EACT,MAAM,EAIT,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,QAAQ,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAA+C,MAAM,+BAA+B,CAAC;AAEhI,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;;AAExE,wCAAwC;AACxC,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtE,wEAAwE;AACxE,MAAM,WAAW,gCAAgC;IAC7C,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAQD,qBAMa,0BAA2B,YAAW,MAAM,EAAE,SAAS;IAChE,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,QAAQ,CAAuB;IAGvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAsB;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAO;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAO;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAO;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAO;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAO;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAQ;IAI1C,8EAA8E;IAC9E,OAAO,CAAC,UAAU,CAAQ;IAE1B,IACI,SAAS,CAAC,KAAK,EAAE,OAAO,EAO3B;IACD,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,gHAAgH;IACvG,WAAW,EAAG,QAAQ,CAAC;IAEhC,4GAA4G;IACnG,aAAa,EAAG,MAAM,CAAC;IAEhC,8GAA8G;IACrG,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAQ;IAE3D,+EAA+E;IACtE,kBAAkB,EAAE,MAAM,CAAyB;IAI5D,kDAAkD;IACxC,iBAAiB,iCAAwC;IAEnE,iEAAiE;IACvD,YAAY,sCAA6C;IAEnE,kEAAkE;IACxD,oBAAoB,iDAAwD;IAEtF,qEAAqE;IAC3D,qBAAqB,8BAAqC;IAEpE,iEAAiE;IACvD,mBAAmB,kCAAyC;IAEtE,sDAAsD;IAC5C,gBAAgB;oBAAiC,MAAM;sBAAgB,YAAY;OAAK;IAElG,qCAAqC;IAC3B,WAAW,6BAAoC;IAIlD,KAAK,EAAE,gBAAgB,CAAe;IACtC,WAAW,SAAK;IAEvB,sDAAsD;IAC/C,UAAU,SAA4C;IACtD,WAAW,SAA6C;IAE/D,6CAA6C;IAC7C,OAAO,CAAC,eAAe,CAAuB;IAC9C,IAAW,cAAc,IAAI,MAAM,GAAG,IAAI,CAEzC;IAED,iCAAiC;IAC1B,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAQ;IAExD,wDAAwD;IACjD,iBAAiB,UAAQ;IAEhC,0DAA0D;IACnD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE5C,8DAA8D;IACvD,kBAAkB,EAAE,iBAAiB,EAAE,GAAG,IAAI,CAAQ;IAE7D,wBAAwB;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAA4C;IAC9D,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,iBAAiB,CAAK;IAI9B,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IAQnB,mDAAmD;IAC5C,MAAM,IAAI,IAAI;IAQrB,gDAAgD;IACzC,MAAM,IAAI,IAAI;IAQrB,kDAAkD;IAC3C,QAAQ,IAAI,IAAI;IAOvB,mDAAmD;IAC5C,cAAc,IAAI,IAAI;IAW7B,6DAA6D;IACtD,uBAAuB,IAAI,IAAI;IAMtC,sDAAsD;IAC/C,qBAAqB,CAAC,KAAK,EAAE;QAChC,YAAY,EAAE,oBAAoB,CAAC;QACnC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;KAC5C,GAAG,IAAI;IAYR,mDAAmD;IAC5C,wBAAwB,IAAI,IAAI;IAKvC,gDAAgD;IACzC,qBAAqB,CAAC,MAAM,EAAE;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAKvG,yCAAyC;IAClC,kBAAkB,CAAC,KAAK,EAAE;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,YAAY,CAAA;KAAC,GAAG,IAAI;IAIxF,oDAAoD;IAC7C,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAI1D,4CAA4C;IACrC,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAI9C,8CAA8C;IACvC,oBAAoB,IAAI,IAAI;IAcnC,sFAAsF;IAC/E,eAAe,IAAI,IAAI;IAS9B,4CAA4C;IACrC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,IAAI;IAchF,OAAO,CAAC,YAAY,CAalB;IAEF,OAAO,CAAC,WAAW,CAMjB;IAEF,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,WAAW;IAMnB,2FAA2F;IAC3F,OAAO,CAAC,eAAe;IAUvB,gDAAgD;IAChD,OAAO,CAAC,mBAAmB;IAc3B,uDAAuD;IACvD,OAAO,CAAC,mBAAmB;IAW3B,6DAA6D;IAC7D,OAAO,CAAC,uBAAuB;IAwB/B,sDAAsD;IACtD,OAAO,CAAC,qBAAqB;IAQ7B,2DAA2D;IAC3D,OAAO,CAAC,qBAAqB;IAS7B,yCAAyC;IACzC,OAAO,CAAC,wBAAwB;yCAlXvB,0BAA0B;2CAA1B,0BAA0B;CAwXtC"}
1
+ {"version":3,"file":"chat-overlay.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/overlay/chat-overlay.component.ts"],"names":[],"mappings":"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"}