@memberjunction/ng-conversations 6.1.4 → 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 +36 -3
- 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 +2407 -731
- 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/channels/channel-onboarding-panel.component.d.ts +1 -1
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.js +1 -1
- package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +1 -1
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +3 -0
- package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.d.ts +2 -1
- package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/media/media-channel.js +1 -1
- package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +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-agent-banner.component.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts +3 -1
- package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-composer.component.js +26 -8
- package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +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 +4 -4
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +19 -19
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.d.ts +2 -3
- package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-state.js +3 -2
- package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +17 -1
- package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-thread.component.js +122 -45
- package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -31
- 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 +138 -124
- 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 +4 -4
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
- 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 +2 -2
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +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/remote-browser/remote-browser-channel.d.ts +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +1 -1
- package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +4 -2
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +7 -3
- 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/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.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/browser-realtime-media-host.d.ts +24 -0
- package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -0
- package/dist/lib/services/browser-realtime-media-host.js +95 -0
- package/dist/lib/services/browser-realtime-media-host.js.map +1 -0
- 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 +41 -2
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +80 -13
- 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/graphql-attachment-blob-store.d.ts +44 -0
- package/dist/lib/services/graphql-attachment-blob-store.d.ts.map +1 -0
- package/dist/lib/services/graphql-attachment-blob-store.js +113 -0
- package/dist/lib/services/graphql-attachment-blob-store.js.map +1 -0
- package/dist/lib/services/mention-autocomplete.service.d.ts +17 -141
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +15 -460
- package/dist/lib/services/mention-autocomplete.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/realtime-session-review.service.d.ts +1 -1
- package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session-review.service.js +1 -1
- package/dist/lib/services/realtime-session-review.service.js.map +1 -1
- package/dist/lib/services/realtime-session.service.d.ts +16 -1150
- package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
- package/dist/lib/services/realtime-session.service.js +28 -2430
- package/dist/lib/services/realtime-session.service.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/lib/utils/realtime-session-timeline.d.ts +8 -79
- package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -1
- package/dist/lib/utils/realtime-session-timeline.js +8 -89
- package/dist/lib/utils/realtime-session-timeline.js.map +1 -1
- package/dist/public-api.d.ts +5 -2
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +9 -2
- package/dist/public-api.js.map +1 -1
- package/package.json +33 -32
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +0 -384
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +0 -1
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +0 -231
- package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +0 -1
- package/dist/lib/services/delegation-result-parser.d.ts +0 -50
- package/dist/lib/services/delegation-result-parser.d.ts.map +0 -1
- package/dist/lib/services/delegation-result-parser.js +0 -60
- package/dist/lib/services/delegation-result-parser.js.map +0 -1
- package/dist/lib/services/narration-template.d.ts +0 -42
- package/dist/lib/services/narration-template.d.ts.map +0 -1
- package/dist/lib/services/narration-template.js +0 -73
- package/dist/lib/services/narration-template.js.map +0 -1
- package/dist/lib/services/skill-picker-narrowing.d.ts +0 -13
- package/dist/lib/services/skill-picker-narrowing.d.ts.map +0 -1
- package/dist/lib/services/skill-picker-narrowing.js +0 -13
- package/dist/lib/services/skill-picker-narrowing.js.map +0 -1
|
@@ -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,109 @@ 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
|
+
}
|
|
113
201
|
// ── Windowed-transcript paging state ────────────────────────────────────────
|
|
114
202
|
// The list renders only the LOADED window, not the whole conversation. These two
|
|
115
203
|
// describe what lies above it. Unused until the Phase 5 sentinel lands; wired now so
|
|
@@ -192,39 +280,103 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
192
280
|
// restamp the ALREADY-rendered items or existing bubbles keep the old identity
|
|
193
281
|
// until the next messages-array mutation. ──
|
|
194
282
|
/** Display name shown on AI messages. Null = the engine-resolved agent name. */
|
|
195
|
-
set
|
|
283
|
+
set AssistantDisplayName(value) {
|
|
196
284
|
if (value !== this._assistantDisplayName) {
|
|
197
285
|
this._assistantDisplayName = value;
|
|
198
286
|
this.restampAssistantIdentity();
|
|
199
287
|
}
|
|
200
288
|
}
|
|
201
|
-
get
|
|
289
|
+
get AssistantDisplayName() {
|
|
202
290
|
return this._assistantDisplayName;
|
|
203
291
|
}
|
|
292
|
+
/** @deprecated Use {@link AssistantDisplayName}. */
|
|
293
|
+
get assistantDisplayName() {
|
|
294
|
+
return this.AssistantDisplayName;
|
|
295
|
+
}
|
|
296
|
+
/** @deprecated Use {@link AssistantDisplayName}. */
|
|
297
|
+
set assistantDisplayName(value) {
|
|
298
|
+
this.AssistantDisplayName = value;
|
|
299
|
+
}
|
|
204
300
|
_assistantDisplayName = null;
|
|
205
301
|
/** Image URL for the AI message avatar. Null = the agent's Font Awesome icon. */
|
|
206
|
-
set
|
|
302
|
+
set AssistantAvatarUrl(value) {
|
|
207
303
|
if (value !== this._assistantAvatarUrl) {
|
|
208
304
|
this._assistantAvatarUrl = value;
|
|
209
305
|
this.restampAssistantIdentity();
|
|
210
306
|
}
|
|
211
307
|
}
|
|
212
|
-
get
|
|
308
|
+
get AssistantAvatarUrl() {
|
|
213
309
|
return this._assistantAvatarUrl;
|
|
214
310
|
}
|
|
311
|
+
/** @deprecated Use {@link AssistantAvatarUrl}. */
|
|
312
|
+
get assistantAvatarUrl() {
|
|
313
|
+
return this.AssistantAvatarUrl;
|
|
314
|
+
}
|
|
315
|
+
/** @deprecated Use {@link AssistantAvatarUrl}. */
|
|
316
|
+
set assistantAvatarUrl(value) {
|
|
317
|
+
this.AssistantAvatarUrl = value;
|
|
318
|
+
}
|
|
215
319
|
_assistantAvatarUrl = null;
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
320
|
+
ArtifactMap = new Map();
|
|
321
|
+
/** @deprecated Use {@link ArtifactMap}. */
|
|
322
|
+
set artifactMap(value) {
|
|
323
|
+
this.ArtifactMap = value;
|
|
324
|
+
}
|
|
325
|
+
/** @deprecated Use {@link ArtifactMap}. */
|
|
326
|
+
get artifactMap() {
|
|
327
|
+
return this.ArtifactMap;
|
|
328
|
+
}
|
|
329
|
+
AgentRunMap = new Map();
|
|
330
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
331
|
+
set agentRunMap(value) {
|
|
332
|
+
this.AgentRunMap = value;
|
|
333
|
+
}
|
|
334
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
335
|
+
get agentRunMap() {
|
|
336
|
+
return this.AgentRunMap;
|
|
337
|
+
}
|
|
338
|
+
RatingsMap = new Map();
|
|
339
|
+
/** @deprecated Use {@link RatingsMap}. */
|
|
340
|
+
set ratingsMap(value) {
|
|
341
|
+
this.RatingsMap = value;
|
|
342
|
+
}
|
|
343
|
+
/** @deprecated Use {@link RatingsMap}. */
|
|
344
|
+
get ratingsMap() {
|
|
345
|
+
return this.RatingsMap;
|
|
346
|
+
}
|
|
347
|
+
UserAvatarMap = new Map();
|
|
348
|
+
/** @deprecated Use {@link UserAvatarMap}. */
|
|
349
|
+
set userAvatarMap(value) {
|
|
350
|
+
this.UserAvatarMap = value;
|
|
351
|
+
}
|
|
352
|
+
/** @deprecated Use {@link UserAvatarMap}. */
|
|
353
|
+
get userAvatarMap() {
|
|
354
|
+
return this.UserAvatarMap;
|
|
355
|
+
}
|
|
356
|
+
AttachmentsMap = new Map();
|
|
357
|
+
/** @deprecated Use {@link AttachmentsMap}. */
|
|
358
|
+
set attachmentsMap(value) {
|
|
359
|
+
this.AttachmentsMap = value;
|
|
360
|
+
}
|
|
361
|
+
/** @deprecated Use {@link AttachmentsMap}. */
|
|
362
|
+
get attachmentsMap() {
|
|
363
|
+
return this.AttachmentsMap;
|
|
364
|
+
}
|
|
221
365
|
/**
|
|
222
366
|
* Optional session-row enrichment for realtime SESSION BLOCKS, keyed by
|
|
223
367
|
* `NormalizeUUID(sessionId)` (agent name / status / close reason). Details stamped
|
|
224
368
|
* with an `AgentSessionID` collapse into one timeline card per session — see
|
|
225
369
|
* `BuildConversationTimeline` — and this map dresses those cards up when present.
|
|
226
370
|
*/
|
|
227
|
-
|
|
371
|
+
SessionMetaMap = new Map();
|
|
372
|
+
/** @deprecated Use {@link SessionMetaMap}. */
|
|
373
|
+
set sessionMetaMap(value) {
|
|
374
|
+
this.SessionMetaMap = value;
|
|
375
|
+
}
|
|
376
|
+
/** @deprecated Use {@link SessionMetaMap}. */
|
|
377
|
+
get sessionMetaMap() {
|
|
378
|
+
return this.SessionMetaMap;
|
|
379
|
+
}
|
|
228
380
|
/**
|
|
229
381
|
* Optional per-iteration custom message renderer. When set, the list renders each
|
|
230
382
|
* message via this template (full replacement) instead of the default
|
|
@@ -237,33 +389,177 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
237
389
|
* etc. The minimal `MJChatMessageBubbleDefaultComponent` ships as a ready-to-use
|
|
238
390
|
* bubble renderer.
|
|
239
391
|
*/
|
|
240
|
-
|
|
392
|
+
MessageRendererTemplate = null;
|
|
393
|
+
/** @deprecated Use {@link MessageRendererTemplate}. */
|
|
394
|
+
set messageRendererTemplate(value) {
|
|
395
|
+
this.MessageRendererTemplate = value;
|
|
396
|
+
}
|
|
397
|
+
/** @deprecated Use {@link MessageRendererTemplate}. */
|
|
398
|
+
get messageRendererTemplate() {
|
|
399
|
+
return this.MessageRendererTemplate;
|
|
400
|
+
}
|
|
241
401
|
/**
|
|
242
402
|
* Optional per-message additive decoration template, projected INSIDE the default
|
|
243
403
|
* `MessageItemComponent` (after the message text). Forwarded by chat-area when a
|
|
244
404
|
* consumer projects `mjChatSlot="messageExtra"`. Ignored when
|
|
245
405
|
* `messageRendererTemplate` is set (custom renderers own all per-message content).
|
|
246
406
|
*/
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
407
|
+
MessageExtraTemplate = null;
|
|
408
|
+
/** @deprecated Use {@link MessageExtraTemplate}. */
|
|
409
|
+
set messageExtraTemplate(value) {
|
|
410
|
+
this.MessageExtraTemplate = value;
|
|
411
|
+
}
|
|
412
|
+
/** @deprecated Use {@link MessageExtraTemplate}. */
|
|
413
|
+
get messageExtraTemplate() {
|
|
414
|
+
return this.MessageExtraTemplate;
|
|
415
|
+
}
|
|
416
|
+
EditMessage = new EventEmitter();
|
|
417
|
+
/**
|
|
418
|
+
* @deprecated Use {@link EditMessage}.
|
|
419
|
+
*
|
|
420
|
+
* The same emitter under the old binding name, so a template still binding
|
|
421
|
+
* (editMessage) keeps working. Must stay AFTER EditMessage: class fields
|
|
422
|
+
* initialise in order, and the other way round this captures undefined.
|
|
423
|
+
*/
|
|
424
|
+
editMessage = this.EditMessage;
|
|
425
|
+
DeleteMessage = new EventEmitter();
|
|
426
|
+
/**
|
|
427
|
+
* @deprecated Use {@link DeleteMessage}.
|
|
428
|
+
*
|
|
429
|
+
* The same emitter under the old binding name, so a template still binding
|
|
430
|
+
* (deleteMessage) keeps working. Must stay AFTER DeleteMessage: class fields
|
|
431
|
+
* initialise in order, and the other way round this captures undefined.
|
|
432
|
+
*/
|
|
433
|
+
deleteMessage = this.DeleteMessage;
|
|
434
|
+
RetryMessage = new EventEmitter();
|
|
435
|
+
/**
|
|
436
|
+
* @deprecated Use {@link RetryMessage}.
|
|
437
|
+
*
|
|
438
|
+
* The same emitter under the old binding name, so a template still binding
|
|
439
|
+
* (retryMessage) keeps working. Must stay AFTER RetryMessage: class fields
|
|
440
|
+
* initialise in order, and the other way round this captures undefined.
|
|
441
|
+
*/
|
|
442
|
+
retryMessage = this.RetryMessage;
|
|
443
|
+
TestFeedbackMessage = new EventEmitter();
|
|
444
|
+
/**
|
|
445
|
+
* @deprecated Use {@link TestFeedbackMessage}.
|
|
446
|
+
*
|
|
447
|
+
* The same emitter under the old binding name, so a template still binding
|
|
448
|
+
* (testFeedbackMessage) keeps working. Must stay AFTER TestFeedbackMessage: class fields
|
|
449
|
+
* initialise in order, and the other way round this captures undefined.
|
|
450
|
+
*/
|
|
451
|
+
testFeedbackMessage = this.TestFeedbackMessage;
|
|
452
|
+
ArtifactClicked = new EventEmitter();
|
|
453
|
+
/**
|
|
454
|
+
* @deprecated Use {@link ArtifactClicked}.
|
|
455
|
+
*
|
|
456
|
+
* The same emitter under the old binding name, so a template still binding
|
|
457
|
+
* (artifactClicked) keeps working. Must stay AFTER ArtifactClicked: class fields
|
|
458
|
+
* initialise in order, and the other way round this captures undefined.
|
|
459
|
+
*/
|
|
460
|
+
artifactClicked = this.ArtifactClicked;
|
|
461
|
+
ReplyInThread = new EventEmitter();
|
|
462
|
+
/**
|
|
463
|
+
* @deprecated Use {@link ReplyInThread}.
|
|
464
|
+
*
|
|
465
|
+
* The same emitter under the old binding name, so a template still binding
|
|
466
|
+
* (replyInThread) keeps working. Must stay AFTER ReplyInThread: class fields
|
|
467
|
+
* initialise in order, and the other way round this captures undefined.
|
|
468
|
+
*/
|
|
469
|
+
replyInThread = this.ReplyInThread;
|
|
470
|
+
ViewThread = new EventEmitter();
|
|
471
|
+
/**
|
|
472
|
+
* @deprecated Use {@link ViewThread}.
|
|
473
|
+
*
|
|
474
|
+
* The same emitter under the old binding name, so a template still binding
|
|
475
|
+
* (viewThread) keeps working. Must stay AFTER ViewThread: class fields
|
|
476
|
+
* initialise in order, and the other way round this captures undefined.
|
|
477
|
+
*/
|
|
478
|
+
viewThread = this.ViewThread;
|
|
479
|
+
MessageEdited = new EventEmitter();
|
|
480
|
+
/**
|
|
481
|
+
* @deprecated Use {@link MessageEdited}.
|
|
482
|
+
*
|
|
483
|
+
* The same emitter under the old binding name, so a template still binding
|
|
484
|
+
* (messageEdited) keeps working. Must stay AFTER MessageEdited: class fields
|
|
485
|
+
* initialise in order, and the other way round this captures undefined.
|
|
486
|
+
*/
|
|
487
|
+
messageEdited = this.MessageEdited;
|
|
488
|
+
OpenEntityRecord = new EventEmitter();
|
|
489
|
+
/**
|
|
490
|
+
* @deprecated Use {@link OpenEntityRecord}.
|
|
491
|
+
*
|
|
492
|
+
* The same emitter under the old binding name, so a template still binding
|
|
493
|
+
* (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
|
|
494
|
+
* initialise in order, and the other way round this captures undefined.
|
|
495
|
+
*/
|
|
496
|
+
openEntityRecord = this.OpenEntityRecord;
|
|
497
|
+
SuggestedResponseSelected = new EventEmitter();
|
|
498
|
+
/**
|
|
499
|
+
* @deprecated Use {@link SuggestedResponseSelected}.
|
|
500
|
+
*
|
|
501
|
+
* The same emitter under the old binding name, so a template still binding
|
|
502
|
+
* (suggestedResponseSelected) keeps working. Must stay AFTER SuggestedResponseSelected: class fields
|
|
503
|
+
* initialise in order, and the other way round this captures undefined.
|
|
504
|
+
*/
|
|
505
|
+
suggestedResponseSelected = this.SuggestedResponseSelected;
|
|
506
|
+
AttachmentClicked = new EventEmitter();
|
|
507
|
+
/**
|
|
508
|
+
* @deprecated Use {@link AttachmentClicked}.
|
|
509
|
+
*
|
|
510
|
+
* The same emitter under the old binding name, so a template still binding
|
|
511
|
+
* (attachmentClicked) keeps working. Must stay AFTER AttachmentClicked: class fields
|
|
512
|
+
* initialise in order, and the other way round this captures undefined.
|
|
513
|
+
*/
|
|
514
|
+
attachmentClicked = this.AttachmentClicked;
|
|
515
|
+
DiagnosticRequested = new EventEmitter();
|
|
516
|
+
/**
|
|
517
|
+
* @deprecated Use {@link DiagnosticRequested}.
|
|
518
|
+
*
|
|
519
|
+
* The same emitter under the old binding name, so a template still binding
|
|
520
|
+
* (diagnosticRequested) keeps working. Must stay AFTER DiagnosticRequested: class fields
|
|
521
|
+
* initialise in order, and the other way round this captures undefined.
|
|
522
|
+
*/
|
|
523
|
+
diagnosticRequested = this.DiagnosticRequested; // emits messageId
|
|
524
|
+
MessagePinToggled = new EventEmitter();
|
|
525
|
+
/**
|
|
526
|
+
* @deprecated Use {@link MessagePinToggled}.
|
|
527
|
+
*
|
|
528
|
+
* The same emitter under the old binding name, so a template still binding
|
|
529
|
+
* (messagePinToggled) keeps working. Must stay AFTER MessagePinToggled: class fields
|
|
530
|
+
* initialise in order, and the other way round this captures undefined.
|
|
531
|
+
*/
|
|
532
|
+
messagePinToggled = this.MessagePinToggled;
|
|
261
533
|
/** Emitted with the `MJ: AI Agent Sessions.ID` when a realtime session block's Open affordance is clicked. */
|
|
262
|
-
|
|
534
|
+
RealtimeSessionOpenRequested = new EventEmitter();
|
|
535
|
+
/**
|
|
536
|
+
* @deprecated Use {@link RealtimeSessionOpenRequested}.
|
|
537
|
+
*
|
|
538
|
+
* The same emitter under the old binding name, so a template still binding
|
|
539
|
+
* (realtimeSessionOpenRequested) keeps working. Must stay AFTER RealtimeSessionOpenRequested: class fields
|
|
540
|
+
* initialise in order, and the other way round this captures undefined.
|
|
541
|
+
*/
|
|
542
|
+
realtimeSessionOpenRequested = this.RealtimeSessionOpenRequested;
|
|
263
543
|
/** Forwarded from MessageItemComponent — see its docs. */
|
|
264
|
-
|
|
544
|
+
BeforeResponseFormSubmitted = new EventEmitter();
|
|
545
|
+
/**
|
|
546
|
+
* @deprecated Use {@link BeforeResponseFormSubmitted}.
|
|
547
|
+
*
|
|
548
|
+
* The same emitter under the old binding name, so a template still binding
|
|
549
|
+
* (beforeResponseFormSubmitted) keeps working. Must stay AFTER BeforeResponseFormSubmitted: class fields
|
|
550
|
+
* initialise in order, and the other way round this captures undefined.
|
|
551
|
+
*/
|
|
552
|
+
beforeResponseFormSubmitted = this.BeforeResponseFormSubmitted;
|
|
265
553
|
/** Forwarded from MessageItemComponent — see its docs. */
|
|
266
|
-
|
|
554
|
+
AfterResponseFormSubmitted = new EventEmitter();
|
|
555
|
+
/**
|
|
556
|
+
* @deprecated Use {@link AfterResponseFormSubmitted}.
|
|
557
|
+
*
|
|
558
|
+
* The same emitter under the old binding name, so a template still binding
|
|
559
|
+
* (afterResponseFormSubmitted) keeps working. Must stay AFTER AfterResponseFormSubmitted: class fields
|
|
560
|
+
* initialise in order, and the other way round this captures undefined.
|
|
561
|
+
*/
|
|
562
|
+
afterResponseFormSubmitted = this.AfterResponseFormSubmitted;
|
|
267
563
|
/**
|
|
268
564
|
* Asks the host to load the next older page. Fired when the "earlier messages"
|
|
269
565
|
* sentinel scrolls into view — never on a raw scroll event, so a fast scroll costs
|
|
@@ -275,10 +571,34 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
275
571
|
* Emitted instead of handled locally because paging belongs to the window store.
|
|
276
572
|
*/
|
|
277
573
|
DateJumpRequested = new EventEmitter();
|
|
278
|
-
|
|
279
|
-
|
|
574
|
+
MessageContainerRef;
|
|
575
|
+
/** @deprecated Use {@link MessageContainerRef}. */
|
|
576
|
+
get messageContainerRef() {
|
|
577
|
+
return this.MessageContainerRef;
|
|
578
|
+
}
|
|
579
|
+
/** @deprecated Use {@link MessageContainerRef}. */
|
|
580
|
+
set messageContainerRef(value) {
|
|
581
|
+
this.MessageContainerRef = value;
|
|
582
|
+
}
|
|
583
|
+
ScrollContainer;
|
|
584
|
+
/** @deprecated Use {@link ScrollContainer}. */
|
|
585
|
+
get scrollContainer() {
|
|
586
|
+
return this.ScrollContainer;
|
|
587
|
+
}
|
|
588
|
+
/** @deprecated Use {@link ScrollContainer}. */
|
|
589
|
+
set scrollContainer(value) {
|
|
590
|
+
this.ScrollContainer = value;
|
|
591
|
+
}
|
|
280
592
|
/** Only present while `HasMoreAbove` is true — the `@if` creates and destroys it. */
|
|
281
|
-
|
|
593
|
+
OlderSentinel;
|
|
594
|
+
/** @deprecated Use {@link OlderSentinel}. */
|
|
595
|
+
get olderSentinel() {
|
|
596
|
+
return this.OlderSentinel;
|
|
597
|
+
}
|
|
598
|
+
/** @deprecated Use {@link OlderSentinel}. */
|
|
599
|
+
set olderSentinel(value) {
|
|
600
|
+
this.OlderSentinel = value;
|
|
601
|
+
}
|
|
282
602
|
/** Template rendered in place of an unmounted timeline item. */
|
|
283
603
|
spacerTemplate;
|
|
284
604
|
/**
|
|
@@ -354,16 +674,44 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
354
674
|
* since both grow `messages.length`.
|
|
355
675
|
*/
|
|
356
676
|
_previousFirstKey = null;
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
677
|
+
CurrentDateDisplay = 'Today';
|
|
678
|
+
/** @deprecated Use {@link CurrentDateDisplay}. */
|
|
679
|
+
get currentDateDisplay() {
|
|
680
|
+
return this.CurrentDateDisplay;
|
|
681
|
+
}
|
|
682
|
+
/** @deprecated Use {@link CurrentDateDisplay}. */
|
|
683
|
+
set currentDateDisplay(value) {
|
|
684
|
+
this.CurrentDateDisplay = value;
|
|
685
|
+
}
|
|
686
|
+
ShowDateNav = false;
|
|
687
|
+
/** @deprecated Use {@link ShowDateNav}. */
|
|
688
|
+
get showDateNav() {
|
|
689
|
+
return this.ShowDateNav;
|
|
690
|
+
}
|
|
691
|
+
/** @deprecated Use {@link ShowDateNav}. */
|
|
692
|
+
set showDateNav(value) {
|
|
693
|
+
this.ShowDateNav = value;
|
|
694
|
+
}
|
|
695
|
+
ShouldShowDateFilter = false;
|
|
696
|
+
/** @deprecated Use {@link ShouldShowDateFilter}. */
|
|
697
|
+
get shouldShowDateFilter() {
|
|
698
|
+
return this.ShouldShowDateFilter;
|
|
699
|
+
}
|
|
700
|
+
/** @deprecated Use {@link ShouldShowDateFilter}. */
|
|
701
|
+
set shouldShowDateFilter(value) {
|
|
702
|
+
this.ShouldShowDateFilter = value;
|
|
703
|
+
}
|
|
360
704
|
constructor(cdRef, hostRef) {
|
|
361
705
|
super();
|
|
362
706
|
this.cdRef = cdRef;
|
|
363
707
|
this.hostRef = hostRef;
|
|
364
708
|
}
|
|
709
|
+
ToggleDateNav() {
|
|
710
|
+
this.ShowDateNav = !this.ShowDateNav;
|
|
711
|
+
}
|
|
712
|
+
/** @deprecated Use {@link ToggleDateNav}. */
|
|
365
713
|
toggleDateNav() {
|
|
366
|
-
|
|
714
|
+
return this.ToggleDateNav();
|
|
367
715
|
}
|
|
368
716
|
/**
|
|
369
717
|
* Handles a date-navigator selection.
|
|
@@ -373,14 +721,18 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
373
721
|
* {@link ScrollToDateTarget}. The label updates immediately so the dropdown feels responsive
|
|
374
722
|
* while paging runs.
|
|
375
723
|
*/
|
|
376
|
-
|
|
377
|
-
this.
|
|
724
|
+
JumpToDate(period) {
|
|
725
|
+
this.ShowDateNav = false;
|
|
378
726
|
if (!isDateJumpPeriod(period)) {
|
|
379
727
|
return;
|
|
380
728
|
}
|
|
381
|
-
this.
|
|
729
|
+
this.CurrentDateDisplay = DATE_JUMP_LABELS[period];
|
|
382
730
|
this.DateJumpRequested.emit(period);
|
|
383
731
|
}
|
|
732
|
+
/** @deprecated Use {@link JumpToDate}. */
|
|
733
|
+
jumpToDate(period) {
|
|
734
|
+
return this.JumpToDate(period);
|
|
735
|
+
}
|
|
384
736
|
/**
|
|
385
737
|
* Scrolls to the start of `period` within the currently loaded messages.
|
|
386
738
|
*
|
|
@@ -484,7 +836,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
484
836
|
}
|
|
485
837
|
ngAfterViewInit() {
|
|
486
838
|
// ViewContainerRef is now available - perform initial render if we have messages
|
|
487
|
-
if (this.messages && this.messages.length > 0 && this.
|
|
839
|
+
if (this.messages && this.messages.length > 0 && this.MessageContainerRef && !this._initialRenderComplete) {
|
|
488
840
|
this._initialRenderComplete = true;
|
|
489
841
|
this.updateMessages(this.messages);
|
|
490
842
|
this.updateDateFilterVisibility();
|
|
@@ -494,7 +846,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
494
846
|
// React to messages array changes
|
|
495
847
|
// Note: On initial load, messageContainerRef may not be available yet (ngOnChanges runs before ngAfterViewInit)
|
|
496
848
|
// In that case, ngAfterViewInit will handle the initial render
|
|
497
|
-
if (changes['messages'] && this.messages && this.
|
|
849
|
+
if (changes['messages'] && this.messages && this.MessageContainerRef) {
|
|
498
850
|
this._initialRenderComplete = true;
|
|
499
851
|
// Capture the pre-render height so a prepend can be corrected for. Must happen
|
|
500
852
|
// BEFORE updateMessages — afterwards the new rows are already in the layout — and
|
|
@@ -507,18 +859,18 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
507
859
|
// While artifacts are pre-loaded during initial peripheral data load,
|
|
508
860
|
// new artifacts can be created mid-conversation (e.g., by agent runs)
|
|
509
861
|
// This ensures artifact cards appear in messages immediately without requiring a refresh
|
|
510
|
-
if (changes['artifactMap'] && this.messages && this.
|
|
862
|
+
if (changes['artifactMap'] && this.messages && this.MessageContainerRef) {
|
|
511
863
|
this.updateMessages(this.messages);
|
|
512
864
|
}
|
|
513
865
|
// Watch for attachmentsMap changes to handle newly created attachments
|
|
514
866
|
// This ensures media attachments (e.g., images generated by agents) appear
|
|
515
867
|
// immediately without requiring a page refresh
|
|
516
|
-
if (changes['attachmentsMap'] && this.messages && this.
|
|
868
|
+
if (changes['attachmentsMap'] && this.messages && this.MessageContainerRef) {
|
|
517
869
|
this.updateMessages(this.messages);
|
|
518
870
|
}
|
|
519
871
|
// Watch for session-meta changes so realtime session blocks pick up their
|
|
520
872
|
// agent name / status chip once the (async, batched) session lookup lands
|
|
521
|
-
if (changes['sessionMetaMap'] && this.messages && this.
|
|
873
|
+
if (changes['sessionMetaMap'] && this.messages && this.MessageContainerRef) {
|
|
522
874
|
this.updateMessages(this.messages);
|
|
523
875
|
}
|
|
524
876
|
}
|
|
@@ -611,7 +963,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
611
963
|
}
|
|
612
964
|
this._warnedNoScrollParent = true;
|
|
613
965
|
const chain = [];
|
|
614
|
-
let el = this.findSentinelElement() ?? this.
|
|
966
|
+
let el = this.findSentinelElement() ?? this.ScrollContainer?.nativeElement ?? null;
|
|
615
967
|
while (el && chain.length < 20) {
|
|
616
968
|
const style = getComputedStyle(el);
|
|
617
969
|
chain.push({
|
|
@@ -626,7 +978,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
626
978
|
+ 'older pages cannot auto-load. The host must give the transcript a scrollable container '
|
|
627
979
|
+ '(overflow-y: auto AND a bounded height, e.g. min-height: 0 on a flex child). '
|
|
628
980
|
+ 'Walked from '
|
|
629
|
-
+ (this.
|
|
981
|
+
+ (this.OlderSentinel ? 'the sentinel' : this.ScrollContainer ? 'the list container' : 'NOTHING — both view children are undefined')
|
|
630
982
|
+ ':', chain);
|
|
631
983
|
}
|
|
632
984
|
/**
|
|
@@ -654,7 +1006,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
654
1006
|
// guaranteed present exactly when the walk matters. `@ViewChild('scrollContainer')`
|
|
655
1007
|
// resolves on Angular's own schedule and can still be undefined here, which would end
|
|
656
1008
|
// the walk before it began.
|
|
657
|
-
let el = this.findSentinelElement() ?? this.
|
|
1009
|
+
let el = this.findSentinelElement() ?? this.ScrollContainer?.nativeElement ?? null;
|
|
658
1010
|
while (el) {
|
|
659
1011
|
const overflowY = getComputedStyle(el).overflowY;
|
|
660
1012
|
if ((overflowY === 'auto' || overflowY === 'scroll') && el.scrollHeight > el.clientHeight) {
|
|
@@ -778,19 +1130,23 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
778
1130
|
}
|
|
779
1131
|
});
|
|
780
1132
|
this._renderedMessages.clear();
|
|
781
|
-
if (this.
|
|
782
|
-
this.
|
|
1133
|
+
if (this.MessageContainerRef) {
|
|
1134
|
+
this.MessageContainerRef.clear();
|
|
783
1135
|
}
|
|
784
1136
|
}
|
|
785
1137
|
/**
|
|
786
1138
|
* Called when messages array changes
|
|
787
1139
|
* Efficiently updates the DOM without re-rendering everything
|
|
788
1140
|
*/
|
|
789
|
-
set
|
|
790
|
-
if (messages && this.
|
|
1141
|
+
set MessagesUpdate(messages) {
|
|
1142
|
+
if (messages && this.MessageContainerRef) {
|
|
791
1143
|
this.updateMessages(messages);
|
|
792
1144
|
}
|
|
793
1145
|
}
|
|
1146
|
+
/** @deprecated Use {@link MessagesUpdate}. */
|
|
1147
|
+
set messagesUpdate(value) {
|
|
1148
|
+
this.MessagesUpdate = value;
|
|
1149
|
+
}
|
|
794
1150
|
/**
|
|
795
1151
|
* Updates the message list using dynamic component creation
|
|
796
1152
|
* Only adds/removes changed messages for optimal performance
|
|
@@ -1016,7 +1372,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1016
1372
|
existing.ref.destroy();
|
|
1017
1373
|
this._renderedMessages.delete(key);
|
|
1018
1374
|
}
|
|
1019
|
-
const viewRef = this.
|
|
1375
|
+
const viewRef = this.MessageContainerRef.createEmbeddedView(this.spacerTemplate, { height: this.heightFor(key, item) }, { index: timelineIndex });
|
|
1020
1376
|
this._renderedMessages.set(key, { kind: 'spacer', ref: viewRef });
|
|
1021
1377
|
}
|
|
1022
1378
|
/**
|
|
@@ -1141,7 +1497,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1141
1497
|
*/
|
|
1142
1498
|
renderSessionBlock(group, timelineIndex) {
|
|
1143
1499
|
const key = this.getSessionKey(group.SessionID);
|
|
1144
|
-
const meta = this.
|
|
1500
|
+
const meta = this.SessionMetaMap.get(NormalizeUUID(group.SessionID)) ?? null;
|
|
1145
1501
|
const existing = this._renderedMessages.get(key);
|
|
1146
1502
|
if (existing && existing.kind === 'realtime-session') {
|
|
1147
1503
|
// Update existing card in place.
|
|
@@ -1156,11 +1512,13 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1156
1512
|
existing.ref.destroy();
|
|
1157
1513
|
this._renderedMessages.delete(key);
|
|
1158
1514
|
}
|
|
1159
|
-
const componentRef = this.
|
|
1515
|
+
const componentRef = this.MessageContainerRef.createComponent(RealtimeSessionTimelineCardComponent, { index: timelineIndex });
|
|
1160
1516
|
componentRef.instance.Group = group;
|
|
1161
1517
|
componentRef.instance.Meta = meta;
|
|
1162
|
-
|
|
1163
|
-
|
|
1518
|
+
// The card says "You" on the viewer's own call and names the caller on anyone else's, which is
|
|
1519
|
+
// why it takes the viewer's id rather than their name.
|
|
1520
|
+
componentRef.instance.CurrentUserID = this.CurrentUser?.ID ?? null;
|
|
1521
|
+
componentRef.instance.OpenRequested.subscribe((sessionId) => this.RealtimeSessionOpenRequested.emit(sessionId));
|
|
1164
1522
|
this._renderedMessages.set(key, { kind: 'realtime-session', ref: componentRef });
|
|
1165
1523
|
}
|
|
1166
1524
|
/**
|
|
@@ -1177,7 +1535,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1177
1535
|
// boolean (last index when `isLastMessage` is true, else 0 — any non-last
|
|
1178
1536
|
// index works since it just affects that one comparison).
|
|
1179
1537
|
const index = isLastMessage ? messages.length - 1 : 0;
|
|
1180
|
-
const useCustomRenderer = this.
|
|
1538
|
+
const useCustomRenderer = this.MessageRendererTemplate !== null;
|
|
1181
1539
|
const existing = this._renderedMessages.get(key);
|
|
1182
1540
|
if (existing && existing.kind === 'embedded' && useCustomRenderer) {
|
|
1183
1541
|
// Update existing embedded view from messageRenderer slot
|
|
@@ -1209,14 +1567,14 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1209
1567
|
const previousMessage = instance.message;
|
|
1210
1568
|
instance.message = message;
|
|
1211
1569
|
instance.allMessages = messages;
|
|
1212
|
-
instance.isProcessing = this.
|
|
1213
|
-
instance.userAvatarMap = this.
|
|
1570
|
+
instance.isProcessing = this.IsProcessing;
|
|
1571
|
+
instance.userAvatarMap = this.UserAvatarMap;
|
|
1214
1572
|
instance.isLastMessage = (index === messages.length - 1);
|
|
1215
|
-
instance.messageExtraTemplate = this.
|
|
1573
|
+
instance.messageExtraTemplate = this.MessageExtraTemplate;
|
|
1216
1574
|
this.applyMessageItemFeatureFlags(instance);
|
|
1217
|
-
instance.agentRun = this.
|
|
1218
|
-
instance.ratings = this.
|
|
1219
|
-
instance.attachments = this.
|
|
1575
|
+
instance.agentRun = this.AgentRunMap.get(message.ID) || null;
|
|
1576
|
+
instance.ratings = this.RatingsMap.get(message.ID);
|
|
1577
|
+
instance.attachments = this.AttachmentsMap.get(message.ID) || [];
|
|
1220
1578
|
// After the inputs above, for the same reason as the create path: this can force a
|
|
1221
1579
|
// synchronous child pass, which would otherwise paint the previous refresh's agent run,
|
|
1222
1580
|
// ratings and attachments.
|
|
@@ -1233,14 +1591,14 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1233
1591
|
* paths so a mid-session rebind stays consistent.
|
|
1234
1592
|
*/
|
|
1235
1593
|
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.assistantDisplayName = this.
|
|
1243
|
-
instance.assistantAvatarUrl = this.
|
|
1594
|
+
instance.showAgentRunDetails = this.ShowAgentRunDetails;
|
|
1595
|
+
instance.showReactions = this.ShowReactions;
|
|
1596
|
+
instance.showMessageRating = this.ShowMessageRating;
|
|
1597
|
+
instance.allowPinning = this.AllowPinning;
|
|
1598
|
+
instance.allowMessageEdit = this.AllowMessageEdit;
|
|
1599
|
+
instance.allowMessageDelete = this.AllowMessageDelete;
|
|
1600
|
+
instance.assistantDisplayName = this.AssistantDisplayName;
|
|
1601
|
+
instance.assistantAvatarUrl = this.AssistantAvatarUrl;
|
|
1244
1602
|
}
|
|
1245
1603
|
/**
|
|
1246
1604
|
* Creates a new rendered entry — either a `MessageItemComponent` (default path)
|
|
@@ -1249,43 +1607,43 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1249
1607
|
* message entity.
|
|
1250
1608
|
*/
|
|
1251
1609
|
createRenderedEntry(message, messages, index, key, useCustomRenderer, timelineIndex) {
|
|
1252
|
-
if (useCustomRenderer && this.
|
|
1610
|
+
if (useCustomRenderer && this.MessageRendererTemplate) {
|
|
1253
1611
|
// The slot directive carries TemplateRef<unknown>; assert the contract here
|
|
1254
1612
|
// (consumers' `let-message` bindings consume the message context shape below).
|
|
1255
|
-
const template = this.
|
|
1256
|
-
const viewRef = this.
|
|
1613
|
+
const template = this.MessageRendererTemplate;
|
|
1614
|
+
const viewRef = this.MessageContainerRef.createEmbeddedView(template, { $implicit: message, message }, { index: timelineIndex });
|
|
1257
1615
|
this._renderedMessages.set(key, { kind: 'embedded', ref: viewRef });
|
|
1258
1616
|
// Stamp back-ref for parity with the component path.
|
|
1259
1617
|
message._viewRef = viewRef;
|
|
1260
1618
|
return;
|
|
1261
1619
|
}
|
|
1262
|
-
const componentRef = this.
|
|
1620
|
+
const componentRef = this.MessageContainerRef.createComponent(MessageItemComponent, { index: timelineIndex });
|
|
1263
1621
|
const instance = componentRef.instance;
|
|
1264
1622
|
instance.message = message;
|
|
1265
|
-
instance.conversation = this.
|
|
1266
|
-
instance.currentUser = this.
|
|
1623
|
+
instance.conversation = this.Conversation;
|
|
1624
|
+
instance.currentUser = this.CurrentUser;
|
|
1267
1625
|
instance.allMessages = messages;
|
|
1268
|
-
instance.isProcessing = this.
|
|
1269
|
-
instance.userAvatarMap = this.
|
|
1626
|
+
instance.isProcessing = this.IsProcessing;
|
|
1627
|
+
instance.userAvatarMap = this.UserAvatarMap;
|
|
1270
1628
|
instance.isLastMessage = (index === messages.length - 1);
|
|
1271
|
-
instance.messageExtraTemplate = this.
|
|
1629
|
+
instance.messageExtraTemplate = this.MessageExtraTemplate;
|
|
1272
1630
|
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.messagePinToggled.subscribe((msg) => this.
|
|
1287
|
-
instance.beforeResponseFormSubmitted.subscribe((e) => this.
|
|
1288
|
-
instance.afterResponseFormSubmitted.subscribe((e) => this.
|
|
1631
|
+
instance.agentRun = this.AgentRunMap.get(message.ID) || null;
|
|
1632
|
+
instance.ratings = this.RatingsMap.get(message.ID);
|
|
1633
|
+
instance.attachments = this.AttachmentsMap.get(message.ID) || [];
|
|
1634
|
+
instance.editClicked.subscribe((msg) => this.EditMessage.emit(msg));
|
|
1635
|
+
instance.deleteClicked.subscribe((msg) => this.DeleteMessage.emit(msg));
|
|
1636
|
+
instance.retryClicked.subscribe((msg) => this.RetryMessage.emit(msg));
|
|
1637
|
+
instance.testFeedbackClicked.subscribe((msg) => this.TestFeedbackMessage.emit(msg));
|
|
1638
|
+
instance.artifactClicked.subscribe((data) => this.ArtifactClicked.emit(data));
|
|
1639
|
+
instance.messageEdited.subscribe((msg) => this.MessageEdited.emit(msg));
|
|
1640
|
+
instance.openEntityRecord.subscribe((data) => this.OpenEntityRecord.emit(data));
|
|
1641
|
+
instance.suggestedResponseSelected.subscribe((data) => this.SuggestedResponseSelected.emit(data));
|
|
1642
|
+
instance.attachmentClicked.subscribe((attachment) => this.AttachmentClicked.emit(attachment));
|
|
1643
|
+
instance.diagnosticRequested.subscribe((messageId) => this.DiagnosticRequested.emit(messageId));
|
|
1644
|
+
instance.messagePinToggled.subscribe((msg) => this.MessagePinToggled.emit(msg));
|
|
1645
|
+
instance.beforeResponseFormSubmitted.subscribe((e) => this.BeforeResponseFormSubmitted.emit(e));
|
|
1646
|
+
instance.afterResponseFormSubmitted.subscribe((e) => this.AfterResponseFormSubmitted.emit(e));
|
|
1289
1647
|
if (instance.artifactActionPerformed) {
|
|
1290
1648
|
instance.artifactActionPerformed.subscribe((data) => {
|
|
1291
1649
|
// Parent can handle artifact actions (save, fork, history, share)
|
|
@@ -1399,11 +1757,11 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1399
1757
|
* while genuinely distinct artifacts are all retained.
|
|
1400
1758
|
*/
|
|
1401
1759
|
resolveDistinctArtifacts(messageId) {
|
|
1402
|
-
const list = this.
|
|
1760
|
+
const list = this.ArtifactMap.get(messageId);
|
|
1403
1761
|
if (!list || list.length === 0) {
|
|
1404
1762
|
return [];
|
|
1405
1763
|
}
|
|
1406
|
-
return
|
|
1764
|
+
return SelectDistinctLatestArtifacts(list);
|
|
1407
1765
|
}
|
|
1408
1766
|
/**
|
|
1409
1767
|
* Generates a unique key for a message
|
|
@@ -1425,11 +1783,11 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1425
1783
|
// the one case where it is most useful. `HasMoreAbove` is the only windowing-safe signal
|
|
1426
1784
|
// that more conversation exists above, so it short-circuits the heuristic.
|
|
1427
1785
|
if (this.HasMoreAbove) {
|
|
1428
|
-
this.
|
|
1786
|
+
this.ShouldShowDateFilter = true;
|
|
1429
1787
|
return;
|
|
1430
1788
|
}
|
|
1431
1789
|
if (!this.messages || this.messages.length < 20) {
|
|
1432
|
-
this.
|
|
1790
|
+
this.ShouldShowDateFilter = false;
|
|
1433
1791
|
return;
|
|
1434
1792
|
}
|
|
1435
1793
|
// Check if messages span more than 2 days
|
|
@@ -1438,21 +1796,21 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1438
1796
|
.filter(d => d != null)
|
|
1439
1797
|
.map(d => new Date(d).setHours(0, 0, 0, 0));
|
|
1440
1798
|
if (dates.length === 0) {
|
|
1441
|
-
this.
|
|
1799
|
+
this.ShouldShowDateFilter = false;
|
|
1442
1800
|
return;
|
|
1443
1801
|
}
|
|
1444
1802
|
const uniqueDates = new Set(dates);
|
|
1445
1803
|
const daySpan = uniqueDates.size;
|
|
1446
1804
|
// Show filter if conversation has 20+ messages and spans 3+ days
|
|
1447
|
-
this.
|
|
1805
|
+
this.ShouldShowDateFilter = daySpan >= 3;
|
|
1448
1806
|
}
|
|
1449
1807
|
/**
|
|
1450
1808
|
* Scrolls the message list to the bottom
|
|
1451
1809
|
*/
|
|
1452
1810
|
scrollToBottom() {
|
|
1453
|
-
if (this.
|
|
1811
|
+
if (this.ScrollContainer && this.ScrollContainer.nativeElement) {
|
|
1454
1812
|
Promise.resolve().then(() => {
|
|
1455
|
-
const element = this.
|
|
1813
|
+
const element = this.ScrollContainer.nativeElement;
|
|
1456
1814
|
element.scrollTop = element.scrollHeight;
|
|
1457
1815
|
});
|
|
1458
1816
|
}
|
|
@@ -1461,7 +1819,7 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1461
1819
|
* Removes a message from the rendered list
|
|
1462
1820
|
* Called externally when a message is deleted
|
|
1463
1821
|
*/
|
|
1464
|
-
|
|
1822
|
+
RemoveMessage(message) {
|
|
1465
1823
|
const key = this.getMessageKey(message);
|
|
1466
1824
|
const entry = this._renderedMessages.get(key);
|
|
1467
1825
|
if (entry) {
|
|
@@ -1469,18 +1827,22 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1469
1827
|
this._renderedMessages.delete(key);
|
|
1470
1828
|
}
|
|
1471
1829
|
}
|
|
1830
|
+
/** @deprecated Use {@link RemoveMessage}. */
|
|
1831
|
+
removeMessage(message) {
|
|
1832
|
+
return this.RemoveMessage(message);
|
|
1833
|
+
}
|
|
1472
1834
|
static ɵfac = function MessageListComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MessageListComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.ElementRef)); };
|
|
1473
1835
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MessageListComponent, selectors: [["mj-conversation-message-list"]], viewQuery: function MessageListComponent_Query(rf, ctx) { if (rf & 1) {
|
|
1474
1836
|
i0.ɵɵviewQuery(_c0, 5, ViewContainerRef)(_c1, 5)(_c2, 5)(_c3, 5);
|
|
1475
1837
|
} if (rf & 2) {
|
|
1476
1838
|
let _t;
|
|
1477
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1478
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1479
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.
|
|
1839
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.MessageContainerRef = _t.first);
|
|
1840
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ScrollContainer = _t.first);
|
|
1841
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.OlderSentinel = _t.first);
|
|
1480
1842
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.spacerTemplate = _t.first);
|
|
1481
1843
|
} }, hostVars: 2, hostBindings: function MessageListComponent_HostBindings(rf, ctx) { if (rf & 2) {
|
|
1482
1844
|
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) {
|
|
1845
|
+
} }, 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", 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", 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
1846
|
i0.ɵɵelementStart(0, "div", 4, 0);
|
|
1485
1847
|
i0.ɵɵconditionalCreate(2, MessageListComponent_Conditional_2_Template, 17, 3, "div", 5);
|
|
1486
1848
|
i0.ɵɵconditionalCreate(3, MessageListComponent_Conditional_3_Template, 4, 1, "div", 6);
|
|
@@ -1502,26 +1864,48 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1502
1864
|
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
1865
|
}], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], { messages: [{
|
|
1504
1866
|
type: Input
|
|
1867
|
+
}], Conversation: [{
|
|
1868
|
+
type: Input
|
|
1505
1869
|
}], conversation: [{
|
|
1506
1870
|
type: Input
|
|
1871
|
+
}], CurrentUser: [{
|
|
1872
|
+
type: Input
|
|
1507
1873
|
}], currentUser: [{
|
|
1508
1874
|
type: Input
|
|
1875
|
+
}], IsProcessing: [{
|
|
1876
|
+
type: Input
|
|
1509
1877
|
}], isProcessing: [{
|
|
1510
1878
|
type: Input
|
|
1879
|
+
}], ShowEmptyFill: [{
|
|
1880
|
+
type: Input
|
|
1511
1881
|
}], showEmptyFill: [{
|
|
1512
1882
|
type: Input
|
|
1883
|
+
}], ShowDateNavigation: [{
|
|
1884
|
+
type: Input
|
|
1513
1885
|
}], showDateNavigation: [{
|
|
1514
1886
|
type: Input
|
|
1887
|
+
}], ShowAgentRunDetails: [{
|
|
1888
|
+
type: Input
|
|
1515
1889
|
}], showAgentRunDetails: [{
|
|
1516
1890
|
type: Input
|
|
1891
|
+
}], ShowReactions: [{
|
|
1892
|
+
type: Input
|
|
1517
1893
|
}], showReactions: [{
|
|
1518
1894
|
type: Input
|
|
1895
|
+
}], ShowMessageRating: [{
|
|
1896
|
+
type: Input
|
|
1519
1897
|
}], showMessageRating: [{
|
|
1520
1898
|
type: Input
|
|
1899
|
+
}], AllowPinning: [{
|
|
1900
|
+
type: Input
|
|
1521
1901
|
}], allowPinning: [{
|
|
1522
1902
|
type: Input
|
|
1903
|
+
}], AllowMessageEdit: [{
|
|
1904
|
+
type: Input
|
|
1523
1905
|
}], allowMessageEdit: [{
|
|
1524
1906
|
type: Input
|
|
1907
|
+
}], AllowMessageDelete: [{
|
|
1908
|
+
type: Input
|
|
1525
1909
|
}], allowMessageDelete: [{
|
|
1526
1910
|
type: Input
|
|
1527
1911
|
}], HasMoreAbove: [{
|
|
@@ -1533,74 +1917,128 @@ export class MessageListComponent extends BaseAngularComponent {
|
|
|
1533
1917
|
}], HostSuppliesScroller: [{
|
|
1534
1918
|
type: HostBinding,
|
|
1535
1919
|
args: ['class.mj-list-host-scrolled']
|
|
1920
|
+
}], AssistantDisplayName: [{
|
|
1921
|
+
type: Input
|
|
1536
1922
|
}], assistantDisplayName: [{
|
|
1537
1923
|
type: Input
|
|
1924
|
+
}], AssistantAvatarUrl: [{
|
|
1925
|
+
type: Input
|
|
1538
1926
|
}], assistantAvatarUrl: [{
|
|
1539
1927
|
type: Input
|
|
1928
|
+
}], ArtifactMap: [{
|
|
1929
|
+
type: Input
|
|
1540
1930
|
}], artifactMap: [{
|
|
1541
1931
|
type: Input
|
|
1932
|
+
}], AgentRunMap: [{
|
|
1933
|
+
type: Input
|
|
1542
1934
|
}], agentRunMap: [{
|
|
1543
1935
|
type: Input
|
|
1936
|
+
}], RatingsMap: [{
|
|
1937
|
+
type: Input
|
|
1544
1938
|
}], ratingsMap: [{
|
|
1545
1939
|
type: Input
|
|
1940
|
+
}], UserAvatarMap: [{
|
|
1941
|
+
type: Input
|
|
1546
1942
|
}], userAvatarMap: [{
|
|
1547
1943
|
type: Input
|
|
1944
|
+
}], AttachmentsMap: [{
|
|
1945
|
+
type: Input
|
|
1548
1946
|
}], attachmentsMap: [{
|
|
1549
1947
|
type: Input
|
|
1948
|
+
}], SessionMetaMap: [{
|
|
1949
|
+
type: Input
|
|
1550
1950
|
}], sessionMetaMap: [{
|
|
1551
1951
|
type: Input
|
|
1952
|
+
}], MessageRendererTemplate: [{
|
|
1953
|
+
type: Input
|
|
1552
1954
|
}], messageRendererTemplate: [{
|
|
1553
1955
|
type: Input
|
|
1956
|
+
}], MessageExtraTemplate: [{
|
|
1957
|
+
type: Input
|
|
1554
1958
|
}], messageExtraTemplate: [{
|
|
1555
1959
|
type: Input
|
|
1960
|
+
}], EditMessage: [{
|
|
1961
|
+
type: Output
|
|
1556
1962
|
}], editMessage: [{
|
|
1557
1963
|
type: Output
|
|
1964
|
+
}], DeleteMessage: [{
|
|
1965
|
+
type: Output
|
|
1558
1966
|
}], deleteMessage: [{
|
|
1559
1967
|
type: Output
|
|
1968
|
+
}], RetryMessage: [{
|
|
1969
|
+
type: Output
|
|
1560
1970
|
}], retryMessage: [{
|
|
1561
1971
|
type: Output
|
|
1972
|
+
}], TestFeedbackMessage: [{
|
|
1973
|
+
type: Output
|
|
1562
1974
|
}], testFeedbackMessage: [{
|
|
1563
1975
|
type: Output
|
|
1976
|
+
}], ArtifactClicked: [{
|
|
1977
|
+
type: Output
|
|
1564
1978
|
}], artifactClicked: [{
|
|
1565
1979
|
type: Output
|
|
1980
|
+
}], ReplyInThread: [{
|
|
1981
|
+
type: Output
|
|
1566
1982
|
}], replyInThread: [{
|
|
1567
1983
|
type: Output
|
|
1984
|
+
}], ViewThread: [{
|
|
1985
|
+
type: Output
|
|
1568
1986
|
}], viewThread: [{
|
|
1569
1987
|
type: Output
|
|
1988
|
+
}], MessageEdited: [{
|
|
1989
|
+
type: Output
|
|
1570
1990
|
}], messageEdited: [{
|
|
1571
1991
|
type: Output
|
|
1992
|
+
}], OpenEntityRecord: [{
|
|
1993
|
+
type: Output
|
|
1572
1994
|
}], openEntityRecord: [{
|
|
1573
1995
|
type: Output
|
|
1996
|
+
}], SuggestedResponseSelected: [{
|
|
1997
|
+
type: Output
|
|
1574
1998
|
}], suggestedResponseSelected: [{
|
|
1575
1999
|
type: Output
|
|
2000
|
+
}], AttachmentClicked: [{
|
|
2001
|
+
type: Output
|
|
1576
2002
|
}], attachmentClicked: [{
|
|
1577
2003
|
type: Output
|
|
2004
|
+
}], DiagnosticRequested: [{
|
|
2005
|
+
type: Output
|
|
1578
2006
|
}], diagnosticRequested: [{
|
|
1579
2007
|
type: Output
|
|
2008
|
+
}], MessagePinToggled: [{
|
|
2009
|
+
type: Output
|
|
1580
2010
|
}], messagePinToggled: [{
|
|
1581
2011
|
type: Output
|
|
2012
|
+
}], RealtimeSessionOpenRequested: [{
|
|
2013
|
+
type: Output
|
|
1582
2014
|
}], realtimeSessionOpenRequested: [{
|
|
1583
2015
|
type: Output
|
|
2016
|
+
}], BeforeResponseFormSubmitted: [{
|
|
2017
|
+
type: Output
|
|
1584
2018
|
}], beforeResponseFormSubmitted: [{
|
|
1585
2019
|
type: Output
|
|
2020
|
+
}], AfterResponseFormSubmitted: [{
|
|
2021
|
+
type: Output
|
|
1586
2022
|
}], afterResponseFormSubmitted: [{
|
|
1587
2023
|
type: Output
|
|
1588
2024
|
}], OlderRequested: [{
|
|
1589
2025
|
type: Output
|
|
1590
2026
|
}], DateJumpRequested: [{
|
|
1591
2027
|
type: Output
|
|
1592
|
-
}],
|
|
2028
|
+
}], MessageContainerRef: [{
|
|
1593
2029
|
type: ViewChild,
|
|
1594
2030
|
args: ['messageContainer', { read: ViewContainerRef }]
|
|
1595
|
-
}],
|
|
2031
|
+
}], ScrollContainer: [{
|
|
1596
2032
|
type: ViewChild,
|
|
1597
2033
|
args: ['scrollContainer']
|
|
1598
|
-
}],
|
|
2034
|
+
}], OlderSentinel: [{
|
|
1599
2035
|
type: ViewChild,
|
|
1600
2036
|
args: ['olderSentinel']
|
|
1601
2037
|
}], spacerTemplate: [{
|
|
1602
2038
|
type: ViewChild,
|
|
1603
2039
|
args: ['spacerTemplate']
|
|
2040
|
+
}], MessagesUpdate: [{
|
|
2041
|
+
type: Input
|
|
1604
2042
|
}], messagesUpdate: [{
|
|
1605
2043
|
type: Input
|
|
1606
2044
|
}] }); })();
|