{"version":3,"file":"c8y-ngx-components-ai.mjs","sources":["../../ai/ai.model.ts","../../ai/ai.service.ts","../../ai/c8y-ngx-components-ai.ts"],"sourcesContent":["import { Type } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nexport interface AIMessageStreamSteps extends AIMessage {\n  componentSteps$?: Observable<{ content: Type<any> | string; origin: AgentStep }[]>;\n}\n\nexport interface AIMessage {\n  role: 'user' | 'assistant';\n  content: string;\n  options?: AIMessageOptions;\n  steps?: Array<AgentStep>;\n  finishReason?: 'stop' | 'error' | 'tool_use';\n  timestamp?: string;\n}\n\nexport interface AIMessageOptions {\n  skipToLLM?: boolean;\n  hiddenContent?: string;\n  variables?: { [key: string]: any };\n}\n\nexport enum DataStreamType {\n  TEXT_DELTA = 'text-delta',\n  TOOL_CALL = 'tool-call',\n  TOOL_CALL_STREAMING = 'tool-call-streaming',\n  TOOL_CALL_DELTA = 'tool-call-delta',\n  TOOL_RESULT = 'tool-result',\n  REASONING = 'reasoning',\n  REASONING_DELTA = 'reasoning-delta',\n  REDACTED_REASONING = 'redacted-reasoning',\n  REASONING_SIGNATURE = 'reasoning-signature',\n  FINISH_REASONING = 'finish-reasoning',\n  FINISH = 'finish',\n  FINISH_STEP = 'finish-step',\n  ERROR = 'error',\n  DATA = 'data',\n  MESSAGE_ANNOTATIONS = 'message-annotations',\n  SOURCE = 'source',\n  FILE = 'file',\n  STEP_START = 'step-start',\n  STEP_FINISH = 'step-finish'\n}\n\nexport type AgentStep = {\n  type: 'text' | 'reasoning' | string;\n  text: string;\n  reasoning?: string;\n  textDelta?: string;\n  toolCalls?: Array<ToolCall>;\n  toolResults?: Array<ToolResult>;\n};\n\nexport interface Tool {\n  toolName: string;\n  toolId: string;\n  type: 'tool-call' | 'tool-result';\n}\n\nexport interface ToolCall extends Tool {\n  arguments: { [key: string]: any };\n}\n\nexport interface ToolResult extends Tool {\n  result: {\n    content: {\n      text: string;\n      type: string;\n    }[];\n  };\n}\n\nexport interface ClientAgentDefinition {\n  /**\n   * If set to true, the agent will be created each time. This is useful for development.\n   */\n  snapshot: boolean;\n  /**\n   * The label of the agent that is shown to the user.\n   */\n  label: string;\n  /**\n   * The definitions of the agent.\n   *\n   * You can use multiple definitions that can be used in an agent-2-agent scenario\n   * The first definition is the entry point.\n   */\n  definitions: {\n    name: string;\n    type: 'object' | 'text';\n    agent: {\n      system: string;\n      [key: string]: any;\n    };\n    mcp: Array<{ serverName: string; tools: string[] }>;\n  }[];\n}\n\nexport interface ChatConfig {\n  title: string;\n  headline: string;\n  welcomeText: string;\n  placeholder: string;\n  sendButtonText: string;\n  cancelButtonText: string;\n  disclaimerText: string;\n  userInterfaceIcons: { send: string; cancel: string };\n}\n\nexport interface AgentHealthCheckResponse {\n  /**\n   * Indicates if the agent exists and can be used.\n   * If false, the agent was not found.\n   */\n  exists: boolean;\n  /**\n   * Indicates if the user can create the agent, and if a global provider is configured.\n   */\n  canCreate: boolean;\n  /**\n   * Indicates if the provider is configured.\n   * If false, the agent cannot be created as the provider is not configured.\n   */\n  isProviderConfigured: boolean;\n  /**\n   * If canCreate or exist is false, this array contains messages\n   * that explain why the agent cannot be used or created.\n   */\n  messages?: string[];\n}\n","import { Injectable } from '@angular/core';\nimport {\n  AgentHealthCheckResponse,\n  AIMessage,\n  ClientAgentDefinition,\n  DataStreamType\n} from './ai.model';\nimport { FetchClient } from '@c8y/client';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AIService {\n  private baseUrl = '/service/ai';\n\n  constructor(private client: FetchClient) {}\n\n  async createOrUpdateAgent(agentsDef: ClientAgentDefinition): Promise<void> {\n    for (const def of agentsDef.definitions) {\n      const health = await this.getAgentHealth(def.name);\n      let resource = `${this.baseUrl}/agent/${def.type}`;\n      let method = 'POST';\n      if (health.exists) {\n        resource = `${this.baseUrl}/agent/${def.type}/${def.name}`;\n        method = 'PUT';\n      }\n      const response = await this.client.fetch(resource, {\n        body: JSON.stringify(def),\n        method,\n        headers: { 'Content-Type': 'application/json' }\n      });\n\n      if (!response.ok) {\n        throw new Error(`Failed to create agent: ${response.statusText}`);\n      }\n    }\n  }\n\n  /**\n   * Check if an agent exists.\n   * @param name Agent name\n   * @returns Agent health check response.\n   */\n  async getAgentHealth(name: string): Promise<AgentHealthCheckResponse> {\n    const response = await this.client.fetch(`${this.baseUrl}/agent/test/${name}`, {\n      method: 'GET',\n      headers: { 'Content-Type': 'application/json' }\n    });\n\n    if (!response.ok) {\n      return {\n        exists: false,\n        canCreate: false,\n        isProviderConfigured: false\n      };\n    }\n    const json = await response.json();\n    return json;\n  }\n\n  /**\n   * Send a text message to the agent.\n   * @param name Agent name\n   * @param messages Messages to send\n   * @param variables Variables to include\n   * @returns Text response from the agent.\n   */\n  async text(\n    name: string,\n    messages: AIMessage[],\n    variables: { [key: string]: any }\n  ): Promise<string> {\n    const parsedMessages = this.parseMessages(messages);\n\n    const data = this.client.fetch(`${this.baseUrl}/agent/text/${name}`, {\n      body: JSON.stringify({ messages: parsedMessages, variables }),\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' }\n    });\n\n    const response = await data;\n    if (!response.ok) {\n      throw new Error(`Failed to talk with agent: ${response.statusText}`);\n    }\n    const text = await response.text();\n    return text;\n  }\n\n  /**\n   * Stream a text message to the agent.\n   * @param agentName Agent name\n   * @param messages Messages to send\n   * @param variables Variables to include\n   * @param abortController An AbortController to cancel the request.\n   * @returns An observable that emits partial AIMessage objects as they are received. The observable can be cancelled using the provided AbortController.\n   * The observable will emit an error if the request fails or is aborted.\n   * The observable will complete when the stream is finished.\n   *\n   * The messages sent to the agent can include special options:\n   * - `hiddenContent`: If set, this content will be sent to the agent instead of the `content` field.\n   * - `skipToLLM`: If set to true, this message will be skipped when sending to the agent.\n   *\n   * Example usage:\n   * ```typescript\n   * const abortController = new AbortController();\n   * const messages: AIMessage[] = [\n   *   { role: 'user', content: 'Hello' },\n   *   { role: 'assistant', content: 'Hi there!' },\n   *   { role: 'user', content: 'Tell me a joke.', options: { hiddenContent: 'Tell me a joke about cats.' } }\n   * ];\n   * const observable = aiService.stream$('my-agent', messages, {}, abortController);\n   * const subscription = observable.subscribe({\n   *   next: (message) => console.log('Received message part:', message),\n   *   error: (err) => console.error('Error:', err),\n   *   complete: () => console.log('Stream complete')\n   * });\n   *\n   * // To cancel the request:\n   * abortController.abort();\n   * subscription.unsubscribe();\n   * ```\n   */\n  async stream$(\n    agentName: string,\n    messages: AIMessage[],\n    variables: { [key: string]: any },\n    abortController: AbortController\n  ): Promise<Observable<AIMessage>> {\n    const parsedMessages = this.parseMessages(messages);\n    const response = await this.client.fetch(\n      `${this.baseUrl}/agent/text/${agentName}?fullResponse=true`,\n      {\n        method: 'POST',\n        body: JSON.stringify({ messages: parsedMessages, variables }),\n        headers: {\n          ...this.client.defaultHeaders,\n          'content-type': 'application/json',\n          accept: 'text/event-stream'\n        },\n        signal: abortController.signal\n      }\n    );\n\n    if (response.status > 300) {\n      const data = await response.json();\n      throw new Error(JSON.stringify(data, null, 2));\n    }\n\n    const stream = response.body;\n    const decoder = new TextDecoder();\n\n    return new Observable<AIMessage>(observer => {\n      if (!stream) {\n        observer.error('No response body');\n        throw 'No response body';\n      }\n\n      const reader = stream.getReader();\n      const message: AIMessage = {\n        role: 'assistant',\n        content: '',\n        steps: []\n      };\n\n      const abortHandler = () => {\n        reader.cancel();\n        observer.error(new DOMException('Aborted', 'AbortError'));\n      };\n\n      abortController.signal.addEventListener('abort', abortHandler);\n\n      let buffer = '';\n\n      const read = () => {\n        reader.read().then(({ done, value }) => {\n          if (done) {\n            if (buffer.trim()) this.processLine(buffer, observer, message); // process any remaining data\n            observer.complete();\n            return;\n          }\n          buffer += decoder.decode(value, { stream: true });\n          const lines = buffer.split('\\n\\n');\n          buffer = lines.pop() || '';\n          for (const line of lines) {\n            if (line.trim()) this.processLine(line, observer, message);\n          }\n          read();\n        });\n      };\n\n      read();\n      return () => {\n        abortController.signal.removeEventListener('abort', abortHandler);\n        reader.cancel();\n      };\n    });\n  }\n\n  private parseMessages(messages: AIMessage[]) {\n    return messages\n      .filter(message => !message.options?.skipToLLM)\n      .map(message => {\n        if (message.options?.hiddenContent) {\n          return {\n            role: message.role,\n            content: message.options.hiddenContent\n          };\n        }\n        return {\n          role: message.role,\n          content: message.content\n        };\n      });\n  }\n\n  private processLine(line: string, observer: any, message: AIMessage) {\n    if (!line.trim()) {\n      return;\n    }\n    const lastStep = message.steps?.[message.steps.length - 1];\n    try {\n      let data: any = {};\n      let type = '';\n      try {\n        data = JSON.parse(line.replace('data: ', ''));\n        type = data.type;\n      } catch (e) {\n        console.error('Error parsing line', line, e);\n        return;\n      }\n\n      switch (type) {\n        case DataStreamType.STEP_START:\n          message.steps = message.steps || [];\n          message.steps.push({\n            type: 'text',\n            toolCalls: [],\n            toolResults: [],\n            text: ''\n          });\n          return;\n\n        case DataStreamType.REASONING:\n          if (lastStep!.reasoning === undefined) {\n            lastStep!.reasoning = '';\n          }\n          lastStep!.reasoning += data.textDelta;\n          observer.next(message);\n          return;\n\n        case DataStreamType.TEXT_DELTA:\n          lastStep!.text += data.textDelta;\n          message.content += data.textDelta;\n          observer.next(message);\n          return;\n\n        case DataStreamType.TOOL_CALL:\n          lastStep!.toolCalls = [data];\n          observer.next(message);\n          return;\n\n        case DataStreamType.TOOL_RESULT:\n          lastStep!.toolResults = [data];\n          observer.next(message);\n          return;\n\n        case DataStreamType.FINISH:\n          message.finishReason = data.finishReason;\n          observer.next(message);\n          observer.complete();\n          return;\n\n        case DataStreamType.ERROR:\n          message.finishReason = 'error';\n          const errorMessage = `<div\n              class=\"alert alert-danger\"\n              role=\"alert\"\n            >\n              <strong>Error</strong>\n              ${data.message || 'An unknown error occurred'}\n            </div>`;\n          message.content += errorMessage;\n          lastStep!.text += errorMessage;\n          observer.next(message);\n          observer.error(data);\n          observer.complete();\n          return;\n      }\n    } catch (e) {\n      observer.error(e);\n    }\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}