{"version":3,"file":"core/AgioProvider.mjs","sources":["webpack://@agent-tars/server/./src/core/AgioProvider.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AgioEvent } from '@multimodal/agio';\nimport { AgentTARS, AgentEventStream, AgentTARSAppConfig, AgentStatus } from '@agent-tars/core';\nimport { AgioBatchProcessor } from './AgioBatchProcessor';\n\n/**\n * AgioProvider, default impl\n *\n * FIXME: we do not implement following events for now:\n * - agent_tps\n * - user_feedback\n */\nexport class AgioProvider implements AgioEvent.AgioProvider {\n  protected runId?: string;\n  protected runStartTime?: number;\n  protected firstTokenTime?: number;\n  protected loopStartTimes: Map<number, number> = new Map();\n  protected currentIteration = 0;\n  protected hasInitialized = false;\n  protected modelName?: string;\n  private batchProcessor: AgioBatchProcessor;\n  private agentInitializedEvent: AgioEvent.ExtendedEvent | null = null;\n\n  constructor(\n    protected providerUrl: string,\n    protected appConfig: AgentTARSAppConfig,\n    protected sessionId: string,\n    protected agent: AgentTARS,\n  ) {\n    this.sessionId = sessionId;\n    this.agent = agent;\n    // Since Options are transparent in the entire architecture and gradually shrink downward,\n    // this method is the safest way to get Options with default values ​​processed by each layer.\n    this.appConfig = agent.getOptions();\n\n    // Initialize the batch processor for sending events efficiently.\n    this.batchProcessor = new AgioBatchProcessor({\n      providerUrl: this.providerUrl,\n      maxBatchSize: 3,\n    });\n  }\n\n  /**\n   * Calculate actual counts from the agent instance\n   */\n  private calculateCounts(): {\n    mcpServersCount: number;\n    toolsCount: number;\n    modelProvidersCount: number;\n  } {\n    // Get tools count from agent\n    const toolsCount = this.agent.getTools().length;\n\n    // Get model providers count from agent options\n    const modelProviders = this.appConfig.model?.providers;\n    const modelProvidersCount = Array.isArray(modelProviders) ? modelProviders.length : 1;\n\n    // Get MCP servers count from config\n    const mcpServersConfig = this.appConfig.mcpServers || {};\n    const mcpServersCount = Object.keys(mcpServersConfig).length;\n\n    return {\n      mcpServersCount,\n      toolsCount,\n      modelProvidersCount,\n    };\n  }\n\n  /**\n   * Send agent initialization event\n   * Called when an agent session is created\n   */\n  async sendAgentInitialized(): Promise<void> {\n    // Avoid duplicate initialization event\n    if (this.hasInitialized) {\n      return;\n    }\n\n    this.hasInitialized = true;\n\n    const resolvedModel = this.agent.getCurrentResolvedModel();\n    const counts = this.calculateCounts();\n\n    this.modelName = resolvedModel?.id;\n\n    const event = AgioEvent.createEvent('agent_initialized', this.sessionId, {\n      config: {\n        modelProvider: resolvedModel?.provider,\n        modelName: resolvedModel?.id,\n        toolCallEngine: this.appConfig.toolCallEngine,\n        maxTokens: this.appConfig.maxTokens!,\n        temperature: this.appConfig.temperature,\n        maxIterations: this.appConfig.maxIterations,\n        browserControl: this.appConfig.browser?.control,\n        plannerEnabled:\n          typeof this.appConfig.planner === 'object'\n            ? this.appConfig.planner.enabled\n            : Boolean(this.appConfig.planner),\n        thinkingEnabled: this.appConfig.thinking?.type === 'enabled',\n        snapshotEnabled: this.appConfig.snapshot?.enable,\n        researchEnabled:\n          typeof this.appConfig.planner === 'object'\n            ? this.appConfig.planner.enabled\n            : Boolean(this.appConfig.planner),\n        customMcpServers: Boolean(\n          this.appConfig.mcpServers && Object.keys(this.appConfig.mcpServers).length > 0,\n        ),\n      },\n\n      count: counts,\n    });\n\n    this.agentInitializedEvent = event;\n  }\n\n  /**\n   * Process internal agent events and convert to AGIO events\n   * This is the main entry point for event processing\n   */\n  async processAgentEvent(event: AgentEventStream.Event): Promise<void> {\n    try {\n      switch (event.type) {\n        case 'agent_run_start':\n          await this.handleRunStart(event);\n          break;\n\n        case 'agent_run_end':\n          await this.handleRunEnd(event);\n          break;\n\n        case 'assistant_streaming_message':\n          await this.handleFirstToken(event);\n          break;\n\n        case 'tool_call':\n          await this.handleToolCall(event);\n          break;\n\n        case 'tool_result':\n          await this.handleToolResult(event);\n          break;\n\n        case 'user_message':\n          await this.handleLoopStart();\n          break;\n\n        case 'assistant_message':\n          await this.handleLoopEnd(event);\n          break;\n\n        default:\n          // Ignore other event types for AGIO monitoring\n          break;\n      }\n    } catch (error) {\n      console.error('Failed to process AGIO event:', error);\n      // Don't throw to avoid disrupting agent operation\n    }\n  }\n\n  /**\n   * Helper method to determine if input is multimodal\n   */\n  private isInputMultimodal(input: string | any[]): boolean {\n    // If input is not an array, it's just text\n    if (!Array.isArray(input)) {\n      return false;\n    }\n\n    // Check if any content part is non-text (image, etc.)\n    return input.some((part) => {\n      if (typeof part === 'object' && part !== null) {\n        // Check for image_url type (multimodal content part)\n        if (part.type === 'image_url' || part.type === 'image') {\n          return true;\n        }\n        // Check for other non-text types that might be added in the future\n        if (part.type && part.type !== 'text') {\n          return true;\n        }\n      }\n      return false;\n    });\n  }\n\n  /**\n   * Handle agent run start events\n   */\n  private async handleRunStart(event: AgentEventStream.AgentRunStartEvent): Promise<void> {\n    // Send the deferred agent_initialized event if it exists\n    if (this.agentInitializedEvent) {\n      await this.queueEvent(this.agentInitializedEvent);\n      // Clear the event to ensure it's only sent once per session\n      this.agentInitializedEvent = null;\n    }\n\n    this.runId = event.sessionId;\n    this.runStartTime = Date.now();\n    this.firstTokenTime = undefined;\n    this.currentIteration = 0;\n    this.loopStartTimes.clear();\n\n    // Determine if input is multimodal based on actual input content\n    const isMultimodalInput = this.isInputMultimodal(event.runOptions?.input || '');\n\n    const agioEvent = AgioEvent.createEvent('agent_run_start', this.sessionId, {\n      runId: this.runId,\n      input: event.runOptions?.input || '',\n      isMultimodalInput,\n      streaming: Boolean(event.runOptions?.stream),\n    });\n\n    await this.queueEvent(agioEvent);\n  }\n\n  /**\n   * Handle agent run end events\n   */\n  private async handleRunEnd(event: AgentEventStream.AgentRunEndEvent): Promise<void> {\n    if (!this.runStartTime || !this.runId) return;\n\n    const executionTimeMs = Date.now() - this.runStartTime;\n\n    const successful = event.status !== AgentStatus.ERROR;\n    const isError = event.status === AgentStatus.ERROR;\n\n    // FIXME: add token usage count\n    const agioEvent = AgioEvent.createEvent('agent_run_end', this.sessionId, {\n      runId: this.runId,\n      executionTimeMs,\n      loopCount: event.iterations || this.currentIteration,\n      successful,\n      // FIXME: catch all errors\n      error: isError ? 'AgentRunError' : '',\n    });\n\n    await this.queueEvent(agioEvent);\n    await this.batchProcessor.flush();\n\n    // Reset run state\n    this.runId = undefined;\n    this.runStartTime = undefined;\n  }\n\n  /**\n   * Handle first token detection for TTFT measurement\n   */\n  private async handleFirstToken(\n    event: AgentEventStream.AssistantStreamingMessageEvent,\n  ): Promise<void> {\n    if (!this.firstTokenTime && this.runStartTime && event.content) {\n      this.firstTokenTime = Date.now();\n      const ttftMs = this.firstTokenTime - this.runStartTime;\n\n      const agioEvent = AgioEvent.createEvent('agent_ttft', this.sessionId, {\n        runId: this.runId,\n        modelName: this.modelName,\n        ttftMs,\n      });\n\n      await this.queueEvent(agioEvent);\n    }\n  }\n\n  /**\n   * Handle tool call events\n   */\n  private async handleToolCall(event: AgentEventStream.ToolCallEvent): Promise<void> {\n    // Sanitize arguments to remove sensitive data\n    const sanitizedArgs = this.sanitizeArguments(event.arguments);\n\n    const agioEvent = AgioEvent.createEvent('tool_call', this.sessionId, {\n      runId: this.runId,\n      toolName: event.name,\n      toolCallId: event.toolCallId,\n      arguments: sanitizedArgs,\n      argumentsSize: JSON.stringify(event.arguments).length,\n      mcpServer: this.extractMCPServer(event.name),\n    });\n\n    await this.queueEvent(agioEvent);\n  }\n\n  /**\n   * Handle tool result events\n   */\n  private async handleToolResult(event: AgentEventStream.ToolResultEvent): Promise<void> {\n    const agioEvent = AgioEvent.createEvent('tool_result', this.sessionId, {\n      runId: this.runId,\n      toolName: event.name,\n      toolCallId: event.toolCallId,\n      executionTimeMs: event.elapsedMs || 0,\n      successful: !event.error,\n      resultSize: this.calculateResultSize(event.content),\n      contentType: this.determineContentType(event.content),\n    });\n\n    await this.queueEvent(agioEvent);\n  }\n\n  /**\n   * Handle loop start events\n   */\n  private async handleLoopStart(): Promise<void> {\n    this.currentIteration++;\n    this.loopStartTimes.set(this.currentIteration, Date.now());\n\n    const agioEvent = AgioEvent.createEvent('agent_loop_start', this.sessionId, {\n      runId: this.runId,\n      iteration: this.currentIteration,\n    });\n\n    await this.queueEvent(agioEvent);\n  }\n\n  /**\n   * Handle loop end events\n   */\n  private async handleLoopEnd(event: AgentEventStream.AssistantMessageEvent): Promise<void> {\n    const startTime = this.loopStartTimes.get(this.currentIteration);\n    if (!startTime) return;\n\n    const durationMs = Date.now() - startTime;\n\n    const agioEvent = AgioEvent.createEvent('agent_loop_end', this.sessionId, {\n      runId: this.runId,\n      iteration: this.currentIteration,\n      durationMs,\n    });\n\n    await this.queueEvent(agioEvent);\n    this.loopStartTimes.delete(this.currentIteration);\n  }\n\n  /**\n   * Queues an AGIO event for batch sending.\n   * The actual sending is handled by the AgioBatchProcessor.\n   * @param event The AGIO event to queue.\n   */\n  protected queueEvent(event: AgioEvent.ExtendedEvent): void {\n    this.batchProcessor.addEvent(event);\n  }\n\n  /**\n   * Sanitize tool arguments to remove sensitive data\n   */\n  private sanitizeArguments(args: Record<string, any>): Record<string, any> {\n    if (!args || typeof args !== 'object') {\n      return {};\n    }\n\n    const sanitized: Record<string, any> = {};\n    const sensitiveKeys = ['password', 'token', 'key', 'secret', 'apikey', 'auth'];\n\n    for (const [key, value] of Object.entries(args)) {\n      const keyLower = key.toLowerCase();\n      if (sensitiveKeys.some((sensitive) => keyLower.includes(sensitive))) {\n        sanitized[key] = '[REDACTED]';\n      } else if (typeof value === 'string' && value.length > 1000) {\n        sanitized[key] = value.substring(0, 100) + '...[TRUNCATED]';\n      } else {\n        sanitized[key] = value;\n      }\n    }\n\n    return sanitized;\n  }\n\n  /**\n   * Extract MCP server name from tool name\n   * FIXME: using a better solution to detect mcp server name.\n   */\n  private extractMCPServer(toolName: string): string | undefined {\n    if (toolName.startsWith('browser_')) return 'browser';\n    if (toolName.startsWith('filesystem_')) return 'filesystem';\n    if (toolName === 'web_search') return 'search';\n    if (toolName.startsWith('commands_')) return 'commands';\n    return undefined;\n  }\n\n  /**\n   * Calculate the size of tool result content\n   */\n  private calculateResultSize(content: any): number {\n    if (!content) return 0;\n\n    try {\n      return JSON.stringify(content).length;\n    } catch {\n      return String(content).length;\n    }\n  }\n\n  /**\n   * Determine the content type of tool result\n   */\n  private determineContentType(content: any): string {\n    if (!content) return 'empty';\n    if (typeof content === 'string') return 'text';\n    if (Array.isArray(content)) return 'array';\n    if (typeof content === 'object') return 'object';\n    return 'unknown';\n  }\n\n  /**\n   * Flushes any buffered events to the provider.\n   * This should be called during cleanup to ensure no events are lost.\n   */\n  public async cleanup(): Promise<void> {\n    await this.batchProcessor.flush();\n  }\n}"],"names":["AgioProvider","_this_appConfig_model","toolsCount","modelProviders","modelProvidersCount","Array","mcpServersConfig","mcpServersCount","Object","_this_appConfig_browser","_this_appConfig_thinking","_this_appConfig_snapshot","resolvedModel","counts","event","AgioEvent","Boolean","error","console","input","part","_event_runOptions","_event_runOptions1","_event_runOptions2","Date","undefined","isMultimodalInput","agioEvent","executionTimeMs","successful","AgentStatus","isError","ttftMs","sanitizedArgs","JSON","startTime","durationMs","args","sanitized","sensitiveKeys","key","value","keyLower","sensitive","toolName","content","String","providerUrl","appConfig","sessionId","agent","Map","AgioBatchProcessor"],"mappings":"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"}