@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.2
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 +43 -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 +1191 -124
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +2816 -785
- 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 +42 -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 +93 -21
- 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 +49 -5
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +140 -26
- 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 +613 -74
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1390 -422
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +490 -29
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +1088 -244
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +297 -29
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +598 -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 +891 -292
- 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 +113 -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 +47 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +85 -20
- 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-liveness-dom.service.d.ts +42 -0
- package/dist/lib/services/conversation-liveness-dom.service.d.ts.map +1 -0
- package/dist/lib/services/conversation-liveness-dom.service.js +74 -0
- package/dist/lib/services/conversation-liveness-dom.service.js.map +1 -0
- 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 +56 -5
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +113 -16
- 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 +70 -0
- package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
- package/dist/lib/utils/agent-turn-routing.js +84 -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/decision-routing.d.ts +68 -0
- package/dist/lib/utils/decision-routing.d.ts.map +1 -0
- package/dist/lib/utils/decision-routing.js +101 -0
- package/dist/lib/utils/decision-routing.js.map +1 -0
- 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 +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +8 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +32 -32
|
@@ -3,7 +3,7 @@ import { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
|
|
|
3
3
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
4
4
|
import { MessageItemComponent } from './message-item.component';
|
|
5
5
|
import { RealtimeSessionTimelineCardComponent } from '../realtime/realtime-session-timeline-card.component';
|
|
6
|
-
import {
|
|
6
|
+
import { SelectDistinctLatestArtifacts } from '../../utils/distinct-artifacts';
|
|
7
7
|
import { BuildConversationTimeline } from '../../utils/realtime-session-timeline';
|
|
8
8
|
import { DEFAULT_TRANSCRIPT_PAGE_SIZE } from '../../utils/conversation-detail-window';
|
|
9
9
|
import { ResolveDateJumpTarget } from '../../utils/date-jump';
|
|
@@ -95,21 +95,124 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
95
95
|
cdRef;
|
|
96
96
|
hostRef;
|
|
97
97
|
messages = [];
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
98
|
+
Conversation;
|
|
99
|
+
/** @deprecated Use {@link Conversation}. */
|
|
100
|
+
set conversation(value) {
|
|
101
|
+
this.Conversation = value;
|
|
102
|
+
}
|
|
103
|
+
/** @deprecated Use {@link Conversation}. */
|
|
104
|
+
get conversation() {
|
|
105
|
+
return this.Conversation;
|
|
106
|
+
}
|
|
107
|
+
CurrentUser;
|
|
108
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
109
|
+
set currentUser(value) {
|
|
110
|
+
this.CurrentUser = value;
|
|
111
|
+
}
|
|
112
|
+
/** @deprecated Use {@link CurrentUser}. */
|
|
113
|
+
get currentUser() {
|
|
114
|
+
return this.CurrentUser;
|
|
115
|
+
}
|
|
116
|
+
IsProcessing = false;
|
|
117
|
+
/** @deprecated Use {@link IsProcessing}. */
|
|
118
|
+
set isProcessing(value) {
|
|
119
|
+
this.IsProcessing = value;
|
|
120
|
+
}
|
|
121
|
+
/** @deprecated Use {@link IsProcessing}. */
|
|
122
|
+
get isProcessing() {
|
|
123
|
+
return this.IsProcessing;
|
|
124
|
+
}
|
|
101
125
|
/** Whether the built-in "No messages yet" filler renders for empty conversations. Hosts with their own empty-state chrome set false. */
|
|
102
|
-
|
|
126
|
+
ShowEmptyFill = true;
|
|
127
|
+
/** @deprecated Use {@link ShowEmptyFill}. */
|
|
128
|
+
set showEmptyFill(value) {
|
|
129
|
+
this.ShowEmptyFill = value;
|
|
130
|
+
}
|
|
131
|
+
/** @deprecated Use {@link ShowEmptyFill}. */
|
|
132
|
+
get showEmptyFill() {
|
|
133
|
+
return this.ShowEmptyFill;
|
|
134
|
+
}
|
|
103
135
|
/** Whether the sticky date header + jump-to-date dropdown render. */
|
|
104
|
-
|
|
136
|
+
ShowDateNavigation = true;
|
|
137
|
+
/** @deprecated Use {@link ShowDateNavigation}. */
|
|
138
|
+
set showDateNavigation(value) {
|
|
139
|
+
this.ShowDateNavigation = value;
|
|
140
|
+
}
|
|
141
|
+
/** @deprecated Use {@link ShowDateNavigation}. */
|
|
142
|
+
get showDateNavigation() {
|
|
143
|
+
return this.ShowDateNavigation;
|
|
144
|
+
}
|
|
105
145
|
// Per-message feature gates — forwarded onto each MessageItemComponent instance
|
|
106
146
|
// (see applyMessageItemFeatureFlags). All default true.
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
147
|
+
ShowAgentRunDetails = true;
|
|
148
|
+
/** @deprecated Use {@link ShowAgentRunDetails}. */
|
|
149
|
+
set showAgentRunDetails(value) {
|
|
150
|
+
this.ShowAgentRunDetails = value;
|
|
151
|
+
}
|
|
152
|
+
/** @deprecated Use {@link ShowAgentRunDetails}. */
|
|
153
|
+
get showAgentRunDetails() {
|
|
154
|
+
return this.ShowAgentRunDetails;
|
|
155
|
+
}
|
|
156
|
+
ShowReactions = true;
|
|
157
|
+
/** @deprecated Use {@link ShowReactions}. */
|
|
158
|
+
set showReactions(value) {
|
|
159
|
+
this.ShowReactions = value;
|
|
160
|
+
}
|
|
161
|
+
/** @deprecated Use {@link ShowReactions}. */
|
|
162
|
+
get showReactions() {
|
|
163
|
+
return this.ShowReactions;
|
|
164
|
+
}
|
|
165
|
+
ShowMessageRating = true;
|
|
166
|
+
/** @deprecated Use {@link ShowMessageRating}. */
|
|
167
|
+
set showMessageRating(value) {
|
|
168
|
+
this.ShowMessageRating = value;
|
|
169
|
+
}
|
|
170
|
+
/** @deprecated Use {@link ShowMessageRating}. */
|
|
171
|
+
get showMessageRating() {
|
|
172
|
+
return this.ShowMessageRating;
|
|
173
|
+
}
|
|
174
|
+
AllowPinning = true;
|
|
175
|
+
/** @deprecated Use {@link AllowPinning}. */
|
|
176
|
+
set allowPinning(value) {
|
|
177
|
+
this.AllowPinning = value;
|
|
178
|
+
}
|
|
179
|
+
/** @deprecated Use {@link AllowPinning}. */
|
|
180
|
+
get allowPinning() {
|
|
181
|
+
return this.AllowPinning;
|
|
182
|
+
}
|
|
183
|
+
AllowMessageEdit = true;
|
|
184
|
+
/** @deprecated Use {@link AllowMessageEdit}. */
|
|
185
|
+
set allowMessageEdit(value) {
|
|
186
|
+
this.AllowMessageEdit = value;
|
|
187
|
+
}
|
|
188
|
+
/** @deprecated Use {@link AllowMessageEdit}. */
|
|
189
|
+
get allowMessageEdit() {
|
|
190
|
+
return this.AllowMessageEdit;
|
|
191
|
+
}
|
|
192
|
+
AllowMessageDelete = true;
|
|
193
|
+
/** @deprecated Use {@link AllowMessageDelete}. */
|
|
194
|
+
set allowMessageDelete(value) {
|
|
195
|
+
this.AllowMessageDelete = value;
|
|
196
|
+
}
|
|
197
|
+
/** @deprecated Use {@link AllowMessageDelete}. */
|
|
198
|
+
get allowMessageDelete() {
|
|
199
|
+
return this.AllowMessageDelete;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Hides response forms and actionable commands on each message.
|
|
203
|
+
* Restamped onto already-rendered items — they are created dynamically.
|
|
204
|
+
*/
|
|
205
|
+
set ReadOnly(value) {
|
|
206
|
+
if (value === this._readOnly) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
this._readOnly = value;
|
|
210
|
+
this.restampAssistantIdentity();
|
|
211
|
+
}
|
|
212
|
+
get ReadOnly() {
|
|
213
|
+
return this._readOnly;
|
|
214
|
+
}
|
|
215
|
+
_readOnly = false;
|
|
113
216
|
// ── Windowed-transcript paging state ────────────────────────────────────────
|
|
114
217
|
// The list renders only the LOADED window, not the whole conversation. These two
|
|
115
218
|
// describe what lies above it. Unused until the Phase 5 sentinel lands; wired now so
|
|
@@ -192,39 +295,103 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
192
295
|
// restamp the ALREADY-rendered items or existing bubbles keep the old identity
|
|
193
296
|
// until the next messages-array mutation. ──
|
|
194
297
|
/** Display name shown on AI messages. Null = the engine-resolved agent name. */
|
|
195
|
-
set
|
|
298
|
+
set AssistantDisplayName(value) {
|
|
196
299
|
if (value !== this._assistantDisplayName) {
|
|
197
300
|
this._assistantDisplayName = value;
|
|
198
301
|
this.restampAssistantIdentity();
|
|
199
302
|
}
|
|
200
303
|
}
|
|
201
|
-
get
|
|
304
|
+
get AssistantDisplayName() {
|
|
202
305
|
return this._assistantDisplayName;
|
|
203
306
|
}
|
|
307
|
+
/** @deprecated Use {@link AssistantDisplayName}. */
|
|
308
|
+
get assistantDisplayName() {
|
|
309
|
+
return this.AssistantDisplayName;
|
|
310
|
+
}
|
|
311
|
+
/** @deprecated Use {@link AssistantDisplayName}. */
|
|
312
|
+
set assistantDisplayName(value) {
|
|
313
|
+
this.AssistantDisplayName = value;
|
|
314
|
+
}
|
|
204
315
|
_assistantDisplayName = null;
|
|
205
316
|
/** Image URL for the AI message avatar. Null = the agent's Font Awesome icon. */
|
|
206
|
-
set
|
|
317
|
+
set AssistantAvatarUrl(value) {
|
|
207
318
|
if (value !== this._assistantAvatarUrl) {
|
|
208
319
|
this._assistantAvatarUrl = value;
|
|
209
320
|
this.restampAssistantIdentity();
|
|
210
321
|
}
|
|
211
322
|
}
|
|
212
|
-
get
|
|
323
|
+
get AssistantAvatarUrl() {
|
|
213
324
|
return this._assistantAvatarUrl;
|
|
214
325
|
}
|
|
326
|
+
/** @deprecated Use {@link AssistantAvatarUrl}. */
|
|
327
|
+
get assistantAvatarUrl() {
|
|
328
|
+
return this.AssistantAvatarUrl;
|
|
329
|
+
}
|
|
330
|
+
/** @deprecated Use {@link AssistantAvatarUrl}. */
|
|
331
|
+
set assistantAvatarUrl(value) {
|
|
332
|
+
this.AssistantAvatarUrl = value;
|
|
333
|
+
}
|
|
215
334
|
_assistantAvatarUrl = null;
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
335
|
+
ArtifactMap = new Map();
|
|
336
|
+
/** @deprecated Use {@link ArtifactMap}. */
|
|
337
|
+
set artifactMap(value) {
|
|
338
|
+
this.ArtifactMap = value;
|
|
339
|
+
}
|
|
340
|
+
/** @deprecated Use {@link ArtifactMap}. */
|
|
341
|
+
get artifactMap() {
|
|
342
|
+
return this.ArtifactMap;
|
|
343
|
+
}
|
|
344
|
+
AgentRunMap = new Map();
|
|
345
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
346
|
+
set agentRunMap(value) {
|
|
347
|
+
this.AgentRunMap = value;
|
|
348
|
+
}
|
|
349
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
350
|
+
get agentRunMap() {
|
|
351
|
+
return this.AgentRunMap;
|
|
352
|
+
}
|
|
353
|
+
RatingsMap = new Map();
|
|
354
|
+
/** @deprecated Use {@link RatingsMap}. */
|
|
355
|
+
set ratingsMap(value) {
|
|
356
|
+
this.RatingsMap = value;
|
|
357
|
+
}
|
|
358
|
+
/** @deprecated Use {@link RatingsMap}. */
|
|
359
|
+
get ratingsMap() {
|
|
360
|
+
return this.RatingsMap;
|
|
361
|
+
}
|
|
362
|
+
UserAvatarMap = new Map();
|
|
363
|
+
/** @deprecated Use {@link UserAvatarMap}. */
|
|
364
|
+
set userAvatarMap(value) {
|
|
365
|
+
this.UserAvatarMap = value;
|
|
366
|
+
}
|
|
367
|
+
/** @deprecated Use {@link UserAvatarMap}. */
|
|
368
|
+
get userAvatarMap() {
|
|
369
|
+
return this.UserAvatarMap;
|
|
370
|
+
}
|
|
371
|
+
AttachmentsMap = new Map();
|
|
372
|
+
/** @deprecated Use {@link AttachmentsMap}. */
|
|
373
|
+
set attachmentsMap(value) {
|
|
374
|
+
this.AttachmentsMap = value;
|
|
375
|
+
}
|
|
376
|
+
/** @deprecated Use {@link AttachmentsMap}. */
|
|
377
|
+
get attachmentsMap() {
|
|
378
|
+
return this.AttachmentsMap;
|
|
379
|
+
}
|
|
221
380
|
/**
|
|
222
381
|
* Optional session-row enrichment for realtime SESSION BLOCKS, keyed by
|
|
223
382
|
* `NormalizeUUID(sessionId)` (agent name / status / close reason). Details stamped
|
|
224
383
|
* with an `AgentSessionID` collapse into one timeline card per session — see
|
|
225
384
|
* `BuildConversationTimeline` — and this map dresses those cards up when present.
|
|
226
385
|
*/
|
|
227
|
-
|
|
386
|
+
SessionMetaMap = new Map();
|
|
387
|
+
/** @deprecated Use {@link SessionMetaMap}. */
|
|
388
|
+
set sessionMetaMap(value) {
|
|
389
|
+
this.SessionMetaMap = value;
|
|
390
|
+
}
|
|
391
|
+
/** @deprecated Use {@link SessionMetaMap}. */
|
|
392
|
+
get sessionMetaMap() {
|
|
393
|
+
return this.SessionMetaMap;
|
|
394
|
+
}
|
|
228
395
|
/**
|
|
229
396
|
* Optional per-iteration custom message renderer. When set, the list renders each
|
|
230
397
|
* message via this template (full replacement) instead of the default
|
|
@@ -237,33 +404,179 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
237
404
|
* etc. The minimal `MJChatMessageBubbleDefaultComponent` ships as a ready-to-use
|
|
238
405
|
* bubble renderer.
|
|
239
406
|
*/
|
|
240
|
-
|
|
407
|
+
MessageRendererTemplate = null;
|
|
408
|
+
/** @deprecated Use {@link MessageRendererTemplate}. */
|
|
409
|
+
set messageRendererTemplate(value) {
|
|
410
|
+
this.MessageRendererTemplate = value;
|
|
411
|
+
}
|
|
412
|
+
/** @deprecated Use {@link MessageRendererTemplate}. */
|
|
413
|
+
get messageRendererTemplate() {
|
|
414
|
+
return this.MessageRendererTemplate;
|
|
415
|
+
}
|
|
241
416
|
/**
|
|
242
417
|
* Optional per-message additive decoration template, projected INSIDE the default
|
|
243
418
|
* `MessageItemComponent` (after the message text). Forwarded by chat-area when a
|
|
244
419
|
* consumer projects `mjChatSlot="messageExtra"`. Ignored when
|
|
245
420
|
* `messageRendererTemplate` is set (custom renderers own all per-message content).
|
|
246
421
|
*/
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
422
|
+
MessageExtraTemplate = null;
|
|
423
|
+
/** @deprecated Use {@link MessageExtraTemplate}. */
|
|
424
|
+
set messageExtraTemplate(value) {
|
|
425
|
+
this.MessageExtraTemplate = value;
|
|
426
|
+
}
|
|
427
|
+
/** @deprecated Use {@link MessageExtraTemplate}. */
|
|
428
|
+
get messageExtraTemplate() {
|
|
429
|
+
return this.MessageExtraTemplate;
|
|
430
|
+
}
|
|
431
|
+
EditMessage = new EventEmitter();
|
|
432
|
+
/**
|
|
433
|
+
* @deprecated Use {@link EditMessage}.
|
|
434
|
+
*
|
|
435
|
+
* The same emitter under the old binding name, so a template still binding
|
|
436
|
+
* (editMessage) keeps working. Must stay AFTER EditMessage: class fields
|
|
437
|
+
* initialise in order, and the other way round this captures undefined.
|
|
438
|
+
*/
|
|
439
|
+
editMessage = this.EditMessage;
|
|
440
|
+
DeleteMessage = new EventEmitter();
|
|
441
|
+
/**
|
|
442
|
+
* @deprecated Use {@link DeleteMessage}.
|
|
443
|
+
*
|
|
444
|
+
* The same emitter under the old binding name, so a template still binding
|
|
445
|
+
* (deleteMessage) keeps working. Must stay AFTER DeleteMessage: class fields
|
|
446
|
+
* initialise in order, and the other way round this captures undefined.
|
|
447
|
+
*/
|
|
448
|
+
deleteMessage = this.DeleteMessage;
|
|
449
|
+
RetryMessage = new EventEmitter();
|
|
450
|
+
/**
|
|
451
|
+
* @deprecated Use {@link RetryMessage}.
|
|
452
|
+
*
|
|
453
|
+
* The same emitter under the old binding name, so a template still binding
|
|
454
|
+
* (retryMessage) keeps working. Must stay AFTER RetryMessage: class fields
|
|
455
|
+
* initialise in order, and the other way round this captures undefined.
|
|
456
|
+
*/
|
|
457
|
+
retryMessage = this.RetryMessage;
|
|
458
|
+
TestFeedbackMessage = new EventEmitter();
|
|
459
|
+
/**
|
|
460
|
+
* @deprecated Use {@link TestFeedbackMessage}.
|
|
461
|
+
*
|
|
462
|
+
* The same emitter under the old binding name, so a template still binding
|
|
463
|
+
* (testFeedbackMessage) keeps working. Must stay AFTER TestFeedbackMessage: class fields
|
|
464
|
+
* initialise in order, and the other way round this captures undefined.
|
|
465
|
+
*/
|
|
466
|
+
testFeedbackMessage = this.TestFeedbackMessage;
|
|
467
|
+
ArtifactClicked = new EventEmitter();
|
|
468
|
+
/**
|
|
469
|
+
* @deprecated Use {@link ArtifactClicked}.
|
|
470
|
+
*
|
|
471
|
+
* The same emitter under the old binding name, so a template still binding
|
|
472
|
+
* (artifactClicked) keeps working. Must stay AFTER ArtifactClicked: class fields
|
|
473
|
+
* initialise in order, and the other way round this captures undefined.
|
|
474
|
+
*/
|
|
475
|
+
artifactClicked = this.ArtifactClicked;
|
|
476
|
+
ReplyInThread = new EventEmitter();
|
|
477
|
+
/**
|
|
478
|
+
* @deprecated Use {@link ReplyInThread}.
|
|
479
|
+
*
|
|
480
|
+
* The same emitter under the old binding name, so a template still binding
|
|
481
|
+
* (replyInThread) keeps working. Must stay AFTER ReplyInThread: class fields
|
|
482
|
+
* initialise in order, and the other way round this captures undefined.
|
|
483
|
+
*/
|
|
484
|
+
replyInThread = this.ReplyInThread;
|
|
485
|
+
ViewThread = new EventEmitter();
|
|
486
|
+
/**
|
|
487
|
+
* @deprecated Use {@link ViewThread}.
|
|
488
|
+
*
|
|
489
|
+
* The same emitter under the old binding name, so a template still binding
|
|
490
|
+
* (viewThread) keeps working. Must stay AFTER ViewThread: class fields
|
|
491
|
+
* initialise in order, and the other way round this captures undefined.
|
|
492
|
+
*/
|
|
493
|
+
viewThread = this.ViewThread;
|
|
494
|
+
MessageEdited = new EventEmitter();
|
|
495
|
+
/**
|
|
496
|
+
* @deprecated Use {@link MessageEdited}.
|
|
497
|
+
*
|
|
498
|
+
* The same emitter under the old binding name, so a template still binding
|
|
499
|
+
* (messageEdited) keeps working. Must stay AFTER MessageEdited: class fields
|
|
500
|
+
* initialise in order, and the other way round this captures undefined.
|
|
501
|
+
*/
|
|
502
|
+
messageEdited = this.MessageEdited;
|
|
503
|
+
OpenEntityRecord = new EventEmitter();
|
|
504
|
+
/**
|
|
505
|
+
* @deprecated Use {@link OpenEntityRecord}.
|
|
506
|
+
*
|
|
507
|
+
* The same emitter under the old binding name, so a template still binding
|
|
508
|
+
* (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
|
|
509
|
+
* initialise in order, and the other way round this captures undefined.
|
|
510
|
+
*/
|
|
511
|
+
openEntityRecord = this.OpenEntityRecord;
|
|
512
|
+
SuggestedResponseSelected = new EventEmitter();
|
|
513
|
+
/**
|
|
514
|
+
* @deprecated Use {@link SuggestedResponseSelected}.
|
|
515
|
+
*
|
|
516
|
+
* The same emitter under the old binding name, so a template still binding
|
|
517
|
+
* (suggestedResponseSelected) keeps working. Must stay AFTER SuggestedResponseSelected: class fields
|
|
518
|
+
* initialise in order, and the other way round this captures undefined.
|
|
519
|
+
*/
|
|
520
|
+
suggestedResponseSelected = this.SuggestedResponseSelected;
|
|
521
|
+
AttachmentClicked = new EventEmitter();
|
|
522
|
+
/**
|
|
523
|
+
* @deprecated Use {@link AttachmentClicked}.
|
|
524
|
+
*
|
|
525
|
+
* The same emitter under the old binding name, so a template still binding
|
|
526
|
+
* (attachmentClicked) keeps working. Must stay AFTER AttachmentClicked: class fields
|
|
527
|
+
* initialise in order, and the other way round this captures undefined.
|
|
528
|
+
*/
|
|
529
|
+
attachmentClicked = this.AttachmentClicked;
|
|
530
|
+
DiagnosticRequested = new EventEmitter();
|
|
531
|
+
/**
|
|
532
|
+
* @deprecated Use {@link DiagnosticRequested}.
|
|
533
|
+
*
|
|
534
|
+
* The same emitter under the old binding name, so a template still binding
|
|
535
|
+
* (diagnosticRequested) keeps working. Must stay AFTER DiagnosticRequested: class fields
|
|
536
|
+
* initialise in order, and the other way round this captures undefined.
|
|
537
|
+
*/
|
|
538
|
+
diagnosticRequested = this.DiagnosticRequested; // emits messageId
|
|
539
|
+
MessagePinToggled = new EventEmitter();
|
|
540
|
+
/**
|
|
541
|
+
* @deprecated Use {@link MessagePinToggled}.
|
|
542
|
+
*
|
|
543
|
+
* The same emitter under the old binding name, so a template still binding
|
|
544
|
+
* (messagePinToggled) keeps working. Must stay AFTER MessagePinToggled: class fields
|
|
545
|
+
* initialise in order, and the other way round this captures undefined.
|
|
546
|
+
*/
|
|
547
|
+
messagePinToggled = this.MessagePinToggled;
|
|
548
|
+
/** A message's run has gone quiet; the host should re-read durable state. Emits messageId. */
|
|
549
|
+
LivenessCheckRequested = new EventEmitter();
|
|
261
550
|
/** Emitted with the `MJ: AI Agent Sessions.ID` when a realtime session block's Open affordance is clicked. */
|
|
262
|
-
|
|
551
|
+
RealtimeSessionOpenRequested = new EventEmitter();
|
|
552
|
+
/**
|
|
553
|
+
* @deprecated Use {@link RealtimeSessionOpenRequested}.
|
|
554
|
+
*
|
|
555
|
+
* The same emitter under the old binding name, so a template still binding
|
|
556
|
+
* (realtimeSessionOpenRequested) keeps working. Must stay AFTER RealtimeSessionOpenRequested: class fields
|
|
557
|
+
* initialise in order, and the other way round this captures undefined.
|
|
558
|
+
*/
|
|
559
|
+
realtimeSessionOpenRequested = this.RealtimeSessionOpenRequested;
|
|
263
560
|
/** Forwarded from MessageItemComponent — see its docs. */
|
|
264
|
-
|
|
561
|
+
BeforeResponseFormSubmitted = new EventEmitter();
|
|
562
|
+
/**
|
|
563
|
+
* @deprecated Use {@link BeforeResponseFormSubmitted}.
|
|
564
|
+
*
|
|
565
|
+
* The same emitter under the old binding name, so a template still binding
|
|
566
|
+
* (beforeResponseFormSubmitted) keeps working. Must stay AFTER BeforeResponseFormSubmitted: class fields
|
|
567
|
+
* initialise in order, and the other way round this captures undefined.
|
|
568
|
+
*/
|
|
569
|
+
beforeResponseFormSubmitted = this.BeforeResponseFormSubmitted;
|
|
265
570
|
/** Forwarded from MessageItemComponent — see its docs. */
|
|
266
|
-
|
|
571
|
+
AfterResponseFormSubmitted = new EventEmitter();
|
|
572
|
+
/**
|
|
573
|
+
* @deprecated Use {@link AfterResponseFormSubmitted}.
|
|
574
|
+
*
|
|
575
|
+
* The same emitter under the old binding name, so a template still binding
|
|
576
|
+
* (afterResponseFormSubmitted) keeps working. Must stay AFTER AfterResponseFormSubmitted: class fields
|
|
577
|
+
* initialise in order, and the other way round this captures undefined.
|
|
578
|
+
*/
|
|
579
|
+
afterResponseFormSubmitted = this.AfterResponseFormSubmitted;
|
|
267
580
|
/**
|
|
268
581
|
* Asks the host to load the next older page. Fired when the "earlier messages"
|
|
269
582
|
* sentinel scrolls into view — never on a raw scroll event, so a fast scroll costs
|
|
@@ -275,10 +588,34 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
275
588
|
* Emitted instead of handled locally because paging belongs to the window store.
|
|
276
589
|
*/
|
|
277
590
|
DateJumpRequested = new EventEmitter();
|
|
278
|
-
|
|
279
|
-
|
|
591
|
+
MessageContainerRef;
|
|
592
|
+
/** @deprecated Use {@link MessageContainerRef}. */
|
|
593
|
+
get messageContainerRef() {
|
|
594
|
+
return this.MessageContainerRef;
|
|
595
|
+
}
|
|
596
|
+
/** @deprecated Use {@link MessageContainerRef}. */
|
|
597
|
+
set messageContainerRef(value) {
|
|
598
|
+
this.MessageContainerRef = value;
|
|
599
|
+
}
|
|
600
|
+
ScrollContainer;
|
|
601
|
+
/** @deprecated Use {@link ScrollContainer}. */
|
|
602
|
+
get scrollContainer() {
|
|
603
|
+
return this.ScrollContainer;
|
|
604
|
+
}
|
|
605
|
+
/** @deprecated Use {@link ScrollContainer}. */
|
|
606
|
+
set scrollContainer(value) {
|
|
607
|
+
this.ScrollContainer = value;
|
|
608
|
+
}
|
|
280
609
|
/** Only present while `HasMoreAbove` is true — the `@if` creates and destroys it. */
|
|
281
|
-
|
|
610
|
+
OlderSentinel;
|
|
611
|
+
/** @deprecated Use {@link OlderSentinel}. */
|
|
612
|
+
get olderSentinel() {
|
|
613
|
+
return this.OlderSentinel;
|
|
614
|
+
}
|
|
615
|
+
/** @deprecated Use {@link OlderSentinel}. */
|
|
616
|
+
set olderSentinel(value) {
|
|
617
|
+
this.OlderSentinel = value;
|
|
618
|
+
}
|
|
282
619
|
/** Template rendered in place of an unmounted timeline item. */
|
|
283
620
|
spacerTemplate;
|
|
284
621
|
/**
|
|
@@ -354,16 +691,44 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
354
691
|
* since both grow `messages.length`.
|
|
355
692
|
*/
|
|
356
693
|
_previousFirstKey = null;
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
694
|
+
CurrentDateDisplay = 'Today';
|
|
695
|
+
/** @deprecated Use {@link CurrentDateDisplay}. */
|
|
696
|
+
get currentDateDisplay() {
|
|
697
|
+
return this.CurrentDateDisplay;
|
|
698
|
+
}
|
|
699
|
+
/** @deprecated Use {@link CurrentDateDisplay}. */
|
|
700
|
+
set currentDateDisplay(value) {
|
|
701
|
+
this.CurrentDateDisplay = value;
|
|
702
|
+
}
|
|
703
|
+
ShowDateNav = false;
|
|
704
|
+
/** @deprecated Use {@link ShowDateNav}. */
|
|
705
|
+
get showDateNav() {
|
|
706
|
+
return this.ShowDateNav;
|
|
707
|
+
}
|
|
708
|
+
/** @deprecated Use {@link ShowDateNav}. */
|
|
709
|
+
set showDateNav(value) {
|
|
710
|
+
this.ShowDateNav = value;
|
|
711
|
+
}
|
|
712
|
+
ShouldShowDateFilter = false;
|
|
713
|
+
/** @deprecated Use {@link ShouldShowDateFilter}. */
|
|
714
|
+
get shouldShowDateFilter() {
|
|
715
|
+
return this.ShouldShowDateFilter;
|
|
716
|
+
}
|
|
717
|
+
/** @deprecated Use {@link ShouldShowDateFilter}. */
|
|
718
|
+
set shouldShowDateFilter(value) {
|
|
719
|
+
this.ShouldShowDateFilter = value;
|
|
720
|
+
}
|
|
360
721
|
constructor(cdRef, hostRef) {
|
|
361
722
|
super();
|
|
362
723
|
this.cdRef = cdRef;
|
|
363
724
|
this.hostRef = hostRef;
|
|
364
725
|
}
|
|
726
|
+
ToggleDateNav() {
|
|
727
|
+
this.ShowDateNav = !this.ShowDateNav;
|
|
728
|
+
}
|
|
729
|
+
/** @deprecated Use {@link ToggleDateNav}. */
|
|
365
730
|
toggleDateNav() {
|
|
366
|
-
|
|
731
|
+
return this.ToggleDateNav();
|
|
367
732
|
}
|
|
368
733
|
/**
|
|
369
734
|
* Handles a date-navigator selection.
|
|
@@ -373,14 +738,18 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
373
738
|
* {@link ScrollToDateTarget}. The label updates immediately so the dropdown feels responsive
|
|
374
739
|
* while paging runs.
|
|
375
740
|
*/
|
|
376
|
-
|
|
377
|
-
this.
|
|
741
|
+
JumpToDate(period) {
|
|
742
|
+
this.ShowDateNav = false;
|
|
378
743
|
if (!isDateJumpPeriod(period)) {
|
|
379
744
|
return;
|
|
380
745
|
}
|
|
381
|
-
this.
|
|
746
|
+
this.CurrentDateDisplay = DATE_JUMP_LABELS[period];
|
|
382
747
|
this.DateJumpRequested.emit(period);
|
|
383
748
|
}
|
|
749
|
+
/** @deprecated Use {@link JumpToDate}. */
|
|
750
|
+
jumpToDate(period) {
|
|
751
|
+
return this.JumpToDate(period);
|
|
752
|
+
}
|
|
384
753
|
/**
|
|
385
754
|
* Scrolls to the start of `period` within the currently loaded messages.
|
|
386
755
|
*
|
|
@@ -484,7 +853,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
484
853
|
}
|
|
485
854
|
ngAfterViewInit() {
|
|
486
855
|
// ViewContainerRef is now available - perform initial render if we have messages
|
|
487
|
-
if (this.messages && this.messages.length > 0 && this.
|
|
856
|
+
if (this.messages && this.messages.length > 0 && this.MessageContainerRef && !this._initialRenderComplete) {
|
|
488
857
|
this._initialRenderComplete = true;
|
|
489
858
|
this.updateMessages(this.messages);
|
|
490
859
|
this.updateDateFilterVisibility();
|
|
@@ -494,7 +863,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
494
863
|
// React to messages array changes
|
|
495
864
|
// Note: On initial load, messageContainerRef may not be available yet (ngOnChanges runs before ngAfterViewInit)
|
|
496
865
|
// In that case, ngAfterViewInit will handle the initial render
|
|
497
|
-
if (changes['messages'] && this.messages && this.
|
|
866
|
+
if (changes['messages'] && this.messages && this.MessageContainerRef) {
|
|
498
867
|
this._initialRenderComplete = true;
|
|
499
868
|
// Capture the pre-render height so a prepend can be corrected for. Must happen
|
|
500
869
|
// BEFORE updateMessages — afterwards the new rows are already in the layout — and
|
|
@@ -507,18 +876,32 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
507
876
|
// While artifacts are pre-loaded during initial peripheral data load,
|
|
508
877
|
// new artifacts can be created mid-conversation (e.g., by agent runs)
|
|
509
878
|
// This ensures artifact cards appear in messages immediately without requiring a refresh
|
|
510
|
-
if (changes['artifactMap'] && this.messages && this.
|
|
879
|
+
if (changes['artifactMap'] && this.messages && this.MessageContainerRef) {
|
|
511
880
|
this.updateMessages(this.messages);
|
|
512
881
|
}
|
|
513
882
|
// Watch for attachmentsMap changes to handle newly created attachments
|
|
514
883
|
// This ensures media attachments (e.g., images generated by agents) appear
|
|
515
884
|
// immediately without requiring a page refresh
|
|
516
|
-
if (changes['attachmentsMap'] && this.messages && this.
|
|
885
|
+
if (changes['attachmentsMap'] && this.messages && this.MessageContainerRef) {
|
|
517
886
|
this.updateMessages(this.messages);
|
|
518
887
|
}
|
|
519
888
|
// Watch for session-meta changes so realtime session blocks pick up their
|
|
520
889
|
// agent name / status chip once the (async, batched) session lookup lands
|
|
521
|
-
if (changes['sessionMetaMap'] && this.messages && this.
|
|
890
|
+
if (changes['sessionMetaMap'] && this.messages && this.MessageContainerRef) {
|
|
891
|
+
this.updateMessages(this.messages);
|
|
892
|
+
}
|
|
893
|
+
// Watch for agent-run changes so a run refreshed mid-flight reaches the rendered bubble.
|
|
894
|
+
// `agentRun` is stamped onto each item as static config at create/update time, so a replaced
|
|
895
|
+
// map alone never reaches an item already on screen — it keeps the object it was given.
|
|
896
|
+
//
|
|
897
|
+
// This became load-bearing with per-message liveness (MJ #4222): reconciliation re-reads the
|
|
898
|
+
// run over HTTP precisely when the socket is dead, and if the fresh `LastHeartbeatAt` cannot
|
|
899
|
+
// reach the bubble, the pill stays degraded while the client is in fact being told the run is
|
|
900
|
+
// healthy. Observed directly — the pill held 'checking…' for a full minute across successful
|
|
901
|
+
// reconciles.
|
|
902
|
+
// Keyed by whichever input name the host bound — the deprecated alias or the current one.
|
|
903
|
+
const agentRunMapChanged = changes['AgentRunMap'] ?? changes['agentRunMap'];
|
|
904
|
+
if (agentRunMapChanged && this.messages && this.MessageContainerRef) {
|
|
522
905
|
this.updateMessages(this.messages);
|
|
523
906
|
}
|
|
524
907
|
}
|
|
@@ -611,7 +994,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
611
994
|
}
|
|
612
995
|
this._warnedNoScrollParent = true;
|
|
613
996
|
const chain = [];
|
|
614
|
-
let el = this.findSentinelElement() ?? this.
|
|
997
|
+
let el = this.findSentinelElement() ?? this.ScrollContainer?.nativeElement ?? null;
|
|
615
998
|
while (el && chain.length < 20) {
|
|
616
999
|
const style = getComputedStyle(el);
|
|
617
1000
|
chain.push({
|
|
@@ -626,7 +1009,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
626
1009
|
+ 'older pages cannot auto-load. The host must give the transcript a scrollable container '
|
|
627
1010
|
+ '(overflow-y: auto AND a bounded height, e.g. min-height: 0 on a flex child). '
|
|
628
1011
|
+ 'Walked from '
|
|
629
|
-
+ (this.
|
|
1012
|
+
+ (this.OlderSentinel ? 'the sentinel' : this.ScrollContainer ? 'the list container' : 'NOTHING — both view children are undefined')
|
|
630
1013
|
+ ':', chain);
|
|
631
1014
|
}
|
|
632
1015
|
/**
|
|
@@ -654,7 +1037,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
654
1037
|
// guaranteed present exactly when the walk matters. `@ViewChild('scrollContainer')`
|
|
655
1038
|
// resolves on Angular's own schedule and can still be undefined here, which would end
|
|
656
1039
|
// the walk before it began.
|
|
657
|
-
let el = this.findSentinelElement() ?? this.
|
|
1040
|
+
let el = this.findSentinelElement() ?? this.ScrollContainer?.nativeElement ?? null;
|
|
658
1041
|
while (el) {
|
|
659
1042
|
const overflowY = getComputedStyle(el).overflowY;
|
|
660
1043
|
if ((overflowY === 'auto' || overflowY === 'scroll') && el.scrollHeight > el.clientHeight) {
|
|
@@ -778,19 +1161,23 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
778
1161
|
}
|
|
779
1162
|
});
|
|
780
1163
|
this._renderedMessages.clear();
|
|
781
|
-
if (this.
|
|
782
|
-
this.
|
|
1164
|
+
if (this.MessageContainerRef) {
|
|
1165
|
+
this.MessageContainerRef.clear();
|
|
783
1166
|
}
|
|
784
1167
|
}
|
|
785
1168
|
/**
|
|
786
1169
|
* Called when messages array changes
|
|
787
1170
|
* Efficiently updates the DOM without re-rendering everything
|
|
788
1171
|
*/
|
|
789
|
-
set
|
|
790
|
-
if (messages && this.
|
|
1172
|
+
set MessagesUpdate(messages) {
|
|
1173
|
+
if (messages && this.MessageContainerRef) {
|
|
791
1174
|
this.updateMessages(messages);
|
|
792
1175
|
}
|
|
793
1176
|
}
|
|
1177
|
+
/** @deprecated Use {@link MessagesUpdate}. */
|
|
1178
|
+
set messagesUpdate(value) {
|
|
1179
|
+
this.MessagesUpdate = value;
|
|
1180
|
+
}
|
|
794
1181
|
/**
|
|
795
1182
|
* Updates the message list using dynamic component creation
|
|
796
1183
|
* Only adds/removes changed messages for optimal performance
|
|
@@ -1016,7 +1403,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1016
1403
|
existing.ref.destroy();
|
|
1017
1404
|
this._renderedMessages.delete(key);
|
|
1018
1405
|
}
|
|
1019
|
-
const viewRef = this.
|
|
1406
|
+
const viewRef = this.MessageContainerRef.createEmbeddedView(this.spacerTemplate, { height: this.heightFor(key, item) }, { index: timelineIndex });
|
|
1020
1407
|
this._renderedMessages.set(key, { kind: 'spacer', ref: viewRef });
|
|
1021
1408
|
}
|
|
1022
1409
|
/**
|
|
@@ -1141,7 +1528,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1141
1528
|
*/
|
|
1142
1529
|
renderSessionBlock(group, timelineIndex) {
|
|
1143
1530
|
const key = this.getSessionKey(group.SessionID);
|
|
1144
|
-
const meta = this.
|
|
1531
|
+
const meta = this.SessionMetaMap.get(NormalizeUUID(group.SessionID)) ?? null;
|
|
1145
1532
|
const existing = this._renderedMessages.get(key);
|
|
1146
1533
|
if (existing && existing.kind === 'realtime-session') {
|
|
1147
1534
|
// Update existing card in place.
|
|
@@ -1156,11 +1543,13 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1156
1543
|
existing.ref.destroy();
|
|
1157
1544
|
this._renderedMessages.delete(key);
|
|
1158
1545
|
}
|
|
1159
|
-
const componentRef = this.
|
|
1546
|
+
const componentRef = this.MessageContainerRef.createComponent(RealtimeSessionTimelineCardComponent, { index: timelineIndex });
|
|
1160
1547
|
componentRef.instance.Group = group;
|
|
1161
1548
|
componentRef.instance.Meta = meta;
|
|
1162
|
-
|
|
1163
|
-
|
|
1549
|
+
// The card says "You" on the viewer's own call and names the caller on anyone else's, which is
|
|
1550
|
+
// why it takes the viewer's id rather than their name.
|
|
1551
|
+
componentRef.instance.CurrentUserID = this.CurrentUser?.ID ?? null;
|
|
1552
|
+
componentRef.instance.OpenRequested.subscribe((sessionId) => this.RealtimeSessionOpenRequested.emit(sessionId));
|
|
1164
1553
|
this._renderedMessages.set(key, { kind: 'realtime-session', ref: componentRef });
|
|
1165
1554
|
}
|
|
1166
1555
|
/**
|
|
@@ -1177,7 +1566,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1177
1566
|
// boolean (last index when `isLastMessage` is true, else 0 — any non-last
|
|
1178
1567
|
// index works since it just affects that one comparison).
|
|
1179
1568
|
const index = isLastMessage ? messages.length - 1 : 0;
|
|
1180
|
-
const useCustomRenderer = this.
|
|
1569
|
+
const useCustomRenderer = this.MessageRendererTemplate !== null;
|
|
1181
1570
|
const existing = this._renderedMessages.get(key);
|
|
1182
1571
|
if (existing && existing.kind === 'embedded' && useCustomRenderer) {
|
|
1183
1572
|
// Update existing embedded view from messageRenderer slot
|
|
@@ -1209,14 +1598,14 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1209
1598
|
const previousMessage = instance.message;
|
|
1210
1599
|
instance.message = message;
|
|
1211
1600
|
instance.allMessages = messages;
|
|
1212
|
-
instance.isProcessing = this.
|
|
1213
|
-
instance.userAvatarMap = this.
|
|
1601
|
+
instance.isProcessing = this.IsProcessing;
|
|
1602
|
+
instance.userAvatarMap = this.UserAvatarMap;
|
|
1214
1603
|
instance.isLastMessage = (index === messages.length - 1);
|
|
1215
|
-
instance.messageExtraTemplate = this.
|
|
1604
|
+
instance.messageExtraTemplate = this.MessageExtraTemplate;
|
|
1216
1605
|
this.applyMessageItemFeatureFlags(instance);
|
|
1217
|
-
instance.agentRun = this.
|
|
1218
|
-
instance.ratings = this.
|
|
1219
|
-
instance.attachments = this.
|
|
1606
|
+
instance.agentRun = this.AgentRunMap.get(message.ID) || null;
|
|
1607
|
+
instance.ratings = this.RatingsMap.get(message.ID);
|
|
1608
|
+
instance.attachments = this.AttachmentsMap.get(message.ID) || [];
|
|
1220
1609
|
// After the inputs above, for the same reason as the create path: this can force a
|
|
1221
1610
|
// synchronous child pass, which would otherwise paint the previous refresh's agent run,
|
|
1222
1611
|
// ratings and attachments.
|
|
@@ -1233,14 +1622,15 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1233
1622
|
* paths so a mid-session rebind stays consistent.
|
|
1234
1623
|
*/
|
|
1235
1624
|
applyMessageItemFeatureFlags(instance) {
|
|
1236
|
-
instance.showAgentRunDetails = this.
|
|
1237
|
-
instance.showReactions = this.
|
|
1238
|
-
instance.showMessageRating = this.
|
|
1239
|
-
instance.allowPinning = this.
|
|
1240
|
-
instance.allowMessageEdit = this.
|
|
1241
|
-
instance.allowMessageDelete = this.
|
|
1242
|
-
instance.
|
|
1243
|
-
instance.
|
|
1625
|
+
instance.showAgentRunDetails = this.ShowAgentRunDetails;
|
|
1626
|
+
instance.showReactions = this.ShowReactions;
|
|
1627
|
+
instance.showMessageRating = this.ShowMessageRating;
|
|
1628
|
+
instance.allowPinning = this.AllowPinning;
|
|
1629
|
+
instance.allowMessageEdit = this.AllowMessageEdit;
|
|
1630
|
+
instance.allowMessageDelete = this.AllowMessageDelete;
|
|
1631
|
+
instance.ReadOnly = this.ReadOnly;
|
|
1632
|
+
instance.assistantDisplayName = this.AssistantDisplayName;
|
|
1633
|
+
instance.assistantAvatarUrl = this.AssistantAvatarUrl;
|
|
1244
1634
|
}
|
|
1245
1635
|
/**
|
|
1246
1636
|
* Creates a new rendered entry — either a `MessageItemComponent` (default path)
|
|
@@ -1249,43 +1639,44 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1249
1639
|
* message entity.
|
|
1250
1640
|
*/
|
|
1251
1641
|
createRenderedEntry(message, messages, index, key, useCustomRenderer, timelineIndex) {
|
|
1252
|
-
if (useCustomRenderer && this.
|
|
1642
|
+
if (useCustomRenderer && this.MessageRendererTemplate) {
|
|
1253
1643
|
// The slot directive carries TemplateRef<unknown>; assert the contract here
|
|
1254
1644
|
// (consumers' `let-message` bindings consume the message context shape below).
|
|
1255
|
-
const template = this.
|
|
1256
|
-
const viewRef = this.
|
|
1645
|
+
const template = this.MessageRendererTemplate;
|
|
1646
|
+
const viewRef = this.MessageContainerRef.createEmbeddedView(template, { $implicit: message, message }, { index: timelineIndex });
|
|
1257
1647
|
this._renderedMessages.set(key, { kind: 'embedded', ref: viewRef });
|
|
1258
1648
|
// Stamp back-ref for parity with the component path.
|
|
1259
1649
|
message._viewRef = viewRef;
|
|
1260
1650
|
return;
|
|
1261
1651
|
}
|
|
1262
|
-
const componentRef = this.
|
|
1652
|
+
const componentRef = this.MessageContainerRef.createComponent(MessageItemComponent, { index: timelineIndex });
|
|
1263
1653
|
const instance = componentRef.instance;
|
|
1264
1654
|
instance.message = message;
|
|
1265
|
-
instance.conversation = this.
|
|
1266
|
-
instance.currentUser = this.
|
|
1655
|
+
instance.conversation = this.Conversation;
|
|
1656
|
+
instance.currentUser = this.CurrentUser;
|
|
1267
1657
|
instance.allMessages = messages;
|
|
1268
|
-
instance.isProcessing = this.
|
|
1269
|
-
instance.userAvatarMap = this.
|
|
1658
|
+
instance.isProcessing = this.IsProcessing;
|
|
1659
|
+
instance.userAvatarMap = this.UserAvatarMap;
|
|
1270
1660
|
instance.isLastMessage = (index === messages.length - 1);
|
|
1271
|
-
instance.messageExtraTemplate = this.
|
|
1661
|
+
instance.messageExtraTemplate = this.MessageExtraTemplate;
|
|
1272
1662
|
this.applyMessageItemFeatureFlags(instance);
|
|
1273
|
-
instance.agentRun = this.
|
|
1274
|
-
instance.ratings = this.
|
|
1275
|
-
instance.attachments = this.
|
|
1276
|
-
instance.editClicked.subscribe((msg) => this.
|
|
1277
|
-
instance.deleteClicked.subscribe((msg) => this.
|
|
1278
|
-
instance.retryClicked.subscribe((msg) => this.
|
|
1279
|
-
instance.testFeedbackClicked.subscribe((msg) => this.
|
|
1280
|
-
instance.artifactClicked.subscribe((data) => this.
|
|
1281
|
-
instance.messageEdited.subscribe((msg) => this.
|
|
1282
|
-
instance.openEntityRecord.subscribe((data) => this.
|
|
1283
|
-
instance.suggestedResponseSelected.subscribe((data) => this.
|
|
1284
|
-
instance.attachmentClicked.subscribe((attachment) => this.
|
|
1285
|
-
instance.diagnosticRequested.subscribe((messageId) => this.
|
|
1286
|
-
instance.
|
|
1287
|
-
instance.
|
|
1288
|
-
instance.
|
|
1663
|
+
instance.agentRun = this.AgentRunMap.get(message.ID) || null;
|
|
1664
|
+
instance.ratings = this.RatingsMap.get(message.ID);
|
|
1665
|
+
instance.attachments = this.AttachmentsMap.get(message.ID) || [];
|
|
1666
|
+
instance.editClicked.subscribe((msg) => this.EditMessage.emit(msg));
|
|
1667
|
+
instance.deleteClicked.subscribe((msg) => this.DeleteMessage.emit(msg));
|
|
1668
|
+
instance.retryClicked.subscribe((msg) => this.RetryMessage.emit(msg));
|
|
1669
|
+
instance.testFeedbackClicked.subscribe((msg) => this.TestFeedbackMessage.emit(msg));
|
|
1670
|
+
instance.artifactClicked.subscribe((data) => this.ArtifactClicked.emit(data));
|
|
1671
|
+
instance.messageEdited.subscribe((msg) => this.MessageEdited.emit(msg));
|
|
1672
|
+
instance.openEntityRecord.subscribe((data) => this.OpenEntityRecord.emit(data));
|
|
1673
|
+
instance.suggestedResponseSelected.subscribe((data) => this.SuggestedResponseSelected.emit(data));
|
|
1674
|
+
instance.attachmentClicked.subscribe((attachment) => this.AttachmentClicked.emit(attachment));
|
|
1675
|
+
instance.diagnosticRequested.subscribe((messageId) => this.DiagnosticRequested.emit(messageId));
|
|
1676
|
+
instance.LivenessCheckRequested.subscribe((messageId) => this.LivenessCheckRequested.emit(messageId));
|
|
1677
|
+
instance.messagePinToggled.subscribe((msg) => this.MessagePinToggled.emit(msg));
|
|
1678
|
+
instance.beforeResponseFormSubmitted.subscribe((e) => this.BeforeResponseFormSubmitted.emit(e));
|
|
1679
|
+
instance.afterResponseFormSubmitted.subscribe((e) => this.AfterResponseFormSubmitted.emit(e));
|
|
1289
1680
|
if (instance.artifactActionPerformed) {
|
|
1290
1681
|
instance.artifactActionPerformed.subscribe((data) => {
|
|
1291
1682
|
// Parent can handle artifact actions (save, fork, history, share)
|
|
@@ -1399,11 +1790,11 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1399
1790
|
* while genuinely distinct artifacts are all retained.
|
|
1400
1791
|
*/
|
|
1401
1792
|
resolveDistinctArtifacts(messageId) {
|
|
1402
|
-
const list = this.
|
|
1793
|
+
const list = this.ArtifactMap.get(messageId);
|
|
1403
1794
|
if (!list || list.length === 0) {
|
|
1404
1795
|
return [];
|
|
1405
1796
|
}
|
|
1406
|
-
return
|
|
1797
|
+
return SelectDistinctLatestArtifacts(list);
|
|
1407
1798
|
}
|
|
1408
1799
|
/**
|
|
1409
1800
|
* Generates a unique key for a message
|
|
@@ -1425,11 +1816,11 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1425
1816
|
// the one case where it is most useful. `HasMoreAbove` is the only windowing-safe signal
|
|
1426
1817
|
// that more conversation exists above, so it short-circuits the heuristic.
|
|
1427
1818
|
if (this.HasMoreAbove) {
|
|
1428
|
-
this.
|
|
1819
|
+
this.ShouldShowDateFilter = true;
|
|
1429
1820
|
return;
|
|
1430
1821
|
}
|
|
1431
1822
|
if (!this.messages || this.messages.length < 20) {
|
|
1432
|
-
this.
|
|
1823
|
+
this.ShouldShowDateFilter = false;
|
|
1433
1824
|
return;
|
|
1434
1825
|
}
|
|
1435
1826
|
// Check if messages span more than 2 days
|
|
@@ -1438,21 +1829,21 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1438
1829
|
.filter(d => d != null)
|
|
1439
1830
|
.map(d => new Date(d).setHours(0, 0, 0, 0));
|
|
1440
1831
|
if (dates.length === 0) {
|
|
1441
|
-
this.
|
|
1832
|
+
this.ShouldShowDateFilter = false;
|
|
1442
1833
|
return;
|
|
1443
1834
|
}
|
|
1444
1835
|
const uniqueDates = new Set(dates);
|
|
1445
1836
|
const daySpan = uniqueDates.size;
|
|
1446
1837
|
// Show filter if conversation has 20+ messages and spans 3+ days
|
|
1447
|
-
this.
|
|
1838
|
+
this.ShouldShowDateFilter = daySpan >= 3;
|
|
1448
1839
|
}
|
|
1449
1840
|
/**
|
|
1450
1841
|
* Scrolls the message list to the bottom
|
|
1451
1842
|
*/
|
|
1452
1843
|
scrollToBottom() {
|
|
1453
|
-
if (this.
|
|
1844
|
+
if (this.ScrollContainer && this.ScrollContainer.nativeElement) {
|
|
1454
1845
|
Promise.resolve().then(() => {
|
|
1455
|
-
const element = this.
|
|
1846
|
+
const element = this.ScrollContainer.nativeElement;
|
|
1456
1847
|
element.scrollTop = element.scrollHeight;
|
|
1457
1848
|
});
|
|
1458
1849
|
}
|
|
@@ -1461,7 +1852,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1461
1852
|
* Removes a message from the rendered list
|
|
1462
1853
|
* Called externally when a message is deleted
|
|
1463
1854
|
*/
|
|
1464
|
-
|
|
1855
|
+
RemoveMessage(message) {
|
|
1465
1856
|
const key = this.getMessageKey(message);
|
|
1466
1857
|
const entry = this._renderedMessages.get(key);
|
|
1467
1858
|
if (entry) {
|
|
@@ -1469,18 +1860,22 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1469
1860
|
this._renderedMessages.delete(key);
|
|
1470
1861
|
}
|
|
1471
1862
|
}
|
|
1863
|
+
/** @deprecated Use {@link RemoveMessage}. */
|
|
1864
|
+
removeMessage(message) {
|
|
1865
|
+
return this.RemoveMessage(message);
|
|
1866
|
+
}
|
|
1472
1867
|
static ɵfac = function MessageListComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MessageListComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.ElementRef)); };
|
|
1473
1868
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MessageListComponent, selectors: [["mj-conversation-message-list"]], viewQuery: function MessageListComponent_Query(rf, ctx) { if (rf & 1) {
|
|
1474
1869
|
i0.ɵɵviewQuery(_c0, 5, ViewContainerRef)(_c1, 5)(_c2, 5)(_c3, 5);
|
|
1475
1870
|
} if (rf & 2) {
|
|
1476
1871
|
let _t;
|
|
1477
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1478
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1479
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1872
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.MessageContainerRef = _t.first);
|
|
1873
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ScrollContainer = _t.first);
|
|
1874
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.OlderSentinel = _t.first);
|
|
1480
1875
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.spacerTemplate = _t.first);
|
|
1481
1876
|
} }, hostVars: 2, hostBindings: function MessageListComponent_HostBindings(rf, ctx) { if (rf & 2) {
|
|
1482
1877
|
i0.ɵɵclassProp("mj-list-host-scrolled", ctx.HostSuppliesScroller);
|
|
1483
|
-
} }, inputs: { messages: "messages", conversation: "conversation", currentUser: "currentUser", isProcessing: "isProcessing", showEmptyFill: "showEmptyFill", showDateNavigation: "showDateNavigation", showAgentRunDetails: "showAgentRunDetails", showReactions: "showReactions", showMessageRating: "showMessageRating", allowPinning: "allowPinning", allowMessageEdit: "allowMessageEdit", allowMessageDelete: "allowMessageDelete", HasMoreAbove: "HasMoreAbove", IsLoadingOlder: "IsLoadingOlder", ScrollRoot: "ScrollRoot", assistantDisplayName: "assistantDisplayName", assistantAvatarUrl: "assistantAvatarUrl", artifactMap: "artifactMap", agentRunMap: "agentRunMap", ratingsMap: "ratingsMap", userAvatarMap: "userAvatarMap", attachmentsMap: "attachmentsMap", sessionMetaMap: "sessionMetaMap", messageRendererTemplate: "messageRendererTemplate", messageExtraTemplate: "messageExtraTemplate", messagesUpdate: "messagesUpdate" }, outputs: { editMessage: "editMessage", deleteMessage: "deleteMessage", retryMessage: "retryMessage", testFeedbackMessage: "testFeedbackMessage", artifactClicked: "artifactClicked", replyInThread: "replyInThread", viewThread: "viewThread", messageEdited: "messageEdited", openEntityRecord: "openEntityRecord", suggestedResponseSelected: "suggestedResponseSelected", attachmentClicked: "attachmentClicked", diagnosticRequested: "diagnosticRequested", messagePinToggled: "messagePinToggled", realtimeSessionOpenRequested: "realtimeSessionOpenRequested", beforeResponseFormSubmitted: "beforeResponseFormSubmitted", afterResponseFormSubmitted: "afterResponseFormSubmitted", OlderRequested: "OlderRequested", DateJumpRequested: "DateJumpRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 9, vars: 3, consts: [["scrollContainer", ""], ["spacerTemplate", ""], ["messageContainer", ""], ["olderSentinel", ""], [1, "message-list-container"], [1, "sticky-date-header"], [1, "transcript-older-sentinel"], ["Icon", "fa-solid fa-comments", "Title", "No messages yet. Start a conversation!", 1, "messages-empty-fill"], [1, "sticky-date-wrapper"], [1, "sticky-date-button", 3, "click"], [1, "fas", "fa-chevron-down"], [1, "date-nav-dropdown"], [1, "date-nav-option", "jump-to"], [1, "date-nav-option", 3, "click"], ["text", "Loading earlier messages\u2026", "size", "small"], [1, "transcript-older-label"], ["aria-hidden", "true", 1, "transcript-spacer"]], template: function MessageListComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1878
|
+
} }, inputs: { messages: "messages", Conversation: "Conversation", conversation: "conversation", CurrentUser: "CurrentUser", currentUser: "currentUser", IsProcessing: "IsProcessing", isProcessing: "isProcessing", ShowEmptyFill: "ShowEmptyFill", showEmptyFill: "showEmptyFill", ShowDateNavigation: "ShowDateNavigation", showDateNavigation: "showDateNavigation", ShowAgentRunDetails: "ShowAgentRunDetails", showAgentRunDetails: "showAgentRunDetails", ShowReactions: "ShowReactions", showReactions: "showReactions", ShowMessageRating: "ShowMessageRating", showMessageRating: "showMessageRating", AllowPinning: "AllowPinning", allowPinning: "allowPinning", AllowMessageEdit: "AllowMessageEdit", allowMessageEdit: "allowMessageEdit", AllowMessageDelete: "AllowMessageDelete", allowMessageDelete: "allowMessageDelete", ReadOnly: "ReadOnly", HasMoreAbove: "HasMoreAbove", IsLoadingOlder: "IsLoadingOlder", ScrollRoot: "ScrollRoot", AssistantDisplayName: "AssistantDisplayName", assistantDisplayName: "assistantDisplayName", AssistantAvatarUrl: "AssistantAvatarUrl", assistantAvatarUrl: "assistantAvatarUrl", ArtifactMap: "ArtifactMap", artifactMap: "artifactMap", AgentRunMap: "AgentRunMap", agentRunMap: "agentRunMap", RatingsMap: "RatingsMap", ratingsMap: "ratingsMap", UserAvatarMap: "UserAvatarMap", userAvatarMap: "userAvatarMap", AttachmentsMap: "AttachmentsMap", attachmentsMap: "attachmentsMap", SessionMetaMap: "SessionMetaMap", sessionMetaMap: "sessionMetaMap", MessageRendererTemplate: "MessageRendererTemplate", messageRendererTemplate: "messageRendererTemplate", MessageExtraTemplate: "MessageExtraTemplate", messageExtraTemplate: "messageExtraTemplate", MessagesUpdate: "MessagesUpdate", messagesUpdate: "messagesUpdate" }, outputs: { EditMessage: "EditMessage", editMessage: "editMessage", DeleteMessage: "DeleteMessage", deleteMessage: "deleteMessage", RetryMessage: "RetryMessage", retryMessage: "retryMessage", TestFeedbackMessage: "TestFeedbackMessage", testFeedbackMessage: "testFeedbackMessage", ArtifactClicked: "ArtifactClicked", artifactClicked: "artifactClicked", ReplyInThread: "ReplyInThread", replyInThread: "replyInThread", ViewThread: "ViewThread", viewThread: "viewThread", MessageEdited: "MessageEdited", messageEdited: "messageEdited", OpenEntityRecord: "OpenEntityRecord", openEntityRecord: "openEntityRecord", SuggestedResponseSelected: "SuggestedResponseSelected", suggestedResponseSelected: "suggestedResponseSelected", AttachmentClicked: "AttachmentClicked", attachmentClicked: "attachmentClicked", DiagnosticRequested: "DiagnosticRequested", diagnosticRequested: "diagnosticRequested", MessagePinToggled: "MessagePinToggled", messagePinToggled: "messagePinToggled", LivenessCheckRequested: "LivenessCheckRequested", RealtimeSessionOpenRequested: "RealtimeSessionOpenRequested", realtimeSessionOpenRequested: "realtimeSessionOpenRequested", BeforeResponseFormSubmitted: "BeforeResponseFormSubmitted", beforeResponseFormSubmitted: "beforeResponseFormSubmitted", AfterResponseFormSubmitted: "AfterResponseFormSubmitted", afterResponseFormSubmitted: "afterResponseFormSubmitted", OlderRequested: "OlderRequested", DateJumpRequested: "DateJumpRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 9, vars: 3, consts: [["scrollContainer", ""], ["spacerTemplate", ""], ["messageContainer", ""], ["olderSentinel", ""], [1, "message-list-container"], [1, "sticky-date-header"], [1, "transcript-older-sentinel"], ["Icon", "fa-solid fa-comments", "Title", "No messages yet. Start a conversation!", 1, "messages-empty-fill"], [1, "sticky-date-wrapper"], [1, "sticky-date-button", 3, "click"], [1, "fas", "fa-chevron-down"], [1, "date-nav-dropdown"], [1, "date-nav-option", "jump-to"], [1, "date-nav-option", 3, "click"], ["text", "Loading earlier messages\u2026", "size", "small"], [1, "transcript-older-label"], ["aria-hidden", "true", 1, "transcript-spacer"]], template: function MessageListComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1484
1879
|
i0.ɵɵelementStart(0, "div", 4, 0);
|
|
1485
1880
|
i0.ɵɵconditionalCreate(2, MessageListComponent_Conditional_2_Template, 17, 3, "div", 5);
|
|
1486
1881
|
i0.ɵɵconditionalCreate(3, MessageListComponent_Conditional_3_Template, 4, 1, "div", 6);
|
|
@@ -1502,28 +1897,52 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1502
1897
|
args: [{ standalone: false, selector: 'mj-conversation-message-list', template: "<div class=\"message-list-container\" #scrollContainer>\n <!-- Sticky Date Header (only show for long conversations spanning multiple days) -->\n @if (showDateNavigation && shouldShowDateFilter && messages.length > 0) {\n <div class=\"sticky-date-header\">\n <div class=\"sticky-date-wrapper\">\n <button class=\"sticky-date-button\" (click)=\"toggleDateNav()\">\n <span>{{ currentDateDisplay }}</span>\n <i class=\"fas fa-chevron-down\"></i>\n </button>\n <div class=\"date-nav-dropdown\" [class.show]=\"showDateNav\">\n <div class=\"date-nav-option jump-to\">Jump to...</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('today')\">Today</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('yesterday')\">Yesterday</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('last-week')\">Last week</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('last-month')\">Last month</div>\n </div>\n </div>\n </div>\n }\n\n <!-- Windowed transcript: older pages load when this scrolls into view (IntersectionObserver\n in the component, not a scroll listener). Absent entirely once the top is reached. -->\n @if (HasMoreAbove) {\n <div #olderSentinel class=\"transcript-older-sentinel\">\n @if (IsLoadingOlder) {\n <mj-loading text=\"Loading earlier messages\u2026\" size=\"small\"></mj-loading>\n } @else {\n <span class=\"transcript-older-label\">Earlier messages</span>\n }\n </div>\n }\n\n <!-- Height-holding stand-in for a timeline item that has been unmounted to keep the DOM\n bounded. Declared here but rendered into #messageContainer at the item's own index,\n so scroll geometry is unchanged. -->\n <ng-template #spacerTemplate let-height=\"height\">\n <div class=\"transcript-spacer\" [style.height.px]=\"height\" aria-hidden=\"true\"></div>\n </ng-template>\n\n <ng-container #messageContainer></ng-container>\n\n @if (messages.length === 0 && showEmptyFill) {\n <mj-empty-state\n class=\"messages-empty-fill\"\n Icon=\"fa-solid fa-comments\"\n Title=\"No messages yet. Start a conversation!\" />\n }\n</div>", styles: ["/* Scrolls itself ONLY when no host scroller was supplied \u2014 see the `mj-list-host-scrolled`\n host binding. `overflow-y` here makes this element the nearest scrolling ancestor, which is\n what `position: sticky` binds to; when the host owns the scrolling this container never\n moves, so anything sticky inside it silently scrolls away instead of pinning. */\n.message-list-container {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background-color: var(--mj-bg-surface-card);\n position: relative;\n}\n\n/* Empty-state fills the message pane vertically */\n.messages-empty-fill {\n height: 100%;\n}\n\n/* Sticky Date Header */\n.sticky-date-header {\n position: sticky;\n top: 12px;\n z-index: 100;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n pointer-events: none;\n}\n\n.sticky-date-wrapper {\n pointer-events: auto;\n position: relative;\n}\n\n.sticky-date-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.sticky-date-button:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-md);\n}\n\n.sticky-date-button i {\n font-size: 10px;\n color: var(--mj-text-secondary);\n}\n\n/* Date Navigation Dropdown */\n.date-nav-dropdown {\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n min-width: 200px;\n display: none;\n z-index: 101;\n}\n\n.date-nav-dropdown.show {\n display: block;\n}\n\n.date-nav-option {\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.2s;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.date-nav-option:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.date-nav-option.jump-to {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 12px;\n cursor: default;\n padding: 8px 16px 4px 16px;\n}\n\n.date-nav-option.jump-to:hover {\n background: none;\n}\n\n/* \u2500\u2500 Windowed transcript sentinel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Sits above the first loaded message while older pages remain. Needs real height\n so the IntersectionObserver has something to observe. */\n.transcript-older-sentinel {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 2.5rem;\n padding: 0.75rem 1rem;\n}\n\n.transcript-older-label {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n/* Stands in for an unmounted timeline item so the scroll range never changes when the\n DOM is trimmed. Height comes from the item's last measured size. */\n.transcript-spacer {\n width: 100%;\n flex-shrink: 0;\n}\n\n/* Host owns the scrolling: stop creating a scroll context here so `position: sticky`\n descendants (the date navigator) bind to the host's real scroller and actually pin.\n\n BOTH axes, not just `overflow-y`. Per CSS Overflow, when one axis is `visible` and the\n other is not, the `visible` one computes to `auto` \u2014 so leaving `overflow-x: hidden` in\n place silently kept this element a scroll container and the header kept scrolling away.\n Horizontal clipping is not lost: the host's own scroller (`.chat-messages-container`)\n already carries `overflow-x: hidden`. */\n:host(.mj-list-host-scrolled) .message-list-container {\n overflow: visible;\n}\n"] }]
|
|
1503
1898
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], { messages: [{
|
|
1504
1899
|
type: Input
|
|
1900
|
+
}], Conversation: [{
|
|
1901
|
+
type: Input
|
|
1505
1902
|
}], conversation: [{
|
|
1506
1903
|
type: Input
|
|
1904
|
+
}], CurrentUser: [{
|
|
1905
|
+
type: Input
|
|
1507
1906
|
}], currentUser: [{
|
|
1508
1907
|
type: Input
|
|
1908
|
+
}], IsProcessing: [{
|
|
1909
|
+
type: Input
|
|
1509
1910
|
}], isProcessing: [{
|
|
1510
1911
|
type: Input
|
|
1912
|
+
}], ShowEmptyFill: [{
|
|
1913
|
+
type: Input
|
|
1511
1914
|
}], showEmptyFill: [{
|
|
1512
1915
|
type: Input
|
|
1916
|
+
}], ShowDateNavigation: [{
|
|
1917
|
+
type: Input
|
|
1513
1918
|
}], showDateNavigation: [{
|
|
1514
1919
|
type: Input
|
|
1920
|
+
}], ShowAgentRunDetails: [{
|
|
1921
|
+
type: Input
|
|
1515
1922
|
}], showAgentRunDetails: [{
|
|
1516
1923
|
type: Input
|
|
1924
|
+
}], ShowReactions: [{
|
|
1925
|
+
type: Input
|
|
1517
1926
|
}], showReactions: [{
|
|
1518
1927
|
type: Input
|
|
1928
|
+
}], ShowMessageRating: [{
|
|
1929
|
+
type: Input
|
|
1519
1930
|
}], showMessageRating: [{
|
|
1520
1931
|
type: Input
|
|
1932
|
+
}], AllowPinning: [{
|
|
1933
|
+
type: Input
|
|
1521
1934
|
}], allowPinning: [{
|
|
1522
1935
|
type: Input
|
|
1936
|
+
}], AllowMessageEdit: [{
|
|
1937
|
+
type: Input
|
|
1523
1938
|
}], allowMessageEdit: [{
|
|
1524
1939
|
type: Input
|
|
1940
|
+
}], AllowMessageDelete: [{
|
|
1941
|
+
type: Input
|
|
1525
1942
|
}], allowMessageDelete: [{
|
|
1526
1943
|
type: Input
|
|
1944
|
+
}], ReadOnly: [{
|
|
1945
|
+
type: Input
|
|
1527
1946
|
}], HasMoreAbove: [{
|
|
1528
1947
|
type: Input
|
|
1529
1948
|
}], IsLoadingOlder: [{
|
|
@@ -1533,74 +1952,130 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1533
1952
|
}], HostSuppliesScroller: [{
|
|
1534
1953
|
type: HostBinding,
|
|
1535
1954
|
args: ['class.mj-list-host-scrolled']
|
|
1955
|
+
}], AssistantDisplayName: [{
|
|
1956
|
+
type: Input
|
|
1536
1957
|
}], assistantDisplayName: [{
|
|
1537
1958
|
type: Input
|
|
1959
|
+
}], AssistantAvatarUrl: [{
|
|
1960
|
+
type: Input
|
|
1538
1961
|
}], assistantAvatarUrl: [{
|
|
1539
1962
|
type: Input
|
|
1963
|
+
}], ArtifactMap: [{
|
|
1964
|
+
type: Input
|
|
1540
1965
|
}], artifactMap: [{
|
|
1541
1966
|
type: Input
|
|
1967
|
+
}], AgentRunMap: [{
|
|
1968
|
+
type: Input
|
|
1542
1969
|
}], agentRunMap: [{
|
|
1543
1970
|
type: Input
|
|
1971
|
+
}], RatingsMap: [{
|
|
1972
|
+
type: Input
|
|
1544
1973
|
}], ratingsMap: [{
|
|
1545
1974
|
type: Input
|
|
1975
|
+
}], UserAvatarMap: [{
|
|
1976
|
+
type: Input
|
|
1546
1977
|
}], userAvatarMap: [{
|
|
1547
1978
|
type: Input
|
|
1979
|
+
}], AttachmentsMap: [{
|
|
1980
|
+
type: Input
|
|
1548
1981
|
}], attachmentsMap: [{
|
|
1549
1982
|
type: Input
|
|
1983
|
+
}], SessionMetaMap: [{
|
|
1984
|
+
type: Input
|
|
1550
1985
|
}], sessionMetaMap: [{
|
|
1551
1986
|
type: Input
|
|
1987
|
+
}], MessageRendererTemplate: [{
|
|
1988
|
+
type: Input
|
|
1552
1989
|
}], messageRendererTemplate: [{
|
|
1553
1990
|
type: Input
|
|
1991
|
+
}], MessageExtraTemplate: [{
|
|
1992
|
+
type: Input
|
|
1554
1993
|
}], messageExtraTemplate: [{
|
|
1555
1994
|
type: Input
|
|
1995
|
+
}], EditMessage: [{
|
|
1996
|
+
type: Output
|
|
1556
1997
|
}], editMessage: [{
|
|
1557
1998
|
type: Output
|
|
1999
|
+
}], DeleteMessage: [{
|
|
2000
|
+
type: Output
|
|
1558
2001
|
}], deleteMessage: [{
|
|
1559
2002
|
type: Output
|
|
2003
|
+
}], RetryMessage: [{
|
|
2004
|
+
type: Output
|
|
1560
2005
|
}], retryMessage: [{
|
|
1561
2006
|
type: Output
|
|
2007
|
+
}], TestFeedbackMessage: [{
|
|
2008
|
+
type: Output
|
|
1562
2009
|
}], testFeedbackMessage: [{
|
|
1563
2010
|
type: Output
|
|
2011
|
+
}], ArtifactClicked: [{
|
|
2012
|
+
type: Output
|
|
1564
2013
|
}], artifactClicked: [{
|
|
1565
2014
|
type: Output
|
|
2015
|
+
}], ReplyInThread: [{
|
|
2016
|
+
type: Output
|
|
1566
2017
|
}], replyInThread: [{
|
|
1567
2018
|
type: Output
|
|
2019
|
+
}], ViewThread: [{
|
|
2020
|
+
type: Output
|
|
1568
2021
|
}], viewThread: [{
|
|
1569
2022
|
type: Output
|
|
2023
|
+
}], MessageEdited: [{
|
|
2024
|
+
type: Output
|
|
1570
2025
|
}], messageEdited: [{
|
|
1571
2026
|
type: Output
|
|
2027
|
+
}], OpenEntityRecord: [{
|
|
2028
|
+
type: Output
|
|
1572
2029
|
}], openEntityRecord: [{
|
|
1573
2030
|
type: Output
|
|
2031
|
+
}], SuggestedResponseSelected: [{
|
|
2032
|
+
type: Output
|
|
1574
2033
|
}], suggestedResponseSelected: [{
|
|
1575
2034
|
type: Output
|
|
2035
|
+
}], AttachmentClicked: [{
|
|
2036
|
+
type: Output
|
|
1576
2037
|
}], attachmentClicked: [{
|
|
1577
2038
|
type: Output
|
|
2039
|
+
}], DiagnosticRequested: [{
|
|
2040
|
+
type: Output
|
|
1578
2041
|
}], diagnosticRequested: [{
|
|
1579
2042
|
type: Output
|
|
2043
|
+
}], MessagePinToggled: [{
|
|
2044
|
+
type: Output
|
|
1580
2045
|
}], messagePinToggled: [{
|
|
1581
2046
|
type: Output
|
|
2047
|
+
}], LivenessCheckRequested: [{
|
|
2048
|
+
type: Output
|
|
2049
|
+
}], RealtimeSessionOpenRequested: [{
|
|
2050
|
+
type: Output
|
|
1582
2051
|
}], realtimeSessionOpenRequested: [{
|
|
1583
2052
|
type: Output
|
|
2053
|
+
}], BeforeResponseFormSubmitted: [{
|
|
2054
|
+
type: Output
|
|
1584
2055
|
}], beforeResponseFormSubmitted: [{
|
|
1585
2056
|
type: Output
|
|
2057
|
+
}], AfterResponseFormSubmitted: [{
|
|
2058
|
+
type: Output
|
|
1586
2059
|
}], afterResponseFormSubmitted: [{
|
|
1587
2060
|
type: Output
|
|
1588
2061
|
}], OlderRequested: [{
|
|
1589
2062
|
type: Output
|
|
1590
2063
|
}], DateJumpRequested: [{
|
|
1591
2064
|
type: Output
|
|
1592
|
-
}],
|
|
2065
|
+
}], MessageContainerRef: [{
|
|
1593
2066
|
type: ViewChild,
|
|
1594
2067
|
args: ['messageContainer', { read: ViewContainerRef }]
|
|
1595
|
-
}],
|
|
2068
|
+
}], ScrollContainer: [{
|
|
1596
2069
|
type: ViewChild,
|
|
1597
2070
|
args: ['scrollContainer']
|
|
1598
|
-
}],
|
|
2071
|
+
}], OlderSentinel: [{
|
|
1599
2072
|
type: ViewChild,
|
|
1600
2073
|
args: ['olderSentinel']
|
|
1601
2074
|
}], spacerTemplate: [{
|
|
1602
2075
|
type: ViewChild,
|
|
1603
2076
|
args: ['spacerTemplate']
|
|
2077
|
+
}], MessagesUpdate: [{
|
|
2078
|
+
type: Input
|
|
1604
2079
|
}], messagesUpdate: [{
|
|
1605
2080
|
type: Input
|
|
1606
2081
|
}] }); })();
|