@memberjunction/ng-conversations 2.111.1 → 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 (106) hide show
  1. package/dist/lib/components/collection/artifact-create-modal.component.js +1 -1
  2. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  3. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +8 -7
  4. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  5. package/dist/lib/components/collection/collection-artifact-card.component.js +52 -36
  6. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  7. package/dist/lib/components/collection/collection-view.component.d.ts +28 -9
  8. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  9. package/dist/lib/components/collection/collection-view.component.js +124 -58
  10. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  11. package/dist/lib/components/collection/collections-full-view.component.d.ts +18 -6
  12. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  13. package/dist/lib/components/collection/collections-full-view.component.js +82 -58
  14. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  15. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +37 -0
  16. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  17. package/dist/lib/components/conversation/conversation-chat-area.component.js +278 -162
  18. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  19. package/dist/lib/components/conversation/conversation-list.component.d.ts +10 -3
  20. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  21. package/dist/lib/components/conversation/conversation-list.component.js +118 -77
  22. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  23. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +25 -0
  24. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -0
  25. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +206 -0
  26. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -0
  27. package/dist/lib/components/message/conversation-message-rating.component.d.ts +47 -0
  28. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -0
  29. package/dist/lib/components/message/conversation-message-rating.component.js +224 -0
  30. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -0
  31. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  32. package/dist/lib/components/message/message-input-box.component.js +2 -12
  33. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  34. package/dist/lib/components/message/message-input.component.d.ts +17 -2
  35. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  36. package/dist/lib/components/message/message-input.component.js +258 -275
  37. package/dist/lib/components/message/message-input.component.js.map +1 -1
  38. package/dist/lib/components/message/message-item.component.d.ts +31 -1
  39. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  40. package/dist/lib/components/message/message-item.component.js +232 -116
  41. package/dist/lib/components/message/message-item.component.js.map +1 -1
  42. package/dist/lib/components/message/message-list.component.d.ts +3 -1
  43. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  44. package/dist/lib/components/message/message-list.component.js +11 -2
  45. package/dist/lib/components/message/message-list.component.js.map +1 -1
  46. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +7 -1
  47. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  48. package/dist/lib/components/navigation/conversation-navigation.component.js +24 -14
  49. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  50. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +17 -28
  51. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  52. package/dist/lib/components/tasks/tasks-dropdown.component.js +175 -217
  53. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  54. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +14 -8
  55. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  56. package/dist/lib/components/workspace/conversation-workspace.component.js +103 -64
  57. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  58. package/dist/lib/conversations.module.d.ts +54 -52
  59. package/dist/lib/conversations.module.d.ts.map +1 -1
  60. package/dist/lib/conversations.module.js +11 -3
  61. package/dist/lib/conversations.module.js.map +1 -1
  62. package/dist/lib/models/conversation-complete-query.model.d.ts +31 -22
  63. package/dist/lib/models/conversation-complete-query.model.d.ts.map +1 -1
  64. package/dist/lib/models/conversation-complete-query.model.js +5 -2
  65. package/dist/lib/models/conversation-complete-query.model.js.map +1 -1
  66. package/dist/lib/models/lazy-artifact-info.d.ts +3 -0
  67. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  68. package/dist/lib/models/lazy-artifact-info.js +7 -2
  69. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  70. package/dist/lib/services/active-tasks.service.d.ts +18 -0
  71. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  72. package/dist/lib/services/active-tasks.service.js +53 -3
  73. package/dist/lib/services/active-tasks.service.js.map +1 -1
  74. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  75. package/dist/lib/services/agent-state.service.js +5 -5
  76. package/dist/lib/services/agent-state.service.js.map +1 -1
  77. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  78. package/dist/lib/services/artifact-permission.service.js +3 -1
  79. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  80. package/dist/lib/services/artifact-state.service.d.ts +22 -5
  81. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  82. package/dist/lib/services/artifact-state.service.js +118 -30
  83. package/dist/lib/services/artifact-state.service.js.map +1 -1
  84. package/dist/lib/services/artifact-use-tracking.service.d.ts +35 -0
  85. package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -0
  86. package/dist/lib/services/artifact-use-tracking.service.js +76 -0
  87. package/dist/lib/services/artifact-use-tracking.service.js.map +1 -0
  88. package/dist/lib/services/conversation-agent.service.d.ts +30 -3
  89. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  90. package/dist/lib/services/conversation-agent.service.js +101 -12
  91. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  92. package/dist/lib/services/conversation-state.service.d.ts +13 -0
  93. package/dist/lib/services/conversation-state.service.d.ts.map +1 -1
  94. package/dist/lib/services/conversation-state.service.js +26 -0
  95. package/dist/lib/services/conversation-state.service.js.map +1 -1
  96. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  97. package/dist/lib/services/mention-autocomplete.service.js +1 -1
  98. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  99. package/dist/lib/services/search.service.d.ts.map +1 -1
  100. package/dist/lib/services/search.service.js +3 -1
  101. package/dist/lib/services/search.service.js.map +1 -1
  102. package/dist/public-api.d.ts +3 -0
  103. package/dist/public-api.d.ts.map +1 -1
  104. package/dist/public-api.js +3 -0
  105. package/dist/public-api.js.map +1 -1
  106. package/package.json +14 -14
@@ -1,5 +1,5 @@
1
1
  import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import { RunView, CompositeKey, KeyValuePair } from '@memberjunction/core';
2
+ import { RunView, CompositeKey, KeyValuePair, LogStatusEx } from '@memberjunction/core';
3
3
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
4
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
5
5
  import * as i0 from "@angular/core";
@@ -10,9 +10,10 @@ import * as i4 from "@angular/forms";
10
10
  import * as i5 from "@memberjunction/ng-artifacts";
11
11
  import * as i6 from "ngx-markdown";
12
12
  import * as i7 from "./suggested-responses.component";
13
- import * as i8 from "../tasks/task-widget.component";
13
+ import * as i8 from "./conversation-message-rating.component";
14
+ import * as i9 from "../tasks/task-widget.component";
14
15
  function MessageItemComponent_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
15
- i0.ɵɵelement(0, "img", 15);
16
+ i0.ɵɵelement(0, "img", 18);
16
17
  } if (rf & 2) {
17
18
  const ctx_r0 = i0.ɵɵnextContext(2);
18
19
  i0.ɵɵproperty("src", ctx_r0.userAvatarUrl, i0.ɵɵsanitizeUrl);
@@ -24,10 +25,10 @@ function MessageItemComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if
24
25
  i0.ɵɵclassMap(ctx_r0.userAvatarIconClass);
25
26
  } }
26
27
  function MessageItemComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
27
- i0.ɵɵelement(0, "i", 17);
28
+ i0.ɵɵelement(0, "i", 20);
28
29
  } }
29
30
  function MessageItemComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵtemplate(0, MessageItemComponent_Conditional_3_Conditional_0_Template, 1, 1, "img", 15)(1, MessageItemComponent_Conditional_3_Conditional_1_Template, 1, 2, "i", 16)(2, MessageItemComponent_Conditional_3_Conditional_2_Template, 1, 0, "i", 17);
31
+ i0.ɵɵtemplate(0, MessageItemComponent_Conditional_3_Conditional_0_Template, 1, 1, "img", 18)(1, MessageItemComponent_Conditional_3_Conditional_1_Template, 1, 2, "i", 19)(2, MessageItemComponent_Conditional_3_Conditional_2_Template, 1, 0, "i", 20);
31
32
  } if (rf & 2) {
32
33
  const ctx_r0 = i0.ɵɵnextContext();
33
34
  i0.ɵɵconditional(ctx_r0.userAvatarUrl ? 0 : ctx_r0.userAvatarIconClass ? 1 : 2);
@@ -39,9 +40,9 @@ function MessageItemComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
39
40
  i0.ɵɵproperty("ngClass", (ctx_r0.aiAgentInfo == null ? null : ctx_r0.aiAgentInfo.iconClass) || "fa-robot");
40
41
  } }
41
42
  function MessageItemComponent_span_12_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelementStart(0, "span", 18);
43
+ i0.ɵɵelementStart(0, "span", 21);
43
44
  i0.ɵɵelement(1, "i", 2);
44
- i0.ɵɵelementStart(2, "span", 19);
45
+ i0.ɵɵelementStart(2, "span", 22);
45
46
  i0.ɵɵtext(3);
46
47
  i0.ɵɵelementEnd()();
47
48
  } if (rf & 2) {
@@ -53,8 +54,8 @@ function MessageItemComponent_span_12_Template(rf, ctx) { if (rf & 1) {
53
54
  i0.ɵɵtextInterpolate(ctx_r0.getStatusText());
54
55
  } }
55
56
  function MessageItemComponent_span_13_Template(rf, ctx) { if (rf & 1) {
56
- i0.ɵɵelementStart(0, "span", 20);
57
- i0.ɵɵelement(1, "i", 21);
57
+ i0.ɵɵelementStart(0, "span", 23);
58
+ i0.ɵɵelement(1, "i", 24);
58
59
  i0.ɵɵtext(2);
59
60
  i0.ɵɵelementEnd();
60
61
  } if (rf & 2) {
@@ -63,24 +64,37 @@ function MessageItemComponent_span_13_Template(rf, ctx) { if (rf & 1) {
63
64
  i0.ɵɵadvance(2);
64
65
  i0.ɵɵtextInterpolate1(" ", ctx_r0.timePillText, " ");
65
66
  } }
67
+ function MessageItemComponent_span_14_span_2_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelementStart(0, "span", 28);
69
+ i0.ɵɵtext(1);
70
+ i0.ɵɵelementEnd();
71
+ } if (rf & 2) {
72
+ const ctx_r0 = i0.ɵɵnextContext(2);
73
+ i0.ɵɵadvance();
74
+ i0.ɵɵtextInterpolate(ctx_r0.getRatingCount());
75
+ } }
66
76
  function MessageItemComponent_span_14_Template(rf, ctx) { if (rf & 1) {
67
77
  const _r2 = i0.ɵɵgetCurrentView();
68
- i0.ɵɵelementStart(0, "span", 22);
78
+ i0.ɵɵelementStart(0, "span", 25);
69
79
  i0.ɵɵlistener("click", function MessageItemComponent_span_14_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleAgentDetails()); });
70
- i0.ɵɵelement(1, "i", 23);
80
+ i0.ɵɵelement(1, "i", 26);
81
+ i0.ɵɵtemplate(2, MessageItemComponent_span_14_span_2_Template, 2, 1, "span", 27);
71
82
  i0.ɵɵelementEnd();
72
83
  } if (rf & 2) {
73
84
  const ctx_r0 = i0.ɵɵnextContext();
74
85
  i0.ɵɵclassProp("expanded", ctx_r0.isAgentDetailsExpanded);
86
+ i0.ɵɵproperty("title", ctx_r0.hasRatings() ? "Agent details & " + ctx_r0.getRatingCount() + " rating(s)" : "Click to view agent execution details");
87
+ i0.ɵɵadvance(2);
88
+ i0.ɵɵproperty("ngIf", ctx_r0.hasRatings());
75
89
  } }
76
90
  function MessageItemComponent_Conditional_16_Conditional_2_Template(rf, ctx) { if (rf & 1) {
77
- i0.ɵɵelementStart(0, "span", 26);
91
+ i0.ɵɵelementStart(0, "span", 31);
78
92
  i0.ɵɵtext(1, "(edited)");
79
93
  i0.ɵɵelementEnd();
80
94
  } }
81
95
  function MessageItemComponent_Conditional_16_Conditional_3_Template(rf, ctx) { if (rf & 1) {
82
96
  const _r3 = i0.ɵɵgetCurrentView();
83
- i0.ɵɵelementStart(0, "div", 29)(1, "mj-artifact-message-card", 30);
97
+ i0.ɵɵelementStart(0, "div", 34)(1, "mj-artifact-message-card", 35);
84
98
  i0.ɵɵlistener("actionPerformed", function MessageItemComponent_Conditional_16_Conditional_3_Template_mj_artifact_message_card_actionPerformed_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onArtifactActionPerformed($event)); });
85
99
  i0.ɵɵelementEnd()();
86
100
  } if (rf & 2) {
@@ -91,7 +105,7 @@ function MessageItemComponent_Conditional_16_Conditional_3_Template(rf, ctx) { i
91
105
  } }
92
106
  function MessageItemComponent_Conditional_16_Conditional_4_Template(rf, ctx) { if (rf & 1) {
93
107
  const _r4 = i0.ɵɵgetCurrentView();
94
- i0.ɵɵelementStart(0, "mj-suggested-responses", 31);
108
+ i0.ɵɵelementStart(0, "mj-suggested-responses", 36);
95
109
  i0.ɵɵlistener("responseSelected", function MessageItemComponent_Conditional_16_Conditional_4_Template_mj_suggested_responses_responseSelected_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSuggestedResponseSelected($event)); });
96
110
  i0.ɵɵelementEnd();
97
111
  } if (rf & 2) {
@@ -99,11 +113,11 @@ function MessageItemComponent_Conditional_16_Conditional_4_Template(rf, ctx) { i
99
113
  i0.ɵɵproperty("suggestedResponses", ctx_r0.suggestedResponses)("disabled", ctx_r0.isProcessing)("isLastMessage", ctx_r0.isLastMessageInConversation)("isConversationOwner", ctx_r0.isConversationOwner);
100
114
  } }
101
115
  function MessageItemComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
102
- i0.ɵɵelementStart(0, "div", 24);
103
- i0.ɵɵelement(1, "markdown", 25);
104
- i0.ɵɵtemplate(2, MessageItemComponent_Conditional_16_Conditional_2_Template, 2, 0, "span", 26);
116
+ i0.ɵɵelementStart(0, "div", 29);
117
+ i0.ɵɵelement(1, "markdown", 30);
118
+ i0.ɵɵtemplate(2, MessageItemComponent_Conditional_16_Conditional_2_Template, 2, 0, "span", 31);
105
119
  i0.ɵɵelementEnd();
106
- i0.ɵɵtemplate(3, MessageItemComponent_Conditional_16_Conditional_3_Template, 2, 6, "div", 27)(4, MessageItemComponent_Conditional_16_Conditional_4_Template, 1, 4, "mj-suggested-responses", 28);
120
+ i0.ɵɵtemplate(3, MessageItemComponent_Conditional_16_Conditional_3_Template, 2, 6, "div", 32)(4, MessageItemComponent_Conditional_16_Conditional_4_Template, 1, 4, "mj-suggested-responses", 33);
107
121
  } if (rf & 2) {
108
122
  const ctx_r0 = i0.ɵɵnextContext();
109
123
  i0.ɵɵadvance();
@@ -117,21 +131,21 @@ function MessageItemComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
117
131
  } }
118
132
  function MessageItemComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
119
133
  const _r5 = i0.ɵɵgetCurrentView();
120
- i0.ɵɵelementStart(0, "div", 11)(1, "textarea", 32);
134
+ i0.ɵɵelementStart(0, "div", 11)(1, "textarea", 37);
121
135
  i0.ɵɵtwoWayListener("ngModelChange", function MessageItemComponent_Conditional_17_Template_textarea_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.editedText, $event) || (ctx_r0.editedText = $event); return i0.ɵɵresetView($event); });
122
136
  i0.ɵɵlistener("keydown", function MessageItemComponent_Conditional_17_Template_textarea_keydown_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onEditKeydown($event)); });
123
137
  i0.ɵɵelementEnd();
124
- i0.ɵɵelementStart(2, "div", 33)(3, "button", 34);
138
+ i0.ɵɵelementStart(2, "div", 38)(3, "button", 39);
125
139
  i0.ɵɵlistener("click", function MessageItemComponent_Conditional_17_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.saveEdit()); });
126
- i0.ɵɵelement(4, "i", 35);
140
+ i0.ɵɵelement(4, "i", 40);
127
141
  i0.ɵɵtext(5, " Save ");
128
142
  i0.ɵɵelementEnd();
129
- i0.ɵɵelementStart(6, "button", 36);
143
+ i0.ɵɵelementStart(6, "button", 41);
130
144
  i0.ɵɵlistener("click", function MessageItemComponent_Conditional_17_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.cancelEditing()); });
131
- i0.ɵɵelement(7, "i", 37);
145
+ i0.ɵɵelement(7, "i", 42);
132
146
  i0.ɵɵtext(8, " Cancel ");
133
147
  i0.ɵɵelementEnd()();
134
- i0.ɵɵelementStart(9, "div", 38);
148
+ i0.ɵɵelementStart(9, "div", 43);
135
149
  i0.ɵɵtext(10, " Press Enter to save, Shift+Enter for new line, Escape to cancel ");
136
150
  i0.ɵɵelementEnd()();
137
151
  } if (rf & 2) {
@@ -139,11 +153,61 @@ function MessageItemComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
139
153
  i0.ɵɵadvance();
140
154
  i0.ɵɵtwoWayProperty("ngModel", ctx_r0.editedText);
141
155
  } }
142
- function MessageItemComponent_Conditional_18_Conditional_1_div_15_Template(rf, ctx) { if (rf & 1) {
143
- i0.ɵɵelementStart(0, "div", 45)(1, "span", 46);
156
+ function MessageItemComponent_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
157
+ const _r6 = i0.ɵɵgetCurrentView();
158
+ i0.ɵɵelementStart(0, "div", 45)(1, "button", 46);
159
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_18_Conditional_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onPinClick()); });
160
+ i0.ɵɵelement(2, "i", 47);
161
+ i0.ɵɵelementEnd();
162
+ i0.ɵɵelementStart(3, "button", 48);
163
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_18_Conditional_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onDeleteClick()); });
164
+ i0.ɵɵelement(4, "i", 49);
165
+ i0.ɵɵelementEnd()();
166
+ } if (rf & 2) {
167
+ const ctx_r0 = i0.ɵɵnextContext(2);
168
+ i0.ɵɵadvance();
169
+ i0.ɵɵproperty("title", ctx_r0.message.IsPinned ? "Unpin Message" : "Pin Message");
170
+ i0.ɵɵadvance();
171
+ i0.ɵɵclassProp("pinned", ctx_r0.message.IsPinned);
172
+ } }
173
+ function MessageItemComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
174
+ i0.ɵɵelementStart(0, "div", 12);
175
+ i0.ɵɵelement(1, "mj-conversation-message-rating", 44);
176
+ i0.ɵɵtemplate(2, MessageItemComponent_Conditional_18_Conditional_2_Template, 5, 3, "div", 45);
177
+ i0.ɵɵelementEnd();
178
+ } if (rf & 2) {
179
+ const ctx_r0 = i0.ɵɵnextContext();
180
+ i0.ɵɵadvance();
181
+ i0.ɵɵproperty("conversationDetailId", ctx_r0.message.ID)("currentUser", ctx_r0.currentUser)("ratingsData", ctx_r0.ratings);
182
+ i0.ɵɵadvance();
183
+ i0.ɵɵconditional(ctx_r0.isLastMessage ? 2 : -1);
184
+ } }
185
+ function MessageItemComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
186
+ const _r7 = i0.ɵɵgetCurrentView();
187
+ i0.ɵɵelementStart(0, "div", 14)(1, "div", 50);
188
+ i0.ɵɵelement(2, "mj-conversation-message-rating", 44);
189
+ i0.ɵɵelementStart(3, "div", 51)(4, "button", 46);
190
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_20_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onPinClick()); });
191
+ i0.ɵɵelement(5, "i", 47);
192
+ i0.ɵɵelementEnd();
193
+ i0.ɵɵelementStart(6, "button", 48);
194
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_20_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onDeleteClick()); });
195
+ i0.ɵɵelement(7, "i", 49);
196
+ i0.ɵɵelementEnd()()()();
197
+ } if (rf & 2) {
198
+ const ctx_r0 = i0.ɵɵnextContext();
199
+ i0.ɵɵadvance(2);
200
+ i0.ɵɵproperty("conversationDetailId", ctx_r0.message.ID)("currentUser", ctx_r0.currentUser)("ratingsData", ctx_r0.ratings);
201
+ i0.ɵɵadvance(2);
202
+ i0.ɵɵproperty("title", ctx_r0.message.IsPinned ? "Unpin Message" : "Pin Message");
203
+ i0.ɵɵadvance();
204
+ i0.ɵɵclassProp("pinned", ctx_r0.message.IsPinned);
205
+ } }
206
+ function MessageItemComponent_Conditional_21_Conditional_1_div_15_Template(rf, ctx) { if (rf & 1) {
207
+ i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
144
208
  i0.ɵɵtext(2, "Steps:");
145
209
  i0.ɵɵelementEnd();
146
- i0.ɵɵelementStart(3, "span", 47);
210
+ i0.ɵɵelementStart(3, "span", 60);
147
211
  i0.ɵɵtext(4);
148
212
  i0.ɵɵelementEnd()();
149
213
  } if (rf & 2) {
@@ -151,11 +215,11 @@ function MessageItemComponent_Conditional_18_Conditional_1_div_15_Template(rf, c
151
215
  i0.ɵɵadvance(4);
152
216
  i0.ɵɵtextInterpolate(ctx_r0.agentRunStepCount);
153
217
  } }
154
- function MessageItemComponent_Conditional_18_Conditional_1_div_16_Template(rf, ctx) { if (rf & 1) {
155
- i0.ɵɵelementStart(0, "div", 45)(1, "span", 46);
218
+ function MessageItemComponent_Conditional_21_Conditional_1_div_16_Template(rf, ctx) { if (rf & 1) {
219
+ i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
156
220
  i0.ɵɵtext(2, "Tokens:");
157
221
  i0.ɵɵelementEnd();
158
- i0.ɵɵelementStart(3, "span", 47);
222
+ i0.ɵɵelementStart(3, "span", 60);
159
223
  i0.ɵɵtext(4);
160
224
  i0.ɵɵelementEnd()();
161
225
  } if (rf & 2) {
@@ -163,11 +227,11 @@ function MessageItemComponent_Conditional_18_Conditional_1_div_16_Template(rf, c
163
227
  i0.ɵɵadvance(4);
164
228
  i0.ɵɵtextInterpolate(ctx_r0.formatNumber(ctx_r0.agentRunTotalTokens));
165
229
  } }
166
- function MessageItemComponent_Conditional_18_Conditional_1_div_17_Template(rf, ctx) { if (rf & 1) {
167
- i0.ɵɵelementStart(0, "div", 45)(1, "span", 46);
230
+ function MessageItemComponent_Conditional_21_Conditional_1_div_17_Template(rf, ctx) { if (rf & 1) {
231
+ i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
168
232
  i0.ɵɵtext(2, "Cost:");
169
233
  i0.ɵɵelementEnd();
170
- i0.ɵɵelementStart(3, "span", 47);
234
+ i0.ɵɵelementStart(3, "span", 60);
171
235
  i0.ɵɵtext(4);
172
236
  i0.ɵɵelementEnd()();
173
237
  } if (rf & 2) {
@@ -175,11 +239,11 @@ function MessageItemComponent_Conditional_18_Conditional_1_div_17_Template(rf, c
175
239
  i0.ɵɵadvance(4);
176
240
  i0.ɵɵtextInterpolate1("\\$", ctx_r0.agentRunTotalCost.toFixed(4), "");
177
241
  } }
178
- function MessageItemComponent_Conditional_18_Conditional_1_div_18_Template(rf, ctx) { if (rf & 1) {
179
- i0.ɵɵelementStart(0, "div", 45)(1, "span", 46);
242
+ function MessageItemComponent_Conditional_21_Conditional_1_div_18_Template(rf, ctx) { if (rf & 1) {
243
+ i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
180
244
  i0.ɵɵtext(2, "Status:");
181
245
  i0.ɵɵelementEnd();
182
- i0.ɵɵelementStart(3, "span", 51);
246
+ i0.ɵɵelementStart(3, "span", 64);
183
247
  i0.ɵɵtext(4);
184
248
  i0.ɵɵelementEnd()();
185
249
  } if (rf & 2) {
@@ -189,25 +253,25 @@ function MessageItemComponent_Conditional_18_Conditional_1_div_18_Template(rf, c
189
253
  i0.ɵɵadvance();
190
254
  i0.ɵɵtextInterpolate1(" ", ctx_r0.agentRun.Status, " ");
191
255
  } }
192
- function MessageItemComponent_Conditional_18_Conditional_1_Template(rf, ctx) { if (rf & 1) {
193
- const _r6 = i0.ɵɵgetCurrentView();
194
- i0.ɵɵelementStart(0, "div", 39)(1, "div", 41);
195
- i0.ɵɵelement(2, "i", 42);
196
- i0.ɵɵelementStart(3, "span")(4, "a", 43);
197
- i0.ɵɵlistener("click", function MessageItemComponent_Conditional_18_Conditional_1_Template_a_click_4_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openAgentRecord()); });
256
+ function MessageItemComponent_Conditional_21_Conditional_1_Template(rf, ctx) { if (rf & 1) {
257
+ const _r8 = i0.ɵɵgetCurrentView();
258
+ i0.ɵɵelementStart(0, "div", 52)(1, "div", 54);
259
+ i0.ɵɵelement(2, "i", 55);
260
+ i0.ɵɵelementStart(3, "span")(4, "a", 56);
261
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_21_Conditional_1_Template_a_click_4_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openAgentRecord()); });
198
262
  i0.ɵɵtext(5);
199
263
  i0.ɵɵelementEnd();
200
264
  i0.ɵɵtext(6, " Run Details ");
201
265
  i0.ɵɵelementEnd()();
202
- i0.ɵɵelementStart(7, "div", 44)(8, "div", 45)(9, "span", 46);
266
+ i0.ɵɵelementStart(7, "div", 57)(8, "div", 58)(9, "span", 59);
203
267
  i0.ɵɵtext(10, "Run ID:");
204
268
  i0.ɵɵelementEnd();
205
- i0.ɵɵelementStart(11, "span", 47)(12, "a", 48);
206
- i0.ɵɵlistener("click", function MessageItemComponent_Conditional_18_Conditional_1_Template_a_click_12_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openAgentRunRecord()); });
269
+ i0.ɵɵelementStart(11, "span", 60)(12, "a", 61);
270
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_21_Conditional_1_Template_a_click_12_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openAgentRunRecord()); });
207
271
  i0.ɵɵtext(13);
208
- i0.ɵɵelement(14, "i", 49);
272
+ i0.ɵɵelement(14, "i", 62);
209
273
  i0.ɵɵelementEnd()()();
210
- i0.ɵɵtemplate(15, MessageItemComponent_Conditional_18_Conditional_1_div_15_Template, 5, 1, "div", 50)(16, MessageItemComponent_Conditional_18_Conditional_1_div_16_Template, 5, 1, "div", 50)(17, MessageItemComponent_Conditional_18_Conditional_1_div_17_Template, 5, 1, "div", 50)(18, MessageItemComponent_Conditional_18_Conditional_1_div_18_Template, 5, 3, "div", 50);
274
+ i0.ɵɵtemplate(15, MessageItemComponent_Conditional_21_Conditional_1_div_15_Template, 5, 1, "div", 63)(16, MessageItemComponent_Conditional_21_Conditional_1_div_16_Template, 5, 1, "div", 63)(17, MessageItemComponent_Conditional_21_Conditional_1_div_17_Template, 5, 1, "div", 63)(18, MessageItemComponent_Conditional_21_Conditional_1_div_18_Template, 5, 3, "div", 63);
211
275
  i0.ɵɵelementEnd()();
212
276
  } if (rf & 2) {
213
277
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -224,20 +288,20 @@ function MessageItemComponent_Conditional_18_Conditional_1_Template(rf, ctx) { i
224
288
  i0.ɵɵadvance();
225
289
  i0.ɵɵproperty("ngIf", ctx_r0.agentRun.Status);
226
290
  } }
227
- function MessageItemComponent_Conditional_18_Conditional_2_mj_task_widget_6_Template(rf, ctx) { if (rf & 1) {
228
- i0.ɵɵelement(0, "mj-task-widget", 56);
291
+ function MessageItemComponent_Conditional_21_Conditional_2_mj_task_widget_6_Template(rf, ctx) { if (rf & 1) {
292
+ i0.ɵɵelement(0, "mj-task-widget", 69);
229
293
  } if (rf & 2) {
230
- const task_r7 = ctx.$implicit;
231
- i0.ɵɵproperty("task", task_r7)("compact", false)("clickable", false)("showProgress", true)("showDuration", true);
294
+ const task_r9 = ctx.$implicit;
295
+ i0.ɵɵproperty("task", task_r9)("compact", false)("clickable", false)("showProgress", true)("showDuration", true);
232
296
  } }
233
- function MessageItemComponent_Conditional_18_Conditional_2_Template(rf, ctx) { if (rf & 1) {
234
- i0.ɵɵelementStart(0, "div", 40)(1, "div", 52);
235
- i0.ɵɵelement(2, "i", 53);
297
+ function MessageItemComponent_Conditional_21_Conditional_2_Template(rf, ctx) { if (rf & 1) {
298
+ i0.ɵɵelementStart(0, "div", 53)(1, "div", 65);
299
+ i0.ɵɵelement(2, "i", 66);
236
300
  i0.ɵɵelementStart(3, "span");
237
301
  i0.ɵɵtext(4);
238
302
  i0.ɵɵelementEnd()();
239
- i0.ɵɵelementStart(5, "div", 54);
240
- i0.ɵɵtemplate(6, MessageItemComponent_Conditional_18_Conditional_2_mj_task_widget_6_Template, 1, 5, "mj-task-widget", 55);
303
+ i0.ɵɵelementStart(5, "div", 67);
304
+ i0.ɵɵtemplate(6, MessageItemComponent_Conditional_21_Conditional_2_mj_task_widget_6_Template, 1, 5, "mj-task-widget", 68);
241
305
  i0.ɵɵelementEnd()();
242
306
  } if (rf & 2) {
243
307
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -246,9 +310,9 @@ function MessageItemComponent_Conditional_18_Conditional_2_Template(rf, ctx) { i
246
310
  i0.ɵɵadvance(2);
247
311
  i0.ɵɵproperty("ngForOf", ctx_r0.detailTasks);
248
312
  } }
249
- function MessageItemComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
250
- i0.ɵɵelementStart(0, "div", 12);
251
- i0.ɵɵtemplate(1, MessageItemComponent_Conditional_18_Conditional_1_Template, 19, 6, "div", 39)(2, MessageItemComponent_Conditional_18_Conditional_2_Template, 7, 2, "div", 40);
313
+ function MessageItemComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
314
+ i0.ɵɵelementStart(0, "div", 15);
315
+ i0.ɵɵtemplate(1, MessageItemComponent_Conditional_21_Conditional_1_Template, 19, 6, "div", 52)(2, MessageItemComponent_Conditional_21_Conditional_2_Template, 7, 2, "div", 53);
252
316
  i0.ɵɵelementEnd();
253
317
  } if (rf & 2) {
254
318
  const ctx_r0 = i0.ɵɵnextContext();
@@ -257,57 +321,26 @@ function MessageItemComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
257
321
  i0.ɵɵadvance();
258
322
  i0.ɵɵconditional(ctx_r0.detailTasks.length > 0 ? 2 : -1);
259
323
  } }
260
- function MessageItemComponent_div_19_button_1_Template(rf, ctx) { if (rf & 1) {
261
- const _r9 = i0.ɵɵgetCurrentView();
262
- i0.ɵɵelementStart(0, "button", 63);
263
- i0.ɵɵlistener("click", function MessageItemComponent_div_19_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onRetryClick()); });
264
- i0.ɵɵelement(1, "i", 64);
265
- i0.ɵɵtext(2, " Retry ");
266
- i0.ɵɵelementEnd();
267
- } }
268
- function MessageItemComponent_div_19_button_4_Template(rf, ctx) { if (rf & 1) {
324
+ function MessageItemComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
269
325
  const _r10 = i0.ɵɵgetCurrentView();
270
- i0.ɵɵelementStart(0, "button", 65);
271
- i0.ɵɵlistener("click", function MessageItemComponent_div_19_button_4_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onEditClick()); });
272
- i0.ɵɵelement(1, "i", 66);
273
- i0.ɵɵelementEnd();
274
- } }
275
- function MessageItemComponent_div_19_Template(rf, ctx) { if (rf & 1) {
276
- const _r8 = i0.ɵɵgetCurrentView();
277
- i0.ɵɵelementStart(0, "div", 57);
278
- i0.ɵɵtemplate(1, MessageItemComponent_div_19_button_1_Template, 3, 0, "button", 58);
279
- i0.ɵɵelementStart(2, "button", 59);
280
- i0.ɵɵlistener("click", function MessageItemComponent_div_19_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onPinClick()); });
281
- i0.ɵɵelement(3, "i", 2);
282
- i0.ɵɵelementEnd();
283
- i0.ɵɵtemplate(4, MessageItemComponent_div_19_button_4_Template, 2, 0, "button", 60);
284
- i0.ɵɵelementStart(5, "button", 61);
285
- i0.ɵɵlistener("click", function MessageItemComponent_div_19_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onDeleteClick()); });
286
- i0.ɵɵelement(6, "i", 62);
326
+ i0.ɵɵelementStart(0, "div", 16)(1, "button", 70);
327
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_22_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onRetryClick()); });
328
+ i0.ɵɵelement(2, "i", 71);
329
+ i0.ɵɵtext(3, " Retry ");
287
330
  i0.ɵɵelementEnd()();
288
- } if (rf & 2) {
289
- const ctx_r0 = i0.ɵɵnextContext();
290
- i0.ɵɵadvance();
291
- i0.ɵɵproperty("ngIf", ctx_r0.messageStatus === "Error" && ctx_r0.isAIMessage);
292
- i0.ɵɵadvance();
293
- i0.ɵɵproperty("title", ctx_r0.message.IsPinned ? "Unpin" : "Pin");
294
- i0.ɵɵadvance();
295
- i0.ɵɵproperty("ngClass", ctx_r0.message.IsPinned ? "fa-thumbtack" : "fa-thumbtack");
296
- i0.ɵɵadvance();
297
- i0.ɵɵproperty("ngIf", ctx_r0.isUserMessage);
298
331
  } }
299
- function MessageItemComponent_div_20_Template(rf, ctx) { if (rf & 1) {
332
+ function MessageItemComponent_div_23_Template(rf, ctx) { if (rf & 1) {
300
333
  const _r11 = i0.ɵɵgetCurrentView();
301
- i0.ɵɵelementStart(0, "div", 67)(1, "button", 68);
302
- i0.ɵɵlistener("click", function MessageItemComponent_div_20_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleReaction("like")); });
303
- i0.ɵɵelement(2, "i", 69);
304
- i0.ɵɵelementStart(3, "span", 70);
334
+ i0.ɵɵelementStart(0, "div", 72)(1, "button", 73);
335
+ i0.ɵɵlistener("click", function MessageItemComponent_div_23_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleReaction("like")); });
336
+ i0.ɵɵelement(2, "i", 74);
337
+ i0.ɵɵelementStart(3, "span", 75);
305
338
  i0.ɵɵtext(4, "0");
306
339
  i0.ɵɵelementEnd()();
307
- i0.ɵɵelementStart(5, "button", 68);
308
- i0.ɵɵlistener("click", function MessageItemComponent_div_20_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleReaction("comment")); });
309
- i0.ɵɵelement(6, "i", 71);
310
- i0.ɵɵelementStart(7, "span", 70);
340
+ i0.ɵɵelementStart(5, "button", 73);
341
+ i0.ɵɵlistener("click", function MessageItemComponent_div_23_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleReaction("comment")); });
342
+ i0.ɵɵelement(6, "i", 76);
343
+ i0.ɵɵelementStart(7, "span", 75);
311
344
  i0.ɵɵtext(8, "0");
312
345
  i0.ɵɵelementEnd()()();
313
346
  } }
@@ -329,6 +362,8 @@ export class MessageItemComponent extends BaseAngularComponent {
329
362
  artifactVersion;
330
363
  agentRun = null; // Passed from parent, loaded once per conversation
331
364
  userAvatarMap = new Map();
365
+ ratings; // Pre-loaded ratings from parent (RatingsJSON from query)
366
+ isLastMessage = false; // Whether this is the last message in the conversation
332
367
  pinClicked = new EventEmitter();
333
368
  editClicked = new EventEmitter();
334
369
  deleteClicked = new EventEmitter();
@@ -380,7 +415,7 @@ export class MessageItemComponent extends BaseAngularComponent {
380
415
  const currentStatus = this.message.Status;
381
416
  // Check if status changed from non-Complete to Complete
382
417
  if (this._previousMessageStatus !== 'Complete' && currentStatus === 'Complete') {
383
- console.log(`🎯 Message ${this.message.ID} status changed to Complete, stopping timer`);
418
+ LogStatusEx({ message: `🎯 Message ${this.message.ID} status changed to Complete, stopping timer`, verboseOnly: true });
384
419
  // Stop the elapsed time interval
385
420
  if (this._elapsedTimeInterval !== null) {
386
421
  clearInterval(this._elapsedTimeInterval);
@@ -393,7 +428,14 @@ export class MessageItemComponent extends BaseAngularComponent {
393
428
  this._previousMessageStatus = currentStatus;
394
429
  }
395
430
  ngAfterViewInit() {
396
- this._loadTime = Date.now();
431
+ // Use message creation timestamp if available (for reconnecting to in-progress messages)
432
+ // Otherwise use current time for brand new messages
433
+ if (this.message?.__mj_CreatedAt) {
434
+ this._loadTime = new Date(this.message.__mj_CreatedAt).getTime();
435
+ }
436
+ else {
437
+ this._loadTime = Date.now();
438
+ }
397
439
  this.startElapsedTimeUpdater();
398
440
  this.cdRef.detectChanges();
399
441
  }
@@ -627,6 +669,67 @@ export class MessageItemComponent extends BaseAngularComponent {
627
669
  get isLastMessageInConversation() {
628
670
  return this.allMessages.indexOf(this.message) === this.allMessages.length - 1;
629
671
  }
672
+ /**
673
+ * Determine if rating component should be shown inline (Option C - Hybrid).
674
+ * Show for latest completed AI message that user hasn't rated yet.
675
+ * For older/already-rated messages, ratings accessible via gear menu.
676
+ */
677
+ shouldShowRating() {
678
+ // Must be an AI message
679
+ if (!this.isAIMessage)
680
+ return false;
681
+ // Must be completed (not in progress or failed)
682
+ if (this.messageStatus !== 'Complete')
683
+ return false;
684
+ // Must not be editing
685
+ if (this.isEditing)
686
+ return false;
687
+ // Must be the last message in conversation
688
+ if (!this.isLastMessageInConversation)
689
+ return false;
690
+ // Check if current user has already rated this message
691
+ if (this.ratings && this.ratings.length > 0) {
692
+ const currentUserId = this.currentUser?.ID;
693
+ const userHasRated = this.ratings.some(r => r.UserID === currentUserId);
694
+ // If user already rated, don't show inline (accessible via gear menu)
695
+ if (userHasRated)
696
+ return false;
697
+ }
698
+ // Show inline rating for latest completed AI message not yet rated by user
699
+ return true;
700
+ }
701
+ /**
702
+ * Check if message has any ratings (for gear icon badge)
703
+ */
704
+ hasRatings() {
705
+ return !!(this.ratings && this.ratings.length > 0);
706
+ }
707
+ /**
708
+ * Get rating count for badge display on gear icon
709
+ */
710
+ getRatingCount() {
711
+ return this.ratings?.length || 0;
712
+ }
713
+ /**
714
+ * Get thumbs up count (ratings >= 8)
715
+ */
716
+ getThumbsUpCount() {
717
+ return this.ratings?.filter(r => r.Rating ? r.Rating >= 8 : false).length || 0;
718
+ }
719
+ /**
720
+ * Get thumbs down count (ratings <= 3)
721
+ */
722
+ getThumbsDownCount() {
723
+ return this.ratings?.filter(r => r.Rating ? r.Rating <= 3 : false).length || 0;
724
+ }
725
+ /**
726
+ * Determine if pin/delete actions should show inline (with rating buttons).
727
+ * Show for latest completed AI message that user hasn't rated yet.
728
+ */
729
+ shouldShowInlineActions() {
730
+ // Same logic as shouldShowRating - latest unrated message
731
+ return this.shouldShowRating();
732
+ }
630
733
  get hasArtifact() {
631
734
  return !!this.artifactVersion;
632
735
  }
@@ -1009,7 +1112,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1009
1112
  this.suggestedResponseSelected.emit(event);
1010
1113
  }
1011
1114
  static ɵfac = function MessageItemComponent_Factory(t) { return new (t || MessageItemComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MentionParserService), i0.ɵɵdirectiveInject(i2.MentionAutocompleteService)); };
1012
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MessageItemComponent, selectors: [["mj-conversation-message-item"]], inputs: { message: "message", conversation: "conversation", currentUser: "currentUser", allMessages: "allMessages", isProcessing: "isProcessing", artifact: "artifact", artifactVersion: "artifactVersion", agentRun: "agentRun", userAvatarMap: "userAvatarMap" }, outputs: { pinClicked: "pinClicked", editClicked: "editClicked", deleteClicked: "deleteClicked", retryClicked: "retryClicked", artifactClicked: "artifactClicked", artifactActionPerformed: "artifactActionPerformed", messageEdited: "messageEdited", openEntityRecord: "openEntityRecord", suggestedResponseSelected: "suggestedResponseSelected" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 21, vars: 21, consts: [[1, "message-avatar"], [1, "avatar-circle"], [1, "fas", 3, "ngClass"], [1, "message-content"], [1, "message-header"], [1, "message-sender", 3, "title"], [1, "message-time"], ["class", "message-status", 3, "error", 4, "ngIf"], ["class", "time-pill", 3, "in-progress", "active", "complete", "failed", 4, "ngIf"], ["class", "agent-run-icon", "title", "Click to view agent execution details", 3, "expanded", "click", 4, "ngIf"], [1, "message-body"], [1, "message-edit-container"], [1, "agent-details-panel"], ["class", "message-actions", 4, "ngIf"], ["class", "message-reactions", 4, "ngIf"], ["alt", "User avatar", 1, "avatar-image", 3, "src"], [3, "class"], [1, "fas", "fa-user"], [1, "message-status"], [1, "status-text"], [1, "time-pill"], [1, "fas", "fa-clock"], ["title", "Click to view agent execution details", 1, "agent-run-icon", 3, "click"], [1, "fas", "fa-cog"], [1, "message-text"], [3, "data"], [1, "edited-badge"], [1, "artifact-wrapper", 3, "system-artifact"], [3, "suggestedResponses", "disabled", "isLastMessage", "isConversationOwner"], [1, "artifact-wrapper"], [3, "actionPerformed", "artifactId", "artifact", "artifactVersion", "currentUser"], [3, "responseSelected", "suggestedResponses", "disabled", "isLastMessage", "isConversationOwner"], ["rows", "4", "placeholder", "Edit your message...", 1, "message-edit-textarea", 3, "ngModelChange", "keydown", "ngModel"], [1, "edit-actions"], [1, "edit-action-btn", "save", 3, "click"], [1, "fas", "fa-check"], [1, "edit-action-btn", "cancel", 3, "click"], [1, "fas", "fa-times"], [1, "edit-hint"], [1, "agent-details-content"], [1, "agent-details-tasks"], [1, "agent-details-header"], [1, "fas", "fa-chart-line"], ["title", "Open agent details", 1, "agent-name-link", 3, "click"], [1, "agent-details-grid"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], ["title", "Open agent run details", 1, "run-id-link", 3, "click"], [1, "fas", "fa-external-link-alt"], ["class", "detail-row", 4, "ngIf"], [1, "detail-value", "status-badge"], [1, "tasks-section-header"], [1, "fas", "fa-tasks"], [1, "tasks-list"], [3, "task", "compact", "clickable", "showProgress", "showDuration", 4, "ngFor", "ngForOf"], [3, "task", "compact", "clickable", "showProgress", "showDuration"], [1, "message-actions"], ["class", "message-action-btn retry-btn", "title", "Retry", 3, "click", 4, "ngIf"], [1, "message-action-btn", 3, "click", "title"], ["class", "message-action-btn", "title", "Edit", 3, "click", 4, "ngIf"], ["title", "Delete", 1, "message-action-btn", "danger", 3, "click"], [1, "fas", "fa-trash"], ["title", "Retry", 1, "message-action-btn", "retry-btn", 3, "click"], [1, "fas", "fa-redo"], ["title", "Edit", 1, "message-action-btn", 3, "click"], [1, "fas", "fa-edit"], [1, "message-reactions"], [1, "reaction-btn", 3, "click"], [1, "far", "fa-thumbs-up"], [1, "reaction-count"], [1, "far", "fa-comment"]], template: function MessageItemComponent_Template(rf, ctx) { if (rf & 1) {
1115
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MessageItemComponent, selectors: [["mj-conversation-message-item"]], inputs: { message: "message", conversation: "conversation", currentUser: "currentUser", allMessages: "allMessages", isProcessing: "isProcessing", artifact: "artifact", artifactVersion: "artifactVersion", agentRun: "agentRun", userAvatarMap: "userAvatarMap", ratings: "ratings", isLastMessage: "isLastMessage" }, outputs: { pinClicked: "pinClicked", editClicked: "editClicked", deleteClicked: "deleteClicked", retryClicked: "retryClicked", artifactClicked: "artifactClicked", artifactActionPerformed: "artifactActionPerformed", messageEdited: "messageEdited", openEntityRecord: "openEntityRecord", suggestedResponseSelected: "suggestedResponseSelected" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 24, vars: 24, consts: [[1, "message-avatar"], [1, "avatar-circle"], [1, "fas", 3, "ngClass"], [1, "message-content"], [1, "message-header"], [1, "message-sender", 3, "title"], [1, "message-time"], ["class", "message-status", 3, "error", 4, "ngIf"], ["class", "time-pill", 3, "in-progress", "active", "complete", "failed", 4, "ngIf"], ["class", "agent-run-icon", 3, "expanded", "title", "click", 4, "ngIf"], [1, "message-body"], [1, "message-edit-container"], [1, "message-footer"], [1, "agent-details-section"], [1, "message-action-bar"], [1, "agent-details-panel"], [1, "message-actions"], ["class", "message-reactions", 4, "ngIf"], ["alt", "User avatar", 1, "avatar-image", 3, "src"], [3, "class"], [1, "fas", "fa-user"], [1, "message-status"], [1, "status-text"], [1, "time-pill"], [1, "fas", "fa-clock"], [1, "agent-run-icon", 3, "click", "title"], [1, "fas", "fa-cog"], ["class", "rating-badge", 4, "ngIf"], [1, "rating-badge"], [1, "message-text"], [3, "data"], [1, "edited-badge"], [1, "artifact-wrapper", 3, "system-artifact"], [3, "suggestedResponses", "disabled", "isLastMessage", "isConversationOwner"], [1, "artifact-wrapper"], [3, "actionPerformed", "artifactId", "artifact", "artifactVersion", "currentUser"], [3, "responseSelected", "suggestedResponses", "disabled", "isLastMessage", "isConversationOwner"], ["rows", "4", "placeholder", "Edit your message...", 1, "message-edit-textarea", 3, "ngModelChange", "keydown", "ngModel"], [1, "edit-actions"], [1, "edit-action-btn", "save", 3, "click"], [1, "fas", "fa-check"], [1, "edit-action-btn", "cancel", 3, "click"], [1, "fas", "fa-times"], [1, "edit-hint"], [3, "conversationDetailId", "currentUser", "ratingsData"], [1, "inline-actions"], [1, "action-bar-btn", 3, "click", "title"], [1, "fas", "fa-thumbtack"], ["title", "Delete Message", 1, "action-bar-btn", "danger", 3, "click"], [1, "fas", "fa-trash"], [1, "action-bar-container"], [1, "action-buttons"], [1, "agent-details-content"], [1, "agent-details-tasks"], [1, "agent-details-header"], [1, "fas", "fa-chart-line"], ["title", "Open agent details", 1, "agent-name-link", 3, "click"], [1, "agent-details-grid"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], ["title", "Open agent run details", 1, "run-id-link", 3, "click"], [1, "fas", "fa-external-link-alt"], ["class", "detail-row", 4, "ngIf"], [1, "detail-value", "status-badge"], [1, "tasks-section-header"], [1, "fas", "fa-tasks"], [1, "tasks-list"], [3, "task", "compact", "clickable", "showProgress", "showDuration", 4, "ngFor", "ngForOf"], [3, "task", "compact", "clickable", "showProgress", "showDuration"], ["title", "Retry", 1, "message-action-btn", "retry-btn", 3, "click"], [1, "fas", "fa-redo"], [1, "message-reactions"], [1, "reaction-btn", 3, "click"], [1, "far", "fa-thumbs-up"], [1, "reaction-count"], [1, "far", "fa-comment"]], template: function MessageItemComponent_Template(rf, ctx) { if (rf & 1) {
1013
1116
  i0.ɵɵelementStart(0, "div")(1, "div", 0)(2, "div", 1);
1014
1117
  i0.ɵɵtemplate(3, MessageItemComponent_Conditional_3_Template, 3, 1)(4, MessageItemComponent_Conditional_4_Template, 1, 1, "i", 2);
1015
1118
  i0.ɵɵelementEnd()();
@@ -1020,15 +1123,20 @@ export class MessageItemComponent extends BaseAngularComponent {
1020
1123
  i0.ɵɵtext(10);
1021
1124
  i0.ɵɵpipe(11, "date");
1022
1125
  i0.ɵɵelementEnd();
1023
- i0.ɵɵtemplate(12, MessageItemComponent_span_12_Template, 4, 4, "span", 7)(13, MessageItemComponent_span_13_Template, 3, 9, "span", 8)(14, MessageItemComponent_span_14_Template, 2, 2, "span", 9);
1126
+ i0.ɵɵtemplate(12, MessageItemComponent_span_12_Template, 4, 4, "span", 7)(13, MessageItemComponent_span_13_Template, 3, 9, "span", 8)(14, MessageItemComponent_span_14_Template, 3, 4, "span", 9);
1024
1127
  i0.ɵɵelementEnd();
1025
1128
  i0.ɵɵelementStart(15, "div", 10);
1026
- i0.ɵɵtemplate(16, MessageItemComponent_Conditional_16_Template, 5, 4)(17, MessageItemComponent_Conditional_17_Template, 11, 1, "div", 11)(18, MessageItemComponent_Conditional_18_Template, 3, 2, "div", 12);
1129
+ i0.ɵɵtemplate(16, MessageItemComponent_Conditional_16_Template, 5, 4)(17, MessageItemComponent_Conditional_17_Template, 11, 1, "div", 11);
1130
+ i0.ɵɵelementEnd();
1131
+ i0.ɵɵtemplate(18, MessageItemComponent_Conditional_18_Template, 3, 4, "div", 12);
1132
+ i0.ɵɵelementStart(19, "div", 13);
1133
+ i0.ɵɵtemplate(20, MessageItemComponent_Conditional_20_Template, 8, 6, "div", 14)(21, MessageItemComponent_Conditional_21_Template, 3, 2, "div", 15);
1027
1134
  i0.ɵɵelementEnd();
1028
- i0.ɵɵtemplate(19, MessageItemComponent_div_19_Template, 7, 4, "div", 13)(20, MessageItemComponent_div_20_Template, 9, 0, "div", 14);
1135
+ i0.ɵɵtemplate(22, MessageItemComponent_Conditional_22_Template, 4, 0, "div", 16)(23, MessageItemComponent_div_23_Template, 9, 0, "div", 17);
1029
1136
  i0.ɵɵelementEnd()();
1030
1137
  } if (rf & 2) {
1031
1138
  i0.ɵɵclassMap(ctx.messageClasses);
1139
+ i0.ɵɵattribute("data-message-id", ctx.message.ID);
1032
1140
  i0.ɵɵadvance(2);
1033
1141
  i0.ɵɵclassProp("ai-avatar", ctx.isAIMessage)("user-avatar", ctx.isUserMessage);
1034
1142
  i0.ɵɵadvance();
@@ -1038,7 +1146,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1038
1146
  i0.ɵɵadvance();
1039
1147
  i0.ɵɵtextInterpolate1(" ", ctx.isAIMessage ? (ctx.aiAgentInfo == null ? null : ctx.aiAgentInfo.name) || "AI Assistant" : ctx.messageSenderName, " ");
1040
1148
  i0.ɵɵadvance(2);
1041
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(11, 18, ctx.message.__mj_CreatedAt, "short"));
1149
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(11, 21, ctx.message.__mj_CreatedAt, "short"));
1042
1150
  i0.ɵɵadvance(2);
1043
1151
  i0.ɵɵproperty("ngIf", ctx.isUserMessage && ctx.messageStatus !== "Complete");
1044
1152
  i0.ɵɵadvance();
@@ -1050,16 +1158,20 @@ export class MessageItemComponent extends BaseAngularComponent {
1050
1158
  i0.ɵɵadvance();
1051
1159
  i0.ɵɵconditional(ctx.isEditing ? 17 : -1);
1052
1160
  i0.ɵɵadvance();
1053
- i0.ɵɵconditional(ctx.isAgentDetailsExpanded && ctx.hasAgentRun ? 18 : -1);
1161
+ i0.ɵɵconditional(ctx.isAIMessage && !ctx.isEditing && ctx.messageStatus === "Complete" && (ctx.isLastMessage || ctx.hasRatings()) ? 18 : -1);
1162
+ i0.ɵɵadvance(2);
1163
+ i0.ɵɵconditional(ctx.isAgentDetailsExpanded && !ctx.isLastMessage && ctx.isAIMessage && ctx.messageStatus === "Complete" ? 20 : -1);
1054
1164
  i0.ɵɵadvance();
1055
- i0.ɵɵproperty("ngIf", !ctx.isProcessing && !ctx.isInProgressAIMessage && !ctx.isEditing);
1165
+ i0.ɵɵconditional(ctx.isAgentDetailsExpanded && ctx.hasAgentRun ? 21 : -1);
1166
+ i0.ɵɵadvance();
1167
+ i0.ɵɵconditional(ctx.messageStatus === "Error" && ctx.isAIMessage && !ctx.isProcessing && !ctx.isEditing ? 22 : -1);
1056
1168
  i0.ɵɵadvance();
1057
1169
  i0.ɵɵproperty("ngIf", !ctx.isProcessing && !ctx.isInProgressAIMessage && !ctx.isEditing);
1058
- } }, dependencies: [i3.NgClass, i3.NgForOf, i3.NgIf, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, i5.ArtifactMessageCardComponent, i6.MarkdownComponent, i7.SuggestedResponsesComponent, i8.TaskWidgetComponent, i3.DatePipe], styles: [".message-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n.message-item.user-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n.message-item.pinned[_ngcontent-%COMP%] {\n border-left: 3px solid #0076B6;\n background-color: rgba(0, 118, 182, 0.08);\n}\n\n.message-item.in-progress[_ngcontent-%COMP%] {\n background: linear-gradient(90deg,\n rgba(59, 130, 246, 0.08) 0%,\n rgba(59, 130, 246, 0.12) 50%,\n rgba(59, 130, 246, 0.08) 100%);\n background-size: 200% 100%;\n animation: _ngcontent-%COMP%_shimmer 2s ease-in-out infinite;\n border-left: 3px solid #3B82F6;\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .message-text[_ngcontent-%COMP%] {\n color: #1F2937;\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n right: 12px;\n top: 22px;\n width: 16px;\n height: 16px;\n border: 2px solid #3B82F6;\n border-top-color: transparent;\n border-radius: 50%;\n animation: _ngcontent-%COMP%_spin 0.8s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n to { transform: rotate(360deg); }\n}\n\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .avatar-circle[_ngcontent-%COMP%] {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(59, 130, 246, 0);\n }\n}\n\n.message-item[_ngcontent-%COMP%]:hover {\n background-color: rgba(0, 0, 0, 0.02);\n}\n\n\n\n[_nghost-%COMP%] .mention-badge {\n display: inline-block;\n padding: 2px 8px;\n margin: 0 2px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n}\n\n[_nghost-%COMP%] .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n[_nghost-%COMP%] .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n\n.message-avatar[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.avatar-circle[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: white;\n}\n\n\n\n.avatar-circle.user-avatar[_ngcontent-%COMP%] {\n border-radius: 50%;\n background-color: #333;\n}\n\n\n\n.avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 8px;\n background-color: #9333EA; \n\n}\n\n\n\n.avatar-image[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n\n\n.artifact-wrapper.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.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\n.message-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #333;\n}\n\n\n\n.agent-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 10px;\n font-size: 11px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.message-time[_ngcontent-%COMP%] {\n color: #9CA3AF;\n font-size: 12px;\n font-weight: 400;\n}\n\n\n\n.time-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n margin-left: auto;\n transition: all 0.3s ease;\n}\n\n.time-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.time-pill.complete[_ngcontent-%COMP%] {\n background: #E0F2FE;\n color: #0369A1;\n}\n\n\n\n.time-pill.in-progress[_ngcontent-%COMP%] {\n background: #F3E8FF;\n color: #7C3AED;\n animation: _ngcontent-%COMP%_pillPulse 2s ease-in-out infinite;\n}\n\n\n\n.time-pill.active[_ngcontent-%COMP%] {\n background: #E0E7FF;\n color: #4F46E5;\n animation: _ngcontent-%COMP%_pillPulse 2s ease-in-out infinite;\n}\n\n\n\n.time-pill.failed[_ngcontent-%COMP%] {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n@keyframes _ngcontent-%COMP%_pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n\n\n.generation-time[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #E0F2FE;\n border-radius: 10px;\n font-size: 11px;\n color: #0369A1;\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.message-elapsed[_ngcontent-%COMP%] {\n color: #AAA;\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body[_ngcontent-%COMP%] {\n margin-bottom: 0;\n}\n\n.message-text[_ngcontent-%COMP%] {\n color: #333;\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n\n\n.message-text[_ngcontent-%COMP%] markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child {\n margin-top: 0;\n}\n\n.message-text[_ngcontent-%COMP%] markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n\n\n.message-item.user-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 4px 12px 12px 12px;\n}\n\n\n\n.message-reactions[_ngcontent-%COMP%] {\n display: none; \n\n}\n\n\n\n.artifact-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n background: linear-gradient(135deg, #F8F7FF 0%, #F3F2FF 100%);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, #8B5CF6 0%, #6366F1 100%);\n opacity: 1;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #F3F2FF 0%, #EBE9FF 100%);\n border-color: rgba(139, 92, 246, 0.3);\n box-shadow: 0 4px 12px rgba(139, 92, 246, 0.12);\n transform: translateY(-1px);\n}\n\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #8B5CF6;\n flex-shrink: 0;\n background: rgba(139, 92, 246, 0.1);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover .artifact-card-icon[_ngcontent-%COMP%] {\n background: rgba(139, 92, 246, 0.15);\n transform: scale(1.05);\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.artifact-card-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #374151;\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6B7280;\n line-height: 1.5;\n}\n\n.message-actions[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n pointer-events: none;\n}\n\n.message-item[_ngcontent-%COMP%]:hover .message-actions[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn[_ngcontent-%COMP%]:hover {\n background-color: #F3F4F6;\n color: #111827;\n}\n\n.message-action-btn.danger[_ngcontent-%COMP%]:hover {\n background-color: #FEE2E2;\n color: #DC2626;\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%] {\n color: #3B82F6;\n background: #EFF6FF;\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%]:hover {\n background-color: #DBEAFE;\n color: #2563EB;\n}\n\n\n\n.thread-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: #EFF6FF;\n border: 1px solid #DBEAFE;\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: #1E40AF;\n font-weight: 500;\n}\n\n.thread-indicator[_ngcontent-%COMP%]:hover {\n background: #DBEAFE;\n border-color: #93C5FD;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(30, 64, 175, 0.1);\n}\n\n.thread-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.thread-count[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n\n.message-item.editing[_ngcontent-%COMP%] {\n background-color: rgba(255, 243, 205, 0.3);\n border-left: 3px solid #FFA726;\n}\n\n.message-edit-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px;\n border: 1px solid #D9D9D9;\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #0076B6;\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.edit-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%] {\n background-color: #0076B6;\n color: white;\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%]:hover {\n background-color: #005A8F;\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%] {\n background-color: #F4F4F4;\n color: #666;\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%]:hover {\n background-color: #E0E0E0;\n color: #333;\n}\n\n.edit-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #AAA;\n font-style: italic;\n}\n\n.edited-badge[_ngcontent-%COMP%] {\n margin-left: 8px;\n font-size: 11px;\n color: #AAA;\n font-style: italic;\n font-weight: normal;\n}\n\n\n\n.message-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #6B7280;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 4px;\n margin-left: 8px;\n animation: _ngcontent-%COMP%_statusPulse 2s ease-in-out infinite;\n}\n\n.message-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076B6;\n font-size: 11px;\n}\n\n.message-status.error[_ngcontent-%COMP%] {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n.message-status.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #DC2626;\n}\n\n.status-text[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n@keyframes _ngcontent-%COMP%_statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n\n\n\n\n\n\n\n.agent-run-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: #9CA3AF;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n margin-left: 8px;\n}\n\n.agent-run-icon[_ngcontent-%COMP%] i.fa-cog[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.agent-run-icon[_ngcontent-%COMP%]:hover {\n color: #6B7280;\n}\n\n.agent-run-icon.expanded[_ngcontent-%COMP%] {\n color: #9333EA;\n transform: scale(1.1);\n}\n\n@keyframes _ngcontent-%COMP%_rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n\n\n.agent-details-panel[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n.agent-details-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6B7280;\n font-size: 13px;\n}\n\n.agent-details-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #9333EA;\n}\n\n\n\n.agent-details-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #DC2626;\n font-size: 13px;\n}\n\n.agent-details-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #DC2626;\n}\n\n\n\n.agent-details-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid #E5E7EB;\n font-weight: 600;\n font-size: 13px;\n color: #374151;\n}\n\n.agent-details-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #9333EA;\n}\n\n.agent-name-link[_ngcontent-%COMP%] {\n color: #9333EA;\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link[_ngcontent-%COMP%]:hover {\n color: #7C3AED;\n text-decoration: underline;\n}\n\n\n\n.agent-details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n border: 1px solid #E5E7EB;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #111827;\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending[_ngcontent-%COMP%] {\n background: #FEF3C7;\n color: #92400E;\n}\n\n.status-badge.status-running[_ngcontent-%COMP%] {\n background: #DBEAFE;\n color: #1E40AF;\n}\n\n.status-badge.status-complete[_ngcontent-%COMP%] {\n background: #D1FAE5;\n color: #065F46;\n}\n\n.status-badge.status-failed[_ngcontent-%COMP%], \n.status-badge.status-error[_ngcontent-%COMP%] {\n background: #FEE2E2;\n color: #991B1B;\n}\n\n.status-badge.status-cancelled[_ngcontent-%COMP%] {\n background: #F3F4F6;\n color: #4B5563;\n}\n\n\n\n.run-id-link[_ngcontent-%COMP%] {\n color: #3B82F6;\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link[_ngcontent-%COMP%]:hover {\n color: #2563EB;\n text-decoration: underline;\n}\n\n.run-id-link[_ngcontent-%COMP%] i.fa-external-link-alt[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.7;\n}\n\n\n\n.agent-details-tasks[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #E5E7EB;\n}\n\n.tasks-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: #374151;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3B82F6;\n font-size: 11px;\n}\n\n.tasks-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list[_ngcontent-%COMP%] mj-task-widget[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n\n.artifact-version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}", "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n[class^=\"mj-icon-\"][_ngcontent-%COMP%], \n[class*=\" mj-icon-\"][_ngcontent-%COMP%] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n\n\n\n\n\n\n\n\n\n\n.mj-icon-skip[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n\n.mj-icon-skip-lightning[_ngcontent-%COMP%]::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n font-size: 1.1em;\n}\n\n\n\n\n\n\n.mj-icon-skip-brain[_ngcontent-%COMP%]::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n\n\n\n\n\n\n\n\n\n.mj-icon-data-analyst[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n\n\n\n\n.mj-icon-api[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n\n\n\n\n.mj-icon-processing[_ngcontent-%COMP%]::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: _ngcontent-%COMP%_rotate-icon 2s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n\n\n\n\n\n.mj-icon-monogram-s[_ngcontent-%COMP%]::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: #667eea;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"] });
1170
+ } }, dependencies: [i3.NgClass, i3.NgForOf, i3.NgIf, i4.DefaultValueAccessor, i4.NgControlStatus, i4.NgModel, i5.ArtifactMessageCardComponent, i6.MarkdownComponent, i7.SuggestedResponsesComponent, i8.ConversationMessageRatingComponent, i9.TaskWidgetComponent, i3.DatePipe], styles: [".message-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n.message-item.user-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n.message-item.pinned[_ngcontent-%COMP%] {\n border-left: 3px solid #0076B6;\n background-color: rgba(0, 118, 182, 0.08);\n}\n\n.message-item.in-progress[_ngcontent-%COMP%] {\n background: linear-gradient(90deg,\n rgba(59, 130, 246, 0.08) 0%,\n rgba(59, 130, 246, 0.12) 50%,\n rgba(59, 130, 246, 0.08) 100%);\n background-size: 200% 100%;\n animation: _ngcontent-%COMP%_shimmer 2s ease-in-out infinite;\n border-left: 3px solid #3B82F6;\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .message-text[_ngcontent-%COMP%] {\n color: #1F2937;\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .avatar-circle[_ngcontent-%COMP%] {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(59, 130, 246, 0);\n }\n}\n\n.message-item[_ngcontent-%COMP%]:hover {\n background-color: rgba(0, 0, 0, 0.02);\n}\n\n\n\n[_nghost-%COMP%] .mention-badge {\n display: inline-block;\n padding: 2px 8px;\n margin: 0 2px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n[_nghost-%COMP%] .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n}\n\n[_nghost-%COMP%] .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n[_nghost-%COMP%] .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n\n.message-avatar[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.avatar-circle[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: white;\n}\n\n\n\n.avatar-circle.user-avatar[_ngcontent-%COMP%] {\n border-radius: 50%;\n background-color: #333;\n}\n\n\n\n.avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 8px;\n background-color: #9333EA; \n\n}\n\n\n\n.avatar-image[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n\n\n.artifact-wrapper.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.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\n.message-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender[_ngcontent-%COMP%] {\n font-weight: 600;\n color: #333;\n}\n\n\n\n.agent-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 10px;\n font-size: 11px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.message-time[_ngcontent-%COMP%] {\n color: #9CA3AF;\n font-size: 12px;\n font-weight: 400;\n}\n\n\n\n.time-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n margin-left: auto;\n transition: all 0.3s ease;\n}\n\n.time-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.time-pill.complete[_ngcontent-%COMP%] {\n background: #E0F2FE;\n color: #0369A1;\n}\n\n\n\n.time-pill.in-progress[_ngcontent-%COMP%] {\n background: #F3E8FF;\n color: #7C3AED;\n}\n\n\n\n.time-pill.active[_ngcontent-%COMP%] {\n background: #E0E7FF;\n color: #4F46E5;\n}\n\n\n\n.time-pill.failed[_ngcontent-%COMP%] {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n@keyframes _ngcontent-%COMP%_pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n\n\n.generation-time[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #E0F2FE;\n border-radius: 10px;\n font-size: 11px;\n color: #0369A1;\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.message-elapsed[_ngcontent-%COMP%] {\n color: #AAA;\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body[_ngcontent-%COMP%] {\n margin-bottom: 0;\n}\n\n.message-text[_ngcontent-%COMP%] {\n color: #333;\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n\n\n.message-text[_ngcontent-%COMP%] markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child {\n margin-top: 0;\n}\n\n.message-text[_ngcontent-%COMP%] markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n\n\n.message-item.user-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 4px 12px 12px 12px;\n}\n\n\n\n.message-reactions[_ngcontent-%COMP%] {\n display: none; \n\n}\n\n\n\n.artifact-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n background: linear-gradient(135deg, #F8F7FF 0%, #F3F2FF 100%);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, #8B5CF6 0%, #6366F1 100%);\n opacity: 1;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #F3F2FF 0%, #EBE9FF 100%);\n border-color: rgba(139, 92, 246, 0.3);\n box-shadow: 0 4px 12px rgba(139, 92, 246, 0.12);\n transform: translateY(-1px);\n}\n\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #8B5CF6;\n flex-shrink: 0;\n background: rgba(139, 92, 246, 0.1);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover .artifact-card-icon[_ngcontent-%COMP%] {\n background: rgba(139, 92, 246, 0.15);\n transform: scale(1.05);\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.artifact-card-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #374151;\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6B7280;\n line-height: 1.5;\n}\n\n.message-actions[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n pointer-events: none;\n}\n\n.message-item[_ngcontent-%COMP%]:hover .message-actions[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn[_ngcontent-%COMP%]:hover {\n background-color: #F3F4F6;\n color: #111827;\n}\n\n.message-action-btn.danger[_ngcontent-%COMP%]:hover {\n background-color: #FEE2E2;\n color: #DC2626;\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%] {\n color: #3B82F6;\n background: #EFF6FF;\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%]:hover {\n background-color: #DBEAFE;\n color: #2563EB;\n}\n\n\n\n.thread-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: #EFF6FF;\n border: 1px solid #DBEAFE;\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: #1E40AF;\n font-weight: 500;\n}\n\n.thread-indicator[_ngcontent-%COMP%]:hover {\n background: #DBEAFE;\n border-color: #93C5FD;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(30, 64, 175, 0.1);\n}\n\n.thread-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.thread-count[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n\n.message-item.editing[_ngcontent-%COMP%] {\n background-color: rgba(255, 243, 205, 0.3);\n border-left: 3px solid #FFA726;\n}\n\n.message-edit-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px;\n border: 1px solid #D9D9D9;\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #0076B6;\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.edit-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%] {\n background-color: #0076B6;\n color: white;\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%]:hover {\n background-color: #005A8F;\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%] {\n background-color: #F4F4F4;\n color: #666;\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%]:hover {\n background-color: #E0E0E0;\n color: #333;\n}\n\n.edit-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #AAA;\n font-style: italic;\n}\n\n.edited-badge[_ngcontent-%COMP%] {\n margin-left: 8px;\n font-size: 11px;\n color: #AAA;\n font-style: italic;\n font-weight: normal;\n}\n\n\n\n.message-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #6B7280;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 4px;\n margin-left: 8px;\n animation: _ngcontent-%COMP%_statusPulse 2s ease-in-out infinite;\n}\n\n.message-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076B6;\n font-size: 11px;\n}\n\n.message-status.error[_ngcontent-%COMP%] {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n.message-status.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #DC2626;\n}\n\n.status-text[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n@keyframes _ngcontent-%COMP%_statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n\n\n\n\n\n\n\n.agent-run-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: #9CA3AF;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n margin-left: 8px;\n}\n\n.agent-run-icon[_ngcontent-%COMP%] i.fa-cog[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.agent-run-icon[_ngcontent-%COMP%]:hover {\n color: #6B7280;\n}\n\n.agent-run-icon.expanded[_ngcontent-%COMP%] {\n color: #9333EA;\n transform: scale(1.1);\n}\n\n@keyframes _ngcontent-%COMP%_rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n\n\n.agent-details-panel[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n.agent-details-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6B7280;\n font-size: 13px;\n}\n\n.agent-details-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #9333EA;\n}\n\n\n\n.agent-details-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #DC2626;\n font-size: 13px;\n}\n\n.agent-details-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #DC2626;\n}\n\n\n\n.agent-details-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid #E5E7EB;\n font-weight: 600;\n font-size: 13px;\n color: #374151;\n}\n\n.agent-details-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #9333EA;\n}\n\n.agent-name-link[_ngcontent-%COMP%] {\n color: #9333EA;\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link[_ngcontent-%COMP%]:hover {\n color: #7C3AED;\n text-decoration: underline;\n}\n\n\n\n.agent-details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n border: 1px solid #E5E7EB;\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #111827;\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending[_ngcontent-%COMP%] {\n background: #FEF3C7;\n color: #92400E;\n}\n\n.status-badge.status-running[_ngcontent-%COMP%] {\n background: #DBEAFE;\n color: #1E40AF;\n}\n\n.status-badge.status-complete[_ngcontent-%COMP%] {\n background: #D1FAE5;\n color: #065F46;\n}\n\n.status-badge.status-failed[_ngcontent-%COMP%], \n.status-badge.status-error[_ngcontent-%COMP%] {\n background: #FEE2E2;\n color: #991B1B;\n}\n\n.status-badge.status-cancelled[_ngcontent-%COMP%] {\n background: #F3F4F6;\n color: #4B5563;\n}\n\n\n\n.run-id-link[_ngcontent-%COMP%] {\n color: #3B82F6;\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link[_ngcontent-%COMP%]:hover {\n color: #2563EB;\n text-decoration: underline;\n}\n\n.run-id-link[_ngcontent-%COMP%] i.fa-external-link-alt[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.7;\n}\n\n\n\n.agent-details-tasks[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #E5E7EB;\n}\n\n.tasks-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: #374151;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3B82F6;\n font-size: 11px;\n}\n\n.tasks-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list[_ngcontent-%COMP%] mj-task-widget[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n\n.artifact-version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}\n\n\n.message-action-bar[_ngcontent-%COMP%] {\n margin-top: 12px;\n margin-bottom: 8px;\n background: #F9FAFB;\n border: 1px solid #D1D5DB;\n border-radius: 8px;\n padding: 12px;\n}\n\n.action-bar-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: 16px;\n padding-left: 16px;\n border-left: 1px solid #E5E7EB;\n}\n\n.action-bar-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n background: white;\n border: 1px solid #9CA3AF;\n border-radius: 6px;\n font-size: 16px;\n line-height: 1;\n color: #6B7280;\n cursor: pointer;\n transition: all 0.2s;\n min-width: 36px;\n height: 32px;\n opacity: 0.6;\n}\n\n.action-bar-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n line-height: 1;\n}\n\n.action-bar-btn[_ngcontent-%COMP%]:hover {\n opacity: 1;\n border-color: #6B7280;\n}\n\n.action-bar-btn.danger[_ngcontent-%COMP%] {\n color: #DC2626;\n}\n\n.action-bar-btn.danger[_ngcontent-%COMP%]:hover {\n opacity: 1;\n background: #FEF2F2;\n border-color: #DC2626;\n}\n\n.action-bar-btn[_ngcontent-%COMP%] i.pinned[_ngcontent-%COMP%] {\n color: #3B82F6;\n}\n\n\n\n.agent-run-icon[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.rating-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n background: #3B82F6;\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 5px;\n border-radius: 10px;\n min-width: 16px;\n text-align: center;\n line-height: 1;\n}\n\n\n\n.message-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid #F3F4F6;\n}\n\n.rating-counts[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 13px;\n color: #6B7280;\n}\n\n.rating-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.rating-count.thumbs-up[_ngcontent-%COMP%] {\n color: #16A34A;\n}\n\n.rating-count.thumbs-down[_ngcontent-%COMP%] {\n color: #DC2626;\n}\n\n.rating-total[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #9CA3AF;\n}\n\n.inline-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n\n\n.agent-details-section[_ngcontent-%COMP%] {\n margin-top: 8px;\n}", "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n[class^=\"mj-icon-\"][_ngcontent-%COMP%], \n[class*=\" mj-icon-\"][_ngcontent-%COMP%] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n\n\n\n\n\n\n\n\n\n\n.mj-icon-skip[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n\n.mj-icon-skip-lightning[_ngcontent-%COMP%]::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n font-size: 1.1em;\n}\n\n\n\n\n\n\n.mj-icon-skip-brain[_ngcontent-%COMP%]::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n\n\n\n\n\n\n\n\n\n.mj-icon-data-analyst[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n\n\n\n\n.mj-icon-api[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n\n\n\n\n.mj-icon-processing[_ngcontent-%COMP%]::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: _ngcontent-%COMP%_rotate-icon 2s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n\n\n\n\n\n.mj-icon-monogram-s[_ngcontent-%COMP%]::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: #667eea;\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"] });
1059
1171
  }
1060
1172
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MessageItemComponent, [{
1061
1173
  type: Component,
1062
- args: [{ selector: 'mj-conversation-message-item', template: "<div [class]=\"messageClasses\">\n <div class=\"message-avatar\">\n <div class=\"avatar-circle\" [class.ai-avatar]=\"isAIMessage\" [class.user-avatar]=\"isUserMessage\">\n @if (isUserMessage) {\n @if (userAvatarUrl) {\n <img [src]=\"userAvatarUrl\" alt=\"User avatar\" class=\"avatar-image\" />\n } @else if (userAvatarIconClass) {\n <i [class]=\"userAvatarIconClass\"></i>\n } @else {\n <i class=\"fas fa-user\"></i>\n }\n } @else if (isAIMessage) {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\n </div>\n </div>\n\n <div class=\"message-content\">\n <div class=\"message-header\">\n <span class=\"message-sender\" [title]=\"isAIMessage ? (aiAgentInfo?.role || 'AI Assistant') : ''\">\n {{ isAIMessage ? (aiAgentInfo?.name || 'AI Assistant') : messageSenderName }}\n </span>\n <span class=\"message-time\">{{ message.__mj_CreatedAt | date:'short' }}</span>\n\n <!-- Status indicator for user messages -->\n <span *ngIf=\"isUserMessage && messageStatus !== 'Complete'\" class=\"message-status\" [class.error]=\"messageStatus === 'Error'\">\n <i class=\"fas\" [ngClass]=\"messageStatus === 'Error' ? 'fa-exclamation-triangle' : 'fa-circle-notch fa-spin'\"></i>\n <span class=\"status-text\">{{ getStatusText() }}</span>\n </span>\n\n <!-- Time pill - shows for AI messages in all states (in-progress, active, complete, failed) -->\n <span *ngIf=\"!isUserMessage && timePillText\"\n class=\"time-pill\"\n [class.in-progress]=\"isInProgressAIMessage\"\n [class.active]=\"!isInProgressAIMessage && isAgentRunActive\"\n [class.complete]=\"!isInProgressAIMessage && !isAgentRunActive && messageStatus === 'Complete'\"\n [class.failed]=\"messageStatus === 'Error'\">\n <i class=\"fas fa-clock\"></i>\n {{ timePillText }}\n </span>\n\n <!-- Agent run icon (clickable to expand details) - always rightmost when present -->\n <span *ngIf=\"hasAgentRun\"\n class=\"agent-run-icon\"\n (click)=\"toggleAgentDetails()\"\n [class.expanded]=\"isAgentDetailsExpanded\"\n title=\"Click to view agent execution details\">\n <i class=\"fas fa-cog\"></i>\n </span>\n </div>\n\n <div class=\"message-body\">\n @if (!isEditing) {\n <div class=\"message-text\">\n <markdown [data]=\"displayMessage\"></markdown>\n @if (isMessageEdited) {\n <span class=\"edited-badge\">(edited)</span>\n }\n </div>\n\n <!-- Artifact Message Card -->\n @if (hasArtifact && artifact && artifactVersion) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"isSystemArtifact\">\n <mj-artifact-message-card\n [artifactId]=\"artifact.ID\"\n [artifact]=\"artifact\"\n [artifactVersion]=\"artifactVersion\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- Suggested Responses (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && suggestedResponses.length > 0) {\n <mj-suggested-responses\n [suggestedResponses]=\"suggestedResponses\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (responseSelected)=\"onSuggestedResponseSelected($event)\">\n </mj-suggested-responses>\n }\n }\n\n @if (isEditing) {\n <div class=\"message-edit-container\">\n <textarea\n class=\"message-edit-textarea\"\n [(ngModel)]=\"editedText\"\n (keydown)=\"onEditKeydown($event)\"\n rows=\"4\"\n placeholder=\"Edit your message...\"></textarea>\n <div class=\"edit-actions\">\n <button class=\"edit-action-btn save\" (click)=\"saveEdit()\">\n <i class=\"fas fa-check\"></i>\n Save\n </button>\n <button class=\"edit-action-btn cancel\" (click)=\"cancelEditing()\">\n <i class=\"fas fa-times\"></i>\n Cancel\n </button>\n </div>\n <div class=\"edit-hint\">\n Press Enter to save, Shift+Enter for new line, Escape to cancel\n </div>\n </div>\n }\n\n <!-- Agent Run Details Panel (expandable) -->\n @if (isAgentDetailsExpanded && hasAgentRun) {\n <div class=\"agent-details-panel\">\n @if (agentRun) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ aiAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <div class=\"agent-details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Run ID:</span>\n <span class=\"detail-value\">\n <a class=\"run-id-link\" (click)=\"openAgentRunRecord()\" title=\"Open agent run details\">\n {{ agentRun.ID }}\n <i class=\"fas fa-external-link-alt\"></i>\n </a>\n </span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRunStepCount > 0\">\n <span class=\"detail-label\">Steps:</span>\n <span class=\"detail-value\">{{ agentRunStepCount }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRunTotalTokens > 0\">\n <span class=\"detail-label\">Tokens:</span>\n <span class=\"detail-value\">{{ formatNumber(agentRunTotalTokens) }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRunTotalCost > 0\">\n <span class=\"detail-label\">Cost:</span>\n <span class=\"detail-value\">\\${{ agentRunTotalCost.toFixed(4) }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRun.Status\">\n <span class=\"detail-label\">Status:</span>\n <span class=\"detail-value status-badge\" [class]=\"'status-' + agentRun.Status.toLowerCase()\">\n {{ agentRun.Status }}\n </span>\n </div>\n </div>\n </div>\n }\n\n <!-- Tasks Section -->\n @if (detailTasks.length > 0) {\n <div class=\"agent-details-tasks\">\n <div class=\"tasks-section-header\">\n <i class=\"fas fa-tasks\"></i>\n <span>Associated Tasks ({{ detailTasks.length }})</span>\n </div>\n <div class=\"tasks-list\">\n <mj-task-widget\n *ngFor=\"let task of detailTasks\"\n [task]=\"task\"\n [compact]=\"false\"\n [clickable]=\"false\"\n [showProgress]=\"true\"\n [showDuration]=\"true\">\n </mj-task-widget>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <div class=\"message-actions\" *ngIf=\"!isProcessing && !isInProgressAIMessage && !isEditing\">\n <!-- Retry button for failed AI messages -->\n <button class=\"message-action-btn retry-btn\" (click)=\"onRetryClick()\" title=\"Retry\" *ngIf=\"messageStatus === 'Error' && isAIMessage\">\n <i class=\"fas fa-redo\"></i>\n Retry\n </button>\n\n <button class=\"message-action-btn\" (click)=\"onPinClick()\" [title]=\"message.IsPinned ? 'Unpin' : 'Pin'\">\n <i class=\"fas\" [ngClass]=\"message.IsPinned ? 'fa-thumbtack' : 'fa-thumbtack'\"></i>\n </button>\n <button class=\"message-action-btn\" (click)=\"onEditClick()\" title=\"Edit\" *ngIf=\"isUserMessage\">\n <i class=\"fas fa-edit\"></i>\n </button>\n <button class=\"message-action-btn danger\" (click)=\"onDeleteClick()\" title=\"Delete\">\n <i class=\"fas fa-trash\"></i>\n </button>\n </div>\n\n <!-- Reaction Buttons -->\n <div class=\"message-reactions\" *ngIf=\"!isProcessing && !isInProgressAIMessage && !isEditing\">\n <button class=\"reaction-btn\" (click)=\"toggleReaction('like')\">\n <i class=\"far fa-thumbs-up\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n <button class=\"reaction-btn\" (click)=\"toggleReaction('comment')\">\n <i class=\"far fa-comment\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n </div>\n </div>\n</div>", styles: [".message-item {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message {\n background-color: transparent;\n}\n\n.message-item.user-message {\n background-color: transparent;\n}\n\n.message-item.pinned {\n border-left: 3px solid #0076B6;\n background-color: rgba(0, 118, 182, 0.08);\n}\n\n.message-item.in-progress {\n background: linear-gradient(90deg,\n rgba(59, 130, 246, 0.08) 0%,\n rgba(59, 130, 246, 0.12) 50%,\n rgba(59, 130, 246, 0.08) 100%);\n background-size: 200% 100%;\n animation: shimmer 2s ease-in-out infinite;\n border-left: 3px solid #3B82F6;\n position: relative;\n}\n\n@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n/* Progress message styling - make it visually distinct */\n.message-item.in-progress .message-text {\n color: #1F2937;\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n/* Progress icon - positioned to the right of message, pushed down to avoid overlap */\n.message-item.in-progress .message-content::after {\n content: '';\n position: absolute;\n right: 12px;\n top: 22px;\n width: 16px;\n height: 16px;\n border: 2px solid #3B82F6;\n border-top-color: transparent;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n}\n\n@keyframes spin {\n to { transform: rotate(360deg); }\n}\n\n/* Pulse effect for avatar */\n.message-item.in-progress .avatar-circle {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(59, 130, 246, 0);\n }\n}\n\n.message-item:hover {\n background-color: rgba(0, 0, 0, 0.02);\n}\n\n/* Mention Pills */\n:host ::ng-deep .mention-badge {\n display: inline-block;\n padding: 2px 8px;\n margin: 0 2px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n}\n\n:host ::ng-deep .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n:host ::ng-deep .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n\n.message-avatar {\n flex-shrink: 0;\n}\n\n.avatar-circle {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: white;\n}\n\n/* User avatars are circular */\n.avatar-circle.user-avatar {\n border-radius: 50%;\n background-color: #333;\n}\n\n/* Agent avatars are square with rounded corners */\n.avatar-circle.ai-avatar {\n border-radius: 8px;\n background-color: #9333EA; /* Purple for agents */\n}\n\n/* Avatar images (for users with uploaded photos or URLs) */\n.avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n/* System artifact styling - subtle visual distinction */\n.artifact-wrapper.system-artifact {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.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\n.message-content {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender {\n font-weight: 600;\n color: #333;\n}\n\n/* Agent role badge */\n.agent-badge {\n display: inline-block;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 10px;\n font-size: 11px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.message-time {\n color: #9CA3AF;\n font-size: 12px;\n font-weight: 400;\n}\n\n/* Time pill - unified styling for all AI message states */\n.time-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n margin-left: auto;\n transition: all 0.3s ease;\n}\n\n.time-pill i {\n font-size: 10px;\n}\n\n/* Complete state - light blue (default) */\n.time-pill.complete {\n background: #E0F2FE;\n color: #0369A1;\n}\n\n/* In-progress state - purple/violet with subtle pulse */\n.time-pill.in-progress {\n background: #F3E8FF;\n color: #7C3AED;\n animation: pillPulse 2s ease-in-out infinite;\n}\n\n/* Active agent run state - indigo with subtle pulse */\n.time-pill.active {\n background: #E0E7FF;\n color: #4F46E5;\n animation: pillPulse 2s ease-in-out infinite;\n}\n\n/* Failed state - red */\n.time-pill.failed {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n@keyframes pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.generation-time {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #E0F2FE;\n border-radius: 10px;\n font-size: 11px;\n color: #0369A1;\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time i {\n font-size: 10px;\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.message-elapsed {\n color: #AAA;\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body {\n margin-bottom: 0;\n}\n\n.message-text {\n color: #333;\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n/* Remove extra margin from markdown paragraphs */\n.message-text markdown > :first-child {\n margin-top: 0;\n}\n\n.message-text markdown > :last-child {\n margin-bottom: 0;\n}\n\n/* Asymmetric bubble shapes for message content */\n.message-item.user-message .message-content {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message .message-content {\n border-radius: 4px 12px 12px 12px;\n}\n\n/* Reaction Buttons */\n.message-reactions {\n display: none; /* Hide reactions for now - not implemented */\n}\n\n/* Artifact Card - Claude.ai Style */\n.artifact-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n background: linear-gradient(135deg, #F8F7FF 0%, #F3F2FF 100%);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, #8B5CF6 0%, #6366F1 100%);\n opacity: 1;\n}\n\n.artifact-card:hover {\n background: linear-gradient(135deg, #F3F2FF 0%, #EBE9FF 100%);\n border-color: rgba(139, 92, 246, 0.3);\n box-shadow: 0 4px 12px rgba(139, 92, 246, 0.12);\n transform: translateY(-1px);\n}\n\n.artifact-card-header {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #8B5CF6;\n flex-shrink: 0;\n background: rgba(139, 92, 246, 0.1);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card:hover .artifact-card-icon {\n background: rgba(139, 92, 246, 0.15);\n transform: scale(1.05);\n}\n\n.artifact-card-icon i {\n font-size: 18px;\n}\n\n.artifact-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label {\n font-size: 14px;\n font-weight: 600;\n color: #374151;\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description {\n font-size: 13px;\n color: #6B7280;\n line-height: 1.5;\n}\n\n.message-actions {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n pointer-events: none;\n}\n\n.message-item:hover .message-actions {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn:hover {\n background-color: #F3F4F6;\n color: #111827;\n}\n\n.message-action-btn.danger:hover {\n background-color: #FEE2E2;\n color: #DC2626;\n}\n\n.message-action-btn.retry-btn {\n color: #3B82F6;\n background: #EFF6FF;\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn:hover {\n background-color: #DBEAFE;\n color: #2563EB;\n}\n\n/* Thread indicator badge */\n.thread-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: #EFF6FF;\n border: 1px solid #DBEAFE;\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: #1E40AF;\n font-weight: 500;\n}\n\n.thread-indicator:hover {\n background: #DBEAFE;\n border-color: #93C5FD;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(30, 64, 175, 0.1);\n}\n\n.thread-indicator i {\n font-size: 14px;\n}\n\n.thread-count {\n font-weight: 600;\n}\n\n/* Edit mode styles */\n.message-item.editing {\n background-color: rgba(255, 243, 205, 0.3);\n border-left: 3px solid #FFA726;\n}\n\n.message-edit-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea {\n width: 100%;\n padding: 12px;\n border: 1px solid #D9D9D9;\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea:focus {\n outline: none;\n border-color: #0076B6;\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.edit-actions {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save {\n background-color: #0076B6;\n color: white;\n}\n\n.edit-action-btn.save:hover {\n background-color: #005A8F;\n}\n\n.edit-action-btn.cancel {\n background-color: #F4F4F4;\n color: #666;\n}\n\n.edit-action-btn.cancel:hover {\n background-color: #E0E0E0;\n color: #333;\n}\n\n.edit-hint {\n font-size: 12px;\n color: #AAA;\n font-style: italic;\n}\n\n.edited-badge {\n margin-left: 8px;\n font-size: 11px;\n color: #AAA;\n font-style: italic;\n font-weight: normal;\n}\n\n/* Message status indicator */\n.message-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #6B7280;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 4px;\n margin-left: 8px;\n animation: statusPulse 2s ease-in-out infinite;\n}\n\n.message-status i {\n color: #0076B6;\n font-size: 11px;\n}\n\n.message-status.error {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n.message-status.error i {\n color: #DC2626;\n}\n\n.status-text {\n font-weight: 500;\n}\n\n@keyframes statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n/* ============================================\n Agent Run Icon & Details Panel\n ============================================ */\n\n/* Agent run gear icon in header - muted style for power users */\n.agent-run-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: #9CA3AF;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n margin-left: 8px;\n}\n\n.agent-run-icon i.fa-cog {\n font-size: 13px;\n}\n\n.agent-run-icon:hover {\n color: #6B7280;\n}\n\n.agent-run-icon.expanded {\n color: #9333EA;\n transform: scale(1.1);\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Agent details panel */\n.agent-details-panel {\n margin-top: 12px;\n padding: 16px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n animation: slideDown 0.2s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Loading state */\n.agent-details-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6B7280;\n font-size: 13px;\n}\n\n.agent-details-loading i {\n color: #9333EA;\n}\n\n/* Error state */\n.agent-details-error {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #DC2626;\n font-size: 13px;\n}\n\n.agent-details-error i {\n color: #DC2626;\n}\n\n/* Content header */\n.agent-details-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid #E5E7EB;\n font-weight: 600;\n font-size: 13px;\n color: #374151;\n}\n\n.agent-details-header i {\n color: #9333EA;\n}\n\n.agent-name-link {\n color: #9333EA;\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link:hover {\n color: #7C3AED;\n text-decoration: underline;\n}\n\n/* Details grid */\n.agent-details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n border: 1px solid #E5E7EB;\n}\n\n.detail-label {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.detail-value {\n font-size: 13px;\n color: #111827;\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n/* Status badge in details */\n.status-badge {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending {\n background: #FEF3C7;\n color: #92400E;\n}\n\n.status-badge.status-running {\n background: #DBEAFE;\n color: #1E40AF;\n}\n\n.status-badge.status-complete {\n background: #D1FAE5;\n color: #065F46;\n}\n\n.status-badge.status-failed,\n.status-badge.status-error {\n background: #FEE2E2;\n color: #991B1B;\n}\n\n.status-badge.status-cancelled {\n background: #F3F4F6;\n color: #4B5563;\n}\n\n/* Run ID link styling */\n.run-id-link {\n color: #3B82F6;\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link:hover {\n color: #2563EB;\n text-decoration: underline;\n}\n\n.run-id-link i.fa-external-link-alt {\n font-size: 10px;\n opacity: 0.7;\n}\n\n/* Tasks section in agent details */\n.agent-details-tasks {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #E5E7EB;\n}\n\n.tasks-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: #374151;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header i {\n color: #3B82F6;\n font-size: 11px;\n}\n\n.tasks-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list mj-task-widget {\n display: block;\n}\n\n/* Artifact version badge */\n.artifact-version-badge {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}", "/**\n * Custom Agent Icons for MemberJunction\n *\n * This file contains custom icon definitions for agents that need unique branding\n * beyond Font Awesome icons. Icons can be CSS-based (emoji, Unicode, SVG data URIs)\n * or reference external image files.\n *\n * USAGE IN AGENT METADATA:\n * \"IconClass\": \"mj-icon-skip\" (references .mj-icon-skip class below)\n *\n * EXTENSIBILITY FOR 3RD PARTY DEVELOPERS:\n * Third-party developers have TWO options:\n *\n * 1. CSS CLASS APPROACH (Recommended for developers):\n * - Add your own global CSS with custom icon classes\n * - Reference your class in agent metadata: \"IconClass\": \"your-custom-class\"\n * - Works with any CSS available to the application\n * - Example: If you have a global stylesheet with .acme-icon-analyzer { ... }\n * then use \"IconClass\": \"acme-icon-analyzer\"\n *\n * 2. LOGO URL APPROACH (Recommended for end users):\n * - Use the LogoURL field in agent metadata\n * - Provide a URL or data URI: \"LogoURL\": \"https://example.com/logo.png\"\n * - Supports: HTTP URLs, data URIs (data:image/png;base64,...)\n * - LogoURL takes precedence over IconClass in the UI\n * - Perfect for non-technical users or external/uploaded images\n *\n * BEST PRACTICES:\n * - Use mj-icon-* prefix for MJ core icons\n * - Use your own prefix for 3rd party icons (e.g., acme-icon-*)\n * - Keep icons simple and recognizable at 16-36px sizes\n * - Test in both light and dark themes\n * - Prefer CSS classes over LogoURL for version-controlled icons\n */\n\n/* ============================================\n BASE STYLES FOR CUSTOM ICONS\n ============================================ */\n\n/* Base styling for all custom MJ icons */\n[class^=\"mj-icon-\"],\n[class*=\" mj-icon-\"] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n/* ============================================\n MJ CORE ICONS\n ============================================ */\n\n/**\n * Skip Brain Icon - Analytics/Intelligence Agent\n * Official Skip logo from Skip SaaS branding\n */\n.mj-icon-skip {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Skip logo SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/**\n * Alternative Skip Icon - Lightning Bolt\n * Simple emoji-based icon for quick setup\n */\n.mj-icon-skip-lightning::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n font-size: 1.1em;\n}\n\n/**\n * Skip Icon - Brain Emoji\n * Fallback emoji option\n */\n.mj-icon-skip-brain::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n/* ============================================\n EXAMPLE CUSTOM ICONS FOR OTHER AGENTS\n ============================================ */\n\n/**\n * Data Analysis Icon - Chart emoji\n */\n.mj-icon-data-analyst::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n/**\n * API/Integration Icon - Plug emoji\n */\n.mj-icon-api::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n/**\n * Processing/Workflow Icon - Gear emoji with animation\n */\n.mj-icon-processing::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: rotate-icon 2s linear infinite;\n}\n\n@keyframes rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/**\n * Text/Letter-based Icon\n * Simple monogram icon\n */\n.mj-icon-monogram-s::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: #667eea;\n}\n\n/* ============================================\n TEMPLATE FOR NEW ICONS\n ============================================ */\n\n/*\n// EMOJI-BASED ICON (Simplest)\n.mj-icon-my-agent::before {\n content: \"\uD83C\uDFAF\"; // Use any emoji\n font-size: 1.2em;\n}\n\n// UNICODE SYMBOL ICON\n.mj-icon-my-agent::before {\n content: \"\\2022\"; // Unicode character\n font-size: 1.2em;\n color: #667eea;\n}\n\n// TEXT/LETTER ICON\n.mj-icon-my-agent::before {\n content: \"MA\"; // Initials/text\n font-weight: 800;\n font-size: 0.9em;\n color: #667eea;\n}\n\n// SVG DATA URI ICON (Most Control)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('data:image/svg+xml;utf8,<svg>...</svg>');\n vertical-align: middle;\n}\n\n// EXTERNAL IMAGE FILE (For existing assets)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('/assets/icons/my-agent.svg');\n vertical-align: middle;\n}\n\n// GRADIENT TEXT ICON\n.mj-icon-my-agent::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n}\n*/\n\n/* ============================================\n 3RD PARTY EXAMPLES\n These would typically be in EXTERNAL CSS files\n ============================================ */\n\n/*\n// Example: Acme Corp custom agent icons\n// This would be in acme-corp-styles.css loaded by the application\n\n.acme-icon-analyzer {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-image: url('https://acme.com/icons/analyzer.svg');\n}\n\n.acme-icon-reporter::before {\n content: \"A\";\n font-weight: 800;\n color: #FF6B35;\n}\n*/\n"] }]
1174
+ args: [{ selector: 'mj-conversation-message-item', template: "<div [class]=\"messageClasses\" [attr.data-message-id]=\"message.ID\">\n <div class=\"message-avatar\">\n <div class=\"avatar-circle\" [class.ai-avatar]=\"isAIMessage\" [class.user-avatar]=\"isUserMessage\">\n @if (isUserMessage) {\n @if (userAvatarUrl) {\n <img [src]=\"userAvatarUrl\" alt=\"User avatar\" class=\"avatar-image\" />\n } @else if (userAvatarIconClass) {\n <i [class]=\"userAvatarIconClass\"></i>\n } @else {\n <i class=\"fas fa-user\"></i>\n }\n } @else if (isAIMessage) {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\n </div>\n </div>\n\n <div class=\"message-content\">\n <div class=\"message-header\">\n <span class=\"message-sender\" [title]=\"isAIMessage ? (aiAgentInfo?.role || 'AI Assistant') : ''\">\n {{ isAIMessage ? (aiAgentInfo?.name || 'AI Assistant') : messageSenderName }}\n </span>\n <span class=\"message-time\">{{ message.__mj_CreatedAt | date:'short' }}</span>\n\n <!-- Status indicator for user messages -->\n <span *ngIf=\"isUserMessage && messageStatus !== 'Complete'\" class=\"message-status\" [class.error]=\"messageStatus === 'Error'\">\n <i class=\"fas\" [ngClass]=\"messageStatus === 'Error' ? 'fa-exclamation-triangle' : 'fa-circle-notch fa-spin'\"></i>\n <span class=\"status-text\">{{ getStatusText() }}</span>\n </span>\n\n <!-- Time pill - shows for AI messages in all states (in-progress, active, complete, failed) -->\n <span *ngIf=\"!isUserMessage && timePillText\"\n class=\"time-pill\"\n [class.in-progress]=\"isInProgressAIMessage\"\n [class.active]=\"!isInProgressAIMessage && isAgentRunActive\"\n [class.complete]=\"!isInProgressAIMessage && !isAgentRunActive && messageStatus === 'Complete'\"\n [class.failed]=\"messageStatus === 'Error'\">\n <i class=\"fas fa-clock\"></i>\n {{ timePillText }}\n </span>\n\n <!-- Agent run icon (clickable to expand details) - always rightmost when present -->\n <span *ngIf=\"hasAgentRun\"\n class=\"agent-run-icon\"\n (click)=\"toggleAgentDetails()\"\n [class.expanded]=\"isAgentDetailsExpanded\"\n [title]=\"hasRatings() ? 'Agent details & ' + getRatingCount() + ' rating(s)' : 'Click to view agent execution details'\">\n <i class=\"fas fa-cog\"></i>\n <span class=\"rating-badge\" *ngIf=\"hasRatings()\">{{ getRatingCount() }}</span>\n </span>\n </div>\n\n <div class=\"message-body\">\n @if (!isEditing) {\n <div class=\"message-text\">\n <markdown [data]=\"displayMessage\"></markdown>\n @if (isMessageEdited) {\n <span class=\"edited-badge\">(edited)</span>\n }\n </div>\n\n <!-- Artifact Message Card -->\n @if (hasArtifact && artifact && artifactVersion) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"isSystemArtifact\">\n <mj-artifact-message-card\n [artifactId]=\"artifact.ID\"\n [artifact]=\"artifact\"\n [artifactVersion]=\"artifactVersion\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- Suggested Responses (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && suggestedResponses.length > 0) {\n <mj-suggested-responses\n [suggestedResponses]=\"suggestedResponses\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (responseSelected)=\"onSuggestedResponseSelected($event)\">\n </mj-suggested-responses>\n }\n }\n\n @if (isEditing) {\n <div class=\"message-edit-container\">\n <textarea\n class=\"message-edit-textarea\"\n [(ngModel)]=\"editedText\"\n (keydown)=\"onEditKeydown($event)\"\n rows=\"4\"\n placeholder=\"Edit your message...\"></textarea>\n <div class=\"edit-actions\">\n <button class=\"edit-action-btn save\" (click)=\"saveEdit()\">\n <i class=\"fas fa-check\"></i>\n Save\n </button>\n <button class=\"edit-action-btn cancel\" (click)=\"cancelEditing()\">\n <i class=\"fas fa-times\"></i>\n Cancel\n </button>\n </div>\n <div class=\"edit-hint\">\n Press Enter to save, Shift+Enter for new line, Escape to cancel\n </div>\n </div>\n }\n </div>\n\n <!-- Message Footer: Rating buttons and action buttons for last completed AI message -->\n @if (isAIMessage && !isEditing && messageStatus === 'Complete' && (isLastMessage || hasRatings())) {\n <div class=\"message-footer\">\n <!-- Rating component (thumbs up/down) -->\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\">\n </mj-conversation-message-rating>\n\n <!-- Pin/Delete buttons (only for last message) -->\n @if (isLastMessage) {\n <div class=\"inline-actions\">\n <button class=\"action-bar-btn\" (click)=\"onPinClick()\" [title]=\"message.IsPinned ? 'Unpin Message' : 'Pin Message'\">\n <i class=\"fas fa-thumbtack\" [class.pinned]=\"message.IsPinned\"></i>\n </button>\n <button class=\"action-bar-btn danger\" (click)=\"onDeleteClick()\" title=\"Delete Message\">\n <i class=\"fas fa-trash\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <!-- Agent details content section -->\n <div class=\"agent-details-section\">\n <!-- Message Action Bar (appears when gear expanded for non-last messages) -->\n @if (isAgentDetailsExpanded && !isLastMessage && isAIMessage && messageStatus === 'Complete') {\n <div class=\"message-action-bar\">\n <div class=\"action-bar-container\">\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\">\n </mj-conversation-message-rating>\n\n <div class=\"action-buttons\">\n <button class=\"action-bar-btn\" (click)=\"onPinClick()\" [title]=\"message.IsPinned ? 'Unpin Message' : 'Pin Message'\">\n <i class=\"fas fa-thumbtack\" [class.pinned]=\"message.IsPinned\"></i>\n </button>\n <button class=\"action-bar-btn danger\" (click)=\"onDeleteClick()\" title=\"Delete Message\">\n <i class=\"fas fa-trash\"></i>\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- Agent Run Details Panel (expandable) -->\n @if (isAgentDetailsExpanded && hasAgentRun) {\n <!-- Agent Run Details Panel -->\n <div class=\"agent-details-panel\">\n @if (agentRun) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ aiAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <div class=\"agent-details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Run ID:</span>\n <span class=\"detail-value\">\n <a class=\"run-id-link\" (click)=\"openAgentRunRecord()\" title=\"Open agent run details\">\n {{ agentRun.ID }}\n <i class=\"fas fa-external-link-alt\"></i>\n </a>\n </span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRunStepCount > 0\">\n <span class=\"detail-label\">Steps:</span>\n <span class=\"detail-value\">{{ agentRunStepCount }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRunTotalTokens > 0\">\n <span class=\"detail-label\">Tokens:</span>\n <span class=\"detail-value\">{{ formatNumber(agentRunTotalTokens) }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRunTotalCost > 0\">\n <span class=\"detail-label\">Cost:</span>\n <span class=\"detail-value\">\\${{ agentRunTotalCost.toFixed(4) }}</span>\n </div>\n\n <div class=\"detail-row\" *ngIf=\"agentRun.Status\">\n <span class=\"detail-label\">Status:</span>\n <span class=\"detail-value status-badge\" [class]=\"'status-' + agentRun.Status.toLowerCase()\">\n {{ agentRun.Status }}\n </span>\n </div>\n </div>\n </div>\n }\n\n <!-- Tasks Section -->\n @if (detailTasks.length > 0) {\n <div class=\"agent-details-tasks\">\n <div class=\"tasks-section-header\">\n <i class=\"fas fa-tasks\"></i>\n <span>Associated Tasks ({{ detailTasks.length }})</span>\n </div>\n <div class=\"tasks-list\">\n <mj-task-widget\n *ngFor=\"let task of detailTasks\"\n [task]=\"task\"\n [compact]=\"false\"\n [clickable]=\"false\"\n [showProgress]=\"true\"\n [showDuration]=\"true\">\n </mj-task-widget>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Rating component moved to message footer (lines 113-134) -->\n\n <!-- Removed message-actions hover panel - actions now in gear icon dropdown -->\n <!-- Retry button kept for critical error recovery on failed messages -->\n @if (messageStatus === 'Error' && isAIMessage && !isProcessing && !isEditing) {\n <div class=\"message-actions\">\n <button class=\"message-action-btn retry-btn\" (click)=\"onRetryClick()\" title=\"Retry\">\n <i class=\"fas fa-redo\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Reaction Buttons -->\n <div class=\"message-reactions\" *ngIf=\"!isProcessing && !isInProgressAIMessage && !isEditing\">\n <button class=\"reaction-btn\" (click)=\"toggleReaction('like')\">\n <i class=\"far fa-thumbs-up\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n <button class=\"reaction-btn\" (click)=\"toggleReaction('comment')\">\n <i class=\"far fa-comment\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n </div>\n </div>\n</div>", styles: [".message-item {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message {\n background-color: transparent;\n}\n\n.message-item.user-message {\n background-color: transparent;\n}\n\n.message-item.pinned {\n border-left: 3px solid #0076B6;\n background-color: rgba(0, 118, 182, 0.08);\n}\n\n.message-item.in-progress {\n background: linear-gradient(90deg,\n rgba(59, 130, 246, 0.08) 0%,\n rgba(59, 130, 246, 0.12) 50%,\n rgba(59, 130, 246, 0.08) 100%);\n background-size: 200% 100%;\n animation: shimmer 2s ease-in-out infinite;\n border-left: 3px solid #3B82F6;\n position: relative;\n}\n\n@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n/* Progress message styling - make it visually distinct */\n.message-item.in-progress .message-text {\n color: #1F2937;\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n\n/* Pulse effect for avatar */\n.message-item.in-progress .avatar-circle {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7);\n }\n 50% {\n box-shadow: 0 0 0 8px rgba(59, 130, 246, 0);\n }\n}\n\n.message-item:hover {\n background-color: rgba(0, 0, 0, 0.02);\n}\n\n/* Mention Pills */\n:host ::ng-deep .mention-badge {\n display: inline-block;\n padding: 2px 8px;\n margin: 0 2px;\n border-radius: 4px;\n font-weight: 500;\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n:host ::ng-deep .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n}\n\n:host ::ng-deep .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n}\n\n:host ::ng-deep .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n}\n\n.message-avatar {\n flex-shrink: 0;\n}\n\n.avatar-circle {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: white;\n}\n\n/* User avatars are circular */\n.avatar-circle.user-avatar {\n border-radius: 50%;\n background-color: #333;\n}\n\n/* Agent avatars are square with rounded corners */\n.avatar-circle.ai-avatar {\n border-radius: 8px;\n background-color: #9333EA; /* Purple for agents */\n}\n\n/* Avatar images (for users with uploaded photos or URLs) */\n.avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n/* System artifact styling - subtle visual distinction */\n.artifact-wrapper.system-artifact {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.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\n.message-content {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender {\n font-weight: 600;\n color: #333;\n}\n\n/* Agent role badge */\n.agent-badge {\n display: inline-block;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 10px;\n font-size: 11px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.message-time {\n color: #9CA3AF;\n font-size: 12px;\n font-weight: 400;\n}\n\n/* Time pill - unified styling for all AI message states */\n.time-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n margin-left: auto;\n transition: all 0.3s ease;\n}\n\n.time-pill i {\n font-size: 10px;\n}\n\n/* Complete state - light blue (default) */\n.time-pill.complete {\n background: #E0F2FE;\n color: #0369A1;\n}\n\n/* In-progress state - purple/violet with subtle pulse */\n.time-pill.in-progress {\n background: #F3E8FF;\n color: #7C3AED;\n}\n\n/* Active agent run state - indigo with subtle pulse */\n.time-pill.active {\n background: #E0E7FF;\n color: #4F46E5;\n}\n\n/* Failed state - red */\n.time-pill.failed {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n@keyframes pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.generation-time {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: #E0F2FE;\n border-radius: 10px;\n font-size: 11px;\n color: #0369A1;\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time i {\n font-size: 10px;\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.message-elapsed {\n color: #AAA;\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body {\n margin-bottom: 0;\n}\n\n.message-text {\n color: #333;\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n/* Remove extra margin from markdown paragraphs */\n.message-text markdown > :first-child {\n margin-top: 0;\n}\n\n.message-text markdown > :last-child {\n margin-bottom: 0;\n}\n\n/* Asymmetric bubble shapes for message content */\n.message-item.user-message .message-content {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message .message-content {\n border-radius: 4px 12px 12px 12px;\n}\n\n/* Reaction Buttons */\n.message-reactions {\n display: none; /* Hide reactions for now - not implemented */\n}\n\n/* Artifact Card - Claude.ai Style */\n.artifact-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n background: linear-gradient(135deg, #F8F7FF 0%, #F3F2FF 100%);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, #8B5CF6 0%, #6366F1 100%);\n opacity: 1;\n}\n\n.artifact-card:hover {\n background: linear-gradient(135deg, #F3F2FF 0%, #EBE9FF 100%);\n border-color: rgba(139, 92, 246, 0.3);\n box-shadow: 0 4px 12px rgba(139, 92, 246, 0.12);\n transform: translateY(-1px);\n}\n\n.artifact-card-header {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #8B5CF6;\n flex-shrink: 0;\n background: rgba(139, 92, 246, 0.1);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card:hover .artifact-card-icon {\n background: rgba(139, 92, 246, 0.15);\n transform: scale(1.05);\n}\n\n.artifact-card-icon i {\n font-size: 18px;\n}\n\n.artifact-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label {\n font-size: 14px;\n font-weight: 600;\n color: #374151;\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description {\n font-size: 13px;\n color: #6B7280;\n line-height: 1.5;\n}\n\n.message-actions {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 4px;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n pointer-events: none;\n}\n\n.message-item:hover .message-actions {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: #6B7280;\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn:hover {\n background-color: #F3F4F6;\n color: #111827;\n}\n\n.message-action-btn.danger:hover {\n background-color: #FEE2E2;\n color: #DC2626;\n}\n\n.message-action-btn.retry-btn {\n color: #3B82F6;\n background: #EFF6FF;\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn:hover {\n background-color: #DBEAFE;\n color: #2563EB;\n}\n\n/* Thread indicator badge */\n.thread-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: #EFF6FF;\n border: 1px solid #DBEAFE;\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: #1E40AF;\n font-weight: 500;\n}\n\n.thread-indicator:hover {\n background: #DBEAFE;\n border-color: #93C5FD;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(30, 64, 175, 0.1);\n}\n\n.thread-indicator i {\n font-size: 14px;\n}\n\n.thread-count {\n font-weight: 600;\n}\n\n/* Edit mode styles */\n.message-item.editing {\n background-color: rgba(255, 243, 205, 0.3);\n border-left: 3px solid #FFA726;\n}\n\n.message-edit-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea {\n width: 100%;\n padding: 12px;\n border: 1px solid #D9D9D9;\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea:focus {\n outline: none;\n border-color: #0076B6;\n box-shadow: 0 0 0 2px rgba(0, 118, 182, 0.1);\n}\n\n.edit-actions {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save {\n background-color: #0076B6;\n color: white;\n}\n\n.edit-action-btn.save:hover {\n background-color: #005A8F;\n}\n\n.edit-action-btn.cancel {\n background-color: #F4F4F4;\n color: #666;\n}\n\n.edit-action-btn.cancel:hover {\n background-color: #E0E0E0;\n color: #333;\n}\n\n.edit-hint {\n font-size: 12px;\n color: #AAA;\n font-style: italic;\n}\n\n.edited-badge {\n margin-left: 8px;\n font-size: 11px;\n color: #AAA;\n font-style: italic;\n font-weight: normal;\n}\n\n/* Message status indicator */\n.message-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: #6B7280;\n padding: 2px 8px;\n background: #F3F4F6;\n border-radius: 4px;\n margin-left: 8px;\n animation: statusPulse 2s ease-in-out infinite;\n}\n\n.message-status i {\n color: #0076B6;\n font-size: 11px;\n}\n\n.message-status.error {\n background: #FEE2E2;\n color: #DC2626;\n}\n\n.message-status.error i {\n color: #DC2626;\n}\n\n.status-text {\n font-weight: 500;\n}\n\n@keyframes statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n/* ============================================\n Agent Run Icon & Details Panel\n ============================================ */\n\n/* Agent run gear icon in header - muted style for power users */\n.agent-run-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: #9CA3AF;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n margin-left: 8px;\n}\n\n.agent-run-icon i.fa-cog {\n font-size: 13px;\n}\n\n.agent-run-icon:hover {\n color: #6B7280;\n}\n\n.agent-run-icon.expanded {\n color: #9333EA;\n transform: scale(1.1);\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Agent details panel */\n.agent-details-panel {\n margin-top: 12px;\n padding: 16px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n animation: slideDown 0.2s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Loading state */\n.agent-details-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #6B7280;\n font-size: 13px;\n}\n\n.agent-details-loading i {\n color: #9333EA;\n}\n\n/* Error state */\n.agent-details-error {\n display: flex;\n align-items: center;\n gap: 8px;\n color: #DC2626;\n font-size: 13px;\n}\n\n.agent-details-error i {\n color: #DC2626;\n}\n\n/* Content header */\n.agent-details-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid #E5E7EB;\n font-weight: 600;\n font-size: 13px;\n color: #374151;\n}\n\n.agent-details-header i {\n color: #9333EA;\n}\n\n.agent-name-link {\n color: #9333EA;\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link:hover {\n color: #7C3AED;\n text-decoration: underline;\n}\n\n/* Details grid */\n.agent-details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: white;\n border-radius: 6px;\n border: 1px solid #E5E7EB;\n}\n\n.detail-label {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.detail-value {\n font-size: 13px;\n color: #111827;\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n/* Status badge in details */\n.status-badge {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending {\n background: #FEF3C7;\n color: #92400E;\n}\n\n.status-badge.status-running {\n background: #DBEAFE;\n color: #1E40AF;\n}\n\n.status-badge.status-complete {\n background: #D1FAE5;\n color: #065F46;\n}\n\n.status-badge.status-failed,\n.status-badge.status-error {\n background: #FEE2E2;\n color: #991B1B;\n}\n\n.status-badge.status-cancelled {\n background: #F3F4F6;\n color: #4B5563;\n}\n\n/* Run ID link styling */\n.run-id-link {\n color: #3B82F6;\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link:hover {\n color: #2563EB;\n text-decoration: underline;\n}\n\n.run-id-link i.fa-external-link-alt {\n font-size: 10px;\n opacity: 0.7;\n}\n\n/* Tasks section in agent details */\n.agent-details-tasks {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid #E5E7EB;\n}\n\n.tasks-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: #374151;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header i {\n color: #3B82F6;\n font-size: 11px;\n}\n\n.tasks-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list mj-task-widget {\n display: block;\n}\n\n/* Artifact version badge */\n.artifact-version-badge {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: #EEF2FF;\n color: #4F46E5;\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}\n/* Message Action Bar (separate panel above agent details) */\n.message-action-bar {\n margin-top: 12px;\n margin-bottom: 8px;\n background: #F9FAFB;\n border: 1px solid #D1D5DB;\n border-radius: 8px;\n padding: 12px;\n}\n\n.action-bar-container {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.action-buttons {\n display: flex;\n gap: 4px;\n margin-left: 16px;\n padding-left: 16px;\n border-left: 1px solid #E5E7EB;\n}\n\n.action-bar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n background: white;\n border: 1px solid #9CA3AF;\n border-radius: 6px;\n font-size: 16px;\n line-height: 1;\n color: #6B7280;\n cursor: pointer;\n transition: all 0.2s;\n min-width: 36px;\n height: 32px;\n opacity: 0.6;\n}\n\n.action-bar-btn i {\n font-size: 16px;\n line-height: 1;\n}\n\n.action-bar-btn:hover {\n opacity: 1;\n border-color: #6B7280;\n}\n\n.action-bar-btn.danger {\n color: #DC2626;\n}\n\n.action-bar-btn.danger:hover {\n opacity: 1;\n background: #FEF2F2;\n border-color: #DC2626;\n}\n\n.action-bar-btn i.pinned {\n color: #3B82F6;\n}\n\n/* Rating badge on gear icon */\n.agent-run-icon {\n position: relative;\n}\n\n.rating-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n background: #3B82F6;\n color: white;\n font-size: 10px;\n font-weight: 600;\n padding: 2px 5px;\n border-radius: 10px;\n min-width: 16px;\n text-align: center;\n line-height: 1;\n}\n\n/* Message Footer (rating counts and inline actions) */\n.message-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid #F3F4F6;\n}\n\n.rating-counts {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 13px;\n color: #6B7280;\n}\n\n.rating-count {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.rating-count.thumbs-up {\n color: #16A34A;\n}\n\n.rating-count.thumbs-down {\n color: #DC2626;\n}\n\n.rating-total {\n font-size: 12px;\n color: #9CA3AF;\n}\n\n.inline-actions {\n display: flex;\n gap: 4px;\n align-items: center;\n}\n\n/* Agent details section wrapper */\n.agent-details-section {\n margin-top: 8px;\n}\n", "/**\n * Custom Agent Icons for MemberJunction\n *\n * This file contains custom icon definitions for agents that need unique branding\n * beyond Font Awesome icons. Icons can be CSS-based (emoji, Unicode, SVG data URIs)\n * or reference external image files.\n *\n * USAGE IN AGENT METADATA:\n * \"IconClass\": \"mj-icon-skip\" (references .mj-icon-skip class below)\n *\n * EXTENSIBILITY FOR 3RD PARTY DEVELOPERS:\n * Third-party developers have TWO options:\n *\n * 1. CSS CLASS APPROACH (Recommended for developers):\n * - Add your own global CSS with custom icon classes\n * - Reference your class in agent metadata: \"IconClass\": \"your-custom-class\"\n * - Works with any CSS available to the application\n * - Example: If you have a global stylesheet with .acme-icon-analyzer { ... }\n * then use \"IconClass\": \"acme-icon-analyzer\"\n *\n * 2. LOGO URL APPROACH (Recommended for end users):\n * - Use the LogoURL field in agent metadata\n * - Provide a URL or data URI: \"LogoURL\": \"https://example.com/logo.png\"\n * - Supports: HTTP URLs, data URIs (data:image/png;base64,...)\n * - LogoURL takes precedence over IconClass in the UI\n * - Perfect for non-technical users or external/uploaded images\n *\n * BEST PRACTICES:\n * - Use mj-icon-* prefix for MJ core icons\n * - Use your own prefix for 3rd party icons (e.g., acme-icon-*)\n * - Keep icons simple and recognizable at 16-36px sizes\n * - Test in both light and dark themes\n * - Prefer CSS classes over LogoURL for version-controlled icons\n */\n\n/* ============================================\n BASE STYLES FOR CUSTOM ICONS\n ============================================ */\n\n/* Base styling for all custom MJ icons */\n[class^=\"mj-icon-\"],\n[class*=\" mj-icon-\"] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n/* ============================================\n MJ CORE ICONS\n ============================================ */\n\n/**\n * Skip Brain Icon - Analytics/Intelligence Agent\n * Official Skip logo from Skip SaaS branding\n */\n.mj-icon-skip {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Skip logo SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/**\n * Alternative Skip Icon - Lightning Bolt\n * Simple emoji-based icon for quick setup\n */\n.mj-icon-skip-lightning::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n font-size: 1.1em;\n}\n\n/**\n * Skip Icon - Brain Emoji\n * Fallback emoji option\n */\n.mj-icon-skip-brain::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n/* ============================================\n EXAMPLE CUSTOM ICONS FOR OTHER AGENTS\n ============================================ */\n\n/**\n * Data Analysis Icon - Chart emoji\n */\n.mj-icon-data-analyst::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n/**\n * API/Integration Icon - Plug emoji\n */\n.mj-icon-api::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n/**\n * Processing/Workflow Icon - Gear emoji with animation\n */\n.mj-icon-processing::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: rotate-icon 2s linear infinite;\n}\n\n@keyframes rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/**\n * Text/Letter-based Icon\n * Simple monogram icon\n */\n.mj-icon-monogram-s::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: #667eea;\n}\n\n/* ============================================\n TEMPLATE FOR NEW ICONS\n ============================================ */\n\n/*\n// EMOJI-BASED ICON (Simplest)\n.mj-icon-my-agent::before {\n content: \"\uD83C\uDFAF\"; // Use any emoji\n font-size: 1.2em;\n}\n\n// UNICODE SYMBOL ICON\n.mj-icon-my-agent::before {\n content: \"\\2022\"; // Unicode character\n font-size: 1.2em;\n color: #667eea;\n}\n\n// TEXT/LETTER ICON\n.mj-icon-my-agent::before {\n content: \"MA\"; // Initials/text\n font-weight: 800;\n font-size: 0.9em;\n color: #667eea;\n}\n\n// SVG DATA URI ICON (Most Control)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('data:image/svg+xml;utf8,<svg>...</svg>');\n vertical-align: middle;\n}\n\n// EXTERNAL IMAGE FILE (For existing assets)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('/assets/icons/my-agent.svg');\n vertical-align: middle;\n}\n\n// GRADIENT TEXT ICON\n.mj-icon-my-agent::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n}\n*/\n\n/* ============================================\n 3RD PARTY EXAMPLES\n These would typically be in EXTERNAL CSS files\n ============================================ */\n\n/*\n// Example: Acme Corp custom agent icons\n// This would be in acme-corp-styles.css loaded by the application\n\n.acme-icon-analyzer {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-image: url('https://acme.com/icons/analyzer.svg');\n}\n\n.acme-icon-reporter::before {\n content: \"A\";\n font-weight: 800;\n color: #FF6B35;\n}\n*/\n"] }]
1063
1175
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.MentionParserService }, { type: i2.MentionAutocompleteService }], { message: [{
1064
1176
  type: Input
1065
1177
  }], conversation: [{
@@ -1078,6 +1190,10 @@ export class MessageItemComponent extends BaseAngularComponent {
1078
1190
  type: Input
1079
1191
  }], userAvatarMap: [{
1080
1192
  type: Input
1193
+ }], ratings: [{
1194
+ type: Input
1195
+ }], isLastMessage: [{
1196
+ type: Input
1081
1197
  }], pinClicked: [{
1082
1198
  type: Output
1083
1199
  }], editClicked: [{
@@ -1097,5 +1213,5 @@ export class MessageItemComponent extends BaseAngularComponent {
1097
1213
  }], suggestedResponseSelected: [{
1098
1214
  type: Output
1099
1215
  }] }); })();
1100
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageItemComponent, { className: "MessageItemComponent", filePath: "src/lib/components/message/message-item.component.ts", lineNumber: 35 }); })();
1216
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageItemComponent, { className: "MessageItemComponent", filePath: "src/lib/components/message/message-item.component.ts", lineNumber: 36 }); })();
1101
1217
  //# sourceMappingURL=message-item.component.js.map