{"version":3,"file":"server.mjs","sources":["webpack://@agent-tars/server/./src/server.ts"],"sourcesContent":["/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport express from 'express';\nimport http from 'http';\nimport { setupAPI } from './api';\nimport { setupSocketIO } from './core/SocketHandlers';\nimport { StorageProvider, createStorageProvider } from './storage';\nimport { Server as SocketIOServer } from 'socket.io';\nimport { LogLevel } from '@agent-tars/core';\nimport type { AgentTARSAppConfig, AgioProviderImpl } from './types';\nimport type { AgentSession } from './core';\n\nexport { express };\n\n/**\n * Server injection options for dependency injection\n */\nexport interface ServerInjectionOptions {\n  /** Custom AGIO provider implementation */\n  agioProvider?: AgioProviderImpl;\n}\n\n/**\n * AgentTARSServer - Main server class for Agent TARS\n *\n * This class orchestrates all server components including:\n * - Express application and HTTP server\n * - API endpoints\n * - WebSocket communication\n * - Session management\n * - Storage integration\n * - AGIO monitoring integration\n */\nexport class AgentTARSServer {\n  // Core server components\n  private app: express.Application;\n  private server: http.Server;\n  private io: SocketIOServer; // Socket.IO server\n\n  // Server state\n  private isRunning = false;\n\n  // Session management\n  public sessions: Record<string, AgentSession> = {};\n  public storageUnsubscribes: Record<string, () => void> = {};\n\n  // Dependency injection\n  private customAgioProvider?: AgioProviderImpl;\n\n  // Configuration\n  public readonly port: number;\n  public readonly workspacePath?: string;\n  public readonly isDebug: boolean;\n  public readonly storageProvider: StorageProvider | null = null;\n  public readonly appConfig: Required<AgentTARSAppConfig>;\n\n  constructor(appConfig: Required<AgentTARSAppConfig>, injectionOptions?: ServerInjectionOptions) {\n    // Initialize options\n    this.appConfig = appConfig;\n    this.port = appConfig.server.port ?? 3000;\n    this.workspacePath = appConfig.workspace?.workingDirectory;\n    this.isDebug = appConfig.logLevel === LogLevel.DEBUG;\n\n    // Store injection options\n    this.customAgioProvider = injectionOptions?.agioProvider;\n\n    // Initialize Express app and HTTP server\n    this.app = express();\n    this.server = http.createServer(this.app);\n\n    // Initialize storage if provided\n    if (appConfig.server.storage) {\n      this.storageProvider = createStorageProvider(appConfig.server.storage);\n    }\n\n    // Setup API routes and middleware\n    setupAPI(this.app);\n\n    // Setup WebSocket functionality\n    this.io = setupSocketIO(this.server, this);\n\n    // Make server instance available to request handlers\n    this.app.locals.server = this;\n  }\n\n  /**\n   * Get the custom AGIO provider if injected\n   * @returns Custom AGIO provider or undefined\n   */\n  getCustomAgioProvider(): AgioProviderImpl | undefined {\n    return this.customAgioProvider;\n  }\n\n  /**\n   * Get the Express application instance\n   * @returns Express application\n   */\n  getApp(): express.Application {\n    return this.app;\n  }\n\n  /**\n   * Get the HTTP server instance\n   * @returns HTTP server\n   */\n  getHttpServer(): http.Server {\n    return this.server;\n  }\n\n  /**\n   * Get the Socket.IO server instance\n   * @returns Socket.IO server\n   */\n  getSocketIOServer(): SocketIOServer {\n    return this.io;\n  }\n\n  /**\n   * Check if the server is currently running\n   * @returns True if server is running\n   */\n  isServerRunning(): boolean {\n    return this.isRunning;\n  }\n\n  /**\n   * Get storage information if available\n   * @returns Object containing storage type and path (if applicable)\n   */\n  getStorageInfo(): { type: string; path?: string } {\n    if (!this.storageProvider) {\n      return { type: 'none' };\n    }\n\n    if (this.storageProvider.constructor.name === 'FileStorageProvider') {\n      return {\n        type: 'file',\n        path: this.storageProvider.dbPath,\n      };\n    }\n\n    if (this.storageProvider.constructor.name === 'SQLiteStorageProvider') {\n      return {\n        type: 'sqlite',\n        path: this.storageProvider.dbPath,\n      };\n    }\n\n    // For other storage types\n    return {\n      type: this.storageProvider.constructor.name.replace('StorageProvider', '').toLowerCase(),\n    };\n  }\n\n  /**\n   * Start the server on the configured port\n   * @returns Promise resolving with the server instance\n   */\n  async start(): Promise<http.Server> {\n    // Initialize storage if available\n    if (this.storageProvider) {\n      try {\n        await this.storageProvider.initialize();\n      } catch (error) {\n        console.error('Failed to initialize storage provider:', error);\n      }\n    }\n\n    return new Promise((resolve) => {\n      this.server.listen(this.port, () => {\n        // console.log(`🚀 Agent TARS Server is running at http://localhost:${this.port}`);\n        this.isRunning = true;\n        resolve(this.server);\n      });\n    });\n  }\n\n  /**\n   * Stop the server and clean up all resources\n   * @returns Promise resolving when server is stopped\n   */\n  async stop(): Promise<void> {\n    // Clean up all active sessions\n    const sessionCleanup = Object.values(this.sessions).map((session) => session.cleanup());\n    await Promise.all(sessionCleanup);\n\n    // Clean up all storage unsubscribes\n    Object.values(this.storageUnsubscribes).forEach((unsubscribe) => unsubscribe());\n    this.storageUnsubscribes = {};\n\n    // Clear sessions\n    this.sessions = {};\n\n    // Close storage provider\n    if (this.storageProvider) {\n      await this.storageProvider.close();\n    }\n\n    // Close server if running\n    if (this.isRunning) {\n      return new Promise((resolve, reject) => {\n        this.server.close((err) => {\n          if (err) {\n            reject(err);\n            return;\n          }\n\n          this.isRunning = false;\n          console.log('Server stopped');\n          resolve();\n        });\n      });\n    }\n\n    return Promise.resolve();\n  }\n}\n"],"names":["AgentTARSServer","error","console","Promise","resolve","sessionCleanup","Object","session","unsubscribe","reject","err","appConfig","injectionOptions","_appConfig_workspace","LogLevel","express","http","createStorageProvider","setupAPI","setupSocketIO"],"mappings":"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"}