max-agent-ui 0.0.30 → 0.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/max-agent-ui.mjs +19 -4
- package/fesm2022/max-agent-ui.mjs.map +1 -1
- package/index.d.ts +17 -1
- package/package.json +1 -1
|
@@ -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/components/entity-option/max-agent-entity-option.component.ts","../../../projects/max-agent-ui/src/lib/components/entity-option/max-agent-entity-option.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-export.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 apiBaseUrl?: string;\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('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\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 { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { AssistantSuggestionEntity } from '../../models/assistant.models';\n\nconst ENTITY_ICONS: Readonly<Partial<Record<AssistantSuggestionEntity['kind'], string>>> = {\n team: 'pi pi-users',\n role: 'pi pi-id-card',\n location: 'pi pi-map-marker',\n position: 'pi pi-briefcase',\n department: 'pi pi-building',\n entity: 'pi pi-tag',\n};\n\n@Component({\n selector: 'max-agent-entity-option',\n templateUrl: './max-agent-entity-option.component.html',\n styleUrl: './max-agent-entity-option.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MaxAgentEntityOptionComponent {\n @Input({ required: true }) entity!: AssistantSuggestionEntity;\n @Input() disabled = false;\n\n @Output() selected = new EventEmitter<void>();\n\n protected get isPerson(): boolean {\n return this.entity.kind === 'person' || this.entity.kind === 'employee';\n }\n\n protected get displayCode(): string | number | undefined {\n return this.entity.code ?? this.entity.id;\n }\n\n protected get initials(): string {\n return this.entity.name\n .split(/\\s+/u)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase())\n .join('');\n }\n\n protected get entityColor(): string | undefined {\n return this.normaliseColor(this.entity.color);\n }\n\n protected get entityTextColor(): string | undefined {\n return this.normaliseColor(this.entity.textColor);\n }\n\n protected get entityIcon(): string {\n return ENTITY_ICONS[this.entity.kind] ?? 'pi pi-tag';\n }\n\n protected choose(): void {\n if (!this.disabled) {\n this.selected.emit();\n }\n }\n\n private normaliseColor(value: string | undefined): string | undefined {\n const color = value?.trim();\n if (!color) {\n return undefined;\n }\n return /^[\\da-f]{3,8}$/iu.test(color) ? `#${color}` : color;\n }\n}\n","<button\n type=\"button\"\n class=\"entity-option\"\n [class.entity-option-person]=\"isPerson\"\n [class.entity-option-tag]=\"!isPerson\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'Choose ' + entity.name\"\n [style.--max-agent-entity-color]=\"entityColor\"\n [style.--max-agent-entity-text-color]=\"entityTextColor\"\n (click)=\"choose()\"\n>\n @if (isPerson) {\n <span class=\"person-photo\" aria-hidden=\"true\">\n @if (entity.photo) {\n <img [src]=\"entity.photo\" [alt]=\"''\" />\n } @else {\n <span>{{ initials }}</span>\n }\n </span>\n <span class=\"person-copy\">\n <span class=\"person-name\">{{ entity.name }}</span>\n @if (displayCode !== undefined && displayCode !== '') {\n <small>#{{ displayCode }}</small>\n }\n </span>\n <i class=\"pi pi-arrow-right option-arrow\" aria-hidden=\"true\"></i>\n } @else {\n <span class=\"entity-icon\" aria-hidden=\"true\">\n <i [class]=\"entityIcon\"></i>\n </span>\n <span class=\"entity-name\">{{ entity.name }}</span>\n }\n</button>\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 AssistantAnalyticsPage,\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 retrieveAnalyticsPage(\n message: string,\n analyticsPage: AssistantAnalyticsPage,\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 analyticsPage\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';\n\nimport {\n AssistantFieldValue,\n AssistantResponseTable,\n AssistantVisualisation,\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantExportService {\n async exportTableToExcel(table: AssistantResponseTable): Promise<void> {\n const XLSX = await import('xlsx');\n const worksheetData = [\n table.columns.map(column => column.header),\n ...table.rows.map(row =>\n table.columns.map(column => this.toExportCellValue(row[column.field]))\n ),\n ];\n const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);\n const workbook = XLSX.utils.book_new();\n\n XLSX.utils.book_append_sheet(workbook, worksheet, 'Results');\n const file = XLSX.write(workbook, {\n bookType: 'xlsx',\n compression: true,\n type: 'array',\n });\n this.downloadFile(\n new Blob([file], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n }),\n `${this.exportFileName(table.title, 'agent-results')}.xlsx`\n );\n }\n\n async exportVisualisationToPdf(visualisation: AssistantVisualisation): Promise<void> {\n const { jsPDF } = await import('jspdf');\n const document = new jsPDF({ format: 'a4', orientation: 'portrait', unit: 'mm' });\n const pageWidth = document.internal.pageSize.getWidth();\n const pageHeight = document.internal.pageSize.getHeight();\n const margin = 16;\n const contentWidth = pageWidth - (margin * 2);\n const maximum = Math.max(0, ...visualisation.values.map(value => Number(value) || 0));\n let cursorY = 20;\n\n document.setFont('helvetica', 'bold');\n document.setFontSize(16);\n document.text(visualisation.title, margin, cursorY, { maxWidth: contentWidth });\n cursorY += 9;\n\n document.setFont('helvetica', 'normal');\n document.setFontSize(10);\n const chartType = visualisation.type === 'doughnut' ? 'Doughnut chart' : 'Bar chart';\n document.text(chartType, margin, cursorY);\n\n if (visualisation.type === 'doughnut') {\n const valueLabel = visualisation.valueLabel ? ` ${visualisation.valueLabel}` : '';\n document.text(\n `Total: ${this.chartTotal(visualisation)}${valueLabel}`,\n pageWidth - margin,\n cursorY,\n { align: 'right' }\n );\n }\n cursorY += 10;\n\n visualisation.labels.forEach((label, index) => {\n const value = Number(visualisation.values[index]) || 0;\n const labelLines = document.splitTextToSize(label, contentWidth - 32) as string[];\n const rowHeight = Math.max(8, labelLines.length * 5 + 3)\n + (visualisation.type === 'bar' ? 6 : 0);\n\n if (cursorY + rowHeight > pageHeight - margin) {\n document.addPage();\n cursorY = margin;\n }\n\n const [red, green, blue] = this.pdfColor(\n visualisation.colors?.[index] ?? this.fallbackColor(index)\n );\n document.setFillColor(red, green, blue);\n document.rect(margin, cursorY, 4, 4, 'F');\n document.setTextColor(31, 41, 55);\n document.text(labelLines, margin + 7, cursorY + 3);\n document.setFont('helvetica', 'bold');\n document.text(String(value), pageWidth - margin, cursorY + 3, { align: 'right' });\n document.setFont('helvetica', 'normal');\n\n if (visualisation.type === 'bar') {\n const barY = cursorY + Math.max(7, labelLines.length * 5 + 1);\n const barWidth = contentWidth - 7;\n document.setFillColor(226, 232, 240);\n document.rect(margin + 7, barY, barWidth, 3, 'F');\n if (maximum > 0 && value > 0) {\n document.setFillColor(red, green, blue);\n document.rect(margin + 7, barY, barWidth * (value / maximum), 3, 'F');\n }\n }\n\n cursorY += rowHeight;\n });\n\n this.downloadFile(\n new Blob([document.output('arraybuffer')], { type: 'application/pdf' }),\n `${this.exportFileName(visualisation.title, 'agent-chart')}.pdf`\n );\n }\n\n private 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 private toExportCellValue(value: AssistantFieldValue | undefined): string | number | boolean {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (Array.isArray(value)) {\n return value.map(item => this.toExportCellValue(item)).join(', ');\n }\n\n if (typeof value === 'object') {\n const preferredValue = value['label'] ?? value['name'] ?? value['code'];\n return preferredValue === undefined\n ? JSON.stringify(value)\n : String(this.toExportCellValue(preferredValue));\n }\n\n return value;\n }\n\n private exportFileName(title: string | undefined, fallback: string): string {\n const normalised = (title || fallback)\n .trim()\n .toLocaleLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n return normalised || fallback;\n }\n\n private fallbackColor(index: number): string {\n const colors = ['#42A5F5', '#FFA5F5', '#66BB6A', '#FFA726', '#228888'];\n return colors[index % colors.length];\n }\n\n private pdfColor(color: string): [number, number, number] {\n const normalised = color.trim().replace(/^#/, '');\n const expanded = normalised.length === 3\n ? normalised.split('').map(character => `${character}${character}`).join('')\n : normalised;\n\n if (!/^[0-9a-f]{6}$/i.test(expanded)) {\n return [66, 165, 245];\n }\n\n return [\n Number.parseInt(expanded.slice(0, 2), 16),\n Number.parseInt(expanded.slice(2, 4), 16),\n Number.parseInt(expanded.slice(4, 6), 16),\n ];\n }\n\n private downloadFile(file: Blob, fileName: string): void {\n const url = URL.createObjectURL(file);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.click();\n URL.revokeObjectURL(url);\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 { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { map, Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantSupportTag,\n AssistantSelectableEntity,\n AssistantSupportSeverity,\n AssistantSupportTicketRequest,\n AssistantSupportTicketResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantSupportService {\n readonly ticketsEndpoint = '/ticket';\n readonly tagsEndpoint = '/selection/lookup/supportticket/tag';\n readonly severitiesEndpoint = '/selection/lookup/supportticket/severity';\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n getSupportTags(): Observable<AssistantSupportTag[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSelectableEntity[]>(\n this.getEndpoint(this.tagsEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n ).pipe(\n map(tags => tags.map(tag => ({\n ...tag,\n icon: 'pi pi-tag',\n severity: 'info' as const\n })))\n );\n }\n\n getSupportSeverities(): Observable<AssistantSupportSeverity[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSupportSeverity[]>(\n this.getEndpoint(this.severitiesEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n );\n }\n\n submitTicket(\n ticket: AssistantSupportTicketRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantSupportTicketResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n const mergedConfig = this.mergeConfig(config);\n const response$ = this.http.post(\n this.getEndpoint(this.ticketsEndpoint, mergedConfig),\n {\n subject: ticket.subject,\n body: ticket.query,\n severity: ticket.severity,\n tags: ticket.tags.map(({ id, label }) => ({ id, label }))\n },\n {\n headers: this.getHeaders(mergedConfig),\n responseType: 'text'\n }\n );\n\n return response$.pipe(map(response => this.toTicketResponse(response)));\n }\n\n private toTicketResponse(_response: string): AssistantSupportTicketResponse {\n return {\n success: true,\n message: 'Your support ticket has been created. You will receive an email with your reference number shortly.',\n submittedAt: new Date().toISOString()\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n if (name.trim() && value.trim()) {\n headers = headers.set(name.trim(), value.trim());\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n\n return headers;\n }\n\n private getEndpoint(path: string, config: MaxAssistantConfig): string {\n const baseUrl = config.apiBaseUrl?.trim();\n return baseUrl ? `${baseUrl.replace(/\\/$/, '')}${path}` : path;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n return typeof config.user === 'function' ? config.user() : config.user ?? {};\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined))\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 { 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 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 AssistantSuggestionEntity,\n AssistantExtractedIntent,\n AssistantFeedbackCategory,\n AssistantFeedbackResponse,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantHostAction,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantResponseTablePagination,\n AssistantSearchResult,\n AssistantSuggestion,\n AssistantSuggestionOption,\n AssistantSupportSeverity,\n AssistantSupportTag,\n AssistantSupportTicketResponse,\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 { MaxAssistantExportService } from './max-assistant-export.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';\nimport { MaxAgentEntityOptionComponent } from '../entity-option/max-agent-entity-option.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: 'Reviewing 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 subject: string;\n query: string;\n severity: AssistantSupportSeverity | null;\n tags: AssistantSupportTag[];\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\ninterface AssistantEntitySuggestionOption extends AssistantSuggestionOption {\n presentation: 'person_card' | 'entity_tag';\n entity: AssistantSuggestionEntity;\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 MaxAgentEntityOptionComponent,\n MaxAgentShiftCardComponent,\n ],\n templateUrl: './max-assistant.component.html',\n encapsulation: ViewEncapsulation.Emulated,\n styleUrls: ['./max-assistant.component.scss', './max-assistant.workspace.scss'],\n})\nexport class MaxAssistantComponent implements OnInit {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n @ViewChild('composerInput') private composerInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('supportQueryInput') private supportQueryInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('feedbackInput') private feedbackInput?: ElementRef<HTMLTextAreaElement>;\n\n @Input() app?: AssistantProduct;\n\n @Input() assistantApiUrl?: string;\n\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n\n @Input() developerDetailsEnabled = true;\n\n @Output() hostAction = new EventEmitter<AssistantHostAction>();\n\n @Output() closeRequested = new EventEmitter<void>();\n\n protected readonly isSending = signal(false);\n\n protected readonly input = signal('');\n\n protected readonly conversationId = signal<string | undefined>(undefined);\n\n protected readonly messages = signal<AssistantMessage[]>([]);\n\n protected readonly expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly loadingTablePage = signal<string | undefined>(undefined);\n\n protected readonly tablePageErrors = signal<Readonly<Record<string, string>>>({});\n\n protected readonly feedbackVisible = signal(false);\n\n protected readonly feedbackSubmitting = signal(false);\n\n protected readonly feedbackResult = signal<AssistantFeedbackResponse | undefined>(undefined);\n\n protected readonly feedbackError = signal<string | undefined>(undefined);\n\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\n protected feedbackForm: FeedbackFormValue = this.createFeedbackForm();\n\n protected readonly supportTicketVisible = signal(false);\n\n protected readonly supportTicketSubmitting = signal(false);\n\n protected readonly supportTagsLoading = signal(false);\n\n protected readonly supportTags = signal<AssistantSupportTag[]>([]);\n\n protected readonly supportSeverities = signal<AssistantSupportSeverity[]>([]);\n\n protected readonly supportTicketResult = signal<AssistantSupportTicketResponse | undefined>(\n undefined\n );\n\n protected readonly supportTicketError = signal<string | undefined>(undefined);\n\n protected readonly supportTicketSubmissionFailed = signal(false);\n\n protected supportTicketForm: SupportTicketFormValue = this.createSupportTicketForm();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly exportService: MaxAssistantExportService,\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.loadingTablePage.set(undefined);\n this.tablePageErrors.set({});\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 isListMetric(metric: { label: string; value: string; list?: boolean }): boolean {\n if (metric.list) {\n return true;\n }\n return /\\b(?:teams?|roles?)\\b/iu.test(metric.label) &&\n metric.value.split(/,|;|\\n/u).filter((value) => value.trim()).length > 1;\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 hasOptionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): boolean {\n return suggestions.some(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected optionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): AssistantSuggestion[] {\n return suggestions.filter(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected hasEntitySuggestions(suggestions: AssistantSuggestion[] = []): boolean {\n return suggestions.some(\n (suggestion) =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\n );\n }\n\n protected entitySuggestionOptions(\n suggestions: AssistantSuggestion[] = [],\n ): AssistantEntitySuggestionOption[] {\n return suggestions.filter(\n (suggestion): suggestion is AssistantEntitySuggestionOption =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\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.supportTicketSubmissionFailed.set(false);\n this.supportTags.set([]);\n this.supportSeverities.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 this.supportService\n .getSupportSeverities()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: severities => this.supportSeverities.set(severities),\n error: () => this.supportTicketError.set(\n 'Severity options could not be loaded. Please try again.'\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 this.supportTicketSubmissionFailed.set(false);\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.subject.trim() &&\n this.supportTicketForm.query.trim() &&\n this.supportTicketForm.severity &&\n !this.supportTicketSubmitting()\n );\n }\n\n protected supportSeverityColor(color: string): string {\n const value = color?.trim() ?? '';\n return value ? (value.startsWith('#') ? value : `#${value}`) : 'var(--max-accent)';\n }\n\n protected submitSupportTicket(): void {\n if (!this.canSubmitSupportTicket()) {\n return;\n }\n const severity = this.supportTicketForm.severity;\n if (!severity) {\n return;\n }\n\n this.supportTicketSubmitting.set(true);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\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 subject: this.supportTicketForm.subject.trim(),\n query: this.supportTicketForm.query.trim(),\n severity,\n tags: this.supportTicketForm.tags.map(({ id, label }) => ({ id, label })),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys'\n }, this.getAssistantConfig())\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.supportTicketSubmissionFailed.set(true);\n this.supportTicketError.set(\n 'Your ticket could not be created. Please try again shortly.'\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 retrieveNextTablePage(\n message: AssistantMessage,\n table: AssistantResponseTable,\n tableIndex: number\n ): void {\n const pagination = table.pagination;\n if (!pagination || !this.hasNextTablePage(table) || this.isSending()) {\n return;\n }\n const nextOffset = table.rows.length;\n if (nextOffset % pagination.pageSize !== 0) {\n return;\n }\n const tableKey = this.tablePageKey(message.id, tableIndex);\n const history = this.getConversationHistory();\n this.tablePageErrors.update(errors => {\n const next = { ...errors };\n delete next[tableKey];\n return next;\n });\n this.loadingTablePage.set(tableKey);\n this.isSending.set(true);\n\n this.assistantService\n .retrieveAnalyticsPage(\n pagination.query,\n { offset: nextOffset, pageSize: 250 },\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.mergeTablePage(message.id, tableIndex, response, pagination.query);\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n },\n error: error => {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: this.resolveErrorMessage(error)\n }));\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n }\n });\n }\n\n protected tablePageStatus(table: AssistantResponseTable): string {\n const pagination = table.pagination;\n if (!pagination) {\n return '';\n }\n const retrieved = table.rows.length;\n return pagination.totalRecordsExact === false\n ? `${retrieved.toLocaleString()} ${retrieved === 1 ? 'record' : 'records'} retrieved`\n : `${Math.min(retrieved, pagination.totalRecords).toLocaleString()} of ${pagination.totalRecords.toLocaleString()} records retrieved`;\n }\n\n protected hasNextTablePage(table: AssistantResponseTable): boolean {\n const pagination = table.pagination;\n if (!pagination || pagination.nextOffset === undefined) {\n return false;\n }\n if (pagination.hasMore !== undefined) {\n return pagination.hasMore;\n }\n return Boolean(\n pagination.remainingRecords > 0 &&\n table.rows.length < pagination.totalRecords\n );\n }\n\n protected nextTablePageLabel(pagination: AssistantResponseTablePagination): string {\n if (pagination.totalRecordsExact === false) {\n return `Retrieve next ${pagination.pageSize.toLocaleString()} records`;\n }\n return `Retrieve next ${Math.min(\n pagination.pageSize,\n pagination.remainingRecords\n ).toLocaleString()} records`;\n }\n\n protected isTablePageLoading(messageId: string, tableIndex: number): boolean {\n return this.loadingTablePage() === this.tablePageKey(messageId, tableIndex);\n }\n\n protected tablePageError(messageId: string, tableIndex: number): string | undefined {\n return this.tablePageErrors()[this.tablePageKey(messageId, tableIndex)];\n }\n\n protected exportTable(table: AssistantResponseTable): void {\n void this.exportService.exportTableToExcel(table);\n }\n\n protected exportVisualisation(visualisation: AssistantVisualisation): void {\n void this.exportService.exportVisualisationToPdf(visualisation);\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} 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 mergeTablePage(\n messageId: string,\n tableIndex: number,\n response: AssistantChatResponse,\n userQuery: string\n ): void {\n const nextDisplay = this.createDisplayResponse(response, userQuery);\n const nextTable = this.getResponseGrid(nextDisplay)[0];\n const tableKey = this.tablePageKey(messageId, tableIndex);\n this.messages.update(messages => messages.map(message => {\n if (message.id !== messageId) {\n return message;\n }\n const developerTrace = this.mergeDeveloperTraces(\n message.developerTrace,\n response.developerTrace\n );\n if (!nextTable || !message.displayResponse) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: response.answer\n }));\n return { ...message, developerTrace };\n }\n const tables = [...this.getResponseGrid(message.displayResponse)];\n const currentTable = tables[tableIndex];\n if (!currentTable) {\n return { ...message, developerTrace };\n }\n const rowOffset = currentTable.rows.length;\n if (\n nextTable.pagination &&\n nextTable.pagination.offset !== rowOffset\n ) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: 'The next records could not be retrieved in sequence. Please try the query again.'\n }));\n return { ...message, developerTrace };\n }\n const nextPagination = nextTable.pagination;\n const totalRecords = nextPagination?.totalRecords ?? rowOffset + nextTable.rows.length;\n const totalRecordsExact = nextPagination?.totalRecordsExact !== false;\n const combinedRows = [...currentTable.rows, ...nextTable.rows];\n const rows = totalRecordsExact\n ? combinedRows.slice(0, totalRecords)\n : combinedRows;\n const hasMore = nextPagination?.hasMore ??\n ((nextPagination?.remainingRecords ?? 0) > 0);\n const remainingRecords = totalRecordsExact\n ? Math.max(totalRecords - rows.length, 0)\n : (nextPagination?.remainingRecords ?? 0);\n const pagination = nextTable.pagination\n ? {\n query: nextTable.pagination.query,\n offset: 0,\n pageSize: nextTable.pagination.pageSize,\n totalRecords,\n totalRecordsExact,\n returnedRecords: rows.length,\n remainingRecords,\n hasMore,\n ...(hasMore ? { nextOffset: rows.length } : {})\n }\n : currentTable.pagination;\n tables[tableIndex] = {\n ...currentTable,\n rows,\n ...(nextTable.actions?.length\n ? {\n actions: [\n ...(currentTable.actions ?? []),\n ...nextTable.actions.map(action => ({\n ...action,\n rowIndex: action.rowIndex + rowOffset\n }))\n ]\n }\n : {}),\n ...(pagination ? { pagination } : {})\n };\n return {\n ...message,\n displayResponse: {\n ...message.displayResponse,\n grid: tables,\n tables\n },\n developerTrace\n };\n }));\n this.scrollToLatest();\n }\n\n private mergeDeveloperTraces(\n current?: AssistantDeveloperTrace,\n next?: AssistantDeveloperTrace\n ): AssistantDeveloperTrace | undefined {\n if (!current) {\n return next;\n }\n if (!next) {\n return current;\n }\n const lastId = Math.max(0, ...current.steps.map(step => step.id));\n const steps = [\n ...current.steps,\n ...next.steps.map((step, index) => ({ ...step, id: lastId + index + 1 }))\n ];\n if (!current.run || !next.run) {\n return { ...(next.run ?? current.run ? { run: next.run ?? current.run } : {}), steps };\n }\n return {\n run: {\n ...current.run,\n completedAt: next.run.completedAt,\n durationMs: current.run.durationMs + next.run.durationMs,\n llmCalls: current.run.llmCalls + next.run.llmCalls,\n embeddingCalls: current.run.embeddingCalls + next.run.embeddingCalls,\n apiCalls: current.run.apiCalls + next.run.apiCalls\n },\n steps\n };\n }\n\n private tablePageKey(messageId: string, tableIndex: number): string {\n return `${messageId}:${tableIndex}`;\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 subject: '',\n query: '',\n severity: null,\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 <img\n class=\"max-assistant-sparkles\"\n src=\"assets/max/max-assistant-sparkles-styled-gradient.png\"\n alt=\"\"\n aria-hidden=\"true\"\n >\n <div class=\"assistant-identity\">\n <div class=\"assistant-name-row\">\n <h2 class=\"assistant-name\">\n <img\n class=\"assistant-wordmark\"\n src=\"assets/max/max-wordmark-styled-gradient.png\"\n [alt]=\"uiCopy.title\"\n >\n </h2>\n <span class=\"assistant-beta-tag\">Beta</span>\n </div>\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 @if(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n }\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 <span class=\"assistant-card-title\">{{ card.title }}</span>\n @if(card.subtitle) {\n <span class=\"assistant-card-subtitle\">{{ 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\" [class.assistant-card-metric-wide]=\"isListMetric(metric)\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span class=\"assistant-card-label\">{{ metric.label }}</span>\n <span class=\"assistant-card-value\">{{ metric.value }}</span>\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 <header class=\"assistant-export-heading\">\n <h3>{{ visualisation.title }}</h3>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-pdf\"\n icon=\"pi pi-file-pdf\"\n [attr.aria-label]=\"'Export ' + visualisation.title + ' as PDF'\"\n (click)=\"exportVisualisation(visualisation)\"\n ></button>\n </header>\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>{{ visualisation.valueLabel || '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; let tableIndex = $index) {\n <section class=\"assistant-table-section\">\n <header class=\"assistant-export-heading\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-excel\"\n icon=\"pi pi-file-excel\"\n [attr.aria-label]=\"'Export ' + (table.title || 'results') + ' to Excel'\"\n (click)=\"exportTable(table)\"\n ></button>\n </header>\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @if(table.pagination) {\n <th>SL. No</th>\n }\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 @if(table.pagination) {\n <td>{{ rowIndex + 1 }}</td>\n }\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 @if(table.pagination; as pagination) {\n <footer class=\"assistant-table-pagination\">\n <span>{{ tablePageStatus(table) }}</span>\n @if(hasNextTablePage(table)) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-table-page-action\"\n icon=\"pi pi-arrow-down\"\n [label]=\"nextTablePageLabel(pagination)\"\n [loading]=\"isTablePageLoading(message.id, tableIndex)\"\n [disabled]=\"isSending()\"\n (click)=\"retrieveNextTablePage(message, table, tableIndex)\"\n ></button>\n }\n </footer>\n @if(tablePageError(message.id, tableIndex); as pageError) {\n <p class=\"assistant-table-page-error\" role=\"alert\">{{ pageError }}</p>\n }\n }\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 @if(traceField(step.input, 'sql'); as sql) {\n <div class=\"trace-tool-call trace-sql-query\">\n <span>SQL sent to MySQL MCP</span>\n <strong>{{ formatTraceScalar(traceField(step.input, 'toolName')) }}</strong>\n <pre>{{ formatTraceScalar(sql) }}</pre>\n </div>\n }\n @if(traceField(step.input, 'method') || traceField(step.input, 'path')) {\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 }\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 @if(traceField(step.input, 'sql') && step.output !== undefined) {\n <section><span>MySQL MCP execution details</span><pre>{{ formatTraceValue(step.output) }}</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 if(hasOptionCardSuggestions(message.suggestions, message.status)) {\n <div class=\"clarification-options\" aria-label=\"Clarification options\">\n <div class=\"capability-option-grid clarification-option-grid\">\n @for(suggestion of optionCardSuggestions(message.suggestions, message.status); track suggestionLabel(suggestion); let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card clarification-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose option: ' + suggestionLabel(suggestion)\"\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\">{{ suggestionLabel(suggestion) }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n } @else if(hasEntitySuggestions(message.suggestions)) {\n <div class=\"entity-options\" aria-label=\"Matching options\">\n @for(suggestion of entitySuggestionOptions(message.suggestions); track suggestion.entity.id ?? suggestion.label) {\n <max-agent-entity-option\n [entity]=\"suggestion.entity\"\n [disabled]=\"isSending()\"\n (selected)=\"useSuggestion(suggestion)\"\n ></max-agent-entity-option>\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(supportTicketSubmissionFailed()) {\n <div class=\"support-ticket-error-page\" role=\"alert\">\n <span class=\"support-ticket-error-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-times-circle\"></i>\n </span>\n <h3>Ticket could not be created</h3>\n <p>{{ supportTicketError() }}</p>\n <button\n pButton\n type=\"button\"\n label=\"Close\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else 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 @if(result.ticketReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.ticketReference }}</strong>\n </div>\n }\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 support-ticket-field-wide\">\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]=\"supportSeverities()\"\n optionLabel=\"label\"\n [fluid]=\"true\"\n [loading]=\"supportSeverities().length === 0\"\n [(ngModel)]=\"supportTicketForm.severity\"\n >\n <ng-template #selectedItem let-severity>\n <p-tag\n class=\"support-severity-tag\"\n [value]=\"severity.label\"\n [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\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 [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-select>\n </label>\n\n <label class=\"support-ticket-field\">\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 dataKey=\"id\"\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.id) {\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>Subject</span>\n <input\n type=\"text\"\n name=\"supportSubject\"\n maxlength=\"200\"\n placeholder=\"Summarise the issue\"\n required\n [(ngModel)]=\"supportTicketForm.subject\"\n />\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/entity-option/max-agent-entity-option.component';\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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"}
|
|
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/components/entity-option/max-agent-entity-option.component.ts","../../../projects/max-agent-ui/src/lib/components/entity-option/max-agent-entity-option.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-export.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 apiBaseUrl?: string;\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('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\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 { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\n\nimport { AssistantSuggestionEntity } from '../../models/assistant.models';\n\nconst ENTITY_ICONS: Readonly<Partial<Record<AssistantSuggestionEntity['kind'], string>>> = {\n team: 'pi pi-users',\n role: 'pi pi-id-card',\n location: 'pi pi-map-marker',\n position: 'pi pi-briefcase',\n department: 'pi pi-building',\n entity: 'pi pi-tag',\n};\n\n@Component({\n selector: 'max-agent-entity-option',\n templateUrl: './max-agent-entity-option.component.html',\n styleUrl: './max-agent-entity-option.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MaxAgentEntityOptionComponent {\n @Input({ required: true }) entity!: AssistantSuggestionEntity;\n @Input() disabled = false;\n\n @Output() selected = new EventEmitter<void>();\n\n protected get isPerson(): boolean {\n return this.entity.kind === 'person' || this.entity.kind === 'employee';\n }\n\n protected get displayCode(): string | number | undefined {\n return this.entity.code ?? this.entity.id;\n }\n\n protected get initials(): string {\n return this.entity.name\n .split(/\\s+/u)\n .filter(Boolean)\n .slice(0, 2)\n .map((part) => part[0]?.toLocaleUpperCase())\n .join('');\n }\n\n protected get entityColor(): string | undefined {\n return this.normaliseColor(this.entity.color);\n }\n\n protected get entityTextColor(): string | undefined {\n return this.normaliseColor(this.entity.textColor);\n }\n\n protected get entityIcon(): string {\n return ENTITY_ICONS[this.entity.kind] ?? 'pi pi-tag';\n }\n\n protected choose(): void {\n if (!this.disabled) {\n this.selected.emit();\n }\n }\n\n private normaliseColor(value: string | undefined): string | undefined {\n const color = value?.trim();\n if (!color) {\n return undefined;\n }\n return /^[\\da-f]{3,8}$/iu.test(color) ? `#${color}` : color;\n }\n}\n","<button\n type=\"button\"\n class=\"entity-option\"\n [class.entity-option-person]=\"isPerson\"\n [class.entity-option-tag]=\"!isPerson\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"'Choose ' + entity.name\"\n [style.--max-agent-entity-color]=\"entityColor\"\n [style.--max-agent-entity-text-color]=\"entityTextColor\"\n (click)=\"choose()\"\n>\n @if (isPerson) {\n <span class=\"person-photo\" aria-hidden=\"true\">\n @if (entity.photo) {\n <img [src]=\"entity.photo\" [alt]=\"''\" />\n } @else {\n <span>{{ initials }}</span>\n }\n </span>\n <span class=\"person-copy\">\n <span class=\"person-name\">{{ entity.name }}</span>\n @if (displayCode !== undefined && displayCode !== '') {\n <small>#{{ displayCode }}</small>\n }\n </span>\n <i class=\"pi pi-arrow-right option-arrow\" aria-hidden=\"true\"></i>\n } @else {\n <span class=\"entity-icon\" aria-hidden=\"true\">\n <i [class]=\"entityIcon\"></i>\n </span>\n <span class=\"entity-name\">{{ entity.name }}</span>\n }\n</button>\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 AssistantAnalyticsPage,\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 retrieveAnalyticsPage(\n message: string,\n analyticsPage: AssistantAnalyticsPage,\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 analyticsPage\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';\n\nimport {\n AssistantFieldValue,\n AssistantResponseTable,\n AssistantVisualisation,\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantExportService {\n async exportTableToExcel(table: AssistantResponseTable): Promise<void> {\n const XLSX = await import('xlsx');\n const worksheetData = [\n table.columns.map(column => column.header),\n ...table.rows.map(row =>\n table.columns.map(column => this.toExportCellValue(row[column.field]))\n ),\n ];\n const worksheet = XLSX.utils.aoa_to_sheet(worksheetData);\n const workbook = XLSX.utils.book_new();\n\n XLSX.utils.book_append_sheet(workbook, worksheet, 'Results');\n const file = XLSX.write(workbook, {\n bookType: 'xlsx',\n compression: true,\n type: 'array',\n });\n this.downloadFile(\n new Blob([file], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n }),\n `${this.exportFileName(table.title, 'agent-results')}.xlsx`\n );\n }\n\n async exportVisualisationToPdf(visualisation: AssistantVisualisation): Promise<void> {\n const { jsPDF } = await import('jspdf');\n const document = new jsPDF({ format: 'a4', orientation: 'portrait', unit: 'mm' });\n const pageWidth = document.internal.pageSize.getWidth();\n const pageHeight = document.internal.pageSize.getHeight();\n const margin = 16;\n const contentWidth = pageWidth - (margin * 2);\n const maximum = Math.max(0, ...visualisation.values.map(value => Number(value) || 0));\n let cursorY = 20;\n\n document.setFont('helvetica', 'bold');\n document.setFontSize(16);\n document.text(visualisation.title, margin, cursorY, { maxWidth: contentWidth });\n cursorY += 9;\n\n document.setFont('helvetica', 'normal');\n document.setFontSize(10);\n const chartType = visualisation.type === 'doughnut' ? 'Doughnut chart' : 'Bar chart';\n document.text(chartType, margin, cursorY);\n\n if (visualisation.type === 'doughnut') {\n const valueLabel = visualisation.valueLabel ? ` ${visualisation.valueLabel}` : '';\n document.text(\n `Total: ${this.chartTotal(visualisation)}${valueLabel}`,\n pageWidth - margin,\n cursorY,\n { align: 'right' }\n );\n }\n cursorY += 10;\n\n visualisation.labels.forEach((label, index) => {\n const value = Number(visualisation.values[index]) || 0;\n const labelLines = document.splitTextToSize(label, contentWidth - 32) as string[];\n const rowHeight = Math.max(8, labelLines.length * 5 + 3)\n + (visualisation.type === 'bar' ? 6 : 0);\n\n if (cursorY + rowHeight > pageHeight - margin) {\n document.addPage();\n cursorY = margin;\n }\n\n const [red, green, blue] = this.pdfColor(\n visualisation.colors?.[index] ?? this.fallbackColor(index)\n );\n document.setFillColor(red, green, blue);\n document.rect(margin, cursorY, 4, 4, 'F');\n document.setTextColor(31, 41, 55);\n document.text(labelLines, margin + 7, cursorY + 3);\n document.setFont('helvetica', 'bold');\n document.text(String(value), pageWidth - margin, cursorY + 3, { align: 'right' });\n document.setFont('helvetica', 'normal');\n\n if (visualisation.type === 'bar') {\n const barY = cursorY + Math.max(7, labelLines.length * 5 + 1);\n const barWidth = contentWidth - 7;\n document.setFillColor(226, 232, 240);\n document.rect(margin + 7, barY, barWidth, 3, 'F');\n if (maximum > 0 && value > 0) {\n document.setFillColor(red, green, blue);\n document.rect(margin + 7, barY, barWidth * (value / maximum), 3, 'F');\n }\n }\n\n cursorY += rowHeight;\n });\n\n this.downloadFile(\n new Blob([document.output('arraybuffer')], { type: 'application/pdf' }),\n `${this.exportFileName(visualisation.title, 'agent-chart')}.pdf`\n );\n }\n\n private 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 private toExportCellValue(value: AssistantFieldValue | undefined): string | number | boolean {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (Array.isArray(value)) {\n return value.map(item => this.toExportCellValue(item)).join(', ');\n }\n\n if (typeof value === 'object') {\n const preferredValue = value['label'] ?? value['name'] ?? value['code'];\n return preferredValue === undefined\n ? JSON.stringify(value)\n : String(this.toExportCellValue(preferredValue));\n }\n\n return value;\n }\n\n private exportFileName(title: string | undefined, fallback: string): string {\n const normalised = (title || fallback)\n .trim()\n .toLocaleLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n\n return normalised || fallback;\n }\n\n private fallbackColor(index: number): string {\n const colors = ['#42A5F5', '#FFA5F5', '#66BB6A', '#FFA726', '#228888'];\n return colors[index % colors.length];\n }\n\n private pdfColor(color: string): [number, number, number] {\n const normalised = color.trim().replace(/^#/, '');\n const expanded = normalised.length === 3\n ? normalised.split('').map(character => `${character}${character}`).join('')\n : normalised;\n\n if (!/^[0-9a-f]{6}$/i.test(expanded)) {\n return [66, 165, 245];\n }\n\n return [\n Number.parseInt(expanded.slice(0, 2), 16),\n Number.parseInt(expanded.slice(2, 4), 16),\n Number.parseInt(expanded.slice(4, 6), 16),\n ];\n }\n\n private downloadFile(file: Blob, fileName: string): void {\n const url = URL.createObjectURL(file);\n const link = document.createElement('a');\n\n link.href = url;\n link.download = fileName;\n link.click();\n URL.revokeObjectURL(url);\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 { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { map, Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantSupportTag,\n AssistantSelectableEntity,\n AssistantSupportSeverity,\n AssistantSupportTicketRequest,\n AssistantSupportTicketResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantSupportService {\n readonly ticketsEndpoint = '/ticket';\n readonly tagsEndpoint = '/selection/lookup/supportticket/tag';\n readonly severitiesEndpoint = '/selection/lookup/supportticket/severity';\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n getSupportTags(): Observable<AssistantSupportTag[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSelectableEntity[]>(\n this.getEndpoint(this.tagsEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n ).pipe(\n map(tags => tags.map(tag => ({\n ...tag,\n icon: 'pi pi-tag',\n severity: 'info' as const\n })))\n );\n }\n\n getSupportSeverities(): Observable<AssistantSupportSeverity[]> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.get<AssistantSupportSeverity[]>(\n this.getEndpoint(this.severitiesEndpoint, this.mergeConfig({})),\n { headers: this.getHeaders(this.mergeConfig({})) }\n );\n }\n\n submitTicket(\n ticket: AssistantSupportTicketRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantSupportTicketResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n const mergedConfig = this.mergeConfig(config);\n const response$ = this.http.post(\n this.getEndpoint(this.ticketsEndpoint, mergedConfig),\n {\n subject: ticket.subject,\n body: ticket.query,\n severity: ticket.severity,\n tags: ticket.tags.map(({ id, label }) => ({ id, label }))\n },\n {\n headers: this.getHeaders(mergedConfig),\n responseType: 'text'\n }\n );\n\n return response$.pipe(map(response => this.toTicketResponse(response)));\n }\n\n private toTicketResponse(_response: string): AssistantSupportTicketResponse {\n return {\n success: true,\n message: 'Your support ticket has been created. You will receive an email with your reference number shortly.',\n submittedAt: new Date().toISOString()\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n if (name.trim() && value.trim()) {\n headers = headers.set(name.trim(), value.trim());\n }\n }\n\n if (user.token) {\n headers = headers.set('x-auth-token', String(user.token));\n }\n if (user.version) {\n headers = headers.set('x-version', String(user.version));\n }\n\n return headers;\n }\n\n private getEndpoint(path: string, config: MaxAssistantConfig): string {\n const baseUrl = config.apiBaseUrl?.trim();\n return baseUrl ? `${baseUrl.replace(/\\/$/, '')}${path}` : path;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n return typeof config.user === 'function' ? config.user() : config.user ?? {};\n }\n\n private mergeConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n const merged = {\n ...this.config,\n ...Object.fromEntries(Object.entries(config).filter(([, value]) => value !== undefined))\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 { 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 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 AssistantSuggestionEntity,\n AssistantExtractedIntent,\n AssistantFeedbackCategory,\n AssistantFeedbackResponse,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantHostAction,\n AssistantHelpGuide,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantResponseTablePagination,\n AssistantSearchResult,\n AssistantSuggestion,\n AssistantSuggestionOption,\n AssistantSupportSeverity,\n AssistantSupportTag,\n AssistantSupportTicketResponse,\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 { MaxAssistantExportService } from './max-assistant-export.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';\nimport { MaxAgentEntityOptionComponent } from '../entity-option/max-agent-entity-option.component';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max AI',\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 AI',\n startingMessage: 'Reviewing 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\nconst ASSISTANT_HELP_ICONS: Readonly<Record<AssistantHelpGuide['icon'], string>> = {\n budget: 'pi pi-wallet',\n calendar: 'pi pi-calendar-plus',\n document: 'pi pi-file',\n megaphone: 'pi pi-megaphone',\n people: 'pi pi-user',\n team: 'pi pi-users',\n 'time-off': 'pi pi-calendar-times',\n timesheet: 'pi pi-clock',\n workflow: 'pi pi-sitemap',\n};\n\ninterface SupportTicketFormValue {\n name: string;\n email: string;\n phone: string;\n subject: string;\n query: string;\n severity: AssistantSupportSeverity | null;\n tags: AssistantSupportTag[];\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\ninterface AssistantEntitySuggestionOption extends AssistantSuggestionOption {\n presentation: 'person_card' | 'entity_tag';\n entity: AssistantSuggestionEntity;\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 MaxAgentEntityOptionComponent,\n MaxAgentShiftCardComponent,\n ],\n templateUrl: './max-assistant.component.html',\n encapsulation: ViewEncapsulation.Emulated,\n styleUrls: ['./max-assistant.component.scss', './max-assistant.workspace.scss'],\n})\nexport class MaxAssistantComponent implements OnInit {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n @ViewChild('composerInput') private composerInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('supportQueryInput') private supportQueryInput?: ElementRef<HTMLTextAreaElement>;\n\n @ViewChild('feedbackInput') private feedbackInput?: ElementRef<HTMLTextAreaElement>;\n\n @Input() app?: AssistantProduct;\n\n @Input() assistantApiUrl?: string;\n\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n\n @Input() developerDetailsEnabled = true;\n\n @Output() hostAction = new EventEmitter<AssistantHostAction>();\n\n @Output() closeRequested = new EventEmitter<void>();\n\n protected readonly isSending = signal(false);\n\n protected readonly input = signal('');\n\n protected readonly conversationId = signal<string | undefined>(undefined);\n\n protected readonly messages = signal<AssistantMessage[]>([]);\n\n protected readonly expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n\n protected readonly loadingTablePage = signal<string | undefined>(undefined);\n\n protected readonly tablePageErrors = signal<Readonly<Record<string, string>>>({});\n\n protected readonly feedbackVisible = signal(false);\n\n protected readonly feedbackSubmitting = signal(false);\n\n protected readonly feedbackResult = signal<AssistantFeedbackResponse | undefined>(undefined);\n\n protected readonly feedbackError = signal<string | undefined>(undefined);\n\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\n protected feedbackForm: FeedbackFormValue = this.createFeedbackForm();\n\n protected readonly supportTicketVisible = signal(false);\n\n protected readonly supportTicketSubmitting = signal(false);\n\n protected readonly supportTagsLoading = signal(false);\n\n protected readonly supportTags = signal<AssistantSupportTag[]>([]);\n\n protected readonly supportSeverities = signal<AssistantSupportSeverity[]>([]);\n\n protected readonly supportTicketResult = signal<AssistantSupportTicketResponse | undefined>(\n undefined\n );\n\n protected readonly supportTicketError = signal<string | undefined>(undefined);\n\n protected readonly supportTicketSubmissionFailed = signal(false);\n\n protected supportTicketForm: SupportTicketFormValue = this.createSupportTicketForm();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly exportService: MaxAssistantExportService,\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.loadingTablePage.set(undefined);\n this.tablePageErrors.set({});\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 isListMetric(metric: { label: string; value: string; list?: boolean }): boolean {\n if (metric.list) {\n return true;\n }\n return /\\b(?:teams?|roles?)\\b/iu.test(metric.label) &&\n metric.value.split(/,|;|\\n/u).filter((value) => value.trim()).length > 1;\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 hasOptionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): boolean {\n return suggestions.some(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected optionCardSuggestions(\n suggestions: AssistantSuggestion[] = [],\n status?: AssistantChatResponse['status']\n ): AssistantSuggestion[] {\n return suggestions.filter(\n suggestion => {\n if (typeof suggestion === 'string') {\n return status === 'clarification_required';\n }\n return suggestion.presentation === 'option_card' ||\n (status === 'clarification_required' &&\n suggestion.presentation !== 'capability_card' &&\n suggestion.presentation !== 'person_card' &&\n suggestion.presentation !== 'entity_tag');\n }\n );\n }\n\n protected hasEntitySuggestions(suggestions: AssistantSuggestion[] = []): boolean {\n return suggestions.some(\n (suggestion) =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\n );\n }\n\n protected entitySuggestionOptions(\n suggestions: AssistantSuggestion[] = [],\n ): AssistantEntitySuggestionOption[] {\n return suggestions.filter(\n (suggestion): suggestion is AssistantEntitySuggestionOption =>\n typeof suggestion !== 'string' &&\n (suggestion.presentation === 'person_card' || suggestion.presentation === 'entity_tag') &&\n Boolean(suggestion.entity),\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.supportTicketSubmissionFailed.set(false);\n this.supportTags.set([]);\n this.supportSeverities.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 this.supportService\n .getSupportSeverities()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: severities => this.supportSeverities.set(severities),\n error: () => this.supportTicketError.set(\n 'Severity options could not be loaded. Please try again.'\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 this.supportTicketSubmissionFailed.set(false);\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.subject.trim() &&\n this.supportTicketForm.query.trim() &&\n this.supportTicketForm.severity &&\n !this.supportTicketSubmitting()\n );\n }\n\n protected supportSeverityColor(color: string): string {\n const value = color?.trim() ?? '';\n return value ? (value.startsWith('#') ? value : `#${value}`) : 'var(--max-accent)';\n }\n\n protected submitSupportTicket(): void {\n if (!this.canSubmitSupportTicket()) {\n return;\n }\n const severity = this.supportTicketForm.severity;\n if (!severity) {\n return;\n }\n\n this.supportTicketSubmitting.set(true);\n this.supportTicketError.set(undefined);\n this.supportTicketSubmissionFailed.set(false);\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 subject: this.supportTicketForm.subject.trim(),\n query: this.supportTicketForm.query.trim(),\n severity,\n tags: this.supportTicketForm.tags.map(({ id, label }) => ({ id, label })),\n app: this.app ?? this.defaultConfig.app ?? 'nemesys'\n }, this.getAssistantConfig())\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.supportTicketSubmissionFailed.set(true);\n this.supportTicketError.set(\n 'Your ticket could not be created. Please try again shortly.'\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 helpIcon(icon: AssistantHelpGuide['icon']): string {\n return ASSISTANT_HELP_ICONS[icon];\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 retrieveNextTablePage(\n message: AssistantMessage,\n table: AssistantResponseTable,\n tableIndex: number\n ): void {\n const pagination = table.pagination;\n if (!pagination || !this.hasNextTablePage(table) || this.isSending()) {\n return;\n }\n const nextOffset = table.rows.length;\n if (nextOffset % pagination.pageSize !== 0) {\n return;\n }\n const tableKey = this.tablePageKey(message.id, tableIndex);\n const history = this.getConversationHistory();\n this.tablePageErrors.update(errors => {\n const next = { ...errors };\n delete next[tableKey];\n return next;\n });\n this.loadingTablePage.set(tableKey);\n this.isSending.set(true);\n\n this.assistantService\n .retrieveAnalyticsPage(\n pagination.query,\n { offset: nextOffset, pageSize: 250 },\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.mergeTablePage(message.id, tableIndex, response, pagination.query);\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n },\n error: error => {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: this.resolveErrorMessage(error)\n }));\n this.loadingTablePage.set(undefined);\n this.isSending.set(false);\n }\n });\n }\n\n protected tablePageStatus(table: AssistantResponseTable): string {\n const pagination = table.pagination;\n if (!pagination) {\n return '';\n }\n const retrieved = table.rows.length;\n return pagination.totalRecordsExact === false\n ? `${retrieved.toLocaleString()} ${retrieved === 1 ? 'record' : 'records'} retrieved`\n : `${Math.min(retrieved, pagination.totalRecords).toLocaleString()} of ${pagination.totalRecords.toLocaleString()} records retrieved`;\n }\n\n protected hasNextTablePage(table: AssistantResponseTable): boolean {\n const pagination = table.pagination;\n if (!pagination || pagination.nextOffset === undefined) {\n return false;\n }\n if (pagination.hasMore !== undefined) {\n return pagination.hasMore;\n }\n return Boolean(\n pagination.remainingRecords > 0 &&\n table.rows.length < pagination.totalRecords\n );\n }\n\n protected nextTablePageLabel(pagination: AssistantResponseTablePagination): string {\n if (pagination.totalRecordsExact === false) {\n return `Retrieve next ${pagination.pageSize.toLocaleString()} records`;\n }\n return `Retrieve next ${Math.min(\n pagination.pageSize,\n pagination.remainingRecords\n ).toLocaleString()} records`;\n }\n\n protected isTablePageLoading(messageId: string, tableIndex: number): boolean {\n return this.loadingTablePage() === this.tablePageKey(messageId, tableIndex);\n }\n\n protected tablePageError(messageId: string, tableIndex: number): string | undefined {\n return this.tablePageErrors()[this.tablePageKey(messageId, tableIndex)];\n }\n\n protected exportTable(table: AssistantResponseTable): void {\n void this.exportService.exportTableToExcel(table);\n }\n\n protected exportVisualisation(visualisation: AssistantVisualisation): void {\n void this.exportService.exportVisualisationToPdf(visualisation);\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} 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 mergeTablePage(\n messageId: string,\n tableIndex: number,\n response: AssistantChatResponse,\n userQuery: string\n ): void {\n const nextDisplay = this.createDisplayResponse(response, userQuery);\n const nextTable = this.getResponseGrid(nextDisplay)[0];\n const tableKey = this.tablePageKey(messageId, tableIndex);\n this.messages.update(messages => messages.map(message => {\n if (message.id !== messageId) {\n return message;\n }\n const developerTrace = this.mergeDeveloperTraces(\n message.developerTrace,\n response.developerTrace\n );\n if (!nextTable || !message.displayResponse) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: response.answer\n }));\n return { ...message, developerTrace };\n }\n const tables = [...this.getResponseGrid(message.displayResponse)];\n const currentTable = tables[tableIndex];\n if (!currentTable) {\n return { ...message, developerTrace };\n }\n const rowOffset = currentTable.rows.length;\n if (\n nextTable.pagination &&\n nextTable.pagination.offset !== rowOffset\n ) {\n this.tablePageErrors.update(errors => ({\n ...errors,\n [tableKey]: 'The next records could not be retrieved in sequence. Please try the query again.'\n }));\n return { ...message, developerTrace };\n }\n const nextPagination = nextTable.pagination;\n const totalRecords = nextPagination?.totalRecords ?? rowOffset + nextTable.rows.length;\n const totalRecordsExact = nextPagination?.totalRecordsExact !== false;\n const combinedRows = [...currentTable.rows, ...nextTable.rows];\n const rows = totalRecordsExact\n ? combinedRows.slice(0, totalRecords)\n : combinedRows;\n const hasMore = nextPagination?.hasMore ??\n ((nextPagination?.remainingRecords ?? 0) > 0);\n const remainingRecords = totalRecordsExact\n ? Math.max(totalRecords - rows.length, 0)\n : (nextPagination?.remainingRecords ?? 0);\n const pagination = nextTable.pagination\n ? {\n query: nextTable.pagination.query,\n offset: 0,\n pageSize: nextTable.pagination.pageSize,\n totalRecords,\n totalRecordsExact,\n returnedRecords: rows.length,\n remainingRecords,\n hasMore,\n ...(hasMore ? { nextOffset: rows.length } : {})\n }\n : currentTable.pagination;\n tables[tableIndex] = {\n ...currentTable,\n rows,\n ...(nextTable.actions?.length\n ? {\n actions: [\n ...(currentTable.actions ?? []),\n ...nextTable.actions.map(action => ({\n ...action,\n rowIndex: action.rowIndex + rowOffset\n }))\n ]\n }\n : {}),\n ...(pagination ? { pagination } : {})\n };\n return {\n ...message,\n displayResponse: {\n ...message.displayResponse,\n grid: tables,\n tables\n },\n developerTrace\n };\n }));\n this.scrollToLatest();\n }\n\n private mergeDeveloperTraces(\n current?: AssistantDeveloperTrace,\n next?: AssistantDeveloperTrace\n ): AssistantDeveloperTrace | undefined {\n if (!current) {\n return next;\n }\n if (!next) {\n return current;\n }\n const lastId = Math.max(0, ...current.steps.map(step => step.id));\n const steps = [\n ...current.steps,\n ...next.steps.map((step, index) => ({ ...step, id: lastId + index + 1 }))\n ];\n if (!current.run || !next.run) {\n return { ...(next.run ?? current.run ? { run: next.run ?? current.run } : {}), steps };\n }\n return {\n run: {\n ...current.run,\n completedAt: next.run.completedAt,\n durationMs: current.run.durationMs + next.run.durationMs,\n llmCalls: current.run.llmCalls + next.run.llmCalls,\n embeddingCalls: current.run.embeddingCalls + next.run.embeddingCalls,\n apiCalls: current.run.apiCalls + next.run.apiCalls\n },\n steps\n };\n }\n\n private tablePageKey(messageId: string, tableIndex: number): string {\n return `${messageId}:${tableIndex}`;\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 subject: '',\n query: '',\n severity: null,\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 helpGuide: provided.helpGuide,\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 <img\n class=\"max-assistant-sparkles\"\n src=\"assets/max/max-assistant-sparkles-styled-gradient.png\"\n alt=\"\"\n aria-hidden=\"true\"\n >\n <div class=\"assistant-identity\">\n <div class=\"assistant-name-row\">\n <h2 class=\"assistant-name\">\n <img\n class=\"assistant-wordmark\"\n src=\"assets/max/max-ai-wordmark-styled-gradient.png\"\n [alt]=\"uiCopy.title\"\n >\n </h2>\n <span class=\"assistant-beta-tag\">Beta</span>\n </div>\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 @if(responseDetails.helpGuide; as guide) {\n <section class=\"assistant-help-guide\" aria-label=\"Help guide\">\n <header class=\"assistant-help-heading\">\n <span class=\"assistant-help-topic-icon\" aria-hidden=\"true\">\n <i [class]=\"helpIcon(guide.icon)\"></i>\n </span>\n <div>\n <span class=\"assistant-help-eyebrow\">Help guide</span>\n <h3>{{ guide.title }}</h3>\n </div>\n </header>\n\n <p class=\"assistant-help-summary\">{{ guide.summary }}</p>\n\n @if(guide.steps.length) {\n <section class=\"assistant-help-section assistant-help-steps\">\n <h4><i class=\"pi pi-list-check\" aria-hidden=\"true\"></i>Steps</h4>\n <ol>\n @for(step of guide.steps; track $index) {\n <li>{{ step }}</li>\n }\n </ol>\n </section>\n }\n\n @if(guide.tips?.length) {\n <aside class=\"assistant-help-callout assistant-help-tips\">\n <i class=\"pi pi-lightbulb\" aria-hidden=\"true\"></i>\n <div>\n <h4>Good to know</h4>\n <ul>\n @for(tip of guide.tips ?? []; track $index) {\n <li>{{ tip }}</li>\n }\n </ul>\n </div>\n </aside>\n }\n\n @if(guide.restrictions?.length) {\n <aside class=\"assistant-help-callout assistant-help-restrictions\">\n <i class=\"pi pi-info-circle\" aria-hidden=\"true\"></i>\n <div>\n <h4>Keep in mind</h4>\n <ul>\n @for(restriction of guide.restrictions ?? []; track $index) {\n <li>{{ restriction }}</li>\n }\n </ul>\n </div>\n </aside>\n }\n\n @if(guide.accessNote) {\n <p class=\"assistant-help-access\">\n <i class=\"pi pi-lock\" aria-hidden=\"true\"></i>\n <span>{{ guide.accessNote }}</span>\n </p>\n }\n\n @if(guide.navigation; as navigation) {\n <div class=\"assistant-help-navigation-row\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n outlined\n class=\"assistant-help-navigation\"\n [label]=\"navigation.label\"\n [icon]=\"helpIcon(guide.icon)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(navigation.hostAction)\"\n ></button>\n </div>\n }\n </section>\n } @else if(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n }\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 <span class=\"assistant-card-title\">{{ card.title }}</span>\n @if(card.subtitle) {\n <span class=\"assistant-card-subtitle\">{{ 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\" [class.assistant-card-metric-wide]=\"isListMetric(metric)\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span class=\"assistant-card-label\">{{ metric.label }}</span>\n <span class=\"assistant-card-value\">{{ metric.value }}</span>\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 <header class=\"assistant-export-heading\">\n <h3>{{ visualisation.title }}</h3>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-pdf\"\n icon=\"pi pi-file-pdf\"\n [attr.aria-label]=\"'Export ' + visualisation.title + ' as PDF'\"\n (click)=\"exportVisualisation(visualisation)\"\n ></button>\n </header>\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>{{ visualisation.valueLabel || '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; let tableIndex = $index) {\n <section class=\"assistant-table-section\">\n <header class=\"assistant-export-heading\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-export-action assistant-export-action-excel\"\n icon=\"pi pi-file-excel\"\n [attr.aria-label]=\"'Export ' + (table.title || 'results') + ' to Excel'\"\n (click)=\"exportTable(table)\"\n ></button>\n </header>\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @if(table.pagination) {\n <th>SL. No</th>\n }\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 @if(table.pagination) {\n <td>{{ rowIndex + 1 }}</td>\n }\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 @if(table.pagination; as pagination) {\n <footer class=\"assistant-table-pagination\">\n <span>{{ tablePageStatus(table) }}</span>\n @if(hasNextTablePage(table)) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"assistant-table-page-action\"\n icon=\"pi pi-arrow-down\"\n [label]=\"nextTablePageLabel(pagination)\"\n [loading]=\"isTablePageLoading(message.id, tableIndex)\"\n [disabled]=\"isSending()\"\n (click)=\"retrieveNextTablePage(message, table, tableIndex)\"\n ></button>\n }\n </footer>\n @if(tablePageError(message.id, tableIndex); as pageError) {\n <p class=\"assistant-table-page-error\" role=\"alert\">{{ pageError }}</p>\n }\n }\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 @if(traceField(step.input, 'sql'); as sql) {\n <div class=\"trace-tool-call trace-sql-query\">\n <span>SQL sent to MySQL MCP</span>\n <strong>{{ formatTraceScalar(traceField(step.input, 'toolName')) }}</strong>\n <pre>{{ formatTraceScalar(sql) }}</pre>\n </div>\n }\n @if(traceField(step.input, 'method') || traceField(step.input, 'path')) {\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 }\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 @if(traceField(step.input, 'sql') && step.output !== undefined) {\n <section><span>MySQL MCP execution details</span><pre>{{ formatTraceValue(step.output) }}</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 if(hasOptionCardSuggestions(message.suggestions, message.status)) {\n <div class=\"clarification-options\" aria-label=\"Clarification options\">\n <div class=\"capability-option-grid clarification-option-grid\">\n @for(suggestion of optionCardSuggestions(message.suggestions, message.status); track suggestionLabel(suggestion); let optionIndex = $index) {\n <button\n pButton\n type=\"button\"\n severity=\"secondary\"\n class=\"capability-option-card clarification-option-card\"\n [disabled]=\"isSending()\"\n [attr.aria-label]=\"'Choose option: ' + suggestionLabel(suggestion)\"\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\">{{ suggestionLabel(suggestion) }}</span>\n <i class=\"pi pi-arrow-right capability-option-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n } @else if(hasEntitySuggestions(message.suggestions)) {\n <div class=\"entity-options\" aria-label=\"Matching options\">\n @for(suggestion of entitySuggestionOptions(message.suggestions); track suggestion.entity.id ?? suggestion.label) {\n <max-agent-entity-option\n [entity]=\"suggestion.entity\"\n [disabled]=\"isSending()\"\n (selected)=\"useSuggestion(suggestion)\"\n ></max-agent-entity-option>\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(supportTicketSubmissionFailed()) {\n <div class=\"support-ticket-error-page\" role=\"alert\">\n <span class=\"support-ticket-error-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-times-circle\"></i>\n </span>\n <h3>Ticket could not be created</h3>\n <p>{{ supportTicketError() }}</p>\n <button\n pButton\n type=\"button\"\n label=\"Close\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else 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 @if(result.ticketReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.ticketReference }}</strong>\n </div>\n }\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 support-ticket-field-wide\">\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]=\"supportSeverities()\"\n optionLabel=\"label\"\n [fluid]=\"true\"\n [loading]=\"supportSeverities().length === 0\"\n [(ngModel)]=\"supportTicketForm.severity\"\n >\n <ng-template #selectedItem let-severity>\n <p-tag\n class=\"support-severity-tag\"\n [value]=\"severity.label\"\n [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\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 [style.--support-severity-color]=\"supportSeverityColor(severity.color)\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-select>\n </label>\n\n <label class=\"support-ticket-field\">\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 dataKey=\"id\"\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.id) {\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>Subject</span>\n <input\n type=\"text\"\n name=\"supportSubject\"\n maxlength=\"200\"\n placeholder=\"Summarise the issue\"\n required\n [(ngModel)]=\"supportTicketForm.subject\"\n />\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/entity-option/max-agent-entity-option.component';\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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"}
|