max-agent-ui 0.0.13 → 0.0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialSuggestions: string[];\n}\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: [\n 'What sessions are scheduled for today?',\n 'Which lecturers have planned leave this week?',\n 'List the students who are on leave today.',\n 'List the students who were absent yesterday.',\n 'Generate the attendance report for a session conducted yesterday.'\n ]\n },\n nemesys: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: ['Show scheduling plans', 'Check resource availability', 'Find conflicts']\n },\n attendance: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: ['Show attendance summary', 'Find missing attendance', 'View reports']\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { InjectionToken } from '@angular/core';\n\nimport { AssistantProduct, AssistantUser } from '../models/assistant.models';\n\nexport interface MaxAssistantConfig {\n assistantApiUrl?: string;\n app?: AssistantProduct;\n user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);\n}\n\nexport const MAX_ASSISTANT_CONFIG = new InjectionToken<MaxAssistantConfig>(\n 'MAX_ASSISTANT_CONFIG',\n {\n factory: () => ({})\n }\n);\n","import { HttpClient } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\nimport { tap } from 'rxjs/operators';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatRequest,\n AssistantChatResponse,\n AssistantProduct,\n AssistantUser\n} from '../../models/assistant.models';\n\nconst DEFAULT_ASSISTANT_CHAT_URL =\n 'https://fhmaof3b4kaxqfbnomfstxyhw40rrcjr.lambda-url.eu-west-2.on.aws/chat';\nconst DEFAULT_APP = 'cortex';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n constructor(\n @Inject(MAX_ASSISTANT_CONFIG) private readonly config: MaxAssistantConfig,\n @Optional() private readonly http: HttpClient | null\n ) {}\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...this.compactConfig(config)\n };\n const request: AssistantChatRequest = {\n message,\n conversationId,\n app: this.getApp(assistantConfig),\n user: this.getUser(assistantConfig)\n };\n\n return this.postMessage(request, assistantConfig);\n }\n\n private postMessage(\n request: AssistantChatRequest,\n config: MaxAssistantConfig\n ): Observable<AssistantChatResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.post<AssistantChatResponse>(this.getChatUrl(config), request).pipe(\n tap(response => console.log('[Max Agent UI] agent-service response', response))\n );\n }\n\n private getChatUrl(config: MaxAssistantConfig): string {\n return config.assistantApiUrl?.trim() || DEFAULT_ASSISTANT_CHAT_URL;\n }\n\n private getApp(config: MaxAssistantConfig): AssistantProduct {\n return config.app || DEFAULT_APP;\n }\n\n private getUser(config: MaxAssistantConfig): AssistantUser {\n if (typeof config.user === 'function') {\n return config.user();\n }\n\n return config.user ?? {};\n }\n\n private compactConfig(config: MaxAssistantConfig): MaxAssistantConfig {\n return Object.fromEntries(\n Object.entries(config).filter(([, value]) => value !== undefined)\n ) as MaxAssistantConfig;\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, Input, signal, ViewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ButtonModule } from 'primeng/button';\nimport { DrawerModule } from 'primeng/drawer';\nimport { TextareaModule } from 'primeng/textarea';\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport {\n AssistantBootstrapConfig,\n getAssistantBootstrapConfig\n} from '../../config/assistant-bootstrap.config';\nimport { MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatResponse,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\n AssistantFieldValue,\n AssistantFieldMap,\n AssistantMessage,\n AssistantProduct,\n AssistantResponseTable,\n AssistantUser\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\n\nconst ASSISTANT_UI_COPY = {\n title: 'Max',\n subtitle: 'Maxtime Virtual Assistant',\n launcherLabel: 'Open Maxtime virtual assistant',\n openTooltip: 'Open Maxtime virtual assistant',\n closeLabel: 'Close Maxtime virtual assistant',\n clearLabel: 'Clear chat session',\n clearTooltip: 'Clear chat session',\n placeholder: 'Ask Maxtime virtual assistant',\n typingLabel: 'Maxtime virtual assistant is typing',\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\n};\n\n@Component({\n selector: 'max-assistant',\n imports: [CommonModule, FormsModule, ButtonModule, DrawerModule, TextareaModule, TooltipModule],\n templateUrl: './max-assistant.component.html',\n styleUrl: './max-assistant.component.scss'\n})\nexport class MaxAssistantComponent {\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\n @Input() app?: AssistantProduct;\n @Input() assistantApiUrl?: string;\n @Input() user:\n | Partial<AssistantUser>\n | (() => Partial<AssistantUser>) = {};\n\n protected readonly panelVisible = signal(false);\n protected readonly isSending = signal(false);\n protected readonly input = signal('');\n protected readonly conversationId = signal<string | undefined>(undefined);\n protected readonly messages = signal<AssistantMessage[]>([]);\n protected readonly expandedInferenceMessageIds = signal<ReadonlySet<string>>(new Set<string>());\n\n constructor(\n private readonly assistantService: MaxAssistantService,\n private readonly destroyRef: DestroyRef\n ) {}\n\n protected openPanel() {\n this.panelVisible.set(true);\n\n if (!this.messages().length) {\n this.messages.set(this.createDefaultMessages());\n }\n\n this.scrollToLatest();\n }\n\n protected togglePanel() {\n if (this.panelVisible()) {\n this.closePanel();\n return;\n }\n\n this.openPanel();\n }\n\n protected get launcherLabel(): string {\n return this.panelVisible() ? this.uiCopy.closeLabel : this.uiCopy.launcherLabel;\n }\n\n protected get uiCopy(): typeof ASSISTANT_UI_COPY {\n return ASSISTANT_UI_COPY;\n }\n\n protected get bootstrapConfig(): AssistantBootstrapConfig {\n return getAssistantBootstrapConfig(this.app);\n }\n\n protected closePanel() {\n this.panelVisible.set(false);\n }\n\n protected clearChatSession() {\n this.input.set('');\n this.isSending.set(false);\n this.conversationId.set(undefined);\n this.expandedInferenceMessageIds.set(new Set<string>());\n this.messages.set(this.createDefaultMessages());\n this.scrollToLatest();\n }\n\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\n if (!trimmedMessage || this.isSending()) {\n return;\n }\n\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\n this.isSending.set(true);\n\n this.assistantService\n .sendMessage(trimmedMessage, this.conversationId(), this.getAssistantConfig())\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe({\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, trimmedMessage));\n this.isSending.set(false);\n },\n error: () => {\n this.appendMessage({\n ...this.createMessage('assistant', this.uiCopy.errorMessage),\n isError: true\n });\n this.isSending.set(false);\n }\n });\n }\n\n protected useSuggestion(suggestion: string) {\n this.sendMessage(suggestion);\n }\n\n protected onComposerKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.sendMessage();\n }\n }\n\n protected isInferenceDetailsVisible(messageId: string): boolean {\n return this.expandedInferenceMessageIds().has(messageId);\n }\n\n protected toggleInferenceDetails(messageId: string) {\n const willOpen = !this.isInferenceDetailsVisible(messageId);\n\n this.expandedInferenceMessageIds.update(expandedIds => {\n const nextExpandedIds = new Set(expandedIds);\n\n if (nextExpandedIds.has(messageId)) {\n nextExpandedIds.delete(messageId);\n } else {\n nextExpandedIds.add(messageId);\n }\n\n return nextExpandedIds;\n });\n\n if (willOpen) {\n this.scrollToLatest();\n }\n }\n\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\n }\n\n private getAssistantConfig(): MaxAssistantConfig {\n const config: MaxAssistantConfig = {};\n\n if (this.assistantApiUrl) {\n config.assistantApiUrl = this.assistantApiUrl;\n }\n\n if (this.app) {\n config.app = this.app;\n }\n\n if (this.user) {\n config.user = this.user;\n }\n\n return config;\n }\n\n private appendMessage(message: AssistantMessage) {\n this.messages.update(messages => [...messages, message]);\n this.scrollToLatest();\n }\n\n private createDefaultMessages(): AssistantMessage[] {\n if (!this.bootstrapConfig.initialMessage) {\n return [];\n }\n\n return [\n this.createMessage(\n 'assistant',\n this.bootstrapConfig.initialMessage,\n this.bootstrapConfig.initialSuggestions\n )\n ];\n }\n\n private createAssistantResponseMessage(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantMessage {\n const displayResponse = this.createDisplayResponse(response, userQuery);\n\n return this.createMessage(\n 'assistant',\n displayResponse.agentInferredResponse || response.answer,\n response.suggestions,\n response.sources,\n response.intent,\n response.intentLabel,\n response.app,\n response.productLabel,\n response.apiModule,\n response.confidence,\n response.parameters ?? response.entities,\n response.apiCalls,\n response.apiResult,\n response.mockResult,\n response.llmUsed,\n response.availableModules,\n displayResponse\n );\n }\n\n private createMessage(\n role: AssistantMessage['role'],\n content: string,\n suggestions: string[] = [],\n sources: AssistantMessage['sources'] = [],\n intent?: string,\n intentLabel?: string,\n app?: string,\n productLabel?: string,\n apiModule?: string,\n confidence?: number,\n parameters?: AssistantFieldMap,\n apiCalls?: AssistantMessage['apiCalls'],\n apiResult?: AssistantFieldMap,\n mockResult?: AssistantFieldMap,\n llmUsed?: boolean,\n availableModules?: string[],\n displayResponse?: AssistantDisplayResponse\n ): AssistantMessage {\n return {\n id: this.createId(),\n role,\n content,\n displayResponse,\n formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),\n formattedApiHeaders: this.formatJson(displayResponse?.agentExtractedIntent?.api?.headers),\n formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\n formattedSampleJsonResponse: this.formatJson(displayResponse?.sampleJsonResponse),\n suggestions,\n sources,\n intent,\n intentLabel,\n app,\n productLabel,\n apiModule,\n confidence,\n parameters,\n entities: parameters,\n apiCalls,\n apiResult,\n mockResult,\n llmUsed,\n availableModules,\n createdAt: new Date()\n };\n }\n\n private createDisplayResponse(\n response: AssistantChatResponse,\n userQuery: string\n ): AssistantDisplayResponse {\n const provided = response.displayResponse ?? {};\n const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);\n const grid = this.getDisplayTables(provided, response);\n\n return {\n userQuery: provided.userQuery || userQuery,\n agentInferredResponse: provided.agentInferredResponse || response.answer,\n agentExtractedIntent: extractedIntent,\n apiResponse: provided.apiResponse ?? response.apiResult,\n sampleJsonResponse: provided.sampleJsonResponse ?? this.getSampleJsonResponseFallback(response),\n grid,\n tables: grid,\n markdown: provided.markdown\n };\n }\n\n private createExtractedIntent(\n response: AssistantChatResponse,\n provided?: AssistantExtractedIntent\n ): AssistantExtractedIntent {\n return {\n project: provided?.project ?? response.productLabel ?? response.app,\n projectKey: provided?.projectKey ?? response.app,\n module: provided?.module ?? response.apiModule,\n intent: provided?.intent ?? response.intent,\n intentLabel: provided?.intentLabel ?? response.intentLabel,\n confidence: provided?.confidence ?? response.confidence,\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\n api: provided?.api ?? response.apiCalls?.[0]\n };\n }\n\n private getSampleJsonResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\n return undefined;\n }\n\n return response.mockResult;\n }\n\n private getDisplayTables(\n provided: AssistantDisplayResponse,\n response: AssistantChatResponse\n ): AssistantResponseTable[] {\n if (provided.grid?.length) {\n return provided.grid;\n }\n\n if (provided.tables?.length) {\n return provided.tables;\n }\n\n const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);\n\n if (!rows.length) {\n return [];\n }\n\n const columns = this.getTableColumns(rows);\n\n return [\n {\n title: 'API Response',\n columns,\n rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))\n }\n ];\n }\n\n private extractTableRows(value: unknown): AssistantFieldMap[] {\n if (Array.isArray(value)) {\n return value.filter(this.isFieldMap);\n }\n\n if (!this.isFieldMap(value)) {\n return [];\n }\n\n const body = value['body'];\n\n if (Array.isArray(body)) {\n return body.filter(this.isFieldMap);\n }\n\n const items = value['items'];\n\n if (Array.isArray(items)) {\n return items.filter(this.isFieldMap);\n }\n\n return [];\n }\n\n private getTableColumns(rows: AssistantFieldMap[]): AssistantResponseTable['columns'] {\n const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);\n\n return fields.map(field => ({\n field,\n header: this.toColumnHeader(field)\n }));\n }\n\n private formatTableRow(row: AssistantFieldMap, fields: string[]): AssistantFieldMap {\n return Object.fromEntries(\n fields.map(field => [field, this.formatCellValue(row[field])])\n ) as AssistantFieldMap;\n }\n\n private formatCellValue(value: AssistantFieldValue | undefined): AssistantFieldValue {\n if (Array.isArray(value)) {\n return value.map(item => this.formatCellValue(item)).join(', ');\n }\n\n if (this.isFieldMap(value)) {\n return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);\n }\n\n return value ?? '';\n }\n\n private toColumnHeader(field: string): string {\n return field\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/[_-]+/g, ' ')\n .replace(/\\b\\w/g, character => character.toUpperCase());\n }\n\n private formatJson(value: unknown): string | undefined {\n if (value === undefined || this.isEmptyObject(value)) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\n }\n\n private isEmptyObject(value: unknown): boolean {\n return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;\n }\n\n private isFieldMap(value: unknown): value is AssistantFieldMap {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n }\n\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\n }\n\n private scrollToLatest() {\n setTimeout(() => {\n const element = this.messagesViewport?.nativeElement;\n\n if (element) {\n element.scrollTop = element.scrollHeight;\n }\n });\n }\n}\n","<button\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-label]=\"launcherLabel\"\n [attr.aria-pressed]=\"panelVisible()\"\n [pTooltip]=\"launcherLabel\"\n tooltipPosition=\"left\"\n (click)=\"togglePanel()\"\n>\n <span class=\"mascot\" aria-hidden=\"true\"></span>\n</button>\n\n<p-drawer\n [visible]=\"panelVisible()\"\n (visibleChange)=\"panelVisible.set($event)\"\n position=\"right\"\n styleClass=\"assistant-drawer\"\n [modal]=\"false\"\n [blockScroll]=\"false\"\n [showCloseIcon]=\"false\"\n>\n <section class=\"assistant-panel\" [attr.aria-label]=\"uiCopy.title\">\n <header class=\"assistant-header\">\n <span class=\"mascot large\" aria-hidden=\"true\"></span>\n <div>\n <h2>{{ uiCopy.title }}</h2>\n <span>{{ uiCopy.subtitle }}</span>\n </div>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-refresh\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.clearLabel\"\n [pTooltip]=\"uiCopy.clearTooltip\"\n tooltipPosition=\"bottom\"\n (click)=\"clearChatSession()\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-times\"\n text\n rounded\n severity=\"secondary\"\n class=\"header-action\"\n [attr.aria-label]=\"uiCopy.closeLabel\"\n (click)=\"closePanel()\"\n ></button>\n </header>\n\n <div #messagesViewport class=\"assistant-messages\">\n @for(message of messages(); track message.id) {\n <article class=\"message {{ message.role }}\" [class.error]=\"message.isError\">\n @if(message.displayResponse; as responseDetails) {\n <p class=\"assistant-result\">{{ responseDetails.agentInferredResponse || message.content }}</p>\n @if(getResponseGrid(responseDetails).length) {\n <div class=\"assistant-tables\">\n @for(table of getResponseGrid(responseDetails); track $index) {\n <section class=\"assistant-table-section\">\n @if(table.title) {\n <h3>{{ table.title }}</h3>\n }\n <div class=\"assistant-table-wrap\">\n <table>\n <thead>\n <tr>\n @for(column of table.columns; track column.field) {\n <th>{{ column.header }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for(row of table.rows; track $index) {\n <tr>\n @for(column of table.columns; track column.field) {\n <td>{{ row[column.field] }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n }\n </div>\n }\n <button\n type=\"button\"\n class=\"inference-toggle\"\n [attr.aria-expanded]=\"isInferenceDetailsVisible(message.id)\"\n (click)=\"toggleInferenceDetails(message.id)\"\n >\n {{ isInferenceDetailsVisible(message.id) ? 'Hide Inference Details' : 'Show Inference Details' }}\n </button>\n\n @if(isInferenceDetailsVisible(message.id)) {\n <div class=\"response-details\">\n @if(responseDetails.userQuery) {\n <section class=\"response-section\">\n <h3>User Query</h3>\n <p class=\"quoted\">\"{{ responseDetails.userQuery }}\"</p>\n </section>\n }\n\n @if(responseDetails.agentExtractedIntent; as intent) {\n <section class=\"response-section\">\n <h3>Agent Extracted Intent</h3>\n <dl class=\"detail-grid\">\n @if(intent.project || intent.projectKey) {\n <div>\n <dt>Project</dt>\n <dd>\n {{ intent.project || intent.projectKey }}\n @if(intent.projectKey) {\n <span>{{ intent.projectKey }}</span>\n }\n </dd>\n </div>\n }\n @if(intent.module) {\n <div>\n <dt>Module</dt>\n <dd>{{ intent.module }}</dd>\n </div>\n }\n @if(intent.intentLabel) {\n <div>\n <dt>Intent Label</dt>\n <dd>{{ intent.intentLabel }}</dd>\n </div>\n }\n @if(intent.intent) {\n <div>\n <dt>Intent</dt>\n <dd>{{ intent.intent }}</dd>\n </div>\n }\n @if(intent.confidence !== undefined) {\n <div>\n <dt>Confidence</dt>\n <dd>{{ intent.confidence | percent: '1.0-0' }}</dd>\n </div>\n }\n </dl>\n\n @if(message.formattedParameters) {\n <div class=\"json-block\">\n <span class=\"detail-label\">Parameters</span>\n <pre>{{ message.formattedParameters }}</pre>\n </div>\n }\n\n @if(intent.api?.url || intent.api?.method) {\n <div class=\"api-call-summary\">\n <span class=\"detail-label\">API Called</span>\n <code>{{ intent.api?.method || 'GET' }} {{ intent.api?.url || 'URL not provided' }}</code>\n </div>\n }\n\n @if(message.formattedApiHeaders) {\n <div class=\"json-block\">\n <span class=\"detail-label\">Request Headers</span>\n <pre>{{ message.formattedApiHeaders }}</pre>\n </div>\n }\n\n @if(message.formattedApiBody) {\n <div class=\"json-block\">\n <span class=\"detail-label\">API Body</span>\n <pre>{{ message.formattedApiBody }}</pre>\n </div>\n }\n </section>\n }\n\n @if(message.formattedApiResponse) {\n <section class=\"response-section\">\n <h3>API Response</h3>\n <div class=\"json-block\">\n <span class=\"detail-label\">JSON</span>\n <pre>{{ message.formattedApiResponse }}</pre>\n </div>\n </section>\n }\n\n @if(message.formattedSampleJsonResponse) {\n <section class=\"response-section\">\n <h3>Sample JSON Response Used</h3>\n <div class=\"json-block\">\n <span class=\"detail-label\">JSON</span>\n <pre>{{ message.formattedSampleJsonResponse }}</pre>\n </div>\n </section>\n }\n\n <section class=\"response-section\">\n <h3>Agent Response</h3>\n <p>{{ responseDetails.agentInferredResponse || message.content }}</p>\n </section>\n </div>\n }\n } @else {\n <p>{{ message.content }}</p>\n }\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\n @for(suggestion of message.suggestions ?? []; track suggestion) {\n <button\n pButton\n type=\"button\"\n size=\"small\"\n text\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestion\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\n }\n </div>\n }\n </article>\n }\n @if(isSending()) {\n <article class=\"message assistant typing\" [attr.aria-label]=\"uiCopy.typingLabel\">\n <span></span>\n <span></span>\n <span></span>\n </article>\n }\n </div>\n\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\n <textarea\n pTextarea\n name=\"assistantPrompt\"\n rows=\"2\"\n [placeholder]=\"uiCopy.placeholder\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown)=\"onComposerKeydown($event)\"\n >\n </textarea>\n <button\n pButton\n type=\"submit\"\n icon=\"pi pi-send\"\n aria-label=\"Send message\"\n [disabled]=\"!input().trim() || isSending()\"\n ></button>\n </form>\n </section>\n</p-drawer>\n","/*\n * Public API Surface of max-agent-ui\n */\n\nexport * from './lib/components/assistant/max-assistant.component';\nexport * from './lib/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MaxAssistantService"],"mappings":"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"}
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/components/assistant/max-assistant-markdown.pipe.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.service.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.component.html","../../../projects/max-agent-ui/src/public-api.ts","../../../projects/max-agent-ui/src/max-agent-ui.ts"],"sourcesContent":["import { AssistantProduct } from '../models/assistant.models';\n\nexport interface AssistantBootstrapConfig {\n initialMessage?: string;\n initialSuggestions: string[];\n}\n\nconst DEFAULT_ASSISTANT_BOOTSTRAP: AssistantBootstrapConfig = {\n initialMessage: undefined,\n initialSuggestions: []\n};\n\nconst ASSISTANT_BOOTSTRAP_BY_APP: Record<string, AssistantBootstrapConfig> = {\n cortex: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: [\n 'What sessions are scheduled for today?',\n 'Which lecturers have planned leave this week?',\n 'List the students who are on leave today.',\n 'List the students who were absent yesterday.',\n 'Generate the attendance report for a session conducted yesterday.'\n ]\n },\n nemesys: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: ['Show scheduling plans', 'Check resource availability', 'Find conflicts']\n },\n attendance: {\n initialMessage: \"Hello there! I'm Max, your Maxtime Virtual Assistant. How can I help you today?\",\n initialSuggestions: ['Show attendance summary', 'Find missing attendance', 'View reports']\n }\n};\n\nexport function getAssistantBootstrapConfig(app?: AssistantProduct): AssistantBootstrapConfig {\n const appKey = app?.trim().toLowerCase();\n\n if (!appKey) {\n return DEFAULT_ASSISTANT_BOOTSTRAP;\n }\n\n return ASSISTANT_BOOTSTRAP_BY_APP[appKey] ?? DEFAULT_ASSISTANT_BOOTSTRAP;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { marked } from 'marked';\n\n@Pipe({\n name: 'maxAssistantMarkdown',\n standalone: true,\n pure: true\n})\nexport class MaxAssistantMarkdownPipe implements PipeTransform {\n transform(value: string | null | undefined): string {\n if (!value) {\n return '';\n }\n\n // Assistant responses may contain Markdown, but they must not be able to\n // inject raw HTML. Angular sanitises the generated HTML again when it is\n // assigned through [innerHTML].\n const escapedValue = value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;');\n\n return marked.parse(escapedValue, {\n async: false,\n breaks: true,\n gfm: true\n });\n }\n}\n","import { 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 { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { Inject, Injectable, Optional } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\n\nimport { MAX_ASSISTANT_CONFIG, MaxAssistantConfig } from '../../config/assistant.config';\nimport {\n AssistantChatRequest,\n AssistantChatResponse,\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 ): 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 ...(confirmation ? { confirmation } : {})\n };\n\n return this.postMessage(request, assistantConfig);\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 ): Observable<AssistantChatResponse> {\n if (!this.http) {\n return throwError(\n () => new Error('HttpClient is not available. Add provideHttpClient() to the host app.')\n );\n }\n\n return this.http.post<AssistantChatResponse>(\n this.getChatUrl(config),\n request,\n { headers: this.getHeaders(config) }\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 Input,\n isDevMode,\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\r\nimport {\r\n AssistantBootstrapConfig,\r\n getAssistantBootstrapConfig\r\n} from '../../config/assistant-bootstrap.config';\r\nimport { MaxAssistantConfig } from '../../config/assistant.config';\r\nimport {\r\n AssistantChatResponse,\n AssistantConfirmation,\n AssistantConversationMessage,\n AssistantDeveloperTrace,\n AssistantDisplayResponse,\n AssistantExtractedIntent,\r\n AssistantFieldValue,\r\n AssistantFieldMap,\r\n AssistantMessage,\r\n AssistantProduct,\r\n AssistantRequestContext,\n AssistantResponseTable,\n AssistantResponseTableAction,\n AssistantSuggestion,\n AssistantTraceStep,\n AssistantUser\n} from '../../models/assistant.models';\nimport { MaxAssistantService } from './max-assistant.service';\r\nimport { MaxAssistantMarkdownPipe } from './max-assistant-markdown.pipe';\r\n\r\nconst ASSISTANT_UI_COPY = {\r\n title: 'Max',\r\n subtitle: 'Maxtime Virtual Assistant',\r\n launcherLabel: 'Open Maxtime virtual assistant',\r\n openTooltip: 'Open Maxtime virtual assistant',\r\n closeLabel: 'Close Maxtime virtual assistant',\r\n clearLabel: 'Clear chat session',\r\n clearTooltip: 'Clear chat session',\r\n placeholder: 'Ask Maxtime virtual assistant',\r\n typingLabel: 'Maxtime virtual assistant is typing',\r\n errorMessage: 'Maxtime virtual assistant could not be reached. Please try again.'\r\n};\r\n\r\n@Component({\r\n selector: 'max-assistant',\r\n imports: [\r\n CommonModule,\n FormsModule,\n ButtonModule,\n TextareaModule,\n TooltipModule,\n MaxAssistantMarkdownPipe\r\n ],\r\n templateUrl: './max-assistant.component.html',\r\n styleUrl: './max-assistant.component.scss'\r\n})\r\nexport class MaxAssistantComponent {\n @ViewChild('launcher') private launcher?: ElementRef<HTMLButtonElement>;\n @ViewChild('messagesViewport') private messagesViewport?: ElementRef<HTMLElement>;\n\r\n @Input() app?: AssistantProduct;\r\n @Input() assistantApiUrl?: string;\r\n @Input() user?:\r\n | Partial<AssistantUser>\r\n | (() => Partial<AssistantUser>);\r\n @Input() context?:\r\n | Partial<AssistantRequestContext>\r\n | (() => Partial<AssistantRequestContext>);\r\n @Input() requestHeaders?:\r\n | Record<string, string>\r\n | (() => Record<string, string>);\r\n\r\n protected readonly panelVisible = signal(false);\r\n protected readonly isSending = signal(false);\r\n protected readonly input = signal('');\r\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\r\n constructor(\r\n private readonly assistantService: MaxAssistantService,\r\n private readonly destroyRef: DestroyRef\r\n ) {}\r\n\r\n protected openPanel() {\r\n this.panelVisible.set(true);\r\n\r\n if (!this.messages().length) {\r\n this.messages.set(this.createDefaultMessages());\r\n }\r\n\r\n this.scrollToLatest();\r\n }\r\n\r\n protected togglePanel() {\r\n if (this.panelVisible()) {\r\n this.closePanel();\r\n return;\r\n }\r\n\r\n this.openPanel();\r\n }\r\n\r\n protected get launcherLabel(): string {\r\n return this.panelVisible() ? this.uiCopy.closeLabel : this.uiCopy.launcherLabel;\r\n }\r\n\r\n protected get uiCopy(): typeof ASSISTANT_UI_COPY {\r\n return ASSISTANT_UI_COPY;\r\n }\r\n\r\n protected get bootstrapConfig(): AssistantBootstrapConfig {\r\n return getAssistantBootstrapConfig(this.app);\r\n }\r\n\r\n protected closePanel() {\n this.panelVisible.set(false);\n queueMicrotask(() => this.launcher?.nativeElement.focus({ preventScroll: true }));\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 return;\n }\n if (this.panelVisible()) {\n this.closePanel();\n }\n }\n\r\n protected clearChatSession() {\r\n this.input.set('');\r\n this.isSending.set(false);\r\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();\r\n }\r\n\r\n protected sendMessage(message = this.input()) {\n const trimmedMessage = message.trim();\n\r\n if (!trimmedMessage || this.isSending()) {\r\n return;\r\n }\r\n\r\n const history = this.getConversationHistory();\n this.input.set('');\n this.appendMessage(this.createMessage('user', trimmedMessage));\r\n this.isSending.set(true);\r\n\r\n this.assistantService\r\n .sendMessage(\n trimmedMessage,\n this.conversationId(),\n this.getAssistantConfig(),\n undefined,\n history\n )\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\n next: response => {\n this.conversationId.set(response.conversationId);\n this.appendMessage(this.createAssistantResponseMessage(response, trimmedMessage));\n this.isSending.set(false);\n },\n error: error => {\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\r\n });\r\n this.isSending.set(false);\r\n }\r\n });\r\n }\r\n\r\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\r\n protected resolvePendingAction(\r\n message: AssistantMessage,\r\n decision: AssistantConfirmation['decision']\r\n ) {\r\n const pendingAction = message.pendingAction;\r\n const currentConversationId = this.conversationId();\r\n\r\n if (\r\n !pendingAction ||\r\n !currentConversationId ||\r\n message.actionDecision ||\r\n this.isSending()\r\n ) {\r\n return;\r\n }\r\n\r\n this.messages.update(messages =>\r\n messages.map(item =>\r\n item.id === message.id ? { ...item, actionDecision: decision } : item\r\n )\r\n );\r\n const userMessage = decision === 'approve'\n ? `Approve: ${pendingAction.summary}`\r\n : `Reject: ${pendingAction.summary}`;\r\n const history = this.getConversationHistory();\n this.appendMessage(this.createMessage('user', userMessage));\n this.isSending.set(true);\r\n\r\n this.assistantService\r\n .confirmAction(\r\n pendingAction.id,\r\n decision,\n currentConversationId,\n this.getAssistantConfig(),\n history\n )\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe({\r\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 =>\r\n messages.map(item =>\r\n item.id === message.id ? { ...item, actionDecision: undefined } : item\r\n )\r\n );\n this.appendMessage({\n ...this.createMessage('assistant', this.resolveErrorMessage(error)),\n isError: true\r\n });\r\n this.isSending.set(false);\r\n }\r\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) {\r\n event.preventDefault();\r\n this.sendMessage();\r\n }\r\n }\r\n\r\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\r\n protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[] {\n return responseDetails.grid?.length ? responseDetails.grid : responseDetails.tables ?? [];\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 {\r\n const config: MaxAssistantConfig = {};\r\n\r\n if (this.assistantApiUrl) {\r\n config.assistantApiUrl = this.assistantApiUrl;\r\n }\r\n\r\n if (this.app) {\r\n config.app = this.app;\r\n }\r\n\r\n if (this.user) {\r\n config.user = this.user;\r\n }\r\n\r\n if (this.context) {\r\n config.context = this.context;\r\n }\r\n\r\n if (this.requestHeaders) {\r\n config.requestHeaders = this.requestHeaders;\r\n }\r\n\r\n return config;\r\n }\r\n\r\n private appendMessage(message: AssistantMessage) {\n this.messages.update(messages => [...messages, message]);\r\n this.scrollToLatest();\r\n }\r\n\r\n private createDefaultMessages(): AssistantMessage[] {\r\n if (!this.bootstrapConfig.initialMessage) {\r\n return [];\r\n }\r\n\r\n return [\r\n this.createMessage(\r\n 'assistant',\r\n this.bootstrapConfig.initialMessage,\r\n this.bootstrapConfig.initialSuggestions\r\n )\r\n ];\r\n }\r\n\r\n private createAssistantResponseMessage(\r\n response: AssistantChatResponse,\r\n userQuery: string\r\n ): AssistantMessage {\r\n const displayResponse = this.createDisplayResponse(response, userQuery);\r\n\r\n return this.createMessage(\r\n 'assistant',\r\n displayResponse.agentInferredResponse || response.answer,\r\n response.suggestions,\r\n response.sources,\r\n response.intent,\r\n response.intentLabel,\r\n response.app ?? response.product,\r\n response.productLabel,\r\n response.apiModule ?? response.contextResolution?.moduleKey,\r\n response.confidence ?? response.contextResolution?.confidence,\r\n response.parameters ?? response.entities,\r\n response.apiCalls ?? this.getToolApiCalls(response),\r\n response.apiResult,\r\n response.mockResult,\r\n response.llmUsed,\r\n response.availableModules,\r\n displayResponse,\r\n response.status,\n response.pendingAction,\n response.toolExecution,\n response.cards,\n response.contextResolution.capabilityKey,\n response.developerTrace\n );\r\n }\r\n\r\n private createMessage(\r\n role: AssistantMessage['role'],\r\n content: string,\r\n suggestions: AssistantSuggestion[] = [],\n sources: AssistantMessage['sources'] = [],\r\n intent?: string,\r\n intentLabel?: string,\r\n app?: string,\r\n productLabel?: string,\r\n apiModule?: string,\r\n confidence?: number,\r\n parameters?: AssistantFieldMap,\r\n apiCalls?: AssistantMessage['apiCalls'],\r\n apiResult?: AssistantFieldMap,\r\n mockResult?: AssistantFieldMap,\r\n llmUsed?: boolean,\r\n availableModules?: string[],\r\n displayResponse?: AssistantDisplayResponse,\r\n status?: AssistantChatResponse['status'],\r\n pendingAction?: AssistantMessage['pendingAction'],\n toolExecution?: AssistantMessage['toolExecution'],\n cards?: AssistantMessage['cards'],\n capabilityKey?: string,\n developerTrace?: AssistantDeveloperTrace\n ): AssistantMessage {\r\n return {\r\n id: this.createId(),\r\n role,\r\n content,\r\n displayResponse,\r\n formattedParameters: this.formatJson(displayResponse?.agentExtractedIntent?.parameters),\r\n formattedApiHeaders: this.formatJson(displayResponse?.agentExtractedIntent?.api?.headers),\r\n formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\r\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\r\n formattedSampleJsonResponse: this.formatJson(displayResponse?.sampleJsonResponse),\r\n suggestions,\r\n sources,\r\n intent,\r\n intentLabel,\r\n app,\r\n productLabel,\r\n apiModule,\r\n confidence,\r\n parameters,\r\n entities: parameters,\r\n apiCalls,\r\n apiResult,\r\n mockResult,\r\n llmUsed,\r\n availableModules,\r\n status,\r\n pendingAction,\n toolExecution,\n cards,\n capabilityKey,\n developerTrace,\n createdAt: new Date()\n };\r\n }\r\n\r\n private createDisplayResponse(\r\n response: AssistantChatResponse,\r\n userQuery: string\r\n ): AssistantDisplayResponse {\r\n const provided = response.displayResponse ?? {};\r\n const extractedIntent = this.createExtractedIntent(response, provided.agentExtractedIntent);\r\n const grid = this.getDisplayTables(provided, response);\r\n\r\n return {\r\n userQuery: provided.userQuery || userQuery,\r\n agentInferredResponse: provided.agentInferredResponse || response.answer,\r\n agentExtractedIntent: extractedIntent,\r\n apiResponse: provided.apiResponse ?? response.apiResult,\r\n sampleJsonResponse: provided.sampleJsonResponse ?? this.getSampleJsonResponseFallback(response),\r\n grid,\r\n tables: grid,\r\n markdown: provided.markdown\r\n };\r\n }\r\n\r\n private createExtractedIntent(\r\n response: AssistantChatResponse,\r\n provided?: AssistantExtractedIntent\r\n ): AssistantExtractedIntent {\r\n return {\r\n project: provided?.project ?? response.productLabel ?? response.product ?? response.app,\r\n projectKey: provided?.projectKey ?? response.product ?? response.app,\r\n module: provided?.module ?? response.apiModule ?? response.contextResolution?.moduleKey,\r\n intent: provided?.intent ?? response.intent ?? response.contextResolution?.capabilityKey,\r\n intentLabel:\r\n provided?.intentLabel\r\n ?? response.intentLabel\r\n ?? response.contextResolution?.capabilityLabel,\r\n confidence:\r\n provided?.confidence\r\n ?? response.confidence\r\n ?? response.contextResolution?.confidence,\r\n parameters: provided?.parameters ?? response.parameters ?? response.entities,\r\n api: provided?.api ?? response.apiCalls?.[0] ?? this.getToolApiCalls(response)?.[0]\r\n };\r\n }\r\n\r\n private getToolApiCalls(\r\n response: AssistantChatResponse\r\n ): AssistantMessage['apiCalls'] | undefined {\r\n if (!response.toolExecution) {\r\n return undefined;\r\n }\r\n\r\n return [{\r\n method: response.toolExecution.method,\r\n url: response.toolExecution.endpoint,\r\n purpose: response.toolExecution.toolName\r\n }];\r\n }\r\n\r\n private getSampleJsonResponseFallback(response: AssistantChatResponse): AssistantFieldMap | undefined {\r\n if (!response.mockResult || !Object.keys(response.mockResult).length) {\r\n return undefined;\r\n }\r\n\r\n return response.mockResult;\r\n }\r\n\r\n private getDisplayTables(\r\n provided: AssistantDisplayResponse,\r\n response: AssistantChatResponse\r\n ): AssistantResponseTable[] {\r\n if (provided.grid?.length) {\r\n return provided.grid;\r\n }\r\n\r\n if (provided.tables?.length) {\r\n return provided.tables;\r\n }\r\n\r\n const rows = this.extractTableRows(provided.apiResponse ?? response.apiResult);\r\n\r\n if (!rows.length) {\r\n return [];\r\n }\r\n\r\n const columns = this.getTableColumns(rows);\r\n\r\n return [\r\n {\r\n title: 'API Response',\r\n columns,\r\n rows: rows.map(row => this.formatTableRow(row, columns.map(column => column.field)))\r\n }\r\n ];\r\n }\r\n\r\n private extractTableRows(value: unknown): AssistantFieldMap[] {\r\n if (Array.isArray(value)) {\r\n return value.filter(this.isFieldMap);\r\n }\r\n\r\n if (!this.isFieldMap(value)) {\r\n return [];\r\n }\r\n\r\n const body = value['body'];\r\n\r\n if (Array.isArray(body)) {\r\n return body.filter(this.isFieldMap);\r\n }\r\n\r\n const items = value['items'];\r\n\r\n if (Array.isArray(items)) {\r\n return items.filter(this.isFieldMap);\r\n }\r\n\r\n return [];\r\n }\r\n\r\n private getTableColumns(rows: AssistantFieldMap[]): AssistantResponseTable['columns'] {\r\n const fields = Array.from(new Set(rows.flatMap(row => Object.keys(row)))).slice(0, 8);\r\n\r\n return fields.map(field => ({\r\n field,\r\n header: this.toColumnHeader(field)\r\n }));\r\n }\r\n\r\n private formatTableRow(row: AssistantFieldMap, fields: string[]): AssistantFieldMap {\r\n return Object.fromEntries(\r\n fields.map(field => [field, this.formatCellValue(row[field])])\r\n ) as AssistantFieldMap;\r\n }\r\n\r\n private formatCellValue(value: AssistantFieldValue | undefined): AssistantFieldValue {\r\n if (Array.isArray(value)) {\r\n return value.map(item => this.formatCellValue(item)).join(', ');\r\n }\r\n\r\n if (this.isFieldMap(value)) {\r\n return value['label'] ?? value['name'] ?? value['code'] ?? JSON.stringify(value);\r\n }\r\n\r\n return value ?? '';\r\n }\r\n\r\n private toColumnHeader(field: string): string {\r\n return field\r\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\r\n .replace(/[_-]+/g, ' ')\r\n .replace(/\\b\\w/g, character => character.toUpperCase());\r\n }\r\n\r\n private formatJson(value: unknown): string | undefined {\r\n if (value === undefined || this.isEmptyObject(value)) {\r\n return undefined;\r\n }\r\n\r\n return JSON.stringify(value, null, 2);\r\n }\r\n\r\n private isEmptyObject(value: unknown): boolean {\r\n return !!value && typeof value === 'object' && !Array.isArray(value) && !Object.keys(value).length;\r\n }\r\n\r\n private isFieldMap(value: unknown): value is AssistantFieldMap {\r\n return !!value && typeof value === 'object' && !Array.isArray(value);\r\n }\r\n\r\n private createId(): string {\n return globalThis.crypto?.randomUUID?.() || `${Date.now()}-${Math.random()}`;\r\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)\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\r\n private scrollToLatest() {\r\n setTimeout(() => {\r\n const element = this.messagesViewport?.nativeElement;\r\n\r\n if (element) {\r\n element.scrollTop = element.scrollHeight;\r\n }\r\n });\r\n }\r\n}\r\n","<ng-template #mascotTemplate let-large=\"large\">\r\n <span class=\"mascot\" [class.large]=\"large\" aria-hidden=\"true\">\r\n <span class=\"mascot-aura\"></span>\r\n <svg class=\"mascot-art\" viewBox=\"0 0 64 64\" focusable=\"false\">\r\n <path class=\"mascot-sparkle\" d=\"M54 9v6M51 12h6\" />\r\n <path class=\"mascot-antenna\" d=\"M32 14V9\" />\r\n <circle class=\"mascot-signal\" cx=\"32\" cy=\"7\" r=\"3\" />\r\n <rect class=\"mascot-ear mascot-ear-left\" x=\"5\" y=\"28\" width=\"7\" height=\"15\" rx=\"3.5\" />\r\n <rect class=\"mascot-ear mascot-ear-right\" x=\"52\" y=\"28\" width=\"7\" height=\"15\" rx=\"3.5\" />\r\n <rect class=\"mascot-shell\" x=\"8\" y=\"14\" width=\"48\" height=\"42\" rx=\"18\" />\r\n <path class=\"mascot-shell-shine\" d=\"M17 24c4-7 12-9 20-8\" />\r\n <rect class=\"mascot-face\" x=\"14\" y=\"21\" width=\"36\" height=\"26\" rx=\"12\" />\r\n <g class=\"mascot-eyes\">\r\n <rect class=\"mascot-eye\" x=\"21\" y=\"29\" width=\"5\" height=\"7\" rx=\"2.5\" />\r\n <rect class=\"mascot-eye\" x=\"38\" y=\"29\" width=\"5\" height=\"7\" rx=\"2.5\" />\r\n </g>\r\n <path class=\"mascot-smile\" d=\"M25 39c2 2 4.5 3 7 3s5-1 7-3\" />\r\n <path class=\"mascot-mark\" d=\"M26 18l6 5 6-5\" />\r\n </svg>\r\n </span>\r\n</ng-template>\r\n\r\n<button\n #launcher\n pButton\n type=\"button\"\n class=\"assistant-launcher\"\r\n [class.is-open]=\"panelVisible()\"\r\n [attr.aria-label]=\"launcherLabel\"\r\n [attr.aria-pressed]=\"panelVisible()\"\r\n [pTooltip]=\"launcherLabel\"\r\n tooltipPosition=\"left\"\r\n (click)=\"togglePanel()\"\r\n>\r\n <ng-container\r\n [ngTemplateOutlet]=\"mascotTemplate\"\r\n [ngTemplateOutletContext]=\"{ large: false }\"\r\n ></ng-container>\n</button>\n\n<aside\n class=\"assistant-window\"\n [class.is-open]=\"panelVisible()\"\n [attr.aria-hidden]=\"!panelVisible()\"\n [attr.inert]=\"panelVisible() ? null : ''\"\n [attr.aria-label]=\"uiCopy.title\"\n role=\"complementary\"\n>\n <section class=\"assistant-panel\">\n <header class=\"assistant-header\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"mascotTemplate\"\r\n [ngTemplateOutletContext]=\"{ large: true }\"\r\n ></ng-container>\r\n <div class=\"assistant-identity\">\r\n <h2 class=\"assistant-name\">{{ uiCopy.title }}</h2>\r\n <span class=\"assistant-subtitle\">{{ uiCopy.subtitle }}</span>\r\n </div>\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-refresh\"\r\n text\r\n rounded\r\n severity=\"secondary\"\r\n class=\"header-action\"\r\n [attr.aria-label]=\"uiCopy.clearLabel\"\r\n [pTooltip]=\"uiCopy.clearTooltip\"\r\n tooltipPosition=\"bottom\"\r\n (click)=\"clearChatSession()\"\r\n ></button>\r\n <button\r\n pButton\r\n type=\"button\"\r\n icon=\"pi pi-times\"\r\n text\r\n rounded\r\n severity=\"secondary\"\r\n class=\"header-action\"\r\n [attr.aria-label]=\"uiCopy.closeLabel\"\r\n (click)=\"closePanel()\"\r\n ></button>\r\n </header>\r\n\r\n <div #messagesViewport class=\"assistant-messages\">\r\n @for(message of messages(); track message.id) {\r\n <article class=\"message {{ message.role }}\" [class.error]=\"message.isError\">\r\n @if(message.displayResponse; as responseDetails) {\r\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.status) {\n <span class=\"assistant-status\">{{ message.status.replaceAll('_', ' ') }}</span>\r\n }\r\n @if(message.pendingAction; as pendingAction) {\r\n <section class=\"pending-action\" aria-label=\"Cortex action confirmation\">\r\n <div class=\"pending-action-heading\">\r\n <strong>Confirmation required</strong>\r\n <span>{{ pendingAction.method }}</span>\r\n </div>\r\n <p>{{ pendingAction.summary }}</p>\r\n <small>Expires {{ pendingAction.expiresAt | date: 'mediumTime' }}</small>\r\n @if(message.actionDecision; as actionDecision) {\r\n <p class=\"action-decision\">\r\n {{ actionDecision === 'approve' ? 'Approval sent' : 'Rejection sent' }}\r\n </p>\r\n } @else {\r\n <div class=\"pending-action-buttons\">\r\n <button\r\n pButton\r\n type=\"button\"\r\n size=\"small\"\r\n severity=\"success\"\r\n label=\"Approve\"\r\n [disabled]=\"isSending()\"\r\n (click)=\"resolvePendingAction(message, 'approve')\"\r\n ></button>\r\n <button\r\n pButton\r\n type=\"button\"\r\n size=\"small\"\r\n outlined\r\n severity=\"secondary\"\r\n label=\"Reject\"\r\n [disabled]=\"isSending()\"\r\n (click)=\"resolvePendingAction(message, 'reject')\"\r\n ></button>\r\n </div>\r\n }\r\n </section>\r\n }\r\n @if(getResponseGrid(responseDetails).length) {\r\n <div class=\"assistant-tables\">\r\n @for(table of getResponseGrid(responseDetails); track $index) {\r\n <section class=\"assistant-table-section\">\r\n @if(table.title) {\r\n <h3>{{ table.title }}</h3>\r\n }\r\n <div class=\"assistant-table-wrap\">\r\n <table>\r\n <thead>\r\n <tr>\r\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>\r\n </thead>\r\n <tbody>\r\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 }\r\n </tbody>\r\n </table>\r\n </div>\r\n </section>\r\n }\r\n </div>\r\n }\r\n @if(message.sources?.length) {\r\n <div class=\"assistant-sources\">\r\n <strong>Sources</strong>\r\n @for(source of message.sources ?? []; track source.citation) {\r\n <span>{{ source.citation }}</span>\r\n }\r\n </div>\r\n }\r\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, stage-by-stage 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 staged 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\">Stage {{ 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 <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 @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 returned by Supabase</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 {\r\n @if(message.role === 'assistant') {\r\n <div\r\n class=\"assistant-markdown\"\r\n [innerHTML]=\"message.content | maxAssistantMarkdown\"\r\n ></div>\r\n } @else {\r\n <p>{{ message.content }}</p>\r\n }\r\n }\r\n @if(message.role === 'assistant' && message.suggestions?.length) {\n <div class=\"suggestions\">\r\n @for(suggestion of message.suggestions ?? []; track suggestion) {\r\n <button\r\n pButton\r\n type=\"button\"\r\n size=\"small\"\r\n text\r\n severity=\"secondary\"\n class=\"suggestion-chip\"\n [label]=\"suggestionLabel(suggestion)\"\n (click)=\"useSuggestion(suggestion)\"\n ></button>\r\n }\n </div>\n }\n </article>\n }\r\n @if(isSending()) {\r\n <article class=\"message assistant typing\" [attr.aria-label]=\"uiCopy.typingLabel\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </article>\r\n }\r\n </div>\r\n\r\n <form class=\"assistant-composer\" (ngSubmit)=\"sendMessage()\">\r\n <textarea\r\n pTextarea\r\n name=\"assistantPrompt\"\r\n rows=\"2\"\r\n [placeholder]=\"uiCopy.placeholder\"\r\n [ngModel]=\"input()\"\r\n (ngModelChange)=\"input.set($event)\"\r\n (keydown)=\"onComposerKeydown($event)\"\r\n >\r\n </textarea>\r\n <button\r\n pButton\r\n type=\"submit\"\r\n icon=\"pi pi-send\"\r\n aria-label=\"Send message\"\r\n [disabled]=\"!input().trim() || isSending()\"\r\n ></button>\r\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/config/assistant.config';\nexport * from './lib/models/assistant.models';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MaxAssistantService"],"mappings":"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"}