@memberjunction/ng-conversations 5.36.0 → 5.38.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 +201 -4
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +776 -263
- 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/dialogs/rating-dialog.component.d.ts +31 -0
- package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -0
- package/dist/lib/components/dialogs/rating-dialog.component.js +290 -0
- package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -0
- package/dist/lib/components/mention/mention-editor.component.d.ts +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.js +1 -0
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +43 -18
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +235 -193
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +1 -1
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +58 -4
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +135 -21
- 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 +126 -152
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.d.ts +88 -5
- package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
- package/dist/lib/components/overlay/chat-overlay.component.js +296 -54
- 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 -57
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +12 -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/dist/lib/services/data-cache.service.d.ts.map +1 -1
- package/dist/lib/services/data-cache.service.js +0 -1
- package/dist/lib/services/data-cache.service.js.map +1 -1
- package/dist/lib/services/dialog.service.d.ts +24 -0
- package/dist/lib/services/dialog.service.d.ts.map +1 -1
- package/dist/lib/services/dialog.service.js +45 -0
- package/dist/lib/services/dialog.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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ViewChild, ViewChildren } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
|
-
import { CompositeKey, LogStatusEx } from '@memberjunction/core';
|
|
4
|
-
import { ConversationEngine } from '@memberjunction/core-entities';
|
|
3
|
+
import { RunView, CompositeKey, LogStatusEx } from '@memberjunction/core';
|
|
4
|
+
import { ArtifactMetadataEngine, ConversationEngine } from '@memberjunction/core-entities';
|
|
5
5
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
6
6
|
import { MJResourcePermissionShareAdapter } from '@memberjunction/ng-resource-permissions';
|
|
7
7
|
import { LazyArtifactInfo } from '../../models/lazy-artifact-info';
|
|
@@ -22,21 +22,24 @@ import * as i7 from "../../services/conversation-streaming.service";
|
|
|
22
22
|
import * as i8 from "../../services/dialog.service";
|
|
23
23
|
import * as i9 from "../../services/conversation-bridge.service";
|
|
24
24
|
import * as i10 from "@memberjunction/ng-artifacts";
|
|
25
|
-
import * as i11 from "
|
|
26
|
-
import * as i12 from "@memberjunction/ng-
|
|
27
|
-
import * as i13 from "@memberjunction/ng-
|
|
28
|
-
import * as i14 from "@memberjunction/ng-
|
|
29
|
-
import * as i15 from "
|
|
30
|
-
import * as i16 from "../
|
|
31
|
-
import * as i17 from "../
|
|
32
|
-
import * as i18 from "../message/message-
|
|
33
|
-
import * as i19 from "
|
|
34
|
-
import * as i20 from "
|
|
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 "
|
|
25
|
+
import * as i11 from "../../services/ui-command-handler.service";
|
|
26
|
+
import * as i12 from "@memberjunction/ng-ui-components";
|
|
27
|
+
import * as i13 from "@memberjunction/ng-testing";
|
|
28
|
+
import * as i14 from "@memberjunction/ng-shared-generic";
|
|
29
|
+
import * as i15 from "@memberjunction/ng-resource-permissions";
|
|
30
|
+
import * as i16 from "../collection/artifact-collection-picker-modal.component";
|
|
31
|
+
import * as i17 from "../artifact/artifact-share-modal.component";
|
|
32
|
+
import * as i18 from "../message/message-list.component";
|
|
33
|
+
import * as i19 from "../message/message-input.component";
|
|
34
|
+
import * as i20 from "./conversation-empty-state.component";
|
|
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";
|
|
40
43
|
const _c0 = ["scrollContainer"];
|
|
41
44
|
const _c1 = ["messageInput"];
|
|
42
45
|
const _c2 = () => [];
|
|
@@ -45,14 +48,23 @@ const _forTrack1 = ($index, $item) => $item.artifactId;
|
|
|
45
48
|
const _forTrack2 = ($index, $item) => $item.versionId;
|
|
46
49
|
function ConversationChatAreaComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
47
50
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
48
|
-
i0.ɵɵelementStart(0, "button",
|
|
51
|
+
i0.ɵɵelementStart(0, "button", 33);
|
|
49
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()); });
|
|
50
|
-
i0.ɵɵelement(1, "i",
|
|
53
|
+
i0.ɵɵelement(1, "i", 34);
|
|
51
54
|
i0.ɵɵelementEnd();
|
|
52
55
|
} }
|
|
53
|
-
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) {
|
|
54
66
|
i0.ɵɵelementStart(0, "span", 22);
|
|
55
|
-
i0.ɵɵelement(1, "i",
|
|
67
|
+
i0.ɵɵelement(1, "i", 35);
|
|
56
68
|
i0.ɵɵelementStart(2, "span");
|
|
57
69
|
i0.ɵɵtext(3);
|
|
58
70
|
i0.ɵɵelementEnd()();
|
|
@@ -62,11 +74,11 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_5_Template(rf,
|
|
|
62
74
|
i0.ɵɵadvance(3);
|
|
63
75
|
i0.ɵɵtextInterpolate1("Shared by ", ctx_r1.sharedByBadge.display);
|
|
64
76
|
} }
|
|
65
|
-
function
|
|
77
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
66
78
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
67
|
-
i0.ɵɵelementStart(0, "button",
|
|
68
|
-
i0.ɵɵlistener("click", function
|
|
69
|
-
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);
|
|
70
82
|
i0.ɵɵelementStart(2, "span");
|
|
71
83
|
i0.ɵɵtext(3);
|
|
72
84
|
i0.ɵɵelementEnd()();
|
|
@@ -75,21 +87,21 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template(rf,
|
|
|
75
87
|
i0.ɵɵadvance(3);
|
|
76
88
|
i0.ɵɵtextInterpolate(ctx_r1.conversation.Project || "Project");
|
|
77
89
|
} }
|
|
78
|
-
function
|
|
90
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
79
91
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
80
|
-
i0.ɵɵelementStart(0, "button",
|
|
81
|
-
i0.ɵɵlistener("click", function
|
|
82
|
-
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);
|
|
83
95
|
i0.ɵɵelementStart(2, "span");
|
|
84
96
|
i0.ɵɵtext(3, "Test");
|
|
85
97
|
i0.ɵɵelementEnd()();
|
|
86
98
|
} }
|
|
87
|
-
function
|
|
99
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
88
100
|
const _r5 = i0.ɵɵgetCurrentView();
|
|
89
|
-
i0.ɵɵelementStart(0, "button",
|
|
90
|
-
i0.ɵɵlistener("click", function
|
|
91
|
-
i0.ɵɵelement(1, "i",
|
|
92
|
-
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);
|
|
93
105
|
i0.ɵɵtext(3);
|
|
94
106
|
i0.ɵɵelementEnd()();
|
|
95
107
|
} if (rf & 2) {
|
|
@@ -98,12 +110,12 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template(rf,
|
|
|
98
110
|
i0.ɵɵadvance(3);
|
|
99
111
|
i0.ɵɵtextInterpolate(ctx_r1.pinnedMessages.length);
|
|
100
112
|
} }
|
|
101
|
-
function
|
|
113
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
102
114
|
const _r6 = i0.ɵɵgetCurrentView();
|
|
103
|
-
i0.ɵɵelementStart(0, "button",
|
|
104
|
-
i0.ɵɵlistener("click", function
|
|
105
|
-
i0.ɵɵelement(1, "i",
|
|
106
|
-
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);
|
|
107
119
|
i0.ɵɵtext(3);
|
|
108
120
|
i0.ɵɵelementEnd()();
|
|
109
121
|
} if (rf & 2) {
|
|
@@ -111,12 +123,12 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template(rf,
|
|
|
111
123
|
i0.ɵɵadvance(3);
|
|
112
124
|
i0.ɵɵtextInterpolate(ctx_r1.artifactCountDisplay);
|
|
113
125
|
} }
|
|
114
|
-
function
|
|
126
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
115
127
|
const _r7 = i0.ɵɵgetCurrentView();
|
|
116
|
-
i0.ɵɵelementStart(0, "button",
|
|
117
|
-
i0.ɵɵlistener("click", function
|
|
118
|
-
i0.ɵɵelement(1, "i",
|
|
119
|
-
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);
|
|
120
132
|
i0.ɵɵtext(3);
|
|
121
133
|
i0.ɵɵelementEnd()();
|
|
122
134
|
} if (rf & 2) {
|
|
@@ -124,21 +136,36 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template(rf,
|
|
|
124
136
|
i0.ɵɵadvance(3);
|
|
125
137
|
i0.ɵɵtextInterpolate(ctx_r1.memberCount);
|
|
126
138
|
} }
|
|
127
|
-
function
|
|
139
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
128
140
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
129
|
-
i0.ɵɵelementStart(0, "
|
|
130
|
-
i0.ɵɵlistener("
|
|
131
|
-
i0.ɵɵ
|
|
132
|
-
|
|
133
|
-
i0.ɵɵ
|
|
134
|
-
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);
|
|
135
153
|
} }
|
|
136
154
|
function ConversationChatAreaComponent_Conditional_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
137
155
|
const _r9 = i0.ɵɵgetCurrentView();
|
|
138
156
|
i0.ɵɵelementStart(0, "button", 50);
|
|
139
|
-
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.
|
|
140
|
-
i0.ɵɵelement(1, "i",
|
|
141
|
-
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);
|
|
142
169
|
i0.ɵɵtext(3, "Share");
|
|
143
170
|
i0.ɵɵelementEnd()();
|
|
144
171
|
} if (rf & 2) {
|
|
@@ -149,19 +176,19 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_13_Template(rf,
|
|
|
149
176
|
function ConversationChatAreaComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
150
177
|
i0.ɵɵelementStart(0, "div", 3)(1, "div", 19);
|
|
151
178
|
i0.ɵɵconditionalCreate(2, ConversationChatAreaComponent_Conditional_1_Conditional_2_Template, 2, 0, "button", 20);
|
|
152
|
-
i0.ɵɵ
|
|
153
|
-
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);
|
|
154
183
|
i0.ɵɵelementEnd();
|
|
155
|
-
i0.ɵɵ
|
|
156
|
-
i0.ɵɵconditionalCreate(
|
|
157
|
-
i0.ɵɵconditionalCreate(
|
|
158
|
-
i0.ɵɵ
|
|
159
|
-
i0.ɵɵ
|
|
160
|
-
i0.ɵɵconditionalCreate(
|
|
161
|
-
i0.ɵɵconditionalCreate(
|
|
162
|
-
i0.ɵɵconditionalCreate(
|
|
163
|
-
i0.ɵɵconditionalCreate(12, ConversationChatAreaComponent_Conditional_1_Conditional_12_Template, 4, 0, "button", 29);
|
|
164
|
-
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);
|
|
165
192
|
i0.ɵɵelementEnd()();
|
|
166
193
|
} if (rf & 2) {
|
|
167
194
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -169,81 +196,97 @@ function ConversationChatAreaComponent_Conditional_1_Template(rf, ctx) { if (rf
|
|
|
169
196
|
i0.ɵɵclassProp("with-sidebar-toggle", ctx_r1.showSidebarToggle);
|
|
170
197
|
i0.ɵɵadvance();
|
|
171
198
|
i0.ɵɵconditional(ctx_r1.showSidebarToggle ? 2 : -1);
|
|
172
|
-
i0.ɵɵadvance(2);
|
|
173
|
-
i0.ɵɵtextInterpolate(ctx_r1.conversation.Name || "");
|
|
174
199
|
i0.ɵɵadvance();
|
|
175
|
-
i0.ɵɵconditional(ctx_r1.
|
|
200
|
+
i0.ɵɵconditional(ctx_r1.conversation ? 3 : -1);
|
|
176
201
|
i0.ɵɵadvance();
|
|
177
|
-
i0.ɵɵconditional(ctx_r1.
|
|
202
|
+
i0.ɵɵconditional(ctx_r1.sharedByBadge ? 4 : -1);
|
|
178
203
|
i0.ɵɵadvance();
|
|
179
|
-
i0.ɵɵconditional(ctx_r1.conversation.
|
|
204
|
+
i0.ɵɵconditional((ctx_r1.conversation == null ? null : ctx_r1.conversation.ProjectID) ? 5 : -1);
|
|
205
|
+
i0.ɵɵadvance();
|
|
206
|
+
i0.ɵɵconditional((ctx_r1.conversation == null ? null : ctx_r1.conversation.TestRunID) ? 6 : -1);
|
|
180
207
|
i0.ɵɵadvance(2);
|
|
181
|
-
i0.ɵɵconditional(ctx_r1.pinnedMessages.length > 0 ?
|
|
208
|
+
i0.ɵɵconditional(ctx_r1.pinnedMessages.length > 0 ? 8 : -1);
|
|
209
|
+
i0.ɵɵadvance();
|
|
210
|
+
i0.ɵɵconditional(ctx_r1.showArtifactIndicator && ctx_r1.artifactCountDisplay > 0 ? 9 : -1);
|
|
211
|
+
i0.ɵɵadvance();
|
|
212
|
+
i0.ɵɵconditional(ctx_r1.memberCount > 1 ? 10 : -1);
|
|
182
213
|
i0.ɵɵadvance();
|
|
183
|
-
i0.ɵɵconditional(ctx_r1.
|
|
214
|
+
i0.ɵɵconditional(ctx_r1.showAgentModePicker && ctx_r1.ModePickerTargetAgentId ? 11 : -1);
|
|
184
215
|
i0.ɵɵadvance();
|
|
185
|
-
i0.ɵɵconditional(ctx_r1.
|
|
216
|
+
i0.ɵɵconditional(ctx_r1.showAgentPicker && ctx_r1.conversation ? 12 : -1);
|
|
186
217
|
i0.ɵɵadvance();
|
|
187
|
-
i0.ɵɵconditional(ctx_r1.showExportButton ?
|
|
218
|
+
i0.ɵɵconditional(ctx_r1.showExportButton ? 13 : -1);
|
|
188
219
|
i0.ɵɵadvance();
|
|
189
|
-
i0.ɵɵconditional(ctx_r1.showShareButton && ctx_r1.canShareConversation ?
|
|
220
|
+
i0.ɵɵconditional(ctx_r1.showShareButton && ctx_r1.canShareConversation ? 14 : -1);
|
|
190
221
|
} }
|
|
191
222
|
function ConversationChatAreaComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
192
223
|
i0.ɵɵelementStart(0, "div", 6);
|
|
193
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
224
|
+
i0.ɵɵelement(1, "mj-loading", 54);
|
|
194
225
|
i0.ɵɵelementEnd();
|
|
195
226
|
} }
|
|
196
227
|
function ConversationChatAreaComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
197
|
-
const
|
|
198
|
-
i0.ɵɵelementStart(0, "mj-conversation-empty-state",
|
|
199
|
-
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)); });
|
|
200
231
|
i0.ɵɵelementEnd();
|
|
201
232
|
} if (rf & 2) {
|
|
202
233
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
203
|
-
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);
|
|
235
|
+
} }
|
|
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);
|
|
204
247
|
} }
|
|
205
|
-
function
|
|
206
|
-
i0.ɵɵelementStart(0, "div",
|
|
207
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
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);
|
|
208
251
|
i0.ɵɵelementEnd();
|
|
209
252
|
} if (rf & 2) {
|
|
210
253
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
211
254
|
i0.ɵɵadvance();
|
|
212
255
|
i0.ɵɵproperty("text", ctx_r1.uploadingMessage);
|
|
213
256
|
} }
|
|
214
|
-
function
|
|
215
|
-
const
|
|
216
|
-
i0.ɵɵelementStart(0, "span",
|
|
217
|
-
i0.ɵɵlistener("click", function
|
|
218
|
-
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);
|
|
219
262
|
i0.ɵɵelementEnd();
|
|
220
263
|
} }
|
|
221
|
-
function
|
|
222
|
-
i0.ɵɵelementStart(0, "div",
|
|
223
|
-
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);
|
|
224
267
|
i0.ɵɵelementEnd();
|
|
225
268
|
} }
|
|
226
|
-
function
|
|
227
|
-
i0.ɵɵelementStart(0, "div",
|
|
228
|
-
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);
|
|
229
272
|
i0.ɵɵelementStart(2, "span");
|
|
230
273
|
i0.ɵɵtext(3, "You have view-only access to this conversation.");
|
|
231
274
|
i0.ɵɵelementEnd()();
|
|
232
275
|
} }
|
|
233
|
-
function
|
|
234
|
-
const
|
|
235
|
-
i0.ɵɵelementStart(0, "mj-message-input",
|
|
236
|
-
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)); });
|
|
237
280
|
i0.ɵɵelementEnd();
|
|
238
281
|
} if (rf & 2) {
|
|
239
|
-
const
|
|
282
|
+
const inputRef_r16 = ctx.$implicit;
|
|
240
283
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
241
|
-
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);
|
|
242
285
|
} }
|
|
243
|
-
function
|
|
244
|
-
i0.ɵɵconditionalCreate(0,
|
|
245
|
-
i0.ɵɵelementStart(1, "div",
|
|
246
|
-
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);
|
|
247
290
|
i0.ɵɵelementEnd();
|
|
248
291
|
} if (rf & 2) {
|
|
249
292
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -251,19 +294,19 @@ function ConversationChatAreaComponent_Conditional_6_Conditional_8_Template(rf,
|
|
|
251
294
|
i0.ɵɵadvance(2);
|
|
252
295
|
i0.ɵɵrepeater(ctx_r1.getCachedInputs());
|
|
253
296
|
} }
|
|
254
|
-
function
|
|
255
|
-
const
|
|
297
|
+
function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
298
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
256
299
|
i0.ɵɵelementStart(0, "div", 8);
|
|
257
|
-
i0.ɵɵconditionalCreate(1,
|
|
258
|
-
i0.ɵɵelementStart(2, "div",
|
|
259
|
-
i0.ɵɵlistener("scroll", function
|
|
260
|
-
i0.ɵɵelementStart(4, "mj-conversation-message-list",
|
|
261
|
-
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)); });
|
|
262
305
|
i0.ɵɵelementEnd();
|
|
263
|
-
i0.ɵɵconditionalCreate(5,
|
|
306
|
+
i0.ɵɵconditionalCreate(5, ConversationChatAreaComponent_Conditional_7_Conditional_5_Template, 2, 0, "span", 63);
|
|
264
307
|
i0.ɵɵelementEnd();
|
|
265
308
|
i0.ɵɵelementStart(6, "div", 57);
|
|
266
|
-
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);
|
|
267
310
|
i0.ɵɵelementEnd()();
|
|
268
311
|
} if (rf & 2) {
|
|
269
312
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -276,17 +319,17 @@ function ConversationChatAreaComponent_Conditional_6_Template(rf, ctx) { if (rf
|
|
|
276
319
|
i0.ɵɵadvance(2);
|
|
277
320
|
i0.ɵɵconditional(ctx_r1.isLoadingPeripheralData ? 7 : 8);
|
|
278
321
|
} }
|
|
279
|
-
function
|
|
280
|
-
const
|
|
281
|
-
i0.ɵɵelementStart(0, "div",
|
|
282
|
-
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)); });
|
|
283
326
|
i0.ɵɵelementEnd();
|
|
284
327
|
} }
|
|
285
|
-
function
|
|
286
|
-
const
|
|
287
|
-
i0.ɵɵconditionalCreate(0,
|
|
288
|
-
i0.ɵɵelementStart(1, "div",
|
|
289
|
-
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)); });
|
|
290
333
|
i0.ɵɵelementEnd()();
|
|
291
334
|
} if (rf & 2) {
|
|
292
335
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -297,50 +340,50 @@ function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf
|
|
|
297
340
|
i0.ɵɵadvance();
|
|
298
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$);
|
|
299
342
|
} }
|
|
300
|
-
function
|
|
301
|
-
const
|
|
302
|
-
i0.ɵɵelementStart(0, "mj-pinned-messages-panel",
|
|
303
|
-
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)); });
|
|
304
347
|
i0.ɵɵelementEnd();
|
|
305
348
|
} if (rf & 2) {
|
|
306
349
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
307
350
|
i0.ɵɵproperty("pinnedMessages", ctx_r1.pinnedMessages);
|
|
308
351
|
} }
|
|
309
|
-
function
|
|
310
|
-
const
|
|
311
|
-
i0.ɵɵelementStart(0, "mj-thread-panel",
|
|
312
|
-
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)); });
|
|
313
356
|
i0.ɵɵelementEnd();
|
|
314
357
|
} if (rf & 2) {
|
|
315
358
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
316
359
|
i0.ɵɵproperty("parentMessageId", ctx_r1.threadId)("conversationId", ctx_r1.conversationId || "")("currentUser", ctx_r1.currentUser);
|
|
317
360
|
} }
|
|
318
|
-
function
|
|
319
|
-
const
|
|
320
|
-
i0.ɵɵelementStart(0, "div",
|
|
321
|
-
i0.ɵɵlistener("click", function
|
|
322
|
-
i0.ɵɵelementStart(1, "div",
|
|
323
|
-
i0.ɵɵlistener("click", function
|
|
324
|
-
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");
|
|
325
368
|
i0.ɵɵtext(4, "Assign Project");
|
|
326
369
|
i0.ɵɵelementEnd();
|
|
327
|
-
i0.ɵɵelementStart(5, "button",
|
|
328
|
-
i0.ɵɵlistener("click", function
|
|
329
|
-
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);
|
|
330
373
|
i0.ɵɵelementEnd()();
|
|
331
|
-
i0.ɵɵelementStart(7, "div",
|
|
332
|
-
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)); });
|
|
333
376
|
i0.ɵɵelementEnd()()()();
|
|
334
377
|
} if (rf & 2) {
|
|
335
378
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
336
379
|
i0.ɵɵadvance(8);
|
|
337
380
|
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedProjectId", ctx_r1.conversation.ProjectID);
|
|
338
381
|
} }
|
|
339
|
-
function
|
|
340
|
-
const
|
|
341
|
-
i0.ɵɵelementStart(0, "button",
|
|
342
|
-
i0.ɵɵlistener("click", function
|
|
343
|
-
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);
|
|
344
387
|
i0.ɵɵelementStart(2, "span");
|
|
345
388
|
i0.ɵɵtext(3);
|
|
346
389
|
i0.ɵɵelementEnd()();
|
|
@@ -350,110 +393,110 @@ function ConversationChatAreaComponent_Conditional_15_Conditional_6_Template(rf,
|
|
|
350
393
|
i0.ɵɵadvance(3);
|
|
351
394
|
i0.ɵɵtextInterpolate1("", ctx_r1.showSystemArtifacts ? "Hide" : "Show", " System");
|
|
352
395
|
} }
|
|
353
|
-
function
|
|
354
|
-
i0.ɵɵelementStart(0, "div",
|
|
355
|
-
i0.ɵɵelement(1, "i",
|
|
356
|
-
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);
|
|
357
400
|
i0.ɵɵtext(3, "No artifacts in this conversation yet");
|
|
358
401
|
i0.ɵɵelementEnd()();
|
|
359
402
|
} }
|
|
360
|
-
function
|
|
403
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
361
404
|
i0.ɵɵtext(0);
|
|
362
405
|
} if (rf & 2) {
|
|
363
|
-
const
|
|
364
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
406
|
+
const artifact_r25 = i0.ɵɵnextContext().$implicit;
|
|
407
|
+
i0.ɵɵtextInterpolate1(" ", artifact_r25.versionCount, " versions ");
|
|
365
408
|
} }
|
|
366
|
-
function
|
|
409
|
+
function ConversationChatAreaComponent_Conditional_16_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
367
410
|
i0.ɵɵtext(0, " 1 version ");
|
|
368
411
|
} }
|
|
369
|
-
function
|
|
370
|
-
const
|
|
371
|
-
i0.ɵɵelementStart(0, "button",
|
|
372
|
-
i0.ɵɵlistener("click", function
|
|
373
|
-
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);
|
|
374
417
|
i0.ɵɵelementEnd();
|
|
375
418
|
} if (rf & 2) {
|
|
376
|
-
const
|
|
419
|
+
const artifact_r25 = i0.ɵɵnextContext().$implicit;
|
|
377
420
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
378
421
|
i0.ɵɵadvance();
|
|
379
|
-
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);
|
|
380
423
|
} }
|
|
381
|
-
function
|
|
382
|
-
const
|
|
383
|
-
i0.ɵɵelementStart(0, "div",
|
|
384
|
-
i0.ɵɵlistener("click", function
|
|
385
|
-
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);
|
|
386
429
|
i0.ɵɵtext(2);
|
|
387
430
|
i0.ɵɵelementEnd();
|
|
388
|
-
i0.ɵɵelementStart(3, "span",
|
|
431
|
+
i0.ɵɵelementStart(3, "span", 112);
|
|
389
432
|
i0.ɵɵtext(4, "Open this version");
|
|
390
433
|
i0.ɵɵelementEnd();
|
|
391
|
-
i0.ɵɵelement(5, "i",
|
|
434
|
+
i0.ɵɵelement(5, "i", 113);
|
|
392
435
|
i0.ɵɵelementEnd();
|
|
393
436
|
} if (rf & 2) {
|
|
394
|
-
const
|
|
437
|
+
const version_r28 = ctx.$implicit;
|
|
395
438
|
i0.ɵɵadvance(2);
|
|
396
|
-
i0.ɵɵtextInterpolate1("v",
|
|
439
|
+
i0.ɵɵtextInterpolate1("v", version_r28.versionNumber);
|
|
397
440
|
} }
|
|
398
|
-
function
|
|
399
|
-
i0.ɵɵelementStart(0, "div",
|
|
400
|
-
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);
|
|
401
444
|
i0.ɵɵelementEnd();
|
|
402
445
|
} if (rf & 2) {
|
|
403
|
-
const
|
|
446
|
+
const artifact_r25 = i0.ɵɵnextContext().$implicit;
|
|
404
447
|
i0.ɵɵadvance();
|
|
405
|
-
i0.ɵɵrepeater(
|
|
448
|
+
i0.ɵɵrepeater(artifact_r25.versions);
|
|
406
449
|
} }
|
|
407
|
-
function
|
|
408
|
-
const
|
|
409
|
-
i0.ɵɵelementStart(0, "div",
|
|
410
|
-
i0.ɵɵlistener("click", function
|
|
411
|
-
i0.ɵɵelementStart(2, "div",
|
|
412
|
-
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);
|
|
413
456
|
i0.ɵɵelementEnd();
|
|
414
|
-
i0.ɵɵelementStart(4, "div",
|
|
457
|
+
i0.ɵɵelementStart(4, "div", 100)(5, "div", 101);
|
|
415
458
|
i0.ɵɵtext(6);
|
|
416
459
|
i0.ɵɵelementEnd();
|
|
417
|
-
i0.ɵɵelementStart(7, "div",
|
|
418
|
-
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);
|
|
419
462
|
i0.ɵɵelementEnd()();
|
|
420
|
-
i0.ɵɵconditionalCreate(10,
|
|
421
|
-
i0.ɵɵelementStart(11, "div",
|
|
422
|
-
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);
|
|
423
466
|
i0.ɵɵelementEnd()();
|
|
424
|
-
i0.ɵɵconditionalCreate(13,
|
|
467
|
+
i0.ɵɵconditionalCreate(13, ConversationChatAreaComponent_Conditional_16_For_12_Conditional_13_Template, 3, 0, "div", 106);
|
|
425
468
|
i0.ɵɵelementEnd();
|
|
426
469
|
} if (rf & 2) {
|
|
427
|
-
const
|
|
470
|
+
const artifact_r25 = ctx.$implicit;
|
|
428
471
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
429
|
-
i0.ɵɵclassProp("expanded", ctx_r1.expandedArtifactId ===
|
|
472
|
+
i0.ɵɵclassProp("expanded", ctx_r1.expandedArtifactId === artifact_r25.artifactId)("system-artifact", artifact_r25.visibility === "System Only");
|
|
430
473
|
i0.ɵɵadvance(6);
|
|
431
|
-
i0.ɵɵtextInterpolate(
|
|
474
|
+
i0.ɵɵtextInterpolate(artifact_r25.name);
|
|
432
475
|
i0.ɵɵadvance(2);
|
|
433
|
-
i0.ɵɵconditional(
|
|
476
|
+
i0.ɵɵconditional(artifact_r25.versionCount > 1 ? 8 : 9);
|
|
434
477
|
i0.ɵɵadvance(2);
|
|
435
|
-
i0.ɵɵconditional(
|
|
478
|
+
i0.ɵɵconditional(artifact_r25.versionCount > 1 ? 10 : -1);
|
|
436
479
|
i0.ɵɵadvance(3);
|
|
437
|
-
i0.ɵɵconditional(ctx_r1.expandedArtifactId ===
|
|
480
|
+
i0.ɵɵconditional(ctx_r1.expandedArtifactId === artifact_r25.artifactId && artifact_r25.versionCount > 1 ? 13 : -1);
|
|
438
481
|
} }
|
|
439
|
-
function
|
|
440
|
-
const
|
|
441
|
-
i0.ɵɵelementStart(0, "div",
|
|
442
|
-
i0.ɵɵlistener("click", function
|
|
443
|
-
i0.ɵɵelementStart(1, "div",
|
|
444
|
-
i0.ɵɵlistener("click", function
|
|
445
|
-
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");
|
|
446
489
|
i0.ɵɵtext(4, "Conversation Artifacts");
|
|
447
490
|
i0.ɵɵelementEnd();
|
|
448
|
-
i0.ɵɵelementStart(5, "div",
|
|
449
|
-
i0.ɵɵconditionalCreate(6,
|
|
450
|
-
i0.ɵɵelementStart(7, "button",
|
|
451
|
-
i0.ɵɵlistener("click", function
|
|
452
|
-
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);
|
|
453
496
|
i0.ɵɵelementEnd()()();
|
|
454
|
-
i0.ɵɵelementStart(9, "div",
|
|
455
|
-
i0.ɵɵconditionalCreate(10,
|
|
456
|
-
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);
|
|
457
500
|
i0.ɵɵelementEnd()()();
|
|
458
501
|
} if (rf & 2) {
|
|
459
502
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -464,28 +507,28 @@ function ConversationChatAreaComponent_Conditional_15_Template(rf, ctx) { if (rf
|
|
|
464
507
|
i0.ɵɵadvance();
|
|
465
508
|
i0.ɵɵrepeater(ctx_r1.getArtifactsArray());
|
|
466
509
|
} }
|
|
467
|
-
function
|
|
468
|
-
const
|
|
469
|
-
i0.ɵɵelementStart(0, "mj-artifact-collection-picker-modal",
|
|
470
|
-
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()); });
|
|
471
514
|
i0.ɵɵelementEnd();
|
|
472
515
|
} if (rf & 2) {
|
|
473
516
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
474
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);
|
|
475
518
|
} }
|
|
476
|
-
function
|
|
477
|
-
const
|
|
478
|
-
i0.ɵɵelementStart(0, "mj-test-feedback-dialog",
|
|
479
|
-
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)); });
|
|
480
523
|
i0.ɵɵelementEnd();
|
|
481
524
|
} if (rf & 2) {
|
|
482
525
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
483
526
|
i0.ɵɵproperty("data", ctx_r1.testFeedbackDialogData)("visible", ctx_r1.showTestFeedbackDialog);
|
|
484
527
|
} }
|
|
485
|
-
function
|
|
486
|
-
const
|
|
487
|
-
i0.ɵɵelementStart(0, "mj-image-viewer",
|
|
488
|
-
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()); });
|
|
489
532
|
i0.ɵɵelementEnd();
|
|
490
533
|
} if (rf & 2) {
|
|
491
534
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -507,6 +550,8 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
507
550
|
confirmDialog;
|
|
508
551
|
bridge;
|
|
509
552
|
analyzeArtifactService;
|
|
553
|
+
uiCommandHandler;
|
|
554
|
+
interactiveFormApplyService;
|
|
510
555
|
environmentId;
|
|
511
556
|
currentUser;
|
|
512
557
|
// LOCAL STATE INPUTS - passed from parent workspace
|
|
@@ -526,6 +571,30 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
526
571
|
}
|
|
527
572
|
conversation = null;
|
|
528
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;
|
|
529
598
|
_isNewConversation = false;
|
|
530
599
|
set isNewConversation(value) {
|
|
531
600
|
this._isNewConversation = value;
|
|
@@ -570,6 +639,113 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
570
639
|
showArtifactIndicator = true;
|
|
571
640
|
/** Application context snapshot for AI agent awareness. Included in agent execution data. */
|
|
572
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
|
+
}
|
|
573
749
|
/** Greeting message shown in the empty state when no conversation is active */
|
|
574
750
|
emptyStateGreeting = 'How can I help you?';
|
|
575
751
|
// Sidebar toggle - when true, shows toggle button in header to expand sidebar
|
|
@@ -710,7 +886,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
710
886
|
acceptedFileTypes = 'image/*';
|
|
711
887
|
conversationManagerAgent = null;
|
|
712
888
|
engine = ConversationEngine.Instance;
|
|
713
|
-
constructor(agentStateService, conversationAgentService, activeTasks, cdr, mentionAutocompleteService, artifactPermissionService, attachmentService, streamingService, confirmDialog, bridge, analyzeArtifactService) {
|
|
889
|
+
constructor(agentStateService, conversationAgentService, activeTasks, cdr, mentionAutocompleteService, artifactPermissionService, attachmentService, streamingService, confirmDialog, bridge, analyzeArtifactService, uiCommandHandler, interactiveFormApplyService) {
|
|
714
890
|
super();
|
|
715
891
|
this.agentStateService = agentStateService;
|
|
716
892
|
this.conversationAgentService = conversationAgentService;
|
|
@@ -723,6 +899,17 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
723
899
|
this.confirmDialog = confirmDialog;
|
|
724
900
|
this.bridge = bridge;
|
|
725
901
|
this.analyzeArtifactService = analyzeArtifactService;
|
|
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);
|
|
726
913
|
}
|
|
727
914
|
async ngOnInit() {
|
|
728
915
|
// Bind provider-aware services to this component's provider so multi-server
|
|
@@ -734,6 +921,20 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
734
921
|
this.artifactPermissionService.Provider = p;
|
|
735
922
|
this.attachmentService.Provider = p;
|
|
736
923
|
this.analyzeArtifactService.Provider = p;
|
|
924
|
+
// Subscribe to actionable commands from UICommandHandlerService so we can
|
|
925
|
+
// intercept and locally handle commands that depend on the conversation
|
|
926
|
+
// surface (e.g. `client:capture-data-snapshot`, which needs access to the
|
|
927
|
+
// artifact viewer panel and the message input — both live in this chat-area).
|
|
928
|
+
// The workspace's existing subscription still fires and bubbles every command
|
|
929
|
+
// up to the host application; this is purely additive — host apps can still
|
|
930
|
+
// override or augment behavior by handling the bubbled event.
|
|
931
|
+
this.uiCommandHandler.actionableCommandRequested
|
|
932
|
+
.pipe(takeUntil(this.destroy$))
|
|
933
|
+
.subscribe((command) => {
|
|
934
|
+
if (command.type === 'client:capture-data-snapshot') {
|
|
935
|
+
void this.handleCaptureDataSnapshotCommand(command);
|
|
936
|
+
}
|
|
937
|
+
});
|
|
737
938
|
// The workspace component initializes AI Engine and mention service before
|
|
738
939
|
// any child components render, so we can safely skip duplicate initialization.
|
|
739
940
|
// This prevents race conditions and ensures agents are fully loaded.
|
|
@@ -2251,9 +2452,35 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2251
2452
|
LogStatusEx({ message: '📨 Empty state message received', verboseOnly: true, additionalArgs: [text, `${attachments?.length || 0} attachments`] });
|
|
2252
2453
|
try {
|
|
2253
2454
|
this.isProcessing = true;
|
|
2254
|
-
// 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;
|
|
2255
2476
|
const newConversation = await this.engine.CreateConversation('New Conversation', // Temporary name - will be auto-named after first message
|
|
2256
|
-
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
|
+
});
|
|
2257
2484
|
if (!newConversation) {
|
|
2258
2485
|
console.error('Failed to create new conversation');
|
|
2259
2486
|
this.isProcessing = false;
|
|
@@ -2419,7 +2646,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2419
2646
|
*/
|
|
2420
2647
|
async OnAnalyzeArtifact(event) {
|
|
2421
2648
|
if (!this.conversationId || !this.currentUser)
|
|
2422
|
-
return;
|
|
2649
|
+
return null;
|
|
2423
2650
|
const messageInput = this.getActiveMessageInputComponent();
|
|
2424
2651
|
const snapshotTitle = event.snapshot.title || 'Untitled Snapshot';
|
|
2425
2652
|
try {
|
|
@@ -2431,7 +2658,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2431
2658
|
if (messageInput) {
|
|
2432
2659
|
const rowCount = (event.snapshot.tables ?? []).reduce((sum, t) => sum + (t.rows?.length ?? 0), 0);
|
|
2433
2660
|
const serialized = JSON.stringify(event.snapshot);
|
|
2434
|
-
messageInput.inputBox?.mentionEditor?.AddArtifactAttachment({
|
|
2661
|
+
const created = messageInput.inputBox?.mentionEditor?.AddArtifactAttachment({
|
|
2435
2662
|
fileID: '',
|
|
2436
2663
|
fileName: rowCount > 0
|
|
2437
2664
|
? `📸 ${result.title} · ${rowCount.toLocaleString()} rows`
|
|
@@ -2442,6 +2669,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2442
2669
|
});
|
|
2443
2670
|
messageInput.messageText = `Analyze "${result.title}" — `;
|
|
2444
2671
|
messageInput.inputBox?.focus();
|
|
2672
|
+
return created ?? null;
|
|
2445
2673
|
}
|
|
2446
2674
|
}
|
|
2447
2675
|
catch (error) {
|
|
@@ -2454,6 +2682,271 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2454
2682
|
messageInput.inputBox?.focus();
|
|
2455
2683
|
}
|
|
2456
2684
|
}
|
|
2685
|
+
return null;
|
|
2686
|
+
}
|
|
2687
|
+
/**
|
|
2688
|
+
* Handle a `client:capture-data-snapshot` actionable command emitted by an
|
|
2689
|
+
* analysis-class agent that needs the user's current view of an artifact to
|
|
2690
|
+
* answer accurately but has no Data Snapshot artifact attached.
|
|
2691
|
+
*
|
|
2692
|
+
* Flow:
|
|
2693
|
+
* 1. Resolve the target artifact — `command.artifactId` if provided,
|
|
2694
|
+
* otherwise the most-recent output artifact on the conversation.
|
|
2695
|
+
* 2. Open the artifact viewer panel for it (mounts the viewer plugin if not
|
|
2696
|
+
* already mounted).
|
|
2697
|
+
* 3. Poll until the viewer can produce a snapshot via
|
|
2698
|
+
* `GetCurrentStateSnapshot()`, with a short timeout.
|
|
2699
|
+
* 4. Reuse the existing `OnAnalyzeArtifact` flow to persist the snapshot
|
|
2700
|
+
* as a Data Snapshot artifact + attach it as a chip on the message input.
|
|
2701
|
+
* 5. If `command.followupMessage` is provided, replace the prefill and
|
|
2702
|
+
* auto-send so the agent immediately re-runs with the snapshot attached.
|
|
2703
|
+
* Otherwise, leave the chip + prefill in place for the user to send manually.
|
|
2704
|
+
*
|
|
2705
|
+
* Soft-fails — logs a warning and stops on any unrecoverable error rather
|
|
2706
|
+
* than throwing. The user's conversation state isn't disrupted.
|
|
2707
|
+
*/
|
|
2708
|
+
async handleCaptureDataSnapshotCommand(command) {
|
|
2709
|
+
console.log('[client:capture-data-snapshot] Handler invoked', { command, conversationId: this.conversationId });
|
|
2710
|
+
if (!this.conversationId || !this.currentUser) {
|
|
2711
|
+
console.warn('[client:capture-data-snapshot] No active conversation/user; ignoring');
|
|
2712
|
+
return;
|
|
2713
|
+
}
|
|
2714
|
+
let artifactId = command.artifactId;
|
|
2715
|
+
if (!artifactId) {
|
|
2716
|
+
artifactId = (await this.findMostRecentComponentArtifactId()) ?? undefined;
|
|
2717
|
+
console.log('[client:capture-data-snapshot] Resolved artifactId via lookup:', artifactId);
|
|
2718
|
+
}
|
|
2719
|
+
else {
|
|
2720
|
+
console.log('[client:capture-data-snapshot] Using artifactId from command:', artifactId);
|
|
2721
|
+
}
|
|
2722
|
+
if (!artifactId) {
|
|
2723
|
+
console.warn('[client:capture-data-snapshot] No artifact found on this conversation; cannot capture');
|
|
2724
|
+
return;
|
|
2725
|
+
}
|
|
2726
|
+
const panelAlreadyOpen = this.selectedArtifactId === artifactId && this.showArtifactPanel;
|
|
2727
|
+
console.log('[client:capture-data-snapshot] Panel state — currentSelectedId=' +
|
|
2728
|
+
this.selectedArtifactId +
|
|
2729
|
+
' showPanel=' +
|
|
2730
|
+
this.showArtifactPanel +
|
|
2731
|
+
' panelAlreadyOpen=' +
|
|
2732
|
+
panelAlreadyOpen);
|
|
2733
|
+
// Open the artifact panel so the viewer mounts (if it isn't already).
|
|
2734
|
+
if (!panelAlreadyOpen) {
|
|
2735
|
+
this.selectedArtifactId = artifactId;
|
|
2736
|
+
this.selectedVersionNumber = undefined;
|
|
2737
|
+
this.showArtifactPanel = true;
|
|
2738
|
+
try {
|
|
2739
|
+
await this.loadArtifactPermissions(artifactId);
|
|
2740
|
+
}
|
|
2741
|
+
catch {
|
|
2742
|
+
// Non-fatal — permissions are for UI affordances, not capture
|
|
2743
|
+
}
|
|
2744
|
+
this.cdr.detectChanges();
|
|
2745
|
+
console.log('[client:capture-data-snapshot] Opened artifact panel; waiting for viewer mount + data load');
|
|
2746
|
+
}
|
|
2747
|
+
// Poll for the snapshot — interactive components need a few render cycles
|
|
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);
|
|
2752
|
+
if (!snapshot) {
|
|
2753
|
+
console.warn('[client:capture-data-snapshot] Artifact viewer did not produce a snapshot within timeout');
|
|
2754
|
+
return;
|
|
2755
|
+
}
|
|
2756
|
+
// Persist + attach via the existing Analyze flow. Capture the created
|
|
2757
|
+
// PendingAttachment so we can pass it directly into sendMessageWithText
|
|
2758
|
+
// below — the mention-editor → message-input-box → message-input event
|
|
2759
|
+
// chain that normally syncs `pendingAttachments` is async (next-tick) and
|
|
2760
|
+
// hasn't propagated by the time we auto-send.
|
|
2761
|
+
const capturedAttachment = await this.OnAnalyzeArtifact({ artifactId, snapshot });
|
|
2762
|
+
// Auto-send the followup so the agent re-runs immediately with the
|
|
2763
|
+
// captured snapshot now attached. Resolution order:
|
|
2764
|
+
// 1. command.followupMessage — if the agent provided one
|
|
2765
|
+
// 2. most-recent User message — re-sends the question that triggered
|
|
2766
|
+
// this capture exchange (typical: "Looking at this dashboard, …")
|
|
2767
|
+
// so the agent sees the same question with the artifact attached
|
|
2768
|
+
// 3. a generic re-prompt — last resort if no user message found
|
|
2769
|
+
// OnAnalyzeArtifact prefilled messageText with 'Analyze "..." — '; we
|
|
2770
|
+
// overwrite that with the resolved followup before sending.
|
|
2771
|
+
const messageInput = this.getActiveMessageInputComponent();
|
|
2772
|
+
if (messageInput) {
|
|
2773
|
+
let followup = command.followupMessage?.trim();
|
|
2774
|
+
if (!followup) {
|
|
2775
|
+
const lastUserMsg = [...this.messages]
|
|
2776
|
+
.reverse()
|
|
2777
|
+
.find((m) => m.Role === 'User' && m.Message && m.Message.trim().length > 0);
|
|
2778
|
+
followup = lastUserMsg?.Message?.trim();
|
|
2779
|
+
}
|
|
2780
|
+
if (!followup) {
|
|
2781
|
+
followup = 'Please answer my previous question using the captured snapshot.';
|
|
2782
|
+
}
|
|
2783
|
+
messageInput.messageText = '';
|
|
2784
|
+
try {
|
|
2785
|
+
await messageInput.sendMessageWithText(followup, capturedAttachment ? [capturedAttachment] : undefined);
|
|
2786
|
+
}
|
|
2787
|
+
catch (error) {
|
|
2788
|
+
console.error('[client:capture-data-snapshot] Auto-send failed:', error);
|
|
2789
|
+
}
|
|
2790
|
+
}
|
|
2791
|
+
}
|
|
2792
|
+
/**
|
|
2793
|
+
* Poll `artifactViewerComponent.GetCurrentStateSnapshot()` for the LIVE
|
|
2794
|
+
* data snapshot. The React component inside the viewer plugin needs several
|
|
2795
|
+
* render cycles after `selectedArtifactId` changes before its inner data
|
|
2796
|
+
* fetches run and its `getCurrentDataState()` becomes callable via
|
|
2797
|
+
* `callbacks.RegisterMethod('getCurrentDataState', ...)`.
|
|
2798
|
+
*
|
|
2799
|
+
* `GetCurrentStateSnapshot()` returns three distinct shapes:
|
|
2800
|
+
* - **Live**: a populated DataSnapshot with `tables[]` whose rows are filled.
|
|
2801
|
+
* - **Fallback**: an empty placeholder with only `title` + `interpretation`
|
|
2802
|
+
* ("No live data was captured — the component either has no data-fetching
|
|
2803
|
+
* hooks or has not yet run its queries"). This fires when the React
|
|
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.
|
|
2809
|
+
*
|
|
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).
|
|
2817
|
+
*/
|
|
2818
|
+
async waitForViewerSnapshot(timeoutMs) {
|
|
2819
|
+
const intervalMs = 200;
|
|
2820
|
+
const deadline = Date.now() + timeoutMs;
|
|
2821
|
+
let lastFallback = null;
|
|
2822
|
+
let tick = 0;
|
|
2823
|
+
const startTime = Date.now();
|
|
2824
|
+
console.log('[client:capture-data-snapshot] Polling for live snapshot, timeout=' + timeoutMs + 'ms');
|
|
2825
|
+
while (Date.now() < deadline) {
|
|
2826
|
+
tick++;
|
|
2827
|
+
const viewer = this.artifactViewerComponent;
|
|
2828
|
+
const snap = viewer?.GetCurrentStateSnapshot?.();
|
|
2829
|
+
if (snap) {
|
|
2830
|
+
const hasLiveData = Array.isArray(snap.tables) && snap.tables.some((t) => Array.isArray(t.rows) && t.rows.length > 0);
|
|
2831
|
+
const tableShape = Array.isArray(snap.tables)
|
|
2832
|
+
? snap.tables.map((t) => `${t.name}:${(t.rows ?? []).length}rows`).join(', ')
|
|
2833
|
+
: 'no-tables';
|
|
2834
|
+
const elapsed = Date.now() - startTime;
|
|
2835
|
+
// Log every 5th tick to avoid spamming
|
|
2836
|
+
if (tick % 5 === 1 || hasLiveData) {
|
|
2837
|
+
console.log(`[client:capture-data-snapshot] tick=${tick} elapsed=${elapsed}ms viewer=${!!viewer} ` +
|
|
2838
|
+
`snap=${!!snap} hasLiveData=${hasLiveData} shape=[${tableShape}] ` +
|
|
2839
|
+
`keys=[${Object.keys(snap).join(',')}]`);
|
|
2840
|
+
}
|
|
2841
|
+
if (hasLiveData) {
|
|
2842
|
+
return snap; // real snapshot — done
|
|
2843
|
+
}
|
|
2844
|
+
lastFallback = snap; // remember for timeout case
|
|
2845
|
+
}
|
|
2846
|
+
else if (tick % 5 === 1) {
|
|
2847
|
+
console.log(`[client:capture-data-snapshot] tick=${tick} viewer=${!!viewer} snap=null (viewer hasn't returned a snapshot yet)`);
|
|
2848
|
+
}
|
|
2849
|
+
await new Promise((r) => setTimeout(r, intervalMs));
|
|
2850
|
+
}
|
|
2851
|
+
if (lastFallback) {
|
|
2852
|
+
console.warn('[client:capture-data-snapshot] Timed out waiting for live data after ' +
|
|
2853
|
+
timeoutMs +
|
|
2854
|
+
'ms; falling back to placeholder snapshot. The component may not have registered ' +
|
|
2855
|
+
'getCurrentDataState() via callbacks.RegisterMethod, OR its data has not finished loading.');
|
|
2856
|
+
}
|
|
2857
|
+
else {
|
|
2858
|
+
console.warn('[client:capture-data-snapshot] Timed out after ' +
|
|
2859
|
+
timeoutMs +
|
|
2860
|
+
'ms — viewer never returned even a fallback snapshot. Artifact viewer may not have mounted.');
|
|
2861
|
+
}
|
|
2862
|
+
return lastFallback;
|
|
2863
|
+
}
|
|
2864
|
+
/**
|
|
2865
|
+
* Find the most-recent Component artifact attached as `Output` to this
|
|
2866
|
+
* conversation. Used when a `client:capture-data-snapshot` command arrives
|
|
2867
|
+
* without an explicit `artifactId`.
|
|
2868
|
+
*
|
|
2869
|
+
* Filtering to Component-typed artifacts is intentional even though the
|
|
2870
|
+
* command type itself is artifact-generic: the downstream
|
|
2871
|
+
* `waitForViewerSnapshot` polling waits for `tables[]` to populate (the
|
|
2872
|
+
* shape Components produce via React `getCurrentDataState()`). Falling back
|
|
2873
|
+
* to a non-Component artifact would 10s-timeout to a placeholder snapshot.
|
|
2874
|
+
* When other artifact types need a usable fallback, generalize the polling
|
|
2875
|
+
* first, then drop the filter here.
|
|
2876
|
+
*/
|
|
2877
|
+
async findMostRecentComponentArtifactId() {
|
|
2878
|
+
if (!this.conversationId || !this.currentUser)
|
|
2879
|
+
return null;
|
|
2880
|
+
try {
|
|
2881
|
+
const rv = new RunView();
|
|
2882
|
+
// Get all conversation detail IDs for this conversation, newest first.
|
|
2883
|
+
const detailsResult = await rv.RunView({
|
|
2884
|
+
EntityName: 'MJ: Conversation Details',
|
|
2885
|
+
ExtraFilter: `ConversationID='${this.conversationId}'`,
|
|
2886
|
+
Fields: ['ID'],
|
|
2887
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
2888
|
+
ResultType: 'simple',
|
|
2889
|
+
}, this.currentUser);
|
|
2890
|
+
if (!detailsResult.Success || !detailsResult.Results?.length)
|
|
2891
|
+
return null;
|
|
2892
|
+
const detailIds = detailsResult.Results.map((d) => `'${d.ID}'`).join(',');
|
|
2893
|
+
// Find the most recent Output artifact junction across those details.
|
|
2894
|
+
const junctionResult = await rv.RunView({
|
|
2895
|
+
EntityName: 'MJ: Conversation Detail Artifacts',
|
|
2896
|
+
ExtraFilter: `ConversationDetailID IN (${detailIds}) AND Direction='Output'`,
|
|
2897
|
+
OrderBy: '__mj_CreatedAt DESC',
|
|
2898
|
+
ResultType: 'simple',
|
|
2899
|
+
}, this.currentUser);
|
|
2900
|
+
if (!junctionResult.Success || !junctionResult.Results?.length)
|
|
2901
|
+
return null;
|
|
2902
|
+
// Look up artifact IDs for each version and filter to Component type.
|
|
2903
|
+
const versionIds = Array.from(new Set(junctionResult.Results.map((j) => j.ArtifactVersionID)));
|
|
2904
|
+
if (versionIds.length === 0)
|
|
2905
|
+
return null;
|
|
2906
|
+
const versionFilter = versionIds.map((id) => `'${id}'`).join(',');
|
|
2907
|
+
const versionsResult = await rv.RunView({
|
|
2908
|
+
EntityName: 'MJ: Artifact Versions',
|
|
2909
|
+
ExtraFilter: `ID IN (${versionFilter})`,
|
|
2910
|
+
Fields: ['ID', 'ArtifactID'],
|
|
2911
|
+
ResultType: 'simple',
|
|
2912
|
+
}, this.currentUser);
|
|
2913
|
+
if (!versionsResult.Success || !versionsResult.Results?.length)
|
|
2914
|
+
return null;
|
|
2915
|
+
const versionToArtifact = new Map();
|
|
2916
|
+
for (const v of versionsResult.Results) {
|
|
2917
|
+
versionToArtifact.set(v.ID, v.ArtifactID);
|
|
2918
|
+
}
|
|
2919
|
+
const artifactIds = Array.from(new Set([...versionToArtifact.values()]));
|
|
2920
|
+
const artifactFilter = artifactIds.map((id) => `'${id}'`).join(',');
|
|
2921
|
+
const artifactsResult = await rv.RunView({
|
|
2922
|
+
EntityName: 'MJ: Artifacts',
|
|
2923
|
+
ExtraFilter: `ID IN (${artifactFilter})`,
|
|
2924
|
+
ResultType: 'simple',
|
|
2925
|
+
}, this.currentUser);
|
|
2926
|
+
if (!artifactsResult.Success || !artifactsResult.Results?.length)
|
|
2927
|
+
return null;
|
|
2928
|
+
// Resolve the Component type ID from the metadata engine to filter to it.
|
|
2929
|
+
const componentType = ArtifactMetadataEngine.Instance.FindArtifactType('Component');
|
|
2930
|
+
if (!componentType)
|
|
2931
|
+
return null;
|
|
2932
|
+
const componentArtifactIds = new Set(artifactsResult.Results
|
|
2933
|
+
.filter((a) => UUIDsEqual(a.TypeID, componentType.ID))
|
|
2934
|
+
.map((a) => a.ID));
|
|
2935
|
+
if (componentArtifactIds.size === 0)
|
|
2936
|
+
return null;
|
|
2937
|
+
// Walk junctions in newest-first order; return the first whose artifact is Component.
|
|
2938
|
+
for (const junction of junctionResult.Results) {
|
|
2939
|
+
const artifactId = versionToArtifact.get(junction.ArtifactVersionID);
|
|
2940
|
+
if (artifactId && componentArtifactIds.has(artifactId)) {
|
|
2941
|
+
return artifactId;
|
|
2942
|
+
}
|
|
2943
|
+
}
|
|
2944
|
+
return null;
|
|
2945
|
+
}
|
|
2946
|
+
catch (error) {
|
|
2947
|
+
console.error('[client:capture-data-snapshot] findMostRecentComponentArtifactId failed:', error);
|
|
2948
|
+
return null;
|
|
2949
|
+
}
|
|
2457
2950
|
}
|
|
2458
2951
|
/**
|
|
2459
2952
|
* Handle close of artifact share modal
|
|
@@ -2676,7 +3169,7 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2676
3169
|
this.cdr.detectChanges();
|
|
2677
3170
|
}
|
|
2678
3171
|
}
|
|
2679
|
-
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)); };
|
|
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)); };
|
|
2680
3173
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationChatAreaComponent, selectors: [["mj-conversation-chat-area"]], viewQuery: function ConversationChatAreaComponent_Query(rf, ctx) { if (rf & 1) {
|
|
2681
3174
|
i0.ɵɵviewQuery(_c0, 5)(ArtifactViewerPanelComponent, 5)(ConversationEmptyStateComponent, 5)(_c1, 5);
|
|
2682
3175
|
} if (rf & 2) {
|
|
@@ -2685,48 +3178,48 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2685
3178
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.artifactViewerComponent = _t.first);
|
|
2686
3179
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.emptyStateComponent = _t.first);
|
|
2687
3180
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.messageInputComponents = _t);
|
|
2688
|
-
} }, 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) {
|
|
2689
3182
|
i0.ɵɵelementStart(0, "div", 2);
|
|
2690
|
-
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_1_Template,
|
|
3183
|
+
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_1_Template, 15, 14, "div", 3);
|
|
2691
3184
|
i0.ɵɵelementStart(2, "div", 4)(3, "div", 5);
|
|
2692
|
-
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);
|
|
2693
3186
|
i0.ɵɵelementEnd();
|
|
2694
|
-
i0.ɵɵconditionalCreate(
|
|
2695
|
-
i0.ɵɵelementStart(
|
|
2696
|
-
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(); });
|
|
2697
3190
|
i0.ɵɵelementEnd();
|
|
2698
|
-
i0.ɵɵconditionalCreate(
|
|
3191
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_10_Template, 1, 1, "mj-pinned-messages-panel", 10);
|
|
2699
3192
|
i0.ɵɵelementEnd()();
|
|
2700
|
-
i0.ɵɵconditionalCreate(
|
|
2701
|
-
i0.ɵɵelementStart(
|
|
2702
|
-
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(); });
|
|
2703
3196
|
i0.ɵɵelementEnd();
|
|
2704
|
-
i0.ɵɵelementStart(
|
|
2705
|
-
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); });
|
|
2706
3199
|
i0.ɵɵelementEnd();
|
|
2707
|
-
i0.ɵɵelementStart(
|
|
2708
|
-
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; });
|
|
2709
3202
|
i0.ɵɵelementEnd();
|
|
2710
|
-
i0.ɵɵconditionalCreate(
|
|
2711
|
-
i0.ɵɵconditionalCreate(
|
|
2712
|
-
i0.ɵɵconditionalCreate(
|
|
2713
|
-
i0.ɵɵconditionalCreate(
|
|
2714
|
-
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);
|
|
2715
3208
|
} if (rf & 2) {
|
|
2716
3209
|
i0.ɵɵadvance();
|
|
2717
|
-
i0.ɵɵconditional(ctx.conversation ? 1 : -1);
|
|
3210
|
+
i0.ɵɵconditional(ctx.conversation || ctx.HasPreConversationHeader ? 1 : -1);
|
|
2718
3211
|
i0.ɵɵadvance(2);
|
|
2719
3212
|
i0.ɵɵclassProp("full-width", !ctx.showArtifactPanel)("hidden", ctx.isArtifactPaneMaximized);
|
|
2720
3213
|
i0.ɵɵadvance();
|
|
2721
|
-
i0.ɵɵconditional(ctx.isLoadingConversation ? 4 : ctx.isNewConversation || !ctx.conversationId ? 5 : 6);
|
|
2722
|
-
i0.ɵɵadvance(
|
|
2723
|
-
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);
|
|
2724
3217
|
i0.ɵɵadvance();
|
|
2725
3218
|
i0.ɵɵproperty("isOpen", ctx.isArtifactShareModalOpen)("artifact", ctx.artifactToShare)("currentUser", ctx.currentUser);
|
|
2726
3219
|
i0.ɵɵadvance();
|
|
2727
|
-
i0.ɵɵconditional(ctx.showPinsPanel ?
|
|
3220
|
+
i0.ɵɵconditional(ctx.showPinsPanel ? 10 : -1);
|
|
2728
3221
|
i0.ɵɵadvance();
|
|
2729
|
-
i0.ɵɵconditional(ctx.threadId ?
|
|
3222
|
+
i0.ɵɵconditional(ctx.threadId ? 11 : -1);
|
|
2730
3223
|
i0.ɵɵadvance();
|
|
2731
3224
|
i0.ɵɵproperty("isVisible", ctx.showExportModal)("conversation", ctx.conversation || undefined)("currentUser", ctx.currentUser);
|
|
2732
3225
|
i0.ɵɵadvance();
|
|
@@ -2734,21 +3227,21 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2734
3227
|
i0.ɵɵadvance();
|
|
2735
3228
|
i0.ɵɵproperty("isVisible", ctx.showMembersModal)("conversation", ctx.conversation || undefined)("currentUser", ctx.currentUser);
|
|
2736
3229
|
i0.ɵɵadvance();
|
|
2737
|
-
i0.ɵɵconditional(ctx.showProjectSelector && ctx.conversation ?
|
|
3230
|
+
i0.ɵɵconditional(ctx.showProjectSelector && ctx.conversation ? 15 : -1);
|
|
2738
3231
|
i0.ɵɵadvance();
|
|
2739
|
-
i0.ɵɵconditional(ctx.showArtifactsModal ?
|
|
3232
|
+
i0.ɵɵconditional(ctx.showArtifactsModal ? 16 : -1);
|
|
2740
3233
|
i0.ɵɵadvance();
|
|
2741
|
-
i0.ɵɵconditional(ctx.showCollectionPicker ?
|
|
3234
|
+
i0.ɵɵconditional(ctx.showCollectionPicker ? 17 : -1);
|
|
2742
3235
|
i0.ɵɵadvance();
|
|
2743
|
-
i0.ɵɵconditional(ctx.testFeedbackDialogData ?
|
|
3236
|
+
i0.ɵɵconditional(ctx.testFeedbackDialogData ? 18 : -1);
|
|
2744
3237
|
i0.ɵɵadvance();
|
|
2745
|
-
i0.ɵɵconditional(ctx.showImageViewer ?
|
|
2746
|
-
} }, dependencies: [i11.MJButtonDirective, i10.ArtifactViewerPanelComponent, i12.TestFeedbackDialogComponent, i13.LoadingComponent, i14.GenericShareDialogComponent, i15.ArtifactCollectionPickerModalComponent, i16.ArtifactShareModalComponent, i17.MessageListComponent, i18.MessageInputComponent, i19.ConversationEmptyStateComponent, i20.ThreadPanelComponent, i21.ProjectSelectorComponent, i22.MembersModalComponent, i23.ExportModalComponent, i24.ImageViewerComponent, i25.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}"] });
|
|
2747
3240
|
}
|
|
2748
3241
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationChatAreaComponent, [{
|
|
2749
3242
|
type: Component,
|
|
2750
|
-
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"] }]
|
|
2751
|
-
}], () => [{ 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 }], { 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: [{
|
|
2752
3245
|
type: Input
|
|
2753
3246
|
}], currentUser: [{
|
|
2754
3247
|
type: Input
|
|
@@ -2758,6 +3251,12 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2758
3251
|
type: Input
|
|
2759
3252
|
}], threadId: [{
|
|
2760
3253
|
type: Input
|
|
3254
|
+
}], suppressNewConversationEmptyState: [{
|
|
3255
|
+
type: Input
|
|
3256
|
+
}], allowMentions: [{
|
|
3257
|
+
type: Input
|
|
3258
|
+
}], allowAttachments: [{
|
|
3259
|
+
type: Input
|
|
2761
3260
|
}], isNewConversation: [{
|
|
2762
3261
|
type: Input
|
|
2763
3262
|
}], pendingMessage: [{
|
|
@@ -2778,6 +3277,20 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2778
3277
|
type: Input
|
|
2779
3278
|
}], appContext: [{
|
|
2780
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
|
|
2781
3294
|
}], emptyStateGreeting: [{
|
|
2782
3295
|
type: Input
|
|
2783
3296
|
}], showSidebarToggle: [{
|
|
@@ -2819,5 +3332,5 @@ export class ConversationChatAreaComponent extends BaseAngularComponent {
|
|
|
2819
3332
|
type: ViewChild,
|
|
2820
3333
|
args: [ConversationEmptyStateComponent]
|
|
2821
3334
|
}] }); })();
|
|
2822
|
-
(() => { (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 }); })();
|
|
2823
3336
|
//# sourceMappingURL=conversation-chat-area.component.js.map
|