max-agent-ui 0.0.37 → 0.0.38

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.
@@ -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(\n value: string | null | undefined,\n variant: 'default' | 'information' = 'default'\n ): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n\n const rendered = marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n\n return variant === 'information'\n ? rendered.replaceAll(\n '<li>',\n '<li><i class=\"fa-solid fa-arrow-right\" aria-hidden=\"true\"></i>'\n )\n : rendered;\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 const ASSISTANT_FEEDBACK_ENDPOINTS = {\n development: '/agent-api/v1/feedback',\n production: 'https://agent.maxtime.cloud/v1/feedback'\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\nexport function getDefaultAssistantFeedbackUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_FEEDBACK_ENDPOINTS.development\n : ASSISTANT_FEEDBACK_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 AssistantChatActivity,\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?: (activity: AssistantChatActivity) => 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?: (activity: AssistantChatActivity) => 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: (activity: AssistantChatActivity) => 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 === 'delta') {\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 datasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{\n label: visualisation.valueLabel || 'Value',\n values: visualisation.values,\n colors: visualisation.colors,\n }];\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 document.text(this.chartTypeLabel(visualisation.type), margin, cursorY);\n\n if (['doughnut', 'pie', 'polarArea'].includes(visualisation.type)) {\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 datasets.forEach((dataset, datasetIndex) => {\n if (datasets.length > 1) {\n if (cursorY + 12 > pageHeight - margin) {\n document.addPage();\n cursorY = margin;\n }\n document.setFont('helvetica', 'bold');\n document.setTextColor(31, 41, 55);\n document.text(dataset.label, margin, cursorY);\n document.setFont('helvetica', 'normal');\n cursorY += 7;\n }\n\n visualisation.labels.forEach((label, index) => {\n const value = Number(dataset.values[index]) || 0;\n const labelLines = document.splitTextToSize(label, contentWidth - 32) as string[];\n const rowHeight = Math.max(8, labelLines.length * 5 + 3);\n\n if (cursorY + rowHeight > pageHeight - margin) {\n document.addPage();\n cursorY = margin;\n }\n\n const colour = dataset.colors?.[index]\n ?? dataset.color\n ?? visualisation.colors?.[datasets.length === 1 ? index : datasetIndex]\n ?? this.fallbackColor(datasets.length === 1 ? index : datasetIndex);\n const [red, green, blue] = this.pdfColor(colour);\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 cursorY += rowHeight;\n });\n\n cursorY += datasets.length > 1 ? 3 : 0;\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 chartTypeLabel(type: AssistantVisualisation['type']): string {\n const labels: Record<AssistantVisualisation['type'], string> = {\n bar: 'Vertical bar chart',\n horizontalBar: 'Horizontal bar chart',\n stackedBar: 'Stacked bar chart',\n doughnut: 'Doughnut chart',\n pie: 'Pie chart',\n line: 'Line chart',\n lineStyles: 'Line styles chart',\n radar: 'Radar chart',\n polarArea: 'Polar area chart',\n barLine: 'Combined bar and line chart',\n };\n return labels[type];\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 { HttpClient, 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 { getDefaultAssistantFeedbackUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantFeedbackRequest,\n AssistantFeedbackResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantFeedbackService {\n readonly endpoint = getDefaultAssistantFeedbackUrl();\n readonly method = 'POST' as const;\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n submitFeedback(\n feedback: AssistantFeedbackRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantFeedbackResponse> {\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 return this.http.post<AssistantFeedbackResponse>(\n this.getFeedbackUrl(mergedConfig),\n feedback,\n { headers: this.getHeaders(mergedConfig) }\n );\n }\n\n private getFeedbackUrl(config: MaxAssistantConfig): string {\n const configuredChatUrl = config.assistantApiUrl?.trim();\n return configuredChatUrl\n ? configuredChatUrl.replace(/\\/chat\\/?$/, '/feedback')\n : getDefaultAssistantFeedbackUrl();\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 return headers;\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 { 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 { ChartModule } from 'primeng/chart';\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 AssistantChatActivity,\n AssistantChatProgress,\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 action: 'pi pi-bolt',\n analytics: 'pi pi-chart-bar',\n budget: 'pi pi-wallet',\n calendar: 'pi pi-calendar-plus',\n document: 'pi pi-file',\n knowledge: 'pi pi-book',\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 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 ChartModule,\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 private activeTurnAnchorMessageId?: string;\n\n private scrollToLatestTimer?: ReturnType<typeof setTimeout>;\n\n private readonly visualisationDataCache = new WeakMap<\n AssistantVisualisation,\n { labels: string[]; datasets: Array<Record<string, unknown>> }\n >();\n\n private readonly visualisationOptionsCache = new WeakMap<\n AssistantVisualisation,\n Record<string, unknown>\n >();\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.activeTurnAnchorMessageId = undefined;\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 initialProgress: AssistantChatProgress = {\n type: 'progress',\n stage: 'request',\n message: this.uiCopy.startingMessage,\n };\n const streamingMessage: AssistantMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true,\n processingUpdates: [initialProgress],\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 activity => this.updateStreamingMessage(streamingMessage.id, activity)\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(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.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 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 }, this.getAssistantConfig())\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 helpGuideLabel(kind: AssistantHelpGuide['kind']): string {\n switch (kind) {\n case 'knowledge':\n case 'information':\n return 'Maxtime Knowledge Guide';\n case 'analytics':\n return 'Maxtime Analytics';\n case 'action':\n return 'Maxtime Action';\n default:\n return 'Maxtime Help Guide';\n }\n }\n\n protected isContentGuide(kind: AssistantHelpGuide['kind']): boolean {\n return kind === 'knowledge'\n || kind === 'information'\n || kind === 'analytics'\n || kind === 'action';\n }\n\n protected helpGuideMarkdownVariant(\n kind: AssistantHelpGuide['kind']\n ): 'default' | 'information' {\n return this.isContentGuide(kind) ? 'information' : 'default';\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 const recordCount = pagination.totalRecordsExact === false\n ? pagination.pageSize\n : Math.min(pagination.pageSize, pagination.remainingRecords);\n return `Retrieve next ${recordCount.toLocaleString()} ${recordCount === 1 ? 'record' : '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 chartType(\n visualisation: AssistantVisualisation\n ): 'bar' | 'line' | 'doughnut' | 'pie' | 'radar' | 'polarArea' {\n switch (visualisation.type) {\n case 'doughnut':\n case 'pie':\n case 'polarArea':\n case 'radar':\n case 'line':\n case 'lineStyles':\n return visualisation.type === 'lineStyles' ? 'line' : visualisation.type;\n default:\n return 'bar';\n }\n }\n\n protected chartData(\n visualisation: AssistantVisualisation\n ): { labels: string[]; datasets: Array<Record<string, unknown>> } {\n const cached = this.visualisationDataCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const sourceDatasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{\n label: visualisation.valueLabel || 'Value',\n values: visualisation.values,\n colors: visualisation.colors,\n }];\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie' || chartType === 'polarArea';\n const data = {\n labels: visualisation.labels,\n datasets: sourceDatasets.map((dataset, index) => {\n const colour = dataset.color || this.chartColour(visualisation, index);\n const categoryColours = dataset.colors?.length\n ? dataset.colors\n : visualisation.colors?.length\n ? visualisation.colors\n : visualisation.labels.map((_label, labelIndex) =>\n this.chartColour(visualisation, labelIndex)\n );\n const datasetType = dataset.type || (\n visualisation.type === 'barLine'\n ? index === 0 ? 'bar' : 'line'\n : undefined\n );\n const isLineDataset = datasetType === 'line' || chartType === 'line' || chartType === 'radar';\n return {\n label: dataset.label,\n data: dataset.values.map(value => Number(value) || 0),\n ...(datasetType ? { type: datasetType } : {}),\n backgroundColor: isArcChart || (!isLineDataset && sourceDatasets.length === 1)\n ? categoryColours\n : this.colourWithOpacity(colour, isLineDataset ? 0.14 : 0.78),\n borderColor: isArcChart ? '#ffffff' : colour,\n borderWidth: isLineDataset ? 2 : isArcChart ? 2 : 1,\n borderRadius: isLineDataset || isArcChart ? 0 : 6,\n borderDash: dataset.borderDash || [],\n fill: dataset.fill ?? false,\n tension: isLineDataset ? 0.32 : 0,\n pointStyle: ['circle', 'rectRot', 'triangle', 'rectRounded'][index % 4],\n pointRadius: isLineDataset ? 3 : 0,\n pointHoverRadius: isLineDataset ? 5 : 0,\n ...(visualisation.type === 'stackedBar' ? { stack: 'combined' } : {}),\n };\n }),\n };\n this.visualisationDataCache.set(visualisation, data);\n return data;\n }\n\n protected chartOptions(visualisation: AssistantVisualisation): Record<string, unknown> {\n const cached = this.visualisationOptionsCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie';\n const isRadialChart = chartType === 'polarArea' || chartType === 'radar';\n const isHorizontal = visualisation.type === 'horizontalBar';\n const isStacked = visualisation.type === 'stackedBar';\n const axis = (title: string | undefined, stacked = false, beginAtZero = false) => ({\n stacked,\n beginAtZero,\n border: { display: false },\n grid: { color: '#e5e7eb', drawTicks: false },\n ticks: { color: '#64748b', padding: 8, font: { size: 10 } },\n title: {\n display: Boolean(title),\n text: title,\n color: '#475569',\n font: { size: 11, weight: 500 },\n },\n });\n const options: Record<string, unknown> = {\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500 },\n interaction: { intersect: false, mode: 'index' },\n plugins: {\n legend: {\n display: this.shouldShowChartLegend(visualisation),\n position: 'bottom',\n labels: {\n color: '#475569',\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n font: { size: 10 },\n },\n },\n tooltip: {\n enabled: true,\n padding: 10,\n usePointStyle: true,\n },\n },\n ...(isArcChart\n ? { cutout: chartType === 'doughnut' ? '58%' : 0 }\n : isRadialChart\n ? {\n scales: {\n r: {\n beginAtZero: true,\n grid: { color: '#e5e7eb' },\n angleLines: { color: '#e5e7eb' },\n ticks: { color: '#64748b', backdropColor: 'transparent', font: { size: 9 } },\n pointLabels: { color: '#475569', font: { size: 10 } },\n },\n },\n }\n : {\n indexAxis: isHorizontal ? 'y' : 'x',\n scales: {\n x: axis(\n isHorizontal ? visualisation.yAxisLabel : visualisation.xAxisLabel,\n isStacked,\n isHorizontal\n ),\n y: axis(\n isHorizontal ? visualisation.xAxisLabel : visualisation.yAxisLabel,\n isStacked,\n !isHorizontal\n ),\n },\n }),\n };\n this.visualisationOptionsCache.set(visualisation, options);\n return options;\n }\n\n protected chartHeight(visualisation: AssistantVisualisation): number {\n return visualisation.type === 'horizontalBar'\n ? Math.max(300, Math.min(620, visualisation.labels.length * 34 + 90))\n : 340;\n }\n\n private shouldShowChartLegend(visualisation: AssistantVisualisation): boolean {\n if (['doughnut', 'pie', 'polarArea'].includes(visualisation.type)) {\n return true;\n }\n\n return (visualisation.datasets?.length ?? 1) > 1;\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const datasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{ label: visualisation.valueLabel || 'Value', values: visualisation.values }];\n const values = datasets.flatMap(dataset =>\n visualisation.labels.map(\n (label, index) => `${dataset.label}, ${label}: ${Number(dataset.values[index]) || 0}`\n )\n );\n return `${visualisation.title} chart. ${values.join(', ')}.`;\n }\n\n private chartColour(visualisation: AssistantVisualisation, index: number): string {\n const fallback = [\n '#3B82F6', '#EC4899', '#10B981', '#F59E0B', '#8B5CF6', '#06B6D4',\n '#EF4444', '#84CC16', '#F97316', '#6366F1', '#14B8A6', '#D946EF',\n ];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n private colourWithOpacity(colour: string, opacity: number): string {\n const match = /^#([0-9a-f]{6})$/iu.exec(colour.trim());\n if (!match) {\n return colour;\n }\n const value = Number.parseInt(match[1]!, 16);\n return `rgba(${(value >> 16) & 255}, ${(value >> 8) & 255}, ${value & 255}, ${opacity})`;\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 if (message.role === 'user') {\n this.activeTurnAnchorMessageId = message.id;\n }\n this.messages.update(messages => [...messages, message]);\n if (this.activeTurnAnchorMessageId) {\n this.scrollToMessage(this.activeTurnAnchorMessageId);\n } else {\n this.scrollToLatest();\n }\n }\n\n private updateStreamingMessage(messageId: string, activity: AssistantChatActivity) {\n let messageUpdated = false;\n this.messages.update(messages =>\n messages.map(message => {\n if (message.id !== messageId || !message.isStreaming) {\n return message;\n }\n\n if (activity.type === 'delta') {\n if (!activity.delta) {\n return message;\n }\n messageUpdated = true;\n return {\n ...message,\n streamingContent: `${message.streamingContent ?? ''}${activity.delta}`,\n };\n }\n\n const progressMessage = activity.message.trim();\n if (!progressMessage) {\n return message;\n }\n const processingUpdates = message.processingUpdates ?? [];\n const latestUpdate = processingUpdates.at(-1);\n if (\n latestUpdate?.stage === activity.stage &&\n latestUpdate.message === progressMessage\n ) {\n return message;\n }\n\n messageUpdated = true;\n return {\n ...message,\n content: progressMessage,\n processingUpdates: [\n ...processingUpdates,\n { ...activity, message: progressMessage },\n ],\n };\n })\n );\n if (messageUpdated) {\n this.scrollToLatest();\n }\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 }\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(responseMessage?: AssistantMessage): FeedbackFormValue {\n const conversation = responseMessage\n ? this.getConversationPair(responseMessage)\n : { query: '', assistantResponse: '' };\n\n return {\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: this.typedHelpGuide(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 typedHelpGuide(\n guide: AssistantHelpGuide | undefined\n ): AssistantHelpGuide | undefined {\n return guide?.kind === 'analytics' || guide?.kind === 'action'\n ? undefined\n : guide;\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 if (this.scrollToLatestTimer) {\n clearTimeout(this.scrollToLatestTimer);\n }\n this.scrollToLatestTimer = setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n this.scrollToLatestTimer = undefined;\n });\n }\n\n private scrollToMessage(messageId: string) {\n setTimeout(() => {\n const viewport = this.messagesViewport?.nativeElement;\n const message = viewport?.querySelector<HTMLElement>(\n `[data-message-id=\"${messageId}\"]`\n );\n if (!viewport || !message) {\n return;\n }\n const viewportTop = viewport.getBoundingClientRect().top;\n const messageTop = message.getBoundingClientRect().top;\n const paddingTop = Number.parseFloat(getComputedStyle(viewport).paddingTop) || 0;\n viewport.scrollTop = Math.max(\n 0,\n viewport.scrollTop + messageTop - viewportTop - paddingTop\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 [attr.data-message-id]=\"message.id\"\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 <div class=\"assistant-processing\" aria-label=\"Max AI activity\">\n @for(update of message.processingUpdates; track $index) {\n <div\n class=\"assistant-processing-step\"\n [class.complete]=\"$index < (message.processingUpdates?.length || 0) - 1 || !!message.streamingContent\"\n [class.active]=\"$index === (message.processingUpdates?.length || 0) - 1 && !message.streamingContent\"\n >\n <span class=\"assistant-processing-indicator\" aria-hidden=\"true\">\n @if($index < (message.processingUpdates?.length || 0) - 1 || message.streamingContent) {\n <i class=\"pi pi-check\"></i>\n } @else {\n <i class=\"pi pi-spinner pi-spin\"></i>\n }\n </span>\n <span>{{ update.message }}</span>\n </div>\n }\n @if(message.streamingContent) {\n <div class=\"assistant-streaming-answer assistant-markdown\">\n <span class=\"assistant-streaming-answer-text\">{{ message.streamingContent }}</span>\n <span class=\"assistant-streaming-cursor\" aria-hidden=\"true\"></span>\n </div>\n }\n </div>\n } @else if(message.displayResponse; as responseDetails) {\n @if(responseDetails.helpGuide; as guide) {\n <section\n class=\"assistant-help-guide\"\n [class.assistant-information-guide]=\"isContentGuide(guide.kind)\"\n [class.assistant-continuation-guide]=\"guide.continuation\"\n [attr.aria-label]=\"helpGuideLabel(guide.kind)\"\n >\n @if(!guide.continuation) {\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\">\n {{ helpGuideLabel(guide.kind) }}\n </span>\n <h3>{{ guide.title }}</h3>\n </div>\n </header>\n }\n\n @if(guide.summary) {\n <p class=\"assistant-help-summary\">{{ guide.summary }}</p>\n }\n\n @if(guide.content) {\n <div\n class=\"assistant-help-content assistant-information-content assistant-markdown\"\n [innerHTML]=\"guide.content | maxAssistantMarkdown: helpGuideMarkdownVariant(guide.kind)\"\n ></div>\n }\n\n @if(guide.steps.length) {\n <section class=\"assistant-help-section assistant-help-steps\">\n <h4>Steps to follow</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 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 <div\n class=\"assistant-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n [style.height.px]=\"chartHeight(visualisation)\"\n >\n <p-chart\n class=\"assistant-prime-chart\"\n [type]=\"chartType(visualisation)\"\n [data]=\"chartData(visualisation)\"\n [options]=\"chartOptions(visualisation)\"\n ></p-chart>\n </div>\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>We value your feedback</h3>\n <p>{{ result.message }}</p>\n @if(result.feedbackReference; as feedbackReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ feedbackReference }}</strong>\n </div>\n }\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>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(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/components/assistant/assistant-conversation-state.ts","../../../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 { Subject } from 'rxjs';\nimport type { AssistantChatResponse, AssistantConversationMessage } from '../../models/assistant.models';\n\n/** Owned by one assistant component. Never persists, shares across tabs, or decodes signed state. */\nexport class AssistantConversationState {\n readonly resetRequests = new Subject<void>();\n token?: string;\n private identity?: string;\n\n reset(): void {\n this.resetRequests.next();\n this.token = undefined;\n }\n\n accept(response: AssistantChatResponse): void {\n this.token = response.conversationState?.length && response.conversationState.length <= 250_000\n ? response.conversationState : undefined;\n }\n\n changedIdentity(identity: string): boolean {\n const changed = this.identity !== undefined && this.identity !== identity;\n this.identity = identity;\n return changed;\n }\n\n history(messages: AssistantConversationMessage[], question = ''): AssistantConversationMessage[] {\n let candidates = messages.slice(-8);\n if (question && messages.length > 8) {\n const ignored = new Set(['show', 'tell', 'what', 'that', 'this', 'with', 'from', 'have', 'were', 'many', 'about', 'please']);\n const words = [...new Set(question.toLowerCase().match(/[\\p{L}\\p{N}]{4,}/gu) ?? [])].filter(word => !ignored.has(word));\n const older = messages.slice(0, -4).map((message, index) => ({ message, index,\n score: message.role === 'user' ? words.filter(word => message.content.toLowerCase().includes(word)).length : 0\n })).filter(item => item.score > 0).sort((a, b) => b.score - a.score || b.index - a.index).slice(0, 2).sort((a, b) => a.index - b.index);\n if (older.length) candidates = [...older.flatMap(item => messages.slice(item.index,\n messages[item.index + 1]?.role === 'assistant' ? item.index + 2 : item.index + 1)), ...messages.slice(-4)];\n }\n const encoder = new TextEncoder();\n let remaining = 8_000;\n return candidates.reverse().flatMap(message => {\n let content = '';\n let bytes = 0;\n for (const character of message.content) {\n const size = encoder.encode(character).length;\n if (bytes + size > Math.min(3_000, remaining)) break;\n content += character;\n bytes += size;\n }\n remaining -= bytes;\n return content ? [{ ...message, content }] : [];\n }).reverse();\n }\n}\n","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 /** Per-request transient state supplied by the assistant, never persisted by the host. */\n conversationStateVersion?: 1;\n conversationState?: string;\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(\n value: string | null | undefined,\n variant: 'default' | 'information' = 'default'\n ): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n\n const rendered = marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n\n return variant === 'information'\n ? rendered.replaceAll(\n '<li>',\n '<li><i class=\"fa-solid fa-arrow-right\" aria-hidden=\"true\"></i>'\n )\n : rendered;\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 const ASSISTANT_FEEDBACK_ENDPOINTS = {\n development: '/agent-api/v1/feedback',\n production: 'https://agent.maxtime.cloud/v1/feedback'\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\nexport function getDefaultAssistantFeedbackUrl(developmentMode = isDevMode()): string {\n return developmentMode\n ? ASSISTANT_FEEDBACK_ENDPOINTS.development\n : ASSISTANT_FEEDBACK_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 AssistantChatActivity,\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';\nconst STREAM_IDLE_TIMEOUT_MS = 45_000;\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?: (activity: AssistantChatActivity) => 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?: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n request = { ...request,\n ...(config.conversationStateVersion ? { conversationStateVersion: config.conversationStateVersion } : {}),\n ...(request.conversationId && config.conversationState ? { conversationState: config.conversationState } : {})\n };\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: (activity: AssistantChatActivity) => void\n ): Observable<AssistantChatResponse> {\n return new Observable(subscriber => {\n const controller = new AbortController();\n const streamError = (message: string, code: string) => new HttpErrorResponse({\n error: { message, code },\n status: code === 'request_timeout' ? 504 : 502,\n url: this.getChatUrl(config)\n });\n let idleTimer: ReturnType<typeof setTimeout>;\n const resetIdleTimer = () => {\n clearTimeout(idleTimer);\n idleTimer = setTimeout(() => {\n subscriber.error(streamError(\n 'This request is taking longer than expected. Please try again.',\n 'request_timeout'\n ));\n controller.abort();\n }, STREAM_IDLE_TIMEOUT_MS);\n };\n resetIdleTimer();\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 if (subscriber.closed) return;\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 === 'delta' || event.type === 'data') {\n onProgress(event);\n return;\n }\n if (event.type === 'error') {\n throw streamError(event.message, event.code ?? 'request_failed');\n }\n\n if (event.type === 'result') {\n receivedResult = true;\n subscriber.next(event.response);\n subscriber.complete();\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n resetIdleTimer();\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n lines.forEach(processLine);\n if (receivedResult || subscriber.closed) {\n return;\n }\n }\n\n buffer += decoder.decode();\n processLine(buffer);\n\n if (!receivedResult) {\n throw streamError(\n 'The connection was interrupted before the answer was ready. Please try again.',\n 'stream_interrupted'\n );\n }\n\n subscriber.complete();\n }).catch(error => {\n if (!subscriber.closed) {\n subscriber.error(error?.name === 'AbortError'\n ? streamError(\n 'The connection was interrupted before the answer was ready. Please try again.',\n 'stream_interrupted'\n )\n : error);\n }\n });\n\n return () => {\n clearTimeout(idleTimer);\n controller.abort();\n };\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(\n visualisation: AssistantVisualisation,\n visualisationElement: HTMLElement\n ): Promise<void> {\n const canvas = visualisationElement.querySelector('canvas');\n if (!canvas || !canvas.width || !canvas.height) {\n throw new Error('The rendered chart is not available for export.');\n }\n\n const { jsPDF } = await import('jspdf');\n const orientation = canvas.width > canvas.height ? 'landscape' : 'portrait';\n const document = new jsPDF({ format: 'a4', orientation, 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 chartTop = 30;\n const availableHeight = pageHeight - chartTop - margin;\n const scale = Math.min(contentWidth / canvas.width, availableHeight / canvas.height);\n const imageWidth = canvas.width * scale;\n const imageHeight = canvas.height * scale;\n const imageX = (pageWidth - imageWidth) / 2;\n const { Chart } = await import('chart.js');\n const chart = Chart.getChart(canvas);\n let chartImage: string;\n\n if (chart) {\n const originalPixelRatio = chart.options.devicePixelRatio;\n // Render fresh chart pixels at 300 DPI; enlarging the screen bitmap blurs labels.\n const printPixelRatio = Math.ceil((imageWidth / 25.4 * 300) / chart.width);\n try {\n chart.options.devicePixelRatio = Math.max(originalPixelRatio ?? 1, printPixelRatio);\n chart.resize();\n chart.update('none');\n chartImage = canvas.toDataURL('image/png', 1);\n } finally {\n chart.options.devicePixelRatio = originalPixelRatio;\n chart.resize();\n chart.update('none');\n }\n } else {\n chartImage = canvas.toDataURL('image/png', 1);\n }\n\n document.setFont('helvetica', 'bold');\n document.setFontSize(16);\n document.text(visualisation.title, margin, 20, { maxWidth: contentWidth });\n document.addImage(\n chartImage,\n 'PNG',\n imageX,\n chartTop,\n imageWidth,\n imageHeight,\n undefined,\n 'FAST'\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 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 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 { HttpClient, 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 { getDefaultAssistantFeedbackUrl } from '../../config/assistant-endpoint.config';\nimport {\n AssistantFeedbackRequest,\n AssistantFeedbackResponse,\n AssistantUser\n} from '../../models/assistant.models';\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantFeedbackService {\n readonly endpoint = getDefaultAssistantFeedbackUrl();\n readonly method = 'POST' as const;\n\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n submitFeedback(\n feedback: AssistantFeedbackRequest,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantFeedbackResponse> {\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 return this.http.post<AssistantFeedbackResponse>(\n this.getFeedbackUrl(mergedConfig),\n feedback,\n { headers: this.getHeaders(mergedConfig) }\n );\n }\n\n private getFeedbackUrl(config: MaxAssistantConfig): string {\n const configuredChatUrl = config.assistantApiUrl?.trim();\n return configuredChatUrl\n ? configuredChatUrl.replace(/\\/chat\\/?$/, '/feedback')\n : getDefaultAssistantFeedbackUrl();\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 return headers;\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 { 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 DoCheck,\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 { ChartModule } from 'primeng/chart';\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, takeUntil } from 'rxjs';\nimport { AssistantConversationState } from './assistant-conversation-state';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig,\n} from '../../config/assistant-bootstrap.config';\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatActivity,\n AssistantChatProgress,\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: 'Preparing your answer…',\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 action: 'pi pi-bolt',\n analytics: 'pi pi-chart-bar',\n budget: 'pi pi-wallet',\n calendar: 'pi pi-calendar-plus',\n document: 'pi pi-file',\n knowledge: 'pi pi-book',\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 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 ChartModule,\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, DoCheck {\n private readonly sessionState = new AssistantConversationState();\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n private activeTurnAnchorMessageId?: string;\n\n private scrollToLatestTimer?: ReturnType<typeof setTimeout>;\n\n private readonly visualisationDataCache = new WeakMap<\n AssistantVisualisation,\n { labels: string[]; datasets: Array<Record<string, unknown>> }\n >();\n\n private readonly visualisationOptionsCache = new WeakMap<\n AssistantVisualisation,\n Record<string, unknown>\n >();\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 this.destroyRef.onDestroy(() => {\n this.sessionState.reset();\n this.sessionState.resetRequests.complete();\n clearTimeout(this.scrollToLatestTimer);\n });\n }\n\n ngDoCheck(): void {\n const configuredUser = typeof this.defaultConfig.user === 'function' ? this.defaultConfig.user() : this.defaultConfig.user;\n const localUser = typeof this.user === 'function' ? this.user() : this.user;\n const user = { ...configuredUser, ...localUser };\n const contextSource = this.context ?? this.defaultConfig.context;\n const context = typeof contextSource === 'function' ? contextSource() : contextSource;\n if (this.sessionState.changedIdentity(JSON.stringify([this.app ?? this.defaultConfig.app,\n user.token, user.version, user.username, user.email, context?.tenantId, context?.organisationId, context?.userId]))) {\n this.clearChatSession();\n }\n }\n\n resetSession(): void { this.clearChatSession(); }\n\n // Also clears memory if the browser keeps this document in its back/forward cache.\n @HostListener('window:pagehide')\n protected onPageHide(): void { this.clearChatSession(); }\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.sessionState.reset();\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.activeTurnAnchorMessageId = undefined;\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(trimmedMessage);\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n const initialProgress: AssistantChatProgress = {\n type: 'progress',\n stage: 'request',\n message: this.uiCopy.startingMessage,\n };\n const streamingMessage: AssistantMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true,\n processingUpdates: [initialProgress],\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 activity => this.updateStreamingMessage(streamingMessage.id, activity)\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(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 const preview = this.messages().find(message => message.id === streamingMessage.id);\n if (preview?.displayResponse || preview?.cards?.length) {\n this.replaceMessage(streamingMessage.id, {\n ...preview,\n content: 'The data was retrieved, but the explanation could not be completed.',\n streamingContent: undefined,\n });\n this.isSending.set(false);\n return;\n }\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(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(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(takeUntil(this.sessionState.resetRequests), 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(takeUntil(this.sessionState.resetRequests), 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(false))\n .pipe(takeUntil(this.sessionState.resetRequests), 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(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.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 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 }, this.getAssistantConfig(false))\n .pipe(takeUntil(this.sessionState.resetRequests), 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 helpGuideLabel(kind: AssistantHelpGuide['kind']): string {\n switch (kind) {\n case 'knowledge':\n case 'information':\n return 'Maxtime Knowledge Guide';\n case 'analytics':\n return 'Maxtime Analytics';\n case 'action':\n return 'Maxtime Action';\n default:\n return 'Maxtime Help Guide';\n }\n }\n\n protected isContentGuide(kind: AssistantHelpGuide['kind']): boolean {\n return kind === 'knowledge'\n || kind === 'information'\n || kind === 'analytics'\n || kind === 'action';\n }\n\n protected helpGuideMarkdownVariant(\n kind: AssistantHelpGuide['kind']\n ): 'default' | 'information' {\n return this.isContentGuide(kind) ? 'information' : 'default';\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 takeUntil(this.sessionState.resetRequests),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: response => {\n this.sessionState.accept(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(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.sessionState.accept(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: 100 },\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntil(this.sessionState.resetRequests), takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n // Paging an older table must not replace the active conversational topic.\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 const recordCount = pagination.totalRecordsExact === false\n ? pagination.pageSize\n : Math.min(pagination.pageSize, pagination.remainingRecords);\n return `Retrieve next ${recordCount.toLocaleString()} ${recordCount === 1 ? 'record' : '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(\n visualisation: AssistantVisualisation,\n visualisationElement: HTMLElement\n ): void {\n void this.exportService.exportVisualisationToPdf(visualisation, visualisationElement);\n }\n\n protected chartType(\n visualisation: AssistantVisualisation\n ): 'bar' | 'line' | 'doughnut' | 'pie' | 'radar' | 'polarArea' {\n switch (visualisation.type) {\n case 'doughnut':\n case 'pie':\n case 'polarArea':\n case 'radar':\n case 'line':\n case 'lineStyles':\n return visualisation.type === 'lineStyles' ? 'line' : visualisation.type;\n default:\n return 'bar';\n }\n }\n\n protected chartData(\n visualisation: AssistantVisualisation\n ): { labels: string[]; datasets: Array<Record<string, unknown>> } {\n const cached = this.visualisationDataCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const sourceDatasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{\n label: visualisation.valueLabel || 'Value',\n values: visualisation.values,\n colors: visualisation.colors,\n }];\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie' || chartType === 'polarArea';\n const data = {\n labels: visualisation.labels,\n datasets: sourceDatasets.map((dataset, index) => {\n const colour = dataset.color || this.chartColour(visualisation, index);\n const categoryColours = dataset.colors?.length\n ? dataset.colors\n : visualisation.colors?.length\n ? visualisation.colors\n : visualisation.labels.map((_label, labelIndex) =>\n this.chartColour(visualisation, labelIndex)\n );\n const datasetType = dataset.type || (\n visualisation.type === 'barLine'\n ? index === 0 ? 'bar' : 'line'\n : undefined\n );\n const isLineDataset = datasetType === 'line' || chartType === 'line' || chartType === 'radar';\n return {\n label: dataset.label,\n data: dataset.values.map(value => Number(value) || 0),\n ...(datasetType ? { type: datasetType } : {}),\n backgroundColor: isArcChart || (!isLineDataset && sourceDatasets.length === 1)\n ? categoryColours\n : this.colourWithOpacity(colour, isLineDataset ? 0.14 : 0.78),\n borderColor: isArcChart ? '#ffffff' : colour,\n borderWidth: isLineDataset ? 2 : isArcChart ? 2 : 1,\n borderRadius: isLineDataset || isArcChart ? 0 : 6,\n borderDash: dataset.borderDash || [],\n fill: dataset.fill ?? false,\n tension: isLineDataset ? 0.32 : 0,\n pointStyle: ['circle', 'rectRot', 'triangle', 'rectRounded'][index % 4],\n pointRadius: isLineDataset ? 3 : 0,\n pointHoverRadius: isLineDataset ? 5 : 0,\n ...(visualisation.type === 'stackedBar' ? { stack: 'combined' } : {}),\n };\n }),\n };\n this.visualisationDataCache.set(visualisation, data);\n return data;\n }\n\n protected chartOptions(visualisation: AssistantVisualisation): Record<string, unknown> {\n const cached = this.visualisationOptionsCache.get(visualisation);\n if (cached) {\n return cached;\n }\n\n const chartType = this.chartType(visualisation);\n const isArcChart = chartType === 'doughnut' || chartType === 'pie';\n const isRadialChart = chartType === 'polarArea' || chartType === 'radar';\n const isHorizontal = visualisation.type === 'horizontalBar';\n const isStacked = visualisation.type === 'stackedBar';\n const axis = (title: string | undefined, stacked = false, beginAtZero = false) => ({\n stacked,\n beginAtZero,\n border: { display: false },\n grid: { color: '#e5e7eb', drawTicks: false },\n ticks: { color: '#64748b', padding: 8, font: { size: 10 } },\n title: {\n display: Boolean(title),\n text: title,\n color: '#475569',\n font: { size: 11, weight: 500 },\n },\n });\n const options: Record<string, unknown> = {\n responsive: true,\n maintainAspectRatio: false,\n animation: { duration: 500 },\n interaction: { intersect: false, mode: 'index' },\n plugins: {\n legend: {\n display: this.shouldShowChartLegend(visualisation),\n position: 'bottom',\n labels: {\n color: '#475569',\n usePointStyle: true,\n boxWidth: 8,\n boxHeight: 8,\n padding: 16,\n font: { size: 10 },\n },\n },\n tooltip: {\n enabled: true,\n padding: 10,\n usePointStyle: true,\n },\n },\n ...(isArcChart\n ? { cutout: chartType === 'doughnut' ? '58%' : 0 }\n : isRadialChart\n ? {\n scales: {\n r: {\n beginAtZero: true,\n grid: { color: '#e5e7eb' },\n angleLines: { color: '#e5e7eb' },\n ticks: { color: '#64748b', backdropColor: 'transparent', font: { size: 9 } },\n pointLabels: { color: '#475569', font: { size: 10 } },\n },\n },\n }\n : {\n indexAxis: isHorizontal ? 'y' : 'x',\n scales: {\n x: axis(\n isHorizontal ? visualisation.yAxisLabel : visualisation.xAxisLabel,\n isStacked,\n isHorizontal\n ),\n y: axis(\n isHorizontal ? visualisation.xAxisLabel : visualisation.yAxisLabel,\n isStacked,\n !isHorizontal\n ),\n },\n }),\n };\n this.visualisationOptionsCache.set(visualisation, options);\n return options;\n }\n\n protected chartHeight(visualisation: AssistantVisualisation): number {\n return visualisation.type === 'horizontalBar'\n ? Math.max(300, Math.min(620, visualisation.labels.length * 34 + 90))\n : 340;\n }\n\n private shouldShowChartLegend(visualisation: AssistantVisualisation): boolean {\n if (['doughnut', 'pie', 'polarArea'].includes(visualisation.type)) {\n return true;\n }\n\n return (visualisation.datasets?.length ?? 1) > 1;\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const datasets = visualisation.datasets?.length\n ? visualisation.datasets\n : [{ label: visualisation.valueLabel || 'Value', values: visualisation.values }];\n const values = datasets.flatMap(dataset =>\n visualisation.labels.map(\n (label, index) => `${dataset.label}, ${label}: ${Number(dataset.values[index]) || 0}`\n )\n );\n return `${visualisation.title} chart. ${values.join(', ')}.`;\n }\n\n private chartColour(visualisation: AssistantVisualisation, index: number): string {\n const fallback = [\n '#3B82F6', '#EC4899', '#10B981', '#F59E0B', '#8B5CF6', '#06B6D4',\n '#EF4444', '#84CC16', '#F97316', '#6366F1', '#14B8A6', '#D946EF',\n ];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n private colourWithOpacity(colour: string, opacity: number): string {\n const match = /^#([0-9a-f]{6})$/iu.exec(colour.trim());\n if (!match) {\n return colour;\n }\n const value = Number.parseInt(match[1]!, 16);\n return `rgba(${(value >> 16) & 255}, ${(value >> 8) & 255}, ${value & 255}, ${opacity})`;\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(includeConversation = true): MaxAssistantConfig {\n const config: MaxAssistantConfig = includeConversation\n ? { conversationStateVersion: 1, ...(this.sessionState.token ? { conversationState: this.sessionState.token } : {}) }\n : {};\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 if (message.role === 'user') {\n this.activeTurnAnchorMessageId = message.id;\n }\n this.messages.update(messages => [...messages, message]);\n if (this.activeTurnAnchorMessageId) {\n this.scrollToMessage(this.activeTurnAnchorMessageId);\n } else {\n this.scrollToLatest();\n }\n }\n\n private updateStreamingMessage(messageId: string, activity: AssistantChatActivity) {\n let messageUpdated = false;\n this.messages.update(messages =>\n messages.map(message => {\n if (message.id !== messageId || !message.isStreaming) {\n return message;\n }\n\n if (activity.type === 'delta') {\n if (!activity.delta) {\n return message;\n }\n messageUpdated = true;\n return {\n ...message,\n streamingContent: `${message.streamingContent ?? ''}${activity.delta}`,\n ...(message.displayResponse || message.cards?.length\n ? { content: `${message.streamingContent ?? ''}${activity.delta}` }\n : {}),\n };\n }\n\n if (activity.type === 'data') {\n messageUpdated = true;\n return {\n ...message,\n ...activity.data,\n displayResponse: activity.data.displayResponse ?? {},\n content: message.streamingContent ?? '',\n processingUpdates: [],\n };\n }\n\n if (message.displayResponse || message.cards?.length) {\n return message;\n }\n\n const progressMessage = activity.message.trim();\n if (!progressMessage) {\n return message;\n }\n const processingUpdates = message.processingUpdates ?? [];\n const latestUpdate = processingUpdates.at(-1);\n if (\n latestUpdate?.stage === activity.stage &&\n latestUpdate.message === progressMessage\n ) {\n return message;\n }\n\n messageUpdated = true;\n return {\n ...message,\n content: progressMessage,\n processingUpdates: [\n { ...activity, message: progressMessage },\n ],\n };\n })\n );\n if (messageUpdated) {\n this.scrollToLatest();\n }\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 }\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(responseMessage?: AssistantMessage): FeedbackFormValue {\n const conversation = responseMessage\n ? this.getConversationPair(responseMessage)\n : { query: '', assistantResponse: '' };\n\n return {\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: this.typedHelpGuide(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 typedHelpGuide(\n guide: AssistantHelpGuide | undefined\n ): AssistantHelpGuide | undefined {\n return guide?.kind === 'analytics' || guide?.kind === 'action'\n ? undefined\n : guide;\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(question = ''): 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 this.sessionState.history(messages\n .slice(firstUserIndex)\n .filter(message => !message.isError && !message.isStreaming)\n .map(message => ({\n role: message.role,\n content: message.content,\n ...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})\n })), question);\n }\n\n private scrollToLatest() {\n if (this.scrollToLatestTimer) {\n clearTimeout(this.scrollToLatestTimer);\n }\n this.scrollToLatestTimer = setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n this.scrollToLatestTimer = undefined;\n });\n }\n\n private scrollToMessage(messageId: string) {\n setTimeout(() => {\n const viewport = this.messagesViewport?.nativeElement;\n const message = viewport?.querySelector<HTMLElement>(\n `[data-message-id=\"${messageId}\"]`\n );\n if (!viewport || !message) {\n return;\n }\n const viewportTop = viewport.getBoundingClientRect().top;\n const messageTop = message.getBoundingClientRect().top;\n const paddingTop = Number.parseFloat(getComputedStyle(viewport).paddingTop) || 0;\n viewport.scrollTop = Math.max(\n 0,\n viewport.scrollTop + messageTop - viewportTop - paddingTop\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 [attr.data-message-id]=\"message.id\"\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 && !message.displayResponse && !message.cards?.length) {\n <div class=\"assistant-processing\" aria-label=\"Max AI activity\">\n @if(!message.streamingContent) {\n <p class=\"assistant-processing-update active\">\n <span class=\"assistant-processing-sparkles\" aria-hidden=\"true\">\n @for (star of ['main', 'upper', 'lower', 'small']; track star) {\n <img\n class=\"assistant-processing-star {{ star }}\"\n src=\"assets/max/max-assistant-sparkles-styled-gradient.png\"\n alt=\"\"\n >\n }\n </span>\n <span>{{ message.content }}</span>\n </p>\n }\n @if(message.streamingContent) {\n <div class=\"assistant-streaming-answer assistant-markdown\">\n <span class=\"assistant-streaming-answer-text\">{{ message.streamingContent }}</span>\n <span class=\"assistant-streaming-cursor\" aria-hidden=\"true\"></span>\n </div>\n }\n </div>\n } @else if(message.displayResponse; as responseDetails) {\n @if(responseDetails.helpGuide; as guide) {\n <section\n class=\"assistant-help-guide\"\n [class.assistant-information-guide]=\"isContentGuide(guide.kind)\"\n [class.assistant-continuation-guide]=\"guide.continuation\"\n [attr.aria-label]=\"helpGuideLabel(guide.kind)\"\n >\n @if(!guide.continuation) {\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\">\n {{ helpGuideLabel(guide.kind) }}\n </span>\n <h3>{{ guide.title }}</h3>\n </div>\n </header>\n }\n\n @if(guide.summary) {\n <p class=\"assistant-help-summary\">{{ guide.summary }}</p>\n }\n\n @if(guide.content) {\n <div\n class=\"assistant-help-content assistant-information-content assistant-markdown\"\n [innerHTML]=\"guide.content | maxAssistantMarkdown: helpGuideMarkdownVariant(guide.kind)\"\n ></div>\n }\n\n @if(guide.steps.length) {\n <section class=\"assistant-help-section assistant-help-steps\">\n <h4>Steps to follow</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 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, chartCanvas)\"\n ></button>\n </header>\n <div\n #chartCanvas\n class=\"assistant-chart-canvas\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n [style.height.px]=\"chartHeight(visualisation)\"\n >\n <p-chart\n class=\"assistant-prime-chart\"\n [type]=\"chartType(visualisation)\"\n [data]=\"chartData(visualisation)\"\n [options]=\"chartOptions(visualisation)\"\n ></p-chart>\n </div>\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>We value your feedback</h3>\n <p>{{ result.message }}</p>\n @if(result.feedbackReference; as feedbackReference) {\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ feedbackReference }}</strong>\n </div>\n }\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>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(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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"}