{"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/components/copy-button/copy-button.component.ts","../../../projects/cortex-client/src/lib/components/copy-button/copy-button.component.html","../../../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-llm-inspector/message-llm-inspector.component.ts","../../../projects/cortex-client/src/lib/components/message-llm-inspector/message-llm-inspector.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/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-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';\nimport { ThreadSummary } from './ws-events';\n\nexport type CortexClientHeaders = Record<string, string>;\n\nexport type CortexClientTransport = {\n  baseUrl: string | Signal<string>;\n  getHeaders: () => CortexClientHeaders | Promise<CortexClientHeaders>;\n};\n\nexport type CortexClientViewMode = 'helper' | 'full';\n\nexport type CortexClientToolCallContext = {\n  threadId: string;\n};\n\nexport type CortexClientHooks = {\n  onToolCall?: (\n    toolCall: Parameters<ChatOnToolCallCallback>[0]['toolCall'],\n    context: CortexClientToolCallContext,\n  ) => Promise<unknown> | unknown;\n  onThreadSelected?: (thread: ThreadSummary) => Promise<void> | void;\n  onThreadDeselected?: (thread: ThreadSummary) => Promise<void> | void;\n};\n\nexport type CortexClientConfig = {\n  locale: string;\n  transport: CortexClientTransport;\n  wsUrl?: string;\n  viewMode?: CortexClientViewMode;\n  toolComponents?: Record<string, Type<unknown>>;\n  injector?: Injector;\n  showDebugButton?: boolean;\n  hooks?: CortexClientHooks;\n};\n\nexport const CORTEX_CLIENT_CONFIG = new InjectionToken<CortexClientConfig>('CORTEX_CLIENT_CONFIG');\n\nexport function resolveTransportHeaders(transport: CortexClientTransport) {\n  return Promise.resolve(transport.getHeaders());\n}\n\nexport function resolveTransportUrl(transport: CortexClientTransport, path: string) {\n  const baseUrl = transport.baseUrl;\n  const base = typeof baseUrl === 'string' ? baseUrl : baseUrl();\n  return base.replace(/\\/$/, '') + path;\n}\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, resolveTransportHeaders } 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      resolveTransportHeaders(config.transport).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 } 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, resolveTransportHeaders, resolveTransportUrl } 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 previousThread = this.selectedThread();\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.hooks?.onToolCall) return;\n\n            const result = this.config.hooks.onToolCall(toolCall, { threadId: thread.id });\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: resolveTransportUrl(this.config.transport, '/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        if (previousThread && previousThread.id !== thread.id) {\n          void this.config.hooks?.onThreadDeselected?.(previousThread);\n        }\n\n        this.events.next('onThreadSelected');\n        void this.config.hooks?.onThreadSelected?.(thread);\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    const previousThread = this.selectedThread();\n    if (!previousThread && !this.chat()) return;\n\n    this.selectedThread.set(undefined);\n    this.chat.set(undefined);\n\n    if (previousThread) {\n      void this.config.hooks?.onThreadDeselected?.(previousThread);\n    }\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 async fetchLlmRequests(messageId: string) {\n    return this.fetchJson<\n      {\n        id: string;\n        prompt: string;\n        output: string | null;\n        tokenUsage: {\n          input: { noCache: number; cacheRead: number; cacheWrite: number; total: number };\n          output: { reasoning: number; text: number; total: number };\n          total: number;\n        } | null;\n      }[]\n    >(`/messages/${messageId}/llm-requests`);\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 async resolveHeaders() {\n    return await resolveTransportHeaders(this.config.transport);\n  }\n\n  private async fetchJson<T>(path: string, init?: RequestInit) {\n    const url = resolveTransportUrl(this.config.transport, 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 {\n  ChangeDetectionStrategy,\n  Component,\n  input,\n  signal,\n  ViewEncapsulation,\n} from '@angular/core';\n\n@Component({\n  selector: 'cortex-copy-button',\n  templateUrl: './copy-button.component.html',\n  styleUrl: './copy-button.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  host: { class: 'cortex-copy-btn' },\n})\nexport class CopyButtonComponent {\n  public readonly value = input.required<string>();\n\n  protected readonly copied = signal(false);\n\n  private resetTimer: ReturnType<typeof setTimeout> | null = null;\n\n  protected async copy(event: MouseEvent) {\n    event.stopPropagation();\n    event.preventDefault();\n\n    try {\n      await navigator.clipboard.writeText(this.value());\n      this.copied.set(true);\n\n      if (this.resetTimer) clearTimeout(this.resetTimer);\n      this.resetTimer = setTimeout(() => this.copied.set(false), 1500);\n    } catch {\n      // Clipboard API not available — silent fail\n    }\n  }\n}\n","<button\n  class=\"cortex-copy-btn__button\"\n  [class.cortex-copy-btn__button--copied]=\"copied()\"\n  (click)=\"copy($event)\"\n  [attr.aria-label]=\"copied() ? 'Copied' : 'Copy to clipboard'\"\n  type=\"button\"\n>\n  @if (copied()) {\n    <svg\n      class=\"cortex-copy-btn__icon cortex-copy-btn__icon--check\"\n      width=\"13\"\n      height=\"13\"\n      viewBox=\"0 0 24 24\"\n      fill=\"none\"\n    >\n      <path\n        d=\"M5 13l4 4L19 7\"\n        stroke=\"currentColor\"\n        stroke-width=\"2.5\"\n        stroke-linecap=\"round\"\n        stroke-linejoin=\"round\"\n      />\n    </svg>\n  } @else {\n    <svg class=\"cortex-copy-btn__icon\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\">\n      <rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\" stroke=\"currentColor\" stroke-width=\"2\" />\n      <path\n        d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\n        stroke=\"currentColor\"\n        stroke-width=\"2\"\n        stroke-linecap=\"round\"\n      />\n    </svg>\n  }\n</button>\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 {\n  ChangeDetectionStrategy,\n  Component,\n  inject,\n  input,\n  signal,\n  ViewEncapsulation,\n} from '@angular/core';\nimport { DecimalPipe } from '@angular/common';\nimport { CopyButtonComponent } from '../copy-button/copy-button.component';\nimport { JsonTreeComponent } from '../json-tree/json-tree.component';\nimport { CortexChatService } from '../../services/cortex-chat.service';\n\ntype LlmRequest = {\n  id: string;\n  prompt: string;\n  output: string | null;\n  tokenUsage: {\n    input: { noCache: number; cacheRead: number; cacheWrite: number; total: number };\n    output: { reasoning: number; text: number; total: number };\n    total: number;\n  } | null;\n};\n\n@Component({\n  selector: 'cortex-message-llm-inspector',\n  templateUrl: './message-llm-inspector.component.html',\n  styleUrl: './message-llm-inspector.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [CopyButtonComponent, DecimalPipe, JsonTreeComponent],\n  host: {\n    class: 'cortex-llm-inspector',\n    '[class.cortex-llm-inspector--open]': 'open()',\n  },\n})\nexport class MessageLlmInspectorComponent {\n  public readonly messageId = input.required<string>();\n\n  protected readonly open = signal(false);\n  protected readonly loading = signal(false);\n  protected readonly requests = signal<LlmRequest[]>([]);\n  protected readonly expandedStep = signal<string | null>(null);\n  protected readonly activeTab = signal<Record<string, 'prompt' | 'response'>>({});\n\n  private loaded = false;\n  private readonly chatService = inject(CortexChatService);\n\n  protected async toggle() {\n    if (!this.loaded) {\n      this.loading.set(true);\n      try {\n        const data = await this.chatService.fetchLlmRequests(this.messageId());\n        this.requests.set(data);\n      } finally {\n        this.loading.set(false);\n        this.loaded = true;\n      }\n    }\n\n    this.open.update((v) => !v);\n  }\n\n  protected toggleStep(id: string) {\n    this.expandedStep.update((current) => (current === id ? null : id));\n  }\n\n  protected getTab(id: string) {\n    return this.activeTab()[id] ?? 'prompt';\n  }\n\n  protected setTab(id: string, tab: 'prompt' | 'response') {\n    this.activeTab.update((current) => ({ ...current, [id]: tab }));\n  }\n\n  protected parseJson(value: string | null) {\n    if (!value) return null;\n    try {\n      return JSON.parse(value);\n    } catch {\n      return value;\n    }\n  }\n\n  protected prettyJson(value: string | null) {\n    if (!value) return '';\n    try {\n      return JSON.stringify(JSON.parse(value), null, 2);\n    } catch {\n      return value;\n    }\n  }\n}\n","<button class=\"cortex-llm-inspector__trigger\" (click)=\"toggle()\">\n  <svg class=\"cortex-llm-inspector__icon\" width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\">\n    <path\n      d=\"M6 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8ZM0 6a6 6 0 1 1 10.89 3.477l4.817 4.816a1 1 0 0 1-1.414 1.414l-4.816-4.816A6 6 0 0 1 0 6Z\"\n      fill=\"currentColor\"\n    />\n  </svg>\n  <span>Inspect LLM requests</span>\n\n  @if (loading()) {\n    <span class=\"cortex-llm-inspector__loading\">loading…</span>\n  } @else if (requests().length > 0) {\n    <span class=\"cortex-llm-inspector__badge\">{{ requests().length }}</span>\n  }\n\n  <svg class=\"cortex-llm-inspector__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-llm-inspector__panel-wrapper\">\n  <div class=\"cortex-llm-inspector__panel-inner\">\n    <div class=\"cortex-llm-inspector__panel\">\n      @if (requests().length === 0 && !loading()) {\n        <div class=\"cortex-llm-inspector__empty\">No LLM requests recorded for this message.</div>\n      }\n\n      @for (req of requests(); track req.id; let idx = $index) {\n        <div\n          class=\"cortex-llm-inspector__step\"\n          [class.cortex-llm-inspector__step--expanded]=\"expandedStep() === req.id\"\n        >\n          <button class=\"cortex-llm-inspector__step-header\" (click)=\"toggleStep(req.id)\">\n            <span class=\"cortex-llm-inspector__step-label\">Step {{ idx + 1 }}</span>\n\n            @if (req.tokenUsage; as usage) {\n              <span class=\"cortex-llm-inspector__step-metrics\">\n                <span class=\"cortex-llm-inspector__metric\">\n                  <span class=\"cortex-llm-inspector__dot cortex-llm-inspector__dot--input\"></span>\n                  {{ usage.input.total | number }}\n                </span>\n                <span class=\"cortex-llm-inspector__metric\">\n                  <span class=\"cortex-llm-inspector__dot cortex-llm-inspector__dot--output\"></span>\n                  {{ usage.output.total | number }}\n                </span>\n                @if (usage.input.total > 0) {\n                  <span class=\"cortex-llm-inspector__cache-pct\">\n                    {{ (usage.input.cacheRead / usage.input.total) * 100 | number: '1.0-0' }}%\n                  </span>\n                }\n              </span>\n            }\n\n            <svg\n              class=\"cortex-llm-inspector__step-chevron\"\n              width=\"10\"\n              height=\"10\"\n              viewBox=\"0 0 12 12\"\n              fill=\"none\"\n            >\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-llm-inspector__step-body-wrapper\">\n            <div class=\"cortex-llm-inspector__step-body-inner\">\n              <div class=\"cortex-llm-inspector__step-body\">\n                @if (req.tokenUsage; as usage) {\n                  <div class=\"cortex-llm-inspector__usage-rows\">\n                    <div class=\"cortex-llm-inspector__usage-row\">\n                      <span class=\"cortex-llm-inspector__usage-lbl\">Input</span>\n                      <span class=\"cortex-llm-inspector__usage-val\">{{\n                        usage.input.total | number\n                      }}</span>\n                      <span class=\"cortex-llm-inspector__usage-detail\">\n                        Fresh {{ usage.input.noCache | number }} &middot; Read\n                        {{ usage.input.cacheRead | number }} &middot; Write\n                        {{ usage.input.cacheWrite | number }}\n                      </span>\n                    </div>\n                    <div class=\"cortex-llm-inspector__usage-row\">\n                      <span class=\"cortex-llm-inspector__usage-lbl\">Output</span>\n                      <span class=\"cortex-llm-inspector__usage-val\">{{\n                        usage.output.total | number\n                      }}</span>\n                      <span class=\"cortex-llm-inspector__usage-detail\">\n                        Text {{ usage.output.text | number }} &middot; Reasoning\n                        {{ usage.output.reasoning | number }}\n                      </span>\n                    </div>\n                    <div\n                      class=\"cortex-llm-inspector__usage-row cortex-llm-inspector__usage-row--total\"\n                    >\n                      <span class=\"cortex-llm-inspector__usage-lbl\">Total</span>\n                      <span class=\"cortex-llm-inspector__usage-val\">{{\n                        usage.total | number\n                      }}</span>\n                    </div>\n                  </div>\n                }\n\n                <div class=\"cortex-llm-inspector__tabs\">\n                  <button\n                    class=\"cortex-llm-inspector__tab\"\n                    [class.cortex-llm-inspector__tab--active]=\"getTab(req.id) === 'prompt'\"\n                    (click)=\"setTab(req.id, 'prompt')\"\n                  >\n                    Request\n                  </button>\n                  <button\n                    class=\"cortex-llm-inspector__tab\"\n                    [class.cortex-llm-inspector__tab--active]=\"getTab(req.id) === 'response'\"\n                    (click)=\"setTab(req.id, 'response')\"\n                  >\n                    Response\n                  </button>\n                </div>\n\n                <div class=\"cortex-llm-inspector__json-pane\">\n                  <cortex-copy-button\n                    class=\"cortex-llm-inspector__json-copy\"\n                    [value]=\"\n                      getTab(req.id) === 'prompt' ? prettyJson(req.prompt) : prettyJson(req.output)\n                    \"\n                  />\n                  @if (getTab(req.id) === 'prompt') {\n                    <cortex-json-tree [data]=\"parseJson(req.prompt)\" [expandDepth]=\"2\" />\n                  } @else {\n                    <cortex-json-tree [data]=\"parseJson(req.output)\" [expandDepth]=\"2\" />\n                  }\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n</div>\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 { 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 { CopyButtonComponent } from '../copy-button/copy-button.component';\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: [CopyButtonComponent, 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 readonly remainingInputText = computed(() => {\n    const remaining = this.remainingInput();\n    if (!remaining) return '';\n    return JSON.stringify(remaining, null, 2);\n  });\n\n  protected readonly outputText = computed(() => {\n    const output = this.toolCallPart().output;\n    if (output === undefined || output === null) return '';\n    if (typeof output === 'string') return output;\n    return JSON.stringify(output, null, 2);\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=\"dbg-tool\" [attr.data-state]=\"toolCallPart().state\">\n  <summary class=\"dbg-tool__summary\">\n    <div class=\"dbg-tool__header\">\n      <div class=\"dbg-tool__meta\">\n        <div class=\"dbg-tool__title-row\">\n          <span class=\"dbg-tool__name\" [attr.title]=\"toolCallPart().title || null\">\n            {{ toolCallPart().title ?? 'Tool call' }}\n          </span>\n          @if (toolName()) {\n            <code class=\"dbg-tool__type\" [attr.title]=\"toolCallPart().type || null\">{{\n              toolName()\n            }}</code>\n          }\n        </div>\n        <div class=\"dbg-tool__id-row\">\n          <span class=\"dbg-tool__id\">{{ toolCallPart().toolCallId }}</span>\n          @if (toolCallPart().providerExecuted) {\n            <span class=\"dbg-tool__provider\">\n              <span class=\"dbg-tool__provider-dot\"></span>\n              provider\n            </span>\n          }\n        </div>\n      </div>\n\n      <div class=\"dbg-tool__actions\">\n        <span\n          class=\"dbg-tool__state\"\n          [ngClass]=\"{\n            'dbg-tool__state--success': toolCallPart().state === 'output-available',\n            'dbg-tool__state--error': toolCallPart().state === 'output-error',\n            'dbg-tool__state--denied': toolCallPart().state === 'output-denied',\n            'dbg-tool__state--approval':\n              toolCallPart().state === 'approval-requested' ||\n              toolCallPart().state === 'approval-responded',\n            'dbg-tool__state--pending':\n              toolCallPart().state === 'input-streaming' ||\n              toolCallPart().state === 'input-available',\n          }\"\n        >\n          @switch (toolCallPart().state) {\n            @case ('input-streaming') {\n              <span class=\"dbg-tool__pulse\"></span>\n              Calling\n            }\n            @case ('input-available') {\n              Input ready\n            }\n            @case ('approval-requested') {\n              <span class=\"dbg-tool__pulse dbg-tool__pulse--violet\"></span>\n              Needs approval\n            }\n            @case ('approval-responded') {\n              @if (toolCallPart().approval?.approved) {\n                Approved\n              } @else {\n                Responded\n              }\n            }\n            @case ('output-available') {\n              {{ 'translate_completed' | translate }}\n            }\n            @case ('output-error') {\n              Error\n            }\n            @case ('output-denied') {\n              Denied\n            }\n          }\n        </span>\n\n        <svg class=\"dbg-tool__chevron\" 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      </div>\n    </div>\n  </summary>\n\n  <div class=\"dbg-tool__body\">\n    @for (snippet of codeSnippets(); track snippet.key) {\n      <div class=\"dbg-tool__section\">\n        <div class=\"dbg-tool__section-bar\">\n          <span class=\"dbg-tool__section-label\">{{ snippet.key }}</span>\n          <span class=\"dbg-tool__section-lang\">{{ snippet.lang }}</span>\n          <cortex-copy-button [value]=\"snippet.value\" />\n        </div>\n        <pre\n          dir=\"ltr\"\n          class=\"dbg-tool__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=\"dbg-tool__section\">\n        <div class=\"dbg-tool__section-bar\">\n          <span class=\"dbg-tool__section-label\">Input</span>\n          <span class=\"dbg-tool__section-lang\">json</span>\n          <cortex-copy-button [value]=\"remainingInputText()\" />\n        </div>\n        <div dir=\"ltr\" class=\"dbg-tool__tree\">\n          <cortex-json-tree [data]=\"remaining\" [expandDepth]=\"2\" />\n        </div>\n      </div>\n    }\n\n    @if (toolCallPart().state === 'output-available') {\n      <div class=\"dbg-tool__section dbg-tool__section--success\">\n        <div class=\"dbg-tool__section-bar\">\n          <span class=\"dbg-tool__section-label dbg-tool__section-label--success\">Output</span>\n          <span class=\"dbg-tool__section-lang\">json</span>\n          <cortex-copy-button [value]=\"outputText()\" />\n        </div>\n        <div dir=\"ltr\" class=\"dbg-tool__tree\">\n          <cortex-json-tree [data]=\"toolCallPart().output\" [expandDepth]=\"2\" />\n        </div>\n      </div>\n    }\n\n    @if (toolCallPart().state === 'output-error') {\n      <div class=\"dbg-tool__section dbg-tool__section--error\">\n        <div class=\"dbg-tool__section-bar\">\n          <span class=\"dbg-tool__section-label dbg-tool__section-label--error\">Error</span>\n          <cortex-copy-button [value]=\"toolCallPart().errorText ?? ''\" />\n        </div>\n        <pre dir=\"ltr\" class=\"dbg-tool__error-pre\">{{ toolCallPart().errorText }}</pre>\n      </div>\n    }\n\n    @if (toolCallPart().state === 'output-denied') {\n      <div class=\"dbg-tool__section\">\n        <div class=\"dbg-tool__section-bar\">\n          <span class=\"dbg-tool__section-label\">Denied</span>\n        </div>\n        <div class=\"dbg-tool__message\">\n          Tool execution was denied.\n          @if (toolCallPart().approval?.reason) {\n            <div class=\"dbg-tool__reason\">{{ toolCallPart().approval?.reason }}</div>\n          }\n        </div>\n      </div>\n    }\n\n    @if (toolCallPart().state === 'approval-requested') {\n      <div class=\"dbg-tool__section dbg-tool__section--approval\">\n        <div class=\"dbg-tool__section-bar\">\n          <span class=\"dbg-tool__section-label dbg-tool__section-label--approval\">\n            Approval requested\n          </span>\n          <span class=\"dbg-tool__section-lang\">{{ toolCallPart().approval?.id }}</span>\n        </div>\n        <div class=\"dbg-tool__message dbg-tool__message--approval\">\n          Waiting for approval to execute this tool.\n        </div>\n      </div>\n    }\n\n    @if (toolCallPart().state === 'approval-responded') {\n      <div class=\"dbg-tool__section dbg-tool__section--approval\">\n        <div class=\"dbg-tool__section-bar\">\n          <span class=\"dbg-tool__section-label dbg-tool__section-label--approval\">\n            Approval response\n          </span>\n          <span class=\"dbg-tool__section-lang\">{{ toolCallPart().approval?.id }}</span>\n        </div>\n        <div class=\"dbg-tool__message dbg-tool__message--approval\">\n          @if (toolCallPart().approval?.approved) {\n            Approved.\n          } @else {\n            Response received.\n          }\n          @if (toolCallPart().approval?.reason) {\n            <div class=\"dbg-tool__reason dbg-tool__reason--approval\">\n              {{ toolCallPart().approval?.reason }}\n            </div>\n          }\n        </div>\n      </div>\n    }\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, resolveTransportHeaders } 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 resolveTransportHeaders(this.config.transport);\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 resolveTransportHeaders(this.config.transport);\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_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 { 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    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-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  @if (cacheRatio() > 0) {\n    <span class=\"cortex-token-usage__cache-badge\">{{ cacheRatio() }}%</span>\n  }\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__columns\">\n      <div class=\"cortex-token-usage__col\">\n        <div class=\"cortex-token-usage__col-header\">\n          <span class=\"cortex-token-usage__dot cortex-token-usage__dot--input\"></span>\n          <span class=\"cortex-token-usage__col-label\">Input</span>\n          <span class=\"cortex-token-usage__col-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\">{{\n                usage().input.noCache | number\n              }}</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        </div>\n        @if (cacheRatio() > 0) {\n          <div class=\"cortex-token-usage__cache-bar-row\">\n            <div class=\"cortex-token-usage__cache-bar\">\n              <div class=\"cortex-token-usage__cache-fill\" [style.width.%]=\"cacheRatio()\"></div>\n            </div>\n            <span class=\"cortex-token-usage__cache-label\">{{ cacheRatio() }}% cached</span>\n          </div>\n        }\n      </div>\n\n      <div class=\"cortex-token-usage__col\">\n        <div class=\"cortex-token-usage__col-header\">\n          <span class=\"cortex-token-usage__dot cortex-token-usage__dot--output\"></span>\n          <span class=\"cortex-token-usage__col-label\">Output</span>\n          <span class=\"cortex-token-usage__col-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</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  input,\n  signal,\n  ViewEncapsulation,\n  inject,\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 { MessageLlmInspectorComponent } from '../message-llm-inspector/message-llm-inspector.component';\nimport { MessagePartComponent } from '../message-part/message-part.component';\nimport { MessageTokenUsageComponent } from '../message-token-usage/message-token-usage.component';\nimport { MessageMetadata } from '../../types';\nimport { CortexChatService } from '../../services/cortex-chat.service';\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    MessageLlmInspectorComponent,\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  private readonly chatService = inject(CortexChatService);\n\n  protected readonly isStreaming = computed(() => {\n    if (!this.chatService.isAgentWorking()) return false;\n\n    const messages = this.chatService.chat()?.messages;\n    if (!messages) return false;\n\n    for (let i = messages.length - 1; i >= 0; i--) {\n      if (messages[i].role === 'assistant') {\n        return messages[i].id === this.message().id;\n      }\n    }\n\n    return false;\n  });\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-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 (\n      debugMode() &&\n      !isStreaming() &&\n      (message().metadata?.tokenUsage || message().role === 'assistant')\n    ) {\n      <div class=\"cortex-message-debug-zone\">\n        @if (message().metadata?.tokenUsage; as usage) {\n          <cortex-message-token-usage [usage]=\"usage\" [modelId]=\"message().metadata?.modelId\" />\n        }\n\n        @if (message().role === 'assistant') {\n          <cortex-message-llm-inspector [messageId]=\"message().id\" />\n        }\n      </div>\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  computed,\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, CortexClientViewMode } 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  protected readonly sidebarOpen = signal(false);\n  protected readonly viewMode = computed<CortexClientViewMode>(\n    () => this.config().viewMode ?? 'helper',\n  );\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 toggleSidebar() {\n    this.sidebarOpen.update((v) => !v);\n  }\n\n  protected closeSidebar() {\n    this.sidebarOpen.set(false);\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    this.sidebarOpen.set(false);\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()) {\n      return;\n    }\n\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    this.sidebarOpen.set(false);\n  }\n}\n","<div\n  class=\"cortex-widget__container\"\n  [class.cortex-widget__container--full]=\"viewMode() === 'full'\"\n  [class.cortex-widget__container--sidebar-open]=\"sidebarOpen()\"\n>\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      <!-- Sidebar toggle (full mode, small screens) -->\n      <button (click)=\"toggleSidebar()\" class=\"cortex-widget__sidebar-toggle-btn\">\n        <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n          <path\n            d=\"M2.5 4h11M2.5 8h11M2.5 12h11\"\n            stroke=\"currentColor\"\n            stroke-width=\"1.4\"\n            stroke-linecap=\"round\"\n          />\n        </svg>\n      </button>\n\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            <div class=\"cortex-widget__input-actions\">\n              <!-- Send button -->\n              <button\n                (click)=\"send()\"\n                class=\"cortex-widget__send-btn\"\n                [disabled]=\"!text().trim()\"\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            </div>\n          }\n        </div>\n      </div>\n    }\n  </div>\n\n  <!-- Sidebar overlay backdrop (full mode, small screens) -->\n  <div class=\"cortex-widget__sidebar-backdrop\" (click)=\"closeSidebar()\"></div>\n</div>\n","/*\n * Public API Surface of cortex-client\n */\n\n// Config\nexport type {\n  CortexClientConfig,\n  CortexClientHooks,\n  CortexClientToolCallContext,\n  CortexClientTransport,\n  CortexClientViewMode,\n} 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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"}