@m6d/cortex-client 1.6.0 → 1.7.0

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":"m6d-cortex-client.mjs","sources":["../../../projects/cortex-client/src/lib/config.ts","../../../projects/cortex-client/src/lib/utils/create-latch.ts","../../../projects/cortex-client/src/lib/services/cortex-websocket.service.ts","../../../projects/cortex-client/src/lib/services/cortex-chat.service.ts","../../../projects/cortex-client/src/lib/components/message-aborted-flag/message-aborted-flag.component.ts","../../../projects/cortex-client/src/lib/components/message-aborted-flag/message-aborted-flag.component.html","../../../projects/cortex-client/src/lib/pipes/marked.pipe.ts","../../../projects/cortex-client/src/lib/utils/stream-text-smoother.ts","../../../projects/cortex-client/src/lib/components/message-text-part/message-text-part.component.ts","../../../projects/cortex-client/src/lib/components/message-text-part/message-text-part.component.html","../../../projects/cortex-client/src/lib/components/message-reasoning-part/message-reasoning-part.component.ts","../../../projects/cortex-client/src/lib/components/message-reasoning-part/message-reasoning-part.component.html","../../../projects/cortex-client/src/lib/pipes/highlight.pipe.ts","../../../projects/cortex-client/src/lib/components/json-tree/json-tree.component.ts","../../../projects/cortex-client/src/lib/components/json-tree/json-tree.component.html","../../../projects/cortex-client/src/lib/components/message-tool-call-part/message-tool-call-part.component.ts","../../../projects/cortex-client/src/lib/components/message-tool-call-part/message-tool-call-part.component.html","../../../projects/cortex-client/src/lib/components/message-capture-file-part/message-capture-files-part.component.ts","../../../projects/cortex-client/src/lib/components/message-capture-file-part/message-capture-files-part.component.html","../../../projects/cortex-client/src/lib/components/message-tool-call-animated/message-tool-call-animated.component.ts","../../../projects/cortex-client/src/lib/components/message-tool-call-animated/message-tool-call-animated.component.html","../../../projects/cortex-client/src/lib/components/subtle-activity/subtle-activity.component.ts","../../../projects/cortex-client/src/lib/components/subtle-activity/subtle-activity.component.html","../../../projects/cortex-client/src/lib/components/message-reasoning-animated/message-reasoning-animated.component.ts","../../../projects/cortex-client/src/lib/components/message-reasoning-animated/message-reasoning-animated.component.html","../../../projects/cortex-client/src/lib/components/tool-call-endpoint-animated/tool-call-endpoint-animated.component.ts","../../../projects/cortex-client/src/lib/components/tool-query-graph-animated/tool-query-graph-animated.component.ts","../../../projects/cortex-client/src/lib/components/tool-execute-code-animated/tool-execute-code-animated.component.ts","../../../projects/cortex-client/src/lib/components/message-part/message-part.component.ts","../../../projects/cortex-client/src/lib/components/message-part/message-part.component.html","../../../projects/cortex-client/src/lib/components/message-token-usage/message-token-usage.component.ts","../../../projects/cortex-client/src/lib/components/message-token-usage/message-token-usage.component.html","../../../projects/cortex-client/src/lib/components/message/message.component.ts","../../../projects/cortex-client/src/lib/components/message/message.component.html","../../../projects/cortex-client/src/lib/components/message-list/message-list.component.ts","../../../projects/cortex-client/src/lib/components/message-list/message-list.component.html","../../../projects/cortex-client/src/lib/i18n/translate-loader.ts","../../../projects/cortex-client/src/lib/components/chat-widget/chat-widget.component.ts","../../../projects/cortex-client/src/lib/components/chat-widget/chat-widget.component.html","../../../projects/cortex-client/src/public-api.ts","../../../projects/cortex-client/src/m6d-cortex-client.ts"],"sourcesContent":["import { Signal, Type, InjectionToken, Injector } from '@angular/core';\nimport { ChatOnToolCallCallback, UIDataTypes, UIMessage, UITools } from 'ai';\n\nexport type CortexClientTransport = {\n baseUrl: string | Signal<string>;\n getAuthHeaders: () => Record<string, string> | Promise<Record<string, string>>;\n};\n\nexport type CortexClientConfig = {\n locale: string;\n transport: CortexClientTransport;\n wsUrl?: string;\n toolComponents?: Record<string, Type<unknown>>;\n injector?: Injector;\n showDebugButton?: boolean;\n onToolCall?: (\n toolCall: Parameters<ChatOnToolCallCallback>[0]['toolCall'],\n ) => Promise<unknown> | unknown;\n};\n\nexport const CORTEX_CLIENT_CONFIG = new InjectionToken<CortexClientConfig>('CORTEX_CLIENT_CONFIG');\n","export function createLatch(count: number, onComplete: () => Promise<void> | void) {\n let remaining = count;\n return async () => {\n if (--remaining === 0) await onComplete();\n };\n}\n","import { inject, Injectable, NgZone, Signal } from '@angular/core';\nimport { Observable, retry, share, Subject, timer } from 'rxjs';\nimport { CORTEX_CLIENT_CONFIG } from '../config';\nimport { WsEvent } from '../ws-events';\n\n@Injectable()\nexport class CortexClientWebSocketService {\n private readonly openedSubject = new Subject<void>();\n private readonly events$: Observable<WsEvent>;\n\n public constructor() {\n const config = inject(CORTEX_CLIENT_CONFIG);\n const ngZone = inject(NgZone);\n\n this.events$ = new Observable<WsEvent>((subscriber) => {\n const wsUrl = resolveWsUrl(config.wsUrl, config.transport.baseUrl);\n let ws: WebSocket | undefined;\n\n Promise.resolve(config.transport.getAuthHeaders()).then((headers) => {\n if (subscriber.closed) return;\n\n const fullWsUrl = appendTokenToUrl(wsUrl, headers);\n ws = new WebSocket(fullWsUrl);\n\n ws.addEventListener('open', () => {\n ngZone.run(() => this.openedSubject.next());\n });\n\n ws.addEventListener('message', (event) => {\n let parsed: WsEvent;\n try {\n parsed = JSON.parse(event.data);\n } catch {\n return;\n }\n\n ngZone.run(() => subscriber.next(parsed));\n });\n\n ws.addEventListener('error', (e) => subscriber.error(e));\n ws.addEventListener('close', () => subscriber.error(new Error('WebSocket closed')));\n });\n\n return () => ws?.close();\n }).pipe(\n retry({\n delay: (_: unknown, retryCount: number) =>\n timer(Math.min(1000 * 2 ** (retryCount - 1), 30_000)),\n }),\n share(),\n );\n }\n\n public get events() {\n return this.events$;\n }\n\n public get opened() {\n return this.openedSubject.asObservable();\n }\n}\n\nfunction resolveWsUrl(wsUrl: string | undefined, baseUrl: string | Signal<string>) {\n const resolvedUrl = wsUrl ?? deriveWsUrl(baseUrl);\n if (!wsUrl) return resolvedUrl;\n\n const agentId = extractAgentId(baseUrl);\n if (!agentId) return resolvedUrl;\n\n return appendAgentIdToUrl(resolvedUrl, agentId);\n}\n\nfunction deriveWsUrl(baseUrl: string | Signal<string>) {\n const url = typeof baseUrl === 'string' ? baseUrl : baseUrl();\n const parsed = new URL(url, window.location.origin);\n parsed.protocol = parsed.protocol === 'https:' ? 'wss:' : 'ws:';\n parsed.pathname = parsed.pathname.replace(/\\/$/, '') + '/ws';\n return parsed.toString();\n}\n\nfunction extractAgentId(baseUrl: string | Signal<string>) {\n const url = typeof baseUrl === 'string' ? baseUrl : baseUrl();\n const parsed = new URL(url, window.location.origin);\n const segments = parsed.pathname.split('/').filter(Boolean);\n const agentsIndex = segments.lastIndexOf('agents');\n if (agentsIndex === -1) return undefined;\n\n return segments[agentsIndex + 1];\n}\n\nfunction appendAgentIdToUrl(wsUrl: string, agentId: string) {\n const parsed = new URL(wsUrl, window.location.origin);\n if (parsed.searchParams.has('agentId') || hasAgentIdInPath(parsed)) return parsed.toString();\n\n parsed.searchParams.set('agentId', agentId);\n return parsed.toString();\n}\n\nfunction hasAgentIdInPath(url: URL) {\n const segments = url.pathname.split('/').filter(Boolean);\n const agentsIndex = segments.lastIndexOf('agents');\n return agentsIndex !== -1 && Boolean(segments[agentsIndex + 1]);\n}\n\nfunction appendTokenToUrl(wsUrl: string, headers: Record<string, string>) {\n const authHeader = headers['Authorization'] ?? headers['authorization'];\n if (!authHeader?.startsWith('Bearer ')) return wsUrl;\n\n const parsed = new URL(wsUrl, window.location.origin);\n if (parsed.searchParams.has('token')) return parsed.toString();\n\n parsed.searchParams.set('token', authHeader.slice(7));\n return parsed.toString();\n}\n","import { computed, DestroyRef, inject, Injectable, Signal, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Chat } from '@ai-sdk/angular';\nimport { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls, UIMessage } from 'ai';\nimport { defer, finalize, map, of, Subject, switchMap, tap } from 'rxjs';\nimport { fromPromise } from 'rxjs/internal/observable/innerFrom';\nimport { CORTEX_CLIENT_CONFIG } from '../config';\nimport { MessageMetadata } from '../types';\nimport { ThreadSummary } from '../ws-events';\nimport { createLatch } from '../utils/create-latch';\nimport { CortexClientWebSocketService } from './cortex-websocket.service';\n\nexport type Thread = ThreadSummary;\n\n@Injectable()\nexport class CortexChatService {\n public readonly threads = signal<Thread[] | undefined>(undefined);\n public readonly selectedThread = signal<Thread | undefined>(undefined);\n public readonly chat = signal<Chat<UIMessage<MessageMetadata>> | undefined>(undefined);\n public readonly isLoadingMessages = signal(false);\n public readonly isAgentWorking = computed(() => {\n const chat = this.chat();\n if (!chat) return false;\n const status = chat.status;\n return status === 'submitted' || status === 'streaming';\n });\n public readonly hasPendingToolCalls = signal(false);\n\n private readonly events = new Subject<\n 'onThreadSelected' | 'onSend' | 'onData' | 'onError' | 'onFinish'\n >();\n private activeThreadSelectionId = 0;\n private completeLatchThreadId: string | undefined = undefined;\n private hasSeenWsOpen = false;\n private readonly config = inject(CORTEX_CLIENT_CONFIG);\n private readonly wsService = inject(CortexClientWebSocketService);\n private readonly destroyRef = inject(DestroyRef);\n private completeLatch: ReturnType<typeof createLatch> | undefined = undefined;\n\n public constructor() {\n this.reloadThreads().subscribe();\n this.subscribeToWsEvents();\n this.subscribeToWsConnections();\n }\n\n public get events$() {\n return this.events.asObservable();\n }\n\n public selectThread(thread: Thread, options?: { skipLoadingMessages?: boolean }) {\n if (this.selectedThread()?.id === thread.id && this.chat() && !this.isLoadingMessages()) {\n return of();\n }\n\n const selectionId = ++this.activeThreadSelectionId;\n\n return (\n options?.skipLoadingMessages\n ? of([] as UIMessage<MessageMetadata>[])\n : defer(() => {\n this.isLoadingMessages.set(true);\n return fromPromise(\n this.fetchJson<UIMessage<MessageMetadata>[]>(`/threads/${thread.id}/messages`),\n ).pipe(\n finalize(() => {\n if (selectionId === this.activeThreadSelectionId) {\n this.isLoadingMessages.set(false);\n }\n }),\n );\n })\n ).pipe(\n tap((messages) => {\n if (selectionId !== this.activeThreadSelectionId) return;\n\n const chat = new Chat({\n id: thread.id,\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n\n onData: () => {\n this.events.next('onData');\n },\n\n onToolCall: async ({ toolCall }) => {\n if (!this.config.onToolCall) return;\n\n const result = this.config.onToolCall(toolCall);\n if (result === null || result === undefined) return;\n\n const output = result instanceof Promise ? await result : result;\n if (output === null || output === undefined) return;\n\n chat.addToolOutput({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n output,\n });\n },\n\n onError: async () => {\n this.hasPendingToolCalls.set(false);\n this.events.next('onError');\n await this.completeLatch?.();\n },\n\n onFinish: async () => {\n this.hasPendingToolCalls.set(this.hasIncompleteToolCalls(chat.messages));\n this.events.next('onFinish');\n if (this.completeLatch) {\n await this.completeLatch();\n } else {\n this.onThreadMessagesUpdated({ threadId: thread.id });\n }\n },\n\n messages,\n transport: new DefaultChatTransport({\n api: this.resolveUrl('/chat'),\n headers: async () => await this.resolveHeaders(),\n prepareSendMessagesRequest: ({ messages, id, body, ...rest }) => {\n this.hasPendingToolCalls.set(false);\n return {\n ...rest,\n body: {\n ...body,\n id,\n messages: [messages.at(-1)],\n },\n };\n },\n }),\n });\n\n fixChat(chat);\n this.chat.set(chat);\n this.selectedThread.set(thread);\n this.syncConversationState(messages);\n\n this.resumeChat(thread.id, {\n reloadMessagesFirst: false,\n reloadMessagesAfterResume: false,\n });\n\n this.events.next('onThreadSelected');\n }),\n );\n }\n\n public deselectThread() {\n this.activeThreadSelectionId += 1;\n this.chat()?.stop();\n this.isLoadingMessages.set(false);\n this.hasPendingToolCalls.set(false);\n this.completeLatch = undefined;\n this.completeLatchThreadId = undefined;\n\n if (!this.selectedThread() && !this.chat()) return;\n\n this.selectedThread.set(undefined);\n this.chat.set(undefined);\n }\n\n public send(prompt: string) {\n if (this.isAgentWorking() || this.hasPendingToolCalls()) return of();\n\n const ensureThread = this.selectedThread()\n ? of(this.selectedThread()!.id)\n : fromPromise(\n this.fetchJson<Thread>('/threads', {\n method: 'POST',\n body: JSON.stringify({ prompt }),\n }),\n ).pipe(\n tap((thread) => this.upsertThread(thread)),\n switchMap((thread) =>\n this.selectThread(thread, { skipLoadingMessages: true }).pipe(map(() => thread.id)),\n ),\n );\n\n return ensureThread.pipe(\n tap((threadId) => {\n this.events.next('onSend');\n this.updateThreadRunning(threadId, true);\n this.completeLatchThreadId = threadId;\n this.completeLatch = createLatch(2, () => {\n this.onThreadMessagesUpdated({ threadId });\n this.completeLatch = undefined;\n this.completeLatchThreadId = undefined;\n });\n }),\n switchMap(() => fromPromise(this.chat()!.sendMessage({ text: prompt }))),\n );\n }\n\n public abort() {\n const chat = this.chat();\n if (!chat || !this.isAgentWorking()) return;\n\n const threadId = this.selectedThread()?.id;\n if (threadId) {\n this.updateThreadRunning(threadId, false);\n this.fetchJson(`/chat/${threadId}/abort`, { method: 'POST' }).catch(() => {});\n }\n\n chat.stop();\n this.hasPendingToolCalls.set(false);\n }\n\n public deleteThread(threadId: string) {\n if (this.selectedThread()?.id === threadId) {\n this.deselectThread();\n }\n\n return fromPromise(this.fetchJson(`/threads/${threadId}`, { method: 'DELETE' })).pipe(\n tap(() => this.removeThread(threadId)),\n );\n }\n\n private subscribeToWsEvents() {\n this.wsService.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(async (event) => {\n switch (event.type) {\n case 'thread:created':\n this.upsertThread(event.payload.thread);\n break;\n case 'thread:deleted':\n this.onThreadDeleted(event.payload);\n break;\n case 'thread:title-updated':\n this.onThreadTitleUpdated(event.payload);\n break;\n case 'thread:run-started':\n await this.onThreadRunStarted(event.payload);\n break;\n case 'thread:run-finished':\n this.onThreadRunFinished(event.payload);\n break;\n case 'thread:messages-updated':\n this.upsertThread(event.payload.thread);\n if (this.completeLatch && this.completeLatchThreadId === event.payload.threadId) {\n await this.completeLatch();\n } else {\n this.onThreadMessagesUpdated(event.payload);\n }\n break;\n }\n });\n }\n\n private subscribeToWsConnections() {\n this.wsService.opened.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n if (!this.hasSeenWsOpen) {\n this.hasSeenWsOpen = true;\n return;\n }\n\n this.reloadThreads().subscribe(() => {\n const threadId = this.selectedThread()?.id;\n if (!threadId || this.isAgentWorking()) return;\n\n this.resumeChat(threadId, {\n reloadMessagesFirst: true,\n reloadMessagesAfterResume: true,\n });\n });\n });\n }\n\n private onThreadMessagesUpdated(payload: { threadId: string }) {\n const chat = this.chat();\n if (!chat || this.selectedThread()?.id !== payload.threadId) return;\n if (this.isAgentWorking()) return;\n\n this.reloadMessages(payload.threadId).subscribe((messages) => {\n if (this.chat() !== chat) return;\n if (this.selectedThread()?.id !== payload.threadId) return;\n chat.messages = messages;\n this.syncConversationState(messages);\n });\n }\n\n private async onThreadRunStarted(payload: { thread: Thread }) {\n this.upsertThread(payload.thread);\n\n if (this.selectedThread()?.id !== payload.thread.id || this.isAgentWorking()) return;\n\n await this.resumeChat(payload.thread.id, {\n reloadMessagesFirst: true,\n reloadMessagesAfterResume: true,\n });\n }\n\n private onThreadTitleUpdated(payload: { thread: Thread }) {\n this.upsertThread(payload.thread);\n }\n\n private onThreadRunFinished(payload: { thread: Thread }) {\n this.upsertThread(payload.thread);\n }\n\n private onThreadDeleted(payload: { threadId: string }) {\n this.removeThread(payload.threadId);\n\n if (this.selectedThread()?.id !== payload.threadId) return;\n\n this.deselectThread();\n }\n\n private upsertThread(thread: Thread) {\n const current = this.threads();\n const nextThreads = current ? [...current] : [];\n const existingIndex = nextThreads.findIndex((currentThread) => currentThread.id === thread.id);\n\n if (existingIndex === -1) {\n nextThreads.push(thread);\n } else {\n nextThreads[existingIndex] = { ...nextThreads[existingIndex], ...thread };\n }\n\n this.threads.set(this.sortThreads(nextThreads));\n\n const selected = this.selectedThread();\n if (selected?.id === thread.id) {\n this.selectedThread.set({ ...selected, ...thread });\n }\n }\n\n private removeThread(threadId: string) {\n const current = this.threads();\n if (!current) return;\n\n this.threads.set(current.filter((thread) => thread.id !== threadId));\n }\n\n private updateThreadRunning(threadId: string, isRunning: boolean) {\n const thread = this.threads()?.find((currentThread) => currentThread.id === threadId);\n if (thread) {\n this.upsertThread({ ...thread, isRunning });\n }\n\n const selected = this.selectedThread();\n if (selected?.id === threadId) {\n this.selectedThread.set({ ...selected, isRunning });\n }\n }\n\n private sortThreads(threads: Thread[]) {\n return [...threads].sort((left, right) => {\n const updatedAtDelta = Date.parse(right.updatedAt) - Date.parse(left.updatedAt);\n if (updatedAtDelta !== 0) return updatedAtDelta;\n\n return Date.parse(right.createdAt) - Date.parse(left.createdAt);\n });\n }\n\n private async resumeChat(\n threadId: string,\n options: {\n reloadMessagesFirst: boolean;\n reloadMessagesAfterResume: boolean;\n },\n ) {\n const chat = this.chat();\n if (!chat || this.selectedThread()?.id !== threadId) return;\n\n if (options.reloadMessagesFirst) {\n try {\n await this.reloadMessagesForSelectedThread(threadId);\n } catch {\n return;\n }\n\n if (this.chat() !== chat || this.selectedThread()?.id !== threadId) return;\n }\n\n void chat.resumeStream().then(() => {\n if (this.chat() !== chat || this.selectedThread()?.id !== threadId) return;\n if (this.isAgentWorking()) return;\n if (!options.reloadMessagesAfterResume) return;\n\n this.reloadMessagesForSelectedThread(threadId).catch(() => {});\n });\n }\n\n private async reloadMessagesForSelectedThread(threadId: string) {\n const chat = this.chat();\n if (!chat || this.selectedThread()?.id !== threadId) return;\n\n const messages = await this.fetchJson<UIMessage<MessageMetadata>[]>(\n `/threads/${threadId}/messages`,\n );\n if (this.chat() !== chat || this.selectedThread()?.id !== threadId) return;\n\n chat.messages = messages;\n this.syncConversationState(messages);\n }\n\n private reloadThreads() {\n return fromPromise(this.fetchJson<Thread[]>('/threads')).pipe(\n tap((threads) => this.threads.set(this.sortThreads(threads))),\n );\n }\n\n private reloadMessages(threadId: string) {\n return fromPromise(\n this.fetchJson<UIMessage<MessageMetadata>[]>(`/threads/${threadId}/messages`),\n );\n }\n\n private syncConversationState(messages: UIMessage<MessageMetadata>[]) {\n this.hasPendingToolCalls.set(this.hasIncompleteToolCalls(messages));\n }\n\n private hasIncompleteToolCalls(messages: UIMessage<MessageMetadata>[]) {\n const lastAssistantMessage = this.getLastAssistantMessage(messages);\n if (!lastAssistantMessage) return false;\n\n let lastStepStartIndex = -1;\n for (const [index, part] of lastAssistantMessage.parts.entries()) {\n if (part.type === 'step-start') {\n lastStepStartIndex = index;\n }\n }\n\n const toolParts = lastAssistantMessage.parts\n .slice(lastStepStartIndex + 1)\n .filter(\n (part) =>\n part.type.startsWith('tool-') &&\n !(part as { providerExecuted?: boolean }).providerExecuted,\n );\n\n return (\n toolParts.length > 0 &&\n toolParts.some((part) => {\n const state = (part as { state?: string }).state;\n return (\n state !== 'output-available' && state !== 'output-error' && state !== 'output-denied'\n );\n })\n );\n }\n\n private getLastAssistantMessage(messages: UIMessage<MessageMetadata>[]) {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role === 'assistant') {\n return message;\n }\n }\n\n return undefined;\n }\n\n private resolveUrl(path: string) {\n const baseUrl = this.config.transport.baseUrl;\n const base = typeof baseUrl === 'string' ? baseUrl : (baseUrl as Signal<string>)();\n return base.replace(/\\/$/, '') + path;\n }\n\n private async resolveHeaders() {\n return await Promise.resolve(this.config.transport.getAuthHeaders());\n }\n\n private async fetchJson<T>(path: string, init?: RequestInit) {\n const url = this.resolveUrl(path);\n const headers = await this.resolveHeaders();\n const res = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n ...init?.headers,\n },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n const text = await res.text();\n return text ? (JSON.parse(text) as T) : (undefined as T);\n }\n}\n\n/**\n * Override snapshot to avoid structuredClone failing on\n * Object.defineProperty getter/setter parts.\n */\nfunction fixChat(chat: Chat<UIMessage<MessageMetadata>>) {\n function deepClone<T>(value: T): T {\n if (value === null || value === undefined) return value;\n if (typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map(deepClone) as unknown as T;\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n }\n\n (chat as unknown as { state: { snapshot: unknown } }).state.snapshot = deepClone;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n selector: 'cortex-message-aborted-flag',\n templateUrl: './message-aborted-flag.component.html',\n styleUrl: './message-aborted-flag.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [TranslatePipe],\n host: { class: 'cortex-aborted-flag' },\n})\nexport class MessageAbortedFlagComponent {}\n","<span class=\"cortex-aborted-flag__line\"></span>\n<span class=\"cortex-aborted-flag__label\">\n <svg class=\"cortex-aborted-flag__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 1.5v5M6 8.75v.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n {{ 'translate_aborted' | translate }}\n</span>\n<span class=\"cortex-aborted-flag__line\"></span>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { marked } from 'marked';\nimport DOMPurify from 'dompurify';\n\n@Pipe({\n name: 'marked',\n standalone: true,\n})\nexport class MarkedPipe implements PipeTransform {\n public constructor(private readonly sanitizer: DomSanitizer) {}\n\n public transform(value: string | undefined | null) {\n if (!value) {\n return '';\n }\n\n let html = marked.parse(value, { async: false }) as string;\n\n html = html\n .replace(/<table>/g, '<div style=\"overflow-x:auto\"><table style=\"width:auto\">')\n .replace(/<\\/table>/g, '</table></div>')\n .replace(/<(t[hd])([\\s>])/g, '<$1 style=\"padding:0.5rem 1rem\"$2');\n\n return this.sanitizer.bypassSecurityTrustHtml(DOMPurify.sanitize(html));\n }\n}\n","/**\n * Smooths the display of streamed text by buffering incoming characters\n * and releasing them at a consistent rate, eliminating the jerky appearance\n * caused by uneven token delivery from LLMs.\n *\n * Uses a proportional drain strategy: each animation frame releases a fraction\n * of the buffered characters, creating natural smoothing that adapts to\n * the incoming token rate.\n */\nexport class StreamTextSmoother {\n private fullText = '';\n private displayedLength = 0;\n private animationFrameId: number | null = null;\n private isDone = false;\n\n /**\n * Fraction of buffer to release per frame.\n * At 60fps, 0.03 means roughly half the buffer drains in ~23 frames (~383ms).\n */\n private static readonly DRAIN_FRACTION = 0.03;\n\n /** Minimum characters to release per frame to prevent stalling at small buffer sizes. */\n private static readonly MIN_CHARS_PER_FRAME = 1;\n\n /** Faster drain fraction when the stream has completed, for a quick but smooth flush. */\n private static readonly DONE_DRAIN_FRACTION = 0.1;\n\n public constructor(private readonly onUpdate: (displayedText: string) => void) {}\n\n public seed(displayedText: string) {\n this.fullText = displayedText;\n this.displayedLength = displayedText.length;\n this.onUpdate(displayedText);\n }\n\n public update(newFullText: string, done: boolean) {\n this.fullText = newFullText;\n this.isDone = done;\n this.displayedLength = Math.min(this.displayedLength, this.fullText.length);\n\n if (done && this.displayedLength >= this.fullText.length) {\n this.onUpdate(this.fullText);\n this.stopAnimation();\n return;\n }\n\n if (!this.animationFrameId) {\n this.scheduleFrame();\n }\n }\n\n public destroy() {\n this.stopAnimation();\n }\n\n private scheduleFrame() {\n this.animationFrameId = requestAnimationFrame(() => this.tick());\n }\n\n private tick() {\n const bufferSize = this.fullText.length - this.displayedLength;\n\n if (bufferSize <= 0) {\n this.animationFrameId = null;\n return;\n }\n\n const fraction = this.isDone\n ? StreamTextSmoother.DONE_DRAIN_FRACTION\n : StreamTextSmoother.DRAIN_FRACTION;\n\n const charsToRelease = Math.max(\n StreamTextSmoother.MIN_CHARS_PER_FRAME,\n Math.ceil(bufferSize * fraction),\n );\n\n this.displayedLength = Math.min(this.fullText.length, this.displayedLength + charsToRelease);\n this.onUpdate(this.fullText.substring(0, this.displayedLength));\n\n if (this.displayedLength < this.fullText.length) {\n this.scheduleFrame();\n } else {\n this.animationFrameId = null;\n }\n }\n\n private stopAnimation() {\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n input,\n OnDestroy,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TextUIPart, UIMessage } from 'ai';\nimport { MarkedPipe } from '../../pipes/marked.pipe';\nimport { StreamTextSmoother } from '../../utils/stream-text-smoother';\n\n@Component({\n selector: 'cortex-message-text-part',\n templateUrl: './message-text-part.component.html',\n styleUrl: './message-text-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [MarkedPipe],\n})\nexport class MessageTextPartComponent implements OnDestroy {\n public readonly role = input.required<UIMessage['role']>();\n public readonly textPart = input.required<TextUIPart>();\n\n protected readonly displayedText = signal('');\n\n private smoother: StreamTextSmoother | null = null;\n private isFirstRender = true;\n\n public constructor() {\n effect(() => {\n const part = this.textPart();\n const role = this.role();\n const isStreaming = part.state === 'streaming';\n\n if (role !== 'assistant') {\n this.destroySmoother();\n this.displayedText.set(part.text);\n this.isFirstRender = false;\n return;\n }\n\n if (!isStreaming) {\n this.destroySmoother();\n this.displayedText.set(part.text);\n this.isFirstRender = false;\n return;\n }\n\n if (this.isFirstRender) {\n this.ensureSmoother();\n this.smoother!.seed(part.text);\n this.isFirstRender = false;\n return;\n }\n\n this.isFirstRender = false;\n\n this.ensureSmoother();\n\n this.smoother!.update(part.text, false);\n });\n }\n\n public ngOnDestroy() {\n this.destroySmoother();\n }\n\n private destroySmoother() {\n if (this.smoother) {\n this.smoother.destroy();\n this.smoother = null;\n }\n }\n\n private ensureSmoother() {\n if (this.smoother) {\n return;\n }\n\n this.smoother = new StreamTextSmoother((text) => this.displayedText.set(text));\n this.smoother.seed(this.displayedText());\n }\n}\n","<div\n class=\"cortex-text-part\"\n [class.cortex-text-part--assistant]=\"role() === 'assistant'\"\n [class.cortex-text-part--user]=\"role() === 'user'\"\n>\n <div\n class=\"cortex-text-bubble\"\n [class.cortex-text-bubble--assistant]=\"role() === 'assistant'\"\n [class.cortex-text-bubble--user]=\"role() === 'user'\"\n [innerHTML]=\"displayedText() | marked\"\n ></div>\n</div>\n","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { ReasoningUIPart } from 'ai';\n\n@Component({\n selector: 'cortex-message-reasoning-part',\n templateUrl: './message-reasoning-part.component.html',\n styleUrl: './message-reasoning-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgClass],\n})\nexport class MessageReasoningPartComponent {\n public readonly reasoningPart = input.required<ReasoningUIPart>();\n}\n","@let p = reasoningPart();\n<details class=\"cortex-reasoning-details\">\n <summary class=\"cortex-reasoning-details__summary\">\n <div class=\"cortex-reasoning-details__header\">\n <span class=\"cortex-reasoning-details__icon\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M10 2C6.686 2 4 4.686 4 8c0 1.655.672 3.154 1.757 4.243.362.363.576.858.576 1.371V14.5a1 1 0 0 0 1 1h5.334a1 1 0 0 0 1-1v-.886c0-.513.214-1.008.576-1.371A5.978 5.978 0 0 0 16 8c0-3.314-2.686-6-6-6Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M7.5 17.5h5M8.5 8a2 2 0 0 1 2-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n\n <div class=\"cortex-reasoning-details__title-group\">\n <div class=\"cortex-reasoning-details__title-row\">\n <div class=\"cortex-reasoning-details__title\">Reasoning</div>\n @if (p.state) {\n <span\n class=\"cortex-reasoning-details__badge\"\n [ngClass]=\"{\n 'cortex-reasoning-details__badge--streaming': p.state === 'streaming',\n 'cortex-reasoning-details__badge--done': p.state === 'done',\n }\"\n >\n {{ p.state === 'streaming' ? 'Streaming' : 'Done' }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <span class=\"cortex-reasoning-details__chevron\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"m5.75 8.25 4.25 4.25 4.25-4.25\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n </summary>\n\n <div class=\"cortex-reasoning-details__body\">\n <div class=\"cortex-reasoning-details__content\">\n <pre class=\"cortex-reasoning-details__pre\">{{\n p.text.trim() ? p.text : 'No reasoning provided.'\n }}</pre>\n </div>\n </div>\n</details>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport hljs from 'highlight.js/lib/core';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport sql from 'highlight.js/lib/languages/sql';\n\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('cypher', sql);\n\n@Pipe({ name: 'highlight', standalone: true })\nexport class HighlightPipe implements PipeTransform {\n public constructor(private readonly sanitizer: DomSanitizer) {}\n\n public transform(code: string, lang: string) {\n if (!code) return '';\n\n const highlighted = hljs.getLanguage(lang)\n ? hljs.highlight(code, { language: lang }).value\n : this.escapeHtml(code);\n\n return this.sanitizer.bypassSecurityTrustHtml(highlighted);\n }\n\n private escapeHtml(str: string) {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'cortex-json-tree',\n templateUrl: './json-tree.component.html',\n styleUrl: './json-tree.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet],\n host: { class: 'cortex-json-tree' },\n})\nexport class JsonTreeComponent {\n public readonly data = input.required<unknown>();\n public readonly expandDepth = input<number>(1);\n\n private collapsedPaths = new Set<string>();\n private userToggled = new Set<string>();\n\n protected isCollapsed(path: string, depth: number) {\n if (this.userToggled.has(path)) {\n return this.collapsedPaths.has(path);\n }\n return depth >= this.expandDepth();\n }\n\n protected toggle(path: string, depth: number) {\n this.userToggled.add(path);\n const currentlyCollapsed = this.isCollapsed(path, depth);\n if (currentlyCollapsed) {\n this.collapsedPaths.delete(path);\n } else {\n this.collapsedPaths.add(path);\n }\n }\n\n protected isObject(value: unknown) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n\n protected isArray(value: unknown) {\n return Array.isArray(value);\n }\n\n protected objectEntries(value: unknown) {\n if (!this.isObject(value)) return [];\n return Object.entries(value as Record<string, unknown>);\n }\n\n protected arrayItems(value: unknown) {\n return Array.isArray(value) ? value : [];\n }\n\n protected objectLength(value: unknown) {\n if (!this.isObject(value)) return 0;\n return Object.keys(value as Record<string, unknown>).length;\n }\n\n protected arrayLength(value: unknown) {\n return Array.isArray(value) ? value.length : 0;\n }\n\n protected formatPrimitive(value: unknown) {\n if (value === null || value === undefined) return 'null';\n if (typeof value === 'string') return JSON.stringify(value);\n return String(value);\n }\n\n protected primitiveClass(value: unknown) {\n if (value === null || value === undefined) return 'jt-null';\n if (typeof value === 'string') return 'jt-string';\n if (typeof value === 'number') return 'jt-number';\n if (typeof value === 'boolean') return 'jt-boolean';\n return '';\n }\n\n protected isContainer(value: unknown) {\n return this.isObject(value) || this.isArray(value);\n }\n\n protected parsed(value: unknown) {\n return this.deepParse(value);\n }\n\n private deepParse(value: unknown): unknown {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n return this.deepParse(JSON.parse(trimmed));\n } catch {\n return value;\n }\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => this.deepParse(item));\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n result[key] = this.deepParse(val);\n }\n return result;\n }\n return value;\n }\n}\n","<!-- Entry point: parse and render the root value -->\n<ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: parsed(data()), path: '$', depth: 0 }\"\n/>\n\n<!-- Recursive value renderer -->\n<ng-template #valueTemplate let-value let-path=\"path\" let-depth=\"depth\">\n @if (isObject(value)) {\n @if (objectLength(value) === 0) {\n <span class=\"jt-bracket\">{{ '{' }}{{ '}' }}</span>\n } @else {\n <span class=\"jt-toggle\" (click)=\"toggle(path, depth); $event.stopPropagation()\" role=\"button\">\n <span class=\"jt-arrow\" [class.jt-arrow--collapsed]=\"isCollapsed(path, depth)\">&#9662;</span>\n <span class=\"jt-bracket\">{{ '{' }}</span>\n </span>\n @if (isCollapsed(path, depth)) {\n <span\n class=\"jt-collapsed-hint\"\n (click)=\"toggle(path, depth); $event.stopPropagation()\"\n role=\"button\"\n >{{ objectLength(value) }}\n {{ objectLength(value) === 1 ? 'property' : 'properties' }}</span\n ><span class=\"jt-bracket\">{{ '}' }}</span>\n } @else {\n <div class=\"jt-indent\">\n @for (entry of objectEntries(value); track entry[0]; let last = $last) {\n <div class=\"jt-line\">\n <span class=\"jt-key\">\"{{ entry[0] }}\"</span><span class=\"jt-colon\">: </span>\n @if (isContainer(entry[1])) {\n <ng-container\n *ngTemplateOutlet=\"\n valueTemplate;\n context: { $implicit: entry[1], path: path + '.' + entry[0], depth: depth + 1 }\n \"\n />\n } @else {\n <span [class]=\"primitiveClass(entry[1])\">{{ formatPrimitive(entry[1]) }}</span>\n }\n @if (!last) {\n <span class=\"jt-comma\">,</span>\n }\n </div>\n }\n </div>\n <span class=\"jt-bracket\">{{ '}' }}</span>\n }\n }\n } @else if (isArray(value)) {\n @if (arrayLength(value) === 0) {\n <span class=\"jt-bracket\">[]</span>\n } @else {\n <span class=\"jt-toggle\" (click)=\"toggle(path, depth); $event.stopPropagation()\" role=\"button\">\n <span class=\"jt-arrow\" [class.jt-arrow--collapsed]=\"isCollapsed(path, depth)\">&#9662;</span>\n <span class=\"jt-bracket\">[</span>\n </span>\n @if (isCollapsed(path, depth)) {\n <span\n class=\"jt-collapsed-hint\"\n (click)=\"toggle(path, depth); $event.stopPropagation()\"\n role=\"button\"\n >{{ arrayLength(value) }} {{ arrayLength(value) === 1 ? 'item' : 'items' }}</span\n ><span class=\"jt-bracket\">]</span>\n } @else {\n <div class=\"jt-indent\">\n @for (item of arrayItems(value); track $index; let last = $last) {\n <div class=\"jt-line\">\n @if (isContainer(item)) {\n <ng-container\n *ngTemplateOutlet=\"\n valueTemplate;\n context: { $implicit: item, path: path + '[' + $index + ']', depth: depth + 1 }\n \"\n />\n } @else {\n <span [class]=\"primitiveClass(item)\">{{ formatPrimitive(item) }}</span>\n }\n @if (!last) {\n <span class=\"jt-comma\">,</span>\n }\n </div>\n }\n </div>\n <span class=\"jt-bracket\">]</span>\n }\n }\n } @else {\n <span [class]=\"primitiveClass(value)\">{{ formatPrimitive(value) }}</span>\n }\n</ng-template>\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ToolUIPart } from 'ai';\nimport { HighlightPipe } from '../../pipes/highlight.pipe';\nimport { JsonTreeComponent } from '../json-tree/json-tree.component';\n\n@Component({\n selector: 'cortex-message-tool-call-part',\n templateUrl: './message-tool-call-part.component.html',\n styleUrl: './message-tool-call-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [HighlightPipe, NgClass, TranslatePipe, JsonTreeComponent],\n})\nexport class MessageToolCallPartComponent {\n private static readonly CODE_FIELDS: Record<string, string> = {\n code: 'javascript',\n query: 'cypher',\n };\n\n public readonly toolCallPart = input.required<ToolUIPart>();\n\n protected readonly codeSnippets = computed(() => {\n const inp = this.toolCallPart().input;\n if (!inp || typeof inp !== 'object') return [];\n\n const record = inp as Record<string, unknown>;\n const snippets: { key: string; lang: string; value: string }[] = [];\n\n for (const [key, lang] of Object.entries(MessageToolCallPartComponent.CODE_FIELDS)) {\n if (key in record && typeof record[key] === 'string') {\n snippets.push({\n key,\n lang,\n value: (record[key] as string).replace(/\\\\n/g, '\\n'),\n });\n }\n }\n return snippets;\n });\n\n protected readonly remainingInput = computed(() => {\n const inp = this.toolCallPart().input;\n if (!inp || typeof inp !== 'object') return inp;\n\n const record = inp as Record<string, unknown>;\n const codeKeys = Object.keys(MessageToolCallPartComponent.CODE_FIELDS);\n const remaining: Record<string, unknown> = {};\n let hasKeys = false;\n\n for (const [key, val] of Object.entries(record)) {\n if (!codeKeys.includes(key)) {\n remaining[key] = val;\n hasKeys = true;\n }\n }\n return hasKeys ? remaining : null;\n });\n\n protected toolName() {\n const type = this.toolCallPart().type;\n if (!type) return '';\n return type.startsWith('tool-') ? type.slice('tool-'.length) : type;\n }\n}\n","<details class=\"cortex-tool-details\">\n <summary class=\"cortex-tool-details__summary\">\n <div class=\"cortex-tool-details__header\">\n <div class=\"cortex-tool-details__icon-box\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-tool-details__icon-svg\" fill=\"none\">\n <path\n d=\"M6.5 6.5 3.75 10l2.75 3.5M13.5 6.5 16.25 10l-2.75 3.5M11.25 5.75 8.75 14.25\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n\n <div class=\"cortex-tool-details__info\">\n <div class=\"cortex-tool-details__title-row\">\n <div class=\"cortex-tool-details__name-row\">\n <div class=\"cortex-tool-details__name\" [attr.title]=\"toolCallPart().title || null\">\n {{ toolCallPart().title ?? 'Tool call' }}\n </div>\n @if (toolName()) {\n <span\n class=\"cortex-tool-details__tool-badge\"\n [attr.title]=\"toolCallPart().type || null\"\n >{{ toolName() }}</span\n >\n }\n </div>\n <div class=\"cortex-tool-details__id-line\">\n <span class=\"cortex-tool-details__id-label\">ID</span>\n <span class=\"cortex-tool-details__id-value\"> {{ toolCallPart().toolCallId }}</span>\n @if (toolCallPart().providerExecuted) {\n <span class=\"cortex-tool-details__provider-badge\">\n <span class=\"cortex-tool-details__provider-dot\"></span>\n provider\n </span>\n }\n </div>\n </div>\n\n <div class=\"cortex-tool-details__actions\">\n <span\n class=\"cortex-tool-details__state-badge\"\n [ngClass]=\"{\n 'cortex-tool-details__state-badge--success':\n toolCallPart().state === 'output-available',\n 'cortex-tool-details__state-badge--error': toolCallPart().state === 'output-error',\n 'cortex-tool-details__state-badge--denied': toolCallPart().state === 'output-denied',\n 'cortex-tool-details__state-badge--approval':\n toolCallPart().state === 'approval-requested' ||\n toolCallPart().state === 'approval-responded',\n 'cortex-tool-details__state-badge--pending':\n toolCallPart().state === 'input-streaming' ||\n toolCallPart().state === 'input-available',\n }\"\n >\n @switch (toolCallPart().state) {\n @case ('input-streaming') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--amber cortex-tool-details__status-dot--pulse\"\n ></span>\n Calling\n }\n @case ('input-available') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--amber\"\n ></span>\n Input ready\n }\n @case ('approval-requested') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--violet cortex-tool-details__status-dot--pulse\"\n ></span>\n Needs approval\n }\n @case ('approval-responded') {\n @if (toolCallPart().approval?.approved) {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--emerald\"\n ></span>\n Approved\n } @else {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--slate\"\n ></span>\n Responded\n }\n }\n @case ('output-available') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--emerald\"\n ></span>\n {{ 'translate_completed' | translate }}\n }\n @case ('output-error') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--red\"\n ></span>\n Error\n }\n @case ('output-denied') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--slate\"\n ></span>\n Denied\n }\n }\n </span>\n\n <span class=\"cortex-tool-details__chevron\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"m5.75 8.25 4.25 4.25 4.25-4.25\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n </div>\n </div>\n </div>\n </summary>\n\n <div class=\"cortex-tool-details__body\">\n <div class=\"cortex-tool-details__panels\">\n @for (snippet of codeSnippets(); track snippet.key) {\n <div class=\"cortex-tool-details__panel\">\n <div class=\"cortex-tool-details__panel-header\">\n <div class=\"cortex-tool-details__panel-label\">{{ snippet.key }}</div>\n <div class=\"cortex-tool-details__panel-lang\">{{ snippet.lang }}</div>\n </div>\n <pre\n dir=\"ltr\"\n class=\"cortex-tool-details__code-pre\"\n ><code class=\"hljs\" [innerHTML]=\"snippet.value | highlight : snippet.lang\"></code></pre>\n </div>\n }\n\n @if (remainingInput(); as remaining) {\n <div class=\"cortex-tool-details__panel\">\n <div class=\"cortex-tool-details__panel-header\">\n <div class=\"cortex-tool-details__panel-label\">Input</div>\n <div class=\"cortex-tool-details__panel-lang\">json</div>\n </div>\n <div dir=\"ltr\" class=\"cortex-tool-details__tree-container\">\n <cortex-json-tree [data]=\"remaining\" [expandDepth]=\"2\" />\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'output-available') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--success\">\n <div class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--success\">\n <div class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--success\">\n Output\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--success\">\n json\n </div>\n </div>\n <div dir=\"ltr\" class=\"cortex-tool-details__tree-container\">\n <cortex-json-tree [data]=\"toolCallPart().output\" [expandDepth]=\"2\" />\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'output-error') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--error\">\n <div class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--error\">\n <div class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--error\">\n Error\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--error\">\n text\n </div>\n </div>\n <pre dir=\"ltr\" class=\"cortex-tool-details__error-pre\">{{ toolCallPart().errorText }}</pre>\n </div>\n }\n\n @if (toolCallPart().state === 'output-denied') {\n <div class=\"cortex-tool-details__panel\">\n <div class=\"cortex-tool-details__panel-header\">\n <div class=\"cortex-tool-details__panel-label\">Denied</div>\n <div class=\"cortex-tool-details__panel-lang\">approval</div>\n </div>\n <div class=\"cortex-tool-details__denied-body\">\n Tool execution was denied.\n @if (toolCallPart().approval?.reason) {\n <div class=\"cortex-tool-details__reason-box\">\n <div class=\"cortex-tool-details__reason-label\">Reason</div>\n <div class=\"cortex-tool-details__reason-text\">\n {{ toolCallPart().approval?.reason }}\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'approval-requested') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--approval\">\n <div\n class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--approval\"\n >\n <div\n class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--approval\"\n >\n Approval requested\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--approval\">\n {{ toolCallPart().approval?.id }}\n </div>\n </div>\n <div class=\"cortex-tool-details__approval-body\">\n Waiting for approval to execute this tool.\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'approval-responded') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--approval\">\n <div\n class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--approval\"\n >\n <div\n class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--approval\"\n >\n Approval response\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--approval\">\n {{ toolCallPart().approval?.id }}\n </div>\n </div>\n <div class=\"cortex-tool-details__approval-body\">\n @if (toolCallPart().approval?.approved) {\n Approved.\n } @else {\n Response received.\n }\n @if (toolCallPart().approval?.reason) {\n <div\n class=\"cortex-tool-details__reason-box cortex-tool-details__reason-box--approval\"\n >\n <div\n class=\"cortex-tool-details__reason-label cortex-tool-details__reason-label--approval\"\n >\n Reason\n </div>\n <div\n class=\"cortex-tool-details__reason-text cortex-tool-details__reason-text--approval\"\n >\n {{ toolCallPart().approval?.reason }}\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n</details>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n forwardRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormBuilder,\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { ToolUIPart, UIMessage } from 'ai';\nimport { finalize } from 'rxjs';\nimport { fromPromise } from 'rxjs/internal/observable/innerFrom';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { CORTEX_CLIENT_CONFIG } from '../../config';\n\ntype InputFile = {\n name: string;\n bytes: string;\n};\n\n@Component({\n selector: 'cortex-message-capture-files-part',\n templateUrl: './message-capture-files-part.component.html',\n styleUrl: './message-capture-files-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ReactiveFormsModule, forwardRef(() => FileInputComponent), TranslatePipe],\n host: { class: 'cortex-capture-files' },\n})\nexport class MessageCaptureFilesPartComponent {\n public readonly message = input.required<UIMessage>();\n public readonly toolPart = input.required<ToolUIPart>();\n public readonly setOutput = input.required<(output: unknown) => void>();\n\n protected readonly requestedFiles = computed(() => readRequestedFiles(this.toolPart().input));\n protected readonly hasInvalidInput = computed(() => this.requestedFiles().length === 0);\n\n protected readonly isLoading = signal(false);\n\n protected readonly outputData = computed(() => {\n const raw = this.toolPart().output;\n if (!raw) return null;\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return parsed as {\n status: 'success' | 'canceled';\n message?: string;\n result?: { id: string; uploadId: string }[];\n };\n });\n\n protected readonly form = computed(() => {\n const form = this.fb.group({\n files: this.fb.array(\n this.requestedFiles().map((x) =>\n this.fb.group({\n id: new FormControl(x.id, { nonNullable: true, validators: [Validators.required] }),\n file: new FormControl(null as unknown as InputFile, {\n nonNullable: true,\n validators: [Validators.required],\n }),\n }),\n ),\n ),\n });\n\n if (this.toolPart().output) {\n form.disable();\n }\n\n return form;\n });\n\n private readonly fb = inject(FormBuilder);\n private readonly config = inject(CORTEX_CLIENT_CONFIG);\n\n protected async submit() {\n if (this.hasInvalidInput() || this.form().invalid || this.isLoading()) return;\n\n this.isLoading.set(true);\n const { files } = this.form().getRawValue();\n\n const baseUrl = this.config.transport.baseUrl;\n const base = typeof baseUrl === 'string' ? baseUrl : (baseUrl as Signal<string>)();\n const url = base.replace(/\\/$/, '') + '/files';\n\n fromPromise(\n (async () => {\n const headers = await Promise.resolve(this.config.transport.getAuthHeaders());\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n files,\n toolCallId: this.toolPart().toolCallId,\n message: this.message(),\n }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n return res.json();\n })(),\n )\n .pipe(finalize(() => this.isLoading.set(false)))\n .subscribe((result) => {\n this.setOutput()({\n status: 'success',\n result,\n });\n });\n }\n\n protected async downloadFile(uploadId: string) {\n const baseUrl = this.config.transport.baseUrl;\n const base = typeof baseUrl === 'string' ? baseUrl : (baseUrl as Signal<string>)();\n const url = base.replace(/\\/$/, '') + '/files/' + uploadId;\n const headers = await Promise.resolve(this.config.transport.getAuthHeaders());\n\n const response = await fetch(url, { headers });\n const disposition = response.headers.get('Content-Disposition');\n const name = disposition?.match(/filename=\"?([^\";\\n]+)\"?/)?.[1] ?? uploadId;\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = name;\n a.click();\n URL.revokeObjectURL(blobUrl);\n }\n\n protected cancel() {\n this.setOutput()({\n status: 'canceled',\n message: 'User canceled upload',\n });\n }\n}\n\nfunction readRequestedFiles(input: unknown) {\n if (!input || typeof input !== 'object') return [];\n\n const files = (input as { files?: unknown }).files;\n if (!Array.isArray(files)) return [];\n\n return files.flatMap(function (file) {\n if (!file || typeof file !== 'object') return [];\n\n const label = (file as { label?: unknown }).label;\n const id = (file as { id?: unknown }).id;\n\n if (typeof label !== 'string' || typeof id !== 'string') return [];\n\n return [{ label, id }];\n });\n}\n\n@Component({\n selector: 'cortex-file-input',\n template: `<div class=\"cortex-file-input\">\n <button type=\"button\" (click)=\"fileInput.click()\" class=\"cortex-file-input__btn\">\n {{ 'translate_choose_file' | translate }}\n </button>\n <span class=\"cortex-file-input__name\">{{\n value()?.name ?? ('translate_no_file_chosen' | translate)\n }}</span>\n <input #fileInput (change)=\"loadFile($event)\" type=\"file\" class=\"cortex-file-input__hidden\" />\n </div>`,\n styleUrl: './message-capture-files-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [TranslatePipe],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: forwardRef(() => FileInputComponent),\n },\n ],\n})\nexport class FileInputComponent implements ControlValueAccessor {\n public allowedMimeTypes = input('*/*');\n\n protected readonly value = signal<InputFile | undefined>(undefined);\n protected readonly isDisabled = signal<boolean>(false);\n protected onTouch?: () => void;\n protected readonly isProcessing = signal<boolean>(false);\n\n private onChange?: (value?: InputFile) => void;\n\n writeValue(value?: InputFile) {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value?: InputFile) => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean) {\n this.isDisabled.set(isDisabled);\n }\n\n protected async loadFile(event: Event) {\n const fileInput = event.target as HTMLInputElement;\n if (fileInput.files?.length !== 1) return;\n const inputFile = fileInput.files[0];\n const result = await convertFileToBase64(inputFile);\n this.updateValue({\n name: result.name,\n bytes: result.bytes,\n });\n }\n\n protected updateValue(value: InputFile) {\n this.value.set(value);\n this.onChange?.(value);\n }\n}\n\nasync function convertFileToBase64(file: File) {\n return new Promise<{\n name: string;\n bytes: string;\n mimeType: string;\n format: string;\n readerResult: string | ArrayBuffer | null;\n }>((resolve, reject) => {\n const tokens = file.name.split('.');\n const format = tokens.length > 1 ? tokens[tokens.length - 1] : '';\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n const parts = (reader.result as string).split(',');\n const mimeType = parts[0].replace('data:', '').replace(';base64', '');\n resolve({\n name: file.name,\n bytes: parts[1],\n mimeType,\n format,\n readerResult: reader.result,\n });\n };\n reader.onerror = () => reject();\n });\n}\n","@if (outputData(); as output) {\n <!-- Result state -->\n @if (output.status === 'success') {\n <div class=\"cortex-capture-success\">\n <div class=\"cortex-capture-success__header\">\n <div class=\"cortex-capture-success__icon\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-capture-success__icon-svg\" fill=\"none\">\n <path\n d=\"M5.5 10.5 L8.5 13.5 L14.5 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <div class=\"cortex-capture-success__title-wrap\">\n <h3 class=\"cortex-capture-success__title\">\n {{ 'translate_files_attached' | translate: { count: requestedFiles().length } }}\n </h3>\n </div>\n </div>\n\n <div class=\"cortex-capture-success__file-list\">\n <ul class=\"cortex-capture-success__files\">\n @for (file of outputData()!.result!; track file.uploadId) {\n <li>\n <button\n type=\"button\"\n (click)=\"downloadFile(file.uploadId)\"\n class=\"cortex-capture-success__download-btn\"\n >\n <svg viewBox=\"0 0 16 16\" class=\"cortex-capture-success__file-icon\" fill=\"none\">\n <path\n d=\"M4 1.5h5.172a2 2 0 0 1 1.414.586l2.328 2.328a2 2 0 0 1 .586 1.414V12.5a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n />\n <path\n d=\"M9.5 1.5v2a2 2 0 0 0 2 2h2\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"cortex-capture-success__file-name\">{{\n requestedFiles()[$index]?.label ?? outputData()!.result![$index]?.id\n }}</span>\n <svg viewBox=\"0 0 16 16\" class=\"cortex-capture-success__dl-icon\" fill=\"none\">\n <path\n d=\"M8 3v7m0 0L5.5 7.5M8 10l2.5-2.5M3 13h10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n }\n </ul>\n </div>\n </div>\n } @else {\n <!-- Canceled state -->\n <div class=\"cortex-capture-canceled-wrap\">\n <div class=\"cortex-capture-canceled\">\n <div class=\"cortex-capture-canceled__icon\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-capture-canceled__icon-svg\" fill=\"none\">\n <path d=\"M6 10h8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n </div>\n <span class=\"cortex-capture-canceled__text\">{{\n 'translate_file_upload_skipped' | translate\n }}</span>\n </div>\n </div>\n }\n} @else {\n @if (!hasInvalidInput()) {\n <!-- Upload form -->\n <form [formGroup]=\"form()\" class=\"cortex-capture-form\">\n @if (requestedFiles().length === 1) {\n <!-- Single file: minimal inline -->\n <fieldset [formArray]=\"form().controls.files\">\n <div [formGroupName]=\"0\" class=\"cortex-capture-form__single\">\n <label for=\"capture-file-0\" class=\"cortex-capture-form__label\">\n {{ requestedFiles()[0]!.label }}\n </label>\n <input hidden formControlName=\"id\" />\n <div class=\"cortex-capture-form__row\">\n <cortex-file-input\n id=\"capture-file-0\"\n formControlName=\"file\"\n class=\"cortex-capture-form__input\"\n />\n <button\n (click)=\"cancel()\"\n [disabled]=\"isLoading()\"\n type=\"button\"\n class=\"cortex-capture-form__cancel-link\"\n >\n {{ 'translate_cancel' | translate }}\n </button>\n <button\n (click)=\"submit()\"\n type=\"button\"\n class=\"cortex-capture-form__submit-btn\"\n [disabled]=\"form().invalid || isLoading()\"\n >\n @if (isLoading()) {\n <svg class=\"cortex-capture-form__spinner\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=\"cortex-capture-form__spinner-track\"\n />\n <path\n d=\"M14 8a6 6 0 0 0-6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n {{ 'translate_uploading' | translate }}\n } @else {\n {{ 'translate_submit' | translate }}\n }\n </button>\n </div>\n </div>\n </fieldset>\n } @else {\n <!-- Multi-file: full form -->\n <div class=\"cortex-capture-form__multi\">\n <div class=\"cortex-capture-form__multi-header\">\n <div class=\"cortex-capture-form__multi-header-row\">\n <div class=\"cortex-capture-form__multi-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-capture-form__multi-icon-svg\" fill=\"none\">\n <path\n d=\"M4 13.5a3.5 3.5 0 0 1-.5-6.97 5.002 5.002 0 0 1 9.78-1.03A4.5 4.5 0 0 1 15.5 14\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M10 10v7m0-7-2.5 2.5M10 10l2.5 2.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n\n <div class=\"cortex-capture-form__multi-title-wrap\">\n <h3 class=\"cortex-capture-form__multi-title\">\n {{ 'translate_attach_requested_files' | translate }}\n </h3>\n <p class=\"cortex-capture-form__multi-subtitle\">\n {{ 'translate_n_files_required' | translate: { count: requestedFiles().length } }}\n </p>\n </div>\n </div>\n </div>\n\n <fieldset [formArray]=\"form().controls.files\" class=\"cortex-capture-form__multi-fields\">\n @for (file of form().controls.files.value; track $index) {\n <div [formGroupName]=\"$index\" class=\"cortex-capture-form__multi-item\">\n <div class=\"cortex-capture-form__multi-item-header\">\n <label\n [for]=\"'capture-file-' + $index\"\n class=\"cortex-capture-form__multi-item-label\"\n >\n {{ requestedFiles()[$index]!.label }}\n </label>\n <span class=\"cortex-capture-form__required-badge\">\n {{ 'translate_required' | translate }}\n </span>\n </div>\n <input hidden formControlName=\"id\" />\n <cortex-file-input [id]=\"'capture-file-' + $index\" formControlName=\"file\" />\n </div>\n }\n </fieldset>\n\n <div class=\"cortex-capture-form__multi-footer\">\n <button\n (click)=\"cancel()\"\n [disabled]=\"isLoading()\"\n type=\"button\"\n class=\"cortex-capture-form__cancel-btn\"\n >\n {{ 'translate_cancel' | translate }}\n </button>\n <button\n (click)=\"submit()\"\n type=\"button\"\n class=\"cortex-capture-form__submit-btn\"\n [disabled]=\"form().invalid || isLoading()\"\n >\n @if (isLoading()) {\n <svg class=\"cortex-capture-form__spinner\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=\"cortex-capture-form__spinner-track\"\n />\n <path\n d=\"M14 8a6 6 0 0 0-6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n {{ 'translate_uploading' | translate }}\n } @else {\n {{ 'translate_submit_files' | translate }}\n }\n </button>\n </div>\n </div>\n }\n </form>\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ToolUIPart, UIMessage } from 'ai';\nimport { MessageCaptureFilesPartComponent } from '../message-capture-file-part/message-capture-files-part.component';\nimport { CORTEX_CLIENT_CONFIG } from '../../config';\nimport { CortexChatService } from '../../services/cortex-chat.service';\n\nconst STATUS_COUNT = 10;\n\n@Component({\n selector: 'cortex-message-tool-call-animated',\n templateUrl: './message-tool-call-animated.component.html',\n styleUrl: './message-tool-call-animated.component.scss',\n imports: [NgComponentOutlet, MessageCaptureFilesPartComponent, TranslatePipe],\n host: { class: 'cortex-tool-call-animated' },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageToolCallAnimatedComponent {\n public readonly message = input.required<UIMessage>();\n public readonly toolCallPart = input.required<ToolUIPart>();\n\n protected readonly config = inject(CORTEX_CLIENT_CONFIG);\n\n protected readonly customComponent = computed(() => {\n const toolName = this.toolCallPart().type;\n const name = toolName?.startsWith('tool-') ? toolName.slice('tool-'.length) : toolName;\n return name ? (this.config.toolComponents?.[name] ?? null) : null;\n });\n protected readonly setOutput = computed(() => {\n return (output: unknown) => {\n this.chatService.chat()?.addToolOutput({\n tool: this.toolCallPart().type,\n toolCallId: this.toolCallPart().toolCallId,\n output,\n });\n };\n });\n\n protected readonly animState = computed(() => {\n const state = this.toolCallPart().state;\n switch (state) {\n case 'input-streaming':\n return 'starting';\n case 'input-available':\n case 'approval-requested':\n case 'approval-responded':\n return 'processing';\n case 'output-available':\n return 'complete';\n case 'output-error':\n return 'error';\n case 'output-denied':\n return 'denied';\n default:\n return 'processing';\n }\n });\n\n protected readonly isActive = computed(() => {\n const s = this.animState();\n return s === 'starting' || s === 'processing';\n });\n\n protected readonly displayTitleKey = computed(() => {\n const state = this.animState();\n switch (state) {\n case 'starting':\n case 'processing':\n return `translate_tool_status_${this.stableIndex()}`;\n case 'complete':\n return `translate_tool_done_${this.stableIndex()}`;\n case 'error':\n return 'translate_tool_error';\n case 'denied':\n return 'translate_tool_denied';\n default:\n return `translate_tool_status_${this.stableIndex()}`;\n }\n });\n\n private readonly stableIndex = computed(() => {\n const id = this.toolCallPart().toolCallId ?? '';\n let hash = 0;\n for (let i = 0; i < id.length; i++) {\n hash = (hash * 31 + id.charCodeAt(i)) | 0;\n }\n return Math.abs(hash) % STATUS_COUNT;\n });\n\n private chatService = inject(CortexChatService);\n}\n","@if (customComponent(); as custom) {\n <ng-container\n *ngComponentOutlet=\"\n custom;\n inputs: { toolCallPart: toolCallPart(), message: message(), setOutput: setOutput() };\n injector: config.injector\n \"\n />\n} @else {\n @switch (toolCallPart().type) {\n @case ('tool-captureFiles') {\n <cortex-message-capture-files-part\n [toolPart]=\"toolCallPart()\"\n [message]=\"message()\"\n [setOutput]=\"setOutput()\"\n />\n }\n @default {\n @let state = animState();\n @let active = isActive();\n\n <div class=\"cortex-tool-pill-wrap\">\n <div\n class=\"cortex-tool-pill\"\n [class.cortex-tool-pill--active]=\"active\"\n [class.cortex-tool-pill--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill--error]=\"state === 'error'\"\n [class.cortex-tool-pill--denied]=\"state === 'denied'\"\n >\n <!-- Icon box -->\n <div\n class=\"cortex-tool-pill__icon\"\n [class.cortex-tool-pill__icon--active]=\"active\"\n [class.cortex-tool-pill__icon--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill__icon--error]=\"state === 'error'\"\n [class.cortex-tool-pill__icon--denied]=\"state === 'denied'\"\n >\n <!-- Spinner -->\n <div\n class=\"cortex-tool-pill__spinner\"\n [class.cortex-tool-pill__spinner--visible]=\"active\"\n ></div>\n <!-- Check -->\n <svg\n class=\"cortex-tool-pill__svg\"\n [class.cortex-tool-pill__svg--visible]=\"state === 'complete'\"\n [class.cortex-tool-pill__svg--check]=\"state === 'complete'\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M5.5 10.5 L8.5 13.5 L14.5 7\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <!-- Error -->\n <svg\n class=\"cortex-tool-pill__svg\"\n [class.cortex-tool-pill__svg--visible]=\"state === 'error'\"\n [class.cortex-tool-pill__svg--error]=\"state === 'error'\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M6.5 6.5 L13.5 13.5 M13.5 6.5 L6.5 13.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n <!-- Denied -->\n <svg\n class=\"cortex-tool-pill__svg\"\n [class.cortex-tool-pill__svg--visible]=\"state === 'denied'\"\n [class.cortex-tool-pill__svg--denied]=\"state === 'denied'\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M6 10 L14 10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n\n <!-- Title -->\n <span\n class=\"cortex-tool-pill__title\"\n [class.cortex-tool-pill__title--active]=\"active\"\n [class.cortex-tool-pill__title--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill__title--error]=\"state === 'error'\"\n [class.cortex-tool-pill__title--denied]=\"state === 'denied'\"\n >\n {{ displayTitleKey() | translate }}\n </span>\n\n <!-- Bottom bar -->\n <div class=\"cortex-tool-pill__bar-track\">\n <div\n class=\"cortex-tool-pill__bar\"\n [class.cortex-tool-pill__bar--active]=\"active\"\n [class.cortex-tool-pill__bar--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill__bar--error]=\"state === 'error'\"\n [class.cortex-tool-pill__bar--denied]=\"state === 'denied'\"\n ></div>\n </div>\n </div>\n </div>\n }\n }\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\n\ntype LabelState = 'idle' | 'exiting' | 'enter-start' | 'entering';\n\n@Component({\n selector: 'cortex-subtle-activity',\n templateUrl: './subtle-activity.component.html',\n styleUrl: './subtle-activity.component.scss',\n imports: [TranslatePipe],\n host: { class: 'cortex-subtle-activity' },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SubtleActivityComponent {\n public readonly labels = input.required<string[]>();\n\n protected readonly currentIndex = signal(0);\n protected readonly labelState = signal<LabelState>('idle');\n\n private transitionTimeout: ReturnType<typeof setTimeout> | null = null;\n private exitTimeout: ReturnType<typeof setTimeout> | null = null;\n private enterTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n afterNextRender(() => {\n this.scheduleNextTransition();\n });\n\n destroyRef.onDestroy(() => {\n this.clearAllTimeouts();\n });\n }\n\n private scheduleNextTransition() {\n this.transitionTimeout = setTimeout(() => {\n this.triggerTransition();\n }, 2000);\n }\n\n private triggerTransition() {\n this.labelState.set('exiting');\n\n this.exitTimeout = setTimeout(() => {\n this.currentIndex.update((i) => (i + 1) % this.labels().length);\n this.labelState.set('enter-start');\n\n requestAnimationFrame(() => {\n this.labelState.set('entering');\n\n this.enterTimeout = setTimeout(() => {\n this.labelState.set('idle');\n this.scheduleNextTransition();\n }, 300);\n });\n }, 300);\n }\n\n private clearAllTimeouts() {\n if (this.transitionTimeout) clearTimeout(this.transitionTimeout);\n if (this.exitTimeout) clearTimeout(this.exitTimeout);\n if (this.enterTimeout) clearTimeout(this.enterTimeout);\n }\n}\n","<div class=\"cortex-subtle-activity__dots\">\n <span class=\"cortex-subtle-activity__dot\"></span>\n <span class=\"cortex-subtle-activity__dot cortex-subtle-activity__dot--d1\"></span>\n <span class=\"cortex-subtle-activity__dot cortex-subtle-activity__dot--d2\"></span>\n</div>\n\n<div class=\"cortex-subtle-activity__label-mask\">\n <span\n class=\"cortex-subtle-activity__label\"\n [class.cortex-subtle-activity__label--idle]=\"labelState() === 'idle'\"\n [class.cortex-subtle-activity__label--exiting]=\"labelState() === 'exiting'\"\n [class.cortex-subtle-activity__label--enter-start]=\"labelState() === 'enter-start'\"\n [class.cortex-subtle-activity__label--entering]=\"labelState() === 'entering'\"\n >\n {{ labels()[currentIndex()] | translate }}\n </span>\n</div>\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { ReasoningUIPart } from 'ai';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_reasoning_0',\n 'translate_reasoning_1',\n 'translate_reasoning_2',\n 'translate_reasoning_3',\n 'translate_reasoning_4',\n 'translate_reasoning_5',\n 'translate_reasoning_6',\n 'translate_reasoning_7',\n 'translate_reasoning_8',\n 'translate_reasoning_9',\n];\n\n@Component({\n selector: 'cortex-message-reasoning-animated',\n templateUrl: './message-reasoning-animated.component.html',\n styleUrl: './message-reasoning-animated.component.scss',\n imports: [SubtleActivityComponent],\n host: { class: 'cortex-reasoning-animated' },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageReasoningAnimatedComponent {\n public readonly reasoningPart = input.required<ReasoningUIPart>();\n protected readonly labels = LABELS;\n}\n","<cortex-subtle-activity [labels]=\"labels\" />\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_endpoint_0',\n 'translate_endpoint_1',\n 'translate_endpoint_2',\n 'translate_endpoint_3',\n 'translate_endpoint_4',\n 'translate_endpoint_5',\n 'translate_endpoint_6',\n 'translate_endpoint_7',\n 'translate_endpoint_8',\n 'translate_endpoint_9',\n];\n\n@Component({\n selector: 'cortex-tool-call-endpoint-animated',\n template: '<cortex-subtle-activity [labels]=\"labels\" />',\n imports: [SubtleActivityComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolCallEndpointAnimatedComponent {\n protected readonly labels = LABELS;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_graph_0',\n 'translate_graph_1',\n 'translate_graph_2',\n 'translate_graph_3',\n 'translate_graph_4',\n 'translate_graph_5',\n 'translate_graph_6',\n 'translate_graph_7',\n 'translate_graph_8',\n 'translate_graph_9',\n];\n\n@Component({\n selector: 'cortex-tool-query-graph-animated',\n template: '<cortex-subtle-activity [labels]=\"labels\" />',\n imports: [SubtleActivityComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolQueryGraphAnimatedComponent {\n protected readonly labels = LABELS;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_code_0',\n 'translate_code_1',\n 'translate_code_2',\n 'translate_code_3',\n 'translate_code_4',\n 'translate_code_5',\n 'translate_code_6',\n 'translate_code_7',\n 'translate_code_8',\n 'translate_code_9',\n];\n\n@Component({\n selector: 'cortex-tool-execute-code-animated',\n template: '<cortex-subtle-activity [labels]=\"labels\" />',\n imports: [SubtleActivityComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolExecuteCodeAnimatedComponent {\n protected readonly labels = LABELS;\n}\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { UIDataTypes, UIMessage, UIMessagePart, UITools, isStaticToolUIPart } from 'ai';\nimport { MessageTextPartComponent } from '../message-text-part/message-text-part.component';\nimport { MessageReasoningPartComponent } from '../message-reasoning-part/message-reasoning-part.component';\nimport { MessageToolCallPartComponent } from '../message-tool-call-part/message-tool-call-part.component';\nimport { MessageToolCallAnimatedComponent } from '../message-tool-call-animated/message-tool-call-animated.component';\nimport { MessageReasoningAnimatedComponent } from '../message-reasoning-animated/message-reasoning-animated.component';\nimport { ToolCallEndpointAnimatedComponent } from '../tool-call-endpoint-animated/tool-call-endpoint-animated.component';\nimport { ToolQueryGraphAnimatedComponent } from '../tool-query-graph-animated/tool-query-graph-animated.component';\nimport { ToolExecuteCodeAnimatedComponent } from '../tool-execute-code-animated/tool-execute-code-animated.component';\n\n@Component({\n selector: 'cortex-message-part',\n templateUrl: './message-part.component.html',\n styleUrl: './message-part.component.scss',\n imports: [\n MessageTextPartComponent,\n MessageReasoningPartComponent,\n MessageToolCallPartComponent,\n MessageToolCallAnimatedComponent,\n MessageReasoningAnimatedComponent,\n ToolCallEndpointAnimatedComponent,\n ToolQueryGraphAnimatedComponent,\n ToolExecuteCodeAnimatedComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'cortex-message-part',\n '[class.cortex-message-part--animated]': 'animate()',\n },\n})\nexport class MessagePartComponent {\n public readonly message = input.required<UIMessage>();\n public readonly part = input.required<UIMessagePart<UIDataTypes, UITools>>();\n public readonly debugMode = input<boolean>(false);\n public readonly animate = input<boolean>(false);\n\n protected readonly isStaticToolUIPart = isStaticToolUIPart;\n}\n","@let myPart = part();\n@switch (myPart.type) {\n @case ('text') {\n <cortex-message-text-part [textPart]=\"myPart\" [role]=\"message().role\" />\n }\n @case ('reasoning') {\n @if (debugMode()) {\n <cortex-message-reasoning-part [reasoningPart]=\"myPart\" />\n } @else {\n <cortex-message-reasoning-animated [reasoningPart]=\"myPart\" />\n }\n }\n @default {\n @if (isStaticToolUIPart(myPart)) {\n @if (debugMode()) {\n <cortex-message-tool-call-part [toolCallPart]=\"myPart\" />\n } @else {\n @switch (myPart.type) {\n @case ('tool-callEndpoint') {\n <cortex-tool-call-endpoint-animated />\n }\n @case ('tool-queryGraph') {\n <cortex-tool-query-graph-animated />\n }\n @case ('tool-executeCode') {\n <cortex-tool-execute-code-animated />\n }\n @default {\n <cortex-message-tool-call-animated [toolCallPart]=\"myPart\" [message]=\"message()\" />\n }\n }\n }\n } @else {\n <p class=\"cortex-unhandled-type\">Unhandled type: {{ part().type }}</p>\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DecimalPipe } from '@angular/common';\nimport { MessageMetadata } from '../../types';\n\n@Component({\n selector: 'cortex-message-token-usage',\n templateUrl: './message-token-usage.component.html',\n styleUrl: './message-token-usage.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [DecimalPipe],\n host: { class: 'cortex-token-usage', '[class.cortex-token-usage--expanded]': 'expanded()' },\n})\nexport class MessageTokenUsageComponent {\n public readonly usage = input.required<NonNullable<MessageMetadata['tokenUsage']>>();\n public readonly modelId = input<string>();\n\n protected readonly expanded = signal(false);\n\n protected readonly cacheRatio = computed(() => {\n const u = this.usage();\n if (u.input.total === 0) return 0;\n return Math.round((u.input.cacheRead / u.input.total) * 100);\n });\n\n protected toggle() {\n this.expanded.update((v) => !v);\n }\n}\n","<button class=\"cortex-token-usage__summary\" (click)=\"toggle()\">\n <span class=\"cortex-token-usage__total\">\n <span class=\"cortex-token-usage__total-number\">{{ usage().total | number }}</span>\n <span class=\"cortex-token-usage__total-label\">tokens</span>\n </span>\n\n @if (modelId(); as id) {\n <span class=\"cortex-token-usage__model\">{{ id }}</span>\n }\n\n <span class=\"cortex-token-usage__pills\">\n <span class=\"cortex-token-usage__pill\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--input\"></span>\n {{ usage().input.total | number }}\n </span>\n <span class=\"cortex-token-usage__pill\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--output\"></span>\n {{ usage().output.total | number }}\n </span>\n </span>\n\n <svg class=\"cortex-token-usage__chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</button>\n\n<div class=\"cortex-token-usage__details\">\n <div class=\"cortex-token-usage__details-inner\">\n <div class=\"cortex-token-usage__section\">\n <div class=\"cortex-token-usage__section-header\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--input\"></span>\n <span class=\"cortex-token-usage__section-label\">Input</span>\n <span class=\"cortex-token-usage__section-total\">{{ usage().input.total | number }}</span>\n </div>\n <div class=\"cortex-token-usage__rows\">\n @if (usage().input.noCache) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Fresh</span>\n <span class=\"cortex-token-usage__row-value\">{{ usage().input.noCache | number }}</span>\n </div>\n }\n @if (usage().input.cacheRead) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Cache read</span>\n <span class=\"cortex-token-usage__row-value\">{{\n usage().input.cacheRead | number\n }}</span>\n </div>\n }\n @if (usage().input.cacheWrite) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Cache write</span>\n <span class=\"cortex-token-usage__row-value\">{{\n usage().input.cacheWrite | number\n }}</span>\n </div>\n }\n @if (cacheRatio() > 0) {\n <div class=\"cortex-token-usage__row cortex-token-usage__row--highlight\">\n <span class=\"cortex-token-usage__row-label\">Cache hit</span>\n <span class=\"cortex-token-usage__row-value\">{{ cacheRatio() }}%</span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"cortex-token-usage__divider\"></div>\n\n <div class=\"cortex-token-usage__section\">\n <div class=\"cortex-token-usage__section-header\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--output\"></span>\n <span class=\"cortex-token-usage__section-label\">Output</span>\n <span class=\"cortex-token-usage__section-total\">{{ usage().output.total | number }}</span>\n </div>\n <div class=\"cortex-token-usage__rows\">\n @if (usage().output.text) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Text</span>\n <span class=\"cortex-token-usage__row-value\">{{ usage().output.text | number }}</span>\n </div>\n }\n @if (usage().output.reasoning) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Reasoning</span>\n <span class=\"cortex-token-usage__row-value\">{{\n usage().output.reasoning | number\n }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport {\n generateId,\n ReasoningUIPart,\n ToolUIPart,\n UIDataTypes,\n UIMessage,\n UIMessagePart,\n UITools,\n} from 'ai';\nimport { MessageAbortedFlagComponent } from '../message-aborted-flag/message-aborted-flag.component';\nimport { MessagePartComponent } from '../message-part/message-part.component';\nimport { MessageTokenUsageComponent } from '../message-token-usage/message-token-usage.component';\nimport { MessageMetadata } from '../../types';\nimport { JsonPipe } from '@angular/common';\n\ntype TrackedPart = UIMessagePart<UIDataTypes, UITools> & { __id: string };\ntype TrackedPartCollection = UIMessagePart<UIDataTypes, UITools>[] & {\n __cortexPushWrapped?: true;\n};\n\n@Component({\n selector: 'cortex-message',\n templateUrl: './message.component.html',\n styleUrl: './message.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n MessageAbortedFlagComponent,\n MessagePartComponent,\n MessageTokenUsageComponent,\n JsonPipe,\n ],\n host: { class: 'cortex-message' },\n})\nexport class MessageComponent {\n public readonly message = input.required<UIMessage<MessageMetadata>>();\n public readonly debugMode = input<boolean>(false);\n public readonly animate = input<boolean>(false);\n\n protected readonly visibleParts = computed(() =>\n this.parts().filter((x) => {\n if (x.type === 'step-start') return false;\n if (!this.debugMode() && this.isHiddenInAnimatedMode(x)) return false;\n return true;\n }),\n );\n private readonly parts = signal<UIMessagePart<UIDataTypes, UITools>[]>([]);\n\n public constructor() {\n effect(() => {\n const parts = this.message().parts as TrackedPartCollection;\n\n this.parts.set(parts.map((part) => this.trackPart(part)));\n this.wrapPush(parts);\n });\n }\n\n private trackPart(part: UIMessagePart<UIDataTypes, UITools>) {\n const trackedPart = part as TrackedPart & { __cortexTracked?: true };\n\n if (trackedPart.__cortexTracked) {\n return trackedPart;\n }\n\n trackedPart.__id = trackedPart.__id ?? generateId();\n\n Object.defineProperty(trackedPart, '__cortexTracked', {\n value: true,\n configurable: true,\n });\n\n Object.keys(trackedPart).forEach((prop) => {\n if (prop === '__id') {\n return;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(trackedPart, prop);\n if (!descriptor?.configurable || descriptor.get || descriptor.set) {\n return;\n }\n\n let value = trackedPart[prop as keyof typeof trackedPart];\n Object.defineProperty(trackedPart, prop, {\n get: () => value,\n set: (newValue) => {\n value = newValue;\n this.parts.update((existingParts) => {\n return existingParts.map((existingPart) => {\n return (existingPart as TrackedPart).__id === trackedPart.__id\n ? { ...existingPart, [prop]: newValue }\n : existingPart;\n });\n });\n },\n configurable: true,\n });\n });\n\n return trackedPart;\n }\n\n private wrapPush(parts: TrackedPartCollection) {\n if (parts.__cortexPushWrapped) {\n return;\n }\n\n const originalPush = parts.push;\n\n parts.push = (...items) => {\n const newParts = items.map((part) => this.trackPart(part));\n this.parts.update((existingParts) => [...existingParts, ...newParts]);\n return originalPush.apply(parts, newParts);\n };\n\n Object.defineProperty(parts, '__cortexPushWrapped', {\n value: true,\n configurable: true,\n });\n }\n\n private isHiddenInAnimatedMode(part: UIMessagePart<UIDataTypes, UITools>) {\n if (part.type === 'reasoning') {\n return (part as ReasoningUIPart).state === 'done';\n }\n const specificTools = ['tool-callEndpoint', 'tool-queryGraph', 'tool-executeCode'];\n if (specificTools.includes(part.type)) {\n const state = (part as ToolUIPart).state;\n return state === 'output-available' || state === 'output-error' || state === 'output-denied';\n }\n return false;\n }\n}\n","@if (visibleParts().length) {\n <div class=\"cortex-message-parts\">\n @for (part of visibleParts(); track $index) {\n <cortex-message-part\n [part]=\"part\"\n [message]=\"message()\"\n [debugMode]=\"debugMode()\"\n [animate]=\"animate()\"\n />\n }\n\n @if (message().metadata?.isAborted) {\n <cortex-message-aborted-flag />\n }\n\n @if (debugMode() && message().metadata?.tokenUsage; as usage) {\n <cortex-message-token-usage [usage]=\"usage\" [modelId]=\"message().metadata?.modelId\" />\n }\n </div>\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n input,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CortexChatService } from '../../services/cortex-chat.service';\nimport { MessageComponent } from '../message/message.component';\n\n@Component({\n selector: 'cortex-message-list',\n templateUrl: './message-list.component.html',\n styleUrl: './message-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [MessageComponent],\n})\nexport class MessageListComponent implements AfterViewInit {\n public readonly debugMode = input<boolean>(false);\n private readonly messagesContainer = viewChild<ElementRef>('messagesContainer');\n private shouldScrollToBottom = true;\n private isNearBottom = true;\n private mutationObserver: MutationObserver | undefined = undefined;\n private scrollToBottomQueued = false;\n\n protected readonly animateNewParts = signal(false);\n\n constructor(\n protected readonly chatService: CortexChatService,\n destroyRef: DestroyRef,\n ) {\n this.scrollToBottom();\n\n effect(() => {\n this.chatService.chat()?.messages;\n\n if (!this.shouldScrollToBottom && !this.isNearBottom) {\n return;\n }\n\n this.scheduleScrollToBottom();\n });\n\n chatService.events$.pipe(takeUntilDestroyed(destroyRef)).subscribe((event) => {\n if (event === 'onThreadSelected') {\n this.animateNewParts.set(false);\n this.shouldScrollToBottom = true;\n queueMicrotask(() => this.animateNewParts.set(true));\n }\n if (event === 'onSend') this.shouldScrollToBottom = true;\n });\n\n destroyRef.onDestroy(() => {\n this.mutationObserver?.disconnect();\n });\n }\n\n public ngAfterViewInit() {\n this.observeMessageMutations();\n this.scheduleScrollToBottom();\n queueMicrotask(() => this.animateNewParts.set(true));\n }\n\n protected onScroll() {\n const el = this.messagesContainer()?.nativeElement;\n if (!el) return;\n this.isNearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 100;\n }\n\n private scrollToBottom() {\n const el = this.messagesContainer()?.nativeElement;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }\n\n private scheduleScrollToBottom() {\n if (this.scrollToBottomQueued) {\n return;\n }\n\n this.scrollToBottomQueued = true;\n\n queueMicrotask(() => {\n this.scrollToBottomQueued = false;\n this.scrollToBottom();\n this.shouldScrollToBottom = false;\n });\n }\n\n private observeMessageMutations() {\n const el = this.messagesContainer()?.nativeElement;\n if (!el || typeof MutationObserver === 'undefined') {\n return;\n }\n\n this.mutationObserver = new MutationObserver(() => {\n if (!this.shouldScrollToBottom && !this.isNearBottom) {\n return;\n }\n\n this.scheduleScrollToBottom();\n });\n\n this.mutationObserver.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n}\n","<div class=\"cortex-message-list\" #messagesContainer (scroll)=\"onScroll()\">\n @for (message of chatService.chat()?.messages; track message.id) {\n <cortex-message [message]=\"message\" [debugMode]=\"debugMode()\" [animate]=\"animateNewParts()\" />\n }\n</div>\n","import { TranslateLoader } from '@ngx-translate/core';\nimport { Observable, of } from 'rxjs';\nimport en from './en.json';\nimport ar from './ar.json';\n\nconst translations: Record<string, Record<string, string>> = { en, ar };\n\nexport class CortexClientTranslateLoader implements TranslateLoader {\n public getTranslation(lang: string) {\n return of(translations[lang] ?? translations['en']);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n Injectable,\n Injector,\n input,\n model,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n provideTranslateLoader,\n provideTranslateService,\n TranslatePipe,\n TranslateService,\n} from '@ngx-translate/core';\nimport { CortexChatService } from '../../services/cortex-chat.service';\nimport { Thread } from '../../services/cortex-chat.service';\nimport { MessageListComponent } from '../message-list/message-list.component';\nimport { CORTEX_CLIENT_CONFIG, CortexClientConfig } from '../../config';\nimport { CortexClientWebSocketService } from '../../services/cortex-websocket.service';\nimport { CortexClientTranslateLoader } from '../../i18n/translate-loader';\n\n@Injectable()\nclass CortexClientConfigRef {\n config!: CortexClientConfig;\n}\n\n@Component({\n selector: 'cortex-chat-widget',\n templateUrl: './chat-widget.component.html',\n styleUrl: './chat-widget.component.scss',\n imports: [MessageListComponent, FormsModule, TranslatePipe],\n providers: [\n CortexClientConfigRef,\n {\n provide: CORTEX_CLIENT_CONFIG,\n useFactory: () => inject(CortexClientConfigRef).config,\n },\n CortexChatService,\n CortexClientWebSocketService,\n ...provideTranslateService({\n fallbackLang: 'en',\n loader: provideTranslateLoader(CortexClientTranslateLoader),\n }),\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'cortex-widget' },\n})\nexport class CortexChatWidgetComponent {\n public readonly config = input.required<CortexClientConfig>();\n\n protected readonly text = model<string>('');\n protected readonly debugMode = signal(false);\n protected readonly screen = signal<'threads' | 'chat'>('threads');\n\n protected chatService!: CortexChatService;\n\n private readonly configRef = inject(CortexClientConfigRef);\n private readonly injector = inject(Injector);\n\n public ngOnInit() {\n this.configRef.config = this.config();\n\n this.chatService = this.injector.get(CortexChatService);\n\n const translateService = this.injector.get(TranslateService);\n translateService.use(this.config().locale);\n }\n\n protected toggleDebugMode() {\n this.debugMode.update((v) => !v);\n }\n\n protected selectThread(thread: Thread) {\n this.chatService.selectThread(thread).subscribe();\n this.screen.set('chat');\n }\n\n protected goBack() {\n this.chatService.deselectThread();\n this.screen.set('threads');\n }\n\n protected onKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.send();\n }\n }\n\n protected send() {\n if (this.chatService.isAgentWorking()) return;\n const text = this.text().trim();\n if (!text) return;\n\n this.text.set('');\n this.chatService.send(text).subscribe();\n }\n\n protected newChat() {\n this.chatService.deselectThread();\n this.screen.set('chat');\n }\n}\n","<div class=\"cortex-widget__container\">\n <!-- SCREEN 1: THREADS -->\n <div\n class=\"cortex-widget__screen\"\n [class.cortex-widget__screen--active]=\"screen() === 'threads'\"\n [class.cortex-widget__screen--left]=\"screen() !== 'threads'\"\n >\n <!-- Threads header -->\n <div class=\"cortex-widget__threads-header\">\n <div>\n <h2 class=\"cortex-widget__threads-title\">\n {{ 'translate_threads' | translate }}\n </h2>\n <p class=\"cortex-widget__threads-count\">\n {{\n 'translate_n_conversations' | translate: { count: chatService.threads()?.length ?? 0 }\n }}\n </p>\n </div>\n <button (click)=\"newChat()\" class=\"cortex-widget__new-chat-btn\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3v10M3 8h10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n {{ 'translate_new' | translate }}\n </button>\n </div>\n\n <!-- Threads list -->\n <div class=\"cortex-widget__threads-list\">\n <!-- Threads loading skeleton -->\n @if (chatService.threads() === undefined) {\n @for (i of [1, 2, 3, 4]; track i) {\n <div class=\"cortex-widget__thread-skeleton\">\n <div class=\"cortex-skeleton cortex-widget__thread-skeleton-icon\"></div>\n <div class=\"cortex-widget__thread-skeleton-lines\">\n <div\n class=\"cortex-skeleton cortex-widget__thread-skeleton-line\"\n [style.width]=\"40 + i * 12 + '%'\"\n ></div>\n </div>\n </div>\n }\n } @else {\n @for (thread of chatService.threads(); track thread.id) {\n <button\n (click)=\"selectThread(thread)\"\n class=\"cortex-widget__thread-item\"\n [class.cortex-widget__thread-item--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <!-- Thread icon -->\n <div\n class=\"cortex-widget__thread-icon\"\n [class.cortex-widget__thread-icon--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M2.5 4.5h11M2.5 8h7M2.5 11.5h9\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n\n <!-- Thread info -->\n <div class=\"cortex-widget__thread-info\">\n <div class=\"cortex-widget__thread-title-row\">\n <p\n class=\"cortex-widget__thread-title\"\n [class.cortex-widget__thread-title--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n {{ thread.title ?? ('translate_untitled' | translate) }}\n </p>\n\n @if (thread.isRunning) {\n <span\n class=\"cortex-widget__thread-running\"\n [class.cortex-widget__thread-running--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <span class=\"cortex-widget__thread-running-dot\"></span>\n {{ 'translate_running' | translate }}\n </span>\n }\n </div>\n </div>\n\n <!-- Delete button -->\n <button\n (click)=\"$event.stopPropagation(); chatService.deleteThread(thread.id).subscribe()\"\n class=\"cortex-widget__thread-delete\"\n [class.cortex-widget__thread-delete--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n\n <!-- Arrow -->\n <svg\n class=\"cortex-widget__thread-arrow\"\n [class.cortex-widget__thread-arrow--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n\n @if (!chatService.threads()?.length) {\n <div class=\"cortex-widget__threads-empty\">\n <div class=\"cortex-widget__threads-empty-icon\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n class=\"cortex-widget__threads-empty-svg\"\n >\n <path\n d=\"M2.5 4.5h11M2.5 8h7M2.5 11.5h9\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n <p class=\"cortex-widget__threads-empty-title\">No threads yet</p>\n <p class=\"cortex-widget__threads-empty-subtitle\">Start a new conversation</p>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- SCREEN 2: CHAT -->\n <div\n class=\"cortex-widget__screen\"\n [class.cortex-widget__screen--active]=\"screen() === 'chat'\"\n [class.cortex-widget__screen--right]=\"screen() !== 'chat'\"\n >\n <!-- Chat header -->\n <div class=\"cortex-widget__chat-header\">\n <!-- Back button -->\n <button (click)=\"goBack()\" class=\"cortex-widget__back-btn\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n class=\"cortex-widget__back-icon\"\n >\n <path\n d=\"M10 3L5 8l5 5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <!-- Title -->\n <div class=\"cortex-widget__chat-title-wrap\">\n <p class=\"cortex-widget__chat-title\">\n {{ chatService.selectedThread()?.title ?? ('translate_new_chat' | translate) }}\n </p>\n </div>\n\n <!-- Debug toggle -->\n @if (config().showDebugButton) {\n <button\n (click)=\"toggleDebugMode()\"\n class=\"cortex-widget__debug-btn\"\n [class.cortex-widget__debug-btn--on]=\"debugMode()\"\n [class.cortex-widget__debug-btn--off]=\"!debugMode()\"\n >\n {{ debugMode() ? ('translate_debug' | translate) : ('translate_normal' | translate) }}\n </button>\n }\n </div>\n\n <!-- Messages loading skeleton -->\n @if (chatService.isLoadingMessages() && !chatService.isAgentWorking()) {\n <div class=\"cortex-widget__messages-skeleton\">\n <!-- User message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--user\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 13rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 9rem\"></div>\n </div>\n </div>\n <!-- Assistant message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--assistant\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 16rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 18rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 12rem\"></div>\n </div>\n </div>\n <!-- User message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--user\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 11rem\"></div>\n </div>\n </div>\n <!-- Assistant message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--assistant\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 14rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 15rem\"></div>\n </div>\n </div>\n </div>\n } @else {\n <!-- Messages area -->\n <cortex-message-list class=\"cortex-widget__messages\" [debugMode]=\"debugMode()\" />\n }\n\n <!-- Agent working indicator -->\n @if (chatService.isAgentWorking() && !chatService.hasPendingToolCalls()) {\n <div class=\"cortex-widget__working\">\n <div class=\"cortex-widget__working-dots\">\n <span class=\"cortex-working-dot\"></span>\n <span class=\"cortex-working-dot\"></span>\n <span class=\"cortex-working-dot\"></span>\n </div>\n <span class=\"cortex-widget__working-text\">{{ 'translate_thinking' | translate }}</span>\n </div>\n }\n\n <!-- Chat input (hidden during pending tool calls) -->\n @if (!chatService.hasPendingToolCalls()) {\n <div class=\"cortex-widget__input-area\">\n <div\n class=\"cortex-widget__input-box\"\n [class.cortex-widget__input-box--disabled]=\"chatService.isAgentWorking()\"\n [class.cortex-widget__input-box--enabled]=\"!chatService.isAgentWorking()\"\n >\n <textarea\n (keydown)=\"onKeydown($event)\"\n [(ngModel)]=\"text\"\n [placeholder]=\"\n chatService.isAgentWorking() ? '' : ('translate_type_a_message' | translate)\n \"\n [disabled]=\"chatService.isAgentWorking()\"\n rows=\"1\"\n class=\"cortex-widget__textarea\"\n [class.cortex-widget__textarea--disabled]=\"chatService.isAgentWorking()\"\n ></textarea>\n @if (chatService.isAgentWorking()) {\n <!-- Stop button -->\n <button (click)=\"chatService.abort()\" class=\"cortex-stop-btn\">\n <!-- Pulsing ring -->\n <span class=\"cortex-stop-btn__ring\"></span>\n <!-- Stop icon (rounded square) -->\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n class=\"cortex-stop-btn__icon\"\n >\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" rx=\"2.5\" fill=\"currentColor\" />\n </svg>\n </button>\n } @else {\n <!-- Send button -->\n <button\n (click)=\"send()\"\n class=\"cortex-widget__send-btn\"\n [class.cortex-widget__send-btn--empty]=\"!text().trim()\"\n [class.cortex-widget__send-btn--ready]=\"!!text().trim()\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n class=\"cortex-widget__send-icon\"\n >\n <path\n d=\"M3 8h10M9 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","/*\n * Public API Surface of cortex-client\n */\n\n// Config\nexport type { CortexClientConfig, CortexClientTransport } from './lib/config';\n\n// Components\nexport { CortexChatWidgetComponent } from './lib/components/chat-widget/chat-widget.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","LABELS","i1.CortexChatService"],"mappings":"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"}
1
+ {"version":3,"file":"m6d-cortex-client.mjs","sources":["../../../projects/cortex-client/src/lib/config.ts","../../../projects/cortex-client/src/lib/utils/create-latch.ts","../../../projects/cortex-client/src/lib/services/cortex-websocket.service.ts","../../../projects/cortex-client/src/lib/services/cortex-chat.service.ts","../../../projects/cortex-client/src/lib/components/message-aborted-flag/message-aborted-flag.component.ts","../../../projects/cortex-client/src/lib/components/message-aborted-flag/message-aborted-flag.component.html","../../../projects/cortex-client/src/lib/pipes/marked.pipe.ts","../../../projects/cortex-client/src/lib/utils/stream-text-smoother.ts","../../../projects/cortex-client/src/lib/components/message-text-part/message-text-part.component.ts","../../../projects/cortex-client/src/lib/components/message-text-part/message-text-part.component.html","../../../projects/cortex-client/src/lib/components/message-reasoning-part/message-reasoning-part.component.ts","../../../projects/cortex-client/src/lib/components/message-reasoning-part/message-reasoning-part.component.html","../../../projects/cortex-client/src/lib/pipes/highlight.pipe.ts","../../../projects/cortex-client/src/lib/components/json-tree/json-tree.component.ts","../../../projects/cortex-client/src/lib/components/json-tree/json-tree.component.html","../../../projects/cortex-client/src/lib/components/message-tool-call-part/message-tool-call-part.component.ts","../../../projects/cortex-client/src/lib/components/message-tool-call-part/message-tool-call-part.component.html","../../../projects/cortex-client/src/lib/components/message-capture-file-part/message-capture-files-part.component.ts","../../../projects/cortex-client/src/lib/components/message-capture-file-part/message-capture-files-part.component.html","../../../projects/cortex-client/src/lib/components/message-tool-call-animated/message-tool-call-animated.component.ts","../../../projects/cortex-client/src/lib/components/message-tool-call-animated/message-tool-call-animated.component.html","../../../projects/cortex-client/src/lib/components/subtle-activity/subtle-activity.component.ts","../../../projects/cortex-client/src/lib/components/subtle-activity/subtle-activity.component.html","../../../projects/cortex-client/src/lib/components/message-reasoning-animated/message-reasoning-animated.component.ts","../../../projects/cortex-client/src/lib/components/message-reasoning-animated/message-reasoning-animated.component.html","../../../projects/cortex-client/src/lib/components/tool-call-endpoint-animated/tool-call-endpoint-animated.component.ts","../../../projects/cortex-client/src/lib/components/tool-query-graph-animated/tool-query-graph-animated.component.ts","../../../projects/cortex-client/src/lib/components/tool-execute-code-animated/tool-execute-code-animated.component.ts","../../../projects/cortex-client/src/lib/components/message-part/message-part.component.ts","../../../projects/cortex-client/src/lib/components/message-part/message-part.component.html","../../../projects/cortex-client/src/lib/components/message-token-usage/message-token-usage.component.ts","../../../projects/cortex-client/src/lib/components/message-token-usage/message-token-usage.component.html","../../../projects/cortex-client/src/lib/components/message/message.component.ts","../../../projects/cortex-client/src/lib/components/message/message.component.html","../../../projects/cortex-client/src/lib/components/message-list/message-list.component.ts","../../../projects/cortex-client/src/lib/components/message-list/message-list.component.html","../../../projects/cortex-client/src/lib/i18n/translate-loader.ts","../../../projects/cortex-client/src/lib/components/chat-widget/chat-widget.component.ts","../../../projects/cortex-client/src/lib/components/chat-widget/chat-widget.component.html","../../../projects/cortex-client/src/public-api.ts","../../../projects/cortex-client/src/m6d-cortex-client.ts"],"sourcesContent":["import { Signal, Type, InjectionToken, Injector } from '@angular/core';\nimport { ChatOnToolCallCallback, UIDataTypes, UIMessage, UITools } from 'ai';\n\nexport type CortexClientTransport = {\n baseUrl: string | Signal<string>;\n getAuthHeaders: () => Record<string, string> | Promise<Record<string, string>>;\n};\n\nexport type CortexClientConfig = {\n locale: string;\n transport: CortexClientTransport;\n wsUrl?: string;\n toolComponents?: Record<string, Type<unknown>>;\n injector?: Injector;\n showDebugButton?: boolean;\n onToolCall?: (\n toolCall: Parameters<ChatOnToolCallCallback>[0]['toolCall'],\n ) => Promise<unknown> | unknown;\n};\n\nexport const CORTEX_CLIENT_CONFIG = new InjectionToken<CortexClientConfig>('CORTEX_CLIENT_CONFIG');\n","export function createLatch(count: number, onComplete: () => Promise<void> | void) {\n let remaining = count;\n return async () => {\n if (--remaining === 0) await onComplete();\n };\n}\n","import { inject, Injectable, NgZone, Signal } from '@angular/core';\nimport { Observable, retry, share, Subject, timer } from 'rxjs';\nimport { CORTEX_CLIENT_CONFIG } from '../config';\nimport { WsEvent } from '../ws-events';\n\n@Injectable()\nexport class CortexClientWebSocketService {\n private readonly openedSubject = new Subject<void>();\n private readonly events$: Observable<WsEvent>;\n\n public constructor() {\n const config = inject(CORTEX_CLIENT_CONFIG);\n const ngZone = inject(NgZone);\n\n this.events$ = new Observable<WsEvent>((subscriber) => {\n const wsUrl = resolveWsUrl(config.wsUrl, config.transport.baseUrl);\n let ws: WebSocket | undefined;\n\n Promise.resolve(config.transport.getAuthHeaders()).then((headers) => {\n if (subscriber.closed) return;\n\n const fullWsUrl = appendTokenToUrl(wsUrl, headers);\n ws = new WebSocket(fullWsUrl);\n\n ws.addEventListener('open', () => {\n ngZone.run(() => this.openedSubject.next());\n });\n\n ws.addEventListener('message', (event) => {\n let parsed: WsEvent;\n try {\n parsed = JSON.parse(event.data);\n } catch {\n return;\n }\n\n ngZone.run(() => subscriber.next(parsed));\n });\n\n ws.addEventListener('error', (e) => subscriber.error(e));\n ws.addEventListener('close', () => subscriber.error(new Error('WebSocket closed')));\n });\n\n return () => ws?.close();\n }).pipe(\n retry({\n delay: (_: unknown, retryCount: number) =>\n timer(Math.min(1000 * 2 ** (retryCount - 1), 30_000)),\n }),\n share(),\n );\n }\n\n public get events() {\n return this.events$;\n }\n\n public get opened() {\n return this.openedSubject.asObservable();\n }\n}\n\nfunction resolveWsUrl(wsUrl: string | undefined, baseUrl: string | Signal<string>) {\n const resolvedUrl = wsUrl ?? deriveWsUrl(baseUrl);\n if (!wsUrl) return resolvedUrl;\n\n const agentId = extractAgentId(baseUrl);\n if (!agentId) return resolvedUrl;\n\n return appendAgentIdToUrl(resolvedUrl, agentId);\n}\n\nfunction deriveWsUrl(baseUrl: string | Signal<string>) {\n const url = typeof baseUrl === 'string' ? baseUrl : baseUrl();\n const parsed = new URL(url, window.location.origin);\n parsed.protocol = parsed.protocol === 'https:' ? 'wss:' : 'ws:';\n parsed.pathname = parsed.pathname.replace(/\\/$/, '') + '/ws';\n return parsed.toString();\n}\n\nfunction extractAgentId(baseUrl: string | Signal<string>) {\n const url = typeof baseUrl === 'string' ? baseUrl : baseUrl();\n const parsed = new URL(url, window.location.origin);\n const segments = parsed.pathname.split('/').filter(Boolean);\n const agentsIndex = segments.lastIndexOf('agents');\n if (agentsIndex === -1) return undefined;\n\n return segments[agentsIndex + 1];\n}\n\nfunction appendAgentIdToUrl(wsUrl: string, agentId: string) {\n const parsed = new URL(wsUrl, window.location.origin);\n if (parsed.searchParams.has('agentId') || hasAgentIdInPath(parsed)) return parsed.toString();\n\n parsed.searchParams.set('agentId', agentId);\n return parsed.toString();\n}\n\nfunction hasAgentIdInPath(url: URL) {\n const segments = url.pathname.split('/').filter(Boolean);\n const agentsIndex = segments.lastIndexOf('agents');\n return agentsIndex !== -1 && Boolean(segments[agentsIndex + 1]);\n}\n\nfunction appendTokenToUrl(wsUrl: string, headers: Record<string, string>) {\n const authHeader = headers['Authorization'] ?? headers['authorization'];\n if (!authHeader?.startsWith('Bearer ')) return wsUrl;\n\n const parsed = new URL(wsUrl, window.location.origin);\n if (parsed.searchParams.has('token')) return parsed.toString();\n\n parsed.searchParams.set('token', authHeader.slice(7));\n return parsed.toString();\n}\n","import { computed, DestroyRef, inject, Injectable, Signal, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Chat } from '@ai-sdk/angular';\nimport { DefaultChatTransport, lastAssistantMessageIsCompleteWithToolCalls, UIMessage } from 'ai';\nimport { defer, finalize, map, of, Subject, switchMap, tap } from 'rxjs';\nimport { fromPromise } from 'rxjs/internal/observable/innerFrom';\nimport { CORTEX_CLIENT_CONFIG } from '../config';\nimport { MessageMetadata } from '../types';\nimport { ThreadSummary } from '../ws-events';\nimport { createLatch } from '../utils/create-latch';\nimport { CortexClientWebSocketService } from './cortex-websocket.service';\n\nexport type Thread = ThreadSummary;\n\n@Injectable()\nexport class CortexChatService {\n public readonly threads = signal<Thread[] | undefined>(undefined);\n public readonly selectedThread = signal<Thread | undefined>(undefined);\n public readonly chat = signal<Chat<UIMessage<MessageMetadata>> | undefined>(undefined);\n public readonly isLoadingMessages = signal(false);\n public readonly isAgentWorking = computed(() => {\n const chat = this.chat();\n if (!chat) return false;\n const status = chat.status;\n return status === 'submitted' || status === 'streaming';\n });\n public readonly hasPendingToolCalls = signal(false);\n\n private readonly events = new Subject<\n 'onThreadSelected' | 'onSend' | 'onData' | 'onError' | 'onFinish'\n >();\n private activeThreadSelectionId = 0;\n private completeLatchThreadId: string | undefined = undefined;\n private hasSeenWsOpen = false;\n private readonly config = inject(CORTEX_CLIENT_CONFIG);\n private readonly wsService = inject(CortexClientWebSocketService);\n private readonly destroyRef = inject(DestroyRef);\n private completeLatch: ReturnType<typeof createLatch> | undefined = undefined;\n\n public constructor() {\n this.reloadThreads().subscribe();\n this.subscribeToWsEvents();\n this.subscribeToWsConnections();\n }\n\n public get events$() {\n return this.events.asObservable();\n }\n\n public selectThread(thread: Thread, options?: { skipLoadingMessages?: boolean }) {\n if (this.selectedThread()?.id === thread.id && this.chat() && !this.isLoadingMessages()) {\n return of();\n }\n\n const selectionId = ++this.activeThreadSelectionId;\n\n return (\n options?.skipLoadingMessages\n ? of([] as UIMessage<MessageMetadata>[])\n : defer(() => {\n this.isLoadingMessages.set(true);\n return fromPromise(\n this.fetchJson<UIMessage<MessageMetadata>[]>(`/threads/${thread.id}/messages`),\n ).pipe(\n finalize(() => {\n if (selectionId === this.activeThreadSelectionId) {\n this.isLoadingMessages.set(false);\n }\n }),\n );\n })\n ).pipe(\n tap((messages) => {\n if (selectionId !== this.activeThreadSelectionId) return;\n\n const chat = new Chat({\n id: thread.id,\n sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,\n\n onData: () => {\n this.events.next('onData');\n },\n\n onToolCall: async ({ toolCall }) => {\n if (!this.config.onToolCall) return;\n\n const result = this.config.onToolCall(toolCall);\n if (result === null || result === undefined) return;\n\n const output = result instanceof Promise ? await result : result;\n if (output === null || output === undefined) return;\n\n chat.addToolOutput({\n tool: toolCall.toolName,\n toolCallId: toolCall.toolCallId,\n output,\n });\n },\n\n onError: async () => {\n this.hasPendingToolCalls.set(false);\n this.events.next('onError');\n await this.completeLatch?.();\n },\n\n onFinish: async () => {\n this.hasPendingToolCalls.set(this.hasIncompleteToolCalls(chat.messages));\n this.events.next('onFinish');\n if (this.completeLatch) {\n await this.completeLatch();\n } else {\n this.onThreadMessagesUpdated({ threadId: thread.id });\n }\n },\n\n messages,\n transport: new DefaultChatTransport({\n api: this.resolveUrl('/chat'),\n headers: async () => await this.resolveHeaders(),\n prepareSendMessagesRequest: ({ messages, id, body, ...rest }) => {\n this.hasPendingToolCalls.set(false);\n return {\n ...rest,\n body: {\n ...body,\n id,\n messages: [messages.at(-1)],\n },\n };\n },\n }),\n });\n\n fixChat(chat);\n this.chat.set(chat);\n this.selectedThread.set(thread);\n this.syncConversationState(messages);\n\n this.resumeChat(thread.id, {\n reloadMessagesFirst: false,\n reloadMessagesAfterResume: false,\n });\n\n this.events.next('onThreadSelected');\n }),\n );\n }\n\n public deselectThread() {\n this.activeThreadSelectionId += 1;\n this.chat()?.stop();\n this.isLoadingMessages.set(false);\n this.hasPendingToolCalls.set(false);\n this.completeLatch = undefined;\n this.completeLatchThreadId = undefined;\n\n if (!this.selectedThread() && !this.chat()) return;\n\n this.selectedThread.set(undefined);\n this.chat.set(undefined);\n }\n\n public send(prompt: string) {\n if (this.isAgentWorking() || this.hasPendingToolCalls()) return of();\n\n const ensureThread = this.selectedThread()\n ? of(this.selectedThread()!.id)\n : fromPromise(\n this.fetchJson<Thread>('/threads', {\n method: 'POST',\n body: JSON.stringify({ prompt }),\n }),\n ).pipe(\n tap((thread) => this.upsertThread(thread)),\n switchMap((thread) =>\n this.selectThread(thread, { skipLoadingMessages: true }).pipe(map(() => thread.id)),\n ),\n );\n\n return ensureThread.pipe(\n tap((threadId) => {\n this.events.next('onSend');\n this.updateThreadRunning(threadId, true);\n this.completeLatchThreadId = threadId;\n this.completeLatch = createLatch(2, () => {\n this.onThreadMessagesUpdated({ threadId });\n this.completeLatch = undefined;\n this.completeLatchThreadId = undefined;\n });\n }),\n switchMap(() => fromPromise(this.chat()!.sendMessage({ text: prompt }))),\n );\n }\n\n public abort() {\n const chat = this.chat();\n if (!chat || !this.isAgentWorking()) return;\n\n const threadId = this.selectedThread()?.id;\n if (threadId) {\n this.updateThreadRunning(threadId, false);\n this.fetchJson(`/chat/${threadId}/abort`, { method: 'POST' }).catch(() => {});\n }\n\n chat.stop();\n this.hasPendingToolCalls.set(false);\n }\n\n public deleteThread(threadId: string) {\n if (this.selectedThread()?.id === threadId) {\n this.deselectThread();\n }\n\n return fromPromise(this.fetchJson(`/threads/${threadId}`, { method: 'DELETE' })).pipe(\n tap(() => this.removeThread(threadId)),\n );\n }\n\n private subscribeToWsEvents() {\n this.wsService.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(async (event) => {\n switch (event.type) {\n case 'thread:created':\n this.upsertThread(event.payload.thread);\n break;\n case 'thread:deleted':\n this.onThreadDeleted(event.payload);\n break;\n case 'thread:title-updated':\n this.onThreadTitleUpdated(event.payload);\n break;\n case 'thread:run-started':\n await this.onThreadRunStarted(event.payload);\n break;\n case 'thread:run-finished':\n this.onThreadRunFinished(event.payload);\n break;\n case 'thread:messages-updated':\n this.upsertThread(event.payload.thread);\n if (this.completeLatch && this.completeLatchThreadId === event.payload.threadId) {\n await this.completeLatch();\n } else {\n this.onThreadMessagesUpdated(event.payload);\n }\n break;\n }\n });\n }\n\n private subscribeToWsConnections() {\n this.wsService.opened.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n if (!this.hasSeenWsOpen) {\n this.hasSeenWsOpen = true;\n return;\n }\n\n this.reloadThreads().subscribe(() => {\n const threadId = this.selectedThread()?.id;\n if (!threadId || this.isAgentWorking()) return;\n\n this.resumeChat(threadId, {\n reloadMessagesFirst: true,\n reloadMessagesAfterResume: true,\n });\n });\n });\n }\n\n private onThreadMessagesUpdated(payload: { threadId: string }) {\n const chat = this.chat();\n if (!chat || this.selectedThread()?.id !== payload.threadId) return;\n if (this.isAgentWorking()) return;\n\n this.reloadMessages(payload.threadId).subscribe((messages) => {\n if (this.chat() !== chat) return;\n if (this.selectedThread()?.id !== payload.threadId) return;\n chat.messages = messages;\n this.syncConversationState(messages);\n });\n }\n\n private async onThreadRunStarted(payload: { thread: Thread }) {\n this.upsertThread(payload.thread);\n\n if (this.selectedThread()?.id !== payload.thread.id || this.isAgentWorking()) return;\n\n await this.resumeChat(payload.thread.id, {\n reloadMessagesFirst: true,\n reloadMessagesAfterResume: true,\n });\n }\n\n private onThreadTitleUpdated(payload: { thread: Thread }) {\n this.upsertThread(payload.thread);\n }\n\n private onThreadRunFinished(payload: { thread: Thread }) {\n this.upsertThread(payload.thread);\n }\n\n private onThreadDeleted(payload: { threadId: string }) {\n this.removeThread(payload.threadId);\n\n if (this.selectedThread()?.id !== payload.threadId) return;\n\n this.deselectThread();\n }\n\n private upsertThread(thread: Thread) {\n const current = this.threads();\n const nextThreads = current ? [...current] : [];\n const existingIndex = nextThreads.findIndex((currentThread) => currentThread.id === thread.id);\n\n if (existingIndex === -1) {\n nextThreads.push(thread);\n } else {\n nextThreads[existingIndex] = { ...nextThreads[existingIndex], ...thread };\n }\n\n this.threads.set(this.sortThreads(nextThreads));\n\n const selected = this.selectedThread();\n if (selected?.id === thread.id) {\n this.selectedThread.set({ ...selected, ...thread });\n }\n }\n\n private removeThread(threadId: string) {\n const current = this.threads();\n if (!current) return;\n\n this.threads.set(current.filter((thread) => thread.id !== threadId));\n }\n\n private updateThreadRunning(threadId: string, isRunning: boolean) {\n const thread = this.threads()?.find((currentThread) => currentThread.id === threadId);\n if (thread) {\n this.upsertThread({ ...thread, isRunning });\n }\n\n const selected = this.selectedThread();\n if (selected?.id === threadId) {\n this.selectedThread.set({ ...selected, isRunning });\n }\n }\n\n private sortThreads(threads: Thread[]) {\n return [...threads].sort((left, right) => {\n const updatedAtDelta = Date.parse(right.updatedAt) - Date.parse(left.updatedAt);\n if (updatedAtDelta !== 0) return updatedAtDelta;\n\n return Date.parse(right.createdAt) - Date.parse(left.createdAt);\n });\n }\n\n private async resumeChat(\n threadId: string,\n options: {\n reloadMessagesFirst: boolean;\n reloadMessagesAfterResume: boolean;\n },\n ) {\n const chat = this.chat();\n if (!chat || this.selectedThread()?.id !== threadId) return;\n\n if (options.reloadMessagesFirst) {\n try {\n await this.reloadMessagesForSelectedThread(threadId);\n } catch {\n return;\n }\n\n if (this.chat() !== chat || this.selectedThread()?.id !== threadId) return;\n }\n\n void chat.resumeStream().then(() => {\n if (this.chat() !== chat || this.selectedThread()?.id !== threadId) return;\n if (this.isAgentWorking()) return;\n if (!options.reloadMessagesAfterResume) return;\n\n this.reloadMessagesForSelectedThread(threadId).catch(() => {});\n });\n }\n\n private async reloadMessagesForSelectedThread(threadId: string) {\n const chat = this.chat();\n if (!chat || this.selectedThread()?.id !== threadId) return;\n\n const messages = await this.fetchJson<UIMessage<MessageMetadata>[]>(\n `/threads/${threadId}/messages`,\n );\n if (this.chat() !== chat || this.selectedThread()?.id !== threadId) return;\n\n chat.messages = messages;\n this.syncConversationState(messages);\n }\n\n private reloadThreads() {\n return fromPromise(this.fetchJson<Thread[]>('/threads')).pipe(\n tap((threads) => this.threads.set(this.sortThreads(threads))),\n );\n }\n\n private reloadMessages(threadId: string) {\n return fromPromise(\n this.fetchJson<UIMessage<MessageMetadata>[]>(`/threads/${threadId}/messages`),\n );\n }\n\n private syncConversationState(messages: UIMessage<MessageMetadata>[]) {\n this.hasPendingToolCalls.set(this.hasIncompleteToolCalls(messages));\n }\n\n private hasIncompleteToolCalls(messages: UIMessage<MessageMetadata>[]) {\n const lastAssistantMessage = this.getLastAssistantMessage(messages);\n if (!lastAssistantMessage) return false;\n\n let lastStepStartIndex = -1;\n for (const [index, part] of lastAssistantMessage.parts.entries()) {\n if (part.type === 'step-start') {\n lastStepStartIndex = index;\n }\n }\n\n const toolParts = lastAssistantMessage.parts\n .slice(lastStepStartIndex + 1)\n .filter(\n (part) =>\n part.type.startsWith('tool-') &&\n !(part as { providerExecuted?: boolean }).providerExecuted,\n );\n\n return (\n toolParts.length > 0 &&\n toolParts.some((part) => {\n const state = (part as { state?: string }).state;\n return (\n state !== 'output-available' && state !== 'output-error' && state !== 'output-denied'\n );\n })\n );\n }\n\n private getLastAssistantMessage(messages: UIMessage<MessageMetadata>[]) {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message.role === 'assistant') {\n return message;\n }\n }\n\n return undefined;\n }\n\n private resolveUrl(path: string) {\n const baseUrl = this.config.transport.baseUrl;\n const base = typeof baseUrl === 'string' ? baseUrl : (baseUrl as Signal<string>)();\n return base.replace(/\\/$/, '') + path;\n }\n\n private async resolveHeaders() {\n return await Promise.resolve(this.config.transport.getAuthHeaders());\n }\n\n private async fetchJson<T>(path: string, init?: RequestInit) {\n const url = this.resolveUrl(path);\n const headers = await this.resolveHeaders();\n const res = await fetch(url, {\n ...init,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n ...init?.headers,\n },\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n const text = await res.text();\n return text ? (JSON.parse(text) as T) : (undefined as T);\n }\n}\n\n/**\n * Override snapshot to avoid structuredClone failing on\n * Object.defineProperty getter/setter parts.\n */\nfunction fixChat(chat: Chat<UIMessage<MessageMetadata>>) {\n function deepClone<T>(value: T): T {\n if (value === null || value === undefined) return value;\n if (typeof value !== 'object') return value;\n if (Array.isArray(value)) return value.map(deepClone) as unknown as T;\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value as Record<string, unknown>)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n }\n\n (chat as unknown as { state: { snapshot: unknown } }).state.snapshot = deepClone;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\n\n@Component({\n selector: 'cortex-message-aborted-flag',\n templateUrl: './message-aborted-flag.component.html',\n styleUrl: './message-aborted-flag.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [TranslatePipe],\n host: { class: 'cortex-aborted-flag' },\n})\nexport class MessageAbortedFlagComponent {}\n","<span class=\"cortex-aborted-flag__line\"></span>\n<span class=\"cortex-aborted-flag__label\">\n <svg class=\"cortex-aborted-flag__icon\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path d=\"M6 1.5v5M6 8.75v.5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n {{ 'translate_aborted' | translate }}\n</span>\n<span class=\"cortex-aborted-flag__line\"></span>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { marked } from 'marked';\nimport DOMPurify from 'dompurify';\n\n@Pipe({\n name: 'marked',\n standalone: true,\n})\nexport class MarkedPipe implements PipeTransform {\n public constructor(private readonly sanitizer: DomSanitizer) {}\n\n public transform(value: string | undefined | null) {\n if (!value) {\n return '';\n }\n\n let html = marked.parse(value, { async: false }) as string;\n\n html = html\n .replace(/<table>/g, '<div style=\"overflow-x:auto\"><table style=\"width:auto\">')\n .replace(/<\\/table>/g, '</table></div>')\n .replace(/<(t[hd])([\\s>])/g, '<$1 style=\"padding:0.5rem 1rem\"$2');\n\n return this.sanitizer.bypassSecurityTrustHtml(DOMPurify.sanitize(html));\n }\n}\n","/**\n * Smooths the display of streamed text by buffering incoming characters\n * and releasing them at a consistent rate, eliminating the jerky appearance\n * caused by uneven token delivery from LLMs.\n *\n * Uses a proportional drain strategy: each animation frame releases a fraction\n * of the buffered characters, creating natural smoothing that adapts to\n * the incoming token rate.\n */\nexport class StreamTextSmoother {\n private fullText = '';\n private displayedLength = 0;\n private animationFrameId: number | null = null;\n private isDone = false;\n\n /**\n * Fraction of buffer to release per frame.\n * At 60fps, 0.03 means roughly half the buffer drains in ~23 frames (~383ms).\n */\n private static readonly DRAIN_FRACTION = 0.03;\n\n /** Minimum characters to release per frame to prevent stalling at small buffer sizes. */\n private static readonly MIN_CHARS_PER_FRAME = 1;\n\n /** Faster drain fraction when the stream has completed, for a quick but smooth flush. */\n private static readonly DONE_DRAIN_FRACTION = 0.1;\n\n public constructor(private readonly onUpdate: (displayedText: string) => void) {}\n\n public seed(displayedText: string) {\n this.fullText = displayedText;\n this.displayedLength = displayedText.length;\n this.onUpdate(displayedText);\n }\n\n public update(newFullText: string, done: boolean) {\n this.fullText = newFullText;\n this.isDone = done;\n this.displayedLength = Math.min(this.displayedLength, this.fullText.length);\n\n if (done && this.displayedLength >= this.fullText.length) {\n this.onUpdate(this.fullText);\n this.stopAnimation();\n return;\n }\n\n if (!this.animationFrameId) {\n this.scheduleFrame();\n }\n }\n\n public destroy() {\n this.stopAnimation();\n }\n\n private scheduleFrame() {\n this.animationFrameId = requestAnimationFrame(() => this.tick());\n }\n\n private tick() {\n const bufferSize = this.fullText.length - this.displayedLength;\n\n if (bufferSize <= 0) {\n this.animationFrameId = null;\n return;\n }\n\n const fraction = this.isDone\n ? StreamTextSmoother.DONE_DRAIN_FRACTION\n : StreamTextSmoother.DRAIN_FRACTION;\n\n const charsToRelease = Math.max(\n StreamTextSmoother.MIN_CHARS_PER_FRAME,\n Math.ceil(bufferSize * fraction),\n );\n\n this.displayedLength = Math.min(this.fullText.length, this.displayedLength + charsToRelease);\n this.onUpdate(this.fullText.substring(0, this.displayedLength));\n\n if (this.displayedLength < this.fullText.length) {\n this.scheduleFrame();\n } else {\n this.animationFrameId = null;\n }\n }\n\n private stopAnimation() {\n if (this.animationFrameId) {\n cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n effect,\n input,\n OnDestroy,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TextUIPart, UIMessage } from 'ai';\nimport { MarkedPipe } from '../../pipes/marked.pipe';\nimport { StreamTextSmoother } from '../../utils/stream-text-smoother';\n\n@Component({\n selector: 'cortex-message-text-part',\n templateUrl: './message-text-part.component.html',\n styleUrl: './message-text-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [MarkedPipe],\n})\nexport class MessageTextPartComponent implements OnDestroy {\n public readonly role = input.required<UIMessage['role']>();\n public readonly textPart = input.required<TextUIPart>();\n\n protected readonly displayedText = signal('');\n\n private smoother: StreamTextSmoother | null = null;\n private isFirstRender = true;\n\n public constructor() {\n effect(() => {\n const part = this.textPart();\n const role = this.role();\n const isStreaming = part.state === 'streaming';\n\n if (role !== 'assistant') {\n this.destroySmoother();\n this.displayedText.set(part.text);\n this.isFirstRender = false;\n return;\n }\n\n if (!isStreaming) {\n this.destroySmoother();\n this.displayedText.set(part.text);\n this.isFirstRender = false;\n return;\n }\n\n if (this.isFirstRender) {\n this.ensureSmoother();\n this.smoother!.seed(part.text);\n this.isFirstRender = false;\n return;\n }\n\n this.isFirstRender = false;\n\n this.ensureSmoother();\n\n this.smoother!.update(part.text, false);\n });\n }\n\n public ngOnDestroy() {\n this.destroySmoother();\n }\n\n private destroySmoother() {\n if (this.smoother) {\n this.smoother.destroy();\n this.smoother = null;\n }\n }\n\n private ensureSmoother() {\n if (this.smoother) {\n return;\n }\n\n this.smoother = new StreamTextSmoother((text) => this.displayedText.set(text));\n this.smoother.seed(this.displayedText());\n }\n}\n","<div\n class=\"cortex-text-part\"\n [class.cortex-text-part--assistant]=\"role() === 'assistant'\"\n [class.cortex-text-part--user]=\"role() === 'user'\"\n>\n <div\n class=\"cortex-text-bubble\"\n [class.cortex-text-bubble--assistant]=\"role() === 'assistant'\"\n [class.cortex-text-bubble--user]=\"role() === 'user'\"\n [innerHTML]=\"displayedText() | marked\"\n ></div>\n</div>\n","import { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { ReasoningUIPart } from 'ai';\n\n@Component({\n selector: 'cortex-message-reasoning-part',\n templateUrl: './message-reasoning-part.component.html',\n styleUrl: './message-reasoning-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgClass],\n})\nexport class MessageReasoningPartComponent {\n public readonly reasoningPart = input.required<ReasoningUIPart>();\n}\n","@let p = reasoningPart();\n<details class=\"cortex-reasoning-details\">\n <summary class=\"cortex-reasoning-details__summary\">\n <div class=\"cortex-reasoning-details__header\">\n <span class=\"cortex-reasoning-details__icon\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <path\n d=\"M10 2C6.686 2 4 4.686 4 8c0 1.655.672 3.154 1.757 4.243.362.363.576.858.576 1.371V14.5a1 1 0 0 0 1 1h5.334a1 1 0 0 0 1-1v-.886c0-.513.214-1.008.576-1.371A5.978 5.978 0 0 0 16 8c0-3.314-2.686-6-6-6Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M7.5 17.5h5M8.5 8a2 2 0 0 1 2-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n\n <div class=\"cortex-reasoning-details__title-group\">\n <div class=\"cortex-reasoning-details__title-row\">\n <div class=\"cortex-reasoning-details__title\">Reasoning</div>\n @if (p.state) {\n <span\n class=\"cortex-reasoning-details__badge\"\n [ngClass]=\"{\n 'cortex-reasoning-details__badge--streaming': p.state === 'streaming',\n 'cortex-reasoning-details__badge--done': p.state === 'done',\n }\"\n >\n {{ p.state === 'streaming' ? 'Streaming' : 'Done' }}\n </span>\n }\n </div>\n </div>\n </div>\n\n <span class=\"cortex-reasoning-details__chevron\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"m5.75 8.25 4.25 4.25 4.25-4.25\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n </summary>\n\n <div class=\"cortex-reasoning-details__body\">\n <div class=\"cortex-reasoning-details__content\">\n <pre class=\"cortex-reasoning-details__pre\">{{\n p.text.trim() ? p.text : 'No reasoning provided.'\n }}</pre>\n </div>\n </div>\n</details>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport hljs from 'highlight.js/lib/core';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport sql from 'highlight.js/lib/languages/sql';\n\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('cypher', sql);\n\n@Pipe({ name: 'highlight', standalone: true })\nexport class HighlightPipe implements PipeTransform {\n public constructor(private readonly sanitizer: DomSanitizer) {}\n\n public transform(code: string, lang: string) {\n if (!code) return '';\n\n const highlighted = hljs.getLanguage(lang)\n ? hljs.highlight(code, { language: lang }).value\n : this.escapeHtml(code);\n\n return this.sanitizer.bypassSecurityTrustHtml(highlighted);\n }\n\n private escapeHtml(str: string) {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\n\n@Component({\n selector: 'cortex-json-tree',\n templateUrl: './json-tree.component.html',\n styleUrl: './json-tree.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [NgTemplateOutlet],\n host: { class: 'cortex-json-tree' },\n})\nexport class JsonTreeComponent {\n public readonly data = input.required<unknown>();\n public readonly expandDepth = input<number>(1);\n\n private collapsedPaths = new Set<string>();\n private userToggled = new Set<string>();\n\n protected isCollapsed(path: string, depth: number) {\n if (this.userToggled.has(path)) {\n return this.collapsedPaths.has(path);\n }\n return depth >= this.expandDepth();\n }\n\n protected toggle(path: string, depth: number) {\n this.userToggled.add(path);\n const currentlyCollapsed = this.isCollapsed(path, depth);\n if (currentlyCollapsed) {\n this.collapsedPaths.delete(path);\n } else {\n this.collapsedPaths.add(path);\n }\n }\n\n protected isObject(value: unknown) {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n }\n\n protected isArray(value: unknown) {\n return Array.isArray(value);\n }\n\n protected objectEntries(value: unknown) {\n if (!this.isObject(value)) return [];\n return Object.entries(value as Record<string, unknown>);\n }\n\n protected arrayItems(value: unknown) {\n return Array.isArray(value) ? value : [];\n }\n\n protected objectLength(value: unknown) {\n if (!this.isObject(value)) return 0;\n return Object.keys(value as Record<string, unknown>).length;\n }\n\n protected arrayLength(value: unknown) {\n return Array.isArray(value) ? value.length : 0;\n }\n\n protected formatPrimitive(value: unknown) {\n if (value === null || value === undefined) return 'null';\n if (typeof value === 'string') return JSON.stringify(value);\n return String(value);\n }\n\n protected primitiveClass(value: unknown) {\n if (value === null || value === undefined) return 'jt-null';\n if (typeof value === 'string') return 'jt-string';\n if (typeof value === 'number') return 'jt-number';\n if (typeof value === 'boolean') return 'jt-boolean';\n return '';\n }\n\n protected isContainer(value: unknown) {\n return this.isObject(value) || this.isArray(value);\n }\n\n protected parsed(value: unknown) {\n return this.deepParse(value);\n }\n\n private deepParse(value: unknown): unknown {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n return this.deepParse(JSON.parse(trimmed));\n } catch {\n return value;\n }\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((item) => this.deepParse(item));\n }\n if (value !== null && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n result[key] = this.deepParse(val);\n }\n return result;\n }\n return value;\n }\n}\n","<!-- Entry point: parse and render the root value -->\n<ng-container\n *ngTemplateOutlet=\"valueTemplate; context: { $implicit: parsed(data()), path: '$', depth: 0 }\"\n/>\n\n<!-- Recursive value renderer -->\n<ng-template #valueTemplate let-value let-path=\"path\" let-depth=\"depth\">\n @if (isObject(value)) {\n @if (objectLength(value) === 0) {\n <span class=\"jt-bracket\">{{ '{' }}{{ '}' }}</span>\n } @else {\n <span class=\"jt-toggle\" (click)=\"toggle(path, depth); $event.stopPropagation()\" role=\"button\">\n <span class=\"jt-arrow\" [class.jt-arrow--collapsed]=\"isCollapsed(path, depth)\">&#9662;</span>\n <span class=\"jt-bracket\">{{ '{' }}</span>\n </span>\n @if (isCollapsed(path, depth)) {\n <span\n class=\"jt-collapsed-hint\"\n (click)=\"toggle(path, depth); $event.stopPropagation()\"\n role=\"button\"\n >{{ objectLength(value) }}\n {{ objectLength(value) === 1 ? 'property' : 'properties' }}</span\n ><span class=\"jt-bracket\">{{ '}' }}</span>\n } @else {\n <div class=\"jt-indent\">\n @for (entry of objectEntries(value); track entry[0]; let last = $last) {\n <div class=\"jt-line\">\n <span class=\"jt-key\">\"{{ entry[0] }}\"</span><span class=\"jt-colon\">: </span>\n @if (isContainer(entry[1])) {\n <ng-container\n *ngTemplateOutlet=\"\n valueTemplate;\n context: { $implicit: entry[1], path: path + '.' + entry[0], depth: depth + 1 }\n \"\n />\n } @else {\n <span [class]=\"primitiveClass(entry[1])\">{{ formatPrimitive(entry[1]) }}</span>\n }\n @if (!last) {\n <span class=\"jt-comma\">,</span>\n }\n </div>\n }\n </div>\n <span class=\"jt-bracket\">{{ '}' }}</span>\n }\n }\n } @else if (isArray(value)) {\n @if (arrayLength(value) === 0) {\n <span class=\"jt-bracket\">[]</span>\n } @else {\n <span class=\"jt-toggle\" (click)=\"toggle(path, depth); $event.stopPropagation()\" role=\"button\">\n <span class=\"jt-arrow\" [class.jt-arrow--collapsed]=\"isCollapsed(path, depth)\">&#9662;</span>\n <span class=\"jt-bracket\">[</span>\n </span>\n @if (isCollapsed(path, depth)) {\n <span\n class=\"jt-collapsed-hint\"\n (click)=\"toggle(path, depth); $event.stopPropagation()\"\n role=\"button\"\n >{{ arrayLength(value) }} {{ arrayLength(value) === 1 ? 'item' : 'items' }}</span\n ><span class=\"jt-bracket\">]</span>\n } @else {\n <div class=\"jt-indent\">\n @for (item of arrayItems(value); track $index; let last = $last) {\n <div class=\"jt-line\">\n @if (isContainer(item)) {\n <ng-container\n *ngTemplateOutlet=\"\n valueTemplate;\n context: { $implicit: item, path: path + '[' + $index + ']', depth: depth + 1 }\n \"\n />\n } @else {\n <span [class]=\"primitiveClass(item)\">{{ formatPrimitive(item) }}</span>\n }\n @if (!last) {\n <span class=\"jt-comma\">,</span>\n }\n </div>\n }\n </div>\n <span class=\"jt-bracket\">]</span>\n }\n }\n } @else {\n <span [class]=\"primitiveClass(value)\">{{ formatPrimitive(value) }}</span>\n }\n</ng-template>\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ToolUIPart } from 'ai';\nimport { HighlightPipe } from '../../pipes/highlight.pipe';\nimport { JsonTreeComponent } from '../json-tree/json-tree.component';\n\n@Component({\n selector: 'cortex-message-tool-call-part',\n templateUrl: './message-tool-call-part.component.html',\n styleUrl: './message-tool-call-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [HighlightPipe, NgClass, TranslatePipe, JsonTreeComponent],\n})\nexport class MessageToolCallPartComponent {\n private static readonly CODE_FIELDS: Record<string, string> = {\n code: 'javascript',\n query: 'cypher',\n };\n\n public readonly toolCallPart = input.required<ToolUIPart>();\n\n protected readonly codeSnippets = computed(() => {\n const inp = this.toolCallPart().input;\n if (!inp || typeof inp !== 'object') return [];\n\n const record = inp as Record<string, unknown>;\n const snippets: { key: string; lang: string; value: string }[] = [];\n\n for (const [key, lang] of Object.entries(MessageToolCallPartComponent.CODE_FIELDS)) {\n if (key in record && typeof record[key] === 'string') {\n snippets.push({\n key,\n lang,\n value: (record[key] as string).replace(/\\\\n/g, '\\n'),\n });\n }\n }\n return snippets;\n });\n\n protected readonly remainingInput = computed(() => {\n const inp = this.toolCallPart().input;\n if (!inp || typeof inp !== 'object') return inp;\n\n const record = inp as Record<string, unknown>;\n const codeKeys = Object.keys(MessageToolCallPartComponent.CODE_FIELDS);\n const remaining: Record<string, unknown> = {};\n let hasKeys = false;\n\n for (const [key, val] of Object.entries(record)) {\n if (!codeKeys.includes(key)) {\n remaining[key] = val;\n hasKeys = true;\n }\n }\n return hasKeys ? remaining : null;\n });\n\n protected toolName() {\n const type = this.toolCallPart().type;\n if (!type) return '';\n return type.startsWith('tool-') ? type.slice('tool-'.length) : type;\n }\n}\n","<details class=\"cortex-tool-details\">\n <summary class=\"cortex-tool-details__summary\">\n <div class=\"cortex-tool-details__header\">\n <div class=\"cortex-tool-details__icon-box\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-tool-details__icon-svg\" fill=\"none\">\n <path\n d=\"M6.5 6.5 3.75 10l2.75 3.5M13.5 6.5 16.25 10l-2.75 3.5M11.25 5.75 8.75 14.25\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n\n <div class=\"cortex-tool-details__info\">\n <div class=\"cortex-tool-details__title-row\">\n <div class=\"cortex-tool-details__name-row\">\n <div class=\"cortex-tool-details__name\" [attr.title]=\"toolCallPart().title || null\">\n {{ toolCallPart().title ?? 'Tool call' }}\n </div>\n @if (toolName()) {\n <span\n class=\"cortex-tool-details__tool-badge\"\n [attr.title]=\"toolCallPart().type || null\"\n >{{ toolName() }}</span\n >\n }\n </div>\n <div class=\"cortex-tool-details__id-line\">\n <span class=\"cortex-tool-details__id-label\">ID</span>\n <span class=\"cortex-tool-details__id-value\"> {{ toolCallPart().toolCallId }}</span>\n @if (toolCallPart().providerExecuted) {\n <span class=\"cortex-tool-details__provider-badge\">\n <span class=\"cortex-tool-details__provider-dot\"></span>\n provider\n </span>\n }\n </div>\n </div>\n\n <div class=\"cortex-tool-details__actions\">\n <span\n class=\"cortex-tool-details__state-badge\"\n [ngClass]=\"{\n 'cortex-tool-details__state-badge--success':\n toolCallPart().state === 'output-available',\n 'cortex-tool-details__state-badge--error': toolCallPart().state === 'output-error',\n 'cortex-tool-details__state-badge--denied': toolCallPart().state === 'output-denied',\n 'cortex-tool-details__state-badge--approval':\n toolCallPart().state === 'approval-requested' ||\n toolCallPart().state === 'approval-responded',\n 'cortex-tool-details__state-badge--pending':\n toolCallPart().state === 'input-streaming' ||\n toolCallPart().state === 'input-available',\n }\"\n >\n @switch (toolCallPart().state) {\n @case ('input-streaming') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--amber cortex-tool-details__status-dot--pulse\"\n ></span>\n Calling\n }\n @case ('input-available') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--amber\"\n ></span>\n Input ready\n }\n @case ('approval-requested') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--violet cortex-tool-details__status-dot--pulse\"\n ></span>\n Needs approval\n }\n @case ('approval-responded') {\n @if (toolCallPart().approval?.approved) {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--emerald\"\n ></span>\n Approved\n } @else {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--slate\"\n ></span>\n Responded\n }\n }\n @case ('output-available') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--emerald\"\n ></span>\n {{ 'translate_completed' | translate }}\n }\n @case ('output-error') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--red\"\n ></span>\n Error\n }\n @case ('output-denied') {\n <span\n class=\"cortex-tool-details__status-dot cortex-tool-details__status-dot--slate\"\n ></span>\n Denied\n }\n }\n </span>\n\n <span class=\"cortex-tool-details__chevron\" aria-hidden=\"true\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path\n d=\"m5.75 8.25 4.25 4.25 4.25-4.25\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </span>\n </div>\n </div>\n </div>\n </summary>\n\n <div class=\"cortex-tool-details__body\">\n <div class=\"cortex-tool-details__panels\">\n @for (snippet of codeSnippets(); track snippet.key) {\n <div class=\"cortex-tool-details__panel\">\n <div class=\"cortex-tool-details__panel-header\">\n <div class=\"cortex-tool-details__panel-label\">{{ snippet.key }}</div>\n <div class=\"cortex-tool-details__panel-lang\">{{ snippet.lang }}</div>\n </div>\n <pre\n dir=\"ltr\"\n class=\"cortex-tool-details__code-pre\"\n ><code class=\"hljs\" [innerHTML]=\"snippet.value | highlight : snippet.lang\"></code></pre>\n </div>\n }\n\n @if (remainingInput(); as remaining) {\n <div class=\"cortex-tool-details__panel\">\n <div class=\"cortex-tool-details__panel-header\">\n <div class=\"cortex-tool-details__panel-label\">Input</div>\n <div class=\"cortex-tool-details__panel-lang\">json</div>\n </div>\n <div dir=\"ltr\" class=\"cortex-tool-details__tree-container\">\n <cortex-json-tree [data]=\"remaining\" [expandDepth]=\"2\" />\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'output-available') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--success\">\n <div class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--success\">\n <div class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--success\">\n Output\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--success\">\n json\n </div>\n </div>\n <div dir=\"ltr\" class=\"cortex-tool-details__tree-container\">\n <cortex-json-tree [data]=\"toolCallPart().output\" [expandDepth]=\"2\" />\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'output-error') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--error\">\n <div class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--error\">\n <div class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--error\">\n Error\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--error\">\n text\n </div>\n </div>\n <pre dir=\"ltr\" class=\"cortex-tool-details__error-pre\">{{ toolCallPart().errorText }}</pre>\n </div>\n }\n\n @if (toolCallPart().state === 'output-denied') {\n <div class=\"cortex-tool-details__panel\">\n <div class=\"cortex-tool-details__panel-header\">\n <div class=\"cortex-tool-details__panel-label\">Denied</div>\n <div class=\"cortex-tool-details__panel-lang\">approval</div>\n </div>\n <div class=\"cortex-tool-details__denied-body\">\n Tool execution was denied.\n @if (toolCallPart().approval?.reason) {\n <div class=\"cortex-tool-details__reason-box\">\n <div class=\"cortex-tool-details__reason-label\">Reason</div>\n <div class=\"cortex-tool-details__reason-text\">\n {{ toolCallPart().approval?.reason }}\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'approval-requested') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--approval\">\n <div\n class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--approval\"\n >\n <div\n class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--approval\"\n >\n Approval requested\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--approval\">\n {{ toolCallPart().approval?.id }}\n </div>\n </div>\n <div class=\"cortex-tool-details__approval-body\">\n Waiting for approval to execute this tool.\n </div>\n </div>\n }\n\n @if (toolCallPart().state === 'approval-responded') {\n <div class=\"cortex-tool-details__panel cortex-tool-details__panel--approval\">\n <div\n class=\"cortex-tool-details__panel-header cortex-tool-details__panel-header--approval\"\n >\n <div\n class=\"cortex-tool-details__panel-label cortex-tool-details__panel-label--approval\"\n >\n Approval response\n </div>\n <div class=\"cortex-tool-details__panel-lang cortex-tool-details__panel-lang--approval\">\n {{ toolCallPart().approval?.id }}\n </div>\n </div>\n <div class=\"cortex-tool-details__approval-body\">\n @if (toolCallPart().approval?.approved) {\n Approved.\n } @else {\n Response received.\n }\n @if (toolCallPart().approval?.reason) {\n <div\n class=\"cortex-tool-details__reason-box cortex-tool-details__reason-box--approval\"\n >\n <div\n class=\"cortex-tool-details__reason-label cortex-tool-details__reason-label--approval\"\n >\n Reason\n </div>\n <div\n class=\"cortex-tool-details__reason-text cortex-tool-details__reason-text--approval\"\n >\n {{ toolCallPart().approval?.reason }}\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n</details>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n signal,\n forwardRef,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n ControlValueAccessor,\n FormBuilder,\n FormControl,\n NG_VALUE_ACCESSOR,\n ReactiveFormsModule,\n Validators,\n} from '@angular/forms';\nimport { ToolUIPart, UIMessage } from 'ai';\nimport { finalize } from 'rxjs';\nimport { fromPromise } from 'rxjs/internal/observable/innerFrom';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { CORTEX_CLIENT_CONFIG } from '../../config';\n\ntype InputFile = {\n name: string;\n bytes: string;\n};\n\n@Component({\n selector: 'cortex-message-capture-files-part',\n templateUrl: './message-capture-files-part.component.html',\n styleUrl: './message-capture-files-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [ReactiveFormsModule, forwardRef(() => FileInputComponent), TranslatePipe],\n host: { class: 'cortex-capture-files' },\n})\nexport class MessageCaptureFilesPartComponent {\n public readonly message = input.required<UIMessage>();\n public readonly toolPart = input.required<ToolUIPart>();\n public readonly setOutput = input.required<(output: unknown) => void>();\n\n protected readonly requestedFiles = computed(() => readRequestedFiles(this.toolPart().input));\n protected readonly hasInvalidInput = computed(() => this.requestedFiles().length === 0);\n\n protected readonly isLoading = signal(false);\n\n protected readonly outputData = computed(() => {\n const raw = this.toolPart().output;\n if (!raw) return null;\n const parsed = typeof raw === 'string' ? JSON.parse(raw) : raw;\n return parsed as {\n status: 'success' | 'canceled';\n message?: string;\n result?: { id: string; uploadId: string }[];\n };\n });\n\n protected readonly form = computed(() => {\n const form = this.fb.group({\n files: this.fb.array(\n this.requestedFiles().map((x) =>\n this.fb.group({\n id: new FormControl(x.id, { nonNullable: true, validators: [Validators.required] }),\n file: new FormControl(null as unknown as InputFile, {\n nonNullable: true,\n validators: [Validators.required],\n }),\n }),\n ),\n ),\n });\n\n if (this.toolPart().output) {\n form.disable();\n }\n\n return form;\n });\n\n private readonly fb = inject(FormBuilder);\n private readonly config = inject(CORTEX_CLIENT_CONFIG);\n\n protected async submit() {\n if (this.hasInvalidInput() || this.form().invalid || this.isLoading()) return;\n\n this.isLoading.set(true);\n const { files } = this.form().getRawValue();\n\n const baseUrl = this.config.transport.baseUrl;\n const base = typeof baseUrl === 'string' ? baseUrl : (baseUrl as Signal<string>)();\n const url = base.replace(/\\/$/, '') + '/files';\n\n fromPromise(\n (async () => {\n const headers = await Promise.resolve(this.config.transport.getAuthHeaders());\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: JSON.stringify({\n files,\n toolCallId: this.toolPart().toolCallId,\n message: this.message(),\n }),\n });\n if (!res.ok) throw new Error(`HTTP ${res.status}: ${res.statusText}`);\n return res.json();\n })(),\n )\n .pipe(finalize(() => this.isLoading.set(false)))\n .subscribe((result) => {\n this.setOutput()({\n status: 'success',\n result,\n });\n });\n }\n\n protected async downloadFile(uploadId: string) {\n const baseUrl = this.config.transport.baseUrl;\n const base = typeof baseUrl === 'string' ? baseUrl : (baseUrl as Signal<string>)();\n const url = base.replace(/\\/$/, '') + '/files/' + uploadId;\n const headers = await Promise.resolve(this.config.transport.getAuthHeaders());\n\n const response = await fetch(url, { headers });\n const disposition = response.headers.get('Content-Disposition');\n const name = disposition?.match(/filename=\"?([^\";\\n]+)\"?/)?.[1] ?? uploadId;\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = blobUrl;\n a.download = name;\n a.click();\n URL.revokeObjectURL(blobUrl);\n }\n\n protected cancel() {\n this.setOutput()({\n status: 'canceled',\n message: 'User canceled upload',\n });\n }\n}\n\nfunction readRequestedFiles(input: unknown) {\n if (!input || typeof input !== 'object') return [];\n\n const files = (input as { files?: unknown }).files;\n if (!Array.isArray(files)) return [];\n\n return files.flatMap(function (file) {\n if (!file || typeof file !== 'object') return [];\n\n const label = (file as { label?: unknown }).label;\n const id = (file as { id?: unknown }).id;\n\n if (typeof label !== 'string' || typeof id !== 'string') return [];\n\n return [{ label, id }];\n });\n}\n\n@Component({\n selector: 'cortex-file-input',\n template: `<div class=\"cortex-file-input\">\n <button type=\"button\" (click)=\"fileInput.click()\" class=\"cortex-file-input__btn\">\n {{ 'translate_choose_file' | translate }}\n </button>\n <span class=\"cortex-file-input__name\">{{\n value()?.name ?? ('translate_no_file_chosen' | translate)\n }}</span>\n <input #fileInput (change)=\"loadFile($event)\" type=\"file\" class=\"cortex-file-input__hidden\" />\n </div>`,\n styleUrl: './message-capture-files-part.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [TranslatePipe],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: forwardRef(() => FileInputComponent),\n },\n ],\n})\nexport class FileInputComponent implements ControlValueAccessor {\n public allowedMimeTypes = input('*/*');\n\n protected readonly value = signal<InputFile | undefined>(undefined);\n protected readonly isDisabled = signal<boolean>(false);\n protected onTouch?: () => void;\n protected readonly isProcessing = signal<boolean>(false);\n\n private onChange?: (value?: InputFile) => void;\n\n writeValue(value?: InputFile) {\n this.value.set(value);\n }\n\n registerOnChange(fn: (value?: InputFile) => void) {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void) {\n this.onTouch = fn;\n }\n\n setDisabledState(isDisabled: boolean) {\n this.isDisabled.set(isDisabled);\n }\n\n protected async loadFile(event: Event) {\n const fileInput = event.target as HTMLInputElement;\n if (fileInput.files?.length !== 1) return;\n const inputFile = fileInput.files[0];\n const result = await convertFileToBase64(inputFile);\n this.updateValue({\n name: result.name,\n bytes: result.bytes,\n });\n }\n\n protected updateValue(value: InputFile) {\n this.value.set(value);\n this.onChange?.(value);\n }\n}\n\nasync function convertFileToBase64(file: File) {\n return new Promise<{\n name: string;\n bytes: string;\n mimeType: string;\n format: string;\n readerResult: string | ArrayBuffer | null;\n }>((resolve, reject) => {\n const tokens = file.name.split('.');\n const format = tokens.length > 1 ? tokens[tokens.length - 1] : '';\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => {\n const parts = (reader.result as string).split(',');\n const mimeType = parts[0].replace('data:', '').replace(';base64', '');\n resolve({\n name: file.name,\n bytes: parts[1],\n mimeType,\n format,\n readerResult: reader.result,\n });\n };\n reader.onerror = () => reject();\n });\n}\n","@if (outputData(); as output) {\n <!-- Result state -->\n @if (output.status === 'success') {\n <div class=\"cortex-capture-success\">\n <div class=\"cortex-capture-success__header\">\n <div class=\"cortex-capture-success__icon\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-capture-success__icon-svg\" fill=\"none\">\n <path\n d=\"M5.5 10.5 L8.5 13.5 L14.5 7\"\n stroke=\"currentColor\"\n stroke-width=\"1.75\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n <div class=\"cortex-capture-success__title-wrap\">\n <h3 class=\"cortex-capture-success__title\">\n {{ 'translate_files_attached' | translate: { count: requestedFiles().length } }}\n </h3>\n </div>\n </div>\n\n <div class=\"cortex-capture-success__file-list\">\n <ul class=\"cortex-capture-success__files\">\n @for (file of outputData()!.result!; track file.uploadId) {\n <li>\n <button\n type=\"button\"\n (click)=\"downloadFile(file.uploadId)\"\n class=\"cortex-capture-success__download-btn\"\n >\n <svg viewBox=\"0 0 16 16\" class=\"cortex-capture-success__file-icon\" fill=\"none\">\n <path\n d=\"M4 1.5h5.172a2 2 0 0 1 1.414.586l2.328 2.328a2 2 0 0 1 .586 1.414V12.5a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2Z\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n />\n <path\n d=\"M9.5 1.5v2a2 2 0 0 0 2 2h2\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n stroke-linecap=\"round\"\n />\n </svg>\n <span class=\"cortex-capture-success__file-name\">{{\n requestedFiles()[$index]?.label ?? outputData()!.result![$index]?.id\n }}</span>\n <svg viewBox=\"0 0 16 16\" class=\"cortex-capture-success__dl-icon\" fill=\"none\">\n <path\n d=\"M8 3v7m0 0L5.5 7.5M8 10l2.5-2.5M3 13h10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n </li>\n }\n </ul>\n </div>\n </div>\n } @else {\n <!-- Canceled state -->\n <div class=\"cortex-capture-canceled-wrap\">\n <div class=\"cortex-capture-canceled\">\n <div class=\"cortex-capture-canceled__icon\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-capture-canceled__icon-svg\" fill=\"none\">\n <path d=\"M6 10h8\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n </div>\n <span class=\"cortex-capture-canceled__text\">{{\n 'translate_file_upload_skipped' | translate\n }}</span>\n </div>\n </div>\n }\n} @else {\n @if (!hasInvalidInput()) {\n <!-- Upload form -->\n <form [formGroup]=\"form()\" class=\"cortex-capture-form\">\n @if (requestedFiles().length === 1) {\n <!-- Single file: minimal inline -->\n <fieldset [formArray]=\"form().controls.files\">\n <div [formGroupName]=\"0\" class=\"cortex-capture-form__single\">\n <label for=\"capture-file-0\" class=\"cortex-capture-form__label\">\n {{ requestedFiles()[0]!.label }}\n </label>\n <input hidden formControlName=\"id\" />\n <div class=\"cortex-capture-form__row\">\n <cortex-file-input\n id=\"capture-file-0\"\n formControlName=\"file\"\n class=\"cortex-capture-form__input\"\n />\n <button\n (click)=\"cancel()\"\n [disabled]=\"isLoading()\"\n type=\"button\"\n class=\"cortex-capture-form__cancel-link\"\n >\n {{ 'translate_cancel' | translate }}\n </button>\n <button\n (click)=\"submit()\"\n type=\"button\"\n class=\"cortex-capture-form__submit-btn\"\n [disabled]=\"form().invalid || isLoading()\"\n >\n @if (isLoading()) {\n <svg class=\"cortex-capture-form__spinner\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=\"cortex-capture-form__spinner-track\"\n />\n <path\n d=\"M14 8a6 6 0 0 0-6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n {{ 'translate_uploading' | translate }}\n } @else {\n {{ 'translate_submit' | translate }}\n }\n </button>\n </div>\n </div>\n </fieldset>\n } @else {\n <!-- Multi-file: full form -->\n <div class=\"cortex-capture-form__multi\">\n <div class=\"cortex-capture-form__multi-header\">\n <div class=\"cortex-capture-form__multi-header-row\">\n <div class=\"cortex-capture-form__multi-icon\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 20 20\" class=\"cortex-capture-form__multi-icon-svg\" fill=\"none\">\n <path\n d=\"M4 13.5a3.5 3.5 0 0 1-.5-6.97 5.002 5.002 0 0 1 9.78-1.03A4.5 4.5 0 0 1 15.5 14\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n <path\n d=\"M10 10v7m0-7-2.5 2.5M10 10l2.5 2.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </div>\n\n <div class=\"cortex-capture-form__multi-title-wrap\">\n <h3 class=\"cortex-capture-form__multi-title\">\n {{ 'translate_attach_requested_files' | translate }}\n </h3>\n <p class=\"cortex-capture-form__multi-subtitle\">\n {{ 'translate_n_files_required' | translate: { count: requestedFiles().length } }}\n </p>\n </div>\n </div>\n </div>\n\n <fieldset [formArray]=\"form().controls.files\" class=\"cortex-capture-form__multi-fields\">\n @for (file of form().controls.files.value; track $index) {\n <div [formGroupName]=\"$index\" class=\"cortex-capture-form__multi-item\">\n <div class=\"cortex-capture-form__multi-item-header\">\n <label\n [for]=\"'capture-file-' + $index\"\n class=\"cortex-capture-form__multi-item-label\"\n >\n {{ requestedFiles()[$index]!.label }}\n </label>\n <span class=\"cortex-capture-form__required-badge\">\n {{ 'translate_required' | translate }}\n </span>\n </div>\n <input hidden formControlName=\"id\" />\n <cortex-file-input [id]=\"'capture-file-' + $index\" formControlName=\"file\" />\n </div>\n }\n </fieldset>\n\n <div class=\"cortex-capture-form__multi-footer\">\n <button\n (click)=\"cancel()\"\n [disabled]=\"isLoading()\"\n type=\"button\"\n class=\"cortex-capture-form__cancel-btn\"\n >\n {{ 'translate_cancel' | translate }}\n </button>\n <button\n (click)=\"submit()\"\n type=\"button\"\n class=\"cortex-capture-form__submit-btn\"\n [disabled]=\"form().invalid || isLoading()\"\n >\n @if (isLoading()) {\n <svg class=\"cortex-capture-form__spinner\" viewBox=\"0 0 16 16\" fill=\"none\">\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n class=\"cortex-capture-form__spinner-track\"\n />\n <path\n d=\"M14 8a6 6 0 0 0-6-6\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n {{ 'translate_uploading' | translate }}\n } @else {\n {{ 'translate_submit_files' | translate }}\n }\n </button>\n </div>\n </div>\n }\n </form>\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { ToolUIPart, UIMessage } from 'ai';\nimport { MessageCaptureFilesPartComponent } from '../message-capture-file-part/message-capture-files-part.component';\nimport { CORTEX_CLIENT_CONFIG } from '../../config';\nimport { CortexChatService } from '../../services/cortex-chat.service';\n\nconst STATUS_COUNT = 10;\n\n@Component({\n selector: 'cortex-message-tool-call-animated',\n templateUrl: './message-tool-call-animated.component.html',\n styleUrl: './message-tool-call-animated.component.scss',\n imports: [NgComponentOutlet, MessageCaptureFilesPartComponent, TranslatePipe],\n host: { class: 'cortex-tool-call-animated' },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageToolCallAnimatedComponent {\n public readonly message = input.required<UIMessage>();\n public readonly toolCallPart = input.required<ToolUIPart>();\n\n protected readonly config = inject(CORTEX_CLIENT_CONFIG);\n\n protected readonly customComponent = computed(() => {\n const toolName = this.toolCallPart().type;\n const name = toolName?.startsWith('tool-') ? toolName.slice('tool-'.length) : toolName;\n return name ? (this.config.toolComponents?.[name] ?? null) : null;\n });\n protected readonly setOutput = computed(() => {\n return (output: unknown) => {\n this.chatService.chat()?.addToolOutput({\n tool: this.toolCallPart().type,\n toolCallId: this.toolCallPart().toolCallId,\n output,\n });\n };\n });\n\n protected readonly animState = computed(() => {\n const state = this.toolCallPart().state;\n switch (state) {\n case 'input-streaming':\n return 'starting';\n case 'input-available':\n case 'approval-requested':\n case 'approval-responded':\n return 'processing';\n case 'output-available':\n return 'complete';\n case 'output-error':\n return 'error';\n case 'output-denied':\n return 'denied';\n default:\n return 'processing';\n }\n });\n\n protected readonly isActive = computed(() => {\n const s = this.animState();\n return s === 'starting' || s === 'processing';\n });\n\n protected readonly displayTitleKey = computed(() => {\n const state = this.animState();\n switch (state) {\n case 'starting':\n case 'processing':\n return `translate_tool_status_${this.stableIndex()}`;\n case 'complete':\n return `translate_tool_done_${this.stableIndex()}`;\n case 'error':\n return 'translate_tool_error';\n case 'denied':\n return 'translate_tool_denied';\n default:\n return `translate_tool_status_${this.stableIndex()}`;\n }\n });\n\n private readonly stableIndex = computed(() => {\n const id = this.toolCallPart().toolCallId ?? '';\n let hash = 0;\n for (let i = 0; i < id.length; i++) {\n hash = (hash * 31 + id.charCodeAt(i)) | 0;\n }\n return Math.abs(hash) % STATUS_COUNT;\n });\n\n private chatService = inject(CortexChatService);\n}\n","@if (customComponent(); as custom) {\n <ng-container\n *ngComponentOutlet=\"\n custom;\n inputs: { toolCallPart: toolCallPart(), message: message(), setOutput: setOutput() };\n injector: config.injector\n \"\n />\n} @else {\n @switch (toolCallPart().type) {\n @case ('tool-captureFiles') {\n <cortex-message-capture-files-part\n [toolPart]=\"toolCallPart()\"\n [message]=\"message()\"\n [setOutput]=\"setOutput()\"\n />\n }\n @default {\n @let state = animState();\n @let active = isActive();\n\n <div class=\"cortex-tool-pill-wrap\">\n <div\n class=\"cortex-tool-pill\"\n [class.cortex-tool-pill--active]=\"active\"\n [class.cortex-tool-pill--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill--error]=\"state === 'error'\"\n [class.cortex-tool-pill--denied]=\"state === 'denied'\"\n >\n <!-- Icon box -->\n <div\n class=\"cortex-tool-pill__icon\"\n [class.cortex-tool-pill__icon--active]=\"active\"\n [class.cortex-tool-pill__icon--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill__icon--error]=\"state === 'error'\"\n [class.cortex-tool-pill__icon--denied]=\"state === 'denied'\"\n >\n <!-- Spinner -->\n <div\n class=\"cortex-tool-pill__spinner\"\n [class.cortex-tool-pill__spinner--visible]=\"active\"\n ></div>\n <!-- Check -->\n <svg\n class=\"cortex-tool-pill__svg\"\n [class.cortex-tool-pill__svg--visible]=\"state === 'complete'\"\n [class.cortex-tool-pill__svg--check]=\"state === 'complete'\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M5.5 10.5 L8.5 13.5 L14.5 7\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n <!-- Error -->\n <svg\n class=\"cortex-tool-pill__svg\"\n [class.cortex-tool-pill__svg--visible]=\"state === 'error'\"\n [class.cortex-tool-pill__svg--error]=\"state === 'error'\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M6.5 6.5 L13.5 13.5 M13.5 6.5 L6.5 13.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n <!-- Denied -->\n <svg\n class=\"cortex-tool-pill__svg\"\n [class.cortex-tool-pill__svg--visible]=\"state === 'denied'\"\n [class.cortex-tool-pill__svg--denied]=\"state === 'denied'\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path\n d=\"M6 10 L14 10\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n\n <!-- Title -->\n <span\n class=\"cortex-tool-pill__title\"\n [class.cortex-tool-pill__title--active]=\"active\"\n [class.cortex-tool-pill__title--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill__title--error]=\"state === 'error'\"\n [class.cortex-tool-pill__title--denied]=\"state === 'denied'\"\n >\n {{ displayTitleKey() | translate }}\n </span>\n\n <!-- Bottom bar -->\n <div class=\"cortex-tool-pill__bar-track\">\n <div\n class=\"cortex-tool-pill__bar\"\n [class.cortex-tool-pill__bar--active]=\"active\"\n [class.cortex-tool-pill__bar--complete]=\"state === 'complete'\"\n [class.cortex-tool-pill__bar--error]=\"state === 'error'\"\n [class.cortex-tool-pill__bar--denied]=\"state === 'denied'\"\n ></div>\n </div>\n </div>\n </div>\n }\n }\n}\n","import {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n inject,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { TranslatePipe } from '@ngx-translate/core';\n\ntype LabelState = 'idle' | 'exiting' | 'enter-start' | 'entering';\n\n@Component({\n selector: 'cortex-subtle-activity',\n templateUrl: './subtle-activity.component.html',\n styleUrl: './subtle-activity.component.scss',\n imports: [TranslatePipe],\n host: { class: 'cortex-subtle-activity' },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SubtleActivityComponent {\n public readonly labels = input.required<string[]>();\n\n protected readonly currentIndex = signal(0);\n protected readonly labelState = signal<LabelState>('idle');\n\n private transitionTimeout: ReturnType<typeof setTimeout> | null = null;\n private exitTimeout: ReturnType<typeof setTimeout> | null = null;\n private enterTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n\n afterNextRender(() => {\n this.scheduleNextTransition();\n });\n\n destroyRef.onDestroy(() => {\n this.clearAllTimeouts();\n });\n }\n\n private scheduleNextTransition() {\n this.transitionTimeout = setTimeout(() => {\n this.triggerTransition();\n }, 2000);\n }\n\n private triggerTransition() {\n this.labelState.set('exiting');\n\n this.exitTimeout = setTimeout(() => {\n this.currentIndex.update((i) => (i + 1) % this.labels().length);\n this.labelState.set('enter-start');\n\n requestAnimationFrame(() => {\n this.labelState.set('entering');\n\n this.enterTimeout = setTimeout(() => {\n this.labelState.set('idle');\n this.scheduleNextTransition();\n }, 300);\n });\n }, 300);\n }\n\n private clearAllTimeouts() {\n if (this.transitionTimeout) clearTimeout(this.transitionTimeout);\n if (this.exitTimeout) clearTimeout(this.exitTimeout);\n if (this.enterTimeout) clearTimeout(this.enterTimeout);\n }\n}\n","<div class=\"cortex-subtle-activity__dots\">\n <span class=\"cortex-subtle-activity__dot\"></span>\n <span class=\"cortex-subtle-activity__dot cortex-subtle-activity__dot--d1\"></span>\n <span class=\"cortex-subtle-activity__dot cortex-subtle-activity__dot--d2\"></span>\n</div>\n\n<div class=\"cortex-subtle-activity__label-mask\">\n <span\n class=\"cortex-subtle-activity__label\"\n [class.cortex-subtle-activity__label--idle]=\"labelState() === 'idle'\"\n [class.cortex-subtle-activity__label--exiting]=\"labelState() === 'exiting'\"\n [class.cortex-subtle-activity__label--enter-start]=\"labelState() === 'enter-start'\"\n [class.cortex-subtle-activity__label--entering]=\"labelState() === 'entering'\"\n >\n {{ labels()[currentIndex()] | translate }}\n </span>\n</div>\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { ReasoningUIPart } from 'ai';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_reasoning_0',\n 'translate_reasoning_1',\n 'translate_reasoning_2',\n 'translate_reasoning_3',\n 'translate_reasoning_4',\n 'translate_reasoning_5',\n 'translate_reasoning_6',\n 'translate_reasoning_7',\n 'translate_reasoning_8',\n 'translate_reasoning_9',\n];\n\n@Component({\n selector: 'cortex-message-reasoning-animated',\n templateUrl: './message-reasoning-animated.component.html',\n styleUrl: './message-reasoning-animated.component.scss',\n imports: [SubtleActivityComponent],\n host: { class: 'cortex-reasoning-animated' },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MessageReasoningAnimatedComponent {\n public readonly reasoningPart = input.required<ReasoningUIPart>();\n protected readonly labels = LABELS;\n}\n","<cortex-subtle-activity [labels]=\"labels\" />\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_endpoint_0',\n 'translate_endpoint_1',\n 'translate_endpoint_2',\n 'translate_endpoint_3',\n 'translate_endpoint_4',\n 'translate_endpoint_5',\n 'translate_endpoint_6',\n 'translate_endpoint_7',\n 'translate_endpoint_8',\n 'translate_endpoint_9',\n];\n\n@Component({\n selector: 'cortex-tool-call-endpoint-animated',\n template: '<cortex-subtle-activity [labels]=\"labels\" />',\n imports: [SubtleActivityComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolCallEndpointAnimatedComponent {\n protected readonly labels = LABELS;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_graph_0',\n 'translate_graph_1',\n 'translate_graph_2',\n 'translate_graph_3',\n 'translate_graph_4',\n 'translate_graph_5',\n 'translate_graph_6',\n 'translate_graph_7',\n 'translate_graph_8',\n 'translate_graph_9',\n];\n\n@Component({\n selector: 'cortex-tool-query-graph-animated',\n template: '<cortex-subtle-activity [labels]=\"labels\" />',\n imports: [SubtleActivityComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolQueryGraphAnimatedComponent {\n protected readonly labels = LABELS;\n}\n","import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { SubtleActivityComponent } from '../subtle-activity/subtle-activity.component';\n\nconst LABELS = [\n 'translate_code_0',\n 'translate_code_1',\n 'translate_code_2',\n 'translate_code_3',\n 'translate_code_4',\n 'translate_code_5',\n 'translate_code_6',\n 'translate_code_7',\n 'translate_code_8',\n 'translate_code_9',\n];\n\n@Component({\n selector: 'cortex-tool-execute-code-animated',\n template: '<cortex-subtle-activity [labels]=\"labels\" />',\n imports: [SubtleActivityComponent],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ToolExecuteCodeAnimatedComponent {\n protected readonly labels = LABELS;\n}\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { UIDataTypes, UIMessage, UIMessagePart, UITools, isStaticToolUIPart } from 'ai';\nimport { MessageTextPartComponent } from '../message-text-part/message-text-part.component';\nimport { MessageReasoningPartComponent } from '../message-reasoning-part/message-reasoning-part.component';\nimport { MessageToolCallPartComponent } from '../message-tool-call-part/message-tool-call-part.component';\nimport { MessageToolCallAnimatedComponent } from '../message-tool-call-animated/message-tool-call-animated.component';\nimport { MessageReasoningAnimatedComponent } from '../message-reasoning-animated/message-reasoning-animated.component';\nimport { ToolCallEndpointAnimatedComponent } from '../tool-call-endpoint-animated/tool-call-endpoint-animated.component';\nimport { ToolQueryGraphAnimatedComponent } from '../tool-query-graph-animated/tool-query-graph-animated.component';\nimport { ToolExecuteCodeAnimatedComponent } from '../tool-execute-code-animated/tool-execute-code-animated.component';\n\n@Component({\n selector: 'cortex-message-part',\n templateUrl: './message-part.component.html',\n styleUrl: './message-part.component.scss',\n imports: [\n MessageTextPartComponent,\n MessageReasoningPartComponent,\n MessageToolCallPartComponent,\n MessageToolCallAnimatedComponent,\n MessageReasoningAnimatedComponent,\n ToolCallEndpointAnimatedComponent,\n ToolQueryGraphAnimatedComponent,\n ToolExecuteCodeAnimatedComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'cortex-message-part',\n '[class.cortex-message-part--animated]': 'animate()',\n },\n})\nexport class MessagePartComponent {\n public readonly message = input.required<UIMessage>();\n public readonly part = input.required<UIMessagePart<UIDataTypes, UITools>>();\n public readonly debugMode = input<boolean>(false);\n public readonly animate = input<boolean>(false);\n\n protected readonly isStaticToolUIPart = isStaticToolUIPart;\n}\n","@let myPart = part();\n@switch (myPart.type) {\n @case ('text') {\n <cortex-message-text-part [textPart]=\"myPart\" [role]=\"message().role\" />\n }\n @case ('reasoning') {\n @if (debugMode()) {\n <cortex-message-reasoning-part [reasoningPart]=\"myPart\" />\n } @else {\n <cortex-message-reasoning-animated [reasoningPart]=\"myPart\" />\n }\n }\n @default {\n @if (isStaticToolUIPart(myPart)) {\n @if (debugMode()) {\n <cortex-message-tool-call-part [toolCallPart]=\"myPart\" />\n } @else {\n @switch (myPart.type) {\n @case ('tool-callEndpoint') {\n <cortex-tool-call-endpoint-animated />\n }\n @case ('tool-queryGraph') {\n <cortex-tool-query-graph-animated />\n }\n @case ('tool-executeCode') {\n <cortex-tool-execute-code-animated />\n }\n @default {\n <cortex-message-tool-call-animated [toolCallPart]=\"myPart\" [message]=\"message()\" />\n }\n }\n }\n } @else {\n <p class=\"cortex-unhandled-type\">Unhandled type: {{ part().type }}</p>\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { DecimalPipe } from '@angular/common';\nimport { MessageMetadata } from '../../types';\n\n@Component({\n selector: 'cortex-message-token-usage',\n templateUrl: './message-token-usage.component.html',\n styleUrl: './message-token-usage.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [DecimalPipe],\n host: { class: 'cortex-token-usage', '[class.cortex-token-usage--expanded]': 'expanded()' },\n})\nexport class MessageTokenUsageComponent {\n public readonly usage = input.required<NonNullable<MessageMetadata['tokenUsage']>>();\n public readonly modelId = input<string>();\n\n protected readonly expanded = signal(false);\n\n protected readonly cacheRatio = computed(() => {\n const u = this.usage();\n if (u.input.total === 0) return 0;\n return Math.round((u.input.cacheRead / u.input.total) * 100);\n });\n\n protected toggle() {\n this.expanded.update((v) => !v);\n }\n}\n","<button class=\"cortex-token-usage__summary\" (click)=\"toggle()\">\n <span class=\"cortex-token-usage__total\">\n <span class=\"cortex-token-usage__total-number\">{{ usage().total | number }}</span>\n <span class=\"cortex-token-usage__total-label\">tokens</span>\n </span>\n\n @if (modelId(); as id) {\n <span class=\"cortex-token-usage__model\">{{ id }}</span>\n }\n\n <span class=\"cortex-token-usage__pills\">\n <span class=\"cortex-token-usage__pill\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--input\"></span>\n {{ usage().input.total | number }}\n </span>\n <span class=\"cortex-token-usage__pill\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--output\"></span>\n {{ usage().output.total | number }}\n </span>\n </span>\n\n <svg class=\"cortex-token-usage__chevron\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M3 4.5L6 7.5L9 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"1.25\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n</button>\n\n<div class=\"cortex-token-usage__details\">\n <div class=\"cortex-token-usage__details-inner\">\n <div class=\"cortex-token-usage__section\">\n <div class=\"cortex-token-usage__section-header\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--input\"></span>\n <span class=\"cortex-token-usage__section-label\">Input</span>\n <span class=\"cortex-token-usage__section-total\">{{ usage().input.total | number }}</span>\n </div>\n <div class=\"cortex-token-usage__rows\">\n @if (usage().input.noCache) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Fresh</span>\n <span class=\"cortex-token-usage__row-value\">{{ usage().input.noCache | number }}</span>\n </div>\n }\n @if (usage().input.cacheRead) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Cache read</span>\n <span class=\"cortex-token-usage__row-value\">{{\n usage().input.cacheRead | number\n }}</span>\n </div>\n }\n @if (usage().input.cacheWrite) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Cache write</span>\n <span class=\"cortex-token-usage__row-value\">{{\n usage().input.cacheWrite | number\n }}</span>\n </div>\n }\n @if (cacheRatio() > 0) {\n <div class=\"cortex-token-usage__row cortex-token-usage__row--highlight\">\n <span class=\"cortex-token-usage__row-label\">Cache hit</span>\n <span class=\"cortex-token-usage__row-value\">{{ cacheRatio() }}%</span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"cortex-token-usage__divider\"></div>\n\n <div class=\"cortex-token-usage__section\">\n <div class=\"cortex-token-usage__section-header\">\n <span class=\"cortex-token-usage__dot cortex-token-usage__dot--output\"></span>\n <span class=\"cortex-token-usage__section-label\">Output</span>\n <span class=\"cortex-token-usage__section-total\">{{ usage().output.total | number }}</span>\n </div>\n <div class=\"cortex-token-usage__rows\">\n @if (usage().output.text) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Text</span>\n <span class=\"cortex-token-usage__row-value\">{{ usage().output.text | number }}</span>\n </div>\n }\n @if (usage().output.reasoning) {\n <div class=\"cortex-token-usage__row\">\n <span class=\"cortex-token-usage__row-label\">Reasoning</span>\n <span class=\"cortex-token-usage__row-value\">{{\n usage().output.reasoning | number\n }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport {\n generateId,\n ReasoningUIPart,\n ToolUIPart,\n UIDataTypes,\n UIMessage,\n UIMessagePart,\n UITools,\n} from 'ai';\nimport { MessageAbortedFlagComponent } from '../message-aborted-flag/message-aborted-flag.component';\nimport { MessagePartComponent } from '../message-part/message-part.component';\nimport { MessageTokenUsageComponent } from '../message-token-usage/message-token-usage.component';\nimport { MessageMetadata } from '../../types';\nimport { JsonPipe } from '@angular/common';\n\ntype TrackedPart = UIMessagePart<UIDataTypes, UITools> & { __id: string };\ntype TrackedPartCollection = UIMessagePart<UIDataTypes, UITools>[] & {\n __cortexPushWrapped?: true;\n};\n\n@Component({\n selector: 'cortex-message',\n templateUrl: './message.component.html',\n styleUrl: './message.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n MessageAbortedFlagComponent,\n MessagePartComponent,\n MessageTokenUsageComponent,\n JsonPipe,\n ],\n host: { class: 'cortex-message' },\n})\nexport class MessageComponent {\n public readonly message = input.required<UIMessage<MessageMetadata>>();\n public readonly debugMode = input<boolean>(false);\n public readonly animate = input<boolean>(false);\n\n protected readonly visibleParts = computed(() =>\n this.parts().filter((x) => {\n if (x.type === 'step-start') return false;\n if (!this.debugMode() && this.isHiddenInAnimatedMode(x)) return false;\n return true;\n }),\n );\n private readonly parts = signal<UIMessagePart<UIDataTypes, UITools>[]>([]);\n\n public constructor() {\n effect(() => {\n const parts = this.message().parts as TrackedPartCollection;\n\n this.parts.set(parts.map((part) => this.trackPart(part)));\n this.wrapPush(parts);\n });\n }\n\n private trackPart(part: UIMessagePart<UIDataTypes, UITools>) {\n const trackedPart = part as TrackedPart & { __cortexTracked?: true };\n\n if (trackedPart.__cortexTracked) {\n return trackedPart;\n }\n\n trackedPart.__id = trackedPart.__id ?? generateId();\n\n Object.defineProperty(trackedPart, '__cortexTracked', {\n value: true,\n configurable: true,\n });\n\n Object.keys(trackedPart).forEach((prop) => {\n if (prop === '__id') {\n return;\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(trackedPart, prop);\n if (!descriptor?.configurable || descriptor.get || descriptor.set) {\n return;\n }\n\n let value = trackedPart[prop as keyof typeof trackedPart];\n Object.defineProperty(trackedPart, prop, {\n get: () => value,\n set: (newValue) => {\n value = newValue;\n this.parts.update((existingParts) => {\n return existingParts.map((existingPart) => {\n return (existingPart as TrackedPart).__id === trackedPart.__id\n ? { ...existingPart, [prop]: newValue }\n : existingPart;\n });\n });\n },\n configurable: true,\n });\n });\n\n return trackedPart;\n }\n\n private wrapPush(parts: TrackedPartCollection) {\n if (parts.__cortexPushWrapped) {\n return;\n }\n\n const originalPush = parts.push;\n\n parts.push = (...items) => {\n const newParts = items.map((part) => this.trackPart(part));\n this.parts.update((existingParts) => [...existingParts, ...newParts]);\n return originalPush.apply(parts, newParts);\n };\n\n Object.defineProperty(parts, '__cortexPushWrapped', {\n value: true,\n configurable: true,\n });\n }\n\n private isHiddenInAnimatedMode(part: UIMessagePart<UIDataTypes, UITools>) {\n if (part.type === 'reasoning') {\n return (part as ReasoningUIPart).state === 'done';\n }\n const specificTools = ['tool-callEndpoint', 'tool-queryGraph', 'tool-executeCode'];\n if (specificTools.includes(part.type)) {\n const state = (part as ToolUIPart).state;\n return state === 'output-available' || state === 'output-error' || state === 'output-denied';\n }\n return false;\n }\n}\n","@if (visibleParts().length) {\n <div class=\"cortex-message-parts\">\n @for (part of visibleParts(); track $index) {\n <cortex-message-part\n [part]=\"part\"\n [message]=\"message()\"\n [debugMode]=\"debugMode()\"\n [animate]=\"animate()\"\n />\n }\n\n @if (message().metadata?.isAborted) {\n <cortex-message-aborted-flag />\n }\n\n @if (debugMode() && message().metadata?.tokenUsage; as usage) {\n <cortex-message-token-usage [usage]=\"usage\" [modelId]=\"message().metadata?.modelId\" />\n }\n </div>\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n effect,\n ElementRef,\n input,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CortexChatService } from '../../services/cortex-chat.service';\nimport { MessageComponent } from '../message/message.component';\n\n@Component({\n selector: 'cortex-message-list',\n templateUrl: './message-list.component.html',\n styleUrl: './message-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [MessageComponent],\n})\nexport class MessageListComponent implements AfterViewInit {\n public readonly debugMode = input<boolean>(false);\n private readonly messagesContainer = viewChild<ElementRef>('messagesContainer');\n private shouldScrollToBottom = true;\n private isNearBottom = true;\n private mutationObserver: MutationObserver | undefined = undefined;\n private scrollToBottomQueued = false;\n\n protected readonly animateNewParts = signal(false);\n\n constructor(\n protected readonly chatService: CortexChatService,\n destroyRef: DestroyRef,\n ) {\n this.scrollToBottom();\n\n effect(() => {\n this.chatService.chat()?.messages;\n\n if (!this.shouldScrollToBottom && !this.isNearBottom) {\n return;\n }\n\n this.scheduleScrollToBottom();\n });\n\n chatService.events$.pipe(takeUntilDestroyed(destroyRef)).subscribe((event) => {\n if (event === 'onThreadSelected') {\n this.animateNewParts.set(false);\n this.shouldScrollToBottom = true;\n queueMicrotask(() => this.animateNewParts.set(true));\n }\n if (event === 'onSend') this.shouldScrollToBottom = true;\n });\n\n destroyRef.onDestroy(() => {\n this.mutationObserver?.disconnect();\n });\n }\n\n public ngAfterViewInit() {\n this.observeMessageMutations();\n this.scheduleScrollToBottom();\n queueMicrotask(() => this.animateNewParts.set(true));\n }\n\n protected onScroll() {\n const el = this.messagesContainer()?.nativeElement;\n if (!el) return;\n this.isNearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 100;\n }\n\n private scrollToBottom() {\n const el = this.messagesContainer()?.nativeElement;\n if (el) {\n el.scrollTop = el.scrollHeight;\n }\n }\n\n private scheduleScrollToBottom() {\n if (this.scrollToBottomQueued) {\n return;\n }\n\n this.scrollToBottomQueued = true;\n\n queueMicrotask(() => {\n this.scrollToBottomQueued = false;\n this.scrollToBottom();\n this.shouldScrollToBottom = false;\n });\n }\n\n private observeMessageMutations() {\n const el = this.messagesContainer()?.nativeElement;\n if (!el || typeof MutationObserver === 'undefined') {\n return;\n }\n\n this.mutationObserver = new MutationObserver(() => {\n if (!this.shouldScrollToBottom && !this.isNearBottom) {\n return;\n }\n\n this.scheduleScrollToBottom();\n });\n\n this.mutationObserver.observe(el, {\n childList: true,\n subtree: true,\n characterData: true,\n });\n }\n}\n","<div class=\"cortex-message-list\" #messagesContainer (scroll)=\"onScroll()\">\n @for (message of chatService.chat()?.messages; track message.id) {\n <cortex-message [message]=\"message\" [debugMode]=\"debugMode()\" [animate]=\"animateNewParts()\" />\n }\n</div>\n","import { TranslateLoader } from '@ngx-translate/core';\nimport { Observable, of } from 'rxjs';\nimport en from './en.json';\nimport ar from './ar.json';\n\nconst translations: Record<string, Record<string, string>> = { en, ar };\n\nexport class CortexClientTranslateLoader implements TranslateLoader {\n public getTranslation(lang: string) {\n return of(translations[lang] ?? translations['en']);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n Injectable,\n Injector,\n input,\n model,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n provideTranslateLoader,\n provideTranslateService,\n TranslatePipe,\n TranslateService,\n} from '@ngx-translate/core';\nimport { CortexChatService } from '../../services/cortex-chat.service';\nimport { Thread } from '../../services/cortex-chat.service';\nimport { MessageListComponent } from '../message-list/message-list.component';\nimport { CORTEX_CLIENT_CONFIG, CortexClientConfig } from '../../config';\nimport { CortexClientWebSocketService } from '../../services/cortex-websocket.service';\nimport { CortexClientTranslateLoader } from '../../i18n/translate-loader';\n\n@Injectable()\nclass CortexClientConfigRef {\n config!: CortexClientConfig;\n}\n\n@Component({\n selector: 'cortex-chat-widget',\n templateUrl: './chat-widget.component.html',\n styleUrl: './chat-widget.component.scss',\n imports: [MessageListComponent, FormsModule, TranslatePipe],\n providers: [\n CortexClientConfigRef,\n {\n provide: CORTEX_CLIENT_CONFIG,\n useFactory: () => inject(CortexClientConfigRef).config,\n },\n CortexChatService,\n CortexClientWebSocketService,\n ...provideTranslateService({\n fallbackLang: 'en',\n loader: provideTranslateLoader(CortexClientTranslateLoader),\n }),\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'cortex-widget' },\n})\nexport class CortexChatWidgetComponent {\n public readonly config = input.required<CortexClientConfig>();\n\n protected readonly text = model<string>('');\n protected readonly debugMode = signal(false);\n protected readonly screen = signal<'threads' | 'chat'>('threads');\n\n protected chatService!: CortexChatService;\n\n private readonly configRef = inject(CortexClientConfigRef);\n private readonly injector = inject(Injector);\n\n public ngOnInit() {\n this.configRef.config = this.config();\n\n this.chatService = this.injector.get(CortexChatService);\n\n const translateService = this.injector.get(TranslateService);\n translateService.use(this.config().locale);\n }\n\n protected toggleDebugMode() {\n this.debugMode.update((v) => !v);\n }\n\n protected selectThread(thread: Thread) {\n this.chatService.selectThread(thread).subscribe();\n this.screen.set('chat');\n }\n\n protected goBack() {\n this.chatService.deselectThread();\n this.screen.set('threads');\n }\n\n protected onKeydown(event: KeyboardEvent) {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.send();\n }\n }\n\n protected send() {\n if (this.chatService.isAgentWorking()) return;\n const text = this.text().trim();\n if (!text) return;\n\n this.text.set('');\n this.chatService.send(text).subscribe();\n }\n\n protected newChat() {\n this.chatService.deselectThread();\n this.screen.set('chat');\n }\n}\n","<div class=\"cortex-widget__container\">\n <!-- SCREEN 1: THREADS -->\n <div\n class=\"cortex-widget__screen\"\n [class.cortex-widget__screen--active]=\"screen() === 'threads'\"\n [class.cortex-widget__screen--left]=\"screen() !== 'threads'\"\n >\n <!-- Threads header -->\n <div class=\"cortex-widget__threads-header\">\n <div>\n <h2 class=\"cortex-widget__threads-title\">\n {{ 'translate_threads' | translate }}\n </h2>\n <p class=\"cortex-widget__threads-count\">\n {{\n 'translate_n_conversations' | translate: { count: chatService.threads()?.length ?? 0 }\n }}\n </p>\n </div>\n <button (click)=\"newChat()\" class=\"cortex-widget__new-chat-btn\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 3v10M3 8h10\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n />\n </svg>\n {{ 'translate_new' | translate }}\n </button>\n </div>\n\n <!-- Threads list -->\n <div class=\"cortex-widget__threads-list\">\n <!-- Threads loading skeleton -->\n @if (chatService.threads() === undefined) {\n @for (i of [1, 2, 3, 4]; track i) {\n <div class=\"cortex-widget__thread-skeleton\">\n <div class=\"cortex-skeleton cortex-widget__thread-skeleton-icon\"></div>\n <div class=\"cortex-widget__thread-skeleton-lines\">\n <div\n class=\"cortex-skeleton cortex-widget__thread-skeleton-line\"\n [style.width]=\"40 + i * 12 + '%'\"\n ></div>\n </div>\n </div>\n }\n } @else {\n @for (thread of chatService.threads(); track thread.id) {\n <button\n (click)=\"selectThread(thread)\"\n class=\"cortex-widget__thread-item\"\n [class.cortex-widget__thread-item--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <!-- Thread icon -->\n <div\n class=\"cortex-widget__thread-icon\"\n [class.cortex-widget__thread-icon--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M2.5 4.5h11M2.5 8h7M2.5 11.5h9\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n\n <!-- Thread info -->\n <div class=\"cortex-widget__thread-info\">\n <div class=\"cortex-widget__thread-title-row\">\n <p\n class=\"cortex-widget__thread-title\"\n [class.cortex-widget__thread-title--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n {{ thread.title ?? ('translate_untitled' | translate) }}\n </p>\n\n @if (thread.isRunning) {\n <span\n class=\"cortex-widget__thread-running\"\n [class.cortex-widget__thread-running--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <span class=\"cortex-widget__thread-running-dot\"></span>\n {{ 'translate_running' | translate }}\n </span>\n }\n </div>\n </div>\n\n <!-- Delete button -->\n <button\n (click)=\"$event.stopPropagation(); chatService.deleteThread(thread.id).subscribe()\"\n class=\"cortex-widget__thread-delete\"\n [class.cortex-widget__thread-delete--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n\n <!-- Arrow -->\n <svg\n class=\"cortex-widget__thread-arrow\"\n [class.cortex-widget__thread-arrow--active]=\"\n thread.id === chatService.selectedThread()?.id\n \"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n >\n <path\n d=\"M6 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n\n @if (!chatService.threads()?.length) {\n <div class=\"cortex-widget__threads-empty\">\n <div class=\"cortex-widget__threads-empty-icon\">\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n class=\"cortex-widget__threads-empty-svg\"\n >\n <path\n d=\"M2.5 4.5h11M2.5 8h7M2.5 11.5h9\"\n stroke=\"currentColor\"\n stroke-width=\"1.3\"\n stroke-linecap=\"round\"\n />\n </svg>\n </div>\n <p class=\"cortex-widget__threads-empty-title\">\n {{ 'translate_no_threads_yet' | translate }}\n </p>\n <p class=\"cortex-widget__threads-empty-subtitle\">\n {{ 'translate_start_a_new_conversation' | translate }}\n </p>\n </div>\n }\n }\n </div>\n </div>\n\n <!-- SCREEN 2: CHAT -->\n <div\n class=\"cortex-widget__screen\"\n [class.cortex-widget__screen--active]=\"screen() === 'chat'\"\n [class.cortex-widget__screen--right]=\"screen() !== 'chat'\"\n >\n <!-- Chat header -->\n <div class=\"cortex-widget__chat-header\">\n <!-- Back button -->\n <button (click)=\"goBack()\" class=\"cortex-widget__back-btn\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n class=\"cortex-widget__back-icon\"\n >\n <path\n d=\"M10 3L5 8l5 5\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n\n <!-- Title -->\n <div class=\"cortex-widget__chat-title-wrap\">\n <p class=\"cortex-widget__chat-title\">\n {{ chatService.selectedThread()?.title ?? ('translate_new_chat' | translate) }}\n </p>\n </div>\n\n <!-- Debug toggle -->\n @if (config().showDebugButton) {\n <button\n (click)=\"toggleDebugMode()\"\n class=\"cortex-widget__debug-btn\"\n [class.cortex-widget__debug-btn--on]=\"debugMode()\"\n [class.cortex-widget__debug-btn--off]=\"!debugMode()\"\n >\n {{ debugMode() ? ('translate_debug' | translate) : ('translate_normal' | translate) }}\n </button>\n }\n </div>\n\n <!-- Messages loading skeleton -->\n @if (chatService.isLoadingMessages() && !chatService.isAgentWorking()) {\n <div class=\"cortex-widget__messages-skeleton\">\n <!-- User message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--user\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 13rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 9rem\"></div>\n </div>\n </div>\n <!-- Assistant message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--assistant\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 16rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 18rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 12rem\"></div>\n </div>\n </div>\n <!-- User message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--user\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 11rem\"></div>\n </div>\n </div>\n <!-- Assistant message skeleton -->\n <div class=\"cortex-widget__msg-skel cortex-widget__msg-skel--assistant\">\n <div class=\"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant\">\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 14rem\"></div>\n <div class=\"cortex-skeleton cortex-widget__msg-skel-line\" style=\"width: 15rem\"></div>\n </div>\n </div>\n </div>\n } @else {\n <!-- Messages area -->\n <cortex-message-list class=\"cortex-widget__messages\" [debugMode]=\"debugMode()\" />\n }\n\n <!-- Agent working indicator -->\n @if (chatService.isAgentWorking() && !chatService.hasPendingToolCalls()) {\n <div class=\"cortex-widget__working\">\n <div class=\"cortex-widget__working-dots\">\n <span class=\"cortex-working-dot\"></span>\n <span class=\"cortex-working-dot\"></span>\n <span class=\"cortex-working-dot\"></span>\n </div>\n <span class=\"cortex-widget__working-text\">{{ 'translate_thinking' | translate }}</span>\n </div>\n }\n\n <!-- Chat input (hidden during pending tool calls) -->\n @if (!chatService.hasPendingToolCalls()) {\n <div class=\"cortex-widget__input-area\">\n <div\n class=\"cortex-widget__input-box\"\n [class.cortex-widget__input-box--disabled]=\"chatService.isAgentWorking()\"\n [class.cortex-widget__input-box--enabled]=\"!chatService.isAgentWorking()\"\n >\n <textarea\n (keydown)=\"onKeydown($event)\"\n [(ngModel)]=\"text\"\n [placeholder]=\"\n chatService.isAgentWorking() ? '' : ('translate_type_a_message' | translate)\n \"\n [disabled]=\"chatService.isAgentWorking()\"\n rows=\"1\"\n class=\"cortex-widget__textarea\"\n [class.cortex-widget__textarea--disabled]=\"chatService.isAgentWorking()\"\n ></textarea>\n @if (chatService.isAgentWorking()) {\n <!-- Stop button -->\n <button (click)=\"chatService.abort()\" class=\"cortex-stop-btn\">\n <!-- Pulsing ring -->\n <span class=\"cortex-stop-btn__ring\"></span>\n <!-- Stop icon (rounded square) -->\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n class=\"cortex-stop-btn__icon\"\n >\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" rx=\"2.5\" fill=\"currentColor\" />\n </svg>\n </button>\n } @else {\n <!-- Send button -->\n <button\n (click)=\"send()\"\n class=\"cortex-widget__send-btn\"\n [class.cortex-widget__send-btn--empty]=\"!text().trim()\"\n [class.cortex-widget__send-btn--ready]=\"!!text().trim()\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n class=\"cortex-widget__send-icon\"\n >\n <path\n d=\"M3 8h10M9 4l4 4-4 4\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n />\n </svg>\n </button>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","/*\n * Public API Surface of cortex-client\n */\n\n// Config\nexport type { CortexClientConfig, CortexClientTransport } from './lib/config';\n\n// Components\nexport { CortexChatWidgetComponent } from './lib/components/chat-widget/chat-widget.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","LABELS","i1.CortexChatService"],"mappings":"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"}