max-agent-ui 0.0.17 → 0.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/max-agent-ui.mjs +227 -17
- package/fesm2022/max-agent-ui.mjs.map +1 -1
- package/index.d.ts +94 -5
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-markdown.pipe.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.html","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialDescription?: string;\n initialSuggestions: string[];\n}\nconst INITIAL_MESSAGE = 'Hi! 👋';\nconst INITIAL_DESCRIPTION =\n \"I'm here to help. Whether you need information, want to complete a task, or just have a question, let me know and we'll get started.\\n\\nI'm still in my early days and learning every day. If I can't do something just yet, I hope you'll bear with me—I'll always do my best to help.\\n\\nWhat would you like to do today?\";\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n nemesys: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n attendance: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport {\n AssistantProduct,\n AssistantRequestContext,\n AssistantUser\n} from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n context?: Partial<AssistantRequestContext> | (() => Partial<AssistantRequestContext>);\n requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { marked } from 'marked';\n\n@Pipe({\n name: 'maxAssistantMarkdown',\n standalone: true,\n pure: true\n})\nexport class MaxAssistantMarkdownPipe implements PipeTransform {\n transform(value: string | null | undefined): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n\n return marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { AssistantShiftCard } from '../../models/assistant.models';\n\nexport type MaxAgentShiftCardVariant = 'definition' | 'rota';\n\n@Component({\n selector: 'max-agent-shift-card',\n templateUrl: './max-agent-shift-card.component.html',\n styleUrl: './max-agent-shift-card.component.scss'\n})\nexport class MaxAgentShiftCardComponent {\n @Input({ required: true }) shift!: AssistantShiftCard;\n @Input() variant: MaxAgentShiftCardVariant = 'rota';\n\n protected get accentColor(): string {\n const color = this.shift.color?.trim();\n if (!color) {\n return '#64748b';\n }\n return /^(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color)\n ? `#${color}`\n : color;\n }\n\n protected get timeLabel(): string {\n const formatter = this.variant === 'rota'\n ? this.formatTimeToAmPm\n : this.formatTime;\n const start = formatter(this.shift.startTime);\n const end = formatter(this.shift.endTime);\n return start && end ? `${start} - ${end}` : start || end || 'All day';\n }\n\n protected get departmentLabel(): string {\n const count = this.shift.departments?.length ?? 0;\n return count\n ? `${count} department${count === 1 ? '' : 's'}`\n : 'All departments';\n }\n\n protected get taskLabel(): string {\n const count = this.shift.taskCount ?? 0;\n return `${count} task${count === 1 ? '' : 's'}`;\n }\n\n private formatTime(value: string): string {\n return value.match(/^\\d{2}:\\d{2}/)?.[0] ?? value;\n }\n\n private formatTimeToAmPm(value: string): string {\n const match = value.match(/^(\\d{1,2}):(\\d{2})/);\n if (!match) {\n return value;\n }\n const hour = Number(match[1]);\n const displayHour = ((hour + 11) % 12) + 1;\n return `${displayHour}.${match[2]} ${hour >= 12 ? 'PM' : 'AM'}`;\n }\n}\n","<article\n class=\"max-agent-shift-card\"\n [class.definition-card]=\"variant === 'definition'\"\n [class.rota-card]=\"variant === 'rota'\"\n [style.--max-agent-shift-accent]=\"accentColor\"\n [attr.aria-label]=\"(shift.description || shift.code || 'Shift') + ', ' + timeLabel\"\n>\n <header>\n <strong>{{ timeLabel }}</strong>\n @if(variant === 'definition' && shift.days) {\n <span>{{ shift.days }}</span>\n }\n </header>\n\n @if(variant === 'definition') {\n @if(shift.code) {\n <p><i class=\"pi pi-tag\" aria-hidden=\"true\"></i><span>{{ shift.code }}</span></p>\n }\n @if(shift.description) {\n <p><i class=\"pi pi-align-left\" aria-hidden=\"true\"></i><span>{{ shift.description }}</span></p>\n }\n <p><i class=\"pi pi-building\" aria-hidden=\"true\"></i><span>{{ departmentLabel }}</span></p>\n @if((shift.taskCount ?? 0) > 0) {\n <p><i class=\"pi pi-check-square\" aria-hidden=\"true\"></i><span>{{ taskLabel }}</span></p>\n }\n } @else {\n @if(shift.location) {\n <p><i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i><span>{{ shift.location }}</span></p>\n }\n @if(shift.role) {\n <p><i class=\"pi pi-user\" aria-hidden=\"true\"></i><span>{{ shift.role }}</span></p>\n }\n }\n</article>\n","import { 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 {\n AssistantChatRequest,\n AssistantChatProgress,\n AssistantChatResponse,\n AssistantChatStreamEvent,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantStructuredAction,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_ASSISTANT_CHAT_URL = '/agent-api/v1/chat';\nconst DEFAULT_APP = 'cortex';\nconst DEFAULT_TIMEZONE = 'UTC';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n confirmation?: AssistantConfirmation,\n history: AssistantConversationMessage[] = [],\n onProgress?: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n ...(onProgress ? { stream: true } : {}),\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n context: this.getContext(assistantConfig),\n ...(confirmation ? { confirmation } : {})\n };\n\n return this.postMessage(request, assistantConfig, onProgress);\n }\n\n confirmAction(\n actionId: number,\n decision: AssistantConfirmation['decision'],\n conversationId: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n return this.sendMessage(\n decision === 'approve' ? 'Approve action' : 'Reject action',\n conversationId,\n config,\n { actionId, decision },\n history\n );\n }\n\n sendStructuredAction(\n message: string,\n action: AssistantStructuredAction,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n context: this.getContext(assistantConfig),\n structuredAction: action\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress?: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n if (onProgress) {\n return this.streamMessage(request, config, onProgress);\n }\n\n return this.http.post<AssistantChatResponse>(\n this.getChatUrl(config),\n request,\n { headers: this.getHeaders(config) }\n );\n }\n\n private streamMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n return new Observable(subscriber => {\n const controller = new AbortController();\n const headers = this.getHeaders(config);\n const fetchHeaders = Object.fromEntries(\n headers.keys().map(name => [name, headers.get(name) ?? ''])\n );\n\n void fetch(this.getChatUrl(config), {\n method: 'POST',\n headers: fetchHeaders,\n body: JSON.stringify(request),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const error = await response.json().catch(() => undefined);\n throw new HttpErrorResponse({\n error,\n status: response.status,\n statusText: response.statusText,\n url: response.url\n });\n }\n\n if (!response.body) {\n throw new Error('The assistant response stream was unavailable.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let receivedResult = false;\n\n const processLine = (line: string) => {\n const trimmedLine = line.trim();\n if (!trimmedLine) {\n return;\n }\n\n const event = JSON.parse(trimmedLine) as AssistantChatStreamEvent;\n if (event.type === 'progress') {\n onProgress(event);\n return;\n }\n if (event.type === 'error') {\n throw new Error(event.message);\n }\n\n receivedResult = true;\n subscriber.next(event.response);\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n lines.forEach(processLine);\n }\n\n buffer += decoder.decode();\n processLine(buffer);\n\n if (!receivedResult) {\n throw new Error('The assistant response stream ended before a result was returned.');\n }\n\n subscriber.complete();\n }).catch(error => {\n if (!subscriber.closed && error?.name !== 'AbortError') {\n subscriber.error(error);\n }\n });\n\n return () => controller.abort();\n });\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || DEFAULT_ASSISTANT_CHAT_URL;\n }\n\n private getApp(config: MaxAssistantConfig): AssistantProduct {\n return config.app || DEFAULT_APP;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n if (typeof config.user === 'function') {\n return config.user();\n }\n\n return config.user ?? {};\n }\n\n private getContext(config: MaxAssistantConfig): AssistantRequestContext {\n const configured = typeof config.context === 'function'\n ? config.context()\n : config.context ?? {};\n\n return {\n permissions: configured.permissions ?? [],\n timezone: configured.timezone\n ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n ?? DEFAULT_TIMEZONE,\n ...(configured.tenantId ? { tenantId: configured.tenantId } : {}),\n ...(configured.organisationId\n ? { organisationId: configured.organisationId }\n : {}),\n ...(configured.userId ? { userId: configured.userId } : {}),\n ...(configured.role ? { role: configured.role } : {}),\n ...(configured.route ? { route: configured.route } : {}),\n ...(configured.module ? { module: configured.module } : {})\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n\n if (trimmedName && trimmedValue) {\n headers = headers.set(trimmedName, trimmedValue);\n }\n }\n\n if (user.token) {\n headers = headers.set('x-cortex-auth-token', String(user.token));\n }\n\n if (user.version) {\n headers = headers.set('x-cortex-version', String(user.version));\n }\n\n return headers;\n }\n\n private compactConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n return Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined)\n ) as MaxAssistantConfig;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n Inject,\n Input,\n isDevMode,\n OnInit,\n signal,\n ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { of, switchMap } from 'rxjs';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig\n} from '../../config/assistant-bootstrap.config';\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatResponse,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantDeveloperTrace,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantSuggestion,\n AssistantTraceStep,\n AssistantUser,\n AssistantVisualisation\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\nimport { MaxAssistantMarkdownPipe } from './max-assistant-markdown.pipe';\nimport { MaxAgentShiftCardComponent } from '../shift-card/max-agent-shift-card.component';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max',\n subtitle: 'Your Personal AI Assistant',\n clearLabel: 'Start a new session',\n clearTooltip: 'Start a new session',\n placeholder: 'Ask Max',\n startingMessage: 'Understanding your request…',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\n};\n\n@Component({\n selector: 'max-assistant',\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n TextareaModule,\n TooltipModule,\n MaxAssistantMarkdownPipe,\n MaxAgentShiftCardComponent\n ],\n templateUrl: './max-assistant.component.html',\n styleUrls: [\n './max-assistant.component.scss',\n './max-assistant.workspace.scss'\n ]\n})\nexport class MaxAssistantComponent implements OnInit {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n @Input() app?: AssistantProduct;\n @Input() assistantApiUrl?: string;\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n\n protected readonly isSending = signal(false);\n protected readonly input = signal('');\n protected readonly conversationId = signal<string | undefined>(undefined);\n protected readonly messages = signal<AssistantMessage[]>([]);\n protected readonly expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly developerDetailsEnabled = isDevMode();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\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 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.expandedDetailMessageIds().size) {\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n }\n }\n\n protected clearChatSession() {\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n this.messages.set(this.createDefaultMessages());\n this.scrollToLatest();\n }\n\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\n if (!trimmedMessage || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n const streamingMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true\n };\n this.appendMessage(streamingMessage);\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(\n trimmedMessage,\n this.conversationId(),\n this.getAssistantConfig(),\n undefined,\n history,\n progress => this.updateStreamingMessage(streamingMessage.id, progress.message)\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.replaceMessage(\n streamingMessage.id,\n this.createAssistantResponseMessage(response, trimmedMessage)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.replaceMessage(streamingMessage.id, {\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected suggestionLabel(suggestion: AssistantSuggestion): string {\n return typeof suggestion === 'string' ? suggestion : suggestion.label;\n }\n\n protected 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 getTableRowActions(\n table: AssistantResponseTable,\n rowIndex: number\n ): AssistantResponseTableAction[] {\n return table.actions?.filter(action => action.rowIndex === rowIndex) ?? [];\n }\n\n protected useTableAction(action: AssistantResponseTableAction) {\n const label = action.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n action.message,\n action.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(\n switchMap(response => {\n if (!action.confirmOnClick || !response.pendingAction) {\n return of(response);\n }\n return this.assistantService.confirmAction(\n response.pendingAction.id,\n 'approve',\n response.conversationId,\n this.getAssistantConfig(),\n history\n );\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, action.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected resolvePendingAction(\n message: AssistantMessage,\n decision: AssistantConfirmation['decision']\n ) {\n const pendingAction = message.pendingAction;\n const currentConversationId = this.conversationId();\n\n if (\n !pendingAction ||\n !currentConversationId ||\n message.actionDecision ||\n this.isSending()\n ) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: decision } : item\n )\n );\n const userMessage = decision === 'approve'\n ? `Approve: ${pendingAction.summary}`\n : `Reject: ${pendingAction.summary}`;\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', userMessage));\n this.isSending.set(true);\n\n this.assistantService\n .confirmAction(\n pendingAction.id,\n decision,\n currentConversationId,\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, userMessage));\n this.isSending.set(false);\n },\n error: error => {\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: undefined } : item\n )\n );\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n private resolveErrorMessage(error: unknown): string {\n if (\n error instanceof HttpErrorResponse &&\n typeof error.error === 'object' &&\n error.error !== null &&\n 'message' in error.error &&\n typeof error.error.message === 'string' &&\n error.error.message.trim()\n ) {\n return error.error.message.trim();\n }\n return this.uiCopy.errorMessage;\n }\n\n protected onComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage();\n }\n }\n\n protected isDetailsVisible(messageId: string): boolean {\n return this.expandedDetailMessageIds().has(messageId);\n }\n\n protected toggleDetails(messageId: string, initialStepId?: number) {\n const opening = !this.isDetailsVisible(messageId);\n this.expandedDetailMessageIds.set(\n opening ? new Set([messageId]) : new Set<string>()\n );\n this.expandedTraceStepKeys.set(\n opening && initialStepId !== undefined\n ? new Set([this.traceStepKey(messageId, initialStepId)])\n : new Set<string>()\n );\n }\n\n protected isTraceStepExpanded(messageId: string, stepId: number): boolean {\n return this.expandedTraceStepKeys().has(this.traceStepKey(messageId, stepId));\n }\n\n protected toggleTraceStep(messageId: string, stepId: number) {\n const key = this.traceStepKey(messageId, stepId);\n this.expandedTraceStepKeys.update(expandedKeys => {\n const next = new Set(expandedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n protected chartTotal(visualisation: AssistantVisualisation): number {\n return visualisation.values.reduce(\n (total, value) => total + Math.max(0, Number(value) || 0),\n 0\n );\n }\n\n protected chartColor(visualisation: AssistantVisualisation, index: number): string {\n const fallback = ['#42A5F5', '#FFA5F5', '#66BB6A', '#FFA726', '#228888'];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n protected doughnutDashArray(\n visualisation: AssistantVisualisation,\n index: number\n ): string {\n const percentage = this.chartPercentage(visualisation, index);\n return `${percentage} ${100 - percentage}`;\n }\n\n protected doughnutDashOffset(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n return -visualisation.values\n .slice(0, index)\n .reduce(\n (total, _value, valueIndex) =>\n total + this.chartPercentage(visualisation, valueIndex),\n 0\n );\n }\n\n protected barWidth(visualisation: AssistantVisualisation, index: number): number {\n const maximum = Math.max(0, ...visualisation.values.map(value => Number(value) || 0));\n if (!maximum) {\n return 0;\n }\n return Math.max(0, ((Number(visualisation.values[index]) || 0) / maximum) * 100);\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const values = visualisation.labels.map(\n (label, index) => `${label}: ${Number(visualisation.values[index]) || 0}`\n );\n return `${visualisation.title} diversity chart. ${values.join(', ')}.`;\n }\n\n private chartPercentage(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n const total = this.chartTotal(visualisation);\n return total\n ? (Math.max(0, Number(visualisation.values[index]) || 0) / total) * 100\n : 0;\n }\n\n protected formatTraceValue(value: AssistantFieldValue | undefined): string {\n return JSON.stringify(value, null, 2);\n }\n\n protected traceMap(value: AssistantFieldValue | undefined): AssistantFieldMap | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value\n : undefined;\n }\n\n protected traceMapField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldMap | undefined {\n return this.traceMap(this.traceMap(value)?.[key]);\n }\n\n protected traceArrayField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue[] {\n const field = this.traceMap(value)?.[key];\n return Array.isArray(field) ? field : [];\n }\n\n protected traceField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue | undefined {\n return this.traceMap(value)?.[key];\n }\n\n protected traceEntries(\n value: AssistantFieldValue | AssistantFieldMap | undefined,\n excludedKeys: string[] = []\n ): Array<{ key: string; label: string; value: AssistantFieldValue }> {\n const record = this.traceMap(value);\n const excluded = new Set(excludedKeys.map(key => key.toLocaleLowerCase()));\n return record\n ? Object.entries(record)\n .filter(\n ([key, entry]) =>\n entry !== undefined && !excluded.has(key.toLocaleLowerCase())\n )\n .map(([key, entry]) => ({\n key,\n label: this.formatTraceLabel(key),\n value: entry\n }))\n : [];\n }\n\n protected formatTraceLabel(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n protected formatTraceScalar(value: AssistantFieldValue | undefined): string {\n if (value === null) {\n return 'None';\n }\n if (value === undefined) {\n return 'Not supplied';\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? String(value) : value.toFixed(6);\n }\n if (typeof value === 'string') {\n return value || 'Empty';\n }\n return JSON.stringify(value);\n }\n\n protected formatSimilarity(value: AssistantFieldValue | undefined): string {\n return typeof value === 'number' ? value.toFixed(4) : '—';\n }\n\n protected getHttpStatus(step: AssistantTraceStep): number | undefined {\n const output = this.traceMap(step.output);\n const http = this.traceMap(output?.['http']);\n const status = http?.['statusCode'] ?? output?.['statusCode'] ?? step.error?.statusCode;\n return typeof status === 'number' ? status : undefined;\n }\n\n protected isHttpSuccessful(step: AssistantTraceStep): boolean {\n const status = this.getHttpStatus(step);\n return status !== undefined && status >= 200 && status < 300;\n }\n\n protected traceStepTone(step: AssistantTraceStep): AssistantTraceStep['status'] {\n return step.category === 'api_call' && this.isHttpSuccessful(step)\n ? 'succeeded'\n : step.status;\n }\n\n protected traceStepStatus(step: AssistantTraceStep): string {\n if (step.category === 'api_call') {\n const status = this.getHttpStatus(step);\n if (status !== undefined) {\n return `HTTP ${status} ${this.isHttpSuccessful(step) ? 'Success' : 'Error'}`;\n }\n return step.status === 'failed' ? 'Transport failed' : 'Completed';\n }\n return step.status === 'succeeded'\n ? 'Completed'\n : step.status === 'failed'\n ? 'Stopped'\n : 'Running';\n }\n\n protected formatTraceCategory(category: string): string {\n const labels: Record<string, string> = {\n request: 'Request intake',\n intent_projection: 'Intent generalisation',\n embedding: 'Intent embedding',\n capability_routing: 'Capability matching',\n argument_extraction: 'Argument extraction',\n api_call: 'Nemesys API',\n action: 'Workflow outcome',\n response: 'Assistant response'\n };\n return labels[category] ?? this.formatTraceLabel(category);\n }\n\n private getAssistantConfig(): MaxAssistantConfig {\n const config: MaxAssistantConfig = {};\n\n if (this.assistantApiUrl) {\n config.assistantApiUrl = this.assistantApiUrl;\n }\n\n if (this.app) {\n config.app = this.app;\n }\n\n if (this.user) {\n config.user = this.user;\n }\n\n if (this.context) {\n config.context = this.context;\n }\n\n if (this.requestHeaders) {\n config.requestHeaders = this.requestHeaders;\n }\n\n return config;\n }\n\n private appendMessage(message: AssistantMessage) {\n this.messages.update(messages => [...messages, message]);\n this.scrollToLatest();\n }\n\n private updateStreamingMessage(messageId: string, content: string) {\n const trimmedContent = content.trim();\n if (!trimmedContent) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId && message.isStreaming\n ? { ...message, content: trimmedContent }\n : message\n )\n );\n this.scrollToLatest();\n }\n\n private replaceMessage(messageId: string, replacement: AssistantMessage) {\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId\n ? { ...replacement, id: messageId, isStreaming: false }\n : message\n )\n );\n this.scrollToLatest();\n }\n\n private createDefaultMessages(): AssistantMessage[] {\n if (!this.bootstrapConfig.initialMessage) {\n return [];\n }\n\n return [\n this.createMessage(\n 'assistant',\n this.getInitialMessage(this.bootstrapConfig.initialMessage),\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private getInitialMessage(initialMessage: string): string {\n const configuredUser = this.user ?? this.defaultConfig.user;\n const user = typeof configuredUser === 'function'\n ? configuredUser()\n : configuredUser;\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 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 visualisations: provided.visualisations,\n shiftCardGroups: provided.shiftCardGroups,\n rota: provided.rota,\n markdown: provided.markdown\n };\n }\n\n private createExtractedIntent(\n response: AssistantChatResponse,\n provided?: AssistantExtractedIntent\n ): AssistantExtractedIntent {\n return {\n project: provided?.project ?? response.productLabel ?? response.product ?? response.app,\n projectKey: provided?.projectKey ?? response.product ?? response.app,\n module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,\n intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,\n intentLabel:\n provided?.intentLabel\n ?? response.intentLabel\n ?? response.contextResolution?.capabilityLabel,\n confidence:\n provided?.confidence\n ?? response.confidence\n ?? response.contextResolution?.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]\n };\n }\n\n private getToolApiCalls(\n response: AssistantChatResponse\n ): AssistantMessage['apiCalls'] | undefined {\n if (!response.toolExecution) {\n return undefined;\n }\n\n return [{\n method: response.toolExecution.method,\n url: response.toolExecution.endpoint,\n purpose: response.toolExecution.toolName\n }];\n }\n\n private getSampleJsonResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\n return undefined;\n }\n\n return response.mockResult;\n }\n\n private getDisplayTables(\n provided: AssistantDisplayResponse,\n response: AssistantChatResponse\n ): AssistantResponseTable[] {\n if (provided.grid?.length) {\n return provided.grid;\n }\n\n if (provided.tables?.length) {\n return provided.tables;\n }\n\n if (provided.shiftCardGroups?.length || provided.rota) {\n return [];\n }\n\n const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);\n\n if (!rows.length) {\n return [];\n }\n\n const columns = this.getTableColumns(rows);\n\n return [\n {\n title: 'API Response',\n columns,\n rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))\n }\n ];\n }\n\n private extractTableRows(value: unknown): AssistantFieldMap[] {\n if (Array.isArray(value)) {\n return value.filter(this.isFieldMap);\n }\n\n if (!this.isFieldMap(value)) {\n return [];\n }\n\n const body = value['body'];\n\n if (Array.isArray(body)) {\n return body.filter(this.isFieldMap);\n }\n\n const items = value['items'];\n\n if (Array.isArray(items)) {\n return items.filter(this.isFieldMap);\n }\n\n return [];\n }\n\n private getTableColumns(rows: AssistantFieldMap[]): AssistantResponseTable['columns'] {\n const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);\n\n return fields.map(field => ({\n field,\n header: this.toColumnHeader(field)\n }));\n }\n\n private formatTableRow(row: AssistantFieldMap, fields: string[]): AssistantFieldMap {\n return Object.fromEntries(\n fields.map(field => [field, this.formatCellValue(row[field])])\n ) as AssistantFieldMap;\n }\n\n private formatCellValue(value: AssistantFieldValue | undefined): AssistantFieldValue {\n if (Array.isArray(value)) {\n return value.map(item => this.formatCellValue(item)).join(', ');\n }\n\n if (this.isFieldMap(value)) {\n return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);\n }\n\n return value ?? '';\n }\n\n private toColumnHeader(field: string): string {\n return field\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n private formatJson(value: unknown): string | undefined {\n if (value === undefined || this.isEmptyObject(value)) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\n }\n\n private isEmptyObject(value: unknown): boolean {\n return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;\n }\n\n private isFieldMap(value: unknown): value is AssistantFieldMap {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\n }\n\n private traceStepKey(messageId: string, stepId: number): string {\n return `${messageId}:${stepId}`;\n }\n\n private getConversationHistory(): AssistantConversationMessage[] {\n const messages = this.messages();\n const firstUserIndex = messages.findIndex(message => message.role === 'user');\n if (firstUserIndex < 0) {\n return [];\n }\n\n return messages\n .slice(firstUserIndex)\n .filter(message => !message.isError && !message.isStreaming)\n .slice(-20)\n .map(message => ({\n role: message.role,\n content: message.content.slice(0, 4_000),\n ...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})\n }));\n }\n\n private scrollToLatest() {\n setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n });\n }\n}\n","<aside\n class=\"assistant-window\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"region\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <i class=\"max-assistant-sparkles far fa-sparkles\" aria-hidden=\"true\"></i>\n <div class=\"assistant-identity\">\n <h2 class=\"assistant-name\">{{ uiCopy.title }}</h2>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <div class=\"assistant-header-actions\">\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n ></button>\n <ng-content select=\"[maxAssistantHeaderAction]\"></ng-content>\n </div>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isStreaming) {\n <p class=\"streaming-progress\">{{ message.content }}</p>\n } @else if(message.displayResponse; as responseDetails) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <strong>{{ card.title }}</strong>\n @if(card.subtitle) {\n <span>{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span>{{ metric.label }}</span>\n <strong>{{ metric.value }}</strong>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(responseDetails.shiftCardGroups?.length) {\n <div class=\"assistant-shift-groups\" aria-label=\"Team shifts\">\n @for(group of responseDetails.shiftCardGroups ?? []; track group.title) {\n <section class=\"assistant-shift-group\">\n <h3>{{ group.title }}</h3>\n <div class=\"assistant-shift-card-grid\">\n @for(shift of group.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"definition\"\n ></max-agent-shift-card>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(responseDetails.rota; as rota) {\n <section class=\"assistant-rota\" [attr.aria-label]=\"rota.title\">\n <div class=\"assistant-rota-heading\">\n <h3>{{ rota.title }}</h3>\n <div class=\"assistant-rota-summary\">\n @if(rota.startDate) {\n <span><small>From</small><strong>{{ rota.startDate }}</strong></span>\n }\n <span><small>Weeks</small><strong>{{ rota.weeksCount }}</strong></span>\n @if(rota.contracted) {\n <span><small>Contracted</small><strong>{{ rota.contracted }}</strong></span>\n }\n @if(rota.autoPublish) {\n <span><small>Auto publish</small><strong>{{ rota.autoPublish }}</strong></span>\n }\n </div>\n </div>\n <div class=\"assistant-rota-scroll\">\n @for(week of rota.weeks; track week.week) {\n <section class=\"assistant-rota-week\">\n <header class=\"assistant-rota-week-heading\">\n <strong>Week {{ week.week }}</strong>\n @if(week.duration) {\n <span>{{ week.duration }}</span>\n }\n </header>\n <div class=\"assistant-rota-week-grid\">\n @for(day of week.days; track day.day) {\n <article class=\"assistant-rota-day\">\n <header>\n <strong>{{ day.label }}</strong>\n @if(day.period) {\n <span>{{ day.period }}</span>\n }\n </header>\n <div class=\"assistant-rota-day-shifts\">\n @for(shift of day.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"rota\"\n ></max-agent-shift-card>\n } @empty {\n <span class=\"assistant-rota-empty\">No shifts</span>\n }\n </div>\n </article>\n }\n </div>\n </section>\n } @empty {\n <p class=\"assistant-rota-no-weeks\">No rota weeks were returned.</p>\n }\n </div>\n </section>\n }\n @if(responseDetails.visualisations?.length) {\n <div class=\"assistant-visualisations\">\n @for(visualisation of responseDetails.visualisations ?? []; track visualisation.title) {\n <section class=\"assistant-visualisation\">\n <h3>{{ visualisation.title }}</h3>\n @if(visualisation.type === 'doughnut') {\n <div class=\"assistant-doughnut-layout\">\n <div\n class=\"assistant-doughnut\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n <svg viewBox=\"0 0 42 42\" aria-hidden=\"true\" focusable=\"false\">\n <circle\n class=\"assistant-doughnut-track\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n ></circle>\n @for(value of visualisation.values; track $index; let valueIndex = $index) {\n <circle\n class=\"assistant-doughnut-segment\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n pathLength=\"100\"\n [attr.stroke]=\"chartColor(visualisation, valueIndex)\"\n [attr.stroke-dasharray]=\"doughnutDashArray(visualisation, valueIndex)\"\n [attr.stroke-dashoffset]=\"doughnutDashOffset(visualisation, valueIndex)\"\n ></circle>\n }\n </svg>\n <span><strong>{{ chartTotal(visualisation) }}</strong>people</span>\n </div>\n <div class=\"assistant-chart-legend\">\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-chart-legend-item\">\n <i [style.background]=\"chartColor(visualisation, labelIndex)\"></i>\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n }\n </div>\n </div>\n } @else {\n <div\n class=\"assistant-bar-chart\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-bar-row\">\n <div class=\"assistant-bar-label\">\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n <div class=\"assistant-bar-track\" aria-hidden=\"true\">\n <i\n [style.width.%]=\"barWidth(visualisation, labelIndex)\"\n [style.background]=\"chartColor(visualisation, labelIndex)\"\n ></i>\n </div>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Details' : 'Show Details' }}\n </button>\n\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">→</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} · {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} · {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { · HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { — HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </section>\n</aside>\n","/*\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.service';\nexport * from './lib/components/shift-card/max-agent-shift-card.component';\nexport * from './lib/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAOA,MAAM,eAAe,GAAG,QAAQ;AAChC,MAAM,mBAAmB,GACvB,6TAA6T;AAE/T,MAAM,2BAA2B,GAA6B;AAC5D,IAAA,cAAc,EAAE,SAAS;AACzB,IAAA,kBAAkB,EAAE;CACrB;AAED,MAAM,0BAA0B,GAA6C;AAC3E,IAAA,MAAM,EAAE;AACN,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,cAAc,EAAE,eAAe;AAC/B,QAAA,kBAAkB,EAAE,mBAAmB;AACvC,QAAA,kBAAkB,EAAE;AACrB;CACF;AAEK,SAAU,2BAA2B,CAAC,GAAsB,EAAA;IAChE,MAAM,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE;IAExC,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,OAAO,2BAA2B;IACpC;AAEA,IAAA,OAAO,0BAA0B,CAAC,MAAM,CAAC,IAAI,2BAA2B;AAC1E;;MCxBa,oBAAoB,GAAG,IAAI,cAAc,CACpD,sBAAsB,EACtB;AACE,IAAA,OAAO,EAAE,OAAO,EAAE;AACnB,CAAA;;MCdU,wBAAwB,CAAA;AACnC,IAAA,SAAS,CAAC,KAAgC,EAAA;QACxC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,EAAE;QACX;;;;QAKA,MAAM,YAAY,GAAG;AAClB,aAAA,UAAU,CAAC,GAAG,EAAE,OAAO;AACvB,aAAA,UAAU,CAAC,GAAG,EAAE,MAAM;AACtB,aAAA,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;AAE1B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE;AAChC,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,GAAG,EAAE;AACN,SAAA,CAAC;IACJ;wGAnBW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;sGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBALpC,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,sBAAsB;AAC5B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACP,iBAAA;;;MCIY,0BAA0B,CAAA;AACV,IAAA,KAAK;IACvB,OAAO,GAA6B,MAAM;AAEnD,IAAA,IAAc,WAAW,GAAA;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE;QACtC,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,SAAS;QAClB;AACA,QAAA,OAAO,4CAA4C,CAAC,IAAI,CAAC,KAAK;cAC1D,CAAA,CAAA,EAAI,KAAK,CAAA;cACT,KAAK;IACX;AAEA,IAAA,IAAc,SAAS,GAAA;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,KAAK;cAC/B,IAAI,CAAC;AACP,cAAE,IAAI,CAAC,UAAU;QACnB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACzC,QAAA,OAAO,KAAK,IAAI,GAAG,GAAG,GAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAE,GAAG,KAAK,IAAI,GAAG,IAAI,SAAS;IACvE;AAEA,IAAA,IAAc,eAAe,GAAA;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;AACjD,QAAA,OAAO;AACL,cAAE,CAAA,EAAG,KAAK,CAAA,WAAA,EAAc,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;cAC5C,iBAAiB;IACvB;AAEA,IAAA,IAAc,SAAS,GAAA;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC;AACvC,QAAA,OAAO,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,KAAK,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE;IACjD;AAEQ,IAAA,UAAU,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK;IAClD;AAEQ,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,KAAK;QACd;QACA,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC7B,QAAA,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;QAC1C,OAAO,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE;IACjE;wGA/CW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,0BAA0B,gICXvC,swCAkCA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA,CAAA;;4FDvBa,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBALtC,SAAS;+BACE,sBAAsB,EAAA,QAAA,EAAA,swCAAA,EAAA,MAAA,EAAA,CAAA,osCAAA,CAAA,EAAA;;sBAK/B,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB;;;AEKH,MAAM,0BAA0B,GAAG,oBAAoB;AACvD,MAAM,WAAW,GAAG,QAAQ;AAC5B,MAAM,gBAAgB,GAAG,KAAK;MAKjB,mBAAmB,CAAA;AAEmB,IAAA,MAAA;AAClB,IAAA,IAAA;IAF/B,WAAA,CACiD,MAA0B,EAC5C,IAAuB,EAAA;QADL,IAAA,CAAA,MAAM,GAAN,MAAM;QACxB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAChC;AAEH,IAAA,WAAW,CACT,OAAe,EACf,cAAuB,EACvB,MAAA,GAA6B,EAAE,EAC/B,YAAoC,EACpC,OAAA,GAA0C,EAAE,EAC5C,UAAsD,EAAA;AAEtD,QAAA,MAAM,eAAe,GAAG;YACtB,GAAG,IAAI,CAAC,MAAM;AACd,YAAA,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;SAC7B;AACD,QAAA,MAAM,OAAO,GAAyB;YACpC,OAAO;AACP,YAAA,IAAI,UAAU,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YACvC,cAAc;YACd,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;AACzC,YAAA,IAAI,YAAY,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;SACzC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC;IAC/D;IAEA,aAAa,CACX,QAAgB,EAChB,QAA2C,EAC3C,cAAsB,EACtB,MAAA,GAA6B,EAAE,EAC/B,OAAA,GAA0C,EAAE,EAAA;AAE5C,QAAA,OAAO,IAAI,CAAC,WAAW,CACrB,QAAQ,KAAK,SAAS,GAAG,gBAAgB,GAAG,eAAe,EAC3D,cAAc,EACd,MAAM,EACN,EAAE,QAAQ,EAAE,QAAQ,EAAE,EACtB,OAAO,CACR;IACH;IAEA,oBAAoB,CAClB,OAAe,EACf,MAAiC,EACjC,cAAuB,EACvB,MAAA,GAA6B,EAAE,EAC/B,OAAA,GAA0C,EAAE,EAAA;AAE5C,QAAA,MAAM,eAAe,GAAG;YACtB,GAAG,IAAI,CAAC,MAAM;AACd,YAAA,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM;SAC7B;AACD,QAAA,MAAM,OAAO,GAAyB;YACpC,OAAO;YACP,cAAc;YACd,OAAO;AACP,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;AACzC,YAAA,gBAAgB,EAAE;SACnB;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC;IACnD;AAEQ,IAAA,WAAW,CACjB,OAA6B,EAC7B,MAA0B,EAC1B,UAAsD,EAAA;AAEtD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;QAEA,IAAI,UAAU,EAAE;YACd,OAAO,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC;QACxD;QAEA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EACvB,OAAO,EACP,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CACrC;IACH;AAEQ,IAAA,aAAa,CACnB,OAA6B,EAC7B,MAA0B,EAC1B,UAAqD,EAAA;AAErD,QAAA,OAAO,IAAI,UAAU,CAAC,UAAU,IAAG;AACjC,YAAA,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AACvC,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CACrC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAC5D;YAED,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAClC,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,OAAO,EAAE,YAAY;AACrB,gBAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC;AACpB,aAAA,CAAC,CAAC,IAAI,CAAC,OAAM,QAAQ,KAAG;AACvB,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;AAChB,oBAAA,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;oBAC1D,MAAM,IAAI,iBAAiB,CAAC;wBAC1B,KAAK;wBACL,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;wBAC/B,GAAG,EAAE,QAAQ,CAAC;AACf,qBAAA,CAAC;gBACJ;AAEA,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AAClB,oBAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;gBACnE;gBAEA,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE;AACxC,gBAAA,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE;gBACjC,IAAI,MAAM,GAAG,EAAE;gBACf,IAAI,cAAc,GAAG,KAAK;AAE1B,gBAAA,MAAM,WAAW,GAAG,CAAC,IAAY,KAAI;AACnC,oBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;oBAC/B,IAAI,CAAC,WAAW,EAAE;wBAChB;oBACF;oBAEA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAA6B;AACjE,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE;wBAC7B,UAAU,CAAC,KAAK,CAAC;wBACjB;oBACF;AACA,oBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC1B,wBAAA,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;oBAChC;oBAEA,cAAc,GAAG,IAAI;AACrB,oBAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AACjC,gBAAA,CAAC;gBAED,OAAO,IAAI,EAAE;oBACX,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE;oBAC3C,IAAI,IAAI,EAAE;wBACR;oBACF;AAEA,oBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;oBACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAChC,oBAAA,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;AAC1B,oBAAA,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC5B;AAEA,gBAAA,MAAM,IAAI,OAAO,CAAC,MAAM,EAAE;gBAC1B,WAAW,CAAC,MAAM,CAAC;gBAEnB,IAAI,CAAC,cAAc,EAAE;AACnB,oBAAA,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC;gBACtF;gBAEA,UAAU,CAAC,QAAQ,EAAE;AACvB,YAAA,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;gBACf,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE;AACtD,oBAAA,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;gBACzB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,MAAM,UAAU,CAAC,KAAK,EAAE;AACjC,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,OAAO,MAAM,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,0BAA0B;IACrE;AAEQ,IAAA,MAAM,CAAC,MAA0B,EAAA;AACvC,QAAA,OAAO,MAAM,CAAC,GAAG,IAAI,WAAW;IAClC;AAEQ,IAAA,OAAO,CAAC,MAA0B,EAAA;AACxC,QAAA,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE;AACrC,YAAA,OAAO,MAAM,CAAC,IAAI,EAAE;QACtB;AAEA,QAAA,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE;IAC1B;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;AAC3C,QAAA,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK;AAC3C,cAAE,MAAM,CAAC,OAAO;AAChB,cAAE,MAAM,CAAC,OAAO,IAAI,EAAE;QAExB,OAAO;AACL,YAAA,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE;YACzC,QAAQ,EAAE,UAAU,CAAC;AAChB,mBAAA,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC;mBACxC,gBAAgB;AACrB,YAAA,IAAI,UAAU,CAAC,QAAQ,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;YACjE,IAAI,UAAU,CAAC;AACb,kBAAE,EAAE,cAAc,EAAE,UAAU,CAAC,cAAc;kBAC3C,EAAE,CAAC;AACP,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC;AAC3D,YAAA,IAAI,UAAU,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AACrD,YAAA,IAAI,UAAU,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;AACxD,YAAA,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE;SAC3D;IACH;AAEQ,IAAA,UAAU,CAAC,MAA0B,EAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;AACrE,QAAA,MAAM,iBAAiB,GAAG,OAAO,MAAM,CAAC,cAAc,KAAK;AACzD,cAAE,MAAM,CAAC,cAAc;AACvB,cAAE,MAAM,CAAC,cAAc,IAAI,EAAE;AAE/B,QAAA,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE;AAC7D,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE;AAC/B,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE;AAEjC,YAAA,IAAI,WAAW,IAAI,YAAY,EAAE;gBAC/B,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC;YAClD;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE;AAEA,QAAA,OAAO,OAAO;IAChB;AAEQ,IAAA,aAAa,CAAC,MAA0B,EAAA;QAC9C,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,SAAS,CAAC,CAC5C;IACzB;AAtPW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,kBAEpB,oBAAoB,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAFnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA;;4FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;0BAGI,MAAM;2BAAC,oBAAoB;;0BAC3B;;;ACqBL,MAAM,iBAAiB,GAAG;AACxB,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,QAAQ,EAAE,4BAA4B;AACtC,IAAA,UAAU,EAAE,qBAAqB;AACjC,IAAA,YAAY,EAAE,qBAAqB;AACnC,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,eAAe,EAAE,6BAA6B;AAC9C,IAAA,YAAY,EAAE;CACf;MAmBY,qBAAqB,CAAA;AAwBb,IAAA,gBAAA;AACA,IAAA,UAAA;AAC8B,IAAA,aAAA;AAzBV,IAAA,gBAAgB;AAE9C,IAAA,GAAG;AACH,IAAA,eAAe;AACf,IAAA,IAAI;AAGJ,IAAA,OAAO;AAGP,IAAA,cAAc;AAIJ,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;AACzB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,iDAAC;AAClB,IAAA,cAAc,GAAG,MAAM,CAAqB,SAAS,0DAAC;AACtD,IAAA,QAAQ,GAAG,MAAM,CAAqB,EAAE,oDAAC;AACzC,IAAA,wBAAwB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAU,oEAAC;AACzE,IAAA,qBAAqB,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAU,iEAAC;IACtE,uBAAuB,GAAG,SAAS,EAAE;AAExD,IAAA,WAAA,CACmB,gBAAqC,EACrC,UAAsB,EACQ,aAAiC,EAAA;QAF/D,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,UAAU,GAAV,UAAU;QACoB,IAAA,CAAA,aAAa,GAAb,aAAa;IAC3D;IAEH,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IACjD;AAEA,IAAA,IAAc,MAAM,GAAA;AAClB,QAAA,OAAO,iBAAiB;IAC1B;AAEA,IAAA,IAAc,eAAe,GAAA;AAC3B,QAAA,OAAO,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9C;AAEU,IAAA,gBAAgB,CAAC,OAAyB,EAAA;AAClD,QAAA,QACE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE;YACrC,OAAO,CAAC,IAAI,KAAK,WAAW;YAC5B,CAAC,OAAO,CAAC,eAAe;AACxB,YAAA,CAAC,OAAO,CAAC,WAAW;IAExB;AAEU,IAAA,cAAc,CAAC,OAAyB,EAAA;AAChD,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACvE;IAGU,gBAAgB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC,IAAI,EAAE;YACxC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;YACpD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACnD;IACF;IAEU,gBAAgB,GAAA;AACxB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACpD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/C,IAAI,CAAC,cAAc,EAAE;IACvB;AAEU,IAAA,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,EAAA;AAC1C,QAAA,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE;QAErC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YACvC;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AAClB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,gBAAgB,GAAG;YACvB,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AAC/D,YAAA,WAAW,EAAE;SACd;AACD,QAAA,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC;AACpC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,WAAW,CACV,cAAc,EACd,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,SAAS,EACT,OAAO,EACP,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC;AAE/E,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,cAAc,CACjB,gBAAgB,CAAC,EAAE,EACnB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,cAAc,CAAC,CAC9D;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,EAAE;AACvC,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEU,IAAA,eAAe,CAAC,UAA+B,EAAA;AACvD,QAAA,OAAO,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,KAAK;IACvE;AAEU,IAAA,aAAa,CAAC,UAA+B,EAAA;QACrD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE;AAClE,YAAA,IAAI,CAAC,WAAW,CACd,OAAO,UAAU,KAAK,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC,OAAO,CACjE;YACD;QACF;QAEA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE;QACrC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC;aACF,oBAAoB,CACnB,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,gBAAgB,EAC3B,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,CAClE;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,IAAI,CAAC,aAAa,CAAC;AACjB,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;IAEU,kBAAkB,CAC1B,KAA6B,EAC7B,QAAgB,EAAA;AAEhB,QAAA,OAAO,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE;IAC5E;AAEU,IAAA,cAAc,CAAC,MAAoC,EAAA;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;QACjC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;YAC9B;QACF;AAEA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC;aACF,oBAAoB,CACnB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,gBAAgB,EACvB,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CACH,SAAS,CAAC,QAAQ,IAAG;YACnB,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AACrD,gBAAA,OAAO,EAAE,CAAC,QAAQ,CAAC;YACrB;YACA,OAAO,IAAI,CAAC,gBAAgB,CAAC,aAAa,CACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,EACzB,SAAS,EACT,QAAQ,CAAC,cAAc,EACvB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO,CACR;QACH,CAAC,CAAC,EACF,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAChB,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAC9D;AACD,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;gBACb,IAAI,CAAC,aAAa,CAAC;AACjB,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;IAEU,oBAAoB,CAC5B,OAAyB,EACzB,QAA2C,EAAA;AAE3C,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa;AAC3C,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,cAAc,EAAE;AAEnD,QAAA,IACE,CAAC,aAAa;AACd,YAAA,CAAC,qBAAqB;AACtB,YAAA,OAAO,CAAC,cAAc;AACtB,YAAA,IAAI,CAAC,SAAS,EAAE,EAChB;YACA;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,IAAI,IACf,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,GAAG,IAAI,CACtE,CACF;AACD,QAAA,MAAM,WAAW,GAAG,QAAQ,KAAK;AAC/B,cAAE,CAAA,SAAA,EAAY,aAAa,CAAC,OAAO,CAAA;AACnC,cAAE,CAAA,QAAA,EAAW,aAAa,CAAC,OAAO,EAAE;AACtC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,aAAa,CACZ,aAAa,CAAC,EAAE,EAChB,QAAQ,EACR,qBAAqB,EACrB,IAAI,CAAC,kBAAkB,EAAE,EACzB,OAAO;AAER,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC;YACT,IAAI,EAAE,QAAQ,IAAG;gBACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;AAChD,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,8BAA8B,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC9E,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,KAAK,IAAG;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,IAAI,IACf,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,CACvE,CACF;gBACD,IAAI,CAAC,aAAa,CAAC;AACjB,oBAAA,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AACnE,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEQ,IAAA,mBAAmB,CAAC,KAAc,EAAA;QACxC,IACE,KAAK,YAAY,iBAAiB;AAClC,YAAA,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;YAC/B,KAAK,CAAC,KAAK,KAAK,IAAI;YACpB,SAAS,IAAI,KAAK,CAAC,KAAK;AACxB,YAAA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;YACvC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAC1B;YACA,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE;QACnC;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY;IACjC;AAEU,IAAA,iBAAiB,CAAC,KAAoB,EAAA;QAC9C,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,WAAW,EAAE;QACpB;IACF;AAEU,IAAA,gBAAgB,CAAC,SAAiB,EAAA;QAC1C,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IACvD;IAEU,aAAa,CAAC,SAAiB,EAAE,aAAsB,EAAA;QAC/D,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;QACjD,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAC/B,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,EAAU,CACnD;QACD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAC5B,OAAO,IAAI,aAAa,KAAK;AAC3B,cAAE,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACvD,cAAE,IAAI,GAAG,EAAU,CACtB;IACH;IAEU,mBAAmB,CAAC,SAAiB,EAAE,MAAc,EAAA;AAC7D,QAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/E;IAEU,eAAe,CAAC,SAAiB,EAAE,MAAc,EAAA;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC;AAChD,QAAA,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,YAAY,IAAG;AAC/C,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC;AAClC,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClB;iBAAO;AACL,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YACf;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;AAEU,IAAA,eAAe,CAAC,eAAyC,EAAA;AACjE,QAAA,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAAC,IAAI,GAAG,eAAe,CAAC,MAAM,IAAI,EAAE;IAC3F;AAEU,IAAA,UAAU,CAAC,aAAqC,EAAA;AACxD,QAAA,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAChC,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EACzD,CAAC,CACF;IACH;IAEU,UAAU,CAAC,aAAqC,EAAE,KAAa,EAAA;AACvE,QAAA,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;AACxE,QAAA,OAAO,aAAa,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC3E;IAEU,iBAAiB,CACzB,aAAqC,EACrC,KAAa,EAAA;QAEb,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,KAAK,CAAC;AAC7D,QAAA,OAAO,GAAG,UAAU,CAAA,CAAA,EAAI,GAAG,GAAG,UAAU,EAAE;IAC5C;IAEU,kBAAkB,CAC1B,aAAqC,EACrC,KAAa,EAAA;QAEb,OAAO,CAAC,aAAa,CAAC;AACnB,aAAA,KAAK,CAAC,CAAC,EAAE,KAAK;aACd,MAAM,CACL,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,KACxB,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,UAAU,CAAC,EACzD,CAAC,CACF;IACL;IAEU,QAAQ,CAAC,aAAqC,EAAE,KAAa,EAAA;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrF,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC;QACV;QACA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,GAAG,CAAC;IAClF;AAEU,IAAA,cAAc,CAAC,aAAqC,EAAA;AAC5D,QAAA,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,CACrC,CAAC,KAAK,EAAE,KAAK,KAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAA,CAAE,CAC1E;AACD,QAAA,OAAO,CAAA,EAAG,aAAa,CAAC,KAAK,CAAA,kBAAA,EAAqB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAA,CAAG;IACxE;IAEQ,eAAe,CACrB,aAAqC,EACrC,KAAa,EAAA;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC5C,QAAA,OAAO;cACH,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI;cAClE,CAAC;IACP;AAEU,IAAA,gBAAgB,CAAC,KAAsC,EAAA;QAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC;AAEU,IAAA,QAAQ,CAAC,KAAsC,EAAA;AACvD,QAAA,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK;AACxE,cAAE;cACA,SAAS;IACf;IAEU,aAAa,CACrB,KAAsC,EACtC,GAAW,EAAA;AAEX,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IACnD;IAEU,eAAe,CACvB,KAAsC,EACtC,GAAW,EAAA;AAEX,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AACzC,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;IAC1C;IAEU,UAAU,CAClB,KAAsC,EACtC,GAAW,EAAA;QAEX,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;IACpC;AAEU,IAAA,YAAY,CACpB,KAA0D,EAC1D,YAAA,GAAyB,EAAE,EAAA;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC1E,QAAA,OAAO;AACL,cAAE,MAAM,CAAC,OAAO,CAAC,MAAM;iBAClB,MAAM,CACL,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KACX,KAAK,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;iBAEhE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM;gBACtB,GAAG;AACH,gBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;AACjC,gBAAA,KAAK,EAAE;AACR,aAAA,CAAC;cACJ,EAAE;IACR;AAEU,IAAA,gBAAgB,CAAC,KAAa,EAAA;AACtC,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,aAAA,OAAO,CAAC,IAAI,EAAE,GAAG;AACjB,aAAA,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;IAC3D;AAEU,IAAA,iBAAiB,CAAC,KAAsC,EAAA;AAChE,QAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,YAAA,OAAO,MAAM;QACf;AACA,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,OAAO,cAAc;QACvB;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;YAC9B,OAAO,KAAK,GAAG,KAAK,GAAG,IAAI;QAC7B;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACnE;AACA,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC7B,OAAO,KAAK,IAAI,OAAO;QACzB;AACA,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC9B;AAEU,IAAA,gBAAgB,CAAC,KAAsC,EAAA;AAC/D,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;IAC3D;AAEU,IAAA,aAAa,CAAC,IAAwB,EAAA;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACzC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;AAC5C,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,MAAM,GAAG,YAAY,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,UAAU;AACvF,QAAA,OAAO,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,SAAS;IACxD;AAEU,IAAA,gBAAgB,CAAC,IAAwB,EAAA;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;QACvC,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;IAC9D;AAEU,IAAA,aAAa,CAAC,IAAwB,EAAA;QAC9C,OAAO,IAAI,CAAC,QAAQ,KAAK,UAAU,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI;AAC/D,cAAE;AACF,cAAE,IAAI,CAAC,MAAM;IACjB;AAEU,IAAA,eAAe,CAAC,IAAwB,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AACvC,YAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,gBAAA,OAAO,QAAQ,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,OAAO,EAAE;YAC9E;AACA,YAAA,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,GAAG,kBAAkB,GAAG,WAAW;QACpE;AACA,QAAA,OAAO,IAAI,CAAC,MAAM,KAAK;AACrB,cAAE;AACF,cAAE,IAAI,CAAC,MAAM,KAAK;AAChB,kBAAE;kBACA,SAAS;IACjB;AAEU,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAC5C,QAAA,MAAM,MAAM,GAA2B;AACrC,YAAA,OAAO,EAAE,gBAAgB;AACzB,YAAA,iBAAiB,EAAE,uBAAuB;AAC1C,YAAA,SAAS,EAAE,kBAAkB;AAC7B,YAAA,kBAAkB,EAAE,qBAAqB;AACzC,YAAA,mBAAmB,EAAE,qBAAqB;AAC1C,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,MAAM,EAAE,kBAAkB;AAC1B,YAAA,QAAQ,EAAE;SACX;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;IAC5D;IAEQ,kBAAkB,GAAA;QACxB,MAAM,MAAM,GAAuB,EAAE;AAErC,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe;QAC/C;AAEA,QAAA,IAAI,IAAI,CAAC,GAAG,EAAE;AACZ,YAAA,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;QACvB;AAEA,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE;AACb,YAAA,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;QACzB;AAEA,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QAC/B;AAEA,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;QAC7C;AAEA,QAAA,OAAO,MAAM;IACf;AAEQ,IAAA,aAAa,CAAC,OAAyB,EAAA;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,sBAAsB,CAAC,SAAiB,EAAE,OAAe,EAAA;AAC/D,QAAA,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE;QACrC,IAAI,CAAC,cAAc,EAAE;YACnB;QACF;QAEA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,IAClB,OAAO,CAAC,EAAE,KAAK,SAAS,IAAI,OAAO,CAAC;cAChC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,cAAc;AACvC,cAAE,OAAO,CACZ,CACF;QACD,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,cAAc,CAAC,SAAiB,EAAE,WAA6B,EAAA;QACrE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,IAC3B,QAAQ,CAAC,GAAG,CAAC,OAAO,IAClB,OAAO,CAAC,EAAE,KAAK;AACb,cAAE,EAAE,GAAG,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK;AACrD,cAAE,OAAO,CACZ,CACF;QACD,IAAI,CAAC,cAAc,EAAE;IACvB;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACxC,YAAA,OAAO,EAAE;QACX;QAEA,OAAO;YACL,IAAI,CAAC,aAAa,CAChB,WAAW,EACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,EAC3D,IAAI,CAAC,eAAe,CAAC,kBAAkB;SAE1C;IACH;AAEQ,IAAA,iBAAiB,CAAC,cAAsB,EAAA;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI;AAC3D,QAAA,MAAM,IAAI,GAAG,OAAO,cAAc,KAAK;cACnC,cAAc;cACd,cAAc;AAClB,QAAA,MAAM,aAAa,GAAG;YACpB,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,GAAG,aAAa,CAAC;YACrB,IAAI,GAAG,MAAM,CAAC;YACd,IAAI,GAAG,UAAU;AAClB,SAAA,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AAE1D,QAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;AACrC,YAAA,OAAO,cAAc;QACvB;QAEA,MAAM,SAAS,GAAG;AACf,aAAA,IAAI;AACJ,aAAA,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,cAAc;QACvB;AAEA,QAAA,IAAI,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YACpC,OAAO,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA,CAAG,CAAC;QAC3D;QAEA,OAAO,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA,MAAA,EAAS,SAAS,CAAA,CAAA,CAAG,CAAC;IACjE;IAEQ,8BAA8B,CACpC,QAA+B,EAC/B,SAAiB,EAAA;QAEjB,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC;AAEvE,QAAA,OAAO,IAAI,CAAC,aAAa,CACvB,WAAW,EACX,eAAe,CAAC,qBAAqB,IAAI,QAAQ,CAAC,MAAM,EACxD,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,OAAO,EAChC,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,iBAAiB,EAAE,SAAS,EAC3D,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,iBAAiB,EAAE,UAAU,EAC7D,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,EACxC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EACnD,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,gBAAgB,EACzB,eAAe,EACf,QAAQ,CAAC,MAAM,EACf,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,iBAAiB,CAAC,aAAa,EACxC,QAAQ,CAAC,cAAc,CACxB;IACH;IAEQ,aAAa,CACnB,IAA8B,EAC9B,OAAe,EACf,WAAA,GAAqC,EAAE,EACvC,OAAA,GAAuC,EAAE,EACzC,MAAe,EACf,WAAoB,EACpB,GAAY,EACZ,YAAqB,EACrB,SAAkB,EAClB,UAAmB,EACnB,UAA8B,EAC9B,QAAuC,EACvC,SAA6B,EAC7B,UAA8B,EAC9B,OAAiB,EACjB,gBAA2B,EAC3B,eAA0C,EAC1C,MAAwC,EACxC,aAAiD,EACjD,aAAiD,EACjD,KAAiC,EACjC,aAAsB,EACtB,cAAwC,EAAA;QAExC,OAAO;AACL,YAAA,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE;YACnB,IAAI;YACJ,OAAO;YACP,eAAe;YACf,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,UAAU,CAAC;AACvF,YAAA,mBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAE,OAAO,CAAC;AACzF,YAAA,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAE,IAAI,CAAC;YACnF,oBAAoB,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC;YACnE,2BAA2B,EAAE,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,kBAAkB,CAAC;YACjF,WAAW;YACX,OAAO;YACP,MAAM;YACN,WAAW;YACX,GAAG;YACH,YAAY;YACZ,SAAS;YACT,UAAU;YACV,UAAU;AACV,YAAA,QAAQ,EAAE,UAAU;YACpB,QAAQ;YACR,SAAS;YACT,UAAU;YACV,OAAO;YACP,gBAAgB;YAChB,MAAM;YACN,aAAa;YACb,aAAa;YACb,KAAK;YACL,aAAa;YACb,cAAc;YACd,SAAS,EAAE,IAAI,IAAI;SACpB;IACH;IAEQ,qBAAqB,CAC3B,QAA+B,EAC/B,SAAiB,EAAA;AAEjB,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,eAAe,IAAI,EAAE;AAC/C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC;QAC3F,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAEtD,OAAO;AACL,YAAA,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,SAAS;AAC1C,YAAA,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB,IAAI,QAAQ,CAAC,MAAM;AACxE,YAAA,oBAAoB,EAAE,eAAe;AACrC,YAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,SAAS;YACvD,kBAAkB,EAAE,QAAQ,CAAC,kBAAkB,IAAI,IAAI,CAAC,6BAA6B,CAAC,QAAQ,CAAC;YAC/F,IAAI;AACJ,YAAA,MAAM,EAAE,IAAI;YACZ,cAAc,EAAE,QAAQ,CAAC,cAAc;YACvC,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,QAAQ,EAAE,QAAQ,CAAC;SACpB;IACH;IAEQ,qBAAqB,CAC3B,QAA+B,EAC/B,QAAmC,EAAA;QAEnC,OAAO;AACL,YAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG;YACvF,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG;AACpE,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,iBAAiB,EAAE,SAAS;AACvF,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,iBAAiB,EAAE,aAAa;YACxF,WAAW,EACT,QAAQ,EAAE;AACP,mBAAA,QAAQ,CAAC;mBACT,QAAQ,CAAC,iBAAiB,EAAE,eAAe;YAChD,UAAU,EACR,QAAQ,EAAE;AACP,mBAAA,QAAQ,CAAC;mBACT,QAAQ,CAAC,iBAAiB,EAAE,UAAU;YAC3C,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ;YAC5E,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;SACnF;IACH;AAEQ,IAAA,eAAe,CACrB,QAA+B,EAAA;AAE/B,QAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE;AAC3B,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,OAAO,CAAC;AACN,gBAAA,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM;AACrC,gBAAA,GAAG,EAAE,QAAQ,CAAC,aAAa,CAAC,QAAQ;AACpC,gBAAA,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC;AACjC,aAAA,CAAC;IACJ;AAEQ,IAAA,6BAA6B,CAAC,QAA+B,EAAA;AACnE,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;AACpE,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,QAAQ,CAAC,UAAU;IAC5B;IAEQ,gBAAgB,CACtB,QAAkC,EAClC,QAA+B,EAAA;AAE/B,QAAA,IAAI,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE;YACzB,OAAO,QAAQ,CAAC,IAAI;QACtB;AAEA,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE;YAC3B,OAAO,QAAQ,CAAC,MAAM;QACxB;QAEA,IAAI,QAAQ,CAAC,eAAe,EAAE,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE;AACrD,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,SAAS,CAAC;AAE9E,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;AAChB,YAAA,OAAO,EAAE;QACX;QAEA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAE1C,OAAO;AACL,YAAA;AACE,gBAAA,KAAK,EAAE,cAAc;gBACrB,OAAO;AACP,gBAAA,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;AACpF;SACF;IACH;AAEQ,IAAA,gBAAgB,CAAC,KAAc,EAAA;AACrC,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;QAEA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC3B,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;AAE1B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACrC;AAEA,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC;AAE5B,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;AAEA,QAAA,OAAO,EAAE;IACX;AAEQ,IAAA,eAAe,CAAC,IAAyB,EAAA;AAC/C,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAErF,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,KAAK;YAC1B,KAAK;AACL,YAAA,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK;AAClC,SAAA,CAAC,CAAC;IACL;IAEQ,cAAc,CAAC,GAAsB,EAAE,MAAgB,EAAA;QAC7D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAC1C;IACxB;AAEQ,IAAA,eAAe,CAAC,KAAsC,EAAA;AAC5D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACjE;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;YAC1B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAClF;QAEA,OAAO,KAAK,IAAI,EAAE;IACpB;AAEQ,IAAA,cAAc,CAAC,KAAa,EAAA;AAClC,QAAA,OAAO;AACJ,aAAA,OAAO,CAAC,oBAAoB,EAAE,OAAO;AACrC,aAAA,OAAO,CAAC,QAAQ,EAAE,GAAG;AACrB,aAAA,OAAO,CAAC,OAAO,EAAE,SAAS,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;IAC3D;AAEQ,IAAA,UAAU,CAAC,KAAc,EAAA;QAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;AACpD,YAAA,OAAO,SAAS;QAClB;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC;AAEQ,IAAA,aAAa,CAAC,KAAc,EAAA;QAClC,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM;IACpG;AAEQ,IAAA,UAAU,CAAC,KAAc,EAAA;AAC/B,QAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;IACtE;IAEQ,QAAQ,GAAA;AACd,QAAA,OAAO,UAAU,CAAC,MAAM,EAAE,UAAU,IAAI,IAAI,CAAA,EAAG,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,EAAE;IAC9E;IAEQ,YAAY,CAAC,SAAiB,EAAE,MAAc,EAAA;AACpD,QAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,EAAE;IACjC;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AAC7E,QAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO;aACJ,KAAK,CAAC,cAAc;AACpB,aAAA,MAAM,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;aAC1D,KAAK,CAAC,CAAC,EAAE;AACT,aAAA,GAAG,CAAC,OAAO,KAAK;YACf,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AACxC,YAAA,IAAI,OAAO,CAAC,aAAa,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,GAAG,EAAE;AAC1E,SAAA,CAAC,CAAC;IACP;IAEQ,cAAc,GAAA;QACpB,UAAU,CAAC,MAAK;AACd,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE,aAAa;YAEpD,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,YAAY;YAC1C;AACF,QAAA,CAAC,CAAC;IACJ;AAl6BW,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,4EA0BtB,oBAAoB,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AA1BnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,KAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,yBAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5ElC,+n0CAwvBA,EAAA,MAAA,EAAA,CAAA,kw7BAAA,EAAA,6nYAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1rBI,YAAY,8BACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,0FAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,wDAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,aAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEb,0BAA0B,6IAD1B,wBAAwB,EAAA,IAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,CAAA;;4FASf,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAjBjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB;wBACP,YAAY;wBACZ,WAAW;wBACX,YAAY;wBACZ,cAAc;wBACd,aAAa;wBACb,wBAAwB;wBACxB;AACD,qBAAA,EAAA,QAAA,EAAA,+n0CAAA,EAAA,MAAA,EAAA,CAAA,kw7BAAA,EAAA,6nYAAA,CAAA,EAAA;;0BAiCE,MAAM;2BAAC,oBAAoB;;sBAzB7B,SAAS;uBAAC,kBAAkB;;sBAE5B;;sBACA;;sBACA;;sBAGA;;sBAGA;;sBA2CA,YAAY;uBAAC,yBAAyB;;;AElIzC;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-markdown.pipe.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.ts","../../../projects/max-agent-ui/src/lib/components/shift-card/max-agent-shift-card.component.html","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant-support.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialDescription?: string;\n initialSuggestions: string[];\n}\nconst INITIAL_MESSAGE = 'Hi! 👋';\nconst INITIAL_DESCRIPTION =\n \"I'm here to help. Whether you need information, want to complete a task, or just have a question, let me know and we'll get started.\\n\\nI'm still in my early days and learning every day. If I can't do something just yet, I hope you'll bear with me—I'll always do my best to help.\\n\\nWhat would you like to do today?\";\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n nemesys: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n },\n attendance: {\n initialMessage: INITIAL_MESSAGE,\n initialDescription: INITIAL_DESCRIPTION,\n initialSuggestions: []\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport {\n AssistantProduct,\n AssistantRequestContext,\n AssistantUser\n} from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n context?: Partial<AssistantRequestContext> | (() => Partial<AssistantRequestContext>);\n requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { marked } from 'marked';\n\n@Pipe({\n name: 'maxAssistantMarkdown',\n standalone: true,\n pure: true\n})\nexport class MaxAssistantMarkdownPipe implements PipeTransform {\n transform(value: string | null | undefined): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>');\n\n return marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n }\n}\n","import { Component, Input } from '@angular/core';\n\nimport { AssistantShiftCard } from '../../models/assistant.models';\n\nexport type MaxAgentShiftCardVariant = 'definition' | 'rota';\n\n@Component({\n selector: 'max-agent-shift-card',\n templateUrl: './max-agent-shift-card.component.html',\n styleUrl: './max-agent-shift-card.component.scss'\n})\nexport class MaxAgentShiftCardComponent {\n @Input({ required: true }) shift!: AssistantShiftCard;\n @Input() variant: MaxAgentShiftCardVariant = 'rota';\n\n protected get accentColor(): string {\n const color = this.shift.color?.trim();\n if (!color) {\n return '#64748b';\n }\n return /^(?:[0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(color)\n ? `#${color}`\n : color;\n }\n\n protected get timeLabel(): string {\n const formatter = this.variant === 'rota'\n ? this.formatTimeToAmPm\n : this.formatTime;\n const start = formatter(this.shift.startTime);\n const end = formatter(this.shift.endTime);\n return start && end ? `${start} - ${end}` : start || end || 'All day';\n }\n\n protected get departmentLabel(): string {\n const count = this.shift.departments?.length ?? 0;\n return count\n ? `${count} department${count === 1 ? '' : 's'}`\n : 'All departments';\n }\n\n protected get taskLabel(): string {\n const count = this.shift.taskCount ?? 0;\n return `${count} task${count === 1 ? '' : 's'}`;\n }\n\n private formatTime(value: string): string {\n return value.match(/^\\d{2}:\\d{2}/)?.[0] ?? value;\n }\n\n private formatTimeToAmPm(value: string): string {\n const match = value.match(/^(\\d{1,2}):(\\d{2})/);\n if (!match) {\n return value;\n }\n const hour = Number(match[1]);\n const displayHour = ((hour + 11) % 12) + 1;\n return `${displayHour}.${match[2]} ${hour >= 12 ? 'PM' : 'AM'}`;\n }\n}\n","<article\n class=\"max-agent-shift-card\"\n [class.definition-card]=\"variant === 'definition'\"\n [class.rota-card]=\"variant === 'rota'\"\n [style.--max-agent-shift-accent]=\"accentColor\"\n [attr.aria-label]=\"(shift.description || shift.code || 'Shift') + ', ' + timeLabel\"\n>\n <header>\n <strong>{{ timeLabel }}</strong>\n @if(variant === 'definition' && shift.days) {\n <span>{{ shift.days }}</span>\n }\n </header>\n\n @if(variant === 'definition') {\n @if(shift.code) {\n <p><i class=\"pi pi-tag\" aria-hidden=\"true\"></i><span>{{ shift.code }}</span></p>\n }\n @if(shift.description) {\n <p><i class=\"pi pi-align-left\" aria-hidden=\"true\"></i><span>{{ shift.description }}</span></p>\n }\n <p><i class=\"pi pi-building\" aria-hidden=\"true\"></i><span>{{ departmentLabel }}</span></p>\n @if((shift.taskCount ?? 0) > 0) {\n <p><i class=\"pi pi-check-square\" aria-hidden=\"true\"></i><span>{{ taskLabel }}</span></p>\n }\n } @else {\n @if(shift.location) {\n <p><i class=\"pi pi-map-marker\" aria-hidden=\"true\"></i><span>{{ shift.location }}</span></p>\n }\n @if(shift.role) {\n <p><i class=\"pi pi-user\" aria-hidden=\"true\"></i><span>{{ shift.role }}</span></p>\n }\n }\n</article>\n","import { 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 {\n AssistantChatRequest,\n AssistantChatProgress,\n AssistantChatResponse,\n AssistantChatStreamEvent,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantStructuredAction,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_ASSISTANT_CHAT_URL = '/agent-api/v1/chat';\nconst DEFAULT_APP = 'cortex';\nconst DEFAULT_TIMEZONE = 'UTC';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n confirmation?: AssistantConfirmation,\n history: AssistantConversationMessage[] = [],\n onProgress?: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n ...(onProgress ? { stream: true } : {}),\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n context: this.getContext(assistantConfig),\n ...(confirmation ? { confirmation } : {})\n };\n\n return this.postMessage(request, assistantConfig, onProgress);\n }\n\n confirmAction(\n actionId: number,\n decision: AssistantConfirmation['decision'],\n conversationId: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n return this.sendMessage(\n decision === 'approve' ? 'Approve action' : 'Reject action',\n conversationId,\n config,\n { actionId, decision },\n history\n );\n }\n\n sendStructuredAction(\n message: string,\n action: AssistantStructuredAction,\n conversationId?: string,\n config: MaxAssistantConfig = {},\n history: AssistantConversationMessage[] = []\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n conversationId,\n history,\n app: this.getApp(assistantConfig),\n context: this.getContext(assistantConfig),\n structuredAction: action\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress?: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n if (onProgress) {\n return this.streamMessage(request, config, onProgress);\n }\n\n return this.http.post<AssistantChatResponse>(\n this.getChatUrl(config),\n request,\n { headers: this.getHeaders(config) }\n );\n }\n\n private streamMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig,\n onProgress: (progress: AssistantChatProgress) => void\n ): Observable<AssistantChatResponse> {\n return new Observable(subscriber => {\n const controller = new AbortController();\n const headers = this.getHeaders(config);\n const fetchHeaders = Object.fromEntries(\n headers.keys().map(name => [name, headers.get(name) ?? ''])\n );\n\n void fetch(this.getChatUrl(config), {\n method: 'POST',\n headers: fetchHeaders,\n body: JSON.stringify(request),\n signal: controller.signal\n }).then(async response => {\n if (!response.ok) {\n const error = await response.json().catch(() => undefined);\n throw new HttpErrorResponse({\n error,\n status: response.status,\n statusText: response.statusText,\n url: response.url\n });\n }\n\n if (!response.body) {\n throw new Error('The assistant response stream was unavailable.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n let receivedResult = false;\n\n const processLine = (line: string) => {\n const trimmedLine = line.trim();\n if (!trimmedLine) {\n return;\n }\n\n const event = JSON.parse(trimmedLine) as AssistantChatStreamEvent;\n if (event.type === 'progress') {\n onProgress(event);\n return;\n }\n if (event.type === 'error') {\n throw new Error(event.message);\n }\n\n receivedResult = true;\n subscriber.next(event.response);\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n lines.forEach(processLine);\n }\n\n buffer += decoder.decode();\n processLine(buffer);\n\n if (!receivedResult) {\n throw new Error('The assistant response stream ended before a result was returned.');\n }\n\n subscriber.complete();\n }).catch(error => {\n if (!subscriber.closed && error?.name !== 'AbortError') {\n subscriber.error(error);\n }\n });\n\n return () => controller.abort();\n });\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || DEFAULT_ASSISTANT_CHAT_URL;\n }\n\n private getApp(config: MaxAssistantConfig): AssistantProduct {\n return config.app || DEFAULT_APP;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n if (typeof config.user === 'function') {\n return config.user();\n }\n\n return config.user ?? {};\n }\n\n private getContext(config: MaxAssistantConfig): AssistantRequestContext {\n const configured = typeof config.context === 'function'\n ? config.context()\n : config.context ?? {};\n\n return {\n permissions: configured.permissions ?? [],\n timezone: configured.timezone\n ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n ?? DEFAULT_TIMEZONE,\n ...(configured.tenantId ? { tenantId: configured.tenantId } : {}),\n ...(configured.organisationId\n ? { organisationId: configured.organisationId }\n : {}),\n ...(configured.userId ? { userId: configured.userId } : {}),\n ...(configured.role ? { role: configured.role } : {}),\n ...(configured.route ? { route: configured.route } : {}),\n ...(configured.module ? { module: configured.module } : {})\n };\n }\n\n private getHeaders(config: MaxAssistantConfig): HttpHeaders {\n const user = this.getUser(config);\n let headers = new HttpHeaders({ 'Content-Type': 'application/json' });\n const configuredHeaders = typeof config.requestHeaders === 'function'\n ? config.requestHeaders()\n : config.requestHeaders ?? {};\n\n for (const [name, value] of Object.entries(configuredHeaders)) {\n const trimmedName = name.trim();\n const trimmedValue = value.trim();\n\n if (trimmedName && trimmedValue) {\n headers = headers.set(trimmedName, trimmedValue);\n }\n }\n\n if (user.token) {\n headers = headers.set('x-cortex-auth-token', String(user.token));\n }\n\n if (user.version) {\n headers = headers.set('x-cortex-version', String(user.version));\n }\n\n return headers;\n }\n\n private compactConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n return Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined)\n ) as MaxAssistantConfig;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Observable, of } from 'rxjs';\n\nimport {\n AssistantSupportTag,\n AssistantSupportTicketRequest,\n AssistantSupportTicketResponse\n} from '../../models/assistant.models';\n\nconst MOCK_SUPPORT_TAGS: AssistantSupportTag[] = [\n { value: 'scheduling', label: 'Scheduling & Rotas', icon: 'pi pi-calendar', severity: 'info' },\n { value: 'timesheets', label: 'Timesheets', icon: 'pi pi-clock', severity: 'secondary' },\n { value: 'clocking', label: 'Clocking & Attendance', icon: 'pi pi-stopwatch', severity: 'warn' },\n { value: 'people', label: 'People', icon: 'pi pi-user', severity: 'info' },\n { value: 'teams-locations', label: 'Teams & Locations', icon: 'pi pi-building', severity: 'secondary' },\n { value: 'holiday', label: 'Holiday & Time Off', icon: 'pi pi-sun', severity: 'success' },\n { value: 'payroll', label: 'Payroll & Pay', icon: 'pi pi-wallet', severity: 'success' },\n { value: 'reporting', label: 'Reporting & Insights', icon: 'pi pi-chart-bar', severity: 'info' },\n { value: 'configuration', label: 'Configuration', icon: 'pi pi-cog', severity: 'secondary' },\n { value: 'permissions', label: 'Permissions & Access', icon: 'pi pi-shield', severity: 'warn' },\n { value: 'performance', label: 'Performance', icon: 'pi pi-chart-line', severity: 'success' },\n { value: 'technical', label: 'Technical Issue', icon: 'pi pi-wrench', severity: 'danger' }\n];\n\nlet mockTicketSequence = 1000;\n\n@Injectable({ providedIn: 'root' })\nexport class MaxAssistantSupportService {\n readonly tagsEndpoint = 'selection/support-tags';\n readonly ticketsEndpoint = 'support/tickets';\n\n getSupportTags(): Observable<AssistantSupportTag[]> {\n return of(MOCK_SUPPORT_TAGS.map(tag => ({ ...tag })));\n }\n\n submitTicket(\n _ticket: AssistantSupportTicketRequest\n ): Observable<AssistantSupportTicketResponse> {\n mockTicketSequence += 1;\n\n return of({\n success: true,\n ticketReference: `MAX-DEMO-${mockTicketSequence}`,\n message: 'Your support ticket has been raised successfully.',\n submittedAt: new Date().toISOString()\n });\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport {\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n HostListener,\n Inject,\n Input,\n isDevMode,\n OnInit,\n Output,\n signal,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { MultiSelectModule } from 'primeng/multiselect';\nimport { SelectModule } from 'primeng/select';\nimport { TagModule } from 'primeng/tag';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { of, switchMap } from 'rxjs';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig\n} from '../../config/assistant-bootstrap.config';\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatResponse,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantDeveloperTrace,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantHostAction,\n AssistantMessage,\n AssistantProduct,\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantSearchResult,\n AssistantSuggestion,\n AssistantSupportTag,\n AssistantSupportTagSeverity,\n AssistantSupportTicketResponse,\n AssistantSupportTicketSeverity,\n AssistantTraceStep,\n AssistantUser,\n AssistantVisualisation\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\nimport { MaxAssistantSupportService } from './max-assistant-support.service';\nimport { MaxAssistantMarkdownPipe } from './max-assistant-markdown.pipe';\nimport { MaxAgentShiftCardComponent } from '../shift-card/max-agent-shift-card.component';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max',\n subtitle: 'Your Personal AI Assistant',\n clearLabel: 'Start a new session',\n clearTooltip: 'Start a new session',\n closeLabel: 'Close AI assistant',\n closeTooltip: 'Close AI assistant',\n placeholder: 'Ask Max',\n startingMessage: 'Understanding your request…',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\n};\n\nconst ASSISTANT_SEARCH_RESULT_ICONS: Readonly<Record<string, string>> = {\n EMPLOYEE: 'pi pi-user',\n PERSON: 'pi pi-user',\n TEAM: 'pi pi-users',\n SCHEDULE: 'pi pi-calendar',\n LOCATION: 'pi pi-map-marker',\n POSITION: 'pi pi-briefcase',\n TIMESHEET: 'pi pi-clock',\n CONFIGTEAM: 'pi pi-cog',\n CONFIGLOCATION: 'pi pi-cog',\n DEFAULT: 'pi pi-search'\n};\n\ninterface SupportTicketFormValue {\n name: string;\n email: string;\n phone: string;\n query: string;\n severity: AssistantSupportTicketSeverity;\n tags: string[];\n}\n\n@Component({\n selector: 'max-assistant',\n imports: [\n CommonModule,\n FormsModule,\n ButtonModule,\n MultiSelectModule,\n SelectModule,\n TagModule,\n TextareaModule,\n TooltipModule,\n MaxAssistantMarkdownPipe,\n MaxAgentShiftCardComponent\n ],\n templateUrl: './max-assistant.component.html',\n encapsulation: ViewEncapsulation.Emulated,\n styleUrls: [\n './max-assistant.component.scss',\n './max-assistant.workspace.scss'\n ]\n})\nexport class MaxAssistantComponent implements OnInit {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n @ViewChild('composerInput') private composerInput?: ElementRef<HTMLTextAreaElement>;\n @ViewChild('supportQueryInput') private supportQueryInput?: ElementRef<HTMLTextAreaElement>;\n\n @Input() app?: AssistantProduct;\n @Input() assistantApiUrl?: string;\n @Input() user?:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>);\n @Input() context?:\n | Partial<AssistantRequestContext>\n | (() => Partial<AssistantRequestContext>);\n @Input() requestHeaders?:\n | Record<string, string>\n | (() => Record<string, string>);\n @Output() hostAction = new EventEmitter<AssistantHostAction>();\n @Output() closeRequested = new EventEmitter<void>();\n\n protected readonly isSending = signal(false);\n protected readonly input = signal('');\n protected readonly conversationId = signal<string | undefined>(undefined);\n protected readonly messages = signal<AssistantMessage[]>([]);\n protected readonly expandedDetailMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly expandedTraceStepKeys = signal<ReadonlySet<string>>(new Set<string>());\n protected readonly developerDetailsEnabled = isDevMode();\n protected readonly supportTicketVisible = signal(false);\n protected readonly supportTicketSubmitting = signal(false);\n protected readonly supportTagsLoading = signal(false);\n protected readonly supportTags = signal<AssistantSupportTag[]>([]);\n protected readonly supportTicketResult = signal<AssistantSupportTicketResponse | undefined>(\n undefined\n );\n protected readonly supportTicketError = signal<string | undefined>(undefined);\n protected readonly supportSeverityOptions: Array<{\n label: string;\n value: AssistantSupportTicketSeverity;\n severity: AssistantSupportTagSeverity;\n }> = [\n { label: 'Low', value: 'low', severity: 'success' },\n { label: 'Medium', value: 'medium', severity: 'info' },\n { label: 'High', value: 'high', severity: 'warn' },\n { label: 'Critical', value: 'critical', severity: 'danger' }\n ];\n protected supportTicketForm: SupportTicketFormValue = this.createSupportTicketForm();\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly 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.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.closeSupportTicket(false);\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedDetailMessageIds.set(new Set<string>());\n this.expandedTraceStepKeys.set(new Set<string>());\n this.messages.set(this.createDefaultMessages());\n this.scrollToLatest();\n }\n\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\n if (!trimmedMessage || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n const streamingMessage = {\n ...this.createMessage('assistant', this.uiCopy.startingMessage),\n isStreaming: true\n };\n this.appendMessage(streamingMessage);\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(\n trimmedMessage,\n this.conversationId(),\n this.getAssistantConfig(),\n undefined,\n history,\n progress => this.updateStreamingMessage(streamingMessage.id, progress.message)\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.replaceMessage(\n streamingMessage.id,\n this.createAssistantResponseMessage(response, trimmedMessage)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.replaceMessage(streamingMessage.id, {\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected suggestionLabel(suggestion: AssistantSuggestion): string {\n return typeof suggestion === 'string' ? suggestion : suggestion.label;\n }\n\n protected 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 const user = this.getConfiguredUser();\n this.supportTicketForm = this.createSupportTicketForm(user);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n this.supportTags.set([]);\n this.supportTagsLoading.set(true);\n this.supportTicketVisible.set(true);\n\n this.supportService\n .getSupportTags()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: tags => {\n this.supportTags.set(tags);\n this.supportTagsLoading.set(false);\n },\n error: () => {\n this.supportTagsLoading.set(false);\n this.supportTicketError.set('Support tags could not be loaded. You can still submit the ticket.');\n }\n });\n\n setTimeout(() => this.supportQueryInput?.nativeElement.focus());\n }\n\n protected closeSupportTicket(restoreComposerFocus = true): void {\n this.supportTicketVisible.set(false);\n this.supportTicketSubmitting.set(false);\n this.supportTicketResult.set(undefined);\n this.supportTicketError.set(undefined);\n\n if (restoreComposerFocus) {\n setTimeout(() => this.focusComposer());\n }\n }\n\n protected canSubmitSupportTicket(): boolean {\n return Boolean(\n this.supportTicketForm.name.trim() &&\n this.supportTicketForm.email.trim() &&\n this.supportTicketForm.query.trim() &&\n this.supportTicketForm.severity &&\n !this.supportTicketSubmitting()\n );\n }\n\n protected submitSupportTicket(): void {\n if (!this.canSubmitSupportTicket()) {\n return;\n }\n\n this.supportTicketSubmitting.set(true);\n this.supportTicketError.set(undefined);\n this.supportService\n .submitTicket({\n name: this.supportTicketForm.name.trim(),\n email: this.supportTicketForm.email.trim(),\n ...(this.supportTicketForm.phone.trim()\n ? { phone: this.supportTicketForm.phone.trim() }\n : {}),\n query: this.supportTicketForm.query.trim(),\n severity: this.supportTicketForm.severity,\n tags: [...this.supportTicketForm.tags],\n app: this.app ?? this.defaultConfig.app ?? 'nemesys'\n })\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: result => {\n this.supportTicketResult.set(result);\n this.supportTicketSubmitting.set(false);\n },\n error: () => {\n this.supportTicketSubmitting.set(false);\n this.supportTicketError.set(\n 'The ticket could not be submitted. Please check the details and try again.'\n );\n }\n });\n }\n\n protected searchResultIcon(type: string): string {\n return ASSISTANT_SEARCH_RESULT_ICONS[type.trim().toUpperCase()]\n ?? ASSISTANT_SEARCH_RESULT_ICONS['DEFAULT'];\n }\n\n protected searchActionIcon(action: AssistantSearchResult['actions'][number]): string {\n const linkType = action.hostAction.payload['linkType'];\n return this.searchResultIcon(typeof linkType === 'string' ? linkType : action.label);\n }\n\n protected getTableRowActions(\n table: AssistantResponseTable,\n rowIndex: number\n ): AssistantResponseTableAction[] {\n return table.actions?.filter(action => action.rowIndex === rowIndex) ?? [];\n }\n\n protected useTableAction(action: AssistantResponseTableAction) {\n const label = action.label.trim();\n if (!label || this.isSending()) {\n return;\n }\n\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', label));\n this.isSending.set(true);\n this.assistantService\n .sendStructuredAction(\n action.message,\n action.structuredAction,\n this.conversationId(),\n this.getAssistantConfig(),\n history\n )\n .pipe(\n switchMap(response => {\n if (!action.confirmOnClick || !response.pendingAction) {\n return of(response);\n }\n return this.assistantService.confirmAction(\n response.pendingAction.id,\n 'approve',\n response.conversationId,\n this.getAssistantConfig(),\n history\n );\n }),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(\n this.createAssistantResponseMessage(response, action.message)\n );\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected resolvePendingAction(\n message: AssistantMessage,\n decision: AssistantConfirmation['decision']\n ) {\n const pendingAction = message.pendingAction;\n const currentConversationId = this.conversationId();\n\n if (\n !pendingAction ||\n !currentConversationId ||\n message.actionDecision ||\n this.isSending()\n ) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: decision } : item\n )\n );\n const userMessage = decision === 'approve'\n ? `Approve: ${pendingAction.summary}`\n : `Reject: ${pendingAction.summary}`;\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', userMessage));\n this.isSending.set(true);\n\n this.assistantService\n .confirmAction(\n pendingAction.id,\n decision,\n currentConversationId,\n this.getAssistantConfig(),\n history\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, userMessage));\n this.isSending.set(false);\n },\n error: error => {\n this.messages.update(messages =>\n messages.map(item =>\n item.id === message.id ? { ...item, actionDecision: undefined } : item\n )\n );\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n private resolveErrorMessage(error: unknown): string {\n if (\n error instanceof HttpErrorResponse &&\n typeof error.error === 'object' &&\n error.error !== null &&\n 'message' in error.error &&\n typeof error.error.message === 'string' &&\n error.error.message.trim()\n ) {\n return error.error.message.trim();\n }\n return this.uiCopy.errorMessage;\n }\n\n protected onComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage();\n }\n }\n\n protected isDetailsVisible(messageId: string): boolean {\n return this.expandedDetailMessageIds().has(messageId);\n }\n\n protected toggleDetails(messageId: string, initialStepId?: number) {\n const opening = !this.isDetailsVisible(messageId);\n this.expandedDetailMessageIds.set(\n opening ? new Set([messageId]) : new Set<string>()\n );\n this.expandedTraceStepKeys.set(\n opening && initialStepId !== undefined\n ? new Set([this.traceStepKey(messageId, initialStepId)])\n : new Set<string>()\n );\n }\n\n protected isTraceStepExpanded(messageId: string, stepId: number): boolean {\n return this.expandedTraceStepKeys().has(this.traceStepKey(messageId, stepId));\n }\n\n protected toggleTraceStep(messageId: string, stepId: number) {\n const key = this.traceStepKey(messageId, stepId);\n this.expandedTraceStepKeys.update(expandedKeys => {\n const next = new Set(expandedKeys);\n if (next.has(key)) {\n next.delete(key);\n } else {\n next.add(key);\n }\n return next;\n });\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n protected chartTotal(visualisation: AssistantVisualisation): number {\n return visualisation.values.reduce(\n (total, value) => total + Math.max(0, Number(value) || 0),\n 0\n );\n }\n\n protected chartColor(visualisation: AssistantVisualisation, index: number): string {\n const fallback = ['#42A5F5', '#FFA5F5', '#66BB6A', '#FFA726', '#228888'];\n return visualisation.colors?.[index] ?? fallback[index % fallback.length];\n }\n\n protected doughnutDashArray(\n visualisation: AssistantVisualisation,\n index: number\n ): string {\n const percentage = this.chartPercentage(visualisation, index);\n return `${percentage} ${100 - percentage}`;\n }\n\n protected doughnutDashOffset(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n return -visualisation.values\n .slice(0, index)\n .reduce(\n (total, _value, valueIndex) =>\n total + this.chartPercentage(visualisation, valueIndex),\n 0\n );\n }\n\n protected barWidth(visualisation: AssistantVisualisation, index: number): number {\n const maximum = Math.max(0, ...visualisation.values.map(value => Number(value) || 0));\n if (!maximum) {\n return 0;\n }\n return Math.max(0, ((Number(visualisation.values[index]) || 0) / maximum) * 100);\n }\n\n protected chartAriaLabel(visualisation: AssistantVisualisation): string {\n const values = visualisation.labels.map(\n (label, index) => `${label}: ${Number(visualisation.values[index]) || 0}`\n );\n return `${visualisation.title} diversity chart. ${values.join(', ')}.`;\n }\n\n private chartPercentage(\n visualisation: AssistantVisualisation,\n index: number\n ): number {\n const total = this.chartTotal(visualisation);\n return total\n ? (Math.max(0, Number(visualisation.values[index]) || 0) / total) * 100\n : 0;\n }\n\n protected formatTraceValue(value: AssistantFieldValue | undefined): string {\n return JSON.stringify(value, null, 2);\n }\n\n protected traceMap(value: AssistantFieldValue | undefined): AssistantFieldMap | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value\n : undefined;\n }\n\n protected traceMapField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldMap | undefined {\n return this.traceMap(this.traceMap(value)?.[key]);\n }\n\n protected traceArrayField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue[] {\n const field = this.traceMap(value)?.[key];\n return Array.isArray(field) ? field : [];\n }\n\n protected traceField(\n value: AssistantFieldValue | undefined,\n key: string\n ): AssistantFieldValue | undefined {\n return this.traceMap(value)?.[key];\n }\n\n protected traceEntries(\n value: AssistantFieldValue | AssistantFieldMap | undefined,\n excludedKeys: string[] = []\n ): Array<{ key: string; label: string; value: AssistantFieldValue }> {\n const record = this.traceMap(value);\n const excluded = new Set(excludedKeys.map(key => key.toLocaleLowerCase()));\n return record\n ? Object.entries(record)\n .filter(\n ([key, entry]) =>\n entry !== undefined && !excluded.has(key.toLocaleLowerCase())\n )\n .map(([key, entry]) => ({\n key,\n label: this.formatTraceLabel(key),\n value: entry\n }))\n : [];\n }\n\n protected formatTraceLabel(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n protected formatTraceScalar(value: AssistantFieldValue | undefined): string {\n if (value === null) {\n return 'None';\n }\n if (value === undefined) {\n return 'Not supplied';\n }\n if (typeof value === 'boolean') {\n return value ? 'Yes' : 'No';\n }\n if (typeof value === 'number') {\n return Number.isInteger(value) ? String(value) : value.toFixed(6);\n }\n if (typeof value === 'string') {\n return value || 'Empty';\n }\n return JSON.stringify(value);\n }\n\n protected formatSimilarity(value: AssistantFieldValue | undefined): string {\n return typeof value === 'number' ? value.toFixed(4) : '—';\n }\n\n protected getHttpStatus(step: AssistantTraceStep): number | undefined {\n const output = this.traceMap(step.output);\n const http = this.traceMap(output?.['http']);\n const status = http?.['statusCode'] ?? output?.['statusCode'] ?? step.error?.statusCode;\n return typeof status === 'number' ? status : undefined;\n }\n\n protected isHttpSuccessful(step: AssistantTraceStep): boolean {\n const status = this.getHttpStatus(step);\n return status !== undefined && status >= 200 && status < 300;\n }\n\n protected traceStepTone(step: AssistantTraceStep): AssistantTraceStep['status'] {\n return step.category === 'api_call' && this.isHttpSuccessful(step)\n ? 'succeeded'\n : step.status;\n }\n\n protected traceStepStatus(step: AssistantTraceStep): string {\n if (step.category === 'api_call') {\n const status = this.getHttpStatus(step);\n if (status !== undefined) {\n return `HTTP ${status} ${this.isHttpSuccessful(step) ? 'Success' : 'Error'}`;\n }\n return step.status === 'failed' ? 'Transport failed' : 'Completed';\n }\n return step.status === 'succeeded'\n ? 'Completed'\n : step.status === 'failed'\n ? 'Stopped'\n : 'Running';\n }\n\n protected formatTraceCategory(category: string): string {\n const labels: Record<string, string> = {\n request: 'Request intake',\n intent_projection: 'Intent generalisation',\n embedding: 'Intent embedding',\n capability_routing: 'Capability matching',\n argument_extraction: 'Argument extraction',\n api_call: 'Nemesys API',\n action: 'Workflow outcome',\n response: 'Assistant response'\n };\n return labels[category] ?? this.formatTraceLabel(category);\n }\n\n private getAssistantConfig(): MaxAssistantConfig {\n const config: MaxAssistantConfig = {};\n\n if (this.assistantApiUrl) {\n config.assistantApiUrl = this.assistantApiUrl;\n }\n\n if (this.app) {\n config.app = this.app;\n }\n\n if (this.user) {\n config.user = this.user;\n }\n\n if (this.context) {\n config.context = this.context;\n }\n\n if (this.requestHeaders) {\n config.requestHeaders = this.requestHeaders;\n }\n\n return config;\n }\n\n private appendMessage(message: AssistantMessage) {\n this.messages.update(messages => [...messages, message]);\n this.scrollToLatest();\n }\n\n private updateStreamingMessage(messageId: string, content: string) {\n const trimmedContent = content.trim();\n if (!trimmedContent) {\n return;\n }\n\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId && message.isStreaming\n ? { ...message, content: trimmedContent }\n : message\n )\n );\n this.scrollToLatest();\n }\n\n private replaceMessage(messageId: string, replacement: AssistantMessage) {\n this.messages.update(messages =>\n messages.map(message =>\n message.id === messageId\n ? { ...replacement, id: messageId, isStreaming: false }\n : message\n )\n );\n this.scrollToLatest();\n }\n\n private createDefaultMessages(): AssistantMessage[] {\n if (!this.bootstrapConfig.initialMessage) {\n return [];\n }\n\n return [\n this.createMessage(\n 'assistant',\n this.getInitialMessage(this.bootstrapConfig.initialMessage),\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private getInitialMessage(initialMessage: string): string {\n const user = this.getConfiguredUser();\n const preferredName = [\n user?.['firstName'],\n user?.['firstname'],\n user?.['displayName'],\n user?.['name'],\n user?.['username']\n ].find(value => typeof value === 'string' && value.trim());\n\n if (typeof preferredName !== 'string') {\n return initialMessage;\n }\n\n const firstName = preferredName\n .trim()\n .split(/\\s|@/)[0];\n\n if (!firstName) {\n return initialMessage;\n }\n\n if (initialMessage.startsWith('Hi!')) {\n return initialMessage.replace(/^Hi!/, `Hi ${firstName}!`);\n }\n\n return initialMessage.replace(/^Hello,/, `Hello ${firstName},`);\n }\n\n private getConfiguredUser(): Partial<AssistantUser> | undefined {\n const configuredUser = this.user ?? this.defaultConfig.user;\n return typeof configuredUser === 'function'\n ? configuredUser()\n : configuredUser;\n }\n\n private createSupportTicketForm(\n user?: Partial<AssistantUser>\n ): SupportTicketFormValue {\n return {\n name: this.getUserText(user, [\n 'displayName',\n 'name',\n 'username',\n 'firstName',\n 'firstname'\n ]),\n email: this.getUserText(user, ['email', 'emailAddress']),\n phone: this.getUserText(user, ['phone', 'phoneNumber', 'mobile']),\n query: '',\n severity: 'medium',\n tags: []\n };\n }\n\n private getUserText(\n user: Partial<AssistantUser> | undefined,\n keys: string[]\n ): string {\n const value = keys\n .map(key => user?.[key])\n .find(field => typeof field === 'string' && field.trim());\n return typeof value === 'string' ? value.trim() : '';\n }\n\n private createAssistantResponseMessage(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantMessage {\n const displayResponse = this.createDisplayResponse(response, userQuery);\n\n return this.createMessage(\n 'assistant',\n displayResponse.agentInferredResponse || response.answer,\n response.suggestions,\n response.sources,\n response.intent,\n response.intentLabel,\n response.app ?? response.product,\n response.productLabel,\n response.apiModule ?? response.contextResolution?.moduleKey,\n response.confidence ?? response.contextResolution?.confidence,\n response.parameters ?? response.entities,\n response.apiCalls ?? this.getToolApiCalls(response),\n response.apiResult,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse,\n response.status,\n response.pendingAction,\n response.toolExecution,\n response.cards,\n response.contextResolution.capabilityKey,\n response.developerTrace\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: AssistantSuggestion[] = [],\n sources: AssistantMessage['sources'] = [],\n intent?: string,\n intentLabel?: string,\n app?: string,\n productLabel?: string,\n apiModule?: string,\n confidence?: number,\n parameters?: AssistantFieldMap,\n apiCalls?: AssistantMessage['apiCalls'],\n apiResult?: AssistantFieldMap,\n mockResult?: AssistantFieldMap,\n llmUsed?: boolean,\n availableModules?: string[],\n displayResponse?: AssistantDisplayResponse,\n status?: AssistantChatResponse['status'],\n pendingAction?: AssistantMessage['pendingAction'],\n toolExecution?: AssistantMessage['toolExecution'],\n cards?: AssistantMessage['cards'],\n capabilityKey?: string,\n developerTrace?: AssistantDeveloperTrace\n ): AssistantMessage {\n return {\n id: this.createId(),\n role,\n content,\n displayResponse,\n formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),\n formattedApiHeaders: this.formatJson(displayResponse?.agentExtractedIntent?.api?.headers),\n formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\n formattedSampleJsonResponse: this.formatJson(displayResponse?.sampleJsonResponse),\n suggestions,\n sources,\n intent,\n intentLabel,\n app,\n productLabel,\n apiModule,\n confidence,\n parameters,\n entities: parameters,\n apiCalls,\n apiResult,\n mockResult,\n llmUsed,\n availableModules,\n status,\n pendingAction,\n toolExecution,\n cards,\n capabilityKey,\n developerTrace,\n createdAt: new Date()\n };\n }\n\n private createDisplayResponse(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantDisplayResponse {\n const provided = response.displayResponse ?? {};\n const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);\n const grid = this.getDisplayTables(provided, response);\n\n return {\n userQuery: provided.userQuery || userQuery,\n agentInferredResponse: provided.agentInferredResponse || response.answer,\n agentExtractedIntent: extractedIntent,\n apiResponse: provided.apiResponse ?? response.apiResult,\n sampleJsonResponse: provided.sampleJsonResponse ?? this.getSampleJsonResponseFallback(response),\n grid,\n tables: grid,\n searchResults: provided.searchResults,\n visualisations: provided.visualisations,\n shiftCardGroups: provided.shiftCardGroups,\n rota: provided.rota,\n markdown: provided.markdown\n };\n }\n\n private createExtractedIntent(\n response: AssistantChatResponse,\n provided?: AssistantExtractedIntent\n ): AssistantExtractedIntent {\n return {\n project: provided?.project ?? response.productLabel ?? response.product ?? response.app,\n projectKey: provided?.projectKey ?? response.product ?? response.app,\n module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,\n intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,\n intentLabel:\n provided?.intentLabel\n ?? response.intentLabel\n ?? response.contextResolution?.capabilityLabel,\n confidence:\n provided?.confidence\n ?? response.confidence\n ?? response.contextResolution?.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]\n };\n }\n\n private getToolApiCalls(\n response: AssistantChatResponse\n ): AssistantMessage['apiCalls'] | undefined {\n if (!response.toolExecution) {\n return undefined;\n }\n\n return [{\n method: response.toolExecution.method,\n url: response.toolExecution.endpoint,\n purpose: response.toolExecution.toolName\n }];\n }\n\n private getSampleJsonResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\n return undefined;\n }\n\n return response.mockResult;\n }\n\n private getDisplayTables(\n provided: AssistantDisplayResponse,\n response: AssistantChatResponse\n ): AssistantResponseTable[] {\n if (provided.grid?.length) {\n return provided.grid;\n }\n\n if (provided.tables?.length) {\n return provided.tables;\n }\n\n if (provided.shiftCardGroups?.length || provided.rota) {\n return [];\n }\n\n const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);\n\n if (!rows.length) {\n return [];\n }\n\n const columns = this.getTableColumns(rows);\n\n return [\n {\n title: 'API Response',\n columns,\n rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))\n }\n ];\n }\n\n private extractTableRows(value: unknown): AssistantFieldMap[] {\n if (Array.isArray(value)) {\n return value.filter(this.isFieldMap);\n }\n\n if (!this.isFieldMap(value)) {\n return [];\n }\n\n const body = value['body'];\n\n if (Array.isArray(body)) {\n return body.filter(this.isFieldMap);\n }\n\n const items = value['items'];\n\n if (Array.isArray(items)) {\n return items.filter(this.isFieldMap);\n }\n\n return [];\n }\n\n private getTableColumns(rows: AssistantFieldMap[]): AssistantResponseTable['columns'] {\n const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);\n\n return fields.map(field => ({\n field,\n header: this.toColumnHeader(field)\n }));\n }\n\n private formatTableRow(row: AssistantFieldMap, fields: string[]): AssistantFieldMap {\n return Object.fromEntries(\n fields.map(field => [field, this.formatCellValue(row[field])])\n ) as AssistantFieldMap;\n }\n\n private formatCellValue(value: AssistantFieldValue | undefined): AssistantFieldValue {\n if (Array.isArray(value)) {\n return value.map(item => this.formatCellValue(item)).join(', ');\n }\n\n if (this.isFieldMap(value)) {\n return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);\n }\n\n return value ?? '';\n }\n\n private toColumnHeader(field: string): string {\n return field\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n private formatJson(value: unknown): string | undefined {\n if (value === undefined || this.isEmptyObject(value)) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\n }\n\n private isEmptyObject(value: unknown): boolean {\n return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;\n }\n\n private isFieldMap(value: unknown): value is AssistantFieldMap {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\n }\n\n private traceStepKey(messageId: string, stepId: number): string {\n return `${messageId}:${stepId}`;\n }\n\n private getConversationHistory(): AssistantConversationMessage[] {\n const messages = this.messages();\n const firstUserIndex = messages.findIndex(message => message.role === 'user');\n if (firstUserIndex < 0) {\n return [];\n }\n\n return messages\n .slice(firstUserIndex)\n .filter(message => !message.isError && !message.isStreaming)\n .slice(-20)\n .map(message => ({\n role: message.role,\n content: message.content.slice(0, 4_000),\n ...(message.capabilityKey ? { capabilityKey: message.capabilityKey } : {})\n }));\n }\n\n private scrollToLatest() {\n setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n });\n }\n}\n","<aside\n class=\"assistant-window\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"region\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\n <i class=\"max-assistant-sparkles far fa-sparkles\" aria-hidden=\"true\"></i>\n <div class=\"assistant-identity\">\n <h2 class=\"assistant-name\">{{ uiCopy.title }}</h2>\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\n </div>\n <div class=\"assistant-header-actions\">\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n >\n <i class=\"header-action-icon pi pi-refresh\" aria-hidden=\"true\"></i>\n </button>\n <button\n type=\"button\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n [pTooltip]=\"uiCopy.closeTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"requestClose()\"\n >\n <i class=\"header-action-icon pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article\n class=\"message {{ message.role }}\"\n [class.welcome-message]=\"isWelcomeMessage(message)\"\n [class.welcome]=\"isWelcomeState(message)\"\n [class.error]=\"message.isError\"\n [class.streaming]=\"message.isStreaming\"\n [attr.aria-live]=\"message.isStreaming ? 'polite' : null\"\n [attr.aria-busy]=\"message.isStreaming || null\"\n [attr.role]=\"message.isStreaming ? 'status' : null\"\n >\n @if(message.isStreaming) {\n <p class=\"streaming-progress\">{{ message.content }}</p>\n } @else if(message.displayResponse; as responseDetails) {\n <div\n class=\"assistant-result assistant-markdown\"\n [innerHTML]=\"(responseDetails.markdown || responseDetails.agentInferredResponse || message.content) | maxAssistantMarkdown\"\n ></div>\n @if(message.cards?.length) {\n <div class=\"assistant-cards\">\n @for(card of message.cards ?? []; track $index) {\n <section class=\"assistant-card\">\n <header>\n <strong>{{ card.title }}</strong>\n @if(card.subtitle) {\n <span>{{ card.subtitle }}</span>\n }\n </header>\n <div class=\"assistant-card-metrics\">\n @for(metric of card.metrics; track metric.label) {\n <div class=\"assistant-card-metric\" [attr.data-tone]=\"metric.tone || 'default'\">\n <span>{{ metric.label }}</span>\n <strong>{{ metric.value }}</strong>\n </div>\n }\n </div>\n @if(card.footer) {\n <footer>{{ card.footer }}</footer>\n }\n </section>\n }\n </div>\n }\n @if(responseDetails.searchResults?.length) {\n <div class=\"assistant-cards assistant-search-results\" aria-label=\"Search results\">\n @for(result of responseDetails.searchResults ?? []; track $index) {\n <section class=\"assistant-card assistant-search-result\">\n <header>\n <i\n class=\"assistant-search-result-icon\"\n [class]=\"searchResultIcon(result.type)\"\n aria-hidden=\"true\"\n ></i>\n <div class=\"assistant-search-result-copy\">\n <strong>{{ result.title }}</strong>\n <span>{{ result.type }}</span>\n </div>\n </header>\n <div class=\"suggestions\" aria-label=\"Available destinations\">\n @for(action of result.actions; track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"action.label\"\n [icon]=\"searchActionIcon(action)\"\n [disabled]=\"isSending()\"\n (click)=\"performHostAction(action.hostAction)\"\n ></button>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(message.pendingAction; as pendingAction) {\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\n <div class=\"pending-action-heading\">\n <strong>Confirmation required</strong>\n <span>{{ pendingAction.method }}</span>\n </div>\n <p>{{ pendingAction.summary }}</p>\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\n @if(message.actionDecision; as actionDecision) {\n <p class=\"action-decision\">\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\n </p>\n } @else {\n <div class=\"pending-action-buttons\">\n <button\n pButton\n type=\"button\"\n size=\"small\"\n severity=\"success\"\n label=\"Approve\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'approve')\"\n ></button>\n <button\n pButton\n type=\"button\"\n size=\"small\"\n outlined\n severity=\"secondary\"\n label=\"Reject\"\n [disabled]=\"isSending()\"\n (click)=\"resolvePendingAction(message, 'reject')\"\n ></button>\n </div>\n }\n </section>\n }\n @if(responseDetails.shiftCardGroups?.length) {\n <div class=\"assistant-shift-groups\" aria-label=\"Team shifts\">\n @for(group of responseDetails.shiftCardGroups ?? []; track group.title) {\n <section class=\"assistant-shift-group\">\n <h3>{{ group.title }}</h3>\n <div class=\"assistant-shift-card-grid\">\n @for(shift of group.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"definition\"\n ></max-agent-shift-card>\n }\n </div>\n </section>\n }\n </div>\n }\n @if(responseDetails.rota; as rota) {\n <section class=\"assistant-rota\" [attr.aria-label]=\"rota.title\">\n <div class=\"assistant-rota-heading\">\n <h3>{{ rota.title }}</h3>\n <div class=\"assistant-rota-summary\">\n @if(rota.startDate) {\n <span><small>From</small><strong>{{ rota.startDate }}</strong></span>\n }\n <span><small>Weeks</small><strong>{{ rota.weeksCount }}</strong></span>\n @if(rota.contracted) {\n <span><small>Contracted</small><strong>{{ rota.contracted }}</strong></span>\n }\n @if(rota.autoPublish) {\n <span><small>Auto publish</small><strong>{{ rota.autoPublish }}</strong></span>\n }\n </div>\n </div>\n <div class=\"assistant-rota-scroll\">\n @for(week of rota.weeks; track week.week) {\n <section class=\"assistant-rota-week\">\n <header class=\"assistant-rota-week-heading\">\n <strong>Week {{ week.week }}</strong>\n @if(week.duration) {\n <span>{{ week.duration }}</span>\n }\n </header>\n <div class=\"assistant-rota-week-grid\">\n @for(day of week.days; track day.day) {\n <article class=\"assistant-rota-day\">\n <header>\n <strong>{{ day.label }}</strong>\n @if(day.period) {\n <span>{{ day.period }}</span>\n }\n </header>\n <div class=\"assistant-rota-day-shifts\">\n @for(shift of day.shifts; track shift.id || $index) {\n <max-agent-shift-card\n [shift]=\"shift\"\n variant=\"rota\"\n ></max-agent-shift-card>\n } @empty {\n <span class=\"assistant-rota-empty\">No shifts</span>\n }\n </div>\n </article>\n }\n </div>\n </section>\n } @empty {\n <p class=\"assistant-rota-no-weeks\">No rota weeks were returned.</p>\n }\n </div>\n </section>\n }\n @if(responseDetails.visualisations?.length) {\n <div class=\"assistant-visualisations\">\n @for(visualisation of responseDetails.visualisations ?? []; track visualisation.title) {\n <section class=\"assistant-visualisation\">\n <h3>{{ visualisation.title }}</h3>\n @if(visualisation.type === 'doughnut') {\n <div class=\"assistant-doughnut-layout\">\n <div\n class=\"assistant-doughnut\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n <svg viewBox=\"0 0 42 42\" aria-hidden=\"true\" focusable=\"false\">\n <circle\n class=\"assistant-doughnut-track\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n ></circle>\n @for(value of visualisation.values; track $index; let valueIndex = $index) {\n <circle\n class=\"assistant-doughnut-segment\"\n cx=\"21\"\n cy=\"21\"\n r=\"15.9155\"\n pathLength=\"100\"\n [attr.stroke]=\"chartColor(visualisation, valueIndex)\"\n [attr.stroke-dasharray]=\"doughnutDashArray(visualisation, valueIndex)\"\n [attr.stroke-dashoffset]=\"doughnutDashOffset(visualisation, valueIndex)\"\n ></circle>\n }\n </svg>\n <span><strong>{{ chartTotal(visualisation) }}</strong>people</span>\n </div>\n <div class=\"assistant-chart-legend\">\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-chart-legend-item\">\n <i [style.background]=\"chartColor(visualisation, labelIndex)\"></i>\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n }\n </div>\n </div>\n } @else {\n <div\n class=\"assistant-bar-chart\"\n role=\"img\"\n [attr.aria-label]=\"chartAriaLabel(visualisation)\"\n >\n @for(label of visualisation.labels; track $index; let labelIndex = $index) {\n <div class=\"assistant-bar-row\">\n <div class=\"assistant-bar-label\">\n <span>{{ label }}</span>\n <strong>{{ visualisation.values[labelIndex] || 0 }}</strong>\n </div>\n <div class=\"assistant-bar-track\" aria-hidden=\"true\">\n <i\n [style.width.%]=\"barWidth(visualisation, labelIndex)\"\n [style.background]=\"chartColor(visualisation, labelIndex)\"\n ></i>\n </div>\n </div>\n }\n </div>\n }\n </section>\n }\n </div>\n }\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n @if(table.actions?.length) {\n <th>Actions</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index; let rowIndex = $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n @if(table.actions?.length) {\n <td>\n <div class=\"assistant-table-actions\">\n @for(action of getTableRowActions(table, rowIndex); track action.label) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n [severity]=\"action.tone || 'secondary'\"\n [outlined]=\"action.tone === 'danger'\"\n [label]=\"action.label\"\n [disabled]=\"isSending()\"\n (click)=\"useTableAction(action)\"\n ></button>\n }\n </div>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n @if(message.sources?.length) {\n <div class=\"assistant-sources\">\n <strong>Sources</strong>\n @for(source of message.sources ?? []; track source.citation) {\n <span>{{ source.citation }}</span>\n }\n </div>\n }\n @if(developerDetailsEnabled && message.developerTrace?.steps?.length) {\n <button\n type=\"button\"\n class=\"details-toggle\"\n [attr.aria-expanded]=\"isDetailsVisible(message.id)\"\n (click)=\"toggleDetails(message.id, message.developerTrace!.steps[0]?.id)\"\n >\n {{ isDetailsVisible(message.id) ? 'Hide Details' : 'Show Details' }}\n </button>\n\n @if(isDetailsVisible(message.id)) {\n <div class=\"details-dialog-backdrop\" (click)=\"toggleDetails(message.id)\">\n <section\n class=\"developer-details\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Agent processing details\"\n (click)=\"$event.stopPropagation()\"\n >\n <header class=\"developer-details-header\">\n <div>\n <span class=\"developer-eyebrow\">Developer trace</span>\n <h3>How this request was processed</h3>\n <p>A technical, step-by-step account of routing, inference, tools and results.</p>\n </div>\n <div class=\"details-dialog-actions\">\n <button\n type=\"button\"\n class=\"details-dialog-close\"\n aria-label=\"Close processing details\"\n (click)=\"toggleDetails(message.id)\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </header>\n\n @if(message.developerTrace!.run; as run) {\n <section class=\"trace-run-summary\" aria-label=\"Run summary\">\n <div class=\"trace-metric\"><span>Total runtime</span><strong>{{ run.durationMs }} ms</strong></div>\n <div class=\"trace-metric\"><span>Model calls</span><strong>{{ run.llmCalls }}</strong></div>\n <div class=\"trace-metric\"><span>Embedding calls</span><strong>{{ run.embeddingCalls }}</strong></div>\n <div class=\"trace-metric\"><span>API calls</span><strong>{{ run.apiCalls }}</strong></div>\n <div class=\"trace-loop-policy\">\n <div>\n <span>Execution architecture</span>\n <strong>Deterministic step pipeline</strong>\n </div>\n <span class=\"trace-no-loop\">No autonomous model loop</span>\n <p>{{ run.loopPolicy }}</p>\n </div>\n </section>\n }\n\n <ol class=\"workflow-trace\">\n @for(step of message.developerTrace!.steps; track step.id; let stepIndex = $index) {\n <li class=\"workflow-step\" [attr.data-status]=\"traceStepTone(step)\">\n <section class=\"workflow-section\">\n <button\n type=\"button\"\n class=\"workflow-step-toggle\"\n [attr.aria-expanded]=\"isTraceStepExpanded(message.id, step.id)\"\n (click)=\"toggleTraceStep(message.id, step.id)\"\n >\n <div>\n <span class=\"workflow-step-number\">Step {{ stepIndex + 1 }}</span>\n <h4>{{ step.title }}</h4>\n <span class=\"workflow-category\">{{ formatTraceCategory(step.category) }}</span>\n </div>\n <div class=\"workflow-meta\">\n <span class=\"workflow-status\">{{ traceStepStatus(step) }}</span>\n @if(step.durationMs !== undefined) {\n <span>{{ step.durationMs }} ms</span>\n }\n <i\n class=\"pi workflow-expand-icon\"\n [class.pi-chevron-down]=\"isTraceStepExpanded(message.id, step.id)\"\n [class.pi-chevron-right]=\"!isTraceStepExpanded(message.id, step.id)\"\n aria-hidden=\"true\"\n ></i>\n </div>\n </button>\n\n @if(isTraceStepExpanded(message.id, step.id)) {\n <div class=\"workflow-step-content\">\n @if(step.metadata?.summary) {\n <p class=\"workflow-summary\">{{ step.metadata!.summary }}</p>\n }\n\n @if(step.metadata?.technology; as technology) {\n <div class=\"trace-technology\">\n <span class=\"trace-section-label\">Technology</span>\n <div class=\"trace-inline-facts\">\n <span><small>Component</small>{{ technology.component }}</span>\n @if(technology.model) { <span><small>Model</small>{{ technology.model }}</span> }\n @if(technology.library) { <span><small>Library</small>{{ technology.library }}</span> }\n @if(technology.provider) { <span><small>Provider</small>{{ technology.provider }}</span> }\n @if(technology.operation) { <span><small>Operation</small>{{ technology.operation }}</span> }\n </div>\n </div>\n }\n\n @if(step.metadata?.control; as control) {\n <div class=\"trace-control\">\n <div>\n <span class=\"trace-section-label\">Stop control</span>\n <strong>{{ formatTraceLabel(control.mode) }}</strong>\n </div>\n @if(control.maximumIterations !== undefined) {\n <span>{{ control.iterationsUsed ?? 0 }} / {{ control.maximumIterations }} iteration</span>\n }\n <p>{{ control.stopCondition }}</p>\n </div>\n }\n\n @switch(step.category) {\n @case('request') {\n @if(traceField(step.input, 'userQuery'); as userQuery) {\n <div class=\"trace-query\">\n <span>Original user query</span>\n <blockquote>{{ formatTraceScalar(userQuery) }}</blockquote>\n </div>\n }\n <div class=\"trace-card-grid\">\n @for(group of [\n { label: 'Product', value: traceMapField(step.input, 'product') },\n { label: 'User', value: traceMapField(step.input, 'user') },\n { label: 'Request context', value: traceMapField(step.input, 'requestContext') },\n { label: 'Conversation', value: traceMapField(step.input, 'conversation') },\n { label: 'Live API context', value: traceMapField(step.input, 'liveApi') }\n ]; track group.label) {\n @if(group.value) {\n <section class=\"trace-data-card\">\n <h5>{{ group.label }}</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(group.value, group.label === 'User' ? ['permissions'] : []); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n }\n </div>\n }\n\n @case('intent_projection') {\n <div class=\"trace-transform\">\n <div>\n <span>Original query</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'originalUserQuery') ?? traceField(step.input, 'originalUserQuery')) }}</p>\n </div>\n <span class=\"trace-transform-arrow\" aria-hidden=\"true\">→</span>\n <div class=\"trace-transform-result\">\n <span>Generalised intent sent to embedding</span>\n <p>{{ formatTraceScalar(traceField(step.output, 'generalisedIntent') ?? traceField(step.output, 'routingText')) }}</p>\n </div>\n </div>\n @if(traceArrayField(step.output, 'removedArguments').length) {\n <div class=\"trace-section\">\n <span class=\"trace-section-label\">Arguments removed before routing</span>\n <div class=\"trace-entity-list\">\n @for(argument of traceArrayField(step.output, 'removedArguments'); track $index) {\n <span><small>{{ formatTraceScalar(traceField(argument, 'kind')) }}</small>{{ formatTraceScalar(traceField(argument, 'value')) }}</span>\n }\n </div>\n </div>\n }\n }\n\n @case('embedding') {\n <div class=\"trace-query trace-query-compact\">\n <span>Embedded text</span>\n <blockquote>{{ formatTraceScalar(traceField(step.input, 'generalisedIntent')) }}</blockquote>\n </div>\n <div class=\"trace-stat-grid\">\n <div><span>Embedding model</span><strong>{{ formatTraceScalar(traceField(step.output, 'model') ?? traceField(step.input, 'model')) }}</strong></div>\n <div><span>Dimensions</span><strong>{{ formatTraceScalar(traceField(step.output, 'dimensions')) }}</strong></div>\n <div><span>Vector magnitude</span><strong>{{ formatTraceScalar(traceField(step.output, 'vectorMagnitude')) }}</strong></div>\n <div><span>Full vector exposed</span><strong>{{ formatTraceScalar(traceField(step.output, 'fullVectorShown')) }}</strong></div>\n </div>\n @if(traceField(step.output, 'vectorPreview'); as vectorPreview) {\n <div class=\"trace-vector\">\n <span>Vector preview</span>\n <code>{{ formatTraceScalar(vectorPreview) }}</code>\n </div>\n }\n }\n\n @case('capability_routing') {\n @if(traceMapField(step.output, 'routing'); as routing) {\n <div class=\"trace-supabase-call\">\n <div><span>Routing strategy</span><strong>{{ formatTraceScalar(traceField(routing, 'strategy')) }}</strong></div>\n <div><span>Cache status</span><strong>{{ formatTraceScalar(traceField(routing, 'cacheStatus')) }}</strong></div>\n <div><span>Supabase RPC executed</span><strong>{{ formatTraceScalar(traceField(routing, 'supabaseRpcExecuted')) }}</strong></div>\n <div><span>Vector search executed</span><strong>{{ formatTraceScalar(traceField(routing, 'vectorSearchExecuted')) }}</strong></div>\n @if(traceField(routing, 'supabaseRpcExecuted')) {\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(routing, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(routing, 'database')) }}</strong></div>\n @if(traceArrayField(routing, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(routing, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n }\n </div>\n } @else {\n <div class=\"trace-supabase-call\">\n <div><span>Supabase RPC</span><strong>{{ formatTraceScalar(traceField(step.input, 'rpc')) }}</strong></div>\n <div><span>Database</span><strong>{{ formatTraceScalar(traceField(step.input, 'database')) }}</strong></div>\n @if(traceArrayField(step.input, 'tables').length) {\n <div class=\"trace-table-list\">\n <span>Tables searched</span>\n <div>\n @for(table of traceArrayField(step.input, 'tables'); track $index) {\n <code>{{ formatTraceScalar(table) }}</code>\n }\n </div>\n </div>\n }\n </div>\n }\n @if(traceMapField(step.output, 'decision'); as decision) {\n <section class=\"trace-decision\">\n <span>Routing decision</span>\n <strong>{{ formatTraceScalar(decision['selectedCapabilityLabel'] ?? decision['selectedCapabilityKey']) }}</strong>\n <div>\n <span>Status: {{ formatTraceScalar(decision['status']) }}</span>\n <span>Confidence: {{ formatSimilarity(decision['confidence']) }}</span>\n <span>Runner-up: {{ formatSimilarity(decision['runnerUpConfidence']) }}</span>\n </div>\n </section>\n }\n @if(traceArrayField(step.output, 'matchedCapabilities').length) {\n <div class=\"trace-ranking-wrap\">\n <span class=\"trace-section-label\">Ranked capability matches</span>\n <table class=\"trace-ranking\">\n <thead><tr><th>#</th><th>Capability</th><th>Combined</th><th>Semantic</th><th>Definition</th><th>Example</th><th>Keyword</th></tr></thead>\n <tbody>\n @for(candidate of traceArrayField(step.output, 'matchedCapabilities'); track $index) {\n <tr>\n <td>{{ formatTraceScalar(traceField(candidate, 'rank')) }}</td>\n <td><strong>{{ formatTraceScalar(traceField(candidate, 'label')) }}</strong><code>{{ formatTraceScalar(traceField(candidate, 'capabilityKey')) }}</code></td>\n <td>{{ formatSimilarity(traceField(candidate, 'combinedScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'semanticScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'definitionScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'exampleScore')) }}</td>\n <td>{{ formatSimilarity(traceField(candidate, 'keywordScore')) }}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n }\n\n @case('argument_extraction') {\n <div class=\"trace-card-grid\">\n @if(traceMapField(step.output, 'selectedCapability') ?? traceMapField(step.input, 'selectedCapability'); as capability) {\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Selected capability</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(capability); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.input, 'tool'); as tool) {\n <section class=\"trace-data-card\">\n <h5>Allowlisted tool</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(tool); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n </div>\n @if(traceMapField(step.output, 'extractedArguments'); as arguments) {\n <section class=\"trace-arguments\">\n <span class=\"trace-section-label\">Arguments extracted from the original query</span>\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(arguments); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n }\n @if(traceMapField(step.output, 'plannedToolCall'); as plannedCall) {\n <div class=\"trace-tool-call\">\n <span>Planned tool call</span>\n <strong>{{ formatTraceScalar(plannedCall['method']) }} · {{ formatTraceScalar(plannedCall['toolName']) }}</strong>\n <pre>{{ formatTraceValue(plannedCall['arguments']) }}</pre>\n </div>\n }\n }\n\n @case('api_call') {\n <div class=\"trace-api-route\">\n <span class=\"trace-http-method\">{{ formatTraceScalar(traceField(step.input, 'method')) }}</span>\n <code>{{ formatTraceScalar(traceField(step.input, 'path')) }}</code>\n @if(getHttpStatus(step); as statusCode) {\n <span class=\"trace-http-status\" [class.success]=\"isHttpSuccessful(step)\" [class.error]=\"!isHttpSuccessful(step)\">\n HTTP {{ statusCode }} · {{ isHttpSuccessful(step) ? 'Success' : 'Error' }}\n </span>\n }\n </div>\n <div class=\"trace-payload-grid\">\n @if(traceField(step.input, 'body'); as requestBody) {\n <section><span>Request payload</span><pre>{{ formatTraceValue(requestBody) }}</pre></section>\n }\n @if(traceField(step.output, 'response'); as apiResponse) {\n <section><span>API response</span><pre>{{ formatTraceValue(apiResponse) }}</pre></section>\n }\n </div>\n }\n\n @case('action') {\n <div class=\"trace-card-grid\">\n <section class=\"trace-data-card\">\n <h5>Workflow input</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.input); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n <section class=\"trace-data-card trace-data-card-accent\">\n <h5>Outcome</h5>\n <dl class=\"trace-field-list\">\n @for(entry of traceEntries(step.output); track entry.key) {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n </dl>\n </section>\n </div>\n }\n\n @case('response') {\n @if(traceField(step.output, 'answer'); as answer) {\n <div class=\"trace-query\"><span>Final grounded response</span><blockquote>{{ formatTraceScalar(answer) }}</blockquote></div>\n }\n <dl class=\"trace-argument-grid\">\n @for(entry of traceEntries(step.output); track entry.key) {\n @if(entry.key !== 'answer') {\n <div><dt>{{ entry.label }}</dt><dd>{{ formatTraceScalar(entry.value) }}</dd></div>\n }\n }\n </dl>\n }\n\n @default {\n <div class=\"trace-payload-grid\">\n @if(step.input !== undefined) {\n <section><span>Input</span><pre>{{ formatTraceValue(step.input) }}</pre></section>\n }\n @if(step.output !== undefined) {\n <section><span>Output</span><pre>{{ formatTraceValue(step.output) }}</pre></section>\n }\n </div>\n }\n }\n\n @if(step.error; as error) {\n <div class=\"trace-error\" [class.trace-warning]=\"step.category === 'api_call' && isHttpSuccessful(step)\">\n <strong class=\"trace-error-heading\">\n @if(step.category === 'api_call' && isHttpSuccessful(step)) {\n Post-response processing stopped\n } @else {\n Step stopped@if(error.statusCode) { · HTTP {{ error.statusCode }} }\n }\n </strong>\n <strong class=\"trace-error-legacy\" aria-hidden=\"true\">\n Failed@if(error.statusCode) { — HTTP {{ error.statusCode }} }\n </strong>\n <span>{{ error.message }}</span>\n </div>\n }\n </div>\n }\n </section>\n </li>\n }\n </ol>\n </section>\n </div>\n }\n }\n } @else {\n @if(message.role === 'assistant') {\n <div\n class=\"assistant-markdown\"\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\n ></div>\n @if(isWelcomeState(message) && bootstrapConfig.initialDescription; as initialDescription) {\n <p class=\"welcome-description\">{{ initialDescription }}</p>\n }\n @if(isWelcomeState(message)) {\n <button\n type=\"button\"\n class=\"support-welcome-card\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <span class=\"support-welcome-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <span class=\"support-welcome-copy\">\n <strong>Raise a support ticket</strong>\n <small>Send details directly to our support team.</small>\n </span>\n <i class=\"support-welcome-arrow pi pi-arrow-right\" aria-hidden=\"true\"></i>\n </button>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n </article>\n }\n </div>\n\n <footer class=\"assistant-footer\">\n @if(hasConversationStarted()) {\n <button\n type=\"button\"\n class=\"support-ticket-shortcut\"\n aria-label=\"Raise a support ticket\"\n (click)=\"openSupportTicket()\"\n >\n <i class=\"far fa-user-headset\" aria-hidden=\"true\"></i>\n <span>Raise a support ticket</span>\n </button>\n }\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n #composerInput\n pTextarea\n name=\"assistantPrompt\"\n rows=\"1\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </footer>\n </section>\n\n @if(supportTicketVisible()) {\n <section class=\"support-ticket-overlay\" aria-label=\"Support ticket form\">\n <div\n class=\"support-ticket-dialog\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"supportTicketTitle\"\n >\n <header class=\"support-ticket-header\">\n <span class=\"support-ticket-header-icon\" aria-hidden=\"true\">\n <i class=\"far fa-user-headset\"></i>\n </span>\n <div>\n <h2 id=\"supportTicketTitle\">Raise a support ticket</h2>\n <p>Share the details and our support team will take it from here.</p>\n </div>\n <button\n type=\"button\"\n class=\"support-ticket-close\"\n aria-label=\"Close support ticket form\"\n (click)=\"closeSupportTicket()\"\n >\n <i class=\"pi pi-times\" aria-hidden=\"true\"></i>\n </button>\n </header>\n\n @if(supportTicketResult(); as result) {\n <div class=\"support-ticket-success\" role=\"status\">\n <span class=\"support-ticket-success-icon\" aria-hidden=\"true\">\n <i class=\"pi pi-check\"></i>\n </span>\n <h3>Ticket raised</h3>\n <p>{{ result.message }}</p>\n <div class=\"support-ticket-reference\">\n <span>Reference</span>\n <strong>{{ result.ticketReference }}</strong>\n </div>\n <button\n pButton\n type=\"button\"\n label=\"Done\"\n icon=\"pi pi-check\"\n (click)=\"closeSupportTicket()\"\n ></button>\n </div>\n } @else {\n <form class=\"support-ticket-form\" (ngSubmit)=\"submitSupportTicket()\">\n <div class=\"support-ticket-fields\">\n <label class=\"support-ticket-field\">\n <span>Name</span>\n <input\n type=\"text\"\n name=\"supportName\"\n autocomplete=\"name\"\n [value]=\"supportTicketForm.name\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Email</span>\n <input\n type=\"email\"\n name=\"supportEmail\"\n autocomplete=\"email\"\n [value]=\"supportTicketForm.email\"\n readonly\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Phone <small>Optional</small></span>\n <input\n type=\"tel\"\n name=\"supportPhone\"\n autocomplete=\"tel\"\n placeholder=\"Add a contact number\"\n [(ngModel)]=\"supportTicketForm.phone\"\n />\n </label>\n\n <label class=\"support-ticket-field\">\n <span>Severity</span>\n <p-select\n inputId=\"supportSeverity\"\n name=\"supportSeverity\"\n [options]=\"supportSeverityOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.severity\"\n >\n <ng-template #selectedItem let-severity>\n <p-tag\n class=\"support-severity-tag\"\n [value]=\"severity.label\"\n [severity]=\"severity.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n <ng-template #item let-severity>\n <p-tag\n class=\"support-severity-option\"\n [value]=\"severity.label\"\n [severity]=\"severity.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-select>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>Tags</span>\n <p-multiselect\n inputId=\"supportTags\"\n name=\"supportTags\"\n placeholder=\"Select relevant areas\"\n [options]=\"supportTags()\"\n optionLabel=\"label\"\n optionValue=\"value\"\n display=\"chip\"\n [filter]=\"true\"\n filterBy=\"label\"\n [showToggleAll]=\"false\"\n [loading]=\"supportTagsLoading()\"\n [fluid]=\"true\"\n [(ngModel)]=\"supportTicketForm.tags\"\n >\n <ng-template #selecteditems let-selectedTags>\n <span class=\"support-selected-tags\">\n @for(tag of selectedTags; track tag.value) {\n <p-tag\n class=\"support-selected-tag\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n }\n </span>\n </ng-template>\n <ng-template #item let-tag>\n <p-tag\n class=\"support-tag-option\"\n [value]=\"tag.label\"\n [icon]=\"tag.icon\"\n [severity]=\"tag.severity\"\n [rounded]=\"true\"\n ></p-tag>\n </ng-template>\n </p-multiselect>\n </label>\n\n <label class=\"support-ticket-field support-ticket-field-wide\">\n <span>How can we help?</span>\n <textarea\n #supportQueryInput\n pTextarea\n name=\"supportQuery\"\n rows=\"5\"\n placeholder=\"Describe the issue, what you expected, and anything you've already tried.\"\n required\n [(ngModel)]=\"supportTicketForm.query\"\n ></textarea>\n </label>\n </div>\n\n @if(!supportTicketForm.name || !supportTicketForm.email) {\n <p class=\"support-ticket-notice\" role=\"alert\">\n Your signed-in name and email are required. Please refresh your Nemesys session and try again.\n </p>\n }\n @if(supportTicketError(); as supportError) {\n <p class=\"support-ticket-error\" role=\"alert\">{{ supportError }}</p>\n }\n\n <div class=\"support-ticket-actions\">\n <button\n pButton\n type=\"button\"\n label=\"Cancel\"\n severity=\"secondary\"\n outlined\n (click)=\"closeSupportTicket()\"\n ></button>\n <button\n pButton\n type=\"submit\"\n label=\"Submit ticket\"\n icon=\"pi pi-send\"\n [loading]=\"supportTicketSubmitting()\"\n [disabled]=\"!canSubmitSupportTicket()\"\n ></button>\n </div>\n </form>\n }\n </div>\n </section>\n }\n</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.service';\nexport * from './lib/components/assistant/max-assistant-support.service';\nexport * from './lib/components/shift-card/max-agent-shift-card.component';\nexport * from './lib/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|