@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -2
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
- package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
- package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
- package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
- package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
- package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.js +181 -47
- package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
- package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +220 -70
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +154 -40
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +951 -367
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
- package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
- package/dist/lib/components/composer/ai-composer.component.js +388 -44
- package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
- package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1191 -124
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +2816 -785
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +42 -4
- package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/pinned-messages-panel.component.js +93 -21
- package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
- package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
- package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
- package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
- package/dist/lib/components/export/export-modal.component.d.ts +84 -10
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +173 -49
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +119 -35
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts +76 -10
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +164 -50
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.d.ts +49 -5
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +140 -26
- package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +613 -74
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +1390 -422
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +490 -29
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +1088 -244
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +297 -29
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +598 -123
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
- package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.js +13 -3
- package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
- package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.js +36 -8
- package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +348 -87
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts +78 -8
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +177 -46
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
- package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
- package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
- package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +136 -92
- package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +2 -2
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
- package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +1 -1
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
- package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
- package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
- package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
- package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +3 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
- package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
- package/dist/lib/components/search/search-panel.component.d.ts +133 -22
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +312 -83
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts +69 -9
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +139 -31
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
- package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +110 -30
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
- package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/routines-section.component.js +25 -5
- package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
- package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
- package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +223 -75
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
- package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.js +100 -16
- package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.js +146 -36
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
- package/dist/lib/components/toast/toast.component.d.ts +11 -1
- package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
- package/dist/lib/components/toast/toast.component.js +25 -5
- package/dist/lib/components/toast/toast.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +891 -292
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
- package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
- package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
- package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
- package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
- package/dist/lib/directives/chat-slot.directive.js.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.js +14 -4
- package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
- package/dist/lib/events/chat-events.d.ts +34 -7
- package/dist/lib/events/chat-events.d.ts.map +1 -1
- package/dist/lib/events/chat-events.js +37 -7
- package/dist/lib/events/chat-events.js.map +1 -1
- package/dist/lib/models/agent-turn.model.d.ts +113 -0
- package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
- package/dist/lib/models/agent-turn.model.js +12 -0
- package/dist/lib/models/agent-turn.model.js.map +1 -0
- package/dist/lib/models/collection-view.model.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +8 -0
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
- package/dist/lib/models/conversation-state.model.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
- package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +98 -34
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +30 -4
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +71 -19
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts +17 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +48 -16
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts +39 -0
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +152 -17
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +58 -5
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +135 -35
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/collection-permission.service.d.ts +28 -0
- package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
- package/dist/lib/services/collection-permission.service.js +88 -32
- package/dist/lib/services/collection-permission.service.js.map +1 -1
- package/dist/lib/services/collection-state.service.d.ts +11 -1
- package/dist/lib/services/collection-state.service.d.ts.map +1 -1
- package/dist/lib/services/collection-state.service.js +25 -5
- package/dist/lib/services/collection-state.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +47 -4
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +85 -20
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +17 -0
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +38 -10
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/conversation-liveness-dom.service.d.ts +42 -0
- package/dist/lib/services/conversation-liveness-dom.service.d.ts.map +1 -0
- package/dist/lib/services/conversation-liveness-dom.service.js +74 -0
- package/dist/lib/services/conversation-liveness-dom.service.js.map +1 -0
- package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
- package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-streaming.service.js +50 -10
- package/dist/lib/services/conversation-streaming.service.js.map +1 -1
- package/dist/lib/services/data-cache.service.d.ts +31 -0
- package/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +71 -15
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/dialog.service.d.ts +13 -0
- package/dist/lib/services/dialog.service.d.ts.map +1 -1
- package/dist/lib/services/dialog.service.js +25 -5
- package/dist/lib/services/dialog.service.js.map +1 -1
- package/dist/lib/services/export.service.d.ts +2 -0
- package/dist/lib/services/export.service.d.ts.map +1 -1
- package/dist/lib/services/export.service.js +5 -1
- package/dist/lib/services/export.service.js.map +1 -1
- package/dist/lib/services/mention-parser.service.d.ts +10 -0
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
- package/dist/lib/services/mention-parser.service.js +25 -5
- package/dist/lib/services/mention-parser.service.js.map +1 -1
- package/dist/lib/services/notification.service.d.ts +54 -6
- package/dist/lib/services/notification.service.d.ts.map +1 -1
- package/dist/lib/services/notification.service.js +123 -27
- package/dist/lib/services/notification.service.js.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
- package/dist/lib/services/realtime-audio-recorder.js +12 -12
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
- package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
- package/dist/lib/services/realtime-pcm-wav.js +10 -2
- package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
- package/dist/lib/services/search.service.d.ts +42 -9
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +103 -23
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/lib/services/toast.service.d.ts +19 -1
- package/dist/lib/services/toast.service.d.ts.map +1 -1
- package/dist/lib/services/toast.service.js +45 -9
- package/dist/lib/services/toast.service.js.map +1 -1
- package/dist/lib/services/ui-command-handler.service.d.ts +56 -5
- package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
- package/dist/lib/services/ui-command-handler.service.js +113 -16
- package/dist/lib/services/ui-command-handler.service.js.map +1 -1
- package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
- package/dist/lib/utils/agent-artifact-summary.js +3 -3
- package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
- package/dist/lib/utils/agent-turn-routing.d.ts +70 -0
- package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
- package/dist/lib/utils/agent-turn-routing.js +84 -0
- package/dist/lib/utils/agent-turn-routing.js.map +1 -0
- package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
- package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
- package/dist/lib/utils/artifact-panel-action.js +10 -2
- package/dist/lib/utils/artifact-panel-action.js.map +1 -1
- package/dist/lib/utils/decision-routing.d.ts +68 -0
- package/dist/lib/utils/decision-routing.d.ts.map +1 -0
- package/dist/lib/utils/decision-routing.js +101 -0
- package/dist/lib/utils/decision-routing.js.map +1 -0
- package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
- package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
- package/dist/lib/utils/distinct-artifacts.js +5 -1
- package/dist/lib/utils/distinct-artifacts.js.map +1 -1
- package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
- package/dist/lib/utils/plan-mode-preference.js +6 -6
- package/dist/lib/utils/plan-mode-preference.js.map +1 -1
- package/dist/public-api.d.ts +5 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +8 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +32 -32
|
@@ -1,43 +1,67 @@
|
|
|
1
1
|
import { EventEmitter } from '@angular/core';
|
|
2
|
-
import { RealtimeSessionTimelineGroup, RealtimeSessionTimelineMeta } from '
|
|
2
|
+
import { type RealtimeSessionStatusChip, type RealtimeSessionTimelineGroup, type RealtimeSessionTimelineMeta } from '@memberjunction/conversations-runtime';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
/**
|
|
5
|
-
* The ONE timeline element a realtime session collapses to in the standard conversation
|
|
6
|
-
* message list (see `BuildConversationTimeline`)
|
|
7
|
-
* session's chronological position carrying the session identity (broadcast icon +
|
|
8
|
-
* "Realtime session · <agent>"), its time range, a status / close-reason chip when
|
|
9
|
-
* known, the visible-turn count, and a one-line preview of the last turn.
|
|
5
|
+
* The ONE timeline element a realtime (voice) session collapses to in the standard conversation
|
|
6
|
+
* message list (see `BuildConversationTimeline`).
|
|
10
7
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* It is laid out like a chat message rather than a banner. The call icon sits in the avatar column,
|
|
9
|
+
* "Voice call with Sage" and the start time fill the header line, and a bubble carries the status,
|
|
10
|
+
* how long the call ran, how much was said and the last thing said. That keeps the conversation's
|
|
11
|
+
* margins and rhythm, where the old full-width card cut across them.
|
|
15
12
|
*
|
|
16
|
-
*
|
|
17
|
-
* message
|
|
13
|
+
* **Review call** (or clicking the bubble) emits {@link OpenRequested} with the session id. The
|
|
14
|
+
* message list bubbles it up so the chat area can host the existing SESSION REVIEW overlay via
|
|
15
|
+
* `ConversationChatAreaComponent.OpenRealtimeSessionReview` (Resume / Close live inside that
|
|
16
|
+
* overlay, unchanged).
|
|
17
|
+
*
|
|
18
|
+
* Rendered DYNAMICALLY by `MessageListComponent` (same `createComponent` path the message items
|
|
19
|
+
* use) — standalone by design, no module declaration needed.
|
|
18
20
|
*/
|
|
19
21
|
export declare class RealtimeSessionTimelineCardComponent {
|
|
20
22
|
/** The collapsed session block computed from the conversation's stamped detail rows. */
|
|
21
23
|
Group: RealtimeSessionTimelineGroup;
|
|
22
|
-
/** Optional session-row enrichment (agent
|
|
24
|
+
/** Optional session-row enrichment (agent, user, status, start and close); null degrades gracefully. */
|
|
23
25
|
Meta: RealtimeSessionTimelineMeta | null;
|
|
24
|
-
/**
|
|
26
|
+
/**
|
|
27
|
+
* The signed-in user's id. With it, the quoted line says "You" on the viewer's own call and names
|
|
28
|
+
* the caller on anyone else's, which matters in a conversation several people share.
|
|
29
|
+
*/
|
|
30
|
+
CurrentUserID: string | null;
|
|
31
|
+
/**
|
|
32
|
+
* Label for a user's line when the host passes no `CurrentUserID`, and so the card can't tell
|
|
33
|
+
* whose call it was. With `CurrentUserID` set it isn't used: the line says "You", the caller's
|
|
34
|
+
* name, or "Caller" when the session row doesn't say whose call it was.
|
|
35
|
+
*/
|
|
25
36
|
UserName: string;
|
|
26
37
|
/** Emitted with the `MJ: AI Agent Sessions.ID` when the user asks to open the session review. */
|
|
27
38
|
OpenRequested: EventEmitter<string>;
|
|
28
|
-
/**
|
|
39
|
+
/** "Voice call with <agent>" when the agent name is known, else "Voice call". */
|
|
29
40
|
get Title(): string;
|
|
30
|
-
/**
|
|
31
|
-
get
|
|
32
|
-
/** The status
|
|
41
|
+
/** When the call started, shown in the header the way a message shows its time. */
|
|
42
|
+
get StartedAt(): Date | null;
|
|
43
|
+
/** The status label ("Live", "Ended", "Timed out", …), or null to hide the status entirely. */
|
|
33
44
|
get StatusChip(): string | null;
|
|
34
|
-
/**
|
|
45
|
+
/** What the status means, for styling; null when there is no status to show. */
|
|
46
|
+
get StatusTone(): RealtimeSessionStatusChip['Tone'] | null;
|
|
47
|
+
/** Whether the call ended in an error (drives the error styling). */
|
|
35
48
|
get IsErrorChip(): boolean;
|
|
36
|
-
/** Whether the
|
|
49
|
+
/** Whether the call is still live (drives the live styling). */
|
|
37
50
|
get IsLiveChip(): boolean;
|
|
38
|
-
/**
|
|
39
|
-
|
|
51
|
+
/** How long the call ran ("Under a minute", "12 min"), or null while live or unmeasurable. */
|
|
52
|
+
get DurationLabel(): string | null;
|
|
53
|
+
/** "No messages", "1 message", "12 messages". */
|
|
54
|
+
get MessageCountLabel(): string;
|
|
55
|
+
/** Who said the quoted line: the agent by name, "You", or another caller by name. */
|
|
56
|
+
get SpeakerLabel(): string;
|
|
57
|
+
/** The button's label. A live call is still going, so it is viewed rather than reviewed. */
|
|
58
|
+
get ActionLabel(): string;
|
|
59
|
+
/** One sentence a screen reader announces for the whole row. */
|
|
60
|
+
get AccessibleSummary(): string;
|
|
61
|
+
/** Emits {@link OpenRequested} for a click on the bubble or its button. */
|
|
62
|
+
Open(event?: Event): void;
|
|
63
|
+
private get status();
|
|
40
64
|
static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeSessionTimelineCardComponent, never>;
|
|
41
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeSessionTimelineCardComponent, "mj-realtime-session-timeline-card", never, { "Group": { "alias": "Group"; "required": true; }; "Meta": { "alias": "Meta"; "required": false; }; "UserName": { "alias": "UserName"; "required": false; }; }, { "OpenRequested": "OpenRequested"; }, never, never, true, never>;
|
|
65
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeSessionTimelineCardComponent, "mj-realtime-session-timeline-card", never, { "Group": { "alias": "Group"; "required": true; }; "Meta": { "alias": "Meta"; "required": false; }; "CurrentUserID": { "alias": "CurrentUserID"; "required": false; }; "UserName": { "alias": "UserName"; "required": false; }; }, { "OpenRequested": "OpenRequested"; }, never, never, true, never>;
|
|
42
66
|
}
|
|
43
67
|
//# sourceMappingURL=realtime-session-timeline-card.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-session-timeline-card.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-timeline-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEvE,OAAO,
|
|
1
|
+
{"version":3,"file":"realtime-session-timeline-card.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-timeline-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEvE,OAAO,EAOL,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EACjC,MAAM,uCAAuC,CAAC;;AAG/C;;;;;;;;;;;;;;;;GAgBG;AACH,qBAOa,oCAAoC;IAC/C,wFAAwF;IAC7D,KAAK,EAAG,4BAA4B,CAAC;IAEhE,wGAAwG;IAC/F,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAAQ;IAEzD;;;OAGG;IACM,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE7C;;;;OAIG;IACM,QAAQ,SAAS;IAE1B,iGAAiG;IACvF,aAAa,uBAA8B;IAQrD,iFAAiF;IACjF,IAAW,KAAK,IAAI,MAAM,CAEzB;IAED,mFAAmF;IACnF,IAAW,SAAS,IAAI,IAAI,GAAG,IAAI,CAElC;IAED,+FAA+F;IAC/F,IAAW,UAAU,IAAI,MAAM,GAAG,IAAI,CAErC;IAED,gFAAgF;IAChF,IAAW,UAAU,IAAI,yBAAyB,CAAC,MAAM,CAAC,GAAG,IAAI,CAEhE;IAED,qEAAqE;IACrE,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,gEAAgE;IAChE,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,8FAA8F;IAC9F,IAAW,aAAa,IAAI,MAAM,GAAG,IAAI,CAExC;IAED,iDAAiD;IACjD,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,qFAAqF;IACrF,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,4FAA4F;IAC5F,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,gEAAgE;IAChE,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,2EAA2E;IACpE,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAQhC,OAAO,KAAK,MAAM,GAEjB;yCA/FU,oCAAoC;2CAApC,oCAAoC;CAgGhD"}
|
|
@@ -1,105 +1,138 @@
|
|
|
1
1
|
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import { DatePipe } from '@angular/common';
|
|
3
|
-
import {
|
|
3
|
+
import { SessionCardDurationLabel, SessionCardMessageCountLabel, SessionCardSpeakerLabel, SessionCardStartedAt, SessionCardStatusChip, SessionCardTitle } from '@memberjunction/conversations-runtime';
|
|
4
|
+
import { MJButtonDirective } from '@memberjunction/ng-ui-components';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
6
|
function RealtimeSessionTimelineCardComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
6
|
-
i0.ɵɵ
|
|
7
|
-
i0.ɵɵtext(1);
|
|
8
|
-
i0.ɵɵdomElementEnd();
|
|
9
|
-
} if (rf & 2) {
|
|
10
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
11
|
-
i0.ɵɵclassProp("session-card__chip--error", ctx_r0.IsErrorChip)("session-card__chip--live", ctx_r0.IsLiveChip);
|
|
12
|
-
i0.ɵɵadvance();
|
|
13
|
-
i0.ɵɵtextInterpolate(ctx_r0.StatusChip);
|
|
14
|
-
} }
|
|
15
|
-
function RealtimeSessionTimelineCardComponent_Conditional_9_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
16
|
-
i0.ɵɵdomElement(0, "i", 15);
|
|
7
|
+
i0.ɵɵelementStart(0, "span", 6);
|
|
17
8
|
i0.ɵɵtext(1);
|
|
18
9
|
i0.ɵɵpipe(2, "date");
|
|
10
|
+
i0.ɵɵelementEnd();
|
|
19
11
|
} if (rf & 2) {
|
|
20
|
-
const ctx_r0 = i0.ɵɵnextContext(
|
|
12
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
21
13
|
i0.ɵɵadvance();
|
|
22
|
-
i0.ɵɵ
|
|
14
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(2, 1, ctx_r0.StartedAt, "short"));
|
|
23
15
|
} }
|
|
24
16
|
function RealtimeSessionTimelineCardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
25
|
-
i0.ɵɵ
|
|
26
|
-
i0.ɵɵtext(
|
|
27
|
-
i0.ɵɵ
|
|
28
|
-
i0.ɵɵ
|
|
29
|
-
i0.ɵɵ
|
|
30
|
-
i0.ɵɵ
|
|
31
|
-
i0.ɵɵtext(5, "\u00B7");
|
|
32
|
-
i0.ɵɵdomElementEnd();
|
|
17
|
+
i0.ɵɵelementStart(0, "p", 8)(1, "span", 16);
|
|
18
|
+
i0.ɵɵtext(2);
|
|
19
|
+
i0.ɵɵelementEnd();
|
|
20
|
+
i0.ɵɵelementStart(3, "span", 17);
|
|
21
|
+
i0.ɵɵtext(4);
|
|
22
|
+
i0.ɵɵelementEnd()();
|
|
33
23
|
} if (rf & 2) {
|
|
34
24
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
35
|
-
i0.ɵɵadvance();
|
|
36
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind2(2, 2, ctx_r0.Group.StartedAt, "MMM d, h:mm a"), " ");
|
|
37
25
|
i0.ɵɵadvance(2);
|
|
38
|
-
i0.ɵɵ
|
|
26
|
+
i0.ɵɵtextInterpolate(ctx_r0.SpeakerLabel);
|
|
27
|
+
i0.ɵɵadvance(2);
|
|
28
|
+
i0.ɵɵtextInterpolate(ctx_r0.Group.LastTurnPreview);
|
|
39
29
|
} }
|
|
40
30
|
function RealtimeSessionTimelineCardComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
-
i0.ɵɵ
|
|
31
|
+
i0.ɵɵelementStart(0, "span", 11);
|
|
32
|
+
i0.ɵɵelement(1, "span", 18);
|
|
42
33
|
i0.ɵɵtext(2);
|
|
43
|
-
i0.ɵɵ
|
|
44
|
-
i0.ɵɵtext(3);
|
|
45
|
-
i0.ɵɵdomElementEnd();
|
|
34
|
+
i0.ɵɵelementEnd();
|
|
46
35
|
} if (rf & 2) {
|
|
47
36
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
37
|
+
i0.ɵɵattribute("data-tone", ctx_r0.StatusTone);
|
|
48
38
|
i0.ɵɵadvance(2);
|
|
49
|
-
i0.ɵɵtextInterpolate1("", ctx_r0.
|
|
50
|
-
|
|
51
|
-
|
|
39
|
+
i0.ɵɵtextInterpolate1("", ctx_r0.StatusChip, " ");
|
|
40
|
+
} }
|
|
41
|
+
function RealtimeSessionTimelineCardComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
42
|
+
i0.ɵɵelementStart(0, "span", 12);
|
|
43
|
+
i0.ɵɵelement(1, "i", 19);
|
|
44
|
+
i0.ɵɵtext(2);
|
|
45
|
+
i0.ɵɵelementEnd();
|
|
46
|
+
} if (rf & 2) {
|
|
47
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
48
|
+
i0.ɵɵadvance(2);
|
|
49
|
+
i0.ɵɵtextInterpolate1("", ctx_r0.DurationLabel, " ");
|
|
52
50
|
} }
|
|
53
51
|
/**
|
|
54
|
-
* The ONE timeline element a realtime session collapses to in the standard conversation
|
|
55
|
-
* message list (see `BuildConversationTimeline`)
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
52
|
+
* The ONE timeline element a realtime (voice) session collapses to in the standard conversation
|
|
53
|
+
* message list (see `BuildConversationTimeline`).
|
|
54
|
+
*
|
|
55
|
+
* It is laid out like a chat message rather than a banner. The call icon sits in the avatar column,
|
|
56
|
+
* "Voice call with Sage" and the start time fill the header line, and a bubble carries the status,
|
|
57
|
+
* how long the call ran, how much was said and the last thing said. That keeps the conversation's
|
|
58
|
+
* margins and rhythm, where the old full-width card cut across them.
|
|
59
59
|
*
|
|
60
|
-
*
|
|
61
|
-
* message list bubbles it up so the chat area can host the existing SESSION REVIEW
|
|
62
|
-
*
|
|
63
|
-
*
|
|
60
|
+
* **Review call** (or clicking the bubble) emits {@link OpenRequested} with the session id. The
|
|
61
|
+
* message list bubbles it up so the chat area can host the existing SESSION REVIEW overlay via
|
|
62
|
+
* `ConversationChatAreaComponent.OpenRealtimeSessionReview` (Resume / Close live inside that
|
|
63
|
+
* overlay, unchanged).
|
|
64
64
|
*
|
|
65
|
-
* Rendered DYNAMICALLY by `MessageListComponent` (same `createComponent` path the
|
|
66
|
-
*
|
|
65
|
+
* Rendered DYNAMICALLY by `MessageListComponent` (same `createComponent` path the message items
|
|
66
|
+
* use) — standalone by design, no module declaration needed.
|
|
67
67
|
*/
|
|
68
68
|
export class RealtimeSessionTimelineCardComponent {
|
|
69
69
|
/** The collapsed session block computed from the conversation's stamped detail rows. */
|
|
70
70
|
Group;
|
|
71
|
-
/** Optional session-row enrichment (agent
|
|
71
|
+
/** Optional session-row enrichment (agent, user, status, start and close); null degrades gracefully. */
|
|
72
72
|
Meta = null;
|
|
73
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* The signed-in user's id. With it, the quoted line says "You" on the viewer's own call and names
|
|
75
|
+
* the caller on anyone else's, which matters in a conversation several people share.
|
|
76
|
+
*/
|
|
77
|
+
CurrentUserID = null;
|
|
78
|
+
/**
|
|
79
|
+
* Label for a user's line when the host passes no `CurrentUserID`, and so the card can't tell
|
|
80
|
+
* whose call it was. With `CurrentUserID` set it isn't used: the line says "You", the caller's
|
|
81
|
+
* name, or "Caller" when the session row doesn't say whose call it was.
|
|
82
|
+
*/
|
|
74
83
|
UserName = 'You';
|
|
75
84
|
/** Emitted with the `MJ: AI Agent Sessions.ID` when the user asks to open the session review. */
|
|
76
85
|
OpenRequested = new EventEmitter();
|
|
77
86
|
/*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
87
|
+
* Every label below comes from `@memberjunction/conversations-runtime`, because the React Native
|
|
88
|
+
* thread renders the same card and must not re-decide what "Timed out" or "12 min" means. These
|
|
89
|
+
* getters are the Angular binding surface over those helpers, nothing more.
|
|
81
90
|
*/
|
|
82
|
-
/**
|
|
91
|
+
/** "Voice call with <agent>" when the agent name is known, else "Voice call". */
|
|
83
92
|
get Title() {
|
|
84
93
|
return SessionCardTitle(this.Meta);
|
|
85
94
|
}
|
|
86
|
-
/**
|
|
87
|
-
get
|
|
88
|
-
return
|
|
95
|
+
/** When the call started, shown in the header the way a message shows its time. */
|
|
96
|
+
get StartedAt() {
|
|
97
|
+
return SessionCardStartedAt(this.Group, this.Meta);
|
|
89
98
|
}
|
|
90
|
-
/** The status
|
|
99
|
+
/** The status label ("Live", "Ended", "Timed out", …), or null to hide the status entirely. */
|
|
91
100
|
get StatusChip() {
|
|
92
|
-
return
|
|
101
|
+
return this.status?.Label ?? null;
|
|
93
102
|
}
|
|
94
|
-
/**
|
|
103
|
+
/** What the status means, for styling; null when there is no status to show. */
|
|
104
|
+
get StatusTone() {
|
|
105
|
+
return this.status?.Tone ?? null;
|
|
106
|
+
}
|
|
107
|
+
/** Whether the call ended in an error (drives the error styling). */
|
|
95
108
|
get IsErrorChip() {
|
|
96
|
-
return
|
|
109
|
+
return this.StatusTone === 'error';
|
|
97
110
|
}
|
|
98
|
-
/** Whether the
|
|
111
|
+
/** Whether the call is still live (drives the live styling). */
|
|
99
112
|
get IsLiveChip() {
|
|
100
|
-
return
|
|
113
|
+
return this.StatusTone === 'live';
|
|
114
|
+
}
|
|
115
|
+
/** How long the call ran ("Under a minute", "12 min"), or null while live or unmeasurable. */
|
|
116
|
+
get DurationLabel() {
|
|
117
|
+
return SessionCardDurationLabel(this.Group, this.Meta);
|
|
118
|
+
}
|
|
119
|
+
/** "No messages", "1 message", "12 messages". */
|
|
120
|
+
get MessageCountLabel() {
|
|
121
|
+
return SessionCardMessageCountLabel(this.Group);
|
|
122
|
+
}
|
|
123
|
+
/** Who said the quoted line: the agent by name, "You", or another caller by name. */
|
|
124
|
+
get SpeakerLabel() {
|
|
125
|
+
return SessionCardSpeakerLabel(this.Group?.LastTurnRole ?? null, this.Meta, this.CurrentUserID, this.UserName);
|
|
101
126
|
}
|
|
102
|
-
/**
|
|
127
|
+
/** The button's label. A live call is still going, so it is viewed rather than reviewed. */
|
|
128
|
+
get ActionLabel() {
|
|
129
|
+
return this.IsLiveChip ? 'View call' : 'Review call';
|
|
130
|
+
}
|
|
131
|
+
/** One sentence a screen reader announces for the whole row. */
|
|
132
|
+
get AccessibleSummary() {
|
|
133
|
+
return [this.Title, this.StatusChip, this.DurationLabel, this.MessageCountLabel].filter(Boolean).join(', ');
|
|
134
|
+
}
|
|
135
|
+
/** Emits {@link OpenRequested} for a click on the bubble or its button. */
|
|
103
136
|
Open(event) {
|
|
104
137
|
event?.stopPropagation();
|
|
105
138
|
const sessionId = this.Group?.SessionID;
|
|
@@ -107,57 +140,68 @@ export class RealtimeSessionTimelineCardComponent {
|
|
|
107
140
|
this.OpenRequested.emit(sessionId);
|
|
108
141
|
}
|
|
109
142
|
}
|
|
143
|
+
get status() {
|
|
144
|
+
return SessionCardStatusChip(this.Meta);
|
|
145
|
+
}
|
|
110
146
|
static ɵfac = function RealtimeSessionTimelineCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RealtimeSessionTimelineCardComponent)(); };
|
|
111
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeSessionTimelineCardComponent, selectors: [["mj-realtime-session-timeline-card"]], inputs: { Group: "Group", Meta: "Meta", UserName: "UserName" }, outputs: { OpenRequested: "OpenRequested" }, decls:
|
|
112
|
-
i0.ɵɵ
|
|
113
|
-
i0.ɵɵ
|
|
114
|
-
i0.ɵɵ
|
|
115
|
-
i0.ɵɵ
|
|
116
|
-
i0.ɵɵdomElementEnd();
|
|
117
|
-
i0.ɵɵdomElementStart(3, "div", 3)(4, "div", 4)(5, "span", 5);
|
|
147
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeSessionTimelineCardComponent, selectors: [["mj-realtime-session-timeline-card"]], inputs: { Group: "Group", Meta: "Meta", CurrentUserID: "CurrentUserID", UserName: "UserName" }, outputs: { OpenRequested: "OpenRequested" }, decls: 19, vars: 16, consts: [["role", "group", 1, "call"], ["aria-hidden", "true", 1, "call__icon"], [1, "fa-solid"], [1, "call__content"], [1, "call__header"], [1, "call__title"], [1, "call__time"], [1, "call__bubble", 3, "click"], [1, "call__quote"], [1, "call__footer"], [1, "call__facts"], [1, "call__status"], [1, "call__fact", "call__duration"], [1, "call__fact", "call__count"], ["aria-hidden", "true", 1, "fa-regular", "fa-comment"], ["type", "button", "mjButton", "", "variant", "secondary", "size", "sm", 1, "call__open", 3, "click"], [1, "call__speaker"], [1, "call__quote-text"], ["aria-hidden", "true", 1, "call__status-dot"], ["aria-hidden", "true", 1, "fa-regular", "fa-clock"]], template: function RealtimeSessionTimelineCardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
148
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
|
|
149
|
+
i0.ɵɵelement(2, "i", 2);
|
|
150
|
+
i0.ɵɵelementEnd();
|
|
151
|
+
i0.ɵɵelementStart(3, "div", 3)(4, "div", 4)(5, "span", 5);
|
|
118
152
|
i0.ɵɵtext(6);
|
|
119
|
-
i0.ɵɵ
|
|
120
|
-
i0.ɵɵconditionalCreate(7, RealtimeSessionTimelineCardComponent_Conditional_7_Template,
|
|
121
|
-
i0.ɵɵ
|
|
122
|
-
i0.ɵɵ
|
|
123
|
-
i0.ɵɵ
|
|
124
|
-
i0.ɵɵ
|
|
125
|
-
i0.ɵɵ
|
|
126
|
-
i0.ɵɵ
|
|
127
|
-
i0.ɵɵconditionalCreate(
|
|
128
|
-
i0.ɵɵ
|
|
129
|
-
i0.ɵɵ
|
|
130
|
-
i0.ɵɵ
|
|
131
|
-
i0.ɵɵ
|
|
132
|
-
i0.ɵɵ
|
|
133
|
-
i0.ɵɵ
|
|
134
|
-
i0.ɵɵ
|
|
153
|
+
i0.ɵɵelementEnd();
|
|
154
|
+
i0.ɵɵconditionalCreate(7, RealtimeSessionTimelineCardComponent_Conditional_7_Template, 3, 4, "span", 6);
|
|
155
|
+
i0.ɵɵelementEnd();
|
|
156
|
+
i0.ɵɵelementStart(8, "div", 7);
|
|
157
|
+
i0.ɵɵlistener("click", function RealtimeSessionTimelineCardComponent_Template_div_click_8_listener($event) { return ctx.Open($event); });
|
|
158
|
+
i0.ɵɵconditionalCreate(9, RealtimeSessionTimelineCardComponent_Conditional_9_Template, 5, 2, "p", 8);
|
|
159
|
+
i0.ɵɵelementStart(10, "div", 9)(11, "div", 10);
|
|
160
|
+
i0.ɵɵconditionalCreate(12, RealtimeSessionTimelineCardComponent_Conditional_12_Template, 3, 2, "span", 11);
|
|
161
|
+
i0.ɵɵconditionalCreate(13, RealtimeSessionTimelineCardComponent_Conditional_13_Template, 3, 1, "span", 12);
|
|
162
|
+
i0.ɵɵelementStart(14, "span", 13);
|
|
163
|
+
i0.ɵɵelement(15, "i", 14);
|
|
164
|
+
i0.ɵɵtext(16);
|
|
165
|
+
i0.ɵɵelementEnd()();
|
|
166
|
+
i0.ɵɵelementStart(17, "button", 15);
|
|
167
|
+
i0.ɵɵlistener("click", function RealtimeSessionTimelineCardComponent_Template_button_click_17_listener($event) { return ctx.Open($event); });
|
|
168
|
+
i0.ɵɵtext(18);
|
|
169
|
+
i0.ɵɵelementEnd()()()()();
|
|
135
170
|
} if (rf & 2) {
|
|
136
|
-
i0.ɵɵ
|
|
137
|
-
i0.ɵɵ
|
|
171
|
+
i0.ɵɵclassProp("call--live", ctx.IsLiveChip)("call--error", ctx.IsErrorChip);
|
|
172
|
+
i0.ɵɵattribute("aria-label", ctx.AccessibleSummary);
|
|
173
|
+
i0.ɵɵadvance(2);
|
|
174
|
+
i0.ɵɵclassProp("fa-phone", !ctx.IsErrorChip)("fa-phone-slash", ctx.IsErrorChip);
|
|
175
|
+
i0.ɵɵadvance(4);
|
|
138
176
|
i0.ɵɵtextInterpolate(ctx.Title);
|
|
139
177
|
i0.ɵɵadvance();
|
|
140
|
-
i0.ɵɵconditional(ctx.
|
|
178
|
+
i0.ɵɵconditional(ctx.StartedAt ? 7 : -1);
|
|
141
179
|
i0.ɵɵadvance(2);
|
|
142
|
-
i0.ɵɵconditional(ctx.Group.
|
|
143
|
-
i0.ɵɵadvance(
|
|
144
|
-
i0.ɵɵ
|
|
180
|
+
i0.ɵɵconditional(ctx.Group.LastTurnPreview ? 9 : -1);
|
|
181
|
+
i0.ɵɵadvance(3);
|
|
182
|
+
i0.ɵɵconditional(ctx.StatusChip ? 12 : -1);
|
|
145
183
|
i0.ɵɵadvance();
|
|
146
|
-
i0.ɵɵconditional(ctx.
|
|
147
|
-
|
|
184
|
+
i0.ɵɵconditional(ctx.DurationLabel ? 13 : -1);
|
|
185
|
+
i0.ɵɵadvance(3);
|
|
186
|
+
i0.ɵɵtextInterpolate1("", ctx.MessageCountLabel, " ");
|
|
187
|
+
i0.ɵɵadvance(2);
|
|
188
|
+
i0.ɵɵtextInterpolate1(" ", ctx.ActionLabel, " ");
|
|
189
|
+
} }, dependencies: [MJButtonDirective, DatePipe], styles: ["\n\n\n\n\n\n\n[_nghost-%COMP%] {\n display: block;\n}\n\n.call[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 12px 24px;\n}\n\n\n\n.call__icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: grid;\n place-items: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n font-size: 15px;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-brand-primary) 22%, transparent);\n}\n\n.call--live[_ngcontent-%COMP%] .call__icon[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n background: var(--mj-status-success);\n box-shadow: none;\n animation: _ngcontent-%COMP%_call-ring 2s ease-out infinite;\n}\n\n.call--error[_ngcontent-%COMP%] .call__icon[_ngcontent-%COMP%] {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n box-shadow: inset 0 0 0 1px var(--mj-status-error-border);\n}\n\n.call__content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n\n.call__header[_ngcontent-%COMP%] {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n margin-bottom: 6px;\n font-size: 13px;\n}\n\n.call__title[_ngcontent-%COMP%] {\n min-width: 0;\n overflow: hidden;\n font-weight: 600;\n color: var(--mj-text-primary);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.call__time[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n\n.call__bubble[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 10px;\n box-sizing: border-box;\n width: fit-content;\n min-width: min(340px, 100%);\n max-width: min(560px, 100%);\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px 12px 12px 12px;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: border-color var(--mj-transition-fast), box-shadow var(--mj-transition-fast);\n}\n\n.call__bubble[_ngcontent-%COMP%]:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, var(--mj-border-default));\n box-shadow: var(--mj-shadow-md);\n}\n\n\n.call__quote[_ngcontent-%COMP%] {\n display: -webkit-box;\n margin: 0;\n padding-left: 10px;\n overflow: hidden;\n border-left: 2px solid color-mix(in srgb, var(--mj-brand-primary) 35%, var(--mj-border-default));\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n overflow-wrap: anywhere;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n}\n\n.call__speaker[_ngcontent-%COMP%] {\n margin-right: 6px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.call__footer[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 8px 16px;\n}\n\n.call__facts[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.call__fact[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n}\n\n.call__fact[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n\n.call__status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 9px 2px 8px;\n border-radius: var(--mj-radius-full);\n font-size: 11.5px;\n font-weight: 600;\n line-height: 1.5;\n white-space: nowrap;\n color: var(--mj-text-secondary);\n \n background: color-mix(in srgb, var(--mj-text-primary) 7%, transparent);\n}\n\n.call__status-dot[_ngcontent-%COMP%] {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n opacity: 0.7;\n}\n\n.call__status[data-tone='live'][_ngcontent-%COMP%] {\n color: var(--mj-status-success-text);\n background: var(--mj-status-success-bg);\n}\n\n.call__status[data-tone='live'][_ngcontent-%COMP%] .call__status-dot[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n opacity: 1;\n animation: _ngcontent-%COMP%_call-pulse 1.6s ease-in-out infinite;\n}\n\n.call__status[data-tone='idle'][_ngcontent-%COMP%] {\n color: var(--mj-status-info-text);\n background: var(--mj-status-info-bg);\n}\n\n.call__status[data-tone='error'][_ngcontent-%COMP%] {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n}\n\n@keyframes _ngcontent-%COMP%_call-pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.35;\n }\n}\n\n@keyframes _ngcontent-%COMP%_call-ring {\n 0% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 55%, transparent);\n }\n 100% {\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-status-success) 0%, transparent);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .call--live[_ngcontent-%COMP%] .call__icon[_ngcontent-%COMP%], \n .call__status[data-tone='live'][_ngcontent-%COMP%] .call__status-dot[_ngcontent-%COMP%] {\n animation: none;\n }\n}\n\n\n@media (max-width: 768px) {\n .call[_ngcontent-%COMP%] {\n gap: 8px;\n padding: 10px 12px;\n }\n\n .call__icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .call__title[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .call__time[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n}\n\n@media (max-width: 480px) {\n .call[_ngcontent-%COMP%] {\n gap: 6px;\n padding: 8px;\n }\n\n .call__icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n font-size: 12px;\n }\n\n .call__title[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .call__time[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .call__bubble[_ngcontent-%COMP%] {\n min-width: 0;\n width: 100%;\n }\n}"] });
|
|
148
190
|
}
|
|
149
191
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeSessionTimelineCardComponent, [{
|
|
150
192
|
type: Component,
|
|
151
|
-
args: [{ standalone: true, selector: 'mj-realtime-session-timeline-card', imports: [DatePipe], template: "<div class=\"
|
|
193
|
+
args: [{ standalone: true, selector: 'mj-realtime-session-timeline-card', imports: [DatePipe, MJButtonDirective], template: "<!--\n One realtime (voice) session, collapsed to a single row of the conversation. It is laid out like a\n chat message: the call icon in the avatar column, a header line, then a bubble. That keeps the\n thread's margins and rhythm instead of stretching edge to edge across it.\n-->\n<div class=\"call\" role=\"group\" [attr.aria-label]=\"AccessibleSummary\"\n [class.call--live]=\"IsLiveChip\" [class.call--error]=\"IsErrorChip\">\n <div class=\"call__icon\" aria-hidden=\"true\">\n <i class=\"fa-solid\" [class.fa-phone]=\"!IsErrorChip\" [class.fa-phone-slash]=\"IsErrorChip\"></i>\n </div>\n\n <div class=\"call__content\">\n <div class=\"call__header\">\n <span class=\"call__title\">{{ Title }}</span>\n @if (StartedAt) {\n <span class=\"call__time\">{{ StartedAt | date: 'short' }}</span>\n }\n </div>\n\n <!-- The bubble opens the review on click as a convenience for the mouse; the button below is\n the keyboard and screen-reader path, so the bubble is deliberately not a second control. -->\n <div class=\"call__bubble\" (click)=\"Open($event)\">\n @if (Group.LastTurnPreview) {\n <p class=\"call__quote\">\n <span class=\"call__speaker\">{{ SpeakerLabel }}</span>\n <span class=\"call__quote-text\">{{ Group.LastTurnPreview }}</span>\n </p>\n }\n\n <div class=\"call__footer\">\n <div class=\"call__facts\">\n @if (StatusChip) {\n <span class=\"call__status\" [attr.data-tone]=\"StatusTone\">\n <span class=\"call__status-dot\" aria-hidden=\"true\"></span>{{ StatusChip }}\n </span>\n }\n @if (DurationLabel) {\n <span class=\"call__fact call__duration\">\n <i class=\"fa-regular fa-clock\" aria-hidden=\"true\"></i>{{ DurationLabel }}\n </span>\n }\n <span class=\"call__fact call__count\">\n <i class=\"fa-regular fa-comment\" aria-hidden=\"true\"></i>{{ MessageCountLabel }}\n </span>\n </div>\n\n <button type=\"button\" mjButton variant=\"secondary\" size=\"sm\" class=\"call__open\" (click)=\"Open($event)\">\n {{ ActionLabel }}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: ["/*\n * A realtime (voice) session, collapsed to one row of the conversation.\n *\n * The row mirrors `.message-item` in message-item.component.css: a flex row with a 36px tile in the\n * avatar column, the same gaps and side padding, and the same small-screen steps. That is what\n * lines the call up with the messages around it. Keep the two in step if that layout changes.\n */\n:host {\n display: block;\n}\n\n.call {\n display: flex;\n gap: 12px;\n padding: 12px 24px;\n}\n\n/* The avatar-column tile. It is tinted rather than solid, so it reads as something that happened\n in the thread and not as a message from the agent, whose avatar is the solid brand tile. */\n.call__icon {\n flex-shrink: 0;\n display: grid;\n place-items: center;\n width: 36px;\n height: 36px;\n border-radius: 8px;\n font-size: 15px;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mj-brand-primary) 22%, transparent);\n}\n\n.call--live .call__icon {\n color: var(--mj-text-inverse);\n background: var(--mj-status-success);\n box-shadow: none;\n animation: call-ring 2s ease-out infinite;\n}\n\n.call--error .call__icon {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n box-shadow: inset 0 0 0 1px var(--mj-status-error-border);\n}\n\n.call__content {\n flex: 1;\n min-width: 0;\n}\n\n/* Same type as a message header: a 13px semibold name, then a 12px muted time. */\n.call__header {\n display: flex;\n align-items: baseline;\n gap: 8px;\n min-width: 0;\n margin-bottom: 6px;\n font-size: 13px;\n}\n\n.call__title {\n min-width: 0;\n overflow: hidden;\n font-weight: 600;\n color: var(--mj-text-primary);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.call__time {\n flex-shrink: 0;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* The bubble sizes to its content between a comfortable minimum and a readable maximum. Its top-left\n corner is square, like an agent message's, because it hangs off the header. */\n.call__bubble {\n display: flex;\n flex-direction: column;\n gap: 10px;\n box-sizing: border-box;\n width: fit-content;\n min-width: min(340px, 100%);\n max-width: min(560px, 100%);\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px 12px 12px 12px;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-sm);\n cursor: pointer;\n transition: border-color var(--mj-transition-fast), box-shadow var(--mj-transition-fast);\n}\n\n.call__bubble:hover {\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, var(--mj-border-default));\n box-shadow: var(--mj-shadow-md);\n}\n\n/* The last thing said, clamped to two lines so a long answer cannot grow the row. */\n.call__quote {\n display: -webkit-box;\n margin: 0;\n padding-left: 10px;\n overflow: hidden;\n border-left: 2px solid color-mix(in srgb, var(--mj-brand-primary) 35%, var(--mj-border-default));\n font-size: 13px;\n line-height: 1.5;\n color: var(--mj-text-secondary);\n overflow-wrap: anywhere;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 2;\n line-clamp: 2;\n}\n\n.call__speaker {\n margin-right: 6px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.call__footer {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n gap: 8px 16px;\n}\n\n.call__facts {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px 14px;\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n.call__fact {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n white-space: nowrap;\n}\n\n.call__fact i {\n font-size: 11px;\n}\n\n/* The status pill. Its tone comes from the shared runtime as `data-tone`, never from the label. */\n.call__status {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 2px 9px 2px 8px;\n border-radius: var(--mj-radius-full);\n font-size: 11.5px;\n font-weight: 600;\n line-height: 1.5;\n white-space: nowrap;\n color: var(--mj-text-secondary);\n /* A wash of the text colour rather than the sunken surface, which is near-black in dark mode. */\n background: color-mix(in srgb, var(--mj-text-primary) 7%, transparent);\n}\n\n.call__status-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n opacity: 0.7;\n}\n\n.call__status[data-tone='live'] {\n color: var(--mj-status-success-text);\n background: var(--mj-status-success-bg);\n}\n\n.call__status[data-tone='live'] .call__status-dot {\n background: var(--mj-status-success);\n opacity: 1;\n animation: call-pulse 1.6s ease-in-out infinite;\n}\n\n.call__status[data-tone='idle'] {\n color: var(--mj-status-info-text);\n background: var(--mj-status-info-bg);\n}\n\n.call__status[data-tone='error'] {\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n}\n\n@keyframes call-pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.35;\n }\n}\n\n@keyframes call-ring {\n 0% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-success) 55%, transparent);\n }\n 100% {\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-status-success) 0%, transparent);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .call--live .call__icon,\n .call__status[data-tone='live'] .call__status-dot {\n animation: none;\n }\n}\n\n/* The same steps `.message-item` takes, so the tile stays in the avatar column on small screens. */\n@media (max-width: 768px) {\n .call {\n gap: 8px;\n padding: 10px 12px;\n }\n\n .call__icon {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .call__title {\n font-size: 12px;\n }\n\n .call__time {\n font-size: 11px;\n }\n}\n\n@media (max-width: 480px) {\n .call {\n gap: 6px;\n padding: 8px;\n }\n\n .call__icon {\n width: 28px;\n height: 28px;\n border-radius: 6px;\n font-size: 12px;\n }\n\n .call__title {\n font-size: 11px;\n }\n\n .call__time {\n font-size: 10px;\n }\n\n .call__bubble {\n min-width: 0;\n width: 100%;\n }\n}\n"] }]
|
|
152
194
|
}], null, { Group: [{
|
|
153
195
|
type: Input,
|
|
154
196
|
args: [{ required: true }]
|
|
155
197
|
}], Meta: [{
|
|
156
198
|
type: Input
|
|
199
|
+
}], CurrentUserID: [{
|
|
200
|
+
type: Input
|
|
157
201
|
}], UserName: [{
|
|
158
202
|
type: Input
|
|
159
203
|
}], OpenRequested: [{
|
|
160
204
|
type: Output
|
|
161
205
|
}] }); })();
|
|
162
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeSessionTimelineCardComponent, { className: "RealtimeSessionTimelineCardComponent", filePath: "src/lib/components/realtime/realtime-session-timeline-card.component.ts", lineNumber:
|
|
206
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeSessionTimelineCardComponent, { className: "RealtimeSessionTimelineCardComponent", filePath: "src/lib/components/realtime/realtime-session-timeline-card.component.ts", lineNumber: 40 }); })();
|
|
163
207
|
//# sourceMappingURL=realtime-session-timeline-card.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-session-timeline-card.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-timeline-card.component.ts","../../../../src/lib/components/realtime/realtime-session-timeline-card.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport {\n RealtimeSessionTimelineGroup,\n RealtimeSessionTimelineMeta,\n SessionCardIsSameDayRange,\n SessionCardStatusChip,\n SessionCardTitle\n} from '../../utils/realtime-session-timeline';\n\n/**\n * The ONE timeline element a realtime session collapses to in the standard conversation\n * message list (see `BuildConversationTimeline`): a visually distinct card at the\n * session's chronological position carrying the session identity (broadcast icon +\n * \"Realtime session · <agent>\"), its time range, a status / close-reason chip when\n * known, the visible-turn count, and a one-line preview of the last turn.\n *\n * The card's **Open** button emits {@link OpenRequested} with the session id; the\n * message list bubbles it up so the chat area can host the existing SESSION REVIEW\n * overlay via `ConversationChatAreaComponent.OpenRealtimeSessionReview` (Resume /\n * Close live inside that overlay, unchanged).\n *\n * Rendered DYNAMICALLY by `MessageListComponent` (same `createComponent` path the\n * message items use) — standalone by design, no module declaration needed.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-session-timeline-card',\n imports: [DatePipe],\n templateUrl: './realtime-session-timeline-card.component.html',\n styleUrl: './realtime-session-timeline-card.component.css'\n})\nexport class RealtimeSessionTimelineCardComponent {\n /** The collapsed session block computed from the conversation's stamped detail rows. */\n @Input({ required: true }) Group!: RealtimeSessionTimelineGroup;\n\n /** Optional session-row enrichment (agent name / status / close reason); null degrades gracefully. */\n @Input() Meta: RealtimeSessionTimelineMeta | null = null;\n\n /** Display name of the signed-in user for the last-turn preview (matches the chat's sender names). */\n @Input() UserName = 'You';\n\n /** Emitted with the `MJ: AI Agent Sessions.ID` when the user asks to open the session review. */\n @Output() OpenRequested = new EventEmitter<string>();\n\n /*\n * Title / chip / range derivations live in `@memberjunction/conversations-runtime` alongside the\n * grouping pass, because the React Native thread renders the same card and must not re-decide\n * what \"Timed out\" means. These getters are the Angular binding surface over them, nothing more.\n */\n\n /** Card title: \"Realtime session · <agent>\" when the agent name is known, else the generic label. */\n public get Title(): string {\n return SessionCardTitle(this.Meta);\n }\n\n /** Whether the start and end fall on the same calendar day (drives the end-time format). */\n public get SameDayRange(): boolean {\n return SessionCardIsSameDayRange(this.Group);\n }\n\n /** The status chip label, or null to hide the chip entirely. */\n public get StatusChip(): string | null {\n return SessionCardStatusChip(this.Meta)?.Label ?? null;\n }\n\n /** Whether the chip represents an error close (drives the error chip styling). */\n public get IsErrorChip(): boolean {\n return SessionCardStatusChip(this.Meta)?.Tone === 'error';\n }\n\n /** Whether the chip represents a live session (drives the live chip styling). */\n public get IsLiveChip(): boolean {\n return SessionCardStatusChip(this.Meta)?.Tone === 'live';\n }\n\n /** Emits {@link OpenRequested} for the whole-card / Open-button click. */\n public Open(event?: MouseEvent): void {\n event?.stopPropagation();\n const sessionId = this.Group?.SessionID;\n if (sessionId) {\n this.OpenRequested.emit(sessionId);\n }\n }\n\n}\n","<div class=\"session-card\" role=\"group\" [attr.aria-label]=\"Title\" (click)=\"Open($event)\">\n <div class=\"session-card__icon\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-tower-broadcast\"></i>\n </div>\n\n <div class=\"session-card__body\">\n <div class=\"session-card__head\">\n <span class=\"session-card__title\">{{ Title }}</span>\n @if (StatusChip) {\n <span class=\"session-card__chip\"\n [class.session-card__chip--error]=\"IsErrorChip\"\n [class.session-card__chip--live]=\"IsLiveChip\">{{ StatusChip }}</span>\n }\n </div>\n\n <div class=\"session-card__meta\">\n @if (Group.StartedAt) {\n <span class=\"session-card__range\">\n {{ Group.StartedAt | date:'MMM d, h:mm a' }}\n @if (Group.EndedAt && Group.EndedAt !== Group.StartedAt) {\n <i class=\"fa-solid fa-arrow-right-long session-card__range-arrow\" aria-hidden=\"true\"></i>\n {{ Group.EndedAt | date:(SameDayRange ? 'h:mm a' : 'MMM d, h:mm a') }}\n }\n </span>\n <span class=\"session-card__dot\" aria-hidden=\"true\">·</span>\n }\n <span class=\"session-card__turns\">{{ Group.TurnCount }} {{ Group.TurnCount === 1 ? 'turn' : 'turns' }}</span>\n </div>\n\n @if (Group.LastTurnPreview) {\n <div class=\"session-card__preview\">\n <span class=\"session-card__preview-role\">{{ Group.LastTurnRole === 'User' ? UserName : 'Agent' }}:</span>\n {{ Group.LastTurnPreview }}\n </div>\n }\n </div>\n\n <button type=\"button\" class=\"session-card__open\" (click)=\"Open($event)\"\n title=\"Open this realtime session in review mode\">\n <i class=\"fa-solid fa-up-right-from-square\" aria-hidden=\"true\"></i>\n <span>Open</span>\n </button>\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"realtime-session-timeline-card.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-timeline-card.component.ts","../../../../src/lib/components/realtime/realtime-session-timeline-card.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { DatePipe } from '@angular/common';\nimport {\n SessionCardDurationLabel,\n SessionCardMessageCountLabel,\n SessionCardSpeakerLabel,\n SessionCardStartedAt,\n SessionCardStatusChip,\n SessionCardTitle,\n type RealtimeSessionStatusChip,\n type RealtimeSessionTimelineGroup,\n type RealtimeSessionTimelineMeta\n} from '@memberjunction/conversations-runtime';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\n\n/**\n * The ONE timeline element a realtime (voice) session collapses to in the standard conversation\n * message list (see `BuildConversationTimeline`).\n *\n * It is laid out like a chat message rather than a banner. The call icon sits in the avatar column,\n * \"Voice call with Sage\" and the start time fill the header line, and a bubble carries the status,\n * how long the call ran, how much was said and the last thing said. That keeps the conversation's\n * margins and rhythm, where the old full-width card cut across them.\n *\n * **Review call** (or clicking the bubble) emits {@link OpenRequested} with the session id. The\n * message list bubbles it up so the chat area can host the existing SESSION REVIEW overlay via\n * `ConversationChatAreaComponent.OpenRealtimeSessionReview` (Resume / Close live inside that\n * overlay, unchanged).\n *\n * Rendered DYNAMICALLY by `MessageListComponent` (same `createComponent` path the message items\n * use) — standalone by design, no module declaration needed.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-session-timeline-card',\n imports: [DatePipe, MJButtonDirective],\n templateUrl: './realtime-session-timeline-card.component.html',\n styleUrl: './realtime-session-timeline-card.component.css'\n})\nexport class RealtimeSessionTimelineCardComponent {\n /** The collapsed session block computed from the conversation's stamped detail rows. */\n @Input({ required: true }) Group!: RealtimeSessionTimelineGroup;\n\n /** Optional session-row enrichment (agent, user, status, start and close); null degrades gracefully. */\n @Input() Meta: RealtimeSessionTimelineMeta | null = null;\n\n /**\n * The signed-in user's id. With it, the quoted line says \"You\" on the viewer's own call and names\n * the caller on anyone else's, which matters in a conversation several people share.\n */\n @Input() CurrentUserID: string | null = null;\n\n /**\n * Label for a user's line when the host passes no `CurrentUserID`, and so the card can't tell\n * whose call it was. With `CurrentUserID` set it isn't used: the line says \"You\", the caller's\n * name, or \"Caller\" when the session row doesn't say whose call it was.\n */\n @Input() UserName = 'You';\n\n /** Emitted with the `MJ: AI Agent Sessions.ID` when the user asks to open the session review. */\n @Output() OpenRequested = new EventEmitter<string>();\n\n /*\n * Every label below comes from `@memberjunction/conversations-runtime`, because the React Native\n * thread renders the same card and must not re-decide what \"Timed out\" or \"12 min\" means. These\n * getters are the Angular binding surface over those helpers, nothing more.\n */\n\n /** \"Voice call with <agent>\" when the agent name is known, else \"Voice call\". */\n public get Title(): string {\n return SessionCardTitle(this.Meta);\n }\n\n /** When the call started, shown in the header the way a message shows its time. */\n public get StartedAt(): Date | null {\n return SessionCardStartedAt(this.Group, this.Meta);\n }\n\n /** The status label (\"Live\", \"Ended\", \"Timed out\", …), or null to hide the status entirely. */\n public get StatusChip(): string | null {\n return this.status?.Label ?? null;\n }\n\n /** What the status means, for styling; null when there is no status to show. */\n public get StatusTone(): RealtimeSessionStatusChip['Tone'] | null {\n return this.status?.Tone ?? null;\n }\n\n /** Whether the call ended in an error (drives the error styling). */\n public get IsErrorChip(): boolean {\n return this.StatusTone === 'error';\n }\n\n /** Whether the call is still live (drives the live styling). */\n public get IsLiveChip(): boolean {\n return this.StatusTone === 'live';\n }\n\n /** How long the call ran (\"Under a minute\", \"12 min\"), or null while live or unmeasurable. */\n public get DurationLabel(): string | null {\n return SessionCardDurationLabel(this.Group, this.Meta);\n }\n\n /** \"No messages\", \"1 message\", \"12 messages\". */\n public get MessageCountLabel(): string {\n return SessionCardMessageCountLabel(this.Group);\n }\n\n /** Who said the quoted line: the agent by name, \"You\", or another caller by name. */\n public get SpeakerLabel(): string {\n return SessionCardSpeakerLabel(this.Group?.LastTurnRole ?? null, this.Meta, this.CurrentUserID, this.UserName);\n }\n\n /** The button's label. A live call is still going, so it is viewed rather than reviewed. */\n public get ActionLabel(): string {\n return this.IsLiveChip ? 'View call' : 'Review call';\n }\n\n /** One sentence a screen reader announces for the whole row. */\n public get AccessibleSummary(): string {\n return [this.Title, this.StatusChip, this.DurationLabel, this.MessageCountLabel].filter(Boolean).join(', ');\n }\n\n /** Emits {@link OpenRequested} for a click on the bubble or its button. */\n public Open(event?: Event): void {\n event?.stopPropagation();\n const sessionId = this.Group?.SessionID;\n if (sessionId) {\n this.OpenRequested.emit(sessionId);\n }\n }\n\n private get status(): RealtimeSessionStatusChip | null {\n return SessionCardStatusChip(this.Meta);\n }\n}\n","<!--\n One realtime (voice) session, collapsed to a single row of the conversation. It is laid out like a\n chat message: the call icon in the avatar column, a header line, then a bubble. That keeps the\n thread's margins and rhythm instead of stretching edge to edge across it.\n-->\n<div class=\"call\" role=\"group\" [attr.aria-label]=\"AccessibleSummary\"\n [class.call--live]=\"IsLiveChip\" [class.call--error]=\"IsErrorChip\">\n <div class=\"call__icon\" aria-hidden=\"true\">\n <i class=\"fa-solid\" [class.fa-phone]=\"!IsErrorChip\" [class.fa-phone-slash]=\"IsErrorChip\"></i>\n </div>\n\n <div class=\"call__content\">\n <div class=\"call__header\">\n <span class=\"call__title\">{{ Title }}</span>\n @if (StartedAt) {\n <span class=\"call__time\">{{ StartedAt | date: 'short' }}</span>\n }\n </div>\n\n <!-- The bubble opens the review on click as a convenience for the mouse; the button below is\n the keyboard and screen-reader path, so the bubble is deliberately not a second control. -->\n <div class=\"call__bubble\" (click)=\"Open($event)\">\n @if (Group.LastTurnPreview) {\n <p class=\"call__quote\">\n <span class=\"call__speaker\">{{ SpeakerLabel }}</span>\n <span class=\"call__quote-text\">{{ Group.LastTurnPreview }}</span>\n </p>\n }\n\n <div class=\"call__footer\">\n <div class=\"call__facts\">\n @if (StatusChip) {\n <span class=\"call__status\" [attr.data-tone]=\"StatusTone\">\n <span class=\"call__status-dot\" aria-hidden=\"true\"></span>{{ StatusChip }}\n </span>\n }\n @if (DurationLabel) {\n <span class=\"call__fact call__duration\">\n <i class=\"fa-regular fa-clock\" aria-hidden=\"true\"></i>{{ DurationLabel }}\n </span>\n }\n <span class=\"call__fact call__count\">\n <i class=\"fa-regular fa-comment\" aria-hidden=\"true\"></i>{{ MessageCountLabel }}\n </span>\n </div>\n\n <button type=\"button\" mjButton variant=\"secondary\" size=\"sm\" class=\"call__open\" (click)=\"Open($event)\">\n {{ ActionLabel }}\n </button>\n </div>\n </div>\n </div>\n</div>\n"]}
|
|
@@ -32,7 +32,7 @@ import * as i0 from "@angular/core";
|
|
|
32
32
|
*/
|
|
33
33
|
export declare class RealtimeSurfaceTabsComponent implements OnInit, OnDestroy {
|
|
34
34
|
/** How long a just-revealed channel tab keeps its flash highlight. */
|
|
35
|
-
private static readonly
|
|
35
|
+
private static readonly flashDurationMs;
|
|
36
36
|
/** Shared live-session state, owned by the overlay shell (feeds the Activity rail). */
|
|
37
37
|
State: RealtimeSessionState;
|
|
38
38
|
/** Whether developer affordances ("Open run" links) are revealed (gear-gated). */
|
|
@@ -153,7 +153,7 @@ export declare class RealtimeSurfaceTabsComponent implements OnInit, OnDestroy {
|
|
|
153
153
|
*/
|
|
154
154
|
DismissOnboarding(): void;
|
|
155
155
|
/** Reads the per-user seen-map and reports whether this channel's intro has been dismissed. */
|
|
156
|
-
private
|
|
156
|
+
private hasSeenOnboarding;
|
|
157
157
|
/** Persists `channelName` into the per-user seen-map (merge + debounced save). */
|
|
158
158
|
private markOnboardingSeen;
|
|
159
159
|
/** Reads + parses the per-user seen-map setting (tolerant: malformed / unset → empty map). */
|
|
@@ -185,7 +185,7 @@ const CHANNEL_ONBOARDING_SEEN_SETTING_KEY = 'mj.realtimeChannels.onboardingSeen.
|
|
|
185
185
|
*/
|
|
186
186
|
export class RealtimeSurfaceTabsComponent {
|
|
187
187
|
/** How long a just-revealed channel tab keeps its flash highlight. */
|
|
188
|
-
static
|
|
188
|
+
static flashDurationMs = 1400;
|
|
189
189
|
/** Shared live-session state, owned by the overlay shell (feeds the Activity rail). */
|
|
190
190
|
State;
|
|
191
191
|
/** Whether developer affordances ("Open run" links) are revealed (gear-gated). */
|
|
@@ -392,7 +392,7 @@ export class RealtimeSurfaceTabsComponent {
|
|
|
392
392
|
const tab = this.ActiveTab;
|
|
393
393
|
const plugin = tab.Kind === 'channel' ? tab.Data?.Plugin ?? null : null;
|
|
394
394
|
const details = plugin?.GetOnboardingDetails() ?? null;
|
|
395
|
-
if (!plugin || !details || this.
|
|
395
|
+
if (!plugin || !details || this.hasSeenOnboarding(plugin.ChannelName)) {
|
|
396
396
|
this.onboardingChannelName = null;
|
|
397
397
|
this.OnboardingContent = null;
|
|
398
398
|
return;
|
|
@@ -414,7 +414,7 @@ export class RealtimeSurfaceTabsComponent {
|
|
|
414
414
|
this.cdr.markForCheck();
|
|
415
415
|
}
|
|
416
416
|
/** Reads the per-user seen-map and reports whether this channel's intro has been dismissed. */
|
|
417
|
-
|
|
417
|
+
hasSeenOnboarding(channelName) {
|
|
418
418
|
return this.readOnboardingSeen()[channelName] === true;
|
|
419
419
|
}
|
|
420
420
|
/** Persists `channelName` into the per-user seen-map (merge + debounced save). */
|
|
@@ -464,7 +464,7 @@ export class RealtimeSurfaceTabsComponent {
|
|
|
464
464
|
this.flashTimer = setTimeout(() => {
|
|
465
465
|
this.flashTimer = null;
|
|
466
466
|
this.Model.ClearFlash();
|
|
467
|
-
}, RealtimeSurfaceTabsComponent.
|
|
467
|
+
}, RealtimeSurfaceTabsComponent.flashDurationMs);
|
|
468
468
|
}
|
|
469
469
|
static ɵfac = function RealtimeSurfaceTabsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RealtimeSurfaceTabsComponent)(); };
|
|
470
470
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeSurfaceTabsComponent, selectors: [["mj-realtime-surface-tabs"]], viewQuery: function RealtimeSurfaceTabsComponent_Query(rf, ctx) { if (rf & 1) {
|