@memberjunction/ng-conversations 5.28.0 → 5.30.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/dist/__tests__/attachment-badge.test.d.ts +2 -0
- package/dist/__tests__/attachment-badge.test.d.ts.map +1 -0
- package/dist/__tests__/attachment-badge.test.js +66 -0
- package/dist/__tests__/attachment-badge.test.js.map +1 -0
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +9 -1
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +56 -39
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +348 -346
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +4 -0
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +108 -65
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts +7 -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 +10 -4
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +20 -4
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +154 -131
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +7 -6
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +5 -0
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-attachment.service.js +29 -2
- package/dist/lib/services/conversation-attachment.service.js.map +1 -1
- package/dist/lib/util/attachment-badge.d.ts +19 -0
- package/dist/lib/util/attachment-badge.d.ts.map +1 -0
- package/dist/lib/util/attachment-badge.js +41 -0
- package/dist/lib/util/attachment-badge.js.map +1 -0
- package/package.json +22 -21
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ViewChild, ViewChildren } from '@angular/core';
|
|
2
|
-
import { Metadata, CompositeKey, LogStatusEx
|
|
2
|
+
import { Metadata, CompositeKey, LogStatusEx } from '@memberjunction/core';
|
|
3
3
|
import { ConversationEngine } from '@memberjunction/core-entities';
|
|
4
4
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
5
|
+
import { MJResourcePermissionShareAdapter } from '@memberjunction/ng-resource-permissions';
|
|
5
6
|
import { LazyArtifactInfo } from '../../models/lazy-artifact-info';
|
|
6
7
|
import { ArtifactViewerPanelComponent } from '@memberjunction/ng-artifacts';
|
|
7
8
|
import { ConversationEmptyStateComponent } from './conversation-empty-state.component';
|
|
@@ -18,89 +19,87 @@ import * as i6 from "../../services/conversation-attachment.service";
|
|
|
18
19
|
import * as i7 from "../../services/conversation-streaming.service";
|
|
19
20
|
import * as i8 from "../../services/dialog.service";
|
|
20
21
|
import * as i9 from "../../services/conversation-bridge.service";
|
|
21
|
-
import * as i10 from "@memberjunction/ng-
|
|
22
|
-
import * as i11 from "@memberjunction/ng-
|
|
22
|
+
import * as i10 from "@memberjunction/ng-artifacts";
|
|
23
|
+
import * as i11 from "@memberjunction/ng-ui-components";
|
|
23
24
|
import * as i12 from "@memberjunction/ng-testing";
|
|
24
25
|
import * as i13 from "@memberjunction/ng-shared-generic";
|
|
25
|
-
import * as i14 from "
|
|
26
|
-
import * as i15 from "../
|
|
27
|
-
import * as i16 from "../
|
|
28
|
-
import * as i17 from "../message/message-
|
|
29
|
-
import * as i18 from "
|
|
30
|
-
import * as i19 from "
|
|
31
|
-
import * as i20 from "../
|
|
32
|
-
import * as i21 from "../
|
|
33
|
-
import * as i22 from "../
|
|
34
|
-
import * as i23 from "../
|
|
35
|
-
import * as i24 from "
|
|
36
|
-
import * as i25 from "
|
|
26
|
+
import * as i14 from "@memberjunction/ng-resource-permissions";
|
|
27
|
+
import * as i15 from "../collection/artifact-collection-picker-modal.component";
|
|
28
|
+
import * as i16 from "../artifact/artifact-share-modal.component";
|
|
29
|
+
import * as i17 from "../message/message-list.component";
|
|
30
|
+
import * as i18 from "../message/message-input.component";
|
|
31
|
+
import * as i19 from "./conversation-empty-state.component";
|
|
32
|
+
import * as i20 from "../thread/thread-panel.component";
|
|
33
|
+
import * as i21 from "../project/project-selector.component";
|
|
34
|
+
import * as i22 from "../members/members-modal.component";
|
|
35
|
+
import * as i23 from "../export/export-modal.component";
|
|
36
|
+
import * as i24 from "../attachment/image-viewer.component";
|
|
37
|
+
import * as i25 from "./pinned-messages-panel.component";
|
|
37
38
|
const _c0 = ["scrollContainer"];
|
|
38
39
|
const _c1 = ["messageInput"];
|
|
39
40
|
const _c2 = () => [];
|
|
40
41
|
const _forTrack0 = ($index, $item) => $item.conversationId;
|
|
41
42
|
const _forTrack1 = ($index, $item) => $item.artifactId;
|
|
42
43
|
const _forTrack2 = ($index, $item) => $item.versionId;
|
|
43
|
-
const _forTrack3 = ($index, $item) => $item.artifactVersionId;
|
|
44
44
|
function ConversationChatAreaComponent_Conditional_1_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
45
45
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
46
|
-
i0.ɵɵelementStart(0, "button",
|
|
46
|
+
i0.ɵɵelementStart(0, "button", 31);
|
|
47
47
|
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()); });
|
|
48
|
-
i0.ɵɵelement(1, "i",
|
|
48
|
+
i0.ɵɵelement(1, "i", 32);
|
|
49
49
|
i0.ɵɵelementEnd();
|
|
50
50
|
} }
|
|
51
51
|
function ConversationChatAreaComponent_Conditional_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
52
|
-
|
|
53
|
-
i0.ɵɵ
|
|
54
|
-
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()); });
|
|
55
|
-
i0.ɵɵelement(1, "i", 32);
|
|
52
|
+
i0.ɵɵelementStart(0, "span", 22);
|
|
53
|
+
i0.ɵɵelement(1, "i", 33);
|
|
56
54
|
i0.ɵɵelementStart(2, "span");
|
|
57
55
|
i0.ɵɵtext(3);
|
|
58
56
|
i0.ɵɵelementEnd()();
|
|
59
57
|
} if (rf & 2) {
|
|
60
58
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
59
|
+
i0.ɵɵproperty("title", ctx_r1.sharedByBadge.fullTooltip);
|
|
61
60
|
i0.ɵɵadvance(3);
|
|
62
|
-
i0.ɵɵ
|
|
61
|
+
i0.ɵɵtextInterpolate1("Shared by ", ctx_r1.sharedByBadge.display);
|
|
63
62
|
} }
|
|
64
63
|
function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
-
const
|
|
66
|
-
i0.ɵɵelementStart(0, "button",
|
|
67
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
68
|
-
i0.ɵɵelement(1, "i",
|
|
64
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
65
|
+
i0.ɵɵelementStart(0, "button", 34);
|
|
66
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openProjectSelector()); });
|
|
67
|
+
i0.ɵɵelement(1, "i", 35);
|
|
69
68
|
i0.ɵɵelementStart(2, "span");
|
|
70
|
-
i0.ɵɵtext(3, "Test");
|
|
71
|
-
i0.ɵɵelementEnd()();
|
|
72
|
-
} }
|
|
73
|
-
function ConversationChatAreaComponent_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
74
|
-
const _r5 = i0.ɵɵgetCurrentView();
|
|
75
|
-
i0.ɵɵelementStart(0, "button", 35);
|
|
76
|
-
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); });
|
|
77
|
-
i0.ɵɵelement(1, "i", 36);
|
|
78
|
-
i0.ɵɵelementStart(2, "span", 37);
|
|
79
69
|
i0.ɵɵtext(3);
|
|
80
70
|
i0.ɵɵelementEnd()();
|
|
81
71
|
} if (rf & 2) {
|
|
82
72
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
83
|
-
i0.ɵɵclassProp("active", ctx_r1.showPinsPanel);
|
|
84
73
|
i0.ɵɵadvance(3);
|
|
85
|
-
i0.ɵɵtextInterpolate(ctx_r1.
|
|
74
|
+
i0.ɵɵtextInterpolate(ctx_r1.conversation.Project || "Project");
|
|
75
|
+
} }
|
|
76
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
77
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
78
|
+
i0.ɵɵelementStart(0, "button", 36);
|
|
79
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_7_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.viewTestRun(ctx_r1.conversation.TestRunID)); });
|
|
80
|
+
i0.ɵɵelement(1, "i", 37);
|
|
81
|
+
i0.ɵɵelementStart(2, "span");
|
|
82
|
+
i0.ɵɵtext(3, "Test");
|
|
83
|
+
i0.ɵɵelementEnd()();
|
|
86
84
|
} }
|
|
87
85
|
function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
88
|
-
const
|
|
86
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
89
87
|
i0.ɵɵelementStart(0, "button", 38);
|
|
90
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
88
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.showPinsPanel = !ctx_r1.showPinsPanel); });
|
|
91
89
|
i0.ɵɵelement(1, "i", 39);
|
|
92
90
|
i0.ɵɵelementStart(2, "span", 40);
|
|
93
91
|
i0.ɵɵtext(3);
|
|
94
92
|
i0.ɵɵelementEnd()();
|
|
95
93
|
} if (rf & 2) {
|
|
96
94
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
95
|
+
i0.ɵɵclassProp("active", ctx_r1.showPinsPanel);
|
|
97
96
|
i0.ɵɵadvance(3);
|
|
98
|
-
i0.ɵɵtextInterpolate(ctx_r1.
|
|
97
|
+
i0.ɵɵtextInterpolate(ctx_r1.pinnedMessages.length);
|
|
99
98
|
} }
|
|
100
99
|
function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
101
|
-
const
|
|
100
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
102
101
|
i0.ɵɵelementStart(0, "button", 41);
|
|
103
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
102
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.viewArtifacts()); });
|
|
104
103
|
i0.ɵɵelement(1, "i", 42);
|
|
105
104
|
i0.ɵɵelementStart(2, "span", 43);
|
|
106
105
|
i0.ɵɵtext(3);
|
|
@@ -108,23 +107,36 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_10_Template(rf,
|
|
|
108
107
|
} if (rf & 2) {
|
|
109
108
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
110
109
|
i0.ɵɵadvance(3);
|
|
111
|
-
i0.ɵɵtextInterpolate(ctx_r1.
|
|
110
|
+
i0.ɵɵtextInterpolate(ctx_r1.artifactCountDisplay);
|
|
112
111
|
} }
|
|
113
112
|
function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf & 1) {
|
|
114
|
-
const
|
|
113
|
+
const _r7 = i0.ɵɵgetCurrentView();
|
|
115
114
|
i0.ɵɵelementStart(0, "button", 44);
|
|
116
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
115
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleMembersModal()); });
|
|
117
116
|
i0.ɵɵelement(1, "i", 45);
|
|
118
117
|
i0.ɵɵelementStart(2, "span", 46);
|
|
119
|
-
i0.ɵɵtext(3
|
|
118
|
+
i0.ɵɵtext(3);
|
|
120
119
|
i0.ɵɵelementEnd()();
|
|
120
|
+
} if (rf & 2) {
|
|
121
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
122
|
+
i0.ɵɵadvance(3);
|
|
123
|
+
i0.ɵɵtextInterpolate(ctx_r1.memberCount);
|
|
121
124
|
} }
|
|
122
125
|
function ConversationChatAreaComponent_Conditional_1_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
123
|
-
const
|
|
126
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
124
127
|
i0.ɵɵelementStart(0, "button", 47);
|
|
125
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(
|
|
128
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_1_Conditional_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.exportConversation()); });
|
|
126
129
|
i0.ɵɵelement(1, "i", 48);
|
|
127
|
-
i0.ɵɵelementStart(2, "span",
|
|
130
|
+
i0.ɵɵelementStart(2, "span", 49);
|
|
131
|
+
i0.ɵɵtext(3, "Export");
|
|
132
|
+
i0.ɵɵelementEnd()();
|
|
133
|
+
} }
|
|
134
|
+
function ConversationChatAreaComponent_Conditional_1_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
135
|
+
const _r9 = i0.ɵɵgetCurrentView();
|
|
136
|
+
i0.ɵɵelementStart(0, "button", 50);
|
|
137
|
+
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.shareConversation()); });
|
|
138
|
+
i0.ɵɵelement(1, "i", 33);
|
|
139
|
+
i0.ɵɵelementStart(2, "span", 49);
|
|
128
140
|
i0.ɵɵtext(3, "Share");
|
|
129
141
|
i0.ɵɵelementEnd()();
|
|
130
142
|
} if (rf & 2) {
|
|
@@ -133,20 +145,21 @@ function ConversationChatAreaComponent_Conditional_1_Conditional_12_Template(rf,
|
|
|
133
145
|
i0.ɵɵproperty("title", ctx_r1.isShared ? "Manage sharing" : "Share conversation");
|
|
134
146
|
} }
|
|
135
147
|
function ConversationChatAreaComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
136
|
-
i0.ɵɵelementStart(0, "div", 3)(1, "div",
|
|
137
|
-
i0.ɵɵconditionalCreate(2, ConversationChatAreaComponent_Conditional_1_Conditional_2_Template, 2, 0, "button",
|
|
138
|
-
i0.ɵɵelementStart(3, "div",
|
|
148
|
+
i0.ɵɵelementStart(0, "div", 3)(1, "div", 19);
|
|
149
|
+
i0.ɵɵconditionalCreate(2, ConversationChatAreaComponent_Conditional_1_Conditional_2_Template, 2, 0, "button", 20);
|
|
150
|
+
i0.ɵɵelementStart(3, "div", 21);
|
|
139
151
|
i0.ɵɵtext(4);
|
|
140
152
|
i0.ɵɵelementEnd();
|
|
141
|
-
i0.ɵɵconditionalCreate(5, ConversationChatAreaComponent_Conditional_1_Conditional_5_Template, 4,
|
|
142
|
-
i0.ɵɵconditionalCreate(6, ConversationChatAreaComponent_Conditional_1_Conditional_6_Template, 4,
|
|
153
|
+
i0.ɵɵconditionalCreate(5, ConversationChatAreaComponent_Conditional_1_Conditional_5_Template, 4, 2, "span", 22);
|
|
154
|
+
i0.ɵɵconditionalCreate(6, ConversationChatAreaComponent_Conditional_1_Conditional_6_Template, 4, 1, "button", 23);
|
|
155
|
+
i0.ɵɵconditionalCreate(7, ConversationChatAreaComponent_Conditional_1_Conditional_7_Template, 4, 0, "button", 24);
|
|
143
156
|
i0.ɵɵelementEnd();
|
|
144
|
-
i0.ɵɵelementStart(
|
|
145
|
-
i0.ɵɵconditionalCreate(
|
|
146
|
-
i0.ɵɵconditionalCreate(
|
|
147
|
-
i0.ɵɵconditionalCreate(
|
|
148
|
-
i0.ɵɵconditionalCreate(
|
|
149
|
-
i0.ɵɵconditionalCreate(
|
|
157
|
+
i0.ɵɵelementStart(8, "div", 25);
|
|
158
|
+
i0.ɵɵconditionalCreate(9, ConversationChatAreaComponent_Conditional_1_Conditional_9_Template, 4, 3, "button", 26);
|
|
159
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_1_Conditional_10_Template, 4, 1, "button", 27);
|
|
160
|
+
i0.ɵɵconditionalCreate(11, ConversationChatAreaComponent_Conditional_1_Conditional_11_Template, 4, 1, "button", 28);
|
|
161
|
+
i0.ɵɵconditionalCreate(12, ConversationChatAreaComponent_Conditional_1_Conditional_12_Template, 4, 0, "button", 29);
|
|
162
|
+
i0.ɵɵconditionalCreate(13, ConversationChatAreaComponent_Conditional_1_Conditional_13_Template, 4, 3, "button", 30);
|
|
150
163
|
i0.ɵɵelementEnd()();
|
|
151
164
|
} if (rf & 2) {
|
|
152
165
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -157,28 +170,30 @@ function ConversationChatAreaComponent_Conditional_1_Template(rf, ctx) { if (rf
|
|
|
157
170
|
i0.ɵɵadvance(2);
|
|
158
171
|
i0.ɵɵtextInterpolate(ctx_r1.conversation.Name || "");
|
|
159
172
|
i0.ɵɵadvance();
|
|
160
|
-
i0.ɵɵconditional(ctx_r1.
|
|
173
|
+
i0.ɵɵconditional(ctx_r1.sharedByBadge ? 5 : -1);
|
|
161
174
|
i0.ɵɵadvance();
|
|
162
|
-
i0.ɵɵconditional(ctx_r1.conversation.
|
|
175
|
+
i0.ɵɵconditional(ctx_r1.conversation.ProjectID ? 6 : -1);
|
|
176
|
+
i0.ɵɵadvance();
|
|
177
|
+
i0.ɵɵconditional(ctx_r1.conversation.TestRunID ? 7 : -1);
|
|
163
178
|
i0.ɵɵadvance(2);
|
|
164
|
-
i0.ɵɵconditional(ctx_r1.pinnedMessages.length > 0 ?
|
|
179
|
+
i0.ɵɵconditional(ctx_r1.pinnedMessages.length > 0 ? 9 : -1);
|
|
165
180
|
i0.ɵɵadvance();
|
|
166
|
-
i0.ɵɵconditional(ctx_r1.showArtifactIndicator && ctx_r1.artifactCountDisplay > 0 ?
|
|
181
|
+
i0.ɵɵconditional(ctx_r1.showArtifactIndicator && ctx_r1.artifactCountDisplay > 0 ? 10 : -1);
|
|
167
182
|
i0.ɵɵadvance();
|
|
168
|
-
i0.ɵɵconditional(ctx_r1.memberCount > 1 ?
|
|
183
|
+
i0.ɵɵconditional(ctx_r1.memberCount > 1 ? 11 : -1);
|
|
169
184
|
i0.ɵɵadvance();
|
|
170
|
-
i0.ɵɵconditional(ctx_r1.showExportButton ?
|
|
185
|
+
i0.ɵɵconditional(ctx_r1.showExportButton ? 12 : -1);
|
|
171
186
|
i0.ɵɵadvance();
|
|
172
|
-
i0.ɵɵconditional(ctx_r1.showShareButton ?
|
|
187
|
+
i0.ɵɵconditional(ctx_r1.showShareButton && ctx_r1.canShareConversation ? 13 : -1);
|
|
173
188
|
} }
|
|
174
189
|
function ConversationChatAreaComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
175
190
|
i0.ɵɵelementStart(0, "div", 6);
|
|
176
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
191
|
+
i0.ɵɵelement(1, "mj-loading", 51);
|
|
177
192
|
i0.ɵɵelementEnd();
|
|
178
193
|
} }
|
|
179
194
|
function ConversationChatAreaComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
180
195
|
const _r10 = i0.ɵɵgetCurrentView();
|
|
181
|
-
i0.ɵɵelementStart(0, "mj-conversation-empty-state",
|
|
196
|
+
i0.ɵɵelementStart(0, "mj-conversation-empty-state", 52);
|
|
182
197
|
i0.ɵɵlistener("sidebarToggleClicked", function ConversationChatAreaComponent_Conditional_5_Template_mj_conversation_empty_state_sidebarToggleClicked_0_listener() { i0.ɵɵrestoreView(_r10); 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(_r10); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onEmptyStateMessageSent($event)); });
|
|
183
198
|
i0.ɵɵelementEnd();
|
|
184
199
|
} if (rf & 2) {
|
|
@@ -186,8 +201,8 @@ function ConversationChatAreaComponent_Conditional_5_Template(rf, ctx) { if (rf
|
|
|
186
201
|
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);
|
|
187
202
|
} }
|
|
188
203
|
function ConversationChatAreaComponent_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
189
|
-
i0.ɵɵelementStart(0, "div",
|
|
190
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
204
|
+
i0.ɵɵelementStart(0, "div", 53);
|
|
205
|
+
i0.ɵɵelement(1, "mj-loading", 59);
|
|
191
206
|
i0.ɵɵelementEnd();
|
|
192
207
|
} if (rf & 2) {
|
|
193
208
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -196,48 +211,57 @@ function ConversationChatAreaComponent_Conditional_6_Conditional_1_Template(rf,
|
|
|
196
211
|
} }
|
|
197
212
|
function ConversationChatAreaComponent_Conditional_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
198
213
|
const _r12 = i0.ɵɵgetCurrentView();
|
|
199
|
-
i0.ɵɵelementStart(0, "span",
|
|
214
|
+
i0.ɵɵelementStart(0, "span", 60);
|
|
200
215
|
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_6_Conditional_5_Template_span_click_0_listener() { i0.ɵɵrestoreView(_r12); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.scrollToBottomAnimate()); });
|
|
201
|
-
i0.ɵɵelement(1, "i",
|
|
216
|
+
i0.ɵɵelement(1, "i", 61);
|
|
202
217
|
i0.ɵɵelementEnd();
|
|
203
218
|
} }
|
|
204
219
|
function ConversationChatAreaComponent_Conditional_6_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
205
|
-
i0.ɵɵelementStart(0, "div",
|
|
206
|
-
i0.ɵɵelement(1, "mj-loading",
|
|
220
|
+
i0.ɵɵelementStart(0, "div", 58);
|
|
221
|
+
i0.ɵɵelement(1, "mj-loading", 62);
|
|
207
222
|
i0.ɵɵelementEnd();
|
|
208
223
|
} }
|
|
209
|
-
function
|
|
224
|
+
function ConversationChatAreaComponent_Conditional_6_Conditional_8_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
225
|
+
i0.ɵɵelementStart(0, "div", 63);
|
|
226
|
+
i0.ɵɵelement(1, "i", 66);
|
|
227
|
+
i0.ɵɵelementStart(2, "span");
|
|
228
|
+
i0.ɵɵtext(3, "You have view-only access to this conversation.");
|
|
229
|
+
i0.ɵɵelementEnd()();
|
|
230
|
+
} }
|
|
231
|
+
function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template(rf, ctx) { if (rf & 1) {
|
|
210
232
|
const _r13 = i0.ɵɵgetCurrentView();
|
|
211
|
-
i0.ɵɵelementStart(0, "mj-message-input",
|
|
212
|
-
i0.ɵɵlistener("messageSent", function
|
|
233
|
+
i0.ɵɵelementStart(0, "mj-message-input", 67, 1);
|
|
234
|
+
i0.ɵɵlistener("messageSent", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_messageSent_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onMessageSent($event)); })("agentResponse", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_agentResponse_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onAgentResponse($event)); })("agentRunDetected", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_agentRunDetected_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onAgentRunDetected($event)); })("agentRunUpdate", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_agentRunUpdate_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onAgentRunUpdate($event)); })("messageComplete", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_messageComplete_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onMessageComplete($event)); })("artifactCreated", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_artifactCreated_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onArtifactCreated($event)); })("conversationRenamed", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_conversationRenamed_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("intentCheckStarted", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_intentCheckStarted_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onIntentCheckStarted()); })("intentCheckCompleted", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_intentCheckCompleted_0_listener() { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onIntentCheckCompleted()); })("uploadStateChanged", function ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template_mj_message_input_uploadStateChanged_0_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onUploadStateChanged($event)); });
|
|
213
235
|
i0.ɵɵelementEnd();
|
|
214
236
|
} if (rf & 2) {
|
|
215
237
|
const inputRef_r14 = ctx.$implicit;
|
|
216
238
|
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
217
|
-
i0.ɵɵproperty("hidden", inputRef_r14.conversationId !== ctx_r1.conversationId)("conversationId", inputRef_r14.conversationId)("conversationName", inputRef_r14.conversationName)("currentUser", ctx_r1.currentUser)("conversationHistory", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.messages : i0.ɵɵpureFunction0(17, _c2))("artifactsByDetailId", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.artifactsByDetailId : ctx_r1.emptyArtifactsMap)("systemArtifactsByDetailId", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.systemArtifactsByDetailId : ctx_r1.emptyArtifactsMap)("agentRunsByDetailId", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.agentRunsByDetailId : ctx_r1.emptyAgentRunsMap)("appContext", ctx_r1.appContext)("inProgressMessageIds", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.inProgressMessageIds : ctx_r1.emptyInProgressIds)("disabled", ctx_r1.isProcessing)("enableAttachments", ctx_r1.enableAttachments)("maxAttachments", ctx_r1.maxAttachments)("maxAttachmentSizeBytes", ctx_r1.maxAttachmentSizeBytes)("acceptedFileTypes", ctx_r1.acceptedFileTypes)("initialMessage", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.pendingMessage : null)("initialAttachments", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.pendingAttachments : null);
|
|
239
|
+
i0.ɵɵproperty("hidden", inputRef_r14.conversationId !== ctx_r1.conversationId)("conversationId", inputRef_r14.conversationId)("conversationName", inputRef_r14.conversationName)("currentUser", ctx_r1.currentUser)("conversationHistory", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.messages : i0.ɵɵpureFunction0(17, _c2))("artifactsByDetailId", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.artifactsByDetailId : ctx_r1.emptyArtifactsMap)("systemArtifactsByDetailId", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.systemArtifactsByDetailId : ctx_r1.emptyArtifactsMap)("agentRunsByDetailId", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.agentRunsByDetailId : ctx_r1.emptyAgentRunsMap)("appContext", ctx_r1.appContext)("inProgressMessageIds", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.inProgressMessageIds : ctx_r1.emptyInProgressIds)("disabled", ctx_r1.isProcessing || ctx_r1.isReadOnlyView)("enableAttachments", ctx_r1.enableAttachments)("maxAttachments", ctx_r1.maxAttachments)("maxAttachmentSizeBytes", ctx_r1.maxAttachmentSizeBytes)("acceptedFileTypes", ctx_r1.acceptedFileTypes)("initialMessage", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.pendingMessage : null)("initialAttachments", inputRef_r14.conversationId === ctx_r1.conversationId ? ctx_r1.pendingAttachments : null);
|
|
218
240
|
} }
|
|
219
241
|
function ConversationChatAreaComponent_Conditional_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
220
|
-
i0.ɵɵ
|
|
221
|
-
i0.ɵɵ
|
|
242
|
+
i0.ɵɵconditionalCreate(0, ConversationChatAreaComponent_Conditional_6_Conditional_8_Conditional_0_Template, 4, 0, "div", 63);
|
|
243
|
+
i0.ɵɵelementStart(1, "div", 64);
|
|
244
|
+
i0.ɵɵrepeaterCreate(2, ConversationChatAreaComponent_Conditional_6_Conditional_8_For_3_Template, 2, 18, "mj-message-input", 65, _forTrack0);
|
|
222
245
|
i0.ɵɵelementEnd();
|
|
223
246
|
} if (rf & 2) {
|
|
224
247
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
225
|
-
i0.ɵɵ
|
|
248
|
+
i0.ɵɵconditional(ctx_r1.isReadOnlyView ? 0 : -1);
|
|
249
|
+
i0.ɵɵadvance(2);
|
|
226
250
|
i0.ɵɵrepeater(ctx_r1.getCachedInputs());
|
|
227
251
|
} }
|
|
228
252
|
function ConversationChatAreaComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
229
253
|
const _r11 = i0.ɵɵgetCurrentView();
|
|
230
254
|
i0.ɵɵelementStart(0, "div", 8);
|
|
231
|
-
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_6_Conditional_1_Template, 2, 1, "div",
|
|
232
|
-
i0.ɵɵelementStart(2, "div",
|
|
255
|
+
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_6_Conditional_1_Template, 2, 1, "div", 53);
|
|
256
|
+
i0.ɵɵelementStart(2, "div", 54, 0);
|
|
233
257
|
i0.ɵɵlistener("scroll", function ConversationChatAreaComponent_Conditional_6_Template_div_scroll_2_listener() { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.checkScroll()); });
|
|
234
|
-
i0.ɵɵelementStart(4, "mj-conversation-message-list",
|
|
258
|
+
i0.ɵɵelementStart(4, "mj-conversation-message-list", 55);
|
|
235
259
|
i0.ɵɵlistener("replyInThread", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_replyInThread_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onReplyInThread($event)); })("viewThread", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_viewThread_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onViewThread($event)); })("deleteMessage", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_deleteMessage_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDeleteMessage($event)); })("retryMessage", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_retryMessage_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onRetryMessage($event)); })("testFeedbackMessage", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_testFeedbackMessage_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestFeedbackMessage($event)); })("artifactClicked", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_artifactClicked_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactClicked($event)); })("messageEdited", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_messageEdited_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMessageEdited($event)); })("openEntityRecord", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_openEntityRecord_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("suggestedResponseSelected", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_suggestedResponseSelected_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSuggestedResponseSelected($event)); })("attachmentClicked", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_attachmentClicked_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onAttachmentClicked($event)); })("diagnosticRequested", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_diagnosticRequested_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onDiagnosticRequested($event)); })("messagePinToggled", function ConversationChatAreaComponent_Conditional_6_Template_mj_conversation_message_list_messagePinToggled_4_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMessagePinToggled($event)); });
|
|
236
260
|
i0.ɵɵelementEnd();
|
|
237
|
-
i0.ɵɵconditionalCreate(5, ConversationChatAreaComponent_Conditional_6_Conditional_5_Template, 2, 0, "span",
|
|
261
|
+
i0.ɵɵconditionalCreate(5, ConversationChatAreaComponent_Conditional_6_Conditional_5_Template, 2, 0, "span", 56);
|
|
238
262
|
i0.ɵɵelementEnd();
|
|
239
|
-
i0.ɵɵelementStart(6, "div",
|
|
240
|
-
i0.ɵɵconditionalCreate(7, ConversationChatAreaComponent_Conditional_6_Conditional_7_Template, 2, 0, "div",
|
|
263
|
+
i0.ɵɵelementStart(6, "div", 57);
|
|
264
|
+
i0.ɵɵconditionalCreate(7, ConversationChatAreaComponent_Conditional_6_Conditional_7_Template, 2, 0, "div", 58)(8, ConversationChatAreaComponent_Conditional_6_Conditional_8_Template, 4, 1);
|
|
241
265
|
i0.ɵɵelementEnd()();
|
|
242
266
|
} if (rf & 2) {
|
|
243
267
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -252,15 +276,15 @@ function ConversationChatAreaComponent_Conditional_6_Template(rf, ctx) { if (rf
|
|
|
252
276
|
} }
|
|
253
277
|
function ConversationChatAreaComponent_Conditional_7_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
254
278
|
const _r16 = i0.ɵɵgetCurrentView();
|
|
255
|
-
i0.ɵɵelementStart(0, "div",
|
|
279
|
+
i0.ɵɵelementStart(0, "div", 71);
|
|
256
280
|
i0.ɵɵlistener("mousedown", function ConversationChatAreaComponent_Conditional_7_Conditional_0_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onResizeStart($event)); })("touchstart", function ConversationChatAreaComponent_Conditional_7_Conditional_0_Template_div_touchstart_0_listener($event) { i0.ɵɵrestoreView(_r16); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onResizeTouchStart($event)); });
|
|
257
281
|
i0.ɵɵelementEnd();
|
|
258
282
|
} }
|
|
259
283
|
function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
260
284
|
const _r15 = i0.ɵɵgetCurrentView();
|
|
261
|
-
i0.ɵɵconditionalCreate(0, ConversationChatAreaComponent_Conditional_7_Conditional_0_Template, 1, 0, "div",
|
|
262
|
-
i0.ɵɵelementStart(1, "div",
|
|
263
|
-
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_closed_2_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCloseArtifactPanel()); })("saveToCollectionRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_saveToCollectionRequested_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveToCollectionRequested($event)); })("navigateToLink", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_navigateToLink_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("shareRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_shareRequested_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactShareRequested($event)); })("maximizeToggled", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_maximizeToggled_2_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleMaximizeArtifactPane()); })("openEntityRecord", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_openEntityRecord_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("navigationRequest", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_navigationRequest_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavigationRequest($event)); });
|
|
285
|
+
i0.ɵɵconditionalCreate(0, ConversationChatAreaComponent_Conditional_7_Conditional_0_Template, 1, 0, "div", 68);
|
|
286
|
+
i0.ɵɵelementStart(1, "div", 69)(2, "mj-artifact-viewer-panel", 70);
|
|
287
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_closed_2_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCloseArtifactPanel()); })("saveToCollectionRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_saveToCollectionRequested_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSaveToCollectionRequested($event)); })("navigateToLink", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_navigateToLink_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactLinkNavigation($event)); })("shareRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_shareRequested_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onArtifactShareRequested($event)); })("maximizeToggled", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_maximizeToggled_2_listener() { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleMaximizeArtifactPane()); })("openEntityRecord", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_openEntityRecord_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("navigationRequest", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_navigationRequest_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onNavigationRequest($event)); })("analyzeRequested", function ConversationChatAreaComponent_Conditional_7_Template_mj_artifact_viewer_panel_analyzeRequested_2_listener($event) { i0.ɵɵrestoreView(_r15); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnAnalyzeArtifact($event)); });
|
|
264
288
|
i0.ɵɵelementEnd()();
|
|
265
289
|
} if (rf & 2) {
|
|
266
290
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -273,7 +297,7 @@ function ConversationChatAreaComponent_Conditional_7_Template(rf, ctx) { if (rf
|
|
|
273
297
|
} }
|
|
274
298
|
function ConversationChatAreaComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
275
299
|
const _r17 = i0.ɵɵgetCurrentView();
|
|
276
|
-
i0.ɵɵelementStart(0, "mj-pinned-messages-panel",
|
|
300
|
+
i0.ɵɵelementStart(0, "mj-pinned-messages-panel", 72);
|
|
277
301
|
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_9_Template_mj_pinned_messages_panel_closed_0_listener() { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showPinsPanel = false); })("jumpRequested", function ConversationChatAreaComponent_Conditional_9_Template_mj_pinned_messages_panel_jumpRequested_0_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onJumpToMessage($event)); })("unpinRequested", function ConversationChatAreaComponent_Conditional_9_Template_mj_pinned_messages_panel_unpinRequested_0_listener($event) { i0.ɵɵrestoreView(_r17); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onUnpinFromPanel($event)); });
|
|
278
302
|
i0.ɵɵelementEnd();
|
|
279
303
|
} if (rf & 2) {
|
|
@@ -282,39 +306,39 @@ function ConversationChatAreaComponent_Conditional_9_Template(rf, ctx) { if (rf
|
|
|
282
306
|
} }
|
|
283
307
|
function ConversationChatAreaComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
284
308
|
const _r18 = i0.ɵɵgetCurrentView();
|
|
285
|
-
i0.ɵɵelementStart(0, "mj-thread-panel",
|
|
309
|
+
i0.ɵɵelementStart(0, "mj-thread-panel", 73);
|
|
286
310
|
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_10_Template_mj_thread_panel_closed_0_listener() { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onLocalThreadClosed()); })("replyAdded", function ConversationChatAreaComponent_Conditional_10_Template_mj_thread_panel_replyAdded_0_listener($event) { i0.ɵɵrestoreView(_r18); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onThreadReplyAdded($event)); });
|
|
287
311
|
i0.ɵɵelementEnd();
|
|
288
312
|
} if (rf & 2) {
|
|
289
313
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
290
314
|
i0.ɵɵproperty("parentMessageId", ctx_r1.threadId)("conversationId", ctx_r1.conversationId || "")("currentUser", ctx_r1.currentUser);
|
|
291
315
|
} }
|
|
292
|
-
function
|
|
316
|
+
function ConversationChatAreaComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
|
|
293
317
|
const _r19 = i0.ɵɵgetCurrentView();
|
|
294
|
-
i0.ɵɵelementStart(0, "div",
|
|
295
|
-
i0.ɵɵlistener("click", function
|
|
296
|
-
i0.ɵɵelementStart(1, "div",
|
|
297
|
-
i0.ɵɵlistener("click", function
|
|
298
|
-
i0.ɵɵelementStart(2, "div",
|
|
318
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
319
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_14_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showProjectSelector = false); });
|
|
320
|
+
i0.ɵɵelementStart(1, "div", 75);
|
|
321
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_14_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r19); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
322
|
+
i0.ɵɵelementStart(2, "div", 76)(3, "h3");
|
|
299
323
|
i0.ɵɵtext(4, "Assign Project");
|
|
300
324
|
i0.ɵɵelementEnd();
|
|
301
|
-
i0.ɵɵelementStart(5, "button",
|
|
302
|
-
i0.ɵɵlistener("click", function
|
|
303
|
-
i0.ɵɵelement(6, "i",
|
|
325
|
+
i0.ɵɵelementStart(5, "button", 77);
|
|
326
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_14_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showProjectSelector = false); });
|
|
327
|
+
i0.ɵɵelement(6, "i", 78);
|
|
304
328
|
i0.ɵɵelementEnd()();
|
|
305
|
-
i0.ɵɵelementStart(7, "div",
|
|
306
|
-
i0.ɵɵlistener("projectSelected", function
|
|
329
|
+
i0.ɵɵelementStart(7, "div", 79)(8, "mj-project-selector", 80);
|
|
330
|
+
i0.ɵɵlistener("projectSelected", function ConversationChatAreaComponent_Conditional_14_Template_mj_project_selector_projectSelected_8_listener($event) { i0.ɵɵrestoreView(_r19); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onProjectSelected($event)); });
|
|
307
331
|
i0.ɵɵelementEnd()()()();
|
|
308
332
|
} if (rf & 2) {
|
|
309
333
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
310
334
|
i0.ɵɵadvance(8);
|
|
311
335
|
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedProjectId", ctx_r1.conversation.ProjectID);
|
|
312
336
|
} }
|
|
313
|
-
function
|
|
337
|
+
function ConversationChatAreaComponent_Conditional_15_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
314
338
|
const _r21 = i0.ɵɵgetCurrentView();
|
|
315
|
-
i0.ɵɵelementStart(0, "button",
|
|
316
|
-
i0.ɵɵlistener("click", function
|
|
317
|
-
i0.ɵɵelement(1, "i",
|
|
339
|
+
i0.ɵɵelementStart(0, "button", 87);
|
|
340
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_Conditional_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleSystemArtifacts()); });
|
|
341
|
+
i0.ɵɵelement(1, "i", 88);
|
|
318
342
|
i0.ɵɵelementStart(2, "span");
|
|
319
343
|
i0.ɵɵtext(3);
|
|
320
344
|
i0.ɵɵelementEnd()();
|
|
@@ -324,27 +348,27 @@ function ConversationChatAreaComponent_Conditional_14_Conditional_6_Template(rf,
|
|
|
324
348
|
i0.ɵɵadvance(3);
|
|
325
349
|
i0.ɵɵtextInterpolate1("", ctx_r1.showSystemArtifacts ? "Hide" : "Show", " System");
|
|
326
350
|
} }
|
|
327
|
-
function
|
|
328
|
-
i0.ɵɵelementStart(0, "div",
|
|
329
|
-
i0.ɵɵelement(1, "i",
|
|
330
|
-
i0.ɵɵelementStart(2, "p",
|
|
351
|
+
function ConversationChatAreaComponent_Conditional_15_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
352
|
+
i0.ɵɵelementStart(0, "div", 85);
|
|
353
|
+
i0.ɵɵelement(1, "i", 89);
|
|
354
|
+
i0.ɵɵelementStart(2, "p", 90);
|
|
331
355
|
i0.ɵɵtext(3, "No artifacts in this conversation yet");
|
|
332
356
|
i0.ɵɵelementEnd()();
|
|
333
357
|
} }
|
|
334
|
-
function
|
|
358
|
+
function ConversationChatAreaComponent_Conditional_15_For_12_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
335
359
|
i0.ɵɵtext(0);
|
|
336
360
|
} if (rf & 2) {
|
|
337
361
|
const artifact_r23 = i0.ɵɵnextContext().$implicit;
|
|
338
362
|
i0.ɵɵtextInterpolate1(" ", artifact_r23.versionCount, " versions ");
|
|
339
363
|
} }
|
|
340
|
-
function
|
|
364
|
+
function ConversationChatAreaComponent_Conditional_15_For_12_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
341
365
|
i0.ɵɵtext(0, " 1 version ");
|
|
342
366
|
} }
|
|
343
|
-
function
|
|
367
|
+
function ConversationChatAreaComponent_Conditional_15_For_12_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
344
368
|
const _r24 = i0.ɵɵgetCurrentView();
|
|
345
|
-
i0.ɵɵelementStart(0, "button",
|
|
346
|
-
i0.ɵɵlistener("click", function
|
|
347
|
-
i0.ɵɵelement(1, "i",
|
|
369
|
+
i0.ɵɵelementStart(0, "button", 102);
|
|
370
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_For_12_Conditional_10_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r24); const artifact_r23 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.toggleArtifactExpansion(artifact_r23.artifactId, $event)); });
|
|
371
|
+
i0.ɵɵelement(1, "i", 103);
|
|
348
372
|
i0.ɵɵelementEnd();
|
|
349
373
|
} if (rf & 2) {
|
|
350
374
|
const artifact_r23 = i0.ɵɵnextContext().$implicit;
|
|
@@ -352,50 +376,50 @@ function ConversationChatAreaComponent_Conditional_14_For_12_Conditional_10_Temp
|
|
|
352
376
|
i0.ɵɵadvance();
|
|
353
377
|
i0.ɵɵclassProp("fa-chevron-down", ctx_r1.expandedArtifactId !== artifact_r23.artifactId)("fa-chevron-up", ctx_r1.expandedArtifactId === artifact_r23.artifactId);
|
|
354
378
|
} }
|
|
355
|
-
function
|
|
379
|
+
function ConversationChatAreaComponent_Conditional_15_For_12_Conditional_13_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
356
380
|
const _r25 = i0.ɵɵgetCurrentView();
|
|
357
|
-
i0.ɵɵelementStart(0, "div",
|
|
358
|
-
i0.ɵɵlistener("click", function
|
|
359
|
-
i0.ɵɵelementStart(1, "span",
|
|
381
|
+
i0.ɵɵelementStart(0, "div", 105);
|
|
382
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_For_12_Conditional_13_For_2_Template_div_click_0_listener($event) { const version_r26 = i0.ɵɵrestoreView(_r25).$implicit; const artifact_r23 = i0.ɵɵnextContext(2).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); ctx_r1.openArtifactFromModal(artifact_r23.artifactId, version_r26.versionNumber); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
383
|
+
i0.ɵɵelementStart(1, "span", 106);
|
|
360
384
|
i0.ɵɵtext(2);
|
|
361
385
|
i0.ɵɵelementEnd();
|
|
362
|
-
i0.ɵɵelementStart(3, "span",
|
|
386
|
+
i0.ɵɵelementStart(3, "span", 107);
|
|
363
387
|
i0.ɵɵtext(4, "Open this version");
|
|
364
388
|
i0.ɵɵelementEnd();
|
|
365
|
-
i0.ɵɵelement(5, "i",
|
|
389
|
+
i0.ɵɵelement(5, "i", 108);
|
|
366
390
|
i0.ɵɵelementEnd();
|
|
367
391
|
} if (rf & 2) {
|
|
368
392
|
const version_r26 = ctx.$implicit;
|
|
369
393
|
i0.ɵɵadvance(2);
|
|
370
394
|
i0.ɵɵtextInterpolate1("v", version_r26.versionNumber);
|
|
371
395
|
} }
|
|
372
|
-
function
|
|
373
|
-
i0.ɵɵelementStart(0, "div",
|
|
374
|
-
i0.ɵɵrepeaterCreate(1,
|
|
396
|
+
function ConversationChatAreaComponent_Conditional_15_For_12_Conditional_13_Template(rf, ctx) { if (rf & 1) {
|
|
397
|
+
i0.ɵɵelementStart(0, "div", 101);
|
|
398
|
+
i0.ɵɵrepeaterCreate(1, ConversationChatAreaComponent_Conditional_15_For_12_Conditional_13_For_2_Template, 6, 1, "div", 104, _forTrack2);
|
|
375
399
|
i0.ɵɵelementEnd();
|
|
376
400
|
} if (rf & 2) {
|
|
377
401
|
const artifact_r23 = i0.ɵɵnextContext().$implicit;
|
|
378
402
|
i0.ɵɵadvance();
|
|
379
403
|
i0.ɵɵrepeater(artifact_r23.versions);
|
|
380
404
|
} }
|
|
381
|
-
function
|
|
405
|
+
function ConversationChatAreaComponent_Conditional_15_For_12_Template(rf, ctx) { if (rf & 1) {
|
|
382
406
|
const _r22 = i0.ɵɵgetCurrentView();
|
|
383
|
-
i0.ɵɵelementStart(0, "div",
|
|
384
|
-
i0.ɵɵlistener("click", function
|
|
385
|
-
i0.ɵɵelementStart(2, "div",
|
|
386
|
-
i0.ɵɵelement(3, "i",
|
|
407
|
+
i0.ɵɵelementStart(0, "div", 91)(1, "div", 92);
|
|
408
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_For_12_Template_div_click_1_listener() { const artifact_r23 = i0.ɵɵrestoreView(_r22).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.openArtifactFromModal(artifact_r23.artifactId)); });
|
|
409
|
+
i0.ɵɵelementStart(2, "div", 93);
|
|
410
|
+
i0.ɵɵelement(3, "i", 94);
|
|
387
411
|
i0.ɵɵelementEnd();
|
|
388
|
-
i0.ɵɵelementStart(4, "div",
|
|
412
|
+
i0.ɵɵelementStart(4, "div", 95)(5, "div", 96);
|
|
389
413
|
i0.ɵɵtext(6);
|
|
390
414
|
i0.ɵɵelementEnd();
|
|
391
|
-
i0.ɵɵelementStart(7, "div",
|
|
392
|
-
i0.ɵɵconditionalCreate(8,
|
|
415
|
+
i0.ɵɵelementStart(7, "div", 97);
|
|
416
|
+
i0.ɵɵconditionalCreate(8, ConversationChatAreaComponent_Conditional_15_For_12_Conditional_8_Template, 1, 1)(9, ConversationChatAreaComponent_Conditional_15_For_12_Conditional_9_Template, 1, 0);
|
|
393
417
|
i0.ɵɵelementEnd()();
|
|
394
|
-
i0.ɵɵconditionalCreate(10,
|
|
395
|
-
i0.ɵɵelementStart(11, "div",
|
|
396
|
-
i0.ɵɵelement(12, "i",
|
|
418
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_15_For_12_Conditional_10_Template, 2, 4, "button", 98);
|
|
419
|
+
i0.ɵɵelementStart(11, "div", 99);
|
|
420
|
+
i0.ɵɵelement(12, "i", 100);
|
|
397
421
|
i0.ɵɵelementEnd()();
|
|
398
|
-
i0.ɵɵconditionalCreate(13,
|
|
422
|
+
i0.ɵɵconditionalCreate(13, ConversationChatAreaComponent_Conditional_15_For_12_Conditional_13_Template, 3, 0, "div", 101);
|
|
399
423
|
i0.ɵɵelementEnd();
|
|
400
424
|
} if (rf & 2) {
|
|
401
425
|
const artifact_r23 = ctx.$implicit;
|
|
@@ -410,24 +434,24 @@ function ConversationChatAreaComponent_Conditional_14_For_12_Template(rf, ctx) {
|
|
|
410
434
|
i0.ɵɵadvance(3);
|
|
411
435
|
i0.ɵɵconditional(ctx_r1.expandedArtifactId === artifact_r23.artifactId && artifact_r23.versionCount > 1 ? 13 : -1);
|
|
412
436
|
} }
|
|
413
|
-
function
|
|
437
|
+
function ConversationChatAreaComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
|
|
414
438
|
const _r20 = i0.ɵɵgetCurrentView();
|
|
415
|
-
i0.ɵɵelementStart(0, "div",
|
|
416
|
-
i0.ɵɵlistener("click", function
|
|
417
|
-
i0.ɵɵelementStart(1, "div",
|
|
418
|
-
i0.ɵɵlistener("click", function
|
|
419
|
-
i0.ɵɵelementStart(2, "div",
|
|
439
|
+
i0.ɵɵelementStart(0, "div", 74);
|
|
440
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showArtifactsModal = false); });
|
|
441
|
+
i0.ɵɵelementStart(1, "div", 81);
|
|
442
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r20); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
443
|
+
i0.ɵɵelementStart(2, "div", 76)(3, "h3");
|
|
420
444
|
i0.ɵɵtext(4, "Conversation Artifacts");
|
|
421
445
|
i0.ɵɵelementEnd();
|
|
422
|
-
i0.ɵɵelementStart(5, "div",
|
|
423
|
-
i0.ɵɵconditionalCreate(6,
|
|
424
|
-
i0.ɵɵelementStart(7, "button",
|
|
425
|
-
i0.ɵɵlistener("click", function
|
|
426
|
-
i0.ɵɵelement(8, "i",
|
|
446
|
+
i0.ɵɵelementStart(5, "div", 82);
|
|
447
|
+
i0.ɵɵconditionalCreate(6, ConversationChatAreaComponent_Conditional_15_Conditional_6_Template, 4, 3, "button", 83);
|
|
448
|
+
i0.ɵɵelementStart(7, "button", 77);
|
|
449
|
+
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_15_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r20); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.showArtifactsModal = false); });
|
|
450
|
+
i0.ɵɵelement(8, "i", 78);
|
|
427
451
|
i0.ɵɵelementEnd()()();
|
|
428
|
-
i0.ɵɵelementStart(9, "div",
|
|
429
|
-
i0.ɵɵconditionalCreate(10,
|
|
430
|
-
i0.ɵɵrepeaterCreate(11,
|
|
452
|
+
i0.ɵɵelementStart(9, "div", 84);
|
|
453
|
+
i0.ɵɵconditionalCreate(10, ConversationChatAreaComponent_Conditional_15_Conditional_10_Template, 4, 0, "div", 85);
|
|
454
|
+
i0.ɵɵrepeaterCreate(11, ConversationChatAreaComponent_Conditional_15_For_12_Template, 14, 8, "div", 86, _forTrack1);
|
|
431
455
|
i0.ɵɵelementEnd()()();
|
|
432
456
|
} if (rf & 2) {
|
|
433
457
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -438,114 +462,35 @@ function ConversationChatAreaComponent_Conditional_14_Template(rf, ctx) { if (rf
|
|
|
438
462
|
i0.ɵɵadvance();
|
|
439
463
|
i0.ɵɵrepeater(ctx_r1.getArtifactsArray());
|
|
440
464
|
} }
|
|
441
|
-
function
|
|
465
|
+
function ConversationChatAreaComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
442
466
|
const _r27 = i0.ɵɵgetCurrentView();
|
|
443
|
-
i0.ɵɵelementStart(0, "mj-artifact-collection-picker-modal",
|
|
444
|
-
i0.ɵɵlistener("saved", function
|
|
467
|
+
i0.ɵɵelementStart(0, "mj-artifact-collection-picker-modal", 109);
|
|
468
|
+
i0.ɵɵlistener("saved", function ConversationChatAreaComponent_Conditional_16_Template_mj_artifact_collection_picker_modal_saved_0_listener($event) { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCollectionPickerSaved($event)); })("cancelled", function ConversationChatAreaComponent_Conditional_16_Template_mj_artifact_collection_picker_modal_cancelled_0_listener() { i0.ɵɵrestoreView(_r27); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCollectionPickerCancelled()); });
|
|
445
469
|
i0.ɵɵelementEnd();
|
|
446
470
|
} if (rf & 2) {
|
|
447
471
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
448
472
|
i0.ɵɵproperty("isOpen", ctx_r1.showCollectionPicker)("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("excludeCollectionIds", ctx_r1.collectionPickerExcludedIds);
|
|
449
473
|
} }
|
|
450
|
-
function ConversationChatAreaComponent_Conditional_16_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
451
|
-
i0.ɵɵelement(0, "mj-loading", 112);
|
|
452
|
-
} }
|
|
453
|
-
function ConversationChatAreaComponent_Conditional_16_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
454
|
-
i0.ɵɵelementStart(0, "div", 113);
|
|
455
|
-
i0.ɵɵelement(1, "i", 115);
|
|
456
|
-
i0.ɵɵelementStart(2, "p");
|
|
457
|
-
i0.ɵɵtext(3, "No file artifacts found");
|
|
458
|
-
i0.ɵɵelementEnd();
|
|
459
|
-
i0.ɵɵelementStart(4, "p", 116);
|
|
460
|
-
i0.ɵɵtext(5, "File artifacts are created when agents generate PDF, Excel, or Word documents.");
|
|
461
|
-
i0.ɵɵelementEnd()();
|
|
462
|
-
} }
|
|
463
|
-
function ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
464
|
-
i0.ɵɵelement(0, "i", 124);
|
|
465
|
-
} if (rf & 2) {
|
|
466
|
-
const item_r30 = i0.ɵɵnextContext().$implicit;
|
|
467
|
-
i0.ɵɵclassProp("fa-file-pdf", item_r30.mimeType === "application/pdf")("fa-file-excel", item_r30.mimeType && item_r30.mimeType.includes("spreadsheet"))("fa-file-word", item_r30.mimeType && item_r30.mimeType.includes("wordprocessing"))("fa-file", !item_r30.mimeType || !item_r30.mimeType.includes("pdf") && !item_r30.mimeType.includes("spreadsheet") && !item_r30.mimeType.includes("wordprocessing"));
|
|
468
|
-
} }
|
|
469
|
-
function ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
470
|
-
i0.ɵɵelement(0, "i", 120);
|
|
471
|
-
} }
|
|
472
|
-
function ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
473
|
-
i0.ɵɵtext(0);
|
|
474
|
-
i0.ɵɵpipe(1, "number");
|
|
475
|
-
} if (rf & 2) {
|
|
476
|
-
const item_r30 = i0.ɵɵnextContext().$implicit;
|
|
477
|
-
i0.ɵɵtextInterpolate1(" \u00B7 ", i0.ɵɵpipeBind2(1, 1, item_r30.sizeBytes / 1024, "1.0-0"), " KB ");
|
|
478
|
-
} }
|
|
479
|
-
function ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
480
|
-
const _r29 = i0.ɵɵgetCurrentView();
|
|
481
|
-
i0.ɵɵelementStart(0, "button", 118);
|
|
482
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Template_button_click_0_listener() { const item_r30 = i0.ɵɵrestoreView(_r29).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnArtifactSelected(item_r30)); });
|
|
483
|
-
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Conditional_1_Template, 1, 8, "i", 119)(2, ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Conditional_2_Template, 1, 0, "i", 120);
|
|
484
|
-
i0.ɵɵelementStart(3, "div", 121)(4, "span", 122);
|
|
485
|
-
i0.ɵɵtext(5);
|
|
486
|
-
i0.ɵɵelementEnd();
|
|
487
|
-
i0.ɵɵelementStart(6, "span", 123);
|
|
488
|
-
i0.ɵɵtext(7);
|
|
489
|
-
i0.ɵɵconditionalCreate(8, ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Conditional_8_Template, 2, 4);
|
|
490
|
-
i0.ɵɵelementEnd()()();
|
|
491
|
-
} if (rf & 2) {
|
|
492
|
-
const item_r30 = ctx.$implicit;
|
|
493
|
-
i0.ɵɵadvance();
|
|
494
|
-
i0.ɵɵconditional(item_r30.contentMode === "File" ? 1 : 2);
|
|
495
|
-
i0.ɵɵadvance(4);
|
|
496
|
-
i0.ɵɵtextInterpolate(item_r30.name);
|
|
497
|
-
i0.ɵɵadvance(2);
|
|
498
|
-
i0.ɵɵtextInterpolate1(" ", item_r30.contentMode === "File" ? item_r30.fileName || "" : "Text artifact", " ");
|
|
499
|
-
i0.ɵɵadvance();
|
|
500
|
-
i0.ɵɵconditional(item_r30.sizeBytes ? 8 : -1);
|
|
501
|
-
} }
|
|
502
|
-
function ConversationChatAreaComponent_Conditional_16_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
503
|
-
i0.ɵɵelementStart(0, "div", 114);
|
|
504
|
-
i0.ɵɵrepeaterCreate(1, ConversationChatAreaComponent_Conditional_16_Conditional_10_For_2_Template, 9, 4, "button", 117, _forTrack3);
|
|
505
|
-
i0.ɵɵelementEnd();
|
|
506
|
-
} if (rf & 2) {
|
|
507
|
-
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
508
|
-
i0.ɵɵadvance();
|
|
509
|
-
i0.ɵɵrepeater(ctx_r1.artifactPickerItems);
|
|
510
|
-
} }
|
|
511
|
-
function ConversationChatAreaComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
|
|
512
|
-
const _r28 = i0.ɵɵgetCurrentView();
|
|
513
|
-
i0.ɵɵelementStart(0, "div", 106);
|
|
514
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseArtifactPicker()); });
|
|
515
|
-
i0.ɵɵelementEnd();
|
|
516
|
-
i0.ɵɵelementStart(1, "div", 107)(2, "div", 108)(3, "h3");
|
|
517
|
-
i0.ɵɵtext(4, "Attach Artifact");
|
|
518
|
-
i0.ɵɵelementEnd();
|
|
519
|
-
i0.ɵɵelementStart(5, "button", 109);
|
|
520
|
-
i0.ɵɵlistener("click", function ConversationChatAreaComponent_Conditional_16_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseArtifactPicker()); });
|
|
521
|
-
i0.ɵɵelement(6, "i", 110);
|
|
522
|
-
i0.ɵɵelementEnd()();
|
|
523
|
-
i0.ɵɵelementStart(7, "div", 111);
|
|
524
|
-
i0.ɵɵconditionalCreate(8, ConversationChatAreaComponent_Conditional_16_Conditional_8_Template, 1, 0, "mj-loading", 112)(9, ConversationChatAreaComponent_Conditional_16_Conditional_9_Template, 6, 0, "div", 113)(10, ConversationChatAreaComponent_Conditional_16_Conditional_10_Template, 3, 0, "div", 114);
|
|
525
|
-
i0.ɵɵelementEnd()();
|
|
526
|
-
} if (rf & 2) {
|
|
527
|
-
const ctx_r1 = i0.ɵɵnextContext();
|
|
528
|
-
i0.ɵɵadvance(8);
|
|
529
|
-
i0.ɵɵconditional(ctx_r1.isLoadingArtifactPicker ? 8 : ctx_r1.artifactPickerItems.length === 0 ? 9 : 10);
|
|
530
|
-
} }
|
|
531
474
|
function ConversationChatAreaComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
|
|
532
|
-
const
|
|
533
|
-
i0.ɵɵelementStart(0, "mj-test-feedback-dialog",
|
|
534
|
-
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_17_Template_mj_test_feedback_dialog_closed_0_listener($event) { i0.ɵɵrestoreView(
|
|
475
|
+
const _r28 = i0.ɵɵgetCurrentView();
|
|
476
|
+
i0.ɵɵelementStart(0, "mj-test-feedback-dialog", 110);
|
|
477
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_17_Template_mj_test_feedback_dialog_closed_0_listener($event) { i0.ɵɵrestoreView(_r28); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onTestFeedbackDialogClosed($event)); });
|
|
535
478
|
i0.ɵɵelementEnd();
|
|
536
479
|
} if (rf & 2) {
|
|
537
480
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
538
481
|
i0.ɵɵproperty("data", ctx_r1.testFeedbackDialogData)("visible", ctx_r1.showTestFeedbackDialog);
|
|
539
482
|
} }
|
|
540
483
|
function ConversationChatAreaComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
541
|
-
const
|
|
542
|
-
i0.ɵɵelementStart(0, "mj-image-viewer",
|
|
543
|
-
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_18_Template_mj_image_viewer_closed_0_listener() { i0.ɵɵrestoreView(
|
|
484
|
+
const _r29 = i0.ɵɵgetCurrentView();
|
|
485
|
+
i0.ɵɵelementStart(0, "mj-image-viewer", 111);
|
|
486
|
+
i0.ɵɵlistener("closed", function ConversationChatAreaComponent_Conditional_18_Template_mj_image_viewer_closed_0_listener() { i0.ɵɵrestoreView(_r29); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onImageViewerClosed()); });
|
|
544
487
|
i0.ɵɵelementEnd();
|
|
545
488
|
} if (rf & 2) {
|
|
546
489
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
547
490
|
i0.ɵɵproperty("imageUrl", ctx_r1.selectedImageUrl)("alt", ctx_r1.selectedImageAlt)("fileName", ctx_r1.selectedImageFileName)("visible", ctx_r1.showImageViewer);
|
|
548
491
|
} }
|
|
492
|
+
/** `MJ: Resource Types.ID` for Conversations. */
|
|
493
|
+
const CONVERSATIONS_RESOURCE_TYPE_ID = '81D4BC3D-9FEB-EF11-B01A-286B35C04427';
|
|
549
494
|
/** Default width (percentage) for the artifact viewer pane */
|
|
550
495
|
const DEFAULT_ARTIFACT_PANE_WIDTH = 40;
|
|
551
496
|
export class ConversationChatAreaComponent {
|
|
@@ -559,6 +504,7 @@ export class ConversationChatAreaComponent {
|
|
|
559
504
|
streamingService;
|
|
560
505
|
confirmDialog;
|
|
561
506
|
bridge;
|
|
507
|
+
analyzeArtifactService;
|
|
562
508
|
environmentId;
|
|
563
509
|
currentUser;
|
|
564
510
|
// LOCAL STATE INPUTS - passed from parent workspace
|
|
@@ -660,6 +606,9 @@ export class ConversationChatAreaComponent {
|
|
|
660
606
|
artifactCountDisplay = 0;
|
|
661
607
|
isShared = false;
|
|
662
608
|
showExportModal = false;
|
|
609
|
+
showShareModal = false;
|
|
610
|
+
shareContext = null;
|
|
611
|
+
shareAdapter = new MJResourcePermissionShareAdapter(CONVERSATIONS_RESOURCE_TYPE_ID);
|
|
663
612
|
showAgentPanel = false;
|
|
664
613
|
showMembersModal = false;
|
|
665
614
|
showProjectSelector = false;
|
|
@@ -748,10 +697,6 @@ export class ConversationChatAreaComponent {
|
|
|
748
697
|
// Upload indicator state (shown centered in conversation area)
|
|
749
698
|
isUploadingAttachments = false;
|
|
750
699
|
uploadingMessage = '';
|
|
751
|
-
// Artifact picker state
|
|
752
|
-
showArtifactPickerPanel = false;
|
|
753
|
-
artifactPickerItems = [];
|
|
754
|
-
isLoadingArtifactPicker = false;
|
|
755
700
|
// Attachment support based on agent modalities
|
|
756
701
|
// Computed from conversation manager (Sage) and any previous agent in conversation
|
|
757
702
|
enableAttachments = false;
|
|
@@ -760,7 +705,7 @@ export class ConversationChatAreaComponent {
|
|
|
760
705
|
acceptedFileTypes = 'image/*';
|
|
761
706
|
conversationManagerAgent = null;
|
|
762
707
|
engine = ConversationEngine.Instance;
|
|
763
|
-
constructor(agentStateService, conversationAgentService, activeTasks, cdr, mentionAutocompleteService, artifactPermissionService, attachmentService, streamingService, confirmDialog, bridge) {
|
|
708
|
+
constructor(agentStateService, conversationAgentService, activeTasks, cdr, mentionAutocompleteService, artifactPermissionService, attachmentService, streamingService, confirmDialog, bridge, analyzeArtifactService) {
|
|
764
709
|
this.agentStateService = agentStateService;
|
|
765
710
|
this.conversationAgentService = conversationAgentService;
|
|
766
711
|
this.activeTasks = activeTasks;
|
|
@@ -771,6 +716,7 @@ export class ConversationChatAreaComponent {
|
|
|
771
716
|
this.streamingService = streamingService;
|
|
772
717
|
this.confirmDialog = confirmDialog;
|
|
773
718
|
this.bridge = bridge;
|
|
719
|
+
this.analyzeArtifactService = analyzeArtifactService;
|
|
774
720
|
}
|
|
775
721
|
async ngOnInit() {
|
|
776
722
|
// The workspace component initializes AI Engine and mention service before
|
|
@@ -1788,8 +1734,61 @@ export class ConversationChatAreaComponent {
|
|
|
1788
1734
|
}
|
|
1789
1735
|
}
|
|
1790
1736
|
shareConversation() {
|
|
1791
|
-
|
|
1792
|
-
|
|
1737
|
+
if (!this.conversation)
|
|
1738
|
+
return;
|
|
1739
|
+
this.shareContext = {
|
|
1740
|
+
ResourceID: this.conversation.ID,
|
|
1741
|
+
ResourceName: this.conversation.Name ?? 'Conversation',
|
|
1742
|
+
OwnerUserID: this.conversation.UserID ?? null,
|
|
1743
|
+
OwnerDisplayName: this.conversation.User ?? 'You',
|
|
1744
|
+
CurrentUserID: this.currentUser?.ID ?? null
|
|
1745
|
+
};
|
|
1746
|
+
this.showShareModal = true;
|
|
1747
|
+
}
|
|
1748
|
+
onShareDialogResult(_result) {
|
|
1749
|
+
this.showShareModal = false;
|
|
1750
|
+
}
|
|
1751
|
+
/**
|
|
1752
|
+
* Display info for the header "Shared by {email}" badge. Returns `null`
|
|
1753
|
+
* when the current user owns the conversation or when the share has no
|
|
1754
|
+
* recorded grantor (legacy share pre-dating `SharedByUserID`).
|
|
1755
|
+
*/
|
|
1756
|
+
get sharedByBadge() {
|
|
1757
|
+
if (!this.conversation)
|
|
1758
|
+
return null;
|
|
1759
|
+
const info = this.engine.GetSharedByInfo(this.conversation.ID);
|
|
1760
|
+
if (!info || !info.UserID)
|
|
1761
|
+
return null;
|
|
1762
|
+
const display = info.Email ?? info.Name ?? 'another user';
|
|
1763
|
+
const tooltip = info.Email && info.Name ? `${info.Name} <${info.Email}>` : display;
|
|
1764
|
+
return { display, fullTooltip: `Shared by ${tooltip}` };
|
|
1765
|
+
}
|
|
1766
|
+
/**
|
|
1767
|
+
* `true` when the current user only has `View` access to this conversation
|
|
1768
|
+
* (i.e., it was shared with them read-only). Gates the message input and
|
|
1769
|
+
* any other write-capable UI.
|
|
1770
|
+
*/
|
|
1771
|
+
get isReadOnlyView() {
|
|
1772
|
+
if (!this.conversation)
|
|
1773
|
+
return false;
|
|
1774
|
+
const info = this.engine.GetSharedByInfo(this.conversation.ID);
|
|
1775
|
+
return info?.Level === 'View';
|
|
1776
|
+
}
|
|
1777
|
+
/**
|
|
1778
|
+
* `true` when the current user is allowed to create new shares on this
|
|
1779
|
+
* conversation. Only the conversation's owner — or a user with an existing
|
|
1780
|
+
* Owner-level grant — may do so. Matches the server-side gate in
|
|
1781
|
+
* {@link MJResourcePermissionEntityExtended.callerMayGrantShare}, so the UI
|
|
1782
|
+
* doesn't offer an action the save would refuse.
|
|
1783
|
+
*/
|
|
1784
|
+
get canShareConversation() {
|
|
1785
|
+
if (!this.conversation || !this.currentUser)
|
|
1786
|
+
return false;
|
|
1787
|
+
if (this.conversation.UserID && this.conversation.UserID.toLowerCase() === this.currentUser.ID.toLowerCase()) {
|
|
1788
|
+
return true;
|
|
1789
|
+
}
|
|
1790
|
+
const info = this.engine.GetSharedByInfo(this.conversation.ID);
|
|
1791
|
+
return info?.Level === 'Owner';
|
|
1793
1792
|
}
|
|
1794
1793
|
onReplyInThread(message) {
|
|
1795
1794
|
// Open thread panel for this message - emit to parent
|
|
@@ -1962,10 +1961,24 @@ export class ConversationChatAreaComponent {
|
|
|
1962
1961
|
this.selectedImageAlt = attachment.fileName || 'Image attachment';
|
|
1963
1962
|
this.selectedImageFileName = attachment.fileName || 'image';
|
|
1964
1963
|
this.showImageViewer = true;
|
|
1964
|
+
return;
|
|
1965
1965
|
}
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
1966
|
+
// Artifact-backed attachments open in the artifact viewer panel.
|
|
1967
|
+
if (attachment.source === 'artifact' && attachment.artifactId) {
|
|
1968
|
+
this.onArtifactClicked({
|
|
1969
|
+
artifactId: attachment.artifactId,
|
|
1970
|
+
versionId: attachment.artifactVersionId
|
|
1971
|
+
});
|
|
1972
|
+
return;
|
|
1973
|
+
}
|
|
1974
|
+
// Plain uploads: trigger a browser download if we have a usable content URL.
|
|
1975
|
+
if (attachment.contentUrl) {
|
|
1976
|
+
const a = document.createElement('a');
|
|
1977
|
+
a.href = attachment.contentUrl;
|
|
1978
|
+
a.download = attachment.fileName || 'download';
|
|
1979
|
+
document.body.appendChild(a);
|
|
1980
|
+
a.click();
|
|
1981
|
+
document.body.removeChild(a);
|
|
1969
1982
|
}
|
|
1970
1983
|
}
|
|
1971
1984
|
/**
|
|
@@ -2345,77 +2358,6 @@ export class ConversationChatAreaComponent {
|
|
|
2345
2358
|
this.canEditSelectedArtifact = false;
|
|
2346
2359
|
}
|
|
2347
2360
|
}
|
|
2348
|
-
/**
|
|
2349
|
-
* Handle artifact picker request from message input
|
|
2350
|
-
*/
|
|
2351
|
-
async onArtifactPickerRequested() {
|
|
2352
|
-
this.showArtifactPickerPanel = true;
|
|
2353
|
-
this.isLoadingArtifactPicker = true;
|
|
2354
|
-
this.cdr.detectChanges();
|
|
2355
|
-
try {
|
|
2356
|
-
// Load user's recent artifact versions (both text and file-backed)
|
|
2357
|
-
const rv = new RunView();
|
|
2358
|
-
const result = await rv.RunView({
|
|
2359
|
-
EntityName: 'MJ: Artifact Versions',
|
|
2360
|
-
ExtraFilter: `ArtifactID IN (SELECT ID FROM __mj.Artifact WHERE Visibility <> 'System Only')`,
|
|
2361
|
-
OrderBy: '__mj_UpdatedAt DESC',
|
|
2362
|
-
MaxRows: 50,
|
|
2363
|
-
ResultType: 'simple'
|
|
2364
|
-
});
|
|
2365
|
-
if (result.Success && result.Results) {
|
|
2366
|
-
this.artifactPickerItems = result.Results.map(r => ({
|
|
2367
|
-
artifactId: r.ArtifactID,
|
|
2368
|
-
artifactVersionId: r.ID,
|
|
2369
|
-
name: r.Name || r.Artifact || 'Untitled',
|
|
2370
|
-
description: r.Description || '',
|
|
2371
|
-
contentMode: r.ContentMode || 'Text',
|
|
2372
|
-
fileID: r.FileID,
|
|
2373
|
-
mimeType: r.MimeType,
|
|
2374
|
-
fileName: r.FileName,
|
|
2375
|
-
sizeBytes: r.ContentSizeBytes || 0,
|
|
2376
|
-
typeName: r.ContentMode === 'File' ? (r.MimeType || 'File') : 'Text',
|
|
2377
|
-
updatedAt: r.__mj_UpdatedAt
|
|
2378
|
-
}));
|
|
2379
|
-
}
|
|
2380
|
-
else {
|
|
2381
|
-
this.artifactPickerItems = [];
|
|
2382
|
-
}
|
|
2383
|
-
}
|
|
2384
|
-
catch (error) {
|
|
2385
|
-
console.error('Failed to load artifacts for picker:', error);
|
|
2386
|
-
this.artifactPickerItems = [];
|
|
2387
|
-
}
|
|
2388
|
-
finally {
|
|
2389
|
-
this.isLoadingArtifactPicker = false;
|
|
2390
|
-
this.cdr.detectChanges();
|
|
2391
|
-
}
|
|
2392
|
-
}
|
|
2393
|
-
/**
|
|
2394
|
-
* Handle artifact selection from the picker panel.
|
|
2395
|
-
* Adds the artifact as a pending attachment so it appears in the message input.
|
|
2396
|
-
* The ConversationDetailArtifact with Direction='Input' is created when the message is sent.
|
|
2397
|
-
*/
|
|
2398
|
-
OnArtifactSelected(item) {
|
|
2399
|
-
const activeInput = this.messageInputComponents?.find((input) => input.conversationId === this.conversationId);
|
|
2400
|
-
if (activeInput?.inputBox) {
|
|
2401
|
-
activeInput.inputBox.AddArtifactAttachment({
|
|
2402
|
-
fileID: item.fileID || item.artifactVersionId,
|
|
2403
|
-
fileName: item.fileName || item.name,
|
|
2404
|
-
mimeType: item.mimeType || 'text/plain',
|
|
2405
|
-
sizeBytes: item.sizeBytes,
|
|
2406
|
-
artifactVersionId: item.artifactVersionId
|
|
2407
|
-
});
|
|
2408
|
-
}
|
|
2409
|
-
this.showArtifactPickerPanel = false;
|
|
2410
|
-
this.cdr.detectChanges();
|
|
2411
|
-
}
|
|
2412
|
-
/**
|
|
2413
|
-
* Close artifact picker panel
|
|
2414
|
-
*/
|
|
2415
|
-
CloseArtifactPicker() {
|
|
2416
|
-
this.showArtifactPickerPanel = false;
|
|
2417
|
-
this.cdr.detectChanges();
|
|
2418
|
-
}
|
|
2419
2361
|
/**
|
|
2420
2362
|
* Handle share request from artifact viewer
|
|
2421
2363
|
*/
|
|
@@ -2430,6 +2372,64 @@ export class ConversationChatAreaComponent {
|
|
|
2430
2372
|
this.cdr.detectChanges();
|
|
2431
2373
|
}
|
|
2432
2374
|
}
|
|
2375
|
+
/**
|
|
2376
|
+
* Handle Analyze button click from the artifact viewer panel.
|
|
2377
|
+
* Creates a user message with the artifact attached as an input,
|
|
2378
|
+
* then routes through the normal agent flow so the agent can
|
|
2379
|
+
* explore the artifact via artifact tools.
|
|
2380
|
+
*/
|
|
2381
|
+
/**
|
|
2382
|
+
* Handle Analyze button click from the artifact viewer panel.
|
|
2383
|
+
*
|
|
2384
|
+
* Persists the captured snapshot as a new Data Snapshot artifact and attaches
|
|
2385
|
+
* it to the user's in-progress message as a pending attachment chip (same UX
|
|
2386
|
+
* as image/file uploads). On send, the existing attachment pipeline creates
|
|
2387
|
+
* a `ConversationDetailArtifact` with Direction='Input'; AgentRunner then
|
|
2388
|
+
* picks it up via `gatherConversationArtifacts` and resolves the
|
|
2389
|
+
* DataSnapshotToolLibrary for tool calls.
|
|
2390
|
+
*
|
|
2391
|
+
* Falls back to plain message prefill if snapshot persistence fails — the
|
|
2392
|
+
* user can still ask questions about the artifact that's already attached
|
|
2393
|
+
* to the prior conversation turn.
|
|
2394
|
+
*/
|
|
2395
|
+
async OnAnalyzeArtifact(event) {
|
|
2396
|
+
if (!this.conversationId || !this.currentUser)
|
|
2397
|
+
return;
|
|
2398
|
+
const messageInput = this.getActiveMessageInputComponent();
|
|
2399
|
+
const snapshotTitle = event.snapshot.title || 'Untitled Snapshot';
|
|
2400
|
+
try {
|
|
2401
|
+
const result = await this.analyzeArtifactService.CreateSnapshotArtifact({
|
|
2402
|
+
snapshot: event.snapshot,
|
|
2403
|
+
currentUser: this.currentUser,
|
|
2404
|
+
environmentId: this.environmentId,
|
|
2405
|
+
});
|
|
2406
|
+
if (messageInput) {
|
|
2407
|
+
const rowCount = (event.snapshot.tables ?? []).reduce((sum, t) => sum + (t.rows?.length ?? 0), 0);
|
|
2408
|
+
const serialized = JSON.stringify(event.snapshot);
|
|
2409
|
+
messageInput.inputBox?.mentionEditor?.AddArtifactAttachment({
|
|
2410
|
+
fileID: '',
|
|
2411
|
+
fileName: rowCount > 0
|
|
2412
|
+
? `📸 ${result.title} · ${rowCount.toLocaleString()} rows`
|
|
2413
|
+
: `📸 ${result.title}`,
|
|
2414
|
+
mimeType: 'application/json',
|
|
2415
|
+
sizeBytes: serialized.length,
|
|
2416
|
+
artifactVersionId: result.artifactVersionId,
|
|
2417
|
+
});
|
|
2418
|
+
messageInput.messageText = `Analyze "${result.title}" — `;
|
|
2419
|
+
messageInput.inputBox?.focus();
|
|
2420
|
+
}
|
|
2421
|
+
}
|
|
2422
|
+
catch (error) {
|
|
2423
|
+
LogStatusEx({
|
|
2424
|
+
message: `[OnAnalyzeArtifact] CreateSnapshotArtifact failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
2425
|
+
verboseOnly: false,
|
|
2426
|
+
});
|
|
2427
|
+
if (messageInput) {
|
|
2428
|
+
messageInput.messageText = `Analyze "${snapshotTitle}" — `;
|
|
2429
|
+
messageInput.inputBox?.focus();
|
|
2430
|
+
}
|
|
2431
|
+
}
|
|
2432
|
+
}
|
|
2433
2433
|
/**
|
|
2434
2434
|
* Handle close of artifact share modal
|
|
2435
2435
|
*/
|
|
@@ -2651,7 +2651,7 @@ export class ConversationChatAreaComponent {
|
|
|
2651
2651
|
this.cdr.detectChanges();
|
|
2652
2652
|
}
|
|
2653
2653
|
}
|
|
2654
|
-
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)); };
|
|
2654
|
+
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)); };
|
|
2655
2655
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationChatAreaComponent, selectors: [["mj-conversation-chat-area"]], viewQuery: function ConversationChatAreaComponent_Query(rf, ctx) { if (rf & 1) {
|
|
2656
2656
|
i0.ɵɵviewQuery(_c0, 5)(ArtifactViewerPanelComponent, 5)(ConversationEmptyStateComponent, 5)(_c1, 5);
|
|
2657
2657
|
} if (rf & 2) {
|
|
@@ -2660,9 +2660,9 @@ export class ConversationChatAreaComponent {
|
|
|
2660
2660
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.artifactViewerComponent = _t.first);
|
|
2661
2661
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.emptyStateComponent = _t.first);
|
|
2662
2662
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.messageInputComponents = _t);
|
|
2663
|
-
} }, 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, decls: 19, vars:
|
|
2663
|
+
} }, 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, decls: 19, 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", "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"], [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"], ["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"], ["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", "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, "chat-input-container"], [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"], [1, "message-input-container-wrapper"], [3, "hidden", "conversationId", "conversationName", "currentUser", "conversationHistory", "artifactsByDetailId", "systemArtifactsByDetailId", "agentRunsByDetailId", "appContext", "inProgressMessageIds", "disabled", "enableAttachments", "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", "inProgressMessageIds", "disabled", "enableAttachments", "maxAttachments", "maxAttachmentSizeBytes", "acceptedFileTypes", "initialMessage", "initialAttachments"], [1, "resize-handle"], [1, "chat-artifact-pane"], [3, "closed", "saveToCollectionRequested", "navigateToLink", "shareRequested", "maximizeToggled", "openEntityRecord", "navigationRequest", "analyzeRequested", "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, "saved", "cancelled", "isOpen", "environmentId", "currentUser", "excludeCollectionIds"], [3, "closed", "data", "visible"], [3, "closed", "imageUrl", "alt", "fileName", "visible"]], template: function ConversationChatAreaComponent_Template(rf, ctx) { if (rf & 1) {
|
|
2664
2664
|
i0.ɵɵelementStart(0, "div", 2);
|
|
2665
|
-
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_1_Template,
|
|
2665
|
+
i0.ɵɵconditionalCreate(1, ConversationChatAreaComponent_Conditional_1_Template, 14, 12, "div", 3);
|
|
2666
2666
|
i0.ɵɵelementStart(2, "div", 4)(3, "div", 5);
|
|
2667
2667
|
i0.ɵɵconditionalCreate(4, ConversationChatAreaComponent_Conditional_4_Template, 2, 0, "div", 6)(5, ConversationChatAreaComponent_Conditional_5_Template, 1, 9, "mj-conversation-empty-state", 7)(6, ConversationChatAreaComponent_Conditional_6_Template, 9, 12, "div", 8);
|
|
2668
2668
|
i0.ɵɵelementEnd();
|
|
@@ -2676,15 +2676,17 @@ export class ConversationChatAreaComponent {
|
|
|
2676
2676
|
i0.ɵɵelementStart(11, "mj-export-modal", 12);
|
|
2677
2677
|
i0.ɵɵlistener("cancelled", function ConversationChatAreaComponent_Template_mj_export_modal_cancelled_11_listener() { return ctx.onExportModalCancelled(); })("exported", function ConversationChatAreaComponent_Template_mj_export_modal_exported_11_listener() { return ctx.onExportModalComplete(); });
|
|
2678
2678
|
i0.ɵɵelementEnd();
|
|
2679
|
-
i0.ɵɵelementStart(12, "mj-
|
|
2680
|
-
i0.ɵɵlistener("
|
|
2679
|
+
i0.ɵɵelementStart(12, "mj-resource-share-dialog", 13);
|
|
2680
|
+
i0.ɵɵlistener("Result", function ConversationChatAreaComponent_Template_mj_resource_share_dialog_Result_12_listener($event) { return ctx.onShareDialogResult($event); });
|
|
2681
|
+
i0.ɵɵelementEnd();
|
|
2682
|
+
i0.ɵɵelementStart(13, "mj-members-modal", 14);
|
|
2683
|
+
i0.ɵɵlistener("cancelled", function ConversationChatAreaComponent_Template_mj_members_modal_cancelled_13_listener() { return ctx.showMembersModal = false; })("membersChanged", function ConversationChatAreaComponent_Template_mj_members_modal_membersChanged_13_listener() { return ctx.showMembersModal = false; });
|
|
2681
2684
|
i0.ɵɵelementEnd();
|
|
2682
|
-
i0.ɵɵconditionalCreate(
|
|
2683
|
-
i0.ɵɵconditionalCreate(
|
|
2684
|
-
i0.ɵɵconditionalCreate(
|
|
2685
|
-
i0.ɵɵconditionalCreate(
|
|
2686
|
-
i0.ɵɵconditionalCreate(
|
|
2687
|
-
i0.ɵɵconditionalCreate(18, ConversationChatAreaComponent_Conditional_18_Template, 1, 4, "mj-image-viewer", 17);
|
|
2685
|
+
i0.ɵɵconditionalCreate(14, ConversationChatAreaComponent_Conditional_14_Template, 9, 3, "div", 15);
|
|
2686
|
+
i0.ɵɵconditionalCreate(15, ConversationChatAreaComponent_Conditional_15_Template, 13, 2, "div", 15);
|
|
2687
|
+
i0.ɵɵconditionalCreate(16, ConversationChatAreaComponent_Conditional_16_Template, 1, 4, "mj-artifact-collection-picker-modal", 16);
|
|
2688
|
+
i0.ɵɵconditionalCreate(17, ConversationChatAreaComponent_Conditional_17_Template, 1, 2, "mj-test-feedback-dialog", 17);
|
|
2689
|
+
i0.ɵɵconditionalCreate(18, ConversationChatAreaComponent_Conditional_18_Template, 1, 4, "mj-image-viewer", 18);
|
|
2688
2690
|
} if (rf & 2) {
|
|
2689
2691
|
i0.ɵɵadvance();
|
|
2690
2692
|
i0.ɵɵconditional(ctx.conversation ? 1 : -1);
|
|
@@ -2703,25 +2705,25 @@ export class ConversationChatAreaComponent {
|
|
|
2703
2705
|
i0.ɵɵadvance();
|
|
2704
2706
|
i0.ɵɵproperty("isVisible", ctx.showExportModal)("conversation", ctx.conversation || undefined)("currentUser", ctx.currentUser);
|
|
2705
2707
|
i0.ɵɵadvance();
|
|
2706
|
-
i0.ɵɵproperty("
|
|
2708
|
+
i0.ɵɵproperty("Visible", ctx.showShareModal)("Context", ctx.shareContext)("Adapter", ctx.shareAdapter);
|
|
2707
2709
|
i0.ɵɵadvance();
|
|
2708
|
-
i0.ɵɵ
|
|
2710
|
+
i0.ɵɵproperty("isVisible", ctx.showMembersModal)("conversation", ctx.conversation || undefined)("currentUser", ctx.currentUser);
|
|
2709
2711
|
i0.ɵɵadvance();
|
|
2710
|
-
i0.ɵɵconditional(ctx.
|
|
2712
|
+
i0.ɵɵconditional(ctx.showProjectSelector && ctx.conversation ? 14 : -1);
|
|
2711
2713
|
i0.ɵɵadvance();
|
|
2712
|
-
i0.ɵɵconditional(ctx.
|
|
2714
|
+
i0.ɵɵconditional(ctx.showArtifactsModal ? 15 : -1);
|
|
2713
2715
|
i0.ɵɵadvance();
|
|
2714
|
-
i0.ɵɵconditional(ctx.
|
|
2716
|
+
i0.ɵɵconditional(ctx.showCollectionPicker ? 16 : -1);
|
|
2715
2717
|
i0.ɵɵadvance();
|
|
2716
2718
|
i0.ɵɵconditional(ctx.testFeedbackDialogData ? 17 : -1);
|
|
2717
2719
|
i0.ɵɵadvance();
|
|
2718
2720
|
i0.ɵɵconditional(ctx.showImageViewer ? 18 : -1);
|
|
2719
|
-
} }, dependencies: [i10.MJButtonDirective, i11.ArtifactViewerPanelComponent, i12.TestFeedbackDialogComponent, i13.LoadingComponent, i14.ArtifactCollectionPickerModalComponent, i15.ArtifactShareModalComponent, i16.MessageListComponent, i17.MessageInputComponent, i18.ConversationEmptyStateComponent, i19.ThreadPanelComponent, i20.ProjectSelectorComponent, i21.MembersModalComponent, i22.ExportModalComponent, i23.ImageViewerComponent, i24.PinnedMessagesPanelComponent, i25.DecimalPipe], 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.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.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}"] });
|
|
2721
|
+
} }, 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}"] });
|
|
2720
2722
|
}
|
|
2721
2723
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationChatAreaComponent, [{
|
|
2722
2724
|
type: Component,
|
|
2723
|
-
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 (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) {\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 <!-- 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\"\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 (artifactPickerRequested)=\"onArtifactPickerRequested()\">\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 </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<!-- 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 (saved)=\"onCollectionPickerSaved($event)\"\n (cancelled)=\"onCollectionPickerCancelled()\">\n </mj-artifact-collection-picker-modal>\n}\n\n<!-- Artifact Picker Slide-in Panel -->\n@if (showArtifactPickerPanel) {\n <div class=\"artifact-picker-overlay\" (click)=\"CloseArtifactPicker()\"></div>\n <div class=\"artifact-picker-panel\">\n <div class=\"artifact-picker-header\">\n <h3>Attach Artifact</h3>\n <button class=\"artifact-picker-close\" (click)=\"CloseArtifactPicker()\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n <div class=\"artifact-picker-body\">\n @if (isLoadingArtifactPicker) {\n <mj-loading text=\"Loading artifacts...\" size=\"medium\"></mj-loading>\n } @else if (artifactPickerItems.length === 0) {\n <div class=\"artifact-picker-empty\">\n <i class=\"fa-solid fa-cube\" style=\"font-size: 2rem; opacity: 0.3;\"></i>\n <p>No file artifacts found</p>\n <p class=\"artifact-picker-hint\">File artifacts are created when agents generate PDF, Excel, or Word documents.</p>\n </div>\n } @else {\n <div class=\"artifact-picker-list\">\n @for (item of artifactPickerItems; track item.artifactVersionId) {\n <button class=\"artifact-picker-item\" (click)=\"OnArtifactSelected(item)\">\n @if (item.contentMode === 'File') {\n <i class=\"fa-solid\" [class.fa-file-pdf]=\"item.mimeType === 'application/pdf'\"\n [class.fa-file-excel]=\"item.mimeType && item.mimeType.includes('spreadsheet')\"\n [class.fa-file-word]=\"item.mimeType && item.mimeType.includes('wordprocessing')\"\n [class.fa-file]=\"!item.mimeType || (!item.mimeType.includes('pdf') && !item.mimeType.includes('spreadsheet') && !item.mimeType.includes('wordprocessing'))\">\n </i>\n } @else {\n <i class=\"fa-solid fa-file-lines\"></i>\n }\n <div class=\"artifact-picker-item-info\">\n <span class=\"artifact-picker-item-name\">{{ item.name }}</span>\n <span class=\"artifact-picker-item-meta\">\n {{ item.contentMode === 'File' ? (item.fileName || '') : 'Text artifact' }}\n @if (item.sizeBytes) {\n \u00B7 {{ (item.sizeBytes / 1024) | number:'1.0-0' }} KB\n }\n </span>\n </div>\n </button>\n }\n </div>\n }\n </div>\n </div>\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.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.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"] }]
|
|
2724
|
-
}], () => [{ 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 }], { environmentId: [{
|
|
2725
|
+
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 (saved)=\"onCollectionPickerSaved($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"] }]
|
|
2726
|
+
}], () => [{ 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: [{
|
|
2725
2727
|
type: Input
|
|
2726
2728
|
}], currentUser: [{
|
|
2727
2729
|
type: Input
|
|
@@ -2792,5 +2794,5 @@ export class ConversationChatAreaComponent {
|
|
|
2792
2794
|
type: ViewChild,
|
|
2793
2795
|
args: [ConversationEmptyStateComponent]
|
|
2794
2796
|
}] }); })();
|
|
2795
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationChatAreaComponent, { className: "ConversationChatAreaComponent", filePath: "src/lib/components/conversation/conversation-chat-area.component.ts", lineNumber:
|
|
2797
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationChatAreaComponent, { className: "ConversationChatAreaComponent", filePath: "src/lib/components/conversation/conversation-chat-area.component.ts", lineNumber: 39 }); })();
|
|
2796
2798
|
//# sourceMappingURL=conversation-chat-area.component.js.map
|