@memberjunction/ng-conversations 2.117.0 → 2.119.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 (89) hide show
  1. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +7 -1
  2. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/collection-artifact-card.component.js +14 -18
  4. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  5. package/dist/lib/components/collection/collections-full-view.component.d.ts +86 -1
  6. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  7. package/dist/lib/components/collection/collections-full-view.component.js +1042 -255
  8. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  9. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +9 -2
  10. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  11. package/dist/lib/components/conversation/conversation-chat-area.component.js +242 -163
  12. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  13. package/dist/lib/components/conversation/conversation-list.component.js +11 -11
  14. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  15. package/dist/lib/components/mention/mention-dropdown.component.js +2 -2
  16. package/dist/lib/components/mention/mention-editor.component.d.ts +21 -0
  17. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  18. package/dist/lib/components/mention/mention-editor.component.js +299 -2
  19. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  20. package/dist/lib/components/message/actionable-commands.component.d.ts +33 -0
  21. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -0
  22. package/dist/lib/components/message/actionable-commands.component.js +107 -0
  23. package/dist/lib/components/message/actionable-commands.component.js.map +1 -0
  24. package/dist/lib/components/message/agent-response-form.component.d.ts +72 -0
  25. package/dist/lib/components/message/agent-response-form.component.d.ts.map +1 -0
  26. package/dist/lib/components/message/agent-response-form.component.js +310 -0
  27. package/dist/lib/components/message/agent-response-form.component.js.map +1 -0
  28. package/dist/lib/components/message/form-question.component.d.ts +105 -0
  29. package/dist/lib/components/message/form-question.component.d.ts.map +1 -0
  30. package/dist/lib/components/message/form-question.component.js +621 -0
  31. package/dist/lib/components/message/form-question.component.js.map +1 -0
  32. package/dist/lib/components/message/message-input-box.component.d.ts +12 -0
  33. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  34. package/dist/lib/components/message/message-input-box.component.js +14 -1
  35. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  36. package/dist/lib/components/message/message-input.component.d.ts +3 -3
  37. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  38. package/dist/lib/components/message/message-input.component.js +87 -102
  39. package/dist/lib/components/message/message-input.component.js.map +1 -1
  40. package/dist/lib/components/message/message-item.component.d.ts +39 -6
  41. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-item.component.js +492 -197
  43. package/dist/lib/components/message/message-item.component.js.map +1 -1
  44. package/dist/lib/components/message/message-list.component.d.ts +2 -1
  45. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  46. package/dist/lib/components/message/message-list.component.js +5 -1
  47. package/dist/lib/components/message/message-list.component.js.map +1 -1
  48. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +10 -0
  49. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  50. package/dist/lib/components/tasks/tasks-dropdown.component.js +108 -32
  51. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  52. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +23 -6
  53. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  54. package/dist/lib/components/workspace/conversation-workspace.component.js +128 -52
  55. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  56. package/dist/lib/conversations.module.d.ts +60 -56
  57. package/dist/lib/conversations.module.d.ts.map +1 -1
  58. package/dist/lib/conversations.module.js +17 -1
  59. package/dist/lib/conversations.module.js.map +1 -1
  60. package/dist/lib/models/collection-view.model.d.ts +30 -0
  61. package/dist/lib/models/collection-view.model.d.ts.map +1 -0
  62. package/dist/lib/models/collection-view.model.js +2 -0
  63. package/dist/lib/models/collection-view.model.js.map +1 -0
  64. package/dist/lib/models/conversation-state.model.d.ts +1 -0
  65. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  66. package/dist/lib/services/active-tasks.service.d.ts +1 -0
  67. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  68. package/dist/lib/services/active-tasks.service.js.map +1 -1
  69. package/dist/lib/services/conversation-agent.service.d.ts +4 -1
  70. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  71. package/dist/lib/services/conversation-agent.service.js +22 -2
  72. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  73. package/dist/lib/services/conversation-streaming.service.d.ts +1 -0
  74. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  75. package/dist/lib/services/conversation-streaming.service.js +11 -26
  76. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  77. package/dist/lib/services/data-cache.service.d.ts +12 -0
  78. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  79. package/dist/lib/services/data-cache.service.js +41 -0
  80. package/dist/lib/services/data-cache.service.js.map +1 -1
  81. package/dist/lib/services/mention-parser.service.d.ts +6 -1
  82. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  83. package/dist/lib/services/mention-parser.service.js +114 -34
  84. package/dist/lib/services/mention-parser.service.js.map +1 -1
  85. package/dist/lib/services/ui-command-handler.service.d.ts +45 -0
  86. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -0
  87. package/dist/lib/services/ui-command-handler.service.js +95 -0
  88. package/dist/lib/services/ui-command-handler.service.js.map +1 -0
  89. package/package.json +15 -14
@@ -2,18 +2,22 @@ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
2
  import { RunView, CompositeKey, KeyValuePair } from '@memberjunction/core';
3
3
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
4
4
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
5
+ import { ConversationUtility } from '@memberjunction/ai-core-plus';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../../services/mention-parser.service";
7
8
  import * as i2 from "../../services/mention-autocomplete.service";
8
- import * as i3 from "@angular/common";
9
- import * as i4 from "@angular/forms";
10
- import * as i5 from "@memberjunction/ng-artifacts";
11
- import * as i6 from "ngx-markdown";
12
- import * as i7 from "./suggested-responses.component";
13
- import * as i8 from "./conversation-message-rating.component";
14
- import * as i9 from "../tasks/task-widget.component";
9
+ import * as i3 from "../../services/ui-command-handler.service";
10
+ import * as i4 from "@angular/common";
11
+ import * as i5 from "@angular/forms";
12
+ import * as i6 from "@memberjunction/ng-artifacts";
13
+ import * as i7 from "ngx-markdown";
14
+ import * as i8 from "./suggested-responses.component";
15
+ import * as i9 from "./agent-response-form.component";
16
+ import * as i10 from "./actionable-commands.component";
17
+ import * as i11 from "./conversation-message-rating.component";
18
+ import * as i12 from "../tasks/task-widget.component";
15
19
  function MessageItemComponent_Conditional_3_Conditional_0_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelement(0, "img", 18);
20
+ i0.ɵɵelement(0, "img", 19);
17
21
  } if (rf & 2) {
18
22
  const ctx_r0 = i0.ɵɵnextContext(2);
19
23
  i0.ɵɵproperty("src", ctx_r0.userAvatarUrl, i0.ɵɵsanitizeUrl);
@@ -25,10 +29,10 @@ function MessageItemComponent_Conditional_3_Conditional_1_Template(rf, ctx) { if
25
29
  i0.ɵɵclassMap(ctx_r0.userAvatarIconClass);
26
30
  } }
27
31
  function MessageItemComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
28
- i0.ɵɵelement(0, "i", 20);
32
+ i0.ɵɵelement(0, "i", 21);
29
33
  } }
30
34
  function MessageItemComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
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);
35
+ i0.ɵɵtemplate(0, MessageItemComponent_Conditional_3_Conditional_0_Template, 1, 1, "img", 19)(1, MessageItemComponent_Conditional_3_Conditional_1_Template, 1, 2, "i", 20)(2, MessageItemComponent_Conditional_3_Conditional_2_Template, 1, 0, "i", 21);
32
36
  } if (rf & 2) {
33
37
  const ctx_r0 = i0.ɵɵnextContext();
34
38
  i0.ɵɵconditional(ctx_r0.userAvatarUrl ? 0 : ctx_r0.userAvatarIconClass ? 1 : 2);
@@ -40,9 +44,9 @@ function MessageItemComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
40
44
  i0.ɵɵproperty("ngClass", (ctx_r0.aiAgentInfo == null ? null : ctx_r0.aiAgentInfo.iconClass) || "fa-robot");
41
45
  } }
42
46
  function MessageItemComponent_span_12_Template(rf, ctx) { if (rf & 1) {
43
- i0.ɵɵelementStart(0, "span", 21);
47
+ i0.ɵɵelementStart(0, "span", 22);
44
48
  i0.ɵɵelement(1, "i", 2);
45
- i0.ɵɵelementStart(2, "span", 22);
49
+ i0.ɵɵelementStart(2, "span", 23);
46
50
  i0.ɵɵtext(3);
47
51
  i0.ɵɵelementEnd()();
48
52
  } if (rf & 2) {
@@ -54,8 +58,8 @@ function MessageItemComponent_span_12_Template(rf, ctx) { if (rf & 1) {
54
58
  i0.ɵɵtextInterpolate(ctx_r0.getStatusText());
55
59
  } }
56
60
  function MessageItemComponent_span_13_Template(rf, ctx) { if (rf & 1) {
57
- i0.ɵɵelementStart(0, "span", 23);
58
- i0.ɵɵelement(1, "i", 24);
61
+ i0.ɵɵelementStart(0, "span", 24);
62
+ i0.ɵɵelement(1, "i", 25);
59
63
  i0.ɵɵtext(2);
60
64
  i0.ɵɵelementEnd();
61
65
  } if (rf & 2) {
@@ -64,8 +68,15 @@ function MessageItemComponent_span_13_Template(rf, ctx) { if (rf & 1) {
64
68
  i0.ɵɵadvance(2);
65
69
  i0.ɵɵtextInterpolate1(" ", ctx_r0.timePillText, " ");
66
70
  } }
67
- function MessageItemComponent_span_14_span_2_Template(rf, ctx) { if (rf & 1) {
68
- i0.ɵɵelementStart(0, "span", 28);
71
+ function MessageItemComponent_span_14_Template(rf, ctx) { if (rf & 1) {
72
+ const _r2 = i0.ɵɵgetCurrentView();
73
+ i0.ɵɵelementStart(0, "span", 26);
74
+ 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.onTestFeedbackClick()); });
75
+ i0.ɵɵelement(1, "i", 27);
76
+ i0.ɵɵelementEnd();
77
+ } }
78
+ function MessageItemComponent_span_15_span_2_Template(rf, ctx) { if (rf & 1) {
79
+ i0.ɵɵelementStart(0, "span", 31);
69
80
  i0.ɵɵtext(1);
70
81
  i0.ɵɵelementEnd();
71
82
  } if (rf & 2) {
@@ -73,12 +84,12 @@ function MessageItemComponent_span_14_span_2_Template(rf, ctx) { if (rf & 1) {
73
84
  i0.ɵɵadvance();
74
85
  i0.ɵɵtextInterpolate(ctx_r0.getRatingCount());
75
86
  } }
76
- function MessageItemComponent_span_14_Template(rf, ctx) { if (rf & 1) {
77
- const _r2 = i0.ɵɵgetCurrentView();
78
- i0.ɵɵelementStart(0, "span", 25);
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()); });
80
- i0.ɵɵelement(1, "i", 26);
81
- i0.ɵɵtemplate(2, MessageItemComponent_span_14_span_2_Template, 2, 1, "span", 27);
87
+ function MessageItemComponent_span_15_Template(rf, ctx) { if (rf & 1) {
88
+ const _r3 = i0.ɵɵgetCurrentView();
89
+ i0.ɵɵelementStart(0, "span", 28);
90
+ i0.ɵɵlistener("click", function MessageItemComponent_span_15_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleAgentDetails()); });
91
+ i0.ɵɵelement(1, "i", 29);
92
+ i0.ɵɵtemplate(2, MessageItemComponent_span_15_span_2_Template, 2, 1, "span", 30);
82
93
  i0.ɵɵelementEnd();
83
94
  } if (rf & 2) {
84
95
  const ctx_r0 = i0.ɵɵnextContext();
@@ -87,15 +98,15 @@ function MessageItemComponent_span_14_Template(rf, ctx) { if (rf & 1) {
87
98
  i0.ɵɵadvance(2);
88
99
  i0.ɵɵproperty("ngIf", ctx_r0.hasRatings());
89
100
  } }
90
- function MessageItemComponent_Conditional_16_Conditional_2_Template(rf, ctx) { if (rf & 1) {
91
- i0.ɵɵelementStart(0, "span", 31);
101
+ function MessageItemComponent_Conditional_17_Conditional_2_Template(rf, ctx) { if (rf & 1) {
102
+ i0.ɵɵelementStart(0, "span", 34);
92
103
  i0.ɵɵtext(1, "(edited)");
93
104
  i0.ɵɵelementEnd();
94
105
  } }
95
- function MessageItemComponent_Conditional_16_Conditional_3_Template(rf, ctx) { if (rf & 1) {
96
- const _r3 = i0.ɵɵgetCurrentView();
97
- i0.ɵɵelementStart(0, "div", 34)(1, "mj-artifact-message-card", 35);
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)); });
106
+ function MessageItemComponent_Conditional_17_Conditional_3_Template(rf, ctx) { if (rf & 1) {
107
+ const _r4 = i0.ɵɵgetCurrentView();
108
+ i0.ɵɵelementStart(0, "div", 39)(1, "mj-artifact-message-card", 40);
109
+ i0.ɵɵlistener("actionPerformed", function MessageItemComponent_Conditional_17_Conditional_3_Template_mj_artifact_message_card_actionPerformed_1_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onArtifactActionPerformed($event)); });
99
110
  i0.ɵɵelementEnd()();
100
111
  } if (rf & 2) {
101
112
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -103,21 +114,39 @@ function MessageItemComponent_Conditional_16_Conditional_3_Template(rf, ctx) { i
103
114
  i0.ɵɵadvance();
104
115
  i0.ɵɵproperty("artifactId", ctx_r0.artifact.ID)("artifact", ctx_r0.artifact)("artifactVersion", ctx_r0.artifactVersion)("currentUser", ctx_r0.currentUser);
105
116
  } }
106
- function MessageItemComponent_Conditional_16_Conditional_4_Template(rf, ctx) { if (rf & 1) {
107
- const _r4 = i0.ɵɵgetCurrentView();
108
- i0.ɵɵelementStart(0, "mj-suggested-responses", 36);
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)); });
117
+ function MessageItemComponent_Conditional_17_Conditional_4_Template(rf, ctx) { if (rf & 1) {
118
+ const _r5 = i0.ɵɵgetCurrentView();
119
+ i0.ɵɵelementStart(0, "mj-suggested-responses", 41);
120
+ i0.ɵɵlistener("responseSelected", function MessageItemComponent_Conditional_17_Conditional_4_Template_mj_suggested_responses_responseSelected_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onSuggestedResponseSelected($event)); });
110
121
  i0.ɵɵelementEnd();
111
122
  } if (rf & 2) {
112
123
  const ctx_r0 = i0.ɵɵnextContext(2);
113
124
  i0.ɵɵproperty("suggestedResponses", ctx_r0.suggestedResponses)("disabled", ctx_r0.isProcessing)("isLastMessage", ctx_r0.isLastMessageInConversation)("isConversationOwner", ctx_r0.isConversationOwner);
114
125
  } }
115
- function MessageItemComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
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);
126
+ function MessageItemComponent_Conditional_17_Conditional_5_Template(rf, ctx) { if (rf & 1) {
127
+ const _r6 = i0.ɵɵgetCurrentView();
128
+ i0.ɵɵelementStart(0, "mj-agent-response-form", 42);
129
+ i0.ɵɵlistener("formSubmitted", function MessageItemComponent_Conditional_17_Conditional_5_Template_mj_agent_response_form_formSubmitted_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onFormSubmitted($event)); });
130
+ i0.ɵɵelementEnd();
131
+ } if (rf & 2) {
132
+ const ctx_r0 = i0.ɵɵnextContext(2);
133
+ i0.ɵɵproperty("responseForm", ctx_r0.responseForm)("disabled", ctx_r0.isProcessing)("isLastMessage", ctx_r0.isLastMessageInConversation)("isConversationOwner", ctx_r0.isConversationOwner);
134
+ } }
135
+ function MessageItemComponent_Conditional_17_Conditional_6_Template(rf, ctx) { if (rf & 1) {
136
+ const _r7 = i0.ɵɵgetCurrentView();
137
+ i0.ɵɵelementStart(0, "mj-actionable-commands", 43);
138
+ i0.ɵɵlistener("commandExecuted", function MessageItemComponent_Conditional_17_Conditional_6_Template_mj_actionable_commands_commandExecuted_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onCommandExecuted($event)); });
139
+ i0.ɵɵelementEnd();
140
+ } if (rf & 2) {
141
+ const ctx_r0 = i0.ɵɵnextContext(2);
142
+ i0.ɵɵproperty("commands", ctx_r0.actionableCommands)("disabled", ctx_r0.isProcessing)("isLastMessage", ctx_r0.isLastMessageInConversation)("isConversationOwner", ctx_r0.isConversationOwner);
143
+ } }
144
+ function MessageItemComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
145
+ i0.ɵɵelementStart(0, "div", 32);
146
+ i0.ɵɵelement(1, "markdown", 33);
147
+ i0.ɵɵtemplate(2, MessageItemComponent_Conditional_17_Conditional_2_Template, 2, 0, "span", 34);
119
148
  i0.ɵɵelementEnd();
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);
149
+ i0.ɵɵtemplate(3, MessageItemComponent_Conditional_17_Conditional_3_Template, 2, 6, "div", 35)(4, MessageItemComponent_Conditional_17_Conditional_4_Template, 1, 4, "mj-suggested-responses", 36)(5, MessageItemComponent_Conditional_17_Conditional_5_Template, 1, 4, "mj-agent-response-form", 37)(6, MessageItemComponent_Conditional_17_Conditional_6_Template, 1, 4, "mj-actionable-commands", 38);
121
150
  } if (rf & 2) {
122
151
  const ctx_r0 = i0.ɵɵnextContext();
123
152
  i0.ɵɵadvance();
@@ -128,24 +157,28 @@ function MessageItemComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
128
157
  i0.ɵɵconditional(ctx_r0.hasArtifact && ctx_r0.artifact && ctx_r0.artifactVersion ? 3 : -1);
129
158
  i0.ɵɵadvance();
130
159
  i0.ɵɵconditional(ctx_r0.isLastMessageInConversation && ctx_r0.isConversationOwner && ctx_r0.suggestedResponses.length > 0 ? 4 : -1);
160
+ i0.ɵɵadvance();
161
+ i0.ɵɵconditional(ctx_r0.isLastMessageInConversation && ctx_r0.isConversationOwner && ctx_r0.responseForm ? 5 : -1);
162
+ i0.ɵɵadvance();
163
+ i0.ɵɵconditional(ctx_r0.isLastMessageInConversation && ctx_r0.isConversationOwner && ctx_r0.actionableCommands.length > 0 ? 6 : -1);
131
164
  } }
132
- function MessageItemComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
133
- const _r5 = i0.ɵɵgetCurrentView();
134
- i0.ɵɵelementStart(0, "div", 11)(1, "textarea", 37);
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); });
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)); });
165
+ function MessageItemComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
166
+ const _r8 = i0.ɵɵgetCurrentView();
167
+ i0.ɵɵelementStart(0, "div", 12)(1, "textarea", 44);
168
+ i0.ɵɵtwoWayListener("ngModelChange", function MessageItemComponent_Conditional_18_Template_textarea_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.editedText, $event) || (ctx_r0.editedText = $event); return i0.ɵɵresetView($event); });
169
+ i0.ɵɵlistener("keydown", function MessageItemComponent_Conditional_18_Template_textarea_keydown_1_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onEditKeydown($event)); });
137
170
  i0.ɵɵelementEnd();
138
- i0.ɵɵelementStart(2, "div", 38)(3, "button", 39);
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()); });
140
- i0.ɵɵelement(4, "i", 40);
171
+ i0.ɵɵelementStart(2, "div", 45)(3, "button", 46);
172
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_18_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.saveEdit()); });
173
+ i0.ɵɵelement(4, "i", 47);
141
174
  i0.ɵɵtext(5, " Save ");
142
175
  i0.ɵɵelementEnd();
143
- i0.ɵɵelementStart(6, "button", 41);
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()); });
145
- i0.ɵɵelement(7, "i", 42);
176
+ i0.ɵɵelementStart(6, "button", 48);
177
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_18_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r8); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.cancelEditing()); });
178
+ i0.ɵɵelement(7, "i", 49);
146
179
  i0.ɵɵtext(8, " Cancel ");
147
180
  i0.ɵɵelementEnd()();
148
- i0.ɵɵelementStart(9, "div", 43);
181
+ i0.ɵɵelementStart(9, "div", 50);
149
182
  i0.ɵɵtext(10, " Press Enter to save, Shift+Enter for new line, Escape to cancel ");
150
183
  i0.ɵɵelementEnd()();
151
184
  } if (rf & 2) {
@@ -153,15 +186,15 @@ function MessageItemComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
153
186
  i0.ɵɵadvance();
154
187
  i0.ɵɵtwoWayProperty("ngModel", ctx_r0.editedText);
155
188
  } }
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);
189
+ function MessageItemComponent_Conditional_19_Conditional_2_Template(rf, ctx) { if (rf & 1) {
190
+ const _r9 = i0.ɵɵgetCurrentView();
191
+ i0.ɵɵelementStart(0, "div", 52)(1, "button", 53);
192
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_19_Conditional_2_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onPinClick()); });
193
+ i0.ɵɵelement(2, "i", 54);
161
194
  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);
195
+ i0.ɵɵelementStart(3, "button", 55);
196
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_19_Conditional_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r9); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.onDeleteClick()); });
197
+ i0.ɵɵelement(4, "i", 56);
165
198
  i0.ɵɵelementEnd()();
166
199
  } if (rf & 2) {
167
200
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -170,10 +203,10 @@ function MessageItemComponent_Conditional_18_Conditional_2_Template(rf, ctx) { i
170
203
  i0.ɵɵadvance();
171
204
  i0.ɵɵclassProp("pinned", ctx_r0.message.IsPinned);
172
205
  } }
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);
206
+ function MessageItemComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
207
+ i0.ɵɵelementStart(0, "div", 13);
208
+ i0.ɵɵelement(1, "mj-conversation-message-rating", 51);
209
+ i0.ɵɵtemplate(2, MessageItemComponent_Conditional_19_Conditional_2_Template, 5, 3, "div", 52);
177
210
  i0.ɵɵelementEnd();
178
211
  } if (rf & 2) {
179
212
  const ctx_r0 = i0.ɵɵnextContext();
@@ -182,17 +215,17 @@ function MessageItemComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
182
215
  i0.ɵɵadvance();
183
216
  i0.ɵɵconditional(ctx_r0.isLastMessage ? 2 : -1);
184
217
  } }
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);
218
+ function MessageItemComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
219
+ const _r10 = i0.ɵɵgetCurrentView();
220
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 57);
221
+ i0.ɵɵelement(2, "mj-conversation-message-rating", 51);
222
+ i0.ɵɵelementStart(3, "div", 58)(4, "button", 53);
223
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_21_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onPinClick()); });
224
+ i0.ɵɵelement(5, "i", 54);
192
225
  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);
226
+ i0.ɵɵelementStart(6, "button", 55);
227
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_21_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r10); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onDeleteClick()); });
228
+ i0.ɵɵelement(7, "i", 56);
196
229
  i0.ɵɵelementEnd()()()();
197
230
  } if (rf & 2) {
198
231
  const ctx_r0 = i0.ɵɵnextContext();
@@ -203,11 +236,11 @@ function MessageItemComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
203
236
  i0.ɵɵadvance();
204
237
  i0.ɵɵclassProp("pinned", ctx_r0.message.IsPinned);
205
238
  } }
206
- function MessageItemComponent_Conditional_21_Conditional_1_div_15_Template(rf, ctx) { if (rf & 1) {
207
- i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
239
+ function MessageItemComponent_Conditional_22_Conditional_1_div_15_Template(rf, ctx) { if (rf & 1) {
240
+ i0.ɵɵelementStart(0, "div", 65)(1, "span", 66);
208
241
  i0.ɵɵtext(2, "Steps:");
209
242
  i0.ɵɵelementEnd();
210
- i0.ɵɵelementStart(3, "span", 60);
243
+ i0.ɵɵelementStart(3, "span", 67);
211
244
  i0.ɵɵtext(4);
212
245
  i0.ɵɵelementEnd()();
213
246
  } if (rf & 2) {
@@ -215,11 +248,11 @@ function MessageItemComponent_Conditional_21_Conditional_1_div_15_Template(rf, c
215
248
  i0.ɵɵadvance(4);
216
249
  i0.ɵɵtextInterpolate(ctx_r0.agentRunStepCount);
217
250
  } }
218
- function MessageItemComponent_Conditional_21_Conditional_1_div_16_Template(rf, ctx) { if (rf & 1) {
219
- i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
251
+ function MessageItemComponent_Conditional_22_Conditional_1_div_16_Template(rf, ctx) { if (rf & 1) {
252
+ i0.ɵɵelementStart(0, "div", 65)(1, "span", 66);
220
253
  i0.ɵɵtext(2, "Tokens:");
221
254
  i0.ɵɵelementEnd();
222
- i0.ɵɵelementStart(3, "span", 60);
255
+ i0.ɵɵelementStart(3, "span", 67);
223
256
  i0.ɵɵtext(4);
224
257
  i0.ɵɵelementEnd()();
225
258
  } if (rf & 2) {
@@ -227,11 +260,11 @@ function MessageItemComponent_Conditional_21_Conditional_1_div_16_Template(rf, c
227
260
  i0.ɵɵadvance(4);
228
261
  i0.ɵɵtextInterpolate(ctx_r0.formatNumber(ctx_r0.agentRunTotalTokens));
229
262
  } }
230
- function MessageItemComponent_Conditional_21_Conditional_1_div_17_Template(rf, ctx) { if (rf & 1) {
231
- i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
263
+ function MessageItemComponent_Conditional_22_Conditional_1_div_17_Template(rf, ctx) { if (rf & 1) {
264
+ i0.ɵɵelementStart(0, "div", 65)(1, "span", 66);
232
265
  i0.ɵɵtext(2, "Cost:");
233
266
  i0.ɵɵelementEnd();
234
- i0.ɵɵelementStart(3, "span", 60);
267
+ i0.ɵɵelementStart(3, "span", 67);
235
268
  i0.ɵɵtext(4);
236
269
  i0.ɵɵelementEnd()();
237
270
  } if (rf & 2) {
@@ -239,11 +272,11 @@ function MessageItemComponent_Conditional_21_Conditional_1_div_17_Template(rf, c
239
272
  i0.ɵɵadvance(4);
240
273
  i0.ɵɵtextInterpolate1("\\$", ctx_r0.agentRunTotalCost.toFixed(4), "");
241
274
  } }
242
- function MessageItemComponent_Conditional_21_Conditional_1_div_18_Template(rf, ctx) { if (rf & 1) {
243
- i0.ɵɵelementStart(0, "div", 58)(1, "span", 59);
275
+ function MessageItemComponent_Conditional_22_Conditional_1_div_18_Template(rf, ctx) { if (rf & 1) {
276
+ i0.ɵɵelementStart(0, "div", 65)(1, "span", 66);
244
277
  i0.ɵɵtext(2, "Status:");
245
278
  i0.ɵɵelementEnd();
246
- i0.ɵɵelementStart(3, "span", 64);
279
+ i0.ɵɵelementStart(3, "span", 71);
247
280
  i0.ɵɵtext(4);
248
281
  i0.ɵɵelementEnd()();
249
282
  } if (rf & 2) {
@@ -253,25 +286,25 @@ function MessageItemComponent_Conditional_21_Conditional_1_div_18_Template(rf, c
253
286
  i0.ɵɵadvance();
254
287
  i0.ɵɵtextInterpolate1(" ", ctx_r0.agentRun.Status, " ");
255
288
  } }
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()); });
289
+ function MessageItemComponent_Conditional_22_Conditional_1_Template(rf, ctx) { if (rf & 1) {
290
+ const _r11 = i0.ɵɵgetCurrentView();
291
+ i0.ɵɵelementStart(0, "div", 59)(1, "div", 61);
292
+ i0.ɵɵelement(2, "i", 62);
293
+ i0.ɵɵelementStart(3, "span")(4, "a", 63);
294
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_22_Conditional_1_Template_a_click_4_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openAgentRecord()); });
262
295
  i0.ɵɵtext(5);
263
296
  i0.ɵɵelementEnd();
264
297
  i0.ɵɵtext(6, " Run Details ");
265
298
  i0.ɵɵelementEnd()();
266
- i0.ɵɵelementStart(7, "div", 57)(8, "div", 58)(9, "span", 59);
299
+ i0.ɵɵelementStart(7, "div", 64)(8, "div", 65)(9, "span", 66);
267
300
  i0.ɵɵtext(10, "Run ID:");
268
301
  i0.ɵɵelementEnd();
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()); });
302
+ i0.ɵɵelementStart(11, "span", 67)(12, "a", 68);
303
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_22_Conditional_1_Template_a_click_12_listener() { i0.ɵɵrestoreView(_r11); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.openAgentRunRecord()); });
271
304
  i0.ɵɵtext(13);
272
- i0.ɵɵelement(14, "i", 62);
305
+ i0.ɵɵelement(14, "i", 69);
273
306
  i0.ɵɵelementEnd()()();
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);
307
+ i0.ɵɵtemplate(15, MessageItemComponent_Conditional_22_Conditional_1_div_15_Template, 5, 1, "div", 70)(16, MessageItemComponent_Conditional_22_Conditional_1_div_16_Template, 5, 1, "div", 70)(17, MessageItemComponent_Conditional_22_Conditional_1_div_17_Template, 5, 1, "div", 70)(18, MessageItemComponent_Conditional_22_Conditional_1_div_18_Template, 5, 3, "div", 70);
275
308
  i0.ɵɵelementEnd()();
276
309
  } if (rf & 2) {
277
310
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -288,20 +321,20 @@ function MessageItemComponent_Conditional_21_Conditional_1_Template(rf, ctx) { i
288
321
  i0.ɵɵadvance();
289
322
  i0.ɵɵproperty("ngIf", ctx_r0.agentRun.Status);
290
323
  } }
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);
324
+ function MessageItemComponent_Conditional_22_Conditional_2_mj_task_widget_6_Template(rf, ctx) { if (rf & 1) {
325
+ i0.ɵɵelement(0, "mj-task-widget", 76);
293
326
  } if (rf & 2) {
294
- const task_r9 = ctx.$implicit;
295
- i0.ɵɵproperty("task", task_r9)("compact", false)("clickable", false)("showProgress", true)("showDuration", true);
327
+ const task_r12 = ctx.$implicit;
328
+ i0.ɵɵproperty("task", task_r12)("compact", false)("clickable", false)("showProgress", true)("showDuration", true);
296
329
  } }
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);
330
+ function MessageItemComponent_Conditional_22_Conditional_2_Template(rf, ctx) { if (rf & 1) {
331
+ i0.ɵɵelementStart(0, "div", 60)(1, "div", 72);
332
+ i0.ɵɵelement(2, "i", 73);
300
333
  i0.ɵɵelementStart(3, "span");
301
334
  i0.ɵɵtext(4);
302
335
  i0.ɵɵelementEnd()();
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);
336
+ i0.ɵɵelementStart(5, "div", 74);
337
+ i0.ɵɵtemplate(6, MessageItemComponent_Conditional_22_Conditional_2_mj_task_widget_6_Template, 1, 5, "mj-task-widget", 75);
305
338
  i0.ɵɵelementEnd()();
306
339
  } if (rf & 2) {
307
340
  const ctx_r0 = i0.ɵɵnextContext(2);
@@ -310,9 +343,9 @@ function MessageItemComponent_Conditional_21_Conditional_2_Template(rf, ctx) { i
310
343
  i0.ɵɵadvance(2);
311
344
  i0.ɵɵproperty("ngForOf", ctx_r0.detailTasks);
312
345
  } }
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);
346
+ function MessageItemComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
347
+ i0.ɵɵelementStart(0, "div", 16);
348
+ i0.ɵɵtemplate(1, MessageItemComponent_Conditional_22_Conditional_1_Template, 19, 6, "div", 59)(2, MessageItemComponent_Conditional_22_Conditional_2_Template, 7, 2, "div", 60);
316
349
  i0.ɵɵelementEnd();
317
350
  } if (rf & 2) {
318
351
  const ctx_r0 = i0.ɵɵnextContext();
@@ -321,26 +354,26 @@ function MessageItemComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
321
354
  i0.ɵɵadvance();
322
355
  i0.ɵɵconditional(ctx_r0.detailTasks.length > 0 ? 2 : -1);
323
356
  } }
324
- function MessageItemComponent_Conditional_22_Template(rf, ctx) { if (rf & 1) {
325
- const _r10 = i0.ɵɵgetCurrentView();
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);
357
+ function MessageItemComponent_Conditional_23_Template(rf, ctx) { if (rf & 1) {
358
+ const _r13 = i0.ɵɵgetCurrentView();
359
+ i0.ɵɵelementStart(0, "div", 17)(1, "button", 77);
360
+ i0.ɵɵlistener("click", function MessageItemComponent_Conditional_23_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r13); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onRetryClick()); });
361
+ i0.ɵɵelement(2, "i", 78);
329
362
  i0.ɵɵtext(3, " Retry ");
330
363
  i0.ɵɵelementEnd()();
331
364
  } }
332
- function MessageItemComponent_div_23_Template(rf, ctx) { if (rf & 1) {
333
- const _r11 = i0.ɵɵgetCurrentView();
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);
365
+ function MessageItemComponent_div_24_Template(rf, ctx) { if (rf & 1) {
366
+ const _r14 = i0.ɵɵgetCurrentView();
367
+ i0.ɵɵelementStart(0, "div", 79)(1, "button", 80);
368
+ i0.ɵɵlistener("click", function MessageItemComponent_div_24_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleReaction("like")); });
369
+ i0.ɵɵelement(2, "i", 81);
370
+ i0.ɵɵelementStart(3, "span", 82);
338
371
  i0.ɵɵtext(4, "0");
339
372
  i0.ɵɵelementEnd()();
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);
373
+ i0.ɵɵelementStart(5, "button", 80);
374
+ i0.ɵɵlistener("click", function MessageItemComponent_div_24_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r14); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.toggleReaction("comment")); });
375
+ i0.ɵɵelement(6, "i", 83);
376
+ i0.ɵɵelementStart(7, "span", 82);
344
377
  i0.ɵɵtext(8, "0");
345
378
  i0.ɵɵelementEnd()()();
346
379
  } }
@@ -353,6 +386,7 @@ export class MessageItemComponent extends BaseAngularComponent {
353
386
  cdRef;
354
387
  mentionParser;
355
388
  mentionAutocomplete;
389
+ uiCommandHandler;
356
390
  message;
357
391
  conversation;
358
392
  currentUser;
@@ -368,6 +402,7 @@ export class MessageItemComponent extends BaseAngularComponent {
368
402
  editClicked = new EventEmitter();
369
403
  deleteClicked = new EventEmitter();
370
404
  retryClicked = new EventEmitter();
405
+ testFeedbackClicked = new EventEmitter();
371
406
  artifactClicked = new EventEmitter();
372
407
  artifactActionPerformed = new EventEmitter();
373
408
  messageEdited = new EventEmitter();
@@ -389,14 +424,16 @@ export class MessageItemComponent extends BaseAngularComponent {
389
424
  // Memoization for mention parsing to prevent repeated parsing on change detection
390
425
  _cachedDisplayMessage = '';
391
426
  _cachedMessageText = '';
392
- constructor(cdRef, mentionParser, mentionAutocomplete) {
427
+ constructor(cdRef, mentionParser, mentionAutocomplete, uiCommandHandler) {
393
428
  super();
394
429
  this.cdRef = cdRef;
395
430
  this.mentionParser = mentionParser;
396
431
  this.mentionAutocomplete = mentionAutocomplete;
432
+ this.uiCommandHandler = uiCommandHandler;
397
433
  }
398
434
  async ngOnInit() {
399
- // No longer need to load artifacts per message - they are preloaded in chat area
435
+ // Execute automatic commands if present
436
+ await this.executeAutomaticCommands();
400
437
  }
401
438
  ngOnChanges(_changes) {
402
439
  // No longer need to manage timer for agentRun changes
@@ -611,73 +648,220 @@ export class MessageItemComponent extends BaseAngularComponent {
611
648
  }
612
649
  /**
613
650
  * Transform @mentions in text to HTML badge elements
651
+ * Supports both JSON format (@{type:"agent",id:"uuid",...}) and legacy text format (@AgentName)
614
652
  * Uses inline HTML that markdown will preserve
615
653
  */
616
654
  transformMentionsToHTML(text) {
617
655
  if (!text)
618
656
  return '';
657
+ // Get available agents and users for name/icon lookup
619
658
  const agents = this.mentionAutocomplete.getAvailableAgents();
620
659
  const users = this.mentionAutocomplete.getAvailableUsers();
621
- // Parse mentions from the text
622
- const parseResult = this.mentionParser.parseMentions(text, agents, users);
623
- // Replace each mention with an HTML badge
624
- // Note: Handle both @"Agent Name" (quoted) and @AgentName formats
625
- let transformedText = text;
626
- for (const mention of parseResult.mentions) {
627
- const badgeClass = mention.type === 'agent' ? 'mention-badge agent' : 'mention-badge user';
628
- // Get icon or image for the mention
629
- let iconHTML = '';
630
- if (mention.type === 'agent') {
631
- // For agents, look up their LogoURL or IconClass from AIEngineBase cached agents
632
- const agent = AIEngineBase.Instance?.Agents?.find(a => a.ID === mention.id);
633
- // Debug logging
634
- if (agent) {
635
- console.log(`[MessageItem] Agent ${agent.Name}: LogoURL="${agent.LogoURL}", IconClass="${agent.IconClass}"`);
636
- }
637
- else {
638
- console.warn(`[MessageItem] Agent not found for mention ID: ${mention.id}, name: ${mention.name}`);
639
- }
640
- if (agent?.LogoURL && agent.LogoURL.trim()) {
641
- // Use LogoURL image if available (takes precedence)
642
- // Escape any quotes in the URL for safety
643
- const safeUrl = agent.LogoURL.replace(/"/g, '"');
644
- iconHTML = `<img src="${safeUrl}" alt="${mention.name}" style="width: 16px; height: 16px; border-radius: 50%; object-fit: cover;"> `;
645
- }
646
- else {
647
- // Fallback to IconClass
648
- const iconClass = agent?.IconClass || 'fa-solid fa-robot';
649
- // Special handling for mj-icon-skip (and other custom CSS icons with background-image)
650
- // Extract the SVG data URI and use it as an img src instead of relying on CSS
651
- if (iconClass === 'mj-icon-skip') {
652
- const skipSvg = "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";
653
- iconHTML = `<img src="${skipSvg}" alt="${mention.name}" style="width: 16px; height: 16px; border-radius: 50%; object-fit: cover;"> `;
654
- }
655
- else {
656
- // Regular icon font class
657
- iconHTML = `<i class="${iconClass}"></i> `;
660
+ // Parse all @{...} tokens
661
+ const tokens = ConversationUtility.ParseSpecialContent(text);
662
+ if (tokens.length === 0)
663
+ return text; // No tokens found, return original text
664
+ // Replace tokens in reverse order to maintain indices
665
+ let result = text;
666
+ for (let i = tokens.length - 1; i >= 0; i--) {
667
+ const token = tokens[i];
668
+ let html = '';
669
+ switch (token.mode) {
670
+ case 'mention':
671
+ html = this.renderMentionHTML(token.content, agents, users);
672
+ break;
673
+ case 'form':
674
+ html = this.renderFormHTML(token.content);
675
+ break;
676
+ default:
677
+ // Unknown mode, leave original text as-is
678
+ html = token.originalText;
679
+ }
680
+ result = result.substring(0, token.startIndex) + html + result.substring(token.endIndex);
681
+ }
682
+ return result;
683
+ }
684
+ renderMentionHTML(content, agents, users) {
685
+ let name = content.name;
686
+ let iconClass = '';
687
+ let logoURL = '';
688
+ let configPresetName = '';
689
+ // Look up actual name and icon if ID provided
690
+ if (content.type === 'agent' && agents) {
691
+ const agent = agents.find(a => a.ID === content.id);
692
+ if (agent) {
693
+ name = agent.Name;
694
+ iconClass = agent.IconClass || '';
695
+ logoURL = agent.LogoURL || '';
696
+ // Check for configuration preset (only show if non-default)
697
+ if (content.configId && AIEngineBase.Instance) {
698
+ const presets = AIEngineBase.Instance.GetAgentConfigurationPresets(content.id, true);
699
+ if (presets && presets.length > 0) {
700
+ const defaultPreset = presets.find(p => p.IsDefault) || presets[0];
701
+ const isNonDefault = content.configId !== defaultPreset?.ID;
702
+ // Only include preset name if it's not the default
703
+ if (isNonDefault && content.config) {
704
+ configPresetName = content.config;
705
+ }
658
706
  }
659
707
  }
660
708
  }
709
+ }
710
+ else if (content.type === 'user' && users) {
711
+ const user = users.find(u => u.ID === content.id);
712
+ if (user)
713
+ name = user.Name;
714
+ }
715
+ const escapedName = this.escapeHtml(name);
716
+ const typeClass = content.type === 'agent' ? 'agent' : 'user';
717
+ // Build preset indicator HTML if present
718
+ const presetIndicator = configPresetName
719
+ ? `<span class="preset-indicator">${this.escapeHtml(configPresetName)}</span>`
720
+ : '';
721
+ // Generate HTML based on whether we have an icon
722
+ if (logoURL) {
723
+ return `<span class="mention-badge ${typeClass}"><img src="${this.escapeHtml(logoURL)}" alt="" />${escapedName}${presetIndicator}</span>`;
724
+ }
725
+ else if (iconClass) {
726
+ return `<span class="mention-badge ${typeClass}"><i class="${this.escapeHtml(iconClass)}" aria-hidden="true"></i>${escapedName}${presetIndicator}</span>`;
727
+ }
728
+ else {
729
+ return `<span class="mention-badge ${typeClass}">${escapedName}${presetIndicator}</span>`;
730
+ }
731
+ }
732
+ renderFormHTML(content) {
733
+ if (!content.fields || content.fields.length === 0) {
734
+ return this.escapeHtml(JSON.stringify(content));
735
+ }
736
+ if (content.fields.length === 1) {
737
+ // Single field - simple inline pill
738
+ const field = content.fields[0];
739
+ const value = this.escapeHtml(String(field.value));
740
+ // Just show the value if it's a single simple response
741
+ // This handles cases like "Choose an option: weather" -> just show "weather"
742
+ return `<span class="form-response-pill single-field"><i class="fa fa-check" aria-hidden="true"></i>${value}</span>`;
743
+ }
744
+ else {
745
+ // Multiple fields - vertical question/answer layout for complex forms
746
+ const title = content.title ? this.escapeHtml(content.title) : 'Form Response';
747
+ const fieldsHTML = content.fields.map((f) => {
748
+ const label = this.escapeHtml(f.label || f.name);
749
+ const value = this.formatFieldValue(f);
750
+ return `<div class="pill-field">
751
+ <div class="field-question">${label}</div>
752
+ <div class="field-answer">${value}</div>
753
+ </div>`;
754
+ }).join('');
755
+ return `<div class="form-response-pill multi-field">
756
+ <div class="pill-header">
757
+ <i class="fa fa-check-square" aria-hidden="true"></i>
758
+ ${title}
759
+ </div>
760
+ <div class="pill-fields">${fieldsHTML}</div>
761
+ </div>`;
762
+ }
763
+ }
764
+ formatFieldValue(field) {
765
+ // Handle null/undefined
766
+ if (field.value == null) {
767
+ return this.escapeHtml('');
768
+ }
769
+ const stringValue = String(field.value);
770
+ // Format based on field type
771
+ switch (field.type) {
772
+ case 'date':
773
+ // Date-only: "May 1, 2024"
774
+ return this.formatDate(stringValue, false);
775
+ case 'datetime':
776
+ // Date and time: "May 1, 2024 at 6:00 AM"
777
+ return this.formatDate(stringValue, true);
778
+ case 'time':
779
+ // Time-only: "2:30 PM"
780
+ return this.formatTime(stringValue);
781
+ case 'daterange':
782
+ // Parse object: { start: '...', end: '...' }
783
+ return this.formatDateRange(field.value);
784
+ case 'slider':
785
+ // Value with optional suffix
786
+ return this.escapeHtml(stringValue);
787
+ default:
788
+ // Try auto-detect ISO date (for backward compatibility)
789
+ if (stringValue.match(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/)) {
790
+ // Legacy: guess based on time component
791
+ const date = new Date(stringValue);
792
+ const hasMidnight = date.getUTCHours() === 0 && date.getUTCMinutes() === 0 && date.getUTCSeconds() === 0;
793
+ return this.formatDate(stringValue, !hasMidnight);
794
+ }
795
+ return this.escapeHtml(stringValue);
796
+ }
797
+ }
798
+ formatDate(value, includeTime) {
799
+ try {
800
+ const date = new Date(value);
801
+ if (isNaN(date.getTime()))
802
+ return this.escapeHtml(value);
803
+ if (includeTime) {
804
+ return this.escapeHtml(date.toLocaleString('en-US', {
805
+ month: 'short',
806
+ day: 'numeric',
807
+ year: 'numeric',
808
+ hour: 'numeric',
809
+ minute: '2-digit',
810
+ hour12: true
811
+ }));
812
+ }
661
813
  else {
662
- // For users, use user icon
663
- iconHTML = '<i class="fa-solid fa-user"></i> ';
814
+ return this.escapeHtml(date.toLocaleDateString('en-US', {
815
+ month: 'short',
816
+ day: 'numeric',
817
+ year: 'numeric'
818
+ }));
664
819
  }
665
- // Match both quoted and unquoted versions
666
- const quotedPattern = new RegExp(`@"${this.escapeRegex(mention.name)}"`, 'gi');
667
- const unquotedPattern = new RegExp(`@${this.escapeRegex(mention.name)}(?![\\w"])`, 'gi');
668
- // Create badge HTML with icon and NO @ sign
669
- const badgeHTML = `<span class="${badgeClass}">${iconHTML}${mention.name}</span>`;
670
- // Replace quoted version first, then unquoted
671
- transformedText = transformedText.replace(quotedPattern, badgeHTML);
672
- transformedText = transformedText.replace(unquotedPattern, badgeHTML);
673
820
  }
674
- return transformedText;
821
+ catch (e) {
822
+ return this.escapeHtml(value);
823
+ }
675
824
  }
676
- /**
677
- * Escape special regex characters
678
- */
679
- escapeRegex(text) {
680
- return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
825
+ formatTime(value) {
826
+ // Handle "HH:mm" or "HH:mm:ss" format
827
+ try {
828
+ const [hours, minutes] = value.split(':').map(Number);
829
+ const date = new Date();
830
+ date.setHours(hours, minutes, 0);
831
+ return this.escapeHtml(date.toLocaleTimeString('en-US', {
832
+ hour: 'numeric',
833
+ minute: '2-digit',
834
+ hour12: true
835
+ }));
836
+ }
837
+ catch (e) {
838
+ return this.escapeHtml(value);
839
+ }
840
+ }
841
+ formatDateRange(value) {
842
+ if (typeof value === 'object' && value.start && value.end) {
843
+ const start = this.formatDate(value.start, false);
844
+ const end = this.formatDate(value.end, false);
845
+ // Remove HTML encoding temporarily to avoid double encoding
846
+ const startText = start.replace(/&[^;]+;/g, m => {
847
+ const map = { '&lt;': '<', '&gt;': '>', '&amp;': '&', '&quot;': '"', '&#039;': "'" };
848
+ return map[m] || m;
849
+ });
850
+ const endText = end.replace(/&[^;]+;/g, m => {
851
+ const map = { '&lt;': '<', '&gt;': '>', '&amp;': '&', '&quot;': '"', '&#039;': "'" };
852
+ return map[m] || m;
853
+ });
854
+ return this.escapeHtml(`${startText} to ${endText}`);
855
+ }
856
+ return this.escapeHtml(JSON.stringify(value));
857
+ }
858
+ escapeHtml(text) {
859
+ return text
860
+ .replace(/&/g, '&amp;')
861
+ .replace(/</g, '&lt;')
862
+ .replace(/>/g, '&gt;')
863
+ .replace(/"/g, '&quot;')
864
+ .replace(/'/g, '&#039;');
681
865
  }
682
866
  get isInProgressAIMessage() {
683
867
  return this.isAIMessage && this.message.Status === 'In-Progress';
@@ -937,6 +1121,11 @@ export class MessageItemComponent extends BaseAngularComponent {
937
1121
  this.deleteClicked.emit(this.message);
938
1122
  }
939
1123
  }
1124
+ onTestFeedbackClick() {
1125
+ if (!this.isProcessing) {
1126
+ this.testFeedbackClicked.emit(this.message);
1127
+ }
1128
+ }
940
1129
  onRetryClick() {
941
1130
  if (!this.isProcessing && this.messageStatus === 'Error') {
942
1131
  this.retryClicked.emit(this.message);
@@ -1018,7 +1207,6 @@ export class MessageItemComponent extends BaseAngularComponent {
1018
1207
  if (result.Success) {
1019
1208
  this.detailTasks = result.Results || [];
1020
1209
  this.tasksLoaded = true;
1021
- console.log(`📋 Loaded ${this.detailTasks.length} tasks for conversation detail ${this.message.ID}`);
1022
1210
  }
1023
1211
  }
1024
1212
  catch (error) {
@@ -1153,8 +1341,111 @@ export class MessageItemComponent extends BaseAngularComponent {
1153
1341
  onSuggestedResponseSelected(event) {
1154
1342
  this.suggestedResponseSelected.emit(event);
1155
1343
  }
1156
- static ɵfac = function MessageItemComponent_Factory(t) { return new (t || MessageItemComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MentionParserService), i0.ɵɵdirectiveInject(i2.MentionAutocompleteService)); };
1157
- 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) {
1344
+ /**
1345
+ * Get agent response form from message
1346
+ * Uses ResponseForm property from ConversationDetailEntity
1347
+ */
1348
+ get responseForm() {
1349
+ try {
1350
+ const rawData = this.message.ResponseForm;
1351
+ if (!rawData) {
1352
+ return null;
1353
+ }
1354
+ // Parse JSON string to AgentResponseForm object
1355
+ const form = JSON.parse(rawData);
1356
+ return form || null;
1357
+ }
1358
+ catch (error) {
1359
+ console.error('Failed to parse response form:', error, 'Raw data:', this.message.ResponseForm);
1360
+ return null;
1361
+ }
1362
+ }
1363
+ /**
1364
+ * Get actionable commands from message
1365
+ * Uses ActionableCommands property from ConversationDetailEntity
1366
+ */
1367
+ get actionableCommands() {
1368
+ try {
1369
+ const rawData = this.message.ActionableCommands;
1370
+ if (!rawData)
1371
+ return [];
1372
+ // Parse JSON string to array of ActionableCommand objects
1373
+ const commands = JSON.parse(rawData);
1374
+ return Array.isArray(commands) ? commands : [];
1375
+ }
1376
+ catch (error) {
1377
+ console.error('Failed to parse actionable commands:', error);
1378
+ return [];
1379
+ }
1380
+ }
1381
+ /**
1382
+ * Handle agent response form submission
1383
+ * Converts form data to the new @{_mode:"form",...} format
1384
+ */
1385
+ onFormSubmitted(formData) {
1386
+ const form = this.responseForm;
1387
+ if (!form) {
1388
+ console.error('No response form available for submission');
1389
+ return;
1390
+ }
1391
+ // Build fields array with proper labels and type metadata
1392
+ const fields = Object.entries(formData).map(([questionId, value]) => {
1393
+ const question = form.questions.find(q => q.id === questionId);
1394
+ const questionType = typeof question?.type === 'string' ? question.type : question?.type?.type;
1395
+ return {
1396
+ name: questionId,
1397
+ value: value,
1398
+ label: question?.label || questionId,
1399
+ type: questionType // Include type for proper formatting
1400
+ };
1401
+ });
1402
+ // Create formatted message using ConversationUtility
1403
+ const formMessage = ConversationUtility.CreateFormResponse('formSubmit', // Generic action name
1404
+ fields, form.title);
1405
+ // Emit the formatted message
1406
+ this.suggestedResponseSelected.emit({
1407
+ text: formMessage,
1408
+ customInput: undefined // No longer needed with new format
1409
+ });
1410
+ }
1411
+ /**
1412
+ * Handle actionable command execution
1413
+ */
1414
+ async onCommandExecuted(command) {
1415
+ try {
1416
+ await this.uiCommandHandler.executeActionableCommand(command);
1417
+ }
1418
+ catch (error) {
1419
+ console.error('Failed to execute command:', command, error);
1420
+ }
1421
+ }
1422
+ /**
1423
+ * Execute automatic commands when message loads
1424
+ * This is called after a message with automatic commands is received
1425
+ */
1426
+ async executeAutomaticCommands() {
1427
+ try {
1428
+ if (!this.isLastMessage)
1429
+ return; // we only do this when the message is the last one in the conversation
1430
+ // TODO - IMPORTANT
1431
+ // BELOW, after doing the commands,
1432
+ // we need to mark the message as haveing completed its automatic commands to avoid re-running on reload
1433
+ // For now, check if the property exists (will be added to schema)
1434
+ const rawData = this.message.AutomaticCommands;
1435
+ if (!rawData)
1436
+ return;
1437
+ // Parse JSON string to array of AutomaticCommand objects
1438
+ const commands = JSON.parse(rawData);
1439
+ if (Array.isArray(commands) && commands.length > 0) {
1440
+ await this.uiCommandHandler.executeAutomaticCommands(commands);
1441
+ }
1442
+ }
1443
+ catch (error) {
1444
+ console.error('Failed to execute automatic commands:', error);
1445
+ }
1446
+ }
1447
+ static ɵfac = function MessageItemComponent_Factory(t) { return new (t || MessageItemComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MentionParserService), i0.ɵɵdirectiveInject(i2.MentionAutocompleteService), i0.ɵɵdirectiveInject(i3.UICommandHandlerService)); };
1448
+ 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", testFeedbackClicked: "testFeedbackClicked", artifactClicked: "artifactClicked", artifactActionPerformed: "artifactActionPerformed", messageEdited: "messageEdited", openEntityRecord: "openEntityRecord", suggestedResponseSelected: "suggestedResponseSelected" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 25, vars: 25, 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", "test-feedback-icon", "title", "Provide Test Feedback", 3, "click", 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"], ["title", "Provide Test Feedback", 1, "test-feedback-icon", 3, "click"], [1, "fas", "fa-flask"], [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"], [3, "responseForm", "disabled", "isLastMessage", "isConversationOwner"], [3, "commands", "disabled", "isLastMessage", "isConversationOwner"], [1, "artifact-wrapper"], [3, "actionPerformed", "artifactId", "artifact", "artifactVersion", "currentUser"], [3, "responseSelected", "suggestedResponses", "disabled", "isLastMessage", "isConversationOwner"], [3, "formSubmitted", "responseForm", "disabled", "isLastMessage", "isConversationOwner"], [3, "commandExecuted", "commands", "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) {
1158
1449
  i0.ɵɵelementStart(0, "div")(1, "div", 0)(2, "div", 1);
1159
1450
  i0.ɵɵtemplate(3, MessageItemComponent_Conditional_3_Template, 3, 1)(4, MessageItemComponent_Conditional_4_Template, 1, 1, "i", 2);
1160
1451
  i0.ɵɵelementEnd()();
@@ -1165,16 +1456,16 @@ export class MessageItemComponent extends BaseAngularComponent {
1165
1456
  i0.ɵɵtext(10);
1166
1457
  i0.ɵɵpipe(11, "date");
1167
1458
  i0.ɵɵelementEnd();
1168
- 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);
1459
+ 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, 0, "span", 9)(15, MessageItemComponent_span_15_Template, 3, 4, "span", 10);
1169
1460
  i0.ɵɵelementEnd();
1170
- i0.ɵɵelementStart(15, "div", 10);
1171
- i0.ɵɵtemplate(16, MessageItemComponent_Conditional_16_Template, 5, 4)(17, MessageItemComponent_Conditional_17_Template, 11, 1, "div", 11);
1461
+ i0.ɵɵelementStart(16, "div", 11);
1462
+ i0.ɵɵtemplate(17, MessageItemComponent_Conditional_17_Template, 7, 6)(18, MessageItemComponent_Conditional_18_Template, 11, 1, "div", 12);
1172
1463
  i0.ɵɵelementEnd();
1173
- i0.ɵɵtemplate(18, MessageItemComponent_Conditional_18_Template, 3, 4, "div", 12);
1174
- i0.ɵɵelementStart(19, "div", 13);
1175
- i0.ɵɵtemplate(20, MessageItemComponent_Conditional_20_Template, 8, 6, "div", 14)(21, MessageItemComponent_Conditional_21_Template, 3, 2, "div", 15);
1464
+ i0.ɵɵtemplate(19, MessageItemComponent_Conditional_19_Template, 3, 4, "div", 13);
1465
+ i0.ɵɵelementStart(20, "div", 14);
1466
+ i0.ɵɵtemplate(21, MessageItemComponent_Conditional_21_Template, 8, 6, "div", 15)(22, MessageItemComponent_Conditional_22_Template, 3, 2, "div", 16);
1176
1467
  i0.ɵɵelementEnd();
1177
- i0.ɵɵtemplate(22, MessageItemComponent_Conditional_22_Template, 4, 0, "div", 16)(23, MessageItemComponent_div_23_Template, 9, 0, "div", 17);
1468
+ i0.ɵɵtemplate(23, MessageItemComponent_Conditional_23_Template, 4, 0, "div", 17)(24, MessageItemComponent_div_24_Template, 9, 0, "div", 18);
1178
1469
  i0.ɵɵelementEnd()();
1179
1470
  } if (rf & 2) {
1180
1471
  i0.ɵɵclassMap(ctx.messageClasses);
@@ -1188,33 +1479,35 @@ export class MessageItemComponent extends BaseAngularComponent {
1188
1479
  i0.ɵɵadvance();
1189
1480
  i0.ɵɵtextInterpolate1(" ", ctx.isAIMessage ? (ctx.aiAgentInfo == null ? null : ctx.aiAgentInfo.name) || "AI Assistant" : ctx.messageSenderName, " ");
1190
1481
  i0.ɵɵadvance(2);
1191
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(11, 21, ctx.message.__mj_CreatedAt, "short"));
1482
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind2(11, 22, ctx.message.__mj_CreatedAt, "short"));
1192
1483
  i0.ɵɵadvance(2);
1193
1484
  i0.ɵɵproperty("ngIf", ctx.isUserMessage && ctx.messageStatus !== "Complete");
1194
1485
  i0.ɵɵadvance();
1195
1486
  i0.ɵɵproperty("ngIf", !ctx.isUserMessage && ctx.timePillText);
1196
1487
  i0.ɵɵadvance();
1488
+ i0.ɵɵproperty("ngIf", ctx.message.TestRunID);
1489
+ i0.ɵɵadvance();
1197
1490
  i0.ɵɵproperty("ngIf", ctx.hasAgentRun);
1198
1491
  i0.ɵɵadvance(2);
1199
- i0.ɵɵconditional(!ctx.isEditing ? 16 : -1);
1492
+ i0.ɵɵconditional(!ctx.isEditing ? 17 : -1);
1200
1493
  i0.ɵɵadvance();
1201
- i0.ɵɵconditional(ctx.isEditing ? 17 : -1);
1494
+ i0.ɵɵconditional(ctx.isEditing ? 18 : -1);
1202
1495
  i0.ɵɵadvance();
1203
- i0.ɵɵconditional(ctx.isAIMessage && !ctx.isEditing && ctx.messageStatus === "Complete" && (ctx.isLastMessage || ctx.hasRatings()) ? 18 : -1);
1496
+ i0.ɵɵconditional(ctx.isAIMessage && !ctx.isEditing && ctx.messageStatus === "Complete" && (ctx.isLastMessage || ctx.hasRatings()) ? 19 : -1);
1204
1497
  i0.ɵɵadvance(2);
1205
- i0.ɵɵconditional(ctx.isAgentDetailsExpanded && !ctx.isLastMessage && ctx.isAIMessage && ctx.messageStatus === "Complete" ? 20 : -1);
1498
+ i0.ɵɵconditional(ctx.isAgentDetailsExpanded && !ctx.isLastMessage && ctx.isAIMessage && ctx.messageStatus === "Complete" ? 21 : -1);
1206
1499
  i0.ɵɵadvance();
1207
- i0.ɵɵconditional(ctx.isAgentDetailsExpanded && ctx.hasAgentRun ? 21 : -1);
1500
+ i0.ɵɵconditional(ctx.isAgentDetailsExpanded && ctx.hasAgentRun ? 22 : -1);
1208
1501
  i0.ɵɵadvance();
1209
- i0.ɵɵconditional(ctx.messageStatus === "Error" && ctx.isAIMessage && !ctx.isProcessing && !ctx.isEditing ? 22 : -1);
1502
+ i0.ɵɵconditional(ctx.messageStatus === "Error" && ctx.isAIMessage && !ctx.isProcessing && !ctx.isEditing ? 23 : -1);
1210
1503
  i0.ɵɵadvance();
1211
1504
  i0.ɵɵproperty("ngIf", !ctx.isProcessing && !ctx.isInProgressAIMessage && !ctx.isEditing);
1212
- } }, 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-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n[_nghost-%COMP%] .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: 2px solid rgba(102, 126, 234, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n[_nghost-%COMP%] .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n border: 2px solid rgba(240, 147, 251, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n[_nghost-%COMP%] .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n\n\n[_nghost-%COMP%] .mention-badge i[class^=\"mj-icon-\"], \n[_nghost-%COMP%] .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n\n\n[_nghost-%COMP%] .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n[_nghost-%COMP%] .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px 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-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.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.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@media (max-width: 768px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions[_ngcontent-%COMP%] {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn[_ngcontent-%COMP%] {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n\n\n@media (max-width: 480px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 6px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header[_ngcontent-%COMP%] {\n gap: 8px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .artifact-card-label[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .artifact-card-description[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel[_ngcontent-%COMP%] {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row[_ngcontent-%COMP%] {\n padding: 6px 8px;\n }\n\n .detail-label[_ngcontent-%COMP%], \n .detail-value[_ngcontent-%COMP%] {\n font-size: 11px;\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[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"] });
1505
+ } }, dependencies: [i4.NgClass, i4.NgForOf, i4.NgIf, i5.DefaultValueAccessor, i5.NgControlStatus, i5.NgModel, i6.ArtifactMessageCardComponent, i7.MarkdownComponent, i8.SuggestedResponsesComponent, i9.AgentResponseFormComponent, i10.ActionableCommandsComponent, i11.ConversationMessageRatingComponent, i12.TaskWidgetComponent, i4.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-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n[_nghost-%COMP%] .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: 2px solid rgba(102, 126, 234, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n[_nghost-%COMP%] .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n border: 2px solid rgba(240, 147, 251, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n[_nghost-%COMP%] .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n\n\n[_nghost-%COMP%] .mention-badge i[class^=\"mj-icon-\"], \n[_nghost-%COMP%] .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n\n\n[_nghost-%COMP%] .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n[_nghost-%COMP%] .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n\n\n\n\n[_nghost-%COMP%] .mention-badge .preset-indicator {\n display: inline-block;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 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-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.action-bar-btn.test-feedback[_ngcontent-%COMP%] {\n color: #F57C00;\n}\n\n.action-bar-btn.test-feedback[_ngcontent-%COMP%]:hover {\n opacity: 1;\n background: #FFF8E1;\n border-color: #F57C00;\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\n\n.test-feedback-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.test-feedback-icon[_ngcontent-%COMP%] i.fa-flask[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.test-feedback-icon[_ngcontent-%COMP%]:hover {\n color: #3B82F6; \n\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.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@media (max-width: 768px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions[_ngcontent-%COMP%] {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn[_ngcontent-%COMP%] {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n\n\n@media (max-width: 480px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 6px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header[_ngcontent-%COMP%] {\n gap: 8px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .artifact-card-label[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .artifact-card-description[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel[_ngcontent-%COMP%] {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row[_ngcontent-%COMP%] {\n padding: 6px 8px;\n }\n\n .detail-label[_ngcontent-%COMP%], \n .detail-value[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n}\n\n\n\n[_nghost-%COMP%] .form-response-pill {\n margin: 0 3px;\n transition: all 0.2s ease;\n}\n\n\n\n[_nghost-%COMP%] .form-response-pill.single-field {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n gap: 6px;\n padding: 4px 12px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n border: 2px solid rgba(16, 185, 129, 0.4);\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n cursor: default;\n white-space: nowrap;\n}\n\n\n\n[_nghost-%COMP%] .form-response-pill.multi-field {\n display: inline-block;\n max-width: min(800px, 100%);\n width: auto;\n min-width: 400px;\n margin: 8px 0;\n vertical-align: top;\n}\n\n[_nghost-%COMP%] .form-response-pill.single-field i {\n font-size: 11px;\n opacity: 0.95;\n}\n\n[_nghost-%COMP%] .form-response-pill.single-field strong {\n font-weight: 600;\n margin-right: 4px;\n}\n\n\n\n[_nghost-%COMP%] .form-response-pill .pill-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n font-weight: 600;\n font-size: 13px;\n border-radius: 12px 12px 0 0;\n border: 2px solid rgba(16, 185, 129, 0.4);\n border-bottom: none;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-header i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-fields {\n padding: 10px 12px;\n background: rgba(16, 185, 129, 0.08);\n border: 2px solid rgba(16, 185, 129, 0.4);\n border-top: none;\n border-radius: 0 0 12px 12px;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 0;\n font-size: 13px;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-field:not(:last-child) {\n border-bottom: 1px solid rgba(16, 185, 129, 0.2);\n padding-bottom: 12px;\n margin-bottom: 0;\n}\n\n[_nghost-%COMP%] .form-response-pill .field-question {\n font-weight: 600;\n color: #059669;\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n opacity: 0.9;\n}\n\n[_nghost-%COMP%] .form-response-pill .field-answer {\n color: #1f2937;\n font-weight: 400;\n font-size: 15px;\n line-height: 1.6;\n padding: 8px 0 8px 12px;\n background: transparent;\n border-left: 3px solid rgba(16, 185, 129, 0.4);\n font-style: italic;\n}\n\n\n\n\n[_nghost-%COMP%] .form-response-pill.single-field:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n[_nghost-%COMP%] .form-response-pill.multi-field:hover {\n transform: translateY(-1px);\n}\n\n[_nghost-%COMP%] .form-response-pill.multi-field:hover .pill-header {\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n\n\n@media (max-width: 600px) {\n [_nghost-%COMP%] .form-response-pill.multi-field {\n min-width: 300px;\n }\n}\n\n@media (max-width: 400px) {\n [_nghost-%COMP%] .form-response-pill.multi-field {\n min-width: 100%;\n }\n\n [_nghost-%COMP%] .form-response-pill .field-question {\n font-size: 11px;\n }\n\n [_nghost-%COMP%] .form-response-pill .field-answer {\n font-size: 14px;\n padding: 6px 0 6px 10px;\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[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.mj-icon-betty[_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 id='a' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 150'%3E%3Cpath d='M64.96,60.23h75.12c10.58,0,20.24,4.31,27.2,11.32,7.01,6.95,11.32,16.61,11.32,27.19s-4.31,20.24-11.32,27.19c-6.95,7.02-16.61,11.32-27.2,11.32h-75.12c-10.58,0-20.24-4.31-27.19-11.32-2.65-2.64-4.92-5.6-6.71-8.92-.24,0-.49.06-.74.06-2.46,0-4.67-1.05-6.34-2.65-1.6-1.66-2.58-3.87-2.58-6.34v-18.7c0-2.46.98-4.74,2.58-6.34,1.66-1.66,3.87-2.65,6.34-2.65.25,0,.49,0,.74.06,1.79-3.32,4.06-6.34,6.71-8.92,6.95-7.01,16.61-11.32,27.19-11.32' fill='%233d1252'/%3E%3Cpath d='M132.33,68.36h0c0,1.72-.74,3.32-1.91,4.49-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.78,0-3.32-.68-4.49-1.84-1.17-1.17-1.91-2.77-1.91-4.49h-12.92c-8.37,0-15.94,3.44-21.47,8.92-5.47,5.54-8.92,13.1-8.92,21.47v1.17l.06.37v.37l.06.43v.37l.06.37v.37l.06.37.06.43.06.37.06.37.06.37.06.37c0,.12.06.25.06.37l.06.37.12.37.06.37.12.37.06.37.12.37.12.31.06.37.12.37.12.37.12.31.12.37.12.37.19.31.12.37.12.37.12.31.18.37.12.31.19.31.18.37.12.31.18.31.19.37.18.31.18.31.19.31.18.31c.12.24.25.43.37.68l.19.25.24.31.19.31c.43.62.86,1.23,1.35,1.79l.18.24c.49.62.99,1.17,1.48,1.66.19.19.31.37.49.56.19.12.37.31.56.49.49.49,1.04.98,1.6,1.47l.31.19c.56.49,1.17.92,1.79,1.35.18.12.37.25.55.37l.31.25.31.18.31.19.37.18.31.18.31.19.31.18.31.19.37.12.31.19.31.18c.12.06.24.12.37.12l.31.19.37.12.31.19.37.12.31.12.37.19.37.12.31.12.37.12.37.12.37.06c.24.12.43.18.68.25l.37.12.37.06.37.12c.12,0,.25.06.37.06l.37.06.37.12.37.06.37.06.37.06.37.06.37.06.37.06.43.06h.37l.37.06h.37l.37.06h.8l.37.06h47.56c8.37,0,15.94-3.44,21.47-8.92,5.48-5.54,8.92-13.1,8.92-21.47s-3.44-15.94-8.92-21.47c-5.54-5.48-13.1-8.92-21.47-8.92h-7.75Z' fill='%23fff'/%3E%3Cpolygon points='54.93 12.74 85.57 55.25 106.12 55.25 106.12 34.89 106.12 34.7 105.75 34.7 54.93 12.74' fill='%233aba91'/%3E%3Cpolygon points='111.1 55.25 124.76 55.25 145 27.07 111.35 41.59 111.1 41.59 111.1 41.72 111.1 55.25' fill='%233aba91'/%3E%3Cpath d='M94.55,82.81c3.75,0,6.83,3.81,7.57,8.92.06.74-.31,1.35-.98,1.66-.61.31-1.35.18-1.84-.37-1.29-1.48-2.96-2.34-4.74-2.34s-3.38.86-4.67,2.34c-.49.55-1.23.68-1.91.37-.68-.31-1.05-.92-.92-1.66.68-5.11,3.81-8.92,7.51-8.92' fill='%233d1252'/%3E%3Cpath d='M132.08,115.24c-.31,1.05-.86,2.03-1.66,2.77-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.79,0-3.32-.68-4.49-1.84-.8-.74-1.36-1.72-1.66-2.77-.19-.68.06-1.41.68-1.84.56-.43,1.35-.49,1.97-.06.98.68,2.21,1.05,3.51,1.05h13.29c1.29,0,2.52-.37,3.51-1.05.61-.43,1.41-.37,1.97.06.62.43.86,1.17.68,1.84' fill='%233d1252'/%3E%3Cpath d='M144.02,82.81c3.69,0,6.83,3.81,7.51,8.92.12.74-.24,1.35-.92,1.66-.68.31-1.41.18-1.91-.37-1.29-1.48-2.89-2.34-4.67-2.34s-3.44.86-4.74,2.34c-.49.55-1.23.68-1.84.37-.68-.31-1.05-.92-.98-1.66.74-5.11,3.81-8.92,7.57-8.92' fill='%233d1252'/%3E%3C/svg%3E\");\n vertical-align: middle;\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"] });
1213
1506
  }
1214
1507
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MessageItemComponent, [{
1215
1508
  type: Component,
1216
- 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 - Match new editor chip style */\n:host ::ng-deep .mention-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n:host ::ng-deep .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: 2px solid rgba(102, 126, 234, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n:host ::ng-deep .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n border: 2px solid rgba(240, 147, 251, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n:host ::ng-deep .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n/* Support for custom icon classes with background-image (like mj-icon-skip) */\n:host ::ng-deep .mention-badge i[class^=\"mj-icon-\"],\n:host ::ng-deep .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n/* Support for image tags in mention badges */\n:host ::ng-deep .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n:host ::ng-deep .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px 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 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/* 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\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/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .message-item {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon i {\n font-size: 16px;\n }\n\n .message-header {\n font-size: 12px;\n }\n\n .message-sender {\n font-size: 12px;\n }\n\n .message-time {\n font-size: 11px;\n }\n\n .agent-badge {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .message-item {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar {\n border-radius: 6px;\n }\n\n .artifact-card {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header {\n gap: 8px;\n }\n\n .artifact-card-icon {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon i {\n font-size: 14px;\n }\n\n .artifact-card-label {\n font-size: 13px;\n }\n\n .artifact-card-description {\n font-size: 12px;\n }\n\n .message-header {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender {\n font-size: 11px;\n }\n\n .message-time {\n font-size: 10px;\n }\n\n .agent-badge {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row {\n padding: 6px 8px;\n }\n\n .detail-label,\n .detail-value {\n font-size: 11px;\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"] }]
1217
- }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.MentionParserService }, { type: i2.MentionAutocompleteService }], { message: [{
1509
+ 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 <!-- Test feedback icon (appears for test runs only) -->\n <span *ngIf=\"message.TestRunID\"\n class=\"test-feedback-icon\"\n (click)=\"onTestFeedbackClick()\"\n title=\"Provide Test Feedback\">\n <i class=\"fas fa-flask\"></i>\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 <!-- Agent Response Form (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && responseForm) {\n <mj-agent-response-form\n [responseForm]=\"responseForm\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (formSubmitted)=\"onFormSubmitted($event)\">\n </mj-agent-response-form>\n }\n\n <!-- Actionable Commands (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && actionableCommands.length > 0) {\n <mj-actionable-commands\n [commands]=\"actionableCommands\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (commandExecuted)=\"onCommandExecuted($event)\">\n </mj-actionable-commands>\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 - Match new editor chip style */\n:host ::ng-deep .mention-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n:host ::ng-deep .mention-badge.agent {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: 2px solid rgba(102, 126, 234, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n:host ::ng-deep .mention-badge.user {\n background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);\n color: white;\n border: 2px solid rgba(240, 147, 251, 0.4);\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n:host ::ng-deep .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n/* Support for custom icon classes with background-image (like mj-icon-skip) */\n:host ::ng-deep .mention-badge i[class^=\"mj-icon-\"],\n:host ::ng-deep .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n/* Support for image tags in mention badges */\n:host ::ng-deep .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n:host ::ng-deep .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n/* Configuration preset indicator for agent mentions with non-default presets */\n/* Matches the styling from mention-editor.component.ts (lines 432-444) */\n:host ::ng-deep .mention-badge .preset-indicator {\n display: inline-block;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 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 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.action-bar-btn.test-feedback {\n color: #F57C00;\n}\n\n.action-bar-btn.test-feedback:hover {\n opacity: 1;\n background: #FFF8E1;\n border-color: #F57C00;\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/* Test feedback icon in header - appears for test runs */\n.test-feedback-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.test-feedback-icon i.fa-flask {\n font-size: 13px;\n}\n\n.test-feedback-icon:hover {\n color: #3B82F6; /* Blue color for test feedback */\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\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/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .message-item {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon i {\n font-size: 16px;\n }\n\n .message-header {\n font-size: 12px;\n }\n\n .message-sender {\n font-size: 12px;\n }\n\n .message-time {\n font-size: 11px;\n }\n\n .agent-badge {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .message-item {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar {\n border-radius: 6px;\n }\n\n .artifact-card {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header {\n gap: 8px;\n }\n\n .artifact-card-icon {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon i {\n font-size: 14px;\n }\n\n .artifact-card-label {\n font-size: 13px;\n }\n\n .artifact-card-description {\n font-size: 12px;\n }\n\n .message-header {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender {\n font-size: 11px;\n }\n\n .message-time {\n font-size: 10px;\n }\n\n .agent-badge {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row {\n padding: 6px 8px;\n }\n\n .detail-label,\n .detail-value {\n font-size: 11px;\n }\n}\n\n/* Form Response Pills */\n:host ::ng-deep .form-response-pill {\n margin: 0 3px;\n transition: all 0.2s ease;\n}\n\n/* Single field form - inline pill (similar to mention badges) */\n:host ::ng-deep .form-response-pill.single-field {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n gap: 6px;\n padding: 4px 12px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n border: 2px solid rgba(16, 185, 129, 0.4);\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n cursor: default;\n white-space: nowrap;\n}\n\n/* Multi-field form - card-style (block display) */\n:host ::ng-deep .form-response-pill.multi-field {\n display: inline-block;\n max-width: min(800px, 100%);\n width: auto;\n min-width: 400px;\n margin: 8px 0;\n vertical-align: top;\n}\n\n:host ::ng-deep .form-response-pill.single-field i {\n font-size: 11px;\n opacity: 0.95;\n}\n\n:host ::ng-deep .form-response-pill.single-field strong {\n font-weight: 600;\n margin-right: 4px;\n}\n\n/* Multi-field form - card-style pill */\n:host ::ng-deep .form-response-pill .pill-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: linear-gradient(135deg, #10b981 0%, #059669 100%);\n color: white;\n font-weight: 600;\n font-size: 13px;\n border-radius: 12px 12px 0 0;\n border: 2px solid rgba(16, 185, 129, 0.4);\n border-bottom: none;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n:host ::ng-deep .form-response-pill .pill-header i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n:host ::ng-deep .form-response-pill .pill-fields {\n padding: 10px 12px;\n background: rgba(16, 185, 129, 0.08);\n border: 2px solid rgba(16, 185, 129, 0.4);\n border-top: none;\n border-radius: 0 0 12px 12px;\n}\n\n:host ::ng-deep .form-response-pill .pill-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 0;\n font-size: 13px;\n}\n\n:host ::ng-deep .form-response-pill .pill-field:not(:last-child) {\n border-bottom: 1px solid rgba(16, 185, 129, 0.2);\n padding-bottom: 12px;\n margin-bottom: 0;\n}\n\n:host ::ng-deep .form-response-pill .field-question {\n font-weight: 600;\n color: #059669;\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n opacity: 0.9;\n}\n\n:host ::ng-deep .form-response-pill .field-answer {\n color: #1f2937;\n font-weight: 400;\n font-size: 15px;\n line-height: 1.6;\n padding: 8px 0 8px 12px;\n background: transparent;\n border-left: 3px solid rgba(16, 185, 129, 0.4);\n font-style: italic;\n}\n\n\n/* Hover effect for form pills */\n:host ::ng-deep .form-response-pill.single-field:hover {\n transform: translateY(-1px);\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n:host ::ng-deep .form-response-pill.multi-field:hover {\n transform: translateY(-1px);\n}\n\n:host ::ng-deep .form-response-pill.multi-field:hover .pill-header {\n box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n/* Responsive adjustments for multi-field forms */\n@media (max-width: 600px) {\n :host ::ng-deep .form-response-pill.multi-field {\n min-width: 300px;\n }\n}\n\n@media (max-width: 400px) {\n :host ::ng-deep .form-response-pill.multi-field {\n min-width: 100%;\n }\n\n :host ::ng-deep .form-response-pill .field-question {\n font-size: 11px;\n }\n\n :host ::ng-deep .form-response-pill .field-answer {\n font-size: 14px;\n padding: 6px 0 6px 10px;\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 * Betty Icon - AI Assistant\n * Official Betty logo (face icon only)\n */\n.mj-icon-betty {\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 Betty face icon SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg id='a' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 150'%3E%3Cpath d='M64.96,60.23h75.12c10.58,0,20.24,4.31,27.2,11.32,7.01,6.95,11.32,16.61,11.32,27.19s-4.31,20.24-11.32,27.19c-6.95,7.02-16.61,11.32-27.2,11.32h-75.12c-10.58,0-20.24-4.31-27.19-11.32-2.65-2.64-4.92-5.6-6.71-8.92-.24,0-.49.06-.74.06-2.46,0-4.67-1.05-6.34-2.65-1.6-1.66-2.58-3.87-2.58-6.34v-18.7c0-2.46.98-4.74,2.58-6.34,1.66-1.66,3.87-2.65,6.34-2.65.25,0,.49,0,.74.06,1.79-3.32,4.06-6.34,6.71-8.92,6.95-7.01,16.61-11.32,27.19-11.32' fill='%233d1252'/%3E%3Cpath d='M132.33,68.36h0c0,1.72-.74,3.32-1.91,4.49-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.78,0-3.32-.68-4.49-1.84-1.17-1.17-1.91-2.77-1.91-4.49h-12.92c-8.37,0-15.94,3.44-21.47,8.92-5.47,5.54-8.92,13.1-8.92,21.47v1.17l.06.37v.37l.06.43v.37l.06.37v.37l.06.37.06.43.06.37.06.37.06.37.06.37c0,.12.06.25.06.37l.06.37.12.37.06.37.12.37.06.37.12.37.12.31.06.37.12.37.12.37.12.31.12.37.12.37.19.31.12.37.12.37.12.31.18.37.12.31.19.31.18.37.12.31.18.31.19.37.18.31.18.31.19.31.18.31c.12.24.25.43.37.68l.19.25.24.31.19.31c.43.62.86,1.23,1.35,1.79l.18.24c.49.62.99,1.17,1.48,1.66.19.19.31.37.49.56.19.12.37.31.56.49.49.49,1.04.98,1.6,1.47l.31.19c.56.49,1.17.92,1.79,1.35.18.12.37.25.55.37l.31.25.31.18.31.19.37.18.31.18.31.19.31.18.31.19.37.12.31.19.31.18c.12.06.24.12.37.12l.31.19.37.12.31.19.37.12.31.12.37.19.37.12.31.12.37.12.37.12.37.06c.24.12.43.18.68.25l.37.12.37.06.37.12c.12,0,.25.06.37.06l.37.06.37.12.37.06.37.06.37.06.37.06.37.06.37.06.43.06h.37l.37.06h.37l.37.06h.8l.37.06h47.56c8.37,0,15.94-3.44,21.47-8.92,5.48-5.54,8.92-13.1,8.92-21.47s-3.44-15.94-8.92-21.47c-5.54-5.48-13.1-8.92-21.47-8.92h-7.75Z' fill='%23fff'/%3E%3Cpolygon points='54.93 12.74 85.57 55.25 106.12 55.25 106.12 34.89 106.12 34.7 105.75 34.7 54.93 12.74' fill='%233aba91'/%3E%3Cpolygon points='111.1 55.25 124.76 55.25 145 27.07 111.35 41.59 111.1 41.59 111.1 41.72 111.1 55.25' fill='%233aba91'/%3E%3Cpath d='M94.55,82.81c3.75,0,6.83,3.81,7.57,8.92.06.74-.31,1.35-.98,1.66-.61.31-1.35.18-1.84-.37-1.29-1.48-2.96-2.34-4.74-2.34s-3.38.86-4.67,2.34c-.49.55-1.23.68-1.91.37-.68-.31-1.05-.92-.92-1.66.68-5.11,3.81-8.92,7.51-8.92' fill='%233d1252'/%3E%3Cpath d='M132.08,115.24c-.31,1.05-.86,2.03-1.66,2.77-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.79,0-3.32-.68-4.49-1.84-.8-.74-1.36-1.72-1.66-2.77-.19-.68.06-1.41.68-1.84.56-.43,1.35-.49,1.97-.06.98.68,2.21,1.05,3.51,1.05h13.29c1.29,0,2.52-.37,3.51-1.05.61-.43,1.41-.37,1.97.06.62.43.86,1.17.68,1.84' fill='%233d1252'/%3E%3Cpath d='M144.02,82.81c3.69,0,6.83,3.81,7.51,8.92.12.74-.24,1.35-.92,1.66-.68.31-1.41.18-1.91-.37-1.29-1.48-2.89-2.34-4.67-2.34s-3.44.86-4.74,2.34c-.49.55-1.23.68-1.84.37-.68-.31-1.05-.92-.98-1.66.74-5.11,3.81-8.92,7.57-8.92' fill='%233d1252'/%3E%3C/svg%3E\");\n vertical-align: middle;\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"] }]
1510
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.MentionParserService }, { type: i2.MentionAutocompleteService }, { type: i3.UICommandHandlerService }], { message: [{
1218
1511
  type: Input
1219
1512
  }], conversation: [{
1220
1513
  type: Input
@@ -1244,6 +1537,8 @@ export class MessageItemComponent extends BaseAngularComponent {
1244
1537
  type: Output
1245
1538
  }], retryClicked: [{
1246
1539
  type: Output
1540
+ }], testFeedbackClicked: [{
1541
+ type: Output
1247
1542
  }], artifactClicked: [{
1248
1543
  type: Output
1249
1544
  }], artifactActionPerformed: [{
@@ -1255,5 +1550,5 @@ export class MessageItemComponent extends BaseAngularComponent {
1255
1550
  }], suggestedResponseSelected: [{
1256
1551
  type: Output
1257
1552
  }] }); })();
1258
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageItemComponent, { className: "MessageItemComponent", filePath: "src/lib/components/message/message-item.component.ts", lineNumber: 36 }); })();
1553
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageItemComponent, { className: "MessageItemComponent", filePath: "src/lib/components/message/message-item.component.ts", lineNumber: 38 }); })();
1259
1554
  //# sourceMappingURL=message-item.component.js.map