import{randomUUID as e}from"crypto";import{FastMCP as r}from"fastmcp";import{WebSocketServer as o}from"ws";import{config as t}from"./config.js";import s from"./logger.js";import{launchBrowserTool as a,listBrowsersTool as n,detectOpenBrowsersTool as i,connectExternalBrowserTool as c,closeBrowserTool as l,listTabsTool as d,selectTabTool as p,newTabTool as u,closeTabTool as m,navigateTool as f,screenshotTool as h,clickTool as E,typeTextTool as S,waitForTool as g,getHtmlTool as y,getConsoleLogsTool as T,evaluateScriptTool as v,listExternalBrowserTabsTool as P,browserSnapshotTool as b}from"./tools/browserTools.js";import{pdfTools as N}from"./tools/pdfTools.js";import{visionTools as O}from"./tools/visionTools.js";import{CapabilityManager as w,createCapabilityManagerFromArgs as C,Capability as I}from"./capabilities/index.js";import{getErrDetails as x}from"./utils/errorUtils.js";export const authHandler=async r=>{const o=r.headers["x-forwarded-for"]?.split(",")[0].trim()||r.socket?.remoteAddress||"unknown",t=s.child({clientIp:o,op:"auth"}),a={id:e(),type:"None",authenticatedAt:Date.now(),clientIp:o,"~standard":{parameters:{},context:{}}};return t.info({authId:a.id},"Authentification désactivée."),a};export async function applicationEntryPoint(){s.info(`Démarrage du serveur en mode ${t.NODE_ENV}...`);const e=new w,j=process.argv.slice(2),D=C(j),R=D.getEnabledCapabilities().length>0?D:e,M=new r({name:"MCP-Server-Production",version:"2.1.0",authenticate:authHandler,instructions:"Serveur MCP amélioré avec catégories d'outils et capacités modulaires. Support PDF, Vision, Performance, Réseau. Transport HTTP Stream.",health:{enabled:!0,path:t.HEALTH_CHECK_PATH,message:"Server is healthy and ready."},ping:{enabled:!0,intervalMs:15e3,logLevel:t.LOG_LEVEL||"info"},roots:{enabled:!1}}),A=[a,n,i,c,l,d,p,u,m,f,h,E,S,g,y,T,v,P,b];A.forEach(e=>M.addTool(e));const H=[...A];R.isCapabilityEnabled(I.PDF)&&(N.forEach(e=>{M.addTool(e)}),H.push(...N),s.info("Capacité PDF activée - Outils PDF enregistrés")),R.isCapabilityEnabled(I.VISION)&&(O.forEach(e=>M.addTool(e)),H.push(...O),s.info("Capacité Vision activée - Outils de vision enregistrés"));const k=H;s.info({tools:k.map(e=>e.name),totalTools:k.length},"Outils enregistrés avec succès."),M.on("connect",e=>{s.info("Nouvelle session client établie.")}),M.on("disconnect",e=>{s.warn({reason:e.reason||"Non spécifiée"},"Session client déconnectée.")});new o({port:8084}).on("connection",e=>{s.info("🔗 Extension connectée au WebSocket relay"),e.on("message",async r=>{try{const o=JSON.parse(r.toString());if(s.debug({data:o},"Message reçu de l'extension"),"forwardCDPCommand"===o.method)try{const r=await fetch(`http://localhost:9222${o.params.sessionId||""}/cmd/${o.params.method}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o.params.params||{})}),t=await r.json();e.send(JSON.stringify({id:o.id,result:t}))}catch(r){s.error({err:x(r)},"Erreur lors du transfert CDP"),e.send(JSON.stringify({id:o.id,error:r.message}))}else if("attachToTab"===o.method)try{const r=await fetch("http://localhost:9222/json/list"),t=await r.json();e.send(JSON.stringify({id:o.id,result:{targetInfo:t[0]||null,allTabs:t}}))}catch(r){s.error({err:x(r)},"Erreur lors de la récupération des onglets"),e.send(JSON.stringify({id:o.id,error:r.message}))}}catch(e){s.error({err:x(e)},"Erreur de traitement du message WebSocket")}}),e.on("close",()=>{s.info("Extension déconnectée du WebSocket relay")}),e.on("error",e=>{s.error({err:x(e)},"Erreur WebSocket")})}),s.info("🌐 WebSocket relay démarré sur ws://localhost:8084");try{await M.start({transportType:"httpStream",httpStream:{port:t.PORT,endpoint:"/mcp"}}),s.info(`🚀 Serveur FastMCP démarré en mode HTTP Stream par défaut sur http://localhost:${t.PORT}/mcp (SSE: /sse)`),s.info("📡 Extension Brave: connectez-vous à ws://localhost:8084 pour la communication CDP")}catch(e){s.fatal({err:x(e)},"Échec critique lors du démarrage du serveur."),process.exit(1)}const J=async e=>{s.warn(`Signal ${e} reçu. Arrêt propre du serveur...`);try{await M.stop(),s.info("Serveur FastMCP arrêté avec succès.")}catch(e){s.error({err:x(e)},"Erreur lors de l'arrêt du serveur.")}finally{process.exit(0)}};process.on("SIGTERM",()=>J("SIGTERM")),process.on("SIGINT",()=>J("SIGINT"))}process.on("uncaughtException",(e,r)=>{s.fatal({err:x(e),origin:r},"EXCEPTION NON CAPTURÉE. Arrêt forcé."),"test"!==t.NODE_ENV&&process.exit(1)}),process.on("unhandledRejection",e=>{s.error({reason:x(e)},"REJET DE PROMESSE NON GÉRÉ.")}),applicationEntryPoint();