@memberjunction/ng-conversations 2.104.0
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 +197 -0
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +20 -0
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -0
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js +125 -0
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -0
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts +48 -0
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -0
- package/dist/lib/components/agent/active-agent-indicator.component.js +199 -0
- package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -0
- package/dist/lib/components/agent/agent-process-panel.component.d.ts +30 -0
- package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -0
- package/dist/lib/components/agent/agent-process-panel.component.js +333 -0
- package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -0
- package/dist/lib/components/artifact/artifact-panel.component.d.ts +22 -0
- package/dist/lib/components/artifact/artifact-panel.component.d.ts.map +1 -0
- package/dist/lib/components/artifact/artifact-panel.component.js +237 -0
- package/dist/lib/components/artifact/artifact-panel.component.js.map +1 -0
- package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts +39 -0
- package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts.map +1 -0
- package/dist/lib/components/artifact/artifact-upload-modal.component.js +384 -0
- package/dist/lib/components/artifact/artifact-upload-modal.component.js.map +1 -0
- package/dist/lib/components/artifact/artifact-version-history.component.d.ts +28 -0
- package/dist/lib/components/artifact/artifact-version-history.component.d.ts.map +1 -0
- package/dist/lib/components/artifact/artifact-version-history.component.js +280 -0
- package/dist/lib/components/artifact/artifact-version-history.component.js.map +1 -0
- package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts +22 -0
- package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts.map +1 -0
- package/dist/lib/components/artifact/artifact-viewer-panel.component.js +182 -0
- package/dist/lib/components/artifact/artifact-viewer-panel.component.js.map +1 -0
- package/dist/lib/components/artifact/artifact-viewer.component.d.ts +27 -0
- package/dist/lib/components/artifact/artifact-viewer.component.d.ts.map +1 -0
- package/dist/lib/components/artifact/artifact-viewer.component.js +266 -0
- package/dist/lib/components/artifact/artifact-viewer.component.js.map +1 -0
- package/dist/lib/components/artifact/inline-artifact.component.d.ts +46 -0
- package/dist/lib/components/artifact/inline-artifact.component.d.ts.map +1 -0
- package/dist/lib/components/artifact/inline-artifact.component.js +447 -0
- package/dist/lib/components/artifact/inline-artifact.component.js.map +1 -0
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts +18 -0
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -0
- package/dist/lib/components/collection/collection-artifact-card.component.js +147 -0
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -0
- package/dist/lib/components/collection/collection-form-modal.component.d.ts +33 -0
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -0
- package/dist/lib/components/collection/collection-form-modal.component.js +245 -0
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -0
- package/dist/lib/components/collection/collection-tree.component.d.ts +42 -0
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -0
- package/dist/lib/components/collection/collection-tree.component.js +482 -0
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -0
- package/dist/lib/components/collection/collection-view.component.d.ts +31 -0
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -0
- package/dist/lib/components/collection/collection-view.component.js +254 -0
- package/dist/lib/components/collection/collection-view.component.js.map +1 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts +55 -0
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -0
- package/dist/lib/components/collection/collections-full-view.component.js +578 -0
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +160 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.js +891 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -0
- package/dist/lib/components/conversation/conversation-list.component.d.ts +29 -0
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -0
- package/dist/lib/components/conversation/conversation-list.component.js +255 -0
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -0
- package/dist/lib/components/dialogs/input-dialog.component.d.ts +17 -0
- package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -0
- package/dist/lib/components/dialogs/input-dialog.component.js +122 -0
- package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -0
- package/dist/lib/components/export/export-modal.component.d.ts +37 -0
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -0
- package/dist/lib/components/export/export-modal.component.js +414 -0
- package/dist/lib/components/export/export-modal.component.js.map +1 -0
- package/dist/lib/components/library/library-full-view.component.d.ts +36 -0
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -0
- package/dist/lib/components/library/library-full-view.component.js +270 -0
- package/dist/lib/components/library/library-full-view.component.js.map +1 -0
- package/dist/lib/components/members/members-modal.component.d.ts +42 -0
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -0
- package/dist/lib/components/members/members-modal.component.js +352 -0
- package/dist/lib/components/members/members-modal.component.js.map +1 -0
- package/dist/lib/components/mention/mention-dropdown.component.d.ts +44 -0
- package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +1 -0
- package/dist/lib/components/mention/mention-dropdown.component.js +194 -0
- package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -0
- package/dist/lib/components/message/message-input.component.d.ts +137 -0
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -0
- package/dist/lib/components/message/message-input.component.js +1159 -0
- package/dist/lib/components/message/message-input.component.js.map +1 -0
- package/dist/lib/components/message/message-item.component.d.ts +140 -0
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -0
- package/dist/lib/components/message/message-item.component.js +817 -0
- package/dist/lib/components/message/message-item.component.js.map +1 -0
- package/dist/lib/components/message/message-list.component.d.ts +77 -0
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -0
- package/dist/lib/components/message/message-list.component.js +316 -0
- package/dist/lib/components/message/message-list.component.js.map +1 -0
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts +13 -0
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -0
- package/dist/lib/components/navigation/conversation-navigation.component.js +88 -0
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -0
- package/dist/lib/components/notification/activity-indicator.component.d.ts +11 -0
- package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -0
- package/dist/lib/components/notification/activity-indicator.component.js +56 -0
- package/dist/lib/components/notification/activity-indicator.component.js.map +1 -0
- package/dist/lib/components/notification/notification-badge.component.d.ts +27 -0
- package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -0
- package/dist/lib/components/notification/notification-badge.component.js +160 -0
- package/dist/lib/components/notification/notification-badge.component.js.map +1 -0
- package/dist/lib/components/project/project-form-modal.component.d.ts +34 -0
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -0
- package/dist/lib/components/project/project-form-modal.component.js +357 -0
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -0
- package/dist/lib/components/project/project-selector.component.d.ts +36 -0
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -0
- package/dist/lib/components/project/project-selector.component.js +317 -0
- package/dist/lib/components/project/project-selector.component.js.map +1 -0
- package/dist/lib/components/search/search-panel.component.d.ts +120 -0
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -0
- package/dist/lib/components/search/search-panel.component.js +714 -0
- package/dist/lib/components/search/search-panel.component.js.map +1 -0
- package/dist/lib/components/share/share-modal.component.d.ts +46 -0
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -0
- package/dist/lib/components/share/share-modal.component.js +431 -0
- package/dist/lib/components/share/share-modal.component.js.map +1 -0
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +18 -0
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -0
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +81 -0
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -0
- package/dist/lib/components/task/task-form-modal.component.d.ts +42 -0
- package/dist/lib/components/task/task-form-modal.component.d.ts.map +1 -0
- package/dist/lib/components/task/task-form-modal.component.js +329 -0
- package/dist/lib/components/task/task-form-modal.component.js.map +1 -0
- package/dist/lib/components/task/task-item.component.d.ts +22 -0
- package/dist/lib/components/task/task-item.component.d.ts.map +1 -0
- package/dist/lib/components/task/task-item.component.js +234 -0
- package/dist/lib/components/task/task-item.component.js.map +1 -0
- package/dist/lib/components/task/task-list.component.d.ts +32 -0
- package/dist/lib/components/task/task-list.component.d.ts.map +1 -0
- package/dist/lib/components/task/task-list.component.js +290 -0
- package/dist/lib/components/task/task-list.component.js.map +1 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +27 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.js +254 -0
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -0
- package/dist/lib/components/thread/thread-panel.component.d.ts +65 -0
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -0
- package/dist/lib/components/thread/thread-panel.component.js +325 -0
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -0
- package/dist/lib/components/toast/toast.component.d.ts +26 -0
- package/dist/lib/components/toast/toast.component.d.ts.map +1 -0
- package/dist/lib/components/toast/toast.component.js +108 -0
- package/dist/lib/components/toast/toast.component.js.map +1 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +75 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -0
- package/dist/lib/components/workspace/conversation-workspace.component.js +299 -0
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -0
- package/dist/lib/conversations.module.d.ts +62 -0
- package/dist/lib/conversations.module.d.ts.map +1 -0
- package/dist/lib/conversations.module.js +248 -0
- package/dist/lib/conversations.module.js.map +1 -0
- package/dist/lib/directives/search-shortcut.directive.d.ts +17 -0
- package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -0
- package/dist/lib/directives/search-shortcut.directive.js +39 -0
- package/dist/lib/directives/search-shortcut.directive.js.map +1 -0
- package/dist/lib/models/conversation-state.model.d.ts +72 -0
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -0
- package/dist/lib/models/conversation-state.model.js +2 -0
- package/dist/lib/models/conversation-state.model.js.map +1 -0
- package/dist/lib/models/notification.model.d.ts +89 -0
- package/dist/lib/models/notification.model.d.ts.map +1 -0
- package/dist/lib/models/notification.model.js +11 -0
- package/dist/lib/models/notification.model.js.map +1 -0
- package/dist/lib/services/active-tasks.service.d.ts +65 -0
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -0
- package/dist/lib/services/active-tasks.service.js +95 -0
- package/dist/lib/services/active-tasks.service.js.map +1 -0
- package/dist/lib/services/agent-state.service.d.ts +78 -0
- package/dist/lib/services/agent-state.service.d.ts.map +1 -0
- package/dist/lib/services/agent-state.service.js +213 -0
- package/dist/lib/services/agent-state.service.js.map +1 -0
- package/dist/lib/services/artifact-state.service.d.ts +114 -0
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -0
- package/dist/lib/services/artifact-state.service.js +288 -0
- package/dist/lib/services/artifact-state.service.js.map +1 -0
- package/dist/lib/services/conversation-agent.service.d.ts +79 -0
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -0
- package/dist/lib/services/conversation-agent.service.js +259 -0
- package/dist/lib/services/conversation-agent.service.js.map +1 -0
- package/dist/lib/services/conversation-state.service.d.ts +122 -0
- package/dist/lib/services/conversation-state.service.d.ts.map +1 -0
- package/dist/lib/services/conversation-state.service.js +255 -0
- package/dist/lib/services/conversation-state.service.js.map +1 -0
- package/dist/lib/services/dialog.service.d.ts +54 -0
- package/dist/lib/services/dialog.service.d.ts.map +1 -0
- package/dist/lib/services/dialog.service.js +157 -0
- package/dist/lib/services/dialog.service.js.map +1 -0
- package/dist/lib/services/export.service.d.ts +25 -0
- package/dist/lib/services/export.service.d.ts.map +1 -0
- package/dist/lib/services/export.service.js +237 -0
- package/dist/lib/services/export.service.js.map +1 -0
- package/dist/lib/services/mention-autocomplete.service.d.ts +59 -0
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -0
- package/dist/lib/services/mention-autocomplete.service.js +160 -0
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -0
- package/dist/lib/services/mention-parser.service.d.ts +46 -0
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -0
- package/dist/lib/services/mention-parser.service.js +156 -0
- package/dist/lib/services/mention-parser.service.js.map +1 -0
- package/dist/lib/services/notification.service.d.ts +108 -0
- package/dist/lib/services/notification.service.d.ts.map +1 -0
- package/dist/lib/services/notification.service.js +431 -0
- package/dist/lib/services/notification.service.js.map +1 -0
- package/dist/lib/services/search.service.d.ts +144 -0
- package/dist/lib/services/search.service.d.ts.map +1 -0
- package/dist/lib/services/search.service.js +370 -0
- package/dist/lib/services/search.service.js.map +1 -0
- package/dist/lib/services/toast.service.d.ts +46 -0
- package/dist/lib/services/toast.service.d.ts.map +1 -0
- package/dist/lib/services/toast.service.js +76 -0
- package/dist/lib/services/toast.service.js.map +1 -0
- package/dist/public-api.d.ts +42 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +49 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# @memberjunction/ng-conversations
|
|
2
|
+
|
|
3
|
+
Angular package for conversation, collection, and artifact management built on MemberJunction.
|
|
4
|
+
|
|
5
|
+
## Status: Foundation Complete ✅
|
|
6
|
+
|
|
7
|
+
This package provides the core infrastructure for building Slack-style conversation interfaces with artifacts and collections. The initial implementation includes:
|
|
8
|
+
|
|
9
|
+
### ✅ Completed
|
|
10
|
+
|
|
11
|
+
#### Core Services
|
|
12
|
+
- **ConversationDataService** - CRUD operations for conversations with reactive state
|
|
13
|
+
- **MessageDataService** - Message management with caching
|
|
14
|
+
- **ArtifactDataService** - Artifact and version management
|
|
15
|
+
- **ProjectDataService** - Project organization
|
|
16
|
+
- **CollectionDataService** - Collection and artifact organization
|
|
17
|
+
- **ConversationStateService** - Reactive state management for conversations
|
|
18
|
+
- **ArtifactStateService** - Reactive state management for artifacts
|
|
19
|
+
|
|
20
|
+
#### Components
|
|
21
|
+
- **MessageItemComponent** - Individual message display with dynamic rendering
|
|
22
|
+
- **MessageListComponent** - Efficient message list using ViewContainerRef.createComponent()
|
|
23
|
+
|
|
24
|
+
#### Models
|
|
25
|
+
- TypeScript interfaces for all state management types
|
|
26
|
+
- Union types for navigation tabs, layouts, and view modes
|
|
27
|
+
|
|
28
|
+
### 🎯 Key Features
|
|
29
|
+
|
|
30
|
+
1. **Performance Optimized**
|
|
31
|
+
- Uses dynamic component creation (ViewContainerRef.createComponent) instead of Angular template binding
|
|
32
|
+
- Follows the proven pattern from @memberjunction/ng-skip-chat
|
|
33
|
+
- Dramatically reduces render cycles and improves performance
|
|
34
|
+
|
|
35
|
+
2. **MJ Entity Integration**
|
|
36
|
+
- All services use Metadata.GetEntityObject() pattern
|
|
37
|
+
- RunView for efficient data loading
|
|
38
|
+
- Proper type safety with generic methods
|
|
39
|
+
|
|
40
|
+
3. **Reactive State Management**
|
|
41
|
+
- RxJS BehaviorSubjects for all state
|
|
42
|
+
- Derived observables using combineLatest
|
|
43
|
+
- shareReplay(1) for efficient caching
|
|
44
|
+
|
|
45
|
+
4. **Proper User Context**
|
|
46
|
+
- All server-side operations include contextUser parameter
|
|
47
|
+
- Follows MJ security patterns
|
|
48
|
+
|
|
49
|
+
### 📦 Installation
|
|
50
|
+
|
|
51
|
+
This package is part of the MemberJunction monorepo. It's installed via npm workspaces:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# From repo root
|
|
55
|
+
npm install
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 🔧 Usage Example
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import {
|
|
62
|
+
ConversationDataService,
|
|
63
|
+
MessageDataService,
|
|
64
|
+
ConversationStateService,
|
|
65
|
+
MessageListComponent
|
|
66
|
+
} from '@memberjunction/ng-conversations';
|
|
67
|
+
|
|
68
|
+
// In your component
|
|
69
|
+
constructor(
|
|
70
|
+
private conversationData: ConversationDataService,
|
|
71
|
+
private conversationState: ConversationStateService,
|
|
72
|
+
private currentUser: UserInfo
|
|
73
|
+
) {}
|
|
74
|
+
|
|
75
|
+
async ngOnInit() {
|
|
76
|
+
// Load conversations
|
|
77
|
+
const conversations = await this.conversationData.loadConversations(
|
|
78
|
+
environmentId,
|
|
79
|
+
this.currentUser
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
// Set active conversation
|
|
83
|
+
this.conversationState.setActiveConversation(conversations[0].ID);
|
|
84
|
+
|
|
85
|
+
// Subscribe to state changes
|
|
86
|
+
this.conversationState.activeConversation$.subscribe(conv => {
|
|
87
|
+
console.log('Active conversation changed:', conv);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 📁 Package Structure
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
src/
|
|
96
|
+
├── lib/
|
|
97
|
+
│ ├── components/
|
|
98
|
+
│ │ └── message/ # Message display components
|
|
99
|
+
│ │ ├── message-item.component.ts
|
|
100
|
+
│ │ ├── message-item.component.html
|
|
101
|
+
│ │ ├── message-item.component.css
|
|
102
|
+
│ │ ├── message-list.component.ts
|
|
103
|
+
│ │ ├── message-list.component.html
|
|
104
|
+
│ │ └── message-list.component.css
|
|
105
|
+
│ ├── services/
|
|
106
|
+
│ │ ├── conversation-data.service.ts # Conversation CRUD
|
|
107
|
+
│ │ ├── message-data.service.ts # Message CRUD
|
|
108
|
+
│ │ ├── artifact-data.service.ts # Artifact & versions
|
|
109
|
+
│ │ ├── project-data.service.ts # Project management
|
|
110
|
+
│ │ ├── collection-data.service.ts # Collections
|
|
111
|
+
│ │ ├── conversation-state.service.ts # Conversation state
|
|
112
|
+
│ │ └── artifact-state.service.ts # Artifact state
|
|
113
|
+
│ ├── models/
|
|
114
|
+
│ │ └── conversation-state.model.ts # TypeScript interfaces
|
|
115
|
+
│ └── conversations.module.ts
|
|
116
|
+
└── public-api.ts
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 🚀 Next Steps
|
|
120
|
+
|
|
121
|
+
To complete the full implementation as per the prototype:
|
|
122
|
+
|
|
123
|
+
1. **Layout Components**
|
|
124
|
+
- ConversationWorkspaceComponent (3-column layout)
|
|
125
|
+
- ConversationNavigationComponent (top nav bar)
|
|
126
|
+
- ConversationSidebarComponent (left sidebar with tabs)
|
|
127
|
+
|
|
128
|
+
2. **Conversation Components**
|
|
129
|
+
- ConversationListComponent (with grouping/filtering)
|
|
130
|
+
- ConversationItemComponent (list item with badges)
|
|
131
|
+
- ConversationChatAreaComponent (main chat interface)
|
|
132
|
+
- MessageInputComponent (rich text input)
|
|
133
|
+
|
|
134
|
+
3. **Artifact Components**
|
|
135
|
+
- ArtifactPanelComponent (right panel)
|
|
136
|
+
- ArtifactViewerComponent (type-specific rendering)
|
|
137
|
+
- ArtifactEditorComponent (edit mode)
|
|
138
|
+
- ArtifactVersionHistoryComponent (version timeline)
|
|
139
|
+
- ArtifactShareModalComponent (sharing UI)
|
|
140
|
+
|
|
141
|
+
4. **Collection Components**
|
|
142
|
+
- CollectionTreeComponent (hierarchical tree)
|
|
143
|
+
- CollectionViewComponent (grid/list view)
|
|
144
|
+
- CollectionModalComponent (management UI)
|
|
145
|
+
|
|
146
|
+
5. **Project & Task Components**
|
|
147
|
+
- ProjectListComponent
|
|
148
|
+
- ProjectSelectorComponent
|
|
149
|
+
- TaskListComponent
|
|
150
|
+
- TaskItemComponent
|
|
151
|
+
- AgentProcessPanelComponent (floating panel)
|
|
152
|
+
|
|
153
|
+
6. **Explorer Integration**
|
|
154
|
+
- Add `/chat` route to explorer-core
|
|
155
|
+
- Create wrapper components
|
|
156
|
+
- Integrate with Explorer navigation
|
|
157
|
+
|
|
158
|
+
### 🧪 Testing
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Compile the package
|
|
162
|
+
cd packages/Angular/Generic/conversations
|
|
163
|
+
npm run build
|
|
164
|
+
|
|
165
|
+
# Run from repo root
|
|
166
|
+
npm run build:conversations
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 📝 Notes
|
|
170
|
+
|
|
171
|
+
- **No Commits**: This code has NOT been committed. Review required before committing.
|
|
172
|
+
- **Dynamic Rendering**: The message components use ViewContainerRef.createComponent() to avoid Angular binding overhead - this is CRITICAL for performance.
|
|
173
|
+
- **Type Safety**: All services use proper MJ entity types and generic methods.
|
|
174
|
+
- **Caching**: Message data is cached per conversation to minimize database hits.
|
|
175
|
+
|
|
176
|
+
### 🔗 Dependencies
|
|
177
|
+
|
|
178
|
+
- @memberjunction/core ^2.101.0
|
|
179
|
+
- @memberjunction/core-entities ^2.101.0
|
|
180
|
+
- @memberjunction/global ^2.101.0
|
|
181
|
+
- @memberjunction/graphql-dataprovider ^2.101.0
|
|
182
|
+
- @memberjunction/ng-base-types ^2.101.0
|
|
183
|
+
- @progress/kendo-angular-* ^16.2.0
|
|
184
|
+
- @angular/* ^18.0.2
|
|
185
|
+
- ngx-markdown ^18.0.0
|
|
186
|
+
- marked ^9.1.6
|
|
187
|
+
|
|
188
|
+
### 📚 References
|
|
189
|
+
|
|
190
|
+
- Implementation Plan: See comprehensive plan created during initial analysis
|
|
191
|
+
- Prototype: `/v3_conversations/slack-style-agent-chat-v22.html`
|
|
192
|
+
- Entity Schema: `/v3_conversations/schema.sql`
|
|
193
|
+
- Skip Chat Pattern: `packages/Angular/Generic/skip-chat/`
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
**Built with MemberJunction** | Version 2.101.0
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { ActiveTasksService, ActiveTask } from '../../services/active-tasks.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Panel component that displays currently running agent tasks.
|
|
6
|
+
* Shows as a floating panel in bottom-right corner when tasks are active.
|
|
7
|
+
*/
|
|
8
|
+
export declare class ActiveTasksPanelComponent {
|
|
9
|
+
private activeTasksService;
|
|
10
|
+
tasks$: Observable<ActiveTask[]>;
|
|
11
|
+
taskCount$: Observable<number>;
|
|
12
|
+
isExpanded: boolean;
|
|
13
|
+
constructor(activeTasksService: ActiveTasksService);
|
|
14
|
+
toggleExpanded(): void;
|
|
15
|
+
getElapsedTime(task: ActiveTask): string;
|
|
16
|
+
getTrimmedStatus(status: string): string;
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ActiveTasksPanelComponent, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ActiveTasksPanelComponent, "mj-active-tasks-panel", never, {}, {}, never, never, false, never>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=active-tasks-panel.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-tasks-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/active-tasks/active-tasks-panel.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;;AAErF;;;GAGG;AACH,qBAiHa,yBAAyB;IAKxB,OAAO,CAAC,kBAAkB;IAJtC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;IACjC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,UAAQ;gBAEE,kBAAkB,EAAE,kBAAkB;IAK1D,cAAc,IAAI,IAAI;IAItB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAaxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;yCA3B7B,yBAAyB;2CAAzB,yBAAyB;CAkCrC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../services/active-tasks.service";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
function ActiveTasksPanelComponent_div_0_div_7_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
6
|
+
i0.ɵɵelementStart(0, "div", 8)(1, "div", 9);
|
|
7
|
+
i0.ɵɵelement(2, "i", 10);
|
|
8
|
+
i0.ɵɵelementStart(3, "span", 11);
|
|
9
|
+
i0.ɵɵtext(4);
|
|
10
|
+
i0.ɵɵelementEnd();
|
|
11
|
+
i0.ɵɵelementStart(5, "span", 12);
|
|
12
|
+
i0.ɵɵtext(6);
|
|
13
|
+
i0.ɵɵelementEnd()();
|
|
14
|
+
i0.ɵɵelementStart(7, "div", 13);
|
|
15
|
+
i0.ɵɵtext(8);
|
|
16
|
+
i0.ɵɵelementEnd()();
|
|
17
|
+
} if (rf & 2) {
|
|
18
|
+
const task_r3 = ctx.$implicit;
|
|
19
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
20
|
+
i0.ɵɵadvance(4);
|
|
21
|
+
i0.ɵɵtextInterpolate(task_r3.agentName);
|
|
22
|
+
i0.ɵɵadvance(2);
|
|
23
|
+
i0.ɵɵtextInterpolate(ctx_r1.getElapsedTime(task_r3));
|
|
24
|
+
i0.ɵɵadvance(2);
|
|
25
|
+
i0.ɵɵtextInterpolate(ctx_r1.getTrimmedStatus(task_r3.status));
|
|
26
|
+
} }
|
|
27
|
+
function ActiveTasksPanelComponent_div_0_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
i0.ɵɵelementStart(0, "div", 6);
|
|
29
|
+
i0.ɵɵtemplate(1, ActiveTasksPanelComponent_div_0_div_7_div_1_Template, 9, 3, "div", 7);
|
|
30
|
+
i0.ɵɵpipe(2, "async");
|
|
31
|
+
i0.ɵɵelementEnd();
|
|
32
|
+
} if (rf & 2) {
|
|
33
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
34
|
+
i0.ɵɵadvance();
|
|
35
|
+
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, ctx_r1.tasks$));
|
|
36
|
+
} }
|
|
37
|
+
function ActiveTasksPanelComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
39
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "div", 2);
|
|
40
|
+
i0.ɵɵlistener("click", function ActiveTasksPanelComponent_div_0_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleExpanded()); });
|
|
41
|
+
i0.ɵɵelement(2, "i", 3);
|
|
42
|
+
i0.ɵɵelementStart(3, "span");
|
|
43
|
+
i0.ɵɵtext(4);
|
|
44
|
+
i0.ɵɵpipe(5, "async");
|
|
45
|
+
i0.ɵɵelementEnd();
|
|
46
|
+
i0.ɵɵelement(6, "i", 4);
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
48
|
+
i0.ɵɵtemplate(7, ActiveTasksPanelComponent_div_0_div_7_Template, 3, 3, "div", 5);
|
|
49
|
+
i0.ɵɵelementEnd();
|
|
50
|
+
} if (rf & 2) {
|
|
51
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
52
|
+
i0.ɵɵadvance(4);
|
|
53
|
+
i0.ɵɵtextInterpolate1("Active Tasks (", i0.ɵɵpipeBind1(5, 3, ctx_r1.taskCount$), ")");
|
|
54
|
+
i0.ɵɵadvance(2);
|
|
55
|
+
i0.ɵɵproperty("ngClass", ctx_r1.isExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
56
|
+
i0.ɵɵadvance();
|
|
57
|
+
i0.ɵɵproperty("ngIf", ctx_r1.isExpanded);
|
|
58
|
+
} }
|
|
59
|
+
/**
|
|
60
|
+
* Panel component that displays currently running agent tasks.
|
|
61
|
+
* Shows as a floating panel in bottom-right corner when tasks are active.
|
|
62
|
+
*/
|
|
63
|
+
export class ActiveTasksPanelComponent {
|
|
64
|
+
activeTasksService;
|
|
65
|
+
tasks$;
|
|
66
|
+
taskCount$;
|
|
67
|
+
isExpanded = true;
|
|
68
|
+
constructor(activeTasksService) {
|
|
69
|
+
this.activeTasksService = activeTasksService;
|
|
70
|
+
this.tasks$ = this.activeTasksService.tasks$;
|
|
71
|
+
this.taskCount$ = this.activeTasksService.taskCount$;
|
|
72
|
+
}
|
|
73
|
+
toggleExpanded() {
|
|
74
|
+
this.isExpanded = !this.isExpanded;
|
|
75
|
+
}
|
|
76
|
+
getElapsedTime(task) {
|
|
77
|
+
const elapsed = Date.now() - task.startTime;
|
|
78
|
+
const seconds = Math.floor(elapsed / 1000);
|
|
79
|
+
if (seconds < 60) {
|
|
80
|
+
return `${seconds}s`;
|
|
81
|
+
}
|
|
82
|
+
const minutes = Math.floor(seconds / 60);
|
|
83
|
+
const remainingSeconds = seconds % 60;
|
|
84
|
+
return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
|
|
85
|
+
}
|
|
86
|
+
getTrimmedStatus(status) {
|
|
87
|
+
const maxLength = 50;
|
|
88
|
+
if (status.length <= maxLength) {
|
|
89
|
+
return status;
|
|
90
|
+
}
|
|
91
|
+
return status.substring(0, maxLength) + '...';
|
|
92
|
+
}
|
|
93
|
+
static ɵfac = function ActiveTasksPanelComponent_Factory(t) { return new (t || ActiveTasksPanelComponent)(i0.ɵɵdirectiveInject(i1.ActiveTasksService)); };
|
|
94
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActiveTasksPanelComponent, selectors: [["mj-active-tasks-panel"]], decls: 2, vars: 3, consts: [["class", "active-tasks-panel", 4, "ngIf"], [1, "active-tasks-panel"], [1, "panel-header", 3, "click"], [1, "fas", "fa-tasks"], [1, "fas", 3, "ngClass"], ["class", "panel-content", 4, "ngIf"], [1, "panel-content"], ["class", "task-item", 4, "ngFor", "ngForOf"], [1, "task-item"], [1, "task-header"], [1, "fas", "fa-circle-notch", "fa-spin"], [1, "task-agent"], [1, "task-elapsed"], [1, "task-status"]], template: function ActiveTasksPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
95
|
+
i0.ɵɵtemplate(0, ActiveTasksPanelComponent_div_0_Template, 8, 5, "div", 0);
|
|
96
|
+
i0.ɵɵpipe(1, "async");
|
|
97
|
+
} if (rf & 2) {
|
|
98
|
+
i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(1, 1, ctx.taskCount$) > 0);
|
|
99
|
+
} }, dependencies: [i2.NgClass, i2.NgForOf, i2.NgIf, i2.AsyncPipe], styles: [".active-tasks-panel[_ngcontent-%COMP%] {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 320px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n z-index: 1000;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #F9FAFB;\n border-bottom: 1px solid #E5E7EB;\n border-radius: 8px 8px 0 0;\n cursor: pointer;\n font-weight: 600;\n font-size: 14px;\n color: #111827;\n transition: background 150ms ease;\n }\n\n .panel-header[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n }\n\n .panel-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #0076B6;\n }\n\n .panel-header[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .panel-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n color: #6B7280;\n font-size: 12px;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n max-height: 300px;\n overflow-y: auto;\n }\n\n .task-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid #F3F4F6;\n }\n\n .task-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .task-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .task-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076B6;\n font-size: 14px;\n }\n\n .task-agent[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 600;\n color: #111827;\n font-size: 14px;\n }\n\n .task-elapsed[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n }\n\n .task-status[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6B7280;\n padding-left: 22px;\n }"] });
|
|
100
|
+
}
|
|
101
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActiveTasksPanelComponent, [{
|
|
102
|
+
type: Component,
|
|
103
|
+
args: [{ selector: 'mj-active-tasks-panel', template: `
|
|
104
|
+
<div class="active-tasks-panel" *ngIf="(taskCount$ | async)! > 0">
|
|
105
|
+
<div class="panel-header" (click)="toggleExpanded()">
|
|
106
|
+
<i class="fas fa-tasks"></i>
|
|
107
|
+
<span>Active Tasks ({{ taskCount$ | async }})</span>
|
|
108
|
+
<i class="fas" [ngClass]="isExpanded ? 'fa-chevron-up' : 'fa-chevron-down'"></i>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<div class="panel-content" *ngIf="isExpanded">
|
|
112
|
+
<div class="task-item" *ngFor="let task of (tasks$ | async)">
|
|
113
|
+
<div class="task-header">
|
|
114
|
+
<i class="fas fa-circle-notch fa-spin"></i>
|
|
115
|
+
<span class="task-agent">{{ task.agentName }}</span>
|
|
116
|
+
<span class="task-elapsed">{{ getElapsedTime(task) }}</span>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="task-status">{{ getTrimmedStatus(task.status) }}</div>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
`, styles: ["\n .active-tasks-panel {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 320px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n z-index: 1000;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #F9FAFB;\n border-bottom: 1px solid #E5E7EB;\n border-radius: 8px 8px 0 0;\n cursor: pointer;\n font-weight: 600;\n font-size: 14px;\n color: #111827;\n transition: background 150ms ease;\n }\n\n .panel-header:hover {\n background: #F3F4F6;\n }\n\n .panel-header i:first-child {\n color: #0076B6;\n }\n\n .panel-header span {\n flex: 1;\n }\n\n .panel-header i:last-child {\n color: #6B7280;\n font-size: 12px;\n }\n\n .panel-content {\n max-height: 300px;\n overflow-y: auto;\n }\n\n .task-item {\n padding: 12px 16px;\n border-bottom: 1px solid #F3F4F6;\n }\n\n .task-item:last-child {\n border-bottom: none;\n }\n\n .task-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .task-header i {\n color: #0076B6;\n font-size: 14px;\n }\n\n .task-agent {\n flex: 1;\n font-weight: 600;\n color: #111827;\n font-size: 14px;\n }\n\n .task-elapsed {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n }\n\n .task-status {\n font-size: 13px;\n color: #6B7280;\n padding-left: 22px;\n }\n "] }]
|
|
123
|
+
}], () => [{ type: i1.ActiveTasksService }], null); })();
|
|
124
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActiveTasksPanelComponent, { className: "ActiveTasksPanelComponent", filePath: "src/lib/components/active-tasks/active-tasks-panel.component.ts", lineNumber: 122 }); })();
|
|
125
|
+
//# sourceMappingURL=active-tasks-panel.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-tasks-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/active-tasks/active-tasks-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;;;;IAoBhC,AADF,8BAA6D,aAClC;IACvB,wBAA2C;IAC3C,gCAAyB;IAAA,YAAoB;IAAA,iBAAO;IACpD,gCAA2B;IAAA,YAA0B;IACvD,AADuD,iBAAO,EACxD;IACN,+BAAyB;IAAA,YAAmC;IAC9D,AAD8D,iBAAM,EAC9D;;;;IAJuB,eAAoB;IAApB,uCAAoB;IAClB,eAA0B;IAA1B,oDAA0B;IAE9B,eAAmC;IAAnC,6DAAmC;;;IAPhE,8BAA8C;IAC5C,sFAA6D;;IAQ/D,iBAAM;;;IARoC,cAAmB;IAAnB,6DAAmB;;;;IAP7D,AADF,8BAAkE,aACX;IAA3B,kLAAS,uBAAgB,KAAC;IAClD,uBAA4B;IAC5B,4BAAM;IAAA,YAAuC;;IAAA,iBAAO;IACpD,uBAAgF;IAClF,iBAAM;IAEN,gFAA8C;IAUhD,iBAAM;;;IAdI,eAAuC;IAAvC,qFAAuC;IAC9B,eAA4D;IAA5D,iFAA4D;IAGjD,cAAgB;IAAhB,wCAAgB;;AAdlD;;;GAGG;AAkHH,MAAM,OAAO,yBAAyB;IAKhB;IAJpB,MAAM,CAA2B;IACjC,UAAU,CAAqB;IAC/B,UAAU,GAAG,IAAI,CAAC;IAElB,YAAoB,kBAAsC;QAAtC,uBAAkB,GAAlB,kBAAkB,CAAoB;QACxD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;IACvD,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;IACrC,CAAC;IAED,cAAc,CAAC,IAAgB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAE3C,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YACjB,OAAO,GAAG,OAAO,GAAG,CAAC;QACvB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;QACtC,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;mFAjCU,yBAAyB;6DAAzB,yBAAyB;YA9GlC,0EAAkE;;;YAAjC,+DAA+B;;;iFA8GvD,yBAAyB;cAjHrC,SAAS;2BACE,uBAAuB,YACvB;;;;;;;;;;;;;;;;;;;GAmBT;;kFA4FU,yBAAyB"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import { UserInfo } from '@memberjunction/core';
|
|
3
|
+
import { AIAgentRunEntity } from '@memberjunction/core-entities';
|
|
4
|
+
import { AgentStateService, AgentStatus } from '../../services/agent-state.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Displays active agent indicators in the chat header with status animations
|
|
8
|
+
* Shows multiple agents with avatars, status colors, and click-to-expand functionality
|
|
9
|
+
*/
|
|
10
|
+
export declare class ActiveAgentIndicatorComponent implements OnInit, OnDestroy {
|
|
11
|
+
private agentStateService;
|
|
12
|
+
conversationId?: string;
|
|
13
|
+
currentUser: UserInfo;
|
|
14
|
+
maxVisibleAgents: number;
|
|
15
|
+
togglePanel: EventEmitter<void>;
|
|
16
|
+
agentSelected: EventEmitter<AIAgentRunEntity>;
|
|
17
|
+
activeAgents: Array<{
|
|
18
|
+
run: AIAgentRunEntity;
|
|
19
|
+
status: AgentStatus;
|
|
20
|
+
confidence: number | null;
|
|
21
|
+
}>;
|
|
22
|
+
isExpanded: boolean;
|
|
23
|
+
private subscription?;
|
|
24
|
+
constructor(agentStateService: AgentStateService);
|
|
25
|
+
ngOnInit(): void;
|
|
26
|
+
ngOnDestroy(): void;
|
|
27
|
+
get displayAgents(): Array<{
|
|
28
|
+
run: AIAgentRunEntity;
|
|
29
|
+
status: AgentStatus;
|
|
30
|
+
confidence: number | null;
|
|
31
|
+
}>;
|
|
32
|
+
getAgentTooltip(agent: {
|
|
33
|
+
run: AIAgentRunEntity;
|
|
34
|
+
status: AgentStatus;
|
|
35
|
+
confidence: number | null;
|
|
36
|
+
}): string;
|
|
37
|
+
getStatusText(status: AgentStatus): string;
|
|
38
|
+
toggleExpanded(): void;
|
|
39
|
+
onAgentClick(agent: {
|
|
40
|
+
run: AIAgentRunEntity;
|
|
41
|
+
status: AgentStatus;
|
|
42
|
+
confidence: number | null;
|
|
43
|
+
}): void;
|
|
44
|
+
onTogglePanel(): void;
|
|
45
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ActiveAgentIndicatorComponent, never>;
|
|
46
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ActiveAgentIndicatorComponent, "mj-active-agent-indicator", never, { "conversationId": { "alias": "conversationId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "maxVisibleAgents": { "alias": "maxVisibleAgents"; "required": false; }; }, { "togglePanel": "togglePanel"; "agentSelected": "agentSelected"; }, never, never, false, never>;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=active-agent-indicator.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-agent-indicator.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/agent/active-agent-indicator.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;;AAGpF;;;GAGG;AACH,qBA4Oa,6BAA8B,YAAW,MAAM,EAAE,SAAS;IAazD,OAAO,CAAC,iBAAiB;IAZ5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,EAAG,QAAQ,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAK;IAE5B,WAAW,qBAA4B;IACvC,aAAa,iCAAwC;IAExD,YAAY,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAM;IACpG,UAAU,EAAE,OAAO,CAAS;IAEnC,OAAO,CAAC,YAAY,CAAC,CAAe;gBAEhB,iBAAiB,EAAE,iBAAiB;IAExD,QAAQ,IAAI,IAAI;IAShB,WAAW,IAAI,IAAI;IAInB,IAAI,aAAa,IAAI,KAAK,CAAC;QAAE,GAAG,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAKpG;IAED,eAAe,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,MAAM;IAQzG,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;IAW1C,cAAc,IAAI,IAAI;IAItB,YAAY,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI;IAIpG,aAAa,IAAI,IAAI;yCA9DV,6BAA6B;2CAA7B,6BAA6B;CAiEzC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../services/agent-state.service";
|
|
4
|
+
import * as i2 from "@angular/common";
|
|
5
|
+
const _forTrack0 = ($index, $item) => $item.run.ID;
|
|
6
|
+
function ActiveAgentIndicatorComponent_div_0_For_5_div_3_Template(rf, ctx) { if (rf & 1) {
|
|
7
|
+
i0.ɵɵelementStart(0, "div", 14);
|
|
8
|
+
i0.ɵɵelement(1, "div", 15);
|
|
9
|
+
i0.ɵɵelementEnd();
|
|
10
|
+
} }
|
|
11
|
+
function ActiveAgentIndicatorComponent_div_0_For_5_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
12
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
13
|
+
i0.ɵɵtext(1);
|
|
14
|
+
i0.ɵɵelementEnd();
|
|
15
|
+
} if (rf & 2) {
|
|
16
|
+
const agent_r3 = i0.ɵɵnextContext().$implicit;
|
|
17
|
+
i0.ɵɵproperty("title", "Confidence: " + (agent_r3.confidence * 100).toFixed(0) + "%");
|
|
18
|
+
i0.ɵɵadvance();
|
|
19
|
+
i0.ɵɵtextInterpolate1(" ", (agent_r3.confidence * 100).toFixed(0), "% ");
|
|
20
|
+
} }
|
|
21
|
+
function ActiveAgentIndicatorComponent_div_0_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
22
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
23
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
24
|
+
i0.ɵɵlistener("click", function ActiveAgentIndicatorComponent_div_0_For_5_Template_div_click_0_listener() { const agent_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.onAgentClick(agent_r3)); });
|
|
25
|
+
i0.ɵɵelementStart(1, "div", 10);
|
|
26
|
+
i0.ɵɵelement(2, "i", 11);
|
|
27
|
+
i0.ɵɵelementEnd();
|
|
28
|
+
i0.ɵɵtemplate(3, ActiveAgentIndicatorComponent_div_0_For_5_div_3_Template, 2, 0, "div", 12)(4, ActiveAgentIndicatorComponent_div_0_For_5_Conditional_4_Template, 2, 2, "div", 13);
|
|
29
|
+
i0.ɵɵelementEnd();
|
|
30
|
+
} if (rf & 2) {
|
|
31
|
+
const agent_r3 = ctx.$implicit;
|
|
32
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
33
|
+
i0.ɵɵclassProp("status-acknowledging", agent_r3.status === "acknowledging")("status-working", agent_r3.status === "working")("status-completing", agent_r3.status === "completing")("status-completed", agent_r3.status === "completed")("status-error", agent_r3.status === "error");
|
|
34
|
+
i0.ɵɵproperty("title", ctx_r3.getAgentTooltip(agent_r3));
|
|
35
|
+
i0.ɵɵadvance(3);
|
|
36
|
+
i0.ɵɵproperty("ngIf", agent_r3.status !== "completed");
|
|
37
|
+
i0.ɵɵadvance();
|
|
38
|
+
i0.ɵɵconditional(agent_r3.confidence != null ? 4 : -1);
|
|
39
|
+
} }
|
|
40
|
+
function ActiveAgentIndicatorComponent_div_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
41
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
42
|
+
i0.ɵɵelementStart(0, "button", 16);
|
|
43
|
+
i0.ɵɵlistener("click", function ActiveAgentIndicatorComponent_div_0_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.toggleExpanded()); });
|
|
44
|
+
i0.ɵɵtext(1);
|
|
45
|
+
i0.ɵɵelementEnd();
|
|
46
|
+
} if (rf & 2) {
|
|
47
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
48
|
+
i0.ɵɵproperty("title", "Show all " + ctx_r3.activeAgents.length + " agents");
|
|
49
|
+
i0.ɵɵadvance();
|
|
50
|
+
i0.ɵɵtextInterpolate1(" +", ctx_r3.activeAgents.length - ctx_r3.maxVisibleAgents, " ");
|
|
51
|
+
} }
|
|
52
|
+
function ActiveAgentIndicatorComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
53
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
54
|
+
i0.ɵɵelementStart(0, "div", 1)(1, "span", 2);
|
|
55
|
+
i0.ɵɵtext(2, "Active:");
|
|
56
|
+
i0.ɵɵelementEnd();
|
|
57
|
+
i0.ɵɵelementStart(3, "div", 3);
|
|
58
|
+
i0.ɵɵrepeaterCreate(4, ActiveAgentIndicatorComponent_div_0_For_5_Template, 5, 13, "div", 4, _forTrack0);
|
|
59
|
+
i0.ɵɵtemplate(6, ActiveAgentIndicatorComponent_div_0_Conditional_6_Template, 2, 2, "button", 5);
|
|
60
|
+
i0.ɵɵelementEnd();
|
|
61
|
+
i0.ɵɵelementStart(7, "button", 6);
|
|
62
|
+
i0.ɵɵlistener("click", function ActiveAgentIndicatorComponent_div_0_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.onTogglePanel()); });
|
|
63
|
+
i0.ɵɵelement(8, "i", 7);
|
|
64
|
+
i0.ɵɵelementStart(9, "span", 8);
|
|
65
|
+
i0.ɵɵtext(10);
|
|
66
|
+
i0.ɵɵelementEnd()()();
|
|
67
|
+
} if (rf & 2) {
|
|
68
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
69
|
+
i0.ɵɵadvance(3);
|
|
70
|
+
i0.ɵɵclassProp("expanded", ctx_r3.isExpanded);
|
|
71
|
+
i0.ɵɵadvance();
|
|
72
|
+
i0.ɵɵrepeater(ctx_r3.displayAgents);
|
|
73
|
+
i0.ɵɵadvance(2);
|
|
74
|
+
i0.ɵɵconditional(ctx_r3.activeAgents.length > ctx_r3.maxVisibleAgents && !ctx_r3.isExpanded ? 6 : -1);
|
|
75
|
+
i0.ɵɵadvance(4);
|
|
76
|
+
i0.ɵɵtextInterpolate(ctx_r3.activeAgents.length);
|
|
77
|
+
} }
|
|
78
|
+
/**
|
|
79
|
+
* Displays active agent indicators in the chat header with status animations
|
|
80
|
+
* Shows multiple agents with avatars, status colors, and click-to-expand functionality
|
|
81
|
+
*/
|
|
82
|
+
export class ActiveAgentIndicatorComponent {
|
|
83
|
+
agentStateService;
|
|
84
|
+
conversationId;
|
|
85
|
+
currentUser;
|
|
86
|
+
maxVisibleAgents = 3;
|
|
87
|
+
togglePanel = new EventEmitter();
|
|
88
|
+
agentSelected = new EventEmitter();
|
|
89
|
+
activeAgents = [];
|
|
90
|
+
isExpanded = false;
|
|
91
|
+
subscription;
|
|
92
|
+
constructor(agentStateService) {
|
|
93
|
+
this.agentStateService = agentStateService;
|
|
94
|
+
}
|
|
95
|
+
ngOnInit() {
|
|
96
|
+
// Subscribe to active agents for this conversation
|
|
97
|
+
this.subscription = this.agentStateService
|
|
98
|
+
.getActiveAgents(this.conversationId)
|
|
99
|
+
.subscribe(agents => {
|
|
100
|
+
this.activeAgents = agents;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
ngOnDestroy() {
|
|
104
|
+
this.subscription?.unsubscribe();
|
|
105
|
+
}
|
|
106
|
+
get displayAgents() {
|
|
107
|
+
if (this.isExpanded) {
|
|
108
|
+
return this.activeAgents;
|
|
109
|
+
}
|
|
110
|
+
return this.activeAgents.slice(0, this.maxVisibleAgents);
|
|
111
|
+
}
|
|
112
|
+
getAgentTooltip(agent) {
|
|
113
|
+
const statusText = this.getStatusText(agent.status);
|
|
114
|
+
const confidenceText = agent.confidence != null
|
|
115
|
+
? ` (Confidence: ${(agent.confidence * 100).toFixed(0)}%)`
|
|
116
|
+
: '';
|
|
117
|
+
return `${agent.run.Agent || 'Agent'} - ${statusText}${confidenceText}`;
|
|
118
|
+
}
|
|
119
|
+
getStatusText(status) {
|
|
120
|
+
switch (status) {
|
|
121
|
+
case 'acknowledging': return 'Acknowledging request';
|
|
122
|
+
case 'working': return 'Working on task';
|
|
123
|
+
case 'completing': return 'Completing';
|
|
124
|
+
case 'completed': return 'Completed';
|
|
125
|
+
case 'error': return 'Error occurred';
|
|
126
|
+
default: return 'Active';
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
toggleExpanded() {
|
|
130
|
+
this.isExpanded = !this.isExpanded;
|
|
131
|
+
}
|
|
132
|
+
onAgentClick(agent) {
|
|
133
|
+
this.agentSelected.emit(agent.run);
|
|
134
|
+
}
|
|
135
|
+
onTogglePanel() {
|
|
136
|
+
this.togglePanel.emit();
|
|
137
|
+
}
|
|
138
|
+
static ɵfac = function ActiveAgentIndicatorComponent_Factory(t) { return new (t || ActiveAgentIndicatorComponent)(i0.ɵɵdirectiveInject(i1.AgentStateService)); };
|
|
139
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActiveAgentIndicatorComponent, selectors: [["mj-active-agent-indicator"]], inputs: { conversationId: "conversationId", currentUser: "currentUser", maxVisibleAgents: "maxVisibleAgents" }, outputs: { togglePanel: "togglePanel", agentSelected: "agentSelected" }, decls: 1, vars: 1, consts: [["class", "active-agents-container", 4, "ngIf"], [1, "active-agents-container"], [1, "active-agents-label"], [1, "agents-wrapper"], [1, "agent-avatar", 3, "status-acknowledging", "status-working", "status-completing", "status-completed", "status-error", "title"], [1, "more-agents", 3, "title"], ["title", "Open agent process panel", 1, "panel-toggle", 3, "click"], [1, "fas", "fa-chart-line"], [1, "agent-count"], [1, "agent-avatar", 3, "click", "title"], [1, "avatar-content"], [1, "fas", "fa-robot"], ["class", "status-indicator", 4, "ngIf"], [1, "confidence-badge", 3, "title"], [1, "status-indicator"], [1, "pulse-ring"], [1, "more-agents", 3, "click", "title"]], template: function ActiveAgentIndicatorComponent_Template(rf, ctx) { if (rf & 1) {
|
|
140
|
+
i0.ɵɵtemplate(0, ActiveAgentIndicatorComponent_div_0_Template, 11, 4, "div", 0);
|
|
141
|
+
} if (rf & 2) {
|
|
142
|
+
i0.ɵɵproperty("ngIf", ctx.activeAgents.length > 0);
|
|
143
|
+
} }, dependencies: [i2.NgIf], styles: [".active-agents-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background-color: #F4F4F4;\n border-radius: 20px;\n font-size: 12px;\n color: #6B7280;\n height: 32px;\n }\n\n .active-agents-label[_ngcontent-%COMP%] {\n font-weight: 500;\n color: #6B7280;\n }\n\n .agents-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n max-width: 200px;\n overflow: hidden;\n transition: max-width 300ms ease;\n }\n\n .agents-wrapper.expanded[_ngcontent-%COMP%] {\n max-width: 600px;\n }\n\n .agent-avatar[_ngcontent-%COMP%] {\n position: relative;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 200ms ease;\n flex-shrink: 0;\n font-size: 10px;\n font-weight: 600;\n }\n\n .agent-avatar[_ngcontent-%COMP%]:hover {\n transform: scale(1.1);\n }\n\n .avatar-content[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: white;\n position: relative;\n z-index: 1;\n }\n\n \n\n .status-acknowledging[_ngcontent-%COMP%] .avatar-content[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #3B82F6, #2563EB);\n }\n\n .status-working[_ngcontent-%COMP%] .avatar-content[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #F59E0B, #D97706);\n }\n\n .status-completing[_ngcontent-%COMP%] .avatar-content[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #10B981, #059669);\n }\n\n .status-completed[_ngcontent-%COMP%] .avatar-content[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #6B7280, #4B5563);\n opacity: 0.6;\n }\n\n .status-error[_ngcontent-%COMP%] .avatar-content[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #EF4444, #DC2626);\n }\n\n \n\n .status-indicator[_ngcontent-%COMP%] {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 10px;\n height: 10px;\n z-index: 2;\n }\n\n .pulse-ring[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background: currentColor;\n animation: _ngcontent-%COMP%_pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n .status-acknowledging[_ngcontent-%COMP%] .pulse-ring[_ngcontent-%COMP%] {\n background: #3B82F6;\n }\n\n .status-working[_ngcontent-%COMP%] .pulse-ring[_ngcontent-%COMP%] {\n background: #F59E0B;\n animation: _ngcontent-%COMP%_pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n .status-completing[_ngcontent-%COMP%] .pulse-ring[_ngcontent-%COMP%] {\n background: #10B981;\n animation: _ngcontent-%COMP%_pulse 1s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: scale(1.5);\n }\n }\n\n \n\n .confidence-badge[_ngcontent-%COMP%] {\n position: absolute;\n bottom: -4px;\n right: -4px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 4px;\n padding: 1px 3px;\n font-size: 9px;\n font-weight: 600;\n color: #374151;\n z-index: 3;\n line-height: 1;\n }\n\n .more-agents[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: #E5E7EB;\n border: none;\n color: #6B7280;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: all 200ms ease;\n flex-shrink: 0;\n }\n\n .more-agents[_ngcontent-%COMP%]:hover {\n background: #D1D5DB;\n transform: scale(1.05);\n }\n\n .panel-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 10px;\n background: #3B82F6;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 12px;\n cursor: pointer;\n transition: all 200ms ease;\n position: relative;\n }\n\n .panel-toggle[_ngcontent-%COMP%]:hover {\n background: #2563EB;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);\n }\n\n .agent-count[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.2);\n padding: 2px 6px;\n border-radius: 10px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }"] });
|
|
144
|
+
}
|
|
145
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActiveAgentIndicatorComponent, [{
|
|
146
|
+
type: Component,
|
|
147
|
+
args: [{ selector: 'mj-active-agent-indicator', template: `
|
|
148
|
+
<div class="active-agents-container" *ngIf="activeAgents.length > 0">
|
|
149
|
+
<span class="active-agents-label">Active:</span>
|
|
150
|
+
<div class="agents-wrapper" [class.expanded]="isExpanded">
|
|
151
|
+
@for (agent of displayAgents; track agent.run.ID) {
|
|
152
|
+
<div class="agent-avatar"
|
|
153
|
+
[class.status-acknowledging]="agent.status === 'acknowledging'"
|
|
154
|
+
[class.status-working]="agent.status === 'working'"
|
|
155
|
+
[class.status-completing]="agent.status === 'completing'"
|
|
156
|
+
[class.status-completed]="agent.status === 'completed'"
|
|
157
|
+
[class.status-error]="agent.status === 'error'"
|
|
158
|
+
[title]="getAgentTooltip(agent)"
|
|
159
|
+
(click)="onAgentClick(agent)">
|
|
160
|
+
<div class="avatar-content">
|
|
161
|
+
<i class="fas fa-robot"></i>
|
|
162
|
+
</div>
|
|
163
|
+
<div class="status-indicator" *ngIf="agent.status !== 'completed'">
|
|
164
|
+
<div class="pulse-ring"></div>
|
|
165
|
+
</div>
|
|
166
|
+
@if (agent.confidence != null) {
|
|
167
|
+
<div class="confidence-badge" [title]="'Confidence: ' + (agent.confidence * 100).toFixed(0) + '%'">
|
|
168
|
+
{{ (agent.confidence * 100).toFixed(0) }}%
|
|
169
|
+
</div>
|
|
170
|
+
}
|
|
171
|
+
</div>
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@if (activeAgents.length > maxVisibleAgents && !isExpanded) {
|
|
175
|
+
<button class="more-agents" (click)="toggleExpanded()" [title]="'Show all ' + activeAgents.length + ' agents'">
|
|
176
|
+
+{{ activeAgents.length - maxVisibleAgents }}
|
|
177
|
+
</button>
|
|
178
|
+
}
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<button class="panel-toggle" (click)="onTogglePanel()" title="Open agent process panel">
|
|
182
|
+
<i class="fas fa-chart-line"></i>
|
|
183
|
+
<span class="agent-count">{{ activeAgents.length }}</span>
|
|
184
|
+
</button>
|
|
185
|
+
</div>
|
|
186
|
+
`, styles: ["\n .active-agents-container {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background-color: #F4F4F4;\n border-radius: 20px;\n font-size: 12px;\n color: #6B7280;\n height: 32px;\n }\n\n .active-agents-label {\n font-weight: 500;\n color: #6B7280;\n }\n\n .agents-wrapper {\n display: flex;\n align-items: center;\n gap: 6px;\n max-width: 200px;\n overflow: hidden;\n transition: max-width 300ms ease;\n }\n\n .agents-wrapper.expanded {\n max-width: 600px;\n }\n\n .agent-avatar {\n position: relative;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 200ms ease;\n flex-shrink: 0;\n font-size: 10px;\n font-weight: 600;\n }\n\n .agent-avatar:hover {\n transform: scale(1.1);\n }\n\n .avatar-content {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 14px;\n color: white;\n position: relative;\n z-index: 1;\n }\n\n /* Status-based colors */\n .status-acknowledging .avatar-content {\n background: linear-gradient(135deg, #3B82F6, #2563EB);\n }\n\n .status-working .avatar-content {\n background: linear-gradient(135deg, #F59E0B, #D97706);\n }\n\n .status-completing .avatar-content {\n background: linear-gradient(135deg, #10B981, #059669);\n }\n\n .status-completed .avatar-content {\n background: linear-gradient(135deg, #6B7280, #4B5563);\n opacity: 0.6;\n }\n\n .status-error .avatar-content {\n background: linear-gradient(135deg, #EF4444, #DC2626);\n }\n\n /* Animated status indicator */\n .status-indicator {\n position: absolute;\n top: -2px;\n right: -2px;\n width: 10px;\n height: 10px;\n z-index: 2;\n }\n\n .pulse-ring {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n background: currentColor;\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n .status-acknowledging .pulse-ring {\n background: #3B82F6;\n }\n\n .status-working .pulse-ring {\n background: #F59E0B;\n animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n .status-completing .pulse-ring {\n background: #10B981;\n animation: pulse 1s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n }\n\n @keyframes pulse {\n 0%, 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: scale(1.5);\n }\n }\n\n /* Confidence badge */\n .confidence-badge {\n position: absolute;\n bottom: -4px;\n right: -4px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 4px;\n padding: 1px 3px;\n font-size: 9px;\n font-weight: 600;\n color: #374151;\n z-index: 3;\n line-height: 1;\n }\n\n .more-agents {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: #E5E7EB;\n border: none;\n color: #6B7280;\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: all 200ms ease;\n flex-shrink: 0;\n }\n\n .more-agents:hover {\n background: #D1D5DB;\n transform: scale(1.05);\n }\n\n .panel-toggle {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 10px;\n background: #3B82F6;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 12px;\n cursor: pointer;\n transition: all 200ms ease;\n position: relative;\n }\n\n .panel-toggle:hover {\n background: #2563EB;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);\n }\n\n .agent-count {\n background: rgba(255, 255, 255, 0.2);\n padding: 2px 6px;\n border-radius: 10px;\n font-weight: 600;\n min-width: 20px;\n text-align: center;\n }\n "] }]
|
|
187
|
+
}], () => [{ type: i1.AgentStateService }], { conversationId: [{
|
|
188
|
+
type: Input
|
|
189
|
+
}], currentUser: [{
|
|
190
|
+
type: Input
|
|
191
|
+
}], maxVisibleAgents: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], togglePanel: [{
|
|
194
|
+
type: Output
|
|
195
|
+
}], agentSelected: [{
|
|
196
|
+
type: Output
|
|
197
|
+
}] }); })();
|
|
198
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActiveAgentIndicatorComponent, { className: "ActiveAgentIndicatorComponent", filePath: "src/lib/components/agent/active-agent-indicator.component.ts", lineNumber: 247 }); })();
|
|
199
|
+
//# sourceMappingURL=active-agent-indicator.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"active-agent-indicator.component.js","sourceRoot":"","sources":["../../../../src/lib/components/agent/active-agent-indicator.component.ts"],"names":[],"mappings":"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"}
|