@memberjunction/ng-conversations 2.112.0 → 2.113.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 (205) hide show
  1. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +1 -1
  2. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  3. package/dist/lib/components/agent/active-agent-indicator.component.js +13 -15
  4. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  5. package/dist/lib/components/agent/agent-process-panel.component.d.ts +1 -1
  6. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  7. package/dist/lib/components/agent/agent-process-panel.component.js +14 -18
  8. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  9. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +1 -1
  10. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  11. package/dist/lib/components/artifact/artifact-share-modal.component.js +11 -11
  12. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  13. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +1 -1
  14. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  15. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +30 -24
  16. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  17. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +1 -1
  18. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  19. package/dist/lib/components/collection/artifact-create-modal.component.js +10 -8
  20. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  21. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +9 -8
  22. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  23. package/dist/lib/components/collection/collection-artifact-card.component.js +51 -35
  24. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  25. package/dist/lib/components/collection/collection-form-modal.component.d.ts +1 -1
  26. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  27. package/dist/lib/components/collection/collection-form-modal.component.js +6 -5
  28. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  29. package/dist/lib/components/collection/collection-share-modal.component.d.ts +1 -1
  30. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  31. package/dist/lib/components/collection/collection-share-modal.component.js +12 -12
  32. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  33. package/dist/lib/components/collection/collection-tree.component.d.ts +1 -1
  34. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  35. package/dist/lib/components/collection/collection-tree.component.js +11 -11
  36. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  37. package/dist/lib/components/collection/collection-view.component.d.ts +29 -10
  38. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  39. package/dist/lib/components/collection/collection-view.component.js +128 -62
  40. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  41. package/dist/lib/components/collection/collections-full-view.component.d.ts +19 -7
  42. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  43. package/dist/lib/components/collection/collections-full-view.component.js +99 -69
  44. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  45. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +38 -1
  46. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  47. package/dist/lib/components/conversation/conversation-chat-area.component.js +303 -181
  48. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  49. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +1 -1
  50. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  51. package/dist/lib/components/conversation/conversation-empty-state.component.js +21 -21
  52. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  53. package/dist/lib/components/conversation/conversation-list.component.d.ts +11 -4
  54. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  55. package/dist/lib/components/conversation/conversation-list.component.js +122 -81
  56. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  57. package/dist/lib/components/export/export-modal.component.d.ts +1 -1
  58. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  59. package/dist/lib/components/export/export-modal.component.js +11 -9
  60. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  61. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +25 -0
  62. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -0
  63. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +206 -0
  64. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -0
  65. package/dist/lib/components/library/library-full-view.component.d.ts +1 -1
  66. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  67. package/dist/lib/components/library/library-full-view.component.js +6 -5
  68. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  69. package/dist/lib/components/members/members-modal.component.d.ts +1 -1
  70. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  71. package/dist/lib/components/members/members-modal.component.js +8 -8
  72. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  73. package/dist/lib/components/message/conversation-message-rating.component.d.ts +47 -0
  74. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -0
  75. package/dist/lib/components/message/conversation-message-rating.component.js +224 -0
  76. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -0
  77. package/dist/lib/components/message/message-input-box.component.d.ts +1 -1
  78. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  79. package/dist/lib/components/message/message-input-box.component.js +4 -14
  80. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  81. package/dist/lib/components/message/message-input.component.d.ts +18 -3
  82. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  83. package/dist/lib/components/message/message-input.component.js +288 -297
  84. package/dist/lib/components/message/message-input.component.js.map +1 -1
  85. package/dist/lib/components/message/message-item.component.d.ts +32 -2
  86. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  87. package/dist/lib/components/message/message-item.component.js +253 -129
  88. package/dist/lib/components/message/message-item.component.js.map +1 -1
  89. package/dist/lib/components/message/message-list.component.d.ts +4 -2
  90. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  91. package/dist/lib/components/message/message-list.component.js +35 -18
  92. package/dist/lib/components/message/message-list.component.js.map +1 -1
  93. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +7 -1
  94. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  95. package/dist/lib/components/navigation/conversation-navigation.component.js +24 -14
  96. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  97. package/dist/lib/components/project/project-form-modal.component.d.ts +1 -1
  98. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  99. package/dist/lib/components/project/project-form-modal.component.js +7 -7
  100. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  101. package/dist/lib/components/project/project-selector.component.d.ts +1 -1
  102. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  103. package/dist/lib/components/project/project-selector.component.js +10 -10
  104. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  105. package/dist/lib/components/search/search-panel.component.d.ts +1 -1
  106. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  107. package/dist/lib/components/search/search-panel.component.js +16 -8
  108. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  109. package/dist/lib/components/share/share-modal.component.d.ts +1 -1
  110. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  111. package/dist/lib/components/share/share-modal.component.js +12 -12
  112. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  113. package/dist/lib/components/shared/user-picker.component.d.ts +1 -1
  114. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  115. package/dist/lib/components/shared/user-picker.component.js +7 -7
  116. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  117. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +1 -1
  118. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  119. package/dist/lib/components/sidebar/conversation-sidebar.component.js +1 -1
  120. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  121. package/dist/lib/components/task/tasks-full-view.component.d.ts +1 -1
  122. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  123. package/dist/lib/components/task/tasks-full-view.component.js +20 -18
  124. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  125. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +18 -29
  126. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  127. package/dist/lib/components/tasks/tasks-dropdown.component.js +178 -218
  128. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  129. package/dist/lib/components/thread/thread-panel.component.d.ts +1 -1
  130. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  131. package/dist/lib/components/thread/thread-panel.component.js +2 -2
  132. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  133. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +15 -9
  134. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  135. package/dist/lib/components/workspace/conversation-workspace.component.js +126 -79
  136. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  137. package/dist/lib/conversations.module.d.ts +54 -52
  138. package/dist/lib/conversations.module.d.ts.map +1 -1
  139. package/dist/lib/conversations.module.js +11 -3
  140. package/dist/lib/conversations.module.js.map +1 -1
  141. package/dist/lib/models/conversation-complete-query.model.d.ts +31 -22
  142. package/dist/lib/models/conversation-complete-query.model.d.ts.map +1 -1
  143. package/dist/lib/models/conversation-complete-query.model.js +5 -2
  144. package/dist/lib/models/conversation-complete-query.model.js.map +1 -1
  145. package/dist/lib/models/lazy-artifact-info.d.ts +4 -1
  146. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  147. package/dist/lib/models/lazy-artifact-info.js +12 -4
  148. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  149. package/dist/lib/services/active-tasks.service.d.ts +18 -0
  150. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  151. package/dist/lib/services/active-tasks.service.js +53 -3
  152. package/dist/lib/services/active-tasks.service.js.map +1 -1
  153. package/dist/lib/services/agent-state.service.d.ts +1 -1
  154. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  155. package/dist/lib/services/agent-state.service.js +11 -11
  156. package/dist/lib/services/agent-state.service.js.map +1 -1
  157. package/dist/lib/services/artifact-permission.service.d.ts +1 -1
  158. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  159. package/dist/lib/services/artifact-permission.service.js +15 -13
  160. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  161. package/dist/lib/services/artifact-state.service.d.ts +23 -6
  162. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  163. package/dist/lib/services/artifact-state.service.js +129 -38
  164. package/dist/lib/services/artifact-state.service.js.map +1 -1
  165. package/dist/lib/services/artifact-use-tracking.service.d.ts +35 -0
  166. package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -0
  167. package/dist/lib/services/artifact-use-tracking.service.js +76 -0
  168. package/dist/lib/services/artifact-use-tracking.service.js.map +1 -0
  169. package/dist/lib/services/collection-permission.service.d.ts +1 -1
  170. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  171. package/dist/lib/services/collection-permission.service.js +13 -13
  172. package/dist/lib/services/collection-permission.service.js.map +1 -1
  173. package/dist/lib/services/conversation-agent.service.d.ts +30 -3
  174. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  175. package/dist/lib/services/conversation-agent.service.js +127 -34
  176. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  177. package/dist/lib/services/conversation-state.service.d.ts +14 -1
  178. package/dist/lib/services/conversation-state.service.d.ts.map +1 -1
  179. package/dist/lib/services/conversation-state.service.js +36 -9
  180. package/dist/lib/services/conversation-state.service.js.map +1 -1
  181. package/dist/lib/services/data-cache.service.d.ts +1 -1
  182. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  183. package/dist/lib/services/data-cache.service.js +13 -13
  184. package/dist/lib/services/data-cache.service.js.map +1 -1
  185. package/dist/lib/services/export.service.d.ts +1 -1
  186. package/dist/lib/services/export.service.d.ts.map +1 -1
  187. package/dist/lib/services/export.service.js +13 -15
  188. package/dist/lib/services/export.service.js.map +1 -1
  189. package/dist/lib/services/mention-autocomplete.service.d.ts +1 -1
  190. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  191. package/dist/lib/services/mention-autocomplete.service.js +5 -5
  192. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  193. package/dist/lib/services/mention-parser.service.d.ts +1 -1
  194. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  195. package/dist/lib/services/mention-parser.service.js +16 -13
  196. package/dist/lib/services/mention-parser.service.js.map +1 -1
  197. package/dist/lib/services/search.service.d.ts +1 -1
  198. package/dist/lib/services/search.service.d.ts.map +1 -1
  199. package/dist/lib/services/search.service.js +32 -26
  200. package/dist/lib/services/search.service.js.map +1 -1
  201. package/dist/public-api.d.ts +3 -0
  202. package/dist/public-api.d.ts.map +1 -1
  203. package/dist/public-api.js +3 -0
  204. package/dist/public-api.js.map +1 -1
  205. package/package.json +14 -13
@@ -1,5 +1,5 @@
1
- import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
2
- import { RunQuery, Metadata } from '@memberjunction/global';
1
+ import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { RunQuery, Metadata, LogStatusEx } from '@memberjunction/core';
3
3
  import { LazyArtifactInfo } from '../../models/lazy-artifact-info';
4
4
  import { parseConversationDetailComplete } from '../../models/conversation-complete-query.model';
5
5
  import { ArtifactViewerPanelComponent } from '@memberjunction/ng-artifacts';
@@ -20,19 +20,20 @@ import * as i12 from "../message/message-input.component";
20
20
  import * as i13 from "./conversation-empty-state.component";
21
21
  import * as i14 from "../thread/thread-panel.component";
22
22
  import * as i15 from "../project/project-selector.component";
23
- import * as i16 from "../tasks/tasks-dropdown.component";
24
- import * as i17 from "../agent/active-agent-indicator.component";
25
- import * as i18 from "../members/members-modal.component";
26
- import * as i19 from "../export/export-modal.component";
23
+ import * as i16 from "../agent/active-agent-indicator.component";
24
+ import * as i17 from "../members/members-modal.component";
25
+ import * as i18 from "../export/export-modal.component";
27
26
  const _c0 = ["scrollContainer"];
28
27
  const _c1 = ["messageInput"];
29
- const _forTrack0 = ($index, $item) => $item.artifactId;
30
- const _forTrack1 = ($index, $item) => $item.versionId;
28
+ const _forTrack0 = ($index, $item) => $item.conversationId;
29
+ const _forTrack1 = ($index, $item) => $item.artifactId;
30
+ const _forTrack2 = ($index, $item) => $item.versionId;
31
+ const _c2 = () => [];
31
32
  function ConversationChatAreaComponent_div_1_button_4_Template(rf, ctx) { if (rf & 1) {
32
33
  const _r2 = i0.ɵɵgetCurrentView();
33
- i0.ɵɵelementStart(0, "button", 29);
34
+ i0.ɵɵelementStart(0, "button", 28);
34
35
  i0.ɵɵlistener("click", function ConversationChatAreaComponent_div_1_button_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openProjectSelector()); });
35
- i0.ɵɵelement(1, "i", 30);
36
+ i0.ɵɵelement(1, "i", 29);
36
37
  i0.ɵɵelementStart(2, "span");
37
38
  i0.ɵɵtext(3);
38
39
  i0.ɵɵelementEnd()();
@@ -43,9 +44,9 @@ function ConversationChatAreaComponent_div_1_button_4_Template(rf, ctx) { if (rf
43
44
  } }
44
45
  function ConversationChatAreaComponent_div_1_button_9_Template(rf, ctx) { if (rf & 1) {
45
46
  const _r5 = i0.ɵɵgetCurrentView();
46
- i0.ɵɵelementStart(0, "button", 31);
47
+ i0.ɵɵelementStart(0, "button", 30);
47
48
  i0.ɵɵlistener("click", function ConversationChatAreaComponent_div_1_button_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.viewArtifacts()); });
48
- i0.ɵɵelement(1, "i", 32);
49
+ i0.ɵɵelement(1, "i", 31);
49
50
  i0.ɵɵelementStart(2, "span");
50
51
  i0.ɵɵtext(3);
51
52
  i0.ɵɵelementEnd()();
@@ -70,18 +71,15 @@ function ConversationChatAreaComponent_div_1_Template(rf, ctx) { if (rf & 1) {
70
71
  i0.ɵɵelementStart(10, "mj-active-agent-indicator", 22);
71
72
  i0.ɵɵlistener("togglePanel", function ConversationChatAreaComponent_div_1_Template_mj_active_agent_indicator_togglePanel_10_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onToggleAgentPanel()); })("agentSelected", function ConversationChatAreaComponent_div_1_Template_mj_active_agent_indicator_agentSelected_10_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onAgentSelected($event)); });
72
73
  i0.ɵɵelementEnd()();
73
- i0.ɵɵelementStart(11, "div", 23)(12, "mj-tasks-dropdown", 24);
74
- i0.ɵɵlistener("taskClicked", function ConversationChatAreaComponent_div_1_Template_mj_tasks_dropdown_taskClicked_12_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onTaskClicked($event)); });
74
+ i0.ɵɵelementStart(11, "div", 23)(12, "button", 24);
75
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_div_1_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.exportConversation()); });
76
+ i0.ɵɵelement(13, "i", 25);
77
+ i0.ɵɵtext(14, " Export ");
75
78
  i0.ɵɵelementEnd();
76
- i0.ɵɵelementStart(13, "button", 25);
77
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_div_1_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.exportConversation()); });
78
- i0.ɵɵelement(14, "i", 26);
79
- i0.ɵɵtext(15, " Export ");
80
- i0.ɵɵelementEnd();
81
- i0.ɵɵelementStart(16, "button", 27);
82
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_div_1_Template_button_click_16_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.shareConversation()); });
83
- i0.ɵɵelement(17, "i", 28);
84
- i0.ɵɵtext(18, " Share ");
79
+ i0.ɵɵelementStart(15, "button", 26);
80
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_div_1_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r1); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.shareConversation()); });
81
+ i0.ɵɵelement(16, "i", 27);
82
+ i0.ɵɵtext(17, " Share ");
85
83
  i0.ɵɵelementEnd()()();
86
84
  } if (rf & 2) {
87
85
  const conversation_r4 = ctx.ngIf;
@@ -96,15 +94,13 @@ function ConversationChatAreaComponent_div_1_Template(rf, ctx) { if (rf & 1) {
96
94
  i0.ɵɵproperty("ngIf", ctx_r2.artifactCountDisplay > 0);
97
95
  i0.ɵɵadvance();
98
96
  i0.ɵɵproperty("conversationId", ctx_r2.conversationState.activeConversation.ID)("currentUser", ctx_r2.currentUser);
99
- i0.ɵɵadvance(2);
100
- i0.ɵɵproperty("currentUser", ctx_r2.currentUser);
101
- i0.ɵɵadvance(4);
97
+ i0.ɵɵadvance(5);
102
98
  i0.ɵɵclassProp("shared", ctx_r2.isShared);
103
99
  i0.ɵɵproperty("title", ctx_r2.isShared ? "Manage sharing" : "Share conversation");
104
100
  } }
105
101
  function ConversationChatAreaComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
106
102
  const _r6 = i0.ɵɵgetCurrentView();
107
- i0.ɵɵelementStart(0, "mj-conversation-empty-state", 33);
103
+ i0.ɵɵelementStart(0, "mj-conversation-empty-state", 32);
108
104
  i0.ɵɵlistener("messageSent", function ConversationChatAreaComponent_Conditional_4_Template_mj_conversation_empty_state_messageSent_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onEmptyStateMessageSent($event)); });
109
105
  i0.ɵɵelementEnd();
110
106
  } if (rf & 2) {
@@ -112,69 +108,73 @@ function ConversationChatAreaComponent_Conditional_4_Template(rf, ctx) { if (rf
112
108
  i0.ɵɵproperty("currentUser", ctx_r2.currentUser)("disabled", ctx_r2.isProcessing);
113
109
  } }
114
110
  function ConversationChatAreaComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
115
- i0.ɵɵelementStart(0, "div", 7)(1, "div", 34);
116
- i0.ɵɵelement(2, "i", 35);
111
+ i0.ɵɵelementStart(0, "div", 7)(1, "div", 33);
112
+ i0.ɵɵelement(2, "i", 34);
117
113
  i0.ɵɵelementStart(3, "span");
118
114
  i0.ɵɵtext(4, "Loading conversation...");
119
115
  i0.ɵɵelementEnd()()();
120
116
  } }
121
117
  function ConversationChatAreaComponent_Conditional_6_span_4_Template(rf, ctx) { if (rf & 1) {
122
118
  const _r8 = i0.ɵɵgetCurrentView();
123
- i0.ɵɵelementStart(0, "span", 42);
119
+ i0.ɵɵelementStart(0, "span", 41);
124
120
  i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_6_span_4_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.scrollToBottomAnimate()); });
125
- i0.ɵɵelement(1, "i", 43);
121
+ i0.ɵɵelement(1, "i", 42);
126
122
  i0.ɵɵelementEnd();
127
123
  } }
128
124
  function ConversationChatAreaComponent_Conditional_6_Conditional_6_Template(rf, ctx) { if (rf & 1) {
129
- i0.ɵɵelementStart(0, "div", 40)(1, "div", 44);
130
- i0.ɵɵelement(2, "i", 35);
125
+ i0.ɵɵelementStart(0, "div", 39)(1, "div", 43);
126
+ i0.ɵɵelement(2, "i", 34);
131
127
  i0.ɵɵelementStart(3, "span");
132
128
  i0.ɵɵtext(4, "Loading conversation data...");
133
129
  i0.ɵɵelementEnd()()();
134
130
  } }
135
- function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template(rf, ctx) { if (rf & 1) {
131
+ function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
136
132
  const _r9 = i0.ɵɵgetCurrentView();
137
- i0.ɵɵelementStart(0, "mj-message-input", 46, 1);
138
- i0.ɵɵlistener("messageSent", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_messageSent_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onMessageSent($event)); })("agentResponse", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_agentResponse_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onAgentResponse($event)); })("agentRunDetected", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_agentRunDetected_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onAgentRunDetected($event)); })("agentRunUpdate", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_agentRunUpdate_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onAgentRunUpdate($event)); })("messageComplete", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_messageComplete_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onMessageComplete($event)); })("artifactCreated", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_artifactCreated_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onArtifactCreated($event)); })("conversationRenamed", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_conversationRenamed_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onConversationRenamed($event)); })("intentCheckStarted", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_intentCheckStarted_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onIntentCheckStarted()); })("intentCheckCompleted", function ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template_mj_message_input_intentCheckCompleted_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onIntentCheckCompleted()); });
133
+ i0.ɵɵelementStart(0, "mj-message-input", 45, 1);
134
+ i0.ɵɵlistener("messageSent", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_messageSent_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onMessageSent($event)); })("agentResponse", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_agentResponse_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onAgentResponse($event)); })("agentRunDetected", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_agentRunDetected_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onAgentRunDetected($event)); })("agentRunUpdate", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_agentRunUpdate_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onAgentRunUpdate($event)); })("messageComplete", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_messageComplete_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onMessageComplete($event)); })("artifactCreated", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_artifactCreated_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onArtifactCreated($event)); })("conversationRenamed", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_conversationRenamed_0_listener($event) { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onConversationRenamed($event)); })("intentCheckStarted", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_intentCheckStarted_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onIntentCheckStarted()); })("intentCheckCompleted", function ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template_mj_message_input_intentCheckCompleted_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.onIntentCheckCompleted()); });
139
135
  i0.ɵɵelementEnd();
140
136
  } if (rf & 2) {
137
+ const inputRef_r10 = ctx.$implicit;
141
138
  const ctx_r2 = i0.ɵɵnextContext(3);
142
- i0.ɵɵproperty("conversationId", ctx_r2.conversationState.activeConversation.ID)("currentUser", ctx_r2.currentUser)("conversationHistory", ctx_r2.messages)("disabled", ctx_r2.isProcessing)("initialMessage", ctx_r2.conversationState.pendingMessageToSend);
139
+ i0.ɵɵproperty("hidden", inputRef_r10.conversationId !== ctx_r2.conversationState.activeConversation.ID)("conversationId", inputRef_r10.conversationId)("conversationName", inputRef_r10.conversationName)("currentUser", ctx_r2.currentUser)("conversationHistory", inputRef_r10.conversationId === ctx_r2.conversationState.activeConversation.ID ? ctx_r2.messages : i0.ɵɵpureFunction0(10, _c2))("artifactsByDetailId", inputRef_r10.conversationId === ctx_r2.conversationState.activeConversation.ID ? ctx_r2.artifactsByDetailId : ctx_r2.emptyArtifactsMap)("agentRunsByDetailId", inputRef_r10.conversationId === ctx_r2.conversationState.activeConversation.ID ? ctx_r2.agentRunsByDetailId : ctx_r2.emptyAgentRunsMap)("inProgressMessageIds", inputRef_r10.conversationId === ctx_r2.conversationState.activeConversation.ID ? ctx_r2.inProgressMessageIds : ctx_r2.emptyInProgressIds)("disabled", ctx_r2.isProcessing)("initialMessage", inputRef_r10.conversationId === ctx_r2.conversationState.activeConversation.ID ? ctx_r2.conversationState.pendingMessageToSend : null);
143
140
  } }
144
141
  function ConversationChatAreaComponent_Conditional_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
145
- i0.ɵɵtemplate(0, ConversationChatAreaComponent_Conditional_6_Conditional_7_mj_message_input_0_Template, 2, 5, "mj-message-input", 45);
142
+ i0.ɵɵelementStart(0, "div", 40);
143
+ i0.ɵɵrepeaterCreate(1, ConversationChatAreaComponent_Conditional_6_Conditional_7_For_2_Template, 2, 11, "mj-message-input", 44, _forTrack0);
144
+ i0.ɵɵelementEnd();
146
145
  } if (rf & 2) {
147
146
  const ctx_r2 = i0.ɵɵnextContext(2);
148
- i0.ɵɵproperty("ngIf", ctx_r2.conversationState.activeConversation);
147
+ i0.ɵɵadvance();
148
+ i0.ɵɵrepeater(ctx_r2.getCachedInputs());
149
149
  } }
150
150
  function ConversationChatAreaComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
151
151
  const _r7 = i0.ɵɵgetCurrentView();
152
- i0.ɵɵelementStart(0, "div", 8)(1, "div", 36, 0);
152
+ i0.ɵɵelementStart(0, "div", 8)(1, "div", 35, 0);
153
153
  i0.ɵɵlistener("scroll", function ConversationChatAreaComponent_Conditional_6_Template_div_scroll_1_listener() { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.checkScroll()); });
154
- i0.ɵɵelementStart(3, "mj-conversation-message-list", 37);
154
+ i0.ɵɵelementStart(3, "mj-conversation-message-list", 36);
155
155
  i0.ɵɵlistener("replyInThread", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_replyInThread_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onReplyInThread($event)); })("viewThread", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_viewThread_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onViewThread($event)); })("retryMessage", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_retryMessage_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onRetryMessage($event)); })("artifactClicked", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_artifactClicked_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onArtifactClicked($event)); })("messageEdited", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_messageEdited_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onMessageEdited($event)); })("openEntityRecord", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_openEntityRecord_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onOpenEntityRecord($event)); })("suggestedResponseSelected", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_suggestedResponseSelected_3_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSuggestedResponseSelected($event)); });
156
156
  i0.ɵɵelementEnd();
157
- i0.ɵɵtemplate(4, ConversationChatAreaComponent_Conditional_6_span_4_Template, 2, 0, "span", 38);
157
+ i0.ɵɵtemplate(4, ConversationChatAreaComponent_Conditional_6_span_4_Template, 2, 0, "span", 37);
158
158
  i0.ɵɵelementEnd();
159
- i0.ɵɵelementStart(5, "div", 39);
160
- i0.ɵɵtemplate(6, ConversationChatAreaComponent_Conditional_6_Conditional_6_Template, 5, 0, "div", 40)(7, ConversationChatAreaComponent_Conditional_6_Conditional_7_Template, 1, 1, "mj-message-input", 41);
159
+ i0.ɵɵelementStart(5, "div", 38);
160
+ i0.ɵɵtemplate(6, ConversationChatAreaComponent_Conditional_6_Conditional_6_Template, 5, 0, "div", 39)(7, ConversationChatAreaComponent_Conditional_6_Conditional_7_Template, 3, 0, "div", 40);
161
161
  i0.ɵɵelementEnd()();
162
162
  } if (rf & 2) {
163
163
  const ctx_r2 = i0.ɵɵnextContext();
164
164
  i0.ɵɵadvance(3);
165
- i0.ɵɵproperty("messages", ctx_r2.messages)("conversation", ctx_r2.conversationState.activeConversation)("currentUser", ctx_r2.currentUser)("isProcessing", ctx_r2.isProcessing)("artifactMap", ctx_r2.effectiveArtifactsMap)("agentRunMap", ctx_r2.agentRunsByDetailId)("userAvatarMap", ctx_r2.userAvatarMap);
165
+ i0.ɵɵproperty("messages", ctx_r2.messages)("conversation", ctx_r2.conversationState.activeConversation)("currentUser", ctx_r2.currentUser)("isProcessing", ctx_r2.isProcessing)("artifactMap", ctx_r2.effectiveArtifactsMap)("agentRunMap", ctx_r2.agentRunsByDetailId)("ratingsMap", ctx_r2.ratingsByDetailId)("userAvatarMap", ctx_r2.userAvatarMap);
166
166
  i0.ɵɵadvance();
167
167
  i0.ɵɵproperty("ngIf", ctx_r2.showScrollToBottomIcon && ctx_r2.messages && ctx_r2.messages.length > 0);
168
168
  i0.ɵɵadvance(2);
169
169
  i0.ɵɵconditional(ctx_r2.isLoadingPeripheralData ? 6 : 7);
170
170
  } }
171
171
  function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
172
- const _r10 = i0.ɵɵgetCurrentView();
173
- i0.ɵɵelementStart(0, "div", 47);
174
- i0.ɵɵlistener("mousedown", function ConversationChatAreaComponent_Conditional_7_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onResizeStart($event)); });
172
+ const _r11 = i0.ɵɵgetCurrentView();
173
+ i0.ɵɵelementStart(0, "div", 46);
174
+ i0.ɵɵlistener("mousedown", function ConversationChatAreaComponent_Conditional_7_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onResizeStart($event)); });
175
175
  i0.ɵɵelementEnd();
176
- i0.ɵɵelementStart(1, "div", 48)(2, "mj-artifact-viewer-panel", 49);
177
- i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_closed_2_listener() { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCloseArtifactPanel()); })("saveToCollectionRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_saveToCollectionRequested_2_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSaveToCollectionRequested($event)); })("navigateToLink", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_navigateToLink_2_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onArtifactLinkNavigation($event)); })("shareRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_shareRequested_2_listener($event) { i0.ɵɵrestoreView(_r10); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onArtifactShareRequested($event)); });
176
+ i0.ɵɵelementStart(1, "div", 47)(2, "mj-artifact-viewer-panel", 48);
177
+ i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_closed_2_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCloseArtifactPanel()); })("saveToCollectionRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_saveToCollectionRequested_2_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onSaveToCollectionRequested($event)); })("navigateToLink", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_navigateToLink_2_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onArtifactLinkNavigation($event)); })("shareRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_shareRequested_2_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onArtifactShareRequested($event)); });
178
178
  i0.ɵɵelementEnd()();
179
179
  } if (rf & 2) {
180
180
  const ctx_r2 = i0.ɵɵnextContext();
@@ -184,29 +184,29 @@ function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf
184
184
  i0.ɵɵproperty("artifactId", ctx_r2.selectedArtifactId)("currentUser", ctx_r2.currentUser)("environmentId", ctx_r2.environmentId)("versionNumber", ctx_r2.selectedVersionNumber)("viewContext", "conversation")("canShare", ctx_r2.canShareSelectedArtifact)("canEdit", ctx_r2.canEditSelectedArtifact)("refreshTrigger", ctx_r2.artifactViewerRefresh$);
185
185
  } }
186
186
  function ConversationChatAreaComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
187
- const _r11 = i0.ɵɵgetCurrentView();
188
- i0.ɵɵelementStart(0, "mj-thread-panel", 50);
189
- i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_9_Template_mj_thread_panel_closed_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onThreadClosed()); })("replyAdded", function ConversationChatAreaComponent_Conditional_9_Template_mj_thread_panel_replyAdded_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onThreadReplyAdded($event)); });
187
+ const _r12 = i0.ɵɵgetCurrentView();
188
+ i0.ɵɵelementStart(0, "mj-thread-panel", 49);
189
+ i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_9_Template_mj_thread_panel_closed_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onThreadClosed()); })("replyAdded", function ConversationChatAreaComponent_Conditional_9_Template_mj_thread_panel_replyAdded_0_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onThreadReplyAdded($event)); });
190
190
  i0.ɵɵelementEnd();
191
191
  } if (rf & 2) {
192
192
  const ctx_r2 = i0.ɵɵnextContext();
193
193
  i0.ɵɵproperty("parentMessageId", ctx_r2.conversationState.activeThreadId)("conversationId", (ctx_r2.conversationState.activeConversation == null ? null : ctx_r2.conversationState.activeConversation.ID) || "")("currentUser", ctx_r2.currentUser);
194
194
  } }
195
195
  function ConversationChatAreaComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
196
- const _r12 = i0.ɵɵgetCurrentView();
197
- i0.ɵɵelementStart(0, "div", 51);
198
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_12_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showProjectSelector = false); });
199
- i0.ɵɵelementStart(1, "div", 52);
200
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_12_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r12); return i0.ɵɵresetView($event.stopPropagation()); });
201
- i0.ɵɵelementStart(2, "div", 53)(3, "h3");
196
+ const _r13 = i0.ɵɵgetCurrentView();
197
+ i0.ɵɵelementStart(0, "div", 50);
198
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_12_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showProjectSelector = false); });
199
+ i0.ɵɵelementStart(1, "div", 51);
200
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_12_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
201
+ i0.ɵɵelementStart(2, "div", 52)(3, "h3");
202
202
  i0.ɵɵtext(4, "Assign Project");
203
203
  i0.ɵɵelementEnd();
204
- i0.ɵɵelementStart(5, "button", 54);
205
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_12_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showProjectSelector = false); });
206
- i0.ɵɵelement(6, "i", 55);
204
+ i0.ɵɵelementStart(5, "button", 53);
205
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_12_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showProjectSelector = false); });
206
+ i0.ɵɵelement(6, "i", 54);
207
207
  i0.ɵɵelementEnd()();
208
- i0.ɵɵelementStart(7, "div", 56)(8, "mj-project-selector", 57);
209
- i0.ɵɵlistener("projectSelected", function ConversationChatAreaComponent_Conditional_12_Template_mj_project_selector_projectSelected_8_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onProjectSelected($event)); });
208
+ i0.ɵɵelementStart(7, "div", 55)(8, "mj-project-selector", 56);
209
+ i0.ɵɵlistener("projectSelected", function ConversationChatAreaComponent_Conditional_12_Template_mj_project_selector_projectSelected_8_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onProjectSelected($event)); });
210
210
  i0.ɵɵelementEnd()()()();
211
211
  } if (rf & 2) {
212
212
  const ctx_r2 = i0.ɵɵnextContext();
@@ -214,10 +214,10 @@ function ConversationChatAreaComponent_Conditional_12_Template(rf, ctx) { if (rf
214
214
  i0.ɵɵproperty("environmentId", ctx_r2.environmentId)("currentUser", ctx_r2.currentUser)("selectedProjectId", ctx_r2.conversationState.activeConversation.ProjectID);
215
215
  } }
216
216
  function ConversationChatAreaComponent_Conditional_13_Conditional_6_Template(rf, ctx) { if (rf & 1) {
217
- const _r14 = i0.ɵɵgetCurrentView();
218
- i0.ɵɵelementStart(0, "button", 64);
219
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSystemArtifacts()); });
220
- i0.ɵɵelement(1, "i", 65);
217
+ const _r15 = i0.ɵɵgetCurrentView();
218
+ i0.ɵɵelementStart(0, "button", 63);
219
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSystemArtifacts()); });
220
+ i0.ɵɵelement(1, "i", 64);
221
221
  i0.ɵɵelementStart(2, "span");
222
222
  i0.ɵɵtext(3);
223
223
  i0.ɵɵelementEnd()();
@@ -228,109 +228,109 @@ function ConversationChatAreaComponent_Conditional_13_Conditional_6_Template(rf,
228
228
  i0.ɵɵtextInterpolate1("", ctx_r2.showSystemArtifacts ? "Hide" : "Show", " System");
229
229
  } }
230
230
  function ConversationChatAreaComponent_Conditional_13_Conditional_10_Template(rf, ctx) { if (rf & 1) {
231
- i0.ɵɵelementStart(0, "div", 62);
232
- i0.ɵɵelement(1, "i", 66);
233
- i0.ɵɵelementStart(2, "p", 67);
231
+ i0.ɵɵelementStart(0, "div", 61);
232
+ i0.ɵɵelement(1, "i", 65);
233
+ i0.ɵɵelementStart(2, "p", 66);
234
234
  i0.ɵɵtext(3, "No artifacts in this conversation yet");
235
235
  i0.ɵɵelementEnd()();
236
236
  } }
237
237
  function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_8_Template(rf, ctx) { if (rf & 1) {
238
238
  i0.ɵɵtext(0);
239
239
  } if (rf & 2) {
240
- const artifact_r16 = i0.ɵɵnextContext().$implicit;
241
- i0.ɵɵtextInterpolate1(" ", artifact_r16.versionCount, " versions ");
240
+ const artifact_r17 = i0.ɵɵnextContext().$implicit;
241
+ i0.ɵɵtextInterpolate1(" ", artifact_r17.versionCount, " versions ");
242
242
  } }
243
243
  function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
244
244
  i0.ɵɵtext(0, " 1 version ");
245
245
  } }
246
246
  function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
247
- const _r17 = i0.ɵɵgetCurrentView();
248
- i0.ɵɵelementStart(0, "button", 79);
249
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_10_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r17); const artifact_r16 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleArtifactExpansion(artifact_r16.artifactId, $event)); });
250
- i0.ɵɵelement(1, "i", 80);
247
+ const _r18 = i0.ɵɵgetCurrentView();
248
+ i0.ɵɵelementStart(0, "button", 78);
249
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_10_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r18); const artifact_r17 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleArtifactExpansion(artifact_r17.artifactId, $event)); });
250
+ i0.ɵɵelement(1, "i", 79);
251
251
  i0.ɵɵelementEnd();
252
252
  } if (rf & 2) {
253
- const artifact_r16 = i0.ɵɵnextContext().$implicit;
253
+ const artifact_r17 = i0.ɵɵnextContext().$implicit;
254
254
  const ctx_r2 = i0.ɵɵnextContext(2);
255
255
  i0.ɵɵadvance();
256
- i0.ɵɵclassProp("fa-chevron-down", ctx_r2.expandedArtifactId !== artifact_r16.artifactId)("fa-chevron-up", ctx_r2.expandedArtifactId === artifact_r16.artifactId);
256
+ i0.ɵɵclassProp("fa-chevron-down", ctx_r2.expandedArtifactId !== artifact_r17.artifactId)("fa-chevron-up", ctx_r2.expandedArtifactId === artifact_r17.artifactId);
257
257
  } }
258
258
  function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
259
- const _r18 = i0.ɵɵgetCurrentView();
260
- i0.ɵɵelementStart(0, "div", 82);
261
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_For_2_Template_div_click_0_listener($event) { const version_r19 = i0.ɵɵrestoreView(_r18).$implicit; const artifact_r16 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.openArtifactFromModal(artifact_r16.artifactId, version_r19.versionNumber); return i0.ɵɵresetView($event.stopPropagation()); });
262
- i0.ɵɵelementStart(1, "span", 83);
259
+ const _r19 = i0.ɵɵgetCurrentView();
260
+ i0.ɵɵelementStart(0, "div", 81);
261
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_For_2_Template_div_click_0_listener($event) { const version_r20 = i0.ɵɵrestoreView(_r19).$implicit; const artifact_r17 = i0.ɵɵnextContext(2).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); ctx_r2.openArtifactFromModal(artifact_r17.artifactId, version_r20.versionNumber); return i0.ɵɵresetView($event.stopPropagation()); });
262
+ i0.ɵɵelementStart(1, "span", 82);
263
263
  i0.ɵɵtext(2);
264
264
  i0.ɵɵelementEnd();
265
- i0.ɵɵelementStart(3, "span", 84);
265
+ i0.ɵɵelementStart(3, "span", 83);
266
266
  i0.ɵɵtext(4, "Open this version");
267
267
  i0.ɵɵelementEnd();
268
- i0.ɵɵelement(5, "i", 85);
268
+ i0.ɵɵelement(5, "i", 84);
269
269
  i0.ɵɵelementEnd();
270
270
  } if (rf & 2) {
271
- const version_r19 = ctx.$implicit;
271
+ const version_r20 = ctx.$implicit;
272
272
  i0.ɵɵadvance(2);
273
- i0.ɵɵtextInterpolate1("v", version_r19.versionNumber, "");
273
+ i0.ɵɵtextInterpolate1("v", version_r20.versionNumber, "");
274
274
  } }
275
275
  function ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_Template(rf, ctx) { if (rf & 1) {
276
- i0.ɵɵelementStart(0, "div", 78);
277
- i0.ɵɵrepeaterCreate(1, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_For_2_Template, 6, 1, "div", 81, _forTrack1);
276
+ i0.ɵɵelementStart(0, "div", 77);
277
+ i0.ɵɵrepeaterCreate(1, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_For_2_Template, 6, 1, "div", 80, _forTrack2);
278
278
  i0.ɵɵelementEnd();
279
279
  } if (rf & 2) {
280
- const artifact_r16 = i0.ɵɵnextContext().$implicit;
280
+ const artifact_r17 = i0.ɵɵnextContext().$implicit;
281
281
  i0.ɵɵadvance();
282
- i0.ɵɵrepeater(artifact_r16.versions);
282
+ i0.ɵɵrepeater(artifact_r17.versions);
283
283
  } }
284
284
  function ConversationChatAreaComponent_Conditional_13_For_12_Template(rf, ctx) { if (rf & 1) {
285
- const _r15 = i0.ɵɵgetCurrentView();
286
- i0.ɵɵelementStart(0, "div", 68)(1, "div", 69);
287
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_For_12_Template_div_click_1_listener() { const artifact_r16 = i0.ɵɵrestoreView(_r15).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openArtifactFromModal(artifact_r16.artifactId)); });
288
- i0.ɵɵelementStart(2, "div", 70);
289
- i0.ɵɵelement(3, "i", 71);
285
+ const _r16 = i0.ɵɵgetCurrentView();
286
+ i0.ɵɵelementStart(0, "div", 67)(1, "div", 68);
287
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_For_12_Template_div_click_1_listener() { const artifact_r17 = i0.ɵɵrestoreView(_r16).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.openArtifactFromModal(artifact_r17.artifactId)); });
288
+ i0.ɵɵelementStart(2, "div", 69);
289
+ i0.ɵɵelement(3, "i", 70);
290
290
  i0.ɵɵelementEnd();
291
- i0.ɵɵelementStart(4, "div", 72)(5, "div", 73);
291
+ i0.ɵɵelementStart(4, "div", 71)(5, "div", 72);
292
292
  i0.ɵɵtext(6);
293
293
  i0.ɵɵelementEnd();
294
- i0.ɵɵelementStart(7, "div", 74);
294
+ i0.ɵɵelementStart(7, "div", 73);
295
295
  i0.ɵɵtemplate(8, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_8_Template, 1, 1)(9, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_9_Template, 1, 0);
296
296
  i0.ɵɵelementEnd()();
297
- i0.ɵɵtemplate(10, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_10_Template, 2, 4, "button", 75);
298
- i0.ɵɵelementStart(11, "div", 76);
299
- i0.ɵɵelement(12, "i", 77);
297
+ i0.ɵɵtemplate(10, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_10_Template, 2, 4, "button", 74);
298
+ i0.ɵɵelementStart(11, "div", 75);
299
+ i0.ɵɵelement(12, "i", 76);
300
300
  i0.ɵɵelementEnd()();
301
- i0.ɵɵtemplate(13, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_Template, 3, 0, "div", 78);
301
+ i0.ɵɵtemplate(13, ConversationChatAreaComponent_Conditional_13_For_12_Conditional_13_Template, 3, 0, "div", 77);
302
302
  i0.ɵɵelementEnd();
303
303
  } if (rf & 2) {
304
- const artifact_r16 = ctx.$implicit;
304
+ const artifact_r17 = ctx.$implicit;
305
305
  const ctx_r2 = i0.ɵɵnextContext(2);
306
- i0.ɵɵclassProp("expanded", ctx_r2.expandedArtifactId === artifact_r16.artifactId)("system-artifact", artifact_r16.visibility === "System Only");
306
+ i0.ɵɵclassProp("expanded", ctx_r2.expandedArtifactId === artifact_r17.artifactId)("system-artifact", artifact_r17.visibility === "System Only");
307
307
  i0.ɵɵadvance(6);
308
- i0.ɵɵtextInterpolate(artifact_r16.name);
308
+ i0.ɵɵtextInterpolate(artifact_r17.name);
309
309
  i0.ɵɵadvance(2);
310
- i0.ɵɵconditional(artifact_r16.versionCount > 1 ? 8 : 9);
310
+ i0.ɵɵconditional(artifact_r17.versionCount > 1 ? 8 : 9);
311
311
  i0.ɵɵadvance(2);
312
- i0.ɵɵconditional(artifact_r16.versionCount > 1 ? 10 : -1);
312
+ i0.ɵɵconditional(artifact_r17.versionCount > 1 ? 10 : -1);
313
313
  i0.ɵɵadvance(3);
314
- i0.ɵɵconditional(ctx_r2.expandedArtifactId === artifact_r16.artifactId && artifact_r16.versionCount > 1 ? 13 : -1);
314
+ i0.ɵɵconditional(ctx_r2.expandedArtifactId === artifact_r17.artifactId && artifact_r17.versionCount > 1 ? 13 : -1);
315
315
  } }
316
316
  function ConversationChatAreaComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
317
- const _r13 = i0.ɵɵgetCurrentView();
318
- i0.ɵɵelementStart(0, "div", 51);
319
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showArtifactsModal = false); });
320
- i0.ɵɵelementStart(1, "div", 58);
321
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r13); return i0.ɵɵresetView($event.stopPropagation()); });
322
- i0.ɵɵelementStart(2, "div", 53)(3, "h3");
317
+ const _r14 = i0.ɵɵgetCurrentView();
318
+ i0.ɵɵelementStart(0, "div", 50);
319
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showArtifactsModal = false); });
320
+ i0.ɵɵelementStart(1, "div", 57);
321
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r14); return i0.ɵɵresetView($event.stopPropagation()); });
322
+ i0.ɵɵelementStart(2, "div", 52)(3, "h3");
323
323
  i0.ɵɵtext(4, "Conversation Artifacts");
324
324
  i0.ɵɵelementEnd();
325
- i0.ɵɵelementStart(5, "div", 59);
326
- i0.ɵɵtemplate(6, ConversationChatAreaComponent_Conditional_13_Conditional_6_Template, 4, 3, "button", 60);
327
- i0.ɵɵelementStart(7, "button", 54);
328
- i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r13); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showArtifactsModal = false); });
329
- i0.ɵɵelement(8, "i", 55);
325
+ i0.ɵɵelementStart(5, "div", 58);
326
+ i0.ɵɵtemplate(6, ConversationChatAreaComponent_Conditional_13_Conditional_6_Template, 4, 3, "button", 59);
327
+ i0.ɵɵelementStart(7, "button", 53);
328
+ i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_13_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r14); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.showArtifactsModal = false); });
329
+ i0.ɵɵelement(8, "i", 54);
330
330
  i0.ɵɵelementEnd()()();
331
- i0.ɵɵelementStart(9, "div", 61);
332
- i0.ɵɵtemplate(10, ConversationChatAreaComponent_Conditional_13_Conditional_10_Template, 4, 0, "div", 62);
333
- i0.ɵɵrepeaterCreate(11, ConversationChatAreaComponent_Conditional_13_For_12_Template, 14, 8, "div", 63, _forTrack0);
331
+ i0.ɵɵelementStart(9, "div", 60);
332
+ i0.ɵɵtemplate(10, ConversationChatAreaComponent_Conditional_13_Conditional_10_Template, 4, 0, "div", 61);
333
+ i0.ɵɵrepeaterCreate(11, ConversationChatAreaComponent_Conditional_13_For_12_Template, 14, 8, "div", 62, _forTrack1);
334
334
  i0.ɵɵelementEnd()()();
335
335
  } if (rf & 2) {
336
336
  const ctx_r2 = i0.ɵɵnextContext();
@@ -342,9 +342,9 @@ function ConversationChatAreaComponent_Conditional_13_Template(rf, ctx) { if (rf
342
342
  i0.ɵɵrepeater(ctx_r2.getArtifactsArray());
343
343
  } }
344
344
  function ConversationChatAreaComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
345
- const _r20 = i0.ɵɵgetCurrentView();
346
- i0.ɵɵelementStart(0, "mj-artifact-collection-picker-modal", 86);
347
- i0.ɵɵlistener("saved", function ConversationChatAreaComponent_Conditional_14_Template_mj_artifact_collection_picker_modal_saved_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCollectionPickerSaved($event)); })("cancelled", function ConversationChatAreaComponent_Conditional_14_Template_mj_artifact_collection_picker_modal_cancelled_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCollectionPickerCancelled()); });
345
+ const _r21 = i0.ɵɵgetCurrentView();
346
+ i0.ɵɵelementStart(0, "mj-artifact-collection-picker-modal", 85);
347
+ i0.ɵɵlistener("saved", function ConversationChatAreaComponent_Conditional_14_Template_mj_artifact_collection_picker_modal_saved_0_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCollectionPickerSaved($event)); })("cancelled", function ConversationChatAreaComponent_Conditional_14_Template_mj_artifact_collection_picker_modal_cancelled_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.onCollectionPickerCancelled()); });
348
348
  i0.ɵɵelementEnd();
349
349
  } if (rf & 2) {
350
350
  const ctx_r2 = i0.ɵɵnextContext();
@@ -416,8 +416,24 @@ export class ConversationChatAreaComponent {
416
416
  // Agent run mapping: ConversationDetailID -> AIAgentRunEntityExtended
417
417
  // Loaded once per conversation and kept in sync as new runs are created
418
418
  agentRunsByDetailId = new Map();
419
+ /**
420
+ * Ratings by conversation detail ID (parsed from RatingsJSON)
421
+ */
422
+ ratingsByDetailId = new Map();
423
+ /**
424
+ * In-progress message IDs for streaming reconnection
425
+ * Passed to message-input component to reconnect PubSub updates
426
+ */
427
+ inProgressMessageIds = [];
419
428
  // Timer for smooth agent run UI updates (updates every second while agent runs)
420
429
  agentRunUpdateTimer = null;
430
+ // Cache of message-input metadata for rendering multiple instances
431
+ // Prevents destruction/recreation when switching conversations for performance
432
+ messageInputMetadataCache = new Map();
433
+ // Empty collections for hidden message-input components
434
+ emptyArtifactsMap = new Map();
435
+ emptyAgentRunsMap = new Map();
436
+ emptyInProgressIds = [];
421
437
  // Loading state for peripheral data
422
438
  isLoadingPeripheralData = false;
423
439
  // Subject to trigger artifact viewer refresh when new version is created
@@ -498,6 +514,14 @@ export class ConversationChatAreaComponent {
498
514
  this.showArtifactPanel = false;
499
515
  this.selectedArtifactId = null;
500
516
  if (conversationId) {
517
+ // Add conversation to message-input cache if not already present
518
+ if (!this.messageInputMetadataCache.has(conversationId)) {
519
+ const conversation = this.conversationState.activeConversation;
520
+ this.messageInputMetadataCache.set(conversationId, {
521
+ conversationId: conversationId,
522
+ conversationName: conversation?.Name || null
523
+ });
524
+ }
501
525
  // Show loading state
502
526
  this.isLoadingConversation = true;
503
527
  this.messages = []; // Clear messages to avoid showing stale data
@@ -522,24 +546,30 @@ export class ConversationChatAreaComponent {
522
546
  this.agentStateService.stopPolling();
523
547
  }
524
548
  }
549
+ /**
550
+ * Returns array of cached message-input metadata for rendering
551
+ * This allows multiple message-input components to exist simultaneously (hidden)
552
+ * preserving their state when switching conversations
553
+ */
554
+ getCachedInputs() {
555
+ return Array.from(this.messageInputMetadataCache.values());
556
+ }
525
557
  async loadMessages(conversationId) {
526
558
  try {
527
559
  // Check if we have cached data for this conversation
528
560
  const cachedData = this.conversationDataCache.get(conversationId);
529
561
  if (cachedData) {
530
562
  // Use cached data - instant load!
531
- console.log(`📦 Loading conversation ${conversationId} from cache - instant!`);
532
563
  this.buildMessagesFromCache(cachedData);
533
564
  this.loadPeripheralData(conversationId); // Process cached data for maps
534
565
  }
535
566
  else {
536
567
  // Load from database with single optimized query
537
- console.log(`🔍 Loading conversation ${conversationId} from database - single query`);
538
568
  const rq = new RunQuery();
539
569
  const result = await rq.RunQuery({
540
570
  QueryName: 'GetConversationComplete',
541
571
  CategoryPath: 'MJ/Conversations',
542
- Parameters: { ConversationID: conversationId },
572
+ Parameters: { ConversationID: conversationId }
543
573
  }, this.currentUser);
544
574
  if (!result.Success || !result.Results) {
545
575
  console.error('Failed to load conversation data:', result.ErrorMessage);
@@ -549,7 +579,6 @@ export class ConversationChatAreaComponent {
549
579
  // Cache the raw results for future use
550
580
  const conversationData = result.Results;
551
581
  this.conversationDataCache.set(conversationId, conversationData);
552
- console.log(`💾 Cached ${conversationData.length} conversation details for conversation ${conversationId}`);
553
582
  // Build messages and show immediately
554
583
  this.buildMessagesFromCache(conversationData);
555
584
  // Process peripheral data (agent runs & artifacts) in background
@@ -560,6 +589,8 @@ export class ConversationChatAreaComponent {
560
589
  }
561
590
  // After loading messages, check for in-progress runs and ensure we're receiving updates
562
591
  await this.detectAndReconnectToInProgressRuns(conversationId);
592
+ // Check for pending artifact navigation (from collection link)
593
+ await this.handlePendingArtifactNavigation();
563
594
  }
564
595
  catch (error) {
565
596
  console.error('Error loading messages:', error);
@@ -588,6 +619,13 @@ export class ConversationChatAreaComponent {
588
619
  messages.push(message);
589
620
  }
590
621
  this.messages = messages;
622
+ // Detect in-progress messages for streaming reconnection
623
+ this.inProgressMessageIds = messages
624
+ .filter(m => m.Status === 'In-Progress')
625
+ .map(m => m.ID);
626
+ if (this.inProgressMessageIds.length > 0) {
627
+ LogStatusEx({ message: `🔌 Detected ${this.inProgressMessageIds.length} in-progress messages for reconnection`, verboseOnly: true });
628
+ }
591
629
  this.scrollToBottom = true;
592
630
  this.cdr.detectChanges(); // Show messages immediately
593
631
  }
@@ -606,13 +644,13 @@ export class ConversationChatAreaComponent {
606
644
  if (!userMap.has(row.UserID)) {
607
645
  userMap.set(row.UserID, {
608
646
  imageUrl: row.UserImageURL || null,
609
- iconClass: row.UserImageIconClass || null,
647
+ iconClass: row.UserImageIconClass || null
610
648
  });
611
649
  }
612
650
  }
613
651
  }
614
652
  this.userAvatarMap = userMap;
615
- console.log(`👤 Built user avatar map with ${this.userAvatarMap.size} unique users`);
653
+ LogStatusEx({ message: `👤 Built user avatar map with ${this.userAvatarMap.size} unique users`, verboseOnly: true });
616
654
  }
617
655
  /**
618
656
  * Process peripheral data (agent runs and artifacts) from cached conversation data
@@ -627,12 +665,12 @@ export class ConversationChatAreaComponent {
627
665
  const timestamp = new Date().toISOString();
628
666
  // Skip if we've already processed peripheral data for this conversation
629
667
  if (this.lastLoadedConversationId === conversationId) {
630
- console.log(`[${timestamp}] ⏭️ Skipping peripheral data processing - already processed for conversation ${conversationId}`);
668
+ LogStatusEx({ message: `[${timestamp}] ⏭️ Skipping peripheral data processing - already processed for conversation ${conversationId}`, verboseOnly: true });
631
669
  return;
632
670
  }
633
671
  // Mark this conversation as processed to prevent duplicate processing
634
672
  this.lastLoadedConversationId = conversationId;
635
- console.log(`[${timestamp}] 📊 Processing peripheral data for conversation ${conversationId} from cache`);
673
+ LogStatusEx({ message: `[${timestamp}] 📊 Processing peripheral data for conversation ${conversationId} from cache`, verboseOnly: true });
636
674
  try {
637
675
  // Get cached data - should always be present by the time we get here
638
676
  const conversationData = this.conversationDataCache.get(conversationId);
@@ -662,12 +700,12 @@ export class ConversationChatAreaComponent {
662
700
  AgentID: agentRunData.AgentID,
663
701
  Agent: agentRunData.Agent,
664
702
  Status: agentRunData.Status,
665
- __mj_CreatedAt: new Date(agentRunData.__mj_CreatedAt),
666
- __mj_UpdatedAt: new Date(agentRunData.__mj_UpdatedAt),
703
+ __mj_CreatedAt: agentRunData.__mj_CreatedAt,
704
+ __mj_UpdatedAt: agentRunData.__mj_UpdatedAt,
667
705
  TotalPromptTokensUsed: agentRunData.TotalPromptTokensUsed,
668
706
  TotalCompletionTokensUsed: agentRunData.TotalCompletionTokensUsed,
669
707
  TotalCost: agentRunData.TotalCost,
670
- ConversationDetailID: agentRunData.ConversationDetailID,
708
+ ConversationDetailID: agentRunData.ConversationDetailID
671
709
  });
672
710
  this.agentRunsByDetailId.set(row.ID, agentRun);
673
711
  }
@@ -695,10 +733,15 @@ export class ConversationChatAreaComponent {
695
733
  this.systemArtifactsByDetailId.set(row.ID, systemArtifactList);
696
734
  }
697
735
  }
736
+ // Build ratings map
737
+ if (parsed.ratings.length > 0) {
738
+ this.ratingsByDetailId.set(row.ID, parsed.ratings);
739
+ }
698
740
  }
699
741
  // Create new Map references to trigger Angular change detection
700
742
  this.agentRunsByDetailId = new Map(this.agentRunsByDetailId);
701
743
  this.artifactsByDetailId = new Map(this.artifactsByDetailId);
744
+ this.ratingsByDetailId = new Map(this.ratingsByDetailId);
702
745
  this.systemArtifactsByDetailId = new Map(this.systemArtifactsByDetailId);
703
746
  // Clear combined cache since we loaded new artifacts
704
747
  this._combinedArtifactsMap = null;
@@ -706,12 +749,12 @@ export class ConversationChatAreaComponent {
706
749
  this.artifactCount = this.calculateUniqueArtifactCount();
707
750
  // Debug: Log summary
708
751
  const systemArtifactCount = this.systemArtifactsByDetailId.size;
709
- console.log(`📊 Processed ${this.agentRunsByDetailId.size} agent runs, ${this.artifactsByDetailId.size} user artifact mappings, ${systemArtifactCount} system artifact mappings (${this.artifactCount} unique user artifacts)`);
752
+ LogStatusEx({ message: `📊 Processed ${this.agentRunsByDetailId.size} agent runs, ${this.artifactsByDetailId.size} user artifact mappings, ${systemArtifactCount} system artifact mappings (${this.artifactCount} unique user artifacts)`, verboseOnly: true });
710
753
  // CRITICAL: Trigger message re-render now that agent runs and artifacts are loaded
711
754
  // This updates all message components with the newly loaded agent run data
712
755
  this.messages = [...this.messages]; // Create new array reference to trigger change detection
713
756
  this.cdr.detectChanges();
714
- console.log(`✅ Peripheral data processed successfully for conversation ${conversationId} from cache`);
757
+ LogStatusEx({ message: `✅ Peripheral data processed successfully for conversation ${conversationId} from cache`, verboseOnly: true });
715
758
  }
716
759
  catch (error) {
717
760
  console.error('Failed to process peripheral data:', error);
@@ -735,10 +778,14 @@ export class ConversationChatAreaComponent {
735
778
  }
736
779
  // Check if message already exists in the array (by ID) to prevent duplicates
737
780
  // Messages can be emitted multiple times as they're updated (e.g., status changes)
738
- const existingIndex = this.messages.findIndex((m) => m.ID === message.ID);
781
+ const existingIndex = this.messages.findIndex(m => m.ID === message.ID);
739
782
  if (existingIndex >= 0) {
740
783
  // Update existing message in place (replace with updated version)
741
- this.messages = [...this.messages.slice(0, existingIndex), message, ...this.messages.slice(existingIndex + 1)];
784
+ this.messages = [
785
+ ...this.messages.slice(0, existingIndex),
786
+ message,
787
+ ...this.messages.slice(existingIndex + 1)
788
+ ];
742
789
  }
743
790
  else {
744
791
  // Add new message to the list
@@ -765,9 +812,9 @@ export class ConversationChatAreaComponent {
765
812
  await userEntity.Load(userId);
766
813
  this.userAvatarMap.set(userId, {
767
814
  imageUrl: userEntity.UserImageURL || null,
768
- iconClass: userEntity.UserImageIconClass || null,
815
+ iconClass: userEntity.UserImageIconClass || null
769
816
  });
770
- console.log(`👤 Added current user to avatar map`);
817
+ LogStatusEx({ message: `👤 Added current user to avatar map`, verboseOnly: true });
771
818
  }
772
819
  /**
773
820
  * Handle agent run detected event from progress updates
@@ -831,7 +878,7 @@ export class ConversationChatAreaComponent {
831
878
  if (this.agentRunUpdateTimer !== null) {
832
879
  return;
833
880
  }
834
- console.log('⏱️ Starting agent run update timer (1-second interval)');
881
+ LogStatusEx({ message: '⏱️ Starting agent run update timer (1-second interval)', verboseOnly: true });
835
882
  this.agentRunUpdateTimer = setInterval(() => {
836
883
  // Check if we have any active agent runs
837
884
  let hasActiveRuns = false;
@@ -858,7 +905,7 @@ export class ConversationChatAreaComponent {
858
905
  */
859
906
  stopAgentRunUpdateTimer() {
860
907
  if (this.agentRunUpdateTimer !== null) {
861
- console.log('⏹️ Stopping agent run update timer');
908
+ LogStatusEx({ message: '⏹️ Stopping agent run update timer', verboseOnly: true });
862
909
  clearInterval(this.agentRunUpdateTimer);
863
910
  this.agentRunUpdateTimer = null;
864
911
  }
@@ -901,7 +948,7 @@ export class ConversationChatAreaComponent {
901
948
  */
902
949
  invalidateConversationCache(conversationId) {
903
950
  this.conversationDataCache.delete(conversationId);
904
- console.log(`🗑️ Invalidated cache for conversation ${conversationId}`);
951
+ LogStatusEx({ message: `🗑️ Invalidated cache for conversation ${conversationId}`, verboseOnly: true });
905
952
  }
906
953
  /**
907
954
  * Add or update an agent run in the map
@@ -938,7 +985,7 @@ export class ConversationChatAreaComponent {
938
985
  * Invalidates and refreshes the conversation cache
939
986
  */
940
987
  async reloadArtifactsForMessage(conversationDetailId) {
941
- console.log(`🔄 Reloading artifacts for message ${conversationDetailId}`);
988
+ LogStatusEx({ message: `🔄 Reloading artifacts for message ${conversationDetailId}`, verboseOnly: true });
942
989
  try {
943
990
  const rq = new RunQuery();
944
991
  const md = new Metadata();
@@ -954,13 +1001,13 @@ export class ConversationChatAreaComponent {
954
1001
  const result = await rq.RunQuery({
955
1002
  QueryName: 'GetConversationComplete',
956
1003
  CategoryPath: '/MJ/Conversations',
957
- Parameters: { ConversationID: detail.ConversationID },
1004
+ Parameters: { ConversationID: detail.ConversationID }
958
1005
  }, this.currentUser);
959
1006
  if (!result.Success || !result.Results) {
960
1007
  console.error('Failed to reload artifacts:', result.ErrorMessage);
961
1008
  return;
962
1009
  }
963
- console.log(`📊 Query result: ${result.Results.length} conversation details loaded`);
1010
+ LogStatusEx({ message: `📊 Query result: ${result.Results.length} conversation details loaded`, verboseOnly: true });
964
1011
  // Update cache with fresh data
965
1012
  const conversationData = result.Results;
966
1013
  this.conversationDataCache.set(detail.ConversationID, conversationData);
@@ -975,7 +1022,7 @@ export class ConversationChatAreaComponent {
975
1022
  for (const artifactData of parsed.artifacts) {
976
1023
  const lazyInfo = new LazyArtifactInfo(artifactData, this.currentUser);
977
1024
  artifactList.push(lazyInfo);
978
- console.log(`✅ Loaded artifact ${artifactData.ArtifactID} v${artifactData.VersionNumber} for message ${conversationDetailId}`);
1025
+ LogStatusEx({ message: `✅ Loaded artifact ${artifactData.ArtifactID} v${artifactData.VersionNumber} for message ${conversationDetailId}`, verboseOnly: true });
979
1026
  }
980
1027
  this.artifactsByDetailId.set(conversationDetailId, artifactList);
981
1028
  }
@@ -1099,13 +1146,13 @@ export class ConversationChatAreaComponent {
1099
1146
  versionId: versionId, // Latest version ID
1100
1147
  name: name,
1101
1148
  visibility: info.visibility,
1102
- versions: [{ versionId: versionId, versionNumber: versionNumber }],
1149
+ versions: [{ versionId: versionId, versionNumber: versionNumber }]
1103
1150
  });
1104
1151
  }
1105
1152
  else {
1106
1153
  // Add version if not already present
1107
1154
  const existing = artifactMap.get(artifactId);
1108
- if (!existing.versions.some((v) => v.versionId === versionId)) {
1155
+ if (!existing.versions.some(v => v.versionId === versionId)) {
1109
1156
  existing.versions.push({ versionId: versionId, versionNumber: versionNumber });
1110
1157
  // Update to latest version ID (assuming versions are added chronologically)
1111
1158
  existing.versionId = versionId;
@@ -1114,13 +1161,13 @@ export class ConversationChatAreaComponent {
1114
1161
  }
1115
1162
  }
1116
1163
  // Convert to array with version count, sorted by version number descending
1117
- return Array.from(artifactMap.values()).map((item) => ({
1164
+ return Array.from(artifactMap.values()).map(item => ({
1118
1165
  artifactId: item.artifactId,
1119
1166
  versionId: item.versionId,
1120
1167
  name: item.name,
1121
1168
  visibility: item.visibility,
1122
1169
  versionCount: item.versions.length,
1123
- versions: item.versions.sort((a, b) => b.versionNumber - a.versionNumber),
1170
+ versions: item.versions.sort((a, b) => b.versionNumber - a.versionNumber)
1124
1171
  }));
1125
1172
  }
1126
1173
  toggleArtifactExpansion(artifactId, event) {
@@ -1170,7 +1217,7 @@ export class ConversationChatAreaComponent {
1170
1217
  }
1171
1218
  shareConversation() {
1172
1219
  // TODO: Implement share functionality
1173
- console.log('Share conversation');
1220
+ LogStatusEx({ message: 'Share conversation', verboseOnly: true });
1174
1221
  }
1175
1222
  onReplyInThread(message) {
1176
1223
  // Open thread panel for this message
@@ -1187,7 +1234,7 @@ export class ConversationChatAreaComponent {
1187
1234
  onThreadReplyAdded(reply) {
1188
1235
  // Optionally refresh the message list to update thread counts
1189
1236
  // For now, we'll just log it
1190
- console.log('Thread reply added:', reply);
1237
+ LogStatusEx({ message: 'Thread reply added', verboseOnly: true, additionalArgs: [reply] });
1191
1238
  // Reload messages to get updated thread counts
1192
1239
  const activeConv = this.conversationState.activeConversation;
1193
1240
  if (activeConv) {
@@ -1201,12 +1248,12 @@ export class ConversationChatAreaComponent {
1201
1248
  }
1202
1249
  onAgentSelected(agentRun) {
1203
1250
  // When an agent is clicked in the indicator, could show details
1204
- console.log('Agent selected:', agentRun.ID);
1251
+ LogStatusEx({ message: 'Agent selected', verboseOnly: true, additionalArgs: [agentRun.ID] });
1205
1252
  // Could open a modal or navigate to agent details
1206
1253
  }
1207
1254
  onMessageEdited(message) {
1208
1255
  // Message was edited and saved, trigger change detection
1209
- console.log('Message edited:', message.ID);
1256
+ LogStatusEx({ message: 'Message edited', verboseOnly: true, additionalArgs: [message.ID] });
1210
1257
  // The message entity is already updated in place, so no need to reload
1211
1258
  // Just ensure the UI reflects the changes
1212
1259
  }
@@ -1216,17 +1263,23 @@ export class ConversationChatAreaComponent {
1216
1263
  */
1217
1264
  async onSuggestedResponseSelected(event) {
1218
1265
  const messageText = event.customInput || event.text;
1219
- if (this.messageInputComponent) {
1266
+ // If we have an active conversation with message input available, use it
1267
+ if (this.messageInputComponent && !this.conversationState.isNewUnsavedConversation) {
1220
1268
  await this.messageInputComponent.sendMessageWithText(messageText);
1221
1269
  }
1270
+ else if (!this.conversationState.activeConversation || this.conversationState.isNewUnsavedConversation) {
1271
+ // If no conversation or in new unsaved state, route through empty state handler
1272
+ // This will create the conversation and send the message
1273
+ await this.onEmptyStateMessageSent(messageText);
1274
+ }
1222
1275
  else {
1223
- console.error('MessageInputComponent not available');
1276
+ console.error('MessageInputComponent not available and not in a valid state to create conversation');
1224
1277
  }
1225
1278
  }
1226
1279
  onRetryMessage(message) {
1227
1280
  // TODO: Implement retry logic
1228
1281
  // This should find the parent user message and re-trigger the agent invocation
1229
- console.log('Retry requested for message:', message.ID);
1282
+ LogStatusEx({ message: 'Retry requested for message', verboseOnly: true, additionalArgs: [message.ID] });
1230
1283
  // For now, just log it - full implementation would require refactoring agent invocation
1231
1284
  }
1232
1285
  async onArtifactClicked(data) {
@@ -1237,7 +1290,7 @@ export class ConversationChatAreaComponent {
1237
1290
  for (const artifactInfo of artifactList) {
1238
1291
  if (artifactInfo.artifactVersionId === data.versionId) {
1239
1292
  this.selectedVersionNumber = artifactInfo.versionNumber;
1240
- console.log(`📦 Opening artifact viewer for v${this.selectedVersionNumber}`);
1293
+ LogStatusEx({ message: `📦 Opening artifact viewer for v${this.selectedVersionNumber}`, verboseOnly: true });
1241
1294
  break;
1242
1295
  }
1243
1296
  }
@@ -1267,13 +1320,13 @@ export class ConversationChatAreaComponent {
1267
1320
  }
1268
1321
  else if (this.selectedArtifactId && artifactList && artifactList.length > 0) {
1269
1322
  // Panel is already open - check if new artifact is a new version of currently displayed artifact
1270
- const currentArtifact = artifactList.find((a) => a.artifactId === this.selectedArtifactId);
1323
+ const currentArtifact = artifactList.find(a => a.artifactId === this.selectedArtifactId);
1271
1324
  if (currentArtifact) {
1272
1325
  // New version of the same artifact - refresh to show latest version
1273
1326
  const latestVersion = artifactList[artifactList.length - 1];
1274
1327
  this.artifactViewerRefresh$.next({
1275
1328
  artifactId: latestVersion.artifactId,
1276
- versionNumber: latestVersion.versionNumber,
1329
+ versionNumber: latestVersion.versionNumber
1277
1330
  });
1278
1331
  }
1279
1332
  }
@@ -1323,7 +1376,9 @@ export class ConversationChatAreaComponent {
1323
1376
  */
1324
1377
  getArtifactInfo(conversationDetailId) {
1325
1378
  const artifactList = this.artifactsByDetailId.get(conversationDetailId);
1326
- return artifactList && artifactList.length > 0 ? artifactList[artifactList.length - 1] : undefined;
1379
+ return artifactList && artifactList.length > 0
1380
+ ? artifactList[artifactList.length - 1]
1381
+ : undefined;
1327
1382
  }
1328
1383
  /**
1329
1384
  * Get ALL artifacts for a conversation detail
@@ -1390,7 +1445,7 @@ export class ConversationChatAreaComponent {
1390
1445
  }
1391
1446
  }
1392
1447
  onConversationRenamed(event) {
1393
- console.log('🎉 Conversation renamed:', event);
1448
+ LogStatusEx({ message: '🎉 Conversation renamed', verboseOnly: true, additionalArgs: [event] });
1394
1449
  // Pass the event up to workspace component for animation
1395
1450
  this.conversationRenamed.emit(event);
1396
1451
  }
@@ -1402,12 +1457,12 @@ export class ConversationChatAreaComponent {
1402
1457
  if (!messageText || !messageText.trim()) {
1403
1458
  return;
1404
1459
  }
1405
- console.log('📨 Empty state message received:', messageText);
1460
+ LogStatusEx({ message: '📨 Empty state message received', verboseOnly: true, additionalArgs: [messageText] });
1406
1461
  try {
1407
1462
  this.isProcessing = true;
1408
1463
  // Store the message to send after conversation loads (in service to persist across component lifecycle)
1409
1464
  this.conversationState.pendingMessageToSend = messageText.trim();
1410
- console.log('💾 Stored pending message in service:', this.conversationState.pendingMessageToSend);
1465
+ LogStatusEx({ message: '💾 Stored pending message in service', verboseOnly: true, additionalArgs: [this.conversationState.pendingMessageToSend] });
1411
1466
  // Create a new conversation
1412
1467
  const newConversation = await this.conversationState.createConversation('New Conversation', // Temporary name - will be auto-named after first message
1413
1468
  this.environmentId, this.currentUser);
@@ -1417,7 +1472,9 @@ export class ConversationChatAreaComponent {
1417
1472
  this.isProcessing = false;
1418
1473
  return;
1419
1474
  }
1420
- console.log('✅ Created new conversation:', newConversation.ID);
1475
+ LogStatusEx({ message: '✅ Created new conversation', verboseOnly: true, additionalArgs: [newConversation.ID] });
1476
+ // Clear the new unsaved conversation state since we've now created it
1477
+ this.conversationState.clearNewConversationState();
1421
1478
  // Set as active conversation (this will trigger onConversationChanged which will send the message)
1422
1479
  this.conversationState.activeConversationId = newConversation.ID;
1423
1480
  }
@@ -1437,11 +1494,15 @@ export class ConversationChatAreaComponent {
1437
1494
  // Pass task click up to workspace to navigate to Tasks tab
1438
1495
  this.taskClicked.emit(task);
1439
1496
  }
1497
+ onNavigateToConversation(event) {
1498
+ // Navigate to the conversation with the active task
1499
+ this.conversationState.setActiveConversation(event.conversationId);
1500
+ }
1440
1501
  /**
1441
1502
  * Handle navigation request from artifact viewer Links tab
1442
1503
  */
1443
1504
  onArtifactLinkNavigation(event) {
1444
- console.log('🔗 Chat area: Artifact link clicked:', event);
1505
+ LogStatusEx({ message: '🔗 Chat area: Artifact link clicked', verboseOnly: true, additionalArgs: [event] });
1445
1506
  this.artifactLinkClicked.emit(event);
1446
1507
  }
1447
1508
  /**
@@ -1539,18 +1600,18 @@ export class ConversationChatAreaComponent {
1539
1600
  */
1540
1601
  async detectAndReconnectToInProgressRuns(conversationId) {
1541
1602
  // Check for in-progress messages
1542
- const inProgressMessages = this.messages.filter((m) => m.Status === 'In-Progress' && m.Role === 'AI');
1603
+ const inProgressMessages = this.messages.filter(m => m.Status === 'In-Progress' && m.Role === 'AI');
1543
1604
  if (inProgressMessages.length === 0) {
1544
1605
  return;
1545
1606
  }
1546
- console.log(`🔄 Found ${inProgressMessages.length} in-progress messages, reconnecting...`);
1607
+ LogStatusEx({ message: `🔄 Found ${inProgressMessages.length} in-progress messages, reconnecting...`, verboseOnly: true });
1547
1608
  // For each in-progress message, check if there's an active agent run
1548
1609
  for (const message of inProgressMessages) {
1549
1610
  if (message.AgentID) {
1550
1611
  // Check agent state service for this run
1551
1612
  const agentRun = this.agentRunsByDetailId.get(message.ID);
1552
1613
  if (agentRun && agentRun.Status === 'Running') {
1553
- console.log(`🔌 Reconnecting to agent run ${agentRun.ID} for message ${message.ID}`);
1614
+ LogStatusEx({ message: `🔌 Reconnecting to agent run ${agentRun.ID} for message ${message.ID}`, verboseOnly: true });
1554
1615
  // Agent state service polling will automatically pick this up
1555
1616
  // The WebSocket subscription is already active via PushStatusUpdates()
1556
1617
  // No additional action needed - just log for visibility
@@ -1561,6 +1622,67 @@ export class ConversationChatAreaComponent {
1561
1622
  // WebSocket subscription is already active via message-input component's subscribeToPushStatus()
1562
1623
  // Both will automatically receive updates for these in-progress runs
1563
1624
  }
1625
+ /**
1626
+ * Handle pending artifact navigation from collection
1627
+ * Opens the artifact and scrolls to the message containing it
1628
+ */
1629
+ async handlePendingArtifactNavigation() {
1630
+ const pendingArtifactId = this.conversationState.pendingArtifactId;
1631
+ const pendingVersionNumber = this.conversationState.pendingArtifactVersionNumber;
1632
+ if (!pendingArtifactId) {
1633
+ return; // No pending navigation
1634
+ }
1635
+ console.log('📦 Processing pending artifact navigation:', pendingArtifactId, 'v' + pendingVersionNumber);
1636
+ // Clear pending values immediately to prevent re-processing
1637
+ this.conversationState.pendingArtifactId = null;
1638
+ this.conversationState.pendingArtifactVersionNumber = null;
1639
+ // Find the message containing this artifact version
1640
+ let messageIdWithArtifact = null;
1641
+ for (const [detailId, artifactList] of this.artifactsByDetailId.entries()) {
1642
+ for (const artifactInfo of artifactList) {
1643
+ if (artifactInfo.artifactId === pendingArtifactId) {
1644
+ // Found the artifact - check if version matches (if specified)
1645
+ if (pendingVersionNumber == null || artifactInfo.versionNumber === pendingVersionNumber) {
1646
+ messageIdWithArtifact = detailId;
1647
+ console.log('✅ Found artifact in message:', detailId);
1648
+ break;
1649
+ }
1650
+ }
1651
+ }
1652
+ if (messageIdWithArtifact)
1653
+ break;
1654
+ }
1655
+ if (!messageIdWithArtifact) {
1656
+ console.warn('⚠️ Could not find message containing artifact:', pendingArtifactId);
1657
+ return;
1658
+ }
1659
+ // Open the artifact panel
1660
+ this.selectedArtifactId = pendingArtifactId;
1661
+ this.selectedVersionNumber = pendingVersionNumber ?? undefined;
1662
+ this.showArtifactPanel = true;
1663
+ // Load permissions for the artifact
1664
+ await this.loadArtifactPermissions(pendingArtifactId);
1665
+ // Scroll to the message
1666
+ this.scrollToMessage(messageIdWithArtifact);
1667
+ console.log('✅ Opened artifact and scrolled to message:', messageIdWithArtifact);
1668
+ }
1669
+ /**
1670
+ * Scroll to a specific message in the conversation
1671
+ * @param messageId The conversation detail ID to scroll to
1672
+ */
1673
+ scrollToMessage(messageId) {
1674
+ // Wait for DOM to update, then scroll
1675
+ setTimeout(() => {
1676
+ const messageElement = document.querySelector(`[data-message-id="${messageId}"]`);
1677
+ if (messageElement) {
1678
+ messageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });
1679
+ console.log('📍 Scrolled to message:', messageId);
1680
+ }
1681
+ else {
1682
+ console.warn('⚠️ Message element not found for ID:', messageId);
1683
+ }
1684
+ }, 300); // Give time for artifact panel to open and DOM to render
1685
+ }
1564
1686
  /**
1565
1687
  * Handle intent check started - show temporary "Analyzing intent..." message
1566
1688
  */
@@ -1576,7 +1698,7 @@ export class ConversationChatAreaComponent {
1576
1698
  Message: tempMessage.Message,
1577
1699
  Role: tempMessage.Role,
1578
1700
  Status: tempMessage.Status,
1579
- __mj_CreatedAt: new Date(),
1701
+ __mj_CreatedAt: new Date()
1580
1702
  });
1581
1703
  // No ID means it's temporary (won't be saved)
1582
1704
  this.intentCheckMessage = tempMessage;
@@ -1590,7 +1712,7 @@ export class ConversationChatAreaComponent {
1590
1712
  onIntentCheckCompleted() {
1591
1713
  if (this.intentCheckMessage) {
1592
1714
  // Remove the temporary intent check message
1593
- this.messages = this.messages.filter((m) => m !== this.intentCheckMessage);
1715
+ this.messages = this.messages.filter(m => m !== this.intentCheckMessage);
1594
1716
  this.intentCheckMessage = null;
1595
1717
  this.cdr.detectChanges();
1596
1718
  }
@@ -1605,11 +1727,11 @@ export class ConversationChatAreaComponent {
1605
1727
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.scrollContainer = _t.first);
1606
1728
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.messageInputComponent = _t.first);
1607
1729
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.artifactViewerComponent = _t.first);
1608
- } }, inputs: { environmentId: "environmentId", currentUser: "currentUser" }, outputs: { conversationRenamed: "conversationRenamed", openEntityRecord: "openEntityRecord", taskClicked: "taskClicked", artifactLinkClicked: "artifactLinkClicked" }, decls: 15, vars: 18, consts: [["scrollContainer", ""], ["messageInput", ""], [1, "chat-area"], ["class", "chat-header", 4, "ngIf"], [1, "chat-content-area"], [1, "chat-messages-pane"], [3, "currentUser", "disabled"], [1, "conversation-loading-state"], [1, "chat-messages-wrapper"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], [3, "parentMessageId", "conversationId", "currentUser"], [3, "cancelled", "exported", "isVisible", "conversation", "currentUser"], [3, "cancelled", "membersChanged", "isVisible", "conversation", "currentUser"], [1, "modal-overlay"], [3, "isOpen", "environmentId", "currentUser", "excludeCollectionIds"], [1, "chat-header"], [1, "chat-info"], [1, "chat-title"], ["class", "project-tag", "title", "Assign to project", 3, "click", 4, "ngIf"], ["title", "View members", 1, "chat-members", 3, "click"], [1, "fas", "fa-users"], ["class", "artifact-indicator", "title", "View artifacts", 3, "click", 4, "ngIf"], [3, "togglePanel", "agentSelected", "conversationId", "currentUser"], [1, "chat-actions"], [3, "taskClicked", "currentUser"], ["title", "Export conversation", 1, "action-btn", 3, "click"], [1, "fas", "fa-download"], [1, "action-btn", "share-btn", 3, "click", "title"], [1, "fas", "fa-share-nodes"], ["title", "Assign to project", 1, "project-tag", 3, "click"], [1, "fas", "fa-folder"], ["title", "View artifacts", 1, "artifact-indicator", 3, "click"], [1, "fas", "fa-cube"], [3, "messageSent", "currentUser", "disabled"], [1, "loading-content"], [1, "fas", "fa-spinner", "fa-spin"], [1, "chat-messages-container", 3, "scroll"], [3, "replyInThread", "viewThread", "retryMessage", "artifactClicked", "messageEdited", "openEntityRecord", "suggestedResponseSelected", "messages", "conversation", "currentUser", "isProcessing", "artifactMap", "agentRunMap", "userAvatarMap"], ["class", "scroll-to-bottom-icon", "style", "left: 50%;", 3, "click", 4, "ngIf"], [1, "chat-input-container"], [1, "loading-peripheral-placeholder"], [3, "conversationId", "currentUser", "conversationHistory", "disabled", "initialMessage"], [1, "scroll-to-bottom-icon", 2, "left", "50%", 3, "click"], [1, "fas", "fa-arrow-down"], [1, "loading-peripheral-content"], [3, "conversationId", "currentUser", "conversationHistory", "disabled", "initialMessage", "messageSent", "agentResponse", "agentRunDetected", "agentRunUpdate", "messageComplete", "artifactCreated", "conversationRenamed", "intentCheckStarted", "intentCheckCompleted", 4, "ngIf"], [3, "messageSent", "agentResponse", "agentRunDetected", "agentRunUpdate", "messageComplete", "artifactCreated", "conversationRenamed", "intentCheckStarted", "intentCheckCompleted", "conversationId", "currentUser", "conversationHistory", "disabled", "initialMessage"], [1, "resize-handle", 3, "mousedown"], [1, "chat-artifact-pane"], [3, "closed", "saveToCollectionRequested", "navigateToLink", "shareRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "viewContext", "canShare", "canEdit", "refreshTrigger"], [3, "closed", "replyAdded", "parentMessageId", "conversationId", "currentUser"], [1, "modal-overlay", 3, "click"], [1, "modal-content", "project-selector-modal", 3, "click"], [1, "modal-header"], [1, "modal-close-btn", 3, "click"], [1, "fas", "fa-times"], [1, "modal-body"], [3, "projectSelected", "environmentId", "currentUser", "selectedProjectId"], [1, "modal-content", "artifacts-modal", 3, "click"], [1, "modal-header-actions"], ["title", "Toggle system artifacts visibility", 1, "toggle-system-btn", 3, "active"], [1, "modal-body", "artifacts-grid"], [1, "empty-state"], [1, "artifact-modal-card", 3, "expanded", "system-artifact"], ["title", "Toggle system artifacts visibility", 1, "toggle-system-btn", 3, "click"], [1, "fas", "fa-cog"], [1, "fas", "fa-cube", 2, "font-size", "48px", "color", "#D1D5DB", "margin-bottom", "16px"], [2, "color", "#6B7280", "font-size", "14px"], [1, "artifact-modal-card"], [1, "artifact-card-header", 3, "click"], [1, "artifact-modal-icon"], [1, "fas", "fa-file-code"], [1, "artifact-modal-info"], [1, "artifact-modal-title"], [1, "artifact-modal-meta"], [1, "expand-btn"], [1, "artifact-modal-action"], [1, "fas", "fa-external-link-alt"], [1, "artifact-versions-list"], [1, "expand-btn", 3, "click"], [1, "fas"], [1, "artifact-version-item"], [1, "artifact-version-item", 3, "click"], [1, "version-badge"], [1, "version-open-text"], [1, "fas", "fa-arrow-right"], [3, "saved", "cancelled", "isOpen", "environmentId", "currentUser", "excludeCollectionIds"]], template: function ConversationChatAreaComponent_Template(rf, ctx) { if (rf & 1) {
1730
+ } }, inputs: { environmentId: "environmentId", currentUser: "currentUser" }, outputs: { conversationRenamed: "conversationRenamed", openEntityRecord: "openEntityRecord", taskClicked: "taskClicked", artifactLinkClicked: "artifactLinkClicked" }, decls: 15, vars: 18, consts: [["scrollContainer", ""], ["messageInput", ""], [1, "chat-area"], ["class", "chat-header", 4, "ngIf"], [1, "chat-content-area"], [1, "chat-messages-pane"], [3, "currentUser", "disabled"], [1, "conversation-loading-state"], [1, "chat-messages-wrapper"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], [3, "parentMessageId", "conversationId", "currentUser"], [3, "cancelled", "exported", "isVisible", "conversation", "currentUser"], [3, "cancelled", "membersChanged", "isVisible", "conversation", "currentUser"], [1, "modal-overlay"], [3, "isOpen", "environmentId", "currentUser", "excludeCollectionIds"], [1, "chat-header"], [1, "chat-info"], [1, "chat-title"], ["class", "project-tag", "title", "Assign to project", 3, "click", 4, "ngIf"], ["title", "View members", 1, "chat-members", 3, "click"], [1, "fas", "fa-users"], ["class", "artifact-indicator", "title", "View artifacts", 3, "click", 4, "ngIf"], [3, "togglePanel", "agentSelected", "conversationId", "currentUser"], [1, "chat-actions"], ["title", "Export conversation", 1, "action-btn", 3, "click"], [1, "fas", "fa-download"], [1, "action-btn", "share-btn", 3, "click", "title"], [1, "fas", "fa-share-nodes"], ["title", "Assign to project", 1, "project-tag", 3, "click"], [1, "fas", "fa-folder"], ["title", "View artifacts", 1, "artifact-indicator", 3, "click"], [1, "fas", "fa-cube"], [3, "messageSent", "currentUser", "disabled"], [1, "loading-content"], [1, "fas", "fa-spinner", "fa-spin"], [1, "chat-messages-container", 3, "scroll"], [3, "replyInThread", "viewThread", "retryMessage", "artifactClicked", "messageEdited", "openEntityRecord", "suggestedResponseSelected", "messages", "conversation", "currentUser", "isProcessing", "artifactMap", "agentRunMap", "ratingsMap", "userAvatarMap"], ["class", "scroll-to-bottom-icon", "style", "left: 50%;", 3, "click", 4, "ngIf"], [1, "chat-input-container"], [1, "loading-peripheral-placeholder"], [1, "message-input-container-wrapper"], [1, "scroll-to-bottom-icon", 2, "left", "50%", 3, "click"], [1, "fas", "fa-arrow-down"], [1, "loading-peripheral-content"], [3, "hidden", "conversationId", "conversationName", "currentUser", "conversationHistory", "artifactsByDetailId", "agentRunsByDetailId", "inProgressMessageIds", "disabled", "initialMessage"], [3, "messageSent", "agentResponse", "agentRunDetected", "agentRunUpdate", "messageComplete", "artifactCreated", "conversationRenamed", "intentCheckStarted", "intentCheckCompleted", "hidden", "conversationId", "conversationName", "currentUser", "conversationHistory", "artifactsByDetailId", "agentRunsByDetailId", "inProgressMessageIds", "disabled", "initialMessage"], [1, "resize-handle", 3, "mousedown"], [1, "chat-artifact-pane"], [3, "closed", "saveToCollectionRequested", "navigateToLink", "shareRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "viewContext", "canShare", "canEdit", "refreshTrigger"], [3, "closed", "replyAdded", "parentMessageId", "conversationId", "currentUser"], [1, "modal-overlay", 3, "click"], [1, "modal-content", "project-selector-modal", 3, "click"], [1, "modal-header"], [1, "modal-close-btn", 3, "click"], [1, "fas", "fa-times"], [1, "modal-body"], [3, "projectSelected", "environmentId", "currentUser", "selectedProjectId"], [1, "modal-content", "artifacts-modal", 3, "click"], [1, "modal-header-actions"], ["title", "Toggle system artifacts visibility", 1, "toggle-system-btn", 3, "active"], [1, "modal-body", "artifacts-grid"], [1, "empty-state"], [1, "artifact-modal-card", 3, "expanded", "system-artifact"], ["title", "Toggle system artifacts visibility", 1, "toggle-system-btn", 3, "click"], [1, "fas", "fa-cog"], [1, "fas", "fa-cube", 2, "font-size", "48px", "color", "#D1D5DB", "margin-bottom", "16px"], [2, "color", "#6B7280", "font-size", "14px"], [1, "artifact-modal-card"], [1, "artifact-card-header", 3, "click"], [1, "artifact-modal-icon"], [1, "fas", "fa-file-code"], [1, "artifact-modal-info"], [1, "artifact-modal-title"], [1, "artifact-modal-meta"], [1, "expand-btn"], [1, "artifact-modal-action"], [1, "fas", "fa-external-link-alt"], [1, "artifact-versions-list"], [1, "expand-btn", 3, "click"], [1, "fas"], [1, "artifact-version-item"], [1, "artifact-version-item", 3, "click"], [1, "version-badge"], [1, "version-open-text"], [1, "fas", "fa-arrow-right"], [3, "saved", "cancelled", "isOpen", "environmentId", "currentUser", "excludeCollectionIds"]], template: function ConversationChatAreaComponent_Template(rf, ctx) { if (rf & 1) {
1609
1731
  i0.ɵɵelementStart(0, "div", 2);
1610
- i0.ɵɵtemplate(1, ConversationChatAreaComponent_div_1_Template, 19, 11, "div", 3);
1732
+ i0.ɵɵtemplate(1, ConversationChatAreaComponent_div_1_Template, 18, 10, "div", 3);
1611
1733
  i0.ɵɵelementStart(2, "div", 4)(3, "div", 5);
1612
- i0.ɵɵtemplate(4, ConversationChatAreaComponent_Conditional_4_Template, 1, 2, "mj-conversation-empty-state", 6)(5, ConversationChatAreaComponent_Conditional_5_Template, 5, 0, "div", 7)(6, ConversationChatAreaComponent_Conditional_6_Template, 8, 9, "div", 8);
1734
+ i0.ɵɵtemplate(4, ConversationChatAreaComponent_Conditional_4_Template, 1, 2, "mj-conversation-empty-state", 6)(5, ConversationChatAreaComponent_Conditional_5_Template, 5, 0, "div", 7)(6, ConversationChatAreaComponent_Conditional_6_Template, 8, 10, "div", 8);
1613
1735
  i0.ɵɵelementEnd();
1614
1736
  i0.ɵɵtemplate(7, ConversationChatAreaComponent_Conditional_7_Template, 3, 10);
1615
1737
  i0.ɵɵelementStart(8, "mj-artifact-share-modal", 9);
@@ -1629,7 +1751,7 @@ export class ConversationChatAreaComponent {
1629
1751
  i0.ɵɵadvance(2);
1630
1752
  i0.ɵɵclassProp("full-width", !ctx.showArtifactPanel);
1631
1753
  i0.ɵɵadvance();
1632
- i0.ɵɵconditional(!ctx.conversationState.activeConversation ? 4 : ctx.isLoadingConversation ? 5 : 6);
1754
+ i0.ɵɵconditional(!ctx.conversationState.activeConversation || ctx.conversationState.isNewUnsavedConversation ? 4 : ctx.isLoadingConversation ? 5 : 6);
1633
1755
  i0.ɵɵadvance(3);
1634
1756
  i0.ɵɵconditional(ctx.showArtifactPanel && ctx.selectedArtifactId ? 7 : -1);
1635
1757
  i0.ɵɵadvance();
@@ -1646,11 +1768,11 @@ export class ConversationChatAreaComponent {
1646
1768
  i0.ɵɵconditional(ctx.showArtifactsModal ? 13 : -1);
1647
1769
  i0.ɵɵadvance();
1648
1770
  i0.ɵɵconditional(ctx.showCollectionPicker ? 14 : -1);
1649
- } }, dependencies: [i7.NgIf, i8.ArtifactViewerPanelComponent, i9.ArtifactCollectionPickerModalComponent, i10.ArtifactShareModalComponent, i11.MessageListComponent, i12.MessageInputComponent, i13.ConversationEmptyStateComponent, i14.ThreadPanelComponent, i15.ProjectSelectorComponent, i16.TasksDropdownComponent, i17.ActiveAgentIndicatorComponent, i18.MembersModalComponent, i19.ExportModalComponent], styles: ["[_nghost-%COMP%] {\n display: flex;\n width: 100%;\n height: 100%;\n}\n.chat-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n.chat-header[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid #D9D9D9;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: #FFF;\n z-index: 10;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n.chat-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n.chat-title[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.project-tag[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: #F4F4F4;\n border: 1px solid #D9D9D9;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n.project-tag[_ngcontent-%COMP%]:hover {\n background: #D9D9D9;\n border-color: #AAA;\n}\n.project-tag[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n.chat-members[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: #F4F4F4;\n border: none;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 500;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 32px;\n}\n.chat-members[_ngcontent-%COMP%]:hover {\n background: #D9D9D9;\n color: #333;\n}\n.chat-members[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n.chat-members[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n}\n.artifact-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #3B82F6;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n color: white;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.artifact-indicator[_ngcontent-%COMP%]:hover {\n background: #2563EB;\n}\n.ambient-agent-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #F3F4F6;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n.ambient-agent-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076B6;\n}\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n.chat-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n.action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n transition: all 150ms ease;\n}\n.action-btn[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n color: #111827;\n}\n.share-btn.shared[_ngcontent-%COMP%] {\n background: #EFF6FF;\n border-color: #1e40af;\n color: #1e40af;\n}\n.share-btn.shared[_ngcontent-%COMP%]:hover {\n background: #DBEAFE;\n color: #1e3a8a;\n}\n.chat-content-area[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.chat-messages-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: 300px;\n overflow: hidden;\n transition: width 0.3s ease;\n}\n.chat-messages-pane.full-width[_ngcontent-%COMP%] {\n width: 100%;\n}\n.chat-messages-pane[_ngcontent-%COMP%]:not(.full-width) {\n flex: 1;\n}\n.resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n.resize-handle[_ngcontent-%COMP%]:hover {\n background: #3B82F6;\n}\n.resize-handle[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n.chat-artifact-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #FAFAFA;\n overflow: hidden;\n flex-shrink: 0;\n}\n.chat-artifact-pane[_ngcontent-%COMP%] > mj-artifact-viewer-panel[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: #FFF;\n min-height: 0;\n position: relative;\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 21px; // 21px from bottom of visible scroll area (moved up 5px from original 16px)\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px; // Negative margin to not affect scroll height\n margin-left: auto;\n margin-right: auto;\n background: white;\n border: 1px solid #D1D5DB;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n border-color: #3B82F6;\n transform: translateX(-50%) translateY(-2px);\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6B7280;\n font-size: 16px;\n transition: color 0.2s;\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: #3B82F6;\n}\n.chat-input-container[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: #FFF;\n padding: 0 1.25rem 1.25rem 1.25rem; // Increased padding to prevent clipping rounded corners\n overflow: visible; // Allow box shadow and rounded corners to show fully\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] placeholder[_ngcontent-%COMP%] -[_ngcontent-%COMP%] replaces[_ngcontent-%COMP%] input[_ngcontent-%COMP%] while[_ngcontent-%COMP%] loading\n.loading-peripheral-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px; // Match typical input area height\n padding: 24px;\n background: rgba(255, 255, 255, 0.5);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-in-out;\n}\n.modal-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n.modal-content[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n.project-selector-modal[_ngcontent-%COMP%] {\n width: 600px;\n height: 500px;\n}\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #E5E7EB;\n}\n.modal-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.toggle-system-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: #F3F4F6;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n color: #6B7280;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n.toggle-system-btn[_ngcontent-%COMP%]:hover {\n background: #E5E7EB;\n border-color: #D1D5DB;\n color: #374151;\n}\n.toggle-system-btn.active[_ngcontent-%COMP%] {\n background: #3B82F6;\n border-color: #3B82F6;\n color: white;\n}\n.toggle-system-btn.active[_ngcontent-%COMP%]:hover {\n background: #2563EB;\n border-color: #2563EB;\n}\n.toggle-system-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n.modal-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: #6B7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.modal-close-btn[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n color: #111827;\n}\n.modal-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n.artifacts-modal[_ngcontent-%COMP%] {\n width: 700px;\n max-height: 600px;\n}\n.artifacts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n.empty-state[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n.artifact-modal-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: white;\n border: 1.5px solid #E5E7EB;\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n.artifact-modal-card.expanded[_ngcontent-%COMP%] {\n border-color: #3B82F6;\n}\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n border-color: #D1D5DB;\n border-style: dashed;\n position: relative;\n}\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: #9CA3AF;\n background: #F3F4F6;\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]:hover {\n border-color: #9CA3AF;\n box-shadow: 0 4px 12px rgba(156, 163, 175, 0.15);\n}\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n.artifact-card-header[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n}\n.artifact-modal-card[_ngcontent-%COMP%]:hover {\n border-color: #3B82F6;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);\n transform: translateY(-2px);\n}\n.artifact-modal-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #EFF6FF 0%, #DBEAFE 100%);\n border-radius: 10px;\n color: #3B82F6;\n flex-shrink: 0;\n}\n.artifact-modal-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n.artifact-modal-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n.artifact-modal-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n margin-bottom: 4px;\n}\n.artifact-modal-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n}\n.artifact-modal-action[_ngcontent-%COMP%] {\n color: #9CA3AF;\n transition: color 0.2s;\n}\n.artifact-modal-card[_ngcontent-%COMP%]:hover .artifact-modal-action[_ngcontent-%COMP%] {\n color: #3B82F6;\n}\n.expand-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #6B7280;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n\n &:hover {\n background: #F3F4F6;\n color: #3B82F6;\n }\n}\n.artifact-versions-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: #F9FAFB;\n}\n.artifact-version-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px; // Indent to align with title\n cursor: pointer;\n transition: background 0.15s;\n\n &:hover {\n background: #F3F4F6;\n }\n\n .version-badge {\n display: inline-block;\n padding: 4px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n }\n\n .version-open-text {\n flex: 1;\n font-size: 13px;\n color: #6B7280;\n }\n\n i {\n color: #9CA3AF;\n font-size: 12px;\n }\n\n &:hover {\n .version-badge {\n background: #4F46E5;\n color: white;\n }\n .version-open-text {\n color: #3B82F6;\n }\n i {\n color: #3B82F6;\n }\n }\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] content[_ngcontent-%COMP%] styling\n.loading-peripheral-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: white;\n border: 2px solid #E5E7EB;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n color: #4B5563;\n font-size: 14px;\n font-weight: 500;\n\n i {\n font-size: 20px;\n color: #9333EA;\n }\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] conversation[_ngcontent-%COMP%] state[_ngcontent-%COMP%] -[_ngcontent-%COMP%] centered[_ngcontent-%COMP%] spinner\n.conversation-loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: #6B7280;\n font-size: 15px;\n\n i {\n font-size: 32px;\n color: #3B82F6;\n }\n\n span {\n font-weight: 500;\n }\n}"] });
1771
+ } }, dependencies: [i7.NgIf, i8.ArtifactViewerPanelComponent, i9.ArtifactCollectionPickerModalComponent, i10.ArtifactShareModalComponent, i11.MessageListComponent, i12.MessageInputComponent, i13.ConversationEmptyStateComponent, i14.ThreadPanelComponent, i15.ProjectSelectorComponent, i16.ActiveAgentIndicatorComponent, i17.MembersModalComponent, i18.ExportModalComponent], styles: ["[_nghost-%COMP%] {\n display: flex;\n width: 100%;\n height: 100%;\n}\n.chat-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n.chat-header[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid #D9D9D9;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: #FFF;\n z-index: 10;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n.chat-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n.chat-title[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.project-tag[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: #F4F4F4;\n border: 1px solid #D9D9D9;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n.project-tag[_ngcontent-%COMP%]:hover {\n background: #D9D9D9;\n border-color: #AAA;\n}\n.project-tag[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n.chat-members[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: #F4F4F4;\n border: none;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 500;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 32px;\n}\n.chat-members[_ngcontent-%COMP%]:hover {\n background: #D9D9D9;\n color: #333;\n}\n.chat-members[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n.chat-members[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 500;\n}\n.artifact-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #3B82F6;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n color: white;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.artifact-indicator[_ngcontent-%COMP%]:hover {\n background: #2563EB;\n}\n.ambient-agent-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #F3F4F6;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n.ambient-agent-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076B6;\n}\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n.chat-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n.action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n transition: all 150ms ease;\n}\n.action-btn[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n color: #111827;\n}\n.share-btn.shared[_ngcontent-%COMP%] {\n background: #EFF6FF;\n border-color: #1e40af;\n color: #1e40af;\n}\n.share-btn.shared[_ngcontent-%COMP%]:hover {\n background: #DBEAFE;\n color: #1e3a8a;\n}\n.chat-content-area[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.chat-messages-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: 300px;\n overflow: hidden;\n transition: width 0.3s ease;\n}\n.chat-messages-pane.full-width[_ngcontent-%COMP%] {\n width: 100%;\n}\n.chat-messages-pane[_ngcontent-%COMP%]:not(.full-width) {\n flex: 1;\n}\n.resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n.resize-handle[_ngcontent-%COMP%]:hover {\n background: #3B82F6;\n}\n.resize-handle[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n.chat-artifact-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #FAFAFA;\n overflow: hidden;\n flex-shrink: 0;\n}\n.chat-artifact-pane[_ngcontent-%COMP%] > mj-artifact-viewer-panel[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: #FFF;\n min-height: 0;\n position: relative;\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 21px; // 21px from bottom of visible scroll area (moved up 5px from original 16px)\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px; // Negative margin to not affect scroll height\n margin-left: auto;\n margin-right: auto;\n background: white;\n border: 1px solid #D1D5DB;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n border-color: #3B82F6;\n transform: translateX(-50%) translateY(-2px);\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #6B7280;\n font-size: 16px;\n transition: color 0.2s;\n}\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: #3B82F6;\n}\n.chat-input-container[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: #FFF;\n padding: 0 1.25rem 1.25rem 1.25rem; // Increased padding to prevent clipping rounded corners\n overflow: visible; // Allow box shadow and rounded corners to show fully\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] placeholder[_ngcontent-%COMP%] -[_ngcontent-%COMP%] replaces[_ngcontent-%COMP%] input[_ngcontent-%COMP%] while[_ngcontent-%COMP%] loading\n.loading-peripheral-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px; // Match typical input area height\n padding: 24px;\n background: rgba(255, 255, 255, 0.5);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-in-out;\n}\n.modal-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n.modal-content[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n.project-selector-modal[_ngcontent-%COMP%] {\n width: 600px;\n height: 500px;\n}\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #E5E7EB;\n}\n.modal-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.toggle-system-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: #F3F4F6;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n color: #6B7280;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n.toggle-system-btn[_ngcontent-%COMP%]:hover {\n background: #E5E7EB;\n border-color: #D1D5DB;\n color: #374151;\n}\n.toggle-system-btn.active[_ngcontent-%COMP%] {\n background: #3B82F6;\n border-color: #3B82F6;\n color: white;\n}\n.toggle-system-btn.active[_ngcontent-%COMP%]:hover {\n background: #2563EB;\n border-color: #2563EB;\n}\n.toggle-system-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n.modal-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: #6B7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.modal-close-btn[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n color: #111827;\n}\n.modal-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n.artifacts-modal[_ngcontent-%COMP%] {\n width: 700px;\n max-height: 600px;\n}\n.artifacts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n.empty-state[_ngcontent-%COMP%] {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n.artifact-modal-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: white;\n border: 1.5px solid #E5E7EB;\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n.artifact-modal-card.expanded[_ngcontent-%COMP%] {\n border-color: #3B82F6;\n}\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n border-color: #D1D5DB;\n border-style: dashed;\n position: relative;\n}\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: #9CA3AF;\n background: #F3F4F6;\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]:hover {\n border-color: #9CA3AF;\n box-shadow: 0 4px 12px rgba(156, 163, 175, 0.15);\n}\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n.artifact-card-header[_ngcontent-%COMP%]:hover {\n background: #F9FAFB;\n}\n.artifact-modal-card[_ngcontent-%COMP%]:hover {\n border-color: #3B82F6;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);\n transform: translateY(-2px);\n}\n.artifact-modal-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #EFF6FF 0%, #DBEAFE 100%);\n border-radius: 10px;\n color: #3B82F6;\n flex-shrink: 0;\n}\n.artifact-modal-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n.artifact-modal-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n.artifact-modal-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n margin-bottom: 4px;\n}\n.artifact-modal-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n}\n.artifact-modal-action[_ngcontent-%COMP%] {\n color: #9CA3AF;\n transition: color 0.2s;\n}\n.artifact-modal-card[_ngcontent-%COMP%]:hover .artifact-modal-action[_ngcontent-%COMP%] {\n color: #3B82F6;\n}\n.expand-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #6B7280;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n\n &:hover {\n background: #F3F4F6;\n color: #3B82F6;\n }\n}\n.artifact-versions-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: #F9FAFB;\n}\n.artifact-version-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px; // Indent to align with title\n cursor: pointer;\n transition: background 0.15s;\n\n &:hover {\n background: #F3F4F6;\n }\n\n .version-badge {\n display: inline-block;\n padding: 4px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n }\n\n .version-open-text {\n flex: 1;\n font-size: 13px;\n color: #6B7280;\n }\n\n i {\n color: #9CA3AF;\n font-size: 12px;\n }\n\n &:hover {\n .version-badge {\n background: #4F46E5;\n color: white;\n }\n .version-open-text {\n color: #3B82F6;\n }\n i {\n color: #3B82F6;\n }\n }\n}\n\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] content[_ngcontent-%COMP%] styling\n.loading-peripheral-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: white;\n border: 2px solid #E5E7EB;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n color: #4B5563;\n font-size: 14px;\n font-weight: 500;\n\n i {\n font-size: 20px;\n color: #9333EA;\n }\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n//[_ngcontent-%COMP%] Loading[_ngcontent-%COMP%] conversation[_ngcontent-%COMP%] state[_ngcontent-%COMP%] -[_ngcontent-%COMP%] centered[_ngcontent-%COMP%] spinner\n.conversation-loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: #6B7280;\n font-size: 15px;\n\n i {\n font-size: 32px;\n color: #3B82F6;\n }\n\n span {\n font-weight: 500;\n }\n}"] });
1650
1772
  }
1651
1773
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationChatAreaComponent, [{
1652
1774
  type: Component,
1653
- args: [{ selector: 'mj-conversation-chat-area', template: "<div class=\"chat-area\">\n <!-- Fixed Header -->\n <div class=\"chat-header\" *ngIf=\"conversationState.activeConversation as conversation\">\n <div class=\"chat-info\">\n <div class=\"chat-title\">{{ conversation.Name }}</div>\n <button class=\"project-tag\" (click)=\"openProjectSelector()\" title=\"Assign to project\" *ngIf=\"conversation.ProjectID\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ conversation.Project || 'Project' }}</span>\n </button>\n <button class=\"chat-members\" (click)=\"toggleMembersModal()\" title=\"View members\">\n <i class=\"fas fa-users\"></i>\n <span>{{ memberCount }} member{{ memberCount !== 1 ? 's' : '' }}</span>\n </button>\n <button class=\"artifact-indicator\" (click)=\"viewArtifacts()\" title=\"View artifacts\" *ngIf=\"artifactCountDisplay > 0\">\n <i class=\"fas fa-cube\"></i>\n <span>{{ artifactCountDisplay }} artifact{{ artifactCountDisplay !== 1 ? 's' : '' }}</span>\n </button>\n <mj-active-agent-indicator\n [conversationId]=\"conversationState.activeConversation.ID\"\n [currentUser]=\"currentUser\"\n (togglePanel)=\"onToggleAgentPanel()\"\n (agentSelected)=\"onAgentSelected($event)\">\n </mj-active-agent-indicator>\n </div>\n <div class=\"chat-actions\">\n <mj-tasks-dropdown\n [currentUser]=\"currentUser\"\n (taskClicked)=\"onTaskClicked($event)\">\n </mj-tasks-dropdown>\n <button class=\"action-btn\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n Export\n </button>\n <button class=\"action-btn share-btn\"\n [class.shared]=\"isShared\"\n (click)=\"shareConversation()\"\n [title]=\"isShared ? 'Manage sharing' : 'Share conversation'\">\n <i class=\"fas fa-share-nodes\"></i>\n Share\n </button>\n </div>\n </div>\n\n <!-- Messages and Artifact Split Layout -->\n <div class=\"chat-content-area\">\n <!-- Messages Pane -->\n <div class=\"chat-messages-pane\" [class.full-width]=\"!showArtifactPanel\">\n @if (!conversationState.activeConversation) {\n <!-- Empty State - No conversation selected -->\n <mj-conversation-empty-state\n [currentUser]=\"currentUser\"\n [disabled]=\"isProcessing\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads -->\n <div class=\"conversation-loading-state\">\n <div class=\"loading-content\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading conversation...</span>\n </div>\n </div>\n } @else {\n <!-- Normal Message View -->\n <div class=\"chat-messages-wrapper\">\n <div class=\"chat-messages-container\" #scrollContainer (scroll)=\"checkScroll()\">\n <mj-conversation-message-list\n [messages]=\"messages\"\n [conversation]=\"conversationState.activeConversation\"\n [currentUser]=\"currentUser\"\n [isProcessing]=\"isProcessing\"\n [artifactMap]=\"effectiveArtifactsMap\"\n [agentRunMap]=\"agentRunsByDetailId\"\n [userAvatarMap]=\"userAvatarMap\"\n (replyInThread)=\"onReplyInThread($event)\"\n (viewThread)=\"onViewThread($event)\"\n (retryMessage)=\"onRetryMessage($event)\"\n (artifactClicked)=\"onArtifactClicked($event)\"\n (messageEdited)=\"onMessageEdited($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (suggestedResponseSelected)=\"onSuggestedResponseSelected($event)\">\n </mj-conversation-message-list>\n\n <!-- Scroll to Bottom Icon (positioned within scroll container for proper centering) -->\n <span class=\"scroll-to-bottom-icon\" style=\"left: 50%;\"\n *ngIf=\"showScrollToBottomIcon && messages && messages.length > 0\"\n (click)=\"scrollToBottomAnimate()\">\n <i class=\"fas fa-arrow-down\"></i>\n </span>\n </div>\n\n <!-- Fixed Input Area -->\n <div class=\"chat-input-container\">\n @if (isLoadingPeripheralData) {\n <!-- Loading State -->\n <div class=\"loading-peripheral-placeholder\">\n <div class=\"loading-peripheral-content\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading conversation data...</span>\n </div>\n </div>\n } @else {\n <!-- Input Component -->\n <mj-message-input\n #messageInput\n *ngIf=\"conversationState.activeConversation\"\n [conversationId]=\"conversationState.activeConversation.ID\"\n [currentUser]=\"currentUser\"\n [conversationHistory]=\"messages\"\n [disabled]=\"isProcessing\"\n [initialMessage]=\"conversationState.pendingMessageToSend\"\n (messageSent)=\"onMessageSent($event)\"\n (agentResponse)=\"onAgentResponse($event)\"\n (agentRunDetected)=\"onAgentRunDetected($event)\"\n (agentRunUpdate)=\"onAgentRunUpdate($event)\"\n (messageComplete)=\"onMessageComplete($event)\"\n (artifactCreated)=\"onArtifactCreated($event)\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (intentCheckStarted)=\"onIntentCheckStarted()\"\n (intentCheckCompleted)=\"onIntentCheckCompleted()\">\n </mj-message-input>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Artifact Viewer Pane -->\n @if (showArtifactPanel && selectedArtifactId) {\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event)\"></div>\n <div class=\"chat-artifact-pane\" [style.width.%]=\"artifactPaneWidth\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"selectedVersionNumber\"\n [viewContext]=\"'conversation'\"\n [canShare]=\"canShareSelectedArtifact\"\n [canEdit]=\"canEditSelectedArtifact\"\n [refreshTrigger]=\"artifactViewerRefresh$\"\n (closed)=\"onCloseArtifactPanel()\"\n (saveToCollectionRequested)=\"onSaveToCollectionRequested($event)\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n </div>\n</div>\n\n<!-- Thread Panel -->\n@if (conversationState.activeThreadId) {\n <mj-thread-panel\n [parentMessageId]=\"conversationState.activeThreadId\"\n [conversationId]=\"conversationState.activeConversation?.ID || ''\"\n [currentUser]=\"currentUser\"\n (closed)=\"onThreadClosed()\"\n (replyAdded)=\"onThreadReplyAdded($event)\">\n </mj-thread-panel>\n}\n\n<!-- Export Modal -->\n<mj-export-modal\n [isVisible]=\"showExportModal\"\n [conversation]=\"conversationState.activeConversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"onExportModalCancelled()\"\n (exported)=\"onExportModalComplete()\">\n</mj-export-modal>\n\n<!-- Members Modal -->\n<mj-members-modal\n [isVisible]=\"showMembersModal\"\n [conversation]=\"conversationState.activeConversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"showMembersModal = false\"\n (membersChanged)=\"showMembersModal = false\">\n</mj-members-modal>\n\n<!-- Project Selector Modal -->\n@if (showProjectSelector && conversationState.activeConversation) {\n <div class=\"modal-overlay\" (click)=\"showProjectSelector = false\">\n <div class=\"modal-content project-selector-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Assign Project</h3>\n <button class=\"modal-close-btn\" (click)=\"showProjectSelector = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <mj-project-selector\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedProjectId]=\"conversationState.activeConversation.ProjectID\"\n (projectSelected)=\"onProjectSelected($event)\">\n </mj-project-selector>\n </div>\n </div>\n </div>\n}\n\n<!-- Artifacts Modal -->\n@if (showArtifactsModal) {\n <div class=\"modal-overlay\" (click)=\"showArtifactsModal = false\">\n <div class=\"modal-content artifacts-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Conversation Artifacts</h3>\n <div class=\"modal-header-actions\">\n @if (hasSystemArtifacts) {\n <button class=\"toggle-system-btn\"\n [class.active]=\"showSystemArtifacts\"\n (click)=\"toggleSystemArtifacts()\"\n title=\"Toggle system artifacts visibility\">\n <i class=\"fas fa-cog\"></i>\n <span>{{ showSystemArtifacts ? 'Hide' : 'Show' }} System</span>\n </button>\n }\n <button class=\"modal-close-btn\" (click)=\"showArtifactsModal = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body artifacts-grid\">\n @if (artifactsByDetailId.size === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-cube\" style=\"font-size: 48px; color: #D1D5DB; margin-bottom: 16px;\"></i>\n <p style=\"color: #6B7280; font-size: 14px;\">No artifacts in this conversation yet</p>\n </div>\n }\n @for (artifact of getArtifactsArray(); track artifact.artifactId) {\n <div class=\"artifact-modal-card\"\n [class.expanded]=\"expandedArtifactId === artifact.artifactId\"\n [class.system-artifact]=\"artifact.visibility === 'System Only'\">\n <!-- Main card header - click to open latest version -->\n <div class=\"artifact-card-header\" (click)=\"openArtifactFromModal(artifact.artifactId)\">\n <div class=\"artifact-modal-icon\">\n <i class=\"fas fa-file-code\"></i>\n </div>\n <div class=\"artifact-modal-info\">\n <div class=\"artifact-modal-title\">{{artifact.name}}</div>\n <div class=\"artifact-modal-meta\">\n @if (artifact.versionCount > 1) {\n {{artifact.versionCount}} versions\n } @else {\n 1 version\n }\n </div>\n </div>\n @if (artifact.versionCount > 1) {\n <button class=\"expand-btn\" (click)=\"toggleArtifactExpansion(artifact.artifactId, $event)\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedArtifactId !== artifact.artifactId\"\n [class.fa-chevron-up]=\"expandedArtifactId === artifact.artifactId\"></i>\n </button>\n }\n <div class=\"artifact-modal-action\">\n <i class=\"fas fa-external-link-alt\"></i>\n </div>\n </div>\n\n <!-- Expanded version list -->\n @if (expandedArtifactId === artifact.artifactId && artifact.versionCount > 1) {\n <div class=\"artifact-versions-list\">\n @for (version of artifact.versions; track version.versionId) {\n <div class=\"artifact-version-item\" (click)=\"openArtifactFromModal(artifact.artifactId, version.versionNumber); $event.stopPropagation()\">\n <span class=\"version-badge\">v{{version.versionNumber}}</span>\n <span class=\"version-open-text\">Open this version</span>\n <i class=\"fas fa-arrow-right\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Collection Picker Modal -->\n@if (showCollectionPicker) {\n <mj-artifact-collection-picker-modal\n [isOpen]=\"showCollectionPicker\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [excludeCollectionIds]=\"collectionPickerExcludedIds\"\n (saved)=\"onCollectionPickerSaved($event)\"\n (cancelled)=\"onCollectionPickerCancelled()\">\n </mj-artifact-collection-picker-modal>\n}", styles: [":host {\n display: flex;\n width: 100%;\n height: 100%;\n}\n.chat-area {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n.chat-header {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid #D9D9D9;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: #FFF;\n z-index: 10;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n.chat-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n.chat-title {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.project-tag {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: #F4F4F4;\n border: 1px solid #D9D9D9;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n.project-tag:hover {\n background: #D9D9D9;\n border-color: #AAA;\n}\n.project-tag i {\n font-size: 10px;\n}\n.chat-members {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: #F4F4F4;\n border: none;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 500;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 32px;\n}\n.chat-members:hover {\n background: #D9D9D9;\n color: #333;\n}\n.chat-members i {\n font-size: 12px;\n}\n.chat-members span {\n font-size: 12px;\n font-weight: 500;\n}\n.artifact-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #3B82F6;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n color: white;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.artifact-indicator:hover {\n background: #2563EB;\n}\n.ambient-agent-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #F3F4F6;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n animation: pulse 2s ease-in-out infinite;\n}\n.ambient-agent-indicator i {\n color: #0076B6;\n}\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n.chat-actions {\n display: flex;\n gap: 8px;\n}\n.action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n transition: all 150ms ease;\n}\n.action-btn:hover {\n background: #F9FAFB;\n color: #111827;\n}\n.share-btn.shared {\n background: #EFF6FF;\n border-color: #1e40af;\n color: #1e40af;\n}\n.share-btn.shared:hover {\n background: #DBEAFE;\n color: #1e3a8a;\n}\n.chat-content-area {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.chat-messages-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: 300px;\n overflow: hidden;\n transition: width 0.3s ease;\n}\n.chat-messages-pane.full-width {\n width: 100%;\n}\n.chat-messages-pane:not(.full-width) {\n flex: 1;\n}\n.resize-handle {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n.resize-handle:hover {\n background: #3B82F6;\n}\n.resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n.chat-artifact-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #FAFAFA;\n overflow: hidden;\n flex-shrink: 0;\n}\n.chat-artifact-pane > mj-artifact-viewer-panel {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-container {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: #FFF;\n min-height: 0;\n position: relative;\n}\n.scroll-to-bottom-icon {\n position: sticky;\n bottom: 21px; // 21px from bottom of visible scroll area (moved up 5px from original 16px)\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px; // Negative margin to not affect scroll height\n margin-left: auto;\n margin-right: auto;\n background: white;\n border: 1px solid #D1D5DB;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n.scroll-to-bottom-icon:hover {\n background: #F3F4F6;\n border-color: #3B82F6;\n transform: translateX(-50%) translateY(-2px);\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n}\n.scroll-to-bottom-icon i {\n color: #6B7280;\n font-size: 16px;\n transition: color 0.2s;\n}\n.scroll-to-bottom-icon:hover i {\n color: #3B82F6;\n}\n.chat-input-container {\n flex-shrink: 0;\n background: #FFF;\n padding: 0 1.25rem 1.25rem 1.25rem; // Increased padding to prevent clipping rounded corners\n overflow: visible; // Allow box shadow and rounded corners to show fully\n}\n\n// Loading placeholder - replaces input while loading\n.loading-peripheral-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px; // Match typical input area height\n padding: 24px;\n background: rgba(255, 255, 255, 0.5);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: fadeIn 0.2s ease-in-out;\n}\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n.modal-content {\n background: white;\n border-radius: 8px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n.project-selector-modal {\n width: 600px;\n height: 500px;\n}\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #E5E7EB;\n}\n.modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n.modal-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.toggle-system-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: #F3F4F6;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n color: #6B7280;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n.toggle-system-btn:hover {\n background: #E5E7EB;\n border-color: #D1D5DB;\n color: #374151;\n}\n.toggle-system-btn.active {\n background: #3B82F6;\n border-color: #3B82F6;\n color: white;\n}\n.toggle-system-btn.active:hover {\n background: #2563EB;\n border-color: #2563EB;\n}\n.toggle-system-btn i {\n font-size: 12px;\n}\n.modal-close-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: #6B7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.modal-close-btn:hover {\n background: #F3F4F6;\n color: #111827;\n}\n.modal-body {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n.artifacts-modal {\n width: 700px;\n max-height: 600px;\n}\n.artifacts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n.empty-state {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n.artifact-modal-card {\n display: flex;\n flex-direction: column;\n background: white;\n border: 1.5px solid #E5E7EB;\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n.artifact-modal-card.expanded {\n border-color: #3B82F6;\n}\n.artifact-modal-card.system-artifact {\n opacity: 0.85;\n border-color: #D1D5DB;\n border-style: dashed;\n position: relative;\n}\n.artifact-modal-card.system-artifact::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: #9CA3AF;\n background: #F3F4F6;\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n.artifact-modal-card.system-artifact:hover {\n border-color: #9CA3AF;\n box-shadow: 0 4px 12px rgba(156, 163, 175, 0.15);\n}\n.artifact-card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n.artifact-card-header:hover {\n background: #F9FAFB;\n}\n.artifact-modal-card:hover {\n border-color: #3B82F6;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);\n transform: translateY(-2px);\n}\n.artifact-modal-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #EFF6FF 0%, #DBEAFE 100%);\n border-radius: 10px;\n color: #3B82F6;\n flex-shrink: 0;\n}\n.artifact-modal-icon i {\n font-size: 18px;\n}\n.artifact-modal-info {\n flex: 1;\n min-width: 0;\n}\n.artifact-modal-title {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n margin-bottom: 4px;\n}\n.artifact-modal-meta {\n font-size: 12px;\n color: #6B7280;\n}\n.artifact-modal-action {\n color: #9CA3AF;\n transition: color 0.2s;\n}\n.artifact-modal-card:hover .artifact-modal-action {\n color: #3B82F6;\n}\n.expand-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #6B7280;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n\n &:hover {\n background: #F3F4F6;\n color: #3B82F6;\n }\n}\n.artifact-versions-list {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: #F9FAFB;\n}\n.artifact-version-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px; // Indent to align with title\n cursor: pointer;\n transition: background 0.15s;\n\n &:hover {\n background: #F3F4F6;\n }\n\n .version-badge {\n display: inline-block;\n padding: 4px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n }\n\n .version-open-text {\n flex: 1;\n font-size: 13px;\n color: #6B7280;\n }\n\n i {\n color: #9CA3AF;\n font-size: 12px;\n }\n\n &:hover {\n .version-badge {\n background: #4F46E5;\n color: white;\n }\n .version-open-text {\n color: #3B82F6;\n }\n i {\n color: #3B82F6;\n }\n }\n}\n\n// Loading content styling\n.loading-peripheral-content {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: white;\n border: 2px solid #E5E7EB;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n color: #4B5563;\n font-size: 14px;\n font-weight: 500;\n\n i {\n font-size: 20px;\n color: #9333EA;\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n// Loading conversation state - centered spinner\n.conversation-loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: #6B7280;\n font-size: 15px;\n\n i {\n font-size: 32px;\n color: #3B82F6;\n }\n\n span {\n font-weight: 500;\n }\n}\n"] }]
1775
+ args: [{ selector: 'mj-conversation-chat-area', template: "<div class=\"chat-area\">\n <!-- Fixed Header -->\n <div class=\"chat-header\" *ngIf=\"conversationState.activeConversation as conversation\">\n <div class=\"chat-info\">\n <div class=\"chat-title\">{{ conversation.Name }}</div>\n <button class=\"project-tag\" (click)=\"openProjectSelector()\" title=\"Assign to project\" *ngIf=\"conversation.ProjectID\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ conversation.Project || 'Project' }}</span>\n </button>\n <button class=\"chat-members\" (click)=\"toggleMembersModal()\" title=\"View members\">\n <i class=\"fas fa-users\"></i>\n <span>{{ memberCount }} member{{ memberCount !== 1 ? 's' : '' }}</span>\n </button>\n <button class=\"artifact-indicator\" (click)=\"viewArtifacts()\" title=\"View artifacts\" *ngIf=\"artifactCountDisplay > 0\">\n <i class=\"fas fa-cube\"></i>\n <span>{{ artifactCountDisplay }} artifact{{ artifactCountDisplay !== 1 ? 's' : '' }}</span>\n </button>\n <mj-active-agent-indicator\n [conversationId]=\"conversationState.activeConversation.ID\"\n [currentUser]=\"currentUser\"\n (togglePanel)=\"onToggleAgentPanel()\"\n (agentSelected)=\"onAgentSelected($event)\">\n </mj-active-agent-indicator>\n </div>\n <div class=\"chat-actions\">\n <button class=\"action-btn\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n Export\n </button>\n <button class=\"action-btn share-btn\"\n [class.shared]=\"isShared\"\n (click)=\"shareConversation()\"\n [title]=\"isShared ? 'Manage sharing' : 'Share conversation'\">\n <i class=\"fas fa-share-nodes\"></i>\n Share\n </button>\n </div>\n </div>\n\n <!-- Messages and Artifact Split Layout -->\n <div class=\"chat-content-area\">\n <!-- Messages Pane -->\n <div class=\"chat-messages-pane\" [class.full-width]=\"!showArtifactPanel\">\n @if (!conversationState.activeConversation || conversationState.isNewUnsavedConversation) {\n <!-- Empty State - No conversation selected OR new unsaved conversation -->\n <mj-conversation-empty-state\n [currentUser]=\"currentUser\"\n [disabled]=\"isProcessing\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads -->\n <div class=\"conversation-loading-state\">\n <div class=\"loading-content\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading conversation...</span>\n </div>\n </div>\n } @else {\n <!-- Normal Message View -->\n <div class=\"chat-messages-wrapper\">\n <div class=\"chat-messages-container\" #scrollContainer (scroll)=\"checkScroll()\">\n <mj-conversation-message-list\n [messages]=\"messages\"\n [conversation]=\"conversationState.activeConversation\"\n [currentUser]=\"currentUser\"\n [isProcessing]=\"isProcessing\"\n [artifactMap]=\"effectiveArtifactsMap\"\n [agentRunMap]=\"agentRunsByDetailId\"\n [ratingsMap]=\"ratingsByDetailId\"\n [userAvatarMap]=\"userAvatarMap\"\n (replyInThread)=\"onReplyInThread($event)\"\n (viewThread)=\"onViewThread($event)\"\n (retryMessage)=\"onRetryMessage($event)\"\n (artifactClicked)=\"onArtifactClicked($event)\"\n (messageEdited)=\"onMessageEdited($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (suggestedResponseSelected)=\"onSuggestedResponseSelected($event)\">\n </mj-conversation-message-list>\n\n <!-- Scroll to Bottom Icon (positioned within scroll container for proper centering) -->\n <span class=\"scroll-to-bottom-icon\" style=\"left: 50%;\"\n *ngIf=\"showScrollToBottomIcon && messages && messages.length > 0\"\n (click)=\"scrollToBottomAnimate()\">\n <i class=\"fas fa-arrow-down\"></i>\n </span>\n </div>\n\n <!-- Fixed Input Area -->\n <div class=\"chat-input-container\">\n @if (isLoadingPeripheralData) {\n <!-- Loading State -->\n <div class=\"loading-peripheral-placeholder\">\n <div class=\"loading-peripheral-content\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading conversation data...</span>\n </div>\n </div>\n } @else {\n <!-- Input Component - Multiple instances cached, only one visible -->\n <div class=\"message-input-container-wrapper\">\n @for (inputRef of getCachedInputs(); track inputRef.conversationId) {\n <mj-message-input\n #messageInput\n [hidden]=\"inputRef.conversationId !== conversationState.activeConversation.ID\"\n [conversationId]=\"inputRef.conversationId\"\n [conversationName]=\"inputRef.conversationName\"\n [currentUser]=\"currentUser\"\n [conversationHistory]=\"inputRef.conversationId === conversationState.activeConversation.ID ? messages : []\"\n [artifactsByDetailId]=\"inputRef.conversationId === conversationState.activeConversation.ID ? artifactsByDetailId : emptyArtifactsMap\"\n [agentRunsByDetailId]=\"inputRef.conversationId === conversationState.activeConversation.ID ? agentRunsByDetailId : emptyAgentRunsMap\"\n [inProgressMessageIds]=\"inputRef.conversationId === conversationState.activeConversation.ID ? inProgressMessageIds : emptyInProgressIds\"\n [disabled]=\"isProcessing\"\n [initialMessage]=\"inputRef.conversationId === conversationState.activeConversation.ID ? conversationState.pendingMessageToSend : null\"\n (messageSent)=\"onMessageSent($event)\"\n (agentResponse)=\"onAgentResponse($event)\"\n (agentRunDetected)=\"onAgentRunDetected($event)\"\n (agentRunUpdate)=\"onAgentRunUpdate($event)\"\n (messageComplete)=\"onMessageComplete($event)\"\n (artifactCreated)=\"onArtifactCreated($event)\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (intentCheckStarted)=\"onIntentCheckStarted()\"\n (intentCheckCompleted)=\"onIntentCheckCompleted()\">\n </mj-message-input>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Artifact Viewer Pane -->\n @if (showArtifactPanel && selectedArtifactId) {\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event)\"></div>\n <div class=\"chat-artifact-pane\" [style.width.%]=\"artifactPaneWidth\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"selectedVersionNumber\"\n [viewContext]=\"'conversation'\"\n [canShare]=\"canShareSelectedArtifact\"\n [canEdit]=\"canEditSelectedArtifact\"\n [refreshTrigger]=\"artifactViewerRefresh$\"\n (closed)=\"onCloseArtifactPanel()\"\n (saveToCollectionRequested)=\"onSaveToCollectionRequested($event)\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n </div>\n</div>\n\n<!-- Thread Panel -->\n@if (conversationState.activeThreadId) {\n <mj-thread-panel\n [parentMessageId]=\"conversationState.activeThreadId\"\n [conversationId]=\"conversationState.activeConversation?.ID || ''\"\n [currentUser]=\"currentUser\"\n (closed)=\"onThreadClosed()\"\n (replyAdded)=\"onThreadReplyAdded($event)\">\n </mj-thread-panel>\n}\n\n<!-- Export Modal -->\n<mj-export-modal\n [isVisible]=\"showExportModal\"\n [conversation]=\"conversationState.activeConversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"onExportModalCancelled()\"\n (exported)=\"onExportModalComplete()\">\n</mj-export-modal>\n\n<!-- Members Modal -->\n<mj-members-modal\n [isVisible]=\"showMembersModal\"\n [conversation]=\"conversationState.activeConversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"showMembersModal = false\"\n (membersChanged)=\"showMembersModal = false\">\n</mj-members-modal>\n\n<!-- Project Selector Modal -->\n@if (showProjectSelector && conversationState.activeConversation) {\n <div class=\"modal-overlay\" (click)=\"showProjectSelector = false\">\n <div class=\"modal-content project-selector-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Assign Project</h3>\n <button class=\"modal-close-btn\" (click)=\"showProjectSelector = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <mj-project-selector\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedProjectId]=\"conversationState.activeConversation.ProjectID\"\n (projectSelected)=\"onProjectSelected($event)\">\n </mj-project-selector>\n </div>\n </div>\n </div>\n}\n\n<!-- Artifacts Modal -->\n@if (showArtifactsModal) {\n <div class=\"modal-overlay\" (click)=\"showArtifactsModal = false\">\n <div class=\"modal-content artifacts-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Conversation Artifacts</h3>\n <div class=\"modal-header-actions\">\n @if (hasSystemArtifacts) {\n <button class=\"toggle-system-btn\"\n [class.active]=\"showSystemArtifacts\"\n (click)=\"toggleSystemArtifacts()\"\n title=\"Toggle system artifacts visibility\">\n <i class=\"fas fa-cog\"></i>\n <span>{{ showSystemArtifacts ? 'Hide' : 'Show' }} System</span>\n </button>\n }\n <button class=\"modal-close-btn\" (click)=\"showArtifactsModal = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body artifacts-grid\">\n @if (artifactsByDetailId.size === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-cube\" style=\"font-size: 48px; color: #D1D5DB; margin-bottom: 16px;\"></i>\n <p style=\"color: #6B7280; font-size: 14px;\">No artifacts in this conversation yet</p>\n </div>\n }\n @for (artifact of getArtifactsArray(); track artifact.artifactId) {\n <div class=\"artifact-modal-card\"\n [class.expanded]=\"expandedArtifactId === artifact.artifactId\"\n [class.system-artifact]=\"artifact.visibility === 'System Only'\">\n <!-- Main card header - click to open latest version -->\n <div class=\"artifact-card-header\" (click)=\"openArtifactFromModal(artifact.artifactId)\">\n <div class=\"artifact-modal-icon\">\n <i class=\"fas fa-file-code\"></i>\n </div>\n <div class=\"artifact-modal-info\">\n <div class=\"artifact-modal-title\">{{artifact.name}}</div>\n <div class=\"artifact-modal-meta\">\n @if (artifact.versionCount > 1) {\n {{artifact.versionCount}} versions\n } @else {\n 1 version\n }\n </div>\n </div>\n @if (artifact.versionCount > 1) {\n <button class=\"expand-btn\" (click)=\"toggleArtifactExpansion(artifact.artifactId, $event)\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedArtifactId !== artifact.artifactId\"\n [class.fa-chevron-up]=\"expandedArtifactId === artifact.artifactId\"></i>\n </button>\n }\n <div class=\"artifact-modal-action\">\n <i class=\"fas fa-external-link-alt\"></i>\n </div>\n </div>\n\n <!-- Expanded version list -->\n @if (expandedArtifactId === artifact.artifactId && artifact.versionCount > 1) {\n <div class=\"artifact-versions-list\">\n @for (version of artifact.versions; track version.versionId) {\n <div class=\"artifact-version-item\" (click)=\"openArtifactFromModal(artifact.artifactId, version.versionNumber); $event.stopPropagation()\">\n <span class=\"version-badge\">v{{version.versionNumber}}</span>\n <span class=\"version-open-text\">Open this version</span>\n <i class=\"fas fa-arrow-right\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Collection Picker Modal -->\n@if (showCollectionPicker) {\n <mj-artifact-collection-picker-modal\n [isOpen]=\"showCollectionPicker\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [excludeCollectionIds]=\"collectionPickerExcludedIds\"\n (saved)=\"onCollectionPickerSaved($event)\"\n (cancelled)=\"onCollectionPickerCancelled()\">\n </mj-artifact-collection-picker-modal>\n}", styles: [":host {\n display: flex;\n width: 100%;\n height: 100%;\n}\n.chat-area {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n.chat-header {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid #D9D9D9;\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: #FFF;\n z-index: 10;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n}\n.chat-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n.chat-title {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.project-tag {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: #F4F4F4;\n border: 1px solid #D9D9D9;\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n.project-tag:hover {\n background: #D9D9D9;\n border-color: #AAA;\n}\n.project-tag i {\n font-size: 10px;\n}\n.chat-members {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: #F4F4F4;\n border: none;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 500;\n color: #AAA;\n cursor: pointer;\n transition: all 0.2s;\n height: 32px;\n}\n.chat-members:hover {\n background: #D9D9D9;\n color: #333;\n}\n.chat-members i {\n font-size: 12px;\n}\n.chat-members span {\n font-size: 12px;\n font-weight: 500;\n}\n.artifact-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #3B82F6;\n border: none;\n border-radius: 6px;\n font-size: 13px;\n color: white;\n cursor: pointer;\n transition: all 150ms ease;\n}\n.artifact-indicator:hover {\n background: #2563EB;\n}\n.ambient-agent-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: #F3F4F6;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n animation: pulse 2s ease-in-out infinite;\n}\n.ambient-agent-indicator i {\n color: #0076B6;\n}\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n.chat-actions {\n display: flex;\n gap: 8px;\n}\n.action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: #6B7280;\n transition: all 150ms ease;\n}\n.action-btn:hover {\n background: #F9FAFB;\n color: #111827;\n}\n.share-btn.shared {\n background: #EFF6FF;\n border-color: #1e40af;\n color: #1e40af;\n}\n.share-btn.shared:hover {\n background: #DBEAFE;\n color: #1e3a8a;\n}\n.chat-content-area {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n.chat-messages-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: 300px;\n overflow: hidden;\n transition: width 0.3s ease;\n}\n.chat-messages-pane.full-width {\n width: 100%;\n}\n.chat-messages-pane:not(.full-width) {\n flex: 1;\n}\n.resize-handle {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n.resize-handle:hover {\n background: #3B82F6;\n}\n.resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n.chat-artifact-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: #FAFAFA;\n overflow: hidden;\n flex-shrink: 0;\n}\n.chat-artifact-pane > mj-artifact-viewer-panel {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n}\n.chat-messages-container {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: #FFF;\n min-height: 0;\n position: relative;\n}\n.scroll-to-bottom-icon {\n position: sticky;\n bottom: 21px; // 21px from bottom of visible scroll area (moved up 5px from original 16px)\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px; // Negative margin to not affect scroll height\n margin-left: auto;\n margin-right: auto;\n background: white;\n border: 1px solid #D1D5DB;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n.scroll-to-bottom-icon:hover {\n background: #F3F4F6;\n border-color: #3B82F6;\n transform: translateX(-50%) translateY(-2px);\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.2);\n}\n.scroll-to-bottom-icon i {\n color: #6B7280;\n font-size: 16px;\n transition: color 0.2s;\n}\n.scroll-to-bottom-icon:hover i {\n color: #3B82F6;\n}\n.chat-input-container {\n flex-shrink: 0;\n background: #FFF;\n padding: 0 1.25rem 1.25rem 1.25rem; // Increased padding to prevent clipping rounded corners\n overflow: visible; // Allow box shadow and rounded corners to show fully\n}\n\n// Loading placeholder - replaces input while loading\n.loading-peripheral-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px; // Match typical input area height\n padding: 24px;\n background: rgba(255, 255, 255, 0.5);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: fadeIn 0.2s ease-in-out;\n}\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n.modal-content {\n background: white;\n border-radius: 8px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n.project-selector-modal {\n width: 600px;\n height: 500px;\n}\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #E5E7EB;\n}\n.modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n.modal-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.toggle-system-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: #F3F4F6;\n border: 1px solid #E5E7EB;\n cursor: pointer;\n color: #6B7280;\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n.toggle-system-btn:hover {\n background: #E5E7EB;\n border-color: #D1D5DB;\n color: #374151;\n}\n.toggle-system-btn.active {\n background: #3B82F6;\n border-color: #3B82F6;\n color: white;\n}\n.toggle-system-btn.active:hover {\n background: #2563EB;\n border-color: #2563EB;\n}\n.toggle-system-btn i {\n font-size: 12px;\n}\n.modal-close-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: #6B7280;\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n.modal-close-btn:hover {\n background: #F3F4F6;\n color: #111827;\n}\n.modal-body {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n.artifacts-modal {\n width: 700px;\n max-height: 600px;\n}\n.artifacts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n.empty-state {\n grid-column: 1 / -1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n.artifact-modal-card {\n display: flex;\n flex-direction: column;\n background: white;\n border: 1.5px solid #E5E7EB;\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n.artifact-modal-card.expanded {\n border-color: #3B82F6;\n}\n.artifact-modal-card.system-artifact {\n opacity: 0.85;\n border-color: #D1D5DB;\n border-style: dashed;\n position: relative;\n}\n.artifact-modal-card.system-artifact::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: #9CA3AF;\n background: #F3F4F6;\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n.artifact-modal-card.system-artifact:hover {\n border-color: #9CA3AF;\n box-shadow: 0 4px 12px rgba(156, 163, 175, 0.15);\n}\n.artifact-card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n.artifact-card-header:hover {\n background: #F9FAFB;\n}\n.artifact-modal-card:hover {\n border-color: #3B82F6;\n box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);\n transform: translateY(-2px);\n}\n.artifact-modal-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: linear-gradient(135deg, #EFF6FF 0%, #DBEAFE 100%);\n border-radius: 10px;\n color: #3B82F6;\n flex-shrink: 0;\n}\n.artifact-modal-icon i {\n font-size: 18px;\n}\n.artifact-modal-info {\n flex: 1;\n min-width: 0;\n}\n.artifact-modal-title {\n font-size: 14px;\n font-weight: 600;\n color: #1F2937;\n margin-bottom: 4px;\n}\n.artifact-modal-meta {\n font-size: 12px;\n color: #6B7280;\n}\n.artifact-modal-action {\n color: #9CA3AF;\n transition: color 0.2s;\n}\n.artifact-modal-card:hover .artifact-modal-action {\n color: #3B82F6;\n}\n.expand-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #6B7280;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n\n &:hover {\n background: #F3F4F6;\n color: #3B82F6;\n }\n}\n.artifact-versions-list {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: #F9FAFB;\n}\n.artifact-version-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px; // Indent to align with title\n cursor: pointer;\n transition: background 0.15s;\n\n &:hover {\n background: #F3F4F6;\n }\n\n .version-badge {\n display: inline-block;\n padding: 4px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n }\n\n .version-open-text {\n flex: 1;\n font-size: 13px;\n color: #6B7280;\n }\n\n i {\n color: #9CA3AF;\n font-size: 12px;\n }\n\n &:hover {\n .version-badge {\n background: #4F46E5;\n color: white;\n }\n .version-open-text {\n color: #3B82F6;\n }\n i {\n color: #3B82F6;\n }\n }\n}\n\n// Loading content styling\n.loading-peripheral-content {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: white;\n border: 2px solid #E5E7EB;\n border-radius: 12px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);\n color: #4B5563;\n font-size: 14px;\n font-weight: 500;\n\n i {\n font-size: 20px;\n color: #9333EA;\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n// Loading conversation state - centered spinner\n.conversation-loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: #6B7280;\n font-size: 15px;\n\n i {\n font-size: 32px;\n color: #3B82F6;\n }\n\n span {\n font-weight: 500;\n }\n}\n"] }]
1654
1776
  }], () => [{ type: i1.ConversationStateService }, { type: i2.AgentStateService }, { type: i3.ConversationAgentService }, { type: i4.ActiveTasksService }, { type: i0.ChangeDetectorRef }, { type: i5.MentionAutocompleteService }, { type: i6.ArtifactPermissionService }], { environmentId: [{
1655
1777
  type: Input
1656
1778
  }], currentUser: [{
@@ -1673,5 +1795,5 @@ export class ConversationChatAreaComponent {
1673
1795
  type: ViewChild,
1674
1796
  args: [ArtifactViewerPanelComponent]
1675
1797
  }] }); })();
1676
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationChatAreaComponent, { className: "ConversationChatAreaComponent", filePath: "src/lib/components/conversation/conversation-chat-area.component.ts", lineNumber: 42 }); })();
1798
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationChatAreaComponent, { className: "ConversationChatAreaComponent", filePath: "src/lib/components/conversation/conversation-chat-area.component.ts", lineNumber: 21 }); })();
1677
1799
  //# sourceMappingURL=conversation-chat-area.component.js.map