max-agent-ui 0.0.12 → 0.0.13
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/fesm2022/max-agent-ui.mjs +165 -38
- package/fesm2022/max-agent-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/max-agent-ui.d.ts +62 -12
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as i7 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { InjectionToken,
|
|
4
|
+
import { InjectionToken, Inject, Optional, Injectable, signal, Input, ViewChild, Component } from '@angular/core';
|
|
5
5
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
-
import * as
|
|
6
|
+
import * as i2 from '@angular/forms';
|
|
7
7
|
import { FormsModule } from '@angular/forms';
|
|
8
|
-
import * as
|
|
8
|
+
import * as i3 from 'primeng/button';
|
|
9
9
|
import { ButtonModule } from 'primeng/button';
|
|
10
|
-
import * as
|
|
10
|
+
import * as i4 from 'primeng/drawer';
|
|
11
11
|
import { DrawerModule } from 'primeng/drawer';
|
|
12
|
-
import * as
|
|
12
|
+
import * as i5 from 'primeng/textarea';
|
|
13
13
|
import { TextareaModule } from 'primeng/textarea';
|
|
14
|
-
import * as
|
|
14
|
+
import * as i6 from 'primeng/tooltip';
|
|
15
15
|
import { TooltipModule } from 'primeng/tooltip';
|
|
16
|
-
import { HttpClient } from '@angular/common/http';
|
|
17
16
|
import { throwError } from 'rxjs';
|
|
17
|
+
import { tap } from 'rxjs/operators';
|
|
18
|
+
import * as i1 from '@angular/common/http';
|
|
18
19
|
|
|
19
20
|
const DEFAULT_ASSISTANT_BOOTSTRAP = {
|
|
20
21
|
initialMessage: undefined,
|
|
@@ -22,21 +23,21 @@ const DEFAULT_ASSISTANT_BOOTSTRAP = {
|
|
|
22
23
|
};
|
|
23
24
|
const ASSISTANT_BOOTSTRAP_BY_APP = {
|
|
24
25
|
cortex: {
|
|
25
|
-
initialMessage:
|
|
26
|
+
initialMessage: "Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?",
|
|
26
27
|
initialSuggestions: [
|
|
27
28
|
'What sessions are scheduled for today?',
|
|
28
29
|
'Which lecturers have planned leave this week?',
|
|
29
30
|
'List the students who are on leave today.',
|
|
30
|
-
'List the students who were absent
|
|
31
|
+
'List the students who were absent yesterday.',
|
|
31
32
|
'Generate the attendance report for a session conducted yesterday.'
|
|
32
33
|
]
|
|
33
34
|
},
|
|
34
35
|
nemesys: {
|
|
35
|
-
initialMessage:
|
|
36
|
+
initialMessage: "Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?",
|
|
36
37
|
initialSuggestions: ['Show scheduling plans', 'Check resource availability', 'Find conflicts']
|
|
37
38
|
},
|
|
38
39
|
attendance: {
|
|
39
|
-
initialMessage:
|
|
40
|
+
initialMessage: "Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?",
|
|
40
41
|
initialSuggestions: ['Show attendance summary', 'Find missing attendance', 'View reports']
|
|
41
42
|
}
|
|
42
43
|
};
|
|
@@ -55,12 +56,16 @@ const MAX_ASSISTANT_CONFIG = new InjectionToken('MAX_ASSISTANT_CONFIG', {
|
|
|
55
56
|
const DEFAULT_ASSISTANT_CHAT_URL = 'https://fhmaof3b4kaxqfbnomfstxyhw40rrcjr.lambda-url.eu-west-2.on.aws/chat';
|
|
56
57
|
const DEFAULT_APP = 'cortex';
|
|
57
58
|
class MaxAssistantService {
|
|
58
|
-
config
|
|
59
|
-
http
|
|
59
|
+
config;
|
|
60
|
+
http;
|
|
61
|
+
constructor(config, http) {
|
|
62
|
+
this.config = config;
|
|
63
|
+
this.http = http;
|
|
64
|
+
}
|
|
60
65
|
sendMessage(message, conversationId, config = {}) {
|
|
61
66
|
const assistantConfig = {
|
|
62
67
|
...this.config,
|
|
63
|
-
...config
|
|
68
|
+
...this.compactConfig(config)
|
|
64
69
|
};
|
|
65
70
|
const request = {
|
|
66
71
|
message,
|
|
@@ -74,7 +79,7 @@ class MaxAssistantService {
|
|
|
74
79
|
if (!this.http) {
|
|
75
80
|
return throwError(() => new Error('HttpClient is not available. Add provideHttpClient() to the host app.'));
|
|
76
81
|
}
|
|
77
|
-
return this.http.post(this.getChatUrl(config), request);
|
|
82
|
+
return this.http.post(this.getChatUrl(config), request).pipe(tap(response => console.log('[Max Agent UI] agent-service response', response)));
|
|
78
83
|
}
|
|
79
84
|
getChatUrl(config) {
|
|
80
85
|
return config.assistantApiUrl?.trim() || DEFAULT_ASSISTANT_CHAT_URL;
|
|
@@ -88,7 +93,10 @@ class MaxAssistantService {
|
|
|
88
93
|
}
|
|
89
94
|
return config.user ?? {};
|
|
90
95
|
}
|
|
91
|
-
|
|
96
|
+
compactConfig(config) {
|
|
97
|
+
return Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined));
|
|
98
|
+
}
|
|
99
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MaxAssistantService, deps: [{ token: MAX_ASSISTANT_CONFIG }, { token: i1.HttpClient, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
92
100
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MaxAssistantService, providedIn: 'root' });
|
|
93
101
|
}
|
|
94
102
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MaxAssistantService, decorators: [{
|
|
@@ -96,7 +104,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
|
|
|
96
104
|
args: [{
|
|
97
105
|
providedIn: 'root'
|
|
98
106
|
}]
|
|
99
|
-
}]
|
|
107
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
108
|
+
type: Inject,
|
|
109
|
+
args: [MAX_ASSISTANT_CONFIG]
|
|
110
|
+
}] }, { type: i1.HttpClient, decorators: [{
|
|
111
|
+
type: Optional
|
|
112
|
+
}] }] });
|
|
100
113
|
|
|
101
114
|
const ASSISTANT_UI_COPY = {
|
|
102
115
|
title: 'Max',
|
|
@@ -104,11 +117,15 @@ const ASSISTANT_UI_COPY = {
|
|
|
104
117
|
launcherLabel: 'Open Maxtime virtual assistant',
|
|
105
118
|
openTooltip: 'Open Maxtime virtual assistant',
|
|
106
119
|
closeLabel: 'Close Maxtime virtual assistant',
|
|
120
|
+
clearLabel: 'Clear chat session',
|
|
121
|
+
clearTooltip: 'Clear chat session',
|
|
107
122
|
placeholder: 'Ask Maxtime virtual assistant',
|
|
108
123
|
typingLabel: 'Maxtime virtual assistant is typing',
|
|
109
124
|
errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'
|
|
110
125
|
};
|
|
111
126
|
class MaxAssistantComponent {
|
|
127
|
+
assistantService;
|
|
128
|
+
destroyRef;
|
|
112
129
|
messagesViewport;
|
|
113
130
|
app;
|
|
114
131
|
assistantApiUrl;
|
|
@@ -119,17 +136,27 @@ class MaxAssistantComponent {
|
|
|
119
136
|
conversationId = signal(undefined, ...(ngDevMode ? [{ debugName: "conversationId" }] : /* istanbul ignore next */ []));
|
|
120
137
|
messages = signal([], ...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
|
|
121
138
|
expandedInferenceMessageIds = signal(new Set(), ...(ngDevMode ? [{ debugName: "expandedInferenceMessageIds" }] : /* istanbul ignore next */ []));
|
|
122
|
-
assistantService
|
|
123
|
-
|
|
139
|
+
constructor(assistantService, destroyRef) {
|
|
140
|
+
this.assistantService = assistantService;
|
|
141
|
+
this.destroyRef = destroyRef;
|
|
142
|
+
}
|
|
124
143
|
openPanel() {
|
|
125
144
|
this.panelVisible.set(true);
|
|
126
|
-
if (!this.messages().length
|
|
127
|
-
this.messages.set(
|
|
128
|
-
this.createMessage('assistant', this.bootstrapConfig.initialMessage, this.bootstrapConfig.initialSuggestions)
|
|
129
|
-
]);
|
|
145
|
+
if (!this.messages().length) {
|
|
146
|
+
this.messages.set(this.createDefaultMessages());
|
|
130
147
|
}
|
|
131
148
|
this.scrollToLatest();
|
|
132
149
|
}
|
|
150
|
+
togglePanel() {
|
|
151
|
+
if (this.panelVisible()) {
|
|
152
|
+
this.closePanel();
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
this.openPanel();
|
|
156
|
+
}
|
|
157
|
+
get launcherLabel() {
|
|
158
|
+
return this.panelVisible() ? this.uiCopy.closeLabel : this.uiCopy.launcherLabel;
|
|
159
|
+
}
|
|
133
160
|
get uiCopy() {
|
|
134
161
|
return ASSISTANT_UI_COPY;
|
|
135
162
|
}
|
|
@@ -139,6 +166,14 @@ class MaxAssistantComponent {
|
|
|
139
166
|
closePanel() {
|
|
140
167
|
this.panelVisible.set(false);
|
|
141
168
|
}
|
|
169
|
+
clearChatSession() {
|
|
170
|
+
this.input.set('');
|
|
171
|
+
this.isSending.set(false);
|
|
172
|
+
this.conversationId.set(undefined);
|
|
173
|
+
this.expandedInferenceMessageIds.set(new Set());
|
|
174
|
+
this.messages.set(this.createDefaultMessages());
|
|
175
|
+
this.scrollToLatest();
|
|
176
|
+
}
|
|
142
177
|
sendMessage(message = this.input()) {
|
|
143
178
|
const trimmedMessage = message.trim();
|
|
144
179
|
if (!trimmedMessage || this.isSending()) {
|
|
@@ -193,30 +228,49 @@ class MaxAssistantComponent {
|
|
|
193
228
|
this.scrollToLatest();
|
|
194
229
|
}
|
|
195
230
|
}
|
|
231
|
+
getResponseGrid(responseDetails) {
|
|
232
|
+
return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];
|
|
233
|
+
}
|
|
196
234
|
getAssistantConfig() {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
235
|
+
const config = {};
|
|
236
|
+
if (this.assistantApiUrl) {
|
|
237
|
+
config.assistantApiUrl = this.assistantApiUrl;
|
|
238
|
+
}
|
|
239
|
+
if (this.app) {
|
|
240
|
+
config.app = this.app;
|
|
241
|
+
}
|
|
242
|
+
if (this.user) {
|
|
243
|
+
config.user = this.user;
|
|
244
|
+
}
|
|
245
|
+
return config;
|
|
202
246
|
}
|
|
203
247
|
appendMessage(message) {
|
|
204
248
|
this.messages.update(messages => [...messages, message]);
|
|
205
249
|
this.scrollToLatest();
|
|
206
250
|
}
|
|
251
|
+
createDefaultMessages() {
|
|
252
|
+
if (!this.bootstrapConfig.initialMessage) {
|
|
253
|
+
return [];
|
|
254
|
+
}
|
|
255
|
+
return [
|
|
256
|
+
this.createMessage('assistant', this.bootstrapConfig.initialMessage, this.bootstrapConfig.initialSuggestions)
|
|
257
|
+
];
|
|
258
|
+
}
|
|
207
259
|
createAssistantResponseMessage(response, userQuery) {
|
|
208
260
|
const displayResponse = this.createDisplayResponse(response, userQuery);
|
|
209
|
-
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.mockResult, response.llmUsed, response.availableModules, displayResponse);
|
|
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);
|
|
210
262
|
}
|
|
211
|
-
createMessage(role, content, suggestions = [], sources = [], intent, intentLabel, app, productLabel, apiModule, confidence, parameters, apiCalls, mockResult, llmUsed, availableModules, displayResponse) {
|
|
263
|
+
createMessage(role, content, suggestions = [], sources = [], intent, intentLabel, app, productLabel, apiModule, confidence, parameters, apiCalls, apiResult, mockResult, llmUsed, availableModules, displayResponse) {
|
|
212
264
|
return {
|
|
213
265
|
id: this.createId(),
|
|
214
266
|
role,
|
|
215
267
|
content,
|
|
216
268
|
displayResponse,
|
|
217
269
|
formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),
|
|
270
|
+
formattedApiHeaders: this.formatJson(displayResponse?.agentExtractedIntent?.api?.headers),
|
|
218
271
|
formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),
|
|
219
272
|
formattedApiResponse: this.formatJson(displayResponse?.apiResponse),
|
|
273
|
+
formattedSampleJsonResponse: this.formatJson(displayResponse?.sampleJsonResponse),
|
|
220
274
|
suggestions,
|
|
221
275
|
sources,
|
|
222
276
|
intent,
|
|
@@ -228,6 +282,7 @@ class MaxAssistantComponent {
|
|
|
228
282
|
parameters,
|
|
229
283
|
entities: parameters,
|
|
230
284
|
apiCalls,
|
|
285
|
+
apiResult,
|
|
231
286
|
mockResult,
|
|
232
287
|
llmUsed,
|
|
233
288
|
availableModules,
|
|
@@ -237,11 +292,15 @@ class MaxAssistantComponent {
|
|
|
237
292
|
createDisplayResponse(response, userQuery) {
|
|
238
293
|
const provided = response.displayResponse ?? {};
|
|
239
294
|
const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);
|
|
295
|
+
const grid = this.getDisplayTables(provided, response);
|
|
240
296
|
return {
|
|
241
297
|
userQuery: provided.userQuery || userQuery,
|
|
242
298
|
agentInferredResponse: provided.agentInferredResponse || response.answer,
|
|
243
299
|
agentExtractedIntent: extractedIntent,
|
|
244
|
-
apiResponse: provided.apiResponse ??
|
|
300
|
+
apiResponse: provided.apiResponse ?? response.apiResult,
|
|
301
|
+
sampleJsonResponse: provided.sampleJsonResponse ?? this.getSampleJsonResponseFallback(response),
|
|
302
|
+
grid,
|
|
303
|
+
tables: grid,
|
|
245
304
|
markdown: provided.markdown
|
|
246
305
|
};
|
|
247
306
|
}
|
|
@@ -257,18 +316,86 @@ class MaxAssistantComponent {
|
|
|
257
316
|
api: provided?.api ?? response.apiCalls?.[0]
|
|
258
317
|
};
|
|
259
318
|
}
|
|
260
|
-
|
|
319
|
+
getSampleJsonResponseFallback(response) {
|
|
261
320
|
if (!response.mockResult || !Object.keys(response.mockResult).length) {
|
|
262
321
|
return undefined;
|
|
263
322
|
}
|
|
264
323
|
return response.mockResult;
|
|
265
324
|
}
|
|
325
|
+
getDisplayTables(provided, response) {
|
|
326
|
+
if (provided.grid?.length) {
|
|
327
|
+
return provided.grid;
|
|
328
|
+
}
|
|
329
|
+
if (provided.tables?.length) {
|
|
330
|
+
return provided.tables;
|
|
331
|
+
}
|
|
332
|
+
const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);
|
|
333
|
+
if (!rows.length) {
|
|
334
|
+
return [];
|
|
335
|
+
}
|
|
336
|
+
const columns = this.getTableColumns(rows);
|
|
337
|
+
return [
|
|
338
|
+
{
|
|
339
|
+
title: 'API Response',
|
|
340
|
+
columns,
|
|
341
|
+
rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))
|
|
342
|
+
}
|
|
343
|
+
];
|
|
344
|
+
}
|
|
345
|
+
extractTableRows(value) {
|
|
346
|
+
if (Array.isArray(value)) {
|
|
347
|
+
return value.filter(this.isFieldMap);
|
|
348
|
+
}
|
|
349
|
+
if (!this.isFieldMap(value)) {
|
|
350
|
+
return [];
|
|
351
|
+
}
|
|
352
|
+
const body = value['body'];
|
|
353
|
+
if (Array.isArray(body)) {
|
|
354
|
+
return body.filter(this.isFieldMap);
|
|
355
|
+
}
|
|
356
|
+
const items = value['items'];
|
|
357
|
+
if (Array.isArray(items)) {
|
|
358
|
+
return items.filter(this.isFieldMap);
|
|
359
|
+
}
|
|
360
|
+
return [];
|
|
361
|
+
}
|
|
362
|
+
getTableColumns(rows) {
|
|
363
|
+
const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);
|
|
364
|
+
return fields.map(field => ({
|
|
365
|
+
field,
|
|
366
|
+
header: this.toColumnHeader(field)
|
|
367
|
+
}));
|
|
368
|
+
}
|
|
369
|
+
formatTableRow(row, fields) {
|
|
370
|
+
return Object.fromEntries(fields.map(field => [field, this.formatCellValue(row[field])]));
|
|
371
|
+
}
|
|
372
|
+
formatCellValue(value) {
|
|
373
|
+
if (Array.isArray(value)) {
|
|
374
|
+
return value.map(item => this.formatCellValue(item)).join(', ');
|
|
375
|
+
}
|
|
376
|
+
if (this.isFieldMap(value)) {
|
|
377
|
+
return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);
|
|
378
|
+
}
|
|
379
|
+
return value ?? '';
|
|
380
|
+
}
|
|
381
|
+
toColumnHeader(field) {
|
|
382
|
+
return field
|
|
383
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1 $2')
|
|
384
|
+
.replace(/[_-]+/g, ' ')
|
|
385
|
+
.replace(/\b\w/g, character => character.toUpperCase());
|
|
386
|
+
}
|
|
266
387
|
formatJson(value) {
|
|
267
|
-
if (value === undefined) {
|
|
388
|
+
if (value === undefined || this.isEmptyObject(value)) {
|
|
268
389
|
return undefined;
|
|
269
390
|
}
|
|
270
391
|
return JSON.stringify(value, null, 2);
|
|
271
392
|
}
|
|
393
|
+
isEmptyObject(value) {
|
|
394
|
+
return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;
|
|
395
|
+
}
|
|
396
|
+
isFieldMap(value) {
|
|
397
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
398
|
+
}
|
|
272
399
|
createId() {
|
|
273
400
|
return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;
|
|
274
401
|
}
|
|
@@ -280,13 +407,13 @@ class MaxAssistantComponent {
|
|
|
280
407
|
}
|
|
281
408
|
});
|
|
282
409
|
}
|
|
283
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MaxAssistantComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
284
|
-
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 [attr.aria-label]=\"uiCopy.launcherLabel\"\n [pTooltip]=\"uiCopy.openTooltip\"\n tooltipPosition=\"left\"\n (click)=\"openPanel()\"\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-times\"\n text\n rounded\n severity=\"secondary\"\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 <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 Details' : 'Show 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 <strong>Parameters</strong>\n <pre>{{ message.formattedParameters }}</pre>\n </div>\n }\n\n @if(intent.api?.url || intent.api?.method) {\n <div class=\"api-call-summary\">\n <strong>API Called</strong>\n <code>{{ intent.api?.method || 'GET' }} {{ intent.api?.url || 'URL not provided' }}</code>\n </div>\n }\n\n @if(message.formattedApiBody) {\n <div class=\"json-block\">\n <strong>API Body</strong>\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 <strong>JSON</strong>\n <pre>{{ message.formattedApiResponse }}</pre>\n </div>\n </section>\n }\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{width:70px!important;height:56px!important;min-height:60px!important;padding:0 5px;border:0!important;border-radius:18px!important;color:inherit!important;background:#d7edff!important;box-shadow:0 0 0 1px #0078c824,0 10px 24px #0f172a24!important;overflow:visible}.assistant-launcher:hover,.assistant-launcher:focus-visible{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 12px 28px #0f172a29!important}.mascot{position:relative;display:grid;place-items:center;width:64px;height:56px;background:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"120\" height=\"96\" viewBox=\"14 10 92 82\" role=\"img\" aria-label=\"Max smiling cloud AI mascot\">%0A <defs>%0A <filter id=\"softShadow\" x=\"-15%\" y=\"-15%\" width=\"130%\" height=\"140%\">%0A <feDropShadow dx=\"0\" dy=\"5\" stdDeviation=\"5\" flood-color=\"%230078C8\" flood-opacity=\"0.16\"/>%0A </filter>%0A </defs>%0A%0A <g fill=\"%230078C8\" opacity=\"0.28\">%0A <circle cx=\"34\" cy=\"57\" r=\"24\"/>%0A <circle cx=\"58\" cy=\"39\" r=\"31\"/>%0A <circle cx=\"86\" cy=\"58\" r=\"25\"/>%0A <rect x=\"28\" y=\"55\" width=\"68\" height=\"27\" rx=\"13.5\"/>%0A </g>%0A%0A <g fill=\"%230078C8\" opacity=\"0.68\" filter=\"url(%23softShadow)\">%0A <circle cx=\"35\" cy=\"59\" r=\"20\"/>%0A <circle cx=\"59\" cy=\"43\" r=\"27\"/>%0A <circle cx=\"84\" cy=\"60\" r=\"21\"/>%0A <rect x=\"31\" y=\"57\" width=\"64\" height=\"24\" rx=\"12\"/>%0A </g>%0A%0A <g fill=\"%23FFD54A\">%0A <path d=\"M46 48l3.4 6.8 6.8 3.4-6.8 3.4L46 68.4l-3.4-6.8-6.8-3.4 6.8-3.4z\"/>%0A <path d=\"M74 48l3.4 6.8 6.8 3.4-6.8 3.4-3.4 6.8-3.4-6.8-6.8-3.4 6.8-3.4z\"/>%0A <path d=\"M88 28l2 4 4 2-4 2-2 4-2-4-4-2 4-2z\"/>%0A </g>%0A%0A <path%0A d=\"M49 72c6 7 20 7 26 0\"%0A fill=\"none\"%0A stroke=\"%23FFD54A\"%0A stroke-width=\"4\"%0A stroke-linecap=\"round\"%0A />%0A</svg>%0A') center/contain no-repeat}.mascot.large{width:58px;height:46px}::ng-deep .assistant-drawer{width:min(560px,100vw)!important}::ng-deep .assistant-drawer .p-drawer-content{padding:0}::ng-deep .assistant-drawer .p-drawer-header{display:none}.assistant-panel{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:0;background:var(--background-color, #f8fafc)}.assistant-header,.assistant-composer{display:flex;gap:12px;align-items:center;padding:16px;background:#fff;border-bottom:1px solid var(--border-color, #e2e8f0)}.assistant-header h2{margin:0;font-size:20px}.assistant-header span,.sources span{color:#64748b;font-size:12px;font-weight:700}.assistant-header button{margin-left:auto}.assistant-messages{min-height:0;overflow:auto;padding:18px}.message{width:fit-content;max-width:92%;margin-bottom:14px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:var(--medium-border-radius, 8px);background:#fff;box-shadow:0 6px 18px #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)}.message.error{border-color:var(--danger-color, #dc2626)}.message p{margin:0;line-height:1.45}.assistant-result{color:#1e293b}.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:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.suggestion-chip{border:1px solid rgba(var(--primary-color-rgb, 37, 99, 235),.28);color:var(--primary-dark-color, #1d4ed8);background:rgba(var(--primary-color-rgb, 37, 99, 235),.08);font-weight:700;box-shadow:0 4px 14px #0f172a0f;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.suggestion-chip:hover{border-color:rgba(var(--primary-color-rgb, 37, 99, 235),.42);color:var(--primary-dark-color, #1d4ed8);background:rgba(var(--primary-color-rgb, 37, 99, 235),.14)}.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:800}.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:800;text-transform:uppercase}.detail-grid dd{margin:0;color:#334155;font-size:13px;font-weight:700;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 strong,.json-block strong{color:#64748b;font-size:11px;font-weight:800;text-transform:uppercase}.api-call-summary code{color:var(--secondary-color, #0f172a);font-weight:800;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{border-top:1px solid var(--border-color, #e2e8f0);border-bottom:0}.assistant-composer textarea{flex:1;min-height:46px;max-height:120px;resize:vertical}@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}.assistant-launcher{width:62px!important;min-width:62px!important;height:54px!important;min-height:54px!important}.assistant-messages{padding:14px}.detail-grid{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.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: i2.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: i3.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: i4.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["pTextareaPT", "pTextareaUnstyled", "autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.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: i6.PercentPipe, name: "percent" }] });
|
|
410
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MaxAssistantComponent, deps: [{ token: MaxAssistantService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
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" }] });
|
|
285
412
|
}
|
|
286
413
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: MaxAssistantComponent, decorators: [{
|
|
287
414
|
type: Component,
|
|
288
|
-
args: [{ selector: 'max-assistant', imports: [CommonModule, FormsModule, ButtonModule, DrawerModule, TextareaModule, TooltipModule], template: "<button\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\n [attr.aria-label]=\"uiCopy.launcherLabel\"\n [pTooltip]=\"uiCopy.openTooltip\"\n tooltipPosition=\"left\"\n (click)=\"openPanel()\"\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-times\"\n text\n rounded\n severity=\"secondary\"\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 <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 Details' : 'Show 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 <strong>Parameters</strong>\n <pre>{{ message.formattedParameters }}</pre>\n </div>\n }\n\n @if(intent.api?.url || intent.api?.method) {\n <div class=\"api-call-summary\">\n <strong>API Called</strong>\n <code>{{ intent.api?.method || 'GET' }} {{ intent.api?.url || 'URL not provided' }}</code>\n </div>\n }\n\n @if(message.formattedApiBody) {\n <div class=\"json-block\">\n <strong>API Body</strong>\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 <strong>JSON</strong>\n <pre>{{ message.formattedApiResponse }}</pre>\n </div>\n </section>\n }\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{width:70px!important;height:56px!important;min-height:60px!important;padding:0 5px;border:0!important;border-radius:18px!important;color:inherit!important;background:#d7edff!important;box-shadow:0 0 0 1px #0078c824,0 10px 24px #0f172a24!important;overflow:visible}.assistant-launcher:hover,.assistant-launcher:focus-visible{background:#fff!important;box-shadow:0 0 0 2px #0078c838,0 12px 28px #0f172a29!important}.mascot{position:relative;display:grid;place-items:center;width:64px;height:56px;background:url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"120\" height=\"96\" viewBox=\"14 10 92 82\" role=\"img\" aria-label=\"Max smiling cloud AI mascot\">%0A <defs>%0A <filter id=\"softShadow\" x=\"-15%\" y=\"-15%\" width=\"130%\" height=\"140%\">%0A <feDropShadow dx=\"0\" dy=\"5\" stdDeviation=\"5\" flood-color=\"%230078C8\" flood-opacity=\"0.16\"/>%0A </filter>%0A </defs>%0A%0A <g fill=\"%230078C8\" opacity=\"0.28\">%0A <circle cx=\"34\" cy=\"57\" r=\"24\"/>%0A <circle cx=\"58\" cy=\"39\" r=\"31\"/>%0A <circle cx=\"86\" cy=\"58\" r=\"25\"/>%0A <rect x=\"28\" y=\"55\" width=\"68\" height=\"27\" rx=\"13.5\"/>%0A </g>%0A%0A <g fill=\"%230078C8\" opacity=\"0.68\" filter=\"url(%23softShadow)\">%0A <circle cx=\"35\" cy=\"59\" r=\"20\"/>%0A <circle cx=\"59\" cy=\"43\" r=\"27\"/>%0A <circle cx=\"84\" cy=\"60\" r=\"21\"/>%0A <rect x=\"31\" y=\"57\" width=\"64\" height=\"24\" rx=\"12\"/>%0A </g>%0A%0A <g fill=\"%23FFD54A\">%0A <path d=\"M46 48l3.4 6.8 6.8 3.4-6.8 3.4L46 68.4l-3.4-6.8-6.8-3.4 6.8-3.4z\"/>%0A <path d=\"M74 48l3.4 6.8 6.8 3.4-6.8 3.4-3.4 6.8-3.4-6.8-6.8-3.4 6.8-3.4z\"/>%0A <path d=\"M88 28l2 4 4 2-4 2-2 4-2-4-4-2 4-2z\"/>%0A </g>%0A%0A <path%0A d=\"M49 72c6 7 20 7 26 0\"%0A fill=\"none\"%0A stroke=\"%23FFD54A\"%0A stroke-width=\"4\"%0A stroke-linecap=\"round\"%0A />%0A</svg>%0A') center/contain no-repeat}.mascot.large{width:58px;height:46px}::ng-deep .assistant-drawer{width:min(560px,100vw)!important}::ng-deep .assistant-drawer .p-drawer-content{padding:0}::ng-deep .assistant-drawer .p-drawer-header{display:none}.assistant-panel{display:grid;grid-template-rows:auto 1fr auto;height:100%;min-height:0;background:var(--background-color, #f8fafc)}.assistant-header,.assistant-composer{display:flex;gap:12px;align-items:center;padding:16px;background:#fff;border-bottom:1px solid var(--border-color, #e2e8f0)}.assistant-header h2{margin:0;font-size:20px}.assistant-header span,.sources span{color:#64748b;font-size:12px;font-weight:700}.assistant-header button{margin-left:auto}.assistant-messages{min-height:0;overflow:auto;padding:18px}.message{width:fit-content;max-width:92%;margin-bottom:14px;padding:12px;border:1px solid var(--border-color, #e2e8f0);border-radius:var(--medium-border-radius, 8px);background:#fff;box-shadow:0 6px 18px #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)}.message.error{border-color:var(--danger-color, #dc2626)}.message p{margin:0;line-height:1.45}.assistant-result{color:#1e293b}.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:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.suggestion-chip{border:1px solid rgba(var(--primary-color-rgb, 37, 99, 235),.28);color:var(--primary-dark-color, #1d4ed8);background:rgba(var(--primary-color-rgb, 37, 99, 235),.08);font-weight:700;box-shadow:0 4px 14px #0f172a0f;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.suggestion-chip:hover{border-color:rgba(var(--primary-color-rgb, 37, 99, 235),.42);color:var(--primary-dark-color, #1d4ed8);background:rgba(var(--primary-color-rgb, 37, 99, 235),.14)}.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:800}.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:800;text-transform:uppercase}.detail-grid dd{margin:0;color:#334155;font-size:13px;font-weight:700;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 strong,.json-block strong{color:#64748b;font-size:11px;font-weight:800;text-transform:uppercase}.api-call-summary code{color:var(--secondary-color, #0f172a);font-weight:800;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{border-top:1px solid var(--border-color, #e2e8f0);border-bottom:0}.assistant-composer textarea{flex:1;min-height:46px;max-height:120px;resize:vertical}@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}.assistant-launcher{width:62px!important;min-width:62px!important;height:54px!important;min-height:54px!important}.assistant-messages{padding:14px}.detail-grid{grid-template-columns:1fr}}\n"] }]
|
|
289
|
-
}], propDecorators: { messagesViewport: [{
|
|
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
|
+
}], ctorParameters: () => [{ type: MaxAssistantService }, { type: i0.DestroyRef }], propDecorators: { messagesViewport: [{
|
|
290
417
|
type: ViewChild,
|
|
291
418
|
args: ['messagesViewport']
|
|
292
419
|
}], app: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialSuggestions: string[];\n}\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: 'Hi, I am Max, the Maxtime Virtual Assistant. How can I help you today?',\n initialSuggestions: [\n 'What sessions are scheduled for today?',\n 'Which lecturers have planned leave this week?',\n 'List the students who are on leave today.',\n 'List the students who were absent from sessions yesterday.',\n 'Generate the attendance report for a session conducted yesterday.'\n ]\n },\n nemesys: {\n initialMessage: 'Hi, I am Max, the Maxtime Virtual Assistant. How can I help you today?',\n initialSuggestions: ['Show scheduling plans', 'Check resource availability', 'Find conflicts']\n },\n attendance: {\n initialMessage: 'Hi, I am Max, the Maxtime Virtual Assistant. How can I help you today?',\n initialSuggestions: ['Show attendance summary', 'Find missing attendance', 'View reports']\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { AssistantProduct, AssistantUser } from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { HttpClient } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatRequest,\n AssistantChatResponse,\n AssistantProduct,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_ASSISTANT_CHAT_URL =\n 'https://fhmaof3b4kaxqfbnomfstxyhw40rrcjr.lambda-url.eu-west-2.on.aws/chat';\nconst DEFAULT_APP = 'cortex';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n private readonly config = inject(MAX_ASSISTANT_CONFIG);\n private readonly http = inject(HttpClient, { optional: true });\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...config\n };\n const request: AssistantChatRequest = {\n message,\n conversationId,\n app: this.getApp(assistantConfig),\n user: this.getUser(assistantConfig)\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig\n ): Observable<AssistantChatResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.post<AssistantChatResponse>(this.getChatUrl(config), request);\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || DEFAULT_ASSISTANT_CHAT_URL;\n }\n\n private getApp(config: MaxAssistantConfig): AssistantProduct {\n return config.app || DEFAULT_APP;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n if (typeof config.user === 'function') {\n return config.user();\n }\n\n return config.user ?? {};\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, inject, Input, signal, ViewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { DrawerModule } from 'primeng/drawer';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig\n} from '../../config/assistant-bootstrap.config';\nimport { MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatResponse,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\n AssistantFieldMap,\n AssistantMessage,\n AssistantProduct,\n AssistantUser\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max',\n subtitle: 'Maxtime Virtual Assistant',\n launcherLabel: 'Open Maxtime virtual assistant',\n openTooltip: 'Open Maxtime virtual assistant',\n closeLabel: 'Close Maxtime virtual assistant',\n placeholder: 'Ask Maxtime virtual assistant',\n typingLabel: 'Maxtime virtual assistant is typing',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\n};\n\n@Component({\n selector: 'max-assistant',\n imports: [CommonModule, FormsModule, ButtonModule, DrawerModule, TextareaModule, TooltipModule],\n templateUrl: './max-assistant.component.html',\n styleUrl: './max-assistant.component.scss'\n})\nexport class MaxAssistantComponent {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n @Input() app?: AssistantProduct;\n @Input() assistantApiUrl?: string;\n @Input() user:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>) = {};\n\n protected readonly panelVisible = signal(false);\n protected readonly isSending = signal(false);\n protected readonly input = signal('');\n protected readonly conversationId = signal<string | undefined>(undefined);\n protected readonly messages = signal<AssistantMessage[]>([]);\n protected readonly expandedInferenceMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n\n private readonly assistantService = inject(MaxAssistantService);\n private readonly destroyRef = inject(DestroyRef);\n\n protected openPanel() {\n this.panelVisible.set(true);\n\n if (!this.messages().length && this.bootstrapConfig.initialMessage) {\n this.messages.set([\n this.createMessage(\n 'assistant',\n this.bootstrapConfig.initialMessage,\n this.bootstrapConfig.initialSuggestions\n )\n ]);\n }\n\n this.scrollToLatest();\n }\n\n protected get uiCopy(): typeof ASSISTANT_UI_COPY {\n return ASSISTANT_UI_COPY;\n }\n\n protected get bootstrapConfig(): AssistantBootstrapConfig {\n return getAssistantBootstrapConfig(this.app);\n }\n\n protected closePanel() {\n this.panelVisible.set(false);\n }\n\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\n if (!trimmedMessage || this.isSending()) {\n return;\n }\n\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(trimmedMessage, this.conversationId(), this.getAssistantConfig())\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, trimmedMessage));\n this.isSending.set(false);\n },\n error: () => {\n this.appendMessage({\n ...this.createMessage('assistant', this.uiCopy.errorMessage),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected useSuggestion(suggestion: string) {\n this.sendMessage(suggestion);\n }\n\n protected onComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage();\n }\n }\n\n protected isInferenceDetailsVisible(messageId: string): boolean {\n return this.expandedInferenceMessageIds().has(messageId);\n }\n\n protected toggleInferenceDetails(messageId: string) {\n const willOpen = !this.isInferenceDetailsVisible(messageId);\n\n this.expandedInferenceMessageIds.update(expandedIds => {\n const nextExpandedIds = new Set(expandedIds);\n\n if (nextExpandedIds.has(messageId)) {\n nextExpandedIds.delete(messageId);\n } else {\n nextExpandedIds.add(messageId);\n }\n\n return nextExpandedIds;\n });\n\n if (willOpen) {\n this.scrollToLatest();\n }\n }\n\n private getAssistantConfig(): MaxAssistantConfig {\n return {\n assistantApiUrl: this.assistantApiUrl,\n app: this.app,\n user: this.user\n };\n }\n\n private appendMessage(message: AssistantMessage) {\n this.messages.update(messages => [...messages, message]);\n this.scrollToLatest();\n }\n\n private createAssistantResponseMessage(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantMessage {\n const displayResponse = this.createDisplayResponse(response, userQuery);\n\n return this.createMessage(\n 'assistant',\n displayResponse.agentInferredResponse || response.answer,\n response.suggestions,\n response.sources,\n response.intent,\n response.intentLabel,\n response.app,\n response.productLabel,\n response.apiModule,\n response.confidence,\n response.parameters ?? response.entities,\n response.apiCalls,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: string[] = [],\n sources: AssistantMessage['sources'] = [],\n intent?: string,\n intentLabel?: string,\n app?: string,\n productLabel?: string,\n apiModule?: string,\n confidence?: number,\n parameters?: AssistantFieldMap,\n apiCalls?: AssistantMessage['apiCalls'],\n mockResult?: AssistantFieldMap,\n llmUsed?: boolean,\n availableModules?: string[],\n displayResponse?: AssistantDisplayResponse\n ): AssistantMessage {\n return {\n id: this.createId(),\n role,\n content,\n displayResponse,\n formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),\n formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\n suggestions,\n sources,\n intent,\n intentLabel,\n app,\n productLabel,\n apiModule,\n confidence,\n parameters,\n entities: parameters,\n apiCalls,\n mockResult,\n llmUsed,\n availableModules,\n createdAt: new Date()\n };\n }\n\n private createDisplayResponse(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantDisplayResponse {\n const provided = response.displayResponse ?? {};\n const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);\n\n return {\n userQuery: provided.userQuery || userQuery,\n agentInferredResponse: provided.agentInferredResponse || response.answer,\n agentExtractedIntent: extractedIntent,\n apiResponse: provided.apiResponse ?? this.getApiResponseFallback(response),\n markdown: provided.markdown\n };\n }\n\n private createExtractedIntent(\n response: AssistantChatResponse,\n provided?: AssistantExtractedIntent\n ): AssistantExtractedIntent {\n return {\n project: provided?.project ?? response.productLabel ?? response.app,\n projectKey: provided?.projectKey ?? response.app,\n module: provided?.module ?? response.apiModule,\n intent: provided?.intent ?? response.intent,\n intentLabel: provided?.intentLabel ?? response.intentLabel,\n confidence: provided?.confidence ?? response.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0]\n };\n }\n\n private getApiResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\n return undefined;\n }\n\n return response.mockResult;\n }\n\n private formatJson(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\n }\n\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\n }\n\n private scrollToLatest() {\n setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n });\n }\n}\n","<button\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\n [attr.aria-label]=\"uiCopy.launcherLabel\"\n [pTooltip]=\"uiCopy.openTooltip\"\n tooltipPosition=\"left\"\n (click)=\"openPanel()\"\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-times\"\n text\n rounded\n severity=\"secondary\"\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 <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 Details' : 'Show 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 <strong>Parameters</strong>\n <pre>{{ message.formattedParameters }}</pre>\n </div>\n }\n\n @if(intent.api?.url || intent.api?.method) {\n <div class=\"api-call-summary\">\n <strong>API Called</strong>\n <code>{{ intent.api?.method || 'GET' }} {{ intent.api?.url || 'URL not provided' }}</code>\n </div>\n }\n\n @if(message.formattedApiBody) {\n <div class=\"json-block\">\n <strong>API Body</strong>\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 <strong>JSON</strong>\n <pre>{{ message.formattedApiResponse }}</pre>\n </div>\n </section>\n }\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","/*\n * Public API Surface of max-agent-ui\n */\n\nexport * from './lib/components/assistant/max-assistant.component';\nexport * from './lib/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialSuggestions: string[];\n}\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: [\n 'What sessions are scheduled for today?',\n 'Which lecturers have planned leave this week?',\n 'List the students who are on leave today.',\n 'List the students who were absent yesterday.',\n 'Generate the attendance report for a session conducted yesterday.'\n ]\n },\n nemesys: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: ['Show scheduling plans', 'Check resource availability', 'Find conflicts']\n },\n attendance: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: ['Show attendance summary', 'Find missing attendance', 'View reports']\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { AssistantProduct, AssistantUser } from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatRequest,\n AssistantChatResponse,\n AssistantProduct,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_ASSISTANT_CHAT_URL =\n 'https://fhmaof3b4kaxqfbnomfstxyhw40rrcjr.lambda-url.eu-west-2.on.aws/chat';\nconst DEFAULT_APP = 'cortex';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n conversationId,\n app: this.getApp(assistantConfig),\n user: this.getUser(assistantConfig)\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig\n ): Observable<AssistantChatResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.post<AssistantChatResponse>(this.getChatUrl(config), request).pipe(\n tap(response => console.log('[Max Agent UI] agent-service response', response))\n );\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || DEFAULT_ASSISTANT_CHAT_URL;\n }\n\n private getApp(config: MaxAssistantConfig): AssistantProduct {\n return config.app || DEFAULT_APP;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n if (typeof config.user === 'function') {\n return config.user();\n }\n\n return config.user ?? {};\n }\n\n private compactConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n return Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined)\n ) as MaxAssistantConfig;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, Input, signal, ViewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { DrawerModule } from 'primeng/drawer';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig\n} from '../../config/assistant-bootstrap.config';\nimport { MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatResponse,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantMessage,\n AssistantProduct,\n AssistantResponseTable,\n AssistantUser\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max',\n subtitle: 'Maxtime Virtual Assistant',\n launcherLabel: 'Open Maxtime virtual assistant',\n openTooltip: 'Open Maxtime virtual assistant',\n closeLabel: 'Close Maxtime virtual assistant',\n clearLabel: 'Clear chat session',\n clearTooltip: 'Clear chat session',\n placeholder: 'Ask Maxtime virtual assistant',\n typingLabel: 'Maxtime virtual assistant is typing',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\n};\n\n@Component({\n selector: 'max-assistant',\n imports: [CommonModule, FormsModule, ButtonModule, DrawerModule, TextareaModule, TooltipModule],\n templateUrl: './max-assistant.component.html',\n styleUrl: './max-assistant.component.scss'\n})\nexport class MaxAssistantComponent {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n @Input() app?: AssistantProduct;\n @Input() assistantApiUrl?: string;\n @Input() user:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>) = {};\n\n protected readonly panelVisible = signal(false);\n protected readonly isSending = signal(false);\n protected readonly input = signal('');\n protected readonly conversationId = signal<string | undefined>(undefined);\n protected readonly messages = signal<AssistantMessage[]>([]);\n protected readonly expandedInferenceMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly destroyRef: DestroyRef\n ) {}\n\n protected openPanel() {\n this.panelVisible.set(true);\n\n if (!this.messages().length) {\n this.messages.set(this.createDefaultMessages());\n }\n\n this.scrollToLatest();\n }\n\n protected togglePanel() {\n if (this.panelVisible()) {\n this.closePanel();\n return;\n }\n\n this.openPanel();\n }\n\n protected get launcherLabel(): string {\n return this.panelVisible() ? this.uiCopy.closeLabel : this.uiCopy.launcherLabel;\n }\n\n protected get uiCopy(): typeof ASSISTANT_UI_COPY {\n return ASSISTANT_UI_COPY;\n }\n\n protected get bootstrapConfig(): AssistantBootstrapConfig {\n return getAssistantBootstrapConfig(this.app);\n }\n\n protected closePanel() {\n this.panelVisible.set(false);\n }\n\n protected clearChatSession() {\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedInferenceMessageIds.set(new Set<string>());\n this.messages.set(this.createDefaultMessages());\n this.scrollToLatest();\n }\n\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\n if (!trimmedMessage || this.isSending()) {\n return;\n }\n\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(trimmedMessage, this.conversationId(), this.getAssistantConfig())\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, trimmedMessage));\n this.isSending.set(false);\n },\n error: () => {\n this.appendMessage({\n ...this.createMessage('assistant', this.uiCopy.errorMessage),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected useSuggestion(suggestion: string) {\n this.sendMessage(suggestion);\n }\n\n protected onComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage();\n }\n }\n\n protected isInferenceDetailsVisible(messageId: string): boolean {\n return this.expandedInferenceMessageIds().has(messageId);\n }\n\n protected toggleInferenceDetails(messageId: string) {\n const willOpen = !this.isInferenceDetailsVisible(messageId);\n\n this.expandedInferenceMessageIds.update(expandedIds => {\n const nextExpandedIds = new Set(expandedIds);\n\n if (nextExpandedIds.has(messageId)) {\n nextExpandedIds.delete(messageId);\n } else {\n nextExpandedIds.add(messageId);\n }\n\n return nextExpandedIds;\n });\n\n if (willOpen) {\n this.scrollToLatest();\n }\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n private getAssistantConfig(): MaxAssistantConfig {\n const config: MaxAssistantConfig = {};\n\n if (this.assistantApiUrl) {\n config.assistantApiUrl = this.assistantApiUrl;\n }\n\n if (this.app) {\n config.app = this.app;\n }\n\n if (this.user) {\n config.user = this.user;\n }\n\n return config;\n }\n\n private appendMessage(message: AssistantMessage) {\n this.messages.update(messages => [...messages, message]);\n this.scrollToLatest();\n }\n\n private createDefaultMessages(): AssistantMessage[] {\n if (!this.bootstrapConfig.initialMessage) {\n return [];\n }\n\n return [\n this.createMessage(\n 'assistant',\n this.bootstrapConfig.initialMessage,\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private createAssistantResponseMessage(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantMessage {\n const displayResponse = this.createDisplayResponse(response, userQuery);\n\n return this.createMessage(\n 'assistant',\n displayResponse.agentInferredResponse || response.answer,\n response.suggestions,\n response.sources,\n response.intent,\n response.intentLabel,\n response.app,\n response.productLabel,\n response.apiModule,\n response.confidence,\n response.parameters ?? response.entities,\n response.apiCalls,\n response.apiResult,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: string[] = [],\n sources: AssistantMessage['sources'] = [],\n intent?: string,\n intentLabel?: string,\n app?: string,\n productLabel?: string,\n apiModule?: string,\n confidence?: number,\n parameters?: AssistantFieldMap,\n apiCalls?: AssistantMessage['apiCalls'],\n apiResult?: AssistantFieldMap,\n mockResult?: AssistantFieldMap,\n llmUsed?: boolean,\n availableModules?: string[],\n displayResponse?: AssistantDisplayResponse\n ): AssistantMessage {\n return {\n id: this.createId(),\n role,\n content,\n displayResponse,\n formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),\n formattedApiHeaders: this.formatJson(displayResponse?.agentExtractedIntent?.api?.headers),\n formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\n formattedSampleJsonResponse: this.formatJson(displayResponse?.sampleJsonResponse),\n suggestions,\n sources,\n intent,\n intentLabel,\n app,\n productLabel,\n apiModule,\n confidence,\n parameters,\n entities: parameters,\n apiCalls,\n apiResult,\n mockResult,\n llmUsed,\n availableModules,\n createdAt: new Date()\n };\n }\n\n private createDisplayResponse(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantDisplayResponse {\n const provided = response.displayResponse ?? {};\n const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);\n const grid = this.getDisplayTables(provided, response);\n\n return {\n userQuery: provided.userQuery || userQuery,\n agentInferredResponse: provided.agentInferredResponse || response.answer,\n agentExtractedIntent: extractedIntent,\n apiResponse: provided.apiResponse ?? response.apiResult,\n sampleJsonResponse: provided.sampleJsonResponse ?? this.getSampleJsonResponseFallback(response),\n grid,\n tables: grid,\n markdown: provided.markdown\n };\n }\n\n private createExtractedIntent(\n response: AssistantChatResponse,\n provided?: AssistantExtractedIntent\n ): AssistantExtractedIntent {\n return {\n project: provided?.project ?? response.productLabel ?? response.app,\n projectKey: provided?.projectKey ?? response.app,\n module: provided?.module ?? response.apiModule,\n intent: provided?.intent ?? response.intent,\n intentLabel: provided?.intentLabel ?? response.intentLabel,\n confidence: provided?.confidence ?? response.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0]\n };\n }\n\n private getSampleJsonResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\n return undefined;\n }\n\n return response.mockResult;\n }\n\n private getDisplayTables(\n provided: AssistantDisplayResponse,\n response: AssistantChatResponse\n ): AssistantResponseTable[] {\n if (provided.grid?.length) {\n return provided.grid;\n }\n\n if (provided.tables?.length) {\n return provided.tables;\n }\n\n const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);\n\n if (!rows.length) {\n return [];\n }\n\n const columns = this.getTableColumns(rows);\n\n return [\n {\n title: 'API Response',\n columns,\n rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))\n }\n ];\n }\n\n private extractTableRows(value: unknown): AssistantFieldMap[] {\n if (Array.isArray(value)) {\n return value.filter(this.isFieldMap);\n }\n\n if (!this.isFieldMap(value)) {\n return [];\n }\n\n const body = value['body'];\n\n if (Array.isArray(body)) {\n return body.filter(this.isFieldMap);\n }\n\n const items = value['items'];\n\n if (Array.isArray(items)) {\n return items.filter(this.isFieldMap);\n }\n\n return [];\n }\n\n private getTableColumns(rows: AssistantFieldMap[]): AssistantResponseTable['columns'] {\n const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);\n\n return fields.map(field => ({\n field,\n header: this.toColumnHeader(field)\n }));\n }\n\n private formatTableRow(row: AssistantFieldMap, fields: string[]): AssistantFieldMap {\n return Object.fromEntries(\n fields.map(field => [field, this.formatCellValue(row[field])])\n ) as AssistantFieldMap;\n }\n\n private formatCellValue(value: AssistantFieldValue | undefined): AssistantFieldValue {\n if (Array.isArray(value)) {\n return value.map(item => this.formatCellValue(item)).join(', ');\n }\n\n if (this.isFieldMap(value)) {\n return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);\n }\n\n return value ?? '';\n }\n\n private toColumnHeader(field: string): string {\n return field\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n private formatJson(value: unknown): string | undefined {\n if (value === undefined || this.isEmptyObject(value)) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\n }\n\n private isEmptyObject(value: unknown): boolean {\n return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;\n }\n\n private isFieldMap(value: unknown): value is AssistantFieldMap {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\n }\n\n private scrollToLatest() {\n setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n });\n }\n}\n","<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","/*\n * Public API Surface of max-agent-ui\n */\n\nexport * from './lib/components/assistant/max-assistant.component';\nexport * from './lib/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MaxAssistantService"],"mappings":"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"}
|
package/package.json
CHANGED
package/types/max-agent-ui.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
|
-
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { InjectionToken, DestroyRef } from '@angular/core';
|
|
3
|
+
import { HttpClient } from '@angular/common/http';
|
|
4
|
+
import { Observable } from 'rxjs';
|
|
3
5
|
|
|
4
6
|
type AssistantProduct = string;
|
|
5
7
|
type AssistantFieldValue = string | number | boolean | null | AssistantFieldValue[] | {
|
|
@@ -16,6 +18,7 @@ interface AssistantApiCall {
|
|
|
16
18
|
method: string;
|
|
17
19
|
url: string;
|
|
18
20
|
purpose?: string;
|
|
21
|
+
headers?: AssistantFieldMap;
|
|
19
22
|
params?: AssistantFieldMap;
|
|
20
23
|
body?: AssistantFieldMap;
|
|
21
24
|
}
|
|
@@ -34,11 +37,24 @@ interface AssistantDisplayResponse {
|
|
|
34
37
|
userQuery?: string;
|
|
35
38
|
agentExtractedIntent?: AssistantExtractedIntent;
|
|
36
39
|
apiResponse?: AssistantFieldValue | AssistantFieldMap;
|
|
40
|
+
sampleJsonResponse?: AssistantFieldValue | AssistantFieldMap;
|
|
41
|
+
grid?: AssistantResponseTable[];
|
|
42
|
+
tables?: AssistantResponseTable[];
|
|
37
43
|
markdown?: string;
|
|
38
44
|
}
|
|
45
|
+
interface AssistantResponseTableColumn {
|
|
46
|
+
field: string;
|
|
47
|
+
header: string;
|
|
48
|
+
}
|
|
49
|
+
interface AssistantResponseTable {
|
|
50
|
+
title?: string;
|
|
51
|
+
columns: AssistantResponseTableColumn[];
|
|
52
|
+
rows: AssistantFieldMap[];
|
|
53
|
+
}
|
|
39
54
|
interface AssistantUser {
|
|
40
55
|
[key: string]: AssistantFieldValue | undefined;
|
|
41
56
|
token?: string;
|
|
57
|
+
version?: string;
|
|
42
58
|
}
|
|
43
59
|
interface AssistantChatRequest {
|
|
44
60
|
message: string;
|
|
@@ -61,6 +77,7 @@ interface AssistantChatResponse {
|
|
|
61
77
|
parameters?: AssistantFieldMap;
|
|
62
78
|
entities?: AssistantFieldMap;
|
|
63
79
|
apiCalls?: AssistantApiCall[];
|
|
80
|
+
apiResult?: AssistantFieldMap;
|
|
64
81
|
mockResult?: AssistantFieldMap;
|
|
65
82
|
llmUsed?: boolean;
|
|
66
83
|
availableModules?: string[];
|
|
@@ -73,8 +90,10 @@ interface AssistantMessage {
|
|
|
73
90
|
createdAt: Date;
|
|
74
91
|
displayResponse?: AssistantDisplayResponse;
|
|
75
92
|
formattedParameters?: string;
|
|
93
|
+
formattedApiHeaders?: string;
|
|
76
94
|
formattedApiBody?: string;
|
|
77
95
|
formattedApiResponse?: string;
|
|
96
|
+
formattedSampleJsonResponse?: string;
|
|
78
97
|
suggestions?: string[];
|
|
79
98
|
sources?: AssistantSource[];
|
|
80
99
|
intent?: string;
|
|
@@ -86,6 +105,7 @@ interface AssistantMessage {
|
|
|
86
105
|
parameters?: AssistantFieldMap;
|
|
87
106
|
entities?: AssistantFieldMap;
|
|
88
107
|
apiCalls?: AssistantApiCall[];
|
|
108
|
+
apiResult?: AssistantFieldMap;
|
|
89
109
|
mockResult?: AssistantFieldMap;
|
|
90
110
|
llmUsed?: boolean;
|
|
91
111
|
availableModules?: string[];
|
|
@@ -97,17 +117,42 @@ interface AssistantBootstrapConfig {
|
|
|
97
117
|
initialSuggestions: string[];
|
|
98
118
|
}
|
|
99
119
|
|
|
120
|
+
interface MaxAssistantConfig {
|
|
121
|
+
assistantApiUrl?: string;
|
|
122
|
+
app?: AssistantProduct;
|
|
123
|
+
user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);
|
|
124
|
+
}
|
|
125
|
+
declare const MAX_ASSISTANT_CONFIG: InjectionToken<MaxAssistantConfig>;
|
|
126
|
+
|
|
127
|
+
declare class MaxAssistantService {
|
|
128
|
+
private readonly config;
|
|
129
|
+
private readonly http;
|
|
130
|
+
constructor(config: MaxAssistantConfig, http: HttpClient | null);
|
|
131
|
+
sendMessage(message: string, conversationId?: string, config?: MaxAssistantConfig): Observable<AssistantChatResponse>;
|
|
132
|
+
private postMessage;
|
|
133
|
+
private getChatUrl;
|
|
134
|
+
private getApp;
|
|
135
|
+
private getUser;
|
|
136
|
+
private compactConfig;
|
|
137
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MaxAssistantService, [null, { optional: true; }]>;
|
|
138
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<MaxAssistantService>;
|
|
139
|
+
}
|
|
140
|
+
|
|
100
141
|
declare const ASSISTANT_UI_COPY: {
|
|
101
142
|
title: string;
|
|
102
143
|
subtitle: string;
|
|
103
144
|
launcherLabel: string;
|
|
104
145
|
openTooltip: string;
|
|
105
146
|
closeLabel: string;
|
|
147
|
+
clearLabel: string;
|
|
148
|
+
clearTooltip: string;
|
|
106
149
|
placeholder: string;
|
|
107
150
|
typingLabel: string;
|
|
108
151
|
errorMessage: string;
|
|
109
152
|
};
|
|
110
153
|
declare class MaxAssistantComponent {
|
|
154
|
+
private readonly assistantService;
|
|
155
|
+
private readonly destroyRef;
|
|
111
156
|
private messagesViewport?;
|
|
112
157
|
app?: AssistantProduct;
|
|
113
158
|
assistantApiUrl?: string;
|
|
@@ -118,37 +163,42 @@ declare class MaxAssistantComponent {
|
|
|
118
163
|
protected readonly conversationId: _angular_core.WritableSignal<string | undefined>;
|
|
119
164
|
protected readonly messages: _angular_core.WritableSignal<AssistantMessage[]>;
|
|
120
165
|
protected readonly expandedInferenceMessageIds: _angular_core.WritableSignal<ReadonlySet<string>>;
|
|
121
|
-
|
|
122
|
-
private readonly destroyRef;
|
|
166
|
+
constructor(assistantService: MaxAssistantService, destroyRef: DestroyRef);
|
|
123
167
|
protected openPanel(): void;
|
|
168
|
+
protected togglePanel(): void;
|
|
169
|
+
protected get launcherLabel(): string;
|
|
124
170
|
protected get uiCopy(): typeof ASSISTANT_UI_COPY;
|
|
125
171
|
protected get bootstrapConfig(): AssistantBootstrapConfig;
|
|
126
172
|
protected closePanel(): void;
|
|
173
|
+
protected clearChatSession(): void;
|
|
127
174
|
protected sendMessage(message?: string): void;
|
|
128
175
|
protected useSuggestion(suggestion: string): void;
|
|
129
176
|
protected onComposerKeydown(event: KeyboardEvent): void;
|
|
130
177
|
protected isInferenceDetailsVisible(messageId: string): boolean;
|
|
131
178
|
protected toggleInferenceDetails(messageId: string): void;
|
|
179
|
+
protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[];
|
|
132
180
|
private getAssistantConfig;
|
|
133
181
|
private appendMessage;
|
|
182
|
+
private createDefaultMessages;
|
|
134
183
|
private createAssistantResponseMessage;
|
|
135
184
|
private createMessage;
|
|
136
185
|
private createDisplayResponse;
|
|
137
186
|
private createExtractedIntent;
|
|
138
|
-
private
|
|
187
|
+
private getSampleJsonResponseFallback;
|
|
188
|
+
private getDisplayTables;
|
|
189
|
+
private extractTableRows;
|
|
190
|
+
private getTableColumns;
|
|
191
|
+
private formatTableRow;
|
|
192
|
+
private formatCellValue;
|
|
193
|
+
private toColumnHeader;
|
|
139
194
|
private formatJson;
|
|
195
|
+
private isEmptyObject;
|
|
196
|
+
private isFieldMap;
|
|
140
197
|
private createId;
|
|
141
198
|
private scrollToLatest;
|
|
142
199
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<MaxAssistantComponent, never>;
|
|
143
200
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<MaxAssistantComponent, "max-assistant", never, { "app": { "alias": "app"; "required": false; }; "assistantApiUrl": { "alias": "assistantApiUrl"; "required": false; }; "user": { "alias": "user"; "required": false; }; }, {}, never, never, true, never>;
|
|
144
201
|
}
|
|
145
202
|
|
|
146
|
-
interface MaxAssistantConfig {
|
|
147
|
-
assistantApiUrl?: string;
|
|
148
|
-
app?: AssistantProduct;
|
|
149
|
-
user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);
|
|
150
|
-
}
|
|
151
|
-
declare const MAX_ASSISTANT_CONFIG: InjectionToken<MaxAssistantConfig>;
|
|
152
|
-
|
|
153
203
|
export { MAX_ASSISTANT_CONFIG, MaxAssistantComponent };
|
|
154
|
-
export type { AssistantApiCall, AssistantChatRequest, AssistantChatResponse, AssistantDisplayResponse, AssistantExtractedIntent, AssistantFieldMap, AssistantFieldValue, AssistantMessage, AssistantProduct, AssistantSource, AssistantUser, MaxAssistantConfig };
|
|
204
|
+
export type { AssistantApiCall, AssistantChatRequest, AssistantChatResponse, AssistantDisplayResponse, AssistantExtractedIntent, AssistantFieldMap, AssistantFieldValue, AssistantMessage, AssistantProduct, AssistantResponseTable, AssistantResponseTableColumn, AssistantSource, AssistantUser, MaxAssistantConfig };
|