@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.
Files changed (226) hide show
  1. package/README.md +197 -0
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +20 -0
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -0
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +125 -0
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -0
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +48 -0
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -0
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +199 -0
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -0
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +30 -0
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -0
  12. package/dist/lib/components/agent/agent-process-panel.component.js +333 -0
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -0
  14. package/dist/lib/components/artifact/artifact-panel.component.d.ts +22 -0
  15. package/dist/lib/components/artifact/artifact-panel.component.d.ts.map +1 -0
  16. package/dist/lib/components/artifact/artifact-panel.component.js +237 -0
  17. package/dist/lib/components/artifact/artifact-panel.component.js.map +1 -0
  18. package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts +39 -0
  19. package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts.map +1 -0
  20. package/dist/lib/components/artifact/artifact-upload-modal.component.js +384 -0
  21. package/dist/lib/components/artifact/artifact-upload-modal.component.js.map +1 -0
  22. package/dist/lib/components/artifact/artifact-version-history.component.d.ts +28 -0
  23. package/dist/lib/components/artifact/artifact-version-history.component.d.ts.map +1 -0
  24. package/dist/lib/components/artifact/artifact-version-history.component.js +280 -0
  25. package/dist/lib/components/artifact/artifact-version-history.component.js.map +1 -0
  26. package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts +22 -0
  27. package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts.map +1 -0
  28. package/dist/lib/components/artifact/artifact-viewer-panel.component.js +182 -0
  29. package/dist/lib/components/artifact/artifact-viewer-panel.component.js.map +1 -0
  30. package/dist/lib/components/artifact/artifact-viewer.component.d.ts +27 -0
  31. package/dist/lib/components/artifact/artifact-viewer.component.d.ts.map +1 -0
  32. package/dist/lib/components/artifact/artifact-viewer.component.js +266 -0
  33. package/dist/lib/components/artifact/artifact-viewer.component.js.map +1 -0
  34. package/dist/lib/components/artifact/inline-artifact.component.d.ts +46 -0
  35. package/dist/lib/components/artifact/inline-artifact.component.d.ts.map +1 -0
  36. package/dist/lib/components/artifact/inline-artifact.component.js +447 -0
  37. package/dist/lib/components/artifact/inline-artifact.component.js.map +1 -0
  38. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +18 -0
  39. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -0
  40. package/dist/lib/components/collection/collection-artifact-card.component.js +147 -0
  41. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -0
  42. package/dist/lib/components/collection/collection-form-modal.component.d.ts +33 -0
  43. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -0
  44. package/dist/lib/components/collection/collection-form-modal.component.js +245 -0
  45. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -0
  46. package/dist/lib/components/collection/collection-tree.component.d.ts +42 -0
  47. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -0
  48. package/dist/lib/components/collection/collection-tree.component.js +482 -0
  49. package/dist/lib/components/collection/collection-tree.component.js.map +1 -0
  50. package/dist/lib/components/collection/collection-view.component.d.ts +31 -0
  51. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -0
  52. package/dist/lib/components/collection/collection-view.component.js +254 -0
  53. package/dist/lib/components/collection/collection-view.component.js.map +1 -0
  54. package/dist/lib/components/collection/collections-full-view.component.d.ts +55 -0
  55. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -0
  56. package/dist/lib/components/collection/collections-full-view.component.js +578 -0
  57. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -0
  58. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +160 -0
  59. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -0
  60. package/dist/lib/components/conversation/conversation-chat-area.component.js +891 -0
  61. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -0
  62. package/dist/lib/components/conversation/conversation-list.component.d.ts +29 -0
  63. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -0
  64. package/dist/lib/components/conversation/conversation-list.component.js +255 -0
  65. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -0
  66. package/dist/lib/components/dialogs/input-dialog.component.d.ts +17 -0
  67. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -0
  68. package/dist/lib/components/dialogs/input-dialog.component.js +122 -0
  69. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -0
  70. package/dist/lib/components/export/export-modal.component.d.ts +37 -0
  71. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -0
  72. package/dist/lib/components/export/export-modal.component.js +414 -0
  73. package/dist/lib/components/export/export-modal.component.js.map +1 -0
  74. package/dist/lib/components/library/library-full-view.component.d.ts +36 -0
  75. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -0
  76. package/dist/lib/components/library/library-full-view.component.js +270 -0
  77. package/dist/lib/components/library/library-full-view.component.js.map +1 -0
  78. package/dist/lib/components/members/members-modal.component.d.ts +42 -0
  79. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -0
  80. package/dist/lib/components/members/members-modal.component.js +352 -0
  81. package/dist/lib/components/members/members-modal.component.js.map +1 -0
  82. package/dist/lib/components/mention/mention-dropdown.component.d.ts +44 -0
  83. package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +1 -0
  84. package/dist/lib/components/mention/mention-dropdown.component.js +194 -0
  85. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -0
  86. package/dist/lib/components/message/message-input.component.d.ts +137 -0
  87. package/dist/lib/components/message/message-input.component.d.ts.map +1 -0
  88. package/dist/lib/components/message/message-input.component.js +1159 -0
  89. package/dist/lib/components/message/message-input.component.js.map +1 -0
  90. package/dist/lib/components/message/message-item.component.d.ts +140 -0
  91. package/dist/lib/components/message/message-item.component.d.ts.map +1 -0
  92. package/dist/lib/components/message/message-item.component.js +817 -0
  93. package/dist/lib/components/message/message-item.component.js.map +1 -0
  94. package/dist/lib/components/message/message-list.component.d.ts +77 -0
  95. package/dist/lib/components/message/message-list.component.d.ts.map +1 -0
  96. package/dist/lib/components/message/message-list.component.js +316 -0
  97. package/dist/lib/components/message/message-list.component.js.map +1 -0
  98. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +13 -0
  99. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -0
  100. package/dist/lib/components/navigation/conversation-navigation.component.js +88 -0
  101. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -0
  102. package/dist/lib/components/notification/activity-indicator.component.d.ts +11 -0
  103. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -0
  104. package/dist/lib/components/notification/activity-indicator.component.js +56 -0
  105. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -0
  106. package/dist/lib/components/notification/notification-badge.component.d.ts +27 -0
  107. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -0
  108. package/dist/lib/components/notification/notification-badge.component.js +160 -0
  109. package/dist/lib/components/notification/notification-badge.component.js.map +1 -0
  110. package/dist/lib/components/project/project-form-modal.component.d.ts +34 -0
  111. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -0
  112. package/dist/lib/components/project/project-form-modal.component.js +357 -0
  113. package/dist/lib/components/project/project-form-modal.component.js.map +1 -0
  114. package/dist/lib/components/project/project-selector.component.d.ts +36 -0
  115. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -0
  116. package/dist/lib/components/project/project-selector.component.js +317 -0
  117. package/dist/lib/components/project/project-selector.component.js.map +1 -0
  118. package/dist/lib/components/search/search-panel.component.d.ts +120 -0
  119. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -0
  120. package/dist/lib/components/search/search-panel.component.js +714 -0
  121. package/dist/lib/components/search/search-panel.component.js.map +1 -0
  122. package/dist/lib/components/share/share-modal.component.d.ts +46 -0
  123. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -0
  124. package/dist/lib/components/share/share-modal.component.js +431 -0
  125. package/dist/lib/components/share/share-modal.component.js.map +1 -0
  126. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +18 -0
  127. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -0
  128. package/dist/lib/components/sidebar/conversation-sidebar.component.js +81 -0
  129. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -0
  130. package/dist/lib/components/task/task-form-modal.component.d.ts +42 -0
  131. package/dist/lib/components/task/task-form-modal.component.d.ts.map +1 -0
  132. package/dist/lib/components/task/task-form-modal.component.js +329 -0
  133. package/dist/lib/components/task/task-form-modal.component.js.map +1 -0
  134. package/dist/lib/components/task/task-item.component.d.ts +22 -0
  135. package/dist/lib/components/task/task-item.component.d.ts.map +1 -0
  136. package/dist/lib/components/task/task-item.component.js +234 -0
  137. package/dist/lib/components/task/task-item.component.js.map +1 -0
  138. package/dist/lib/components/task/task-list.component.d.ts +32 -0
  139. package/dist/lib/components/task/task-list.component.d.ts.map +1 -0
  140. package/dist/lib/components/task/task-list.component.js +290 -0
  141. package/dist/lib/components/task/task-list.component.js.map +1 -0
  142. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +27 -0
  143. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -0
  144. package/dist/lib/components/tasks/tasks-dropdown.component.js +254 -0
  145. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -0
  146. package/dist/lib/components/thread/thread-panel.component.d.ts +65 -0
  147. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -0
  148. package/dist/lib/components/thread/thread-panel.component.js +325 -0
  149. package/dist/lib/components/thread/thread-panel.component.js.map +1 -0
  150. package/dist/lib/components/toast/toast.component.d.ts +26 -0
  151. package/dist/lib/components/toast/toast.component.d.ts.map +1 -0
  152. package/dist/lib/components/toast/toast.component.js +108 -0
  153. package/dist/lib/components/toast/toast.component.js.map +1 -0
  154. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +75 -0
  155. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -0
  156. package/dist/lib/components/workspace/conversation-workspace.component.js +299 -0
  157. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -0
  158. package/dist/lib/conversations.module.d.ts +62 -0
  159. package/dist/lib/conversations.module.d.ts.map +1 -0
  160. package/dist/lib/conversations.module.js +248 -0
  161. package/dist/lib/conversations.module.js.map +1 -0
  162. package/dist/lib/directives/search-shortcut.directive.d.ts +17 -0
  163. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -0
  164. package/dist/lib/directives/search-shortcut.directive.js +39 -0
  165. package/dist/lib/directives/search-shortcut.directive.js.map +1 -0
  166. package/dist/lib/models/conversation-state.model.d.ts +72 -0
  167. package/dist/lib/models/conversation-state.model.d.ts.map +1 -0
  168. package/dist/lib/models/conversation-state.model.js +2 -0
  169. package/dist/lib/models/conversation-state.model.js.map +1 -0
  170. package/dist/lib/models/notification.model.d.ts +89 -0
  171. package/dist/lib/models/notification.model.d.ts.map +1 -0
  172. package/dist/lib/models/notification.model.js +11 -0
  173. package/dist/lib/models/notification.model.js.map +1 -0
  174. package/dist/lib/services/active-tasks.service.d.ts +65 -0
  175. package/dist/lib/services/active-tasks.service.d.ts.map +1 -0
  176. package/dist/lib/services/active-tasks.service.js +95 -0
  177. package/dist/lib/services/active-tasks.service.js.map +1 -0
  178. package/dist/lib/services/agent-state.service.d.ts +78 -0
  179. package/dist/lib/services/agent-state.service.d.ts.map +1 -0
  180. package/dist/lib/services/agent-state.service.js +213 -0
  181. package/dist/lib/services/agent-state.service.js.map +1 -0
  182. package/dist/lib/services/artifact-state.service.d.ts +114 -0
  183. package/dist/lib/services/artifact-state.service.d.ts.map +1 -0
  184. package/dist/lib/services/artifact-state.service.js +288 -0
  185. package/dist/lib/services/artifact-state.service.js.map +1 -0
  186. package/dist/lib/services/conversation-agent.service.d.ts +79 -0
  187. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -0
  188. package/dist/lib/services/conversation-agent.service.js +259 -0
  189. package/dist/lib/services/conversation-agent.service.js.map +1 -0
  190. package/dist/lib/services/conversation-state.service.d.ts +122 -0
  191. package/dist/lib/services/conversation-state.service.d.ts.map +1 -0
  192. package/dist/lib/services/conversation-state.service.js +255 -0
  193. package/dist/lib/services/conversation-state.service.js.map +1 -0
  194. package/dist/lib/services/dialog.service.d.ts +54 -0
  195. package/dist/lib/services/dialog.service.d.ts.map +1 -0
  196. package/dist/lib/services/dialog.service.js +157 -0
  197. package/dist/lib/services/dialog.service.js.map +1 -0
  198. package/dist/lib/services/export.service.d.ts +25 -0
  199. package/dist/lib/services/export.service.d.ts.map +1 -0
  200. package/dist/lib/services/export.service.js +237 -0
  201. package/dist/lib/services/export.service.js.map +1 -0
  202. package/dist/lib/services/mention-autocomplete.service.d.ts +59 -0
  203. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -0
  204. package/dist/lib/services/mention-autocomplete.service.js +160 -0
  205. package/dist/lib/services/mention-autocomplete.service.js.map +1 -0
  206. package/dist/lib/services/mention-parser.service.d.ts +46 -0
  207. package/dist/lib/services/mention-parser.service.d.ts.map +1 -0
  208. package/dist/lib/services/mention-parser.service.js +156 -0
  209. package/dist/lib/services/mention-parser.service.js.map +1 -0
  210. package/dist/lib/services/notification.service.d.ts +108 -0
  211. package/dist/lib/services/notification.service.d.ts.map +1 -0
  212. package/dist/lib/services/notification.service.js +431 -0
  213. package/dist/lib/services/notification.service.js.map +1 -0
  214. package/dist/lib/services/search.service.d.ts +144 -0
  215. package/dist/lib/services/search.service.d.ts.map +1 -0
  216. package/dist/lib/services/search.service.js +370 -0
  217. package/dist/lib/services/search.service.js.map +1 -0
  218. package/dist/lib/services/toast.service.d.ts +46 -0
  219. package/dist/lib/services/toast.service.d.ts.map +1 -0
  220. package/dist/lib/services/toast.service.js +76 -0
  221. package/dist/lib/services/toast.service.js.map +1 -0
  222. package/dist/public-api.d.ts +42 -0
  223. package/dist/public-api.d.ts.map +1 -0
  224. package/dist/public-api.js +49 -0
  225. package/dist/public-api.js.map +1 -0
  226. 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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"}