@memberjunction/ng-conversations 5.37.0 → 5.39.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +47 -0
- package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -0
- package/dist/lib/components/conversation/conversation-agent-picker.component.js +253 -0
- package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +148 -11
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +498 -261
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +2 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +6 -3
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-mode-picker.component.d.ts +57 -0
- package/dist/lib/components/conversation/conversation-mode-picker.component.d.ts.map +1 -0
- package/dist/lib/components/conversation/conversation-mode-picker.component.js +252 -0
- package/dist/lib/components/conversation/conversation-mode-picker.component.js.map +1 -0
- package/dist/lib/components/message/message-input.component.d.ts +51 -3
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +107 -18
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +0 -13
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +124 -150
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +15 -0
- package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +123 -46
- package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -0
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +13 -3
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +59 -58
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +8 -4
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/models/conversation-state.model.d.ts +0 -27
- package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
- package/dist/lib/models/conversation-state.model.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +1 -9
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +22 -121
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +5 -26
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/services/conversation-bridge.service.d.ts +13 -0
- package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-bridge.service.js +15 -0
- package/dist/lib/services/conversation-bridge.service.js.map +1 -1
- package/package.json +23 -22
- package/dist/lib/components/message/suggested-responses.component.d.ts +0 -55
- package/dist/lib/components/message/suggested-responses.component.d.ts.map +0 -1
- package/dist/lib/components/message/suggested-responses.component.js +0 -207
- package/dist/lib/components/message/suggested-responses.component.js.map +0 -1
|
@@ -32,12 +32,14 @@ import * as i17 from "../artifact/artifact-share-modal.component";
|
|
|
32
32
|
import * as i18 from "../message/message-list.component";
|
|
33
33
|
import * as i19 from "../message/message-input.component";
|
|
34
34
|
import * as i20 from "./conversation-empty-state.component";
|
|
35
|
-
import * as i21 from "
|
|
36
|
-
import * as i22 from "
|
|
37
|
-
import * as i23 from "../
|
|
38
|
-
import * as i24 from "../
|
|
39
|
-
import * as i25 from "../
|
|
40
|
-
import * as i26 from "
|
|
35
|
+
import * as i21 from "./conversation-agent-picker.component";
|
|
36
|
+
import * as i22 from "./conversation-mode-picker.component";
|
|
37
|
+
import * as i23 from "../thread/thread-panel.component";
|
|
38
|
+
import * as i24 from "../project/project-selector.component";
|
|
39
|
+
import * as i25 from "../members/members-modal.component";
|
|
40
|
+
import * as i26 from "../export/export-modal.component";
|
|
41
|
+
import * as i27 from "../attachment/image-viewer.component";
|
|
42
|
+
import * as i28 from "./pinned-messages-panel.component";
|
|
41
43
|
const _c0 = ["scrollContainer"];
|
|
42
44
|
const _c1 = ["messageInput"];
|
|
43
45
|
const _c2 = () => [];
|
|
@@ -46,14 +48,23 @@ const _forTrack1 = ($index, $item) => $item.artifactId;
|
|
|
46
48
|
const _forTrack2 = ($index, $item) => $item.versionId;
|
|
47
49
|
function ConversationChatAreaComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
48
50
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
49
|
-
i0.ɵɵelementStart(0, "button",
|
|
51
|
+
i0.ɵɵelementStart(0, "button", 33);
|
|
50
52
|
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.sidebarToggleClicked.emit()); });
|
|
51
|
-
i0.ɵɵelement(1, "i",
|
|
53
|
+
i0.ɵɵelement(1, "i", 34);
|
|
52
54
|
i0.ɵɵelementEnd();
|
|
53
55
|
} }
|
|
54
|
-
function
|
|
56
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
57
|
+
i0.ɵɵelementStart(0, "div", 21);
|
|
58
|
+
i0.ɵɵtext(1);
|
|
59
|
+
i0.ɵɵelementEnd();
|
|
60
|
+
} if (rf & 2) {
|
|
61
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
62
|
+
i0.ɵɵadvance();
|
|
63
|
+
i0.ɵɵtextInterpolate(ctx_r1.conversation.Name || "");
|
|
64
|
+
} }
|
|
65
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
55
66
|
i0.ɵɵelementStart(0, "span", 22);
|
|
56
|
-
i0.ɵɵelement(1, "i",
|
|
67
|
+
i0.ɵɵelement(1, "i", 35);
|
|
57
68
|
i0.ɵɵelementStart(2, "span");
|
|
58
69
|
i0.ɵɵtext(3);
|
|
59
70
|
i0.ɵɵelementEnd()();
|
|
@@ -63,11 +74,11 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_5_Template(rf,
|
|
|
63
74
|
i0.ɵɵadvance(3);
|
|
64
75
|
i0.ɵɵtextInterpolate1("Shared by ", ctx_r1.sharedByBadge.display);
|
|
65
76
|
} }
|
|
66
|
-
function
|
|
77
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
67
78
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
68
|
-
i0.ɵɵelementStart(0, "button",
|
|
69
|
-
i0.ɵɵlistener("click", function
|
|
70
|
-
i0.ɵɵelement(1, "i",
|
|
79
|
+
i0.ɵɵelementStart(0, "button", 36);
|
|
80
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_5_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openProjectSelector()); });
|
|
81
|
+
i0.ɵɵelement(1, "i", 37);
|
|
71
82
|
i0.ɵɵelementStart(2, "span");
|
|
72
83
|
i0.ɵɵtext(3);
|
|
73
84
|
i0.ɵɵelementEnd()();
|
|
@@ -76,21 +87,21 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template(rf,
|
|
|
76
87
|
i0.ɵɵadvance(3);
|
|
77
88
|
i0.ɵɵtextInterpolate(ctx_r1.conversation.Project || "Project");
|
|
78
89
|
} }
|
|
79
|
-
function
|
|
90
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
80
91
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
81
|
-
i0.ɵɵelementStart(0, "button",
|
|
82
|
-
i0.ɵɵlistener("click", function
|
|
83
|
-
i0.ɵɵelement(1, "i",
|
|
92
|
+
i0.ɵɵelementStart(0, "button", 38);
|
|
93
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.viewTestRun(ctx_r1.conversation.TestRunID)); });
|
|
94
|
+
i0.ɵɵelement(1, "i", 39);
|
|
84
95
|
i0.ɵɵelementStart(2, "span");
|
|
85
96
|
i0.ɵɵtext(3, "Test");
|
|
86
97
|
i0.ɵɵelementEnd()();
|
|
87
98
|
} }
|
|
88
|
-
function
|
|
99
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
89
100
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
90
|
-
i0.ɵɵelementStart(0, "button",
|
|
91
|
-
i0.ɵɵlistener("click", function
|
|
92
|
-
i0.ɵɵelement(1, "i",
|
|
93
|
-
i0.ɵɵelementStart(2, "span",
|
|
101
|
+
i0.ɵɵelementStart(0, "button", 40);
|
|
102
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_8_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showPinsPanel = !ctx_r1.showPinsPanel); });
|
|
103
|
+
i0.ɵɵelement(1, "i", 41);
|
|
104
|
+
i0.ɵɵelementStart(2, "span", 42);
|
|
94
105
|
i0.ɵɵtext(3);
|
|
95
106
|
i0.ɵɵelementEnd()();
|
|
96
107
|
} if (rf & 2) {
|
|
@@ -99,12 +110,12 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template(rf,
|
|
|
99
110
|
i0.ɵɵadvance(3);
|
|
100
111
|
i0.ɵɵtextInterpolate(ctx_r1.pinnedMessages.length);
|
|
101
112
|
} }
|
|
102
|
-
function
|
|
113
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
103
114
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
104
|
-
i0.ɵɵelementStart(0, "button",
|
|
105
|
-
i0.ɵɵlistener("click", function
|
|
106
|
-
i0.ɵɵelement(1, "i",
|
|
107
|
-
i0.ɵɵelementStart(2, "span",
|
|
115
|
+
i0.ɵɵelementStart(0, "button", 43);
|
|
116
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.viewArtifacts()); });
|
|
117
|
+
i0.ɵɵelement(1, "i", 44);
|
|
118
|
+
i0.ɵɵelementStart(2, "span", 45);
|
|
108
119
|
i0.ɵɵtext(3);
|
|
109
120
|
i0.ɵɵelementEnd()();
|
|
110
121
|
} if (rf & 2) {
|
|
@@ -112,12 +123,12 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template(rf,
|
|
|
112
123
|
i0.ɵɵadvance(3);
|
|
113
124
|
i0.ɵɵtextInterpolate(ctx_r1.artifactCountDisplay);
|
|
114
125
|
} }
|
|
115
|
-
function
|
|
126
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
116
127
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
117
|
-
i0.ɵɵelementStart(0, "button",
|
|
118
|
-
i0.ɵɵlistener("click", function
|
|
119
|
-
i0.ɵɵelement(1, "i",
|
|
120
|
-
i0.ɵɵelementStart(2, "span",
|
|
128
|
+
i0.ɵɵelementStart(0, "button", 46);
|
|
129
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleMembersModal()); });
|
|
130
|
+
i0.ɵɵelement(1, "i", 47);
|
|
131
|
+
i0.ɵɵelementStart(2, "span", 48);
|
|
121
132
|
i0.ɵɵtext(3);
|
|
122
133
|
i0.ɵɵelementEnd()();
|
|
123
134
|
} if (rf & 2) {
|
|
@@ -125,21 +136,36 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template(rf,
|
|
|
125
136
|
i0.ɵɵadvance(3);
|
|
126
137
|
i0.ɵɵtextInterpolate(ctx_r1.memberCount);
|
|
127
138
|
} }
|
|
128
|
-
function
|
|
139
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
129
140
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
130
|
-
i0.ɵɵelementStart(0, "
|
|
131
|
-
i0.ɵɵlistener("
|
|
132
|
-
i0.ɵɵ
|
|
133
|
-
|
|
134
|
-
i0.ɵɵ
|
|
135
|
-
i0.ɵɵ
|
|
141
|
+
i0.ɵɵelementStart(0, "mj-conversation-mode-picker", 49);
|
|
142
|
+
i0.ɵɵlistener("PresetChanged", function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template_mj_conversation_mode_picker_PresetChanged_0_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnAgentModePresetChanged($event)); });
|
|
143
|
+
i0.ɵɵelementEnd();
|
|
144
|
+
} if (rf & 2) {
|
|
145
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
146
|
+
i0.ɵɵproperty("AgentID", ctx_r1.ModePickerTargetAgentId)("Disabled", ctx_r1.isProcessing);
|
|
147
|
+
} }
|
|
148
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
149
|
+
i0.ɵɵelement(0, "mj-conversation-agent-picker", 30);
|
|
150
|
+
} if (rf & 2) {
|
|
151
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
152
|
+
i0.ɵɵproperty("Conversation", ctx_r1.conversation)("CurrentUser", ctx_r1.currentUser)("Disabled", ctx_r1.isReadOnlyView);
|
|
136
153
|
} }
|
|
137
154
|
function ConversationChatAreaComponent_Conditional_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
138
155
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
139
156
|
i0.ɵɵelementStart(0, "button", 50);
|
|
140
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.
|
|
141
|
-
i0.ɵɵelement(1, "i",
|
|
142
|
-
i0.ɵɵelementStart(2, "span",
|
|
157
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_13_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.exportConversation()); });
|
|
158
|
+
i0.ɵɵelement(1, "i", 51);
|
|
159
|
+
i0.ɵɵelementStart(2, "span", 52);
|
|
160
|
+
i0.ɵɵtext(3, "Export");
|
|
161
|
+
i0.ɵɵelementEnd()();
|
|
162
|
+
} }
|
|
163
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
164
|
+
const _r10 = i0.ɵɵgetCurrentView();
|
|
165
|
+
i0.ɵɵelementStart(0, "button", 53);
|
|
166
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.shareConversation()); });
|
|
167
|
+
i0.ɵɵelement(1, "i", 35);
|
|
168
|
+
i0.ɵɵelementStart(2, "span", 52);
|
|
143
169
|
i0.ɵɵtext(3, "Share");
|
|
144
170
|
i0.ɵɵelementEnd()();
|
|
145
171
|
} if (rf & 2) {
|
|
@@ -150,19 +176,19 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_13_Template(rf,
|
|
|
150
176
|
function ConversationChatAreaComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
151
177
|
i0.ɵɵelementStart(0, "div", 3)(1, "div", 19);
|
|
152
178
|
i0.ɵɵconditionalCreate(2, ConversationChatAreaComponent_Conditional_1_Conditional_2_Template, 2, 0, "button", 20);
|
|
153
|
-
i0.ɵɵ
|
|
154
|
-
i0.ɵɵ
|
|
179
|
+
i0.ɵɵconditionalCreate(3, ConversationChatAreaComponent_Conditional_1_Conditional_3_Template, 2, 1, "div", 21);
|
|
180
|
+
i0.ɵɵconditionalCreate(4, ConversationChatAreaComponent_Conditional_1_Conditional_4_Template, 4, 2, "span", 22);
|
|
181
|
+
i0.ɵɵconditionalCreate(5, ConversationChatAreaComponent_Conditional_1_Conditional_5_Template, 4, 1, "button", 23);
|
|
182
|
+
i0.ɵɵconditionalCreate(6, ConversationChatAreaComponent_Conditional_1_Conditional_6_Template, 4, 0, "button", 24);
|
|
155
183
|
i0.ɵɵelementEnd();
|
|
156
|
-
i0.ɵɵ
|
|
157
|
-
i0.ɵɵconditionalCreate(
|
|
158
|
-
i0.ɵɵconditionalCreate(
|
|
159
|
-
i0.ɵɵ
|
|
160
|
-
i0.ɵɵ
|
|
161
|
-
i0.ɵɵconditionalCreate(
|
|
162
|
-
i0.ɵɵconditionalCreate(
|
|
163
|
-
i0.ɵɵconditionalCreate(
|
|
164
|
-
i0.ɵɵconditionalCreate(12, ConversationChatAreaComponent_Conditional_1_Conditional_12_Template, 4, 0, "button", 29);
|
|
165
|
-
i0.ɵɵconditionalCreate(13, ConversationChatAreaComponent_Conditional_1_Conditional_13_Template, 4, 3, "button", 30);
|
|
184
|
+
i0.ɵɵelementStart(7, "div", 25);
|
|
185
|
+
i0.ɵɵconditionalCreate(8, ConversationChatAreaComponent_Conditional_1_Conditional_8_Template, 4, 3, "button", 26);
|
|
186
|
+
i0.ɵɵconditionalCreate(9, ConversationChatAreaComponent_Conditional_1_Conditional_9_Template, 4, 1, "button", 27);
|
|
187
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_1_Conditional_10_Template, 4, 1, "button", 28);
|
|
188
|
+
i0.ɵɵconditionalCreate(11, ConversationChatAreaComponent_Conditional_1_Conditional_11_Template, 1, 2, "mj-conversation-mode-picker", 29);
|
|
189
|
+
i0.ɵɵconditionalCreate(12, ConversationChatAreaComponent_Conditional_1_Conditional_12_Template, 1, 3, "mj-conversation-agent-picker", 30);
|
|
190
|
+
i0.ɵɵconditionalCreate(13, ConversationChatAreaComponent_Conditional_1_Conditional_13_Template, 4, 0, "button", 31);
|
|
191
|
+
i0.ɵɵconditionalCreate(14, ConversationChatAreaComponent_Conditional_1_Conditional_14_Template, 4, 3, "button", 32);
|
|
166
192
|
i0.ɵɵelementEnd()();
|
|
167
193
|
} if (rf & 2) {
|
|
168
194
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -170,81 +196,97 @@ function ConversationChatAreaComponent_Conditional_1_Template(rf, ctx) { if (rf
|
|
|
170
196
|
i0.ɵɵclassProp("with-sidebar-toggle", ctx_r1.showSidebarToggle);
|
|
171
197
|
i0.ɵɵadvance();
|
|
172
198
|
i0.ɵɵconditional(ctx_r1.showSidebarToggle ? 2 : -1);
|
|
173
|
-
i0.ɵɵadvance(2);
|
|
174
|
-
i0.ɵɵtextInterpolate(ctx_r1.conversation.Name || "");
|
|
175
199
|
i0.ɵɵadvance();
|
|
176
|
-
i0.ɵɵconditional(ctx_r1.
|
|
200
|
+
i0.ɵɵconditional(ctx_r1.conversation ? 3 : -1);
|
|
201
|
+
i0.ɵɵadvance();
|
|
202
|
+
i0.ɵɵconditional(ctx_r1.sharedByBadge ? 4 : -1);
|
|
177
203
|
i0.ɵɵadvance();
|
|
178
|
-
i0.ɵɵconditional(ctx_r1.conversation.ProjectID ?
|
|
204
|
+
i0.ɵɵconditional((ctx_r1.conversation == null ? null : ctx_r1.conversation.ProjectID) ? 5 : -1);
|
|
179
205
|
i0.ɵɵadvance();
|
|
180
|
-
i0.ɵɵconditional(ctx_r1.conversation.TestRunID ?
|
|
206
|
+
i0.ɵɵconditional((ctx_r1.conversation == null ? null : ctx_r1.conversation.TestRunID) ? 6 : -1);
|
|
181
207
|
i0.ɵɵadvance(2);
|
|
182
|
-
i0.ɵɵconditional(ctx_r1.pinnedMessages.length > 0 ?
|
|
208
|
+
i0.ɵɵconditional(ctx_r1.pinnedMessages.length > 0 ? 8 : -1);
|
|
183
209
|
i0.ɵɵadvance();
|
|
184
|
-
i0.ɵɵconditional(ctx_r1.showArtifactIndicator && ctx_r1.artifactCountDisplay > 0 ?
|
|
210
|
+
i0.ɵɵconditional(ctx_r1.showArtifactIndicator && ctx_r1.artifactCountDisplay > 0 ? 9 : -1);
|
|
185
211
|
i0.ɵɵadvance();
|
|
186
|
-
i0.ɵɵconditional(ctx_r1.memberCount > 1 ?
|
|
212
|
+
i0.ɵɵconditional(ctx_r1.memberCount > 1 ? 10 : -1);
|
|
187
213
|
i0.ɵɵadvance();
|
|
188
|
-
i0.ɵɵconditional(ctx_r1.
|
|
214
|
+
i0.ɵɵconditional(ctx_r1.showAgentModePicker && ctx_r1.ModePickerTargetAgentId ? 11 : -1);
|
|
189
215
|
i0.ɵɵadvance();
|
|
190
|
-
i0.ɵɵconditional(ctx_r1.
|
|
216
|
+
i0.ɵɵconditional(ctx_r1.showAgentPicker && ctx_r1.conversation ? 12 : -1);
|
|
217
|
+
i0.ɵɵadvance();
|
|
218
|
+
i0.ɵɵconditional(ctx_r1.showExportButton ? 13 : -1);
|
|
219
|
+
i0.ɵɵadvance();
|
|
220
|
+
i0.ɵɵconditional(ctx_r1.showShareButton && ctx_r1.canShareConversation ? 14 : -1);
|
|
191
221
|
} }
|
|
192
222
|
function ConversationChatAreaComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
193
223
|
i0.ɵɵelementStart(0, "div", 6);
|
|
194
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
224
|
+
i0.ɵɵelement(1, "mj-loading", 54);
|
|
195
225
|
i0.ɵɵelementEnd();
|
|
196
226
|
} }
|
|
197
227
|
function ConversationChatAreaComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
198
|
-
const
|
|
199
|
-
i0.ɵɵelementStart(0, "mj-conversation-empty-state",
|
|
200
|
-
i0.ɵɵlistener("sidebarToggleClicked", function ConversationChatAreaComponent_Conditional_5_Template_mj_conversation_empty_state_sidebarToggleClicked_0_listener() { i0.ɵɵrestoreView(
|
|
228
|
+
const _r11 = i0.ɵɵgetCurrentView();
|
|
229
|
+
i0.ɵɵelementStart(0, "mj-conversation-empty-state", 55);
|
|
230
|
+
i0.ɵɵlistener("sidebarToggleClicked", function ConversationChatAreaComponent_Conditional_5_Template_mj_conversation_empty_state_sidebarToggleClicked_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.sidebarToggleClicked.emit()); })("messageSent", function ConversationChatAreaComponent_Conditional_5_Template_mj_conversation_empty_state_messageSent_0_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onEmptyStateMessageSent($event)); });
|
|
201
231
|
i0.ɵɵelementEnd();
|
|
202
232
|
} if (rf & 2) {
|
|
203
233
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
204
|
-
i0.ɵɵproperty("currentUser", ctx_r1.currentUser)("disabled", ctx_r1.isProcessing)("showSidebarToggle", ctx_r1.showSidebarToggle)("overlayMode", ctx_r1.overlayMode)("greeting", ctx_r1.emptyStateGreeting)("enableAttachments", ctx_r1.enableAttachments)("maxAttachments", ctx_r1.maxAttachments)("maxAttachmentSizeBytes", ctx_r1.maxAttachmentSizeBytes)("acceptedFileTypes", ctx_r1.acceptedFileTypes);
|
|
234
|
+
i0.ɵɵproperty("currentUser", ctx_r1.currentUser)("disabled", ctx_r1.isProcessing)("showSidebarToggle", ctx_r1.showSidebarToggle)("overlayMode", ctx_r1.overlayMode)("greeting", ctx_r1.emptyStateGreeting)("enableAttachments", ctx_r1.enableAttachments && ctx_r1.allowAttachments)("enableMentions", ctx_r1.allowMentions)("maxAttachments", ctx_r1.maxAttachments)("maxAttachmentSizeBytes", ctx_r1.maxAttachmentSizeBytes)("acceptedFileTypes", ctx_r1.acceptedFileTypes);
|
|
205
235
|
} }
|
|
206
|
-
function
|
|
207
|
-
i0.ɵɵ
|
|
208
|
-
i0.ɵɵ
|
|
236
|
+
function ConversationChatAreaComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
237
|
+
const _r12 = i0.ɵɵgetCurrentView();
|
|
238
|
+
i0.ɵɵelementStart(0, "div", 8);
|
|
239
|
+
i0.ɵɵelement(1, "div", 56);
|
|
240
|
+
i0.ɵɵelementStart(2, "div", 57)(3, "div", 58)(4, "mj-message-input", 59);
|
|
241
|
+
i0.ɵɵlistener("emptyStateSubmit", function ConversationChatAreaComponent_Conditional_6_Template_mj_message_input_emptyStateSubmit_4_listener($event) { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onEmptyStateMessageSent($event)); });
|
|
242
|
+
i0.ɵɵelementEnd()()()();
|
|
243
|
+
} if (rf & 2) {
|
|
244
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
245
|
+
i0.ɵɵadvance(4);
|
|
246
|
+
i0.ɵɵproperty("emptyStateMode", true)("currentUser", ctx_r1.currentUser)("disabled", ctx_r1.isProcessing)("enableAttachments", ctx_r1.enableAttachments && ctx_r1.allowAttachments)("enableMentions", ctx_r1.allowMentions)("maxAttachments", ctx_r1.maxAttachments)("maxAttachmentSizeBytes", ctx_r1.maxAttachmentSizeBytes)("acceptedFileTypes", ctx_r1.acceptedFileTypes);
|
|
247
|
+
} }
|
|
248
|
+
function ConversationChatAreaComponent_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
249
|
+
i0.ɵɵelementStart(0, "div", 60);
|
|
250
|
+
i0.ɵɵelement(1, "mj-loading", 65);
|
|
209
251
|
i0.ɵɵelementEnd();
|
|
210
252
|
} if (rf & 2) {
|
|
211
253
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
212
254
|
i0.ɵɵadvance();
|
|
213
255
|
i0.ɵɵproperty("text", ctx_r1.uploadingMessage);
|
|
214
256
|
} }
|
|
215
|
-
function
|
|
216
|
-
const
|
|
217
|
-
i0.ɵɵelementStart(0, "span",
|
|
218
|
-
i0.ɵɵlistener("click", function
|
|
219
|
-
i0.ɵɵelement(1, "i",
|
|
257
|
+
function ConversationChatAreaComponent_Conditional_7_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
258
|
+
const _r14 = i0.ɵɵgetCurrentView();
|
|
259
|
+
i0.ɵɵelementStart(0, "span", 66);
|
|
260
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_7_Conditional_5_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scrollToBottomAnimate()); });
|
|
261
|
+
i0.ɵɵelement(1, "i", 67);
|
|
220
262
|
i0.ɵɵelementEnd();
|
|
221
263
|
} }
|
|
222
|
-
function
|
|
223
|
-
i0.ɵɵelementStart(0, "div",
|
|
224
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
264
|
+
function ConversationChatAreaComponent_Conditional_7_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
265
|
+
i0.ɵɵelementStart(0, "div", 64);
|
|
266
|
+
i0.ɵɵelement(1, "mj-loading", 68);
|
|
225
267
|
i0.ɵɵelementEnd();
|
|
226
268
|
} }
|
|
227
|
-
function
|
|
228
|
-
i0.ɵɵelementStart(0, "div",
|
|
229
|
-
i0.ɵɵelement(1, "i",
|
|
269
|
+
function ConversationChatAreaComponent_Conditional_7_Conditional_8_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
270
|
+
i0.ɵɵelementStart(0, "div", 69);
|
|
271
|
+
i0.ɵɵelement(1, "i", 71);
|
|
230
272
|
i0.ɵɵelementStart(2, "span");
|
|
231
273
|
i0.ɵɵtext(3, "You have view-only access to this conversation.");
|
|
232
274
|
i0.ɵɵelementEnd()();
|
|
233
275
|
} }
|
|
234
|
-
function
|
|
235
|
-
const
|
|
236
|
-
i0.ɵɵelementStart(0, "mj-message-input",
|
|
237
|
-
i0.ɵɵlistener("messageSent", function
|
|
276
|
+
function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
277
|
+
const _r15 = i0.ɵɵgetCurrentView();
|
|
278
|
+
i0.ɵɵelementStart(0, "mj-message-input", 72, 1);
|
|
279
|
+
i0.ɵɵlistener("messageSent", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_messageSent_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onMessageSent($event)); })("agentResponse", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_agentResponse_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onAgentResponse($event)); })("agentRunDetected", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_agentRunDetected_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onAgentRunDetected($event)); })("agentRunUpdate", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_agentRunUpdate_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onAgentRunUpdate($event)); })("messageComplete", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_messageComplete_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onMessageComplete($event)); })("artifactCreated", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_artifactCreated_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onArtifactCreated($event)); })("conversationRenamed", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_conversationRenamed_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("intentCheckStarted", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_intentCheckStarted_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onIntentCheckStarted()); })("intentCheckCompleted", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_intentCheckCompleted_0_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onIntentCheckCompleted()); })("uploadStateChanged", function ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template_mj_message_input_uploadStateChanged_0_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onUploadStateChanged($event)); });
|
|
238
280
|
i0.ɵɵelementEnd();
|
|
239
281
|
} if (rf & 2) {
|
|
240
|
-
const
|
|
282
|
+
const inputRef_r16 = ctx.$implicit;
|
|
241
283
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
242
|
-
i0.ɵɵproperty("hidden",
|
|
284
|
+
i0.ɵɵproperty("hidden", inputRef_r16.conversationId !== ctx_r1.conversationId)("conversationId", inputRef_r16.conversationId)("conversationName", inputRef_r16.conversationName)("currentUser", ctx_r1.currentUser)("conversationHistory", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.messages : i0.ɵɵpureFunction0(21, _c2))("artifactsByDetailId", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.artifactsByDetailId : ctx_r1.emptyArtifactsMap)("systemArtifactsByDetailId", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.systemArtifactsByDetailId : ctx_r1.emptyArtifactsMap)("agentRunsByDetailId", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.agentRunsByDetailId : ctx_r1.emptyAgentRunsMap)("appContext", ctx_r1.appContext)("defaultAgentId", ctx_r1.defaultAgentId)("conversationDefaultAgentId", inputRef_r16.conversationId === ctx_r1.conversationId ? (ctx_r1.conversation == null ? null : ctx_r1.conversation.DefaultAgentID) ?? null : null)("agentConfigurationPresetId", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.ActiveAgentConfigurationPresetId : null)("inProgressMessageIds", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.inProgressMessageIds : ctx_r1.emptyInProgressIds)("disabled", ctx_r1.isProcessing || ctx_r1.isReadOnlyView)("enableAttachments", ctx_r1.enableAttachments && ctx_r1.allowAttachments)("enableMentions", ctx_r1.allowMentions)("maxAttachments", ctx_r1.maxAttachments)("maxAttachmentSizeBytes", ctx_r1.maxAttachmentSizeBytes)("acceptedFileTypes", ctx_r1.acceptedFileTypes)("initialMessage", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.pendingMessage : null)("initialAttachments", inputRef_r16.conversationId === ctx_r1.conversationId ? ctx_r1.pendingAttachments : null);
|
|
243
285
|
} }
|
|
244
|
-
function
|
|
245
|
-
i0.ɵɵconditionalCreate(0,
|
|
246
|
-
i0.ɵɵelementStart(1, "div",
|
|
247
|
-
i0.ɵɵrepeaterCreate(2,
|
|
286
|
+
function ConversationChatAreaComponent_Conditional_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
287
|
+
i0.ɵɵconditionalCreate(0, ConversationChatAreaComponent_Conditional_7_Conditional_8_Conditional_0_Template, 4, 0, "div", 69);
|
|
288
|
+
i0.ɵɵelementStart(1, "div", 58);
|
|
289
|
+
i0.ɵɵrepeaterCreate(2, ConversationChatAreaComponent_Conditional_7_Conditional_8_For_3_Template, 2, 22, "mj-message-input", 70, _forTrack0);
|
|
248
290
|
i0.ɵɵelementEnd();
|
|
249
291
|
} if (rf & 2) {
|
|
250
292
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -252,19 +294,19 @@ function ConversationChatAreaComponent_Conditional_6_Conditional_8_Template(rf,
|
|
|
252
294
|
i0.ɵɵadvance(2);
|
|
253
295
|
i0.ɵɵrepeater(ctx_r1.getCachedInputs());
|
|
254
296
|
} }
|
|
255
|
-
function
|
|
256
|
-
const
|
|
297
|
+
function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
298
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
257
299
|
i0.ɵɵelementStart(0, "div", 8);
|
|
258
|
-
i0.ɵɵconditionalCreate(1,
|
|
259
|
-
i0.ɵɵelementStart(2, "div",
|
|
260
|
-
i0.ɵɵlistener("scroll", function
|
|
261
|
-
i0.ɵɵelementStart(4, "mj-conversation-message-list",
|
|
262
|
-
i0.ɵɵlistener("replyInThread", function
|
|
300
|
+
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_7_Conditional_1_Template, 2, 1, "div", 60);
|
|
301
|
+
i0.ɵɵelementStart(2, "div", 61, 0);
|
|
302
|
+
i0.ɵɵlistener("scroll", function ConversationChatAreaComponent_Conditional_7_Template_div_scroll_2_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.checkScroll()); });
|
|
303
|
+
i0.ɵɵelementStart(4, "mj-conversation-message-list", 62);
|
|
304
|
+
i0.ɵɵlistener("replyInThread", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_replyInThread_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onReplyInThread($event)); })("viewThread", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_viewThread_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewThread($event)); })("deleteMessage", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_deleteMessage_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDeleteMessage($event)); })("retryMessage", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_retryMessage_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRetryMessage($event)); })("testFeedbackMessage", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_testFeedbackMessage_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestFeedbackMessage($event)); })("artifactClicked", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_artifactClicked_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactClicked($event)); })("messageEdited", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_messageEdited_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMessageEdited($event)); })("openEntityRecord", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_openEntityRecord_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("suggestedResponseSelected", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_suggestedResponseSelected_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSuggestedResponseSelected($event)); })("attachmentClicked", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_attachmentClicked_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAttachmentClicked($event)); })("diagnosticRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_diagnosticRequested_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDiagnosticRequested($event)); })("messagePinToggled", function ConversationChatAreaComponent_Conditional_7_Template_mj_conversation_message_list_messagePinToggled_4_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMessagePinToggled($event)); });
|
|
263
305
|
i0.ɵɵelementEnd();
|
|
264
|
-
i0.ɵɵconditionalCreate(5,
|
|
306
|
+
i0.ɵɵconditionalCreate(5, ConversationChatAreaComponent_Conditional_7_Conditional_5_Template, 2, 0, "span", 63);
|
|
265
307
|
i0.ɵɵelementEnd();
|
|
266
308
|
i0.ɵɵelementStart(6, "div", 57);
|
|
267
|
-
i0.ɵɵconditionalCreate(7,
|
|
309
|
+
i0.ɵɵconditionalCreate(7, ConversationChatAreaComponent_Conditional_7_Conditional_7_Template, 2, 0, "div", 64)(8, ConversationChatAreaComponent_Conditional_7_Conditional_8_Template, 4, 1);
|
|
268
310
|
i0.ɵɵelementEnd()();
|
|
269
311
|
} if (rf & 2) {
|
|
270
312
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -277,17 +319,17 @@ function ConversationChatAreaComponent_Conditional_6_Template(rf, ctx) { if (rf
|
|
|
277
319
|
i0.ɵɵadvance(2);
|
|
278
320
|
i0.ɵɵconditional(ctx_r1.isLoadingPeripheralData ? 7 : 8);
|
|
279
321
|
} }
|
|
280
|
-
function
|
|
281
|
-
const
|
|
282
|
-
i0.ɵɵelementStart(0, "div",
|
|
283
|
-
i0.ɵɵlistener("mousedown", function
|
|
322
|
+
function ConversationChatAreaComponent_Conditional_8_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
323
|
+
const _r18 = i0.ɵɵgetCurrentView();
|
|
324
|
+
i0.ɵɵelementStart(0, "div", 76);
|
|
325
|
+
i0.ɵɵlistener("mousedown", function ConversationChatAreaComponent_Conditional_8_Conditional_0_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onResizeStart($event)); })("touchstart", function ConversationChatAreaComponent_Conditional_8_Conditional_0_Template_div_touchstart_0_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onResizeTouchStart($event)); });
|
|
284
326
|
i0.ɵɵelementEnd();
|
|
285
327
|
} }
|
|
286
|
-
function
|
|
287
|
-
const
|
|
288
|
-
i0.ɵɵconditionalCreate(0,
|
|
289
|
-
i0.ɵɵelementStart(1, "div",
|
|
290
|
-
i0.ɵɵlistener("closed", function
|
|
328
|
+
function ConversationChatAreaComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
329
|
+
const _r17 = i0.ɵɵgetCurrentView();
|
|
330
|
+
i0.ɵɵconditionalCreate(0, ConversationChatAreaComponent_Conditional_8_Conditional_0_Template, 1, 0, "div", 73);
|
|
331
|
+
i0.ɵɵelementStart(1, "div", 74)(2, "mj-artifact-viewer-panel", 75);
|
|
332
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_closed_2_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCloseArtifactPanel()); })("saveToCollectionRequested", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_saveToCollectionRequested_2_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveToCollectionRequested($event)); })("navigateToLink", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_navigateToLink_2_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("shareRequested", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_shareRequested_2_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactShareRequested($event)); })("maximizeToggled", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_maximizeToggled_2_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleMaximizeArtifactPane()); })("openEntityRecord", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_openEntityRecord_2_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("navigationRequest", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_navigationRequest_2_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavigationRequest($event)); })("analyzeRequested", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_analyzeRequested_2_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAnalyzeArtifact($event)); })("applyFormRequested", function ConversationChatAreaComponent_Conditional_8_Template_mj_artifact_viewer_panel_applyFormRequested_2_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnApplyFormRequested($event)); });
|
|
291
333
|
i0.ɵɵelementEnd()();
|
|
292
334
|
} if (rf & 2) {
|
|
293
335
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -298,50 +340,50 @@ function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf
|
|
|
298
340
|
i0.ɵɵadvance();
|
|
299
341
|
i0.ɵɵproperty("artifactId", ctx_r1.selectedArtifactId)("currentUser", ctx_r1.currentUser)("environmentId", ctx_r1.environmentId)("versionNumber", ctx_r1.selectedVersionNumber)("viewContext", "conversation")("canShare", ctx_r1.canShareSelectedArtifact)("canEdit", ctx_r1.canEditSelectedArtifact)("isMaximized", ctx_r1.isArtifactPaneMaximized)("refreshTrigger", ctx_r1.artifactViewerRefresh$);
|
|
300
342
|
} }
|
|
301
|
-
function
|
|
302
|
-
const
|
|
303
|
-
i0.ɵɵelementStart(0, "mj-pinned-messages-panel",
|
|
304
|
-
i0.ɵɵlistener("closed", function
|
|
343
|
+
function ConversationChatAreaComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
344
|
+
const _r19 = i0.ɵɵgetCurrentView();
|
|
345
|
+
i0.ɵɵelementStart(0, "mj-pinned-messages-panel", 77);
|
|
346
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_10_Template_mj_pinned_messages_panel_closed_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showPinsPanel = false); })("jumpRequested", function ConversationChatAreaComponent_Conditional_10_Template_mj_pinned_messages_panel_jumpRequested_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onJumpToMessage($event)); })("unpinRequested", function ConversationChatAreaComponent_Conditional_10_Template_mj_pinned_messages_panel_unpinRequested_0_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onUnpinFromPanel($event)); });
|
|
305
347
|
i0.ɵɵelementEnd();
|
|
306
348
|
} if (rf & 2) {
|
|
307
349
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
308
350
|
i0.ɵɵproperty("pinnedMessages", ctx_r1.pinnedMessages);
|
|
309
351
|
} }
|
|
310
|
-
function
|
|
311
|
-
const
|
|
312
|
-
i0.ɵɵelementStart(0, "mj-thread-panel",
|
|
313
|
-
i0.ɵɵlistener("closed", function
|
|
352
|
+
function ConversationChatAreaComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
353
|
+
const _r20 = i0.ɵɵgetCurrentView();
|
|
354
|
+
i0.ɵɵelementStart(0, "mj-thread-panel", 78);
|
|
355
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_11_Template_mj_thread_panel_closed_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLocalThreadClosed()); })("replyAdded", function ConversationChatAreaComponent_Conditional_11_Template_mj_thread_panel_replyAdded_0_listener($event) { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onThreadReplyAdded($event)); });
|
|
314
356
|
i0.ɵɵelementEnd();
|
|
315
357
|
} if (rf & 2) {
|
|
316
358
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
317
359
|
i0.ɵɵproperty("parentMessageId", ctx_r1.threadId)("conversationId", ctx_r1.conversationId || "")("currentUser", ctx_r1.currentUser);
|
|
318
360
|
} }
|
|
319
|
-
function
|
|
320
|
-
const
|
|
321
|
-
i0.ɵɵelementStart(0, "div",
|
|
322
|
-
i0.ɵɵlistener("click", function
|
|
323
|
-
i0.ɵɵelementStart(1, "div",
|
|
324
|
-
i0.ɵɵlistener("click", function
|
|
325
|
-
i0.ɵɵelementStart(2, "div",
|
|
361
|
+
function ConversationChatAreaComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
362
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
363
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
364
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showProjectSelector = false); });
|
|
365
|
+
i0.ɵɵelementStart(1, "div", 80);
|
|
366
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r21); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
367
|
+
i0.ɵɵelementStart(2, "div", 81)(3, "h3");
|
|
326
368
|
i0.ɵɵtext(4, "Assign Project");
|
|
327
369
|
i0.ɵɵelementEnd();
|
|
328
|
-
i0.ɵɵelementStart(5, "button",
|
|
329
|
-
i0.ɵɵlistener("click", function
|
|
330
|
-
i0.ɵɵelement(6, "i",
|
|
370
|
+
i0.ɵɵelementStart(5, "button", 82);
|
|
371
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showProjectSelector = false); });
|
|
372
|
+
i0.ɵɵelement(6, "i", 83);
|
|
331
373
|
i0.ɵɵelementEnd()();
|
|
332
|
-
i0.ɵɵelementStart(7, "div",
|
|
333
|
-
i0.ɵɵlistener("projectSelected", function
|
|
374
|
+
i0.ɵɵelementStart(7, "div", 84)(8, "mj-project-selector", 85);
|
|
375
|
+
i0.ɵɵlistener("projectSelected", function ConversationChatAreaComponent_Conditional_15_Template_mj_project_selector_projectSelected_8_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onProjectSelected($event)); });
|
|
334
376
|
i0.ɵɵelementEnd()()()();
|
|
335
377
|
} if (rf & 2) {
|
|
336
378
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
337
379
|
i0.ɵɵadvance(8);
|
|
338
380
|
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedProjectId", ctx_r1.conversation.ProjectID);
|
|
339
381
|
} }
|
|
340
|
-
function
|
|
341
|
-
const
|
|
342
|
-
i0.ɵɵelementStart(0, "button",
|
|
343
|
-
i0.ɵɵlistener("click", function
|
|
344
|
-
i0.ɵɵelement(1, "i",
|
|
382
|
+
function ConversationChatAreaComponent_Conditional_16_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
383
|
+
const _r23 = i0.ɵɵgetCurrentView();
|
|
384
|
+
i0.ɵɵelementStart(0, "button", 92);
|
|
385
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r23); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleSystemArtifacts()); });
|
|
386
|
+
i0.ɵɵelement(1, "i", 93);
|
|
345
387
|
i0.ɵɵelementStart(2, "span");
|
|
346
388
|
i0.ɵɵtext(3);
|
|
347
389
|
i0.ɵɵelementEnd()();
|
|
@@ -351,110 +393,110 @@ function ConversationChatAreaComponent_Conditional_15_Conditional_6_Template(rf,
|
|
|
351
393
|
i0.ɵɵadvance(3);
|
|
352
394
|
i0.ɵɵtextInterpolate1("", ctx_r1.showSystemArtifacts ? "Hide" : "Show", " System");
|
|
353
395
|
} }
|
|
354
|
-
function
|
|
355
|
-
i0.ɵɵelementStart(0, "div",
|
|
356
|
-
i0.ɵɵelement(1, "i",
|
|
357
|
-
i0.ɵɵelementStart(2, "p",
|
|
396
|
+
function ConversationChatAreaComponent_Conditional_16_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
397
|
+
i0.ɵɵelementStart(0, "div", 90);
|
|
398
|
+
i0.ɵɵelement(1, "i", 94);
|
|
399
|
+
i0.ɵɵelementStart(2, "p", 95);
|
|
358
400
|
i0.ɵɵtext(3, "No artifacts in this conversation yet");
|
|
359
401
|
i0.ɵɵelementEnd()();
|
|
360
402
|
} }
|
|
361
|
-
function
|
|
403
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
362
404
|
i0.ɵɵtext(0);
|
|
363
405
|
} if (rf & 2) {
|
|
364
|
-
const
|
|
365
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
406
|
+
const artifact_r25 = i0.ɵɵnextContext().$implicit;
|
|
407
|
+
i0.ɵɵtextInterpolate1(" ", artifact_r25.versionCount, " versions ");
|
|
366
408
|
} }
|
|
367
|
-
function
|
|
409
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
368
410
|
i0.ɵɵtext(0, " 1 version ");
|
|
369
411
|
} }
|
|
370
|
-
function
|
|
371
|
-
const
|
|
372
|
-
i0.ɵɵelementStart(0, "button",
|
|
373
|
-
i0.ɵɵlistener("click", function
|
|
374
|
-
i0.ɵɵelement(1, "i",
|
|
412
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
413
|
+
const _r26 = i0.ɵɵgetCurrentView();
|
|
414
|
+
i0.ɵɵelementStart(0, "button", 107);
|
|
415
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_10_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r26); const artifact_r25 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleArtifactExpansion(artifact_r25.artifactId, $event)); });
|
|
416
|
+
i0.ɵɵelement(1, "i", 108);
|
|
375
417
|
i0.ɵɵelementEnd();
|
|
376
418
|
} if (rf & 2) {
|
|
377
|
-
const
|
|
419
|
+
const artifact_r25 = i0.ɵɵnextContext().$implicit;
|
|
378
420
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
379
421
|
i0.ɵɵadvance();
|
|
380
|
-
i0.ɵɵclassProp("fa-chevron-down", ctx_r1.expandedArtifactId !==
|
|
422
|
+
i0.ɵɵclassProp("fa-chevron-down", ctx_r1.expandedArtifactId !== artifact_r25.artifactId)("fa-chevron-up", ctx_r1.expandedArtifactId === artifact_r25.artifactId);
|
|
381
423
|
} }
|
|
382
|
-
function
|
|
383
|
-
const
|
|
384
|
-
i0.ɵɵelementStart(0, "div",
|
|
385
|
-
i0.ɵɵlistener("click", function
|
|
386
|
-
i0.ɵɵelementStart(1, "span",
|
|
424
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
425
|
+
const _r27 = i0.ɵɵgetCurrentView();
|
|
426
|
+
i0.ɵɵelementStart(0, "div", 110);
|
|
427
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_13_For_2_Template_div_click_0_listener($event) { const version_r28 = i0.ɵɵrestoreView(_r27).$implicit; const artifact_r25 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.openArtifactFromModal(artifact_r25.artifactId, version_r28.versionNumber); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
428
|
+
i0.ɵɵelementStart(1, "span", 111);
|
|
387
429
|
i0.ɵɵtext(2);
|
|
388
430
|
i0.ɵɵelementEnd();
|
|
389
|
-
i0.ɵɵelementStart(3, "span",
|
|
431
|
+
i0.ɵɵelementStart(3, "span", 112);
|
|
390
432
|
i0.ɵɵtext(4, "Open this version");
|
|
391
433
|
i0.ɵɵelementEnd();
|
|
392
|
-
i0.ɵɵelement(5, "i",
|
|
434
|
+
i0.ɵɵelement(5, "i", 113);
|
|
393
435
|
i0.ɵɵelementEnd();
|
|
394
436
|
} if (rf & 2) {
|
|
395
|
-
const
|
|
437
|
+
const version_r28 = ctx.$implicit;
|
|
396
438
|
i0.ɵɵadvance(2);
|
|
397
|
-
i0.ɵɵtextInterpolate1("v",
|
|
439
|
+
i0.ɵɵtextInterpolate1("v", version_r28.versionNumber);
|
|
398
440
|
} }
|
|
399
|
-
function
|
|
400
|
-
i0.ɵɵelementStart(0, "div",
|
|
401
|
-
i0.ɵɵrepeaterCreate(1,
|
|
441
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
442
|
+
i0.ɵɵelementStart(0, "div", 106);
|
|
443
|
+
i0.ɵɵrepeaterCreate(1, ConversationChatAreaComponent_Conditional_16_For_12_Conditional_13_For_2_Template, 6, 1, "div", 109, _forTrack2);
|
|
402
444
|
i0.ɵɵelementEnd();
|
|
403
445
|
} if (rf & 2) {
|
|
404
|
-
const
|
|
446
|
+
const artifact_r25 = i0.ɵɵnextContext().$implicit;
|
|
405
447
|
i0.ɵɵadvance();
|
|
406
|
-
i0.ɵɵrepeater(
|
|
448
|
+
i0.ɵɵrepeater(artifact_r25.versions);
|
|
407
449
|
} }
|
|
408
|
-
function
|
|
409
|
-
const
|
|
410
|
-
i0.ɵɵelementStart(0, "div",
|
|
411
|
-
i0.ɵɵlistener("click", function
|
|
412
|
-
i0.ɵɵelementStart(2, "div",
|
|
413
|
-
i0.ɵɵelement(3, "i",
|
|
450
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
451
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
452
|
+
i0.ɵɵelementStart(0, "div", 96)(1, "div", 97);
|
|
453
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_For_12_Template_div_click_1_listener() { const artifact_r25 = i0.ɵɵrestoreView(_r24).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openArtifactFromModal(artifact_r25.artifactId)); });
|
|
454
|
+
i0.ɵɵelementStart(2, "div", 98);
|
|
455
|
+
i0.ɵɵelement(3, "i", 99);
|
|
414
456
|
i0.ɵɵelementEnd();
|
|
415
|
-
i0.ɵɵelementStart(4, "div",
|
|
457
|
+
i0.ɵɵelementStart(4, "div", 100)(5, "div", 101);
|
|
416
458
|
i0.ɵɵtext(6);
|
|
417
459
|
i0.ɵɵelementEnd();
|
|
418
|
-
i0.ɵɵelementStart(7, "div",
|
|
419
|
-
i0.ɵɵconditionalCreate(8,
|
|
460
|
+
i0.ɵɵelementStart(7, "div", 102);
|
|
461
|
+
i0.ɵɵconditionalCreate(8, ConversationChatAreaComponent_Conditional_16_For_12_Conditional_8_Template, 1, 1)(9, ConversationChatAreaComponent_Conditional_16_For_12_Conditional_9_Template, 1, 0);
|
|
420
462
|
i0.ɵɵelementEnd()();
|
|
421
|
-
i0.ɵɵconditionalCreate(10,
|
|
422
|
-
i0.ɵɵelementStart(11, "div",
|
|
423
|
-
i0.ɵɵelement(12, "i",
|
|
463
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_16_For_12_Conditional_10_Template, 2, 4, "button", 103);
|
|
464
|
+
i0.ɵɵelementStart(11, "div", 104);
|
|
465
|
+
i0.ɵɵelement(12, "i", 105);
|
|
424
466
|
i0.ɵɵelementEnd()();
|
|
425
|
-
i0.ɵɵconditionalCreate(13,
|
|
467
|
+
i0.ɵɵconditionalCreate(13, ConversationChatAreaComponent_Conditional_16_For_12_Conditional_13_Template, 3, 0, "div", 106);
|
|
426
468
|
i0.ɵɵelementEnd();
|
|
427
469
|
} if (rf & 2) {
|
|
428
|
-
const
|
|
470
|
+
const artifact_r25 = ctx.$implicit;
|
|
429
471
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
430
|
-
i0.ɵɵclassProp("expanded", ctx_r1.expandedArtifactId ===
|
|
472
|
+
i0.ɵɵclassProp("expanded", ctx_r1.expandedArtifactId === artifact_r25.artifactId)("system-artifact", artifact_r25.visibility === "System Only");
|
|
431
473
|
i0.ɵɵadvance(6);
|
|
432
|
-
i0.ɵɵtextInterpolate(
|
|
474
|
+
i0.ɵɵtextInterpolate(artifact_r25.name);
|
|
433
475
|
i0.ɵɵadvance(2);
|
|
434
|
-
i0.ɵɵconditional(
|
|
476
|
+
i0.ɵɵconditional(artifact_r25.versionCount > 1 ? 8 : 9);
|
|
435
477
|
i0.ɵɵadvance(2);
|
|
436
|
-
i0.ɵɵconditional(
|
|
478
|
+
i0.ɵɵconditional(artifact_r25.versionCount > 1 ? 10 : -1);
|
|
437
479
|
i0.ɵɵadvance(3);
|
|
438
|
-
i0.ɵɵconditional(ctx_r1.expandedArtifactId ===
|
|
480
|
+
i0.ɵɵconditional(ctx_r1.expandedArtifactId === artifact_r25.artifactId && artifact_r25.versionCount > 1 ? 13 : -1);
|
|
439
481
|
} }
|
|
440
|
-
function
|
|
441
|
-
const
|
|
442
|
-
i0.ɵɵelementStart(0, "div",
|
|
443
|
-
i0.ɵɵlistener("click", function
|
|
444
|
-
i0.ɵɵelementStart(1, "div",
|
|
445
|
-
i0.ɵɵlistener("click", function
|
|
446
|
-
i0.ɵɵelementStart(2, "div",
|
|
482
|
+
function ConversationChatAreaComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
483
|
+
const _r22 = i0.ɵɵgetCurrentView();
|
|
484
|
+
i0.ɵɵelementStart(0, "div", 79);
|
|
485
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showArtifactsModal = false); });
|
|
486
|
+
i0.ɵɵelementStart(1, "div", 86);
|
|
487
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r22); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
488
|
+
i0.ɵɵelementStart(2, "div", 81)(3, "h3");
|
|
447
489
|
i0.ɵɵtext(4, "Conversation Artifacts");
|
|
448
490
|
i0.ɵɵelementEnd();
|
|
449
|
-
i0.ɵɵelementStart(5, "div",
|
|
450
|
-
i0.ɵɵconditionalCreate(6,
|
|
451
|
-
i0.ɵɵelementStart(7, "button",
|
|
452
|
-
i0.ɵɵlistener("click", function
|
|
453
|
-
i0.ɵɵelement(8, "i",
|
|
491
|
+
i0.ɵɵelementStart(5, "div", 87);
|
|
492
|
+
i0.ɵɵconditionalCreate(6, ConversationChatAreaComponent_Conditional_16_Conditional_6_Template, 4, 3, "button", 88);
|
|
493
|
+
i0.ɵɵelementStart(7, "button", 82);
|
|
494
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r22); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showArtifactsModal = false); });
|
|
495
|
+
i0.ɵɵelement(8, "i", 83);
|
|
454
496
|
i0.ɵɵelementEnd()()();
|
|
455
|
-
i0.ɵɵelementStart(9, "div",
|
|
456
|
-
i0.ɵɵconditionalCreate(10,
|
|
457
|
-
i0.ɵɵrepeaterCreate(11,
|
|
497
|
+
i0.ɵɵelementStart(9, "div", 89);
|
|
498
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_16_Conditional_10_Template, 4, 0, "div", 90);
|
|
499
|
+
i0.ɵɵrepeaterCreate(11, ConversationChatAreaComponent_Conditional_16_For_12_Template, 14, 8, "div", 91, _forTrack1);
|
|
458
500
|
i0.ɵɵelementEnd()()();
|
|
459
501
|
} if (rf & 2) {
|
|
460
502
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -465,28 +507,28 @@ function ConversationChatAreaComponent_Conditional_15_Template(rf, ctx) { if (rf
|
|
|
465
507
|
i0.ɵɵadvance();
|
|
466
508
|
i0.ɵɵrepeater(ctx_r1.getArtifactsArray());
|
|
467
509
|
} }
|
|
468
|
-
function
|
|
469
|
-
const
|
|
470
|
-
i0.ɵɵelementStart(0, "mj-artifact-collection-picker-modal",
|
|
471
|
-
i0.ɵɵlistener("completed", function
|
|
510
|
+
function ConversationChatAreaComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
511
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
512
|
+
i0.ɵɵelementStart(0, "mj-artifact-collection-picker-modal", 114);
|
|
513
|
+
i0.ɵɵlistener("completed", function ConversationChatAreaComponent_Conditional_17_Template_mj_artifact_collection_picker_modal_completed_0_listener($event) { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCollectionPickerCompleted($event)); })("cancelled", function ConversationChatAreaComponent_Conditional_17_Template_mj_artifact_collection_picker_modal_cancelled_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCollectionPickerCancelled()); });
|
|
472
514
|
i0.ɵɵelementEnd();
|
|
473
515
|
} if (rf & 2) {
|
|
474
516
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
475
517
|
i0.ɵɵproperty("isOpen", ctx_r1.showCollectionPicker)("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("excludeCollectionIds", ctx_r1.collectionPickerExcludedIds)("artifactVersionId", ctx_r1.collectionPickerVersionId)("artifactName", ctx_r1.collectionPickerArtifactName)("artifactVersionNumber", ctx_r1.collectionPickerVersionNumber);
|
|
476
518
|
} }
|
|
477
|
-
function
|
|
478
|
-
const
|
|
479
|
-
i0.ɵɵelementStart(0, "mj-test-feedback-dialog",
|
|
480
|
-
i0.ɵɵlistener("closed", function
|
|
519
|
+
function ConversationChatAreaComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
520
|
+
const _r30 = i0.ɵɵgetCurrentView();
|
|
521
|
+
i0.ɵɵelementStart(0, "mj-test-feedback-dialog", 115);
|
|
522
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_18_Template_mj_test_feedback_dialog_closed_0_listener($event) { i0.ɵɵrestoreView(_r30); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestFeedbackDialogClosed($event)); });
|
|
481
523
|
i0.ɵɵelementEnd();
|
|
482
524
|
} if (rf & 2) {
|
|
483
525
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
484
526
|
i0.ɵɵproperty("data", ctx_r1.testFeedbackDialogData)("visible", ctx_r1.showTestFeedbackDialog);
|
|
485
527
|
} }
|
|
486
|
-
function
|
|
487
|
-
const
|
|
488
|
-
i0.ɵɵelementStart(0, "mj-image-viewer",
|
|
489
|
-
i0.ɵɵlistener("closed", function
|
|
528
|
+
function ConversationChatAreaComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
529
|
+
const _r31 = i0.ɵɵgetCurrentView();
|
|
530
|
+
i0.ɵɵelementStart(0, "mj-image-viewer", 116);
|
|
531
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_19_Template_mj_image_viewer_closed_0_listener() { i0.ɵɵrestoreView(_r31); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onImageViewerClosed()); });
|
|
490
532
|
i0.ɵɵelementEnd();
|
|
491
533
|
} if (rf & 2) {
|
|
492
534
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -509,6 +551,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
509
551
|
bridge;
|
|
510
552
|
analyzeArtifactService;
|
|
511
553
|
uiCommandHandler;
|
|
554
|
+
interactiveFormApplyService;
|
|
512
555
|
environmentId;
|
|
513
556
|
currentUser;
|
|
514
557
|
// LOCAL STATE INPUTS - passed from parent workspace
|
|
@@ -528,6 +571,30 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
528
571
|
}
|
|
529
572
|
conversation = null;
|
|
530
573
|
threadId = null;
|
|
574
|
+
/**
|
|
575
|
+
* When true, render the normal message-list + message-input layout even
|
|
576
|
+
* before a conversation exists, instead of the centered empty-state
|
|
577
|
+
* welcome card. Lets host pages (e.g. Form Builder cockpit) put the chat
|
|
578
|
+
* header + mode picker front-and-center on first open and let the user
|
|
579
|
+
* pick a mode before typing. The first send still routes through
|
|
580
|
+
* MessageInputComponent and triggers conversationCreated as usual.
|
|
581
|
+
*/
|
|
582
|
+
suppressNewConversationEmptyState = false;
|
|
583
|
+
/**
|
|
584
|
+
* Host-level cap for @-mention autocomplete (agents and users).
|
|
585
|
+
* Defaults true. Hosts addressing a single fixed agent (e.g. Form Builder
|
|
586
|
+
* cockpit pinned to the Form Builder agent) should set false so the user
|
|
587
|
+
* can't accidentally redirect a turn to a different agent.
|
|
588
|
+
*/
|
|
589
|
+
allowMentions = true;
|
|
590
|
+
/**
|
|
591
|
+
* Host-level cap for attachments. Defaults true. When false, the host
|
|
592
|
+
* disables attachments regardless of agent modality support — useful for
|
|
593
|
+
* surfaces where attachments don't make sense (cockpit text-only flows).
|
|
594
|
+
* When true (default), attachment availability still depends on the
|
|
595
|
+
* agent's modality support, computed at runtime.
|
|
596
|
+
*/
|
|
597
|
+
allowAttachments = true;
|
|
531
598
|
_isNewConversation = false;
|
|
532
599
|
set isNewConversation(value) {
|
|
533
600
|
this._isNewConversation = value;
|
|
@@ -572,6 +639,113 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
572
639
|
showArtifactIndicator = true;
|
|
573
640
|
/** Application context snapshot for AI agent awareness. Included in agent execution data. */
|
|
574
641
|
appContext = null;
|
|
642
|
+
/**
|
|
643
|
+
* Optional default agent ID for the conversation. Forwarded to
|
|
644
|
+
* `<mj-message-input>` as its `[defaultAgentId]` so the first message
|
|
645
|
+
* routes directly to this agent instead of Sage. See
|
|
646
|
+
* `MessageInputComponent.routeMessage` priority rules — explicit
|
|
647
|
+
* @mention and prior-agent continuity still take precedence.
|
|
648
|
+
*
|
|
649
|
+
* Embedded chat surfaces (Form Builder cockpit, future domain chats)
|
|
650
|
+
* set this to the specialist agent's ID; the main Chat app leaves it
|
|
651
|
+
* unset to preserve the Sage-fronted UX.
|
|
652
|
+
*/
|
|
653
|
+
defaultAgentId = null;
|
|
654
|
+
/**
|
|
655
|
+
* Scope to apply when this surface CREATES a new conversation. Forwarded
|
|
656
|
+
* to `ConversationEngine.CreateConversation` so the new row's
|
|
657
|
+
* `ApplicationScope` column is stamped correctly. Embedded surfaces
|
|
658
|
+
* (e.g. the Form Builder cockpit) set this to `'Application'` so their
|
|
659
|
+
* conversations don't pollute the main Chat app list. Main Chat leaves
|
|
660
|
+
* it as the default `'Global'`. Has no effect on existing conversations.
|
|
661
|
+
*/
|
|
662
|
+
applicationScope = 'Global';
|
|
663
|
+
/**
|
|
664
|
+
* Application ID to bind a newly-created conversation to. REQUIRED when
|
|
665
|
+
* `applicationScope` is 'Application' or 'Both' (DB CHECK constraint
|
|
666
|
+
* enforces it). Used by embedded chat surfaces to scope their
|
|
667
|
+
* conversations to their owning Application.
|
|
668
|
+
*/
|
|
669
|
+
applicationId = null;
|
|
670
|
+
/**
|
|
671
|
+
* "What is this conversation about?" — the Entity ID this conversation
|
|
672
|
+
* references. Forwarded to `ConversationEngine.CreateConversation` so
|
|
673
|
+
* the new row's `LinkedEntityID` is stamped at creation time. Paired
|
|
674
|
+
* with {@link linkedRecordId} (DB CHECK requires both populated or both
|
|
675
|
+
* null). Form Builder cockpit passes the MJ: Components entity ID;
|
|
676
|
+
* Component Studio's AI panel does the same. Surfaces use this to
|
|
677
|
+
* later list "prior conversations about THIS form/component."
|
|
678
|
+
* Has no effect on existing conversations.
|
|
679
|
+
*/
|
|
680
|
+
linkedEntityId = null;
|
|
681
|
+
/**
|
|
682
|
+
* Primary key of the linked record, serialized as a string. Used with
|
|
683
|
+
* {@link linkedEntityId}. Form Builder cockpit passes the active
|
|
684
|
+
* form's ComponentID; Component Studio's AI panel passes the
|
|
685
|
+
* currently-selected component's ID.
|
|
686
|
+
*/
|
|
687
|
+
linkedRecordId = null;
|
|
688
|
+
/**
|
|
689
|
+
* Whether the conversation header should render the per-conversation
|
|
690
|
+
* agent picker. Default true. The picker lets a user pin a default
|
|
691
|
+
* agent on the active conversation (saved to
|
|
692
|
+
* `MJConversationEntity.DefaultAgentID`), so non-mention messages route
|
|
693
|
+
* to that agent instead of through Sage. Surfaces with no meaningful
|
|
694
|
+
* agent-choice UX can set this to false to hide the widget.
|
|
695
|
+
*/
|
|
696
|
+
showAgentPicker = true;
|
|
697
|
+
/**
|
|
698
|
+
* Whether the chat header should render the per-agent mode/quality
|
|
699
|
+
* picker (Draft / Standard / High, etc.). Default true. The picker
|
|
700
|
+
* auto-hides when the bound agent has fewer than 2 configured
|
|
701
|
+
* presets, so embedders rarely need to set this explicitly — turn
|
|
702
|
+
* off only when the surface should never expose model-tier choice
|
|
703
|
+
* (kiosks, specialty embeds).
|
|
704
|
+
*/
|
|
705
|
+
showAgentModePicker = true;
|
|
706
|
+
/**
|
|
707
|
+
* The mode/preset picker's selected configuration ID, forwarded to
|
|
708
|
+
* `<mj-message-input>` so non-mention routes apply it on the next
|
|
709
|
+
* send. Past messages are NOT retroactively re-routed — the picker
|
|
710
|
+
* only affects subsequent requests. Updated when the user picks a
|
|
711
|
+
* row in the mode picker; the picker itself persists the choice
|
|
712
|
+
* per-user, per-agent via UserInfoEngine.
|
|
713
|
+
*/
|
|
714
|
+
ActiveAgentConfigurationPresetId = null;
|
|
715
|
+
/**
|
|
716
|
+
* Agent the mode picker should target. Mirrors the routing precedence
|
|
717
|
+
* minus message-history continuity (the picker is persistent UI; it
|
|
718
|
+
* shouldn't flip as the user scrolls history).
|
|
719
|
+
*
|
|
720
|
+
* Order: conversation-pinned default → embedder default → Sage.
|
|
721
|
+
*/
|
|
722
|
+
/**
|
|
723
|
+
* True when the chat header should render even before a conversation
|
|
724
|
+
* row exists. Currently means: the embedder has enabled the mode
|
|
725
|
+
* picker AND we resolved a target agent for it (so there's actually
|
|
726
|
+
* something to put in the header). Lets surfaces like the Form
|
|
727
|
+
* Builder cockpit show the mode picker on top of the empty-state
|
|
728
|
+
* instead of waiting for the first message to create a conversation.
|
|
729
|
+
*/
|
|
730
|
+
get HasPreConversationHeader() {
|
|
731
|
+
return this.showAgentModePicker && !!this.ModePickerTargetAgentId;
|
|
732
|
+
}
|
|
733
|
+
get ModePickerTargetAgentId() {
|
|
734
|
+
return this.conversation?.DefaultAgentID
|
|
735
|
+
?? this.defaultAgentId
|
|
736
|
+
?? this.conversationManagerAgent?.ID
|
|
737
|
+
?? null;
|
|
738
|
+
}
|
|
739
|
+
/**
|
|
740
|
+
* Mode picker emitted a new selection. Store it; the next message's
|
|
741
|
+
* route picks it up via `<mj-message-input>`'s
|
|
742
|
+
* `[agentConfigurationPresetId]` binding. Past messages stay routed
|
|
743
|
+
* as they were — the change is forward-only.
|
|
744
|
+
*/
|
|
745
|
+
OnAgentModePresetChanged(presetId) {
|
|
746
|
+
this.ActiveAgentConfigurationPresetId = presetId;
|
|
747
|
+
this.cdr.markForCheck();
|
|
748
|
+
}
|
|
575
749
|
/** Greeting message shown in the empty state when no conversation is active */
|
|
576
750
|
emptyStateGreeting = 'How can I help you?';
|
|
577
751
|
// Sidebar toggle - when true, shows toggle button in header to expand sidebar
|
|
@@ -712,7 +886,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
712
886
|
acceptedFileTypes = 'image/*';
|
|
713
887
|
conversationManagerAgent = null;
|
|
714
888
|
engine = ConversationEngine.Instance;
|
|
715
|
-
constructor(agentStateService, conversationAgentService, activeTasks, cdr, mentionAutocompleteService, artifactPermissionService, attachmentService, streamingService, confirmDialog, bridge, analyzeArtifactService, uiCommandHandler) {
|
|
889
|
+
constructor(agentStateService, conversationAgentService, activeTasks, cdr, mentionAutocompleteService, artifactPermissionService, attachmentService, streamingService, confirmDialog, bridge, analyzeArtifactService, uiCommandHandler, interactiveFormApplyService) {
|
|
716
890
|
super();
|
|
717
891
|
this.agentStateService = agentStateService;
|
|
718
892
|
this.conversationAgentService = conversationAgentService;
|
|
@@ -726,6 +900,16 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
726
900
|
this.bridge = bridge;
|
|
727
901
|
this.analyzeArtifactService = analyzeArtifactService;
|
|
728
902
|
this.uiCommandHandler = uiCommandHandler;
|
|
903
|
+
this.interactiveFormApplyService = interactiveFormApplyService;
|
|
904
|
+
}
|
|
905
|
+
/**
|
|
906
|
+
* Apply a form-role artifact's spec as an EntityFormOverride for the
|
|
907
|
+
* current user. The service handles the Create-vs-Modify decision (based
|
|
908
|
+
* on whether an Active override already exists), confirms via dialog,
|
|
909
|
+
* and surfaces success/failure via notification.
|
|
910
|
+
*/
|
|
911
|
+
async OnApplyFormRequested(event) {
|
|
912
|
+
await this.interactiveFormApplyService.ConfirmAndApply(event.spec, event.entityName, this.ProviderToUse);
|
|
729
913
|
}
|
|
730
914
|
async ngOnInit() {
|
|
731
915
|
// Bind provider-aware services to this component's provider so multi-server
|
|
@@ -2268,9 +2452,35 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2268
2452
|
LogStatusEx({ message: '📨 Empty state message received', verboseOnly: true, additionalArgs: [text, `${attachments?.length || 0} attachments`] });
|
|
2269
2453
|
try {
|
|
2270
2454
|
this.isProcessing = true;
|
|
2271
|
-
// Create a new conversation using the engine
|
|
2455
|
+
// Create a new conversation using the engine. applicationScope +
|
|
2456
|
+
// applicationId let embedded surfaces (e.g. the Form Builder cockpit)
|
|
2457
|
+
// stamp their conversations as 'Application'-scoped so they don't
|
|
2458
|
+
// leak into the main chat list. defaultAgentId pins the routing
|
|
2459
|
+
// target for the first message — it's the same value forwarded to
|
|
2460
|
+
// <mj-message-input> as [defaultAgentId].
|
|
2461
|
+
//
|
|
2462
|
+
// Safety net: the DB CHECK constraint rejects ('Application' || 'Both')
|
|
2463
|
+
// without an ApplicationID. If the embedder hasn't resolved its app
|
|
2464
|
+
// ID yet (or it's missing from the Metadata cache), demote to
|
|
2465
|
+
// 'Global' so the save doesn't blow up. The conversation lands in
|
|
2466
|
+
// the main list — visible but not silently lost.
|
|
2467
|
+
const effectiveScope = (this.applicationScope !== 'Global' && !this.applicationId)
|
|
2468
|
+
? 'Global'
|
|
2469
|
+
: this.applicationScope;
|
|
2470
|
+
// Linked-record stamping — both columns must be populated together
|
|
2471
|
+
// or both null (DB CHECK constraint CK_Conversation_LinkBinding).
|
|
2472
|
+
// We only forward the pair when BOTH inputs are supplied; if the
|
|
2473
|
+
// host bound one but not the other, treat as misconfiguration and
|
|
2474
|
+
// skip the linkage rather than failing the save.
|
|
2475
|
+
const hasLink = !!this.linkedEntityId && !!this.linkedRecordId;
|
|
2272
2476
|
const newConversation = await this.engine.CreateConversation('New Conversation', // Temporary name - will be auto-named after first message
|
|
2273
|
-
this.environmentId, this.currentUser
|
|
2477
|
+
this.environmentId, this.currentUser, undefined, undefined, {
|
|
2478
|
+
applicationScope: effectiveScope,
|
|
2479
|
+
applicationId: effectiveScope === 'Global' ? null : this.applicationId,
|
|
2480
|
+
defaultAgentId: this.defaultAgentId,
|
|
2481
|
+
linkedEntityId: hasLink ? this.linkedEntityId : null,
|
|
2482
|
+
linkedRecordId: hasLink ? this.linkedRecordId : null,
|
|
2483
|
+
});
|
|
2274
2484
|
if (!newConversation) {
|
|
2275
2485
|
console.error('Failed to create new conversation');
|
|
2276
2486
|
this.isProcessing = false;
|
|
@@ -2535,8 +2745,10 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2535
2745
|
console.log('[client:capture-data-snapshot] Opened artifact panel; waiting for viewer mount + data load');
|
|
2536
2746
|
}
|
|
2537
2747
|
// Poll for the snapshot — interactive components need a few render cycles
|
|
2538
|
-
// before `getCurrentDataState()` registers via callbacks.RegisterMethod
|
|
2539
|
-
|
|
2748
|
+
// before `getCurrentDataState()` registers via callbacks.RegisterMethod,
|
|
2749
|
+
// and query-backed / server-paged components need additional time to load
|
|
2750
|
+
// their rows (we now wait for rows, not just a registered table).
|
|
2751
|
+
const snapshot = await this.waitForViewerSnapshot(15000);
|
|
2540
2752
|
if (!snapshot) {
|
|
2541
2753
|
console.warn('[client:capture-data-snapshot] Artifact viewer did not produce a snapshot within timeout');
|
|
2542
2754
|
return;
|
|
@@ -2584,19 +2796,24 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2584
2796
|
* fetches run and its `getCurrentDataState()` becomes callable via
|
|
2585
2797
|
* `callbacks.RegisterMethod('getCurrentDataState', ...)`.
|
|
2586
2798
|
*
|
|
2587
|
-
* `GetCurrentStateSnapshot()` returns
|
|
2588
|
-
* - **Live**: a populated DataSnapshot with `tables[]`
|
|
2799
|
+
* `GetCurrentStateSnapshot()` returns three distinct shapes:
|
|
2800
|
+
* - **Live**: a populated DataSnapshot with `tables[]` whose rows are filled.
|
|
2589
2801
|
* - **Fallback**: an empty placeholder with only `title` + `interpretation`
|
|
2590
2802
|
* ("No live data was captured — the component either has no data-fetching
|
|
2591
2803
|
* hooks or has not yet run its queries"). This fires when the React
|
|
2592
2804
|
* component hasn't yet registered `getCurrentDataState()`.
|
|
2805
|
+
* - **Schema-only**: a structured snapshot with real `tables`/`columns` and
|
|
2806
|
+
* metadata (e.g. `totalAvailableRowCount`) but `rows: []`. This is common
|
|
2807
|
+
* for query-backed / server-paged components whose data load hasn't
|
|
2808
|
+
* completed (or whose visible page is empty) at the moment of capture.
|
|
2593
2809
|
*
|
|
2594
|
-
* We must
|
|
2595
|
-
* defeats the
|
|
2596
|
-
*
|
|
2597
|
-
*
|
|
2598
|
-
*
|
|
2599
|
-
*
|
|
2810
|
+
* We must accept ONLY a snapshot that actually carries rows — a schema-only
|
|
2811
|
+
* or placeholder snapshot defeats the point of the pipeline (the analysis
|
|
2812
|
+
* agent receives an empty table). So we key "live" on `rows.length`, not just
|
|
2813
|
+
* `tables.length`, and keep polling so async/paged data has time to load.
|
|
2814
|
+
* Only after timeout do we return the last available row-less snapshot (any
|
|
2815
|
+
* structure is better than nothing, but the user will see an empty table in
|
|
2816
|
+
* the resulting artifact).
|
|
2600
2817
|
*/
|
|
2601
2818
|
async waitForViewerSnapshot(timeoutMs) {
|
|
2602
2819
|
const intervalMs = 200;
|
|
@@ -2610,7 +2827,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2610
2827
|
const viewer = this.artifactViewerComponent;
|
|
2611
2828
|
const snap = viewer?.GetCurrentStateSnapshot?.();
|
|
2612
2829
|
if (snap) {
|
|
2613
|
-
const hasLiveData = Array.isArray(snap.tables) && snap.tables.length > 0;
|
|
2830
|
+
const hasLiveData = Array.isArray(snap.tables) && snap.tables.some((t) => Array.isArray(t.rows) && t.rows.length > 0);
|
|
2614
2831
|
const tableShape = Array.isArray(snap.tables)
|
|
2615
2832
|
? snap.tables.map((t) => `${t.name}:${(t.rows ?? []).length}rows`).join(', ')
|
|
2616
2833
|
: 'no-tables';
|
|
@@ -2952,7 +3169,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2952
3169
|
this.cdr.detectChanges();
|
|
2953
3170
|
}
|
|
2954
3171
|
}
|
|
2955
|
-
static ɵfac = function ConversationChatAreaComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationChatAreaComponent)(i0.ɵɵdirectiveInject(i1.AgentStateService), i0.ɵɵdirectiveInject(i2.ConversationAgentService), i0.ɵɵdirectiveInject(i3.ActiveTasksService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i4.MentionAutocompleteService), i0.ɵɵdirectiveInject(i5.ArtifactPermissionService), i0.ɵɵdirectiveInject(i6.ConversationAttachmentService), i0.ɵɵdirectiveInject(i7.ConversationStreamingService), i0.ɵɵdirectiveInject(i8.DialogService), i0.ɵɵdirectiveInject(i9.ConversationBridgeService), i0.ɵɵdirectiveInject(i10.AnalyzeArtifactService), i0.ɵɵdirectiveInject(i11.UICommandHandlerService)); };
|
|
3172
|
+
static ɵfac = function ConversationChatAreaComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationChatAreaComponent)(i0.ɵɵdirectiveInject(i1.AgentStateService), i0.ɵɵdirectiveInject(i2.ConversationAgentService), i0.ɵɵdirectiveInject(i3.ActiveTasksService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i4.MentionAutocompleteService), i0.ɵɵdirectiveInject(i5.ArtifactPermissionService), i0.ɵɵdirectiveInject(i6.ConversationAttachmentService), i0.ɵɵdirectiveInject(i7.ConversationStreamingService), i0.ɵɵdirectiveInject(i8.DialogService), i0.ɵɵdirectiveInject(i9.ConversationBridgeService), i0.ɵɵdirectiveInject(i10.AnalyzeArtifactService), i0.ɵɵdirectiveInject(i11.UICommandHandlerService), i0.ɵɵdirectiveInject(i10.InteractiveFormApplyService)); };
|
|
2956
3173
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationChatAreaComponent, selectors: [["mj-conversation-chat-area"]], viewQuery: function ConversationChatAreaComponent_Query(rf, ctx) { if (rf & 1) {
|
|
2957
3174
|
i0.ɵɵviewQuery(_c0, 5)(ArtifactViewerPanelComponent, 5)(ConversationEmptyStateComponent, 5)(_c1, 5);
|
|
2958
3175
|
} if (rf & 2) {
|
|
@@ -2961,48 +3178,48 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2961
3178
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.artifactViewerComponent = _t.first);
|
|
2962
3179
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.emptyStateComponent = _t.first);
|
|
2963
3180
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.messageInputComponents = _t);
|
|
2964
|
-
} }, inputs: { environmentId: "environmentId", currentUser: "currentUser", conversationId: "conversationId", conversation: "conversation", threadId: "threadId", isNewConversation: "isNewConversation", pendingMessage: "pendingMessage", pendingAttachments: "pendingAttachments", pendingArtifactId: "pendingArtifactId", pendingArtifactVersionNumber: "pendingArtifactVersionNumber", overlayMode: "overlayMode", showExportButton: "showExportButton", showShareButton: "showShareButton", showArtifactIndicator: "showArtifactIndicator", appContext: "appContext", emptyStateGreeting: "emptyStateGreeting", showSidebarToggle: "showSidebarToggle" }, outputs: { conversationRenamed: "conversationRenamed", openEntityRecord: "openEntityRecord", navigationRequest: "navigationRequest", taskClicked: "taskClicked", artifactLinkClicked: "artifactLinkClicked", sidebarToggleClicked: "sidebarToggleClicked", conversationCreated: "conversationCreated", threadOpened: "threadOpened", threadClosed: "threadClosed", pendingArtifactConsumed: "pendingArtifactConsumed", pendingMessageConsumed: "pendingMessageConsumed", pendingMessageRequested: "pendingMessageRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls:
|
|
3181
|
+
} }, inputs: { environmentId: "environmentId", currentUser: "currentUser", conversationId: "conversationId", conversation: "conversation", threadId: "threadId", suppressNewConversationEmptyState: "suppressNewConversationEmptyState", allowMentions: "allowMentions", allowAttachments: "allowAttachments", isNewConversation: "isNewConversation", pendingMessage: "pendingMessage", pendingAttachments: "pendingAttachments", pendingArtifactId: "pendingArtifactId", pendingArtifactVersionNumber: "pendingArtifactVersionNumber", overlayMode: "overlayMode", showExportButton: "showExportButton", showShareButton: "showShareButton", showArtifactIndicator: "showArtifactIndicator", appContext: "appContext", defaultAgentId: "defaultAgentId", applicationScope: "applicationScope", applicationId: "applicationId", linkedEntityId: "linkedEntityId", linkedRecordId: "linkedRecordId", showAgentPicker: "showAgentPicker", showAgentModePicker: "showAgentModePicker", emptyStateGreeting: "emptyStateGreeting", showSidebarToggle: "showSidebarToggle" }, outputs: { conversationRenamed: "conversationRenamed", openEntityRecord: "openEntityRecord", navigationRequest: "navigationRequest", taskClicked: "taskClicked", artifactLinkClicked: "artifactLinkClicked", sidebarToggleClicked: "sidebarToggleClicked", conversationCreated: "conversationCreated", threadOpened: "threadOpened", threadClosed: "threadClosed", pendingArtifactConsumed: "pendingArtifactConsumed", pendingMessageConsumed: "pendingMessageConsumed", pendingMessageRequested: "pendingMessageRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 20, vars: 26, consts: [["scrollContainer", ""], ["messageInput", ""], [1, "chat-area"], [1, "chat-header"], [1, "chat-content-area"], [1, "chat-messages-pane"], [1, "conversation-loading-state"], [3, "currentUser", "disabled", "showSidebarToggle", "overlayMode", "greeting", "enableAttachments", "enableMentions", "maxAttachments", "maxAttachmentSizeBytes", "acceptedFileTypes"], [1, "chat-messages-wrapper"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], [3, "pinnedMessages"], [3, "parentMessageId", "conversationId", "currentUser"], [3, "cancelled", "exported", "isVisible", "conversation", "currentUser"], [3, "Result", "Visible", "Context", "Adapter"], [3, "cancelled", "membersChanged", "isVisible", "conversation", "currentUser"], [1, "modal-overlay"], [3, "isOpen", "environmentId", "currentUser", "excludeCollectionIds", "artifactVersionId", "artifactName", "artifactVersionNumber"], [3, "data", "visible"], [3, "imageUrl", "alt", "fileName", "visible"], [1, "chat-info"], ["title", "Show conversations", 1, "sidebar-toggle-btn"], [1, "chat-title"], [1, "shared-by-badge", 3, "title"], ["title", "Assign to project", 1, "project-tag"], ["title", "View Test Run", 1, "test-indicator"], [1, "chat-actions", "chat-actions-buttons"], ["title", "View pinned messages", 1, "pin-chip", 3, "active"], ["title", "View artifacts", 1, "artifact-indicator"], ["title", "View members", 1, "chat-members"], [3, "AgentID", "Disabled"], [3, "Conversation", "CurrentUser", "Disabled"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Export conversation"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "shared", "title"], ["title", "Show conversations", 1, "sidebar-toggle-btn", 3, "click"], [1, "fas", "fa-table-columns"], [1, "fas", "fa-share-nodes"], ["title", "Assign to project", 1, "project-tag", 3, "click"], [1, "fas", "fa-folder"], ["title", "View Test Run", 1, "test-indicator", 3, "click"], [1, "fas", "fa-flask"], ["title", "View pinned messages", 1, "pin-chip", 3, "click"], [1, "fas", "fa-thumbtack"], [1, "pin-chip-count"], ["title", "View artifacts", 1, "artifact-indicator", 3, "click"], [1, "fas", "fa-cube"], [1, "artifact-badge"], ["title", "View members", 1, "chat-members", 3, "click"], [1, "fas", "fa-users"], [1, "members-badge"], [3, "PresetChanged", "AgentID", "Disabled"], ["mjButton", "", "variant", "flat", "size", "sm", "title", "Export conversation", 3, "click"], [1, "fas", "fa-download"], [1, "btn-label"], ["mjButton", "", "variant", "flat", "size", "sm", 3, "click", "title"], ["text", "Loading conversation...", "size", "large"], [3, "sidebarToggleClicked", "messageSent", "currentUser", "disabled", "showSidebarToggle", "overlayMode", "greeting", "enableAttachments", "enableMentions", "maxAttachments", "maxAttachmentSizeBytes", "acceptedFileTypes"], [1, "chat-messages-container"], [1, "chat-input-container"], [1, "message-input-container-wrapper"], [3, "emptyStateSubmit", "emptyStateMode", "currentUser", "disabled", "enableAttachments", "enableMentions", "maxAttachments", "maxAttachmentSizeBytes", "acceptedFileTypes"], [1, "upload-indicator-overlay"], [1, "chat-messages-container", 3, "scroll"], [3, "replyInThread", "viewThread", "deleteMessage", "retryMessage", "testFeedbackMessage", "artifactClicked", "messageEdited", "openEntityRecord", "suggestedResponseSelected", "attachmentClicked", "diagnosticRequested", "messagePinToggled", "messages", "conversation", "currentUser", "isProcessing", "artifactMap", "agentRunMap", "ratingsMap", "userAvatarMap", "attachmentsMap"], [1, "scroll-to-bottom-icon", 2, "left", "50%"], [1, "loading-peripheral-placeholder"], ["size", "medium", 3, "text"], [1, "scroll-to-bottom-icon", 2, "left", "50%", 3, "click"], [1, "fas", "fa-arrow-down"], ["text", "Loading conversation data...", "size", "medium"], ["role", "status", 1, "read-only-banner"], [3, "hidden", "conversationId", "conversationName", "currentUser", "conversationHistory", "artifactsByDetailId", "systemArtifactsByDetailId", "agentRunsByDetailId", "appContext", "defaultAgentId", "conversationDefaultAgentId", "agentConfigurationPresetId", "inProgressMessageIds", "disabled", "enableAttachments", "enableMentions", "maxAttachments", "maxAttachmentSizeBytes", "acceptedFileTypes", "initialMessage", "initialAttachments"], [1, "fas", "fa-eye"], [3, "messageSent", "agentResponse", "agentRunDetected", "agentRunUpdate", "messageComplete", "artifactCreated", "conversationRenamed", "intentCheckStarted", "intentCheckCompleted", "uploadStateChanged", "hidden", "conversationId", "conversationName", "currentUser", "conversationHistory", "artifactsByDetailId", "systemArtifactsByDetailId", "agentRunsByDetailId", "appContext", "defaultAgentId", "conversationDefaultAgentId", "agentConfigurationPresetId", "inProgressMessageIds", "disabled", "enableAttachments", "enableMentions", "maxAttachments", "maxAttachmentSizeBytes", "acceptedFileTypes", "initialMessage", "initialAttachments"], [1, "resize-handle"], [1, "chat-artifact-pane"], [3, "closed", "saveToCollectionRequested", "navigateToLink", "shareRequested", "maximizeToggled", "openEntityRecord", "navigationRequest", "analyzeRequested", "applyFormRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "viewContext", "canShare", "canEdit", "isMaximized", "refreshTrigger"], [1, "resize-handle", 3, "mousedown", "touchstart"], [3, "closed", "jumpRequested", "unpinRequested", "pinnedMessages"], [3, "closed", "replyAdded", "parentMessageId", "conversationId", "currentUser"], [1, "modal-overlay", 3, "click"], [1, "modal-content", "project-selector-modal", 3, "click"], [1, "modal-header"], [1, "modal-close-btn", 3, "click"], [1, "fas", "fa-times"], [1, "modal-body"], [3, "projectSelected", "environmentId", "currentUser", "selectedProjectId"], [1, "modal-content", "artifacts-modal", 3, "click"], [1, "modal-header-actions"], ["title", "Toggle system artifacts visibility", 1, "toggle-system-btn", 3, "active"], [1, "modal-body", "artifacts-grid"], [1, "empty-state"], [1, "artifact-modal-card", 3, "expanded", "system-artifact"], ["title", "Toggle system artifacts visibility", 1, "toggle-system-btn", 3, "click"], [1, "fas", "fa-cog"], [1, "fas", "fa-cube", 2, "font-size", "48px", "color", "var(--mj-text-muted)", "margin-bottom", "16px"], [2, "color", "var(--mj-text-muted)", "font-size", "14px"], [1, "artifact-modal-card"], [1, "artifact-card-header", 3, "click"], [1, "artifact-modal-icon"], [1, "fas", "fa-file-code"], [1, "artifact-modal-info"], [1, "artifact-modal-title"], [1, "artifact-modal-meta"], [1, "expand-btn"], [1, "artifact-modal-action"], [1, "fas", "fa-external-link-alt"], [1, "artifact-versions-list"], [1, "expand-btn", 3, "click"], [1, "fas"], [1, "artifact-version-item"], [1, "artifact-version-item", 3, "click"], [1, "version-badge"], [1, "version-open-text"], [1, "fas", "fa-arrow-right"], [3, "completed", "cancelled", "isOpen", "environmentId", "currentUser", "excludeCollectionIds", "artifactVersionId", "artifactName", "artifactVersionNumber"], [3, "closed", "data", "visible"], [3, "closed", "imageUrl", "alt", "fileName", "visible"]], template: function ConversationChatAreaComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2965
3182
|
i0.ɵɵelementStart(0, "div", 2);
|
|
2966
|
-
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_1_Template,
|
|
3183
|
+
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_1_Template, 15, 14, "div", 3);
|
|
2967
3184
|
i0.ɵɵelementStart(2, "div", 4)(3, "div", 5);
|
|
2968
|
-
i0.ɵɵconditionalCreate(4, ConversationChatAreaComponent_Conditional_4_Template, 2, 0, "div", 6)(5, ConversationChatAreaComponent_Conditional_5_Template, 1,
|
|
3185
|
+
i0.ɵɵconditionalCreate(4, ConversationChatAreaComponent_Conditional_4_Template, 2, 0, "div", 6)(5, ConversationChatAreaComponent_Conditional_5_Template, 1, 10, "mj-conversation-empty-state", 7)(6, ConversationChatAreaComponent_Conditional_6_Template, 5, 8, "div", 8)(7, ConversationChatAreaComponent_Conditional_7_Template, 9, 12, "div", 8);
|
|
2969
3186
|
i0.ɵɵelementEnd();
|
|
2970
|
-
i0.ɵɵconditionalCreate(
|
|
2971
|
-
i0.ɵɵelementStart(
|
|
2972
|
-
i0.ɵɵlistener("saved", function
|
|
3187
|
+
i0.ɵɵconditionalCreate(8, ConversationChatAreaComponent_Conditional_8_Template, 3, 14);
|
|
3188
|
+
i0.ɵɵelementStart(9, "mj-artifact-share-modal", 9);
|
|
3189
|
+
i0.ɵɵlistener("saved", function ConversationChatAreaComponent_Template_mj_artifact_share_modal_saved_9_listener() { return ctx.onArtifactShared(); })("cancelled", function ConversationChatAreaComponent_Template_mj_artifact_share_modal_cancelled_9_listener() { return ctx.onArtifactShareModalClose(); });
|
|
2973
3190
|
i0.ɵɵelementEnd();
|
|
2974
|
-
i0.ɵɵconditionalCreate(
|
|
3191
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_10_Template, 1, 1, "mj-pinned-messages-panel", 10);
|
|
2975
3192
|
i0.ɵɵelementEnd()();
|
|
2976
|
-
i0.ɵɵconditionalCreate(
|
|
2977
|
-
i0.ɵɵelementStart(
|
|
2978
|
-
i0.ɵɵlistener("cancelled", function
|
|
3193
|
+
i0.ɵɵconditionalCreate(11, ConversationChatAreaComponent_Conditional_11_Template, 1, 3, "mj-thread-panel", 11);
|
|
3194
|
+
i0.ɵɵelementStart(12, "mj-export-modal", 12);
|
|
3195
|
+
i0.ɵɵlistener("cancelled", function ConversationChatAreaComponent_Template_mj_export_modal_cancelled_12_listener() { return ctx.onExportModalCancelled(); })("exported", function ConversationChatAreaComponent_Template_mj_export_modal_exported_12_listener() { return ctx.onExportModalComplete(); });
|
|
2979
3196
|
i0.ɵɵelementEnd();
|
|
2980
|
-
i0.ɵɵelementStart(
|
|
2981
|
-
i0.ɵɵlistener("Result", function
|
|
3197
|
+
i0.ɵɵelementStart(13, "mj-resource-share-dialog", 13);
|
|
3198
|
+
i0.ɵɵlistener("Result", function ConversationChatAreaComponent_Template_mj_resource_share_dialog_Result_13_listener($event) { return ctx.onShareDialogResult($event); });
|
|
2982
3199
|
i0.ɵɵelementEnd();
|
|
2983
|
-
i0.ɵɵelementStart(
|
|
2984
|
-
i0.ɵɵlistener("cancelled", function
|
|
3200
|
+
i0.ɵɵelementStart(14, "mj-members-modal", 14);
|
|
3201
|
+
i0.ɵɵlistener("cancelled", function ConversationChatAreaComponent_Template_mj_members_modal_cancelled_14_listener() { return ctx.showMembersModal = false; })("membersChanged", function ConversationChatAreaComponent_Template_mj_members_modal_membersChanged_14_listener() { return ctx.showMembersModal = false; });
|
|
2985
3202
|
i0.ɵɵelementEnd();
|
|
2986
|
-
i0.ɵɵconditionalCreate(
|
|
2987
|
-
i0.ɵɵconditionalCreate(
|
|
2988
|
-
i0.ɵɵconditionalCreate(
|
|
2989
|
-
i0.ɵɵconditionalCreate(
|
|
2990
|
-
i0.ɵɵconditionalCreate(
|
|
3203
|
+
i0.ɵɵconditionalCreate(15, ConversationChatAreaComponent_Conditional_15_Template, 9, 3, "div", 15);
|
|
3204
|
+
i0.ɵɵconditionalCreate(16, ConversationChatAreaComponent_Conditional_16_Template, 13, 2, "div", 15);
|
|
3205
|
+
i0.ɵɵconditionalCreate(17, ConversationChatAreaComponent_Conditional_17_Template, 1, 7, "mj-artifact-collection-picker-modal", 16);
|
|
3206
|
+
i0.ɵɵconditionalCreate(18, ConversationChatAreaComponent_Conditional_18_Template, 1, 2, "mj-test-feedback-dialog", 17);
|
|
3207
|
+
i0.ɵɵconditionalCreate(19, ConversationChatAreaComponent_Conditional_19_Template, 1, 4, "mj-image-viewer", 18);
|
|
2991
3208
|
} if (rf & 2) {
|
|
2992
3209
|
i0.ɵɵadvance();
|
|
2993
|
-
i0.ɵɵconditional(ctx.conversation ? 1 : -1);
|
|
3210
|
+
i0.ɵɵconditional(ctx.conversation || ctx.HasPreConversationHeader ? 1 : -1);
|
|
2994
3211
|
i0.ɵɵadvance(2);
|
|
2995
3212
|
i0.ɵɵclassProp("full-width", !ctx.showArtifactPanel)("hidden", ctx.isArtifactPaneMaximized);
|
|
2996
3213
|
i0.ɵɵadvance();
|
|
2997
|
-
i0.ɵɵconditional(ctx.isLoadingConversation ? 4 : ctx.isNewConversation || !ctx.conversationId ? 5 : 6);
|
|
2998
|
-
i0.ɵɵadvance(
|
|
2999
|
-
i0.ɵɵconditional(ctx.showArtifactPanel && ctx.selectedArtifactId ?
|
|
3214
|
+
i0.ɵɵconditional(ctx.isLoadingConversation ? 4 : (ctx.isNewConversation || !ctx.conversationId) && !ctx.suppressNewConversationEmptyState ? 5 : (ctx.isNewConversation || !ctx.conversationId) && ctx.suppressNewConversationEmptyState ? 6 : 7);
|
|
3215
|
+
i0.ɵɵadvance(4);
|
|
3216
|
+
i0.ɵɵconditional(ctx.showArtifactPanel && ctx.selectedArtifactId ? 8 : -1);
|
|
3000
3217
|
i0.ɵɵadvance();
|
|
3001
3218
|
i0.ɵɵproperty("isOpen", ctx.isArtifactShareModalOpen)("artifact", ctx.artifactToShare)("currentUser", ctx.currentUser);
|
|
3002
3219
|
i0.ɵɵadvance();
|
|
3003
|
-
i0.ɵɵconditional(ctx.showPinsPanel ?
|
|
3220
|
+
i0.ɵɵconditional(ctx.showPinsPanel ? 10 : -1);
|
|
3004
3221
|
i0.ɵɵadvance();
|
|
3005
|
-
i0.ɵɵconditional(ctx.threadId ?
|
|
3222
|
+
i0.ɵɵconditional(ctx.threadId ? 11 : -1);
|
|
3006
3223
|
i0.ɵɵadvance();
|
|
3007
3224
|
i0.ɵɵproperty("isVisible", ctx.showExportModal)("conversation", ctx.conversation || undefined)("currentUser", ctx.currentUser);
|
|
3008
3225
|
i0.ɵɵadvance();
|
|
@@ -3010,21 +3227,21 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
3010
3227
|
i0.ɵɵadvance();
|
|
3011
3228
|
i0.ɵɵproperty("isVisible", ctx.showMembersModal)("conversation", ctx.conversation || undefined)("currentUser", ctx.currentUser);
|
|
3012
3229
|
i0.ɵɵadvance();
|
|
3013
|
-
i0.ɵɵconditional(ctx.showProjectSelector && ctx.conversation ?
|
|
3230
|
+
i0.ɵɵconditional(ctx.showProjectSelector && ctx.conversation ? 15 : -1);
|
|
3014
3231
|
i0.ɵɵadvance();
|
|
3015
|
-
i0.ɵɵconditional(ctx.showArtifactsModal ?
|
|
3232
|
+
i0.ɵɵconditional(ctx.showArtifactsModal ? 16 : -1);
|
|
3016
3233
|
i0.ɵɵadvance();
|
|
3017
|
-
i0.ɵɵconditional(ctx.showCollectionPicker ?
|
|
3234
|
+
i0.ɵɵconditional(ctx.showCollectionPicker ? 17 : -1);
|
|
3018
3235
|
i0.ɵɵadvance();
|
|
3019
|
-
i0.ɵɵconditional(ctx.testFeedbackDialogData ?
|
|
3236
|
+
i0.ɵɵconditional(ctx.testFeedbackDialogData ? 18 : -1);
|
|
3020
3237
|
i0.ɵɵadvance();
|
|
3021
|
-
i0.ɵɵconditional(ctx.showImageViewer ?
|
|
3022
|
-
} }, dependencies: [i12.MJButtonDirective, i10.ArtifactViewerPanelComponent, i13.TestFeedbackDialogComponent, i14.LoadingComponent, i15.GenericShareDialogComponent, i16.ArtifactCollectionPickerModalComponent, i17.ArtifactShareModalComponent, i18.MessageListComponent, i19.MessageInputComponent, i20.ConversationEmptyStateComponent, i21.ThreadPanelComponent, i22.ProjectSelectorComponent, i23.MembersModalComponent, i24.ExportModalComponent, i25.ImageViewerComponent, i26.PinnedMessagesPanelComponent], styles: ["[_nghost-%COMP%] {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.chat-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.chat-header[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: var(--mj-bg-surface-card);\n z-index: 10;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.chat-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n\n\n.sidebar-toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%]:active {\n background: color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 18px;\n transition: color 0.15s ease;\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.chat-title[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 999px;\n font-size: 12px;\n font-weight: 500;\n flex-shrink: 0;\n max-width: 240px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.shared-by-badge[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.project-tag[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n\n.project-tag[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-text-muted);\n}\n\n.project-tag[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.test-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-status-warning);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 8px;\n}\n\n.test-indicator[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.test-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.pin-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, transparent);\n border-radius: 20px;\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pin-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.pin-chip[_ngcontent-%COMP%]:hover, \n.pin-chip.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.pin-chip-count[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 700;\n}\n\n.chat-members[_ngcontent-%COMP%], \n.artifact-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n padding: 6px 8px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.chat-members[_ngcontent-%COMP%]:hover, \n.artifact-indicator[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n\n.artifact-badge[_ngcontent-%COMP%], \n.members-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.members-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.ambient-agent-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n.ambient-agent-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n}\n.chat-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 150ms ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.share-btn.shared[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-brand-primary-hover);\n}\n\n.share-btn.shared[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.chat-content-area[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n\n.chat-messages-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: min(300px, 100%); \n\n overflow: hidden;\n transition: width 0.3s ease;\n}\n\n.chat-messages-pane.full-width[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.chat-messages-pane[_ngcontent-%COMP%]:not(.full-width) {\n flex: 1;\n}\n\n.chat-messages-pane.hidden[_ngcontent-%COMP%] {\n display: none;\n}\n\n.resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n}\n\n.resize-handle[_ngcontent-%COMP%]::before {\n content: \"\";\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n\n.chat-artifact-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.chat-artifact-pane.maximized[_ngcontent-%COMP%] {\n width: 100% !important;\n}\n\n.chat-artifact-pane[_ngcontent-%COMP%] > mj-artifact-viewer-panel[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.chat-messages-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n position: relative; \n\n}\n\n\n\n.upload-indicator-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1rem 1.5rem;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 95%, transparent);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n z-index: 100;\n pointer-events: none;\n}\n\n.chat-messages-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-surface-card);\n min-height: 0;\n position: relative;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 21px;\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px;\n margin-left: auto;\n margin-right: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n transform: translateX(-50%) translateY(-2px);\n box-shadow: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent) 0 4px 12px;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 16px;\n transition: color 0.2s;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.chat-input-container[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n padding: 0 1.25rem 1.25rem 1.25rem;\n overflow: visible;\n}\n\n.read-only-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 1.25rem 0.5rem 1.25rem;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n font-size: 12px;\n}\n\n.read-only-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.loading-peripheral-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px;\n padding: 24px;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 50%, transparent);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-in-out;\n}\n\n.modal-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.modal-content[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n\n.project-selector-modal[_ngcontent-%COMP%] {\n width: 600px;\n height: 500px;\n}\n\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.modal-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.toggle-system-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.toggle-system-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.toggle-system-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.toggle-system-btn.active[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.toggle-system-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.modal-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.modal-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.modal-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n\n.artifacts-modal[_ngcontent-%COMP%] {\n width: 700px;\n max-height: 600px;\n}\n\n.artifacts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n grid-column: 1/-1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n\n.artifact-modal-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n border: 1.5px solid var(--mj-border-default);\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.artifact-modal-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n border-color: var(--mj-border-default);\n border-style: dashed;\n position: relative;\n}\n\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]::before {\n content: \"SYSTEM\";\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-muted);\n box-shadow: var(--mj-shadow-md);\n}\n\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n\n.artifact-card-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-modal-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-2px);\n}\n\n.artifact-modal-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 10px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.artifact-modal-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.artifact-modal-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-modal-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.artifact-modal-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.artifact-modal-action[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.artifact-modal-card[_ngcontent-%COMP%]:hover .artifact-modal-action[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n}\n.expand-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.artifact-versions-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-version-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n.artifact-version-item[_ngcontent-%COMP%] .version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n}\n.artifact-version-item[_ngcontent-%COMP%] .version-open-text[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n.artifact-version-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover .version-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover .version-open-text[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.loading-peripheral-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n.loading-peripheral-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.conversation-loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n}\n.loading-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n.loading-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n\n\n@media (max-width: 768px) {\n .chat-header[_ngcontent-%COMP%] {\n padding: 8px 12px;\n gap: 6px;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n position: relative;\n }\n .chat-info[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n order: 1;\n }\n .chat-title[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 700;\n width: auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n }\n .project-tag[_ngcontent-%COMP%] {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n display: none; \n\n }\n .test-indicator[_ngcontent-%COMP%] {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n }\n \n\n .chat-actions-buttons[_ngcontent-%COMP%] {\n order: 2;\n flex-shrink: 0;\n }\n .chat-actions-buttons[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n min-width: auto;\n }\n .chat-actions-buttons[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] .btn-label[_ngcontent-%COMP%] {\n display: none;\n }\n .chat-actions[_ngcontent-%COMP%] {\n flex-wrap: nowrap;\n }\n .chat-members[_ngcontent-%COMP%], \n .artifact-indicator[_ngcontent-%COMP%] {\n padding: 5px 7px;\n font-size: 13px;\n }\n .action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n font-size: 12px;\n }\n .ambient-agent-indicator[_ngcontent-%COMP%] {\n font-size: 12px;\n padding: 4px 8px;\n }\n .project-selector-modal[_ngcontent-%COMP%] {\n width: min(95vw, 600px);\n height: auto;\n }\n .artifacts-modal[_ngcontent-%COMP%] {\n width: min(95vw, 700px);\n }\n .artifacts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .chat-input-container[_ngcontent-%COMP%] {\n padding: 0 0.75rem 0.75rem 0.75rem;\n }\n .scroll-to-bottom-icon[_ngcontent-%COMP%] {\n bottom: 16px;\n width: 36px;\n height: 36px;\n }\n \n\n .chat-content-area[_ngcontent-%COMP%] {\n position: relative;\n }\n .chat-artifact-pane[_ngcontent-%COMP%] {\n position: fixed;\n left: 0;\n right: 0;\n top: 56px; \n\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n background: var(--mj-bg-surface-card);\n }\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n\n@media (max-width: 480px) {\n .chat-header[_ngcontent-%COMP%] {\n padding: 6px 8px;\n gap: 4px;\n }\n .chat-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 700;\n }\n .project-tag[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n display: none;\n }\n .test-indicator[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n }\n .chat-members[_ngcontent-%COMP%], \n .artifact-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n }\n .action-btn[_ngcontent-%COMP%] {\n padding: 5px 7px;\n font-size: 11px;\n }\n .ambient-agent-indicator[_ngcontent-%COMP%] {\n font-size: 11px;\n padding: 3px 6px;\n }\n .project-selector-modal[_ngcontent-%COMP%], \n .artifacts-modal[_ngcontent-%COMP%] {\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n }\n .chat-input-container[_ngcontent-%COMP%] {\n padding: 0 0.5rem 0.5rem 0.5rem;\n }\n .scroll-to-bottom-icon[_ngcontent-%COMP%] {\n bottom: 12px;\n width: 32px;\n height: 32px;\n }\n .scroll-to-bottom-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n}\n\n\n\n.artifact-picker-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: var(--mj-bg-overlay);\n z-index: 999;\n}\n\n.artifact-picker-panel[_ngcontent-%COMP%] {\n position: fixed;\n right: 0;\n top: 0;\n width: 360px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 12px rgba(0, 0, 0, 0.1);\n animation: _ngcontent-%COMP%_slideInRight 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideInRight {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n.artifact-picker-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.artifact-picker-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n border-radius: 4px;\n}\n\n.artifact-picker-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n.artifact-picker-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n gap: 8px;\n}\n\n.artifact-picker-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.artifact-picker-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.artifact-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n width: 100%;\n transition: background 0.15s, border-color 0.15s;\n}\n\n.artifact-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file-pdf[_ngcontent-%COMP%] { color: #e53e3e; }\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file-excel[_ngcontent-%COMP%] { color: #38a169; }\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file-word[_ngcontent-%COMP%] { color: #3182ce; }\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file[_ngcontent-%COMP%] { color: var(--mj-text-muted); }\n\n.artifact-picker-item-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.artifact-picker-item-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.artifact-picker-item-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}"] });
|
|
3238
|
+
i0.ɵɵconditional(ctx.showImageViewer ? 19 : -1);
|
|
3239
|
+
} }, dependencies: [i12.MJButtonDirective, i10.ArtifactViewerPanelComponent, i13.TestFeedbackDialogComponent, i14.LoadingComponent, i15.GenericShareDialogComponent, i16.ArtifactCollectionPickerModalComponent, i17.ArtifactShareModalComponent, i18.MessageListComponent, i19.MessageInputComponent, i20.ConversationEmptyStateComponent, i21.ConversationAgentPickerComponent, i22.ConversationModePickerComponent, i23.ThreadPanelComponent, i24.ProjectSelectorComponent, i25.MembersModalComponent, i26.ExportModalComponent, i27.ImageViewerComponent, i28.PinnedMessagesPanelComponent], styles: ["[_nghost-%COMP%] {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.chat-area[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.chat-header[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: var(--mj-bg-surface-card);\n z-index: 10;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.chat-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n\n\n.sidebar-toggle-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%]:active {\n background: color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 18px;\n transition: color 0.15s ease;\n}\n\n.sidebar-toggle-btn[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n}\n\n.chat-title[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 999px;\n font-size: 12px;\n font-weight: 500;\n flex-shrink: 0;\n max-width: 240px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.shared-by-badge[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.project-tag[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n\n.project-tag[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-text-muted);\n}\n\n.project-tag[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.test-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-status-warning);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 8px;\n}\n\n.test-indicator[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.test-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n\n.pin-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, transparent);\n border-radius: 20px;\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pin-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n}\n\n.pin-chip[_ngcontent-%COMP%]:hover, \n.pin-chip.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.pin-chip-count[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 700;\n}\n\n.chat-members[_ngcontent-%COMP%], \n.artifact-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n padding: 6px 8px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.chat-members[_ngcontent-%COMP%]:hover, \n.artifact-indicator[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n\n\n.artifact-badge[_ngcontent-%COMP%], \n.members-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.members-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n}\n\n.ambient-agent-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n.ambient-agent-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n}\n.chat-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 150ms ease;\n}\n\n.action-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.share-btn.shared[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-brand-primary-hover);\n}\n\n.share-btn.shared[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.chat-content-area[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n\n.chat-messages-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: min(300px, 100%); \n\n overflow: hidden;\n transition: width 0.3s ease;\n}\n\n.chat-messages-pane.full-width[_ngcontent-%COMP%] {\n width: 100%;\n}\n\n.chat-messages-pane[_ngcontent-%COMP%]:not(.full-width) {\n flex: 1;\n}\n\n.chat-messages-pane.hidden[_ngcontent-%COMP%] {\n display: none;\n}\n\n.resize-handle[_ngcontent-%COMP%] {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.resize-handle[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary);\n}\n\n.resize-handle[_ngcontent-%COMP%]::before {\n content: \"\";\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n\n.chat-artifact-pane[_ngcontent-%COMP%] {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.chat-artifact-pane.maximized[_ngcontent-%COMP%] {\n width: 100% !important;\n}\n\n.chat-artifact-pane[_ngcontent-%COMP%] > mj-artifact-viewer-panel[_ngcontent-%COMP%] {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.chat-messages-wrapper[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n position: relative; \n\n}\n\n\n\n.upload-indicator-overlay[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1rem 1.5rem;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 95%, transparent);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n z-index: 100;\n pointer-events: none;\n}\n\n.chat-messages-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-surface-card);\n min-height: 0;\n position: relative;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%] {\n position: sticky;\n bottom: 21px;\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px;\n margin-left: auto;\n margin-right: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n transform: translateX(-50%) translateY(-2px);\n box-shadow: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent) 0 4px 12px;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-size: 16px;\n transition: color 0.2s;\n}\n\n.scroll-to-bottom-icon[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.chat-input-container[_ngcontent-%COMP%] {\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n padding: 0 1.25rem 1.25rem 1.25rem;\n overflow: visible;\n}\n\n.read-only-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 1.25rem 0.5rem 1.25rem;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n font-size: 12px;\n}\n\n.read-only-banner[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.loading-peripheral-placeholder[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px;\n padding: 24px;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 50%, transparent);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-in-out;\n}\n\n.modal-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.modal-content[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n\n.project-selector-modal[_ngcontent-%COMP%] {\n width: 600px;\n height: 500px;\n}\n\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.modal-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.toggle-system-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.toggle-system-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.toggle-system-btn.active[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.toggle-system-btn.active[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.toggle-system-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.modal-close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.modal-close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.modal-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n\n.artifacts-modal[_ngcontent-%COMP%] {\n width: 700px;\n max-height: 600px;\n}\n\n.artifacts-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n grid-column: 1/-1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n\n.artifact-modal-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n border: 1.5px solid var(--mj-border-default);\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.artifact-modal-card.expanded[_ngcontent-%COMP%] {\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n border-color: var(--mj-border-default);\n border-style: dashed;\n position: relative;\n}\n\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]::before {\n content: \"SYSTEM\";\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.artifact-modal-card.system-artifact[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-text-muted);\n box-shadow: var(--mj-shadow-md);\n}\n\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n\n.artifact-card-header[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-modal-card[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-2px);\n}\n\n.artifact-modal-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 10px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.artifact-modal-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.artifact-modal-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-modal-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.artifact-modal-meta[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.artifact-modal-action[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.artifact-modal-card[_ngcontent-%COMP%]:hover .artifact-modal-action[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n}\n.expand-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.artifact-versions-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-version-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n.artifact-version-item[_ngcontent-%COMP%] .version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n}\n.artifact-version-item[_ngcontent-%COMP%] .version-open-text[_ngcontent-%COMP%] {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n.artifact-version-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover .version-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover .version-open-text[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n.artifact-version-item[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.loading-peripheral-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n.loading-peripheral-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.conversation-loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n}\n.loading-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n.loading-content[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n\n\n@media (max-width: 768px) {\n .chat-header[_ngcontent-%COMP%] {\n padding: 8px 12px;\n gap: 6px;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n position: relative;\n }\n .chat-info[_ngcontent-%COMP%] {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n order: 1;\n }\n .chat-title[_ngcontent-%COMP%] {\n font-size: 15px;\n font-weight: 700;\n width: auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n }\n .project-tag[_ngcontent-%COMP%] {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n display: none; \n\n }\n .test-indicator[_ngcontent-%COMP%] {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n }\n \n\n .chat-actions-buttons[_ngcontent-%COMP%] {\n order: 2;\n flex-shrink: 0;\n }\n .chat-actions-buttons[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n min-width: auto;\n }\n .chat-actions-buttons[_ngcontent-%COMP%] .action-btn[_ngcontent-%COMP%] .btn-label[_ngcontent-%COMP%] {\n display: none;\n }\n .chat-actions[_ngcontent-%COMP%] {\n flex-wrap: nowrap;\n }\n .chat-members[_ngcontent-%COMP%], \n .artifact-indicator[_ngcontent-%COMP%] {\n padding: 5px 7px;\n font-size: 13px;\n }\n .action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n font-size: 12px;\n }\n .ambient-agent-indicator[_ngcontent-%COMP%] {\n font-size: 12px;\n padding: 4px 8px;\n }\n .project-selector-modal[_ngcontent-%COMP%] {\n width: min(95vw, 600px);\n height: auto;\n }\n .artifacts-modal[_ngcontent-%COMP%] {\n width: min(95vw, 700px);\n }\n .artifacts-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n .chat-input-container[_ngcontent-%COMP%] {\n padding: 0 0.75rem 0.75rem 0.75rem;\n }\n .scroll-to-bottom-icon[_ngcontent-%COMP%] {\n bottom: 16px;\n width: 36px;\n height: 36px;\n }\n \n\n .chat-content-area[_ngcontent-%COMP%] {\n position: relative;\n }\n .chat-artifact-pane[_ngcontent-%COMP%] {\n position: fixed;\n left: 0;\n right: 0;\n top: 56px; \n\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n background: var(--mj-bg-surface-card);\n }\n .resize-handle[_ngcontent-%COMP%] {\n display: none;\n }\n}\n\n\n@media (max-width: 480px) {\n .chat-header[_ngcontent-%COMP%] {\n padding: 6px 8px;\n gap: 4px;\n }\n .chat-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 700;\n }\n .project-tag[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n display: none;\n }\n .test-indicator[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n }\n .chat-members[_ngcontent-%COMP%], \n .artifact-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n }\n .action-btn[_ngcontent-%COMP%] {\n padding: 5px 7px;\n font-size: 11px;\n }\n .ambient-agent-indicator[_ngcontent-%COMP%] {\n font-size: 11px;\n padding: 3px 6px;\n }\n .project-selector-modal[_ngcontent-%COMP%], \n .artifacts-modal[_ngcontent-%COMP%] {\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n }\n .chat-input-container[_ngcontent-%COMP%] {\n padding: 0 0.5rem 0.5rem 0.5rem;\n }\n .scroll-to-bottom-icon[_ngcontent-%COMP%] {\n bottom: 12px;\n width: 32px;\n height: 32px;\n }\n .scroll-to-bottom-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n}\n\n\n\n.artifact-picker-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: var(--mj-bg-overlay);\n z-index: 999;\n}\n\n.artifact-picker-panel[_ngcontent-%COMP%] {\n position: fixed;\n right: 0;\n top: 0;\n width: 360px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 12px rgba(0, 0, 0, 0.1);\n animation: _ngcontent-%COMP%_slideInRight 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideInRight {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n.artifact-picker-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.artifact-picker-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n border-radius: 4px;\n}\n\n.artifact-picker-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n.artifact-picker-empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n gap: 8px;\n}\n\n.artifact-picker-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.artifact-picker-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.artifact-picker-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n width: 100%;\n transition: background 0.15s, border-color 0.15s;\n}\n\n.artifact-picker-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-picker-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file-pdf[_ngcontent-%COMP%] { color: #e53e3e; }\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file-excel[_ngcontent-%COMP%] { color: #38a169; }\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file-word[_ngcontent-%COMP%] { color: #3182ce; }\n.artifact-picker-item[_ngcontent-%COMP%] i.fa-file[_ngcontent-%COMP%] { color: var(--mj-text-muted); }\n\n.artifact-picker-item-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.artifact-picker-item-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.artifact-picker-item-meta[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}"] });
|
|
3023
3240
|
}
|
|
3024
3241
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationChatAreaComponent, [{
|
|
3025
3242
|
type: Component,
|
|
3026
|
-
args: [{ standalone: false, selector: 'mj-conversation-chat-area', template: "<div class=\"chat-area\">\n <!-- Fixed Header -->\n @if (conversation) {\n <div class=\"chat-header\">\n <div class=\"chat-info\" [class.with-sidebar-toggle]=\"showSidebarToggle\">\n @if (showSidebarToggle) {\n <button class=\"sidebar-toggle-btn\"\n (click)=\"sidebarToggleClicked.emit()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n <div class=\"chat-title\">{{ conversation.Name || '' }}</div>\n @if (sharedByBadge) {\n <span class=\"shared-by-badge\" [title]=\"sharedByBadge.fullTooltip\">\n <i class=\"fas fa-share-nodes\"></i>\n <span>Shared by {{ sharedByBadge.display }}</span>\n </span>\n }\n @if (conversation.ProjectID) {\n <button class=\"project-tag\" (click)=\"openProjectSelector()\" title=\"Assign to project\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ conversation.Project || 'Project' }}</span>\n </button>\n }\n @if (conversation.TestRunID) {\n <button class=\"test-indicator\" (click)=\"viewTestRun(conversation.TestRunID)\" title=\"View Test Run\">\n <i class=\"fas fa-flask\"></i>\n <span>Test</span>\n </button>\n }\n </div>\n <div class=\"chat-actions chat-actions-buttons\">\n @if (pinnedMessages.length > 0) {\n <button class=\"pin-chip\" [class.active]=\"showPinsPanel\" (click)=\"showPinsPanel = !showPinsPanel\" title=\"View pinned messages\">\n <i class=\"fas fa-thumbtack\"></i>\n <span class=\"pin-chip-count\">{{ pinnedMessages.length }}</span>\n </button>\n }\n @if (showArtifactIndicator && artifactCountDisplay > 0) {\n <button class=\"artifact-indicator\" (click)=\"viewArtifacts()\" title=\"View artifacts\">\n <i class=\"fas fa-cube\"></i>\n <span class=\"artifact-badge\">{{ artifactCountDisplay }}</span>\n </button>\n }\n @if (memberCount > 1) {\n <button class=\"chat-members\" (click)=\"toggleMembersModal()\" title=\"View members\">\n <i class=\"fas fa-users\"></i>\n <span class=\"members-badge\">{{ memberCount }}</span>\n </button>\n }\n @if (showExportButton) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n <span class=\"btn-label\">Export</span>\n </button>\n }\n @if (showShareButton && canShareConversation) {\n <button mjButton variant=\"flat\" size=\"sm\"\n [class.shared]=\"isShared\"\n (click)=\"shareConversation()\"\n [title]=\"isShared ? 'Manage sharing' : 'Share conversation'\">\n <i class=\"fas fa-share-nodes\"></i>\n <span class=\"btn-label\">Share</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages and Artifact Split Layout -->\n <div class=\"chat-content-area\">\n <!-- Messages Pane -->\n <div class=\"chat-messages-pane\"\n [class.full-width]=\"!showArtifactPanel\"\n [class.hidden]=\"isArtifactPaneMaximized\">\n @if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads (checked FIRST to prevent empty state flash) -->\n <div class=\"conversation-loading-state\">\n <mj-loading text=\"Loading conversation...\" size=\"large\"></mj-loading>\n </div>\n } @else if (isNewConversation || !conversationId) {\n <!-- Empty State - No conversation selected OR new unsaved conversation -->\n <mj-conversation-empty-state\n [currentUser]=\"currentUser\"\n [disabled]=\"isProcessing\"\n [showSidebarToggle]=\"showSidebarToggle\"\n [overlayMode]=\"overlayMode\"\n [greeting]=\"emptyStateGreeting\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n (sidebarToggleClicked)=\"sidebarToggleClicked.emit()\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else {\n <!-- Normal Message View -->\n <div class=\"chat-messages-wrapper\">\n <!-- Upload Indicator Overlay (centered in conversation area) -->\n @if (isUploadingAttachments) {\n <div class=\"upload-indicator-overlay\">\n <mj-loading [text]=\"uploadingMessage\" size=\"medium\"></mj-loading>\n </div>\n }\n <div class=\"chat-messages-container\" #scrollContainer (scroll)=\"checkScroll()\">\n <mj-conversation-message-list\n [messages]=\"messages\"\n [conversation]=\"conversation\"\n [currentUser]=\"currentUser\"\n [isProcessing]=\"isProcessing\"\n [artifactMap]=\"effectiveArtifactsMap\"\n [agentRunMap]=\"agentRunsByDetailId\"\n [ratingsMap]=\"ratingsByDetailId\"\n [userAvatarMap]=\"userAvatarMap\"\n [attachmentsMap]=\"attachmentsByDetailId\"\n (replyInThread)=\"onReplyInThread($event)\"\n (viewThread)=\"onViewThread($event)\"\n (deleteMessage)=\"onDeleteMessage($event)\"\n (retryMessage)=\"onRetryMessage($event)\"\n (testFeedbackMessage)=\"onTestFeedbackMessage($event)\"\n (artifactClicked)=\"onArtifactClicked($event)\"\n (messageEdited)=\"onMessageEdited($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (suggestedResponseSelected)=\"onSuggestedResponseSelected($event)\"\n (attachmentClicked)=\"onAttachmentClicked($event)\"\n (diagnosticRequested)=\"onDiagnosticRequested($event)\"\n (messagePinToggled)=\"onMessagePinToggled($event)\">\n </mj-conversation-message-list>\n\n <!-- Scroll to Bottom Icon (positioned within scroll container for proper centering) -->\n @if (showScrollToBottomIcon && messages && messages.length > 0) {\n <span class=\"scroll-to-bottom-icon\" style=\"left: 50%;\"\n (click)=\"scrollToBottomAnimate()\">\n <i class=\"fas fa-arrow-down\"></i>\n </span>\n }\n </div>\n\n <!-- Fixed Input Area -->\n <div class=\"chat-input-container\">\n @if (isLoadingPeripheralData) {\n <!-- Loading State -->\n <div class=\"loading-peripheral-placeholder\">\n <mj-loading text=\"Loading conversation data...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n @if (isReadOnlyView) {\n <div class=\"read-only-banner\" role=\"status\">\n <i class=\"fas fa-eye\"></i>\n <span>You have view-only access to this conversation.</span>\n </div>\n }\n <!-- Input Component - Multiple instances cached, only one visible -->\n <div class=\"message-input-container-wrapper\">\n @for (inputRef of getCachedInputs(); track inputRef.conversationId) {\n <mj-message-input\n #messageInput\n [hidden]=\"inputRef.conversationId !== conversationId\"\n [conversationId]=\"inputRef.conversationId\"\n [conversationName]=\"inputRef.conversationName\"\n [currentUser]=\"currentUser\"\n [conversationHistory]=\"inputRef.conversationId === conversationId ? messages : []\"\n [artifactsByDetailId]=\"inputRef.conversationId === conversationId ? artifactsByDetailId : emptyArtifactsMap\"\n [systemArtifactsByDetailId]=\"inputRef.conversationId === conversationId ? systemArtifactsByDetailId : emptyArtifactsMap\"\n [agentRunsByDetailId]=\"inputRef.conversationId === conversationId ? agentRunsByDetailId : emptyAgentRunsMap\"\n [appContext]=\"appContext\"\n [inProgressMessageIds]=\"inputRef.conversationId === conversationId ? inProgressMessageIds : emptyInProgressIds\"\n [disabled]=\"isProcessing || isReadOnlyView\"\n [enableAttachments]=\"enableAttachments\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n [initialMessage]=\"inputRef.conversationId === conversationId ? pendingMessage : null\"\n [initialAttachments]=\"inputRef.conversationId === conversationId ? pendingAttachments : null\"\n (messageSent)=\"onMessageSent($event)\"\n (agentResponse)=\"onAgentResponse($event)\"\n (agentRunDetected)=\"onAgentRunDetected($event)\"\n (agentRunUpdate)=\"onAgentRunUpdate($event)\"\n (messageComplete)=\"onMessageComplete($event)\"\n (artifactCreated)=\"onArtifactCreated($event)\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (intentCheckStarted)=\"onIntentCheckStarted()\"\n (intentCheckCompleted)=\"onIntentCheckCompleted()\"\n (uploadStateChanged)=\"onUploadStateChanged($event)\">\n </mj-message-input>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Artifact Viewer Pane -->\n @if (showArtifactPanel && selectedArtifactId) {\n @if (!isArtifactPaneMaximized) {\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event)\" (touchstart)=\"onResizeTouchStart($event)\"></div>\n }\n <div class=\"chat-artifact-pane\"\n [style.width.%]=\"artifactPaneWidth\"\n [class.maximized]=\"isArtifactPaneMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"selectedVersionNumber\"\n [viewContext]=\"'conversation'\"\n [canShare]=\"canShareSelectedArtifact\"\n [canEdit]=\"canEditSelectedArtifact\"\n [isMaximized]=\"isArtifactPaneMaximized\"\n [refreshTrigger]=\"artifactViewerRefresh$\"\n (closed)=\"onCloseArtifactPanel()\"\n (saveToCollectionRequested)=\"onSaveToCollectionRequested($event)\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPane()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (analyzeRequested)=\"OnAnalyzeArtifact($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n\n <!-- Pinned Messages Panel (overlay) -->\n @if (showPinsPanel) {\n <mj-pinned-messages-panel\n [pinnedMessages]=\"pinnedMessages\"\n (closed)=\"showPinsPanel = false\"\n (jumpRequested)=\"onJumpToMessage($event)\"\n (unpinRequested)=\"onUnpinFromPanel($event)\">\n </mj-pinned-messages-panel>\n }\n </div>\n</div>\n\n<!-- Thread Panel -->\n@if (threadId) {\n <mj-thread-panel\n [parentMessageId]=\"threadId\"\n [conversationId]=\"conversationId || ''\"\n [currentUser]=\"currentUser\"\n (closed)=\"onLocalThreadClosed()\"\n (replyAdded)=\"onThreadReplyAdded($event)\">\n </mj-thread-panel>\n}\n\n<!-- Export Modal -->\n<mj-export-modal\n [isVisible]=\"showExportModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"onExportModalCancelled()\"\n (exported)=\"onExportModalComplete()\">\n</mj-export-modal>\n\n<!-- Share Dialog (generic, shared with dashboards) -->\n<mj-resource-share-dialog\n [Visible]=\"showShareModal\"\n [Context]=\"shareContext\"\n [Adapter]=\"shareAdapter\"\n (Result)=\"onShareDialogResult($event)\">\n</mj-resource-share-dialog>\n\n<!-- Members Modal -->\n<mj-members-modal\n [isVisible]=\"showMembersModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"showMembersModal = false\"\n (membersChanged)=\"showMembersModal = false\">\n</mj-members-modal>\n\n<!-- Project Selector Modal -->\n@if (showProjectSelector && conversation) {\n <div class=\"modal-overlay\" (click)=\"showProjectSelector = false\">\n <div class=\"modal-content project-selector-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Assign Project</h3>\n <button class=\"modal-close-btn\" (click)=\"showProjectSelector = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <mj-project-selector\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedProjectId]=\"conversation.ProjectID\"\n (projectSelected)=\"onProjectSelected($event)\">\n </mj-project-selector>\n </div>\n </div>\n </div>\n}\n\n<!-- Artifacts Modal -->\n@if (showArtifactsModal) {\n <div class=\"modal-overlay\" (click)=\"showArtifactsModal = false\">\n <div class=\"modal-content artifacts-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Conversation Artifacts</h3>\n <div class=\"modal-header-actions\">\n @if (hasSystemArtifacts) {\n <button class=\"toggle-system-btn\"\n [class.active]=\"showSystemArtifacts\"\n (click)=\"toggleSystemArtifacts()\"\n title=\"Toggle system artifacts visibility\">\n <i class=\"fas fa-cog\"></i>\n <span>{{ showSystemArtifacts ? 'Hide' : 'Show' }} System</span>\n </button>\n }\n <button class=\"modal-close-btn\" (click)=\"showArtifactsModal = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body artifacts-grid\">\n @if (artifactsByDetailId.size === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-cube\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <p style=\"color: var(--mj-text-muted); font-size: 14px;\">No artifacts in this conversation yet</p>\n </div>\n }\n @for (artifact of getArtifactsArray(); track artifact.artifactId) {\n <div class=\"artifact-modal-card\"\n [class.expanded]=\"expandedArtifactId === artifact.artifactId\"\n [class.system-artifact]=\"artifact.visibility === 'System Only'\">\n <!-- Main card header - click to open latest version -->\n <div class=\"artifact-card-header\" (click)=\"openArtifactFromModal(artifact.artifactId)\">\n <div class=\"artifact-modal-icon\">\n <i class=\"fas fa-file-code\"></i>\n </div>\n <div class=\"artifact-modal-info\">\n <div class=\"artifact-modal-title\">{{artifact.name}}</div>\n <div class=\"artifact-modal-meta\">\n @if (artifact.versionCount > 1) {\n {{artifact.versionCount}} versions\n } @else {\n 1 version\n }\n </div>\n </div>\n @if (artifact.versionCount > 1) {\n <button class=\"expand-btn\" (click)=\"toggleArtifactExpansion(artifact.artifactId, $event)\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedArtifactId !== artifact.artifactId\"\n [class.fa-chevron-up]=\"expandedArtifactId === artifact.artifactId\"></i>\n </button>\n }\n <div class=\"artifact-modal-action\">\n <i class=\"fas fa-external-link-alt\"></i>\n </div>\n </div>\n\n <!-- Expanded version list -->\n @if (expandedArtifactId === artifact.artifactId && artifact.versionCount > 1) {\n <div class=\"artifact-versions-list\">\n @for (version of artifact.versions; track version.versionId) {\n <div class=\"artifact-version-item\" (click)=\"openArtifactFromModal(artifact.artifactId, version.versionNumber); $event.stopPropagation()\">\n <span class=\"version-badge\">v{{version.versionNumber}}</span>\n <span class=\"version-open-text\">Open this version</span>\n <i class=\"fas fa-arrow-right\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Collection Picker Modal -->\n@if (showCollectionPicker) {\n <mj-artifact-collection-picker-modal\n [isOpen]=\"showCollectionPicker\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [excludeCollectionIds]=\"collectionPickerExcludedIds\"\n [artifactVersionId]=\"collectionPickerVersionId\"\n [artifactName]=\"collectionPickerArtifactName\"\n [artifactVersionNumber]=\"collectionPickerVersionNumber\"\n (completed)=\"onCollectionPickerCompleted($event)\"\n (cancelled)=\"onCollectionPickerCancelled()\">\n </mj-artifact-collection-picker-modal>\n}\n\n<!-- Test Feedback Dialog -->\n@if (testFeedbackDialogData) {\n <mj-test-feedback-dialog\n [data]=\"testFeedbackDialogData\"\n [visible]=\"showTestFeedbackDialog\"\n (closed)=\"onTestFeedbackDialogClosed($event)\">\n </mj-test-feedback-dialog>\n}\n\n<!-- Image Viewer Modal -->\n@if (showImageViewer) {\n <mj-image-viewer\n [imageUrl]=\"selectedImageUrl\"\n [alt]=\"selectedImageAlt\"\n [fileName]=\"selectedImageFileName\"\n [visible]=\"showImageViewer\"\n (closed)=\"onImageViewerClosed()\">\n </mj-image-viewer>\n}", styles: [":host {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.chat-area {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.chat-header {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: var(--mj-bg-surface-card);\n z-index: 10;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.chat-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n/* Sidebar toggle button in header */\n.sidebar-toggle-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.sidebar-toggle-btn:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.sidebar-toggle-btn:active {\n background: color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n}\n\n.sidebar-toggle-btn i {\n color: var(--mj-text-secondary);\n font-size: 18px;\n transition: color 0.15s ease;\n}\n\n.sidebar-toggle-btn:hover i {\n color: var(--mj-text-primary);\n}\n\n.chat-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 999px;\n font-size: 12px;\n font-weight: 500;\n flex-shrink: 0;\n max-width: 240px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge i {\n font-size: 10px;\n}\n\n.shared-by-badge span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.project-tag {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n\n.project-tag:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-text-muted);\n}\n\n.project-tag i {\n font-size: 10px;\n}\n\n.test-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-status-warning);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 8px;\n}\n\n.test-indicator:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.test-indicator i {\n font-size: 10px;\n}\n\n/* Pinned messages chip in chat header */\n.pin-chip {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, transparent);\n border-radius: 20px;\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pin-chip i {\n font-size: 11px;\n}\n\n.pin-chip:hover,\n.pin-chip.active {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.pin-chip-count {\n font-size: 12px;\n font-weight: 700;\n}\n\n.chat-members,\n.artifact-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n padding: 6px 8px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.chat-members:hover,\n.artifact-indicator:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Badge overlay for artifact and member counts */\n.artifact-badge,\n.members-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.members-badge {\n background: var(--mj-brand-primary);\n}\n\n.ambient-agent-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n animation: pulse 2s ease-in-out infinite;\n}\n\n.ambient-agent-indicator i {\n color: var(--mj-brand-primary);\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n}\n.chat-actions {\n display: flex;\n gap: 8px;\n}\n\n.action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 150ms ease;\n}\n\n.action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.share-btn.shared {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-brand-primary-hover);\n}\n\n.share-btn.shared:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.chat-content-area {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n\n.chat-messages-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: min(300px, 100%); /* Respect container bounds while maintaining minimum */\n overflow: hidden;\n transition: width 0.3s ease;\n}\n\n.chat-messages-pane.full-width {\n width: 100%;\n}\n\n.chat-messages-pane:not(.full-width) {\n flex: 1;\n}\n\n.chat-messages-pane.hidden {\n display: none;\n}\n\n.resize-handle {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.resize-handle:hover {\n background: var(--mj-brand-primary);\n}\n\n.resize-handle::before {\n content: \"\";\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n\n.chat-artifact-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.chat-artifact-pane.maximized {\n width: 100% !important;\n}\n\n.chat-artifact-pane > mj-artifact-viewer-panel {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.chat-messages-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n position: relative; /* For upload overlay positioning */\n}\n\n/* Upload indicator overlay - centered in conversation area */\n.upload-indicator-overlay {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1rem 1.5rem;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 95%, transparent);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n z-index: 100;\n pointer-events: none;\n}\n\n.chat-messages-container {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-surface-card);\n min-height: 0;\n position: relative;\n}\n\n.scroll-to-bottom-icon {\n position: sticky;\n bottom: 21px;\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px;\n margin-left: auto;\n margin-right: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n\n.scroll-to-bottom-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n transform: translateX(-50%) translateY(-2px);\n box-shadow: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent) 0 4px 12px;\n}\n\n.scroll-to-bottom-icon i {\n color: var(--mj-text-secondary);\n font-size: 16px;\n transition: color 0.2s;\n}\n\n.scroll-to-bottom-icon:hover i {\n color: var(--mj-brand-primary);\n}\n\n.chat-input-container {\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n padding: 0 1.25rem 1.25rem 1.25rem;\n overflow: visible;\n}\n\n.read-only-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 1.25rem 0.5rem 1.25rem;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n font-size: 12px;\n}\n\n.read-only-banner i {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.loading-peripheral-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px;\n padding: 24px;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 50%, transparent);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: fadeIn 0.2s ease-in-out;\n}\n\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.modal-content {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n\n.project-selector-modal {\n width: 600px;\n height: 500px;\n}\n\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n\n.modal-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.toggle-system-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.toggle-system-btn:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.toggle-system-btn.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.toggle-system-btn.active:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.toggle-system-btn i {\n font-size: 12px;\n}\n\n.modal-close-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.modal-close-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.modal-body {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n\n.artifacts-modal {\n width: 700px;\n max-height: 600px;\n}\n\n.artifacts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n\n.empty-state {\n grid-column: 1/-1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n\n.artifact-modal-card {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n border: 1.5px solid var(--mj-border-default);\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.artifact-modal-card.expanded {\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-modal-card.system-artifact {\n opacity: 0.85;\n border-color: var(--mj-border-default);\n border-style: dashed;\n position: relative;\n}\n\n.artifact-modal-card.system-artifact::before {\n content: \"SYSTEM\";\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.artifact-modal-card.system-artifact:hover {\n border-color: var(--mj-text-muted);\n box-shadow: var(--mj-shadow-md);\n}\n\n.artifact-card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n\n.artifact-card-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-modal-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-2px);\n}\n\n.artifact-modal-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 10px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.artifact-modal-icon i {\n font-size: 18px;\n}\n\n.artifact-modal-info {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-modal-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.artifact-modal-meta {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.artifact-modal-action {\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.artifact-modal-card:hover .artifact-modal-action {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n}\n.expand-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.artifact-versions-list {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-version-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.artifact-version-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n.artifact-version-item .version-badge {\n display: inline-block;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n}\n.artifact-version-item .version-open-text {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n.artifact-version-item i {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n.artifact-version-item:hover .version-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n.artifact-version-item:hover .version-open-text {\n color: var(--mj-brand-primary);\n}\n.artifact-version-item:hover i {\n color: var(--mj-brand-primary);\n}\n\n.loading-peripheral-content {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n.loading-peripheral-content i {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.conversation-loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n}\n.loading-content i {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n.loading-content span {\n font-weight: 500;\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .chat-header {\n padding: 8px 12px;\n gap: 6px;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n position: relative;\n }\n .chat-info {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n order: 1;\n }\n .chat-title {\n font-size: 15px;\n font-weight: 700;\n width: auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n }\n .project-tag {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n display: none; /* Hide on mobile to save space */\n }\n .test-indicator {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n }\n /* Action buttons - icon only on mobile */\n .chat-actions-buttons {\n order: 2;\n flex-shrink: 0;\n }\n .chat-actions-buttons .action-btn {\n padding: 6px 8px;\n min-width: auto;\n }\n .chat-actions-buttons .action-btn .btn-label {\n display: none;\n }\n .chat-actions {\n flex-wrap: nowrap;\n }\n .chat-members,\n .artifact-indicator {\n padding: 5px 7px;\n font-size: 13px;\n }\n .action-btn {\n padding: 6px 8px;\n font-size: 12px;\n }\n .ambient-agent-indicator {\n font-size: 12px;\n padding: 4px 8px;\n }\n .project-selector-modal {\n width: min(95vw, 600px);\n height: auto;\n }\n .artifacts-modal {\n width: min(95vw, 700px);\n }\n .artifacts-grid {\n grid-template-columns: 1fr;\n }\n .chat-input-container {\n padding: 0 0.75rem 0.75rem 0.75rem;\n }\n .scroll-to-bottom-icon {\n bottom: 16px;\n width: 36px;\n height: 36px;\n }\n /* Artifact pane - full width overlay on mobile, overlapping header */\n .chat-content-area {\n position: relative;\n }\n .chat-artifact-pane {\n position: fixed;\n left: 0;\n right: 0;\n top: 56px; /* 48px nav + 8px dark strip above blue border */\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n background: var(--mj-bg-surface-card);\n }\n .resize-handle {\n display: none;\n }\n}\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .chat-header {\n padding: 6px 8px;\n gap: 4px;\n }\n .chat-title {\n font-size: 14px;\n font-weight: 700;\n }\n .project-tag {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n display: none;\n }\n .test-indicator {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n }\n .chat-members,\n .artifact-indicator {\n padding: 4px 8px;\n font-size: 11px;\n }\n .action-btn {\n padding: 5px 7px;\n font-size: 11px;\n }\n .ambient-agent-indicator {\n font-size: 11px;\n padding: 3px 6px;\n }\n .project-selector-modal,\n .artifacts-modal {\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n }\n .chat-input-container {\n padding: 0 0.5rem 0.5rem 0.5rem;\n }\n .scroll-to-bottom-icon {\n bottom: 12px;\n width: 32px;\n height: 32px;\n }\n .scroll-to-bottom-icon i {\n font-size: 14px;\n }\n}\n\n/* Artifact Picker Panel */\n.artifact-picker-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: var(--mj-bg-overlay);\n z-index: 999;\n}\n\n.artifact-picker-panel {\n position: fixed;\n right: 0;\n top: 0;\n width: 360px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 12px rgba(0, 0, 0, 0.1);\n animation: slideInRight 0.2s ease-out;\n}\n\n@keyframes slideInRight {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n.artifact-picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.artifact-picker-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-close {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n border-radius: 4px;\n}\n\n.artifact-picker-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n.artifact-picker-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n gap: 8px;\n}\n\n.artifact-picker-hint {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.artifact-picker-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.artifact-picker-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n width: 100%;\n transition: background 0.15s, border-color 0.15s;\n}\n\n.artifact-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-picker-item i {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.artifact-picker-item i.fa-file-pdf { color: #e53e3e; }\n.artifact-picker-item i.fa-file-excel { color: #38a169; }\n.artifact-picker-item i.fa-file-word { color: #3182ce; }\n.artifact-picker-item i.fa-file { color: var(--mj-text-muted); }\n\n.artifact-picker-item-info {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.artifact-picker-item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.artifact-picker-item-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n"] }]
|
|
3027
|
-
}], () => [{ type: i1.AgentStateService }, { type: i2.ConversationAgentService }, { type: i3.ActiveTasksService }, { type: i0.ChangeDetectorRef }, { type: i4.MentionAutocompleteService }, { type: i5.ArtifactPermissionService }, { type: i6.ConversationAttachmentService }, { type: i7.ConversationStreamingService }, { type: i8.DialogService }, { type: i9.ConversationBridgeService }, { type: i10.AnalyzeArtifactService }, { type: i11.UICommandHandlerService }], { environmentId: [{
|
|
3243
|
+
args: [{ standalone: false, selector: 'mj-conversation-chat-area', template: "<div class=\"chat-area\">\n <!-- Fixed Header \u2014 also renders BEFORE a conversation exists when the\n embedder has pre-conversation chrome to surface (currently just the\n mode picker \u2014 agent / share / export / members / artifacts all\n require a conversation row and stay hidden). Lets embedded surfaces\n like the Form Builder cockpit show the mode picker above the\n empty-state on a fresh chat instead of waiting for the first\n message to round-trip. -->\n @if (conversation || HasPreConversationHeader) {\n <div class=\"chat-header\">\n <div class=\"chat-info\" [class.with-sidebar-toggle]=\"showSidebarToggle\">\n @if (showSidebarToggle) {\n <button class=\"sidebar-toggle-btn\"\n (click)=\"sidebarToggleClicked.emit()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n @if (conversation) {\n <div class=\"chat-title\">{{ conversation.Name || '' }}</div>\n }\n @if (sharedByBadge) {\n <span class=\"shared-by-badge\" [title]=\"sharedByBadge.fullTooltip\">\n <i class=\"fas fa-share-nodes\"></i>\n <span>Shared by {{ sharedByBadge.display }}</span>\n </span>\n }\n @if (conversation?.ProjectID) {\n <button class=\"project-tag\" (click)=\"openProjectSelector()\" title=\"Assign to project\">\n <i class=\"fas fa-folder\"></i>\n <span>{{ conversation!.Project || 'Project' }}</span>\n </button>\n }\n @if (conversation?.TestRunID) {\n <button class=\"test-indicator\" (click)=\"viewTestRun(conversation!.TestRunID!)\" title=\"View Test Run\">\n <i class=\"fas fa-flask\"></i>\n <span>Test</span>\n </button>\n }\n </div>\n <div class=\"chat-actions chat-actions-buttons\">\n @if (pinnedMessages.length > 0) {\n <button class=\"pin-chip\" [class.active]=\"showPinsPanel\" (click)=\"showPinsPanel = !showPinsPanel\" title=\"View pinned messages\">\n <i class=\"fas fa-thumbtack\"></i>\n <span class=\"pin-chip-count\">{{ pinnedMessages.length }}</span>\n </button>\n }\n @if (showArtifactIndicator && artifactCountDisplay > 0) {\n <button class=\"artifact-indicator\" (click)=\"viewArtifacts()\" title=\"View artifacts\">\n <i class=\"fas fa-cube\"></i>\n <span class=\"artifact-badge\">{{ artifactCountDisplay }}</span>\n </button>\n }\n @if (memberCount > 1) {\n <button class=\"chat-members\" (click)=\"toggleMembersModal()\" title=\"View members\">\n <i class=\"fas fa-users\"></i>\n <span class=\"members-badge\">{{ memberCount }}</span>\n </button>\n }\n @if (showAgentModePicker && ModePickerTargetAgentId) {\n <!-- Per-agent mode/quality picker (Draft / Standard / High).\n Targets the agent the next non-mention message will route\n to. Auto-hides when that agent has fewer than 2 configured\n presets. Choice persists per-user, per-agent via\n UserInfoEngine; emits the picked configuration ID up so\n <mj-message-input> can forward it on the next route. -->\n <mj-conversation-mode-picker\n [AgentID]=\"ModePickerTargetAgentId\"\n [Disabled]=\"isProcessing\"\n (PresetChanged)=\"OnAgentModePresetChanged($event)\">\n </mj-conversation-mode-picker>\n }\n @if (showAgentPicker && conversation) {\n <!-- Per-conversation default-agent pin. When set, non-mention\n messages route to this agent instead of Sage. Persists to\n MJConversationEntity.DefaultAgentID. Hidden when no\n conversation is loaded or when the embedder disables it. -->\n <mj-conversation-agent-picker\n [Conversation]=\"conversation\"\n [CurrentUser]=\"currentUser\"\n [Disabled]=\"isReadOnlyView\">\n </mj-conversation-agent-picker>\n }\n @if (showExportButton) {\n <button mjButton variant=\"flat\" size=\"sm\" (click)=\"exportConversation()\" title=\"Export conversation\">\n <i class=\"fas fa-download\"></i>\n <span class=\"btn-label\">Export</span>\n </button>\n }\n @if (showShareButton && canShareConversation) {\n <button mjButton variant=\"flat\" size=\"sm\"\n [class.shared]=\"isShared\"\n (click)=\"shareConversation()\"\n [title]=\"isShared ? 'Manage sharing' : 'Share conversation'\">\n <i class=\"fas fa-share-nodes\"></i>\n <span class=\"btn-label\">Share</span>\n </button>\n }\n </div>\n </div>\n }\n\n <!-- Messages and Artifact Split Layout -->\n <div class=\"chat-content-area\">\n <!-- Messages Pane -->\n <div class=\"chat-messages-pane\"\n [class.full-width]=\"!showArtifactPanel\"\n [class.hidden]=\"isArtifactPaneMaximized\">\n @if (isLoadingConversation) {\n <!-- Loading State - Show centered spinner while conversation loads (checked FIRST to prevent empty state flash) -->\n <div class=\"conversation-loading-state\">\n <mj-loading text=\"Loading conversation...\" size=\"large\"></mj-loading>\n </div>\n } @else if ((isNewConversation || !conversationId) && !suppressNewConversationEmptyState) {\n <!-- Empty State - No conversation selected OR new unsaved conversation -->\n <mj-conversation-empty-state\n [currentUser]=\"currentUser\"\n [disabled]=\"isProcessing\"\n [showSidebarToggle]=\"showSidebarToggle\"\n [overlayMode]=\"overlayMode\"\n [greeting]=\"emptyStateGreeting\"\n [enableAttachments]=\"enableAttachments && allowAttachments\"\n [enableMentions]=\"allowMentions\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n (sidebarToggleClicked)=\"sidebarToggleClicked.emit()\"\n (messageSent)=\"onEmptyStateMessageSent($event)\">\n </mj-conversation-empty-state>\n } @else if ((isNewConversation || !conversationId) && suppressNewConversationEmptyState) {\n <!-- Pre-conversation normal-view: empty message list + emptyStateMode input.\n Used when host (e.g. Form Builder cockpit) wants the header + mode picker\n visible on first open instead of the centered welcome card. First send\n routes through onEmptyStateMessageSent which creates the conversation. -->\n <div class=\"chat-messages-wrapper\">\n <div class=\"chat-messages-container\"></div>\n <div class=\"chat-input-container\">\n <div class=\"message-input-container-wrapper\">\n <mj-message-input\n [emptyStateMode]=\"true\"\n [currentUser]=\"currentUser\"\n [disabled]=\"isProcessing\"\n [enableAttachments]=\"enableAttachments && allowAttachments\"\n [enableMentions]=\"allowMentions\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n (emptyStateSubmit)=\"onEmptyStateMessageSent($event)\">\n </mj-message-input>\n </div>\n </div>\n </div>\n } @else {\n <!-- Normal Message View -->\n <div class=\"chat-messages-wrapper\">\n <!-- Upload Indicator Overlay (centered in conversation area) -->\n @if (isUploadingAttachments) {\n <div class=\"upload-indicator-overlay\">\n <mj-loading [text]=\"uploadingMessage\" size=\"medium\"></mj-loading>\n </div>\n }\n <div class=\"chat-messages-container\" #scrollContainer (scroll)=\"checkScroll()\">\n <mj-conversation-message-list\n [messages]=\"messages\"\n [conversation]=\"conversation\"\n [currentUser]=\"currentUser\"\n [isProcessing]=\"isProcessing\"\n [artifactMap]=\"effectiveArtifactsMap\"\n [agentRunMap]=\"agentRunsByDetailId\"\n [ratingsMap]=\"ratingsByDetailId\"\n [userAvatarMap]=\"userAvatarMap\"\n [attachmentsMap]=\"attachmentsByDetailId\"\n (replyInThread)=\"onReplyInThread($event)\"\n (viewThread)=\"onViewThread($event)\"\n (deleteMessage)=\"onDeleteMessage($event)\"\n (retryMessage)=\"onRetryMessage($event)\"\n (testFeedbackMessage)=\"onTestFeedbackMessage($event)\"\n (artifactClicked)=\"onArtifactClicked($event)\"\n (messageEdited)=\"onMessageEdited($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (suggestedResponseSelected)=\"onSuggestedResponseSelected($event)\"\n (attachmentClicked)=\"onAttachmentClicked($event)\"\n (diagnosticRequested)=\"onDiagnosticRequested($event)\"\n (messagePinToggled)=\"onMessagePinToggled($event)\">\n </mj-conversation-message-list>\n\n <!-- Scroll to Bottom Icon (positioned within scroll container for proper centering) -->\n @if (showScrollToBottomIcon && messages && messages.length > 0) {\n <span class=\"scroll-to-bottom-icon\" style=\"left: 50%;\"\n (click)=\"scrollToBottomAnimate()\">\n <i class=\"fas fa-arrow-down\"></i>\n </span>\n }\n </div>\n\n <!-- Fixed Input Area -->\n <div class=\"chat-input-container\">\n @if (isLoadingPeripheralData) {\n <!-- Loading State -->\n <div class=\"loading-peripheral-placeholder\">\n <mj-loading text=\"Loading conversation data...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n @if (isReadOnlyView) {\n <div class=\"read-only-banner\" role=\"status\">\n <i class=\"fas fa-eye\"></i>\n <span>You have view-only access to this conversation.</span>\n </div>\n }\n <!-- Input Component - Multiple instances cached, only one visible -->\n <div class=\"message-input-container-wrapper\">\n @for (inputRef of getCachedInputs(); track inputRef.conversationId) {\n <mj-message-input\n #messageInput\n [hidden]=\"inputRef.conversationId !== conversationId\"\n [conversationId]=\"inputRef.conversationId\"\n [conversationName]=\"inputRef.conversationName\"\n [currentUser]=\"currentUser\"\n [conversationHistory]=\"inputRef.conversationId === conversationId ? messages : []\"\n [artifactsByDetailId]=\"inputRef.conversationId === conversationId ? artifactsByDetailId : emptyArtifactsMap\"\n [systemArtifactsByDetailId]=\"inputRef.conversationId === conversationId ? systemArtifactsByDetailId : emptyArtifactsMap\"\n [agentRunsByDetailId]=\"inputRef.conversationId === conversationId ? agentRunsByDetailId : emptyAgentRunsMap\"\n [appContext]=\"appContext\"\n [defaultAgentId]=\"defaultAgentId\"\n [conversationDefaultAgentId]=\"inputRef.conversationId === conversationId ? (conversation?.DefaultAgentID ?? null) : null\"\n [agentConfigurationPresetId]=\"inputRef.conversationId === conversationId ? ActiveAgentConfigurationPresetId : null\"\n [inProgressMessageIds]=\"inputRef.conversationId === conversationId ? inProgressMessageIds : emptyInProgressIds\"\n [disabled]=\"isProcessing || isReadOnlyView\"\n [enableAttachments]=\"enableAttachments && allowAttachments\"\n [enableMentions]=\"allowMentions\"\n [maxAttachments]=\"maxAttachments\"\n [maxAttachmentSizeBytes]=\"maxAttachmentSizeBytes\"\n [acceptedFileTypes]=\"acceptedFileTypes\"\n [initialMessage]=\"inputRef.conversationId === conversationId ? pendingMessage : null\"\n [initialAttachments]=\"inputRef.conversationId === conversationId ? pendingAttachments : null\"\n (messageSent)=\"onMessageSent($event)\"\n (agentResponse)=\"onAgentResponse($event)\"\n (agentRunDetected)=\"onAgentRunDetected($event)\"\n (agentRunUpdate)=\"onAgentRunUpdate($event)\"\n (messageComplete)=\"onMessageComplete($event)\"\n (artifactCreated)=\"onArtifactCreated($event)\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (intentCheckStarted)=\"onIntentCheckStarted()\"\n (intentCheckCompleted)=\"onIntentCheckCompleted()\"\n (uploadStateChanged)=\"onUploadStateChanged($event)\">\n </mj-message-input>\n }\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Artifact Viewer Pane -->\n @if (showArtifactPanel && selectedArtifactId) {\n @if (!isArtifactPaneMaximized) {\n <div class=\"resize-handle\" (mousedown)=\"onResizeStart($event)\" (touchstart)=\"onResizeTouchStart($event)\"></div>\n }\n <div class=\"chat-artifact-pane\"\n [style.width.%]=\"artifactPaneWidth\"\n [class.maximized]=\"isArtifactPaneMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"selectedArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"selectedVersionNumber\"\n [viewContext]=\"'conversation'\"\n [canShare]=\"canShareSelectedArtifact\"\n [canEdit]=\"canEditSelectedArtifact\"\n [isMaximized]=\"isArtifactPaneMaximized\"\n [refreshTrigger]=\"artifactViewerRefresh$\"\n (closed)=\"onCloseArtifactPanel()\"\n (saveToCollectionRequested)=\"onSaveToCollectionRequested($event)\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPane()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (analyzeRequested)=\"OnAnalyzeArtifact($event)\"\n (applyFormRequested)=\"OnApplyFormRequested($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n\n <!-- Pinned Messages Panel (overlay) -->\n @if (showPinsPanel) {\n <mj-pinned-messages-panel\n [pinnedMessages]=\"pinnedMessages\"\n (closed)=\"showPinsPanel = false\"\n (jumpRequested)=\"onJumpToMessage($event)\"\n (unpinRequested)=\"onUnpinFromPanel($event)\">\n </mj-pinned-messages-panel>\n }\n </div>\n</div>\n\n<!-- Thread Panel -->\n@if (threadId) {\n <mj-thread-panel\n [parentMessageId]=\"threadId\"\n [conversationId]=\"conversationId || ''\"\n [currentUser]=\"currentUser\"\n (closed)=\"onLocalThreadClosed()\"\n (replyAdded)=\"onThreadReplyAdded($event)\">\n </mj-thread-panel>\n}\n\n<!-- Export Modal -->\n<mj-export-modal\n [isVisible]=\"showExportModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"onExportModalCancelled()\"\n (exported)=\"onExportModalComplete()\">\n</mj-export-modal>\n\n<!-- Share Dialog (generic, shared with dashboards) -->\n<mj-resource-share-dialog\n [Visible]=\"showShareModal\"\n [Context]=\"shareContext\"\n [Adapter]=\"shareAdapter\"\n (Result)=\"onShareDialogResult($event)\">\n</mj-resource-share-dialog>\n\n<!-- Members Modal -->\n<mj-members-modal\n [isVisible]=\"showMembersModal\"\n [conversation]=\"conversation || undefined\"\n [currentUser]=\"currentUser\"\n (cancelled)=\"showMembersModal = false\"\n (membersChanged)=\"showMembersModal = false\">\n</mj-members-modal>\n\n<!-- Project Selector Modal -->\n@if (showProjectSelector && conversation) {\n <div class=\"modal-overlay\" (click)=\"showProjectSelector = false\">\n <div class=\"modal-content project-selector-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Assign Project</h3>\n <button class=\"modal-close-btn\" (click)=\"showProjectSelector = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"modal-body\">\n <mj-project-selector\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedProjectId]=\"conversation.ProjectID\"\n (projectSelected)=\"onProjectSelected($event)\">\n </mj-project-selector>\n </div>\n </div>\n </div>\n}\n\n<!-- Artifacts Modal -->\n@if (showArtifactsModal) {\n <div class=\"modal-overlay\" (click)=\"showArtifactsModal = false\">\n <div class=\"modal-content artifacts-modal\" (click)=\"$event.stopPropagation()\">\n <div class=\"modal-header\">\n <h3>Conversation Artifacts</h3>\n <div class=\"modal-header-actions\">\n @if (hasSystemArtifacts) {\n <button class=\"toggle-system-btn\"\n [class.active]=\"showSystemArtifacts\"\n (click)=\"toggleSystemArtifacts()\"\n title=\"Toggle system artifacts visibility\">\n <i class=\"fas fa-cog\"></i>\n <span>{{ showSystemArtifacts ? 'Hide' : 'Show' }} System</span>\n </button>\n }\n <button class=\"modal-close-btn\" (click)=\"showArtifactsModal = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-body artifacts-grid\">\n @if (artifactsByDetailId.size === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-cube\" style=\"font-size: 48px; color: var(--mj-text-muted); margin-bottom: 16px;\"></i>\n <p style=\"color: var(--mj-text-muted); font-size: 14px;\">No artifacts in this conversation yet</p>\n </div>\n }\n @for (artifact of getArtifactsArray(); track artifact.artifactId) {\n <div class=\"artifact-modal-card\"\n [class.expanded]=\"expandedArtifactId === artifact.artifactId\"\n [class.system-artifact]=\"artifact.visibility === 'System Only'\">\n <!-- Main card header - click to open latest version -->\n <div class=\"artifact-card-header\" (click)=\"openArtifactFromModal(artifact.artifactId)\">\n <div class=\"artifact-modal-icon\">\n <i class=\"fas fa-file-code\"></i>\n </div>\n <div class=\"artifact-modal-info\">\n <div class=\"artifact-modal-title\">{{artifact.name}}</div>\n <div class=\"artifact-modal-meta\">\n @if (artifact.versionCount > 1) {\n {{artifact.versionCount}} versions\n } @else {\n 1 version\n }\n </div>\n </div>\n @if (artifact.versionCount > 1) {\n <button class=\"expand-btn\" (click)=\"toggleArtifactExpansion(artifact.artifactId, $event)\">\n <i class=\"fas\" [class.fa-chevron-down]=\"expandedArtifactId !== artifact.artifactId\"\n [class.fa-chevron-up]=\"expandedArtifactId === artifact.artifactId\"></i>\n </button>\n }\n <div class=\"artifact-modal-action\">\n <i class=\"fas fa-external-link-alt\"></i>\n </div>\n </div>\n\n <!-- Expanded version list -->\n @if (expandedArtifactId === artifact.artifactId && artifact.versionCount > 1) {\n <div class=\"artifact-versions-list\">\n @for (version of artifact.versions; track version.versionId) {\n <div class=\"artifact-version-item\" (click)=\"openArtifactFromModal(artifact.artifactId, version.versionNumber); $event.stopPropagation()\">\n <span class=\"version-badge\">v{{version.versionNumber}}</span>\n <span class=\"version-open-text\">Open this version</span>\n <i class=\"fas fa-arrow-right\"></i>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Collection Picker Modal -->\n@if (showCollectionPicker) {\n <mj-artifact-collection-picker-modal\n [isOpen]=\"showCollectionPicker\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [excludeCollectionIds]=\"collectionPickerExcludedIds\"\n [artifactVersionId]=\"collectionPickerVersionId\"\n [artifactName]=\"collectionPickerArtifactName\"\n [artifactVersionNumber]=\"collectionPickerVersionNumber\"\n (completed)=\"onCollectionPickerCompleted($event)\"\n (cancelled)=\"onCollectionPickerCancelled()\">\n </mj-artifact-collection-picker-modal>\n}\n\n<!-- Test Feedback Dialog -->\n@if (testFeedbackDialogData) {\n <mj-test-feedback-dialog\n [data]=\"testFeedbackDialogData\"\n [visible]=\"showTestFeedbackDialog\"\n (closed)=\"onTestFeedbackDialogClosed($event)\">\n </mj-test-feedback-dialog>\n}\n\n<!-- Image Viewer Modal -->\n@if (showImageViewer) {\n <mj-image-viewer\n [imageUrl]=\"selectedImageUrl\"\n [alt]=\"selectedImageAlt\"\n [fileName]=\"selectedImageFileName\"\n [visible]=\"showImageViewer\"\n (closed)=\"onImageViewerClosed()\">\n </mj-image-viewer>\n}", styles: [":host {\n display: flex;\n width: 100%;\n height: 100%;\n}\n\n.chat-area {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.chat-header {\n flex-shrink: 0;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 16px;\n background: var(--mj-bg-surface-card);\n z-index: 10;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.chat-info {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n min-width: 0;\n}\n\n/* Sidebar toggle button in header */\n.sidebar-toggle-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s ease;\n flex-shrink: 0;\n}\n\n.sidebar-toggle-btn:hover {\n background: color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n}\n\n.sidebar-toggle-btn:active {\n background: color-mix(in srgb, var(--mj-text-primary) 12%, transparent);\n}\n\n.sidebar-toggle-btn i {\n color: var(--mj-text-secondary);\n font-size: 18px;\n transition: color 0.15s ease;\n}\n\n.sidebar-toggle-btn:hover i {\n color: var(--mj-text-primary);\n}\n\n.chat-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-brand-primary);\n border-radius: 999px;\n font-size: 12px;\n font-weight: 500;\n flex-shrink: 0;\n max-width: 240px;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.shared-by-badge i {\n font-size: 10px;\n}\n\n.shared-by-badge span {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.project-tag {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 12px;\n}\n\n.project-tag:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-text-muted);\n}\n\n.project-tag i {\n font-size: 10px;\n}\n\n.test-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n border: 1px solid var(--mj-status-warning);\n border-radius: 16px;\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-status-warning);\n cursor: pointer;\n transition: all 0.2s;\n height: 28px;\n margin-left: 8px;\n}\n\n.test-indicator:hover {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.test-indicator i {\n font-size: 10px;\n}\n\n/* Pinned messages chip in chat header */\n.pin-chip {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 5px 10px;\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-warning) 45%, transparent);\n border-radius: 20px;\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n}\n\n.pin-chip i {\n font-size: 11px;\n}\n\n.pin-chip:hover,\n.pin-chip.active {\n background: color-mix(in srgb, var(--mj-status-warning) 20%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning);\n}\n\n.pin-chip-count {\n font-size: 12px;\n font-weight: 700;\n}\n\n.chat-members,\n.artifact-indicator {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n padding: 6px 8px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 14px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.chat-members:hover,\n.artifact-indicator:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n/* Badge overlay for artifact and member counts */\n.artifact-badge,\n.members-badge {\n position: absolute;\n top: -6px;\n right: -6px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n line-height: 1;\n}\n\n.members-badge {\n background: var(--mj-brand-primary);\n}\n\n.ambient-agent-indicator {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n animation: pulse 2s ease-in-out infinite;\n}\n\n.ambient-agent-indicator i {\n color: var(--mj-brand-primary);\n}\n\n@keyframes pulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.7;\n }\n}\n.chat-actions {\n display: flex;\n gap: 8px;\n}\n\n.action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n transition: all 150ms ease;\n}\n\n.action-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.share-btn.shared {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-color: var(--mj-brand-primary-hover);\n color: var(--mj-brand-primary-hover);\n}\n\n.share-btn.shared:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n.chat-content-area {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n display: flex;\n flex-direction: row;\n position: relative;\n}\n\n.chat-messages-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n min-width: min(300px, 100%); /* Respect container bounds while maintaining minimum */\n overflow: hidden;\n transition: width 0.3s ease;\n}\n\n.chat-messages-pane.full-width {\n width: 100%;\n}\n\n.chat-messages-pane:not(.full-width) {\n flex: 1;\n}\n\n.chat-messages-pane.hidden {\n display: none;\n}\n\n.resize-handle {\n width: 4px;\n background: transparent;\n cursor: col-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.resize-handle:hover {\n background: var(--mj-brand-primary);\n}\n\n.resize-handle::before {\n content: \"\";\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n}\n\n.chat-artifact-pane {\n height: 100%;\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-sunken);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.chat-artifact-pane.maximized {\n width: 100% !important;\n}\n\n.chat-artifact-pane > mj-artifact-viewer-panel {\n display: flex;\n flex: 1;\n min-height: 0;\n overflow: hidden;\n}\n\n.chat-messages-wrapper {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n position: relative; /* For upload overlay positioning */\n}\n\n/* Upload indicator overlay - centered in conversation area */\n.upload-indicator-overlay {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1rem 1.5rem;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 95%, transparent);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n z-index: 100;\n pointer-events: none;\n}\n\n.chat-messages-container {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background: var(--mj-bg-surface-card);\n min-height: 0;\n position: relative;\n}\n\n.scroll-to-bottom-icon {\n position: sticky;\n bottom: 21px;\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 40px;\n margin-top: -40px;\n margin-left: auto;\n margin-right: auto;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n box-shadow: var(--mj-shadow-md);\n transition: all 0.2s ease;\n z-index: 100;\n pointer-events: auto;\n}\n\n.scroll-to-bottom-icon:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-brand-primary);\n transform: translateX(-50%) translateY(-2px);\n box-shadow: color-mix(in srgb, var(--mj-brand-primary) 20%, transparent) 0 4px 12px;\n}\n\n.scroll-to-bottom-icon i {\n color: var(--mj-text-secondary);\n font-size: 16px;\n transition: color 0.2s;\n}\n\n.scroll-to-bottom-icon:hover i {\n color: var(--mj-brand-primary);\n}\n\n.chat-input-container {\n flex-shrink: 0;\n background: var(--mj-bg-surface-card);\n padding: 0 1.25rem 1.25rem 1.25rem;\n overflow: visible;\n}\n\n.read-only-banner {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 0 1.25rem 0.5rem 1.25rem;\n padding: 8px 12px;\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n color: var(--mj-text-secondary);\n border-radius: 6px;\n font-size: 12px;\n}\n\n.read-only-banner i {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.loading-peripheral-placeholder {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 140px;\n padding: 24px;\n background: color-mix(in srgb, var(--mj-bg-surface-card) 50%, transparent);\n backdrop-filter: blur(2px);\n border-radius: 12px;\n margin: 12px;\n animation: fadeIn 0.2s ease-in-out;\n}\n\n.modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.modal-content {\n background: var(--mj-bg-surface-card);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-md);\n max-width: 90vw;\n max-height: 90vh;\n display: flex;\n flex-direction: column;\n}\n\n.project-selector-modal {\n width: 600px;\n height: 500px;\n}\n\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.modal-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n}\n\n.modal-header-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.toggle-system-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 6px 12px;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n transition: all 0.2s;\n}\n\n.toggle-system-btn:hover {\n background: var(--mj-border-default);\n border-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.toggle-system-btn.active {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.toggle-system-btn.active:hover {\n background: var(--mj-brand-primary-hover);\n border-color: var(--mj-brand-primary-hover);\n}\n\n.toggle-system-btn i {\n font-size: 12px;\n}\n\n.modal-close-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-secondary);\n padding: 4px 8px;\n border-radius: 4px;\n transition: all 0.2s;\n}\n\n.modal-close-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.modal-body {\n flex: 1;\n overflow: auto;\n padding: 20px;\n}\n\n.artifacts-modal {\n width: 700px;\n max-height: 600px;\n}\n\n.artifacts-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 16px;\n}\n\n.empty-state {\n grid-column: 1/-1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n\n.artifact-modal-card {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface-card);\n border: 1.5px solid var(--mj-border-default);\n border-radius: 12px;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n overflow: hidden;\n}\n\n.artifact-modal-card.expanded {\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-modal-card.system-artifact {\n opacity: 0.85;\n border-color: var(--mj-border-default);\n border-style: dashed;\n position: relative;\n}\n\n.artifact-modal-card.system-artifact::before {\n content: \"SYSTEM\";\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.artifact-modal-card.system-artifact:hover {\n border-color: var(--mj-text-muted);\n box-shadow: var(--mj-shadow-md);\n}\n\n.artifact-card-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px;\n cursor: pointer;\n}\n\n.artifact-card-header:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-modal-card:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-2px);\n}\n\n.artifact-modal-icon {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border-radius: 10px;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n}\n\n.artifact-modal-icon i {\n font-size: 18px;\n}\n\n.artifact-modal-info {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-modal-title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n margin-bottom: 4px;\n}\n\n.artifact-modal-meta {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.artifact-modal-action {\n color: var(--mj-text-muted);\n transition: color 0.2s;\n}\n\n.artifact-modal-card:hover .artifact-modal-action {\n color: var(--mj-brand-primary);\n}\n\n.expand-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: var(--mj-text-secondary);\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n}\n.expand-btn:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-brand-primary);\n}\n\n.artifact-versions-list {\n display: flex;\n flex-direction: column;\n padding: 0 1rem 1rem 1rem;\n background: var(--mj-bg-surface-sunken);\n}\n\n.artifact-version-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px 12px 68px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.artifact-version-item:hover {\n background: var(--mj-bg-surface-sunken);\n}\n.artifact-version-item .version-badge {\n display: inline-block;\n padding: 4px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 12px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n}\n.artifact-version-item .version-open-text {\n flex: 1;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n.artifact-version-item i {\n color: var(--mj-text-muted);\n font-size: 12px;\n}\n.artifact-version-item:hover .version-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n.artifact-version-item:hover .version-open-text {\n color: var(--mj-brand-primary);\n}\n.artifact-version-item:hover i {\n color: var(--mj-brand-primary);\n}\n\n.loading-peripheral-content {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface-card);\n border: 2px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: var(--mj-shadow-md);\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n}\n.loading-peripheral-content i {\n font-size: 20px;\n color: var(--mj-brand-primary);\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n.conversation-loading-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n}\n\n.loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: 20px;\n gap: 16px;\n color: var(--mj-text-secondary);\n font-size: 15px;\n}\n.loading-content i {\n font-size: 32px;\n color: var(--mj-brand-primary);\n}\n.loading-content span {\n font-weight: 500;\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .chat-header {\n padding: 8px 12px;\n gap: 6px;\n flex-direction: row;\n flex-wrap: wrap;\n align-items: center;\n position: relative;\n }\n .chat-info {\n flex-direction: row;\n align-items: center;\n gap: 8px;\n flex: 1;\n min-width: 0;\n order: 1;\n }\n .chat-title {\n font-size: 15px;\n font-weight: 700;\n width: auto;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex: 1;\n min-width: 0;\n }\n .project-tag {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n display: none; /* Hide on mobile to save space */\n }\n .test-indicator {\n margin-left: 0;\n font-size: 10px;\n padding: 3px 8px;\n height: 24px;\n }\n /* Action buttons - icon only on mobile */\n .chat-actions-buttons {\n order: 2;\n flex-shrink: 0;\n }\n .chat-actions-buttons .action-btn {\n padding: 6px 8px;\n min-width: auto;\n }\n .chat-actions-buttons .action-btn .btn-label {\n display: none;\n }\n .chat-actions {\n flex-wrap: nowrap;\n }\n .chat-members,\n .artifact-indicator {\n padding: 5px 7px;\n font-size: 13px;\n }\n .action-btn {\n padding: 6px 8px;\n font-size: 12px;\n }\n .ambient-agent-indicator {\n font-size: 12px;\n padding: 4px 8px;\n }\n .project-selector-modal {\n width: min(95vw, 600px);\n height: auto;\n }\n .artifacts-modal {\n width: min(95vw, 700px);\n }\n .artifacts-grid {\n grid-template-columns: 1fr;\n }\n .chat-input-container {\n padding: 0 0.75rem 0.75rem 0.75rem;\n }\n .scroll-to-bottom-icon {\n bottom: 16px;\n width: 36px;\n height: 36px;\n }\n /* Artifact pane - full width overlay on mobile, overlapping header */\n .chat-content-area {\n position: relative;\n }\n .chat-artifact-pane {\n position: fixed;\n left: 0;\n right: 0;\n top: 56px; /* 48px nav + 8px dark strip above blue border */\n bottom: 0;\n width: 100% !important;\n z-index: 100;\n background: var(--mj-bg-surface-card);\n }\n .resize-handle {\n display: none;\n }\n}\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .chat-header {\n padding: 6px 8px;\n gap: 4px;\n }\n .chat-title {\n font-size: 14px;\n font-weight: 700;\n }\n .project-tag {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n display: none;\n }\n .test-indicator {\n font-size: 9px;\n padding: 2px 6px;\n height: 20px;\n }\n .chat-members,\n .artifact-indicator {\n padding: 4px 8px;\n font-size: 11px;\n }\n .action-btn {\n padding: 5px 7px;\n font-size: 11px;\n }\n .ambient-agent-indicator {\n font-size: 11px;\n padding: 3px 6px;\n }\n .project-selector-modal,\n .artifacts-modal {\n width: 100vw;\n height: 100vh;\n border-radius: 0;\n }\n .chat-input-container {\n padding: 0 0.5rem 0.5rem 0.5rem;\n }\n .scroll-to-bottom-icon {\n bottom: 12px;\n width: 32px;\n height: 32px;\n }\n .scroll-to-bottom-icon i {\n font-size: 14px;\n }\n}\n\n/* Artifact Picker Panel */\n.artifact-picker-overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: var(--mj-bg-overlay);\n z-index: 999;\n}\n\n.artifact-picker-panel {\n position: fixed;\n right: 0;\n top: 0;\n width: 360px;\n height: 100%;\n background: var(--mj-bg-surface);\n border-left: 1px solid var(--mj-border-default);\n z-index: 1000;\n display: flex;\n flex-direction: column;\n box-shadow: -4px 0 12px rgba(0, 0, 0, 0.1);\n animation: slideInRight 0.2s ease-out;\n}\n\n@keyframes slideInRight {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n.artifact-picker-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.artifact-picker-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-close {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px 8px;\n color: var(--mj-text-muted);\n border-radius: 4px;\n}\n\n.artifact-picker-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.artifact-picker-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n.artifact-picker-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px 20px;\n text-align: center;\n color: var(--mj-text-muted);\n gap: 8px;\n}\n\n.artifact-picker-hint {\n font-size: 12px;\n color: var(--mj-text-disabled);\n}\n\n.artifact-picker-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.artifact-picker-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n text-align: left;\n width: 100%;\n transition: background 0.15s, border-color 0.15s;\n}\n\n.artifact-picker-item:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-brand-primary);\n}\n\n.artifact-picker-item i {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.artifact-picker-item i.fa-file-pdf { color: #e53e3e; }\n.artifact-picker-item i.fa-file-excel { color: #38a169; }\n.artifact-picker-item i.fa-file-word { color: #3182ce; }\n.artifact-picker-item i.fa-file { color: var(--mj-text-muted); }\n\n.artifact-picker-item-info {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.artifact-picker-item-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.artifact-picker-item-meta {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n"] }]
|
|
3244
|
+
}], () => [{ type: i1.AgentStateService }, { type: i2.ConversationAgentService }, { type: i3.ActiveTasksService }, { type: i0.ChangeDetectorRef }, { type: i4.MentionAutocompleteService }, { type: i5.ArtifactPermissionService }, { type: i6.ConversationAttachmentService }, { type: i7.ConversationStreamingService }, { type: i8.DialogService }, { type: i9.ConversationBridgeService }, { type: i10.AnalyzeArtifactService }, { type: i11.UICommandHandlerService }, { type: i10.InteractiveFormApplyService }], { environmentId: [{
|
|
3028
3245
|
type: Input
|
|
3029
3246
|
}], currentUser: [{
|
|
3030
3247
|
type: Input
|
|
@@ -3034,6 +3251,12 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
3034
3251
|
type: Input
|
|
3035
3252
|
}], threadId: [{
|
|
3036
3253
|
type: Input
|
|
3254
|
+
}], suppressNewConversationEmptyState: [{
|
|
3255
|
+
type: Input
|
|
3256
|
+
}], allowMentions: [{
|
|
3257
|
+
type: Input
|
|
3258
|
+
}], allowAttachments: [{
|
|
3259
|
+
type: Input
|
|
3037
3260
|
}], isNewConversation: [{
|
|
3038
3261
|
type: Input
|
|
3039
3262
|
}], pendingMessage: [{
|
|
@@ -3054,6 +3277,20 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
3054
3277
|
type: Input
|
|
3055
3278
|
}], appContext: [{
|
|
3056
3279
|
type: Input
|
|
3280
|
+
}], defaultAgentId: [{
|
|
3281
|
+
type: Input
|
|
3282
|
+
}], applicationScope: [{
|
|
3283
|
+
type: Input
|
|
3284
|
+
}], applicationId: [{
|
|
3285
|
+
type: Input
|
|
3286
|
+
}], linkedEntityId: [{
|
|
3287
|
+
type: Input
|
|
3288
|
+
}], linkedRecordId: [{
|
|
3289
|
+
type: Input
|
|
3290
|
+
}], showAgentPicker: [{
|
|
3291
|
+
type: Input
|
|
3292
|
+
}], showAgentModePicker: [{
|
|
3293
|
+
type: Input
|
|
3057
3294
|
}], emptyStateGreeting: [{
|
|
3058
3295
|
type: Input
|
|
3059
3296
|
}], showSidebarToggle: [{
|
|
@@ -3095,5 +3332,5 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
3095
3332
|
type: ViewChild,
|
|
3096
3333
|
args: [ConversationEmptyStateComponent]
|
|
3097
3334
|
}] }); })();
|
|
3098
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationChatAreaComponent, { className: "ConversationChatAreaComponent", filePath: "src/lib/components/conversation/conversation-chat-area.component.ts", lineNumber:
|
|
3335
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationChatAreaComponent, { className: "ConversationChatAreaComponent", filePath: "src/lib/components/conversation/conversation-chat-area.component.ts", lineNumber: 43 }); })();
|
|
3099
3336
|
//# sourceMappingURL=conversation-chat-area.component.js.map
|