@decocms/mesh 2.43.1 → 2.43.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1303,7 +1303,7 @@ ${await G.text()}`);return{stream:ds6(G),response:{headers:Object.fromEntries(G.
1303
1303
  `),J=[X.event&&`event: ${X.event}`,Q,X.id&&`id: ${X.id}`,X.retry&&`retry: ${X.retry}`].filter(Boolean).join(`
1304
1304
  `)+`
1305
1305
 
1306
- `;await this.write(J)}},ss6=new WeakMap});var Nz1=S(()=>{ef();W50()});var W50=S(()=>{Bz1();Dz1();Nz1()});function t7(X,Y="invalid_request_error",Q=null,J=null){return{error:{message:X,type:Y,param:Q,code:J}}}function $t6(X){let Y=X.indexOf(":");if(Y===-1)return null;let Q=X.substring(0,Y),J=X.substring(Y+1);if(!Q||!J)return null;return{connectionId:Q,modelId:J}}function Kt6(X,Y,Q){try{return JSON.parse(X)}catch{throw new Oz1(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Y}): ${X}`)}}function Ht6(X){return X.map((Y)=>{switch(Y.role){case"system":return{role:"system",content:Y.content};case"user":if(typeof Y.content==="string")return{role:"user",content:Y.content};return{role:"user",content:Y.content.map((Q)=>{if(Q.type==="text")return{type:"text",text:Q.text};return{type:"image",image:Q.image_url.url}})};case"assistant":if(Y.tool_calls&&Y.tool_calls.length>0)return{role:"assistant",content:Y.tool_calls.map((Q)=>({type:"tool-call",toolCallId:Q.id,toolName:Q.function.name,args:Kt6(Q.function.arguments,Q.id,Q.function.name)}))};return{role:"assistant",content:Y.content??""};case"tool":return{role:"tool",content:[{type:"tool-result",toolCallId:Y.tool_call_id,toolName:"",content:Y.content}]}}})}function Ft6(X){let Y=X.map((Q)=>{let J=Q.function.parameters?qG(Q.function.parameters):qG({type:"object",properties:{}});return[Q.function.name,YD({description:Q.function.description,inputSchema:J})]});return Object.fromEntries(Y)}function Vt6(X){if(!X)return;return{openai:{response_format:X}}}function qt6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}async function Ut6(X,Y,Q){let J=await X.storage.connections.findById(Q);if(!J)return null;if(J.organization_id!==Y)return null;if(J.status!=="active")return null;return J}async function Bt6(X,Y){await new aK(X.authInstance,X.auth.user?.id??X.auth.apiKey?.userId,"*",X.boundAuth,X.auth.user?.role,Y).check("*")}var es6,Xt6,Yt6,Qt6,Jt6,Gt6,Wt6,Zt6,Oz1,Lz1,wz1;var Mz1=S(()=>{lf();$D();KG();W50();n0();Zh();eJ0();es6=U.object({type:U.literal("function"),function:U.object({name:U.string(),description:U.string().optional(),parameters:U.record(U.string(),U.unknown()).optional()})}),Xt6=U.object({id:U.string(),type:U.literal("function"),function:U.object({name:U.string(),arguments:U.string()})}),Yt6=U.discriminatedUnion("role",[U.object({role:U.literal("system"),content:U.string(),name:U.string().optional()}),U.object({role:U.literal("user"),content:U.union([U.string(),U.array(U.union([U.object({type:U.literal("text"),text:U.string()}),U.object({type:U.literal("image_url"),image_url:U.object({url:U.string(),detail:U.string().optional()})})]))]),name:U.string().optional()}),U.object({role:U.literal("assistant"),content:U.string().nullable().optional(),name:U.string().optional(),tool_calls:U.array(Xt6).optional()}),U.object({role:U.literal("tool"),content:U.string(),tool_call_id:U.string()})]),Qt6=U.object({type:U.literal("text")}),Jt6=U.object({type:U.literal("json_object")}),Gt6=U.object({type:U.literal("json_schema"),json_schema:U.object({name:U.string(),description:U.string().optional(),schema:U.record(U.string(),U.unknown()),strict:U.boolean().optional()})}),Wt6=U.union([Qt6,Jt6,Gt6]),Zt6=U.object({model:U.string().describe("Format: connection_id:model_id"),messages:U.array(Yt6),stream:U.boolean().optional().default(!1),temperature:U.number().min(0).max(2).optional(),max_tokens:U.number().positive().optional(),top_p:U.number().min(0).max(1).optional(),frequency_penalty:U.number().min(-2).max(2).optional(),presence_penalty:U.number().min(-2).max(2).optional(),stop:U.union([U.string(),U.array(U.string())]).optional(),tools:U.array(es6).optional(),tool_choice:U.union([U.literal("auto"),U.literal("none"),U.literal("required"),U.object({type:U.literal("function"),function:U.object({name:U.string()})})]).optional(),response_format:Wt6.optional(),user:U.string().optional()});Oz1=class Oz1 extends Error{constructor(X){super(X);this.name="MessageConversionError"}};Lz1=new ZX;Lz1.post("/:org/v1/chat/completions",async(X)=>{let Y=X.get("meshContext"),Q=X.req.param("org");try{if(!Y.auth.apiKey?.id)return X.json(t7("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Y.organization)return X.json(t7("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Y.organization.slug??Y.organization.id)!==Q)return X.json(t7("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let J=await X.req.json(),G=Zt6.safeParse(J);if(!G.success){let A=G.error.issues[0]??{message:"Invalid request",path:[]};return X.json(t7(`Invalid request: ${A.message}`,"invalid_request_error",A.path.length>0?A.path.join("."):null),400)}let W=G.data,Z=$t6(W.model);if(!Z)return X.json(t7("Invalid model format. Expected 'connection_id:model_id' (e.g., 'conn_abc123:gpt-4')","invalid_request_error","model"),400);let{connectionId:$,modelId:K}=Z;try{await Bt6(Y,$)}catch{return X.json(t7(`Access denied to connection: ${$}`,"permission_error","model"),403)}let H=await Ut6(Y,Y.organization.id,$);if(!H)return X.json(t7(`Connection not found or inactive: ${$}`,"invalid_request_error","model"),404);let F=await Y.createMCPProxy(H),V=mf.forClient(F),q=bh(V).languageModel(K),B=Ht6(W.messages),D=W.tools?Ft6(W.tools):void 0,N=Vt6(W.response_format),L=qt6(),w=Math.floor(Date.now()/1000),C={model:q,messages:B,tools:D,temperature:W.temperature,maxTokens:W.max_tokens,topP:W.top_p,frequencyPenalty:W.frequency_penalty,presencePenalty:W.presence_penalty,stopSequences:W.stop?Array.isArray(W.stop)?W.stop:[W.stop]:void 0,abortSignal:X.req.raw.signal},T=N?{...C,providerOptions:N}:C;if(W.stream)return G50(X,async(A)=>{try{let P=_h(T),j=!1,R=0,v={};for await(let y of P.fullStream){if(!j&&(y.type==="text-delta"||y.type==="tool-call"))await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),j=!0;if(y.type==="text-delta")await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{content:y.text},finish_reason:null}]})});else if(y.type==="tool-call"){let b=R++;v[y.toolCallId]={index:b,name:y.toolName},await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{tool_calls:[{index:b,id:y.toolCallId,type:"function",function:{name:y.toolName,arguments:JSON.stringify(y.input)}}]},finish_reason:null}]})})}else if(y.type==="finish"){let b=y.finishReason==="tool-calls"?"tool_calls":y.finishReason==="stop"?"stop":y.finishReason==="length"?"length":"stop";await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{},finish_reason:b}],usage:y.totalUsage?{prompt_tokens:y.totalUsage.inputTokens??0,completion_tokens:y.totalUsage.outputTokens??0,total_tokens:y.totalUsage.totalTokens??0}:void 0})})}}await A.writeSSE({data:"[DONE]"})}catch(P){let j=P;console.error("[openai-compat:stream] Error:",j.message),await A.writeSSE({data:JSON.stringify({error:{message:j.message,type:"server_error"}})})}});else{let A=await kh(T),P={role:"assistant",content:A.text||null};if(A.toolCalls&&A.toolCalls.length>0)P.tool_calls=A.toolCalls.map((R)=>({id:R.toolCallId,type:"function",function:{name:R.toolName,arguments:JSON.stringify("input"in R?R.input:{})}})),P.content=null;let j=A.finishReason==="tool-calls"?"tool_calls":A.finishReason==="stop"?"stop":A.finishReason==="length"?"length":"stop";return X.json({id:L,object:"chat.completion",created:w,model:W.model,choices:[{index:0,message:P,finish_reason:j}],usage:{prompt_tokens:A.usage?.inputTokens??0,completion_tokens:A.usage?.outputTokens??0,total_tokens:A.usage?.totalTokens??0}})}}catch(J){let G=J;if(G.name==="AbortError")return X.json(t7("Request aborted","invalid_request_error"),400);if(G.name==="MessageConversionError")return X.json(t7(G.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",G.message,G.stack),X.json(t7(G.message,"server_error"),500)}});wz1=Lz1});var Pz1,Tz1;var Az1=S(()=>{KG();eS();Pz1=new ZX;Pz1.get("/",(X)=>{let Y={theme:Sw0()};return X.json({success:!0,config:Y})});Tz1=Pz1});var Ez1,jz1;var Cz1=S(()=>{KG();EQ0();Ez1=new ZX;Ez1.all("/",async(X)=>{return(await AQ0(X.get("meshContext"))).fetch(X.req.raw)});jz1=Ez1});function Iz1(X){return X===PA.HEALTH||X===PA.METRICS||X.startsWith(KD.WELL_KNOWN)}function Dt6(X){return X.startsWith(KD.API)}function Nt6(X){return X==="/mcp"||X.startsWith(KD.MCP)}function Ot6(X){return X.startsWith(KD.OAUTH_PROXY)}function Lt6(X){return zt6.test(X)}function wt6(X){return X.startsWith(KD.ORG)}function Rz1(X){return Dt6(X)||Nt6(X)||Ot6(X)||wt6(X)||Iz1(X)}function Sz1(X){return X==="/"||X.startsWith(KD.API_AUTH)||Iz1(X)||Lt6(X)}var PA,KD,zt6;var Z50=S(()=>{PA={HEALTH:"/health",METRICS:"/metrics"},KD={API:"/api/",API_AUTH:"/api/auth/",MCP:"/mcp/",OAUTH_PROXY:"/oauth-proxy/",WELL_KNOWN:"/.well-known",ORG:"/org/"},zt6=/\.(html|css|js|ico|svg|png|jpg|jpeg|gif|webp|woff|woff2)$/});var kz1=()=>{};async function Mt6(X,Y){let J=(await X.storage.connections.list(Y)).find((G)=>G.connection_url?.startsWith(WH1));if(!J?.configuration_state)return null;return J.configuration_state.project_locator}function Pt6(X){let Y=new URLSearchParams;if(X){let[Q,J]=X.split("/");if(Q)Y.set("workspace_hint",Q);if(J)Y.set("project_hint",J)}else Y.set("auto_personal","true");return Y.set("force_new","true"),Y}function _z1(X={}){let Y=X.database??jF();if(xh&&xh.isRunning())console.log("[EventBus] Stopping previous worker (HMR cleanup)"),Promise.resolve(xh.stop()).catch(($)=>{console.error("[EventBus] Error stopping previous worker:",$)});let Q;if(X.eventBus)Q=X.eventBus;else Q=VF1(Y);xh=Q;let J=new ZX;J.use("*",mQ0({enabled:($)=>dH1($,"debug")==="1"})),J.use("/*",cH1({origin:($)=>{if($.includes("localhost")||$.includes("127.0.0.1"))return $;return $},credentials:!0,allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization","mcp-protocol-version"]})),J.use("*",oH1()),J.use("*",async($,K)=>{if(await K(),$.res.status>=500){let F=await $.res.clone().text();console.error(`[5xx Response] ${$.req.method} ${$.req.path} - ${$.res.status}:`,F)}}),J.get(PA.HEALTH,($)=>{return $.json({status:"ok",timestamp:new Date().toISOString(),version:"1.0.0"})}),J.get(PA.METRICS,async($)=>{try{let K=await O40.collect(),H=Tt6.serialize(K.resourceMetrics);return $.text(H,200,{"Content-Type":"text/plain; version=0.0.4; charset=utf-8"})}catch(K){return console.error("Failed to collect metrics:",K),$.text("# Error collecting metrics",500)}}),J.route("/api/config",Tz1),J.route("/api/auth/custom",DF1),J.all("/api/auth/*",async($)=>{return await $G.handler($.req.raw)}),J.route("/",g31),J.all("/oauth-proxy/:connectionId/*",async($)=>{let K=$.req.param("connectionId"),H=$.req.path.split("/").filter(Boolean),F=H[H.length-1],V=$.get("meshContext");if(!V)V=await rK.create($.req.raw),$.set("meshContext",V);let q=await V.storage.connections.findById(K);if(!q?.connection_url)return $.json({error:"Connection not found"},404);let B=await Hh(q.connection_url),D,N=new URL(q.connection_url);if(B.ok)D=(await B.json()).authorization_servers?.[0];if(!D)D=N.origin;let L=await GJ0(D);if(!L.ok)return $.json({error:"Failed to get auth server metadata"},502);let w=await L.json(),C;if(F==="authorize")C=w.authorization_endpoint;else if(F==="token")C=w.token_endpoint;else if(F==="register")C=w.registration_endpoint;if(!C)return $.json({error:`Unknown OAuth endpoint: ${F}`},404);let T=new URL(C),A=new URL($.req.url);if(T.search=A.search,F==="authorize"){if(T.searchParams.has("resource"))T.searchParams.set("resource",q.connection_url);if(ZH1(q.connection_url))try{let r=await Mt6(V,q.organization_id),g=Pt6(r);for(let[k,h]of g)T.searchParams.set(k,h)}catch(r){console.warn("[oauth-proxy] Failed to get smart OAuth params, proceeding without:",r)}return $.redirect(T.toString(),302)}let P={Accept:$.req.header("Accept")||"application/json"},j=$.req.header("Content-Type");if(j)P["Content-Type"]=j;let R=$.req.header("Authorization");if(R)P.Authorization=R;let v;if($.req.method!=="GET"&&$.req.method!=="HEAD")if(F==="token"&&j?.includes("application/x-www-form-urlencoded")){let r=await $.req.formData();if(r.has("resource"))r.set("resource",q.connection_url);let g=new URLSearchParams;for(let[k,h]of r.entries())g.append(k,h.toString());v=g.toString()}else v=$.req.raw.body??void 0;let y=await fetch(T.toString(),{method:$.req.method,headers:P,body:v,duplex:"half",redirect:"manual"}),b=new Headers,f=["connection","keep-alive","transfer-encoding","content-encoding","content-length"];for(let[r,g]of y.headers.entries())if(!f.includes(r.toLowerCase()))b.set(r,g);return new Response(y.body,{status:y.status,statusText:y.statusText,headers:b})}),J.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",async($)=>{let H=await At6()($.req.raw),F=await H.json();return Response.json(F,H)});let G=async($)=>{let H=await Et6()($.req.raw),F=await H.json();return Response.json(F,H)};J.get("/.well-known/oauth-authorization-server/*/:gateway?/:connectionId?",G),rK.set(s31({db:Y.db,databaseType:Y.type,auth:$G,encryption:{key:process.env.ENCRYPTION_KEY||""},observability:{tracer:HP,meter:Py},eventBus:Q})),Promise.resolve(Q.start()).then(()=>{console.log("[EventBus] Worker started")}),J.use("*",async($,K)=>{if(Sz1($.req.path))return K();let H={measure:async(V,q)=>{sz($,V);try{return await q()}finally{ZV($,V)}}},F=await rK.create($.req.raw,{timings:H});return $.set("meshContext",F),K()}),J.get("/api/tools/management",($)=>{return $.json({tools:zp,grouped:PO()})}),J.use("/mcp/*",async($,K)=>{sz($,"mcp");try{return await K()}finally{ZV($,"mcp")}});let W=async($,K)=>{let H=$.var.meshContext;if(!H.auth.user?.id&&!H.auth.apiKey?.id){let F=new URL($.req.url);return $.res=new Response(null,{status:401,headers:{"WWW-Authenticate":`Bearer realm="mcp",resource_metadata="${F.origin}${F.pathname}/.well-known/oauth-protected-resource"`}})}return await K()};J.use("/mcp/:connectionId?",W),J.use("/mcp/gateway/:virtualMcpId?",W),J.use("/mcp/virtual-mcp/:virtualMcpId?",W),J.use("/mcp/self",W),J.route("/mcp",_31),J.route("/mcp/self",jz1),J.route("/mcp",i31),J.use("/api/:org/models/*",async($,K)=>{sz($,"llm_models");try{return await K()}finally{ZV($,"llm_models")}}),J.route("/api",X50),J.route("/api",wz1),J.post("/org/:organizationId/events/:type",async($)=>{let K=$.req.param("organizationId");return await $.var.meshContext.eventBus.publish(K,mF.SELF(K),{data:await $.req.json(),type:`public:${$.req.param("type")}`,subject:$.req.query("subject"),deliverAt:$.req.query("deliverAt"),cron:$.req.query("cron")}),$.json({success:!0})}),J.route("/api",qz1);let Z=new lF(process.env.ENCRYPTION_KEY||"");return VW0(Y.db,Z),HW0(J,{db:Y.db,vault:Z}),J.notFound(($)=>{return $.json({error:"Not Found",path:$.req.path},404)}),J.onError(($,K)=>{console.error("Server error :",$);let H=$ instanceof Error?$.message:"Unknown error";return K.json({error:"Internal Server Error",message:H},500)}),J}var vz1,xh=null,Tt6,At6=()=>Er($G),Et6=()=>Ar($G);var yz1=S(()=>{BT();KG();pH1();nH1();sH1();Y31();az();qh();VP();qF1();FP();NF1();Vz1();Uz1();QJ0();Vh();Mz1();WA();Az1();Cz1();Z50();g2();Of();Ir();Dp();kz1();vz1=w6(N40(),1);Tt6=new vz1.PrometheusSerializer});import bz1 from"v8";import{rename as jt6,mkdir as Ct6}from"fs/promises";import{join as It6}from"path";function fz1(X){let{port:Y,hostname:Q="0.0.0.0"}=X;return Bun.serve({port:Y,hostname:Q,fetch:async(J)=>{let G=new URL(J.url);if(G.pathname==="/health")return Response.json({status:"ok",uptime:process.uptime()});if(G.pathname==="/memory")return Response.json({...process.memoryUsage(),uptimeSeconds:process.uptime()});if(G.pathname==="/heap-snapshot"){let W=Date.now();try{let Z=bz1.writeHeapSnapshot(),$=Bun.file(Z);return new Response($,{headers:{"Content-Type":"application/octet-stream","Content-Disposition":`attachment; filename="heap-${W}.heapsnapshot"`}})}catch(Z){return Response.json({error:String(Z)},{status:500})}}if(G.pathname==="/gc"){if(typeof Bun.gc==="function")return Bun.gc(!0),Response.json({status:"gc triggered"});return Response.json({status:"gc not available"},{status:501})}if(G.pathname==="/prestop-hook"){let W=process.env.PRESTOP_HEAP_SNAPSHOT_DIR;if(!W)return Response.json({status:"skipped",reason:"PRESTOP_HEAP_SNAPSHOT_DIR not set"});try{await Ct6(W,{recursive:!0});let Z=bz1.writeHeapSnapshot(),$=process.env.HOSTNAME??process.env.POD_NAME??"unknown",K=new Date().toISOString().replace(/[:.]/g,"-"),H=`${$}-${K}.heapsnapshot`,F=It6(W,H);await jt6(Z,F);let V=process.memoryUsage();return console.log("[prestop-hook] Heap snapshot saved:",F),Response.json({status:"saved",path:F,memory:{rss:V.rss,heapUsed:V.heapUsed,external:V.external}})}catch(Z){return console.error("[prestop-hook] Failed to save heap snapshot:",Z),Response.json({error:String(Z)},{status:500})}}return Response.json({error:"Not found"},{status:404})}})}var hz1=()=>{};var bt6={};var gz1,xz1,Rt6,HD="\x1B[0m",St6="\x1B[1m",uz1="\x1B[2m",kt6="\x1B[32m",mz1="\x1B[36m",lz1="\x1B[4m",vt6,_t6,yt6;var dz1=S(()=>{FP();GH1();yz1();Z50();hz1();gz1=parseInt(process.env.PORT||"3000",10),xz1=parseInt(process.env.DEBUG_PORT||"9090",10),Rt6=process.env.ENABLE_DEBUG_SERVER==="true",vt6=`http://localhost:${gz1}`,_t6=JH1({clientDir:QH1(import.meta.url,"../client"),isServerPath:Rz1}),yt6=_z1();console.log("");console.log(`${kt6}\u2713${HD} ${St6}Ready${HD}`);console.log("");console.log(` ${uz1}Open in browser:${HD} ${mz1}${lz1}${vt6}${HD}`);console.log("");Bun.serve({idleTimeout:0,port:gz1,hostname:"0.0.0.0",fetch:async(X)=>{return await _t6(X)??yt6.fetch(X)},development:!1});if(Rt6)fz1({port:xz1}),console.log(` ${uz1}Debug server:${HD} ${mz1}${lz1}http://localhost:${xz1}${HD}`),console.log("")});import{parseArgs as ft6}from"util";var{values:gh}=ft6({args:process.argv.slice(2),options:{port:{type:"string",short:"p",default:process.env.PORT||"3000"},help:{type:"boolean",short:"h",default:!1},version:{type:"boolean",short:"v",default:!1},"skip-migrations":{type:"boolean",default:!1}},allowPositionals:!0});if(gh.help)console.log(`
1306
+ `;await this.write(J)}},ss6=new WeakMap});var Nz1=S(()=>{ef();W50()});var W50=S(()=>{Bz1();Dz1();Nz1()});function t7(X,Y="invalid_request_error",Q=null,J=null){return{error:{message:X,type:Y,param:Q,code:J}}}function $t6(X){let Y=X.indexOf(":");if(Y===-1)return null;let Q=X.substring(0,Y),J=X.substring(Y+1);if(!Q||!J)return null;return{connectionId:Q,modelId:J}}function Kt6(X,Y,Q){try{return JSON.parse(X)}catch{throw new Oz1(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Y}): ${X}`)}}function Ht6(X){return X.map((Y)=>{switch(Y.role){case"system":return{role:"system",content:Y.content};case"user":if(typeof Y.content==="string")return{role:"user",content:Y.content};return{role:"user",content:Y.content.map((Q)=>{if(Q.type==="text")return{type:"text",text:Q.text};return{type:"image",image:Q.image_url.url}})};case"assistant":if(Y.tool_calls&&Y.tool_calls.length>0)return{role:"assistant",content:Y.tool_calls.map((Q)=>({type:"tool-call",toolCallId:Q.id,toolName:Q.function.name,args:Kt6(Q.function.arguments,Q.id,Q.function.name)}))};return{role:"assistant",content:Y.content??""};case"tool":return{role:"tool",content:[{type:"tool-result",toolCallId:Y.tool_call_id,toolName:"",content:Y.content}]}}})}function Ft6(X){let Y=X.map((Q)=>{let J=Q.function.parameters?qG(Q.function.parameters):qG({type:"object",properties:{}});return[Q.function.name,YD({description:Q.function.description,inputSchema:J})]});return Object.fromEntries(Y)}function Vt6(X){if(!X)return;return{openai:{response_format:X}}}function qt6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}async function Ut6(X,Y,Q){let J=await X.storage.connections.findById(Q);if(!J)return null;if(J.organization_id!==Y)return null;if(J.status!=="active")return null;return J}async function Bt6(X,Y){await new aK(X.authInstance,X.auth.user?.id??X.auth.apiKey?.userId,"*",X.boundAuth,X.auth.user?.role,Y).check("*")}var es6,Xt6,Yt6,Qt6,Jt6,Gt6,Wt6,Zt6,Oz1,Lz1,wz1;var Mz1=S(()=>{lf();$D();KG();W50();n0();Zh();eJ0();es6=U.object({type:U.literal("function"),function:U.object({name:U.string(),description:U.string().optional(),parameters:U.record(U.string(),U.unknown()).optional()})}),Xt6=U.object({id:U.string(),type:U.literal("function"),function:U.object({name:U.string(),arguments:U.string()})}),Yt6=U.discriminatedUnion("role",[U.object({role:U.literal("system"),content:U.string(),name:U.string().optional()}),U.object({role:U.literal("user"),content:U.union([U.string(),U.array(U.union([U.object({type:U.literal("text"),text:U.string()}),U.object({type:U.literal("image_url"),image_url:U.object({url:U.string(),detail:U.string().optional()})})]))]),name:U.string().optional()}),U.object({role:U.literal("assistant"),content:U.string().nullable().optional(),name:U.string().optional(),tool_calls:U.array(Xt6).optional()}),U.object({role:U.literal("tool"),content:U.string(),tool_call_id:U.string()})]),Qt6=U.object({type:U.literal("text")}),Jt6=U.object({type:U.literal("json_object")}),Gt6=U.object({type:U.literal("json_schema"),json_schema:U.object({name:U.string(),description:U.string().optional(),schema:U.record(U.string(),U.unknown()),strict:U.boolean().optional()})}),Wt6=U.union([Qt6,Jt6,Gt6]),Zt6=U.object({model:U.string().describe("Format: connection_id:model_id"),messages:U.array(Yt6),stream:U.boolean().optional().default(!1),temperature:U.number().min(0).max(2).optional(),max_tokens:U.number().positive().optional(),top_p:U.number().min(0).max(1).optional(),frequency_penalty:U.number().min(-2).max(2).optional(),presence_penalty:U.number().min(-2).max(2).optional(),stop:U.union([U.string(),U.array(U.string())]).optional(),tools:U.array(es6).optional(),tool_choice:U.union([U.literal("auto"),U.literal("none"),U.literal("required"),U.object({type:U.literal("function"),function:U.object({name:U.string()})})]).optional(),response_format:Wt6.optional(),user:U.string().optional()});Oz1=class Oz1 extends Error{constructor(X){super(X);this.name="MessageConversionError"}};Lz1=new ZX;Lz1.post("/:org/v1/chat/completions",async(X)=>{let Y=X.get("meshContext"),Q=X.req.param("org");try{if(!Y.auth.apiKey?.id)return X.json(t7("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Y.organization)return X.json(t7("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Y.organization.slug??Y.organization.id)!==Q)return X.json(t7("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let J=await X.req.json(),G=Zt6.safeParse(J);if(!G.success){let A=G.error.issues[0]??{message:"Invalid request",path:[]};return X.json(t7(`Invalid request: ${A.message}`,"invalid_request_error",A.path.length>0?A.path.join("."):null),400)}let W=G.data,Z=$t6(W.model);if(!Z)return X.json(t7("Invalid model format. Expected 'connection_id:model_id' (e.g., 'conn_abc123:gpt-4')","invalid_request_error","model"),400);let{connectionId:$,modelId:K}=Z;try{await Bt6(Y,$)}catch{return X.json(t7(`Access denied to connection: ${$}`,"permission_error","model"),403)}let H=await Ut6(Y,Y.organization.id,$);if(!H)return X.json(t7(`Connection not found or inactive: ${$}`,"invalid_request_error","model"),404);let F=await Y.createMCPProxy(H),V=mf.forClient(F),q=bh(V).languageModel(K),B=Ht6(W.messages),D=W.tools?Ft6(W.tools):void 0,N=Vt6(W.response_format),L=qt6(),w=Math.floor(Date.now()/1000),C={model:q,messages:B,tools:D,temperature:W.temperature,maxTokens:W.max_tokens,topP:W.top_p,frequencyPenalty:W.frequency_penalty,presencePenalty:W.presence_penalty,stopSequences:W.stop?Array.isArray(W.stop)?W.stop:[W.stop]:void 0,abortSignal:X.req.raw.signal},T=N?{...C,providerOptions:N}:C;if(W.stream)return G50(X,async(A)=>{try{let P=_h(T),j=!1,R=0,v={};for await(let y of P.fullStream){if(!j&&(y.type==="text-delta"||y.type==="tool-call"))await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),j=!0;if(y.type==="text-delta")await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{content:y.text},finish_reason:null}]})});else if(y.type==="tool-call"){let b=R++;v[y.toolCallId]={index:b,name:y.toolName},await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{tool_calls:[{index:b,id:y.toolCallId,type:"function",function:{name:y.toolName,arguments:JSON.stringify(y.input)}}]},finish_reason:null}]})})}else if(y.type==="finish"){let b=y.finishReason==="tool-calls"?"tool_calls":y.finishReason==="stop"?"stop":y.finishReason==="length"?"length":"stop";await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{},finish_reason:b}],usage:y.totalUsage?{prompt_tokens:y.totalUsage.inputTokens??0,completion_tokens:y.totalUsage.outputTokens??0,total_tokens:y.totalUsage.totalTokens??0}:void 0})})}}await A.writeSSE({data:"[DONE]"})}catch(P){let j=P;console.error("[openai-compat:stream] Error:",j.message),await A.writeSSE({data:JSON.stringify({error:{message:j.message,type:"server_error"}})})}});else{let A=await kh(T),P={role:"assistant",content:A.text||null};if(A.toolCalls&&A.toolCalls.length>0)P.tool_calls=A.toolCalls.map((R)=>({id:R.toolCallId,type:"function",function:{name:R.toolName,arguments:JSON.stringify("input"in R?R.input:{})}})),P.content=null;let j=A.finishReason==="tool-calls"?"tool_calls":A.finishReason==="stop"?"stop":A.finishReason==="length"?"length":"stop";return X.json({id:L,object:"chat.completion",created:w,model:W.model,choices:[{index:0,message:P,finish_reason:j}],usage:{prompt_tokens:A.usage?.inputTokens??0,completion_tokens:A.usage?.outputTokens??0,total_tokens:A.usage?.totalTokens??0}})}}catch(J){let G=J;if(G.name==="AbortError")return X.json(t7("Request aborted","invalid_request_error"),400);if(G.name==="MessageConversionError")return X.json(t7(G.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",G.message,G.stack),X.json(t7(G.message,"server_error"),500)}});wz1=Lz1});var Pz1,Tz1;var Az1=S(()=>{KG();eS();Pz1=new ZX;Pz1.get("/",(X)=>{let Y={theme:Sw0()};return X.json({success:!0,config:Y})});Tz1=Pz1});var Ez1,jz1;var Cz1=S(()=>{KG();EQ0();Ez1=new ZX;Ez1.all("/",async(X)=>{return(await AQ0(X.get("meshContext"))).fetch(X.req.raw)});jz1=Ez1});function Iz1(X){return X===PA.HEALTH||X===PA.METRICS||X.startsWith(KD.WELL_KNOWN)}function Dt6(X){return X.startsWith(KD.API)}function Nt6(X){return X==="/mcp"||X.startsWith(KD.MCP)}function Ot6(X){return X.startsWith(KD.OAUTH_PROXY)}function Lt6(X){return zt6.test(X)}function wt6(X){return X.startsWith(KD.ORG)}function Rz1(X){return Dt6(X)||Nt6(X)||Ot6(X)||wt6(X)||Iz1(X)}function Sz1(X){return X==="/"||X.startsWith(KD.API_AUTH)||Iz1(X)||Lt6(X)}var PA,KD,zt6;var Z50=S(()=>{PA={HEALTH:"/health",METRICS:"/metrics"},KD={API:"/api/",API_AUTH:"/api/auth/",MCP:"/mcp/",OAUTH_PROXY:"/oauth-proxy/",WELL_KNOWN:"/.well-known",ORG:"/org/"},zt6=/\.(html|css|js|ico|svg|png|jpg|jpeg|gif|webp|woff|woff2)$/});var kz1=()=>{};async function Mt6(X,Y){let J=(await X.storage.connections.list(Y)).find((G)=>G.connection_url?.startsWith(WH1));if(!J?.configuration_state)return null;return J.configuration_state.project_locator}function Pt6(X){let Y=new URLSearchParams;if(X){let[Q,J]=X.split("/");if(Q)Y.set("workspace_hint",Q);if(J)Y.set("project_hint",J)}else Y.set("auto_personal","true");return Y.set("force_new","true"),Y}function _z1(X={}){let Y=X.database??jF();if(xh&&xh.isRunning())console.log("[EventBus] Stopping previous worker (HMR cleanup)"),Promise.resolve(xh.stop()).catch(($)=>{console.error("[EventBus] Error stopping previous worker:",$)});let Q;if(X.eventBus)Q=X.eventBus;else Q=VF1(Y);xh=Q;let J=new ZX;J.use("*",mQ0({enabled:($)=>dH1($,"debug")==="1"})),J.use("/*",cH1({origin:($)=>{if($.includes("localhost")||$.includes("127.0.0.1"))return $;return $},credentials:!0,allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization","mcp-protocol-version"],exposeHeaders:["WWW-Authenticate"]})),J.use("*",oH1()),J.use("*",async($,K)=>{if(await K(),$.res.status>=500){let F=await $.res.clone().text();console.error(`[5xx Response] ${$.req.method} ${$.req.path} - ${$.res.status}:`,F)}}),J.get(PA.HEALTH,($)=>{return $.json({status:"ok",timestamp:new Date().toISOString(),version:"1.0.0"})}),J.get(PA.METRICS,async($)=>{try{let K=await O40.collect(),H=Tt6.serialize(K.resourceMetrics);return $.text(H,200,{"Content-Type":"text/plain; version=0.0.4; charset=utf-8"})}catch(K){return console.error("Failed to collect metrics:",K),$.text("# Error collecting metrics",500)}}),J.route("/api/config",Tz1),J.route("/api/auth/custom",DF1),J.all("/api/auth/*",async($)=>{return await $G.handler($.req.raw)}),J.route("/",g31),J.all("/oauth-proxy/:connectionId/*",async($)=>{let K=$.req.param("connectionId"),H=$.req.path.split("/").filter(Boolean),F=H[H.length-1],V=$.get("meshContext");if(!V)V=await rK.create($.req.raw),$.set("meshContext",V);let q=await V.storage.connections.findById(K);if(!q?.connection_url)return $.json({error:"Connection not found"},404);let B=await Hh(q.connection_url),D,N=new URL(q.connection_url);if(B.ok)D=(await B.json()).authorization_servers?.[0];if(!D)D=N.origin;let L=await GJ0(D);if(!L.ok)return $.json({error:"Failed to get auth server metadata"},502);let w=await L.json(),C;if(F==="authorize")C=w.authorization_endpoint;else if(F==="token")C=w.token_endpoint;else if(F==="register")C=w.registration_endpoint;if(!C)return $.json({error:`Unknown OAuth endpoint: ${F}`},404);let T=new URL(C),A=new URL($.req.url);if(T.search=A.search,F==="authorize"){if(T.searchParams.has("resource"))T.searchParams.set("resource",q.connection_url);if(ZH1(q.connection_url))try{let r=await Mt6(V,q.organization_id),g=Pt6(r);for(let[k,h]of g)T.searchParams.set(k,h)}catch(r){console.warn("[oauth-proxy] Failed to get smart OAuth params, proceeding without:",r)}return $.redirect(T.toString(),302)}let P={Accept:$.req.header("Accept")||"application/json"},j=$.req.header("Content-Type");if(j)P["Content-Type"]=j;let R=$.req.header("Authorization");if(R)P.Authorization=R;let v;if($.req.method!=="GET"&&$.req.method!=="HEAD")if(F==="token"&&j?.includes("application/x-www-form-urlencoded")){let r=await $.req.formData();if(r.has("resource"))r.set("resource",q.connection_url);let g=new URLSearchParams;for(let[k,h]of r.entries())g.append(k,h.toString());v=g.toString()}else v=$.req.raw.body??void 0;let y=await fetch(T.toString(),{method:$.req.method,headers:P,body:v,duplex:"half",redirect:"manual"}),b=new Headers,f=["connection","keep-alive","transfer-encoding","content-encoding","content-length"];for(let[r,g]of y.headers.entries())if(!f.includes(r.toLowerCase()))b.set(r,g);return new Response(y.body,{status:y.status,statusText:y.statusText,headers:b})}),J.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",async($)=>{let H=await At6()($.req.raw),F=await H.json();return Response.json(F,H)});let G=async($)=>{let H=await Et6()($.req.raw),F=await H.json();return Response.json(F,H)};J.get("/.well-known/oauth-authorization-server/*/:gateway?/:connectionId?",G),rK.set(s31({db:Y.db,databaseType:Y.type,auth:$G,encryption:{key:process.env.ENCRYPTION_KEY||""},observability:{tracer:HP,meter:Py},eventBus:Q})),Promise.resolve(Q.start()).then(()=>{console.log("[EventBus] Worker started")}),J.use("*",async($,K)=>{if(Sz1($.req.path))return K();let H={measure:async(V,q)=>{sz($,V);try{return await q()}finally{ZV($,V)}}},F=await rK.create($.req.raw,{timings:H});return $.set("meshContext",F),K()}),J.get("/api/tools/management",($)=>{return $.json({tools:zp,grouped:PO()})}),J.use("/mcp/*",async($,K)=>{sz($,"mcp");try{return await K()}finally{ZV($,"mcp")}});let W=async($,K)=>{let H=$.var.meshContext;if(!H.auth.user?.id&&!H.auth.apiKey?.id){let F=new URL($.req.url);return $.res=new Response(null,{status:401,headers:{"WWW-Authenticate":`Bearer realm="mcp",resource_metadata="${F.origin}${F.pathname}/.well-known/oauth-protected-resource"`}})}return await K()};J.use("/mcp/:connectionId?",W),J.use("/mcp/gateway/:virtualMcpId?",W),J.use("/mcp/virtual-mcp/:virtualMcpId?",W),J.use("/mcp/self",W),J.route("/mcp",_31),J.route("/mcp/self",jz1),J.route("/mcp",i31),J.use("/api/:org/models/*",async($,K)=>{sz($,"llm_models");try{return await K()}finally{ZV($,"llm_models")}}),J.route("/api",X50),J.route("/api",wz1),J.post("/org/:organizationId/events/:type",async($)=>{let K=$.req.param("organizationId");return await $.var.meshContext.eventBus.publish(K,mF.SELF(K),{data:await $.req.json(),type:`public:${$.req.param("type")}`,subject:$.req.query("subject"),deliverAt:$.req.query("deliverAt"),cron:$.req.query("cron")}),$.json({success:!0})}),J.route("/api",qz1);let Z=new lF(process.env.ENCRYPTION_KEY||"");return VW0(Y.db,Z),HW0(J,{db:Y.db,vault:Z}),J.notFound(($)=>{return $.json({error:"Not Found",path:$.req.path},404)}),J.onError(($,K)=>{console.error("Server error :",$);let H=$ instanceof Error?$.message:"Unknown error";return K.json({error:"Internal Server Error",message:H},500)}),J}var vz1,xh=null,Tt6,At6=()=>Er($G),Et6=()=>Ar($G);var yz1=S(()=>{BT();KG();pH1();nH1();sH1();Y31();az();qh();VP();qF1();FP();NF1();Vz1();Uz1();QJ0();Vh();Mz1();WA();Az1();Cz1();Z50();g2();Of();Ir();Dp();kz1();vz1=w6(N40(),1);Tt6=new vz1.PrometheusSerializer});import bz1 from"v8";import{rename as jt6,mkdir as Ct6}from"fs/promises";import{join as It6}from"path";function fz1(X){let{port:Y,hostname:Q="0.0.0.0"}=X;return Bun.serve({port:Y,hostname:Q,fetch:async(J)=>{let G=new URL(J.url);if(G.pathname==="/health")return Response.json({status:"ok",uptime:process.uptime()});if(G.pathname==="/memory")return Response.json({...process.memoryUsage(),uptimeSeconds:process.uptime()});if(G.pathname==="/heap-snapshot"){let W=Date.now();try{let Z=bz1.writeHeapSnapshot(),$=Bun.file(Z);return new Response($,{headers:{"Content-Type":"application/octet-stream","Content-Disposition":`attachment; filename="heap-${W}.heapsnapshot"`}})}catch(Z){return Response.json({error:String(Z)},{status:500})}}if(G.pathname==="/gc"){if(typeof Bun.gc==="function")return Bun.gc(!0),Response.json({status:"gc triggered"});return Response.json({status:"gc not available"},{status:501})}if(G.pathname==="/prestop-hook"){let W=process.env.PRESTOP_HEAP_SNAPSHOT_DIR;if(!W)return Response.json({status:"skipped",reason:"PRESTOP_HEAP_SNAPSHOT_DIR not set"});try{await Ct6(W,{recursive:!0});let Z=bz1.writeHeapSnapshot(),$=process.env.HOSTNAME??process.env.POD_NAME??"unknown",K=new Date().toISOString().replace(/[:.]/g,"-"),H=`${$}-${K}.heapsnapshot`,F=It6(W,H);await jt6(Z,F);let V=process.memoryUsage();return console.log("[prestop-hook] Heap snapshot saved:",F),Response.json({status:"saved",path:F,memory:{rss:V.rss,heapUsed:V.heapUsed,external:V.external}})}catch(Z){return console.error("[prestop-hook] Failed to save heap snapshot:",Z),Response.json({error:String(Z)},{status:500})}}return Response.json({error:"Not found"},{status:404})}})}var hz1=()=>{};var bt6={};var gz1,xz1,Rt6,HD="\x1B[0m",St6="\x1B[1m",uz1="\x1B[2m",kt6="\x1B[32m",mz1="\x1B[36m",lz1="\x1B[4m",vt6,_t6,yt6;var dz1=S(()=>{FP();GH1();yz1();Z50();hz1();gz1=parseInt(process.env.PORT||"3000",10),xz1=parseInt(process.env.DEBUG_PORT||"9090",10),Rt6=process.env.ENABLE_DEBUG_SERVER==="true",vt6=`http://localhost:${gz1}`,_t6=JH1({clientDir:QH1(import.meta.url,"../client"),isServerPath:Rz1}),yt6=_z1();console.log("");console.log(`${kt6}\u2713${HD} ${St6}Ready${HD}`);console.log("");console.log(` ${uz1}Open in browser:${HD} ${mz1}${lz1}${vt6}${HD}`);console.log("");Bun.serve({idleTimeout:0,port:gz1,hostname:"0.0.0.0",fetch:async(X)=>{return await _t6(X)??yt6.fetch(X)},development:!1});if(Rt6)fz1({port:xz1}),console.log(` ${uz1}Debug server:${HD} ${mz1}${lz1}http://localhost:${xz1}${HD}`),console.log("")});import{parseArgs as ft6}from"util";var{values:gh}=ft6({args:process.argv.slice(2),options:{port:{type:"string",short:"p",default:process.env.PORT||"3000"},help:{type:"boolean",short:"h",default:!1},version:{type:"boolean",short:"v",default:!1},"skip-migrations":{type:"boolean",default:!1}},allowPositionals:!0});if(gh.help)console.log(`
1307
1307
  MCP Mesh - Self-hostable MCP Server
1308
1308
 
1309
1309
  Usage:
@@ -1165,4 +1165,4 @@ ${await G.text()}`);return{stream:np6(G),response:{headers:Object.fromEntries(G.
1165
1165
  `),J=[X.event&&`event: ${X.event}`,Q,X.id&&`id: ${X.id}`,X.retry&&`retry: ${X.retry}`].filter(Boolean).join(`
1166
1166
  `)+`
1167
1167
 
1168
- `;await this.write(J)}},ep6=async(X,Y,Q)=>{try{await Y(X)}catch(J){if(J instanceof Error&&Q)await Q(J,X),await X.writeSSE({event:"error",data:J.message});else console.error(J)}finally{X.close()}},Xc6=new WeakMap,w90=(X,Y,Q)=>{let{readable:J,writable:G}=new TransformStream,W=new f31(G,J);if(Nf())X.req.raw.signal.addEventListener("abort",()=>{if(!W.closed)W.abort()});return Xc6.set(W.responseReadable,X),X.header("Transfer-Encoding","chunked"),X.header("Content-Type","text/event-stream"),X.header("Cache-Control","no-cache"),X.header("Connection","keep-alive"),ep6(W,Y,Q),X.newResponse(W.responseReadable)};c0();var Qc6=U.object({type:U.literal("function"),function:U.object({name:U.string(),description:U.string().optional(),parameters:U.record(U.string(),U.unknown()).optional()})}),Jc6=U.object({id:U.string(),type:U.literal("function"),function:U.object({name:U.string(),arguments:U.string()})}),Gc6=U.discriminatedUnion("role",[U.object({role:U.literal("system"),content:U.string(),name:U.string().optional()}),U.object({role:U.literal("user"),content:U.union([U.string(),U.array(U.union([U.object({type:U.literal("text"),text:U.string()}),U.object({type:U.literal("image_url"),image_url:U.object({url:U.string(),detail:U.string().optional()})})]))]),name:U.string().optional()}),U.object({role:U.literal("assistant"),content:U.string().nullable().optional(),name:U.string().optional(),tool_calls:U.array(Jc6).optional()}),U.object({role:U.literal("tool"),content:U.string(),tool_call_id:U.string()})]),Wc6=U.object({type:U.literal("text")}),Zc6=U.object({type:U.literal("json_object")}),$c6=U.object({type:U.literal("json_schema"),json_schema:U.object({name:U.string(),description:U.string().optional(),schema:U.record(U.string(),U.unknown()),strict:U.boolean().optional()})}),Kc6=U.union([Wc6,Zc6,$c6]),Hc6=U.object({model:U.string().describe("Format: connection_id:model_id"),messages:U.array(Gc6),stream:U.boolean().optional().default(!1),temperature:U.number().min(0).max(2).optional(),max_tokens:U.number().positive().optional(),top_p:U.number().min(0).max(1).optional(),frequency_penalty:U.number().min(-2).max(2).optional(),presence_penalty:U.number().min(-2).max(2).optional(),stop:U.union([U.string(),U.array(U.string())]).optional(),tools:U.array(Qc6).optional(),tool_choice:U.union([U.literal("auto"),U.literal("none"),U.literal("required"),U.object({type:U.literal("function"),function:U.object({name:U.string()})})]).optional(),response_format:Kc6.optional(),user:U.string().optional()});function E7(X,Y="invalid_request_error",Q=null,J=null){return{error:{message:X,type:Y,param:Q,code:J}}}function Fc6(X){let Y=X.indexOf(":");if(Y===-1)return null;let Q=X.substring(0,Y),J=X.substring(Y+1);if(!Q||!J)return null;return{connectionId:Q,modelId:J}}class h31 extends Error{constructor(X){super(X);this.name="MessageConversionError"}}function Vc6(X,Y,Q){try{return JSON.parse(X)}catch{throw new h31(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Y}): ${X}`)}}function qc6(X){return X.map((Y)=>{switch(Y.role){case"system":return{role:"system",content:Y.content};case"user":if(typeof Y.content==="string")return{role:"user",content:Y.content};return{role:"user",content:Y.content.map((Q)=>{if(Q.type==="text")return{type:"text",text:Q.text};return{type:"image",image:Q.image_url.url}})};case"assistant":if(Y.tool_calls&&Y.tool_calls.length>0)return{role:"assistant",content:Y.tool_calls.map((Q)=>({type:"tool-call",toolCallId:Q.id,toolName:Q.function.name,args:Vc6(Q.function.arguments,Q.id,Q.function.name)}))};return{role:"assistant",content:Y.content??""};case"tool":return{role:"tool",content:[{type:"tool-result",toolCallId:Y.tool_call_id,toolName:"",content:Y.content}]}}})}function Uc6(X){let Y=X.map((Q)=>{let J=Q.function.parameters?p5(Q.function.parameters):p5({type:"object",properties:{}});return[Q.function.name,Nz({description:Q.function.description,inputSchema:J})]});return Object.fromEntries(Y)}function Bc6(X){if(!X)return;return{openai:{response_format:X}}}function zc6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}async function Dc6(X,Y,Q){let J=await X.storage.connections.findById(Q);if(!J)return null;if(J.organization_id!==Y)return null;if(J.status!=="active")return null;return J}async function Nc6(X,Y){await new OK(X.authInstance,X.auth.user?.id??X.auth.apiKey?.userId,"*",X.boundAuth,X.auth.user?.role,Y).check("*")}var x31=new p8;x31.post("/:org/v1/chat/completions",async(X)=>{let Y=X.get("meshContext"),Q=X.req.param("org");try{if(!Y.auth.apiKey?.id)return X.json(E7("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Y.organization)return X.json(E7("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Y.organization.slug??Y.organization.id)!==Q)return X.json(E7("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let J=await X.req.json(),G=Hc6.safeParse(J);if(!G.success){let A=G.error.issues[0]??{message:"Invalid request",path:[]};return X.json(E7(`Invalid request: ${A.message}`,"invalid_request_error",A.path.length>0?A.path.join("."):null),400)}let W=G.data,Z=Fc6(W.model);if(!Z)return X.json(E7("Invalid model format. Expected 'connection_id:model_id' (e.g., 'conn_abc123:gpt-4')","invalid_request_error","model"),400);let{connectionId:$,modelId:K}=Z;try{await Nc6(Y,$)}catch{return X.json(E7(`Access denied to connection: ${$}`,"permission_error","model"),403)}let H=await Dc6(Y,Y.organization.id,$);if(!H)return X.json(E7(`Connection not found or inactive: ${$}`,"invalid_request_error","model"),404);let F=await Y.createMCPProxy(H),V=fb.forClient(F),q=zf(V).languageModel(K),B=qc6(W.messages),D=W.tools?Uc6(W.tools):void 0,N=Bc6(W.response_format),L=zc6(),w=Math.floor(Date.now()/1000),C={model:q,messages:B,tools:D,temperature:W.temperature,maxTokens:W.max_tokens,topP:W.top_p,frequencyPenalty:W.frequency_penalty,presencePenalty:W.presence_penalty,stopSequences:W.stop?Array.isArray(W.stop)?W.stop:[W.stop]:void 0,abortSignal:X.req.raw.signal},T=N?{...C,providerOptions:N}:C;if(W.stream)return w90(X,async(A)=>{try{let P=Bf(T),j=!1,R=0,k={};for await(let _ of P.fullStream){if(!j&&(_.type==="text-delta"||_.type==="tool-call"))await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),j=!0;if(_.type==="text-delta")await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{content:_.text},finish_reason:null}]})});else if(_.type==="tool-call"){let y=R++;k[_.toolCallId]={index:y,name:_.toolName},await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{tool_calls:[{index:y,id:_.toolCallId,type:"function",function:{name:_.toolName,arguments:JSON.stringify(_.input)}}]},finish_reason:null}]})})}else if(_.type==="finish"){let y=_.finishReason==="tool-calls"?"tool_calls":_.finishReason==="stop"?"stop":_.finishReason==="length"?"length":"stop";await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{},finish_reason:y}],usage:_.totalUsage?{prompt_tokens:_.totalUsage.inputTokens??0,completion_tokens:_.totalUsage.outputTokens??0,total_tokens:_.totalUsage.totalTokens??0}:void 0})})}}await A.writeSSE({data:"[DONE]"})}catch(P){let j=P;console.error("[openai-compat:stream] Error:",j.message),await A.writeSSE({data:JSON.stringify({error:{message:j.message,type:"server_error"}})})}});else{let A=await qf(T),P={role:"assistant",content:A.text||null};if(A.toolCalls&&A.toolCalls.length>0)P.tool_calls=A.toolCalls.map((R)=>({id:R.toolCallId,type:"function",function:{name:R.toolName,arguments:JSON.stringify("input"in R?R.input:{})}})),P.content=null;let j=A.finishReason==="tool-calls"?"tool_calls":A.finishReason==="stop"?"stop":A.finishReason==="length"?"length":"stop";return X.json({id:L,object:"chat.completion",created:w,model:W.model,choices:[{index:0,message:P,finish_reason:j}],usage:{prompt_tokens:A.usage?.inputTokens??0,completion_tokens:A.usage?.outputTokens??0,total_tokens:A.usage?.totalTokens??0}})}}catch(J){let G=J;if(G.name==="AbortError")return X.json(E7("Request aborted","invalid_request_error"),400);if(G.name==="MessageConversionError")return X.json(E7(G.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",G.message,G.stack),X.json(E7(G.message,"server_error"),500)}});var g31=x31;var u31=new p8;u31.get("/",(X)=>{let Y={theme:YX1()};return X.json({success:!0,config:Y})});var m31=u31;qY0();var l31=new p8;l31.all("/",async(X)=>{return(await VY0(X.get("meshContext"))).fetch(X.req.raw)});var d31=l31;var TT={HEALTH:"/health",METRICS:"/metrics"},Tz={API:"/api/",API_AUTH:"/api/auth/",MCP:"/mcp/",OAUTH_PROXY:"/oauth-proxy/",WELL_KNOWN:"/.well-known",ORG:"/org/"},Oc6=/\.(html|css|js|ico|svg|png|jpg|jpeg|gif|webp|woff|woff2)$/;function p31(X){return X===TT.HEALTH||X===TT.METRICS||X.startsWith(Tz.WELL_KNOWN)}function Lc6(X){return X.startsWith(Tz.API)}function wc6(X){return X==="/mcp"||X.startsWith(Tz.MCP)}function Mc6(X){return X.startsWith(Tz.OAUTH_PROXY)}function Pc6(X){return Oc6.test(X)}function Tc6(X){return X.startsWith(Tz.ORG)}function c31(X){return Lc6(X)||wc6(X)||Mc6(X)||Tc6(X)||p31(X)}function n31(X){return X==="/"||X.startsWith(Tz.API_AUTH)||p31(X)||Pc6(X)}l80();var Of=null;async function Ac6(X,Y){let J=(await X.storage.connections.list(Y)).find((G)=>G.connection_url?.startsWith(fy0));if(!J?.configuration_state)return null;return J.configuration_state.project_locator}function Ec6(X){let Y=new URLSearchParams;if(X){let[Q,J]=X.split("/");if(Q)Y.set("workspace_hint",Q);if(J)Y.set("project_hint",J)}else Y.set("auto_personal","true");return Y.set("force_new","true"),Y}var jc6=new i31.PrometheusSerializer,Cc6=()=>z40(XZ),Ic6=()=>B40(XZ);function a31(X={}){let Y=X.database??Zb();if(Of&&Of.isRunning())console.log("[EventBus] Stopping previous worker (HMR cleanup)"),Promise.resolve(Of.stop()).catch(($)=>{console.error("[EventBus] Error stopping previous worker:",$)});let Q;if(X.eventBus)Q=X.eventBus;else Q=nW1(Y);Of=Q;let J=new p8;J.use("*",Qs({enabled:($)=>Fp0($,"debug")==="1"})),J.use("/*",Vp0({origin:($)=>{if($.includes("localhost")||$.includes("127.0.0.1"))return $;return $},credentials:!0,allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization","mcp-protocol-version"]})),J.use("*",Bp0()),J.use("*",async($,K)=>{if(await K(),$.res.status>=500){let F=await $.res.clone().text();console.error(`[5xx Response] ${$.req.method} ${$.req.path} - ${$.res.status}:`,F)}}),J.get(TT.HEALTH,($)=>{return $.json({status:"ok",timestamp:new Date().toISOString(),version:"1.0.0"})}),J.get(TT.METRICS,async($)=>{try{let K=await kd.collect(),H=jc6.serialize(K.resourceMetrics);return $.text(H,200,{"Content-Type":"text/plain; version=0.0.4; charset=utf-8"})}catch(K){return console.error("Failed to collect metrics:",K),$.text("# Error collecting metrics",500)}}),J.route("/api/config",m31),J.route("/api/auth/custom",rW1),J.all("/api/auth/*",async($)=>{return await XZ.handler($.req.raw)}),J.route("/",EW1),J.all("/oauth-proxy/:connectionId/*",async($)=>{let K=$.req.param("connectionId"),H=$.req.path.split("/").filter(Boolean),F=H[H.length-1],V=$.get("meshContext");if(!V)V=await LK.create($.req.raw),$.set("meshContext",V);let q=await V.storage.connections.findById(K);if(!q?.connection_url)return $.json({error:"Connection not found"},404);let B=await nb(q.connection_url),D,N=new URL(q.connection_url);if(B.ok)D=(await B.json()).authorization_servers?.[0];if(!D)D=N.origin;let L=await jY0(D);if(!L.ok)return $.json({error:"Failed to get auth server metadata"},502);let w=await L.json(),C;if(F==="authorize")C=w.authorization_endpoint;else if(F==="token")C=w.token_endpoint;else if(F==="register")C=w.registration_endpoint;if(!C)return $.json({error:`Unknown OAuth endpoint: ${F}`},404);let T=new URL(C),A=new URL($.req.url);if(T.search=A.search,F==="authorize"){if(T.searchParams.has("resource"))T.searchParams.set("resource",q.connection_url);if(hy0(q.connection_url))try{let r=await Ac6(V,q.organization_id),x=Ec6(r);for(let[S,f]of x)T.searchParams.set(S,f)}catch(r){console.warn("[oauth-proxy] Failed to get smart OAuth params, proceeding without:",r)}return $.redirect(T.toString(),302)}let P={Accept:$.req.header("Accept")||"application/json"},j=$.req.header("Content-Type");if(j)P["Content-Type"]=j;let R=$.req.header("Authorization");if(R)P.Authorization=R;let k;if($.req.method!=="GET"&&$.req.method!=="HEAD")if(F==="token"&&j?.includes("application/x-www-form-urlencoded")){let r=await $.req.formData();if(r.has("resource"))r.set("resource",q.connection_url);let x=new URLSearchParams;for(let[S,f]of r.entries())x.append(S,f.toString());k=x.toString()}else k=$.req.raw.body??void 0;let _=await fetch(T.toString(),{method:$.req.method,headers:P,body:k,duplex:"half",redirect:"manual"}),y=new Headers,b=["connection","keep-alive","transfer-encoding","content-encoding","content-length"];for(let[r,x]of _.headers.entries())if(!b.includes(r.toLowerCase()))y.set(r,x);return new Response(_.body,{status:_.status,statusText:_.statusText,headers:y})}),J.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",async($)=>{let H=await Cc6()($.req.raw),F=await H.json();return Response.json(F,H)});let G=async($)=>{let H=await Ic6()($.req.raw),F=await H.json();return Response.json(F,H)};J.get("/.well-known/oauth-authorization-server/*/:gateway?/:connectionId?",G),LK.set(fW1({db:Y.db,databaseType:Y.type,auth:XZ,encryption:{key:process.env.ENCRYPTION_KEY||""},observability:{tracer:NN,meter:yj},eventBus:Q})),Promise.resolve(Q.start()).then(()=>{console.log("[EventBus] Worker started")}),J.use("*",async($,K)=>{if(n31($.req.path))return K();let H={measure:async(V,q)=>{ZU($,V);try{return await q()}finally{H3($,V)}}},F=await LK.create($.req.raw,{timings:H});return $.set("meshContext",F),K()}),J.get("/api/tools/management",($)=>{return $.json({tools:Js,grouped:Xw()})}),J.use("/mcp/*",async($,K)=>{ZU($,"mcp");try{return await K()}finally{H3($,"mcp")}});let W=async($,K)=>{let H=$.var.meshContext;if(!H.auth.user?.id&&!H.auth.apiKey?.id){let F=new URL($.req.url);return $.res=new Response(null,{status:401,headers:{"WWW-Authenticate":`Bearer realm="mcp",resource_metadata="${F.origin}${F.pathname}/.well-known/oauth-protected-resource"`}})}return await K()};J.use("/mcp/:connectionId?",W),J.use("/mcp/gateway/:virtualMcpId?",W),J.use("/mcp/virtual-mcp/:virtualMcpId?",W),J.use("/mcp/self",W),J.route("/mcp",LW1),J.route("/mcp/self",d31),J.route("/mcp",_W1),J.use("/api/:org/models/*",async($,K)=>{ZU($,"llm_models");try{return await K()}finally{H3($,"llm_models")}}),J.route("/api",O90),J.route("/api",g31),J.post("/org/:organizationId/events/:type",async($)=>{let K=$.req.param("organizationId");return await $.var.meshContext.eventBus.publish(K,Z3.SELF(K),{data:await $.req.json(),type:`public:${$.req.param("type")}`,subject:$.req.query("subject"),deliverAt:$.req.query("deliverAt"),cron:$.req.query("cron")}),$.json({success:!0})}),J.route("/api",b31);let Z=new BF(process.env.ENCRYPTION_KEY||"");return Y51(Y.db,Z),X51(J,{db:Y.db,vault:Z}),J.notFound(($)=>{return $.json({error:"Not Found",path:$.req.path},404)}),J.onError(($,K)=>{console.error("Server error :",$);let H=$ instanceof Error?$.message:"Unknown error";return K.json({error:"Internal Server Error",message:H},500)}),J}import r31 from"v8";import{rename as Rc6,mkdir as Sc6}from"fs/promises";import{join as kc6}from"path";function o31(X){let{port:Y,hostname:Q="0.0.0.0"}=X;return Bun.serve({port:Y,hostname:Q,fetch:async(J)=>{let G=new URL(J.url);if(G.pathname==="/health")return Response.json({status:"ok",uptime:process.uptime()});if(G.pathname==="/memory")return Response.json({...process.memoryUsage(),uptimeSeconds:process.uptime()});if(G.pathname==="/heap-snapshot"){let W=Date.now();try{let Z=r31.writeHeapSnapshot(),$=Bun.file(Z);return new Response($,{headers:{"Content-Type":"application/octet-stream","Content-Disposition":`attachment; filename="heap-${W}.heapsnapshot"`}})}catch(Z){return Response.json({error:String(Z)},{status:500})}}if(G.pathname==="/gc"){if(typeof Bun.gc==="function")return Bun.gc(!0),Response.json({status:"gc triggered"});return Response.json({status:"gc not available"},{status:501})}if(G.pathname==="/prestop-hook"){let W=process.env.PRESTOP_HEAP_SNAPSHOT_DIR;if(!W)return Response.json({status:"skipped",reason:"PRESTOP_HEAP_SNAPSHOT_DIR not set"});try{await Sc6(W,{recursive:!0});let Z=r31.writeHeapSnapshot(),$=process.env.HOSTNAME??process.env.POD_NAME??"unknown",K=new Date().toISOString().replace(/[:.]/g,"-"),H=`${$}-${K}.heapsnapshot`,F=kc6(W,H);await Rc6(Z,F);let V=process.memoryUsage();return console.log("[prestop-hook] Heap snapshot saved:",F),Response.json({status:"saved",path:F,memory:{rss:V.rss,heapUsed:V.heapUsed,external:V.external}})}catch(Z){return console.error("[prestop-hook] Failed to save heap snapshot:",Z),Response.json({error:String(Z)},{status:500})}}return Response.json({error:"Not found"},{status:404})}})}var t31=parseInt(process.env.PORT||"3000",10),s31=parseInt(process.env.DEBUG_PORT||"9090",10),vc6=process.env.ENABLE_DEBUG_SERVER==="true",Az="\x1B[0m",_c6="\x1B[1m",e31="\x1B[2m",yc6="\x1B[32m",XF1="\x1B[36m",YF1="\x1B[4m",bc6=`http://localhost:${t31}`,fc6=by0({clientDir:yy0(import.meta.url,"../client"),isServerPath:c31}),hc6=a31();console.log("");console.log(`${yc6}\u2713${Az} ${_c6}Ready${Az}`);console.log("");console.log(` ${e31}Open in browser:${Az} ${XF1}${YF1}${bc6}${Az}`);console.log("");Bun.serve({idleTimeout:0,port:t31,hostname:"0.0.0.0",fetch:async(X)=>{return await fc6(X)??hc6.fetch(X)},development:!1});if(vc6)o31({port:s31}),console.log(` ${e31}Debug server:${Az} ${XF1}${YF1}http://localhost:${s31}${Az}`),console.log("");
1168
+ `;await this.write(J)}},ep6=async(X,Y,Q)=>{try{await Y(X)}catch(J){if(J instanceof Error&&Q)await Q(J,X),await X.writeSSE({event:"error",data:J.message});else console.error(J)}finally{X.close()}},Xc6=new WeakMap,w90=(X,Y,Q)=>{let{readable:J,writable:G}=new TransformStream,W=new f31(G,J);if(Nf())X.req.raw.signal.addEventListener("abort",()=>{if(!W.closed)W.abort()});return Xc6.set(W.responseReadable,X),X.header("Transfer-Encoding","chunked"),X.header("Content-Type","text/event-stream"),X.header("Cache-Control","no-cache"),X.header("Connection","keep-alive"),ep6(W,Y,Q),X.newResponse(W.responseReadable)};c0();var Qc6=U.object({type:U.literal("function"),function:U.object({name:U.string(),description:U.string().optional(),parameters:U.record(U.string(),U.unknown()).optional()})}),Jc6=U.object({id:U.string(),type:U.literal("function"),function:U.object({name:U.string(),arguments:U.string()})}),Gc6=U.discriminatedUnion("role",[U.object({role:U.literal("system"),content:U.string(),name:U.string().optional()}),U.object({role:U.literal("user"),content:U.union([U.string(),U.array(U.union([U.object({type:U.literal("text"),text:U.string()}),U.object({type:U.literal("image_url"),image_url:U.object({url:U.string(),detail:U.string().optional()})})]))]),name:U.string().optional()}),U.object({role:U.literal("assistant"),content:U.string().nullable().optional(),name:U.string().optional(),tool_calls:U.array(Jc6).optional()}),U.object({role:U.literal("tool"),content:U.string(),tool_call_id:U.string()})]),Wc6=U.object({type:U.literal("text")}),Zc6=U.object({type:U.literal("json_object")}),$c6=U.object({type:U.literal("json_schema"),json_schema:U.object({name:U.string(),description:U.string().optional(),schema:U.record(U.string(),U.unknown()),strict:U.boolean().optional()})}),Kc6=U.union([Wc6,Zc6,$c6]),Hc6=U.object({model:U.string().describe("Format: connection_id:model_id"),messages:U.array(Gc6),stream:U.boolean().optional().default(!1),temperature:U.number().min(0).max(2).optional(),max_tokens:U.number().positive().optional(),top_p:U.number().min(0).max(1).optional(),frequency_penalty:U.number().min(-2).max(2).optional(),presence_penalty:U.number().min(-2).max(2).optional(),stop:U.union([U.string(),U.array(U.string())]).optional(),tools:U.array(Qc6).optional(),tool_choice:U.union([U.literal("auto"),U.literal("none"),U.literal("required"),U.object({type:U.literal("function"),function:U.object({name:U.string()})})]).optional(),response_format:Kc6.optional(),user:U.string().optional()});function E7(X,Y="invalid_request_error",Q=null,J=null){return{error:{message:X,type:Y,param:Q,code:J}}}function Fc6(X){let Y=X.indexOf(":");if(Y===-1)return null;let Q=X.substring(0,Y),J=X.substring(Y+1);if(!Q||!J)return null;return{connectionId:Q,modelId:J}}class h31 extends Error{constructor(X){super(X);this.name="MessageConversionError"}}function Vc6(X,Y,Q){try{return JSON.parse(X)}catch{throw new h31(`Invalid JSON in tool call arguments for function '${Q}' (tool_call_id: ${Y}): ${X}`)}}function qc6(X){return X.map((Y)=>{switch(Y.role){case"system":return{role:"system",content:Y.content};case"user":if(typeof Y.content==="string")return{role:"user",content:Y.content};return{role:"user",content:Y.content.map((Q)=>{if(Q.type==="text")return{type:"text",text:Q.text};return{type:"image",image:Q.image_url.url}})};case"assistant":if(Y.tool_calls&&Y.tool_calls.length>0)return{role:"assistant",content:Y.tool_calls.map((Q)=>({type:"tool-call",toolCallId:Q.id,toolName:Q.function.name,args:Vc6(Q.function.arguments,Q.id,Q.function.name)}))};return{role:"assistant",content:Y.content??""};case"tool":return{role:"tool",content:[{type:"tool-result",toolCallId:Y.tool_call_id,toolName:"",content:Y.content}]}}})}function Uc6(X){let Y=X.map((Q)=>{let J=Q.function.parameters?p5(Q.function.parameters):p5({type:"object",properties:{}});return[Q.function.name,Nz({description:Q.function.description,inputSchema:J})]});return Object.fromEntries(Y)}function Bc6(X){if(!X)return;return{openai:{response_format:X}}}function zc6(){return`chatcmpl-${crypto.randomUUID().replace(/-/g,"").substring(0,29)}`}async function Dc6(X,Y,Q){let J=await X.storage.connections.findById(Q);if(!J)return null;if(J.organization_id!==Y)return null;if(J.status!=="active")return null;return J}async function Nc6(X,Y){await new OK(X.authInstance,X.auth.user?.id??X.auth.apiKey?.userId,"*",X.boundAuth,X.auth.user?.role,Y).check("*")}var x31=new p8;x31.post("/:org/v1/chat/completions",async(X)=>{let Y=X.get("meshContext"),Q=X.req.param("org");try{if(!Y.auth.apiKey?.id)return X.json(E7("API key authentication required. Provide a valid API key via Authorization header.","authentication_error"),401);if(!Y.organization)return X.json(E7("Organization context is required. Ensure your API key has organization metadata.","invalid_request_error","organization"),400);if((Y.organization.slug??Y.organization.id)!==Q)return X.json(E7("Organization mismatch. The API key's organization does not match the requested organization.","invalid_request_error","organization"),403);let J=await X.req.json(),G=Hc6.safeParse(J);if(!G.success){let A=G.error.issues[0]??{message:"Invalid request",path:[]};return X.json(E7(`Invalid request: ${A.message}`,"invalid_request_error",A.path.length>0?A.path.join("."):null),400)}let W=G.data,Z=Fc6(W.model);if(!Z)return X.json(E7("Invalid model format. Expected 'connection_id:model_id' (e.g., 'conn_abc123:gpt-4')","invalid_request_error","model"),400);let{connectionId:$,modelId:K}=Z;try{await Nc6(Y,$)}catch{return X.json(E7(`Access denied to connection: ${$}`,"permission_error","model"),403)}let H=await Dc6(Y,Y.organization.id,$);if(!H)return X.json(E7(`Connection not found or inactive: ${$}`,"invalid_request_error","model"),404);let F=await Y.createMCPProxy(H),V=fb.forClient(F),q=zf(V).languageModel(K),B=qc6(W.messages),D=W.tools?Uc6(W.tools):void 0,N=Bc6(W.response_format),L=zc6(),w=Math.floor(Date.now()/1000),C={model:q,messages:B,tools:D,temperature:W.temperature,maxTokens:W.max_tokens,topP:W.top_p,frequencyPenalty:W.frequency_penalty,presencePenalty:W.presence_penalty,stopSequences:W.stop?Array.isArray(W.stop)?W.stop:[W.stop]:void 0,abortSignal:X.req.raw.signal},T=N?{...C,providerOptions:N}:C;if(W.stream)return w90(X,async(A)=>{try{let P=Bf(T),j=!1,R=0,k={};for await(let _ of P.fullStream){if(!j&&(_.type==="text-delta"||_.type==="tool-call"))await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{role:"assistant",content:""},finish_reason:null}]})}),j=!0;if(_.type==="text-delta")await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{content:_.text},finish_reason:null}]})});else if(_.type==="tool-call"){let y=R++;k[_.toolCallId]={index:y,name:_.toolName},await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{tool_calls:[{index:y,id:_.toolCallId,type:"function",function:{name:_.toolName,arguments:JSON.stringify(_.input)}}]},finish_reason:null}]})})}else if(_.type==="finish"){let y=_.finishReason==="tool-calls"?"tool_calls":_.finishReason==="stop"?"stop":_.finishReason==="length"?"length":"stop";await A.writeSSE({data:JSON.stringify({id:L,object:"chat.completion.chunk",created:w,model:W.model,choices:[{index:0,delta:{},finish_reason:y}],usage:_.totalUsage?{prompt_tokens:_.totalUsage.inputTokens??0,completion_tokens:_.totalUsage.outputTokens??0,total_tokens:_.totalUsage.totalTokens??0}:void 0})})}}await A.writeSSE({data:"[DONE]"})}catch(P){let j=P;console.error("[openai-compat:stream] Error:",j.message),await A.writeSSE({data:JSON.stringify({error:{message:j.message,type:"server_error"}})})}});else{let A=await qf(T),P={role:"assistant",content:A.text||null};if(A.toolCalls&&A.toolCalls.length>0)P.tool_calls=A.toolCalls.map((R)=>({id:R.toolCallId,type:"function",function:{name:R.toolName,arguments:JSON.stringify("input"in R?R.input:{})}})),P.content=null;let j=A.finishReason==="tool-calls"?"tool_calls":A.finishReason==="stop"?"stop":A.finishReason==="length"?"length":"stop";return X.json({id:L,object:"chat.completion",created:w,model:W.model,choices:[{index:0,message:P,finish_reason:j}],usage:{prompt_tokens:A.usage?.inputTokens??0,completion_tokens:A.usage?.outputTokens??0,total_tokens:A.usage?.totalTokens??0}})}}catch(J){let G=J;if(G.name==="AbortError")return X.json(E7("Request aborted","invalid_request_error"),400);if(G.name==="MessageConversionError")return X.json(E7(G.message,"invalid_request_error","messages"),400);return console.error("[openai-compat] Error:",G.message,G.stack),X.json(E7(G.message,"server_error"),500)}});var g31=x31;var u31=new p8;u31.get("/",(X)=>{let Y={theme:YX1()};return X.json({success:!0,config:Y})});var m31=u31;qY0();var l31=new p8;l31.all("/",async(X)=>{return(await VY0(X.get("meshContext"))).fetch(X.req.raw)});var d31=l31;var TT={HEALTH:"/health",METRICS:"/metrics"},Tz={API:"/api/",API_AUTH:"/api/auth/",MCP:"/mcp/",OAUTH_PROXY:"/oauth-proxy/",WELL_KNOWN:"/.well-known",ORG:"/org/"},Oc6=/\.(html|css|js|ico|svg|png|jpg|jpeg|gif|webp|woff|woff2)$/;function p31(X){return X===TT.HEALTH||X===TT.METRICS||X.startsWith(Tz.WELL_KNOWN)}function Lc6(X){return X.startsWith(Tz.API)}function wc6(X){return X==="/mcp"||X.startsWith(Tz.MCP)}function Mc6(X){return X.startsWith(Tz.OAUTH_PROXY)}function Pc6(X){return Oc6.test(X)}function Tc6(X){return X.startsWith(Tz.ORG)}function c31(X){return Lc6(X)||wc6(X)||Mc6(X)||Tc6(X)||p31(X)}function n31(X){return X==="/"||X.startsWith(Tz.API_AUTH)||p31(X)||Pc6(X)}l80();var Of=null;async function Ac6(X,Y){let J=(await X.storage.connections.list(Y)).find((G)=>G.connection_url?.startsWith(fy0));if(!J?.configuration_state)return null;return J.configuration_state.project_locator}function Ec6(X){let Y=new URLSearchParams;if(X){let[Q,J]=X.split("/");if(Q)Y.set("workspace_hint",Q);if(J)Y.set("project_hint",J)}else Y.set("auto_personal","true");return Y.set("force_new","true"),Y}var jc6=new i31.PrometheusSerializer,Cc6=()=>z40(XZ),Ic6=()=>B40(XZ);function a31(X={}){let Y=X.database??Zb();if(Of&&Of.isRunning())console.log("[EventBus] Stopping previous worker (HMR cleanup)"),Promise.resolve(Of.stop()).catch(($)=>{console.error("[EventBus] Error stopping previous worker:",$)});let Q;if(X.eventBus)Q=X.eventBus;else Q=nW1(Y);Of=Q;let J=new p8;J.use("*",Qs({enabled:($)=>Fp0($,"debug")==="1"})),J.use("/*",Vp0({origin:($)=>{if($.includes("localhost")||$.includes("127.0.0.1"))return $;return $},credentials:!0,allowMethods:["GET","POST","PUT","DELETE","OPTIONS"],allowHeaders:["Content-Type","Authorization","mcp-protocol-version"],exposeHeaders:["WWW-Authenticate"]})),J.use("*",Bp0()),J.use("*",async($,K)=>{if(await K(),$.res.status>=500){let F=await $.res.clone().text();console.error(`[5xx Response] ${$.req.method} ${$.req.path} - ${$.res.status}:`,F)}}),J.get(TT.HEALTH,($)=>{return $.json({status:"ok",timestamp:new Date().toISOString(),version:"1.0.0"})}),J.get(TT.METRICS,async($)=>{try{let K=await kd.collect(),H=jc6.serialize(K.resourceMetrics);return $.text(H,200,{"Content-Type":"text/plain; version=0.0.4; charset=utf-8"})}catch(K){return console.error("Failed to collect metrics:",K),$.text("# Error collecting metrics",500)}}),J.route("/api/config",m31),J.route("/api/auth/custom",rW1),J.all("/api/auth/*",async($)=>{return await XZ.handler($.req.raw)}),J.route("/",EW1),J.all("/oauth-proxy/:connectionId/*",async($)=>{let K=$.req.param("connectionId"),H=$.req.path.split("/").filter(Boolean),F=H[H.length-1],V=$.get("meshContext");if(!V)V=await LK.create($.req.raw),$.set("meshContext",V);let q=await V.storage.connections.findById(K);if(!q?.connection_url)return $.json({error:"Connection not found"},404);let B=await nb(q.connection_url),D,N=new URL(q.connection_url);if(B.ok)D=(await B.json()).authorization_servers?.[0];if(!D)D=N.origin;let L=await jY0(D);if(!L.ok)return $.json({error:"Failed to get auth server metadata"},502);let w=await L.json(),C;if(F==="authorize")C=w.authorization_endpoint;else if(F==="token")C=w.token_endpoint;else if(F==="register")C=w.registration_endpoint;if(!C)return $.json({error:`Unknown OAuth endpoint: ${F}`},404);let T=new URL(C),A=new URL($.req.url);if(T.search=A.search,F==="authorize"){if(T.searchParams.has("resource"))T.searchParams.set("resource",q.connection_url);if(hy0(q.connection_url))try{let r=await Ac6(V,q.organization_id),x=Ec6(r);for(let[S,f]of x)T.searchParams.set(S,f)}catch(r){console.warn("[oauth-proxy] Failed to get smart OAuth params, proceeding without:",r)}return $.redirect(T.toString(),302)}let P={Accept:$.req.header("Accept")||"application/json"},j=$.req.header("Content-Type");if(j)P["Content-Type"]=j;let R=$.req.header("Authorization");if(R)P.Authorization=R;let k;if($.req.method!=="GET"&&$.req.method!=="HEAD")if(F==="token"&&j?.includes("application/x-www-form-urlencoded")){let r=await $.req.formData();if(r.has("resource"))r.set("resource",q.connection_url);let x=new URLSearchParams;for(let[S,f]of r.entries())x.append(S,f.toString());k=x.toString()}else k=$.req.raw.body??void 0;let _=await fetch(T.toString(),{method:$.req.method,headers:P,body:k,duplex:"half",redirect:"manual"}),y=new Headers,b=["connection","keep-alive","transfer-encoding","content-encoding","content-length"];for(let[r,x]of _.headers.entries())if(!b.includes(r.toLowerCase()))y.set(r,x);return new Response(_.body,{status:_.status,statusText:_.statusText,headers:y})}),J.get("/mcp/:gateway?/:connectionId/.well-known/oauth-protected-resource/*",async($)=>{let H=await Cc6()($.req.raw),F=await H.json();return Response.json(F,H)});let G=async($)=>{let H=await Ic6()($.req.raw),F=await H.json();return Response.json(F,H)};J.get("/.well-known/oauth-authorization-server/*/:gateway?/:connectionId?",G),LK.set(fW1({db:Y.db,databaseType:Y.type,auth:XZ,encryption:{key:process.env.ENCRYPTION_KEY||""},observability:{tracer:NN,meter:yj},eventBus:Q})),Promise.resolve(Q.start()).then(()=>{console.log("[EventBus] Worker started")}),J.use("*",async($,K)=>{if(n31($.req.path))return K();let H={measure:async(V,q)=>{ZU($,V);try{return await q()}finally{H3($,V)}}},F=await LK.create($.req.raw,{timings:H});return $.set("meshContext",F),K()}),J.get("/api/tools/management",($)=>{return $.json({tools:Js,grouped:Xw()})}),J.use("/mcp/*",async($,K)=>{ZU($,"mcp");try{return await K()}finally{H3($,"mcp")}});let W=async($,K)=>{let H=$.var.meshContext;if(!H.auth.user?.id&&!H.auth.apiKey?.id){let F=new URL($.req.url);return $.res=new Response(null,{status:401,headers:{"WWW-Authenticate":`Bearer realm="mcp",resource_metadata="${F.origin}${F.pathname}/.well-known/oauth-protected-resource"`}})}return await K()};J.use("/mcp/:connectionId?",W),J.use("/mcp/gateway/:virtualMcpId?",W),J.use("/mcp/virtual-mcp/:virtualMcpId?",W),J.use("/mcp/self",W),J.route("/mcp",LW1),J.route("/mcp/self",d31),J.route("/mcp",_W1),J.use("/api/:org/models/*",async($,K)=>{ZU($,"llm_models");try{return await K()}finally{H3($,"llm_models")}}),J.route("/api",O90),J.route("/api",g31),J.post("/org/:organizationId/events/:type",async($)=>{let K=$.req.param("organizationId");return await $.var.meshContext.eventBus.publish(K,Z3.SELF(K),{data:await $.req.json(),type:`public:${$.req.param("type")}`,subject:$.req.query("subject"),deliverAt:$.req.query("deliverAt"),cron:$.req.query("cron")}),$.json({success:!0})}),J.route("/api",b31);let Z=new BF(process.env.ENCRYPTION_KEY||"");return Y51(Y.db,Z),X51(J,{db:Y.db,vault:Z}),J.notFound(($)=>{return $.json({error:"Not Found",path:$.req.path},404)}),J.onError(($,K)=>{console.error("Server error :",$);let H=$ instanceof Error?$.message:"Unknown error";return K.json({error:"Internal Server Error",message:H},500)}),J}import r31 from"v8";import{rename as Rc6,mkdir as Sc6}from"fs/promises";import{join as kc6}from"path";function o31(X){let{port:Y,hostname:Q="0.0.0.0"}=X;return Bun.serve({port:Y,hostname:Q,fetch:async(J)=>{let G=new URL(J.url);if(G.pathname==="/health")return Response.json({status:"ok",uptime:process.uptime()});if(G.pathname==="/memory")return Response.json({...process.memoryUsage(),uptimeSeconds:process.uptime()});if(G.pathname==="/heap-snapshot"){let W=Date.now();try{let Z=r31.writeHeapSnapshot(),$=Bun.file(Z);return new Response($,{headers:{"Content-Type":"application/octet-stream","Content-Disposition":`attachment; filename="heap-${W}.heapsnapshot"`}})}catch(Z){return Response.json({error:String(Z)},{status:500})}}if(G.pathname==="/gc"){if(typeof Bun.gc==="function")return Bun.gc(!0),Response.json({status:"gc triggered"});return Response.json({status:"gc not available"},{status:501})}if(G.pathname==="/prestop-hook"){let W=process.env.PRESTOP_HEAP_SNAPSHOT_DIR;if(!W)return Response.json({status:"skipped",reason:"PRESTOP_HEAP_SNAPSHOT_DIR not set"});try{await Sc6(W,{recursive:!0});let Z=r31.writeHeapSnapshot(),$=process.env.HOSTNAME??process.env.POD_NAME??"unknown",K=new Date().toISOString().replace(/[:.]/g,"-"),H=`${$}-${K}.heapsnapshot`,F=kc6(W,H);await Rc6(Z,F);let V=process.memoryUsage();return console.log("[prestop-hook] Heap snapshot saved:",F),Response.json({status:"saved",path:F,memory:{rss:V.rss,heapUsed:V.heapUsed,external:V.external}})}catch(Z){return console.error("[prestop-hook] Failed to save heap snapshot:",Z),Response.json({error:String(Z)},{status:500})}}return Response.json({error:"Not found"},{status:404})}})}var t31=parseInt(process.env.PORT||"3000",10),s31=parseInt(process.env.DEBUG_PORT||"9090",10),vc6=process.env.ENABLE_DEBUG_SERVER==="true",Az="\x1B[0m",_c6="\x1B[1m",e31="\x1B[2m",yc6="\x1B[32m",XF1="\x1B[36m",YF1="\x1B[4m",bc6=`http://localhost:${t31}`,fc6=by0({clientDir:yy0(import.meta.url,"../client"),isServerPath:c31}),hc6=a31();console.log("");console.log(`${yc6}\u2713${Az} ${_c6}Ready${Az}`);console.log("");console.log(` ${e31}Open in browser:${Az} ${XF1}${YF1}${bc6}${Az}`);console.log("");Bun.serve({idleTimeout:0,port:t31,hostname:"0.0.0.0",fetch:async(X)=>{return await fc6(X)??hc6.fetch(X)},development:!1});if(vc6)o31({port:s31}),console.log(` ${e31}Debug server:${Az} ${XF1}${YF1}http://localhost:${s31}${Az}`),console.log("");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decocms/mesh",
3
- "version": "2.43.1",
3
+ "version": "2.43.2",
4
4
  "description": "MCP Mesh - Self-hostable MCP Gateway for managing AI connections and tools",
5
5
  "author": "Deco team",
6
6
  "license": "MIT",