{"version":3,"file":"core/SocketHandlers.mjs","sources":["webpack://@agent-tars/server/./src/core/SocketHandlers.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 { Socket } from 'socket.io';\nimport { Server as SocketIOServer } from 'socket.io';\nimport http from 'http';\nimport { AgentTARSServer } from '../server';\nimport { handleAgentError } from '../utils/error-handler';\n\n/**\n * Setup WebSocket functionality for the server\n * @param httpServer HTTP server instance\n * @param server AgentTARSServer instance\n * @returns Configured Socket.IO server\n */\nexport function setupSocketIO(httpServer: http.Server, server: AgentTARSServer): SocketIOServer {\n  const io = new SocketIOServer(httpServer, {\n    cors: {\n      origin: '*',\n      methods: ['GET', 'POST'],\n    },\n  });\n\n  // Register connection handler\n  io.on('connection', (socket) => {\n    SocketHandlers.handleConnection(socket, server);\n  });\n\n  return io;\n}\n\n/**\n * SocketHandlers - Event handlers for WebSocket connections\n *\n * Manages all socket events including:\n * - Connection/disconnection\n * - Session joining\n * - Query sending\n * - Query aborting\n */\nexport class SocketHandlers {\n  /**\n   * Handle client connection\n   */\n  static handleConnection(socket: Socket, server: AgentTARSServer) {\n    console.log('Client connected:', socket.id);\n\n    // Register event handlers\n    socket.on('ping', (callback) => {\n      if (typeof callback === 'function') {\n        callback();\n      }\n    });\n\n    socket.on('join-session', (sessionId) => {\n      SocketHandlers.handleJoinSession(socket, server, sessionId);\n    });\n\n    socket.on('send-query', async ({ sessionId, query }) => {\n      await SocketHandlers.handleSendQuery(socket, server, sessionId, query);\n    });\n\n    socket.on('abort-query', async ({ sessionId }) => {\n      await SocketHandlers.handleAbortQuery(socket, server, sessionId);\n    });\n\n    socket.on('disconnect', () => {\n      console.log('Client disconnected:', socket.id);\n    });\n  }\n\n  /**\n   * Handle session joining\n   */\n  static handleJoinSession(socket: Socket, server: AgentTARSServer, sessionId: string) {\n    if (server.sessions[sessionId]) {\n      socket.join(sessionId);\n      console.log(`Client ${socket.id} joined session ${sessionId}`);\n\n      // Subscribe to session's event stream\n      const eventHandler = (eventType: string, data: any) => {\n        socket.emit('agent-event', { type: eventType, data });\n      };\n\n      // Send initial status update immediately after joining\n      const initialStatus = {\n        isProcessing: server.sessions[sessionId].getProcessingStatus(),\n        state: server.sessions[sessionId].agent.status(),\n      };\n      socket.emit('agent-status', initialStatus);\n\n      server.sessions[sessionId].eventBridge.subscribe(eventHandler);\n\n      socket.on('disconnect', () => {\n        if (server.sessions[sessionId]) {\n          server.sessions[sessionId].eventBridge.unsubscribe(eventHandler);\n        }\n      });\n    } else {\n      socket.emit('error', 'Session not found');\n    }\n  }\n\n  /**\n   * Handle sending a query\n   */\n  static async handleSendQuery(\n    socket: Socket,\n    server: AgentTARSServer,\n    sessionId: string,\n    query: string,\n  ) {\n    if (server.sessions[sessionId]) {\n      try {\n        // Use enhanced error handling in runQuery\n        const response = await server.sessions[sessionId].runQuery(query);\n        \n        if (!response.success && response.error) {\n          socket.emit('error', response.error.message);\n        }\n      } catch (error) {\n        // This should never happen with the new error handling\n        const handledError = handleAgentError(error);\n        console.error('Unexpected error in socket query:', handledError);\n        socket.emit('error', handledError.message);\n      }\n    } else {\n      socket.emit('error', 'Session not found');\n    }\n  }\n\n  /**\n   * Handle aborting a query\n   */\n  static async handleAbortQuery(socket: Socket, server: AgentTARSServer, sessionId: string) {\n    if (server.sessions[sessionId]) {\n      try {\n        const aborted = await server.sessions[sessionId].abortQuery();\n        socket.emit('abort-result', { success: aborted });\n      } catch (error) {\n        console.error('Error aborting query:', error);\n        socket.emit('error', 'Failed to abort query');\n      }\n    } else {\n      socket.emit('error', 'Session not found');\n    }\n  }\n}"],"names":["setupSocketIO","httpServer","server","io","SocketIOServer","socket","SocketHandlers","console","callback","sessionId","query","eventHandler","eventType","data","initialStatus","response","error","handledError","handleAgentError","aborted"],"mappings":";;;;;;AAkBO,SAASA,cAAcC,UAAuB,EAAEC,MAAuB;IAC5E,MAAMC,KAAK,IAAIC,OAAeH,YAAY;QACxC,MAAM;YACJ,QAAQ;YACR,SAAS;gBAAC;gBAAO;aAAO;QAC1B;IACF;IAGAE,GAAG,EAAE,CAAC,cAAc,CAACE;QACnBC,eAAe,gBAAgB,CAACD,QAAQH;IAC1C;IAEA,OAAOC;AACT;AAWO,MAAMG;IAIX,OAAO,iBAAiBD,MAAc,EAAEH,MAAuB,EAAE;QAC/DK,QAAQ,GAAG,CAAC,qBAAqBF,OAAO,EAAE;QAG1CA,OAAO,EAAE,CAAC,QAAQ,CAACG;YACjB,IAAI,AAAoB,cAApB,OAAOA,UACTA;QAEJ;QAEAH,OAAO,EAAE,CAAC,gBAAgB,CAACI;YACzBH,eAAe,iBAAiB,CAACD,QAAQH,QAAQO;QACnD;QAEAJ,OAAO,EAAE,CAAC,cAAc,OAAO,EAAEI,SAAS,EAAEC,KAAK,EAAE;YACjD,MAAMJ,eAAe,eAAe,CAACD,QAAQH,QAAQO,WAAWC;QAClE;QAEAL,OAAO,EAAE,CAAC,eAAe,OAAO,EAAEI,SAAS,EAAE;YAC3C,MAAMH,eAAe,gBAAgB,CAACD,QAAQH,QAAQO;QACxD;QAEAJ,OAAO,EAAE,CAAC,cAAc;YACtBE,QAAQ,GAAG,CAAC,wBAAwBF,OAAO,EAAE;QAC/C;IACF;IAKA,OAAO,kBAAkBA,MAAc,EAAEH,MAAuB,EAAEO,SAAiB,EAAE;QACnF,IAAIP,OAAO,QAAQ,CAACO,UAAU,EAAE;YAC9BJ,OAAO,IAAI,CAACI;YACZF,QAAQ,GAAG,CAAC,CAAC,OAAO,EAAEF,OAAO,EAAE,CAAC,gBAAgB,EAAEI,WAAW;YAG7D,MAAME,eAAe,CAACC,WAAmBC;gBACvCR,OAAO,IAAI,CAAC,eAAe;oBAAE,MAAMO;oBAAWC;gBAAK;YACrD;YAGA,MAAMC,gBAAgB;gBACpB,cAAcZ,OAAO,QAAQ,CAACO,UAAU,CAAC,mBAAmB;gBAC5D,OAAOP,OAAO,QAAQ,CAACO,UAAU,CAAC,KAAK,CAAC,MAAM;YAChD;YACAJ,OAAO,IAAI,CAAC,gBAAgBS;YAE5BZ,OAAO,QAAQ,CAACO,UAAU,CAAC,WAAW,CAAC,SAAS,CAACE;YAEjDN,OAAO,EAAE,CAAC,cAAc;gBACtB,IAAIH,OAAO,QAAQ,CAACO,UAAU,EAC5BP,OAAO,QAAQ,CAACO,UAAU,CAAC,WAAW,CAAC,WAAW,CAACE;YAEvD;QACF,OACEN,OAAO,IAAI,CAAC,SAAS;IAEzB;IAKA,aAAa,gBACXA,MAAc,EACdH,MAAuB,EACvBO,SAAiB,EACjBC,KAAa,EACb;QACA,IAAIR,OAAO,QAAQ,CAACO,UAAU,EAC5B,IAAI;YAEF,MAAMM,WAAW,MAAMb,OAAO,QAAQ,CAACO,UAAU,CAAC,QAAQ,CAACC;YAE3D,IAAI,CAACK,SAAS,OAAO,IAAIA,SAAS,KAAK,EACrCV,OAAO,IAAI,CAAC,SAASU,SAAS,KAAK,CAAC,OAAO;QAE/C,EAAE,OAAOC,OAAO;YAEd,MAAMC,eAAeC,iBAAiBF;YACtCT,QAAQ,KAAK,CAAC,qCAAqCU;YACnDZ,OAAO,IAAI,CAAC,SAASY,aAAa,OAAO;QAC3C;aAEAZ,OAAO,IAAI,CAAC,SAAS;IAEzB;IAKA,aAAa,iBAAiBA,MAAc,EAAEH,MAAuB,EAAEO,SAAiB,EAAE;QACxF,IAAIP,OAAO,QAAQ,CAACO,UAAU,EAC5B,IAAI;YACF,MAAMU,UAAU,MAAMjB,OAAO,QAAQ,CAACO,UAAU,CAAC,UAAU;YAC3DJ,OAAO,IAAI,CAAC,gBAAgB;gBAAE,SAASc;YAAQ;QACjD,EAAE,OAAOH,OAAO;YACdT,QAAQ,KAAK,CAAC,yBAAyBS;YACvCX,OAAO,IAAI,CAAC,SAAS;QACvB;aAEAA,OAAO,IAAI,CAAC,SAAS;IAEzB;AACF"}