max-agent-ui 0.0.11 → 0.0.13

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: 'Hi, I am Max, the Maxtime Virtual Assistant. How can I help you today?',\n initialSuggestions: ['Show my timetable', 'Open scheduling', 'View reports']\n },\n nemesys: {\n initialMessage: 'Hi, I am Max, the Maxtime Virtual Assistant. How can I help you today?',\n initialSuggestions: ['Show scheduling plans', 'Check resource availability', 'Find conflicts']\n },\n attendance: {\n initialMessage: 'Hi, I am Max, the 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 } from '@angular/core';\nimport { Observable, throwError } from 'rxjs';\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 = 'assistant';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MaxAssistantService {\n private readonly config = inject(MAX_ASSISTANT_CONFIG);\n private readonly http = inject(HttpClient, { optional: true });\n\n sendMessage(\n message: string,\n conversationId?: string,\n config: MaxAssistantConfig = {}\n ): Observable<AssistantChatResponse> {\n const assistantConfig = {\n ...this.config,\n ...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);\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","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, inject, 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 AssistantFieldMap,\n AssistantMessage,\n AssistantProduct,\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 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() 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 private readonly assistantService = inject(MaxAssistantService);\n private readonly destroyRef = inject(DestroyRef);\n\n protected openPanel() {\n this.panelVisible.set(true);\n\n if (!this.messages().length && this.bootstrapConfig.initialMessage) {\n this.messages.set([\n this.createMessage(\n 'assistant',\n this.bootstrapConfig.initialMessage,\n this.bootstrapConfig.initialSuggestions\n )\n ]);\n }\n\n this.scrollToLatest();\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 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 private getAssistantConfig(): MaxAssistantConfig {\n return {\n app: this.app,\n user: this.user\n };\n }\n\n private appendMessage(message: AssistantMessage) {\n this.messages.update(messages => [...messages, message]);\n this.scrollToLatest();\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.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 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 formattedApiBody: this.formatJson(displayResponse?.agentExtractedIntent?.api?.body),\n formattedApiResponse: this.formatJson(displayResponse?.apiResponse),\n suggestions,\n sources,\n intent,\n intentLabel,\n app,\n productLabel,\n apiModule,\n confidence,\n parameters,\n entities: parameters,\n apiCalls,\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\n return {\n userQuery: provided.userQuery || userQuery,\n agentInferredResponse: provided.agentInferredResponse || response.answer,\n agentExtractedIntent: extractedIntent,\n apiResponse: provided.apiResponse ?? this.getApiResponseFallback(response),\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 getApiResponseFallback(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 formatJson(value: unknown): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n return JSON.stringify(value, null, 2);\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 [attr.aria-label]=\"uiCopy.launcherLabel\"\n [pTooltip]=\"uiCopy.openTooltip\"\n tooltipPosition=\"left\"\n (click)=\"openPanel()\"\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-times\"\n text\n rounded\n severity=\"secondary\"\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 <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 Details' : 'Show 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 <strong>Parameters</strong>\n <pre>{{ message.formattedParameters }}</pre>\n </div>\n }\n\n @if(intent.api?.url || intent.api?.method) {\n <div class=\"api-call-summary\">\n <strong>API Called</strong>\n <code>{{ intent.api?.method || 'GET' }} {{ intent.api?.url || 'URL not provided' }}</code>\n </div>\n }\n\n @if(message.formattedApiBody) {\n <div class=\"json-block\">\n <strong>API Body</strong>\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 <strong>JSON</strong>\n <pre>{{ message.formattedApiResponse }}</pre>\n </div>\n </section>\n }\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":[],"mappings":"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"}
1
+ {"version":3,"file":"max-agent-ui.mjs","sources":["../../../projects/max-agent-ui/src/lib/config/assistant-bootstrap.config.ts","../../../projects/max-agent-ui/src/lib/config/assistant.config.ts","../../../projects/max-agent-ui/src/lib/components/assistant/max-assistant.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":";;;;;;;;;;;;;;;;;;;AAOA,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,iFAAiF;AACjG,QAAA,kBAAkB,EAAE;YAClB,wCAAwC;YACxC,+CAA+C;YAC/C,2CAA2C;YAC3C,8CAA8C;YAC9C;AACD;AACF,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,cAAc,EAAE,iFAAiF;AACjG,QAAA,kBAAkB,EAAE,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,gBAAgB;AAC9F,KAAA;AACD,IAAA,UAAU,EAAE;AACV,QAAA,cAAc,EAAE,iFAAiF;AACjG,QAAA,kBAAkB,EAAE,CAAC,yBAAyB,EAAE,yBAAyB,EAAE,cAAc;AAC1F;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;;MC/Ba,oBAAoB,GAAG,IAAI,cAAc,CACpD,sBAAsB,EACtB;AACE,IAAA,OAAO,EAAE,OAAO,EAAE;AACnB,CAAA;;ACDH,MAAM,0BAA0B,GAC9B,2EAA2E;AAC7E,MAAM,WAAW,GAAG,QAAQ;MAKf,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,SAA6B,EAAE,EAAA;AAE/B,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;AACd,YAAA,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACjC,YAAA,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe;SACnC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC;IACnD;IAEQ,WAAW,CACjB,OAA6B,EAC7B,MAA0B,EAAA;AAE1B,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,OAAO,UAAU,CACf,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CACzF;QACH;AAEA,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAwB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CACjF,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE,QAAQ,CAAC,CAAC,CAChF;IACH;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,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;AA5DW,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;;;ACIL,MAAM,iBAAiB,GAAG;AACxB,IAAA,KAAK,EAAE,KAAK;AACZ,IAAA,QAAQ,EAAE,2BAA2B;AACrC,IAAA,aAAa,EAAE,gCAAgC;AAC/C,IAAA,WAAW,EAAE,gCAAgC;AAC7C,IAAA,UAAU,EAAE,iCAAiC;AAC7C,IAAA,UAAU,EAAE,oBAAoB;AAChC,IAAA,YAAY,EAAE,oBAAoB;AAClC,IAAA,WAAW,EAAE,+BAA+B;AAC5C,IAAA,WAAW,EAAE,qCAAqC;AAClD,IAAA,YAAY,EAAE;CACf;MAQY,qBAAqB,CAAA;AAiBb,IAAA,gBAAA;AACA,IAAA,UAAA;AAjBoB,IAAA,gBAAgB;AAE9C,IAAA,GAAG;AACH,IAAA,eAAe;IACf,IAAI,GAEwB,EAAE;AAEpB,IAAA,YAAY,GAAG,MAAM,CAAC,KAAK,mFAAC;AAC5B,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,gFAAC;AACzB,IAAA,KAAK,GAAG,MAAM,CAAC,EAAE,4EAAC;AAClB,IAAA,cAAc,GAAG,MAAM,CAAqB,SAAS,qFAAC;AACtD,IAAA,QAAQ,GAAG,MAAM,CAAqB,EAAE,+EAAC;AACzC,IAAA,2BAA2B,GAAG,MAAM,CAAsB,IAAI,GAAG,EAAU,kGAAC;IAE/F,WAAA,CACmB,gBAAqC,EACrC,UAAsB,EAAA;QADtB,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,UAAU,GAAV,UAAU;IAC1B;IAEO,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAE3B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;YAC3B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACjD;QAEA,IAAI,CAAC,cAAc,EAAE;IACvB;IAEU,WAAW,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;YACvB,IAAI,CAAC,UAAU,EAAE;YACjB;QACF;QAEA,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,IAAc,aAAa,GAAA;QACzB,OAAO,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;IACjF;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;IAEU,UAAU,GAAA;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;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,2BAA2B,CAAC,GAAG,CAAC,IAAI,GAAG,EAAU,CAAC;QACvD,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,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,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,CAAC;AACF,aAAA,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,kBAAkB,EAAE;AAC5E,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,cAAc,CAAC,CAAC;AACjF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B,CAAC;YACD,KAAK,EAAE,MAAK;gBACV,IAAI,CAAC,aAAa,CAAC;oBACjB,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;AAC5D,oBAAA,OAAO,EAAE;AACV,iBAAA,CAAC;AACF,gBAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;YAC3B;AACD,SAAA,CAAC;IACN;AAEU,IAAA,aAAa,CAAC,UAAkB,EAAA;AACxC,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;IAC9B;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,yBAAyB,CAAC,SAAiB,EAAA;QACnD,OAAO,IAAI,CAAC,2BAA2B,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC;IAC1D;AAEU,IAAA,sBAAsB,CAAC,SAAiB,EAAA;QAChD,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC;AAE3D,QAAA,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,WAAW,IAAG;AACpD,YAAA,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC;AAE5C,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;AAClC,gBAAA,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC;YACnC;iBAAO;AACL,gBAAA,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC;AAEA,YAAA,OAAO,eAAe;AACxB,QAAA,CAAC,CAAC;QAEF,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;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;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,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,qBAAqB,GAAA;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;AACxC,YAAA,OAAO,EAAE;QACX;QAEA,OAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAChB,WAAW,EACX,IAAI,CAAC,eAAe,CAAC,cAAc,EACnC,IAAI,CAAC,eAAe,CAAC,kBAAkB;SAE1C;IACH;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,EACZ,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,EACxC,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,gBAAgB,EACzB,eAAe,CAChB;IACH;AAEQ,IAAA,aAAa,CACnB,IAA8B,EAC9B,OAAe,EACf,WAAA,GAAwB,EAAE,EAC1B,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,EAAA;QAE1C,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,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,QAAQ,EAAE,QAAQ,CAAC;SACpB;IACH;IAEQ,qBAAqB,CAC3B,QAA+B,EAC/B,QAAmC,EAAA;QAEnC,OAAO;YACL,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY,IAAI,QAAQ,CAAC,GAAG;AACnE,YAAA,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,GAAG;AAChD,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,SAAS;AAC9C,YAAA,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,QAAQ,CAAC,MAAM;AAC3C,YAAA,WAAW,EAAE,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,WAAW;AAC1D,YAAA,UAAU,EAAE,QAAQ,EAAE,UAAU,IAAI,QAAQ,CAAC,UAAU;YACvD,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;SAC5C;IACH;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;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,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;wGArZW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,mBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,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,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,EC9ClC,4+SAkQA,EAAA,MAAA,EAAA,CAAA,gqlEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDxNY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,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,sGAAA,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,yEAAA,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,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,iBAAA,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,EAAE,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,aAAA,EAAA,OAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,YAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,WAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,cAAc,8OAAE,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,gBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,CAAA;;4FAInF,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,OAAA,EAChB,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,CAAC,EAAA,QAAA,EAAA,4+SAAA,EAAA,MAAA,EAAA,CAAA,gqlEAAA,CAAA,EAAA;;sBAK9F,SAAS;uBAAC,kBAAkB;;sBAE5B;;sBACA;;sBACA;;;AEnDH;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "max-agent-ui",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/"
6
6
  },
@@ -1,5 +1,7 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { InjectionToken } from '@angular/core';
2
+ import { InjectionToken, DestroyRef } from '@angular/core';
3
+ import { HttpClient } from '@angular/common/http';
4
+ import { Observable } from 'rxjs';
3
5
 
4
6
  type AssistantProduct = string;
5
7
  type AssistantFieldValue = string | number | boolean | null | AssistantFieldValue[] | {
@@ -16,6 +18,7 @@ interface AssistantApiCall {
16
18
  method: string;
17
19
  url: string;
18
20
  purpose?: string;
21
+ headers?: AssistantFieldMap;
19
22
  params?: AssistantFieldMap;
20
23
  body?: AssistantFieldMap;
21
24
  }
@@ -34,11 +37,24 @@ interface AssistantDisplayResponse {
34
37
  userQuery?: string;
35
38
  agentExtractedIntent?: AssistantExtractedIntent;
36
39
  apiResponse?: AssistantFieldValue | AssistantFieldMap;
40
+ sampleJsonResponse?: AssistantFieldValue | AssistantFieldMap;
41
+ grid?: AssistantResponseTable[];
42
+ tables?: AssistantResponseTable[];
37
43
  markdown?: string;
38
44
  }
45
+ interface AssistantResponseTableColumn {
46
+ field: string;
47
+ header: string;
48
+ }
49
+ interface AssistantResponseTable {
50
+ title?: string;
51
+ columns: AssistantResponseTableColumn[];
52
+ rows: AssistantFieldMap[];
53
+ }
39
54
  interface AssistantUser {
40
55
  [key: string]: AssistantFieldValue | undefined;
41
56
  token?: string;
57
+ version?: string;
42
58
  }
43
59
  interface AssistantChatRequest {
44
60
  message: string;
@@ -61,6 +77,7 @@ interface AssistantChatResponse {
61
77
  parameters?: AssistantFieldMap;
62
78
  entities?: AssistantFieldMap;
63
79
  apiCalls?: AssistantApiCall[];
80
+ apiResult?: AssistantFieldMap;
64
81
  mockResult?: AssistantFieldMap;
65
82
  llmUsed?: boolean;
66
83
  availableModules?: string[];
@@ -73,8 +90,10 @@ interface AssistantMessage {
73
90
  createdAt: Date;
74
91
  displayResponse?: AssistantDisplayResponse;
75
92
  formattedParameters?: string;
93
+ formattedApiHeaders?: string;
76
94
  formattedApiBody?: string;
77
95
  formattedApiResponse?: string;
96
+ formattedSampleJsonResponse?: string;
78
97
  suggestions?: string[];
79
98
  sources?: AssistantSource[];
80
99
  intent?: string;
@@ -86,6 +105,7 @@ interface AssistantMessage {
86
105
  parameters?: AssistantFieldMap;
87
106
  entities?: AssistantFieldMap;
88
107
  apiCalls?: AssistantApiCall[];
108
+ apiResult?: AssistantFieldMap;
89
109
  mockResult?: AssistantFieldMap;
90
110
  llmUsed?: boolean;
91
111
  availableModules?: string[];
@@ -97,19 +117,45 @@ interface AssistantBootstrapConfig {
97
117
  initialSuggestions: string[];
98
118
  }
99
119
 
120
+ interface MaxAssistantConfig {
121
+ assistantApiUrl?: string;
122
+ app?: AssistantProduct;
123
+ user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);
124
+ }
125
+ declare const MAX_ASSISTANT_CONFIG: InjectionToken<MaxAssistantConfig>;
126
+
127
+ declare class MaxAssistantService {
128
+ private readonly config;
129
+ private readonly http;
130
+ constructor(config: MaxAssistantConfig, http: HttpClient | null);
131
+ sendMessage(message: string, conversationId?: string, config?: MaxAssistantConfig): Observable<AssistantChatResponse>;
132
+ private postMessage;
133
+ private getChatUrl;
134
+ private getApp;
135
+ private getUser;
136
+ private compactConfig;
137
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MaxAssistantService, [null, { optional: true; }]>;
138
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MaxAssistantService>;
139
+ }
140
+
100
141
  declare const ASSISTANT_UI_COPY: {
101
142
  title: string;
102
143
  subtitle: string;
103
144
  launcherLabel: string;
104
145
  openTooltip: string;
105
146
  closeLabel: string;
147
+ clearLabel: string;
148
+ clearTooltip: string;
106
149
  placeholder: string;
107
150
  typingLabel: string;
108
151
  errorMessage: string;
109
152
  };
110
153
  declare class MaxAssistantComponent {
154
+ private readonly assistantService;
155
+ private readonly destroyRef;
111
156
  private messagesViewport?;
112
157
  app?: AssistantProduct;
158
+ assistantApiUrl?: string;
113
159
  user: Partial<AssistantUser> | (() => Partial<AssistantUser>);
114
160
  protected readonly panelVisible: _angular_core.WritableSignal<boolean>;
115
161
  protected readonly isSending: _angular_core.WritableSignal<boolean>;
@@ -117,37 +163,42 @@ declare class MaxAssistantComponent {
117
163
  protected readonly conversationId: _angular_core.WritableSignal<string | undefined>;
118
164
  protected readonly messages: _angular_core.WritableSignal<AssistantMessage[]>;
119
165
  protected readonly expandedInferenceMessageIds: _angular_core.WritableSignal<ReadonlySet<string>>;
120
- private readonly assistantService;
121
- private readonly destroyRef;
166
+ constructor(assistantService: MaxAssistantService, destroyRef: DestroyRef);
122
167
  protected openPanel(): void;
168
+ protected togglePanel(): void;
169
+ protected get launcherLabel(): string;
123
170
  protected get uiCopy(): typeof ASSISTANT_UI_COPY;
124
171
  protected get bootstrapConfig(): AssistantBootstrapConfig;
125
172
  protected closePanel(): void;
173
+ protected clearChatSession(): void;
126
174
  protected sendMessage(message?: string): void;
127
175
  protected useSuggestion(suggestion: string): void;
128
176
  protected onComposerKeydown(event: KeyboardEvent): void;
129
177
  protected isInferenceDetailsVisible(messageId: string): boolean;
130
178
  protected toggleInferenceDetails(messageId: string): void;
179
+ protected getResponseGrid(responseDetails: AssistantDisplayResponse): AssistantResponseTable[];
131
180
  private getAssistantConfig;
132
181
  private appendMessage;
182
+ private createDefaultMessages;
133
183
  private createAssistantResponseMessage;
134
184
  private createMessage;
135
185
  private createDisplayResponse;
136
186
  private createExtractedIntent;
137
- private getApiResponseFallback;
187
+ private getSampleJsonResponseFallback;
188
+ private getDisplayTables;
189
+ private extractTableRows;
190
+ private getTableColumns;
191
+ private formatTableRow;
192
+ private formatCellValue;
193
+ private toColumnHeader;
138
194
  private formatJson;
195
+ private isEmptyObject;
196
+ private isFieldMap;
139
197
  private createId;
140
198
  private scrollToLatest;
141
199
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MaxAssistantComponent, never>;
142
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MaxAssistantComponent, "max-assistant", never, { "app": { "alias": "app"; "required": false; }; "user": { "alias": "user"; "required": false; }; }, {}, never, never, true, never>;
200
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MaxAssistantComponent, "max-assistant", never, { "app": { "alias": "app"; "required": false; }; "assistantApiUrl": { "alias": "assistantApiUrl"; "required": false; }; "user": { "alias": "user"; "required": false; }; }, {}, never, never, true, never>;
143
201
  }
144
202
 
145
- interface MaxAssistantConfig {
146
- assistantApiUrl?: string;
147
- app?: AssistantProduct;
148
- user?: Partial<AssistantUser> | (() => Partial<AssistantUser>);
149
- }
150
- declare const MAX_ASSISTANT_CONFIG: InjectionToken<MaxAssistantConfig>;
151
-
152
203
  export { MAX_ASSISTANT_CONFIG, MaxAssistantComponent };
153
- export type { AssistantApiCall, AssistantChatRequest, AssistantChatResponse, AssistantDisplayResponse, AssistantExtractedIntent, AssistantFieldMap, AssistantFieldValue, AssistantMessage, AssistantProduct, AssistantSource, AssistantUser, MaxAssistantConfig };
204
+ export type { AssistantApiCall, AssistantChatRequest, AssistantChatResponse, AssistantDisplayResponse, AssistantExtractedIntent, AssistantFieldMap, AssistantFieldValue, AssistantMessage, AssistantProduct, AssistantResponseTable, AssistantResponseTableColumn, AssistantSource, AssistantUser, MaxAssistantConfig };