@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -2
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
- package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
- package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
- package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
- package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.js +181 -47
- package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
- package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +220 -70
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +154 -40
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +951 -367
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
- package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.js +388 -44
- package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
- package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +2399 -706
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
- package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
- package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
- package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
- package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
- package/dist/lib/components/export/export-modal.component.d.ts +84 -10
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +173 -49
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +119 -35
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts +76 -10
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +164 -50
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +82 -16
- package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +549 -74
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1250 -421
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +411 -29
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +896 -222
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +288 -29
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +561 -123
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
- package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.js +13 -3
- package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
- package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.js +36 -8
- package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +348 -87
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts +78 -8
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +177 -46
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
- package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +136 -92
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +3 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
- package/dist/lib/components/search/search-panel.component.d.ts +133 -22
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +312 -83
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts +69 -9
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +139 -31
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +110 -30
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js +25 -5
- package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
- package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +223 -75
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
- package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.js +100 -16
- package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.js +146 -36
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
- package/dist/lib/components/toast/toast.component.d.ts +11 -1
- package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
- package/dist/lib/components/toast/toast.component.js +25 -5
- package/dist/lib/components/toast/toast.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
- package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
- package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
- package/dist/lib/directives/chat-slot.directive.js.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.js +14 -4
- package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
- package/dist/lib/events/chat-events.d.ts +34 -7
- package/dist/lib/events/chat-events.d.ts.map +1 -1
- package/dist/lib/events/chat-events.js +37 -7
- package/dist/lib/events/chat-events.js.map +1 -1
- package/dist/lib/models/agent-turn.model.d.ts +103 -0
- package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
- package/dist/lib/models/agent-turn.model.js +12 -0
- package/dist/lib/models/agent-turn.model.js.map +1 -0
- package/dist/lib/models/collection-view.model.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +8 -0
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
- package/dist/lib/models/conversation-state.model.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
- package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +98 -34
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +30 -4
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +71 -19
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +17 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +48 -16
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts +39 -0
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +152 -17
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +58 -5
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +135 -35
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/collection-permission.service.d.ts +28 -0
- package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
- package/dist/lib/services/collection-permission.service.js +88 -32
- package/dist/lib/services/collection-permission.service.js.map +1 -1
- package/dist/lib/services/collection-state.service.d.ts +11 -1
- package/dist/lib/services/collection-state.service.d.ts.map +1 -1
- package/dist/lib/services/collection-state.service.js +25 -5
- package/dist/lib/services/collection-state.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +26 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +57 -18
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +17 -0
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +38 -10
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
- package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-streaming.service.js +50 -10
- package/dist/lib/services/conversation-streaming.service.js.map +1 -1
- package/dist/lib/services/data-cache.service.d.ts +31 -0
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +71 -15
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/dialog.service.d.ts +13 -0
- package/dist/lib/services/dialog.service.d.ts.map +1 -1
- package/dist/lib/services/dialog.service.js +25 -5
- package/dist/lib/services/dialog.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +2 -0
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +5 -1
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/mention-parser.service.d.ts +10 -0
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
- package/dist/lib/services/mention-parser.service.js +25 -5
- package/dist/lib/services/mention-parser.service.js.map +1 -1
- package/dist/lib/services/notification.service.d.ts +54 -6
- package/dist/lib/services/notification.service.d.ts.map +1 -1
- package/dist/lib/services/notification.service.js +123 -27
- package/dist/lib/services/notification.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
- package/dist/lib/services/realtime-audio-recorder.js +12 -12
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.js +10 -2
- package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
- package/dist/lib/services/search.service.d.ts +42 -9
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +103 -23
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/services/toast.service.d.ts +19 -1
- package/dist/lib/services/toast.service.d.ts.map +1 -1
- package/dist/lib/services/toast.service.js +45 -9
- package/dist/lib/services/toast.service.js.map +1 -1
- package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +36 -8
- package/dist/lib/services/ui-command-handler.service.js.map +1 -1
- package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
- package/dist/lib/utils/agent-artifact-summary.js +3 -3
- package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
- package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
- package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
- package/dist/lib/utils/agent-turn-routing.js +96 -0
- package/dist/lib/utils/agent-turn-routing.js.map +1 -0
- package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
- package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
- package/dist/lib/utils/artifact-panel-action.js +10 -2
- package/dist/lib/utils/artifact-panel-action.js.map +1 -1
- package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
- package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
- package/dist/lib/utils/distinct-artifacts.js +5 -1
- package/dist/lib/utils/distinct-artifacts.js.map +1 -1
- package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
- package/dist/lib/utils/plan-mode-preference.js +6 -6
- package/dist/lib/utils/plan-mode-preference.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +32 -32
|
@@ -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 TemplateRef\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 { PlanModePreference } from '../../utils/plan-mode-preference';\nimport { MarkdownService } from '@memberjunction/ng-markdown';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { UICommandHandlerService } from '../../services/ui-command-handler.service';\nimport { ConversationAgentService } from '../../services/conversation-agent.service';\nimport {\n BeforeResponseFormSubmittedEventArgs,\n AfterResponseFormSubmittedEventArgs,\n} from '../../events/chat-events';\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 * A fully-loaded artifact + its version to render as a card under a message.\n * A single message can carry more than one DISTINCT artifact (e.g. a research\n * report plus a standalone generated infographic), so the message renders an\n * array of these — one card each.\n */\nexport interface MessageArtifactRef {\n artifact: MJArtifactEntity;\n version: MJArtifactVersionEntity;\n}\n\n/**\n * An artifact known to be attached to a message whose entity rows are still loading.\n *\n * These fields all come off `LazyArtifactInfo`, which the conversation query populates\n * synchronously — only the artifact and version ENTITIES are lazy, because a version's `Content`\n * can be arbitrarily large. Carrying the display data rather than a bare count means the\n * placeholder can name what is arriving and match its final styling.\n */\nexport interface MessagePendingArtifactRef {\n artifactId: string;\n artifactName: string;\n visibility: string;\n}\n\n/** Shared empty result so the placeholder getter allocates nothing once loading has finished. */\nconst NO_PENDING_ARTIFACTS: readonly MessagePendingArtifactRef[] = Object.freeze([]);\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 /**\n * All distinct artifacts attached to this message, each at its latest version.\n * Preferred over the single `artifact`/`artifactVersion` inputs above (which are\n * retained for backward compatibility and kept pointed at the first entry).\n */\n @Input() public artifacts: MessageArtifactRef[] = [];\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 /**\n * Artifacts attached to this message whose entity rows have not arrived yet.\n *\n * The parent knows these synchronously — the message-to-artifact map is already in memory —\n * while loading each artifact and version row is not. Without them the message rendered as\n * finished with nothing where the image belonged, then the card appeared unannounced seconds\n * later, which reads as \"generation failed\" rather than \"still loading\".\n *\n * Set alongside, not instead of, {@link artifacts}: on a message that already shows a report and\n * is still loading an image, both render at once. Entries whose artifact has since loaded are\n * filtered out by {@link pendingArtifactPlaceholders}.\n */\n @Input() public pendingArtifacts: readonly MessagePendingArtifactRef[] = [];\n\n /**\n * Optional additive per-message slot template (forwarded from chat-area's\n * `mjChatSlot=\"messageExtra\"`). Rendered inside the bubble after the message\n * content, before attachments. Receives the message as `$implicit` + a named\n * `message` context binding. Null when no consumer template is projected.\n */\n @Input() public messageExtraTemplate: TemplateRef<unknown> | null = null;\n\n // --- Host-level feature gates (forwarded from mj-conversation-chat-area) ---\n // All default true so existing consumers are unaffected; set false to remove\n // the affordance entirely (the control is not rendered, not merely disabled).\n /** Show the per-message agent run-detail grid (run ID, step/token counts, $ cost). */\n @Input() public showAgentRunDetails: boolean = true;\n /** Show the per-message reaction buttons (like / comment). */\n @Input() public showReactions: boolean = true;\n /** Show the per-message thumbs rating control on completed AI messages. */\n @Input() public showMessageRating: boolean = true;\n /** Allow pinning messages (the per-message pin button). */\n @Input() public allowPinning: boolean = true;\n /** Allow editing the user's own messages (the per-message edit button). */\n @Input() public allowMessageEdit: boolean = true;\n /** Allow deleting the user's own messages (the per-message delete button). */\n @Input() public allowMessageDelete: boolean = true;\n /** Host override for the AI message display name (white-label persona). Null = the agent record's name. */\n @Input() public assistantDisplayName: string | null = null;\n /** Host image URL for the AI message avatar. Null = the agent's Font Awesome icon. */\n @Input()\n public set assistantAvatarUrl(value: string | null) {\n if (value !== this._assistantAvatarUrl) {\n this._assistantAvatarUrl = value;\n // A new URL gets a fresh chance even if the previous one 404'd.\n this.assistantAvatarFailed = false;\n }\n }\n public get assistantAvatarUrl(): string | null {\n return this._assistantAvatarUrl;\n }\n private _assistantAvatarUrl: string | null = null;\n\n /** The last assistantAvatarUrl failed to load — fall back to the icon branch. */\n public assistantAvatarFailed = false;\n\n /** The avatar image URL actually rendered: trimmed, and null after a load error\n * so a broken/whitespace URL degrades to the agent icon instead of a broken-image glyph. */\n public get effectiveAssistantAvatarUrl(): string | null {\n if (this.assistantAvatarFailed) return null;\n const url = this._assistantAvatarUrl?.trim();\n return url ? url : null;\n }\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 /**\n * Cancelable — fired BEFORE the response form's values are sent back as a new\n * conversation message. Listeners may set `event.Cancel = true` to halt the\n * submission (e.g., a validation pass that finds required fields unfilled).\n * When canceled, the corresponding {@link afterResponseFormSubmitted} event is\n * NOT fired and `suggestedResponseSelected` is NOT emitted.\n * Follows MJ's established Before/After cancelable event pattern.\n */\n @Output() public beforeResponseFormSubmitted = new EventEmitter<BeforeResponseFormSubmittedEventArgs>();\n\n /**\n * Fired AFTER the response form's values have been submitted. Carries the form id\n * (using the message ID as a stable per-message identifier) and the submitted\n * values map. Not fired when {@link beforeResponseFormSubmitted} was canceled.\n */\n @Output() public afterResponseFormSubmitted = new EventEmitter<AfterResponseFormSubmittedEventArgs>();\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 // Shared AI mention/suggestion engine (BaseSingleton — same instance the composer plugins use)\n private mentionAutocomplete = MentionAutocompleteService.Instance;\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private mentionParser: MentionParserService,\n private uiCommandHandler: UICommandHandlerService,\n private agentService: ConversationAgentService,\n private markdownService: MarkdownService\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 // Warm the conversation-manager-agent cache (DefaultAgentResolver chain)\n // so the synchronous isConversationManager getter returns the right answer\n // on first render. Fire-and-forget — the getter returns false until cached,\n // matching the pre-PR-2 behavior of the previous hardcoded check.\n void this.agentService.getConversationManagerAgent();\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 const recordBadge = (event.target as HTMLElement | null)?.closest?.('.mention-badge.record') as HTMLElement | null;\n if (recordBadge) {\n event.preventDefault();\n event.stopPropagation();\n this.openRecordLinkBadge(recordBadge);\n return;\n }\n if (!event.shiftKey || !this.isAIMessage) return;\n event.preventDefault();\n event.stopPropagation();\n this.diagnosticRequested.emit(this.message.ID);\n }\n\n private openRecordLinkBadge(el: HTMLElement): void {\n const entityName = el.getAttribute('data-record-entity');\n const keysJson = el.getAttribute('data-record-keys');\n if (!entityName) return;\n let content: { type: 'record'; name: string; entityName: string; keys?: Record<string, string | number> };\n try {\n const keys = keysJson ? JSON.parse(keysJson) as Record<string, string | number> : {};\n content = { type: 'record', name: el.textContent?.trim() || entityName, entityName, keys };\n } catch {\n return;\n }\n const entity = this.ProviderToUse.EntityByName(entityName);\n if (!entity) {\n console.warn('Record link: unknown entity', entityName);\n return;\n }\n const compositeKey = ConversationUtility.CompositeKeyFromRecordLink(\n content,\n entity.PrimaryKeys.map(pk => pk.Name)\n );\n if (!compositeKey) {\n console.warn('Record link: incomplete primary key', entityName, keysJson);\n return;\n }\n this.openEntityRecord.emit({ entityName, compositeKey });\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 /**\n * The agent identity as shown in the UI: the ENGINE-resolved identity (see\n * {@link engineAgentInfo}) with the host's `assistantDisplayName` override\n * applied to the name when set. Internal logic that must compare against the\n * real agent name (e.g. {@link isConversationManager}) uses `engineAgentInfo`\n * directly, so a display override can never change routing/behavior decisions.\n */\n public get aiAgentInfo(): { name: string; iconClass: string; role: string } | null {\n const info = this.engineAgentInfo;\n if (!info) return null;\n const override = this.assistantDisplayName?.trim();\n return override ? { ...info, name: override } : info;\n }\n\n /** The engine-resolved agent identity — no host display overrides applied.\n * Protected (not private) so the template's run-details header — which labels\n * the REAL agent's diagnostics and record link — can read it directly. */\n protected get engineAgentInfo(): { 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.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 // Resolved at runtime via the conversation manager agent registered through\n // ConversationsRuntime's DefaultAgentResolver chain — explicit input wins,\n // then app-scoped Application Setting, then global Application Setting, then\n // the code-const Sage fallback. Replaces the previous hardcoded 'Sage'\n // name check. Returns false until the agent service has cached the\n // resolved agent (warmed by message-input's first routing call).\n // Compares the ENGINE-resolved name deliberately: a host assistantDisplayName\n // override renames what the user SEES, never what the component decides.\n const cmName = this.agentService.ConversationManagerAgentName;\n if (!cmName) return false;\n return this.engineAgentInfo?.name === cmName;\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 = typeof content.name === 'string' ? content.name : '';\n let iconClass = '';\n let logoURL = '';\n let configPresetName = '';\n let inlineStyle = '';\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 } else if (content.type === 'entity') {\n const entity = this.mentionAutocomplete.getAvailableEntities().find(e => UUIDsEqual(e.ID, content.id));\n name = entity ? entity.DisplayNameOrName : name;\n iconClass = this.normalizeIconClass(entity?.Icon || 'fa-solid fa-table');\n } else if (content.type === 'query') {\n const query = this.mentionAutocomplete.getAvailableQueries().find(q => UUIDsEqual(q.ID, content.id));\n if (query) name = query.Name;\n iconClass = this.normalizeIconClass(this.mentionAutocomplete.getQueriesEntityIcon());\n } else if (content.type === 'skill') {\n const skill = AIEngineBase.Instance?.Skills?.find(s => UUIDsEqual(s.ID, content.id));\n if (skill) name = skill.Name;\n iconClass = this.normalizeIconClass(skill?.IconClass || 'fa-solid fa-wand-magic-sparkles');\n // Per-skill accent color (AISkill.Color) overrides the standard skill green — same\n // logic as the composer chip (mention-editor's createMentionChip). Keep in sync.\n if (skill?.Color) {\n inlineStyle = ` style=\"background: ${this.escapeHtml(skill.Color)}; border-color: rgba(255, 255, 255, 0.35);\"`;\n }\n } else if (content.type === 'record') {\n name = (content.name ?? '').trim();\n iconClass = this.normalizeIconClass('fa-solid fa-up-right-from-square');\n }\n\n const iconOnly = content.type === 'record' && !name;\n const escapedName = name ? this.escapeHtml(name) : '';\n const typeClass =\n (content.type === 'agent' || content.type === 'entity' || content.type === 'query' || content.type === 'skill' || content.type === 'record' ? content.type : 'user')\n + (iconOnly ? ' icon-only' : '');\n\n // Build preset indicator HTML if present\n const presetIndicator = configPresetName\n ? `<span class=\"preset-indicator\">${this.escapeHtml(configPresetName)}</span>`\n : '';\n\n const recordOpenLabel = content.type === 'record'\n ? (name ? `Open ${name}` : `Open ${content.entityName || 'record'}`)\n : '';\n const recordAttrs = content.type === 'record' && content.entityName\n ? ` role=\"link\" title=\"${this.escapeHtml(recordOpenLabel)}\" aria-label=\"${this.escapeHtml(recordOpenLabel)}\" data-record-entity=\"${this.escapeHtml(content.entityName)}\" data-record-keys=\"${this.escapeHtml(JSON.stringify(ConversationUtility.RecordLinkKeyMap(content)))}\"`\n : '';\n\n // Generate HTML based on whether we have an icon\n if (logoURL) {\n return `<span class=\"mention-badge ${typeClass}\"${inlineStyle}${recordAttrs}><img src=\"${this.escapeHtml(logoURL)}\" alt=\"\" />${escapedName}${presetIndicator}</span>`;\n } else if (iconClass) {\n return `<span class=\"mention-badge ${typeClass}\"${inlineStyle}${recordAttrs}><i class=\"${this.escapeHtml(iconClass)}\" aria-hidden=\"true\"></i>${escapedName}${presetIndicator}</span>`;\n } else {\n return `<span class=\"mention-badge ${typeClass}\"${inlineStyle}${recordAttrs}>${escapedName}${presetIndicator}</span>`;\n }\n }\n\n /**\n * Normalize a Font Awesome icon class to include a style family (defaults to fa-solid)\n * so stored values that omit one (e.g. 'fa-table') still render.\n */\n private normalizeIconClass(iconClass: string): string {\n if (!iconClass) return 'fa-solid fa-table';\n if (iconClass.includes('fa-') && !/\\b(fa-solid|fa-regular|fa-light|fa-thin|fa-duotone|fa-brands|fa-sharp)\\b/.test(iconClass)) {\n return `fa-solid ${iconClass}`;\n }\n return iconClass;\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 // Textarea values render as formatted Markdown — agent-authored long-form content\n // (e.g. the approved Plan in the plan-approval response) is Markdown by convention,\n // and the submitted-form pill should look as good as the live form's preview did.\n // Script safety: the whole message passes through mj-markdown's stripJavaScript.\n if (field.type === 'textarea' && typeof field.value === 'string' && field.value.trim().length > 0) {\n try {\n return `<div class=\"field-answer-markdown\">${this.markdownService.parse(field.value)}</div>`;\n } catch {\n // fall through to the escaped-plaintext path below\n }\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 /**\n * The artifacts to render under this message, one card each. Prefers the\n * `artifacts` array; falls back to the legacy single `artifact`/`artifactVersion`\n * inputs so older callers that set only those keep working.\n */\n public get displayArtifacts(): MessageArtifactRef[] {\n if (this.artifacts && this.artifacts.length > 0) {\n return this.artifacts;\n }\n if (this.artifact && this.artifactVersion) {\n return [{ artifact: this.artifact, version: this.artifactVersion }];\n }\n return [];\n }\n\n public get hasArtifact(): boolean {\n return this.displayArtifacts.length > 0;\n }\n\n /**\n * Label for a pending artifact. Says what is happening as well as to what — a bare artifact name\n * beside a spinner reads as a title, not as progress, which is the confusion this whole change\n * exists to remove. Matches the media previews' \"Loading image...\" phrasing.\n */\n public pendingLabel(pending: MessagePendingArtifactRef): string {\n return pending.artifactName ? `Loading ${pending.artifactName}...` : 'Loading attachment...';\n }\n\n /**\n * The pending artifacts that still have no card of their own, filtered per artifact rather than\n * suppressed wholesale: a message can hold a loaded report and an in-flight image at once, and\n * gating on `displayArtifacts.length` would leave that image's window silent.\n */\n public get pendingArtifactPlaceholders(): readonly MessagePendingArtifactRef[] {\n // Shared constant in the steady state, which the parent now keeps us in most of the time by\n // only publishing artifacts that are genuinely still loading. The component is CheckAlways and\n // runs a per-second refresh while an agent run is active, so allocating here would cost for\n // the life of every message.\n if (this.pendingArtifacts.length === 0) {\n return NO_PENDING_ARTIFACTS;\n }\n // UUIDsEqual, not string equality: these two IDs come from different sources — one from the\n // conversation query, one off a loaded entity — and SQL Server returns upper-case UUIDs where\n // PostgreSQL returns lower-case. A case-sensitive match left a placeholder sitting above the\n // very card it was waiting for. See guides/UUID_COMPARISON_GUIDE.md.\n const loaded = this.displayArtifacts;\n return this.pendingArtifacts.filter(p => !loaded.some(a => UUIDsEqual(a.artifact.ID, p.artifactId)));\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 const fromMessage = this.formattedGenerationTime;\n if (fromMessage) {\n return fromMessage;\n }\n\n // Last resort: the live elapsed-time string is frozen at the value it had\n // when status flipped to Complete (the interval is cleared in ngDoCheck). If\n // the same component instance handled the in-progress phase, this is the\n // accurate duration the user just watched tick. If the message arrived already\n // complete (no in-progress phase observed), `_elapsedTimeFormatted` is still\n // its initial '0:00' — return null in that case so the time pill doesn't render\n // a misleading zero.\n return this._elapsedTimeFormatted !== '0:00' ? this._elapsedTimeFormatted : null;\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 * Whether the agent-run gear's expanded panel would actually render anything —\n * used to gate the gear button itself so it doesn't appear as a dead control\n * that opens an empty popup. The panel hosts, in order: the run-details section\n * (only when `showAgentRunDetails`), associated tasks, and (non-last messages\n * only) the delete / rating / pin overflow. With `showAgentRunDetails=false` and\n * none of those enabled — a white-labeled end-user surface — the gear vanishes\n * entirely instead of opening onto nothing.\n *\n * Each arm below mirrors the corresponding template condition EXACTLY; keep them\n * in lockstep with `message-item.component.html`'s `.agent-details-panel` block.\n *\n * Defaults leave it unchanged: with `showAgentRunDetails=true` (the default) this\n * is unconditionally true, so the gear renders exactly as before — including the\n * pre-existing window where `agentRun` hasn't loaded yet and the panel is briefly\n * empty. That window is deliberately preserved (byte-identical defaults) rather\n * than fixed here.\n */\n public get hasAgentDetailsPanelContent(): boolean {\n // Run-details enabled → gear shows for any agent-run message (the button\n // already AND-gates hasAgentRun), exactly as before the gate existed — even\n // before the agentRun object finishes loading. This keeps the default\n // (showAgentRunDetails=true) byte-identical.\n if (this.showAgentRunDetails) return true;\n if (this.detailTasks.length > 0) return true;\n if (!this.isLastMessage) {\n if (this.allowMessageDelete && this.isConversationOwner) return true;\n if (this.allowPinning) return true;\n // The rating only renders inside the template's `messageStatus === 'Complete'`\n // branch, so an incomplete/errored message must NOT count it as content —\n // otherwise the gear reappears over an empty panel, which is the whole bug\n // this getter exists to prevent.\n if (this.showMessageRating && this.messageStatus === 'Complete') return true;\n }\n return false;\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 * 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 * Get agent response form from message\n * Uses ResponseForm property from MJConversationDetailEntity\n *\n * Cached against the raw JSON string so the getter returns a stable object reference\n * for the same input. Without caching, `JSON.parse` produces a new object every call,\n * which makes Angular's `@if (responseForm)` template index churn between CD passes —\n * the classic NG0100 \"ExpressionChangedAfterItHasBeenCheckedError\" we used to hit here.\n */\n private _responseFormRaw: string | null | undefined = undefined;\n private _responseFormCache: AgentResponseForm | null = null;\n public get responseForm(): AgentResponseForm | null {\n const rawData = this.message.ResponseForm ?? null;\n if (rawData === this._responseFormRaw) return this._responseFormCache;\n this._responseFormRaw = rawData;\n if (!rawData) {\n this._responseFormCache = null;\n return null;\n }\n try {\n this._responseFormCache = (JSON.parse(rawData) as AgentResponseForm) || null;\n } catch (error) {\n console.error('Failed to parse response form:', error, 'Raw data:', rawData);\n this._responseFormCache = null;\n }\n return this._responseFormCache;\n }\n\n /**\n * Get actionable commands from message\n * Uses ActionableCommands property from MJConversationDetailEntity\n *\n * Cached against the raw JSON string (see {@link responseForm} for rationale).\n */\n private _actionableCommandsRaw: string | null | undefined = undefined;\n private _actionableCommandsCache: ActionableCommand[] = [];\n public get actionableCommands(): ActionableCommand[] {\n const rawData = this.message.ActionableCommands ?? null;\n if (rawData === this._actionableCommandsRaw) return this._actionableCommandsCache;\n this._actionableCommandsRaw = rawData;\n if (!rawData) {\n this._actionableCommandsCache = [];\n return this._actionableCommandsCache;\n }\n try {\n const commands = JSON.parse(rawData);\n this._actionableCommandsCache = Array.isArray(commands) ? commands : [];\n } catch (error) {\n console.error('Failed to parse actionable commands:', error);\n this._actionableCommandsCache = [];\n }\n return this._actionableCommandsCache;\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 // ── PR 2c follow-up: Before/After cancelable event wiring ──\n // Emit beforeResponseFormSubmitted so consumers can veto (e.g., a validation\n // pass that finds required fields unfilled). Cancel propagates synchronously\n // through the message-list + chat-area re-emit bindings, so by the time .emit()\n // returns, event.Cancel reflects every subscriber's final answer. We use the\n // message ID as the form id — each AgentResponseForm is attached to exactly\n // one message, giving a stable per-message identifier.\n const beforeEvent = new BeforeResponseFormSubmittedEventArgs(this.message.ID, formData);\n this.beforeResponseFormSubmitted.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n return;\n }\n\n // Plan-approval semantics: approving a plan is a HIGHER-ORDER signal, not just a form\n // reply — it ends the plan phase, so the conversation switches out of Plan Mode and the\n // follow-up run executes the approved plan instead of planning again. Rejection leaves\n // Plan Mode on so the agent re-plans (the optional feedback field steers it).\n this.applyPlanDecision(formData);\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 this.afterResponseFormSubmitted.emit(\n new AfterResponseFormSubmittedEventArgs(this.message.ID, formData)\n );\n }\n\n /**\n * Detects a plan-approval form submission (the Plan Mode HITL card — identified by its\n * 'plan' + 'decision' questions, see BaseAgent.buildPlanApprovalForm) and applies the\n * decision's conversation-level effect: APPROVE switches this conversation out of Plan\n * Mode (plan phase complete — execute); REJECT intentionally leaves it on (re-plan).\n */\n private applyPlanDecision(formData: Record<string, unknown>): void {\n const form = this.responseForm;\n const isPlanForm =\n !!form?.questions.some(q => q.id === 'plan') &&\n !!form?.questions.some(q => q.id === 'decision');\n if (!isPlanForm) {\n return;\n }\n if (formData['decision'] === 'approve' && this.message.ConversationID) {\n PlanModePreference.Set(this.message.ConversationID, false);\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 conversationId: this.message.ConversationID,\n conversationDetailId: this.message.ID\n });\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 [class.avatar-has-image]=\"isAIMessage && effectiveAssistantAvatarUrl !== null\">\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 @if (effectiveAssistantAvatarUrl) {\n <img [src]=\"effectiveAssistantAvatarUrl\" alt=\"Assistant avatar\" class=\"avatar-image\"\n (error)=\"assistantAvatarFailed = true\" />\n } @else {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\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 <!-- Edit (owner's completed user messages) — opens the inline editor; the server\n sets OriginalMessageChanged when the text actually changes on save -->\n @if (allowMessageEdit && isUserMessage && isConversationOwner && !isEditing && messageStatus === 'Complete') {\n <span class=\"message-edit-icon\" (click)=\"onEditClick()\" title=\"Edit message\">\n <i class=\"fas fa-pen\"></i>\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 Rendered only when its panel would actually have content, so it never\n appears as a dead control opening an empty popup (e.g. a white-label\n surface with showAgentRunDetails=false and no message actions). -->\n @if (hasAgentRun && hasAgentDetailsPanelContent) {\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 <!-- messageExtra slot — per-message additive decoration projected by the\n consumer via `mjChatSlot=\"messageExtra\"`. Renders after the message\n content, before attachments. Receives the message as $implicit. -->\n @if (messageExtraTemplate) {\n <ng-container *ngTemplateOutlet=\"messageExtraTemplate; context: {\n $implicit: message,\n message: message\n }\"></ng-container>\n }\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 Cards — one per distinct artifact on this message -->\n @for (a of displayArtifacts; track a.artifact.ID) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"a.artifact.Visibility === 'System Only'\">\n <mj-artifact-message-card\n [artifactId]=\"a.artifact.ID\"\n [artifact]=\"a.artifact\"\n [artifactVersion]=\"a.version\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- One per attached artifact whose rows are still loading. Rendered AFTER the loaded\n cards, so an artifact arriving appends rather than reordering what is already on\n screen. Carries the same system-artifact de-emphasis as the card it becomes. -->\n @for (pending of pendingArtifactPlaceholders; track pending.artifactId) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"pending.visibility === 'System Only'\">\n <div class=\"artifact-pending\">\n <mj-loading [text]=\"pendingLabel(pending)\" size=\"small\"></mj-loading>\n </div>\n </div>\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 (allowMessageDelete && 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 @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingEntityName]=\"message.EntityInfo.Name || 'MJ: Conversation Details'\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\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 </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 && showAgentRunDetails) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <!-- Deliberately the ENGINE-resolved name: this header labels the real\n agent's diagnostics, and the link opens the real agent record — a\n host assistantDisplayName override must not relabel either. -->\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ engineAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <!-- Run-detail grid (run ID, step/token counts, $ cost, status) — developer/\n observability data. The whole run-details section (this grid AND its\n header above) is gated on showAgentRunDetails at the panel root, so a\n white-labeled surface hides all of it; the delete/pin/rating overflow\n below is a sibling block (outside this @if) and still renders. -->\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 (allowMessageDelete && 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 @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\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 } @else if (allowPinning) {\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 (showReactions && !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 TemplateRef\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 { PlanModePreference } from '../../utils/plan-mode-preference';\nimport { MarkdownService } from '@memberjunction/ng-markdown';\nimport { MentionAutocompleteService } from '../../services/mention-autocomplete.service';\nimport { UICommandHandlerService } from '../../services/ui-command-handler.service';\nimport { ConversationAgentService } from '../../services/conversation-agent.service';\nimport {\n BeforeResponseFormSubmittedEventArgs,\n AfterResponseFormSubmittedEventArgs,\n} from '../../events/chat-events';\nimport { NormalizeUUID, 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 * A fully-loaded artifact + its version to render as a card under a message.\n * A single message can carry more than one DISTINCT artifact (e.g. a research\n * report plus a standalone generated infographic), so the message renders an\n * array of these — one card each.\n */\nexport interface MessageArtifactRef {\n artifact: MJArtifactEntity;\n version: MJArtifactVersionEntity;\n}\n\n/**\n * An artifact known to be attached to a message whose entity rows are still loading.\n *\n * These fields all come off `LazyArtifactInfo`, which the conversation query populates\n * synchronously — only the artifact and version ENTITIES are lazy, because a version's `Content`\n * can be arbitrarily large. Carrying the display data rather than a bare count means the\n * placeholder can name what is arriving and match its final styling.\n */\nexport interface MessagePendingArtifactRef {\n artifactId: string;\n artifactName: string;\n visibility: string;\n}\n\n/** Shared empty result so the placeholder getter allocates nothing once loading has finished. */\nconst NO_PENDING_ARTIFACTS: readonly MessagePendingArtifactRef[] = Object.freeze([]);\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\n /** @deprecated Use {@link Conversation}. */\n @Input() public set conversation(value: MJConversationEntity | null) {\n this.Conversation = value;\n }\n /** @deprecated Use {@link Conversation}. */\n public get conversation(): MJConversationEntity | null {\n return this.Conversation;\n }\n @Input() public CurrentUser!: UserInfo;\n\n /** @deprecated Use {@link CurrentUser}. */\n @Input() public set currentUser(value: UserInfo) {\n this.CurrentUser = value;\n }\n /** @deprecated Use {@link CurrentUser}. */\n public get currentUser(): UserInfo {\n return this.CurrentUser;\n }\n @Input() public AllMessages!: MJConversationDetailEntity[];\n\n /** @deprecated Use {@link AllMessages}. */\n @Input() public set allMessages(value: MJConversationDetailEntity[]) {\n this.AllMessages = value;\n }\n /** @deprecated Use {@link AllMessages}. */\n public get allMessages(): MJConversationDetailEntity[] {\n return this.AllMessages;\n }\n @Input() public IsProcessing: boolean = false;\n\n /** @deprecated Use {@link IsProcessing}. */\n @Input() public set isProcessing(value: boolean) {\n this.IsProcessing = value;\n }\n /** @deprecated Use {@link IsProcessing}. */\n public get isProcessing(): boolean {\n return this.IsProcessing;\n }\n @Input() public Artifact?: MJArtifactEntity;\n\n /** @deprecated Use {@link Artifact}. */\n @Input() public set artifact(value: MJArtifactEntity | undefined) {\n this.Artifact = value;\n }\n /** @deprecated Use {@link Artifact}. */\n public get artifact(): MJArtifactEntity | undefined {\n return this.Artifact;\n }\n @Input() public artifactVersion?: MJArtifactVersionEntity;\n /**\n * All distinct artifacts attached to this message, each at its latest version.\n * Preferred over the single `artifact`/`artifactVersion` inputs above (which are\n * retained for backward compatibility and kept pointed at the first entry).\n */\n @Input() public Artifacts: MessageArtifactRef[] = [];\n\n /** @deprecated Use {@link Artifacts}. */\n @Input() public set artifacts(value: MessageArtifactRef[]) {\n this.Artifacts = value;\n }\n /** @deprecated Use {@link Artifacts}. */\n public get artifacts(): MessageArtifactRef[] {\n return this.Artifacts;\n }\n @Input() public AgentRun: MJAIAgentRunEntityExtended | null = null;\n\n /** @deprecated Use {@link AgentRun}. */\n @Input() public set agentRun(value: MJAIAgentRunEntityExtended | null) {\n this.AgentRun = value;\n }\n /** @deprecated Use {@link AgentRun}. */\n public get agentRun(): MJAIAgentRunEntityExtended | null {\n return this.AgentRun;\n } // Passed from parent, loaded once per conversation\n @Input() public UserAvatarMap: Map<string, {imageUrl: string | null; iconClass: string | null}> = new Map();\n\n /** @deprecated Use {@link UserAvatarMap}. */\n @Input() public set userAvatarMap(value: Map<string, {imageUrl: string | null; iconClass: string | null}>) {\n this.UserAvatarMap = value;\n }\n /** @deprecated Use {@link UserAvatarMap}. */\n public get userAvatarMap(): Map<string, {imageUrl: string | null; iconClass: string | null}> {\n return this.UserAvatarMap;\n }\n @Input() public Ratings?: RatingJSON[];\n\n /** @deprecated Use {@link Ratings}. */\n @Input() public set ratings(value: RatingJSON[] | undefined) {\n this.Ratings = value;\n }\n /** @deprecated Use {@link Ratings}. */\n public get ratings(): RatingJSON[] | undefined {\n return this.Ratings;\n } // Pre-loaded ratings from parent (RatingsJSON from query)\n @Input() public IsLastMessage: boolean = false;\n\n /** @deprecated Use {@link IsLastMessage}. */\n @Input() public set isLastMessage(value: boolean) {\n this.IsLastMessage = value;\n }\n /** @deprecated Use {@link IsLastMessage}. */\n public get isLastMessage(): boolean {\n return this.IsLastMessage;\n } // Whether this is the last message in the conversation\n @Input() public Attachments: MessageAttachment[] = [];\n\n /** @deprecated Use {@link Attachments}. */\n @Input() public set attachments(value: MessageAttachment[]) {\n this.Attachments = value;\n }\n /** @deprecated Use {@link Attachments}. */\n public get attachments(): MessageAttachment[] {\n return this.Attachments;\n } // Attachments for this message\n\n /**\n * Artifacts attached to this message whose entity rows have not arrived yet.\n *\n * The parent knows these synchronously — the message-to-artifact map is already in memory —\n * while loading each artifact and version row is not. Without them the message rendered as\n * finished with nothing where the image belonged, then the card appeared unannounced seconds\n * later, which reads as \"generation failed\" rather than \"still loading\".\n *\n * Set alongside, not instead of, {@link artifacts}: on a message that already shows a report and\n * is still loading an image, both render at once. Entries whose artifact has since loaded are\n * filtered out by {@link pendingArtifactPlaceholders}.\n */\n @Input() public PendingArtifacts: readonly MessagePendingArtifactRef[] = [];\n\n /** @deprecated Use {@link PendingArtifacts}. */\n @Input() public set pendingArtifacts(value: readonly MessagePendingArtifactRef[]) {\n this.PendingArtifacts = value;\n }\n /** @deprecated Use {@link PendingArtifacts}. */\n public get pendingArtifacts(): readonly MessagePendingArtifactRef[] {\n return this.PendingArtifacts;\n }\n\n /**\n * Optional additive per-message slot template (forwarded from chat-area's\n * `mjChatSlot=\"messageExtra\"`). Rendered inside the bubble after the message\n * content, before attachments. Receives the message as `$implicit` + a named\n * `message` context binding. Null when no consumer template is projected.\n */\n @Input() public MessageExtraTemplate: TemplateRef<unknown> | null = null;\n\n /** @deprecated Use {@link MessageExtraTemplate}. */\n @Input() public set messageExtraTemplate(value: TemplateRef<unknown> | null) {\n this.MessageExtraTemplate = value;\n }\n /** @deprecated Use {@link MessageExtraTemplate}. */\n public get messageExtraTemplate(): TemplateRef<unknown> | null {\n return this.MessageExtraTemplate;\n }\n\n // --- Host-level feature gates (forwarded from mj-conversation-chat-area) ---\n // All default true so existing consumers are unaffected; set false to remove\n // the affordance entirely (the control is not rendered, not merely disabled).\n /** Show the per-message agent run-detail grid (run ID, step/token counts, $ cost). */\n @Input() public ShowAgentRunDetails: boolean = true;\n\n /** @deprecated Use {@link ShowAgentRunDetails}. */\n @Input() public set showAgentRunDetails(value: boolean) {\n this.ShowAgentRunDetails = value;\n }\n /** @deprecated Use {@link ShowAgentRunDetails}. */\n public get showAgentRunDetails(): boolean {\n return this.ShowAgentRunDetails;\n }\n /** Show the per-message reaction buttons (like / comment). */\n @Input() public ShowReactions: boolean = true;\n\n /** @deprecated Use {@link ShowReactions}. */\n @Input() public set showReactions(value: boolean) {\n this.ShowReactions = value;\n }\n /** @deprecated Use {@link ShowReactions}. */\n public get showReactions(): boolean {\n return this.ShowReactions;\n }\n /** Show the per-message thumbs rating control on completed AI messages. */\n @Input() public ShowMessageRating: boolean = true;\n\n /** @deprecated Use {@link ShowMessageRating}. */\n @Input() public set showMessageRating(value: boolean) {\n this.ShowMessageRating = value;\n }\n /** @deprecated Use {@link ShowMessageRating}. */\n public get showMessageRating(): boolean {\n return this.ShowMessageRating;\n }\n /** Allow pinning messages (the per-message pin button). */\n @Input() public AllowPinning: boolean = true;\n\n /** @deprecated Use {@link AllowPinning}. */\n @Input() public set allowPinning(value: boolean) {\n this.AllowPinning = value;\n }\n /** @deprecated Use {@link AllowPinning}. */\n public get allowPinning(): boolean {\n return this.AllowPinning;\n }\n /** Allow editing the user's own messages (the per-message edit button). */\n @Input() public AllowMessageEdit: boolean = true;\n\n /** @deprecated Use {@link AllowMessageEdit}. */\n @Input() public set allowMessageEdit(value: boolean) {\n this.AllowMessageEdit = value;\n }\n /** @deprecated Use {@link AllowMessageEdit}. */\n public get allowMessageEdit(): boolean {\n return this.AllowMessageEdit;\n }\n /** Allow deleting the user's own messages (the per-message delete button). */\n @Input() public AllowMessageDelete: boolean = true;\n\n /** @deprecated Use {@link AllowMessageDelete}. */\n @Input() public set allowMessageDelete(value: boolean) {\n this.AllowMessageDelete = value;\n }\n /** @deprecated Use {@link AllowMessageDelete}. */\n public get allowMessageDelete(): boolean {\n return this.AllowMessageDelete;\n }\n /** Host override for the AI message display name (white-label persona). Null = the agent record's name. */\n @Input() public AssistantDisplayName: string | null = null;\n\n /** @deprecated Use {@link AssistantDisplayName}. */\n @Input() public set assistantDisplayName(value: string | null) {\n this.AssistantDisplayName = value;\n }\n /** @deprecated Use {@link AssistantDisplayName}. */\n public get assistantDisplayName(): string | null {\n return this.AssistantDisplayName;\n }\n /** Host image URL for the AI message avatar. Null = the agent's Font Awesome icon. */\n @Input()\n public set AssistantAvatarUrl(value: string | null) {\n if (value !== this._assistantAvatarUrl) {\n this._assistantAvatarUrl = value;\n // A new URL gets a fresh chance even if the previous one 404'd.\n this.AssistantAvatarFailed = false;\n }\n }\n public get AssistantAvatarUrl(): string | null {\n return this._assistantAvatarUrl;\n }\n\n /** @deprecated Use {@link AssistantAvatarUrl}. */\n public get assistantAvatarUrl(): string | null {\n return this.AssistantAvatarUrl;\n }\n /** @deprecated Use {@link AssistantAvatarUrl}. */\n @Input() public set assistantAvatarUrl(value: string | null) {\n this.AssistantAvatarUrl = value;\n }\n private _assistantAvatarUrl: string | null = null;\n\n /** The last assistantAvatarUrl failed to load — fall back to the icon branch. */\n public AssistantAvatarFailed = false;\n\n /** @deprecated Use {@link AssistantAvatarFailed}. */\n public get assistantAvatarFailed() {\n return this.AssistantAvatarFailed;\n }\n /** @deprecated Use {@link AssistantAvatarFailed}. */\n public set assistantAvatarFailed(value) {\n this.AssistantAvatarFailed = value;\n }\n\n /** The avatar image URL actually rendered: trimmed, and null after a load error\n * so a broken/whitespace URL degrades to the agent icon instead of a broken-image glyph. */\n public get EffectiveAssistantAvatarUrl(): string | null {\n if (this.AssistantAvatarFailed) return null;\n const url = this._assistantAvatarUrl?.trim();\n return url ? url : null;\n }\n\n /** @deprecated Use {@link EffectiveAssistantAvatarUrl}. */\n public get effectiveAssistantAvatarUrl(): string | null {\n return this.EffectiveAssistantAvatarUrl;\n }\n\n @Output() public EditClicked = new EventEmitter<MJConversationDetailEntity>();\n\n /**\n * @deprecated Use {@link EditClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (editClicked) keeps working. Must stay AFTER EditClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public editClicked = this.EditClicked;\n @Output() public DeleteClicked = new EventEmitter<MJConversationDetailEntity>();\n\n /**\n * @deprecated Use {@link DeleteClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (deleteClicked) keeps working. Must stay AFTER DeleteClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public deleteClicked = this.DeleteClicked;\n @Output() public RetryClicked = new EventEmitter<MJConversationDetailEntity>();\n\n /**\n * @deprecated Use {@link RetryClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (retryClicked) keeps working. Must stay AFTER RetryClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public retryClicked = this.RetryClicked;\n @Output() public TestFeedbackClicked = new EventEmitter<MJConversationDetailEntity>();\n\n /**\n * @deprecated Use {@link TestFeedbackClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (testFeedbackClicked) keeps working. Must stay AFTER TestFeedbackClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public testFeedbackClicked = this.TestFeedbackClicked;\n @Output() public ArtifactClicked = new EventEmitter<{artifactId: string; versionId?: string}>();\n\n /**\n * @deprecated Use {@link ArtifactClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (artifactClicked) keeps working. Must stay AFTER ArtifactClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public artifactClicked = this.ArtifactClicked;\n @Output() public ArtifactActionPerformed = new EventEmitter<{action: string; artifactId: string}>();\n\n /**\n * @deprecated Use {@link ArtifactActionPerformed}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (artifactActionPerformed) keeps working. Must stay AFTER ArtifactActionPerformed: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public artifactActionPerformed = this.ArtifactActionPerformed;\n @Output() public MessageEdited = new EventEmitter<MJConversationDetailEntity>();\n\n /**\n * @deprecated Use {@link MessageEdited}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (messageEdited) keeps working. Must stay AFTER MessageEdited: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public messageEdited = this.MessageEdited;\n @Output() public OpenEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n\n /**\n * @deprecated Use {@link OpenEntityRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public openEntityRecord = this.OpenEntityRecord;\n @Output() public SuggestedResponseSelected = new EventEmitter<{text: string; customInput?: string}>();\n\n /**\n * @deprecated Use {@link SuggestedResponseSelected}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (suggestedResponseSelected) keeps working. Must stay AFTER SuggestedResponseSelected: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public suggestedResponseSelected = this.SuggestedResponseSelected;\n @Output() public AttachmentClicked = new EventEmitter<MessageAttachment>();\n\n /**\n * @deprecated Use {@link AttachmentClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (attachmentClicked) keeps working. Must stay AFTER AttachmentClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public attachmentClicked = this.AttachmentClicked;\n @Output() public DiagnosticRequested = new EventEmitter<string>();\n\n /**\n * @deprecated Use {@link DiagnosticRequested}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (diagnosticRequested) keeps working. Must stay AFTER DiagnosticRequested: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public diagnosticRequested = this.DiagnosticRequested; // emits messageId on Shift+Click\n @Output() public MessagePinToggled = new EventEmitter<MJConversationDetailEntity>();\n\n /**\n * @deprecated Use {@link MessagePinToggled}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (messagePinToggled) keeps working. Must stay AFTER MessagePinToggled: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public messagePinToggled = this.MessagePinToggled;\n\n /**\n * Cancelable — fired BEFORE the response form's values are sent back as a new\n * conversation message. Listeners may set `event.Cancel = true` to halt the\n * submission (e.g., a validation pass that finds required fields unfilled).\n * When canceled, the corresponding {@link afterResponseFormSubmitted} event is\n * NOT fired and `suggestedResponseSelected` is NOT emitted.\n * Follows MJ's established Before/After cancelable event pattern.\n */\n @Output() public BeforeResponseFormSubmitted = new EventEmitter<BeforeResponseFormSubmittedEventArgs>();\n\n /**\n * @deprecated Use {@link BeforeResponseFormSubmitted}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (beforeResponseFormSubmitted) keeps working. Must stay AFTER BeforeResponseFormSubmitted: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public beforeResponseFormSubmitted = this.BeforeResponseFormSubmitted;\n\n /**\n * Fired AFTER the response form's values have been submitted. Carries the form id\n * (using the message ID as a stable per-message identifier) and the submitted\n * values map. Not fired when {@link beforeResponseFormSubmitted} was canceled.\n */\n @Output() public AfterResponseFormSubmitted = new EventEmitter<AfterResponseFormSubmittedEventArgs>();\n\n /**\n * @deprecated Use {@link AfterResponseFormSubmitted}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (afterResponseFormSubmitted) keeps working. Must stay AFTER AfterResponseFormSubmitted: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() public afterResponseFormSubmitted = this.AfterResponseFormSubmitted;\n\n private _loadTime: number = Date.now();\n private _elapsedTimeInterval: any = null;\n public ElapsedTimeFormatted: string = '0:00';\n\n /** @deprecated Use {@link ElapsedTimeFormatted}. */\n public get _elapsedTimeFormatted(): string {\n return this.ElapsedTimeFormatted;\n }\n /** @deprecated Use {@link ElapsedTimeFormatted}. */\n public set _elapsedTimeFormatted(value: string) {\n this.ElapsedTimeFormatted = value;\n }\n public AgentRunDurationFormatted: string = '0:00';\n\n /** @deprecated Use {@link AgentRunDurationFormatted}. */\n public get _agentRunDurationFormatted(): string {\n return this.AgentRunDurationFormatted;\n }\n /** @deprecated Use {@link AgentRunDurationFormatted}. */\n public set _agentRunDurationFormatted(value: string) {\n this.AgentRunDurationFormatted = value;\n }\n public IsEditing: boolean = false;\n\n /** @deprecated Use {@link IsEditing}. */\n public get isEditing(): boolean {\n return this.IsEditing;\n }\n /** @deprecated Use {@link IsEditing}. */\n public set isEditing(value: boolean) {\n this.IsEditing = value;\n }\n public EditedText: string = '';\n\n /** @deprecated Use {@link EditedText}. */\n public get editedText(): string {\n return this.EditedText;\n }\n /** @deprecated Use {@link EditedText}. */\n public set editedText(value: string) {\n this.EditedText = value;\n }\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\n /** @deprecated Use {@link IsAgentDetailsExpanded}. */\n public get isAgentDetailsExpanded(): boolean {\n return this.IsAgentDetailsExpanded;\n }\n /** @deprecated Use {@link IsAgentDetailsExpanded}. */\n public set isAgentDetailsExpanded(value: boolean) {\n this.IsAgentDetailsExpanded = value;\n }\n public DetailTasks: MJTaskEntity[] = [];\n\n /** @deprecated Use {@link DetailTasks}. */\n public get detailTasks(): MJTaskEntity[] {\n return this.DetailTasks;\n }\n /** @deprecated Use {@link DetailTasks}. */\n public set detailTasks(value: MJTaskEntity[]) {\n this.DetailTasks = value;\n }\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 // Shared AI mention/suggestion engine (BaseSingleton — same instance the composer plugins use)\n private mentionAutocomplete = MentionAutocompleteService.Instance;\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private mentionParser: MentionParserService,\n private uiCommandHandler: UICommandHandlerService,\n private agentService: ConversationAgentService,\n private markdownService: MarkdownService\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 // Warm the conversation-manager-agent cache (DefaultAgentResolver chain)\n // so the synchronous isConversationManager getter returns the right answer\n // on first render. Fire-and-forget — the getter returns false until cached,\n // matching the pre-PR-2 behavior of the previous hardcoded check.\n void this.agentService.getConversationManagerAgent();\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 const recordBadge = (event.target as HTMLElement | null)?.closest?.('.mention-badge.record') as HTMLElement | null;\n if (recordBadge) {\n event.preventDefault();\n event.stopPropagation();\n this.openRecordLinkBadge(recordBadge);\n return;\n }\n if (!event.shiftKey || !this.IsAIMessage) return;\n event.preventDefault();\n event.stopPropagation();\n this.DiagnosticRequested.emit(this.message.ID);\n }\n\n /** @deprecated Use {@link OnMessageBubbleClick}. */\n public onMessageBubbleClick(event: MouseEvent): void {\n return this.OnMessageBubbleClick(event);\n }\n\n private openRecordLinkBadge(el: HTMLElement): void {\n const entityName = el.getAttribute('data-record-entity');\n const keysJson = el.getAttribute('data-record-keys');\n if (!entityName) return;\n let content: { type: 'record'; name: string; entityName: string; keys?: Record<string, string | number> };\n try {\n const keys = keysJson ? JSON.parse(keysJson) as Record<string, string | number> : {};\n content = { type: 'record', name: el.textContent?.trim() || entityName, entityName, keys };\n } catch {\n return;\n }\n const entity = this.ProviderToUse.EntityByName(entityName);\n if (!entity) {\n console.warn('Record link: unknown entity', entityName);\n return;\n }\n const compositeKey = ConversationUtility.CompositeKeyFromRecordLink(\n content,\n entity.PrimaryKeys.map(pk => pk.Name)\n );\n if (!compositeKey) {\n console.warn('Record link: incomplete primary key', entityName, keysJson);\n return;\n }\n this.OpenEntityRecord.emit({ entityName, compositeKey });\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 /** @deprecated Use {@link ElapsedTimeSinceLoad}. */\n public get elapsedTimeSinceLoad(): number {\n return this.ElapsedTimeSinceLoad;\n }\n\n public get IsAIMessage(): boolean {\n return this.message.Role?.trim().toLowerCase() === 'ai';\n }\n\n /** @deprecated Use {@link IsAIMessage}. */\n public get isAIMessage(): boolean {\n return this.IsAIMessage;\n }\n\n /**\n * The agent identity as shown in the UI: the ENGINE-resolved identity (see\n * {@link engineAgentInfo}) with the host's `assistantDisplayName` override\n * applied to the name when set. Internal logic that must compare against the\n * real agent name (e.g. {@link isConversationManager}) uses `engineAgentInfo`\n * directly, so a display override can never change routing/behavior decisions.\n */\n public get AiAgentInfo(): { name: string; iconClass: string; role: string } | null {\n const info = this.engineAgentInfo;\n if (!info) return null;\n const override = this.AssistantDisplayName?.trim();\n return override ? { ...info, name: override } : info;\n }\n\n /** @deprecated Use {@link AiAgentInfo}. */\n public get aiAgentInfo(): { name: string; iconClass: string; role: string } | null {\n return this.AiAgentInfo;\n }\n\n /** The engine-resolved agent identity — no host display overrides applied.\n * Protected (not private) so the template's run-details header — which labels\n * the REAL agent's diagnostics and record link — can read it directly. */\n protected get engineAgentInfo(): { 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.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 /** @deprecated Use {@link IsUserMessage}. */\n public get isUserMessage(): boolean {\n return this.IsUserMessage;\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 /** @deprecated Use {@link MessageSenderName}. */\n public get messageSenderName(): string {\n return this.MessageSenderName;\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 /** @deprecated Use {@link UserAvatarUrl}. */\n public get userAvatarUrl(): string | null {\n return this.UserAvatarUrl;\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 /** @deprecated Use {@link UserAvatarIconClass}. */\n public get userAvatarIconClass(): string | null {\n return this.UserAvatarIconClass;\n }\n\n public get IsConversationManager(): boolean {\n // Resolved at runtime via the conversation manager agent registered through\n // ConversationsRuntime's DefaultAgentResolver chain — explicit input wins,\n // then app-scoped Application Setting, then global Application Setting, then\n // the code-const Sage fallback. Replaces the previous hardcoded 'Sage'\n // name check. Returns false until the agent service has cached the\n // resolved agent (warmed by message-input's first routing call).\n // Compares the ENGINE-resolved name deliberately: a host assistantDisplayName\n // override renames what the user SEES, never what the component decides.\n const cmName = this.agentService.ConversationManagerAgentName;\n if (!cmName) return false;\n return this.engineAgentInfo?.name === cmName;\n }\n\n /** @deprecated Use {@link IsConversationManager}. */\n public get isConversationManager(): boolean {\n return this.IsConversationManager;\n }\n\n public get DisplayMessage(): string {\n return this._stableDisplayMessage;\n }\n\n /** @deprecated Use {@link DisplayMessage}. */\n public get displayMessage(): string {\n return this.DisplayMessage;\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 = typeof content.name === 'string' ? content.name : '';\n let iconClass = '';\n let logoURL = '';\n let configPresetName = '';\n let inlineStyle = '';\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 } else if (content.type === 'entity') {\n const entity = this.mentionAutocomplete.getAvailableEntities().find(e => UUIDsEqual(e.ID, content.id));\n name = entity ? entity.DisplayNameOrName : name;\n iconClass = this.normalizeIconClass(entity?.Icon || 'fa-solid fa-table');\n } else if (content.type === 'query') {\n const query = this.mentionAutocomplete.getAvailableQueries().find(q => UUIDsEqual(q.ID, content.id));\n if (query) name = query.Name;\n iconClass = this.normalizeIconClass(this.mentionAutocomplete.getQueriesEntityIcon());\n } else if (content.type === 'skill') {\n const skill = AIEngineBase.Instance?.Skills?.find(s => UUIDsEqual(s.ID, content.id));\n if (skill) name = skill.Name;\n iconClass = this.normalizeIconClass(skill?.IconClass || 'fa-solid fa-wand-magic-sparkles');\n // Per-skill accent color (AISkill.Color) overrides the standard skill green — same\n // logic as the composer chip (mention-editor's createMentionChip). Keep in sync.\n if (skill?.Color) {\n inlineStyle = ` style=\"background: ${this.escapeHtml(skill.Color)}; border-color: rgba(255, 255, 255, 0.35);\"`;\n }\n } else if (content.type === 'record') {\n name = (content.name ?? '').trim();\n iconClass = this.normalizeIconClass('fa-solid fa-up-right-from-square');\n }\n\n const iconOnly = content.type === 'record' && !name;\n const escapedName = name ? this.escapeHtml(name) : '';\n const typeClass =\n (content.type === 'agent' || content.type === 'entity' || content.type === 'query' || content.type === 'skill' || content.type === 'record' ? content.type : 'user')\n + (iconOnly ? ' icon-only' : '');\n\n // Build preset indicator HTML if present\n const presetIndicator = configPresetName\n ? `<span class=\"preset-indicator\">${this.escapeHtml(configPresetName)}</span>`\n : '';\n\n const recordOpenLabel = content.type === 'record'\n ? (name ? `Open ${name}` : `Open ${content.entityName || 'record'}`)\n : '';\n const recordAttrs = content.type === 'record' && content.entityName\n ? ` role=\"link\" title=\"${this.escapeHtml(recordOpenLabel)}\" aria-label=\"${this.escapeHtml(recordOpenLabel)}\" data-record-entity=\"${this.escapeHtml(content.entityName)}\" data-record-keys=\"${this.escapeHtml(JSON.stringify(ConversationUtility.RecordLinkKeyMap(content)))}\"`\n : '';\n\n // Generate HTML based on whether we have an icon\n if (logoURL) {\n return `<span class=\"mention-badge ${typeClass}\"${inlineStyle}${recordAttrs}><img src=\"${this.escapeHtml(logoURL)}\" alt=\"\" />${escapedName}${presetIndicator}</span>`;\n } else if (iconClass) {\n return `<span class=\"mention-badge ${typeClass}\"${inlineStyle}${recordAttrs}><i class=\"${this.escapeHtml(iconClass)}\" aria-hidden=\"true\"></i>${escapedName}${presetIndicator}</span>`;\n } else {\n return `<span class=\"mention-badge ${typeClass}\"${inlineStyle}${recordAttrs}>${escapedName}${presetIndicator}</span>`;\n }\n }\n\n /**\n * Normalize a Font Awesome icon class to include a style family (defaults to fa-solid)\n * so stored values that omit one (e.g. 'fa-table') still render.\n */\n private normalizeIconClass(iconClass: string): string {\n if (!iconClass) return 'fa-solid fa-table';\n if (iconClass.includes('fa-') && !/\\b(fa-solid|fa-regular|fa-light|fa-thin|fa-duotone|fa-brands|fa-sharp)\\b/.test(iconClass)) {\n return `fa-solid ${iconClass}`;\n }\n return iconClass;\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 // Textarea values render as formatted Markdown — agent-authored long-form content\n // (e.g. the approved Plan in the plan-approval response) is Markdown by convention,\n // and the submitted-form pill should look as good as the live form's preview did.\n // Script safety: the whole message passes through mj-markdown's stripJavaScript.\n if (field.type === 'textarea' && typeof field.value === 'string' && field.value.trim().length > 0) {\n try {\n return `<div class=\"field-answer-markdown\">${this.markdownService.parse(field.value)}</div>`;\n } catch {\n // fall through to the escaped-plaintext path below\n }\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 /** @deprecated Use {@link IsInProgressAIMessage}. */\n public get isInProgressAIMessage(): boolean {\n return this.IsInProgressAIMessage;\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 /** @deprecated Use {@link IsAgentRunActive}. */\n public get isAgentRunActive(): boolean {\n return this.IsAgentRunActive;\n }\n\n public get MessageStatus(): 'Complete' | 'In-Progress' | 'Error' {\n return this.message.Status || 'Complete';\n }\n\n /** @deprecated Use {@link MessageStatus}. */\n public get messageStatus(): 'Complete' | 'In-Progress' | 'Error' {\n return this.MessageStatus;\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 /** @deprecated Use {@link GetStatusText}. */\n public getStatusText(): string {\n return this.GetStatusText();\n }\n\n public get IsFirstMessageInConversation(): boolean {\n return this.AllMessages.indexOf(this.message) === 0;\n }\n\n /** @deprecated Use {@link IsFirstMessageInConversation}. */\n public get isFirstMessageInConversation(): boolean {\n return this.IsFirstMessageInConversation;\n }\n\n public get IsLastMessageInConversation(): boolean {\n return this.AllMessages.indexOf(this.message) === this.AllMessages.length - 1;\n }\n\n /** @deprecated Use {@link IsLastMessageInConversation}. */\n public get isLastMessageInConversation(): boolean {\n return this.IsLastMessageInConversation;\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 /** @deprecated Use {@link ShouldShowRating}. */\n public shouldShowRating(): boolean {\n return this.ShouldShowRating();\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 /** @deprecated Use {@link HasRatings}. */\n public hasRatings(): boolean {\n return this.HasRatings();\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 /** @deprecated Use {@link GetRatingCount}. */\n public getRatingCount(): number {\n return this.GetRatingCount();\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 /** @deprecated Use {@link GetThumbsUpCount}. */\n public getThumbsUpCount(): number {\n return this.GetThumbsUpCount();\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 /** @deprecated Use {@link GetThumbsDownCount}. */\n public getThumbsDownCount(): number {\n return this.GetThumbsDownCount();\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 /** @deprecated Use {@link ShouldShowInlineActions}. */\n public shouldShowInlineActions(): boolean {\n return this.ShouldShowInlineActions();\n }\n\n /**\n * The artifacts to render under this message, one card each. Prefers the\n * `artifacts` array; falls back to the legacy single `artifact`/`artifactVersion`\n * inputs so older callers that set only those keep working.\n */\n public get DisplayArtifacts(): MessageArtifactRef[] {\n if (this.Artifacts && this.Artifacts.length > 0) {\n return this.Artifacts;\n }\n if (this.Artifact && this.artifactVersion) {\n return [{ artifact: this.Artifact, version: this.artifactVersion }];\n }\n return [];\n }\n\n /** @deprecated Use {@link DisplayArtifacts}. */\n public get displayArtifacts(): MessageArtifactRef[] {\n return this.DisplayArtifacts;\n }\n\n public get HasArtifact(): boolean {\n return this.DisplayArtifacts.length > 0;\n }\n\n /** @deprecated Use {@link HasArtifact}. */\n public get hasArtifact(): boolean {\n return this.HasArtifact;\n }\n\n /**\n * Label for a pending artifact. Says what is happening as well as to what — a bare artifact name\n * beside a spinner reads as a title, not as progress, which is the confusion this whole change\n * exists to remove. Matches the media previews' \"Loading image...\" phrasing.\n */\n public PendingLabel(pending: MessagePendingArtifactRef): string {\n return pending.artifactName ? `Loading ${pending.artifactName}...` : 'Loading attachment...';\n }\n\n /** @deprecated Use {@link PendingLabel}. */\n public pendingLabel(pending: MessagePendingArtifactRef): string {\n return this.PendingLabel(pending);\n }\n\n /**\n * The pending artifacts that still have no card of their own, filtered per artifact rather than\n * suppressed wholesale: a message can hold a loaded report and an in-flight image at once, and\n * gating on `displayArtifacts.length` would leave that image's window silent.\n */\n public get PendingArtifactPlaceholders(): readonly MessagePendingArtifactRef[] {\n // Shared constant in the steady state, which the parent now keeps us in most of the time by\n // only publishing artifacts that are genuinely still loading. The component is CheckAlways and\n // runs a per-second refresh while an agent run is active, so allocating here would cost for\n // the life of every message.\n if (this.PendingArtifacts.length === 0) {\n return NO_PENDING_ARTIFACTS;\n }\n // Case-insensitive, not string equality: these two IDs come from different sources — one from the\n // conversation query, one off a loaded entity — and SQL Server returns upper-case UUIDs where\n // PostgreSQL returns lower-case. A case-sensitive match left a placeholder sitting above the\n // very card it was waiting for. See guides/UUID_COMPARISON_GUIDE.md.\n // Normalize into a Set rather than a nested `.some(UUIDsEqual(...))`: UUIDsEqual's `===` fast\n // path misses whenever the two IDs differ, so each miss allocated two lowercased strings, and\n // the nested scan paid that n*m times. This getter is re-read on every change-detection pass of\n // a CheckAlways component, once per message.\n const loadedIds = new Set(this.DisplayArtifacts.map(a => NormalizeUUID(a.artifact.ID)));\n return this.PendingArtifacts.filter(p => !loadedIds.has(NormalizeUUID(p.artifactId)));\n }\n\n /** @deprecated Use {@link PendingArtifactPlaceholders}. */\n public get pendingArtifactPlaceholders(): readonly MessagePendingArtifactRef[] {\n return this.PendingArtifactPlaceholders;\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 /** @deprecated Use {@link IsSystemArtifact}. */\n public get isSystemArtifact(): boolean {\n return this.IsSystemArtifact;\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 /** @deprecated Use {@link TimePillText}. */\n public get timePillText(): string | null {\n return this.TimePillText;\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 const fromMessage = this.FormattedGenerationTime;\n if (fromMessage) {\n return fromMessage;\n }\n\n // Last resort: the live elapsed-time string is frozen at the value it had\n // when status flipped to Complete (the interval is cleared in ngDoCheck). If\n // the same component instance handled the in-progress phase, this is the\n // accurate duration the user just watched tick. If the message arrived already\n // complete (no in-progress phase observed), `_elapsedTimeFormatted` is still\n // its initial '0:00' — return null in that case so the time pill doesn't render\n // a misleading zero.\n return this.ElapsedTimeFormatted !== '0:00' ? this.ElapsedTimeFormatted : null;\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 /** @deprecated Use {@link FormattedGenerationTime}. */\n public get formattedGenerationTime(): string | null {\n return this.FormattedGenerationTime;\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 /** @deprecated Use {@link MessageClasses}. */\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 /** @deprecated Use {@link IsMessageEdited}. */\n public get isMessageEdited(): boolean {\n return this.IsMessageEdited;\n }\n\n public OnEditClick(): void {\n if (!this.IsProcessing && !this.IsEditing) {\n this.StartEditing();\n }\n }\n\n /** @deprecated Use {@link OnEditClick}. */\n public onEditClick(): void {\n return this.OnEditClick();\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 /** @deprecated Use {@link StartEditing}. */\n public startEditing(): void {\n return this.StartEditing();\n }\n\n public CancelEditing(): void {\n this.IsEditing = false;\n this.EditedText = '';\n this.originalText = '';\n this.cdRef.detectChanges();\n }\n\n /** @deprecated Use {@link CancelEditing}. */\n public cancelEditing(): void {\n return this.CancelEditing();\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 /** @deprecated Use {@link SaveEdit}. */\n public async saveEdit(): Promise<void> {\n return this.SaveEdit();\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 /** @deprecated Use {@link OnEditKeydown}. */\n public onEditKeydown(event: KeyboardEvent): void {\n return this.OnEditKeydown(event);\n }\n\n public OnDeleteClick(): void {\n if (!this.IsProcessing) {\n this.DeleteClicked.emit(this.message);\n }\n }\n\n /** @deprecated Use {@link OnDeleteClick}. */\n public onDeleteClick(): void {\n return this.OnDeleteClick();\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 /** @deprecated Use {@link OnTestFeedbackClick}. */\n public onTestFeedbackClick(): void {\n return this.OnTestFeedbackClick();\n }\n\n public OnRetryClick(): void {\n if (!this.IsProcessing && this.MessageStatus === 'Error') {\n this.RetryClicked.emit(this.message);\n }\n }\n\n /** @deprecated Use {@link OnRetryClick}. */\n public onRetryClick(): void {\n return this.OnRetryClick();\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 /** @deprecated Use {@link OnArtifactClick}. */\n public onArtifactClick(): void {\n return this.OnArtifactClick();\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 /** @deprecated Use {@link OnArtifactActionPerformed}. */\n public onArtifactActionPerformed(event: {action: string; artifact: MJArtifactEntity; version?: MJArtifactVersionEntity}): void {\n return this.OnArtifactActionPerformed(event);\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 /** @deprecated Use {@link ToggleReaction}. */\n public toggleReaction(type: 'like' | 'comment'): void {\n return this.ToggleReaction(type);\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 /** @deprecated Use {@link OnSaveArtifact}. */\n public onSaveArtifact(event: Event): void {\n return this.OnSaveArtifact(event);\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 /** @deprecated Use {@link OnShareArtifact}. */\n public onShareArtifact(event: Event): void {\n return this.OnShareArtifact(event);\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 /** @deprecated Use {@link OnExportArtifact}. */\n public onExportArtifact(event: Event): void {\n return this.OnExportArtifact(event);\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 /** @deprecated Use {@link OnAttachmentClick}. */\n public onAttachmentClick(attachment: MessageAttachment): void {\n return this.OnAttachmentClick(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 /** @deprecated Use {@link HasAttachments}. */\n public get hasAttachments(): boolean {\n return this.HasAttachments;\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 /** @deprecated Use {@link ImageAttachments}. */\n public get imageAttachments(): MessageAttachment[] {\n return this.ImageAttachments;\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 /** @deprecated Use {@link FormatFileSize}. */\n public formatFileSize(bytes: number): string {\n return this.FormatFileSize(bytes);\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 /** @deprecated Use {@link BadgeTextFor}. */\n public badgeTextFor(attachment: MessageAttachment): string {\n return this.BadgeTextFor(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 /** @deprecated Use {@link HasAgentRun}. */\n public get hasAgentRun(): boolean {\n return this.HasAgentRun;\n }\n\n /**\n * Whether the agent-run gear's expanded panel would actually render anything —\n * used to gate the gear button itself so it doesn't appear as a dead control\n * that opens an empty popup. The panel hosts, in order: the run-details section\n * (only when `showAgentRunDetails`), associated tasks, and (non-last messages\n * only) the delete / rating / pin overflow. With `showAgentRunDetails=false` and\n * none of those enabled — a white-labeled end-user surface — the gear vanishes\n * entirely instead of opening onto nothing.\n *\n * Each arm below mirrors the corresponding template condition EXACTLY; keep them\n * in lockstep with `message-item.component.html`'s `.agent-details-panel` block.\n *\n * Defaults leave it unchanged: with `showAgentRunDetails=true` (the default) this\n * is unconditionally true, so the gear renders exactly as before — including the\n * pre-existing window where `agentRun` hasn't loaded yet and the panel is briefly\n * empty. That window is deliberately preserved (byte-identical defaults) rather\n * than fixed here.\n */\n public get HasAgentDetailsPanelContent(): boolean {\n // Run-details enabled → gear shows for any agent-run message (the button\n // already AND-gates hasAgentRun), exactly as before the gate existed — even\n // before the agentRun object finishes loading. This keeps the default\n // (showAgentRunDetails=true) byte-identical.\n if (this.ShowAgentRunDetails) return true;\n if (this.DetailTasks.length > 0) return true;\n if (!this.IsLastMessage) {\n if (this.AllowMessageDelete && this.IsConversationOwner) return true;\n if (this.AllowPinning) return true;\n // The rating only renders inside the template's `messageStatus === 'Complete'`\n // branch, so an incomplete/errored message must NOT count it as content —\n // otherwise the gear reappears over an empty panel, which is the whole bug\n // this getter exists to prevent.\n if (this.ShowMessageRating && this.MessageStatus === 'Complete') return true;\n }\n return false;\n }\n\n /** @deprecated Use {@link HasAgentDetailsPanelContent}. */\n public get hasAgentDetailsPanelContent(): boolean {\n return this.HasAgentDetailsPanelContent;\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 /** @deprecated Use {@link ToggleAgentDetails}. */\n public async toggleAgentDetails(): Promise<void> {\n return this.ToggleAgentDetails();\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 /** @deprecated Use {@link AgentRunDuration}. */\n public get agentRunDuration(): string | null {\n return this.AgentRunDuration;\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 /** @deprecated Use {@link AgentRunTotalTokens}. */\n public get agentRunTotalTokens(): number {\n return this.AgentRunTotalTokens;\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 /** @deprecated Use {@link AgentRunTotalCost}. */\n public get agentRunTotalCost(): number {\n return this.AgentRunTotalCost;\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 /** @deprecated Use {@link AgentRunStepCount}. */\n public get agentRunStepCount(): number {\n return this.AgentRunStepCount;\n }\n\n /**\n * Format number with commas\n */\n public FormatNumber(num: number): string {\n return num.toLocaleString();\n }\n\n /** @deprecated Use {@link FormatNumber}. */\n public formatNumber(num: number): string {\n return this.FormatNumber(num);\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 /** @deprecated Use {@link OpenAgentRunRecord}. */\n public openAgentRunRecord(): void {\n return this.OpenAgentRunRecord();\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 /** @deprecated Use {@link OpenAgentRecord}. */\n public openAgentRecord(): void {\n return this.OpenAgentRecord();\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 /** @deprecated Use {@link IsConversationOwner}. */\n public get isConversationOwner(): boolean {\n return this.IsConversationOwner;\n }\n\n /**\n * Get agent response form from message\n * Uses ResponseForm property from MJConversationDetailEntity\n *\n * Cached against the raw JSON string so the getter returns a stable object reference\n * for the same input. Without caching, `JSON.parse` produces a new object every call,\n * which makes Angular's `@if (responseForm)` template index churn between CD passes —\n * the classic NG0100 \"ExpressionChangedAfterItHasBeenCheckedError\" we used to hit here.\n */\n private _responseFormRaw: string | null | undefined = undefined;\n private _responseFormCache: AgentResponseForm | null = null;\n public get ResponseForm(): AgentResponseForm | null {\n const rawData = this.message.ResponseForm ?? null;\n if (rawData === this._responseFormRaw) return this._responseFormCache;\n this._responseFormRaw = rawData;\n if (!rawData) {\n this._responseFormCache = null;\n return null;\n }\n try {\n this._responseFormCache = (JSON.parse(rawData) as AgentResponseForm) || null;\n } catch (error) {\n console.error('Failed to parse response form:', error, 'Raw data:', rawData);\n this._responseFormCache = null;\n }\n return this._responseFormCache;\n }\n\n /** @deprecated Use {@link ResponseForm}. */\n public get responseForm(): AgentResponseForm | null {\n return this.ResponseForm;\n }\n\n /**\n * Get actionable commands from message\n * Uses ActionableCommands property from MJConversationDetailEntity\n *\n * Cached against the raw JSON string (see {@link responseForm} for rationale).\n */\n private _actionableCommandsRaw: string | null | undefined = undefined;\n private _actionableCommandsCache: ActionableCommand[] = [];\n public get ActionableCommands(): ActionableCommand[] {\n const rawData = this.message.ActionableCommands ?? null;\n if (rawData === this._actionableCommandsRaw) return this._actionableCommandsCache;\n this._actionableCommandsRaw = rawData;\n if (!rawData) {\n this._actionableCommandsCache = [];\n return this._actionableCommandsCache;\n }\n try {\n const commands = JSON.parse(rawData);\n this._actionableCommandsCache = Array.isArray(commands) ? commands : [];\n } catch (error) {\n console.error('Failed to parse actionable commands:', error);\n this._actionableCommandsCache = [];\n }\n return this._actionableCommandsCache;\n }\n\n /** @deprecated Use {@link ActionableCommands}. */\n public get actionableCommands(): ActionableCommand[] {\n return this.ActionableCommands;\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 // ── PR 2c follow-up: Before/After cancelable event wiring ──\n // Emit beforeResponseFormSubmitted so consumers can veto (e.g., a validation\n // pass that finds required fields unfilled). Cancel propagates synchronously\n // through the message-list + chat-area re-emit bindings, so by the time .emit()\n // returns, event.Cancel reflects every subscriber's final answer. We use the\n // message ID as the form id — each AgentResponseForm is attached to exactly\n // one message, giving a stable per-message identifier.\n const beforeEvent = new BeforeResponseFormSubmittedEventArgs(this.message.ID, formData);\n this.BeforeResponseFormSubmitted.emit(beforeEvent);\n if (beforeEvent.Cancel) {\n return;\n }\n\n // Plan-approval semantics: approving a plan is a HIGHER-ORDER signal, not just a form\n // reply — it ends the plan phase, so the conversation switches out of Plan Mode and the\n // follow-up run executes the approved plan instead of planning again. Rejection leaves\n // Plan Mode on so the agent re-plans (the optional feedback field steers it).\n this.applyPlanDecision(formData);\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 this.AfterResponseFormSubmitted.emit(\n new AfterResponseFormSubmittedEventArgs(this.message.ID, formData)\n );\n }\n\n /** @deprecated Use {@link OnFormSubmitted}. */\n public onFormSubmitted(formData: Record<string, any>): void {\n return this.OnFormSubmitted(formData);\n }\n\n /**\n * Detects a plan-approval form submission (the Plan Mode HITL card — identified by its\n * 'plan' + 'decision' questions, see BaseAgent.buildPlanApprovalForm) and applies the\n * decision's conversation-level effect: APPROVE switches this conversation out of Plan\n * Mode (plan phase complete — execute); REJECT intentionally leaves it on (re-plan).\n */\n private applyPlanDecision(formData: Record<string, unknown>): void {\n const form = this.ResponseForm;\n const isPlanForm =\n !!form?.questions.some(q => q.id === 'plan') &&\n !!form?.questions.some(q => q.id === 'decision');\n if (!isPlanForm) {\n return;\n }\n if (formData['decision'] === 'approve' && this.message.ConversationID) {\n PlanModePreference.Set(this.message.ConversationID, false);\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 conversationId: this.message.ConversationID,\n conversationDetailId: this.message.ID\n });\n } catch (error) {\n console.error('Failed to execute command:', command, error);\n }\n }\n\n /** @deprecated Use {@link OnCommandExecuted}. */\n public async onCommandExecuted(command: ActionableCommand): Promise<void> {\n return this.OnCommandExecuted(command);\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 [class.avatar-has-image]=\"isAIMessage && effectiveAssistantAvatarUrl !== null\">\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 @if (effectiveAssistantAvatarUrl) {\n <img [src]=\"effectiveAssistantAvatarUrl\" alt=\"Assistant avatar\" class=\"avatar-image\"\n (error)=\"assistantAvatarFailed = true\" />\n } @else {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\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 <!-- Edit (owner's completed user messages) — opens the inline editor; the server\n sets OriginalMessageChanged when the text actually changes on save -->\n @if (allowMessageEdit && isUserMessage && isConversationOwner && !isEditing && messageStatus === 'Complete') {\n <span class=\"message-edit-icon\" (click)=\"onEditClick()\" title=\"Edit message\">\n <i class=\"fas fa-pen\"></i>\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 Rendered only when its panel would actually have content, so it never\n appears as a dead control opening an empty popup (e.g. a white-label\n surface with showAgentRunDetails=false and no message actions). -->\n @if (hasAgentRun && hasAgentDetailsPanelContent) {\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 <!-- messageExtra slot — per-message additive decoration projected by the\n consumer via `mjChatSlot=\"messageExtra\"`. Renders after the message\n content, before attachments. Receives the message as $implicit. -->\n @if (messageExtraTemplate) {\n <ng-container *ngTemplateOutlet=\"messageExtraTemplate; context: {\n $implicit: message,\n message: message\n }\"></ng-container>\n }\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 Cards — one per distinct artifact on this message -->\n @for (a of displayArtifacts; track a.artifact.ID) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"a.artifact.Visibility === 'System Only'\">\n <mj-artifact-message-card\n [artifactId]=\"a.artifact.ID\"\n [artifact]=\"a.artifact\"\n [artifactVersion]=\"a.version\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- One per attached artifact whose rows are still loading. Rendered AFTER the loaded\n cards, so an artifact arriving appends rather than reordering what is already on\n screen. Carries the same system-artifact de-emphasis as the card it becomes. -->\n @for (pending of pendingArtifactPlaceholders; track pending.artifactId) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"pending.visibility === 'System Only'\">\n <div class=\"artifact-pending\">\n <mj-loading [text]=\"pendingLabel(pending)\" size=\"small\"></mj-loading>\n </div>\n </div>\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 (allowMessageDelete && 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 @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingEntityName]=\"message.EntityInfo.Name || 'MJ: Conversation Details'\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\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 </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 && showAgentRunDetails) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <!-- Deliberately the ENGINE-resolved name: this header labels the real\n agent's diagnostics, and the link opens the real agent record — a\n host assistantDisplayName override must not relabel either. -->\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ engineAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <!-- Run-detail grid (run ID, step/token counts, $ cost, status) — developer/\n observability data. The whole run-details section (this grid AND its\n header above) is gated on showAgentRunDetails at the panel root, so a\n white-labeled surface hides all of it; the delete/pin/rating overflow\n below is a sibling block (outside this @if) and still renders. -->\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 (allowMessageDelete && 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 @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\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 } @else if (allowPinning) {\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 (showReactions && !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>"]}
|