{"version":3,"file":"core/AgentSession.mjs","sources":["webpack://@agent-tars/server/./src/core/AgentSession.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 path from 'path';\nimport {\n  AgentTARS,\n  AgentEventStream,\n  AgentStatus,\n  AgioProviderImpl,\n  ChatCompletionContentPart,\n} from '@agent-tars/core';\nimport { AgentSnapshot } from '@multimodal/agent-snapshot';\nimport { EventStreamBridge } from '../utils/event-stream';\nimport { AgioProvider as DefaultAgioProviderImpl } from './AgioProvider';\nimport type { AgentTARSServer } from '../server';\nimport { AgioEvent } from '@multimodal/agio';\nimport { handleAgentError, ErrorWithCode } from '../utils/error-handler';\n\n/**\n * Response type for agent query execution\n */\nexport interface AgentQueryResponse<T = any> {\n  success: boolean;\n  result?: T;\n  error?: {\n    code: string;\n    message: string;\n    details?: Record<string, any>;\n  };\n}\n\n/**\n * AgentSession - Represents a single agent execution context\n *\n * Responsible for:\n * - Managing an AgentTARS instance and its lifecycle\n * - Connecting agent events to clients via EventStreamBridge\n * - Handling queries and interactions with the agent\n * - Persisting events to storage\n * - Collecting AGIO monitoring events if configured\n */\n\nexport class AgentSession {\n  id: string;\n  agent: AgentTARS;\n  eventBridge: EventStreamBridge;\n  private unsubscribe: (() => void) | null = null;\n  private agioProvider?: AgioEvent.AgioProvider;\n\n  constructor(\n    private server: AgentTARSServer,\n    sessionId: string,\n    agioProviderImpl?: AgioProviderImpl,\n  ) {\n    this.id = sessionId;\n    this.eventBridge = new EventStreamBridge();\n\n    const { appConfig } = server;\n    const { workspace, server: appServerConfig } = appConfig;\n\n    // Initialize agent with merged config\n    const agent = new AgentTARS(server.appConfig);\n\n    // Initialize agent snapshot if enabled\n    if (appConfig.snapshot?.enable) {\n      const snapshotPath =\n        appConfig.snapshot.snapshotPath || path.join(workspace!.workingDirectory!, 'snapshots');\n      this.agent = new AgentSnapshot(agent, {\n        snapshotPath,\n        snapshotName: sessionId,\n      }) as unknown as AgentTARS;\n\n      agent.logger.debug(`AgentSnapshot initialized with path: ${snapshotPath}`);\n    } else {\n      this.agent = agent;\n    }\n\n    // Initialize AGIO collector if provider URL is configured\n    if (appConfig.agio?.provider) {\n      const impl = agioProviderImpl ?? DefaultAgioProviderImpl;\n      this.agioProvider = new impl(appConfig.agio?.provider, appConfig, sessionId, agent);\n      agent.logger.debug(`AGIO collector initialized with provider: ${appConfig.agio.provider}`);\n    }\n\n    agent.logger.info('Agent Config', JSON.stringify(agent.getOptions(), null, 2));\n  }\n\n  /**\n   * Get the current processing status of the agent\n   * @returns Whether the agent is currently processing a request\n   */\n  getProcessingStatus(): boolean {\n    return this.agent.status() === AgentStatus.EXECUTING;\n  }\n\n  async initialize() {\n    await this.agent.initialize();\n\n    // Send agent initialization event to AGIO if configured\n    if (this.agioProvider) {\n      try {\n        await this.agioProvider.sendAgentInitialized();\n      } catch (error) {\n        console.error('Failed to send AGIO initialization event:', error);\n      }\n    }\n\n    // Connect to agent's event stream manager\n    const agentEventStream = this.agent.getEventStream();\n\n    // Create an event handler that saves events to storage and processes AGIO events\n    const handleEvent = async (event: AgentEventStream.Event) => {\n      // If we have storage, save the event\n      if (this.server.storageProvider) {\n        try {\n          await this.server.storageProvider.saveEvent(this.id, event);\n        } catch (error) {\n          console.error(`Failed to save event to storage: ${error}`);\n        }\n      }\n\n      // Process AGIO events if collector is configured\n      if (this.agioProvider) {\n        try {\n          await this.agioProvider.processAgentEvent(event);\n        } catch (error) {\n          console.error('Failed to process AGIO event:', error);\n        }\n      }\n    };\n\n    // Subscribe to events for storage and AGIO processing\n    const storageUnsubscribe = agentEventStream.subscribe(handleEvent);\n\n    // Connect to event bridge for client communication\n    this.unsubscribe = this.eventBridge.connectToAgentEventStream(agentEventStream);\n\n    // Notify client that session is ready\n    this.eventBridge.emit('ready', { sessionId: this.id });\n\n    return { storageUnsubscribe };\n  }\n\n  /**\n   * Run a query and return a strongly-typed response\n   * This version captures errors and returns structured response objects\n   * @param query The query to process\n   * @returns Structured response with success/error information\n   */\n  async runQuery(query: string | ChatCompletionContentPart[]): Promise<AgentQueryResponse> {\n    try {\n      // Run agent to process the query\n      const result = await this.agent.run({\n        input: query,\n      });\n      return {\n        success: true,\n        result,\n      };\n    } catch (error) {\n      // Emit error event but don't throw\n      this.eventBridge.emit('error', {\n        message: error instanceof Error ? error.message : String(error),\n      });\n\n      // Handle error and return structured response\n      const handledError = handleAgentError(error, `Session ${this.id}`);\n\n      return {\n        success: false,\n        error: {\n          code: handledError.code,\n          message: handledError.message,\n          details: handledError.details,\n        },\n      };\n    }\n  }\n\n  /**\n   * Execute a streaming query with robust error handling\n   * @param query The query to process in streaming mode\n   * @returns AsyncIterable of events or error response\n   */\n  async runQueryStreaming(\n    query: string | ChatCompletionContentPart[],\n  ): Promise<AsyncIterable<AgentEventStream.Event>> {\n    try {\n      // Run agent in streaming mode\n      return await this.agent.run({\n        input: query,\n        stream: true,\n      });\n    } catch (error) {\n      // Emit error event\n      this.eventBridge.emit('error', {\n        message: error instanceof Error ? error.message : String(error),\n      });\n\n      // Handle error and return a synthetic event stream with the error\n      const handledError = handleAgentError(error, `Session ${this.id} (streaming)`);\n\n      // Create a synthetic event stream that yields just an error event\n      return this.createErrorEventStream(handledError);\n    }\n  }\n\n  /**\n   * Create a synthetic event stream containing an error event\n   * This allows streaming endpoints to handle errors gracefully\n   */\n  private async *createErrorEventStream(\n    error: ErrorWithCode,\n  ): AsyncIterable<AgentEventStream.Event> {\n    yield this.agent.getEventStream().createEvent('system', {\n      level: 'error',\n      message: error.message,\n      details: {\n        errorCode: error.code,\n        details: error.details,\n      },\n    });\n  }\n\n  /**\n   * Abort the currently running query\n   * @returns True if the agent was running and aborted successfully\n   */\n  async abortQuery(): Promise<boolean> {\n    try {\n      const aborted = this.agent.abort();\n      if (aborted) {\n        this.eventBridge.emit('aborted', { sessionId: this.id });\n      }\n      return aborted;\n    } catch (error) {\n      this.eventBridge.emit('error', {\n        message: error instanceof Error ? error.message : String(error),\n      });\n      return false;\n    }\n  }\n\n  async cleanup() {\n    // Unsubscribe from event stream\n    if (this.unsubscribe) {\n      this.unsubscribe();\n      this.unsubscribe = null;\n    }\n\n    // Clean up agent resources\n    await this.agent.cleanup();\n\n    if (this.agioProvider) {\n      // This ensures that all buffered analytics events are sent before the session is terminated.\n      await this.agioProvider.cleanup?.();\n    }\n\n    this.eventBridge.emit('closed', { sessionId: this.id });\n  }\n}\n\nexport default AgentSession;\n"],"names":["AgentSession","AgentStatus","error","console","agentEventStream","handleEvent","event","storageUnsubscribe","query","result","Error","String","handledError","handleAgentError","aborted","_this_agioProvider","server","sessionId","agioProviderImpl","_appConfig_snapshot","_appConfig_agio","EventStreamBridge","appConfig","workspace","appServerConfig","agent","AgentTARS","snapshotPath","path","AgentSnapshot","_appConfig_agio1","impl","DefaultAgioProviderImpl","JSON"],"mappings":"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"}