@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
|
@@ -25,21 +25,33 @@ export class ActiveTasksService {
|
|
|
25
25
|
/**
|
|
26
26
|
* Observable of all active tasks as an array
|
|
27
27
|
*/
|
|
28
|
-
|
|
28
|
+
Tasks$ = this._tasks$.pipe(map(taskMap => Array.from(taskMap.values())));
|
|
29
|
+
/** @deprecated Use {@link Tasks$}. */
|
|
30
|
+
get tasks$() {
|
|
31
|
+
return this.Tasks$;
|
|
32
|
+
}
|
|
29
33
|
/**
|
|
30
34
|
* Observable of the count of active tasks
|
|
31
35
|
*/
|
|
32
|
-
|
|
36
|
+
TaskCount$ = this.Tasks$.pipe(map(tasks => tasks.length));
|
|
37
|
+
/** @deprecated Use {@link TaskCount$}. */
|
|
38
|
+
get taskCount$() {
|
|
39
|
+
return this.TaskCount$;
|
|
40
|
+
}
|
|
33
41
|
/**
|
|
34
42
|
* Observable of conversation IDs that have 1+ active tasks
|
|
35
43
|
* Use this for quick lookups in conversation lists
|
|
36
44
|
*/
|
|
37
|
-
|
|
45
|
+
ConversationIdsWithTasks$ = this._conversationIdsWithTasks$.asObservable();
|
|
46
|
+
/** @deprecated Use {@link ConversationIdsWithTasks$}. */
|
|
47
|
+
get conversationIdsWithTasks$() {
|
|
48
|
+
return this.ConversationIdsWithTasks$;
|
|
49
|
+
}
|
|
38
50
|
/**
|
|
39
51
|
* Observable of tasks grouped by conversation ID
|
|
40
52
|
* Returns Map<conversationId, ActiveTask[]>
|
|
41
53
|
*/
|
|
42
|
-
|
|
54
|
+
TasksByConversationId$ = this.Tasks$.pipe(map(tasks => {
|
|
43
55
|
const grouped = new Map();
|
|
44
56
|
for (const task of tasks) {
|
|
45
57
|
if (task.conversationId) {
|
|
@@ -50,12 +62,16 @@ export class ActiveTasksService {
|
|
|
50
62
|
}
|
|
51
63
|
return grouped;
|
|
52
64
|
}));
|
|
65
|
+
/** @deprecated Use {@link TasksByConversationId$}. */
|
|
66
|
+
get tasksByConversationId$() {
|
|
67
|
+
return this.TasksByConversationId$;
|
|
68
|
+
}
|
|
53
69
|
/**
|
|
54
70
|
* Add a new active task
|
|
55
71
|
* @param task Task details (without id and startTime)
|
|
56
72
|
* @returns The generated task ID
|
|
57
73
|
*/
|
|
58
|
-
|
|
74
|
+
Add(task) {
|
|
59
75
|
const id = `task-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
|
|
60
76
|
const fullTask = {
|
|
61
77
|
...task,
|
|
@@ -76,11 +92,15 @@ export class ActiveTasksService {
|
|
|
76
92
|
LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });
|
|
77
93
|
return id;
|
|
78
94
|
}
|
|
95
|
+
/** @deprecated Use {@link Add}. */
|
|
96
|
+
add(task) {
|
|
97
|
+
return this.Add(task);
|
|
98
|
+
}
|
|
79
99
|
/**
|
|
80
100
|
* Remove an active task
|
|
81
101
|
* @param id The task ID to remove
|
|
82
102
|
*/
|
|
83
|
-
|
|
103
|
+
Remove(id) {
|
|
84
104
|
const current = this._tasks$.value;
|
|
85
105
|
const task = current.get(id);
|
|
86
106
|
current.delete(id);
|
|
@@ -93,6 +113,10 @@ export class ActiveTasksService {
|
|
|
93
113
|
LogStatusEx({ message: `📊 Total tasks remaining:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });
|
|
94
114
|
LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });
|
|
95
115
|
}
|
|
116
|
+
/** @deprecated Use {@link Remove}. */
|
|
117
|
+
remove(id) {
|
|
118
|
+
return this.Remove(id);
|
|
119
|
+
}
|
|
96
120
|
/**
|
|
97
121
|
* Update the set of conversation IDs with active tasks
|
|
98
122
|
* @private
|
|
@@ -111,7 +135,7 @@ export class ActiveTasksService {
|
|
|
111
135
|
* @param id The task ID
|
|
112
136
|
* @param status The new status text
|
|
113
137
|
*/
|
|
114
|
-
|
|
138
|
+
UpdateStatus(id, status) {
|
|
115
139
|
const current = this._tasks$.value;
|
|
116
140
|
const task = current.get(id);
|
|
117
141
|
// Same-value updates are no-ops so high-frequency callers (e.g. the streamed
|
|
@@ -122,63 +146,87 @@ export class ActiveTasksService {
|
|
|
122
146
|
this._tasks$.next(new Map(current));
|
|
123
147
|
}
|
|
124
148
|
}
|
|
149
|
+
/** @deprecated Use {@link UpdateStatus}. */
|
|
150
|
+
updateStatus(id, status) {
|
|
151
|
+
return this.UpdateStatus(id, status);
|
|
152
|
+
}
|
|
125
153
|
/**
|
|
126
154
|
* Get an active task by its conversation detail ID
|
|
127
155
|
* @param conversationDetailId The conversation detail ID
|
|
128
156
|
* @returns The task if found, undefined otherwise
|
|
129
157
|
*/
|
|
130
|
-
|
|
158
|
+
GetByConversationDetailId(conversationDetailId) {
|
|
131
159
|
const tasks = Array.from(this._tasks$.value.values());
|
|
132
160
|
return tasks.find(task => task.conversationDetailId === conversationDetailId);
|
|
133
161
|
}
|
|
162
|
+
/** @deprecated Use {@link GetByConversationDetailId}. */
|
|
163
|
+
getByConversationDetailId(conversationDetailId) {
|
|
164
|
+
return this.GetByConversationDetailId(conversationDetailId);
|
|
165
|
+
}
|
|
134
166
|
/**
|
|
135
167
|
* Update the status of a task by its conversation detail ID
|
|
136
168
|
* @param conversationDetailId The conversation detail ID
|
|
137
169
|
* @param status The new status text
|
|
138
170
|
* @returns true if task was found and updated, false otherwise
|
|
139
171
|
*/
|
|
140
|
-
|
|
141
|
-
const task = this.
|
|
172
|
+
UpdateStatusByConversationDetailId(conversationDetailId, status) {
|
|
173
|
+
const task = this.GetByConversationDetailId(conversationDetailId);
|
|
142
174
|
if (task) {
|
|
143
|
-
this.
|
|
175
|
+
this.UpdateStatus(task.id, status);
|
|
144
176
|
return true;
|
|
145
177
|
}
|
|
146
178
|
return false;
|
|
147
179
|
}
|
|
180
|
+
/** @deprecated Use {@link UpdateStatusByConversationDetailId}. */
|
|
181
|
+
updateStatusByConversationDetailId(conversationDetailId, status) {
|
|
182
|
+
return this.UpdateStatusByConversationDetailId(conversationDetailId, status);
|
|
183
|
+
}
|
|
148
184
|
/**
|
|
149
185
|
* Get an active task by its agent run ID
|
|
150
186
|
* @param agentRunId The AIAgentRun ID
|
|
151
187
|
* @returns The task if found, undefined otherwise
|
|
152
188
|
*/
|
|
153
|
-
|
|
189
|
+
GetByAgentRunId(agentRunId) {
|
|
154
190
|
const tasks = Array.from(this._tasks$.value.values());
|
|
155
191
|
return tasks.find(task => task.agentRunId === agentRunId);
|
|
156
192
|
}
|
|
193
|
+
/** @deprecated Use {@link GetByAgentRunId}. */
|
|
194
|
+
getByAgentRunId(agentRunId) {
|
|
195
|
+
return this.GetByAgentRunId(agentRunId);
|
|
196
|
+
}
|
|
157
197
|
/**
|
|
158
198
|
* Remove a task by its agent run ID
|
|
159
199
|
* @param agentRunId The AIAgentRun ID
|
|
160
200
|
* @returns true if task was found and removed, false otherwise
|
|
161
201
|
*/
|
|
162
|
-
|
|
163
|
-
const task = this.
|
|
202
|
+
RemoveByAgentRunId(agentRunId) {
|
|
203
|
+
const task = this.GetByAgentRunId(agentRunId);
|
|
164
204
|
if (task) {
|
|
165
|
-
this.
|
|
205
|
+
this.Remove(task.id);
|
|
166
206
|
return true;
|
|
167
207
|
}
|
|
168
208
|
return false;
|
|
169
209
|
}
|
|
210
|
+
/** @deprecated Use {@link RemoveByAgentRunId}. */
|
|
211
|
+
removeByAgentRunId(agentRunId) {
|
|
212
|
+
return this.RemoveByAgentRunId(agentRunId);
|
|
213
|
+
}
|
|
170
214
|
/**
|
|
171
215
|
* Clear all active tasks
|
|
172
216
|
*/
|
|
173
|
-
|
|
217
|
+
Clear() {
|
|
174
218
|
this._tasks$.next(new Map());
|
|
175
219
|
}
|
|
220
|
+
/** @deprecated Use {@link Clear}. */
|
|
221
|
+
clear() {
|
|
222
|
+
return this.Clear();
|
|
223
|
+
}
|
|
176
224
|
/**
|
|
177
225
|
* Restore active tasks from database by querying running agent runs.
|
|
178
226
|
* Call this on app initialization to restore state after browser refresh.
|
|
179
227
|
* @param currentUser The current user to filter agent runs by
|
|
180
228
|
*/
|
|
181
|
-
async
|
|
229
|
+
async RestoreFromDatabase(currentUser) {
|
|
182
230
|
try {
|
|
183
231
|
const rv = RunView.FromMetadataProvider(this.Provider);
|
|
184
232
|
// Query for running agent runs owned by this user
|
|
@@ -209,10 +257,10 @@ export class ActiveTasksService {
|
|
|
209
257
|
for (const agentRun of result.Results) {
|
|
210
258
|
// Skip if already tracked (prevents duplicates)
|
|
211
259
|
if (agentRun.ConversationDetailID &&
|
|
212
|
-
this.
|
|
260
|
+
this.GetByConversationDetailId(agentRun.ConversationDetailID)) {
|
|
213
261
|
continue;
|
|
214
262
|
}
|
|
215
|
-
this.
|
|
263
|
+
this.Add({
|
|
216
264
|
agentName: agentRun.Agent || 'Unknown Agent',
|
|
217
265
|
agentId: agentRun.AgentID,
|
|
218
266
|
agentRunId: agentRun.ID, // For finding task on completion
|
|
@@ -234,6 +282,10 @@ export class ActiveTasksService {
|
|
|
234
282
|
console.error('Failed to restore active tasks from database:', error);
|
|
235
283
|
}
|
|
236
284
|
}
|
|
285
|
+
/** @deprecated Use {@link RestoreFromDatabase}. */
|
|
286
|
+
async restoreFromDatabase(currentUser) {
|
|
287
|
+
return this.RestoreFromDatabase(currentUser);
|
|
288
|
+
}
|
|
237
289
|
static ɵfac = function ActiveTasksService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ActiveTasksService)(); };
|
|
238
290
|
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ActiveTasksService, factory: ActiveTasksService.ɵfac, providedIn: 'root' });
|
|
239
291
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-tasks.service.js","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAc,MAAM,MAAM,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAY,QAAQ,EAAqB,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;;AAkBnE;;;GAGG;AAIH,MAAM,OAAO,kBAAkB;IACrB,OAAO,GAAG,IAAI,eAAe,CAA0B,IAAI,GAAG,EAAE,CAAC,CAAC;IAClE,0BAA0B,GAAG,IAAI,eAAe,CAAc,IAAI,GAAG,EAAE,CAAC,CAAC;IACzE,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC;IACrC,SAAS,GAA6B,IAAI,CAAC;IAEnD;;OAEG;IACH,IAAW,QAAQ,CAAC,KAA+B;QAC/C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,IAAW,QAAQ;QACf,OAAO,IAAI,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,CAAC;IAC/C,CAAC;IAED;;OAEG;IACa,MAAM,GAA6B,IAAI,CAAC,OAAO,CAAC,IAAI,CAClE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAC7C,CAAC;IAEF;;OAEG;IACa,UAAU,GAAuB,IAAI,CAAC,MAAM,CAAC,IAAI,CAC/D,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAC3B,CAAC;IAEF;;;OAGG;IACa,yBAAyB,GAA4B,IAAI,CAAC,0BAA0B,CAAC,YAAY,EAAE,CAAC;IAEpH;;;OAGG;IACa,sBAAsB,GAA0C,IAAI,CAAC,MAAM,CAAC,IAAI,CAC9F,GAAG,CAAC,KAAK,CAAC,EAAE;QACV,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;gBACxD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CACH,CAAC;IAEF;;;;OAIG;IACH,GAAG,CAAC,IAA0C;QAC5C,MAAM,EAAE,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,QAAQ,GAAG;YACf,GAAG,IAAI;YACP,EAAE;YACF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpC,8BAA8B;QAC9B,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC;QAED,gGAAgG;QAChG,+FAA+F;QAC/F,WAAW,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC,EAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7J,WAAW,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1G,WAAW,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAErJ,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,EAAU;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpC,2EAA2E;QAC3E,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC;QAED,WAAW,CAAC,EAAE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,CAAC,EAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACzJ,WAAW,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,cAAc,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACpH,WAAW,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,cAAc,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACvJ,CAAC;IAED;;;OAGG;IACK,wBAAwB;QAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;QAC1C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,EAAU,EAAE,MAAc;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,6EAA6E;QAC7E,2EAA2E;QAC3E,wDAAwD;QACxD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,yBAAyB,CAAC,oBAA4B;QACpD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,KAAK,oBAAoB,CAAC,CAAC;IAChF,CAAC;IAED;;;;;OAKG;IACH,kCAAkC,CAAC,oBAA4B,EAAE,MAAc;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,yBAAyB,CAAC,oBAAoB,CAAC,CAAC;QAClE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,UAAkB;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,UAAkB;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CAAC,WAAqB;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEvD,kDAAkD;YAClD,6FAA6F;YAC7F,mFAAmF;YACnF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAqB;gBAClD,UAAU,EAAE,mBAAmB;gBAC/B,MAAM,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,CAAC,EAAE,+DAA+D;gBAC7I,WAAW,EAAE,gCAAgC,WAAW,CAAC,EAAE,wCAAwC;gBACnG,UAAU,EAAE,QAAQ,CAAC,oDAAoD;aAC1E,EAAE,WAAW,CAAC,CAAC;YAEhB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtE,wDAAwD;gBACxD,OAAO;YACT,CAAC;YAED,wDAAwD;YACxD,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;YACpD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACtC,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;oBAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;oBAClE,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;wBACf,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,+CAA+C;YAC/C,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACtC,gDAAgD;gBAChD,IAAI,QAAQ,CAAC,oBAAoB;oBAC7B,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;oBAClE,SAAS;gBACX,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC;oBACP,SAAS,EAAE,QAAQ,CAAC,KAAK,IAAI,eAAe;oBAC5C,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,iCAAiC;oBAC1D,MAAM,EAAE,iBAAiB;oBACzB,gBAAgB,EAAE,QAAQ,CAAC,oBAAoB,IAAI,QAAQ,CAAC,EAAE;oBAC9D,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,IAAI,SAAS;oBAChE,cAAc,EAAE,QAAQ,CAAC,cAAc,IAAI,SAAS;oBACpD,gBAAgB,EAAE,QAAQ,CAAC,cAAc;wBACvC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,IAAI;wBACxD,CAAC,CAAC,IAAI;iBACT,CAAC,CAAC;gBACH,aAAa,EAAE,CAAC;YAClB,CAAC;YAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,+BAA+B,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;4GAjQU,kBAAkB;gEAAlB,kBAAkB,WAAlB,kBAAkB,mBAFjB,MAAM;;iFAEP,kBAAkB;cAH9B,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RunView, UserInfo, Metadata, IMetadataProvider, LogStatusEx } from '@memberjunction/core';\nimport { MJAIAgentRunEntity } from '@memberjunction/core-entities';\nimport { ConversationEngine } from '@memberjunction/core-entities';\n\n/**\n * Represents an active agent task that is currently running\n */\nexport interface ActiveTask {\n id: string;\n agentName: string;\n agentId?: string; // The agent ID for looking up icon/metadata\n agentRunId?: string; // The AIAgentRun ID for finding task on completion\n status: string;\n relatedMessageId: string;\n conversationDetailId?: string; // The ConversationDetail that tracks this task\n conversationId?: string; // The conversation this task belongs to\n conversationName?: string | null; // Display name of the conversation\n startTime: number;\n}\n\n/**\n * Service for tracking active agent tasks across the application.\n * Maintains a live list of running agents and their status.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ActiveTasksService {\n private _tasks$ = new BehaviorSubject<Map<string, ActiveTask>>(new Map());\n private _conversationIdsWithTasks$ = new BehaviorSubject<Set<string>>(new Set());\n private engine = ConversationEngine.Instance;\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Observable of all active tasks as an array\n */\n public readonly tasks$: Observable<ActiveTask[]> = this._tasks$.pipe(\n map(taskMap => Array.from(taskMap.values()))\n );\n\n /**\n * Observable of the count of active tasks\n */\n public readonly taskCount$: Observable<number> = this.tasks$.pipe(\n map(tasks => tasks.length)\n );\n\n /**\n * Observable of conversation IDs that have 1+ active tasks\n * Use this for quick lookups in conversation lists\n */\n public readonly conversationIdsWithTasks$: Observable<Set<string>> = this._conversationIdsWithTasks$.asObservable();\n\n /**\n * Observable of tasks grouped by conversation ID\n * Returns Map<conversationId, ActiveTask[]>\n */\n public readonly tasksByConversationId$: Observable<Map<string, ActiveTask[]>> = this.tasks$.pipe(\n map(tasks => {\n const grouped = new Map<string, ActiveTask[]>();\n for (const task of tasks) {\n if (task.conversationId) {\n const existing = grouped.get(task.conversationId) || [];\n existing.push(task);\n grouped.set(task.conversationId, existing);\n }\n }\n return grouped;\n })\n );\n\n /**\n * Add a new active task\n * @param task Task details (without id and startTime)\n * @returns The generated task ID\n */\n add(task: Omit<ActiveTask, 'id' | 'startTime'>): string {\n const id = `task-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n const fullTask = {\n ...task,\n id,\n startTime: Date.now()\n };\n const current = this._tasks$.value;\n current.set(id, fullTask);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set\n if (fullTask.conversationId) {\n this.updateConversationIdsSet();\n }\n\n // verboseOnly: three lines per add()/remove() is a lot of console for \"a Map changed size\", but\n // it is genuinely useful when tracing task lifecycle, so it stays available rather than going.\n LogStatusEx({ message: `➕ Task added:`, additionalArgs: [{id, conversationId: fullTask.conversationId, agentName: fullTask.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n\n return id;\n }\n\n /**\n * Remove an active task\n * @param id The task ID to remove\n */\n remove(id: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n current.delete(id);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set if this was the last task for a conversation\n if (task?.conversationId) {\n this.updateConversationIdsSet();\n }\n\n LogStatusEx({ message: `➖ Task removed:`, additionalArgs: [{id, conversationId: task?.conversationId, agentName: task?.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks remaining:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n }\n\n /**\n * Update the set of conversation IDs with active tasks\n * @private\n */\n private updateConversationIdsSet(): void {\n const conversationIds = new Set<string>();\n for (const task of this._tasks$.value.values()) {\n if (task.conversationId) {\n conversationIds.add(task.conversationId);\n }\n }\n this._conversationIdsWithTasks$.next(conversationIds);\n }\n\n /**\n * Update the status of an active task\n * @param id The task ID\n * @param status The new status text\n */\n updateStatus(id: string, status: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n // Same-value updates are no-ops so high-frequency callers (e.g. the streamed\n // final-response render path, which fires per content delta) don't re-emit\n // the whole task map to every subscriber on each token.\n if (task && task.status !== status) {\n task.status = status;\n this._tasks$.next(new Map(current));\n }\n }\n\n /**\n * Get an active task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @returns The task if found, undefined otherwise\n */\n getByConversationDetailId(conversationDetailId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.conversationDetailId === conversationDetailId);\n }\n\n /**\n * Update the status of a task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @param status The new status text\n * @returns true if task was found and updated, false otherwise\n */\n updateStatusByConversationDetailId(conversationDetailId: string, status: string): boolean {\n const task = this.getByConversationDetailId(conversationDetailId);\n if (task) {\n this.updateStatus(task.id, status);\n return true;\n }\n return false;\n }\n\n /**\n * Get an active task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns The task if found, undefined otherwise\n */\n getByAgentRunId(agentRunId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.agentRunId === agentRunId);\n }\n\n /**\n * Remove a task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns true if task was found and removed, false otherwise\n */\n removeByAgentRunId(agentRunId: string): boolean {\n const task = this.getByAgentRunId(agentRunId);\n if (task) {\n this.remove(task.id);\n return true;\n }\n return false;\n }\n\n /**\n * Clear all active tasks\n */\n clear(): void {\n this._tasks$.next(new Map());\n }\n\n /**\n * Restore active tasks from database by querying running agent runs.\n * Call this on app initialization to restore state after browser refresh.\n * @param currentUser The current user to filter agent runs by\n */\n async restoreFromDatabase(currentUser: UserInfo): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Query for running agent runs owned by this user\n // Only restore parent agents (those with ConversationDetailID) - child agents don't have one\n // This matches normal behavior where we only track parent agents, not child agents\n const result = await rv.RunView<MJAIAgentRunEntity>({\n EntityName: 'MJ: AI Agent Runs',\n Fields: [\"ID\", \"ConversationID\", \"AgentID\", \"Agent\", \"ConversationDetailID\"], // narrow field scope to not pull back JSON blobs - much faster\n ExtraFilter: `Status='Running' AND UserID='${currentUser.ID}' AND ConversationDetailID IS NOT NULL`,\n ResultType: 'simple' // no need for entity-object here we aren't mutating\n }, currentUser);\n\n if (!result.Success || !result.Results || result.Results.length === 0) {\n // No running tasks or query failed - nothing to restore\n return;\n }\n\n // Get conversation names from cached ConversationEngine\n const conversationNames = new Map<string, string>();\n for (const agentRun of result.Results) {\n if (agentRun.ConversationID) {\n const conv = this.engine.GetConversation(agentRun.ConversationID);\n if (conv?.Name) {\n conversationNames.set(agentRun.ConversationID, conv.Name);\n }\n }\n }\n\n // Add each running agent to ActiveTasksService\n let restoredCount = 0;\n for (const agentRun of result.Results) {\n // Skip if already tracked (prevents duplicates)\n if (agentRun.ConversationDetailID &&\n this.getByConversationDetailId(agentRun.ConversationDetailID)) {\n continue;\n }\n\n this.add({\n agentName: agentRun.Agent || 'Unknown Agent',\n agentId: agentRun.AgentID,\n agentRunId: agentRun.ID, // For finding task on completion\n status: 'Reconnecting...',\n relatedMessageId: agentRun.ConversationDetailID || agentRun.ID,\n conversationDetailId: agentRun.ConversationDetailID || undefined,\n conversationId: agentRun.ConversationID || undefined,\n conversationName: agentRun.ConversationID\n ? conversationNames.get(agentRun.ConversationID) || null\n : null\n });\n restoredCount++;\n }\n\n if (restoredCount > 0) {\n console.log(`✅ Restored ${restoredCount} active task(s) from database`);\n }\n } catch (error) {\n console.error('Failed to restore active tasks from database:', error);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"active-tasks.service.js","sourceRoot":"","sources":["../../../src/lib/services/active-tasks.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { RunView, UserInfo, Metadata, IMetadataProvider, LogStatusEx } from '@memberjunction/core';\nimport { MJAIAgentRunEntity } from '@memberjunction/core-entities';\nimport { ConversationEngine } from '@memberjunction/core-entities';\n\n/**\n * Represents an active agent task that is currently running\n */\nexport interface ActiveTask {\n id: string;\n agentName: string;\n agentId?: string; // The agent ID for looking up icon/metadata\n agentRunId?: string; // The AIAgentRun ID for finding task on completion\n status: string;\n relatedMessageId: string;\n conversationDetailId?: string; // The ConversationDetail that tracks this task\n conversationId?: string; // The conversation this task belongs to\n conversationName?: string | null; // Display name of the conversation\n startTime: number;\n}\n\n/**\n * Service for tracking active agent tasks across the application.\n * Maintains a live list of running agents and their status.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ActiveTasksService {\n private _tasks$ = new BehaviorSubject<Map<string, ActiveTask>>(new Map());\n private _conversationIdsWithTasks$ = new BehaviorSubject<Set<string>>(new Set());\n private engine = ConversationEngine.Instance;\n private _provider: IMetadataProvider | null = null;\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n /**\n * Observable of all active tasks as an array\n */\n public readonly Tasks$: Observable<ActiveTask[]> = this._tasks$.pipe(\n map(taskMap => Array.from(taskMap.values()))\n );\n\n /** @deprecated Use {@link Tasks$}. */\n public get tasks$(): Observable<ActiveTask[]> {\n return this.Tasks$;\n }\n\n /**\n * Observable of the count of active tasks\n */\n public readonly TaskCount$: Observable<number> = this.Tasks$.pipe(\n map(tasks => tasks.length)\n );\n\n /** @deprecated Use {@link TaskCount$}. */\n public get taskCount$(): Observable<number> {\n return this.TaskCount$;\n }\n\n /**\n * Observable of conversation IDs that have 1+ active tasks\n * Use this for quick lookups in conversation lists\n */\n public readonly ConversationIdsWithTasks$: Observable<Set<string>> = this._conversationIdsWithTasks$.asObservable();\n\n /** @deprecated Use {@link ConversationIdsWithTasks$}. */\n public get conversationIdsWithTasks$(): Observable<Set<string>> {\n return this.ConversationIdsWithTasks$;\n }\n\n /**\n * Observable of tasks grouped by conversation ID\n * Returns Map<conversationId, ActiveTask[]>\n */\n public readonly TasksByConversationId$: Observable<Map<string, ActiveTask[]>> = this.Tasks$.pipe(\n map(tasks => {\n const grouped = new Map<string, ActiveTask[]>();\n for (const task of tasks) {\n if (task.conversationId) {\n const existing = grouped.get(task.conversationId) || [];\n existing.push(task);\n grouped.set(task.conversationId, existing);\n }\n }\n return grouped;\n })\n );\n\n /** @deprecated Use {@link TasksByConversationId$}. */\n public get tasksByConversationId$(): Observable<Map<string, ActiveTask[]>> {\n return this.TasksByConversationId$;\n }\n\n /**\n * Add a new active task\n * @param task Task details (without id and startTime)\n * @returns The generated task ID\n */\n Add(task: Omit<ActiveTask, 'id' | 'startTime'>): string {\n const id = `task-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n const fullTask = {\n ...task,\n id,\n startTime: Date.now()\n };\n const current = this._tasks$.value;\n current.set(id, fullTask);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set\n if (fullTask.conversationId) {\n this.updateConversationIdsSet();\n }\n\n // verboseOnly: three lines per add()/remove() is a lot of console for \"a Map changed size\", but\n // it is genuinely useful when tracing task lifecycle, so it stays available rather than going.\n LogStatusEx({ message: `➕ Task added:`, additionalArgs: [{id, conversationId: fullTask.conversationId, agentName: fullTask.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n\n return id;\n }\n\n /** @deprecated Use {@link Add}. */\n add(task: Omit<ActiveTask, 'id' | 'startTime'>): string {\n return this.Add(task);\n }\n\n /**\n * Remove an active task\n * @param id The task ID to remove\n */\n Remove(id: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n current.delete(id);\n this._tasks$.next(new Map(current));\n\n // Update conversation IDs set if this was the last task for a conversation\n if (task?.conversationId) {\n this.updateConversationIdsSet();\n }\n\n LogStatusEx({ message: `➖ Task removed:`, additionalArgs: [{id, conversationId: task?.conversationId, agentName: task?.agentName}], verboseOnly: true });\n LogStatusEx({ message: `📊 Total tasks remaining:`, additionalArgs: [this._tasks$.value.size], verboseOnly: true });\n LogStatusEx({ message: `🗂️ Conversation IDs with tasks:`, additionalArgs: [Array.from(this._conversationIdsWithTasks$.value)], verboseOnly: true });\n }\n\n /** @deprecated Use {@link Remove}. */\n remove(id: string): void {\n return this.Remove(id);\n }\n\n /**\n * Update the set of conversation IDs with active tasks\n * @private\n */\n private updateConversationIdsSet(): void {\n const conversationIds = new Set<string>();\n for (const task of this._tasks$.value.values()) {\n if (task.conversationId) {\n conversationIds.add(task.conversationId);\n }\n }\n this._conversationIdsWithTasks$.next(conversationIds);\n }\n\n /**\n * Update the status of an active task\n * @param id The task ID\n * @param status The new status text\n */\n UpdateStatus(id: string, status: string): void {\n const current = this._tasks$.value;\n const task = current.get(id);\n // Same-value updates are no-ops so high-frequency callers (e.g. the streamed\n // final-response render path, which fires per content delta) don't re-emit\n // the whole task map to every subscriber on each token.\n if (task && task.status !== status) {\n task.status = status;\n this._tasks$.next(new Map(current));\n }\n }\n\n /** @deprecated Use {@link UpdateStatus}. */\n updateStatus(id: string, status: string): void {\n return this.UpdateStatus(id, status);\n }\n\n /**\n * Get an active task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @returns The task if found, undefined otherwise\n */\n GetByConversationDetailId(conversationDetailId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.conversationDetailId === conversationDetailId);\n }\n\n /** @deprecated Use {@link GetByConversationDetailId}. */\n getByConversationDetailId(conversationDetailId: string): ActiveTask | undefined {\n return this.GetByConversationDetailId(conversationDetailId);\n }\n\n /**\n * Update the status of a task by its conversation detail ID\n * @param conversationDetailId The conversation detail ID\n * @param status The new status text\n * @returns true if task was found and updated, false otherwise\n */\n UpdateStatusByConversationDetailId(conversationDetailId: string, status: string): boolean {\n const task = this.GetByConversationDetailId(conversationDetailId);\n if (task) {\n this.UpdateStatus(task.id, status);\n return true;\n }\n return false;\n }\n\n /** @deprecated Use {@link UpdateStatusByConversationDetailId}. */\n updateStatusByConversationDetailId(conversationDetailId: string, status: string): boolean {\n return this.UpdateStatusByConversationDetailId(conversationDetailId, status);\n }\n\n /**\n * Get an active task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns The task if found, undefined otherwise\n */\n GetByAgentRunId(agentRunId: string): ActiveTask | undefined {\n const tasks = Array.from(this._tasks$.value.values());\n return tasks.find(task => task.agentRunId === agentRunId);\n }\n\n /** @deprecated Use {@link GetByAgentRunId}. */\n getByAgentRunId(agentRunId: string): ActiveTask | undefined {\n return this.GetByAgentRunId(agentRunId);\n }\n\n /**\n * Remove a task by its agent run ID\n * @param agentRunId The AIAgentRun ID\n * @returns true if task was found and removed, false otherwise\n */\n RemoveByAgentRunId(agentRunId: string): boolean {\n const task = this.GetByAgentRunId(agentRunId);\n if (task) {\n this.Remove(task.id);\n return true;\n }\n return false;\n }\n\n /** @deprecated Use {@link RemoveByAgentRunId}. */\n removeByAgentRunId(agentRunId: string): boolean {\n return this.RemoveByAgentRunId(agentRunId);\n }\n\n /**\n * Clear all active tasks\n */\n Clear(): void {\n this._tasks$.next(new Map());\n }\n\n /** @deprecated Use {@link Clear}. */\n clear(): void {\n return this.Clear();\n }\n\n /**\n * Restore active tasks from database by querying running agent runs.\n * Call this on app initialization to restore state after browser refresh.\n * @param currentUser The current user to filter agent runs by\n */\n async RestoreFromDatabase(currentUser: UserInfo): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Query for running agent runs owned by this user\n // Only restore parent agents (those with ConversationDetailID) - child agents don't have one\n // This matches normal behavior where we only track parent agents, not child agents\n const result = await rv.RunView<MJAIAgentRunEntity>({\n EntityName: 'MJ: AI Agent Runs',\n Fields: [\"ID\", \"ConversationID\", \"AgentID\", \"Agent\", \"ConversationDetailID\"], // narrow field scope to not pull back JSON blobs - much faster\n ExtraFilter: `Status='Running' AND UserID='${currentUser.ID}' AND ConversationDetailID IS NOT NULL`,\n ResultType: 'simple' // no need for entity-object here we aren't mutating\n }, currentUser);\n\n if (!result.Success || !result.Results || result.Results.length === 0) {\n // No running tasks or query failed - nothing to restore\n return;\n }\n\n // Get conversation names from cached ConversationEngine\n const conversationNames = new Map<string, string>();\n for (const agentRun of result.Results) {\n if (agentRun.ConversationID) {\n const conv = this.engine.GetConversation(agentRun.ConversationID);\n if (conv?.Name) {\n conversationNames.set(agentRun.ConversationID, conv.Name);\n }\n }\n }\n\n // Add each running agent to ActiveTasksService\n let restoredCount = 0;\n for (const agentRun of result.Results) {\n // Skip if already tracked (prevents duplicates)\n if (agentRun.ConversationDetailID &&\n this.GetByConversationDetailId(agentRun.ConversationDetailID)) {\n continue;\n }\n\n this.Add({\n agentName: agentRun.Agent || 'Unknown Agent',\n agentId: agentRun.AgentID,\n agentRunId: agentRun.ID, // For finding task on completion\n status: 'Reconnecting...',\n relatedMessageId: agentRun.ConversationDetailID || agentRun.ID,\n conversationDetailId: agentRun.ConversationDetailID || undefined,\n conversationId: agentRun.ConversationID || undefined,\n conversationName: agentRun.ConversationID\n ? conversationNames.get(agentRun.ConversationID) || null\n : null\n });\n restoredCount++;\n }\n\n if (restoredCount > 0) {\n console.log(`✅ Restored ${restoredCount} active task(s) from database`);\n }\n } catch (error) {\n console.error('Failed to restore active tasks from database:', error);\n }\n }\n\n /** @deprecated Use {@link RestoreFromDatabase}. */\n async restoreFromDatabase(currentUser: UserInfo): Promise<void> {\n return this.RestoreFromDatabase(currentUser);\n }\n}\n"]}
|
|
@@ -22,7 +22,9 @@ export declare class AgentStateService implements OnDestroy {
|
|
|
22
22
|
/** Minimum poll cycles before allowing auto-stop. Prevents premature shutdown
|
|
23
23
|
* when fire-and-forget ACK returns before the server creates the agent run record. */
|
|
24
24
|
private readonly minimumPollCycles;
|
|
25
|
-
readonly
|
|
25
|
+
readonly ActiveAgents$: Observable<AgentWithStatus[]>;
|
|
26
|
+
/** @deprecated Use {@link ActiveAgents$}. */
|
|
27
|
+
get activeAgents$(): Observable<AgentWithStatus[]>;
|
|
26
28
|
private _provider;
|
|
27
29
|
constructor();
|
|
28
30
|
/**
|
|
@@ -36,25 +38,35 @@ export declare class AgentStateService implements OnDestroy {
|
|
|
36
38
|
* @param currentUser The current user context
|
|
37
39
|
* @param conversationId Optional conversation ID to filter by
|
|
38
40
|
*/
|
|
41
|
+
StartPolling(currentUser: UserInfo, conversationId?: string): void;
|
|
42
|
+
/** @deprecated Use {@link StartPolling}. */
|
|
39
43
|
startPolling(currentUser: UserInfo, conversationId?: string): void;
|
|
40
44
|
/**
|
|
41
45
|
* Stops polling for active agents
|
|
42
46
|
*/
|
|
47
|
+
StopPolling(): void;
|
|
48
|
+
/** @deprecated Use {@link StopPolling}. */
|
|
43
49
|
stopPolling(): void;
|
|
44
50
|
/**
|
|
45
51
|
* Gets active agents as an observable
|
|
46
52
|
* @param conversationId Optional conversation ID to filter by
|
|
47
53
|
*/
|
|
54
|
+
GetActiveAgents(conversationId?: string): Observable<AgentWithStatus[]>;
|
|
55
|
+
/** @deprecated Use {@link GetActiveAgents}. */
|
|
48
56
|
getActiveAgents(conversationId?: string): Observable<AgentWithStatus[]>;
|
|
49
57
|
/**
|
|
50
58
|
* Gets a specific agent by ID
|
|
51
59
|
* @param agentRunId The agent run ID
|
|
52
60
|
*/
|
|
61
|
+
GetAgent(agentRunId: string): AgentWithStatus | undefined;
|
|
62
|
+
/** @deprecated Use {@link GetAgent}. */
|
|
53
63
|
getAgent(agentRunId: string): AgentWithStatus | undefined;
|
|
54
64
|
/**
|
|
55
65
|
* Manually refreshes active agents
|
|
56
66
|
* @param conversationId Optional conversation ID to filter by
|
|
57
67
|
*/
|
|
68
|
+
Refresh(conversationId?: string): Promise<void>;
|
|
69
|
+
/** @deprecated Use {@link Refresh}. */
|
|
58
70
|
refresh(conversationId?: string): Promise<void>;
|
|
59
71
|
/**
|
|
60
72
|
* Loads active agents from the database
|
|
@@ -76,11 +88,15 @@ export declare class AgentStateService implements OnDestroy {
|
|
|
76
88
|
* Cancels an agent run
|
|
77
89
|
* @param agentRunId The agent run ID to cancel
|
|
78
90
|
*/
|
|
91
|
+
CancelAgent(agentRunId: string): Promise<boolean>;
|
|
92
|
+
/** @deprecated Use {@link CancelAgent}. */
|
|
79
93
|
cancelAgent(agentRunId: string): Promise<boolean>;
|
|
80
94
|
/**
|
|
81
95
|
* Updates the poll interval
|
|
82
96
|
* @param milliseconds The new poll interval in milliseconds
|
|
83
97
|
*/
|
|
98
|
+
SetPollInterval(milliseconds: number): void;
|
|
99
|
+
/** @deprecated Use {@link SetPollInterval}. */
|
|
84
100
|
setPollInterval(milliseconds: number): void;
|
|
85
101
|
static ɵfac: i0.ɵɵFactoryDeclaration<AgentStateService, never>;
|
|
86
102
|
static ɵprov: i0.ɵɵInjectableDeclaration<AgentStateService>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-state.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAmB,UAAU,EAA0B,MAAM,MAAM,CAAC;AAE3E,OAAO,EAAwB,QAAQ,EAAY,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;;AAEnE,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,kBAAkB,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAGa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAC,CAAe;IACxC,OAAO,CAAC,WAAW,CAAC,CAAW;IAC/B,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B;2FACuF;IACvF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAK;IAGvC,SAAgB,aAAa,gCAAsC;IAEnE,OAAO,CAAC,SAAS,CAAkC;;IAInD;;OAEG;IACH,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IAED,WAAW,IAAI,IAAI;IAInB;;;;OAIG;IACH,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAclE;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB;;;OAGG;IACH,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAUvE;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIzD;;;OAGG;IACG,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;YACW,gBAAgB;IAiD9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqC5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;OAGG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD;;;OAGG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"agent-state.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAmB,UAAU,EAA0B,MAAM,MAAM,CAAC;AAE3E,OAAO,EAAwB,QAAQ,EAAY,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;;AAEnE,MAAM,MAAM,WAAW,GAAG,eAAe,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAE7F,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,kBAAkB,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAGa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,gBAAgB,CAAC,CAAe;IACxC,OAAO,CAAC,WAAW,CAAC,CAAW;IAC/B,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,cAAc,CAAK;IAC3B;2FACuF;IACvF,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAK;IAGvC,SAAgB,aAAa,gCAAsC;IAEnE,6CAA6C;IAC7C,IAAW,aAAa,kCAEvB;IAED,OAAO,CAAC,SAAS,CAAkC;;IAInD;;OAEG;IACH,IAAW,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,EAElD;IAED,IAAW,QAAQ,IAAI,iBAAiB,CAEvC;IAED,WAAW,IAAI,IAAI;IAInB;;;;OAIG;IACH,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAclE,4CAA4C;IAC5C,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAIlE;;OAEG;IACH,WAAW,IAAI,IAAI;IAOnB,2CAA2C;IAC3C,WAAW,IAAI,IAAI;IAInB;;;OAGG;IACH,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAUvE,+CAA+C;IAC/C,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,EAAE,CAAC;IAIvE;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIzD,wCAAwC;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAIzD;;;OAGG;IACG,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,uCAAuC;IACjC,OAAO,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD;;OAEG;YACW,gBAAgB;IAiD9B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqC5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;OAGG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BvD,2CAA2C;IACrC,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIvD;;;OAGG;IACH,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAS3C,+CAA+C;IAC/C,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;yCAxShC,iBAAiB;6CAAjB,iBAAiB;CA2S7B"}
|
|
@@ -18,7 +18,11 @@ export class AgentStateService {
|
|
|
18
18
|
* when fire-and-forget ACK returns before the server creates the agent run record. */
|
|
19
19
|
minimumPollCycles = 3;
|
|
20
20
|
// Public observable streams
|
|
21
|
-
|
|
21
|
+
ActiveAgents$ = this._activeAgents$.asObservable();
|
|
22
|
+
/** @deprecated Use {@link ActiveAgents$}. */
|
|
23
|
+
get activeAgents$() {
|
|
24
|
+
return this.ActiveAgents$;
|
|
25
|
+
}
|
|
22
26
|
_provider = null;
|
|
23
27
|
constructor() { }
|
|
24
28
|
/**
|
|
@@ -31,16 +35,16 @@ export class AgentStateService {
|
|
|
31
35
|
return this._provider ?? Metadata.Provider;
|
|
32
36
|
}
|
|
33
37
|
ngOnDestroy() {
|
|
34
|
-
this.
|
|
38
|
+
this.StopPolling();
|
|
35
39
|
}
|
|
36
40
|
/**
|
|
37
41
|
* Starts polling for active agents
|
|
38
42
|
* @param currentUser The current user context
|
|
39
43
|
* @param conversationId Optional conversation ID to filter by
|
|
40
44
|
*/
|
|
41
|
-
|
|
45
|
+
StartPolling(currentUser, conversationId) {
|
|
42
46
|
this.currentUser = currentUser;
|
|
43
|
-
this.
|
|
47
|
+
this.StopPolling();
|
|
44
48
|
this.pollCycleCount = 0;
|
|
45
49
|
// Initial load
|
|
46
50
|
this.loadActiveAgents(conversationId);
|
|
@@ -49,39 +53,59 @@ export class AgentStateService {
|
|
|
49
53
|
.pipe(switchMap(() => this.loadActiveAgents(conversationId)))
|
|
50
54
|
.subscribe();
|
|
51
55
|
}
|
|
56
|
+
/** @deprecated Use {@link StartPolling}. */
|
|
57
|
+
startPolling(currentUser, conversationId) {
|
|
58
|
+
return this.StartPolling(currentUser, conversationId);
|
|
59
|
+
}
|
|
52
60
|
/**
|
|
53
61
|
* Stops polling for active agents
|
|
54
62
|
*/
|
|
55
|
-
|
|
63
|
+
StopPolling() {
|
|
56
64
|
if (this.pollSubscription) {
|
|
57
65
|
this.pollSubscription.unsubscribe();
|
|
58
66
|
this.pollSubscription = undefined;
|
|
59
67
|
}
|
|
60
68
|
}
|
|
69
|
+
/** @deprecated Use {@link StopPolling}. */
|
|
70
|
+
stopPolling() {
|
|
71
|
+
return this.StopPolling();
|
|
72
|
+
}
|
|
61
73
|
/**
|
|
62
74
|
* Gets active agents as an observable
|
|
63
75
|
* @param conversationId Optional conversation ID to filter by
|
|
64
76
|
*/
|
|
65
|
-
|
|
77
|
+
GetActiveAgents(conversationId) {
|
|
66
78
|
if (conversationId) {
|
|
67
|
-
return this.
|
|
79
|
+
return this.ActiveAgents$.pipe(map(agents => agents.filter(a => UUIDsEqual(a.run.ConversationID, conversationId))), shareReplay(1));
|
|
68
80
|
}
|
|
69
|
-
return this.
|
|
81
|
+
return this.ActiveAgents$;
|
|
82
|
+
}
|
|
83
|
+
/** @deprecated Use {@link GetActiveAgents}. */
|
|
84
|
+
getActiveAgents(conversationId) {
|
|
85
|
+
return this.GetActiveAgents(conversationId);
|
|
70
86
|
}
|
|
71
87
|
/**
|
|
72
88
|
* Gets a specific agent by ID
|
|
73
89
|
* @param agentRunId The agent run ID
|
|
74
90
|
*/
|
|
75
|
-
|
|
91
|
+
GetAgent(agentRunId) {
|
|
76
92
|
return this._activeAgents$.value.find(a => UUIDsEqual(a.run.ID, agentRunId));
|
|
77
93
|
}
|
|
94
|
+
/** @deprecated Use {@link GetAgent}. */
|
|
95
|
+
getAgent(agentRunId) {
|
|
96
|
+
return this.GetAgent(agentRunId);
|
|
97
|
+
}
|
|
78
98
|
/**
|
|
79
99
|
* Manually refreshes active agents
|
|
80
100
|
* @param conversationId Optional conversation ID to filter by
|
|
81
101
|
*/
|
|
82
|
-
async
|
|
102
|
+
async Refresh(conversationId) {
|
|
83
103
|
await this.loadActiveAgents(conversationId);
|
|
84
104
|
}
|
|
105
|
+
/** @deprecated Use {@link Refresh}. */
|
|
106
|
+
async refresh(conversationId) {
|
|
107
|
+
return this.Refresh(conversationId);
|
|
108
|
+
}
|
|
85
109
|
/**
|
|
86
110
|
* Loads active agents from the database
|
|
87
111
|
*/
|
|
@@ -117,7 +141,7 @@ export class AgentStateService {
|
|
|
117
141
|
// before the server has created the agent run record.
|
|
118
142
|
if (runs.length === 0 && this.pollSubscription && this.pollCycleCount >= this.minimumPollCycles) {
|
|
119
143
|
LogStatusEx({ message: `[${timestamp}] 🤖 AgentStateService - No active agents after ${this.pollCycleCount} cycles, stopping polling`, verboseOnly: true });
|
|
120
|
-
this.
|
|
144
|
+
this.StopPolling();
|
|
121
145
|
}
|
|
122
146
|
}
|
|
123
147
|
}
|
|
@@ -192,12 +216,12 @@ export class AgentStateService {
|
|
|
192
216
|
* Cancels an agent run
|
|
193
217
|
* @param agentRunId The agent run ID to cancel
|
|
194
218
|
*/
|
|
195
|
-
async
|
|
219
|
+
async CancelAgent(agentRunId) {
|
|
196
220
|
if (!this.currentUser) {
|
|
197
221
|
return false;
|
|
198
222
|
}
|
|
199
223
|
try {
|
|
200
|
-
const agent = this.
|
|
224
|
+
const agent = this.GetAgent(agentRunId);
|
|
201
225
|
if (!agent) {
|
|
202
226
|
return false;
|
|
203
227
|
}
|
|
@@ -205,7 +229,7 @@ export class AgentStateService {
|
|
|
205
229
|
const saved = await agent.run.Save();
|
|
206
230
|
if (saved) {
|
|
207
231
|
// Refresh the active agents list
|
|
208
|
-
await this.
|
|
232
|
+
await this.Refresh();
|
|
209
233
|
return true;
|
|
210
234
|
}
|
|
211
235
|
}
|
|
@@ -214,17 +238,25 @@ export class AgentStateService {
|
|
|
214
238
|
}
|
|
215
239
|
return false;
|
|
216
240
|
}
|
|
241
|
+
/** @deprecated Use {@link CancelAgent}. */
|
|
242
|
+
async cancelAgent(agentRunId) {
|
|
243
|
+
return this.CancelAgent(agentRunId);
|
|
244
|
+
}
|
|
217
245
|
/**
|
|
218
246
|
* Updates the poll interval
|
|
219
247
|
* @param milliseconds The new poll interval in milliseconds
|
|
220
248
|
*/
|
|
221
|
-
|
|
249
|
+
SetPollInterval(milliseconds) {
|
|
222
250
|
this.pollInterval = milliseconds;
|
|
223
251
|
// Restart polling if currently active
|
|
224
252
|
if (this.pollSubscription && this.currentUser) {
|
|
225
|
-
this.
|
|
253
|
+
this.StartPolling(this.currentUser);
|
|
226
254
|
}
|
|
227
255
|
}
|
|
256
|
+
/** @deprecated Use {@link SetPollInterval}. */
|
|
257
|
+
setPollInterval(milliseconds) {
|
|
258
|
+
return this.SetPollInterval(milliseconds);
|
|
259
|
+
}
|
|
228
260
|
static ɵfac = function AgentStateService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AgentStateService)(); };
|
|
229
261
|
static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AgentStateService, factory: AgentStateService.ɵfac, providedIn: 'root' });
|
|
230
262
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-state.service.js","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable, interval, Subscription } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\nimport { LogStatusEx, RunView, UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJAIAgentRunEntity } from '@memberjunction/core-entities';\n\nexport type AgentStatus = 'acknowledging' | 'working' | 'completing' | 'completed' | 'error';\n\nexport interface AgentWithStatus {\n run: MJAIAgentRunEntity;\n status: AgentStatus;\n confidence: number | null;\n}\n\n/**\n * Manages agent state and provides real-time updates for active agents\n * Polls for agent status changes and provides reactive streams\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentStateService implements OnDestroy {\n private _activeAgents$ = new BehaviorSubject<AgentWithStatus[]>([]);\n private pollSubscription?: Subscription;\n private currentUser?: UserInfo;\n private pollInterval: number = 30000; // Poll every 30 seconds (reduced from 3s to minimize DB load)\n private pollCycleCount = 0;\n /** Minimum poll cycles before allowing auto-stop. Prevents premature shutdown\n * when fire-and-forget ACK returns before the server creates the agent run record. */\n private readonly minimumPollCycles = 3;\n\n // Public observable streams\n public readonly activeAgents$ = this._activeAgents$.asObservable();\n\n private _provider: IMetadataProvider | null = null;\n\n constructor() {}\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n ngOnDestroy(): void {\n this.stopPolling();\n }\n\n /**\n * Starts polling for active agents\n * @param currentUser The current user context\n * @param conversationId Optional conversation ID to filter by\n */\n startPolling(currentUser: UserInfo, conversationId?: string): void {\n this.currentUser = currentUser;\n this.stopPolling();\n this.pollCycleCount = 0;\n\n // Initial load\n this.loadActiveAgents(conversationId);\n\n // Start polling\n this.pollSubscription = interval(this.pollInterval)\n .pipe(switchMap(() => this.loadActiveAgents(conversationId)))\n .subscribe();\n }\n\n /**\n * Stops polling for active agents\n */\n stopPolling(): void {\n if (this.pollSubscription) {\n this.pollSubscription.unsubscribe();\n this.pollSubscription = undefined;\n }\n }\n\n /**\n * Gets active agents as an observable\n * @param conversationId Optional conversation ID to filter by\n */\n getActiveAgents(conversationId?: string): Observable<AgentWithStatus[]> {\n if (conversationId) {\n return this.activeAgents$.pipe(\n map(agents => agents.filter(a => UUIDsEqual(a.run.ConversationID, conversationId))),\n shareReplay(1)\n );\n }\n return this.activeAgents$;\n }\n\n /**\n * Gets a specific agent by ID\n * @param agentRunId The agent run ID\n */\n getAgent(agentRunId: string): AgentWithStatus | undefined {\n return this._activeAgents$.value.find(a => UUIDsEqual(a.run.ID, agentRunId));\n }\n\n /**\n * Manually refreshes active agents\n * @param conversationId Optional conversation ID to filter by\n */\n async refresh(conversationId?: string): Promise<void> {\n await this.loadActiveAgents(conversationId);\n }\n\n /**\n * Loads active agents from the database\n */\n private async loadActiveAgents(conversationId?: string): Promise<void> {\n if (!this.currentUser) {\n return;\n }\n\n this.pollCycleCount++;\n const timestamp = new Date().toISOString();\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService.loadActiveAgents - Polling for active agents (conversation: ${conversationId || 'ALL'}, cycle: ${this.pollCycleCount})`, verboseOnly: true});\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Valid statuses: Running, Completed, Paused, Failed, Cancelled\n let filter = `Status IN ('Running', 'Paused')`;\n\n if (conversationId) {\n filter += ` AND ConversationID='${conversationId}'`;\n }\n\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Executing RunView for AI Agent Runs`, verboseOnly: true});\n const result = await rv.RunView<MJAIAgentRunEntity>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n const runs = result.Results || [];\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Found ${runs.length} active agent(s)`, verboseOnly: true});\n const agentsWithStatus = runs.map(run => this.mapRunToAgentWithStatus(run));\n this._activeAgents$.next(agentsWithStatus);\n\n // Stop polling if no active agents AND minimum cycles met (optimization to reduce DB load).\n // The minimum cycle guard prevents premature shutdown when fire-and-forget returns\n // before the server has created the agent run record.\n if (runs.length === 0 && this.pollSubscription && this.pollCycleCount >= this.minimumPollCycles) {\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - No active agents after ${this.pollCycleCount} cycles, stopping polling`, verboseOnly: true});\n this.stopPolling();\n }\n }\n } catch (error) {\n console.error('Failed to load active agents:', error);\n }\n }\n\n /**\n * Maps an agent run to include status and confidence information\n */\n private mapRunToAgentWithStatus(run: MJAIAgentRunEntity): AgentWithStatus {\n const status = this.determineAgentStatus(run);\n const confidence = this.extractConfidence(run);\n\n return {\n run,\n status,\n confidence\n };\n }\n\n /**\n * Determines the agent status based on the run entity\n */\n private determineAgentStatus(run: MJAIAgentRunEntity): AgentStatus {\n const status = run.Status?.toLowerCase() || 'running';\n\n // Check for errors\n if (status === 'error' || status === 'failed') {\n return 'error';\n }\n\n // Check for completion\n if (status === 'completed' || status === 'complete' || status === 'success') {\n return 'completed';\n }\n\n // Determine stage based on progress or elapsed time\n if (run.StartedAt) {\n const elapsed = Date.now() - new Date(run.StartedAt).getTime();\n const seconds = elapsed / 1000;\n\n // First 5 seconds: acknowledging\n if (seconds < 5) {\n return 'acknowledging';\n }\n\n // Check if nearing completion (has results or output)\n if (run.Result || run.Status === 'Completed') {\n // If there's output, likely completing\n return 'completing';\n }\n\n // Otherwise, working\n return 'working';\n }\n\n // Default to acknowledging if just started\n return 'acknowledging';\n }\n\n /**\n * Extracts confidence score from agent run if available\n */\n private extractConfidence(run: MJAIAgentRunEntity): number | null {\n // Try to parse confidence from Result or other fields\n // This is a placeholder - adjust based on actual data structure\n try {\n if (run.Result) {\n const result = typeof run.Result === 'string' ? JSON.parse(run.Result) : run.Result;\n if (result.confidence != null) {\n return parseFloat(result.confidence);\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n return null;\n }\n\n /**\n * Cancels an agent run\n * @param agentRunId The agent run ID to cancel\n */\n async cancelAgent(agentRunId: string): Promise<boolean> {\n if (!this.currentUser) {\n return false;\n }\n\n try {\n const agent = this.getAgent(agentRunId);\n if (!agent) {\n return false;\n }\n\n agent.run.Status = 'Cancelled';\n const saved = await agent.run.Save();\n\n if (saved) {\n // Refresh the active agents list\n await this.refresh();\n return true;\n }\n } catch (error) {\n console.error('Failed to cancel agent:', error);\n }\n\n return false;\n }\n\n /**\n * Updates the poll interval\n * @param milliseconds The new poll interval in milliseconds\n */\n setPollInterval(milliseconds: number): void {\n this.pollInterval = milliseconds;\n\n // Restart polling if currently active\n if (this.pollSubscription && this.currentUser) {\n this.startPolling(this.currentUser);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"agent-state.service.js","sourceRoot":"","sources":["../../../src/lib/services/agent-state.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Observable, interval, Subscription } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\nimport { LogStatusEx, RunView, UserInfo, Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { MJAIAgentRunEntity } from '@memberjunction/core-entities';\n\nexport type AgentStatus = 'acknowledging' | 'working' | 'completing' | 'completed' | 'error';\n\nexport interface AgentWithStatus {\n run: MJAIAgentRunEntity;\n status: AgentStatus;\n confidence: number | null;\n}\n\n/**\n * Manages agent state and provides real-time updates for active agents\n * Polls for agent status changes and provides reactive streams\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class AgentStateService implements OnDestroy {\n private _activeAgents$ = new BehaviorSubject<AgentWithStatus[]>([]);\n private pollSubscription?: Subscription;\n private currentUser?: UserInfo;\n private pollInterval: number = 30000; // Poll every 30 seconds (reduced from 3s to minimize DB load)\n private pollCycleCount = 0;\n /** Minimum poll cycles before allowing auto-stop. Prevents premature shutdown\n * when fire-and-forget ACK returns before the server creates the agent run record. */\n private readonly minimumPollCycles = 3;\n\n // Public observable streams\n public readonly ActiveAgents$ = this._activeAgents$.asObservable();\n\n /** @deprecated Use {@link ActiveAgents$}. */\n public get activeAgents$() {\n return this.ActiveAgents$;\n }\n\n private _provider: IMetadataProvider | null = null;\n\n constructor() {}\n\n /**\n * Set the metadata provider this service should use. When unset, falls back to Metadata.Provider.\n */\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n }\n\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n\n ngOnDestroy(): void {\n this.StopPolling();\n }\n\n /**\n * Starts polling for active agents\n * @param currentUser The current user context\n * @param conversationId Optional conversation ID to filter by\n */\n StartPolling(currentUser: UserInfo, conversationId?: string): void {\n this.currentUser = currentUser;\n this.StopPolling();\n this.pollCycleCount = 0;\n\n // Initial load\n this.loadActiveAgents(conversationId);\n\n // Start polling\n this.pollSubscription = interval(this.pollInterval)\n .pipe(switchMap(() => this.loadActiveAgents(conversationId)))\n .subscribe();\n }\n\n /** @deprecated Use {@link StartPolling}. */\n startPolling(currentUser: UserInfo, conversationId?: string): void {\n return this.StartPolling(currentUser, conversationId);\n }\n\n /**\n * Stops polling for active agents\n */\n StopPolling(): void {\n if (this.pollSubscription) {\n this.pollSubscription.unsubscribe();\n this.pollSubscription = undefined;\n }\n }\n\n /** @deprecated Use {@link StopPolling}. */\n stopPolling(): void {\n return this.StopPolling();\n }\n\n /**\n * Gets active agents as an observable\n * @param conversationId Optional conversation ID to filter by\n */\n GetActiveAgents(conversationId?: string): Observable<AgentWithStatus[]> {\n if (conversationId) {\n return this.ActiveAgents$.pipe(\n map(agents => agents.filter(a => UUIDsEqual(a.run.ConversationID, conversationId))),\n shareReplay(1)\n );\n }\n return this.ActiveAgents$;\n }\n\n /** @deprecated Use {@link GetActiveAgents}. */\n getActiveAgents(conversationId?: string): Observable<AgentWithStatus[]> {\n return this.GetActiveAgents(conversationId);\n }\n\n /**\n * Gets a specific agent by ID\n * @param agentRunId The agent run ID\n */\n GetAgent(agentRunId: string): AgentWithStatus | undefined {\n return this._activeAgents$.value.find(a => UUIDsEqual(a.run.ID, agentRunId));\n }\n\n /** @deprecated Use {@link GetAgent}. */\n getAgent(agentRunId: string): AgentWithStatus | undefined {\n return this.GetAgent(agentRunId);\n }\n\n /**\n * Manually refreshes active agents\n * @param conversationId Optional conversation ID to filter by\n */\n async Refresh(conversationId?: string): Promise<void> {\n await this.loadActiveAgents(conversationId);\n }\n\n /** @deprecated Use {@link Refresh}. */\n async refresh(conversationId?: string): Promise<void> {\n return this.Refresh(conversationId);\n }\n\n /**\n * Loads active agents from the database\n */\n private async loadActiveAgents(conversationId?: string): Promise<void> {\n if (!this.currentUser) {\n return;\n }\n\n this.pollCycleCount++;\n const timestamp = new Date().toISOString();\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService.loadActiveAgents - Polling for active agents (conversation: ${conversationId || 'ALL'}, cycle: ${this.pollCycleCount})`, verboseOnly: true});\n\n try {\n const rv = RunView.FromMetadataProvider(this.Provider);\n // Valid statuses: Running, Completed, Paused, Failed, Cancelled\n let filter = `Status IN ('Running', 'Paused')`;\n\n if (conversationId) {\n filter += ` AND ConversationID='${conversationId}'`;\n }\n\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Executing RunView for AI Agent Runs`, verboseOnly: true});\n const result = await rv.RunView<MJAIAgentRunEntity>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: filter,\n OrderBy: 'StartedAt DESC',\n MaxRows: 50,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (result.Success) {\n const runs = result.Results || [];\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - Found ${runs.length} active agent(s)`, verboseOnly: true});\n const agentsWithStatus = runs.map(run => this.mapRunToAgentWithStatus(run));\n this._activeAgents$.next(agentsWithStatus);\n\n // Stop polling if no active agents AND minimum cycles met (optimization to reduce DB load).\n // The minimum cycle guard prevents premature shutdown when fire-and-forget returns\n // before the server has created the agent run record.\n if (runs.length === 0 && this.pollSubscription && this.pollCycleCount >= this.minimumPollCycles) {\n LogStatusEx({message: `[${timestamp}] 🤖 AgentStateService - No active agents after ${this.pollCycleCount} cycles, stopping polling`, verboseOnly: true});\n this.StopPolling();\n }\n }\n } catch (error) {\n console.error('Failed to load active agents:', error);\n }\n }\n\n /**\n * Maps an agent run to include status and confidence information\n */\n private mapRunToAgentWithStatus(run: MJAIAgentRunEntity): AgentWithStatus {\n const status = this.determineAgentStatus(run);\n const confidence = this.extractConfidence(run);\n\n return {\n run,\n status,\n confidence\n };\n }\n\n /**\n * Determines the agent status based on the run entity\n */\n private determineAgentStatus(run: MJAIAgentRunEntity): AgentStatus {\n const status = run.Status?.toLowerCase() || 'running';\n\n // Check for errors\n if (status === 'error' || status === 'failed') {\n return 'error';\n }\n\n // Check for completion\n if (status === 'completed' || status === 'complete' || status === 'success') {\n return 'completed';\n }\n\n // Determine stage based on progress or elapsed time\n if (run.StartedAt) {\n const elapsed = Date.now() - new Date(run.StartedAt).getTime();\n const seconds = elapsed / 1000;\n\n // First 5 seconds: acknowledging\n if (seconds < 5) {\n return 'acknowledging';\n }\n\n // Check if nearing completion (has results or output)\n if (run.Result || run.Status === 'Completed') {\n // If there's output, likely completing\n return 'completing';\n }\n\n // Otherwise, working\n return 'working';\n }\n\n // Default to acknowledging if just started\n return 'acknowledging';\n }\n\n /**\n * Extracts confidence score from agent run if available\n */\n private extractConfidence(run: MJAIAgentRunEntity): number | null {\n // Try to parse confidence from Result or other fields\n // This is a placeholder - adjust based on actual data structure\n try {\n if (run.Result) {\n const result = typeof run.Result === 'string' ? JSON.parse(run.Result) : run.Result;\n if (result.confidence != null) {\n return parseFloat(result.confidence);\n }\n }\n } catch {\n // Ignore parse errors\n }\n\n return null;\n }\n\n /**\n * Cancels an agent run\n * @param agentRunId The agent run ID to cancel\n */\n async CancelAgent(agentRunId: string): Promise<boolean> {\n if (!this.currentUser) {\n return false;\n }\n\n try {\n const agent = this.GetAgent(agentRunId);\n if (!agent) {\n return false;\n }\n\n agent.run.Status = 'Cancelled';\n const saved = await agent.run.Save();\n\n if (saved) {\n // Refresh the active agents list\n await this.Refresh();\n return true;\n }\n } catch (error) {\n console.error('Failed to cancel agent:', error);\n }\n\n return false;\n }\n\n /** @deprecated Use {@link CancelAgent}. */\n async cancelAgent(agentRunId: string): Promise<boolean> {\n return this.CancelAgent(agentRunId);\n }\n\n /**\n * Updates the poll interval\n * @param milliseconds The new poll interval in milliseconds\n */\n SetPollInterval(milliseconds: number): void {\n this.pollInterval = milliseconds;\n\n // Restart polling if currently active\n if (this.pollSubscription && this.currentUser) {\n this.StartPolling(this.currentUser);\n }\n }\n\n /** @deprecated Use {@link SetPollInterval}. */\n setPollInterval(milliseconds: number): void {\n return this.SetPollInterval(milliseconds);\n }\n}\n"]}
|