max-agent-ui 0.0.21 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -66,28 +66,27 @@ projected into the chat header:
66
66
  </max-assistant>
67
67
  ```
68
68
 
69
- For authenticated host applications, provide shared configuration once. The
70
- current token and API version are sent as headers, while role, permissions,
71
- route, and timezone are sent as request context:
69
+ For authenticated host applications, provide shared configuration once. The
70
+ current token and API version are sent as the standard `x-auth-token` and
71
+ `x-version` headers. Display identity is sent separately in the request body,
72
+ and the agent retrieves current permissions directly from the calling product
73
+ API:
72
74
 
73
75
  ```ts
74
76
  providers: [
75
77
  {
76
78
  provide: MAX_ASSISTANT_CONFIG,
77
- useFactory: (session: SessionService, router: Router) => ({
79
+ useFactory: (session: SessionService) => ({
78
80
  app: 'cortex',
79
- user: () => ({
80
- token: session.authToken(),
81
+ user: () => ({
82
+ name: session.name(),
83
+ username: session.username(),
84
+ email: session.email(),
85
+ token: session.authToken(),
81
86
  version: session.apiVersion()
82
- }),
83
- context: () => ({
84
- role: session.role(),
85
- permissions: session.agentPermissions(),
86
- route: router.url,
87
- timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
88
- })
89
- }),
90
- deps: [SessionService, Router]
87
+ })
88
+ }),
89
+ deps: [SessionService]
91
90
  }
92
91
  ]
93
92
  ```
@@ -114,22 +113,22 @@ assistant.sendStructuredAction(
114
113
  The agent still validates the capability and permissions in Supabase, performs
115
114
  live preflight reads, and returns the normal Approve/Reject proposal.
116
115
 
117
- For another product, supply product-specific authentication headers through
118
- `requestHeaders`. Cortex's existing `user.token` and `user.version` shortcuts
119
- remain supported:
120
-
121
- ```ts
122
- requestHeaders: () => ({
123
- 'x-nemesys-auth-token': session.nemesysToken()
124
- })
125
- ```
116
+ For Cortex and Nemesys, provide `user.token` and `user.version`; the library
117
+ uses the same standard API headers for both products. Use `requestHeaders` only
118
+ for additional custom headers:
119
+
120
+ ```ts
121
+ requestHeaders: () => ({
122
+ 'x-correlation-id': session.correlationId()
123
+ })
124
+ ```
126
125
 
127
126
  Host apps should provide Angular `HttpClient` for real API calls and include their PrimeNG theme and PrimeIcons styles.
128
127
 
129
128
  For local integration, install the generated tarball and peer UI dependencies in the consuming app:
130
129
 
131
130
  ```bash
132
- npm install C:/Users/Dev100/Documents/Maxtime/Projects/maxtime-ui-library/dist/max-agent-ui/max-agent-ui-0.0.30.tgz primeng primeicons @angular/cdk
131
+ npm install C:/Users/Dev100/Documents/Maxtime/Projects/maxtime-ui-library/dist/max-agent-ui/max-agent-ui-0.0.33.tgz primeng primeicons @angular/cdk
133
132
  ```
134
133
 
135
134
  ### Publishing the Library
@@ -146,7 +145,7 @@ Publish the generated tarball after logging in to npm:
146
145
 
147
146
  ```bash
148
147
  npm login
149
- npm publish max-agent-ui-0.0.30.tgz
148
+ npm publish max-agent-ui-0.0.33.tgz
150
149
  ```
151
150
 
152
151
  ## Running unit tests
@@ -162,17 +162,17 @@ class MaxAssistantService {
162
162
  this.http = http;
163
163
  }
164
164
  sendMessage(message, conversationId, config = {}, confirmation, history = [], onProgress) {
165
- const assistantConfig = {
166
- ...this.config,
167
- ...this.compactConfig(config)
168
- };
165
+ const assistantConfig = this.mergeConfig(config);
166
+ const context = this.getContext(assistantConfig);
167
+ const user = this.getRequestUser(assistantConfig);
169
168
  const request = {
170
169
  message,
171
170
  ...(onProgress ? { stream: true } : {}),
172
171
  conversationId,
173
172
  history,
174
173
  app: this.getApp(assistantConfig),
175
- context: this.getContext(assistantConfig),
174
+ ...(user ? { user } : {}),
175
+ ...(context ? { context } : {}),
176
176
  ...(confirmation ? { confirmation } : {})
177
177
  };
178
178
  return this.postMessage(request, assistantConfig, onProgress);
@@ -181,16 +181,16 @@ class MaxAssistantService {
181
181
  return this.sendMessage(decision === 'approve' ? 'Approve action' : 'Reject action', conversationId, config, { actionId, decision }, history);
182
182
  }
183
183
  sendStructuredAction(message, action, conversationId, config = {}, history = []) {
184
- const assistantConfig = {
185
- ...this.config,
186
- ...this.compactConfig(config)
187
- };
184
+ const assistantConfig = this.mergeConfig(config);
185
+ const context = this.getContext(assistantConfig);
186
+ const user = this.getRequestUser(assistantConfig);
188
187
  const request = {
189
188
  message,
190
189
  conversationId,
191
190
  history,
192
191
  app: this.getApp(assistantConfig),
193
- context: this.getContext(assistantConfig),
192
+ ...(user ? { user } : {}),
193
+ ...(context ? { context } : {}),
194
194
  structuredAction: action
195
195
  };
196
196
  return this.postMessage(request, assistantConfig);
@@ -283,10 +283,28 @@ class MaxAssistantService {
283
283
  }
284
284
  return config.user ?? {};
285
285
  }
286
+ getRequestUser(config) {
287
+ const configuredUser = this.getUser(config);
288
+ const user = {
289
+ ...this.getOptionalText('name', configuredUser.name),
290
+ ...this.getOptionalText('username', configuredUser.username),
291
+ ...this.getOptionalText('email', configuredUser.email)
292
+ };
293
+ return Object.keys(user).length > 0 ? user : undefined;
294
+ }
295
+ getOptionalText(key, value) {
296
+ if (typeof value !== 'string' || !value.trim()) {
297
+ return {};
298
+ }
299
+ return { [key]: value.trim() };
300
+ }
286
301
  getContext(config) {
287
302
  const configured = typeof config.context === 'function'
288
303
  ? config.context()
289
- : config.context ?? {};
304
+ : config.context;
305
+ if (!configured) {
306
+ return undefined;
307
+ }
290
308
  return {
291
309
  permissions: configured.permissions ?? [],
292
310
  timezone: configured.timezone
@@ -316,16 +334,32 @@ class MaxAssistantService {
316
334
  }
317
335
  }
318
336
  if (user.token) {
319
- headers = headers.set('x-cortex-auth-token', String(user.token));
337
+ headers = headers.set('x-auth-token', String(user.token));
320
338
  }
321
339
  if (user.version) {
322
- headers = headers.set('x-cortex-version', String(user.version));
340
+ headers = headers.set('x-version', String(user.version));
323
341
  }
324
342
  return headers;
325
343
  }
326
344
  compactConfig(config) {
327
345
  return Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined));
328
346
  }
347
+ mergeConfig(config) {
348
+ const merged = {
349
+ ...this.config,
350
+ ...this.compactConfig(config)
351
+ };
352
+ if (config.user === undefined) {
353
+ return merged;
354
+ }
355
+ return {
356
+ ...merged,
357
+ user: {
358
+ ...this.getUser(this.config),
359
+ ...this.getUser(config)
360
+ }
361
+ };
362
+ }
329
363
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantService, deps: [{ token: MAX_ASSISTANT_CONFIG }, { token: i1.HttpClient, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
330
364
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MaxAssistantService, providedIn: 'root' });
331
365
  }
@@ -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-markdown.pipe.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.html","../../../projects/max-agent-ui/src/lib/config/assistant-endpoint.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-feedback.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-support.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 initialDescription?: string;\n initialSuggestions: string[];\n}\nconst INITIAL_MESSAGE = 'Hi! 👋';\nconst INITIAL_DESCRIPTION =\n \"I'm here to help. Whether you need information, want to complete a task, or just have a question, let me know and we'll get started.\\n\\nI'm still in my early days and learning every day. If I can't do something just yet, I hope you'll bear with me—I'll always do my best to help.\\n\\nWhat would you like to do today?\";\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: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n nemesys: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n attendance: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\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 {\n AssistantProduct,\n AssistantRequestContext,\n AssistantUser\n} from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n context?: Partial<AssistantRequestContext> | (() => Partial<AssistantRequestContext>);\n requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { marked } from 'marked';\n\n@Pipe({\n name: 'maxAssistantMarkdown',\n standalone: true,\n pure: true\n})\nexport class MaxAssistantMarkdownPipe implements PipeTransform {\n transform(value: string | null | undefined): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n\n return marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { AssistantShiftCard } from '../../models/assistant.models';\n\nexport type MaxAgentShiftCardVariant = 'definition' | 'rota';\n\n@Component({\n selector: 'max-agent-shift-card',\n templateUrl: './max-agent-shift-card.component.html',\n styleUrl: './max-agent-shift-card.component.scss'\n})\nexport class MaxAgentShiftCardComponent {\n @Input({ required: true }) shift!: AssistantShiftCard;\n @Input() variant: MaxAgentShiftCardVariant = 'rota';\n\n protected get accentColor(): string {\n const color = this.shift.color?.trim();\n if (!color) {\n return '#64748b';\n }\n return /^(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color)\n ? `#${color}`\n : color;\n }\n\n protected get timeLabel(): string {\n const formatter = this.variant === 'rota'\n ? this.formatTimeToAmPm\n : this.formatTime;\n const start = formatter(this.shift.startTime);\n const end = formatter(this.shift.endTime);\n return start && end ? `${start} - ${end}` : start || end || 'All day';\n }\n\n protected get departmentLabel(): string {\n const count = this.shift.departments?.length ?? 0;\n return count\n ? `${count} department${count === 1 ? '' : 's'}`\n : 'All departments';\n }\n\n protected get taskLabel(): string {\n const count = this.shift.taskCount ?? 0;\n return `${count} task${count === 1 ? '' : 's'}`;\n }\n\n private formatTime(value: string): string {\n return value.match(/^\\d{2}:\\d{2}/)?.[0] ?? value;\n }\n\n private formatTimeToAmPm(value: string): string {\n const match = value.match(/^(\\d{1,2}):(\\d{2})/);\n if (!match) {\n return value;\n }\n const hour = Number(match[1]);\n const displayHour = ((hour + 11) % 12) + 1;\n return `${displayHour}.${match[2]} ${hour >= 12 ? 'PM' : 'AM'}`;\n }\n}\n","<article\n class=\"max-agent-shift-card\"\n [class.definition-card]=\"variant === 'definition'\"\n [class.rota-card]=\"variant === 'rota'\"\n [style.--max-agent-shift-accent]=\"accentColor\"\n [attr.aria-label]=\"(shift.description || shift.code || 'Shift') + ', ' + timeLabel\"\n>\n <header>\n <strong>{{ timeLabel }}</strong>\n @if(variant === 'definition' && shift.days) {\n <span>{{ shift.days }}</span>\n }\n </header>\n\n @if(variant === 'definition') {\n @if(shift.code) {\n <p><i class=\"pi pi-tag\" aria-hidden=\"true\"></i><span>{{ shift.code }}</span></p>\n }\n @if(shift.description) {\n <p><i class=\"pi pi-align-left\" aria-hidden=\"true\"></i><span>{{ shift.description }}</span></p>\n }\n <p><i class=\"pi pi-building\" aria-hidden=\"true\"></i><span>{{ departmentLabel }}</span></p>\n @if((shift.taskCount ?? 0) > 0) {\n <p><i class=\"pi pi-check-square\" aria-hidden=\"true\"></i><span>{{ taskLabel }}</span></p>\n }\n } @else {\n @if(shift.location) {\n <p><i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i><span>{{ shift.location }}</span></p>\n }\n @if(shift.role) {\n <p><i class=\"pi pi-user\" aria-hidden=\"true\"></i><span>{{ shift.role }}</span></p>\n }\n }\n</article>\n","import { isDevMode } from '@angular/core';\n\nexport const ASSISTANT_CHAT_ENDPOINTS = {\n development: '/agent-api/v1/chat',\n production: 'https://agent.maxtime.cloud/v1/chat'\n} as const;\n\nexport function getDefaultAssistantChatUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_CHAT_ENDPOINTS.development\n : ASSISTANT_CHAT_ENDPOINTS.production;\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport { getDefaultAssistantChatUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantChatRequest,\n AssistantChatProgress,\n AssistantChatResponse,\n AssistantChatStreamEvent,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantStructuredAction,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_APP = 'cortex';\nconst DEFAULT_TIMEZONE = 'UTC';\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 confirmation?: AssistantConfirmation,\n history: AssistantConversationMessage[] = [],\n onProgress?: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n ...(onProgress ? { stream: true } : {}),\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n context: this.getContext(assistantConfig),\n ...(confirmation ? { confirmation } : {})\n };\n\n return this.postMessage(request, assistantConfig, onProgress);\n }\n\n confirmAction(\n actionId: number,\n decision: AssistantConfirmation['decision'],\n conversationId: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n return this.sendMessage(\n decision === 'approve' ? 'Approve action' : 'Reject action',\n conversationId,\n config,\n { actionId, decision },\n history\n );\n }\n\n sendStructuredAction(\n message: string,\n action: AssistantStructuredAction,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n context: this.getContext(assistantConfig),\n structuredAction: action\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress?: (progress: AssistantChatProgress) => void\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 if (onProgress) {\n return this.streamMessage(request, config, onProgress);\n }\n\n return this.http.post<AssistantChatResponse>(\n this.getChatUrl(config),\n request,\n { headers: this.getHeaders(config) }\n );\n }\n\n private streamMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n return new Observable(subscriber => {\n const controller = new AbortController();\n const headers = this.getHeaders(config);\n const fetchHeaders = Object.fromEntries(\n headers.keys().map(name => [name, headers.get(name) ?? ''])\n );\n\n void fetch(this.getChatUrl(config), {\n method: 'POST',\n headers: fetchHeaders,\n body: JSON.stringify(request),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const error = await response.json().catch(() => undefined);\n throw new HttpErrorResponse({\n error,\n status: response.status,\n statusText: response.statusText,\n url: response.url\n });\n }\n\n if (!response.body) {\n throw new Error('The assistant response stream was unavailable.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let receivedResult = false;\n\n const processLine = (line: string) => {\n const trimmedLine = line.trim();\n if (!trimmedLine) {\n return;\n }\n\n const event = JSON.parse(trimmedLine) as AssistantChatStreamEvent;\n if (event.type === 'progress') {\n onProgress(event);\n return;\n }\n if (event.type === 'error') {\n throw new Error(event.message);\n }\n\n receivedResult = true;\n subscriber.next(event.response);\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n lines.forEach(processLine);\n }\n\n buffer += decoder.decode();\n processLine(buffer);\n\n if (!receivedResult) {\n throw new Error('The assistant response stream ended before a result was returned.');\n }\n\n subscriber.complete();\n }).catch(error => {\n if (!subscriber.closed && error?.name !== 'AbortError') {\n subscriber.error(error);\n }\n });\n\n return () => controller.abort();\n });\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || getDefaultAssistantChatUrl();\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 getContext(config: MaxAssistantConfig): AssistantRequestContext {\n const configured = typeof config.context === 'function'\n ? config.context()\n : config.context ?? {};\n\n return {\n permissions: configured.permissions ?? [],\n timezone: configured.timezone\n ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n ?? DEFAULT_TIMEZONE,\n ...(configured.tenantId ? { tenantId: configured.tenantId } : {}),\n ...(configured.organisationId\n ? { organisationId: configured.organisationId }\n : {}),\n ...(configured.userId ? { userId: configured.userId } : {}),\n ...(configured.role ? { role: configured.role } : {}),\n ...(configured.route ? { route: configured.route } : {}),\n ...(configured.module ? { module: configured.module } : {})\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n\n if (trimmedName && trimmedValue) {\n headers = headers.set(trimmedName, trimmedValue);\n }\n }\n\n if (user.token) {\n headers = headers.set('x-cortex-auth-token', String(user.token));\n }\n\n if (user.version) {\n headers = headers.set('x-cortex-version', String(user.version));\n }\n\n return headers;\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 { Injectable } from '@angular/core';\nimport { Observable, delay, of } from 'rxjs';\n\nimport {\n AssistantFeedbackRequest,\n AssistantFeedbackResponse\n} from '../../models/assistant.models';\n\nlet mockFeedbackSequence = 1000;\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantFeedbackService {\n readonly endpoint = '/agent-api/v1/feedback';\n readonly method = 'POST' as const;\n\n submitFeedback(\n _feedback: AssistantFeedbackRequest\n ): Observable<AssistantFeedbackResponse> {\n mockFeedbackSequence += 1;\n\n return of({\n success: true,\n feedbackReference: `MAX-FEEDBACK-${mockFeedbackSequence}`,\n message: 'Thank you. Your feedback has been shared with the Maxtime development team.',\n submittedAt: new Date().toISOString()\n }).pipe(delay(350));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\n\nimport {\n AssistantSupportTag,\n AssistantSupportTicketRequest,\n AssistantSupportTicketResponse\n} from '../../models/assistant.models';\n\nconst MOCK_SUPPORT_TAGS: AssistantSupportTag[] = [\n { value: 'scheduling', label: 'Scheduling & Rotas', icon: 'pi pi-calendar', severity: 'info' },\n { value: 'timesheets', label: 'Timesheets', icon: 'pi pi-clock', severity: 'secondary' },\n { value: 'clocking', label: 'Clocking & Attendance', icon: 'pi pi-stopwatch', severity: 'warn' },\n { value: 'people', label: 'People', icon: 'pi pi-user', severity: 'info' },\n { value: 'teams-locations', label: 'Teams & Locations', icon: 'pi pi-building', severity: 'secondary' },\n { value: 'holiday', label: 'Holiday & Time Off', icon: 'pi pi-sun', severity: 'success' },\n { value: 'payroll', label: 'Payroll & Pay', icon: 'pi pi-wallet', severity: 'success' },\n { value: 'reporting', label: 'Reporting & Insights', icon: 'pi pi-chart-bar', severity: 'info' },\n { value: 'configuration', label: 'Configuration', icon: 'pi pi-cog', severity: 'secondary' },\n { value: 'permissions', label: 'Permissions & Access', icon: 'pi pi-shield', severity: 'warn' },\n { value: 'performance', label: 'Performance', icon: 'pi pi-chart-line', severity: 'success' },\n { value: 'technical', label: 'Technical Issue', icon: 'pi pi-wrench', severity: 'danger' }\n];\n\nlet mockTicketSequence = 1000;\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantSupportService {\n readonly tagsEndpoint = 'selection/support-tags';\n readonly ticketsEndpoint = 'support/tickets';\n\n getSupportTags(): Observable<AssistantSupportTag[]> {\n return of(MOCK_SUPPORT_TAGS.map(tag => ({ ...tag })));\n }\n\n submitTicket(\n _ticket: AssistantSupportTicketRequest\n ): Observable<AssistantSupportTicketResponse> {\n mockTicketSequence += 1;\n\n return of({\n success: true,\n ticketReference: `MAX-DEMO-${mockTicketSequence}`,\n message: 'Your support ticket has been raised successfully.',\n submittedAt: new Date().toISOString()\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n isDevMode,\n OnInit,\n Output,\n signal,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { SelectModule } from 'primeng/select';\nimport { TagModule } from 'primeng/tag';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { of, switchMap } from 'rxjs';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig\n} from '../../config/assistant-bootstrap.config';\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatResponse,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantDeveloperTrace,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\n AssistantFeedbackCategory,\n AssistantFeedbackResponse,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantHostAction,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantSearchResult,\n AssistantSuggestion,\n AssistantSuggestionOption,\n AssistantSupportTag,\n AssistantSupportTagSeverity,\n AssistantSupportTicketResponse,\n AssistantSupportTicketSeverity,\n AssistantTraceStep,\n AssistantUser,\n AssistantVisualisation\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\nimport { MaxAssistantFeedbackService } from './max-assistant-feedback.service';\nimport { MaxAssistantSupportService } from './max-assistant-support.service';\nimport { MaxAssistantMarkdownPipe } from './max-assistant-markdown.pipe';\nimport { MaxAgentShiftCardComponent } from '../shift-card/max-agent-shift-card.component';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max',\n subtitle: 'Your Personal AI Assistant',\n clearLabel: 'Start a new session',\n clearTooltip: 'Start a new session',\n closeLabel: 'Close AI assistant',\n closeTooltip: 'Close AI assistant',\n feedbackLabel: 'Provide feedback on this response',\n feedbackTooltip: 'Provide feedback',\n placeholder: 'Ask Max',\n startingMessage: 'Understanding your request…',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\n};\n\nconst ASSISTANT_SEARCH_RESULT_ICONS: Readonly<Record<string, string>> = {\n EMPLOYEE: 'pi pi-user',\n PERSON: 'pi pi-user',\n TEAM: 'pi pi-users',\n SCHEDULE: 'pi pi-calendar',\n LOCATION: 'pi pi-map-marker',\n POSITION: 'pi pi-briefcase',\n TIMESHEET: 'pi pi-clock',\n CONFIGTEAM: 'pi pi-cog',\n CONFIGLOCATION: 'pi pi-cog',\n DEFAULT: 'pi pi-search'\n};\n\ninterface SupportTicketFormValue {\n name: string;\n email: string;\n phone: string;\n query: string;\n severity: AssistantSupportTicketSeverity;\n tags: string[];\n}\n\ninterface FeedbackFormValue {\n name: string;\n email: string;\n phone: string;\n category: AssistantFeedbackCategory;\n query: string;\n assistantResponse: string;\n feedback: string;\n}\n\n@Component({\n selector: 'max-assistant',\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n MultiSelectModule,\n SelectModule,\n TagModule,\n TextareaModule,\n TooltipModule,\n MaxAssistantMarkdownPipe,\n MaxAgentShiftCardComponent\n ],\n templateUrl: './max-assistant.component.html',\n encapsulation: ViewEncapsulation.Emulated,\n styleUrls: [\n './max-assistant.component.scss',\n './max-assistant.workspace.scss'\n ]\n})\nexport class MaxAssistantComponent implements OnInit {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n @ViewChild('composerInput') private composerInput?: ElementRef<HTMLTextAreaElement>;\n @ViewChild('supportQueryInput') private supportQueryInput?: ElementRef<HTMLTextAreaElement>;\n @ViewChild('feedbackInput') private feedbackInput?: ElementRef<HTMLTextAreaElement>;\n\n @Input() app?: AssistantProduct;\n @Input() assistantApiUrl?: string;\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n @Output() hostAction = new EventEmitter<AssistantHostAction>();\n @Output() closeRequested = new EventEmitter<void>();\n\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 expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly developerDetailsEnabled = isDevMode();\n protected readonly feedbackVisible = signal(false);\n protected readonly feedbackSubmitting = signal(false);\n protected readonly feedbackResult = signal<AssistantFeedbackResponse | undefined>(undefined);\n protected readonly feedbackError = signal<string | undefined>(undefined);\n protected readonly feedbackCategoryOptions: Array<{\n label: string;\n value: AssistantFeedbackCategory;\n }> = [\n { label: 'Incorrect answer', value: 'incorrect' },\n { label: 'Incomplete answer', value: 'incomplete' },\n { label: 'Hard to understand', value: 'unclear' },\n { label: 'Unexpected behaviour', value: 'unexpected' },\n { label: 'Suggestion', value: 'suggestion' },\n { label: 'Other', value: 'other' }\n ];\n protected feedbackForm: FeedbackFormValue = this.createFeedbackForm();\n protected readonly supportTicketVisible = signal(false);\n protected readonly supportTicketSubmitting = signal(false);\n protected readonly supportTagsLoading = signal(false);\n protected readonly supportTags = signal<AssistantSupportTag[]>([]);\n protected readonly supportTicketResult = signal<AssistantSupportTicketResponse | undefined>(\n undefined\n );\n protected readonly supportTicketError = signal<string | undefined>(undefined);\n protected readonly supportSeverityOptions: Array<{\n label: string;\n value: AssistantSupportTicketSeverity;\n severity: AssistantSupportTagSeverity;\n }> = [\n { label: 'Low', value: 'low', severity: 'success' },\n { label: 'Medium', value: 'medium', severity: 'info' },\n { label: 'High', value: 'high', severity: 'warn' },\n { label: 'Critical', value: 'critical', severity: 'danger' }\n ];\n protected supportTicketForm: SupportTicketFormValue = this.createSupportTicketForm();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly feedbackService: MaxAssistantFeedbackService,\n private readonly supportService: MaxAssistantSupportService,\n private readonly destroyRef: DestroyRef,\n @Inject(MAX_ASSISTANT_CONFIG) private readonly defaultConfig: MaxAssistantConfig\n ) {}\n\n ngOnInit(): void {\n this.messages.set(this.createDefaultMessages());\n }\n\n focusComposer(): void {\n this.composerInput?.nativeElement.focus();\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 isWelcomeMessage(message: AssistantMessage): boolean {\n return (\n this.messages()[0]?.id === message.id &&\n message.role === 'assistant' &&\n !message.displayResponse &&\n !message.isStreaming\n );\n }\n\n protected isWelcomeState(message: AssistantMessage): boolean {\n return this.messages().length === 1 && this.isWelcomeMessage(message);\n }\n\n @HostListener('document:keydown.escape')\n protected onDocumentEscape() {\n if (this.feedbackVisible()) {\n this.closeFeedback();\n return;\n }\n\n if (this.supportTicketVisible()) {\n this.closeSupportTicket();\n return;\n }\n\n if (this.expandedDetailMessageIds().size) {\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n }\n }\n\n protected clearChatSession() {\n this.closeFeedback(false);\n this.closeSupportTicket(false);\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.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 const history = this.getConversationHistory();\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n const streamingMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true\n };\n this.appendMessage(streamingMessage);\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(\n trimmedMessage,\n this.conversationId(),\n this.getAssistantConfig(),\n undefined,\n history,\n progress => this.updateStreamingMessage(streamingMessage.id, progress.message)\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.replaceMessage(\n streamingMessage.id,\n this.createAssistantResponseMessage(response, trimmedMessage)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.replaceMessage(streamingMessage.id, {\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected suggestionLabel(suggestion: AssistantSuggestion): string {\n return typeof suggestion === 'string' ? suggestion : suggestion.label;\n }\n\n protected hasCapabilitySuggestions(\n suggestions: AssistantSuggestion[] = []\n ): boolean {\n return suggestions.some(\n suggestion =>\n typeof suggestion !== 'string' &&\n suggestion.presentation === 'capability_card'\n );\n }\n\n protected capabilitySuggestionGroups(\n suggestions: AssistantSuggestion[] = []\n ): Array<{ section: string; options: AssistantSuggestionOption[] }> {\n const groups = new Map<string, AssistantSuggestionOption[]>();\n for (const suggestion of suggestions) {\n if (\n typeof suggestion === 'string' ||\n suggestion.presentation !== 'capability_card'\n ) {\n continue;\n }\n const section = suggestion.section?.trim() || 'More';\n groups.set(section, [...(groups.get(section) ?? []), suggestion]);\n }\n return [...groups.entries()].map(([section, options]) => ({\n section,\n options\n }));\n }\n\n protected useSuggestion(suggestion: AssistantSuggestion) {\n if (typeof suggestion === 'string' || !suggestion.structuredAction) {\n this.sendMessage(\n typeof suggestion === 'string' ? suggestion : suggestion.message\n );\n return;\n }\n\n const label = suggestion.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n suggestion.message,\n suggestion.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, suggestion.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected performHostAction(action: AssistantHostAction) {\n this.hostAction.emit(action);\n }\n\n protected requestClose(): void {\n this.closeRequested.emit();\n }\n\n protected hasConversationStarted(): boolean {\n return this.messages().some(message => message.role === 'user');\n }\n\n protected openSupportTicket(): void {\n this.closeFeedback(false);\n const user = this.getConfiguredUser();\n this.supportTicketForm = this.createSupportTicketForm(user);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n this.supportTags.set([]);\n this.supportTagsLoading.set(true);\n this.supportTicketVisible.set(true);\n\n this.supportService\n .getSupportTags()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: tags => {\n this.supportTags.set(tags);\n this.supportTagsLoading.set(false);\n },\n error: () => {\n this.supportTagsLoading.set(false);\n this.supportTicketError.set('Support tags could not be loaded. You can still submit the ticket.');\n }\n });\n\n setTimeout(() => this.supportQueryInput?.nativeElement.focus());\n }\n\n protected closeSupportTicket(restoreComposerFocus = true): void {\n this.supportTicketVisible.set(false);\n this.supportTicketSubmitting.set(false);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitSupportTicket(): boolean {\n return Boolean(\n this.supportTicketForm.name.trim() &&\n this.supportTicketForm.email.trim() &&\n this.supportTicketForm.query.trim() &&\n this.supportTicketForm.severity &&\n !this.supportTicketSubmitting()\n );\n }\n\n protected submitSupportTicket(): void {\n if (!this.canSubmitSupportTicket()) {\n return;\n }\n\n this.supportTicketSubmitting.set(true);\n this.supportTicketError.set(undefined);\n this.supportService\n .submitTicket({\n name: this.supportTicketForm.name.trim(),\n email: this.supportTicketForm.email.trim(),\n ...(this.supportTicketForm.phone.trim()\n ? { phone: this.supportTicketForm.phone.trim() }\n : {}),\n query: this.supportTicketForm.query.trim(),\n severity: this.supportTicketForm.severity,\n tags: [...this.supportTicketForm.tags],\n app: this.app ?? this.defaultConfig.app ?? 'nemesys'\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.supportTicketResult.set(result);\n this.supportTicketSubmitting.set(false);\n },\n error: () => {\n this.supportTicketSubmitting.set(false);\n this.supportTicketError.set(\n 'The ticket could not be submitted. Please check the details and try again.'\n );\n }\n });\n }\n\n protected openFeedback(responseMessage: AssistantMessage): void {\n this.closeSupportTicket(false);\n this.feedbackForm = this.createFeedbackForm(this.getConfiguredUser(), responseMessage);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n this.feedbackVisible.set(true);\n setTimeout(() => this.feedbackInput?.nativeElement.focus());\n }\n\n protected closeFeedback(restoreComposerFocus = true): void {\n this.feedbackVisible.set(false);\n this.feedbackSubmitting.set(false);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitFeedback(): boolean {\n return Boolean(\n this.feedbackForm.name.trim() &&\n this.feedbackForm.email.trim() &&\n this.feedbackForm.category &&\n this.feedbackForm.query.trim() &&\n this.feedbackForm.feedback.trim() &&\n !this.feedbackSubmitting()\n );\n }\n\n protected submitFeedback(): void {\n if (!this.canSubmitFeedback()) {\n return;\n }\n\n this.feedbackSubmitting.set(true);\n this.feedbackError.set(undefined);\n this.feedbackService\n .submitFeedback({\n name: this.feedbackForm.name.trim(),\n email: this.feedbackForm.email.trim(),\n ...(this.feedbackForm.phone.trim()\n ? { phone: this.feedbackForm.phone.trim() }\n : {}),\n category: this.feedbackForm.category,\n query: this.feedbackForm.query.trim(),\n ...(this.feedbackForm.assistantResponse.trim()\n ? { assistantResponse: this.feedbackForm.assistantResponse.trim() }\n : {}),\n feedback: this.feedbackForm.feedback.trim(),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys',\n ...(this.conversationId() ? { conversationId: this.conversationId() } : {})\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.feedbackResult.set(result);\n this.feedbackSubmitting.set(false);\n },\n error: () => {\n this.feedbackSubmitting.set(false);\n this.feedbackError.set(\n 'Your feedback could not be submitted. Please check the details and try again.'\n );\n }\n });\n }\n\n protected searchResultIcon(type: string): string {\n return ASSISTANT_SEARCH_RESULT_ICONS[type.trim().toUpperCase()]\n ?? ASSISTANT_SEARCH_RESULT_ICONS['DEFAULT'];\n }\n\n protected searchActionIcon(action: AssistantSearchResult['actions'][number]): string {\n const linkType = action.hostAction.payload['linkType'];\n return this.searchResultIcon(typeof linkType === 'string' ? linkType : action.label);\n }\n\n protected getTableRowActions(\n table: AssistantResponseTable,\n rowIndex: number\n ): AssistantResponseTableAction[] {\n return table.actions?.filter(action => action.rowIndex === rowIndex) ?? [];\n }\n\n protected useTableAction(action: AssistantResponseTableAction) {\n const label = action.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n action.message,\n action.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(\n switchMap(response => {\n if (!action.confirmOnClick || !response.pendingAction) {\n return of(response);\n }\n return this.assistantService.confirmAction(\n response.pendingAction.id,\n 'approve',\n response.conversationId,\n this.getAssistantConfig(),\n history\n );\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, action.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected resolvePendingAction(\n message: AssistantMessage,\n decision: AssistantConfirmation['decision']\n ) {\n const pendingAction = message.pendingAction;\n const currentConversationId = this.conversationId();\n\n if (\n !pendingAction ||\n !currentConversationId ||\n message.actionDecision ||\n this.isSending()\n ) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: decision } : item\n )\n );\n const userMessage = decision === 'approve'\n ? `Approve: ${pendingAction.summary}`\n : `Reject: ${pendingAction.summary}`;\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', userMessage));\n this.isSending.set(true);\n\n this.assistantService\n .confirmAction(\n pendingAction.id,\n decision,\n currentConversationId,\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, userMessage));\n this.isSending.set(false);\n },\n error: error => {\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: undefined } : item\n )\n );\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n private resolveErrorMessage(error: unknown): string {\n if (\n error instanceof HttpErrorResponse &&\n typeof error.error === 'object' &&\n error.error !== null &&\n 'message' in error.error &&\n typeof error.error.message === 'string' &&\n error.error.message.trim()\n ) {\n return error.error.message.trim();\n }\n return this.uiCopy.errorMessage;\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 isDetailsVisible(messageId: string): boolean {\n return this.expandedDetailMessageIds().has(messageId);\n }\n\n protected toggleDetails(messageId: string, initialStepId?: number) {\n const opening = !this.isDetailsVisible(messageId);\n this.expandedDetailMessageIds.set(\n opening ? new Set([messageId]) : new Set<string>()\n );\n this.expandedTraceStepKeys.set(\n opening && initialStepId !== undefined\n ? new Set([this.traceStepKey(messageId, initialStepId)])\n : new Set<string>()\n );\n }\n\n protected isTraceStepExpanded(messageId: string, stepId: number): boolean {\n return this.expandedTraceStepKeys().has(this.traceStepKey(messageId, stepId));\n }\n\n protected toggleTraceStep(messageId: string, stepId: number) {\n const key = this.traceStepKey(messageId, stepId);\n this.expandedTraceStepKeys.update(expandedKeys => {\n const next = new Set(expandedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n protected chartTotal(visualisation: AssistantVisualisation): number {\n return visualisation.values.reduce(\n (total, value) => total + Math.max(0, Number(value) || 0),\n 0\n );\n }\n\n protected chartColor(visualisation: AssistantVisualisation, index: number): string {\n const fallback = ['#42A5F5', '#FFA5F5', '#66BB6A', '#FFA726', '#228888'];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n protected doughnutDashArray(\n visualisation: AssistantVisualisation,\n index: number\n ): string {\n const percentage = this.chartPercentage(visualisation, index);\n return `${percentage} ${100 - percentage}`;\n }\n\n protected doughnutDashOffset(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n return -visualisation.values\n .slice(0, index)\n .reduce(\n (total, _value, valueIndex) =>\n total + this.chartPercentage(visualisation, valueIndex),\n 0\n );\n }\n\n protected barWidth(visualisation: AssistantVisualisation, index: number): number {\n const maximum = Math.max(0, ...visualisation.values.map(value => Number(value) || 0));\n if (!maximum) {\n return 0;\n }\n return Math.max(0, ((Number(visualisation.values[index]) || 0) / maximum) * 100);\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const values = visualisation.labels.map(\n (label, index) => `${label}: ${Number(visualisation.values[index]) || 0}`\n );\n return `${visualisation.title} diversity chart. ${values.join(', ')}.`;\n }\n\n private chartPercentage(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n const total = this.chartTotal(visualisation);\n return total\n ? (Math.max(0, Number(visualisation.values[index]) || 0) / total) * 100\n : 0;\n }\n\n protected formatTraceValue(value: AssistantFieldValue | undefined): string {\n return JSON.stringify(value, null, 2);\n }\n\n protected traceMap(value: AssistantFieldValue | undefined): AssistantFieldMap | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value\n : undefined;\n }\n\n protected traceMapField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldMap | undefined {\n return this.traceMap(this.traceMap(value)?.[key]);\n }\n\n protected traceArrayField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue[] {\n const field = this.traceMap(value)?.[key];\n return Array.isArray(field) ? field : [];\n }\n\n protected traceField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue | undefined {\n return this.traceMap(value)?.[key];\n }\n\n protected traceEntries(\n value: AssistantFieldValue | AssistantFieldMap | undefined,\n excludedKeys: string[] = []\n ): Array<{ key: string; label: string; value: AssistantFieldValue }> {\n const record = this.traceMap(value);\n const excluded = new Set(excludedKeys.map(key => key.toLocaleLowerCase()));\n return record\n ? Object.entries(record)\n .filter(\n ([key, entry]) =>\n entry !== undefined && !excluded.has(key.toLocaleLowerCase())\n )\n .map(([key, entry]) => ({\n key,\n label: this.formatTraceLabel(key),\n value: entry\n }))\n : [];\n }\n\n protected formatTraceLabel(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n protected formatTraceScalar(value: AssistantFieldValue | undefined): string {\n if (value === null) {\n return 'None';\n }\n if (value === undefined) {\n return 'Not supplied';\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? String(value) : value.toFixed(6);\n }\n if (typeof value === 'string') {\n return value || 'Empty';\n }\n return JSON.stringify(value);\n }\n\n protected formatSimilarity(value: AssistantFieldValue | undefined): string {\n return typeof value === 'number' ? value.toFixed(4) : '—';\n }\n\n protected getHttpStatus(step: AssistantTraceStep): number | undefined {\n const output = this.traceMap(step.output);\n const http = this.traceMap(output?.['http']);\n const status = http?.['statusCode'] ?? output?.['statusCode'] ?? step.error?.statusCode;\n return typeof status === 'number' ? status : undefined;\n }\n\n protected isHttpSuccessful(step: AssistantTraceStep): boolean {\n const status = this.getHttpStatus(step);\n return status !== undefined && status >= 200 && status < 300;\n }\n\n protected traceStepTone(step: AssistantTraceStep): AssistantTraceStep['status'] {\n return step.category === 'api_call' && this.isHttpSuccessful(step)\n ? 'succeeded'\n : step.status;\n }\n\n protected traceStepStatus(step: AssistantTraceStep): string {\n if (step.category === 'api_call') {\n const status = this.getHttpStatus(step);\n if (status !== undefined) {\n return `HTTP ${status} ${this.isHttpSuccessful(step) ? 'Success' : 'Error'}`;\n }\n return step.status === 'failed' ? 'Transport failed' : 'Completed';\n }\n return step.status === 'succeeded'\n ? 'Completed'\n : step.status === 'failed'\n ? 'Stopped'\n : 'Running';\n }\n\n protected formatTraceCategory(category: string): string {\n const labels: Record<string, string> = {\n request: 'Request intake',\n intent_projection: 'Intent generalisation',\n embedding: 'Intent embedding',\n capability_routing: 'Capability matching',\n argument_extraction: 'Argument extraction',\n api_call: 'Nemesys API',\n action: 'Workflow outcome',\n response: 'Assistant response'\n };\n return labels[category] ?? this.formatTraceLabel(category);\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 if (this.context) {\n config.context = this.context;\n }\n\n if (this.requestHeaders) {\n config.requestHeaders = this.requestHeaders;\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 updateStreamingMessage(messageId: string, content: string) {\n const trimmedContent = content.trim();\n if (!trimmedContent) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId && message.isStreaming\n ? { ...message, content: trimmedContent }\n : message\n )\n );\n this.scrollToLatest();\n }\n\n private replaceMessage(messageId: string, replacement: AssistantMessage) {\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId\n ? { ...replacement, id: messageId, isStreaming: false }\n : message\n )\n );\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.getInitialMessage(this.bootstrapConfig.initialMessage),\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private getInitialMessage(initialMessage: string): string {\n const user = this.getConfiguredUser();\n const preferredName = [\n user?.['firstName'],\n user?.['firstname'],\n user?.['displayName'],\n user?.['name'],\n user?.['username']\n ].find(value => typeof value === 'string' && value.trim());\n\n if (typeof preferredName !== 'string') {\n return initialMessage;\n }\n\n const firstName = preferredName\n .trim()\n .split(/\\s|@/)[0];\n\n if (!firstName) {\n return initialMessage;\n }\n\n if (initialMessage.startsWith('Hi!')) {\n return initialMessage.replace(/^Hi!/, `Hi ${firstName}!`);\n }\n\n return initialMessage.replace(/^Hello,/, `Hello ${firstName},`);\n }\n\n private getConfiguredUser(): Partial<AssistantUser> | undefined {\n const configuredUser = this.user ?? this.defaultConfig.user;\n return typeof configuredUser === 'function'\n ? configuredUser()\n : configuredUser;\n }\n\n private createSupportTicketForm(\n user?: Partial<AssistantUser>\n ): SupportTicketFormValue {\n return {\n name: this.getUserText(user, [\n 'displayName',\n 'name',\n 'username',\n 'firstName',\n 'firstname'\n ]),\n email: this.getUserText(user, ['email', 'emailAddress']),\n phone: this.getUserText(user, ['phone', 'phoneNumber', 'mobile']),\n query: '',\n severity: 'medium',\n tags: []\n };\n }\n\n private createFeedbackForm(\n user?: Partial<AssistantUser>,\n responseMessage?: AssistantMessage\n ): FeedbackFormValue {\n const conversation = responseMessage\n ? this.getConversationPair(responseMessage)\n : { query: '', assistantResponse: '' };\n\n return {\n name: this.getUserText(user, [\n 'displayName',\n 'name',\n 'username',\n 'firstName',\n 'firstname'\n ]),\n email: this.getUserText(user, ['email', 'emailAddress']),\n phone: this.getUserText(user, ['phone', 'phoneNumber', 'mobile']),\n category: 'suggestion',\n query: conversation.query,\n assistantResponse: conversation.assistantResponse,\n feedback: ''\n };\n }\n\n private getConversationPair(responseMessage: AssistantMessage): {\n query: string;\n assistantResponse: string;\n } {\n const messages = this.messages();\n const responseIndex = messages.findIndex(message => message.id === responseMessage.id);\n let precedingUserIndex = -1;\n for (let index = responseIndex - 1; index >= 0; index -= 1) {\n if (messages[index]?.role === 'user') {\n precedingUserIndex = index;\n break;\n }\n }\n\n return {\n query: messages[precedingUserIndex]?.content ?? '',\n assistantResponse: responseMessage.content\n };\n }\n\n private getUserText(\n user: Partial<AssistantUser> | undefined,\n keys: string[]\n ): string {\n const value = keys\n .map(key => user?.[key])\n .find(field => typeof field === 'string' && field.trim());\n return typeof value === 'string' ? value.trim() : '';\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 ?? response.product,\n response.productLabel,\n response.apiModule ?? response.contextResolution?.moduleKey,\n response.confidence ?? response.contextResolution?.confidence,\n response.parameters ?? response.entities,\n response.apiCalls ?? this.getToolApiCalls(response),\n response.apiResult,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse,\n response.status,\n response.pendingAction,\n response.toolExecution,\n response.cards,\n response.contextResolution.capabilityKey,\n response.developerTrace\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: AssistantSuggestion[] = [],\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 status?: AssistantChatResponse['status'],\n pendingAction?: AssistantMessage['pendingAction'],\n toolExecution?: AssistantMessage['toolExecution'],\n cards?: AssistantMessage['cards'],\n capabilityKey?: string,\n developerTrace?: AssistantDeveloperTrace\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 status,\n pendingAction,\n toolExecution,\n cards,\n capabilityKey,\n developerTrace,\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 searchResults: provided.searchResults,\n visualisations: provided.visualisations,\n shiftCardGroups: provided.shiftCardGroups,\n rota: provided.rota,\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.product ?? response.app,\n projectKey: provided?.projectKey ?? response.product ?? response.app,\n module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,\n intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,\n intentLabel:\n provided?.intentLabel\n ?? response.intentLabel\n ?? response.contextResolution?.capabilityLabel,\n confidence:\n provided?.confidence\n ?? response.confidence\n ?? response.contextResolution?.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]\n };\n }\n\n private getToolApiCalls(\n response: AssistantChatResponse\n ): AssistantMessage['apiCalls'] | undefined {\n if (!response.toolExecution) {\n return undefined;\n }\n\n return [{\n method: response.toolExecution.method,\n url: response.toolExecution.endpoint,\n purpose: response.toolExecution.toolName\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 if (provided.shiftCardGroups?.length || provided.rota) {\n return [];\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 traceStepKey(messageId: string, stepId: number): string {\n return `${messageId}:${stepId}`;\n }\n\n private getConversationHistory(): AssistantConversationMessage[] {\n const messages = this.messages();\n const firstUserIndex = messages.findIndex(message => message.role === 'user');\n if (firstUserIndex < 0) {\n return [];\n }\n\n return messages\n .slice(firstUserIndex)\n .filter(message => !message.isError && !message.isStreaming)\n .slice(-20)\n .map(message => ({\n role: message.role,\n content: message.content.slice(0, 4_000),\n ...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})\n }));\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","<aside\n class=\"assistant-window\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"region\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <i class=\"max-assistant-sparkles far fa-sparkles\" aria-hidden=\"true\"></i>\n <div class=\"assistant-identity\">\n <h2 class=\"assistant-name\">{{ uiCopy.title }}</h2>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <div class=\"assistant-header-actions\">\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n >\n <i class=\"header-action-icon pi pi-refresh\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n [pTooltip]=\"uiCopy.closeTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"requestClose()\"\n >\n <i class=\"header-action-icon pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isStreaming) {\n <p class=\"streaming-progress\">{{ message.content }}</p>\n } @else if(message.displayResponse; as responseDetails) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <strong>{{ card.title }}</strong>\n @if(card.subtitle) {\n <span>{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span>{{ metric.label }}</span>\n <strong>{{ metric.value }}</strong>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(responseDetails.searchResults?.length) {\n <div class=\"assistant-cards assistant-search-results\" aria-label=\"Search results\">\n @for(result of responseDetails.searchResults ?? []; track $index) {\n <section class=\"assistant-card assistant-search-result\">\n <header>\n <i\n class=\"assistant-search-result-icon\"\n [class]=\"searchResultIcon(result.type)\"\n aria-hidden=\"true\"\n ></i>\n <div class=\"assistant-search-result-copy\">\n <strong>{{ result.title }}</strong>\n <span>{{ result.type }}</span>\n </div>\n </header>\n <div class=\"suggestions\" aria-label=\"Available destinations\">\n @for(action of result.actions; track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"action.label\"\n [icon]=\"searchActionIcon(action)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(action.hostAction)\"\n ></button>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(responseDetails.shiftCardGroups?.length) {\n <div class=\"assistant-shift-groups\" aria-label=\"Team shifts\">\n @for(group of responseDetails.shiftCardGroups ?? []; track group.title) {\n <section class=\"assistant-shift-group\">\n <h3>{{ group.title }}</h3>\n <div class=\"assistant-shift-card-grid\">\n @for(shift of group.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"definition\"\n ></max-agent-shift-card>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(responseDetails.rota; as rota) {\n <section class=\"assistant-rota\" [attr.aria-label]=\"rota.title\">\n <div class=\"assistant-rota-heading\">\n <h3>{{ rota.title }}</h3>\n <div class=\"assistant-rota-summary\">\n @if(rota.startDate) {\n <span><small>From</small><strong>{{ rota.startDate }}</strong></span>\n }\n <span><small>Weeks</small><strong>{{ rota.weeksCount }}</strong></span>\n @if(rota.contracted) {\n <span><small>Contracted</small><strong>{{ rota.contracted }}</strong></span>\n }\n @if(rota.autoPublish) {\n <span><small>Auto publish</small><strong>{{ rota.autoPublish }}</strong></span>\n }\n </div>\n </div>\n <div class=\"assistant-rota-scroll\">\n @for(week of rota.weeks; track week.week) {\n <section class=\"assistant-rota-week\">\n <header class=\"assistant-rota-week-heading\">\n <strong>Week {{ week.week }}</strong>\n @if(week.duration) {\n <span>{{ week.duration }}</span>\n }\n </header>\n <div class=\"assistant-rota-week-grid\">\n @for(day of week.days; track day.day) {\n <article class=\"assistant-rota-day\">\n <header>\n <strong>{{ day.label }}</strong>\n @if(day.period) {\n <span>{{ day.period }}</span>\n }\n </header>\n <div class=\"assistant-rota-day-shifts\">\n @for(shift of day.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"rota\"\n ></max-agent-shift-card>\n } @empty {\n <span class=\"assistant-rota-empty\">No shifts</span>\n }\n </div>\n </article>\n }\n </div>\n </section>\n } @empty {\n <p class=\"assistant-rota-no-weeks\">No rota weeks were returned.</p>\n }\n </div>\n </section>\n }\n @if(responseDetails.visualisations?.length) {\n <div class=\"assistant-visualisations\">\n @for(visualisation of responseDetails.visualisations ?? []; track visualisation.title) {\n <section class=\"assistant-visualisation\">\n <h3>{{ visualisation.title }}</h3>\n @if(visualisation.type === 'doughnut') {\n <div class=\"assistant-doughnut-layout\">\n <div\n class=\"assistant-doughnut\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n <svg viewBox=\"0 0 42 42\" aria-hidden=\"true\" focusable=\"false\">\n <circle\n class=\"assistant-doughnut-track\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n ></circle>\n @for(value of visualisation.values; track $index; let valueIndex = $index) {\n <circle\n class=\"assistant-doughnut-segment\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n pathLength=\"100\"\n [attr.stroke]=\"chartColor(visualisation, valueIndex)\"\n [attr.stroke-dasharray]=\"doughnutDashArray(visualisation, valueIndex)\"\n [attr.stroke-dashoffset]=\"doughnutDashOffset(visualisation, valueIndex)\"\n ></circle>\n }\n </svg>\n <span><strong>{{ chartTotal(visualisation) }}</strong>people</span>\n </div>\n <div class=\"assistant-chart-legend\">\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-chart-legend-item\">\n <i [style.background]=\"chartColor(visualisation, labelIndex)\"></i>\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n }\n </div>\n </div>\n } @else {\n <div\n class=\"assistant-bar-chart\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-bar-row\">\n <div class=\"assistant-bar-label\">\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n <div class=\"assistant-bar-track\" aria-hidden=\"true\">\n <i\n [style.width.%]=\"barWidth(visualisation, labelIndex)\"\n [style.background]=\"chartColor(visualisation, labelIndex)\"\n ></i>\n </div>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">→</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} · {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} · {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { · HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { — HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n @if(isWelcomeState(message)) {\n <button\n type=\"button\"\n class=\"support-welcome-card\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <span class=\"support-welcome-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <span class=\"support-welcome-copy\">\n <strong>Raise a support ticket</strong>\n <small>Send details directly to our support team.</small>\n </span>\n <i class=\"support-welcome-arrow pi pi-arrow-right\" aria-hidden=\"true\"></i>\n </button>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n @if(hasCapabilitySuggestions(message.suggestions)) {\n <div class=\"capability-options\" aria-label=\"Available Maxtime capabilities\">\n @for(group of capabilitySuggestionGroups(message.suggestions); track group.section) {\n <section class=\"capability-option-section\">\n <h3>{{ group.section }}</h3>\n <div class=\"capability-option-grid\">\n @for(suggestion of group.options; track suggestion.structuredAction?.capabilityKey ?? suggestion.label; let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose capability: ' + suggestion.label\"\n (click)=\"useSuggestion(suggestion)\"\n >\n <span class=\"capability-option-number\" aria-hidden=\"true\">\n {{ optionIndex + 1 }}\n </span>\n <span class=\"capability-option-copy\">{{ suggestion.label }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </section>\n }\n </div>\n } @else {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n }\n @if(message.role === 'assistant' && !isWelcomeMessage(message) && !message.isStreaming) {\n <div class=\"response-actions\">\n <button\n type=\"button\"\n class=\"response-feedback-action\"\n [attr.aria-label]=\"uiCopy.feedbackLabel\"\n [pTooltip]=\"uiCopy.feedbackTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"openFeedback(message)\"\n >\n <i class=\"pi pi-comment\" aria-hidden=\"true\"></i>\n </button>\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Developer Trace' : 'Show Developer Trace' }}\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <footer class=\"assistant-footer\">\n @if(hasConversationStarted()) {\n <button\n type=\"button\"\n class=\"support-ticket-shortcut\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <i class=\"far fa-user-headset\" aria-hidden=\"true\"></i>\n <span>Raise a support ticket</span>\n </button>\n }\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n #composerInput\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </footer>\n </section>\n\n @if(supportTicketVisible()) {\n <section class=\"support-ticket-overlay\" aria-label=\"Support ticket form\">\n <div\n class=\"support-ticket-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"supportTicketTitle\"\n >\n <header class=\"support-ticket-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <div>\n <h2 id=\"supportTicketTitle\">Raise a support ticket</h2>\n <p>Share the details and our support team will take it from here.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close\"\n aria-label=\"Close support ticket form\"\n (click)=\"closeSupportTicket()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(supportTicketResult(); as result) {\n <div class=\"support-ticket-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>Ticket raised</h3>\n <p>{{ result.message }}</p>\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.ticketReference }}</strong>\n </div>\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form\" (ngSubmit)=\"submitSupportTicket()\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Name</span>\n <input\n type=\"text\"\n name=\"supportName\"\n autocomplete=\"name\"\n [value]=\"supportTicketForm.name\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Email</span>\n <input\n type=\"email\"\n name=\"supportEmail\"\n autocomplete=\"email\"\n [value]=\"supportTicketForm.email\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Phone <small>Optional</small></span>\n <input\n type=\"tel\"\n name=\"supportPhone\"\n autocomplete=\"tel\"\n placeholder=\"Add a contact number\"\n [(ngModel)]=\"supportTicketForm.phone\"\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Severity</span>\n <p-select\n inputId=\"supportSeverity\"\n name=\"supportSeverity\"\n [options]=\"supportSeverityOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.severity\"\n >\n <ng-template #selectedItem let-severity>\n <p-tag\n class=\"support-severity-tag\"\n [value]=\"severity.label\"\n [severity]=\"severity.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n <ng-template #item let-severity>\n <p-tag\n class=\"support-severity-option\"\n [value]=\"severity.label\"\n [severity]=\"severity.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-select>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Tags</span>\n <p-multiselect\n inputId=\"supportTags\"\n name=\"supportTags\"\n placeholder=\"Select relevant areas\"\n [options]=\"supportTags()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n display=\"chip\"\n [filter]=\"true\"\n filterBy=\"label\"\n [showToggleAll]=\"false\"\n [loading]=\"supportTagsLoading()\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.tags\"\n >\n <ng-template #selecteditems let-selectedTags>\n <span class=\"support-selected-tags\">\n @for(tag of selectedTags; track tag.value) {\n <p-tag\n class=\"support-selected-tag\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n }\n </span>\n </ng-template>\n <ng-template #item let-tag>\n <p-tag\n class=\"support-tag-option\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-multiselect>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>How can we help?</span>\n <textarea\n #supportQueryInput\n pTextarea\n name=\"supportQuery\"\n rows=\"5\"\n placeholder=\"Describe the issue, what you expected, and anything you've already tried.\"\n required\n [(ngModel)]=\"supportTicketForm.query\"\n ></textarea>\n </label>\n </div>\n\n @if(!supportTicketForm.name || !supportTicketForm.email) {\n <p class=\"support-ticket-notice\" role=\"alert\">\n Your signed-in name and email are required. Please refresh your Nemesys session and try again.\n </p>\n }\n @if(supportTicketError(); as supportError) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ supportError }}</p>\n }\n\n <div class=\"support-ticket-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeSupportTicket()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Submit ticket\"\n icon=\"pi pi-send\"\n [loading]=\"supportTicketSubmitting()\"\n [disabled]=\"!canSubmitSupportTicket()\"\n ></button>\n </div>\n </form>\n }\n </div>\n </section>\n }\n\n @if(feedbackVisible()) {\n <section\n class=\"support-ticket-overlay feedback-overlay\"\n aria-label=\"Feedback form\"\n >\n <div\n class=\"support-ticket-dialog feedback-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"feedbackTitle\"\n >\n <header class=\"support-ticket-header feedback-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-comment\"></i>\n </span>\n <div>\n <h2 id=\"feedbackTitle\">Help Max improve</h2>\n <p>Tell us what Max could do better.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close feedback-close\"\n aria-label=\"Close feedback form\"\n (click)=\"closeFeedback()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(feedbackResult(); as result) {\n <div class=\"support-ticket-success feedback-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>Feedback received</h3>\n <p>{{ result.message }}</p>\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.feedbackReference }}</strong>\n </div>\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeFeedback()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form feedback-form\" (ngSubmit)=\"submitFeedback()\">\n <div class=\"feedback-form-body\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Name</span>\n <input\n type=\"text\"\n name=\"feedbackName\"\n autocomplete=\"name\"\n [value]=\"feedbackForm.name\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Email</span>\n <input\n type=\"email\"\n name=\"feedbackEmail\"\n autocomplete=\"email\"\n [value]=\"feedbackForm.email\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Phone <small>Optional</small></span>\n <input\n type=\"tel\"\n name=\"feedbackPhone\"\n autocomplete=\"tel\"\n placeholder=\"Add a contact number\"\n [(ngModel)]=\"feedbackForm.phone\"\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Feedback type</span>\n <p-select\n inputId=\"feedbackCategory\"\n name=\"feedbackCategory\"\n [options]=\"feedbackCategoryOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [fluid]=\"true\"\n [(ngModel)]=\"feedbackForm.category\"\n ></p-select>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Your query</span>\n <textarea\n pTextarea\n name=\"feedbackQuery\"\n rows=\"2\"\n placeholder=\"Enter the question or request you gave Max.\"\n readonly\n required\n [(ngModel)]=\"feedbackForm.query\"\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Assistant response <small>Added automatically when available</small></span>\n <textarea\n pTextarea\n name=\"feedbackAssistantResponse\"\n rows=\"3\"\n placeholder=\"No assistant response is available yet.\"\n [value]=\"feedbackForm.assistantResponse\"\n readonly\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>What could be improved?</span>\n <textarea\n #feedbackInput\n pTextarea\n name=\"feedbackDetails\"\n rows=\"3\"\n placeholder=\"Tell us what you expected, what was missing, or how the response could be more useful.\"\n required\n [(ngModel)]=\"feedbackForm.feedback\"\n ></textarea>\n </label>\n </div>\n\n @if(!feedbackForm.name || !feedbackForm.email) {\n <p class=\"support-ticket-notice\" role=\"alert\">\n Your signed-in name and email are required. Please refresh your Nemesys session and try again.\n </p>\n }\n @if(feedbackError(); as error) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ error }}</p>\n }\n </div>\n\n <footer class=\"support-ticket-actions feedback-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeFeedback()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Send feedback\"\n icon=\"pi pi-send\"\n [loading]=\"feedbackSubmitting()\"\n [disabled]=\"!canSubmitFeedback()\"\n ></button>\n </footer>\n </form>\n }\n </div>\n </section>\n }\n</aside>\n","/*\n * Public API Surface of max-agent-ui\n */\n\nexport * from './lib/components/assistant/max-assistant.component';\nexport * from './lib/components/assistant/max-assistant-feedback.service';\nexport * from './lib/components/assistant/max-assistant.service';\nexport * from './lib/components/assistant/max-assistant-support.service';\nexport * from './lib/components/shift-card/max-agent-shift-card.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":";;;;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,eAAe,GAAG,QAAQ;AAChC,MAAM,mBAAmB,GACvB,6TAA6T;AAE/T,MAAM,2BAA2B,GAA6B;AAC5D,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,kBAAkB,EAAE;CACrB;AAED,MAAM,0BAA0B,GAA6C;AAC3E,IAAA,MAAM,EAAE;AACN,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB;CACF;AAEK,SAAU,2BAA2B,CAAC,GAAsB,EAAA;IAChE,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;IAExC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,2BAA2B;IACpC;AAEA,IAAA,OAAO,0BAA0B,CAAC,MAAM,CAAC,IAAI,2BAA2B;AAC1E;;MCxBa,oBAAoB,GAAG,IAAI,cAAc,CACpD,sBAAsB,EACtB;AACE,IAAA,OAAO,EAAE,OAAO,EAAE;AACnB,CAAA;;MCdU,wBAAwB,CAAA;AACnC,IAAA,SAAS,CAAC,KAAgC,EAAA;QACxC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;;;;QAKA,MAAM,YAAY,GAAG;AAClB,aAAA,UAAU,CAAC,GAAG,EAAE,OAAO;AACvB,aAAA,UAAU,CAAC,GAAG,EAAE,MAAM;AACtB,aAAA,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;AAE1B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;AAChC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,GAAG,EAAE;AACN,SAAA,CAAC;IACJ;wGAnBW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,sBAAsB;AAC5B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACP,iBAAA;;;MCIY,0BAA0B,CAAA;AACV,IAAA,KAAK;IACvB,OAAO,GAA6B,MAAM;AAEnD,IAAA,IAAc,WAAW,GAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;QACtC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,4CAA4C,CAAC,IAAI,CAAC,KAAK;cAC1D,CAAA,CAAA,EAAI,KAAK,CAAA;cACT,KAAK;IACX;AAEA,IAAA,IAAc,SAAS,GAAA;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,KAAK;cAC/B,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,UAAU;QACnB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACzC,QAAA,OAAO,KAAK,IAAI,GAAG,GAAG,GAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAE,GAAG,KAAK,IAAI,GAAG,IAAI,SAAS;IACvE;AAEA,IAAA,IAAc,eAAe,GAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;AACjD,QAAA,OAAO;AACL,cAAE,CAAA,EAAG,KAAK,CAAA,WAAA,EAAc,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;cAC5C,iBAAiB;IACvB;AAEA,IAAA,IAAc,SAAS,GAAA;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC;AACvC,QAAA,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;IACjD;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK;IAClD;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;QACd;QACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAA,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;QAC1C,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;IACjE;wGA/CW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,gICXvC,swCAkCA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA,CAAA;;4FDvBa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EAAA,swCAAA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA;;sBAK/B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;;AEXI,MAAM,wBAAwB,GAAG;AACtC,IAAA,WAAW,EAAE,oBAAoB;AACjC,IAAA,UAAU,EAAE;CACJ;SAEM,0BAA0B,CAAC,eAAe,GAAG,SAAS,EAAE,EAAA;AACtE,IAAA,OAAO;UACH,wBAAwB,CAAC;AAC3B,UAAE,wBAAwB,CAAC,UAAU;AACzC;;ACQA,MAAM,WAAW,GAAG,QAAQ;AAC5B,MAAM,gBAAgB,GAAG,KAAK;MAKjB,mBAAmB,CAAA;AAEmB,IAAA,MAAA;AAClB,IAAA,IAAA;IAF/B,WAAA,CACiD,MAA0B,EAC5C,IAAuB,EAAA;QADL,IAAA,CAAA,MAAM,GAAN,MAAM;QACxB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAChC;AAEH,IAAA,WAAW,CACT,OAAe,EACf,cAAuB,EACvB,MAAA,GAA6B,EAAE,EAC/B,YAAoC,EACpC,OAAA,GAA0C,EAAE,EAC5C,UAAsD,EAAA;AAEtD,QAAA,MAAM,eAAe,GAAG;YACtB,GAAG,IAAI,CAAC,MAAM;AACd,YAAA,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;SAC7B;AACD,QAAA,MAAM,OAAO,GAAyB;YACpC,OAAO;AACP,YAAA,IAAI,UAAU,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc;YACd,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;AACzC,YAAA,IAAI,YAAY,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;SACzC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;IAC/D;IAEA,aAAa,CACX,QAAgB,EAChB,QAA2C,EAC3C,cAAsB,EACtB,MAAA,GAA6B,EAAE,EAC/B,OAAA,GAA0C,EAAE,EAAA;AAE5C,QAAA,OAAO,IAAI,CAAC,WAAW,CACrB,QAAQ,KAAK,SAAS,GAAG,gBAAgB,GAAG,eAAe,EAC3D,cAAc,EACd,MAAM,EACN,EAAE,QAAQ,EAAE,QAAQ,EAAE,EACtB,OAAO,CACR;IACH;IAEA,oBAAoB,CAClB,OAAe,EACf,MAAiC,EACjC,cAAuB,EACvB,MAAA,GAA6B,EAAE,EAC/B,OAAA,GAA0C,EAAE,EAAA;AAE5C,QAAA,MAAM,eAAe,GAAG;YACtB,GAAG,IAAI,CAAC,MAAM;AACd,YAAA,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;SAC7B;AACD,QAAA,MAAM,OAAO,GAAyB;YACpC,OAAO;YACP,cAAc;YACd,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;AACzC,YAAA,gBAAgB,EAAE;SACnB;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC;IACnD;AAEQ,IAAA,WAAW,CACjB,OAA6B,EAC7B,MAA0B,EAC1B,UAAsD,EAAA;AAEtD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;QAEA,IAAI,UAAU,EAAE;YACd,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EACvB,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CACrC;IACH;AAEQ,IAAA,aAAa,CACnB,OAA6B,EAC7B,MAA0B,EAC1B,UAAqD,EAAA;AAErD,QAAA,OAAO,IAAI,UAAU,CAAC,UAAU,IAAG;AACjC,YAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AACvC,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CACrC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAC5D;YAED,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAClC,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE,YAAY;AACrB,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC;AACpB,aAAA,CAAC,CAAC,IAAI,CAAC,OAAM,QAAQ,KAAG;AACvB,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,oBAAA,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBAC1D,MAAM,IAAI,iBAAiB,CAAC;wBAC1B,KAAK;wBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,GAAG,EAAE,QAAQ,CAAC;AACf,qBAAA,CAAC;gBACJ;AAEA,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClB,oBAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;gBACnE;gBAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;AACxC,gBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;gBACjC,IAAI,MAAM,GAAG,EAAE;gBACf,IAAI,cAAc,GAAG,KAAK;AAE1B,gBAAA,MAAM,WAAW,GAAG,CAAC,IAAY,KAAI;AACnC,oBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;oBAC/B,IAAI,CAAC,WAAW,EAAE;wBAChB;oBACF;oBAEA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA6B;AACjE,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;wBAC7B,UAAU,CAAC,KAAK,CAAC;wBACjB;oBACF;AACA,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC1B,wBAAA,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;oBAChC;oBAEA,cAAc,GAAG,IAAI;AACrB,oBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,gBAAA,CAAC;gBAED,OAAO,IAAI,EAAE;oBACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;oBAC3C,IAAI,IAAI,EAAE;wBACR;oBACF;AAEA,oBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,oBAAA,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;AAC1B,oBAAA,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC5B;AAEA,gBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;gBAC1B,WAAW,CAAC,MAAM,CAAC;gBAEnB,IAAI,CAAC,cAAc,EAAE;AACnB,oBAAA,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC;gBACtF;gBAEA,UAAU,CAAC,QAAQ,EAAE;AACvB,YAAA,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;gBACf,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE;AACtD,oBAAA,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;gBACzB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAM,UAAU,CAAC,KAAK,EAAE;AACjC,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,OAAO,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,0BAA0B,EAAE;IACvE;AAEQ,IAAA,MAAM,CAAC,MAA0B,EAAA;AACvC,QAAA,OAAO,MAAM,CAAC,GAAG,IAAI,WAAW;IAClC;AAEQ,IAAA,OAAO,CAAC,MAA0B,EAAA;AACxC,QAAA,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;AACrC,YAAA,OAAO,MAAM,CAAC,IAAI,EAAE;QACtB;AAEA,QAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE;IAC1B;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;AAC3C,QAAA,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK;AAC3C,cAAE,MAAM,CAAC,OAAO;AAChB,cAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAExB,OAAO;AACL,YAAA,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE;YACzC,QAAQ,EAAE,UAAU,CAAC;AAChB,mBAAA,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC;mBACxC,gBAAgB;AACrB,YAAA,IAAI,UAAU,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;YACjE,IAAI,UAAU,CAAC;AACb,kBAAE,EAAE,cAAc,EAAE,UAAU,CAAC,cAAc;kBAC3C,EAAE,CAAC;AACP,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;AAC3D,YAAA,IAAI,UAAU,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AACrD,YAAA,IAAI,UAAU,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;AACxD,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE;SAC3D;IACH;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AACrE,QAAA,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK;AACzD,cAAE,MAAM,CAAC,cAAc;AACvB,cAAE,MAAM,CAAC,cAAc,IAAI,EAAE;AAE/B,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;AAC7D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE;AAEjC,YAAA,IAAI,WAAW,IAAI,YAAY,EAAE;gBAC/B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC;YAClD;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE;AAEA,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,aAAa,CAAC,MAA0B,EAAA;QAC9C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,SAAS,CAAC,CAC5C;IACzB;AAtPW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,kBAEpB,oBAAoB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAFnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAGI,MAAM;2BAAC,oBAAoB;;0BAC3B;;;ACpBL,IAAI,oBAAoB,GAAG,IAAI;MAGlB,2BAA2B,CAAA;IAC7B,QAAQ,GAAG,wBAAwB;IACnC,MAAM,GAAG,MAAe;AAEjC,IAAA,cAAc,CACZ,SAAmC,EAAA;QAEnC,oBAAoB,IAAI,CAAC;AAEzB,QAAA,OAAO,EAAE,CAAC;AACR,YAAA,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,CAAA,aAAA,EAAgB,oBAAoB,CAAA,CAAE;AACzD,YAAA,OAAO,EAAE,6EAA6E;AACtF,YAAA,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW;SACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrB;wGAfW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,2BAA2B,cADd,MAAM,EAAA,CAAA;;4FACnB,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADvC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACDlC,MAAM,iBAAiB,GAA0B;AAC/C,IAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC9F,IAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE;AACxF,IAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE;AAChG,IAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC1E,IAAA,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE;AACvG,IAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE;AACzF,IAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE;AACvF,IAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE;AAChG,IAAA,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE;AAC5F,IAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;AAC/F,IAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE;AAC7F,IAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ;CACzF;AAED,IAAI,kBAAkB,GAAG,IAAI;MAGhB,0BAA0B,CAAA;IAC5B,YAAY,GAAG,wBAAwB;IACvC,eAAe,GAAG,iBAAiB;IAE5C,cAAc,GAAA;AACZ,QAAA,OAAO,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IACvD;AAEA,IAAA,YAAY,CACV,OAAsC,EAAA;QAEtC,kBAAkB,IAAI,CAAC;AAEvB,QAAA,OAAO,EAAE,CAAC;AACR,YAAA,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,CAAA,SAAA,EAAY,kBAAkB,CAAA,CAAE;AACjD,YAAA,OAAO,EAAE,mDAAmD;AAC5D,YAAA,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW;AACpC,SAAA,CAAC;IACJ;wGAnBW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,0BAA0B,cADb,MAAM,EAAA,CAAA;;4FACnB,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACwClC,MAAM,iBAAiB,GAAG;AACxB,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,QAAQ,EAAE,4BAA4B;AACtC,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,YAAY,EAAE,qBAAqB;AACnC,IAAA,UAAU,EAAE,oBAAoB;AAChC,IAAA,YAAY,EAAE,oBAAoB;AAClC,IAAA,aAAa,EAAE,mCAAmC;AAClD,IAAA,eAAe,EAAE,kBAAkB;AACnC,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,eAAe,EAAE,6BAA6B;AAC9C,IAAA,YAAY,EAAE;CACf;AAED,MAAM,6BAA6B,GAAqC;AACtE,IAAA,QAAQ,EAAE,YAAY;AACtB,IAAA,MAAM,EAAE,YAAY;AACpB,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,QAAQ,EAAE,gBAAgB;AAC1B,IAAA,QAAQ,EAAE,kBAAkB;AAC5B,IAAA,QAAQ,EAAE,iBAAiB;AAC3B,IAAA,SAAS,EAAE,aAAa;AACxB,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,cAAc,EAAE,WAAW;AAC3B,IAAA,OAAO,EAAE;CACV;MA0CY,qBAAqB,CAAA;AAgEb,IAAA,gBAAA;AACA,IAAA,eAAA;AACA,IAAA,cAAA;AACA,IAAA,UAAA;AAC8B,IAAA,aAAA;AAnEV,IAAA,gBAAgB;AACnB,IAAA,aAAa;AACT,IAAA,iBAAiB;AACrB,IAAA,aAAa;AAExC,IAAA,GAAG;AACH,IAAA,eAAe;AACf,IAAA,IAAI;AAGJ,IAAA,OAAO;AAGP,IAAA,cAAc;AAGb,IAAA,UAAU,GAAG,IAAI,YAAY,EAAuB;AACpD,IAAA,cAAc,GAAG,IAAI,YAAY,EAAQ;AAEhC,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACzB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,iDAAC;AAClB,IAAA,cAAc,GAAG,MAAM,CAAqB,SAAS,0DAAC;AACtD,IAAA,QAAQ,GAAG,MAAM,CAAqB,EAAE,oDAAC;AACzC,IAAA,wBAAwB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAU,oEAAC;AACzE,IAAA,qBAAqB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAU,iEAAC;IACtE,uBAAuB,GAAG,SAAS,EAAE;AACrC,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,2DAAC;AAC/B,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAClC,IAAA,cAAc,GAAG,MAAM,CAAwC,SAAS,0DAAC;AACzE,IAAA,aAAa,GAAG,MAAM,CAAqB,SAAS,yDAAC;AACrD,IAAA,uBAAuB,GAGrC;AACH,QAAA,EAAE,KAAK,EAAE,kBAAkB,EAAE,KAAK,EAAE,WAAW,EAAE;AACjD,QAAA,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE;AACnD,QAAA,EAAE,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE;AACjD,QAAA,EAAE,KAAK,EAAE,sBAAsB,EAAE,KAAK,EAAE,YAAY,EAAE;AACtD,QAAA,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;AAC5C,QAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO;KACjC;AACS,IAAA,YAAY,GAAsB,IAAI,CAAC,kBAAkB,EAAE;AAClD,IAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK,gEAAC;AACpC,IAAA,uBAAuB,GAAG,MAAM,CAAC,KAAK,mEAAC;AACvC,IAAA,kBAAkB,GAAG,MAAM,CAAC,KAAK,8DAAC;AAClC,IAAA,WAAW,GAAG,MAAM,CAAwB,EAAE,uDAAC;AAC/C,IAAA,mBAAmB,GAAG,MAAM,CAC7C,SAAS,+DACV;AACkB,IAAA,kBAAkB,GAAG,MAAM,CAAqB,SAAS,8DAAC;AAC1D,IAAA,sBAAsB,GAIpC;QACH,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE;QACnD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE;QACtD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;QAClD,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ;KAC3D;AACS,IAAA,iBAAiB,GAA2B,IAAI,CAAC,uBAAuB,EAAE;IAEpF,WAAA,CACmB,gBAAqC,EACrC,eAA4C,EAC5C,cAA0C,EAC1C,UAAsB,EACQ,aAAiC,EAAA;QAJ/D,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,UAAU,GAAV,UAAU;QACoB,IAAA,CAAA,aAAa,GAAb,aAAa;IAC3D;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjD;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,KAAK,EAAE;IAC3C;AAEA,IAAA,IAAc,MAAM,GAAA;AAClB,QAAA,OAAO,iBAAiB;IAC1B;AAEA,IAAA,IAAc,eAAe,GAAA;AAC3B,QAAA,OAAO,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9C;AAEU,IAAA,gBAAgB,CAAC,OAAyB,EAAA;AAClD,QAAA,QACE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE;YACrC,OAAO,CAAC,IAAI,KAAK,WAAW;YAC5B,CAAC,OAAO,CAAC,eAAe;AACxB,YAAA,CAAC,OAAO,CAAC,WAAW;IAExB;AAEU,IAAA,cAAc,CAAC,OAAyB,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACvE;IAGU,gBAAgB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B,IAAI,CAAC,aAAa,EAAE;YACpB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;YAC/B,IAAI,CAAC,kBAAkB,EAAE;YACzB;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE;YACxC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;YACpD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACnD;IACF;IAEU,gBAAgB,GAAA;AACxB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACpD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE;IACvB;AAEU,IAAA,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,EAAA;AAC1C,QAAA,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE;QAErC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACvC;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,gBAAgB,GAAG;YACvB,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AAC/D,YAAA,WAAW,EAAE;SACd;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,WAAW,CACV,cAAc,EACd,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,SAAS,EACT,OAAO,EACP,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC;AAE/E,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,cAAc,CACjB,gBAAgB,CAAC,EAAE,EACnB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAC9D;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,EAAE;AACvC,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEU,IAAA,eAAe,CAAC,UAA+B,EAAA;AACvD,QAAA,OAAO,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,KAAK;IACvE;IAEU,wBAAwB,CAChC,cAAqC,EAAE,EAAA;QAEvC,OAAO,WAAW,CAAC,IAAI,CACrB,UAAU,IACR,OAAO,UAAU,KAAK,QAAQ;AAC9B,YAAA,UAAU,CAAC,YAAY,KAAK,iBAAiB,CAChD;IACH;IAEU,0BAA0B,CAClC,cAAqC,EAAE,EAAA;AAEvC,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuC;AAC7D,QAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;YACpC,IACE,OAAO,UAAU,KAAK,QAAQ;AAC9B,gBAAA,UAAU,CAAC,YAAY,KAAK,iBAAiB,EAC7C;gBACA;YACF;YACA,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,MAAM;YACpD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;QACnE;AACA,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM;YACxD,OAAO;YACP;AACD,SAAA,CAAC,CAAC;IACL;AAEU,IAAA,aAAa,CAAC,UAA+B,EAAA;QACrD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE;AAClE,YAAA,IAAI,CAAC,WAAW,CACd,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,OAAO,CACjE;YACD;QACF;QAEA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;QACrC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC;aACF,oBAAoB,CACnB,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,gBAAgB,EAC3B,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAClE;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,IAAI,CAAC,aAAa,CAAC;AACjB,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEU,IAAA,iBAAiB,CAAC,MAA2B,EAAA;AACrD,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;IAC9B;IAEU,YAAY,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;IAC5B;IAEU,sBAAsB,GAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACjE;IAEU,iBAAiB,GAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;AACzB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAC3D,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnC,QAAA,IAAI,CAAC;AACF,aAAA,cAAc;AACd,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,IAAI,IAAG;AACX,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,oEAAoE,CAAC;YACnG;AACD,SAAA,CAAC;AAEJ,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IACjE;IAEU,kBAAkB,CAAC,oBAAoB,GAAG,IAAI,EAAA;AACtD,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC;AACvC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;QAEtC,IAAI,oBAAoB,EAAE;YACxB,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC;IACF;IAEU,sBAAsB,GAAA;QAC9B,OAAO,OAAO,CACZ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE;AAClC,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;AACnC,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;YACnC,IAAI,CAAC,iBAAiB,CAAC,QAAQ;AAC/B,YAAA,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAChC;IACH;IAEU,mBAAmB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE;YAClC;QACF;AAEA,QAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC;AACtC,QAAA,IAAI,CAAC;AACF,aAAA,YAAY,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE;YACxC,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;YAC1C,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI;AACnC,kBAAE,EAAE,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;kBAC5C,EAAE,CAAC;YACP,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE;AAC1C,YAAA,QAAQ,EAAE,IAAI,CAAC,iBAAiB,CAAC,QAAQ;YACzC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YACtC,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI;SAC5C;AACA,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAM,IAAG;AACb,gBAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,MAAM,CAAC;AACpC,gBAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;YACzC,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC;AACvC,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CACzB,4EAA4E,CAC7E;YACH;AACD,SAAA,CAAC;IACN;AAEU,IAAA,YAAY,CAAC,eAAiC,EAAA;AACtD,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,eAAe,CAAC;AACtF,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7D;IAEU,aAAa,CAAC,oBAAoB,GAAG,IAAI,EAAA;AACjD,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;AAC/B,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;QAEjC,IAAI,oBAAoB,EAAE;YACxB,UAAU,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC;IACF;IAEU,iBAAiB,GAAA;QACzB,OAAO,OAAO,CACZ,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;AAC7B,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;YAC9B,IAAI,CAAC,YAAY,CAAC,QAAQ;AAC1B,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE;AACjC,YAAA,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAC3B;IACH;IAEU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;AACjC,QAAA,IAAI,CAAC;AACF,aAAA,cAAc,CAAC;YACd,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;YACnC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;YACrC,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI;AAC9B,kBAAE,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;kBACvC,EAAE,CAAC;AACP,YAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ;YACpC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE;YACrC,IAAI,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI;AAC1C,kBAAE,EAAE,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE;kBAC/D,EAAE,CAAC;YACP,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,EAAE;YAC3C,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,SAAS;YACpD,IAAI,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,GAAG,EAAE;SAC3E;AACA,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,MAAM,IAAG;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC/B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,CAAC;YACD,KAAK,EAAE,MAAK;AACV,gBAAA,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;AAClC,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CACpB,+EAA+E,CAChF;YACH;AACD,SAAA,CAAC;IACN;AAEU,IAAA,gBAAgB,CAAC,IAAY,EAAA;QACrC,OAAO,6BAA6B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;eACzD,6BAA6B,CAAC,SAAS,CAAC;IAC/C;AAEU,IAAA,gBAAgB,CAAC,MAAgD,EAAA;QACzE,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;AACtD,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,QAAQ,KAAK,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;IACtF;IAEU,kBAAkB,CAC1B,KAA6B,EAC7B,QAAgB,EAAA;AAEhB,QAAA,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE;IAC5E;AAEU,IAAA,cAAc,CAAC,MAAoC,EAAA;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QACjC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC;aACF,oBAAoB,CACnB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,gBAAgB,EACvB,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CACH,SAAS,CAAC,QAAQ,IAAG;YACnB,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AACrD,gBAAA,OAAO,EAAE,CAAC,QAAQ,CAAC;YACrB;YACA,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,EACzB,SAAS,EACT,QAAQ,CAAC,cAAc,EACvB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO,CACR;QACH,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAC9D;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,IAAI,CAAC,aAAa,CAAC;AACjB,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;IAEU,oBAAoB,CAC5B,OAAyB,EACzB,QAA2C,EAAA;AAE3C,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa;AAC3C,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,cAAc,EAAE;AAEnD,QAAA,IACE,CAAC,aAAa;AACd,YAAA,CAAC,qBAAqB;AACtB,YAAA,OAAO,CAAC,cAAc;AACtB,YAAA,IAAI,CAAC,SAAS,EAAE,EAChB;YACA;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,IAAI,IACf,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,CACtE,CACF;AACD,QAAA,MAAM,WAAW,GAAG,QAAQ,KAAK;AAC/B,cAAE,CAAA,SAAA,EAAY,aAAa,CAAC,OAAO,CAAA;AACnC,cAAE,CAAA,QAAA,EAAW,aAAa,CAAC,OAAO,EAAE;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,aAAa,CACZ,aAAa,CAAC,EAAE,EAChB,QAAQ,EACR,qBAAqB,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC9E,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,IAAI,IACf,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,CACvE,CACF;gBACD,IAAI,CAAC,aAAa,CAAC;AACjB,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEQ,IAAA,mBAAmB,CAAC,KAAc,EAAA;QACxC,IACE,KAAK,YAAY,iBAAiB;AAClC,YAAA,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,CAAC,KAAK,KAAK,IAAI;YACpB,SAAS,IAAI,KAAK,CAAC,KAAK;AACxB,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;YACvC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAC1B;YACA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QACnC;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY;IACjC;AAEU,IAAA,iBAAiB,CAAC,KAAoB,EAAA;QAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;AAEU,IAAA,gBAAgB,CAAC,SAAiB,EAAA;QAC1C,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IACvD;IAEU,aAAa,CAAC,SAAiB,EAAE,aAAsB,EAAA;QAC/D,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;QACjD,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAC/B,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,EAAU,CACnD;QACD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAC5B,OAAO,IAAI,aAAa,KAAK;AAC3B,cAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACvD,cAAE,IAAI,GAAG,EAAU,CACtB;IACH;IAEU,mBAAmB,CAAC,SAAiB,EAAE,MAAc,EAAA;AAC7D,QAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/E;IAEU,eAAe,CAAC,SAAiB,EAAE,MAAc,EAAA;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;AAChD,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,YAAY,IAAG;AAC/C,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC;AAClC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACf;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,eAAe,CAAC,eAAyC,EAAA;AACjE,QAAA,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,IAAI,EAAE;IAC3F;AAEU,IAAA,UAAU,CAAC,aAAqC,EAAA;AACxD,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAChC,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EACzD,CAAC,CACF;IACH;IAEU,UAAU,CAAC,aAAqC,EAAE,KAAa,EAAA;AACvE,QAAA,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AACxE,QAAA,OAAO,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC3E;IAEU,iBAAiB,CACzB,aAAqC,EACrC,KAAa,EAAA;QAEb,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC;AAC7D,QAAA,OAAO,GAAG,UAAU,CAAA,CAAA,EAAI,GAAG,GAAG,UAAU,EAAE;IAC5C;IAEU,kBAAkB,CAC1B,aAAqC,EACrC,KAAa,EAAA;QAEb,OAAO,CAAC,aAAa,CAAC;AACnB,aAAA,KAAK,CAAC,CAAC,EAAE,KAAK;aACd,MAAM,CACL,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,KACxB,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,UAAU,CAAC,EACzD,CAAC,CACF;IACL;IAEU,QAAQ,CAAC,aAAqC,EAAE,KAAa,EAAA;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC;QACV;QACA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC;IAClF;AAEU,IAAA,cAAc,CAAC,aAAqC,EAAA;AAC5D,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CACrC,CAAC,KAAK,EAAE,KAAK,KAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA,CAAE,CAC1E;AACD,QAAA,OAAO,CAAA,EAAG,aAAa,CAAC,KAAK,CAAA,kBAAA,EAAqB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;IACxE;IAEQ,eAAe,CACrB,aAAqC,EACrC,KAAa,EAAA;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC5C,QAAA,OAAO;cACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI;cAClE,CAAC;IACP;AAEU,IAAA,gBAAgB,CAAC,KAAsC,EAAA;QAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC;AAEU,IAAA,QAAQ,CAAC,KAAsC,EAAA;AACvD,QAAA,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK;AACxE,cAAE;cACA,SAAS;IACf;IAEU,aAAa,CACrB,KAAsC,EACtC,GAAW,EAAA;AAEX,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IACnD;IAEU,eAAe,CACvB,KAAsC,EACtC,GAAW,EAAA;AAEX,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACzC,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;IAC1C;IAEU,UAAU,CAClB,KAAsC,EACtC,GAAW,EAAA;QAEX,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IACpC;AAEU,IAAA,YAAY,CACpB,KAA0D,EAC1D,YAAA,GAAyB,EAAE,EAAA;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC1E,QAAA,OAAO;AACL,cAAE,MAAM,CAAC,OAAO,CAAC,MAAM;iBAClB,MAAM,CACL,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KACX,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;iBAEhE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM;gBACtB,GAAG;AACH,gBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AACjC,gBAAA,KAAK,EAAE;AACR,aAAA,CAAC;cACJ,EAAE;IACR;AAEU,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACtC,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG;AACjB,aAAA,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;IAC3D;AAEU,IAAA,iBAAiB,CAAC,KAAsC,EAAA;AAChE,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,MAAM;QACf;AACA,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,OAAO,cAAc;QACvB;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;YAC9B,OAAO,KAAK,GAAG,KAAK,GAAG,IAAI;QAC7B;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnE;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,KAAK,IAAI,OAAO;QACzB;AACA,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC9B;AAEU,IAAA,gBAAgB,CAAC,KAAsC,EAAA;AAC/D,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;IAC3D;AAEU,IAAA,aAAa,CAAC,IAAwB,EAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU;AACvF,QAAA,OAAO,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS;IACxD;AAEU,IAAA,gBAAgB,CAAC,IAAwB,EAAA;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QACvC,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;IAC9D;AAEU,IAAA,aAAa,CAAC,IAAwB,EAAA;QAC9C,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI;AAC/D,cAAE;AACF,cAAE,IAAI,CAAC,MAAM;IACjB;AAEU,IAAA,eAAe,CAAC,IAAwB,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACvC,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,QAAQ,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,EAAE;YAC9E;AACA,YAAA,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,GAAG,kBAAkB,GAAG,WAAW;QACpE;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK;AACrB,cAAE;AACF,cAAE,IAAI,CAAC,MAAM,KAAK;AAChB,kBAAE;kBACA,SAAS;IACjB;AAEU,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAC5C,QAAA,MAAM,MAAM,GAA2B;AACrC,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,iBAAiB,EAAE,uBAAuB;AAC1C,YAAA,SAAS,EAAE,kBAAkB;AAC7B,YAAA,kBAAkB,EAAE,qBAAqB;AACzC,YAAA,mBAAmB,EAAE,qBAAqB;AAC1C,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,MAAM,EAAE,kBAAkB;AAC1B,YAAA,QAAQ,EAAE;SACX;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IAC5D;IAEQ,kBAAkB,GAAA;QACxB,MAAM,MAAM,GAAuB,EAAE;AAErC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe;QAC/C;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;QACvB;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;QACzB;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAC/B;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;QAC7C;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,aAAa,CAAC,OAAyB,EAAA;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,sBAAsB,CAAC,SAAiB,EAAE,OAAe,EAAA;AAC/D,QAAA,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE;QACrC,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,IAClB,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC;cAChC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,cAAc;AACvC,cAAE,OAAO,CACZ,CACF;QACD,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,CAAC,SAAiB,EAAE,WAA6B,EAAA;QACrE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,IAClB,OAAO,CAAC,EAAE,KAAK;AACb,cAAE,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK;AACrD,cAAE,OAAO,CACZ,CACF;QACD,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACxC,YAAA,OAAO,EAAE;QACX;QAEA,OAAO;YACL,IAAI,CAAC,aAAa,CAChB,WAAW,EACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,EAC3D,IAAI,CAAC,eAAe,CAAC,kBAAkB;SAE1C;IACH;AAEQ,IAAA,iBAAiB,CAAC,cAAsB,EAAA;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACrC,QAAA,MAAM,aAAa,GAAG;YACpB,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,GAAG,aAAa,CAAC;YACrB,IAAI,GAAG,MAAM,CAAC;YACd,IAAI,GAAG,UAAU;AAClB,SAAA,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAE1D,QAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;AACrC,YAAA,OAAO,cAAc;QACvB;QAEA,MAAM,SAAS,GAAG;AACf,aAAA,IAAI;AACJ,aAAA,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,cAAc;QACvB;AAEA,QAAA,IAAI,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACpC,OAAO,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA,CAAG,CAAC;QAC3D;QAEA,OAAO,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,CAAG,CAAC;IACjE;IAEQ,iBAAiB,GAAA;QACvB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI;QAC3D,OAAO,OAAO,cAAc,KAAK;cAC7B,cAAc;cACd,cAAc;IACpB;AAEQ,IAAA,uBAAuB,CAC7B,IAA6B,EAAA;QAE7B,OAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC3B,aAAa;gBACb,MAAM;gBACN,UAAU;gBACV,WAAW;gBACX;aACD,CAAC;AACF,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AACxD,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AACjE,YAAA,KAAK,EAAE,EAAE;AACT,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,IAAI,EAAE;SACP;IACH;IAEQ,kBAAkB,CACxB,IAA6B,EAC7B,eAAkC,EAAA;QAElC,MAAM,YAAY,GAAG;AACnB,cAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe;cACxC,EAAE,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE;QAExC,OAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;gBAC3B,aAAa;gBACb,MAAM;gBACN,UAAU;gBACV,WAAW;gBACX;aACD,CAAC;AACF,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;AACxD,YAAA,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AACjE,YAAA,QAAQ,EAAE,YAAY;YACtB,KAAK,EAAE,YAAY,CAAC,KAAK;YACzB,iBAAiB,EAAE,YAAY,CAAC,iBAAiB;AACjD,YAAA,QAAQ,EAAE;SACX;IACH;AAEQ,IAAA,mBAAmB,CAAC,eAAiC,EAAA;AAI3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,eAAe,CAAC,EAAE,CAAC;AACtF,QAAA,IAAI,kBAAkB,GAAG,CAAC,CAAC;AAC3B,QAAA,KAAK,IAAI,KAAK,GAAG,aAAa,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;YAC1D,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,MAAM,EAAE;gBACpC,kBAAkB,GAAG,KAAK;gBAC1B;YACF;QACF;QAEA,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,IAAI,EAAE;YAClD,iBAAiB,EAAE,eAAe,CAAC;SACpC;IACH;IAEQ,WAAW,CACjB,IAAwC,EACxC,IAAc,EAAA;QAEd,MAAM,KAAK,GAAG;aACX,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC;AACtB,aAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAC3D,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;IACtD;IAEQ,8BAA8B,CACpC,QAA+B,EAC/B,SAAiB,EAAA;QAEjB,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC;AAEvE,QAAA,OAAO,IAAI,CAAC,aAAa,CACvB,WAAW,EACX,eAAe,CAAC,qBAAqB,IAAI,QAAQ,CAAC,MAAM,EACxD,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,OAAO,EAChC,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,iBAAiB,EAAE,SAAS,EAC3D,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,iBAAiB,EAAE,UAAU,EAC7D,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,EACxC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EACnD,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,gBAAgB,EACzB,eAAe,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,iBAAiB,CAAC,aAAa,EACxC,QAAQ,CAAC,cAAc,CACxB;IACH;IAEQ,aAAa,CACnB,IAA8B,EAC9B,OAAe,EACf,WAAA,GAAqC,EAAE,EACvC,OAAA,GAAuC,EAAE,EACzC,MAAe,EACf,WAAoB,EACpB,GAAY,EACZ,YAAqB,EACrB,SAAkB,EAClB,UAAmB,EACnB,UAA8B,EAC9B,QAAuC,EACvC,SAA6B,EAC7B,UAA8B,EAC9B,OAAiB,EACjB,gBAA2B,EAC3B,eAA0C,EAC1C,MAAwC,EACxC,aAAiD,EACjD,aAAiD,EACjD,KAAiC,EACjC,aAAsB,EACtB,cAAwC,EAAA;QAExC,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE;YACnB,IAAI;YACJ,OAAO;YACP,eAAe;YACf,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,UAAU,CAAC;AACvF,YAAA,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAE,OAAO,CAAC;AACzF,YAAA,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC;YACnF,oBAAoB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC;YACnE,2BAA2B,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,kBAAkB,CAAC;YACjF,WAAW;YACX,OAAO;YACP,MAAM;YACN,WAAW;YACX,GAAG;YACH,YAAY;YACZ,SAAS;YACT,UAAU;YACV,UAAU;AACV,YAAA,QAAQ,EAAE,UAAU;YACpB,QAAQ;YACR,SAAS;YACT,UAAU;YACV,OAAO;YACP,gBAAgB;YAChB,MAAM;YACN,aAAa;YACb,aAAa;YACb,KAAK;YACL,aAAa;YACb,cAAc;YACd,SAAS,EAAE,IAAI,IAAI;SACpB;IACH;IAEQ,qBAAqB,CAC3B,QAA+B,EAC/B,SAAiB,EAAA;AAEjB,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,IAAI,EAAE;AAC/C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC;QAC3F,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAEtD,OAAO;AACL,YAAA,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,SAAS;AAC1C,YAAA,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB,IAAI,QAAQ,CAAC,MAAM;AACxE,YAAA,oBAAoB,EAAE,eAAe;AACrC,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,SAAS;YACvD,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC;YAC/F,IAAI;AACJ,YAAA,MAAM,EAAE,IAAI;YACZ,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,QAAQ,EAAE,QAAQ,CAAC;SACpB;IACH;IAEQ,qBAAqB,CAC3B,QAA+B,EAC/B,QAAmC,EAAA;QAEnC,OAAO;AACL,YAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG;YACvF,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG;AACpE,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,iBAAiB,EAAE,SAAS;AACvF,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,aAAa;YACxF,WAAW,EACT,QAAQ,EAAE;AACP,mBAAA,QAAQ,CAAC;mBACT,QAAQ,CAAC,iBAAiB,EAAE,eAAe;YAChD,UAAU,EACR,QAAQ,EAAE;AACP,mBAAA,QAAQ,CAAC;mBACT,QAAQ,CAAC,iBAAiB,EAAE,UAAU;YAC3C,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ;YAC5E,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;SACnF;IACH;AAEQ,IAAA,eAAe,CACrB,QAA+B,EAAA;AAE/B,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AAC3B,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,CAAC;AACN,gBAAA,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM;AACrC,gBAAA,GAAG,EAAE,QAAQ,CAAC,aAAa,CAAC,QAAQ;AACpC,gBAAA,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC;AACjC,aAAA,CAAC;IACJ;AAEQ,IAAA,6BAA6B,CAAC,QAA+B,EAAA;AACnE,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;AACpE,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,QAAQ,CAAC,UAAU;IAC5B;IAEQ,gBAAgB,CACtB,QAAkC,EAClC,QAA+B,EAAA;AAE/B,QAAA,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE;YACzB,OAAO,QAAQ,CAAC,IAAI;QACtB;AAEA,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE;YAC3B,OAAO,QAAQ,CAAC,MAAM;QACxB;QAEA,IAAI,QAAQ,CAAC,eAAe,EAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE;AACrD,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,SAAS,CAAC;AAE9E,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE1C,OAAO;AACL,YAAA;AACE,gBAAA,KAAK,EAAE,cAAc;gBACrB,OAAO;AACP,gBAAA,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACpF;SACF;IACH;AAEQ,IAAA,gBAAgB,CAAC,KAAc,EAAA;AACrC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;QAEA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;AAE1B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACrC;AAEA,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;AAE5B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;AAEA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,eAAe,CAAC,IAAyB,EAAA;AAC/C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAErF,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;YAC1B,KAAK;AACL,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK;AAClC,SAAA,CAAC,CAAC;IACL;IAEQ,cAAc,CAAC,GAAsB,EAAE,MAAgB,EAAA;QAC7D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1C;IACxB;AAEQ,IAAA,eAAe,CAAC,KAAsC,EAAA;AAC5D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjE;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAClF;QAEA,OAAO,KAAK,IAAI,EAAE;IACpB;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,aAAA,OAAO,CAAC,QAAQ,EAAE,GAAG;AACrB,aAAA,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;IAC3D;AAEQ,IAAA,UAAU,CAAC,KAAc,EAAA;QAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AACpD,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC;AAEQ,IAAA,aAAa,CAAC,KAAc,EAAA;QAClC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;IACpG;AAEQ,IAAA,UAAU,CAAC,KAAc,EAAA;AAC/B,QAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACtE;IAEQ,QAAQ,GAAA;AACd,QAAA,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,IAAI,IAAI,CAAA,EAAG,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,EAAE;IAC9E;IAEQ,YAAY,CAAC,SAAiB,EAAE,MAAc,EAAA;AACpD,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,EAAE;IACjC;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AAC7E,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO;aACJ,KAAK,CAAC,cAAc;AACpB,aAAA,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;aAC1D,KAAK,CAAC,CAAC,EAAE;AACT,aAAA,GAAG,CAAC,OAAO,KAAK;YACf,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AACxC,YAAA,IAAI,OAAO,CAAC,aAAa,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE;AAC1E,SAAA,CAAC,CAAC;IACP;IAEQ,cAAc,GAAA;QACpB,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa;YAEpD,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;YAC1C;AACF,QAAA,CAAC,CAAC;IACJ;AAtvCW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,2JAoEtB,oBAAoB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FApEnB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrIlC,k36DA8tCA,EAAA,MAAA,EAAA,CAAA,yv7BAAA,EAAA,63xBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED3mCI,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,iBAAiB,8xCACjB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,cAAA,EAAA,QAAA,EAAA,YAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,WAAA,EAAA,cAAA,EAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,cAAA,EAAA,MAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,SAAS,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACT,cAAc,0MACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEb,0BAA0B,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,GAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAD1B,wBAAwB,EAAA,IAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,CAAA;;4FAUf,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBArBjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB;wBACP,YAAY;wBACZ,WAAW;wBACX,YAAY;wBACZ,iBAAiB;wBACjB,YAAY;wBACZ,SAAS;wBACT,cAAc;wBACd,aAAa;wBACb,wBAAwB;wBACxB;qBACD,EAAA,aAAA,EAEc,iBAAiB,CAAC,QAAQ,EAAA,QAAA,EAAA,k36DAAA,EAAA,MAAA,EAAA,CAAA,yv7BAAA,EAAA,63xBAAA,CAAA,EAAA;;0BA0EtC,MAAM;2BAAC,oBAAoB;;sBAnE7B,SAAS;uBAAC,kBAAkB;;sBAC5B,SAAS;uBAAC,eAAe;;sBACzB,SAAS;uBAAC,mBAAmB;;sBAC7B,SAAS;uBAAC,eAAe;;sBAEzB;;sBACA;;sBACA;;sBAGA;;sBAGA;;sBAGA;;sBACA;;sBAkFA,YAAY;uBAAC,yBAAyB;;;AEzOzC;;AAEG;;ACFH;;AAEG;;;;"}
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-markdown.pipe.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.html","../../../projects/max-agent-ui/src/lib/config/assistant-endpoint.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-feedback.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-support.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 initialDescription?: string;\n initialSuggestions: string[];\n}\nconst INITIAL_MESSAGE = 'Hi! 👋';\nconst INITIAL_DESCRIPTION =\n \"I'm here to help. Whether you need information, want to complete a task, or just have a question, let me know and we'll get started.\\n\\nI'm still in my early days and learning every day. If I can't do something just yet, I hope you'll bear with me—I'll always do my best to help.\\n\\nWhat would you like to do today?\";\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: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n nemesys: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n attendance: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\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 {\n AssistantProduct,\n AssistantRequestContext,\n AssistantUser\n} from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n context?: Partial<AssistantRequestContext> | (() => Partial<AssistantRequestContext>);\n requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { marked } from 'marked';\n\n@Pipe({\n name: 'maxAssistantMarkdown',\n standalone: true,\n pure: true\n})\nexport class MaxAssistantMarkdownPipe implements PipeTransform {\n transform(value: string | null | undefined): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n\n return marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { AssistantShiftCard } from '../../models/assistant.models';\n\nexport type MaxAgentShiftCardVariant = 'definition' | 'rota';\n\n@Component({\n selector: 'max-agent-shift-card',\n templateUrl: './max-agent-shift-card.component.html',\n styleUrl: './max-agent-shift-card.component.scss'\n})\nexport class MaxAgentShiftCardComponent {\n @Input({ required: true }) shift!: AssistantShiftCard;\n @Input() variant: MaxAgentShiftCardVariant = 'rota';\n\n protected get accentColor(): string {\n const color = this.shift.color?.trim();\n if (!color) {\n return '#64748b';\n }\n return /^(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color)\n ? `#${color}`\n : color;\n }\n\n protected get timeLabel(): string {\n const formatter = this.variant === 'rota'\n ? this.formatTimeToAmPm\n : this.formatTime;\n const start = formatter(this.shift.startTime);\n const end = formatter(this.shift.endTime);\n return start && end ? `${start} - ${end}` : start || end || 'All day';\n }\n\n protected get departmentLabel(): string {\n const count = this.shift.departments?.length ?? 0;\n return count\n ? `${count} department${count === 1 ? '' : 's'}`\n : 'All departments';\n }\n\n protected get taskLabel(): string {\n const count = this.shift.taskCount ?? 0;\n return `${count} task${count === 1 ? '' : 's'}`;\n }\n\n private formatTime(value: string): string {\n return value.match(/^\\d{2}:\\d{2}/)?.[0] ?? value;\n }\n\n private formatTimeToAmPm(value: string): string {\n const match = value.match(/^(\\d{1,2}):(\\d{2})/);\n if (!match) {\n return value;\n }\n const hour = Number(match[1]);\n const displayHour = ((hour + 11) % 12) + 1;\n return `${displayHour}.${match[2]} ${hour >= 12 ? 'PM' : 'AM'}`;\n }\n}\n","<article\n class=\"max-agent-shift-card\"\n [class.definition-card]=\"variant === 'definition'\"\n [class.rota-card]=\"variant === 'rota'\"\n [style.--max-agent-shift-accent]=\"accentColor\"\n [attr.aria-label]=\"(shift.description || shift.code || 'Shift') + ', ' + timeLabel\"\n>\n <header>\n <strong>{{ timeLabel }}</strong>\n @if(variant === 'definition' && shift.days) {\n <span>{{ shift.days }}</span>\n }\n </header>\n\n @if(variant === 'definition') {\n @if(shift.code) {\n <p><i class=\"pi pi-tag\" aria-hidden=\"true\"></i><span>{{ shift.code }}</span></p>\n }\n @if(shift.description) {\n <p><i class=\"pi pi-align-left\" aria-hidden=\"true\"></i><span>{{ shift.description }}</span></p>\n }\n <p><i class=\"pi pi-building\" aria-hidden=\"true\"></i><span>{{ departmentLabel }}</span></p>\n @if((shift.taskCount ?? 0) > 0) {\n <p><i class=\"pi pi-check-square\" aria-hidden=\"true\"></i><span>{{ taskLabel }}</span></p>\n }\n } @else {\n @if(shift.location) {\n <p><i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i><span>{{ shift.location }}</span></p>\n }\n @if(shift.role) {\n <p><i class=\"pi pi-user\" aria-hidden=\"true\"></i><span>{{ shift.role }}</span></p>\n }\n }\n</article>\n","import { isDevMode } from '@angular/core';\n\nexport const ASSISTANT_CHAT_ENDPOINTS = {\n development: '/agent-api/v1/chat',\n production: 'https://agent.maxtime.cloud/v1/chat'\n} as const;\n\nexport function getDefaultAssistantChatUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_CHAT_ENDPOINTS.development\n : ASSISTANT_CHAT_ENDPOINTS.production;\n}\n","import { HttpClient, HttpErrorResponse, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport { getDefaultAssistantChatUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantChatRequest,\n AssistantChatProgress,\n AssistantChatResponse,\n AssistantChatStreamEvent,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantStructuredAction,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_APP = 'cortex';\nconst DEFAULT_TIMEZONE = 'UTC';\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 confirmation?: AssistantConfirmation,\n history: AssistantConversationMessage[] = [],\n onProgress?: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n ...(onProgress ? { stream: true } : {}),\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n ...(confirmation ? { confirmation } : {})\n };\n\n return this.postMessage(request, assistantConfig, onProgress);\n }\n\n confirmAction(\n actionId: number,\n decision: AssistantConfirmation['decision'],\n conversationId: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n return this.sendMessage(\n decision === 'approve' ? 'Approve action' : 'Reject action',\n conversationId,\n config,\n { actionId, decision },\n history\n );\n }\n\n sendStructuredAction(\n message: string,\n action: AssistantStructuredAction,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = this.mergeConfig(config);\n const context = this.getContext(assistantConfig);\n const user = this.getRequestUser(assistantConfig);\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n ...(user ? { user } : {}),\n ...(context ? { context } : {}),\n structuredAction: action\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress?: (progress: AssistantChatProgress) => void\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 if (onProgress) {\n return this.streamMessage(request, config, onProgress);\n }\n\n return this.http.post<AssistantChatResponse>(\n this.getChatUrl(config),\n request,\n { headers: this.getHeaders(config) }\n );\n }\n\n private streamMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n return new Observable(subscriber => {\n const controller = new AbortController();\n const headers = this.getHeaders(config);\n const fetchHeaders = Object.fromEntries(\n headers.keys().map(name => [name, headers.get(name) ?? ''])\n );\n\n void fetch(this.getChatUrl(config), {\n method: 'POST',\n headers: fetchHeaders,\n body: JSON.stringify(request),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const error = await response.json().catch(() => undefined);\n throw new HttpErrorResponse({\n error,\n status: response.status,\n statusText: response.statusText,\n url: response.url\n });\n }\n\n if (!response.body) {\n throw new Error('The assistant response stream was unavailable.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let receivedResult = false;\n\n const processLine = (line: string) => {\n const trimmedLine = line.trim();\n if (!trimmedLine) {\n return;\n }\n\n const event = JSON.parse(trimmedLine) as AssistantChatStreamEvent;\n if (event.type === 'progress') {\n onProgress(event);\n return;\n }\n if (event.type === 'error') {\n throw new Error(event.message);\n }\n\n receivedResult = true;\n subscriber.next(event.response);\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n lines.forEach(processLine);\n }\n\n buffer += decoder.decode();\n processLine(buffer);\n\n if (!receivedResult) {\n throw new Error('The assistant response stream ended before a result was returned.');\n }\n\n subscriber.complete();\n }).catch(error => {\n if (!subscriber.closed && error?.name !== 'AbortError') {\n subscriber.error(error);\n }\n });\n\n return () => controller.abort();\n });\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || getDefaultAssistantChatUrl();\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 getRequestUser(\n config: MaxAssistantConfig\n ): Pick<AssistantUser, 'name' | 'username' | 'email'> | undefined {\n const configuredUser = this.getUser(config);\n const user = {\n ...this.getOptionalText('name', configuredUser.name),\n ...this.getOptionalText('username', configuredUser.username),\n ...this.getOptionalText('email', configuredUser.email)\n };\n\n return Object.keys(user).length > 0 ? user : undefined;\n }\n\n private getOptionalText<Key extends 'name' | 'username' | 'email'>(\n key: Key,\n value: AssistantUser[Key]\n ): Partial<Pick<AssistantUser, Key>> {\n if (typeof value !== 'string' || !value.trim()) {\n return {};\n }\n\n return { [key]: value.trim() } as Partial<Pick<AssistantUser, Key>>;\n }\n\n private getContext(config: MaxAssistantConfig): AssistantRequestContext | undefined {\n const configured = typeof config.context === 'function'\n ? config.context()\n : config.context;\n\n if (!configured) {\n return undefined;\n }\n\n return {\n permissions: configured.permissions ?? [],\n timezone: configured.timezone\n ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n ?? DEFAULT_TIMEZONE,\n ...(configured.tenantId ? { tenantId: configured.tenantId } : {}),\n ...(configured.organisationId\n ? { organisationId: configured.organisationId }\n : {}),\n ...(configured.userId ? { userId: configured.userId } : {}),\n ...(configured.role ? { role: configured.role } : {}),\n ...(configured.route ? { route: configured.route } : {}),\n ...(configured.module ? { module: configured.module } : {})\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n\n if (trimmedName && trimmedValue) {\n headers = headers.set(trimmedName, trimmedValue);\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n\n return headers;\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 private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...this.compactConfig(config)\n };\n\n if (config.user === undefined) {\n return merged;\n }\n\n return {\n ...merged,\n user: {\n ...this.getUser(this.config),\n ...this.getUser(config)\n }\n };\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, delay, of } from 'rxjs';\n\nimport {\n AssistantFeedbackRequest,\n AssistantFeedbackResponse\n} from '../../models/assistant.models';\n\nlet mockFeedbackSequence = 1000;\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantFeedbackService {\n readonly endpoint = '/agent-api/v1/feedback';\n readonly method = 'POST' as const;\n\n submitFeedback(\n _feedback: AssistantFeedbackRequest\n ): Observable<AssistantFeedbackResponse> {\n mockFeedbackSequence += 1;\n\n return of({\n success: true,\n feedbackReference: `MAX-FEEDBACK-${mockFeedbackSequence}`,\n message: 'Thank you. Your feedback has been shared with the Maxtime development team.',\n submittedAt: new Date().toISOString()\n }).pipe(delay(350));\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\n\nimport {\n AssistantSupportTag,\n AssistantSupportTicketRequest,\n AssistantSupportTicketResponse\n} from '../../models/assistant.models';\n\nconst MOCK_SUPPORT_TAGS: AssistantSupportTag[] = [\n { value: 'scheduling', label: 'Scheduling & Rotas', icon: 'pi pi-calendar', severity: 'info' },\n { value: 'timesheets', label: 'Timesheets', icon: 'pi pi-clock', severity: 'secondary' },\n { value: 'clocking', label: 'Clocking & Attendance', icon: 'pi pi-stopwatch', severity: 'warn' },\n { value: 'people', label: 'People', icon: 'pi pi-user', severity: 'info' },\n { value: 'teams-locations', label: 'Teams & Locations', icon: 'pi pi-building', severity: 'secondary' },\n { value: 'holiday', label: 'Holiday & Time Off', icon: 'pi pi-sun', severity: 'success' },\n { value: 'payroll', label: 'Payroll & Pay', icon: 'pi pi-wallet', severity: 'success' },\n { value: 'reporting', label: 'Reporting & Insights', icon: 'pi pi-chart-bar', severity: 'info' },\n { value: 'configuration', label: 'Configuration', icon: 'pi pi-cog', severity: 'secondary' },\n { value: 'permissions', label: 'Permissions & Access', icon: 'pi pi-shield', severity: 'warn' },\n { value: 'performance', label: 'Performance', icon: 'pi pi-chart-line', severity: 'success' },\n { value: 'technical', label: 'Technical Issue', icon: 'pi pi-wrench', severity: 'danger' }\n];\n\nlet mockTicketSequence = 1000;\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantSupportService {\n readonly tagsEndpoint = 'selection/support-tags';\n readonly ticketsEndpoint = 'support/tickets';\n\n getSupportTags(): Observable<AssistantSupportTag[]> {\n return of(MOCK_SUPPORT_TAGS.map(tag => ({ ...tag })));\n }\n\n submitTicket(\n _ticket: AssistantSupportTicketRequest\n ): Observable<AssistantSupportTicketResponse> {\n mockTicketSequence += 1;\n\n return of({\n success: true,\n ticketReference: `MAX-DEMO-${mockTicketSequence}`,\n message: 'Your support ticket has been raised successfully.',\n submittedAt: new Date().toISOString()\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n isDevMode,\n OnInit,\n Output,\n signal,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { SelectModule } from 'primeng/select';\nimport { TagModule } from 'primeng/tag';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { of, switchMap } from 'rxjs';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig\n} from '../../config/assistant-bootstrap.config';\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatResponse,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantDeveloperTrace,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\n AssistantFeedbackCategory,\n AssistantFeedbackResponse,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantHostAction,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantSearchResult,\n AssistantSuggestion,\n AssistantSuggestionOption,\n AssistantSupportTag,\n AssistantSupportTagSeverity,\n AssistantSupportTicketResponse,\n AssistantSupportTicketSeverity,\n AssistantTraceStep,\n AssistantUser,\n AssistantVisualisation\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\nimport { MaxAssistantFeedbackService } from './max-assistant-feedback.service';\nimport { MaxAssistantSupportService } from './max-assistant-support.service';\nimport { MaxAssistantMarkdownPipe } from './max-assistant-markdown.pipe';\nimport { MaxAgentShiftCardComponent } from '../shift-card/max-agent-shift-card.component';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max',\n subtitle: 'Your Personal AI Assistant',\n clearLabel: 'Start a new session',\n clearTooltip: 'Start a new session',\n closeLabel: 'Close AI assistant',\n closeTooltip: 'Close AI assistant',\n feedbackLabel: 'Provide feedback on this response',\n feedbackTooltip: 'Provide feedback',\n placeholder: 'Ask Max',\n startingMessage: 'Understanding your request…',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\n};\n\nconst ASSISTANT_SEARCH_RESULT_ICONS: Readonly<Record<string, string>> = {\n EMPLOYEE: 'pi pi-user',\n PERSON: 'pi pi-user',\n TEAM: 'pi pi-users',\n SCHEDULE: 'pi pi-calendar',\n LOCATION: 'pi pi-map-marker',\n POSITION: 'pi pi-briefcase',\n TIMESHEET: 'pi pi-clock',\n CONFIGTEAM: 'pi pi-cog',\n CONFIGLOCATION: 'pi pi-cog',\n DEFAULT: 'pi pi-search'\n};\n\ninterface SupportTicketFormValue {\n name: string;\n email: string;\n phone: string;\n query: string;\n severity: AssistantSupportTicketSeverity;\n tags: string[];\n}\n\ninterface FeedbackFormValue {\n name: string;\n email: string;\n phone: string;\n category: AssistantFeedbackCategory;\n query: string;\n assistantResponse: string;\n feedback: string;\n}\n\n@Component({\n selector: 'max-assistant',\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n MultiSelectModule,\n SelectModule,\n TagModule,\n TextareaModule,\n TooltipModule,\n MaxAssistantMarkdownPipe,\n MaxAgentShiftCardComponent\n ],\n templateUrl: './max-assistant.component.html',\n encapsulation: ViewEncapsulation.Emulated,\n styleUrls: [\n './max-assistant.component.scss',\n './max-assistant.workspace.scss'\n ]\n})\nexport class MaxAssistantComponent implements OnInit {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n @ViewChild('composerInput') private composerInput?: ElementRef<HTMLTextAreaElement>;\n @ViewChild('supportQueryInput') private supportQueryInput?: ElementRef<HTMLTextAreaElement>;\n @ViewChild('feedbackInput') private feedbackInput?: ElementRef<HTMLTextAreaElement>;\n\n @Input() app?: AssistantProduct;\n @Input() assistantApiUrl?: string;\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n @Output() hostAction = new EventEmitter<AssistantHostAction>();\n @Output() closeRequested = new EventEmitter<void>();\n\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 expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly developerDetailsEnabled = isDevMode();\n protected readonly feedbackVisible = signal(false);\n protected readonly feedbackSubmitting = signal(false);\n protected readonly feedbackResult = signal<AssistantFeedbackResponse | undefined>(undefined);\n protected readonly feedbackError = signal<string | undefined>(undefined);\n protected readonly feedbackCategoryOptions: Array<{\n label: string;\n value: AssistantFeedbackCategory;\n }> = [\n { label: 'Incorrect answer', value: 'incorrect' },\n { label: 'Incomplete answer', value: 'incomplete' },\n { label: 'Hard to understand', value: 'unclear' },\n { label: 'Unexpected behaviour', value: 'unexpected' },\n { label: 'Suggestion', value: 'suggestion' },\n { label: 'Other', value: 'other' }\n ];\n protected feedbackForm: FeedbackFormValue = this.createFeedbackForm();\n protected readonly supportTicketVisible = signal(false);\n protected readonly supportTicketSubmitting = signal(false);\n protected readonly supportTagsLoading = signal(false);\n protected readonly supportTags = signal<AssistantSupportTag[]>([]);\n protected readonly supportTicketResult = signal<AssistantSupportTicketResponse | undefined>(\n undefined\n );\n protected readonly supportTicketError = signal<string | undefined>(undefined);\n protected readonly supportSeverityOptions: Array<{\n label: string;\n value: AssistantSupportTicketSeverity;\n severity: AssistantSupportTagSeverity;\n }> = [\n { label: 'Low', value: 'low', severity: 'success' },\n { label: 'Medium', value: 'medium', severity: 'info' },\n { label: 'High', value: 'high', severity: 'warn' },\n { label: 'Critical', value: 'critical', severity: 'danger' }\n ];\n protected supportTicketForm: SupportTicketFormValue = this.createSupportTicketForm();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly feedbackService: MaxAssistantFeedbackService,\n private readonly supportService: MaxAssistantSupportService,\n private readonly destroyRef: DestroyRef,\n @Inject(MAX_ASSISTANT_CONFIG) private readonly defaultConfig: MaxAssistantConfig\n ) {}\n\n ngOnInit(): void {\n this.messages.set(this.createDefaultMessages());\n }\n\n focusComposer(): void {\n this.composerInput?.nativeElement.focus();\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 isWelcomeMessage(message: AssistantMessage): boolean {\n return (\n this.messages()[0]?.id === message.id &&\n message.role === 'assistant' &&\n !message.displayResponse &&\n !message.isStreaming\n );\n }\n\n protected isWelcomeState(message: AssistantMessage): boolean {\n return this.messages().length === 1 && this.isWelcomeMessage(message);\n }\n\n @HostListener('document:keydown.escape')\n protected onDocumentEscape() {\n if (this.feedbackVisible()) {\n this.closeFeedback();\n return;\n }\n\n if (this.supportTicketVisible()) {\n this.closeSupportTicket();\n return;\n }\n\n if (this.expandedDetailMessageIds().size) {\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n }\n }\n\n protected clearChatSession() {\n this.closeFeedback(false);\n this.closeSupportTicket(false);\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.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 const history = this.getConversationHistory();\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n const streamingMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true\n };\n this.appendMessage(streamingMessage);\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(\n trimmedMessage,\n this.conversationId(),\n this.getAssistantConfig(),\n undefined,\n history,\n progress => this.updateStreamingMessage(streamingMessage.id, progress.message)\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.replaceMessage(\n streamingMessage.id,\n this.createAssistantResponseMessage(response, trimmedMessage)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.replaceMessage(streamingMessage.id, {\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected suggestionLabel(suggestion: AssistantSuggestion): string {\n return typeof suggestion === 'string' ? suggestion : suggestion.label;\n }\n\n protected hasCapabilitySuggestions(\n suggestions: AssistantSuggestion[] = []\n ): boolean {\n return suggestions.some(\n suggestion =>\n typeof suggestion !== 'string' &&\n suggestion.presentation === 'capability_card'\n );\n }\n\n protected capabilitySuggestionGroups(\n suggestions: AssistantSuggestion[] = []\n ): Array<{ section: string; options: AssistantSuggestionOption[] }> {\n const groups = new Map<string, AssistantSuggestionOption[]>();\n for (const suggestion of suggestions) {\n if (\n typeof suggestion === 'string' ||\n suggestion.presentation !== 'capability_card'\n ) {\n continue;\n }\n const section = suggestion.section?.trim() || 'More';\n groups.set(section, [...(groups.get(section) ?? []), suggestion]);\n }\n return [...groups.entries()].map(([section, options]) => ({\n section,\n options\n }));\n }\n\n protected useSuggestion(suggestion: AssistantSuggestion) {\n if (typeof suggestion === 'string' || !suggestion.structuredAction) {\n this.sendMessage(\n typeof suggestion === 'string' ? suggestion : suggestion.message\n );\n return;\n }\n\n const label = suggestion.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n suggestion.message,\n suggestion.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, suggestion.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected performHostAction(action: AssistantHostAction) {\n this.hostAction.emit(action);\n }\n\n protected requestClose(): void {\n this.closeRequested.emit();\n }\n\n protected hasConversationStarted(): boolean {\n return this.messages().some(message => message.role === 'user');\n }\n\n protected openSupportTicket(): void {\n this.closeFeedback(false);\n const user = this.getConfiguredUser();\n this.supportTicketForm = this.createSupportTicketForm(user);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n this.supportTags.set([]);\n this.supportTagsLoading.set(true);\n this.supportTicketVisible.set(true);\n\n this.supportService\n .getSupportTags()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: tags => {\n this.supportTags.set(tags);\n this.supportTagsLoading.set(false);\n },\n error: () => {\n this.supportTagsLoading.set(false);\n this.supportTicketError.set('Support tags could not be loaded. You can still submit the ticket.');\n }\n });\n\n setTimeout(() => this.supportQueryInput?.nativeElement.focus());\n }\n\n protected closeSupportTicket(restoreComposerFocus = true): void {\n this.supportTicketVisible.set(false);\n this.supportTicketSubmitting.set(false);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitSupportTicket(): boolean {\n return Boolean(\n this.supportTicketForm.name.trim() &&\n this.supportTicketForm.email.trim() &&\n this.supportTicketForm.query.trim() &&\n this.supportTicketForm.severity &&\n !this.supportTicketSubmitting()\n );\n }\n\n protected submitSupportTicket(): void {\n if (!this.canSubmitSupportTicket()) {\n return;\n }\n\n this.supportTicketSubmitting.set(true);\n this.supportTicketError.set(undefined);\n this.supportService\n .submitTicket({\n name: this.supportTicketForm.name.trim(),\n email: this.supportTicketForm.email.trim(),\n ...(this.supportTicketForm.phone.trim()\n ? { phone: this.supportTicketForm.phone.trim() }\n : {}),\n query: this.supportTicketForm.query.trim(),\n severity: this.supportTicketForm.severity,\n tags: [...this.supportTicketForm.tags],\n app: this.app ?? this.defaultConfig.app ?? 'nemesys'\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.supportTicketResult.set(result);\n this.supportTicketSubmitting.set(false);\n },\n error: () => {\n this.supportTicketSubmitting.set(false);\n this.supportTicketError.set(\n 'The ticket could not be submitted. Please check the details and try again.'\n );\n }\n });\n }\n\n protected openFeedback(responseMessage: AssistantMessage): void {\n this.closeSupportTicket(false);\n this.feedbackForm = this.createFeedbackForm(this.getConfiguredUser(), responseMessage);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n this.feedbackVisible.set(true);\n setTimeout(() => this.feedbackInput?.nativeElement.focus());\n }\n\n protected closeFeedback(restoreComposerFocus = true): void {\n this.feedbackVisible.set(false);\n this.feedbackSubmitting.set(false);\n this.feedbackResult.set(undefined);\n this.feedbackError.set(undefined);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitFeedback(): boolean {\n return Boolean(\n this.feedbackForm.name.trim() &&\n this.feedbackForm.email.trim() &&\n this.feedbackForm.category &&\n this.feedbackForm.query.trim() &&\n this.feedbackForm.feedback.trim() &&\n !this.feedbackSubmitting()\n );\n }\n\n protected submitFeedback(): void {\n if (!this.canSubmitFeedback()) {\n return;\n }\n\n this.feedbackSubmitting.set(true);\n this.feedbackError.set(undefined);\n this.feedbackService\n .submitFeedback({\n name: this.feedbackForm.name.trim(),\n email: this.feedbackForm.email.trim(),\n ...(this.feedbackForm.phone.trim()\n ? { phone: this.feedbackForm.phone.trim() }\n : {}),\n category: this.feedbackForm.category,\n query: this.feedbackForm.query.trim(),\n ...(this.feedbackForm.assistantResponse.trim()\n ? { assistantResponse: this.feedbackForm.assistantResponse.trim() }\n : {}),\n feedback: this.feedbackForm.feedback.trim(),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys',\n ...(this.conversationId() ? { conversationId: this.conversationId() } : {})\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.feedbackResult.set(result);\n this.feedbackSubmitting.set(false);\n },\n error: () => {\n this.feedbackSubmitting.set(false);\n this.feedbackError.set(\n 'Your feedback could not be submitted. Please check the details and try again.'\n );\n }\n });\n }\n\n protected searchResultIcon(type: string): string {\n return ASSISTANT_SEARCH_RESULT_ICONS[type.trim().toUpperCase()]\n ?? ASSISTANT_SEARCH_RESULT_ICONS['DEFAULT'];\n }\n\n protected searchActionIcon(action: AssistantSearchResult['actions'][number]): string {\n const linkType = action.hostAction.payload['linkType'];\n return this.searchResultIcon(typeof linkType === 'string' ? linkType : action.label);\n }\n\n protected getTableRowActions(\n table: AssistantResponseTable,\n rowIndex: number\n ): AssistantResponseTableAction[] {\n return table.actions?.filter(action => action.rowIndex === rowIndex) ?? [];\n }\n\n protected useTableAction(action: AssistantResponseTableAction) {\n const label = action.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n action.message,\n action.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(\n switchMap(response => {\n if (!action.confirmOnClick || !response.pendingAction) {\n return of(response);\n }\n return this.assistantService.confirmAction(\n response.pendingAction.id,\n 'approve',\n response.conversationId,\n this.getAssistantConfig(),\n history\n );\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, action.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected resolvePendingAction(\n message: AssistantMessage,\n decision: AssistantConfirmation['decision']\n ) {\n const pendingAction = message.pendingAction;\n const currentConversationId = this.conversationId();\n\n if (\n !pendingAction ||\n !currentConversationId ||\n message.actionDecision ||\n this.isSending()\n ) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: decision } : item\n )\n );\n const userMessage = decision === 'approve'\n ? `Approve: ${pendingAction.summary}`\n : `Reject: ${pendingAction.summary}`;\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', userMessage));\n this.isSending.set(true);\n\n this.assistantService\n .confirmAction(\n pendingAction.id,\n decision,\n currentConversationId,\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, userMessage));\n this.isSending.set(false);\n },\n error: error => {\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: undefined } : item\n )\n );\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n private resolveErrorMessage(error: unknown): string {\n if (\n error instanceof HttpErrorResponse &&\n typeof error.error === 'object' &&\n error.error !== null &&\n 'message' in error.error &&\n typeof error.error.message === 'string' &&\n error.error.message.trim()\n ) {\n return error.error.message.trim();\n }\n return this.uiCopy.errorMessage;\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 isDetailsVisible(messageId: string): boolean {\n return this.expandedDetailMessageIds().has(messageId);\n }\n\n protected toggleDetails(messageId: string, initialStepId?: number) {\n const opening = !this.isDetailsVisible(messageId);\n this.expandedDetailMessageIds.set(\n opening ? new Set([messageId]) : new Set<string>()\n );\n this.expandedTraceStepKeys.set(\n opening && initialStepId !== undefined\n ? new Set([this.traceStepKey(messageId, initialStepId)])\n : new Set<string>()\n );\n }\n\n protected isTraceStepExpanded(messageId: string, stepId: number): boolean {\n return this.expandedTraceStepKeys().has(this.traceStepKey(messageId, stepId));\n }\n\n protected toggleTraceStep(messageId: string, stepId: number) {\n const key = this.traceStepKey(messageId, stepId);\n this.expandedTraceStepKeys.update(expandedKeys => {\n const next = new Set(expandedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n protected chartTotal(visualisation: AssistantVisualisation): number {\n return visualisation.values.reduce(\n (total, value) => total + Math.max(0, Number(value) || 0),\n 0\n );\n }\n\n protected chartColor(visualisation: AssistantVisualisation, index: number): string {\n const fallback = ['#42A5F5', '#FFA5F5', '#66BB6A', '#FFA726', '#228888'];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n protected doughnutDashArray(\n visualisation: AssistantVisualisation,\n index: number\n ): string {\n const percentage = this.chartPercentage(visualisation, index);\n return `${percentage} ${100 - percentage}`;\n }\n\n protected doughnutDashOffset(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n return -visualisation.values\n .slice(0, index)\n .reduce(\n (total, _value, valueIndex) =>\n total + this.chartPercentage(visualisation, valueIndex),\n 0\n );\n }\n\n protected barWidth(visualisation: AssistantVisualisation, index: number): number {\n const maximum = Math.max(0, ...visualisation.values.map(value => Number(value) || 0));\n if (!maximum) {\n return 0;\n }\n return Math.max(0, ((Number(visualisation.values[index]) || 0) / maximum) * 100);\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const values = visualisation.labels.map(\n (label, index) => `${label}: ${Number(visualisation.values[index]) || 0}`\n );\n return `${visualisation.title} diversity chart. ${values.join(', ')}.`;\n }\n\n private chartPercentage(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n const total = this.chartTotal(visualisation);\n return total\n ? (Math.max(0, Number(visualisation.values[index]) || 0) / total) * 100\n : 0;\n }\n\n protected formatTraceValue(value: AssistantFieldValue | undefined): string {\n return JSON.stringify(value, null, 2);\n }\n\n protected traceMap(value: AssistantFieldValue | undefined): AssistantFieldMap | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value\n : undefined;\n }\n\n protected traceMapField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldMap | undefined {\n return this.traceMap(this.traceMap(value)?.[key]);\n }\n\n protected traceArrayField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue[] {\n const field = this.traceMap(value)?.[key];\n return Array.isArray(field) ? field : [];\n }\n\n protected traceField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue | undefined {\n return this.traceMap(value)?.[key];\n }\n\n protected traceEntries(\n value: AssistantFieldValue | AssistantFieldMap | undefined,\n excludedKeys: string[] = []\n ): Array<{ key: string; label: string; value: AssistantFieldValue }> {\n const record = this.traceMap(value);\n const excluded = new Set(excludedKeys.map(key => key.toLocaleLowerCase()));\n return record\n ? Object.entries(record)\n .filter(\n ([key, entry]) =>\n entry !== undefined && !excluded.has(key.toLocaleLowerCase())\n )\n .map(([key, entry]) => ({\n key,\n label: this.formatTraceLabel(key),\n value: entry\n }))\n : [];\n }\n\n protected formatTraceLabel(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n protected formatTraceScalar(value: AssistantFieldValue | undefined): string {\n if (value === null) {\n return 'None';\n }\n if (value === undefined) {\n return 'Not supplied';\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? String(value) : value.toFixed(6);\n }\n if (typeof value === 'string') {\n return value || 'Empty';\n }\n return JSON.stringify(value);\n }\n\n protected formatSimilarity(value: AssistantFieldValue | undefined): string {\n return typeof value === 'number' ? value.toFixed(4) : '—';\n }\n\n protected getHttpStatus(step: AssistantTraceStep): number | undefined {\n const output = this.traceMap(step.output);\n const http = this.traceMap(output?.['http']);\n const status = http?.['statusCode'] ?? output?.['statusCode'] ?? step.error?.statusCode;\n return typeof status === 'number' ? status : undefined;\n }\n\n protected isHttpSuccessful(step: AssistantTraceStep): boolean {\n const status = this.getHttpStatus(step);\n return status !== undefined && status >= 200 && status < 300;\n }\n\n protected traceStepTone(step: AssistantTraceStep): AssistantTraceStep['status'] {\n return step.category === 'api_call' && this.isHttpSuccessful(step)\n ? 'succeeded'\n : step.status;\n }\n\n protected traceStepStatus(step: AssistantTraceStep): string {\n if (step.category === 'api_call') {\n const status = this.getHttpStatus(step);\n if (status !== undefined) {\n return `HTTP ${status} ${this.isHttpSuccessful(step) ? 'Success' : 'Error'}`;\n }\n return step.status === 'failed' ? 'Transport failed' : 'Completed';\n }\n return step.status === 'succeeded'\n ? 'Completed'\n : step.status === 'failed'\n ? 'Stopped'\n : 'Running';\n }\n\n protected formatTraceCategory(category: string): string {\n const labels: Record<string, string> = {\n request: 'Request intake',\n intent_projection: 'Intent generalisation',\n embedding: 'Intent embedding',\n capability_routing: 'Capability matching',\n argument_extraction: 'Argument extraction',\n api_call: 'Nemesys API',\n action: 'Workflow outcome',\n response: 'Assistant response'\n };\n return labels[category] ?? this.formatTraceLabel(category);\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 if (this.context) {\n config.context = this.context;\n }\n\n if (this.requestHeaders) {\n config.requestHeaders = this.requestHeaders;\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 updateStreamingMessage(messageId: string, content: string) {\n const trimmedContent = content.trim();\n if (!trimmedContent) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId && message.isStreaming\n ? { ...message, content: trimmedContent }\n : message\n )\n );\n this.scrollToLatest();\n }\n\n private replaceMessage(messageId: string, replacement: AssistantMessage) {\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId\n ? { ...replacement, id: messageId, isStreaming: false }\n : message\n )\n );\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.getInitialMessage(this.bootstrapConfig.initialMessage),\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private getInitialMessage(initialMessage: string): string {\n const user = this.getConfiguredUser();\n const preferredName = [\n user?.['firstName'],\n user?.['firstname'],\n user?.['displayName'],\n user?.['name'],\n user?.['username']\n ].find(value => typeof value === 'string' && value.trim());\n\n if (typeof preferredName !== 'string') {\n return initialMessage;\n }\n\n const firstName = preferredName\n .trim()\n .split(/\\s|@/)[0];\n\n if (!firstName) {\n return initialMessage;\n }\n\n if (initialMessage.startsWith('Hi!')) {\n return initialMessage.replace(/^Hi!/, `Hi ${firstName}!`);\n }\n\n return initialMessage.replace(/^Hello,/, `Hello ${firstName},`);\n }\n\n private getConfiguredUser(): Partial<AssistantUser> | undefined {\n const configuredUser = this.user ?? this.defaultConfig.user;\n return typeof configuredUser === 'function'\n ? configuredUser()\n : configuredUser;\n }\n\n private createSupportTicketForm(\n user?: Partial<AssistantUser>\n ): SupportTicketFormValue {\n return {\n name: this.getUserText(user, [\n 'displayName',\n 'name',\n 'username',\n 'firstName',\n 'firstname'\n ]),\n email: this.getUserText(user, ['email', 'emailAddress']),\n phone: this.getUserText(user, ['phone', 'phoneNumber', 'mobile']),\n query: '',\n severity: 'medium',\n tags: []\n };\n }\n\n private createFeedbackForm(\n user?: Partial<AssistantUser>,\n responseMessage?: AssistantMessage\n ): FeedbackFormValue {\n const conversation = responseMessage\n ? this.getConversationPair(responseMessage)\n : { query: '', assistantResponse: '' };\n\n return {\n name: this.getUserText(user, [\n 'displayName',\n 'name',\n 'username',\n 'firstName',\n 'firstname'\n ]),\n email: this.getUserText(user, ['email', 'emailAddress']),\n phone: this.getUserText(user, ['phone', 'phoneNumber', 'mobile']),\n category: 'suggestion',\n query: conversation.query,\n assistantResponse: conversation.assistantResponse,\n feedback: ''\n };\n }\n\n private getConversationPair(responseMessage: AssistantMessage): {\n query: string;\n assistantResponse: string;\n } {\n const messages = this.messages();\n const responseIndex = messages.findIndex(message => message.id === responseMessage.id);\n let precedingUserIndex = -1;\n for (let index = responseIndex - 1; index >= 0; index -= 1) {\n if (messages[index]?.role === 'user') {\n precedingUserIndex = index;\n break;\n }\n }\n\n return {\n query: messages[precedingUserIndex]?.content ?? '',\n assistantResponse: responseMessage.content\n };\n }\n\n private getUserText(\n user: Partial<AssistantUser> | undefined,\n keys: string[]\n ): string {\n const value = keys\n .map(key => user?.[key])\n .find(field => typeof field === 'string' && field.trim());\n return typeof value === 'string' ? value.trim() : '';\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 ?? response.product,\n response.productLabel,\n response.apiModule ?? response.contextResolution?.moduleKey,\n response.confidence ?? response.contextResolution?.confidence,\n response.parameters ?? response.entities,\n response.apiCalls ?? this.getToolApiCalls(response),\n response.apiResult,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse,\n response.status,\n response.pendingAction,\n response.toolExecution,\n response.cards,\n response.contextResolution.capabilityKey,\n response.developerTrace\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: AssistantSuggestion[] = [],\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 status?: AssistantChatResponse['status'],\n pendingAction?: AssistantMessage['pendingAction'],\n toolExecution?: AssistantMessage['toolExecution'],\n cards?: AssistantMessage['cards'],\n capabilityKey?: string,\n developerTrace?: AssistantDeveloperTrace\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 status,\n pendingAction,\n toolExecution,\n cards,\n capabilityKey,\n developerTrace,\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 searchResults: provided.searchResults,\n visualisations: provided.visualisations,\n shiftCardGroups: provided.shiftCardGroups,\n rota: provided.rota,\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.product ?? response.app,\n projectKey: provided?.projectKey ?? response.product ?? response.app,\n module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,\n intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,\n intentLabel:\n provided?.intentLabel\n ?? response.intentLabel\n ?? response.contextResolution?.capabilityLabel,\n confidence:\n provided?.confidence\n ?? response.confidence\n ?? response.contextResolution?.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]\n };\n }\n\n private getToolApiCalls(\n response: AssistantChatResponse\n ): AssistantMessage['apiCalls'] | undefined {\n if (!response.toolExecution) {\n return undefined;\n }\n\n return [{\n method: response.toolExecution.method,\n url: response.toolExecution.endpoint,\n purpose: response.toolExecution.toolName\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 if (provided.shiftCardGroups?.length || provided.rota) {\n return [];\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 traceStepKey(messageId: string, stepId: number): string {\n return `${messageId}:${stepId}`;\n }\n\n private getConversationHistory(): AssistantConversationMessage[] {\n const messages = this.messages();\n const firstUserIndex = messages.findIndex(message => message.role === 'user');\n if (firstUserIndex < 0) {\n return [];\n }\n\n return messages\n .slice(firstUserIndex)\n .filter(message => !message.isError && !message.isStreaming)\n .slice(-20)\n .map(message => ({\n role: message.role,\n content: message.content.slice(0, 4_000),\n ...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})\n }));\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","<aside\n class=\"assistant-window\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"region\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <i class=\"max-assistant-sparkles far fa-sparkles\" aria-hidden=\"true\"></i>\n <div class=\"assistant-identity\">\n <h2 class=\"assistant-name\">{{ uiCopy.title }}</h2>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <div class=\"assistant-header-actions\">\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n >\n <i class=\"header-action-icon pi pi-refresh\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n [pTooltip]=\"uiCopy.closeTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"requestClose()\"\n >\n <i class=\"header-action-icon pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isStreaming) {\n <p class=\"streaming-progress\">{{ message.content }}</p>\n } @else if(message.displayResponse; as responseDetails) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <strong>{{ card.title }}</strong>\n @if(card.subtitle) {\n <span>{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span>{{ metric.label }}</span>\n <strong>{{ metric.value }}</strong>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(responseDetails.searchResults?.length) {\n <div class=\"assistant-cards assistant-search-results\" aria-label=\"Search results\">\n @for(result of responseDetails.searchResults ?? []; track $index) {\n <section class=\"assistant-card assistant-search-result\">\n <header>\n <i\n class=\"assistant-search-result-icon\"\n [class]=\"searchResultIcon(result.type)\"\n aria-hidden=\"true\"\n ></i>\n <div class=\"assistant-search-result-copy\">\n <strong>{{ result.title }}</strong>\n <span>{{ result.type }}</span>\n </div>\n </header>\n <div class=\"suggestions\" aria-label=\"Available destinations\">\n @for(action of result.actions; track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"action.label\"\n [icon]=\"searchActionIcon(action)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(action.hostAction)\"\n ></button>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(responseDetails.shiftCardGroups?.length) {\n <div class=\"assistant-shift-groups\" aria-label=\"Team shifts\">\n @for(group of responseDetails.shiftCardGroups ?? []; track group.title) {\n <section class=\"assistant-shift-group\">\n <h3>{{ group.title }}</h3>\n <div class=\"assistant-shift-card-grid\">\n @for(shift of group.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"definition\"\n ></max-agent-shift-card>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(responseDetails.rota; as rota) {\n <section class=\"assistant-rota\" [attr.aria-label]=\"rota.title\">\n <div class=\"assistant-rota-heading\">\n <h3>{{ rota.title }}</h3>\n <div class=\"assistant-rota-summary\">\n @if(rota.startDate) {\n <span><small>From</small><strong>{{ rota.startDate }}</strong></span>\n }\n <span><small>Weeks</small><strong>{{ rota.weeksCount }}</strong></span>\n @if(rota.contracted) {\n <span><small>Contracted</small><strong>{{ rota.contracted }}</strong></span>\n }\n @if(rota.autoPublish) {\n <span><small>Auto publish</small><strong>{{ rota.autoPublish }}</strong></span>\n }\n </div>\n </div>\n <div class=\"assistant-rota-scroll\">\n @for(week of rota.weeks; track week.week) {\n <section class=\"assistant-rota-week\">\n <header class=\"assistant-rota-week-heading\">\n <strong>Week {{ week.week }}</strong>\n @if(week.duration) {\n <span>{{ week.duration }}</span>\n }\n </header>\n <div class=\"assistant-rota-week-grid\">\n @for(day of week.days; track day.day) {\n <article class=\"assistant-rota-day\">\n <header>\n <strong>{{ day.label }}</strong>\n @if(day.period) {\n <span>{{ day.period }}</span>\n }\n </header>\n <div class=\"assistant-rota-day-shifts\">\n @for(shift of day.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"rota\"\n ></max-agent-shift-card>\n } @empty {\n <span class=\"assistant-rota-empty\">No shifts</span>\n }\n </div>\n </article>\n }\n </div>\n </section>\n } @empty {\n <p class=\"assistant-rota-no-weeks\">No rota weeks were returned.</p>\n }\n </div>\n </section>\n }\n @if(responseDetails.visualisations?.length) {\n <div class=\"assistant-visualisations\">\n @for(visualisation of responseDetails.visualisations ?? []; track visualisation.title) {\n <section class=\"assistant-visualisation\">\n <h3>{{ visualisation.title }}</h3>\n @if(visualisation.type === 'doughnut') {\n <div class=\"assistant-doughnut-layout\">\n <div\n class=\"assistant-doughnut\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n <svg viewBox=\"0 0 42 42\" aria-hidden=\"true\" focusable=\"false\">\n <circle\n class=\"assistant-doughnut-track\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n ></circle>\n @for(value of visualisation.values; track $index; let valueIndex = $index) {\n <circle\n class=\"assistant-doughnut-segment\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n pathLength=\"100\"\n [attr.stroke]=\"chartColor(visualisation, valueIndex)\"\n [attr.stroke-dasharray]=\"doughnutDashArray(visualisation, valueIndex)\"\n [attr.stroke-dashoffset]=\"doughnutDashOffset(visualisation, valueIndex)\"\n ></circle>\n }\n </svg>\n <span><strong>{{ chartTotal(visualisation) }}</strong>people</span>\n </div>\n <div class=\"assistant-chart-legend\">\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-chart-legend-item\">\n <i [style.background]=\"chartColor(visualisation, labelIndex)\"></i>\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n }\n </div>\n </div>\n } @else {\n <div\n class=\"assistant-bar-chart\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-bar-row\">\n <div class=\"assistant-bar-label\">\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n <div class=\"assistant-bar-track\" aria-hidden=\"true\">\n <i\n [style.width.%]=\"barWidth(visualisation, labelIndex)\"\n [style.background]=\"chartColor(visualisation, labelIndex)\"\n ></i>\n </div>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">→</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} · {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} · {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { · HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { — HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n @if(isWelcomeState(message)) {\n <button\n type=\"button\"\n class=\"support-welcome-card\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <span class=\"support-welcome-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <span class=\"support-welcome-copy\">\n <strong>Raise a support ticket</strong>\n <small>Send details directly to our support team.</small>\n </span>\n <i class=\"support-welcome-arrow pi pi-arrow-right\" aria-hidden=\"true\"></i>\n </button>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n @if(hasCapabilitySuggestions(message.suggestions)) {\n <div class=\"capability-options\" aria-label=\"Available Maxtime capabilities\">\n @for(group of capabilitySuggestionGroups(message.suggestions); track group.section) {\n <section class=\"capability-option-section\">\n <h3>{{ group.section }}</h3>\n <div class=\"capability-option-grid\">\n @for(suggestion of group.options; track suggestion.structuredAction?.capabilityKey ?? suggestion.label; let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose capability: ' + suggestion.label\"\n (click)=\"useSuggestion(suggestion)\"\n >\n <span class=\"capability-option-number\" aria-hidden=\"true\">\n {{ optionIndex + 1 }}\n </span>\n <span class=\"capability-option-copy\">{{ suggestion.label }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </section>\n }\n </div>\n } @else {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n }\n @if(message.role === 'assistant' && !isWelcomeMessage(message) && !message.isStreaming) {\n <div class=\"response-actions\">\n <button\n type=\"button\"\n class=\"response-feedback-action\"\n [attr.aria-label]=\"uiCopy.feedbackLabel\"\n [pTooltip]=\"uiCopy.feedbackTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"openFeedback(message)\"\n >\n <i class=\"pi pi-comment\" aria-hidden=\"true\"></i>\n </button>\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Developer Trace' : 'Show Developer Trace' }}\n </button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <footer class=\"assistant-footer\">\n @if(hasConversationStarted()) {\n <button\n type=\"button\"\n class=\"support-ticket-shortcut\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <i class=\"far fa-user-headset\" aria-hidden=\"true\"></i>\n <span>Raise a support ticket</span>\n </button>\n }\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n #composerInput\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </footer>\n </section>\n\n @if(supportTicketVisible()) {\n <section class=\"support-ticket-overlay\" aria-label=\"Support ticket form\">\n <div\n class=\"support-ticket-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"supportTicketTitle\"\n >\n <header class=\"support-ticket-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <div>\n <h2 id=\"supportTicketTitle\">Raise a support ticket</h2>\n <p>Share the details and our support team will take it from here.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close\"\n aria-label=\"Close support ticket form\"\n (click)=\"closeSupportTicket()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(supportTicketResult(); as result) {\n <div class=\"support-ticket-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>Ticket raised</h3>\n <p>{{ result.message }}</p>\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.ticketReference }}</strong>\n </div>\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form\" (ngSubmit)=\"submitSupportTicket()\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Name</span>\n <input\n type=\"text\"\n name=\"supportName\"\n autocomplete=\"name\"\n [value]=\"supportTicketForm.name\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Email</span>\n <input\n type=\"email\"\n name=\"supportEmail\"\n autocomplete=\"email\"\n [value]=\"supportTicketForm.email\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Phone <small>Optional</small></span>\n <input\n type=\"tel\"\n name=\"supportPhone\"\n autocomplete=\"tel\"\n placeholder=\"Add a contact number\"\n [(ngModel)]=\"supportTicketForm.phone\"\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Severity</span>\n <p-select\n inputId=\"supportSeverity\"\n name=\"supportSeverity\"\n [options]=\"supportSeverityOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.severity\"\n >\n <ng-template #selectedItem let-severity>\n <p-tag\n class=\"support-severity-tag\"\n [value]=\"severity.label\"\n [severity]=\"severity.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n <ng-template #item let-severity>\n <p-tag\n class=\"support-severity-option\"\n [value]=\"severity.label\"\n [severity]=\"severity.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-select>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Tags</span>\n <p-multiselect\n inputId=\"supportTags\"\n name=\"supportTags\"\n placeholder=\"Select relevant areas\"\n [options]=\"supportTags()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n display=\"chip\"\n [filter]=\"true\"\n filterBy=\"label\"\n [showToggleAll]=\"false\"\n [loading]=\"supportTagsLoading()\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.tags\"\n >\n <ng-template #selecteditems let-selectedTags>\n <span class=\"support-selected-tags\">\n @for(tag of selectedTags; track tag.value) {\n <p-tag\n class=\"support-selected-tag\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n }\n </span>\n </ng-template>\n <ng-template #item let-tag>\n <p-tag\n class=\"support-tag-option\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-multiselect>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>How can we help?</span>\n <textarea\n #supportQueryInput\n pTextarea\n name=\"supportQuery\"\n rows=\"5\"\n placeholder=\"Describe the issue, what you expected, and anything you've already tried.\"\n required\n [(ngModel)]=\"supportTicketForm.query\"\n ></textarea>\n </label>\n </div>\n\n @if(!supportTicketForm.name || !supportTicketForm.email) {\n <p class=\"support-ticket-notice\" role=\"alert\">\n Your signed-in name and email are required. Please refresh your Nemesys session and try again.\n </p>\n }\n @if(supportTicketError(); as supportError) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ supportError }}</p>\n }\n\n <div class=\"support-ticket-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeSupportTicket()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Submit ticket\"\n icon=\"pi pi-send\"\n [loading]=\"supportTicketSubmitting()\"\n [disabled]=\"!canSubmitSupportTicket()\"\n ></button>\n </div>\n </form>\n }\n </div>\n </section>\n }\n\n @if(feedbackVisible()) {\n <section\n class=\"support-ticket-overlay feedback-overlay\"\n aria-label=\"Feedback form\"\n >\n <div\n class=\"support-ticket-dialog feedback-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"feedbackTitle\"\n >\n <header class=\"support-ticket-header feedback-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-comment\"></i>\n </span>\n <div>\n <h2 id=\"feedbackTitle\">Help Max improve</h2>\n <p>Tell us what Max could do better.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close feedback-close\"\n aria-label=\"Close feedback form\"\n (click)=\"closeFeedback()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(feedbackResult(); as result) {\n <div class=\"support-ticket-success feedback-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>Feedback received</h3>\n <p>{{ result.message }}</p>\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.feedbackReference }}</strong>\n </div>\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeFeedback()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form feedback-form\" (ngSubmit)=\"submitFeedback()\">\n <div class=\"feedback-form-body\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Name</span>\n <input\n type=\"text\"\n name=\"feedbackName\"\n autocomplete=\"name\"\n [value]=\"feedbackForm.name\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Email</span>\n <input\n type=\"email\"\n name=\"feedbackEmail\"\n autocomplete=\"email\"\n [value]=\"feedbackForm.email\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Phone <small>Optional</small></span>\n <input\n type=\"tel\"\n name=\"feedbackPhone\"\n autocomplete=\"tel\"\n placeholder=\"Add a contact number\"\n [(ngModel)]=\"feedbackForm.phone\"\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Feedback type</span>\n <p-select\n inputId=\"feedbackCategory\"\n name=\"feedbackCategory\"\n [options]=\"feedbackCategoryOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [fluid]=\"true\"\n [(ngModel)]=\"feedbackForm.category\"\n ></p-select>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Your query</span>\n <textarea\n pTextarea\n name=\"feedbackQuery\"\n rows=\"2\"\n placeholder=\"Enter the question or request you gave Max.\"\n readonly\n required\n [(ngModel)]=\"feedbackForm.query\"\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Assistant response <small>Added automatically when available</small></span>\n <textarea\n pTextarea\n name=\"feedbackAssistantResponse\"\n rows=\"3\"\n placeholder=\"No assistant response is available yet.\"\n [value]=\"feedbackForm.assistantResponse\"\n readonly\n ></textarea>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>What could be improved?</span>\n <textarea\n #feedbackInput\n pTextarea\n name=\"feedbackDetails\"\n rows=\"3\"\n placeholder=\"Tell us what you expected, what was missing, or how the response could be more useful.\"\n required\n [(ngModel)]=\"feedbackForm.feedback\"\n ></textarea>\n </label>\n </div>\n\n @if(!feedbackForm.name || !feedbackForm.email) {\n <p class=\"support-ticket-notice\" role=\"alert\">\n Your signed-in name and email are required. Please refresh your Nemesys session and try again.\n </p>\n }\n @if(feedbackError(); as error) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ error }}</p>\n }\n </div>\n\n <footer class=\"support-ticket-actions feedback-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeFeedback()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Send feedback\"\n icon=\"pi pi-send\"\n [loading]=\"feedbackSubmitting()\"\n [disabled]=\"!canSubmitFeedback()\"\n ></button>\n </footer>\n </form>\n }\n </div>\n </section>\n }\n</aside>\n","/*\n * Public API Surface of max-agent-ui\n */\n\nexport * from './lib/components/assistant/max-assistant.component';\nexport * from './lib/components/assistant/max-assistant-feedback.service';\nexport * from './lib/components/assistant/max-assistant.service';\nexport * from './lib/components/assistant/max-assistant-support.service';\nexport * from './lib/components/shift-card/max-agent-shift-card.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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"}
package/index.d.ts CHANGED
@@ -288,7 +288,8 @@ interface AssistantChatRequest {
288
288
  conversationId?: string;
289
289
  history: AssistantConversationMessage[];
290
290
  app: AssistantProduct;
291
- context: AssistantRequestContext;
291
+ user?: Pick<AssistantUser, 'name' | 'username' | 'email'>;
292
+ context?: AssistantRequestContext;
292
293
  confirmation?: AssistantConfirmation;
293
294
  structuredAction?: AssistantStructuredAction;
294
295
  }
@@ -396,9 +397,12 @@ declare class MaxAssistantService {
396
397
  private getChatUrl;
397
398
  private getApp;
398
399
  private getUser;
400
+ private getRequestUser;
401
+ private getOptionalText;
399
402
  private getContext;
400
403
  private getHeaders;
401
404
  private compactConfig;
405
+ private mergeConfig;
402
406
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MaxAssistantService, [null, { optional: true; }]>;
403
407
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<MaxAssistantService>;
404
408
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "max-agent-ui",
3
- "version": "0.0.21",
3
+ "version": "0.0.22",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/"
6
6
  },