max-agent-ui 0.0.13 → 0.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -65
- package/fesm2022/max-agent-ui.mjs +600 -82
- package/fesm2022/max-agent-ui.mjs.map +1 -1
- package/index.d.ts +404 -0
- package/package.json +11 -10
- package/types/max-agent-ui.d.ts +0 -204
|
@@ -1,44 +1,42 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as i2 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
|
+
import * as i1 from '@angular/common/http';
|
|
4
|
+
import { HttpErrorResponse, HttpHeaders } from '@angular/common/http';
|
|
3
5
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { InjectionToken, Inject, Optional, Injectable, signal, Input, ViewChild, Component } from '@angular/core';
|
|
6
|
+
import { InjectionToken, Pipe, Inject, Optional, Injectable, signal, isDevMode, HostListener, Input, ViewChild, Component } from '@angular/core';
|
|
5
7
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import * as
|
|
8
|
+
import * as i3 from '@angular/forms';
|
|
7
9
|
import { FormsModule } from '@angular/forms';
|
|
8
|
-
import * as
|
|
10
|
+
import * as i4 from 'primeng/button';
|
|
9
11
|
import { ButtonModule } from 'primeng/button';
|
|
10
|
-
import * as i4 from 'primeng/drawer';
|
|
11
|
-
import { DrawerModule } from 'primeng/drawer';
|
|
12
12
|
import * as i5 from 'primeng/textarea';
|
|
13
13
|
import { TextareaModule } from 'primeng/textarea';
|
|
14
14
|
import * as i6 from 'primeng/tooltip';
|
|
15
15
|
import { TooltipModule } from 'primeng/tooltip';
|
|
16
|
-
import { throwError } from 'rxjs';
|
|
17
|
-
import {
|
|
18
|
-
import * as i1 from '@angular/common/http';
|
|
16
|
+
import { throwError, Observable, switchMap, of } from 'rxjs';
|
|
17
|
+
import { marked } from 'marked';
|
|
19
18
|
|
|
19
|
+
const INITIAL_MESSAGE = 'Hi! 👋';
|
|
20
|
+
const INITIAL_DESCRIPTION = "I'm here to help. Whether you need information, want to complete a task, or just have a question, let me know and we'll get started.\n\nI'm still in my early days and learning every day. If I can't do something just yet, I hope you'll bear with me—I'll always do my best to help.\n\nWhat would you like to do today?";
|
|
20
21
|
const DEFAULT_ASSISTANT_BOOTSTRAP = {
|
|
21
22
|
initialMessage: undefined,
|
|
22
23
|
initialSuggestions: []
|
|
23
24
|
};
|
|
24
25
|
const ASSISTANT_BOOTSTRAP_BY_APP = {
|
|
25
26
|
cortex: {
|
|
26
|
-
initialMessage:
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
'Which lecturers have planned leave this week?',
|
|
30
|
-
'List the students who are on leave today.',
|
|
31
|
-
'List the students who were absent yesterday.',
|
|
32
|
-
'Generate the attendance report for a session conducted yesterday.'
|
|
33
|
-
]
|
|
27
|
+
initialMessage: INITIAL_MESSAGE,
|
|
28
|
+
initialDescription: INITIAL_DESCRIPTION,
|
|
29
|
+
initialSuggestions: []
|
|
34
30
|
},
|
|
35
31
|
nemesys: {
|
|
36
|
-
initialMessage:
|
|
37
|
-
|
|
32
|
+
initialMessage: INITIAL_MESSAGE,
|
|
33
|
+
initialDescription: INITIAL_DESCRIPTION,
|
|
34
|
+
initialSuggestions: []
|
|
38
35
|
},
|
|
39
36
|
attendance: {
|
|
40
|
-
initialMessage:
|
|
41
|
-
|
|
37
|
+
initialMessage: INITIAL_MESSAGE,
|
|
38
|
+
initialDescription: INITIAL_DESCRIPTION,
|
|
39
|
+
initialSuggestions: []
|
|
42
40
|
}
|
|
43
41
|
};
|
|
44
42
|
function getAssistantBootstrapConfig(app) {
|
|
@@ -53,8 +51,39 @@ const MAX_ASSISTANT_CONFIG = new InjectionToken('MAX_ASSISTANT_CONFIG', {
|
|
|
53
51
|
factory: () => ({})
|
|
54
52
|
});
|
|
55
53
|
|
|
56
|
-
|
|
54
|
+
class MaxAssistantMarkdownPipe {
|
|
55
|
+
transform(value) {
|
|
56
|
+
if (!value) {
|
|
57
|
+
return '';
|
|
58
|
+
}
|
|
59
|
+
// Assistant responses may contain Markdown, but they must not be able to
|
|
60
|
+
// inject raw HTML. Angular sanitises the generated HTML again when it is
|
|
61
|
+
// assigned through [innerHTML].
|
|
62
|
+
const escapedValue = value
|
|
63
|
+
.replaceAll('&', '&')
|
|
64
|
+
.replaceAll('<', '<')
|
|
65
|
+
.replaceAll('>', '>');
|
|
66
|
+
return marked.parse(escapedValue, {
|
|
67
|
+
async: false,
|
|
68
|
+
breaks: true,
|
|
69
|
+
gfm: true
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantMarkdownPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
73
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantMarkdownPipe, isStandalone: true, name: "maxAssistantMarkdown" });
|
|
74
|
+
}
|
|
75
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantMarkdownPipe, decorators: [{
|
|
76
|
+
type: Pipe,
|
|
77
|
+
args: [{
|
|
78
|
+
name: 'maxAssistantMarkdown',
|
|
79
|
+
standalone: true,
|
|
80
|
+
pure: true
|
|
81
|
+
}]
|
|
82
|
+
}] });
|
|
83
|
+
|
|
84
|
+
const DEFAULT_ASSISTANT_CHAT_URL = '/agent-api/v1/chat';
|
|
57
85
|
const DEFAULT_APP = 'cortex';
|
|
86
|
+
const DEFAULT_TIMEZONE = 'UTC';
|
|
58
87
|
class MaxAssistantService {
|
|
59
88
|
config;
|
|
60
89
|
http;
|
|
@@ -62,24 +91,115 @@ class MaxAssistantService {
|
|
|
62
91
|
this.config = config;
|
|
63
92
|
this.http = http;
|
|
64
93
|
}
|
|
65
|
-
sendMessage(message, conversationId, config = {}) {
|
|
94
|
+
sendMessage(message, conversationId, config = {}, confirmation, history = [], onProgress) {
|
|
66
95
|
const assistantConfig = {
|
|
67
96
|
...this.config,
|
|
68
97
|
...this.compactConfig(config)
|
|
69
98
|
};
|
|
70
99
|
const request = {
|
|
71
100
|
message,
|
|
101
|
+
...(onProgress ? { stream: true } : {}),
|
|
72
102
|
conversationId,
|
|
103
|
+
history,
|
|
73
104
|
app: this.getApp(assistantConfig),
|
|
74
|
-
|
|
105
|
+
context: this.getContext(assistantConfig),
|
|
106
|
+
...(confirmation ? { confirmation } : {})
|
|
107
|
+
};
|
|
108
|
+
return this.postMessage(request, assistantConfig, onProgress);
|
|
109
|
+
}
|
|
110
|
+
confirmAction(actionId, decision, conversationId, config = {}, history = []) {
|
|
111
|
+
return this.sendMessage(decision === 'approve' ? 'Approve action' : 'Reject action', conversationId, config, { actionId, decision }, history);
|
|
112
|
+
}
|
|
113
|
+
sendStructuredAction(message, action, conversationId, config = {}, history = []) {
|
|
114
|
+
const assistantConfig = {
|
|
115
|
+
...this.config,
|
|
116
|
+
...this.compactConfig(config)
|
|
117
|
+
};
|
|
118
|
+
const request = {
|
|
119
|
+
message,
|
|
120
|
+
conversationId,
|
|
121
|
+
history,
|
|
122
|
+
app: this.getApp(assistantConfig),
|
|
123
|
+
context: this.getContext(assistantConfig),
|
|
124
|
+
structuredAction: action
|
|
75
125
|
};
|
|
76
126
|
return this.postMessage(request, assistantConfig);
|
|
77
127
|
}
|
|
78
|
-
postMessage(request, config) {
|
|
128
|
+
postMessage(request, config, onProgress) {
|
|
79
129
|
if (!this.http) {
|
|
80
130
|
return throwError(() => new Error('HttpClient is not available. Add provideHttpClient() to the host app.'));
|
|
81
131
|
}
|
|
82
|
-
|
|
132
|
+
if (onProgress) {
|
|
133
|
+
return this.streamMessage(request, config, onProgress);
|
|
134
|
+
}
|
|
135
|
+
return this.http.post(this.getChatUrl(config), request, { headers: this.getHeaders(config) });
|
|
136
|
+
}
|
|
137
|
+
streamMessage(request, config, onProgress) {
|
|
138
|
+
return new Observable(subscriber => {
|
|
139
|
+
const controller = new AbortController();
|
|
140
|
+
const headers = this.getHeaders(config);
|
|
141
|
+
const fetchHeaders = Object.fromEntries(headers.keys().map(name => [name, headers.get(name) ?? '']));
|
|
142
|
+
void fetch(this.getChatUrl(config), {
|
|
143
|
+
method: 'POST',
|
|
144
|
+
headers: fetchHeaders,
|
|
145
|
+
body: JSON.stringify(request),
|
|
146
|
+
signal: controller.signal
|
|
147
|
+
}).then(async (response) => {
|
|
148
|
+
if (!response.ok) {
|
|
149
|
+
const error = await response.json().catch(() => undefined);
|
|
150
|
+
throw new HttpErrorResponse({
|
|
151
|
+
error,
|
|
152
|
+
status: response.status,
|
|
153
|
+
statusText: response.statusText,
|
|
154
|
+
url: response.url
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
if (!response.body) {
|
|
158
|
+
throw new Error('The assistant response stream was unavailable.');
|
|
159
|
+
}
|
|
160
|
+
const reader = response.body.getReader();
|
|
161
|
+
const decoder = new TextDecoder();
|
|
162
|
+
let buffer = '';
|
|
163
|
+
let receivedResult = false;
|
|
164
|
+
const processLine = (line) => {
|
|
165
|
+
const trimmedLine = line.trim();
|
|
166
|
+
if (!trimmedLine) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const event = JSON.parse(trimmedLine);
|
|
170
|
+
if (event.type === 'progress') {
|
|
171
|
+
onProgress(event);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (event.type === 'error') {
|
|
175
|
+
throw new Error(event.message);
|
|
176
|
+
}
|
|
177
|
+
receivedResult = true;
|
|
178
|
+
subscriber.next(event.response);
|
|
179
|
+
};
|
|
180
|
+
while (true) {
|
|
181
|
+
const { done, value } = await reader.read();
|
|
182
|
+
if (done) {
|
|
183
|
+
break;
|
|
184
|
+
}
|
|
185
|
+
buffer += decoder.decode(value, { stream: true });
|
|
186
|
+
const lines = buffer.split('\n');
|
|
187
|
+
buffer = lines.pop() ?? '';
|
|
188
|
+
lines.forEach(processLine);
|
|
189
|
+
}
|
|
190
|
+
buffer += decoder.decode();
|
|
191
|
+
processLine(buffer);
|
|
192
|
+
if (!receivedResult) {
|
|
193
|
+
throw new Error('The assistant response stream ended before a result was returned.');
|
|
194
|
+
}
|
|
195
|
+
subscriber.complete();
|
|
196
|
+
}).catch(error => {
|
|
197
|
+
if (!subscriber.closed && error?.name !== 'AbortError') {
|
|
198
|
+
subscriber.error(error);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
return () => controller.abort();
|
|
202
|
+
});
|
|
83
203
|
}
|
|
84
204
|
getChatUrl(config) {
|
|
85
205
|
return config.assistantApiUrl?.trim() || DEFAULT_ASSISTANT_CHAT_URL;
|
|
@@ -93,13 +213,53 @@ class MaxAssistantService {
|
|
|
93
213
|
}
|
|
94
214
|
return config.user ?? {};
|
|
95
215
|
}
|
|
216
|
+
getContext(config) {
|
|
217
|
+
const configured = typeof config.context === 'function'
|
|
218
|
+
? config.context()
|
|
219
|
+
: config.context ?? {};
|
|
220
|
+
return {
|
|
221
|
+
permissions: configured.permissions ?? [],
|
|
222
|
+
timezone: configured.timezone
|
|
223
|
+
?? Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
224
|
+
?? DEFAULT_TIMEZONE,
|
|
225
|
+
...(configured.tenantId ? { tenantId: configured.tenantId } : {}),
|
|
226
|
+
...(configured.organisationId
|
|
227
|
+
? { organisationId: configured.organisationId }
|
|
228
|
+
: {}),
|
|
229
|
+
...(configured.userId ? { userId: configured.userId } : {}),
|
|
230
|
+
...(configured.role ? { role: configured.role } : {}),
|
|
231
|
+
...(configured.route ? { route: configured.route } : {}),
|
|
232
|
+
...(configured.module ? { module: configured.module } : {})
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
getHeaders(config) {
|
|
236
|
+
const user = this.getUser(config);
|
|
237
|
+
let headers = new HttpHeaders({ 'Content-Type': 'application/json' });
|
|
238
|
+
const configuredHeaders = typeof config.requestHeaders === 'function'
|
|
239
|
+
? config.requestHeaders()
|
|
240
|
+
: config.requestHeaders ?? {};
|
|
241
|
+
for (const [name, value] of Object.entries(configuredHeaders)) {
|
|
242
|
+
const trimmedName = name.trim();
|
|
243
|
+
const trimmedValue = value.trim();
|
|
244
|
+
if (trimmedName && trimmedValue) {
|
|
245
|
+
headers = headers.set(trimmedName, trimmedValue);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (user.token) {
|
|
249
|
+
headers = headers.set('x-cortex-auth-token', String(user.token));
|
|
250
|
+
}
|
|
251
|
+
if (user.version) {
|
|
252
|
+
headers = headers.set('x-cortex-version', String(user.version));
|
|
253
|
+
}
|
|
254
|
+
return headers;
|
|
255
|
+
}
|
|
96
256
|
compactConfig(config) {
|
|
97
257
|
return Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined));
|
|
98
258
|
}
|
|
99
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
100
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
259
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantService, deps: [{ token: MAX_ASSISTANT_CONFIG }, { token: i1.HttpClient, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
260
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantService, providedIn: 'root' });
|
|
101
261
|
}
|
|
102
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
262
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantService, decorators: [{
|
|
103
263
|
type: Injectable,
|
|
104
264
|
args: [{
|
|
105
265
|
providedIn: 'root'
|
|
@@ -113,32 +273,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
113
273
|
|
|
114
274
|
const ASSISTANT_UI_COPY = {
|
|
115
275
|
title: 'Max',
|
|
116
|
-
subtitle: '
|
|
117
|
-
launcherLabel: 'Open
|
|
118
|
-
openTooltip: 'Open
|
|
119
|
-
closeLabel: 'Close
|
|
120
|
-
clearLabel: '
|
|
121
|
-
clearTooltip: '
|
|
122
|
-
placeholder: 'Ask
|
|
123
|
-
|
|
276
|
+
subtitle: 'Personal AI Assistant',
|
|
277
|
+
launcherLabel: 'Open Max workspace',
|
|
278
|
+
openTooltip: 'Open Max workspace',
|
|
279
|
+
closeLabel: 'Close Max workspace',
|
|
280
|
+
clearLabel: 'Start a new session',
|
|
281
|
+
clearTooltip: 'Start a new session',
|
|
282
|
+
placeholder: 'Ask Max',
|
|
283
|
+
startingMessage: 'Understanding your request…',
|
|
124
284
|
errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'
|
|
125
285
|
};
|
|
126
286
|
class MaxAssistantComponent {
|
|
127
287
|
assistantService;
|
|
128
288
|
destroyRef;
|
|
289
|
+
defaultConfig;
|
|
290
|
+
launcher;
|
|
129
291
|
messagesViewport;
|
|
130
292
|
app;
|
|
131
293
|
assistantApiUrl;
|
|
132
|
-
user
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
294
|
+
user;
|
|
295
|
+
context;
|
|
296
|
+
requestHeaders;
|
|
297
|
+
panelVisible = signal(false, ...(ngDevMode ? [{ debugName: "panelVisible" }] : []));
|
|
298
|
+
isSending = signal(false, ...(ngDevMode ? [{ debugName: "isSending" }] : []));
|
|
299
|
+
input = signal('', ...(ngDevMode ? [{ debugName: "input" }] : []));
|
|
300
|
+
conversationId = signal(undefined, ...(ngDevMode ? [{ debugName: "conversationId" }] : []));
|
|
301
|
+
messages = signal([], ...(ngDevMode ? [{ debugName: "messages" }] : []));
|
|
302
|
+
expandedDetailMessageIds = signal(new Set(), ...(ngDevMode ? [{ debugName: "expandedDetailMessageIds" }] : []));
|
|
303
|
+
expandedTraceStepKeys = signal(new Set(), ...(ngDevMode ? [{ debugName: "expandedTraceStepKeys" }] : []));
|
|
304
|
+
developerDetailsEnabled = isDevMode();
|
|
305
|
+
constructor(assistantService, destroyRef, defaultConfig) {
|
|
140
306
|
this.assistantService = assistantService;
|
|
141
307
|
this.destroyRef = destroyRef;
|
|
308
|
+
this.defaultConfig = defaultConfig;
|
|
142
309
|
}
|
|
143
310
|
openPanel() {
|
|
144
311
|
this.panelVisible.set(true);
|
|
@@ -163,14 +330,35 @@ class MaxAssistantComponent {
|
|
|
163
330
|
get bootstrapConfig() {
|
|
164
331
|
return getAssistantBootstrapConfig(this.app);
|
|
165
332
|
}
|
|
333
|
+
isWelcomeMessage(message) {
|
|
334
|
+
return (this.messages()[0]?.id === message.id &&
|
|
335
|
+
message.role === 'assistant' &&
|
|
336
|
+
!message.displayResponse &&
|
|
337
|
+
!message.isStreaming);
|
|
338
|
+
}
|
|
339
|
+
isWelcomeState(message) {
|
|
340
|
+
return this.messages().length === 1 && this.isWelcomeMessage(message);
|
|
341
|
+
}
|
|
166
342
|
closePanel() {
|
|
167
343
|
this.panelVisible.set(false);
|
|
344
|
+
queueMicrotask(() => this.launcher?.nativeElement.focus({ preventScroll: true }));
|
|
345
|
+
}
|
|
346
|
+
onDocumentEscape() {
|
|
347
|
+
if (this.expandedDetailMessageIds().size) {
|
|
348
|
+
this.expandedDetailMessageIds.set(new Set());
|
|
349
|
+
this.expandedTraceStepKeys.set(new Set());
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
if (this.panelVisible()) {
|
|
353
|
+
this.closePanel();
|
|
354
|
+
}
|
|
168
355
|
}
|
|
169
356
|
clearChatSession() {
|
|
170
357
|
this.input.set('');
|
|
171
358
|
this.isSending.set(false);
|
|
172
359
|
this.conversationId.set(undefined);
|
|
173
|
-
this.
|
|
360
|
+
this.expandedDetailMessageIds.set(new Set());
|
|
361
|
+
this.expandedTraceStepKeys.set(new Set());
|
|
174
362
|
this.messages.set(this.createDefaultMessages());
|
|
175
363
|
this.scrollToLatest();
|
|
176
364
|
}
|
|
@@ -179,29 +367,145 @@ class MaxAssistantComponent {
|
|
|
179
367
|
if (!trimmedMessage || this.isSending()) {
|
|
180
368
|
return;
|
|
181
369
|
}
|
|
370
|
+
const history = this.getConversationHistory();
|
|
182
371
|
this.input.set('');
|
|
183
372
|
this.appendMessage(this.createMessage('user', trimmedMessage));
|
|
373
|
+
const streamingMessage = {
|
|
374
|
+
...this.createMessage('assistant', this.uiCopy.startingMessage),
|
|
375
|
+
isStreaming: true
|
|
376
|
+
};
|
|
377
|
+
this.appendMessage(streamingMessage);
|
|
184
378
|
this.isSending.set(true);
|
|
185
379
|
this.assistantService
|
|
186
|
-
.sendMessage(trimmedMessage, this.conversationId(), this.getAssistantConfig())
|
|
380
|
+
.sendMessage(trimmedMessage, this.conversationId(), this.getAssistantConfig(), undefined, history, progress => this.updateStreamingMessage(streamingMessage.id, progress.message))
|
|
187
381
|
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
188
382
|
.subscribe({
|
|
189
383
|
next: response => {
|
|
190
384
|
this.conversationId.set(response.conversationId);
|
|
191
|
-
this.
|
|
385
|
+
this.replaceMessage(streamingMessage.id, this.createAssistantResponseMessage(response, trimmedMessage));
|
|
192
386
|
this.isSending.set(false);
|
|
193
387
|
},
|
|
194
|
-
error:
|
|
195
|
-
this.
|
|
196
|
-
...this.createMessage('assistant', this.
|
|
388
|
+
error: error => {
|
|
389
|
+
this.replaceMessage(streamingMessage.id, {
|
|
390
|
+
...this.createMessage('assistant', this.resolveErrorMessage(error)),
|
|
197
391
|
isError: true
|
|
198
392
|
});
|
|
199
393
|
this.isSending.set(false);
|
|
200
394
|
}
|
|
201
395
|
});
|
|
202
396
|
}
|
|
397
|
+
suggestionLabel(suggestion) {
|
|
398
|
+
return typeof suggestion === 'string' ? suggestion : suggestion.label;
|
|
399
|
+
}
|
|
203
400
|
useSuggestion(suggestion) {
|
|
204
|
-
|
|
401
|
+
if (typeof suggestion === 'string' || !suggestion.structuredAction) {
|
|
402
|
+
this.sendMessage(typeof suggestion === 'string' ? suggestion : suggestion.message);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
const label = suggestion.label.trim();
|
|
406
|
+
if (!label || this.isSending()) {
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
const history = this.getConversationHistory();
|
|
410
|
+
this.appendMessage(this.createMessage('user', label));
|
|
411
|
+
this.isSending.set(true);
|
|
412
|
+
this.assistantService
|
|
413
|
+
.sendStructuredAction(suggestion.message, suggestion.structuredAction, this.conversationId(), this.getAssistantConfig(), history)
|
|
414
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
415
|
+
.subscribe({
|
|
416
|
+
next: response => {
|
|
417
|
+
this.conversationId.set(response.conversationId);
|
|
418
|
+
this.appendMessage(this.createAssistantResponseMessage(response, suggestion.message));
|
|
419
|
+
this.isSending.set(false);
|
|
420
|
+
},
|
|
421
|
+
error: error => {
|
|
422
|
+
this.appendMessage({
|
|
423
|
+
...this.createMessage('assistant', this.resolveErrorMessage(error)),
|
|
424
|
+
isError: true
|
|
425
|
+
});
|
|
426
|
+
this.isSending.set(false);
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
getTableRowActions(table, rowIndex) {
|
|
431
|
+
return table.actions?.filter(action => action.rowIndex === rowIndex) ?? [];
|
|
432
|
+
}
|
|
433
|
+
useTableAction(action) {
|
|
434
|
+
const label = action.label.trim();
|
|
435
|
+
if (!label || this.isSending()) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
const history = this.getConversationHistory();
|
|
439
|
+
this.appendMessage(this.createMessage('user', label));
|
|
440
|
+
this.isSending.set(true);
|
|
441
|
+
this.assistantService
|
|
442
|
+
.sendStructuredAction(action.message, action.structuredAction, this.conversationId(), this.getAssistantConfig(), history)
|
|
443
|
+
.pipe(switchMap(response => {
|
|
444
|
+
if (!action.confirmOnClick || !response.pendingAction) {
|
|
445
|
+
return of(response);
|
|
446
|
+
}
|
|
447
|
+
return this.assistantService.confirmAction(response.pendingAction.id, 'approve', response.conversationId, this.getAssistantConfig(), history);
|
|
448
|
+
}), takeUntilDestroyed(this.destroyRef))
|
|
449
|
+
.subscribe({
|
|
450
|
+
next: response => {
|
|
451
|
+
this.conversationId.set(response.conversationId);
|
|
452
|
+
this.appendMessage(this.createAssistantResponseMessage(response, action.message));
|
|
453
|
+
this.isSending.set(false);
|
|
454
|
+
},
|
|
455
|
+
error: error => {
|
|
456
|
+
this.appendMessage({
|
|
457
|
+
...this.createMessage('assistant', this.resolveErrorMessage(error)),
|
|
458
|
+
isError: true
|
|
459
|
+
});
|
|
460
|
+
this.isSending.set(false);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
resolvePendingAction(message, decision) {
|
|
465
|
+
const pendingAction = message.pendingAction;
|
|
466
|
+
const currentConversationId = this.conversationId();
|
|
467
|
+
if (!pendingAction ||
|
|
468
|
+
!currentConversationId ||
|
|
469
|
+
message.actionDecision ||
|
|
470
|
+
this.isSending()) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
this.messages.update(messages => messages.map(item => item.id === message.id ? { ...item, actionDecision: decision } : item));
|
|
474
|
+
const userMessage = decision === 'approve'
|
|
475
|
+
? `Approve: ${pendingAction.summary}`
|
|
476
|
+
: `Reject: ${pendingAction.summary}`;
|
|
477
|
+
const history = this.getConversationHistory();
|
|
478
|
+
this.appendMessage(this.createMessage('user', userMessage));
|
|
479
|
+
this.isSending.set(true);
|
|
480
|
+
this.assistantService
|
|
481
|
+
.confirmAction(pendingAction.id, decision, currentConversationId, this.getAssistantConfig(), history)
|
|
482
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
483
|
+
.subscribe({
|
|
484
|
+
next: response => {
|
|
485
|
+
this.conversationId.set(response.conversationId);
|
|
486
|
+
this.appendMessage(this.createAssistantResponseMessage(response, userMessage));
|
|
487
|
+
this.isSending.set(false);
|
|
488
|
+
},
|
|
489
|
+
error: error => {
|
|
490
|
+
this.messages.update(messages => messages.map(item => item.id === message.id ? { ...item, actionDecision: undefined } : item));
|
|
491
|
+
this.appendMessage({
|
|
492
|
+
...this.createMessage('assistant', this.resolveErrorMessage(error)),
|
|
493
|
+
isError: true
|
|
494
|
+
});
|
|
495
|
+
this.isSending.set(false);
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
resolveErrorMessage(error) {
|
|
500
|
+
if (error instanceof HttpErrorResponse &&
|
|
501
|
+
typeof error.error === 'object' &&
|
|
502
|
+
error.error !== null &&
|
|
503
|
+
'message' in error.error &&
|
|
504
|
+
typeof error.error.message === 'string' &&
|
|
505
|
+
error.error.message.trim()) {
|
|
506
|
+
return error.error.message.trim();
|
|
507
|
+
}
|
|
508
|
+
return this.uiCopy.errorMessage;
|
|
205
509
|
}
|
|
206
510
|
onComposerKeydown(event) {
|
|
207
511
|
if (event.key === 'Enter' && !event.shiftKey) {
|
|
@@ -209,28 +513,135 @@ class MaxAssistantComponent {
|
|
|
209
513
|
this.sendMessage();
|
|
210
514
|
}
|
|
211
515
|
}
|
|
212
|
-
|
|
213
|
-
return this.
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
this.
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
516
|
+
isDetailsVisible(messageId) {
|
|
517
|
+
return this.expandedDetailMessageIds().has(messageId);
|
|
518
|
+
}
|
|
519
|
+
toggleDetails(messageId, initialStepId) {
|
|
520
|
+
const opening = !this.isDetailsVisible(messageId);
|
|
521
|
+
this.expandedDetailMessageIds.set(opening ? new Set([messageId]) : new Set());
|
|
522
|
+
this.expandedTraceStepKeys.set(opening && initialStepId !== undefined
|
|
523
|
+
? new Set([this.traceStepKey(messageId, initialStepId)])
|
|
524
|
+
: new Set());
|
|
525
|
+
}
|
|
526
|
+
isTraceStepExpanded(messageId, stepId) {
|
|
527
|
+
return this.expandedTraceStepKeys().has(this.traceStepKey(messageId, stepId));
|
|
528
|
+
}
|
|
529
|
+
toggleTraceStep(messageId, stepId) {
|
|
530
|
+
const key = this.traceStepKey(messageId, stepId);
|
|
531
|
+
this.expandedTraceStepKeys.update(expandedKeys => {
|
|
532
|
+
const next = new Set(expandedKeys);
|
|
533
|
+
if (next.has(key)) {
|
|
534
|
+
next.delete(key);
|
|
221
535
|
}
|
|
222
536
|
else {
|
|
223
|
-
|
|
537
|
+
next.add(key);
|
|
224
538
|
}
|
|
225
|
-
return
|
|
539
|
+
return next;
|
|
226
540
|
});
|
|
227
|
-
if (willOpen) {
|
|
228
|
-
this.scrollToLatest();
|
|
229
|
-
}
|
|
230
541
|
}
|
|
231
542
|
getResponseGrid(responseDetails) {
|
|
232
543
|
return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];
|
|
233
544
|
}
|
|
545
|
+
formatTraceValue(value) {
|
|
546
|
+
return JSON.stringify(value, null, 2);
|
|
547
|
+
}
|
|
548
|
+
traceMap(value) {
|
|
549
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
550
|
+
? value
|
|
551
|
+
: undefined;
|
|
552
|
+
}
|
|
553
|
+
traceMapField(value, key) {
|
|
554
|
+
return this.traceMap(this.traceMap(value)?.[key]);
|
|
555
|
+
}
|
|
556
|
+
traceArrayField(value, key) {
|
|
557
|
+
const field = this.traceMap(value)?.[key];
|
|
558
|
+
return Array.isArray(field) ? field : [];
|
|
559
|
+
}
|
|
560
|
+
traceField(value, key) {
|
|
561
|
+
return this.traceMap(value)?.[key];
|
|
562
|
+
}
|
|
563
|
+
traceEntries(value, excludedKeys = []) {
|
|
564
|
+
const record = this.traceMap(value);
|
|
565
|
+
const excluded = new Set(excludedKeys.map(key => key.toLocaleLowerCase()));
|
|
566
|
+
return record
|
|
567
|
+
? Object.entries(record)
|
|
568
|
+
.filter(([key, entry]) => entry !== undefined && !excluded.has(key.toLocaleLowerCase()))
|
|
569
|
+
.map(([key, entry]) => ({
|
|
570
|
+
key,
|
|
571
|
+
label: this.formatTraceLabel(key),
|
|
572
|
+
value: entry
|
|
573
|
+
}))
|
|
574
|
+
: [];
|
|
575
|
+
}
|
|
576
|
+
formatTraceLabel(value) {
|
|
577
|
+
return value
|
|
578
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
579
|
+
.replace(/_/g, ' ')
|
|
580
|
+
.replace(/\b\w/g, character => character.toUpperCase());
|
|
581
|
+
}
|
|
582
|
+
formatTraceScalar(value) {
|
|
583
|
+
if (value === null) {
|
|
584
|
+
return 'None';
|
|
585
|
+
}
|
|
586
|
+
if (value === undefined) {
|
|
587
|
+
return 'Not supplied';
|
|
588
|
+
}
|
|
589
|
+
if (typeof value === 'boolean') {
|
|
590
|
+
return value ? 'Yes' : 'No';
|
|
591
|
+
}
|
|
592
|
+
if (typeof value === 'number') {
|
|
593
|
+
return Number.isInteger(value) ? String(value) : value.toFixed(6);
|
|
594
|
+
}
|
|
595
|
+
if (typeof value === 'string') {
|
|
596
|
+
return value || 'Empty';
|
|
597
|
+
}
|
|
598
|
+
return JSON.stringify(value);
|
|
599
|
+
}
|
|
600
|
+
formatSimilarity(value) {
|
|
601
|
+
return typeof value === 'number' ? value.toFixed(4) : '—';
|
|
602
|
+
}
|
|
603
|
+
getHttpStatus(step) {
|
|
604
|
+
const output = this.traceMap(step.output);
|
|
605
|
+
const http = this.traceMap(output?.['http']);
|
|
606
|
+
const status = http?.['statusCode'] ?? output?.['statusCode'] ?? step.error?.statusCode;
|
|
607
|
+
return typeof status === 'number' ? status : undefined;
|
|
608
|
+
}
|
|
609
|
+
isHttpSuccessful(step) {
|
|
610
|
+
const status = this.getHttpStatus(step);
|
|
611
|
+
return status !== undefined && status >= 200 && status < 300;
|
|
612
|
+
}
|
|
613
|
+
traceStepTone(step) {
|
|
614
|
+
return step.category === 'api_call' && this.isHttpSuccessful(step)
|
|
615
|
+
? 'succeeded'
|
|
616
|
+
: step.status;
|
|
617
|
+
}
|
|
618
|
+
traceStepStatus(step) {
|
|
619
|
+
if (step.category === 'api_call') {
|
|
620
|
+
const status = this.getHttpStatus(step);
|
|
621
|
+
if (status !== undefined) {
|
|
622
|
+
return `HTTP ${status} ${this.isHttpSuccessful(step) ? 'Success' : 'Error'}`;
|
|
623
|
+
}
|
|
624
|
+
return step.status === 'failed' ? 'Transport failed' : 'Completed';
|
|
625
|
+
}
|
|
626
|
+
return step.status === 'succeeded'
|
|
627
|
+
? 'Completed'
|
|
628
|
+
: step.status === 'failed'
|
|
629
|
+
? 'Stopped'
|
|
630
|
+
: 'Running';
|
|
631
|
+
}
|
|
632
|
+
formatTraceCategory(category) {
|
|
633
|
+
const labels = {
|
|
634
|
+
request: 'Request intake',
|
|
635
|
+
intent_projection: 'Intent generalisation',
|
|
636
|
+
embedding: 'Intent embedding',
|
|
637
|
+
capability_routing: 'Capability matching',
|
|
638
|
+
argument_extraction: 'Argument extraction',
|
|
639
|
+
api_call: 'Nemesys API',
|
|
640
|
+
action: 'Workflow outcome',
|
|
641
|
+
response: 'Assistant response'
|
|
642
|
+
};
|
|
643
|
+
return labels[category] ?? this.formatTraceLabel(category);
|
|
644
|
+
}
|
|
234
645
|
getAssistantConfig() {
|
|
235
646
|
const config = {};
|
|
236
647
|
if (this.assistantApiUrl) {
|
|
@@ -242,25 +653,73 @@ class MaxAssistantComponent {
|
|
|
242
653
|
if (this.user) {
|
|
243
654
|
config.user = this.user;
|
|
244
655
|
}
|
|
656
|
+
if (this.context) {
|
|
657
|
+
config.context = this.context;
|
|
658
|
+
}
|
|
659
|
+
if (this.requestHeaders) {
|
|
660
|
+
config.requestHeaders = this.requestHeaders;
|
|
661
|
+
}
|
|
245
662
|
return config;
|
|
246
663
|
}
|
|
247
664
|
appendMessage(message) {
|
|
248
665
|
this.messages.update(messages => [...messages, message]);
|
|
249
666
|
this.scrollToLatest();
|
|
250
667
|
}
|
|
668
|
+
updateStreamingMessage(messageId, content) {
|
|
669
|
+
const trimmedContent = content.trim();
|
|
670
|
+
if (!trimmedContent) {
|
|
671
|
+
return;
|
|
672
|
+
}
|
|
673
|
+
this.messages.update(messages => messages.map(message => message.id === messageId && message.isStreaming
|
|
674
|
+
? { ...message, content: trimmedContent }
|
|
675
|
+
: message));
|
|
676
|
+
this.scrollToLatest();
|
|
677
|
+
}
|
|
678
|
+
replaceMessage(messageId, replacement) {
|
|
679
|
+
this.messages.update(messages => messages.map(message => message.id === messageId
|
|
680
|
+
? { ...replacement, id: messageId, isStreaming: false }
|
|
681
|
+
: message));
|
|
682
|
+
this.scrollToLatest();
|
|
683
|
+
}
|
|
251
684
|
createDefaultMessages() {
|
|
252
685
|
if (!this.bootstrapConfig.initialMessage) {
|
|
253
686
|
return [];
|
|
254
687
|
}
|
|
255
688
|
return [
|
|
256
|
-
this.createMessage('assistant', this.bootstrapConfig.initialMessage, this.bootstrapConfig.initialSuggestions)
|
|
689
|
+
this.createMessage('assistant', this.getInitialMessage(this.bootstrapConfig.initialMessage), this.bootstrapConfig.initialSuggestions)
|
|
257
690
|
];
|
|
258
691
|
}
|
|
692
|
+
getInitialMessage(initialMessage) {
|
|
693
|
+
const configuredUser = this.user ?? this.defaultConfig.user;
|
|
694
|
+
const user = typeof configuredUser === 'function'
|
|
695
|
+
? configuredUser()
|
|
696
|
+
: configuredUser;
|
|
697
|
+
const preferredName = [
|
|
698
|
+
user?.['firstName'],
|
|
699
|
+
user?.['firstname'],
|
|
700
|
+
user?.['displayName'],
|
|
701
|
+
user?.['name'],
|
|
702
|
+
user?.['username']
|
|
703
|
+
].find(value => typeof value === 'string' && value.trim());
|
|
704
|
+
if (typeof preferredName !== 'string') {
|
|
705
|
+
return initialMessage;
|
|
706
|
+
}
|
|
707
|
+
const firstName = preferredName
|
|
708
|
+
.trim()
|
|
709
|
+
.split(/\s|@/)[0];
|
|
710
|
+
if (!firstName) {
|
|
711
|
+
return initialMessage;
|
|
712
|
+
}
|
|
713
|
+
if (initialMessage.startsWith('Hi!')) {
|
|
714
|
+
return initialMessage.replace(/^Hi!/, `Hi ${firstName}!`);
|
|
715
|
+
}
|
|
716
|
+
return initialMessage.replace(/^Hello,/, `Hello ${firstName},`);
|
|
717
|
+
}
|
|
259
718
|
createAssistantResponseMessage(response, userQuery) {
|
|
260
719
|
const displayResponse = this.createDisplayResponse(response, userQuery);
|
|
261
|
-
return this.createMessage('assistant', displayResponse.agentInferredResponse || response.answer, response.suggestions, response.sources, response.intent, response.intentLabel, response.app, response.productLabel, response.apiModule, response.confidence, response.parameters ?? response.entities, response.apiCalls, response.apiResult, response.mockResult, response.llmUsed, response.availableModules, displayResponse);
|
|
720
|
+
return this.createMessage('assistant', displayResponse.agentInferredResponse || response.answer, response.suggestions, response.sources, response.intent, response.intentLabel, response.app ?? response.product, response.productLabel, response.apiModule ?? response.contextResolution?.moduleKey, response.confidence ?? response.contextResolution?.confidence, response.parameters ?? response.entities, response.apiCalls ?? this.getToolApiCalls(response), response.apiResult, response.mockResult, response.llmUsed, response.availableModules, displayResponse, response.status, response.pendingAction, response.toolExecution, response.cards, response.contextResolution.capabilityKey, response.developerTrace);
|
|
262
721
|
}
|
|
263
|
-
createMessage(role, content, suggestions = [], sources = [], intent, intentLabel, app, productLabel, apiModule, confidence, parameters, apiCalls, apiResult, mockResult, llmUsed, availableModules, displayResponse) {
|
|
722
|
+
createMessage(role, content, suggestions = [], sources = [], intent, intentLabel, app, productLabel, apiModule, confidence, parameters, apiCalls, apiResult, mockResult, llmUsed, availableModules, displayResponse, status, pendingAction, toolExecution, cards, capabilityKey, developerTrace) {
|
|
264
723
|
return {
|
|
265
724
|
id: this.createId(),
|
|
266
725
|
role,
|
|
@@ -286,6 +745,12 @@ class MaxAssistantComponent {
|
|
|
286
745
|
mockResult,
|
|
287
746
|
llmUsed,
|
|
288
747
|
availableModules,
|
|
748
|
+
status,
|
|
749
|
+
pendingAction,
|
|
750
|
+
toolExecution,
|
|
751
|
+
cards,
|
|
752
|
+
capabilityKey,
|
|
753
|
+
developerTrace,
|
|
289
754
|
createdAt: new Date()
|
|
290
755
|
};
|
|
291
756
|
}
|
|
@@ -306,16 +771,30 @@ class MaxAssistantComponent {
|
|
|
306
771
|
}
|
|
307
772
|
createExtractedIntent(response, provided) {
|
|
308
773
|
return {
|
|
309
|
-
project: provided?.project ?? response.productLabel ?? response.app,
|
|
310
|
-
projectKey: provided?.projectKey ?? response.app,
|
|
311
|
-
module: provided?.module ?? response.apiModule,
|
|
312
|
-
intent: provided?.intent ?? response.intent,
|
|
313
|
-
intentLabel: provided?.intentLabel
|
|
314
|
-
|
|
774
|
+
project: provided?.project ?? response.productLabel ?? response.product ?? response.app,
|
|
775
|
+
projectKey: provided?.projectKey ?? response.product ?? response.app,
|
|
776
|
+
module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,
|
|
777
|
+
intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,
|
|
778
|
+
intentLabel: provided?.intentLabel
|
|
779
|
+
?? response.intentLabel
|
|
780
|
+
?? response.contextResolution?.capabilityLabel,
|
|
781
|
+
confidence: provided?.confidence
|
|
782
|
+
?? response.confidence
|
|
783
|
+
?? response.contextResolution?.confidence,
|
|
315
784
|
parameters: provided?.parameters ?? response.parameters ?? response.entities,
|
|
316
|
-
api: provided?.api ?? response.apiCalls?.[0]
|
|
785
|
+
api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]
|
|
317
786
|
};
|
|
318
787
|
}
|
|
788
|
+
getToolApiCalls(response) {
|
|
789
|
+
if (!response.toolExecution) {
|
|
790
|
+
return undefined;
|
|
791
|
+
}
|
|
792
|
+
return [{
|
|
793
|
+
method: response.toolExecution.method,
|
|
794
|
+
url: response.toolExecution.endpoint,
|
|
795
|
+
purpose: response.toolExecution.toolName
|
|
796
|
+
}];
|
|
797
|
+
}
|
|
319
798
|
getSampleJsonResponseFallback(response) {
|
|
320
799
|
if (!response.mockResult || !Object.keys(response.mockResult).length) {
|
|
321
800
|
return undefined;
|
|
@@ -399,6 +878,25 @@ class MaxAssistantComponent {
|
|
|
399
878
|
createId() {
|
|
400
879
|
return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;
|
|
401
880
|
}
|
|
881
|
+
traceStepKey(messageId, stepId) {
|
|
882
|
+
return `${messageId}:${stepId}`;
|
|
883
|
+
}
|
|
884
|
+
getConversationHistory() {
|
|
885
|
+
const messages = this.messages();
|
|
886
|
+
const firstUserIndex = messages.findIndex(message => message.role === 'user');
|
|
887
|
+
if (firstUserIndex < 0) {
|
|
888
|
+
return [];
|
|
889
|
+
}
|
|
890
|
+
return messages
|
|
891
|
+
.slice(firstUserIndex)
|
|
892
|
+
.filter(message => !message.isError && !message.isStreaming)
|
|
893
|
+
.slice(-20)
|
|
894
|
+
.map(message => ({
|
|
895
|
+
role: message.role,
|
|
896
|
+
content: message.content.slice(0, 4_000),
|
|
897
|
+
...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})
|
|
898
|
+
}));
|
|
899
|
+
}
|
|
402
900
|
scrollToLatest() {
|
|
403
901
|
setTimeout(() => {
|
|
404
902
|
const element = this.messagesViewport?.nativeElement;
|
|
@@ -407,13 +905,26 @@ class MaxAssistantComponent {
|
|
|
407
905
|
}
|
|
408
906
|
});
|
|
409
907
|
}
|
|
410
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
411
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.12", type: MaxAssistantComponent, isStandalone: true, selector: "max-assistant", inputs: { app: "app", assistantApiUrl: "assistantApiUrl", user: "user" }, viewQueries: [{ propertyName: "messagesViewport", first: true, predicate: ["messagesViewport"], descendants: true }], ngImport: i0, template: "<button\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-label]=\"launcherLabel\"\n [attr.aria-pressed]=\"panelVisible()\"\n [pTooltip]=\"launcherLabel\"\n tooltipPosition=\"left\"\n (click)=\"togglePanel()\"\n>\n <span class=\"mascot\" aria-hidden=\"true\"></span>\n</button>\n\n<p-drawer\n [visible]=\"panelVisible()\"\n (visibleChange)=\"panelVisible.set($event)\"\n position=\"right\"\n styleClass=\"assistant-drawer\"\n [modal]=\"false\"\n [blockScroll]=\"false\"\n [showCloseIcon]=\"false\"\n>\n <section class=\"assistant-panel\" [attr.aria-label]=\"uiCopy.title\">\n <header class=\"assistant-header\">\n <span class=\"mascot large\" aria-hidden=\"true\"></span>\n <div>\n <h2>{{ uiCopy.title }}</h2>\n <span>{{ uiCopy.subtitle }}</span>\n </div>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n (click)=\"closePanel()\"\n ></button>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article class=\"message {{ message.role }}\" [class.error]=\"message.isError\">\n @if(message.displayResponse; as responseDetails) {\n <p class=\"assistant-result\">{{ responseDetails.agentInferredResponse || message.content }}</p>\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n <button\n type=\"button\"\n class=\"inference-toggle\"\n [attr.aria-expanded]=\"isInferenceDetailsVisible(message.id)\"\n (click)=\"toggleInferenceDetails(message.id)\"\n >\n {{ isInferenceDetailsVisible(message.id) ? 'Hide Inference Details' : 'Show Inference Details' }}\n </button>\n\n @if(isInferenceDetailsVisible(message.id)) {\n <div class=\"response-details\">\n @if(responseDetails.userQuery) {\n <section class=\"response-section\">\n <h3>User Query</h3>\n <p class=\"quoted\">\"{{ responseDetails.userQuery }}\"</p>\n </section>\n }\n\n @if(responseDetails.agentExtractedIntent; as intent) {\n <section class=\"response-section\">\n <h3>Agent Extracted Intent</h3>\n <dl class=\"detail-grid\">\n @if(intent.project || intent.projectKey) {\n <div>\n <dt>Project</dt>\n <dd>\n {{ intent.project || intent.projectKey }}\n @if(intent.projectKey) {\n <span>{{ intent.projectKey }}</span>\n }\n </dd>\n </div>\n }\n @if(intent.module) {\n <div>\n <dt>Module</dt>\n <dd>{{ intent.module }}</dd>\n </div>\n }\n @if(intent.intentLabel) {\n <div>\n <dt>Intent Label</dt>\n <dd>{{ intent.intentLabel }}</dd>\n </div>\n }\n @if(intent.intent) {\n <div>\n <dt>Intent</dt>\n <dd>{{ intent.intent }}</dd>\n </div>\n }\n @if(intent.confidence !== undefined) {\n <div>\n <dt>Confidence</dt>\n <dd>{{ intent.confidence | percent: '1.0-0' }}</dd>\n </div>\n }\n </dl>\n\n @if(message.formattedParameters) {\n <div class=\"json-block\">\n <span class=\"detail-label\">Parameters</span>\n <pre>{{ message.formattedParameters }}</pre>\n </div>\n }\n\n @if(intent.api?.url || intent.api?.method) {\n <div class=\"api-call-summary\">\n <span class=\"detail-label\">API Called</span>\n <code>{{ intent.api?.method || 'GET' }} {{ intent.api?.url || 'URL not provided' }}</code>\n </div>\n }\n\n @if(message.formattedApiHeaders) {\n <div class=\"json-block\">\n <span class=\"detail-label\">Request Headers</span>\n <pre>{{ message.formattedApiHeaders }}</pre>\n </div>\n }\n\n @if(message.formattedApiBody) {\n <div class=\"json-block\">\n <span class=\"detail-label\">API Body</span>\n <pre>{{ message.formattedApiBody }}</pre>\n </div>\n }\n </section>\n }\n\n @if(message.formattedApiResponse) {\n <section class=\"response-section\">\n <h3>API Response</h3>\n <div class=\"json-block\">\n <span class=\"detail-label\">JSON</span>\n <pre>{{ message.formattedApiResponse }}</pre>\n </div>\n </section>\n }\n\n @if(message.formattedSampleJsonResponse) {\n <section class=\"response-section\">\n <h3>Sample JSON Response Used</h3>\n <div class=\"json-block\">\n <span class=\"detail-label\">JSON</span>\n <pre>{{ message.formattedSampleJsonResponse }}</pre>\n </div>\n </section>\n }\n\n <section class=\"response-section\">\n <h3>Agent Response</h3>\n <p>{{ responseDetails.agentInferredResponse || message.content }}</p>\n </section>\n </div>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestion\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n </article>\n }\n @if(isSending()) {\n <article class=\"message assistant typing\" [attr.aria-label]=\"uiCopy.typingLabel\">\n <span></span>\n <span></span>\n <span></span>\n </article>\n }\n </div>\n\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n pTextarea\n name=\"assistantPrompt\"\n rows=\"2\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </section>\n</p-drawer>\n", styles: [":host{position:fixed;right:24px;bottom:24px;z-index:1100}.assistant-launcher{position:relative;width:60px!important;height:60px!important;min-height:60px!important;padding:8px;border:2px solid var(--primary-color)!important;border-radius:20px!important;color:inherit!important;background:#fff!important;box-shadow:0 0 0 1px #0078c824,0 10px 24px #0f172a24!important;overflow:visible}.assistant-launcher:before,.assistant-launcher:after{content:\"\";position:absolute;top:50%;left:50%;width:22px;height:2px;border-radius:999px;background:#0f6cae;opacity:0;transform:translate(-50%,-50%) scale(.6) rotate(0);transition:opacity .18s ease,transform .22s ease;z-index:1}.assistant-launcher:before{transform:translate(-50%,-50%) scale(.6) rotate(45deg)}.assistant-launcher:after{transform:translate(-50%,-50%) scale(.6) rotate(-45deg)}.assistant-launcher:hover,.assistant-launcher:focus-visible{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 12px 28px #0f172a29!important}.assistant-launcher.is-open{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 14px 32px #0f172a2e!important}.assistant-launcher.is-open:before,.assistant-launcher.is-open:after{opacity:1}.assistant-launcher.is-open:before{transform:translate(-50%,-50%) scale(1) rotate(45deg)}.assistant-launcher.is-open:after{transform:translate(-50%,-50%) scale(1) rotate(-45deg)}.mascot{position:relative;display:grid;place-items:center;width:64px;height:56px;background:url(data:image/png;base64,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) center/contain no-repeat;transition:opacity .18s ease,transform .24s ease,filter .24s ease;z-index:0}.assistant-launcher.is-open .mascot{animation:assistant-open-float 1.6s ease-in-out infinite;filter:saturate(1.08);opacity:.34;transform:scale(.9)}.mascot.large{width:58px;height:46px}@keyframes assistant-open-float{0%,to{transform:scale(.9) translateY(0)}50%{transform:scale(.92) translateY(-2px)}}::ng-deep .assistant-drawer{width:min(560px,100vw)!important;height:min(80vh,820px)!important;max-height:calc(100dvh - 48px)!important;top:50%!important;right:24px!important;border:1px solid rgba(148,163,184,.24)!important;border-radius:24px!important;background:#fffffff5!important;box-shadow:0 24px 70px #0f172a33,0 0 0 1px #ffffffad inset!important;overflow:hidden!important;transform:translateY(-50%)!important;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}::ng-deep .assistant-drawer .p-drawer-content{height:100%;padding:0;overflow:hidden;background:transparent}::ng-deep .assistant-drawer .p-drawer-header{display:none}.assistant-panel{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:0;border-radius:inherit;background:linear-gradient(180deg,#f8fafcd1,#f1f5f9f5),var(--background-color, #f8fafc);overflow:hidden}.assistant-header,.assistant-composer{display:flex;gap:12px;align-items:center;padding:16px 18px;background:#ffffffeb;border-bottom:1px solid rgba(226,232,240,.86)}.assistant-header h2{margin:0;color:#0f172a;font-family:Montserrat,Arial,sans-serif;font-weight:600;letter-spacing:0;line-height:1}.assistant-header span{color:#64748b;font-weight:600}.sources span{color:#64748b;font-size:12px;font-weight:600}.assistant-header .header-action:first-of-type{margin-left:auto}.assistant-header .header-action{width:38px;height:38px;margin-left:0;color:#475569;background:transparent}.assistant-header .header-action:hover{background:#0f172a0f}.assistant-messages{min-height:0;overflow:auto;padding:18px;scrollbar-width:thin}.message{width:fit-content;max-width:92%;margin-bottom:14px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:16px;background:#fff;box-shadow:0 1px 2px #0f172a14,0 10px 24px #0f172a0f}.message.assistant{width:100%;max-width:100%}.message.user{width:fit-content;max-width:88%;margin-left:auto;color:#fff;background:var(--primary-color, #2563eb);border-color:var(--primary-color, #2563eb);border-bottom-right-radius:6px}.message.error{border-color:var(--danger-color, #dc2626)}.message p{margin:0;line-height:1.45}.assistant-result{color:#1e293b}.assistant-tables{display:grid;gap:10px;margin-top:12px}.assistant-table-section{display:grid;gap:6px}.assistant-table-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.assistant-table-wrap{overflow:auto;border:1px solid var(--border-color, #e2e8f0);border-radius:var(--border-radius, 6px)}.assistant-table-wrap table{width:100%;min-width:420px;border-collapse:collapse;background:#fff}.assistant-table-wrap th,.assistant-table-wrap td{padding:8px 10px;border-bottom:1px solid var(--border-color, #e2e8f0);color:#334155;font-size:12px;line-height:1.35;text-align:left;vertical-align:top}.assistant-table-wrap th{color:#475569;font-weight:600;background:#f8fafc}.assistant-table-wrap tr:last-child td{border-bottom:0}.inference-toggle{display:flex;width:fit-content;margin:10px 0 0 auto;padding:0;border:0;color:var(--primary-color, #2563eb);background:transparent;font:inherit;font-size:13px;font-weight:400;text-decoration:underline;text-underline-offset:3px;cursor:pointer}.inference-toggle:hover{color:var(--primary-dark-color, #1d4ed8)}.inference-toggle:focus-visible{outline:2px solid var(--primary-color, #2563eb);outline-offset:3px}.suggestions{display:grid;gap:0;margin-top:12px}.suggestion-chip{justify-content:flex-start;width:100%;padding:6px 0;border:1px solid transparent;border-radius:999px;color:var(--primary-color, #2563eb);background:transparent;font-weight:600;box-shadow:none;text-align:left;transition:padding .16s ease,border-color .16s ease,background .16s ease,box-shadow .16s ease}.suggestion-chip:hover{padding:6px 12px;border-color:rgba(var(--primary-color-rgb, 37, 99, 235),.28);color:var(--primary-color, #2563eb);background:rgba(var(--primary-color-rgb, 37, 99, 235),.08);box-shadow:0 4px 14px #0f172a0f}.response-details{display:grid;gap:12px;margin-top:12px}.response-section{display:grid;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--border-color, #e2e8f0)}.response-section:last-child{padding-bottom:0;border-bottom:0}.response-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.quoted{padding:8px 10px;border-left:5px solid var(--primary-color, #2563eb);border-radius:var(--border-radius, 6px);color:#1e293b;background:#f8fafc}.detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0}.detail-grid div{min-width:0;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.detail-grid dt{margin-bottom:3px;color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.detail-grid dd{margin:0;color:#334155;font-size:13px;font-weight:600;line-height:1.35;overflow-wrap:anywhere}.detail-grid dd span{display:block;margin-top:2px;color:#64748b;font-size:11px}.api-call-summary,.json-block{display:grid;gap:6px;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.api-call-summary .detail-label,.json-block .detail-label{color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.api-call-summary code{color:var(--secondary-color, #0f172a);font-weight:600;white-space:normal;word-break:break-word}.json-block pre{max-height:220px;margin:0;overflow:auto;color:#0f172a;font-size:12px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.typing{display:flex;width:fit-content;max-width:fit-content;gap:5px;align-items:center;padding:4px 0;border:0;background:transparent;box-shadow:none}.typing span{width:7px;height:7px;border-radius:50%;background:var(--primary-color, #2563eb);animation:typing-dot .85s infinite ease-in-out}.typing span:nth-child(2){animation-delay:.15s}.assistant-composer{padding:14px 16px 16px;border-top:1px solid rgba(226,232,240,.9);border-bottom:0;box-shadow:0 -10px 30px #0f172a0a}.assistant-composer textarea{flex:1;min-height:46px;max-height:120px;border-radius:18px;background:#fff;resize:vertical}.assistant-composer button[type=submit]{width:44px;height:44px;border-radius:16px}@keyframes typing-dot{0%,80%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-4px)}}@keyframes pulse{to{opacity:.35;transform:translateY(-2px)}}@media(max-width:640px){:host{right:16px;bottom:16px}::ng-deep .assistant-drawer{width:calc(100vw - 24px)!important;height:min(84vh,100dvh - 24px)!important;max-height:calc(100dvh - 24px)!important;right:12px!important;border-radius:20px!important}.assistant-messages{padding:14px}.detail-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i4.Drawer, selector: "p-drawer", inputs: ["appendTo", "motionOptions", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i5.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["pTextareaPT", "pTextareaUnstyled", "autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "pipe", type: i7.PercentPipe, name: "percent" }] });
|
|
908
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantComponent, deps: [{ token: MaxAssistantService }, { token: i0.DestroyRef }, { token: MAX_ASSISTANT_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
|
|
909
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.14", type: MaxAssistantComponent, isStandalone: true, selector: "max-assistant", inputs: { app: "app", assistantApiUrl: "assistantApiUrl", user: "user", context: "context", requestHeaders: "requestHeaders" }, host: { listeners: { "document:keydown.escape": "onDocumentEscape()" } }, viewQueries: [{ propertyName: "launcher", first: true, predicate: ["launcher"], descendants: true }, { propertyName: "messagesViewport", first: true, predicate: ["messagesViewport"], descendants: true }], ngImport: i0, template: "<ng-template #markTemplate let-large=\"large\">\n <span class=\"max-mark\" [class.large]=\"large\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 32 32\" focusable=\"false\">\n <path d=\"M16 1c.9 8.4 6.6 14.1 15 15-8.4.9-14.1 6.6-15 15-.9-8.4-6.6-14.1-15-15 8.4-.9 14.1-6.6 15-15Z\" />\n <path class=\"max-mark-small\" d=\"M25.5 1.5c.3 2.8 2.2 4.7 5 5-2.8.3-4.7 2.2-5 5-.3-2.8-2.2-4.7-5-5 2.8-.3 4.7-2.2 5-5Z\" />\n </svg>\n </span>\n</ng-template>\n\n<button\n #launcher\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-label]=\"launcherLabel\"\n [attr.aria-pressed]=\"panelVisible()\"\n [pTooltip]=\"launcherLabel\"\n tooltipPosition=\"left\"\n (click)=\"togglePanel()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"markTemplate\"\n [ngTemplateOutletContext]=\"{ large: false }\"\n ></ng-container>\n</button>\n\n<aside\n class=\"assistant-window\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-hidden]=\"!panelVisible()\"\n [attr.inert]=\"panelVisible() ? null : ''\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"complementary\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <ng-container\n [ngTemplateOutlet]=\"markTemplate\"\n [ngTemplateOutletContext]=\"{ large: true }\"\n ></ng-container>\n <div class=\"assistant-identity\">\n <h2 class=\"assistant-name\">{{ uiCopy.title }}</h2>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n (click)=\"closePanel()\"\n ></button>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isStreaming) {\n <p class=\"streaming-progress\">{{ message.content }}</p>\n } @else if(message.displayResponse; as responseDetails) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <strong>{{ card.title }}</strong>\n @if(card.subtitle) {\n <span>{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span>{{ metric.label }}</span>\n <strong>{{ metric.value }}</strong>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Details' : 'Show Details' }}\n </button>\n\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">\u2192</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} \u00B7 {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} \u00B7 {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { \u00B7 HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { \u2014 HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </section>\n</aside>\n", styles: [":host{position:fixed;right:24px;bottom:24px;z-index:1100}.assistant-launcher{position:relative;width:64px!important;height:64px!important;min-height:64px!important;padding:7px;border:1px solid rgba(124,58,237,.24)!important;border-radius:22px!important;color:inherit!important;background:radial-gradient(circle at 28% 16%,rgba(255,255,255,.98),transparent 38%),linear-gradient(145deg,#fff7ed,#f5f3ff 52%,#fdf2f8)!important;box-shadow:0 0 0 1px #ffffffd9 inset,0 12px 30px #5b21b62e!important;overflow:visible;transition:border-color .22s ease,box-shadow .22s ease,transform .22s cubic-bezier(.2,.8,.2,1);z-index:2}.assistant-launcher:before,.assistant-launcher:after{content:\"\";position:absolute;top:50%;left:50%;width:22px;height:2px;border-radius:999px;background:#0f6cae;opacity:0;transform:translate(-50%,-50%) scale(.6) rotate(0);transition:opacity .18s ease,transform .22s ease;z-index:1}.assistant-launcher:before{transform:translate(-50%,-50%) scale(.6) rotate(45deg)}.assistant-launcher:after{transform:translate(-50%,-50%) scale(.6) rotate(-45deg)}.assistant-launcher:hover,.assistant-launcher:focus-visible{border-color:#ec489975!important;background:radial-gradient(circle at 30% 18%,#fff,transparent 38%),linear-gradient(145deg,#ffedd5,#ede9fe,#fce7f3)!important;box-shadow:0 0 0 3px #a855f71a,0 16px 34px #6d28d938!important;transform:translateY(-2px)}.assistant-launcher.is-open{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 14px 32px #0f172a2e!important;transform:translateY(0)}.assistant-launcher.is-open:before,.assistant-launcher.is-open:after{opacity:1}.assistant-launcher.is-open:before{transform:translate(-50%,-50%) scale(1) rotate(45deg)}.assistant-launcher.is-open:after{transform:translate(-50%,-50%) scale(1) rotate(-45deg)}.mascot{position:relative;display:inline-grid;width:54px;height:54px;place-items:center;transform-origin:50% 72%;transition:opacity .18s ease,transform .24s ease,filter .24s ease;z-index:0}.mascot-aura{position:absolute;inset:5px;border-radius:50%;background:conic-gradient(from 25deg,#f472b66b,#fbbf2452,#2dd4bf57,#8b5cf66b,#f472b66b);filter:blur(7px);animation:mascot-aura 3s ease-in-out infinite}.mascot-art{position:relative;width:100%;height:100%;overflow:visible;filter:drop-shadow(0 5px 5px rgba(2,75,116,.2));animation:mascot-idle 3.4s ease-in-out infinite}.mascot-shell{fill:#7c3aed}.mascot-ear-left{fill:#ec4899}.mascot-ear-right{fill:#f97316}.mascot-ear{transform-box:fill-box;transform-origin:center}.mascot-face{fill:#211747;stroke:#ffffff4d;stroke-width:1}.mascot-signal{fill:#facc15;stroke:#fff;stroke-width:1.5;transform-box:fill-box;transform-origin:center;animation:mascot-signal 2.2s ease-out infinite}.mascot-antenna,.mascot-sparkle,.mascot-shell-shine,.mascot-smile,.mascot-mark{fill:none;stroke-linecap:round;stroke-linejoin:round}.mascot-antenna{stroke:#6d28d9;stroke-width:2.5}.mascot-sparkle{stroke:#ec4899;stroke-width:2;transform-box:fill-box;transform-origin:center;animation:mascot-sparkle 3.4s ease-in-out infinite}.mascot-shell-shine{stroke:#e9d5ffd1;stroke-width:2}.mascot-eye{fill:#5eead4;transform-box:fill-box;transform-origin:center;animation:mascot-blink 5.2s ease-in-out infinite}.mascot-smile{stroke:#fbbf24;stroke-width:2}.mascot-mark{stroke:#ffffffd1;stroke-width:2.2}.assistant-launcher:hover .mascot-art,.assistant-launcher:focus-visible .mascot-art{animation:mascot-greet .7s cubic-bezier(.2,.8,.2,1)}.assistant-launcher:hover .mascot-ear-right,.assistant-launcher:focus-visible .mascot-ear-right{animation:mascot-ear-wave .7s ease-in-out}.assistant-launcher.is-open .mascot{filter:saturate(1.08);opacity:.24;transform:scale(.82) rotate(-5deg)}.mascot.large{width:52px;height:52px;flex:0 0 auto}@keyframes mascot-idle{0%,to{transform:translateY(0) rotate(0)}50%{transform:translateY(-2px) rotate(1deg)}}@keyframes mascot-greet{0%,to{transform:translateY(0) rotate(0)}35%{transform:translateY(-4px) rotate(-5deg)}65%{transform:translateY(-2px) rotate(4deg)}}@keyframes mascot-ear-wave{0%,to{transform:rotate(0) scaleY(1)}50%{transform:rotate(-12deg) scaleY(1.12)}}@keyframes mascot-blink{0%,45%,49%,to{transform:scaleY(1)}47%{transform:scaleY(.12)}}@keyframes mascot-signal{0%,55%,to{opacity:1;transform:scale(1)}70%{opacity:.55;transform:scale(1.42)}}@keyframes mascot-sparkle{0%,62%,to{opacity:0;transform:scale(.5) rotate(0)}72%{opacity:1;transform:scale(1) rotate(90deg)}84%{opacity:0;transform:scale(.7) rotate(150deg)}}@keyframes mascot-aura{0%,to{opacity:.45;transform:scale(.88)}50%{opacity:.85;transform:scale(1.08)}}.assistant-window{position:fixed;top:50%;right:24px;z-index:1;width:min(560px,100vw - 48px);height:min(80vh,820px);max-height:calc(100dvh - 48px);border:1px solid rgba(148,163,184,.24);border-radius:24px;background:#fffffff5;box-shadow:0 24px 70px #0f172a33,0 0 0 1px #ffffffad inset;overflow:hidden;opacity:0;visibility:hidden;pointer-events:none;translate:0 -50%;transform:translate3d(40px,28px,0) scale(.94);transform-origin:right bottom;transition:opacity .22s ease,transform .3s cubic-bezier(.4,0,1,1),visibility 0s linear .3s;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);will-change:opacity,transform}.assistant-window.is-open{opacity:1;visibility:visible;pointer-events:auto;transform:translateZ(0) scale(1);transition:opacity .28s ease,transform .46s cubic-bezier(.16,1,.3,1),visibility 0s}.assistant-panel{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:0;border-radius:inherit;background:linear-gradient(180deg,#f8fafcd1,#f1f5f9f5),var(--background-color, #f8fafc);overflow:hidden}.assistant-header,.assistant-composer{display:flex;gap:12px;align-items:center;padding:16px 18px;background:#ffffffeb;border-bottom:1px solid rgba(226,232,240,.86)}.assistant-identity{display:grid;gap:5px;min-width:0}.assistant-name{margin:0;width:fit-content;color:var(--primary-color, #2563eb);font-family:Montserrat,Arial,sans-serif;font-size:23px;font-weight:700;letter-spacing:-.045em;line-height:.9}.assistant-subtitle{color:#64748b;font-size:10px;font-weight:600;letter-spacing:.1em;line-height:1.2;text-transform:uppercase}.sources span{color:#64748b;font-size:12px;font-weight:600}.assistant-header .header-action:first-of-type{margin-left:auto}.assistant-header .header-action{width:38px;height:38px;margin-left:0;color:#475569;background:transparent}.assistant-header .header-action:hover{background:#0f172a0f}.assistant-messages{min-height:0;overflow:auto;padding:18px;scrollbar-width:thin}.message{position:relative;width:fit-content;max-width:92%;margin-bottom:14px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:16px;background:#fff;box-shadow:0 1px 2px #0f172a14,0 10px 24px #0f172a0f;-webkit-user-select:text;user-select:text}.message.assistant{width:100%;max-width:100%}.message.user{width:fit-content;max-width:88%;margin-left:auto;color:#fff;background:var(--primary-color, #2563eb);border-color:var(--primary-color, #2563eb);border-bottom-right-radius:6px}.message.user p{color:inherit}.message.error{border-color:var(--danger-color, #dc2626)}.message.streaming{padding:0;border:0;color:var(--text-color-secondary, #64748b);background:transparent;box-shadow:none;font-style:italic}.streaming-progress{white-space:pre-line}.message p{margin:0;line-height:1.45}.assistant-result{color:#1e293b}.assistant-cards{display:grid;gap:10px;margin-top:12px}.assistant-card{overflow:hidden;border:1px solid #dbeafe;border-radius:14px;background:linear-gradient(145deg,#f8fbff,#fff);box-shadow:0 8px 22px #0f172a0f}.assistant-card>header{display:grid;gap:2px;padding:11px 12px;border-bottom:1px solid #e2e8f0}.assistant-card>header strong{color:#0f172a;font-size:14px}.assistant-card>header span,.assistant-card>footer{color:#64748b;font-size:11px}.assistant-card-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}.assistant-card-metric{display:grid;min-width:0;gap:3px;padding:11px 9px;border-right:1px solid #e2e8f0}.assistant-card-metric:last-child{border-right:0}.assistant-card-metric span{color:#64748b;font-size:10px;font-weight:600;text-transform:uppercase}.assistant-card-metric strong{color:#1e293b;font-size:13px;overflow-wrap:anywhere}.assistant-card-metric[data-tone=positive] strong{color:#047857}.assistant-card-metric[data-tone=warning] strong{color:#b45309}.assistant-card>footer{padding:8px 12px;border-top:1px solid #e2e8f0;background:#f8fafcb8}:host ::ng-deep .assistant-markdown{line-height:1.45}:host ::ng-deep .assistant-markdown>:first-child{margin-top:0}:host ::ng-deep .assistant-markdown>:last-child{margin-bottom:0}:host ::ng-deep .assistant-markdown p{margin:0 0 8px}:host ::ng-deep .assistant-markdown ul,:host ::ng-deep .assistant-markdown ol{margin:8px 0;padding-left:22px}:host ::ng-deep .assistant-markdown li+li{margin-top:4px}:host ::ng-deep .assistant-markdown strong{font-weight:700}:host ::ng-deep .assistant-markdown code{padding:1px 4px;border-radius:4px;background:#e2e8f0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.9em}:host ::ng-deep .assistant-markdown a{color:var(--primary-color, #2563eb);text-decoration:underline}.assistant-status{display:inline-flex;margin-top:8px;padding:3px 8px;border-radius:999px;color:#475569;background:#e2e8f0;font-size:11px;font-weight:600;text-transform:capitalize}.pending-action{display:grid;gap:9px;margin-top:12px;padding:12px;border:1px solid #f59e0b;border-radius:12px;background:#fffbeb}.pending-action-heading{display:flex;align-items:center;justify-content:space-between;color:#92400e}.pending-action-heading span{padding:2px 7px;border-radius:999px;color:#78350f;background:#fde68a;font-size:11px;font-weight:700}.pending-action small{color:#78716c}.pending-action-buttons{display:flex;gap:8px}.action-decision{color:#475569;font-weight:600}.assistant-sources{display:grid;gap:4px;margin-top:12px;padding-top:10px;border-top:1px solid #e2e8f0;color:#64748b;font-size:12px}.assistant-tables{display:grid;gap:10px;margin-top:12px}.assistant-table-section{display:grid;gap:6px}.assistant-table-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.assistant-table-wrap{overflow:auto;border:1px solid var(--border-color, #e2e8f0);border-radius:var(--border-radius, 6px)}.assistant-table-wrap table{width:100%;min-width:420px;border-collapse:collapse;background:#fff}.assistant-table-wrap th,.assistant-table-wrap td{padding:8px 10px;border-bottom:1px solid var(--border-color, #e2e8f0);color:#334155;font-size:12px;line-height:1.35;text-align:left;vertical-align:top}.assistant-table-wrap th{color:#475569;font-weight:600;background:#f8fafc}.assistant-table-wrap tr:last-child td{border-bottom:0}.assistant-table-actions{display:flex;flex-wrap:wrap;gap:6px;min-width:150px}.details-toggle{display:flex;width:fit-content;margin:10px 0 0 auto;padding:0;border:0;color:var(--primary-color, #2563eb);background:transparent;font:inherit;font-size:13px;font-weight:400;text-decoration:underline;text-underline-offset:3px;cursor:pointer}.details-toggle:hover{color:var(--primary-dark-color, #1d4ed8)}.details-toggle:focus-visible{outline:2px solid var(--primary-color, #2563eb);outline-offset:3px}.developer-details{display:grid;gap:12px;margin-top:12px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:10px;background:#f8fafc}.developer-details-header h3,.developer-details-header p{margin:0}.developer-details-header h3{color:#0f172a;font-size:13px;font-weight:600}.developer-details-header p{margin-top:2px;color:#64748b;font-size:11px}.workflow-trace{display:grid;gap:0;margin:0;padding:0;list-style:none}.workflow-step{display:block;min-width:0}.workflow-category{color:#64748b;font-size:9px;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.workflow-meta{display:grid;flex:0 0 auto;gap:2px;justify-items:end;color:#64748b;font-size:9px}.workflow-status{padding:2px 5px;border-radius:999px;color:#334155;background:#e2e8f0;font-weight:600;text-transform:capitalize}.workflow-step[data-status=succeeded] .workflow-status{color:#166534;background:#dcfce7}.workflow-step[data-status=failed] .workflow-status{color:#991b1b;background:#fee2e2}.trace-json{display:grid;gap:4px;margin-top:8px}.trace-json>span{color:#64748b;font-size:10px;font-weight:600;text-transform:uppercase}.trace-json pre{max-height:280px;margin:0;padding:8px;overflow:auto;border-radius:6px;color:#dbeafe;background:#0f172a;font-size:10px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.trace-error{display:grid;gap:3px;margin-top:8px;padding:8px;border-left:3px solid #dc2626;border-radius:4px;color:#991b1b;background:#fef2f2;font-size:11px}.developer-details-header{display:flex;gap:12px;align-items:flex-start;justify-content:space-between}.developer-eyebrow{color:var(--text-color, #0f172a);font-size:9px;font-weight:600;letter-spacing:.08em;text-transform:uppercase}.trace-section-label{color:var(--text-color, #0f172a);font-size:9px;font-weight:600;text-decoration:underline;text-underline-offset:3px}.trace-run-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}.trace-metric{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid #e2e8f0;border-radius:8px;background:#fff}.trace-metric span,.trace-loop-policy span{color:#64748b;font-size:9px;font-weight:600}.trace-metric strong{color:#0f172a;font-size:13px}.trace-loop-policy{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-column:1/-1;gap:5px 12px;align-items:center;padding:10px;border:1px solid #c7d2fe;border-radius:9px;background:#eef2ff}.trace-loop-policy div{display:grid;gap:2px}.trace-loop-policy strong{color:#312e81;font-size:11px}.trace-loop-policy p{grid-column:1/-1;margin:0;color:#475569;font-size:10px;line-height:1.45}.trace-no-loop{padding:3px 7px;border-radius:999px;color:#166534!important;background:#dcfce7;font-weight:600!important}.workflow-summary{margin:9px 0 0;color:#475569;font-size:10.5px;line-height:1.5}.trace-technology{display:grid;gap:6px;margin-top:10px;padding:8px;border:1px solid #dbeafe;border-radius:7px;background:#f8fbff}.trace-inline-facts{display:flex;flex-wrap:wrap;gap:5px}.trace-inline-facts>span{display:grid;gap:1px;max-width:100%;padding:4px 6px;border-radius:5px;color:#1e293b;background:#fff;font-size:9.5px;overflow-wrap:anywhere}.trace-inline-facts small{color:#64748b;font-size:8px;font-weight:600;text-transform:uppercase}.trace-control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 8px;margin-top:8px;padding:8px;border-left:3px solid #8b5cf6;border-radius:5px;background:#f5f3ff}.trace-control>div{display:grid;gap:2px}.trace-control strong,.trace-control>span{color:#5b21b6;font-size:9.5px}.trace-control p{grid-column:1/-1;margin:0;color:#475569;font-size:9.5px;line-height:1.4}.trace-query,.trace-section,.trace-arguments,.trace-ranking-wrap{display:grid;gap:5px;margin-top:10px}.trace-query>span,.trace-transform>div>span,.trace-vector>span,.trace-payload-grid section>span,.trace-tool-call>span,.trace-supabase-call span,.trace-decision>span{color:#64748b;font-size:9px;font-weight:600;text-transform:uppercase}.trace-query>span,.trace-vector>span,.trace-payload-grid section>span,.trace-tool-call>span,.trace-decision>span{color:var(--text-color, #0f172a);text-decoration:underline;text-underline-offset:3px}.trace-query blockquote{margin:0;padding:8px 10px;border-left:3px solid #2563eb;border-radius:5px;color:#172554;background:#eff6ff;font-size:11px;font-weight:600;line-height:1.45}.trace-query-compact blockquote{border-color:#8b5cf6;color:#4c1d95;background:#f5f3ff}.trace-card-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin-top:9px}.trace-data-card{min-width:0;padding:8px;border:1px solid #e2e8f0;border-radius:7px;background:#f8fafc}.trace-data-card-accent{border-color:#bfdbfe;background:#eff6ff}.trace-data-card h5{margin:0 0 5px;color:var(--text-color, #0f172a);font-size:10px;font-weight:600;text-decoration:underline;text-underline-offset:3px}.trace-field-list,.trace-argument-grid{display:grid;gap:4px;margin:0}.trace-field-list>div{display:grid;grid-template-columns:minmax(70px,.7fr) minmax(0,1.3fr);gap:6px}.trace-field-list dt,.trace-argument-grid dt{color:#64748b;font-size:8.5px}.trace-field-list dd,.trace-argument-grid dd{margin:0;color:#1e293b;font-size:9px;font-weight:600;overflow-wrap:anywhere}.trace-transform{display:grid;grid-template-columns:minmax(0,1fr) 18px minmax(0,1fr);gap:6px;align-items:stretch;margin-top:10px}.trace-transform>div{display:grid;gap:5px;padding:9px;border:1px solid #e2e8f0;border-radius:7px;background:#f8fafc}.trace-transform .trace-transform-result{border-color:#bfdbfe;background:#eff6ff}.trace-transform p{margin:0;color:#1e293b;font-size:10px;font-weight:600;line-height:1.4}.trace-transform-arrow{display:grid;place-items:center;color:#2563eb;font-size:16px;font-weight:600}.trace-entity-list{display:flex;flex-wrap:wrap;gap:5px}.trace-entity-list>span{display:flex;gap:5px;align-items:center;padding:4px 7px;border:1px solid #fed7aa;border-radius:999px;color:#9a3412;background:#fff7ed;font-size:9.5px}.trace-entity-list small{color:#c2410c;font-size:7.5px;font-weight:600;text-transform:uppercase}.trace-stat-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:8px}.trace-stat-grid>div{display:grid;gap:2px;padding:7px;border:1px solid #e2e8f0;border-radius:6px}.trace-stat-grid span{color:#64748b;font-size:8.5px}.trace-stat-grid strong{color:#0f172a;font-size:10px;overflow-wrap:anywhere}.trace-vector{display:grid;gap:4px;margin-top:7px}.trace-vector code{padding:7px;overflow:auto;border-radius:5px;color:#c4b5fd;background:#1e1b4b;font-size:8.5px;white-space:nowrap}.trace-supabase-call{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:10px;padding:9px;border:1px solid #a7f3d0;border-radius:7px;background:#ecfdf5}.trace-supabase-call>div{display:grid;gap:2px}.trace-supabase-call strong{color:#065f46;font-size:10px;overflow-wrap:anywhere}.trace-table-list{grid-column:1/-1}.trace-table-list>div{display:flex;flex-wrap:wrap;gap:4px}.trace-table-list code{padding:3px 5px;border-radius:4px;color:#065f46;background:#d1fae5;font-size:8.5px}.trace-decision{display:grid;gap:4px;margin-top:7px;padding:9px;border-left:3px solid #16a34a;border-radius:5px;background:#f0fdf4}.trace-decision strong{color:#14532d;font-size:11px}.trace-decision div{display:flex;flex-wrap:wrap;gap:8px;color:#166534;font-size:8.5px}.trace-ranking-wrap{overflow:auto}.trace-ranking{width:100%;min-width:610px;border-collapse:collapse;font-size:8.5px}.trace-ranking th,.trace-ranking td{padding:6px;border-bottom:1px solid #e2e8f0;color:#475569;text-align:right;vertical-align:top}.trace-ranking th{color:#64748b;background:#f8fafc;font-size:8px;text-transform:uppercase}.trace-ranking th:nth-child(2),.trace-ranking td:nth-child(2){text-align:left}.trace-ranking td:nth-child(2){display:grid;gap:2px;min-width:145px}.trace-ranking strong{color:#1e293b;font-size:9px}.trace-ranking code{color:#64748b;font-size:7.5px}.trace-argument-grid{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:3px}.trace-argument-grid>div{min-width:0;padding:7px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc}.trace-tool-call,.trace-api-route{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px;padding:8px;border-radius:6px;color:#dbeafe;background:#0f172a}.trace-tool-call>span{width:100%;color:#94a3b8}.trace-tool-call strong{color:#bfdbfe;font-size:10px}.trace-tool-call pre,.trace-payload-grid pre{width:100%;max-height:220px;margin:0;overflow:auto;color:#dbeafe;font-size:9px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.trace-api-route>code{flex:1 1 180px;color:#e2e8f0;font-size:9px;overflow-wrap:anywhere}.trace-http-method,.trace-http-status{padding:3px 6px;border-radius:4px;color:#fff;background:#2563eb;font-size:8.5px;font-weight:600}.trace-http-status.success{color:#bbf7d0;background:#166534}.trace-http-status.error{color:#fecaca;background:#991b1b}.trace-payload-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:7px}.trace-payload-grid section{display:grid;gap:5px;min-width:0;padding:8px;border:1px solid #334155;border-radius:6px;background:#0f172a}.trace-payload-grid section>span{color:#94a3b8}.trace-error.trace-warning{border-left-color:#f59e0b;color:#92400e;background:#fffbeb}.trace-error-legacy{display:none}.trace-error-heading{font-size:10px}.details-dialog-backdrop{position:fixed;inset:0;z-index:20;display:grid;padding:14px;place-items:center;background:#0f172a7a;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.details-dialog-backdrop .developer-details{display:block;width:100%;max-height:100%;margin:0;padding:0 14px 14px;overflow:auto;overscroll-behavior:contain;border:0;border-radius:14px;background:#fff;box-shadow:0 24px 70px #0f172a4d}.details-dialog-backdrop .developer-details-header{position:sticky;top:0;z-index:3;margin:0 -14px 14px;padding:14px;border-bottom:1px solid #e2e8f0;background:#fffffff7;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.details-dialog-actions{display:flex;flex:0 0 auto;gap:7px;align-items:center}.details-dialog-close{display:grid;width:30px;height:30px;padding:0;place-items:center;border:1px solid #e2e8f0;border-radius:8px;color:#475569;background:#fff;cursor:pointer}.details-dialog-close:hover{color:#0f172a;background:#f1f5f9}.details-dialog-close:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.details-dialog-backdrop .trace-run-summary{margin-bottom:6px;padding-bottom:14px;border-bottom:1px solid #cbd5e1}.details-dialog-backdrop .trace-metric{padding:0 9px;border:0;border-right:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop .trace-metric:nth-child(4){border-right:0}.details-dialog-backdrop .trace-loop-policy{margin-top:5px;padding:9px 0 0;border:0;border-top:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop .workflow-trace{display:block}.details-dialog-backdrop .workflow-step{display:block;border-bottom:1px solid #cbd5e1}.workflow-section{display:block}.workflow-step-toggle{display:flex;gap:14px;align-items:center;justify-content:space-between;width:100%;padding:14px 2px;border:0;color:inherit;background:transparent;font:inherit;text-align:left;cursor:pointer}.workflow-step-toggle:hover{background:#f8fafc}.workflow-step-toggle:focus-visible{outline:2px solid #2563eb;outline-offset:-2px}.workflow-step-toggle>div:first-child{display:grid;min-width:0;gap:2px}.workflow-step-toggle h4{margin:0;color:var(--text-color, #0f172a);font-size:12px;font-weight:600;line-height:1.4;text-decoration:underline;text-decoration-color:#94a3b8;text-underline-offset:4px}.workflow-step-number{display:block;color:var(--primary-color, #2563eb);font-size:13px;font-weight:600}.workflow-expand-icon{color:#64748b;font-size:10px}.workflow-step-content{padding:0 2px 16px}.details-dialog-backdrop .workflow-summary{margin-top:0;padding-bottom:10px;border-bottom:1px solid #e2e8f0}.details-dialog-backdrop .trace-technology,.details-dialog-backdrop .trace-control{padding:9px 0;border:0;border-bottom:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop .trace-control{border-left:0}.details-dialog-backdrop .trace-inline-facts>span{padding:0 8px 0 0;border-right:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop :is(h3,h4,h5,strong,.workflow-status,.trace-section-label,.developer-eyebrow){font-weight:600!important}@media (max-width: 520px){.trace-run-summary,.trace-card-grid,.trace-stat-grid,.trace-payload-grid,.trace-argument-grid,.trace-transform{grid-template-columns:1fr}.trace-transform-arrow{transform:rotate(90deg)}}.suggestions{display:grid;gap:0;margin-top:12px}.suggestion-chip{justify-content:flex-start;width:100%;padding:6px 0;border:1px solid transparent;border-radius:999px;color:var(--primary-color, #2563eb);background:transparent;font-weight:600;box-shadow:none;text-align:left;transition:padding .16s ease,border-color .16s ease,background .16s ease,box-shadow .16s ease}.suggestion-chip:hover{padding:6px 12px;border-color:rgba(var(--primary-color-rgb, 37, 99, 235),.28);color:var(--primary-color, #2563eb);background:rgba(var(--primary-color-rgb, 37, 99, 235),.08);box-shadow:0 4px 14px #0f172a0f}.response-details{display:grid;gap:12px;margin-top:12px}.response-section{display:grid;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--border-color, #e2e8f0)}.response-section:last-child{padding-bottom:0;border-bottom:0}.response-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.quoted{padding:8px 10px;border-left:5px solid var(--primary-color, #2563eb);border-radius:var(--border-radius, 6px);color:#1e293b;background:#f8fafc}.detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0}.detail-grid div{min-width:0;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.detail-grid dt{margin-bottom:3px;color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.detail-grid dd{margin:0;color:#334155;font-size:13px;font-weight:600;line-height:1.35;overflow-wrap:anywhere}.detail-grid dd span{display:block;margin-top:2px;color:#64748b;font-size:11px}.api-call-summary,.json-block{display:grid;gap:6px;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.api-call-summary .detail-label,.json-block .detail-label{color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.api-call-summary code{color:var(--secondary-color, #0f172a);font-weight:600;white-space:normal;word-break:break-word}.json-block pre{max-height:220px;margin:0;overflow:auto;color:#0f172a;font-size:12px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.assistant-composer{padding:14px 16px 16px;border-top:1px solid rgba(226,232,240,.9);border-bottom:0;box-shadow:0 -10px 30px #0f172a0a}.assistant-composer textarea{flex:1;min-height:46px;max-height:120px;border-radius:18px;background:#fff;resize:vertical}.assistant-composer button[type=submit]{width:44px;height:44px;border-radius:16px}@keyframes pulse{to{opacity:.35;transform:translateY(-2px)}}@media (prefers-reduced-motion: reduce){.mascot-aura,.mascot-art,.mascot-eye,.mascot-signal,.mascot-sparkle,.assistant-launcher:hover .mascot-art,.assistant-launcher:focus-visible .mascot-art,.assistant-launcher:hover .mascot-ear-right,.assistant-launcher:focus-visible .mascot-ear-right{animation:none}.assistant-launcher,.mascot{transition-duration:.01ms}.assistant-window,.assistant-window.is-open{transition:none}}@media (max-width: 640px){:host{right:16px;bottom:16px}.assistant-window{right:12px;width:calc(100vw - 24px);height:min(84vh,100dvh - 24px);max-height:calc(100dvh - 24px);border-radius:20px}.assistant-messages{padding:14px}.detail-grid,.assistant-card-metrics{grid-template-columns:1fr}.assistant-card-metric{border-right:0;border-bottom:1px solid #e2e8f0}.assistant-card-metric:last-child{border-bottom:0}}\n", ":host{--max-accent: var(--primary-color, #1a73e8);--max-accent-strong: var(--primary-dark-color, #1557b0);--max-canvas: color-mix(in srgb, var(--background, #f8f9fa) 92%, white);--max-surface: var(--panel-background, #ffffff);--max-surface-soft: color-mix(in srgb, var(--max-accent) 6%, var(--max-surface));--max-text: var(--text-color, #1f1f1f);--max-muted: var(--text-color-secondary, #5f6368);--max-border: color-mix(in srgb, var(--border-color, #dfe1e5) 84%, transparent);--max-success: var(--success-color, #188038);--max-warning: var(--warning-color, #b06000);--max-danger: var(--error-color, var(--danger-color, #b3261e));right:24px;bottom:24px;z-index:1200;color:var(--max-text);font-family:inherit}.assistant-launcher{display:inline-flex;width:52px!important;min-width:52px;height:52px!important;min-height:52px!important;gap:10px;align-items:center;justify-content:center;padding:7px!important;overflow:hidden;border:1px solid var(--max-border)!important;border-radius:18px!important;color:var(--max-text)!important;background:color-mix(in srgb,var(--max-surface) 94%,transparent)!important;box-shadow:0 1px 2px #3c40431f,0 8px 24px #3c404324!important;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);transition:opacity .18s ease,visibility .18s ease,transform .22s ease,box-shadow .22s ease}.assistant-launcher:before,.assistant-launcher:after{content:none}.assistant-launcher:hover,.assistant-launcher:focus-visible{border-color:color-mix(in srgb,var(--max-accent) 28%,var(--max-border))!important;background:var(--max-surface)!important;box-shadow:0 2px 4px #3c40431f,0 12px 30px #3c40432e!important;transform:translateY(-2px)}.assistant-launcher.is-open{visibility:hidden;opacity:0;transform:translateY(8px) scale(.94)}.max-mark{position:relative;display:inline-grid;width:34px;height:34px;flex:0 0 auto;place-items:center;border-radius:12px;background:linear-gradient(135deg,#4285f4 4%,#7b61ff 46%,#d96570 96%);box-shadow:inset 0 0 0 1px #ffffff2e}.max-mark svg{width:19px;height:19px;overflow:visible;fill:#fff}.max-mark-small{opacity:.72}.max-mark.large{width:38px;height:38px;border-radius:13px}.max-mark.large svg{width:21px;height:21px}.assistant-window{position:fixed;top:32px;right:32px;bottom:32px;width:min(1080px,100vw - 64px);height:auto;max-height:none;overflow:hidden;translate:0 0;transform:translate3d(0,20px,0) scale(.985);transform-origin:right bottom;border:1px solid var(--max-border);border-radius:28px;background:var(--max-canvas);box-shadow:0 2px 8px #3c40431a,0 24px 64px #3c404333;-webkit-backdrop-filter:none;backdrop-filter:none}.assistant-window.is-open{transform:translateZ(0) scale(1)}.assistant-panel{grid-template-rows:72px minmax(0,1fr) auto;color:var(--max-text);background:radial-gradient(circle at 48% 0%,color-mix(in srgb,var(--max-accent) 10%,transparent),transparent 46%),radial-gradient(circle at 92% 72%,color-mix(in srgb,#c58af9 8%,transparent),transparent 38%),linear-gradient(145deg,var(--max-canvas),color-mix(in srgb,var(--max-canvas) 94%,#edf3ff))}.assistant-header{display:flex;gap:12px;align-items:center;padding:0 24px;border:0;border-bottom:1px solid var(--max-border);background:color-mix(in srgb,var(--max-canvas) 88%,transparent);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.assistant-identity{display:flex;gap:9px;align-items:baseline}.assistant-name{margin:0;color:var(--max-text);font-family:inherit;font-size:19px;font-weight:600;letter-spacing:-.025em;line-height:1}.assistant-subtitle{color:var(--max-muted);font-size:12px;font-weight:400;letter-spacing:0;line-height:1;text-transform:none}.assistant-header .header-action{width:40px;height:40px;margin:0;border-radius:50%;color:var(--max-muted);background:transparent}.assistant-header .header-action:hover{color:var(--max-text);background:var(--max-surface-soft)}.assistant-messages{width:min(820px,100%);min-height:0;justify-self:center;box-sizing:border-box;padding:44px 28px 32px;overflow-x:hidden;overflow-y:auto;scrollbar-color:color-mix(in srgb,var(--max-muted) 25%,transparent) transparent;scrollbar-width:thin}.message{width:100%;max-width:100%;box-sizing:border-box;margin:0 0 34px;padding:0;border:0;border-radius:0;color:var(--max-text);background:transparent;box-shadow:none}.message.assistant{width:100%;max-width:100%}.message.user{width:fit-content;max-width:min(76%,640px);margin:0 0 32px auto;padding:12px 18px;border:0;border-radius:22px 22px 6px;color:var(--max-text);background:color-mix(in srgb,var(--max-accent) 8%,var(--max-surface))}.message.user p{color:inherit;font-size:15px;line-height:1.55}.message.error{padding-left:16px;border-left:3px solid var(--max-danger)}.message.streaming{display:flex;gap:10px;align-items:center;padding:0;color:var(--max-muted);background:transparent;font-style:normal}.message.streaming:before{width:16px;height:16px;flex:0 0 auto;border-radius:6px;background:linear-gradient(135deg,#4285f4,#a855f7,#d96570);content:\"\";animation:max-thinking 1.4s ease-in-out infinite alternate}.streaming-progress{color:var(--max-muted);font-size:14px;white-space:pre-line}.message p,.assistant-result,:host ::ng-deep .assistant-markdown{color:var(--max-text);font-size:15px;line-height:1.65}:host ::ng-deep .assistant-markdown code{color:var(--max-text);background:color-mix(in srgb,var(--max-muted) 10%,transparent)}.message.welcome{min-height:260px;margin:0;padding-top:clamp(28px,8vh,90px);text-align:center}.message.welcome .assistant-markdown{max-width:650px;margin:0 auto}:host ::ng-deep .message.welcome .assistant-markdown p{margin:0;font-size:clamp(28px,3.2vw,42px);font-weight:500;letter-spacing:-.04em;line-height:1.18}:host ::ng-deep .message.welcome-message .assistant-markdown p{color:var(--max-accent)}.welcome-description{max-width:620px;margin:32px auto 0;color:var(--max-text);font-size:16px;line-height:1.6;white-space:pre-line}.assistant-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:20px}.assistant-card{overflow:hidden;border:1px solid var(--max-border);border-radius:18px;background:var(--max-surface);box-shadow:none}.assistant-card>header{gap:4px;padding:16px;border-bottom:1px solid var(--max-border)}.assistant-card>header strong{color:var(--max-text);font-size:15px;font-weight:600}.assistant-card>header span,.assistant-card>footer,.assistant-card-metric span{color:var(--max-muted)}.assistant-card-metric{padding:14px;border-color:var(--max-border)}.assistant-card-metric strong{color:var(--max-text);font-size:14px}.assistant-card-metric[data-tone=positive] strong{color:var(--max-success)}.assistant-card-metric[data-tone=warning] strong{color:var(--max-warning)}.assistant-card>footer{padding:10px 16px;border-color:var(--max-border);background:var(--max-surface-soft)}.assistant-status{margin-top:12px;padding:0;border-radius:0;color:var(--max-muted);background:transparent;font-size:11px;letter-spacing:.05em;text-transform:uppercase}.pending-action{gap:12px;margin-top:18px;padding:18px;border:1px solid color-mix(in srgb,var(--max-warning) 38%,var(--max-border));border-radius:18px;background:color-mix(in srgb,var(--max-warning) 6%,var(--max-surface))}.pending-action-heading{color:var(--max-text)}.pending-action-heading span{color:var(--max-warning);background:transparent}.pending-action small,.action-decision{color:var(--max-muted)}.assistant-sources{margin-top:20px;padding-top:14px;border-color:var(--max-border);color:var(--max-muted)}.sources span{color:var(--max-muted)}.assistant-tables{gap:18px;margin-top:20px}.assistant-table-section{gap:10px}.assistant-table-section h3{color:var(--max-text);font-size:14px}.assistant-table-wrap{border-color:var(--max-border);border-radius:16px}.assistant-table-wrap table{background:var(--max-surface)}.assistant-table-wrap th,.assistant-table-wrap td{padding:11px 13px;border-color:var(--max-border);color:var(--max-text);font-size:12px}.assistant-table-wrap th{color:var(--max-muted);background:var(--max-surface-soft)}.details-toggle{margin-top:16px;color:var(--max-accent);font-size:12px;text-decoration:none}.details-toggle:hover{color:var(--max-accent-strong);text-decoration:underline}.suggestions{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}.suggestion-chip{justify-content:flex-start;width:auto;min-height:40px;padding:8px 14px;border:1px solid var(--max-border);border-radius:14px;color:var(--max-text);background:var(--max-surface);font-weight:400;box-shadow:none;text-align:left}.suggestion-chip:hover{padding:8px 14px;border-color:color-mix(in srgb,var(--max-accent) 28%,var(--max-border));color:var(--max-text);background:var(--max-surface-soft);box-shadow:none}.message.welcome .suggestions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:0}.message.welcome .suggestion-chip{width:100%;min-height:74px;padding:14px 16px;align-items:flex-start;border-radius:18px;line-height:1.35}.message.welcome .suggestion-chip:hover{padding:14px 16px;transform:translateY(-1px)}.assistant-composer{display:flex;width:min(780px,100% - 48px);box-sizing:border-box;gap:8px;align-items:center;justify-self:center;margin:0 auto 24px;padding:8px 8px 8px 18px;border:1px solid var(--max-border);border-radius:28px;background:var(--max-surface);box-shadow:0 1px 2px #3c404314,0 6px 20px #3c40431a;transition:border-color .16s ease,box-shadow .16s ease}.assistant-composer:focus-within{border-color:color-mix(in srgb,var(--max-accent) 36%,var(--max-border));box-shadow:0 1px 2px #3c404314,0 8px 24px #3c404324}.assistant-composer textarea{flex:1;min-height:44px;height:44px;max-height:132px;box-sizing:border-box;padding:11px 2px;border:0;border-radius:0;outline:0;color:var(--max-text);background:transparent;box-shadow:none;font:inherit;font-size:15px;line-height:22px;resize:none}.assistant-composer textarea::placeholder{color:var(--max-muted);opacity:.84}.assistant-composer textarea:focus{border:0;outline:0;box-shadow:none}.assistant-composer button[type=submit]{width:44px;height:44px;flex:0 0 auto;border-radius:50%;background:var(--max-accent)}.assistant-composer button[type=submit]:disabled{border-color:transparent;color:var(--max-muted);background:transparent;opacity:.5}@keyframes max-thinking{0%{opacity:.55;transform:rotate(-8deg) scale(.86)}to{opacity:1;transform:rotate(8deg) scale(1)}}@media (prefers-reduced-motion: reduce){.message.streaming:before{animation:none}.assistant-launcher,.assistant-window,.suggestion-chip{transition:none}}@media (max-width: 900px){.assistant-window{top:16px;right:16px;bottom:16px;width:calc(100vw - 32px);border-radius:24px}.assistant-messages{padding-top:34px}}@media (max-width: 640px){:host{right:16px;bottom:16px}.assistant-launcher{min-width:52px;padding:7px!important}.assistant-window{inset:0;width:100vw;height:100dvh;border:0;border-radius:0}.assistant-panel{grid-template-rows:64px minmax(0,1fr) auto}.assistant-header{padding:0 14px}.assistant-subtitle{display:none}.assistant-messages{padding:26px 18px 20px}.message.welcome{padding-top:24px}.message.welcome .suggestions,.assistant-cards{grid-template-columns:1fr}.message.welcome .suggestion-chip{min-height:60px}.message.user{max-width:88%}.assistant-composer{width:calc(100% - 24px);margin-bottom:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i5.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: MaxAssistantMarkdownPipe, name: "maxAssistantMarkdown" }] });
|
|
412
910
|
}
|
|
413
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
911
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantComponent, decorators: [{
|
|
414
912
|
type: Component,
|
|
415
|
-
args: [{ selector: 'max-assistant', imports: [CommonModule, FormsModule, ButtonModule, DrawerModule, TextareaModule, TooltipModule], template: "<button\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-label]=\"launcherLabel\"\n [attr.aria-pressed]=\"panelVisible()\"\n [pTooltip]=\"launcherLabel\"\n tooltipPosition=\"left\"\n (click)=\"togglePanel()\"\n>\n <span class=\"mascot\" aria-hidden=\"true\"></span>\n</button>\n\n<p-drawer\n [visible]=\"panelVisible()\"\n (visibleChange)=\"panelVisible.set($event)\"\n position=\"right\"\n styleClass=\"assistant-drawer\"\n [modal]=\"false\"\n [blockScroll]=\"false\"\n [showCloseIcon]=\"false\"\n>\n <section class=\"assistant-panel\" [attr.aria-label]=\"uiCopy.title\">\n <header class=\"assistant-header\">\n <span class=\"mascot large\" aria-hidden=\"true\"></span>\n <div>\n <h2>{{ uiCopy.title }}</h2>\n <span>{{ uiCopy.subtitle }}</span>\n </div>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n (click)=\"closePanel()\"\n ></button>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article class=\"message {{ message.role }}\" [class.error]=\"message.isError\">\n @if(message.displayResponse; as responseDetails) {\n <p class=\"assistant-result\">{{ responseDetails.agentInferredResponse || message.content }}</p>\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n <button\n type=\"button\"\n class=\"inference-toggle\"\n [attr.aria-expanded]=\"isInferenceDetailsVisible(message.id)\"\n (click)=\"toggleInferenceDetails(message.id)\"\n >\n {{ isInferenceDetailsVisible(message.id) ? 'Hide Inference Details' : 'Show Inference Details' }}\n </button>\n\n @if(isInferenceDetailsVisible(message.id)) {\n <div class=\"response-details\">\n @if(responseDetails.userQuery) {\n <section class=\"response-section\">\n <h3>User Query</h3>\n <p class=\"quoted\">\"{{ responseDetails.userQuery }}\"</p>\n </section>\n }\n\n @if(responseDetails.agentExtractedIntent; as intent) {\n <section class=\"response-section\">\n <h3>Agent Extracted Intent</h3>\n <dl class=\"detail-grid\">\n @if(intent.project || intent.projectKey) {\n <div>\n <dt>Project</dt>\n <dd>\n {{ intent.project || intent.projectKey }}\n @if(intent.projectKey) {\n <span>{{ intent.projectKey }}</span>\n }\n </dd>\n </div>\n }\n @if(intent.module) {\n <div>\n <dt>Module</dt>\n <dd>{{ intent.module }}</dd>\n </div>\n }\n @if(intent.intentLabel) {\n <div>\n <dt>Intent Label</dt>\n <dd>{{ intent.intentLabel }}</dd>\n </div>\n }\n @if(intent.intent) {\n <div>\n <dt>Intent</dt>\n <dd>{{ intent.intent }}</dd>\n </div>\n }\n @if(intent.confidence !== undefined) {\n <div>\n <dt>Confidence</dt>\n <dd>{{ intent.confidence | percent: '1.0-0' }}</dd>\n </div>\n }\n </dl>\n\n @if(message.formattedParameters) {\n <div class=\"json-block\">\n <span class=\"detail-label\">Parameters</span>\n <pre>{{ message.formattedParameters }}</pre>\n </div>\n }\n\n @if(intent.api?.url || intent.api?.method) {\n <div class=\"api-call-summary\">\n <span class=\"detail-label\">API Called</span>\n <code>{{ intent.api?.method || 'GET' }} {{ intent.api?.url || 'URL not provided' }}</code>\n </div>\n }\n\n @if(message.formattedApiHeaders) {\n <div class=\"json-block\">\n <span class=\"detail-label\">Request Headers</span>\n <pre>{{ message.formattedApiHeaders }}</pre>\n </div>\n }\n\n @if(message.formattedApiBody) {\n <div class=\"json-block\">\n <span class=\"detail-label\">API Body</span>\n <pre>{{ message.formattedApiBody }}</pre>\n </div>\n }\n </section>\n }\n\n @if(message.formattedApiResponse) {\n <section class=\"response-section\">\n <h3>API Response</h3>\n <div class=\"json-block\">\n <span class=\"detail-label\">JSON</span>\n <pre>{{ message.formattedApiResponse }}</pre>\n </div>\n </section>\n }\n\n @if(message.formattedSampleJsonResponse) {\n <section class=\"response-section\">\n <h3>Sample JSON Response Used</h3>\n <div class=\"json-block\">\n <span class=\"detail-label\">JSON</span>\n <pre>{{ message.formattedSampleJsonResponse }}</pre>\n </div>\n </section>\n }\n\n <section class=\"response-section\">\n <h3>Agent Response</h3>\n <p>{{ responseDetails.agentInferredResponse || message.content }}</p>\n </section>\n </div>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestion\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n </article>\n }\n @if(isSending()) {\n <article class=\"message assistant typing\" [attr.aria-label]=\"uiCopy.typingLabel\">\n <span></span>\n <span></span>\n <span></span>\n </article>\n }\n </div>\n\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n pTextarea\n name=\"assistantPrompt\"\n rows=\"2\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </section>\n</p-drawer>\n", styles: [":host{position:fixed;right:24px;bottom:24px;z-index:1100}.assistant-launcher{position:relative;width:60px!important;height:60px!important;min-height:60px!important;padding:8px;border:2px solid var(--primary-color)!important;border-radius:20px!important;color:inherit!important;background:#fff!important;box-shadow:0 0 0 1px #0078c824,0 10px 24px #0f172a24!important;overflow:visible}.assistant-launcher:before,.assistant-launcher:after{content:\"\";position:absolute;top:50%;left:50%;width:22px;height:2px;border-radius:999px;background:#0f6cae;opacity:0;transform:translate(-50%,-50%) scale(.6) rotate(0);transition:opacity .18s ease,transform .22s ease;z-index:1}.assistant-launcher:before{transform:translate(-50%,-50%) scale(.6) rotate(45deg)}.assistant-launcher:after{transform:translate(-50%,-50%) scale(.6) rotate(-45deg)}.assistant-launcher:hover,.assistant-launcher:focus-visible{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 12px 28px #0f172a29!important}.assistant-launcher.is-open{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 14px 32px #0f172a2e!important}.assistant-launcher.is-open:before,.assistant-launcher.is-open:after{opacity:1}.assistant-launcher.is-open:before{transform:translate(-50%,-50%) scale(1) rotate(45deg)}.assistant-launcher.is-open:after{transform:translate(-50%,-50%) scale(1) rotate(-45deg)}.mascot{position:relative;display:grid;place-items:center;width:64px;height:56px;background:url(data:image/png;base64,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) center/contain no-repeat;transition:opacity .18s ease,transform .24s ease,filter .24s ease;z-index:0}.assistant-launcher.is-open .mascot{animation:assistant-open-float 1.6s ease-in-out infinite;filter:saturate(1.08);opacity:.34;transform:scale(.9)}.mascot.large{width:58px;height:46px}@keyframes assistant-open-float{0%,to{transform:scale(.9) translateY(0)}50%{transform:scale(.92) translateY(-2px)}}::ng-deep .assistant-drawer{width:min(560px,100vw)!important;height:min(80vh,820px)!important;max-height:calc(100dvh - 48px)!important;top:50%!important;right:24px!important;border:1px solid rgba(148,163,184,.24)!important;border-radius:24px!important;background:#fffffff5!important;box-shadow:0 24px 70px #0f172a33,0 0 0 1px #ffffffad inset!important;overflow:hidden!important;transform:translateY(-50%)!important;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}::ng-deep .assistant-drawer .p-drawer-content{height:100%;padding:0;overflow:hidden;background:transparent}::ng-deep .assistant-drawer .p-drawer-header{display:none}.assistant-panel{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:0;border-radius:inherit;background:linear-gradient(180deg,#f8fafcd1,#f1f5f9f5),var(--background-color, #f8fafc);overflow:hidden}.assistant-header,.assistant-composer{display:flex;gap:12px;align-items:center;padding:16px 18px;background:#ffffffeb;border-bottom:1px solid rgba(226,232,240,.86)}.assistant-header h2{margin:0;color:#0f172a;font-family:Montserrat,Arial,sans-serif;font-weight:600;letter-spacing:0;line-height:1}.assistant-header span{color:#64748b;font-weight:600}.sources span{color:#64748b;font-size:12px;font-weight:600}.assistant-header .header-action:first-of-type{margin-left:auto}.assistant-header .header-action{width:38px;height:38px;margin-left:0;color:#475569;background:transparent}.assistant-header .header-action:hover{background:#0f172a0f}.assistant-messages{min-height:0;overflow:auto;padding:18px;scrollbar-width:thin}.message{width:fit-content;max-width:92%;margin-bottom:14px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:16px;background:#fff;box-shadow:0 1px 2px #0f172a14,0 10px 24px #0f172a0f}.message.assistant{width:100%;max-width:100%}.message.user{width:fit-content;max-width:88%;margin-left:auto;color:#fff;background:var(--primary-color, #2563eb);border-color:var(--primary-color, #2563eb);border-bottom-right-radius:6px}.message.error{border-color:var(--danger-color, #dc2626)}.message p{margin:0;line-height:1.45}.assistant-result{color:#1e293b}.assistant-tables{display:grid;gap:10px;margin-top:12px}.assistant-table-section{display:grid;gap:6px}.assistant-table-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.assistant-table-wrap{overflow:auto;border:1px solid var(--border-color, #e2e8f0);border-radius:var(--border-radius, 6px)}.assistant-table-wrap table{width:100%;min-width:420px;border-collapse:collapse;background:#fff}.assistant-table-wrap th,.assistant-table-wrap td{padding:8px 10px;border-bottom:1px solid var(--border-color, #e2e8f0);color:#334155;font-size:12px;line-height:1.35;text-align:left;vertical-align:top}.assistant-table-wrap th{color:#475569;font-weight:600;background:#f8fafc}.assistant-table-wrap tr:last-child td{border-bottom:0}.inference-toggle{display:flex;width:fit-content;margin:10px 0 0 auto;padding:0;border:0;color:var(--primary-color, #2563eb);background:transparent;font:inherit;font-size:13px;font-weight:400;text-decoration:underline;text-underline-offset:3px;cursor:pointer}.inference-toggle:hover{color:var(--primary-dark-color, #1d4ed8)}.inference-toggle:focus-visible{outline:2px solid var(--primary-color, #2563eb);outline-offset:3px}.suggestions{display:grid;gap:0;margin-top:12px}.suggestion-chip{justify-content:flex-start;width:100%;padding:6px 0;border:1px solid transparent;border-radius:999px;color:var(--primary-color, #2563eb);background:transparent;font-weight:600;box-shadow:none;text-align:left;transition:padding .16s ease,border-color .16s ease,background .16s ease,box-shadow .16s ease}.suggestion-chip:hover{padding:6px 12px;border-color:rgba(var(--primary-color-rgb, 37, 99, 235),.28);color:var(--primary-color, #2563eb);background:rgba(var(--primary-color-rgb, 37, 99, 235),.08);box-shadow:0 4px 14px #0f172a0f}.response-details{display:grid;gap:12px;margin-top:12px}.response-section{display:grid;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--border-color, #e2e8f0)}.response-section:last-child{padding-bottom:0;border-bottom:0}.response-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.quoted{padding:8px 10px;border-left:5px solid var(--primary-color, #2563eb);border-radius:var(--border-radius, 6px);color:#1e293b;background:#f8fafc}.detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0}.detail-grid div{min-width:0;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.detail-grid dt{margin-bottom:3px;color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.detail-grid dd{margin:0;color:#334155;font-size:13px;font-weight:600;line-height:1.35;overflow-wrap:anywhere}.detail-grid dd span{display:block;margin-top:2px;color:#64748b;font-size:11px}.api-call-summary,.json-block{display:grid;gap:6px;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.api-call-summary .detail-label,.json-block .detail-label{color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.api-call-summary code{color:var(--secondary-color, #0f172a);font-weight:600;white-space:normal;word-break:break-word}.json-block pre{max-height:220px;margin:0;overflow:auto;color:#0f172a;font-size:12px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.typing{display:flex;width:fit-content;max-width:fit-content;gap:5px;align-items:center;padding:4px 0;border:0;background:transparent;box-shadow:none}.typing span{width:7px;height:7px;border-radius:50%;background:var(--primary-color, #2563eb);animation:typing-dot .85s infinite ease-in-out}.typing span:nth-child(2){animation-delay:.15s}.assistant-composer{padding:14px 16px 16px;border-top:1px solid rgba(226,232,240,.9);border-bottom:0;box-shadow:0 -10px 30px #0f172a0a}.assistant-composer textarea{flex:1;min-height:46px;max-height:120px;border-radius:18px;background:#fff;resize:vertical}.assistant-composer button[type=submit]{width:44px;height:44px;border-radius:16px}@keyframes typing-dot{0%,80%,to{opacity:.35;transform:translateY(0)}40%{opacity:1;transform:translateY(-4px)}}@keyframes pulse{to{opacity:.35;transform:translateY(-2px)}}@media(max-width:640px){:host{right:16px;bottom:16px}::ng-deep .assistant-drawer{width:calc(100vw - 24px)!important;height:min(84vh,100dvh - 24px)!important;max-height:calc(100dvh - 24px)!important;right:12px!important;border-radius:20px!important}.assistant-messages{padding:14px}.detail-grid{grid-template-columns:1fr}}\n"] }]
|
|
416
|
-
|
|
913
|
+
args: [{ selector: 'max-assistant', imports: [
|
|
914
|
+
CommonModule,
|
|
915
|
+
FormsModule,
|
|
916
|
+
ButtonModule,
|
|
917
|
+
TextareaModule,
|
|
918
|
+
TooltipModule,
|
|
919
|
+
MaxAssistantMarkdownPipe
|
|
920
|
+
], template: "<ng-template #markTemplate let-large=\"large\">\n <span class=\"max-mark\" [class.large]=\"large\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 32 32\" focusable=\"false\">\n <path d=\"M16 1c.9 8.4 6.6 14.1 15 15-8.4.9-14.1 6.6-15 15-.9-8.4-6.6-14.1-15-15 8.4-.9 14.1-6.6 15-15Z\" />\n <path class=\"max-mark-small\" d=\"M25.5 1.5c.3 2.8 2.2 4.7 5 5-2.8.3-4.7 2.2-5 5-.3-2.8-2.2-4.7-5-5 2.8-.3 4.7-2.2 5-5Z\" />\n </svg>\n </span>\n</ng-template>\n\n<button\n #launcher\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-label]=\"launcherLabel\"\n [attr.aria-pressed]=\"panelVisible()\"\n [pTooltip]=\"launcherLabel\"\n tooltipPosition=\"left\"\n (click)=\"togglePanel()\"\n>\n <ng-container\n [ngTemplateOutlet]=\"markTemplate\"\n [ngTemplateOutletContext]=\"{ large: false }\"\n ></ng-container>\n</button>\n\n<aside\n class=\"assistant-window\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-hidden]=\"!panelVisible()\"\n [attr.inert]=\"panelVisible() ? null : ''\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"complementary\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <ng-container\n [ngTemplateOutlet]=\"markTemplate\"\n [ngTemplateOutletContext]=\"{ large: true }\"\n ></ng-container>\n <div class=\"assistant-identity\">\n <h2 class=\"assistant-name\">{{ uiCopy.title }}</h2>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n (click)=\"closePanel()\"\n ></button>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isStreaming) {\n <p class=\"streaming-progress\">{{ message.content }}</p>\n } @else if(message.displayResponse; as responseDetails) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <strong>{{ card.title }}</strong>\n @if(card.subtitle) {\n <span>{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span>{{ metric.label }}</span>\n <strong>{{ metric.value }}</strong>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Details' : 'Show Details' }}\n </button>\n\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">\u2192</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} \u00B7 {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} \u00B7 {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { \u00B7 HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { \u2014 HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </section>\n</aside>\n", styles: [":host{position:fixed;right:24px;bottom:24px;z-index:1100}.assistant-launcher{position:relative;width:64px!important;height:64px!important;min-height:64px!important;padding:7px;border:1px solid rgba(124,58,237,.24)!important;border-radius:22px!important;color:inherit!important;background:radial-gradient(circle at 28% 16%,rgba(255,255,255,.98),transparent 38%),linear-gradient(145deg,#fff7ed,#f5f3ff 52%,#fdf2f8)!important;box-shadow:0 0 0 1px #ffffffd9 inset,0 12px 30px #5b21b62e!important;overflow:visible;transition:border-color .22s ease,box-shadow .22s ease,transform .22s cubic-bezier(.2,.8,.2,1);z-index:2}.assistant-launcher:before,.assistant-launcher:after{content:\"\";position:absolute;top:50%;left:50%;width:22px;height:2px;border-radius:999px;background:#0f6cae;opacity:0;transform:translate(-50%,-50%) scale(.6) rotate(0);transition:opacity .18s ease,transform .22s ease;z-index:1}.assistant-launcher:before{transform:translate(-50%,-50%) scale(.6) rotate(45deg)}.assistant-launcher:after{transform:translate(-50%,-50%) scale(.6) rotate(-45deg)}.assistant-launcher:hover,.assistant-launcher:focus-visible{border-color:#ec489975!important;background:radial-gradient(circle at 30% 18%,#fff,transparent 38%),linear-gradient(145deg,#ffedd5,#ede9fe,#fce7f3)!important;box-shadow:0 0 0 3px #a855f71a,0 16px 34px #6d28d938!important;transform:translateY(-2px)}.assistant-launcher.is-open{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 14px 32px #0f172a2e!important;transform:translateY(0)}.assistant-launcher.is-open:before,.assistant-launcher.is-open:after{opacity:1}.assistant-launcher.is-open:before{transform:translate(-50%,-50%) scale(1) rotate(45deg)}.assistant-launcher.is-open:after{transform:translate(-50%,-50%) scale(1) rotate(-45deg)}.mascot{position:relative;display:inline-grid;width:54px;height:54px;place-items:center;transform-origin:50% 72%;transition:opacity .18s ease,transform .24s ease,filter .24s ease;z-index:0}.mascot-aura{position:absolute;inset:5px;border-radius:50%;background:conic-gradient(from 25deg,#f472b66b,#fbbf2452,#2dd4bf57,#8b5cf66b,#f472b66b);filter:blur(7px);animation:mascot-aura 3s ease-in-out infinite}.mascot-art{position:relative;width:100%;height:100%;overflow:visible;filter:drop-shadow(0 5px 5px rgba(2,75,116,.2));animation:mascot-idle 3.4s ease-in-out infinite}.mascot-shell{fill:#7c3aed}.mascot-ear-left{fill:#ec4899}.mascot-ear-right{fill:#f97316}.mascot-ear{transform-box:fill-box;transform-origin:center}.mascot-face{fill:#211747;stroke:#ffffff4d;stroke-width:1}.mascot-signal{fill:#facc15;stroke:#fff;stroke-width:1.5;transform-box:fill-box;transform-origin:center;animation:mascot-signal 2.2s ease-out infinite}.mascot-antenna,.mascot-sparkle,.mascot-shell-shine,.mascot-smile,.mascot-mark{fill:none;stroke-linecap:round;stroke-linejoin:round}.mascot-antenna{stroke:#6d28d9;stroke-width:2.5}.mascot-sparkle{stroke:#ec4899;stroke-width:2;transform-box:fill-box;transform-origin:center;animation:mascot-sparkle 3.4s ease-in-out infinite}.mascot-shell-shine{stroke:#e9d5ffd1;stroke-width:2}.mascot-eye{fill:#5eead4;transform-box:fill-box;transform-origin:center;animation:mascot-blink 5.2s ease-in-out infinite}.mascot-smile{stroke:#fbbf24;stroke-width:2}.mascot-mark{stroke:#ffffffd1;stroke-width:2.2}.assistant-launcher:hover .mascot-art,.assistant-launcher:focus-visible .mascot-art{animation:mascot-greet .7s cubic-bezier(.2,.8,.2,1)}.assistant-launcher:hover .mascot-ear-right,.assistant-launcher:focus-visible .mascot-ear-right{animation:mascot-ear-wave .7s ease-in-out}.assistant-launcher.is-open .mascot{filter:saturate(1.08);opacity:.24;transform:scale(.82) rotate(-5deg)}.mascot.large{width:52px;height:52px;flex:0 0 auto}@keyframes mascot-idle{0%,to{transform:translateY(0) rotate(0)}50%{transform:translateY(-2px) rotate(1deg)}}@keyframes mascot-greet{0%,to{transform:translateY(0) rotate(0)}35%{transform:translateY(-4px) rotate(-5deg)}65%{transform:translateY(-2px) rotate(4deg)}}@keyframes mascot-ear-wave{0%,to{transform:rotate(0) scaleY(1)}50%{transform:rotate(-12deg) scaleY(1.12)}}@keyframes mascot-blink{0%,45%,49%,to{transform:scaleY(1)}47%{transform:scaleY(.12)}}@keyframes mascot-signal{0%,55%,to{opacity:1;transform:scale(1)}70%{opacity:.55;transform:scale(1.42)}}@keyframes mascot-sparkle{0%,62%,to{opacity:0;transform:scale(.5) rotate(0)}72%{opacity:1;transform:scale(1) rotate(90deg)}84%{opacity:0;transform:scale(.7) rotate(150deg)}}@keyframes mascot-aura{0%,to{opacity:.45;transform:scale(.88)}50%{opacity:.85;transform:scale(1.08)}}.assistant-window{position:fixed;top:50%;right:24px;z-index:1;width:min(560px,100vw - 48px);height:min(80vh,820px);max-height:calc(100dvh - 48px);border:1px solid rgba(148,163,184,.24);border-radius:24px;background:#fffffff5;box-shadow:0 24px 70px #0f172a33,0 0 0 1px #ffffffad inset;overflow:hidden;opacity:0;visibility:hidden;pointer-events:none;translate:0 -50%;transform:translate3d(40px,28px,0) scale(.94);transform-origin:right bottom;transition:opacity .22s ease,transform .3s cubic-bezier(.4,0,1,1),visibility 0s linear .3s;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);will-change:opacity,transform}.assistant-window.is-open{opacity:1;visibility:visible;pointer-events:auto;transform:translateZ(0) scale(1);transition:opacity .28s ease,transform .46s cubic-bezier(.16,1,.3,1),visibility 0s}.assistant-panel{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:0;border-radius:inherit;background:linear-gradient(180deg,#f8fafcd1,#f1f5f9f5),var(--background-color, #f8fafc);overflow:hidden}.assistant-header,.assistant-composer{display:flex;gap:12px;align-items:center;padding:16px 18px;background:#ffffffeb;border-bottom:1px solid rgba(226,232,240,.86)}.assistant-identity{display:grid;gap:5px;min-width:0}.assistant-name{margin:0;width:fit-content;color:var(--primary-color, #2563eb);font-family:Montserrat,Arial,sans-serif;font-size:23px;font-weight:700;letter-spacing:-.045em;line-height:.9}.assistant-subtitle{color:#64748b;font-size:10px;font-weight:600;letter-spacing:.1em;line-height:1.2;text-transform:uppercase}.sources span{color:#64748b;font-size:12px;font-weight:600}.assistant-header .header-action:first-of-type{margin-left:auto}.assistant-header .header-action{width:38px;height:38px;margin-left:0;color:#475569;background:transparent}.assistant-header .header-action:hover{background:#0f172a0f}.assistant-messages{min-height:0;overflow:auto;padding:18px;scrollbar-width:thin}.message{position:relative;width:fit-content;max-width:92%;margin-bottom:14px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:16px;background:#fff;box-shadow:0 1px 2px #0f172a14,0 10px 24px #0f172a0f;-webkit-user-select:text;user-select:text}.message.assistant{width:100%;max-width:100%}.message.user{width:fit-content;max-width:88%;margin-left:auto;color:#fff;background:var(--primary-color, #2563eb);border-color:var(--primary-color, #2563eb);border-bottom-right-radius:6px}.message.user p{color:inherit}.message.error{border-color:var(--danger-color, #dc2626)}.message.streaming{padding:0;border:0;color:var(--text-color-secondary, #64748b);background:transparent;box-shadow:none;font-style:italic}.streaming-progress{white-space:pre-line}.message p{margin:0;line-height:1.45}.assistant-result{color:#1e293b}.assistant-cards{display:grid;gap:10px;margin-top:12px}.assistant-card{overflow:hidden;border:1px solid #dbeafe;border-radius:14px;background:linear-gradient(145deg,#f8fbff,#fff);box-shadow:0 8px 22px #0f172a0f}.assistant-card>header{display:grid;gap:2px;padding:11px 12px;border-bottom:1px solid #e2e8f0}.assistant-card>header strong{color:#0f172a;font-size:14px}.assistant-card>header span,.assistant-card>footer{color:#64748b;font-size:11px}.assistant-card-metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr))}.assistant-card-metric{display:grid;min-width:0;gap:3px;padding:11px 9px;border-right:1px solid #e2e8f0}.assistant-card-metric:last-child{border-right:0}.assistant-card-metric span{color:#64748b;font-size:10px;font-weight:600;text-transform:uppercase}.assistant-card-metric strong{color:#1e293b;font-size:13px;overflow-wrap:anywhere}.assistant-card-metric[data-tone=positive] strong{color:#047857}.assistant-card-metric[data-tone=warning] strong{color:#b45309}.assistant-card>footer{padding:8px 12px;border-top:1px solid #e2e8f0;background:#f8fafcb8}:host ::ng-deep .assistant-markdown{line-height:1.45}:host ::ng-deep .assistant-markdown>:first-child{margin-top:0}:host ::ng-deep .assistant-markdown>:last-child{margin-bottom:0}:host ::ng-deep .assistant-markdown p{margin:0 0 8px}:host ::ng-deep .assistant-markdown ul,:host ::ng-deep .assistant-markdown ol{margin:8px 0;padding-left:22px}:host ::ng-deep .assistant-markdown li+li{margin-top:4px}:host ::ng-deep .assistant-markdown strong{font-weight:700}:host ::ng-deep .assistant-markdown code{padding:1px 4px;border-radius:4px;background:#e2e8f0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.9em}:host ::ng-deep .assistant-markdown a{color:var(--primary-color, #2563eb);text-decoration:underline}.assistant-status{display:inline-flex;margin-top:8px;padding:3px 8px;border-radius:999px;color:#475569;background:#e2e8f0;font-size:11px;font-weight:600;text-transform:capitalize}.pending-action{display:grid;gap:9px;margin-top:12px;padding:12px;border:1px solid #f59e0b;border-radius:12px;background:#fffbeb}.pending-action-heading{display:flex;align-items:center;justify-content:space-between;color:#92400e}.pending-action-heading span{padding:2px 7px;border-radius:999px;color:#78350f;background:#fde68a;font-size:11px;font-weight:700}.pending-action small{color:#78716c}.pending-action-buttons{display:flex;gap:8px}.action-decision{color:#475569;font-weight:600}.assistant-sources{display:grid;gap:4px;margin-top:12px;padding-top:10px;border-top:1px solid #e2e8f0;color:#64748b;font-size:12px}.assistant-tables{display:grid;gap:10px;margin-top:12px}.assistant-table-section{display:grid;gap:6px}.assistant-table-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.assistant-table-wrap{overflow:auto;border:1px solid var(--border-color, #e2e8f0);border-radius:var(--border-radius, 6px)}.assistant-table-wrap table{width:100%;min-width:420px;border-collapse:collapse;background:#fff}.assistant-table-wrap th,.assistant-table-wrap td{padding:8px 10px;border-bottom:1px solid var(--border-color, #e2e8f0);color:#334155;font-size:12px;line-height:1.35;text-align:left;vertical-align:top}.assistant-table-wrap th{color:#475569;font-weight:600;background:#f8fafc}.assistant-table-wrap tr:last-child td{border-bottom:0}.assistant-table-actions{display:flex;flex-wrap:wrap;gap:6px;min-width:150px}.details-toggle{display:flex;width:fit-content;margin:10px 0 0 auto;padding:0;border:0;color:var(--primary-color, #2563eb);background:transparent;font:inherit;font-size:13px;font-weight:400;text-decoration:underline;text-underline-offset:3px;cursor:pointer}.details-toggle:hover{color:var(--primary-dark-color, #1d4ed8)}.details-toggle:focus-visible{outline:2px solid var(--primary-color, #2563eb);outline-offset:3px}.developer-details{display:grid;gap:12px;margin-top:12px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:10px;background:#f8fafc}.developer-details-header h3,.developer-details-header p{margin:0}.developer-details-header h3{color:#0f172a;font-size:13px;font-weight:600}.developer-details-header p{margin-top:2px;color:#64748b;font-size:11px}.workflow-trace{display:grid;gap:0;margin:0;padding:0;list-style:none}.workflow-step{display:block;min-width:0}.workflow-category{color:#64748b;font-size:9px;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.workflow-meta{display:grid;flex:0 0 auto;gap:2px;justify-items:end;color:#64748b;font-size:9px}.workflow-status{padding:2px 5px;border-radius:999px;color:#334155;background:#e2e8f0;font-weight:600;text-transform:capitalize}.workflow-step[data-status=succeeded] .workflow-status{color:#166534;background:#dcfce7}.workflow-step[data-status=failed] .workflow-status{color:#991b1b;background:#fee2e2}.trace-json{display:grid;gap:4px;margin-top:8px}.trace-json>span{color:#64748b;font-size:10px;font-weight:600;text-transform:uppercase}.trace-json pre{max-height:280px;margin:0;padding:8px;overflow:auto;border-radius:6px;color:#dbeafe;background:#0f172a;font-size:10px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.trace-error{display:grid;gap:3px;margin-top:8px;padding:8px;border-left:3px solid #dc2626;border-radius:4px;color:#991b1b;background:#fef2f2;font-size:11px}.developer-details-header{display:flex;gap:12px;align-items:flex-start;justify-content:space-between}.developer-eyebrow{color:var(--text-color, #0f172a);font-size:9px;font-weight:600;letter-spacing:.08em;text-transform:uppercase}.trace-section-label{color:var(--text-color, #0f172a);font-size:9px;font-weight:600;text-decoration:underline;text-underline-offset:3px}.trace-run-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}.trace-metric{display:grid;gap:3px;min-width:0;padding:9px;border:1px solid #e2e8f0;border-radius:8px;background:#fff}.trace-metric span,.trace-loop-policy span{color:#64748b;font-size:9px;font-weight:600}.trace-metric strong{color:#0f172a;font-size:13px}.trace-loop-policy{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-column:1/-1;gap:5px 12px;align-items:center;padding:10px;border:1px solid #c7d2fe;border-radius:9px;background:#eef2ff}.trace-loop-policy div{display:grid;gap:2px}.trace-loop-policy strong{color:#312e81;font-size:11px}.trace-loop-policy p{grid-column:1/-1;margin:0;color:#475569;font-size:10px;line-height:1.45}.trace-no-loop{padding:3px 7px;border-radius:999px;color:#166534!important;background:#dcfce7;font-weight:600!important}.workflow-summary{margin:9px 0 0;color:#475569;font-size:10.5px;line-height:1.5}.trace-technology{display:grid;gap:6px;margin-top:10px;padding:8px;border:1px solid #dbeafe;border-radius:7px;background:#f8fbff}.trace-inline-facts{display:flex;flex-wrap:wrap;gap:5px}.trace-inline-facts>span{display:grid;gap:1px;max-width:100%;padding:4px 6px;border-radius:5px;color:#1e293b;background:#fff;font-size:9.5px;overflow-wrap:anywhere}.trace-inline-facts small{color:#64748b;font-size:8px;font-weight:600;text-transform:uppercase}.trace-control{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:4px 8px;margin-top:8px;padding:8px;border-left:3px solid #8b5cf6;border-radius:5px;background:#f5f3ff}.trace-control>div{display:grid;gap:2px}.trace-control strong,.trace-control>span{color:#5b21b6;font-size:9.5px}.trace-control p{grid-column:1/-1;margin:0;color:#475569;font-size:9.5px;line-height:1.4}.trace-query,.trace-section,.trace-arguments,.trace-ranking-wrap{display:grid;gap:5px;margin-top:10px}.trace-query>span,.trace-transform>div>span,.trace-vector>span,.trace-payload-grid section>span,.trace-tool-call>span,.trace-supabase-call span,.trace-decision>span{color:#64748b;font-size:9px;font-weight:600;text-transform:uppercase}.trace-query>span,.trace-vector>span,.trace-payload-grid section>span,.trace-tool-call>span,.trace-decision>span{color:var(--text-color, #0f172a);text-decoration:underline;text-underline-offset:3px}.trace-query blockquote{margin:0;padding:8px 10px;border-left:3px solid #2563eb;border-radius:5px;color:#172554;background:#eff6ff;font-size:11px;font-weight:600;line-height:1.45}.trace-query-compact blockquote{border-color:#8b5cf6;color:#4c1d95;background:#f5f3ff}.trace-card-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:7px;margin-top:9px}.trace-data-card{min-width:0;padding:8px;border:1px solid #e2e8f0;border-radius:7px;background:#f8fafc}.trace-data-card-accent{border-color:#bfdbfe;background:#eff6ff}.trace-data-card h5{margin:0 0 5px;color:var(--text-color, #0f172a);font-size:10px;font-weight:600;text-decoration:underline;text-underline-offset:3px}.trace-field-list,.trace-argument-grid{display:grid;gap:4px;margin:0}.trace-field-list>div{display:grid;grid-template-columns:minmax(70px,.7fr) minmax(0,1.3fr);gap:6px}.trace-field-list dt,.trace-argument-grid dt{color:#64748b;font-size:8.5px}.trace-field-list dd,.trace-argument-grid dd{margin:0;color:#1e293b;font-size:9px;font-weight:600;overflow-wrap:anywhere}.trace-transform{display:grid;grid-template-columns:minmax(0,1fr) 18px minmax(0,1fr);gap:6px;align-items:stretch;margin-top:10px}.trace-transform>div{display:grid;gap:5px;padding:9px;border:1px solid #e2e8f0;border-radius:7px;background:#f8fafc}.trace-transform .trace-transform-result{border-color:#bfdbfe;background:#eff6ff}.trace-transform p{margin:0;color:#1e293b;font-size:10px;font-weight:600;line-height:1.4}.trace-transform-arrow{display:grid;place-items:center;color:#2563eb;font-size:16px;font-weight:600}.trace-entity-list{display:flex;flex-wrap:wrap;gap:5px}.trace-entity-list>span{display:flex;gap:5px;align-items:center;padding:4px 7px;border:1px solid #fed7aa;border-radius:999px;color:#9a3412;background:#fff7ed;font-size:9.5px}.trace-entity-list small{color:#c2410c;font-size:7.5px;font-weight:600;text-transform:uppercase}.trace-stat-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:8px}.trace-stat-grid>div{display:grid;gap:2px;padding:7px;border:1px solid #e2e8f0;border-radius:6px}.trace-stat-grid span{color:#64748b;font-size:8.5px}.trace-stat-grid strong{color:#0f172a;font-size:10px;overflow-wrap:anywhere}.trace-vector{display:grid;gap:4px;margin-top:7px}.trace-vector code{padding:7px;overflow:auto;border-radius:5px;color:#c4b5fd;background:#1e1b4b;font-size:8.5px;white-space:nowrap}.trace-supabase-call{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:10px;padding:9px;border:1px solid #a7f3d0;border-radius:7px;background:#ecfdf5}.trace-supabase-call>div{display:grid;gap:2px}.trace-supabase-call strong{color:#065f46;font-size:10px;overflow-wrap:anywhere}.trace-table-list{grid-column:1/-1}.trace-table-list>div{display:flex;flex-wrap:wrap;gap:4px}.trace-table-list code{padding:3px 5px;border-radius:4px;color:#065f46;background:#d1fae5;font-size:8.5px}.trace-decision{display:grid;gap:4px;margin-top:7px;padding:9px;border-left:3px solid #16a34a;border-radius:5px;background:#f0fdf4}.trace-decision strong{color:#14532d;font-size:11px}.trace-decision div{display:flex;flex-wrap:wrap;gap:8px;color:#166534;font-size:8.5px}.trace-ranking-wrap{overflow:auto}.trace-ranking{width:100%;min-width:610px;border-collapse:collapse;font-size:8.5px}.trace-ranking th,.trace-ranking td{padding:6px;border-bottom:1px solid #e2e8f0;color:#475569;text-align:right;vertical-align:top}.trace-ranking th{color:#64748b;background:#f8fafc;font-size:8px;text-transform:uppercase}.trace-ranking th:nth-child(2),.trace-ranking td:nth-child(2){text-align:left}.trace-ranking td:nth-child(2){display:grid;gap:2px;min-width:145px}.trace-ranking strong{color:#1e293b;font-size:9px}.trace-ranking code{color:#64748b;font-size:7.5px}.trace-argument-grid{grid-template-columns:repeat(2,minmax(0,1fr));margin-top:3px}.trace-argument-grid>div{min-width:0;padding:7px;border:1px solid #e2e8f0;border-radius:6px;background:#f8fafc}.trace-tool-call,.trace-api-route{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px;padding:8px;border-radius:6px;color:#dbeafe;background:#0f172a}.trace-tool-call>span{width:100%;color:#94a3b8}.trace-tool-call strong{color:#bfdbfe;font-size:10px}.trace-tool-call pre,.trace-payload-grid pre{width:100%;max-height:220px;margin:0;overflow:auto;color:#dbeafe;font-size:9px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.trace-api-route>code{flex:1 1 180px;color:#e2e8f0;font-size:9px;overflow-wrap:anywhere}.trace-http-method,.trace-http-status{padding:3px 6px;border-radius:4px;color:#fff;background:#2563eb;font-size:8.5px;font-weight:600}.trace-http-status.success{color:#bbf7d0;background:#166534}.trace-http-status.error{color:#fecaca;background:#991b1b}.trace-payload-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:7px}.trace-payload-grid section{display:grid;gap:5px;min-width:0;padding:8px;border:1px solid #334155;border-radius:6px;background:#0f172a}.trace-payload-grid section>span{color:#94a3b8}.trace-error.trace-warning{border-left-color:#f59e0b;color:#92400e;background:#fffbeb}.trace-error-legacy{display:none}.trace-error-heading{font-size:10px}.details-dialog-backdrop{position:fixed;inset:0;z-index:20;display:grid;padding:14px;place-items:center;background:#0f172a7a;-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px)}.details-dialog-backdrop .developer-details{display:block;width:100%;max-height:100%;margin:0;padding:0 14px 14px;overflow:auto;overscroll-behavior:contain;border:0;border-radius:14px;background:#fff;box-shadow:0 24px 70px #0f172a4d}.details-dialog-backdrop .developer-details-header{position:sticky;top:0;z-index:3;margin:0 -14px 14px;padding:14px;border-bottom:1px solid #e2e8f0;background:#fffffff7;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.details-dialog-actions{display:flex;flex:0 0 auto;gap:7px;align-items:center}.details-dialog-close{display:grid;width:30px;height:30px;padding:0;place-items:center;border:1px solid #e2e8f0;border-radius:8px;color:#475569;background:#fff;cursor:pointer}.details-dialog-close:hover{color:#0f172a;background:#f1f5f9}.details-dialog-close:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.details-dialog-backdrop .trace-run-summary{margin-bottom:6px;padding-bottom:14px;border-bottom:1px solid #cbd5e1}.details-dialog-backdrop .trace-metric{padding:0 9px;border:0;border-right:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop .trace-metric:nth-child(4){border-right:0}.details-dialog-backdrop .trace-loop-policy{margin-top:5px;padding:9px 0 0;border:0;border-top:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop .workflow-trace{display:block}.details-dialog-backdrop .workflow-step{display:block;border-bottom:1px solid #cbd5e1}.workflow-section{display:block}.workflow-step-toggle{display:flex;gap:14px;align-items:center;justify-content:space-between;width:100%;padding:14px 2px;border:0;color:inherit;background:transparent;font:inherit;text-align:left;cursor:pointer}.workflow-step-toggle:hover{background:#f8fafc}.workflow-step-toggle:focus-visible{outline:2px solid #2563eb;outline-offset:-2px}.workflow-step-toggle>div:first-child{display:grid;min-width:0;gap:2px}.workflow-step-toggle h4{margin:0;color:var(--text-color, #0f172a);font-size:12px;font-weight:600;line-height:1.4;text-decoration:underline;text-decoration-color:#94a3b8;text-underline-offset:4px}.workflow-step-number{display:block;color:var(--primary-color, #2563eb);font-size:13px;font-weight:600}.workflow-expand-icon{color:#64748b;font-size:10px}.workflow-step-content{padding:0 2px 16px}.details-dialog-backdrop .workflow-summary{margin-top:0;padding-bottom:10px;border-bottom:1px solid #e2e8f0}.details-dialog-backdrop .trace-technology,.details-dialog-backdrop .trace-control{padding:9px 0;border:0;border-bottom:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop .trace-control{border-left:0}.details-dialog-backdrop .trace-inline-facts>span{padding:0 8px 0 0;border-right:1px solid #e2e8f0;border-radius:0;background:transparent}.details-dialog-backdrop :is(h3,h4,h5,strong,.workflow-status,.trace-section-label,.developer-eyebrow){font-weight:600!important}@media (max-width: 520px){.trace-run-summary,.trace-card-grid,.trace-stat-grid,.trace-payload-grid,.trace-argument-grid,.trace-transform{grid-template-columns:1fr}.trace-transform-arrow{transform:rotate(90deg)}}.suggestions{display:grid;gap:0;margin-top:12px}.suggestion-chip{justify-content:flex-start;width:100%;padding:6px 0;border:1px solid transparent;border-radius:999px;color:var(--primary-color, #2563eb);background:transparent;font-weight:600;box-shadow:none;text-align:left;transition:padding .16s ease,border-color .16s ease,background .16s ease,box-shadow .16s ease}.suggestion-chip:hover{padding:6px 12px;border-color:rgba(var(--primary-color-rgb, 37, 99, 235),.28);color:var(--primary-color, #2563eb);background:rgba(var(--primary-color-rgb, 37, 99, 235),.08);box-shadow:0 4px 14px #0f172a0f}.response-details{display:grid;gap:12px;margin-top:12px}.response-section{display:grid;gap:8px;padding-bottom:12px;border-bottom:1px solid var(--border-color, #e2e8f0)}.response-section:last-child{padding-bottom:0;border-bottom:0}.response-section h3{margin:0;color:#0f172a;font-size:13px;font-weight:600}.quoted{padding:8px 10px;border-left:5px solid var(--primary-color, #2563eb);border-radius:var(--border-radius, 6px);color:#1e293b;background:#f8fafc}.detail-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0}.detail-grid div{min-width:0;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.detail-grid dt{margin-bottom:3px;color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.detail-grid dd{margin:0;color:#334155;font-size:13px;font-weight:600;line-height:1.35;overflow-wrap:anywhere}.detail-grid dd span{display:block;margin-top:2px;color:#64748b;font-size:11px}.api-call-summary,.json-block{display:grid;gap:6px;padding:8px;border-radius:var(--border-radius, 6px);background:#f8fafc}.api-call-summary .detail-label,.json-block .detail-label{color:#64748b;font-size:11px;font-weight:600;text-transform:uppercase}.api-call-summary code{color:var(--secondary-color, #0f172a);font-weight:600;white-space:normal;word-break:break-word}.json-block pre{max-height:220px;margin:0;overflow:auto;color:#0f172a;font-size:12px;line-height:1.45;white-space:pre-wrap;overflow-wrap:anywhere}.assistant-composer{padding:14px 16px 16px;border-top:1px solid rgba(226,232,240,.9);border-bottom:0;box-shadow:0 -10px 30px #0f172a0a}.assistant-composer textarea{flex:1;min-height:46px;max-height:120px;border-radius:18px;background:#fff;resize:vertical}.assistant-composer button[type=submit]{width:44px;height:44px;border-radius:16px}@keyframes pulse{to{opacity:.35;transform:translateY(-2px)}}@media (prefers-reduced-motion: reduce){.mascot-aura,.mascot-art,.mascot-eye,.mascot-signal,.mascot-sparkle,.assistant-launcher:hover .mascot-art,.assistant-launcher:focus-visible .mascot-art,.assistant-launcher:hover .mascot-ear-right,.assistant-launcher:focus-visible .mascot-ear-right{animation:none}.assistant-launcher,.mascot{transition-duration:.01ms}.assistant-window,.assistant-window.is-open{transition:none}}@media (max-width: 640px){:host{right:16px;bottom:16px}.assistant-window{right:12px;width:calc(100vw - 24px);height:min(84vh,100dvh - 24px);max-height:calc(100dvh - 24px);border-radius:20px}.assistant-messages{padding:14px}.detail-grid,.assistant-card-metrics{grid-template-columns:1fr}.assistant-card-metric{border-right:0;border-bottom:1px solid #e2e8f0}.assistant-card-metric:last-child{border-bottom:0}}\n", ":host{--max-accent: var(--primary-color, #1a73e8);--max-accent-strong: var(--primary-dark-color, #1557b0);--max-canvas: color-mix(in srgb, var(--background, #f8f9fa) 92%, white);--max-surface: var(--panel-background, #ffffff);--max-surface-soft: color-mix(in srgb, var(--max-accent) 6%, var(--max-surface));--max-text: var(--text-color, #1f1f1f);--max-muted: var(--text-color-secondary, #5f6368);--max-border: color-mix(in srgb, var(--border-color, #dfe1e5) 84%, transparent);--max-success: var(--success-color, #188038);--max-warning: var(--warning-color, #b06000);--max-danger: var(--error-color, var(--danger-color, #b3261e));right:24px;bottom:24px;z-index:1200;color:var(--max-text);font-family:inherit}.assistant-launcher{display:inline-flex;width:52px!important;min-width:52px;height:52px!important;min-height:52px!important;gap:10px;align-items:center;justify-content:center;padding:7px!important;overflow:hidden;border:1px solid var(--max-border)!important;border-radius:18px!important;color:var(--max-text)!important;background:color-mix(in srgb,var(--max-surface) 94%,transparent)!important;box-shadow:0 1px 2px #3c40431f,0 8px 24px #3c404324!important;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);transition:opacity .18s ease,visibility .18s ease,transform .22s ease,box-shadow .22s ease}.assistant-launcher:before,.assistant-launcher:after{content:none}.assistant-launcher:hover,.assistant-launcher:focus-visible{border-color:color-mix(in srgb,var(--max-accent) 28%,var(--max-border))!important;background:var(--max-surface)!important;box-shadow:0 2px 4px #3c40431f,0 12px 30px #3c40432e!important;transform:translateY(-2px)}.assistant-launcher.is-open{visibility:hidden;opacity:0;transform:translateY(8px) scale(.94)}.max-mark{position:relative;display:inline-grid;width:34px;height:34px;flex:0 0 auto;place-items:center;border-radius:12px;background:linear-gradient(135deg,#4285f4 4%,#7b61ff 46%,#d96570 96%);box-shadow:inset 0 0 0 1px #ffffff2e}.max-mark svg{width:19px;height:19px;overflow:visible;fill:#fff}.max-mark-small{opacity:.72}.max-mark.large{width:38px;height:38px;border-radius:13px}.max-mark.large svg{width:21px;height:21px}.assistant-window{position:fixed;top:32px;right:32px;bottom:32px;width:min(1080px,100vw - 64px);height:auto;max-height:none;overflow:hidden;translate:0 0;transform:translate3d(0,20px,0) scale(.985);transform-origin:right bottom;border:1px solid var(--max-border);border-radius:28px;background:var(--max-canvas);box-shadow:0 2px 8px #3c40431a,0 24px 64px #3c404333;-webkit-backdrop-filter:none;backdrop-filter:none}.assistant-window.is-open{transform:translateZ(0) scale(1)}.assistant-panel{grid-template-rows:72px minmax(0,1fr) auto;color:var(--max-text);background:radial-gradient(circle at 48% 0%,color-mix(in srgb,var(--max-accent) 10%,transparent),transparent 46%),radial-gradient(circle at 92% 72%,color-mix(in srgb,#c58af9 8%,transparent),transparent 38%),linear-gradient(145deg,var(--max-canvas),color-mix(in srgb,var(--max-canvas) 94%,#edf3ff))}.assistant-header{display:flex;gap:12px;align-items:center;padding:0 24px;border:0;border-bottom:1px solid var(--max-border);background:color-mix(in srgb,var(--max-canvas) 88%,transparent);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.assistant-identity{display:flex;gap:9px;align-items:baseline}.assistant-name{margin:0;color:var(--max-text);font-family:inherit;font-size:19px;font-weight:600;letter-spacing:-.025em;line-height:1}.assistant-subtitle{color:var(--max-muted);font-size:12px;font-weight:400;letter-spacing:0;line-height:1;text-transform:none}.assistant-header .header-action{width:40px;height:40px;margin:0;border-radius:50%;color:var(--max-muted);background:transparent}.assistant-header .header-action:hover{color:var(--max-text);background:var(--max-surface-soft)}.assistant-messages{width:min(820px,100%);min-height:0;justify-self:center;box-sizing:border-box;padding:44px 28px 32px;overflow-x:hidden;overflow-y:auto;scrollbar-color:color-mix(in srgb,var(--max-muted) 25%,transparent) transparent;scrollbar-width:thin}.message{width:100%;max-width:100%;box-sizing:border-box;margin:0 0 34px;padding:0;border:0;border-radius:0;color:var(--max-text);background:transparent;box-shadow:none}.message.assistant{width:100%;max-width:100%}.message.user{width:fit-content;max-width:min(76%,640px);margin:0 0 32px auto;padding:12px 18px;border:0;border-radius:22px 22px 6px;color:var(--max-text);background:color-mix(in srgb,var(--max-accent) 8%,var(--max-surface))}.message.user p{color:inherit;font-size:15px;line-height:1.55}.message.error{padding-left:16px;border-left:3px solid var(--max-danger)}.message.streaming{display:flex;gap:10px;align-items:center;padding:0;color:var(--max-muted);background:transparent;font-style:normal}.message.streaming:before{width:16px;height:16px;flex:0 0 auto;border-radius:6px;background:linear-gradient(135deg,#4285f4,#a855f7,#d96570);content:\"\";animation:max-thinking 1.4s ease-in-out infinite alternate}.streaming-progress{color:var(--max-muted);font-size:14px;white-space:pre-line}.message p,.assistant-result,:host ::ng-deep .assistant-markdown{color:var(--max-text);font-size:15px;line-height:1.65}:host ::ng-deep .assistant-markdown code{color:var(--max-text);background:color-mix(in srgb,var(--max-muted) 10%,transparent)}.message.welcome{min-height:260px;margin:0;padding-top:clamp(28px,8vh,90px);text-align:center}.message.welcome .assistant-markdown{max-width:650px;margin:0 auto}:host ::ng-deep .message.welcome .assistant-markdown p{margin:0;font-size:clamp(28px,3.2vw,42px);font-weight:500;letter-spacing:-.04em;line-height:1.18}:host ::ng-deep .message.welcome-message .assistant-markdown p{color:var(--max-accent)}.welcome-description{max-width:620px;margin:32px auto 0;color:var(--max-text);font-size:16px;line-height:1.6;white-space:pre-line}.assistant-cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:20px}.assistant-card{overflow:hidden;border:1px solid var(--max-border);border-radius:18px;background:var(--max-surface);box-shadow:none}.assistant-card>header{gap:4px;padding:16px;border-bottom:1px solid var(--max-border)}.assistant-card>header strong{color:var(--max-text);font-size:15px;font-weight:600}.assistant-card>header span,.assistant-card>footer,.assistant-card-metric span{color:var(--max-muted)}.assistant-card-metric{padding:14px;border-color:var(--max-border)}.assistant-card-metric strong{color:var(--max-text);font-size:14px}.assistant-card-metric[data-tone=positive] strong{color:var(--max-success)}.assistant-card-metric[data-tone=warning] strong{color:var(--max-warning)}.assistant-card>footer{padding:10px 16px;border-color:var(--max-border);background:var(--max-surface-soft)}.assistant-status{margin-top:12px;padding:0;border-radius:0;color:var(--max-muted);background:transparent;font-size:11px;letter-spacing:.05em;text-transform:uppercase}.pending-action{gap:12px;margin-top:18px;padding:18px;border:1px solid color-mix(in srgb,var(--max-warning) 38%,var(--max-border));border-radius:18px;background:color-mix(in srgb,var(--max-warning) 6%,var(--max-surface))}.pending-action-heading{color:var(--max-text)}.pending-action-heading span{color:var(--max-warning);background:transparent}.pending-action small,.action-decision{color:var(--max-muted)}.assistant-sources{margin-top:20px;padding-top:14px;border-color:var(--max-border);color:var(--max-muted)}.sources span{color:var(--max-muted)}.assistant-tables{gap:18px;margin-top:20px}.assistant-table-section{gap:10px}.assistant-table-section h3{color:var(--max-text);font-size:14px}.assistant-table-wrap{border-color:var(--max-border);border-radius:16px}.assistant-table-wrap table{background:var(--max-surface)}.assistant-table-wrap th,.assistant-table-wrap td{padding:11px 13px;border-color:var(--max-border);color:var(--max-text);font-size:12px}.assistant-table-wrap th{color:var(--max-muted);background:var(--max-surface-soft)}.details-toggle{margin-top:16px;color:var(--max-accent);font-size:12px;text-decoration:none}.details-toggle:hover{color:var(--max-accent-strong);text-decoration:underline}.suggestions{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}.suggestion-chip{justify-content:flex-start;width:auto;min-height:40px;padding:8px 14px;border:1px solid var(--max-border);border-radius:14px;color:var(--max-text);background:var(--max-surface);font-weight:400;box-shadow:none;text-align:left}.suggestion-chip:hover{padding:8px 14px;border-color:color-mix(in srgb,var(--max-accent) 28%,var(--max-border));color:var(--max-text);background:var(--max-surface-soft);box-shadow:none}.message.welcome .suggestions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:0}.message.welcome .suggestion-chip{width:100%;min-height:74px;padding:14px 16px;align-items:flex-start;border-radius:18px;line-height:1.35}.message.welcome .suggestion-chip:hover{padding:14px 16px;transform:translateY(-1px)}.assistant-composer{display:flex;width:min(780px,100% - 48px);box-sizing:border-box;gap:8px;align-items:center;justify-self:center;margin:0 auto 24px;padding:8px 8px 8px 18px;border:1px solid var(--max-border);border-radius:28px;background:var(--max-surface);box-shadow:0 1px 2px #3c404314,0 6px 20px #3c40431a;transition:border-color .16s ease,box-shadow .16s ease}.assistant-composer:focus-within{border-color:color-mix(in srgb,var(--max-accent) 36%,var(--max-border));box-shadow:0 1px 2px #3c404314,0 8px 24px #3c404324}.assistant-composer textarea{flex:1;min-height:44px;height:44px;max-height:132px;box-sizing:border-box;padding:11px 2px;border:0;border-radius:0;outline:0;color:var(--max-text);background:transparent;box-shadow:none;font:inherit;font-size:15px;line-height:22px;resize:none}.assistant-composer textarea::placeholder{color:var(--max-muted);opacity:.84}.assistant-composer textarea:focus{border:0;outline:0;box-shadow:none}.assistant-composer button[type=submit]{width:44px;height:44px;flex:0 0 auto;border-radius:50%;background:var(--max-accent)}.assistant-composer button[type=submit]:disabled{border-color:transparent;color:var(--max-muted);background:transparent;opacity:.5}@keyframes max-thinking{0%{opacity:.55;transform:rotate(-8deg) scale(.86)}to{opacity:1;transform:rotate(8deg) scale(1)}}@media (prefers-reduced-motion: reduce){.message.streaming:before{animation:none}.assistant-launcher,.assistant-window,.suggestion-chip{transition:none}}@media (max-width: 900px){.assistant-window{top:16px;right:16px;bottom:16px;width:calc(100vw - 32px);border-radius:24px}.assistant-messages{padding-top:34px}}@media (max-width: 640px){:host{right:16px;bottom:16px}.assistant-launcher{min-width:52px;padding:7px!important}.assistant-window{inset:0;width:100vw;height:100dvh;border:0;border-radius:0}.assistant-panel{grid-template-rows:64px minmax(0,1fr) auto}.assistant-header{padding:0 14px}.assistant-subtitle{display:none}.assistant-messages{padding:26px 18px 20px}.message.welcome{padding-top:24px}.message.welcome .suggestions,.assistant-cards{grid-template-columns:1fr}.message.welcome .suggestion-chip{min-height:60px}.message.user{max-width:88%}.assistant-composer{width:calc(100% - 24px);margin-bottom:12px}}\n"] }]
|
|
921
|
+
}], ctorParameters: () => [{ type: MaxAssistantService }, { type: i0.DestroyRef }, { type: undefined, decorators: [{
|
|
922
|
+
type: Inject,
|
|
923
|
+
args: [MAX_ASSISTANT_CONFIG]
|
|
924
|
+
}] }], propDecorators: { launcher: [{
|
|
925
|
+
type: ViewChild,
|
|
926
|
+
args: ['launcher']
|
|
927
|
+
}], messagesViewport: [{
|
|
417
928
|
type: ViewChild,
|
|
418
929
|
args: ['messagesViewport']
|
|
419
930
|
}], app: [{
|
|
@@ -422,6 +933,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
422
933
|
type: Input
|
|
423
934
|
}], user: [{
|
|
424
935
|
type: Input
|
|
936
|
+
}], context: [{
|
|
937
|
+
type: Input
|
|
938
|
+
}], requestHeaders: [{
|
|
939
|
+
type: Input
|
|
940
|
+
}], onDocumentEscape: [{
|
|
941
|
+
type: HostListener,
|
|
942
|
+
args: ['document:keydown.escape']
|
|
425
943
|
}] } });
|
|
426
944
|
|
|
427
945
|
/*
|
|
@@ -432,5 +950,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
432
950
|
* Generated bundle index. Do not edit.
|
|
433
951
|
*/
|
|
434
952
|
|
|
435
|
-
export { MAX_ASSISTANT_CONFIG, MaxAssistantComponent };
|
|
953
|
+
export { MAX_ASSISTANT_CONFIG, MaxAssistantComponent, MaxAssistantService };
|
|
436
954
|
//# sourceMappingURL=max-agent-ui.mjs.map
|