@decocms/mesh 2.78.0 → 2.78.1

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.
@@ -1345,7 +1345,7 @@ Example input: "What tools are available?"
1345
1345
  Example output: Available Tools Overview`;function BZ0(Y){let X=Y.get("meshContext").organization;if(!X)throw Error("Organization context is required");if((X.slug??X.id)!==Y.req.param("org"))throw Error("Organization mismatch");return X}function ME1(Y){if(!Y.auth?.user?.id)throw Error("User ID is required");return Y.auth.user.id}async function AE1(Y){let Q=(await Y.listTools()).tools.map((J)=>{let{name:G,title:K,description:W,inputSchema:Z,outputSchema:H}=J;return[G,wO({title:K??G,description:W,inputSchema:uG(Z),outputSchema:H?uG(H):void 0,execute:(F,V)=>{return Y.callTool({name:J.name,arguments:F},Q7,{signal:V.abortSignal,timeout:wW0})},toModelOutput:({output:F})=>{if(F.isError)return{type:"error-text",value:F.content.map((q)=>q.type==="text"?q.text:null).filter(Boolean).join(`
1346
1346
  `)||"Unknown error"};if("structuredContent"in F)return{type:"json",value:F.structuredContent};return{type:"text",value:F.content.map(($)=>{if($.type==="text")return $.text;return JSON.stringify($)}).join(`
1347
1347
  `)}}})]});return Object.fromEntries(Q)}var UZ0=S(()=>{sY();EO();$q()});class PE1{thread;organizationId;storage;defaultWindowSize;constructor(Y){this.thread=Y.thread,this.organizationId=Y.thread.organizationId,this.storage=Y.storage,this.defaultWindowSize=Y.defaultWindowSize??50}async loadHistory(){let{messages:Y}=await this.storage.listMessages(this.thread.id);return Y}async save(Y){if(Y.length===0)return;await this.storage.saveMessages(Y)}async getPrunedHistory(Y){let X=await this.loadHistory(),Q=Y??this.defaultWindowSize;return X.slice(-Q)}}async function TE1(Y,X){let{threadId:Q,organizationId:J,userId:G,defaultWindowSize:K}=X,W;if(!Q)W=await Y.create({id:y4("thrd"),organizationId:J,createdBy:G});else{let Z=await Y.get(Q);if(!Z||Z.organizationId!==J)W=await Y.create({id:Z?y4("thrd"):Q,organizationId:J,createdBy:G});else W=Z}return new PE1({thread:W,storage:Y,defaultWindowSize:K})}var EE1=S(()=>{k5()});async function CE1(Y,X){let Q=ME1(Y),J=X.model.capabilities?.vision??!0,G=await TE1(Y.storage.threads,{organizationId:X.organizationId,threadId:X.threadId,userId:Q,defaultWindowSize:X.windowSize}),W=[...await G.loadHistory(),...X.messages];if(!J){if(W.some((D)=>D.parts?.some((O)=>O.type==="file")))throw new AW(400,{message:"This model does not support file uploads. Please change the model and try again."})}let Z=await DE1({messages:W}),F=await UE1(Z,{ignoreIncompleteToolCalls:!0}),V=[...X.systemPrompts.map((B)=>({role:"system",content:B})),...F.filter((B)=>B.role==="system")],$=F.filter((B)=>B.role!=="system"),q=OE1({messages:$,reasoning:"before-last-message",emptyMessages:"remove",toolCalls:"all"}).slice(-X.windowSize);return{memory:G,systemMessages:V,prunedMessages:q,originalMessages:Z}}var IE1=S(()=>{EO();u2();UZ0();EE1()});function RE1(Y){let X=Y.trim();if(!X)return null;if(X.startsWith("event:"))return null;if(X.startsWith("id:"))return null;if(X.startsWith("retry:"))return null;let Q=X;if(Q.startsWith("data:")){if(Q=Q.slice(5).trim(),!Q)return null;if(Q==="[DONE]")return null}try{return JSON.parse(Q)}catch(J){return console.warn("[llm-provider] Failed to parse stream line as JSON. Skipping line.",{line:Q.slice(0,200)},J),null}}function sH4(Y){if(!Y.body)throw Error("Response body is null");let X="";return Y.body.pipeThrough(new TextDecoderStream).pipeThrough(new TransformStream({transform(Q,J){X+=Q;let G=X.split(`
1348
- `);X=G.pop()??"";for(let K of G)if(K.trim()){let W=RE1(K);if(W)J.enqueue(W)}},flush(Q){if(X.trim()){let J=RE1(X);if(J)Q.enqueue(J)}}}))}function jE1(Y){let{prompt:X,...Q}=Y,J=X.map((G)=>{if((G.role==="assistant"||G.role==="tool")&&Array.isArray(G.content))return{...G,content:G.content.map(({providerOptions:K,...W})=>W)};return G});return{...Q,prompt:J}}var tH4=(Y)=>{return Object.fromEntries(Object.entries(Y).map(([X,Q])=>[X,Q.map((J)=>new RegExp(J))]))},BE=(Y)=>{return{imageModel:()=>{throw Error("Image models are not supported by this provider")},textEmbeddingModel:()=>{throw Error("Text embedding models are not supported by this provider")},listModels:async()=>{return await Y.COLLECTION_LLM_LIST({})},languageModel:(X)=>{let Q=Fq(()=>Y.LLM_METADATA({modelId:X}).then((J)=>tH4(J.supportedUrls)));return{specificationVersion:"v2",provider:"llm-binding",modelId:X,supportedUrls:Q,doGenerate:async(J)=>{let G=await Y.LLM_DO_GENERATE({callOptions:jE1(J),modelId:X}),K=G.response?.timestamp?new Date(G.response.timestamp):void 0;return{...G,response:{...G.response,timestamp:K},usage:{inputTokens:G.usage.inputTokens??void 0,outputTokens:G.usage.outputTokens??void 0,totalTokens:G.usage.totalTokens??void 0,reasoningTokens:G.usage.reasoningTokens??void 0}}},doStream:async(J)=>{let G=await Y.LLM_DO_STREAM({callOptions:jE1(J),modelId:X});if(!G.ok)throw Error(`Streaming failed for model ${X} with the status code: ${G.status}
1348
+ `);X=G.pop()??"";for(let K of G)if(K.trim()){let W=RE1(K);if(W)J.enqueue(W)}},flush(Q){if(X.trim()){let J=RE1(X);if(J)Q.enqueue(J)}}}))}function jE1(Y){let{prompt:X,...Q}=Y,J=X.map((G)=>{if((G.role==="assistant"||G.role==="tool")&&Array.isArray(G.content)){let{providerOptions:K,...W}=G;return{...W,content:G.content.map(({providerOptions:Z,...H})=>H)}}return G});return{...Q,prompt:J}}var tH4=(Y)=>{return Object.fromEntries(Object.entries(Y).map(([X,Q])=>[X,Q.map((J)=>new RegExp(J))]))},BE=(Y)=>{return{imageModel:()=>{throw Error("Image models are not supported by this provider")},textEmbeddingModel:()=>{throw Error("Text embedding models are not supported by this provider")},listModels:async()=>{return await Y.COLLECTION_LLM_LIST({})},languageModel:(X)=>{let Q=Fq(()=>Y.LLM_METADATA({modelId:X}).then((J)=>tH4(J.supportedUrls)));return{specificationVersion:"v2",provider:"llm-binding",modelId:X,supportedUrls:Q,doGenerate:async(J)=>{let G=await Y.LLM_DO_GENERATE({callOptions:jE1(J),modelId:X}),K=G.response?.timestamp?new Date(G.response.timestamp):void 0;return{...G,response:{...G.response,timestamp:K},usage:{inputTokens:G.usage.inputTokens??void 0,outputTokens:G.usage.outputTokens??void 0,totalTokens:G.usage.totalTokens??void 0,reasoningTokens:G.usage.reasoningTokens??void 0}}},doStream:async(J)=>{let G=await Y.LLM_DO_STREAM({callOptions:jE1(J),modelId:X});if(!G.ok)throw Error(`Streaming failed for model ${X} with the status code: ${G.status}
1349
1349
  ${await G.text()}`);return{stream:sH4(G),response:{headers:Object.fromEntries(G.headers?.entries()??[])}}}}}}};var DZ0=()=>{};async function SE1(Y,X){let Q=h2.forClient(Vq(Y)),J=BE(Q),G=J.languageModel(X.modelId),K=X.fastId?J.languageModel(X.fastId):void 0;return{model:G,modelId:X.modelId,connectionId:X.connectionId,cheapModel:K}}var kE1=S(()=>{zu();DZ0();$q()});function eH4(Y){if(!Y)return;if(!("models"in Y))return;return Y.models??void 0}function vE1(Y,X,Q){if(!Y)return!0;return Y.includes("*:*")||Y.includes(`${X}:*`)||Y.includes(`${X}:${Q}`)}function _E1(Y){if(!Y)return{allowAll:!0,models:{}};if(Y.includes("*:*"))return{allowAll:!0,models:{}};let X={};for(let Q of Y){let J=Q.indexOf(":");if(J===-1)continue;let G=Q.slice(0,J),K=Q.slice(J+1);if(!X[G])X[G]=[];X[G].push(K)}return{allowAll:!1,models:X}}async function OZ0(Y,X,Q){if(!Q||Au.includes(Q))return;let J=await Y.selectFrom("organizationRole").select(["permission"]).where("organizationId","=",X).where("role","=",Q).executeTakeFirst();if(!J?.permission)return;try{let G=JSON.parse(J.permission);return eH4(G)}catch{return console.error(`[model-permissions] Failed to parse permissions for role: ${Q}`),[]}}var yE1=S(()=>{Pu()});var Y34,X34,fE1;var hE1=S(()=>{b0();Y34=z.looseObject({id:z.string().optional(),role:z.enum(["user","assistant","system"]),parts:z.array(z.record(z.string(),z.unknown())),metadata:z.unknown().optional()}),X34=z.object({windowSize:z.number().default(Vg),threadId:z.string()}),fE1=z.object({messages:z.array(Y34),memory:X34.optional(),model:z.object({id:z.string(),connectionId:z.string(),fastId:z.string().optional().nullable().describe("ID of a fast/cheap model for background operations"),capabilities:z.object({vision:z.boolean().optional(),text:z.boolean().optional(),tools:z.boolean().optional()}).optional(),provider:z.enum(["openai","anthropic","google","xai","deepseek","openrouter","openai-compatible"]).optional().nullable(),limits:z.object({contextWindow:z.number().optional(),maxOutputTokens:z.number().optional()}).optional()}).loose(),agent:z.object({id:z.string(),mode:z.enum(["passthrough","smart_tool_selection","code_execution"])}).loose(),stream:z.boolean().optional(),temperature:z.number().default(0.5),thread_id:z.string().optional()})});async function bE1(Y){let{abortSignal:X,model:Q,userMessage:J,onTitle:G}=Y,K=new AbortController,W=()=>K.abort();X.addEventListener("abort",W,{once:!0});let Z=setTimeout(()=>{K.abort()},Q34);try{let F=(await Kg({model:Q,system:wE1,messages:[{role:"user",content:J}],maxOutputTokens:60,temperature:0.2,abortSignal:K.signal})).text.trim(),$=(F.split(`
1350
1350
  `)[0]??F).replace(/^["']|["']$/g,"").replace(/^(Title:|title:)\s*/i,"").replace(/[.!?]$/,"").slice(0,60).trim();G?.($)}catch(H){let F=H;if(F.name==="AbortError")console.warn("[decopilot:title] Title generation aborted (timeout or parent abort)");else console.error("[decopilot:title] \u274C Failed to generate title:",F.message)}finally{clearTimeout(Z),X.removeEventListener("abort",W)}}var Q34=2500;var xE1=S(()=>{EO()});async function J34(Y){let X=BZ0(Y),Q=await Y.req.json(),J=fE1.safeParse(Q);if(!J.success)throw new AW(400,{message:"Invalid request body"});return{organization:X,...J.data}}var NZ0,LZ0;var uE1=S(()=>{EO();fG();u2();bu();k5();IE1();UZ0();kE1();yE1();hE1();xE1();NZ0=new N9;NZ0.get("/:org/decopilot/allowed-models",async(Y)=>{try{let X=Y.get("meshContext"),Q=BZ0(Y),J=X.auth.user?.role,G=await OZ0(X.db,Q.id,J);return Y.json(_E1(G))}catch(X){if(console.error("[decopilot:allowed-models] Error",X),X instanceof AW)return Y.json({error:X.message},X.status);return Y.json({error:X instanceof Error?X.message:"Internal error"},500)}});NZ0.post("/:org/decopilot/stream",async(Y)=>{try{let X=Y.get("meshContext"),{organization:Q,model:J,agent:G,messages:K,temperature:W,memory:Z,thread_id:H}=await J34(Y),F=await OZ0(X.db,Q.id,X.auth.user?.role);if(!vE1(F,J.connectionId,J.id))throw new AW(403,{message:"Model not allowed for your role"});let V=Z?.windowSize??Vg,$=H??Z?.threadId,[q,B]=await Promise.all([X.storage.virtualMcps.findById(G.id,Q.id),X.createMCPProxy(J.connectionId)]);if(!q)throw Error("Agent not found");let D=await o2(q,X,G.mode),[O,L]=await Promise.all([AE1(D),SE1(B,{modelId:J.id,connectionId:J.connectionId,fastId:J.fastId??null})]),w=Y.req.raw.signal,R=D.getInstructions(),T=LE1(R),{memory:P,systemMessages:A,prunedMessages:I,originalMessages:j}=await CE1(X,{organizationId:Q.id,threadId:$,windowSize:V,messages:K,systemPrompts:[T],model:J}),k=I.length===1,y=J.limits?.maxOutputTokens??NE1,f=null;return Fg({model:L.model,system:A,messages:I,tools:O,temperature:W,maxOutputTokens:y,abortSignal:w,stopWhen:Zg(30),onStepFinish:async()=>{if(k&&f===null){let o=JSON.stringify(I[0]?.content),u=L.cheapModel??L.model;await bE1({abortSignal:w,model:u,userMessage:o,onTitle:(_)=>{f=_,X.storage.threads.update(P.thread.id,{title:_}).catch((l)=>{console.error("[decopilot:stream] Error updating thread title",l)})}}).catch((_)=>{console.error("[decopilot:stream] Error generating title",_)})}},onError:async(o)=>{throw console.error("[decopilot:stream] Error",o),o}}).toUIMessageStreamResponse({originalMessages:j,consumeSseStream:zZ0,messageMetadata:({part:o})=>{if(o.type==="start")return{agent:{id:G.id??null,mode:G.mode},model:{id:J.id,connectionId:J.connectionId},created_at:new Date,thread_id:P.thread.id};if(o.type==="reasoning-start")return{reasoning_start_at:new Date};if(o.type==="reasoning-end")return{reasoning_end_at:new Date};if(o.type==="finish-step")return{usage:{...o.usage,providerMetadata:o.providerMetadata}};if(o.type==="finish")return{title:f??void 0};return{}},onFinish:async({messages:o,isAborted:u,responseMessage:_})=>{if(u){let Y0=K[K.length-1],s=_,W0=s?.parts??[],N0=Y0?.parts??[];if(W0.length===0||N0.length===0)return;let A0=[{id:y4("msg"),role:"user",parts:N0,metadata:Y0?.metadata},{id:y4("msg"),role:"assistant",parts:W0,metadata:s?.metadata}].map((E0)=>{let x0=new Date().getTime(),z1=E0.role==="user"?x0:x0+1000;return{...E0,metadata:{...E0.metadata,title:f??void 0},createdAt:new Date(z1).toISOString(),updatedAt:new Date(z1).toISOString(),threadId:P.thread.id}});await P.save(A0).catch((E0)=>{console.error("[decopilot:stream] Error saving partial messages",E0)});return}let l=o.slice(-2).map((Y0)=>{let s=new Date().getTime(),W0=Y0.role==="user"?s:s+1000;return{...Y0,metadata:{...Y0.metadata,title:f??void 0},id:y4("msg"),createdAt:new Date(W0).toISOString(),updatedAt:new Date(W0).toISOString(),threadId:P.thread.id}});await P.save(l).catch((Y0)=>{console.error("[decopilot:stream] Error saving messages",Y0)})}})}catch(X){if(console.error("[decopilot:stream] Error",X),X instanceof AW)return Y.json({error:X.message},X.status);if(X instanceof Error&&X.name==="AbortError")return console.warn("[decopilot:stream] Aborted",{error:X.message}),Y.json({error:"Request aborted"},400);return console.error("[decopilot:stream] Failed",{error:X instanceof Error?X.message:JSON.stringify(X),stack:X instanceof Error?X.stack:void 0}),Y.json({error:X instanceof Error?X.message:JSON.stringify(X)},500)}});LZ0=NZ0});var gE1=S(()=>{uE1()});var $g,mE1;var lE1=S(()=>{fG();Nu();$g=new N9;$g.post("/connections/:connectionId/oauth-token",async(Y)=>{let X=Y.get("meshContext"),Q=Y.req.param("connectionId");if(!(X.auth.user?.id??X.auth.apiKey?.userId??null))return Y.json({error:"Unauthorized"},401);if(!await X.storage.connections.findById(Q,X.organization?.id))return Y.json({error:"Connection not found"},404);let K=await Y.req.json();if(!K.accessToken)return Y.json({error:"accessToken is required"},400);if(K.tokenEndpoint){let V;try{V=new URL(K.tokenEndpoint)}catch{return Y.json({error:"tokenEndpoint must be a valid URL"},400)}if(V.protocol!=="http:"&&V.protocol!=="https:")return Y.json({error:"tokenEndpoint must be an http(s) URL"},400)}let W=K.expiresIn?new Date(Date.now()+K.expiresIn*1000):null,Z=new FK(X.db,X.vault),H={connectionId:Q,accessToken:K.accessToken,refreshToken:K.refreshToken??null,scope:K.scope??null,expiresAt:W,clientId:K.clientId??null,clientSecret:K.clientSecret??null,tokenEndpoint:K.tokenEndpoint??null},F=await Z.upsert(H);return Y.json({success:!0,expiresAt:F.expiresAt})});$g.delete("/connections/:connectionId/oauth-token",async(Y)=>{let X=Y.get("meshContext"),Q=Y.req.param("connectionId");if(!(X.auth.user?.id??X.auth.apiKey?.userId??null))return Y.json({error:"Unauthorized"},401);return await new FK(X.db,X.vault).delete(Q),Y.json({success:!0})});$g.get("/connections/:connectionId/oauth-token/status",async(Y)=>{let X=Y.get("meshContext"),Q=Y.req.param("connectionId");if(!(X.auth.user?.id??X.auth.apiKey?.userId??null))return Y.json({error:"Unauthorized"},401);let G=new FK(X.db,X.vault),K=await G.get(Q);if(!K)return Y.json({hasToken:!1,isExpired:!0,canRefresh:!1});let W=G.isExpired(K),Z=!!K.refreshToken&&!!K.tokenEndpoint;return Y.json({hasToken:!0,isExpired:W,canRefresh:Z,expiresAt:K.expiresAt})});mE1=$g});var wZ0=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(Y,X){this.writable=Y,this.writer=Y.getWriter(),this.encoder=new TextEncoder;let Q=X.getReader();this.abortSubscribers.push(async()=>{await Q.cancel()}),this.responseReadable=new ReadableStream({async pull(J){let{done:G,value:K}=await Q.read();G?J.close():J.enqueue(K)},cancel:()=>{this.abort()}})}async write(Y){try{if(typeof Y==="string")Y=this.encoder.encode(Y);await this.writer.write(Y)}catch{}return this}async writeln(Y){return await this.write(Y+`
1351
1351
  `),this}sleep(Y){return new Promise((X)=>setTimeout(X,Y))}async close(){try{await this.writer.close()}catch{}this.closed=!0}async pipe(Y){this.writer.releaseLock(),await Y.pipeTo(this.writable,{preventClose:!0}),this.writer=this.writable.getWriter()}onAbort(Y){this.abortSubscribers.push(Y)}abort(){if(!this.aborted)this.aborted=!0,this.abortSubscribers.forEach((Y)=>Y())}};var MZ0=()=>{};var qg=()=>{let Y=typeof Bun<"u"?Bun.version:void 0;if(Y===void 0)return!1;let X=Y.startsWith("1.1")||Y.startsWith("1.0")||Y.startsWith("0.");return qg=()=>X,X};var AZ0=()=>{};var dE1=S(()=>{MZ0();AZ0()});var pE1,G34=async(Y,X,Q)=>{try{await X(Y)}catch(J){if(J instanceof Error&&Q)await Q(J,Y),await Y.writeSSE({event:"error",data:J.message});else console.error(J)}finally{Y.close()}},W34,PZ0=(Y,X,Q)=>{let{readable:J,writable:G}=new TransformStream,K=new pE1(G,J);if(qg())Y.req.raw.signal.addEventListener("abort",()=>{if(!K.closed)K.abort()});return W34.set(K.responseReadable,Y),Y.header("Transfer-Encoding","chunked"),Y.header("Content-Type","text/event-stream"),Y.header("Cache-Control","no-cache"),Y.header("Connection","keep-alive"),G34(K,X,Q),Y.newResponse(K.responseReadable)};var cE1=S(()=>{p70();MZ0();AZ0();pE1=class extends wZ0{constructor(Y,X){super(Y,X)}async writeSSE(Y){let Q=(await l2(Y.data,Ru.Stringify,!1,{})).split(/\r\n|\r|\n/).map((G)=>{return`data: ${G}`}).join(`
@@ -1166,7 +1166,7 @@ Example input: "What tools are available?"
1166
1166
  Example output: Available Tools Overview`;gY();function AG0(Y){let X=Y.get("meshContext").organization;if(!X)throw Error("Organization context is required");if((X.slug??X.id)!==Y.req.param("org"))throw Error("Organization mismatch");return X}function ww1(Y){if(!Y.auth?.user?.id)throw Error("User ID is required");return Y.auth.user.id}async function Mw1(Y){let Q=(await Y.listTools()).tools.map((J)=>{let{name:G,title:K,description:W,inputSchema:Z,outputSchema:H}=J;return[G,vD({title:K??G,description:W,inputSchema:DG(Z),outputSchema:H?DG(H):void 0,execute:(F,V)=>{return Y.callTool({name:J.name,arguments:F},J7,{signal:V.abortSignal,timeout:k50})},toModelOutput:({output:F})=>{if(F.isError)return{type:"error-text",value:F.content.map((q)=>q.type==="text"?q.text:null).filter(Boolean).join(`
1167
1167
  `)||"Unknown error"};if("structuredContent"in F)return{type:"json",value:F.structuredContent};return{type:"text",value:F.content.map(($)=>{if($.type==="text")return $.text;return JSON.stringify($)}).join(`
1168
1168
  `)}}})]});return Object.fromEntries(Q)}V5();class Aw1{thread;organizationId;storage;defaultWindowSize;constructor(Y){this.thread=Y.thread,this.organizationId=Y.thread.organizationId,this.storage=Y.storage,this.defaultWindowSize=Y.defaultWindowSize??50}async loadHistory(){let{messages:Y}=await this.storage.listMessages(this.thread.id);return Y}async save(Y){if(Y.length===0)return;await this.storage.saveMessages(Y)}async getPrunedHistory(Y){let X=await this.loadHistory(),Q=Y??this.defaultWindowSize;return X.slice(-Q)}}async function Pw1(Y,X){let{threadId:Q,organizationId:J,userId:G,defaultWindowSize:K}=X,W;if(!Q)W=await Y.create({id:k4("thrd"),organizationId:J,createdBy:G});else{let Z=await Y.get(Q);if(!Z||Z.organizationId!==J)W=await Y.create({id:Z?k4("thrd"):Q,organizationId:J,createdBy:G});else W=Z}return new Aw1({thread:W,storage:Y,defaultWindowSize:K})}async function Tw1(Y,X){let Q=ww1(Y),J=X.model.capabilities?.vision??!0,G=await Pw1(Y.storage.threads,{organizationId:X.organizationId,threadId:X.threadId,userId:Q,defaultWindowSize:X.windowSize}),W=[...await G.loadHistory(),...X.messages];if(!J){if(W.some((D)=>D.parts?.some((O)=>O.type==="file")))throw new iG(400,{message:"This model does not support file uploads. Please change the model and try again."})}let Z=await Uw1({messages:W}),F=await zw1(Z,{ignoreIncompleteToolCalls:!0}),V=[...X.systemPrompts.map((z)=>({role:"system",content:z})),...F.filter((z)=>z.role==="system")],$=F.filter((z)=>z.role!=="system"),q=Dw1({messages:$,reasoning:"before-last-message",emptyMessages:"remove",toolCalls:"all"}).slice(-X.windowSize);return{memory:G,systemMessages:V,prunedMessages:q,originalMessages:Z}}Wx();function Ew1(Y){let X=Y.trim();if(!X)return null;if(X.startsWith("event:"))return null;if(X.startsWith("id:"))return null;if(X.startsWith("retry:"))return null;let Q=X;if(Q.startsWith("data:")){if(Q=Q.slice(5).trim(),!Q)return null;if(Q==="[DONE]")return null}try{return JSON.parse(Q)}catch(J){return console.warn("[llm-provider] Failed to parse stream line as JSON. Skipping line.",{line:Q.slice(0,200)},J),null}}function BJ4(Y){if(!Y.body)throw Error("Response body is null");let X="";return Y.body.pipeThrough(new TextDecoderStream).pipeThrough(new TransformStream({transform(Q,J){X+=Q;let G=X.split(`
1169
- `);X=G.pop()??"";for(let K of G)if(K.trim()){let W=Ew1(K);if(W)J.enqueue(W)}},flush(Q){if(X.trim()){let J=Ew1(X);if(J)Q.enqueue(J)}}}))}var zJ4=(Y)=>{return Object.fromEntries(Object.entries(Y).map(([X,Q])=>[X,Q.map((J)=>new RegExp(J))]))};function Cw1(Y){let{prompt:X,...Q}=Y,J=X.map((G)=>{if((G.role==="assistant"||G.role==="tool")&&Array.isArray(G.content))return{...G,content:G.content.map(({providerOptions:K,...W})=>W)};return G});return{...Q,prompt:J}}var q2=(Y)=>{return{imageModel:()=>{throw Error("Image models are not supported by this provider")},textEmbeddingModel:()=>{throw Error("Text embedding models are not supported by this provider")},listModels:async()=>{return await Y.COLLECTION_LLM_LIST({})},languageModel:(X)=>{let Q=S$(()=>Y.LLM_METADATA({modelId:X}).then((J)=>zJ4(J.supportedUrls)));return{specificationVersion:"v2",provider:"llm-binding",modelId:X,supportedUrls:Q,doGenerate:async(J)=>{let G=await Y.LLM_DO_GENERATE({callOptions:Cw1(J),modelId:X}),K=G.response?.timestamp?new Date(G.response.timestamp):void 0;return{...G,response:{...G.response,timestamp:K},usage:{inputTokens:G.usage.inputTokens??void 0,outputTokens:G.usage.outputTokens??void 0,totalTokens:G.usage.totalTokens??void 0,reasoningTokens:G.usage.reasoningTokens??void 0}}},doStream:async(J)=>{let G=await Y.LLM_DO_STREAM({callOptions:Cw1(J),modelId:X});if(!G.ok)throw Error(`Streaming failed for model ${X} with the status code: ${G.status}
1169
+ `);X=G.pop()??"";for(let K of G)if(K.trim()){let W=Ew1(K);if(W)J.enqueue(W)}},flush(Q){if(X.trim()){let J=Ew1(X);if(J)Q.enqueue(J)}}}))}var zJ4=(Y)=>{return Object.fromEntries(Object.entries(Y).map(([X,Q])=>[X,Q.map((J)=>new RegExp(J))]))};function Cw1(Y){let{prompt:X,...Q}=Y,J=X.map((G)=>{if((G.role==="assistant"||G.role==="tool")&&Array.isArray(G.content)){let{providerOptions:K,...W}=G;return{...W,content:G.content.map(({providerOptions:Z,...H})=>H)}}return G});return{...Q,prompt:J}}var q2=(Y)=>{return{imageModel:()=>{throw Error("Image models are not supported by this provider")},textEmbeddingModel:()=>{throw Error("Text embedding models are not supported by this provider")},listModels:async()=>{return await Y.COLLECTION_LLM_LIST({})},languageModel:(X)=>{let Q=S$(()=>Y.LLM_METADATA({modelId:X}).then((J)=>zJ4(J.supportedUrls)));return{specificationVersion:"v2",provider:"llm-binding",modelId:X,supportedUrls:Q,doGenerate:async(J)=>{let G=await Y.LLM_DO_GENERATE({callOptions:Cw1(J),modelId:X}),K=G.response?.timestamp?new Date(G.response.timestamp):void 0;return{...G,response:{...G.response,timestamp:K},usage:{inputTokens:G.usage.inputTokens??void 0,outputTokens:G.usage.outputTokens??void 0,totalTokens:G.usage.totalTokens??void 0,reasoningTokens:G.usage.reasoningTokens??void 0}}},doStream:async(J)=>{let G=await Y.LLM_DO_STREAM({callOptions:Cw1(J),modelId:X});if(!G.ok)throw Error(`Streaming failed for model ${X} with the status code: ${G.status}
1170
1170
  ${await G.text()}`);return{stream:BJ4(G),response:{headers:Object.fromEntries(G.headers?.entries()??[])}}}}}}};async function Iw1(Y,X){let Q=lT.forClient(j$(Y)),J=q2(Q),G=J.languageModel(X.modelId),K=X.fastId?J.languageModel(X.fastId):void 0;return{model:G,modelId:X.modelId,connectionId:X.connectionId,cheapModel:K}}function UJ4(Y){if(!Y)return;if(!("models"in Y))return;return Y.models??void 0}function Rw1(Y,X,Q){if(!Y)return!0;return Y.includes("*:*")||Y.includes(`${X}:*`)||Y.includes(`${X}:${Q}`)}function Sw1(Y){if(!Y)return{allowAll:!0,models:{}};if(Y.includes("*:*"))return{allowAll:!0,models:{}};let X={};for(let Q of Y){let J=Q.indexOf(":");if(J===-1)continue;let G=Q.slice(0,J),K=Q.slice(J+1);if(!X[G])X[G]=[];X[G].push(K)}return{allowAll:!1,models:X}}async function PG0(Y,X,Q){if(!Q||zx.includes(Q))return;let J=await Y.selectFrom("organizationRole").select(["permission"]).where("organizationId","=",X).where("role","=",Q).executeTakeFirst();if(!J?.permission)return;try{let G=JSON.parse(J.permission);return UJ4(G)}catch{return console.error(`[model-permissions] Failed to parse permissions for role: ${Q}`),[]}}h0();var DJ4=B.looseObject({id:B.string().optional(),role:B.enum(["user","assistant","system"]),parts:B.array(B.record(B.string(),B.unknown())),metadata:B.unknown().optional()}),OJ4=B.object({windowSize:B.number().default(lx),threadId:B.string()}),jw1=B.object({messages:B.array(DJ4),memory:OJ4.optional(),model:B.object({id:B.string(),connectionId:B.string(),fastId:B.string().optional().nullable().describe("ID of a fast/cheap model for background operations"),capabilities:B.object({vision:B.boolean().optional(),text:B.boolean().optional(),tools:B.boolean().optional()}).optional(),provider:B.enum(["openai","anthropic","google","xai","deepseek","openrouter","openai-compatible"]).optional().nullable(),limits:B.object({contextWindow:B.number().optional(),maxOutputTokens:B.number().optional()}).optional()}).loose(),agent:B.object({id:B.string(),mode:B.enum(["passthrough","smart_tool_selection","code_execution"])}).loose(),stream:B.boolean().optional(),temperature:B.number().default(0.5),thread_id:B.string().optional()});var NJ4=2500;async function kw1(Y){let{abortSignal:X,model:Q,userMessage:J,onTitle:G}=Y,K=new AbortController,W=()=>K.abort();X.addEventListener("abort",W,{once:!0});let Z=setTimeout(()=>{K.abort()},NJ4);try{let F=(await ux({model:Q,system:Lw1,messages:[{role:"user",content:J}],maxOutputTokens:60,temperature:0.2,abortSignal:K.signal})).text.trim(),$=(F.split(`
1171
1171
  `)[0]??F).replace(/^["']|["']$/g,"").replace(/^(Title:|title:)\s*/i,"").replace(/[.!?]$/,"").slice(0,60).trim();G?.($)}catch(H){let F=H;if(F.name==="AbortError")console.warn("[decopilot:title] Title generation aborted (timeout or parent abort)");else console.error("[decopilot:title] \u274C Failed to generate title:",F.message)}finally{clearTimeout(Z),X.removeEventListener("abort",W)}}async function LJ4(Y){let X=AG0(Y),Q=await Y.req.json(),J=jw1.safeParse(Q);if(!J.success)throw new iG(400,{message:"Invalid request body"});return{organization:X,...J.data}}var TG0=new J9;TG0.get("/:org/decopilot/allowed-models",async(Y)=>{try{let X=Y.get("meshContext"),Q=AG0(Y),J=X.auth.user?.role,G=await PG0(X.db,Q.id,J);return Y.json(Sw1(G))}catch(X){if(console.error("[decopilot:allowed-models] Error",X),X instanceof iG)return Y.json({error:X.message},X.status);return Y.json({error:X instanceof Error?X.message:"Internal error"},500)}});TG0.post("/:org/decopilot/stream",async(Y)=>{try{let X=Y.get("meshContext"),{organization:Q,model:J,agent:G,messages:K,temperature:W,memory:Z,thread_id:H}=await LJ4(Y),F=await PG0(X.db,Q.id,X.auth.user?.role);if(!Rw1(F,J.connectionId,J.id))throw new iG(403,{message:"Model not allowed for your role"});let V=Z?.windowSize??lx,$=H??Z?.threadId,[q,z]=await Promise.all([X.storage.virtualMcps.findById(G.id,Q.id),X.createMCPProxy(J.connectionId)]);if(!q)throw Error("Agent not found");let D=await aT(q,X,G.mode),[O,L]=await Promise.all([Mw1(D),Iw1(z,{modelId:J.id,connectionId:J.connectionId,fastId:J.fastId??null})]),w=Y.req.raw.signal,R=D.getInstructions(),T=Nw1(R),{memory:P,systemMessages:A,prunedMessages:I,originalMessages:S}=await Tw1(X,{organizationId:Q.id,threadId:$,windowSize:V,messages:K,systemPrompts:[T],model:J}),j=I.length===1,_=J.limits?.maxOutputTokens??Ow1,y=null;return mx({model:L.model,system:A,messages:I,tools:O,temperature:W,maxOutputTokens:_,abortSignal:w,stopWhen:xx(30),onStepFinish:async()=>{if(j&&y===null){let o=JSON.stringify(I[0]?.content),x=L.cheapModel??L.model;await kw1({abortSignal:w,model:x,userMessage:o,onTitle:(v)=>{y=v,X.storage.threads.update(P.thread.id,{title:v}).catch((l)=>{console.error("[decopilot:stream] Error updating thread title",l)})}}).catch((v)=>{console.error("[decopilot:stream] Error generating title",v)})}},onError:async(o)=>{throw console.error("[decopilot:stream] Error",o),o}}).toUIMessageStreamResponse({originalMessages:S,consumeSseStream:MG0,messageMetadata:({part:o})=>{if(o.type==="start")return{agent:{id:G.id??null,mode:G.mode},model:{id:J.id,connectionId:J.connectionId},created_at:new Date,thread_id:P.thread.id};if(o.type==="reasoning-start")return{reasoning_start_at:new Date};if(o.type==="reasoning-end")return{reasoning_end_at:new Date};if(o.type==="finish-step")return{usage:{...o.usage,providerMetadata:o.providerMetadata}};if(o.type==="finish")return{title:y??void 0};return{}},onFinish:async({messages:o,isAborted:x,responseMessage:v})=>{if(x){let Y0=K[K.length-1],s=v,W0=s?.parts??[],N0=Y0?.parts??[];if(W0.length===0||N0.length===0)return;let A0=[{id:k4("msg"),role:"user",parts:N0,metadata:Y0?.metadata},{id:k4("msg"),role:"assistant",parts:W0,metadata:s?.metadata}].map((E0)=>{let b0=new Date().getTime(),q1=E0.role==="user"?b0:b0+1000;return{...E0,metadata:{...E0.metadata,title:y??void 0},createdAt:new Date(q1).toISOString(),updatedAt:new Date(q1).toISOString(),threadId:P.thread.id}});await P.save(A0).catch((E0)=>{console.error("[decopilot:stream] Error saving partial messages",E0)});return}let l=o.slice(-2).map((Y0)=>{let s=new Date().getTime(),W0=Y0.role==="user"?s:s+1000;return{...Y0,metadata:{...Y0.metadata,title:y??void 0},id:k4("msg"),createdAt:new Date(W0).toISOString(),updatedAt:new Date(W0).toISOString(),threadId:P.thread.id}});await P.save(l).catch((Y0)=>{console.error("[decopilot:stream] Error saving messages",Y0)})}})}catch(X){if(console.error("[decopilot:stream] Error",X),X instanceof iG)return Y.json({error:X.message},X.status);if(X instanceof Error&&X.name==="AbortError")return console.warn("[decopilot:stream] Aborted",{error:X.message}),Y.json({error:"Request aborted"},400);return console.error("[decopilot:stream] Failed",{error:X instanceof Error?X.message:JSON.stringify(X),stack:X instanceof Error?X.stack:void 0}),Y.json({error:X instanceof Error?X.message:JSON.stringify(X)},500)}});var EG0=TG0;Vx();var dx=new J9;dx.post("/connections/:connectionId/oauth-token",async(Y)=>{let X=Y.get("meshContext"),Q=Y.req.param("connectionId");if(!(X.auth.user?.id??X.auth.apiKey?.userId??null))return Y.json({error:"Unauthorized"},401);if(!await X.storage.connections.findById(Q,X.organization?.id))return Y.json({error:"Connection not found"},404);let K=await Y.req.json();if(!K.accessToken)return Y.json({error:"accessToken is required"},400);if(K.tokenEndpoint){let V;try{V=new URL(K.tokenEndpoint)}catch{return Y.json({error:"tokenEndpoint must be a valid URL"},400)}if(V.protocol!=="http:"&&V.protocol!=="https:")return Y.json({error:"tokenEndpoint must be an http(s) URL"},400)}let W=K.expiresIn?new Date(Date.now()+K.expiresIn*1000):null,Z=new yZ(X.db,X.vault),H={connectionId:Q,accessToken:K.accessToken,refreshToken:K.refreshToken??null,scope:K.scope??null,expiresAt:W,clientId:K.clientId??null,clientSecret:K.clientSecret??null,tokenEndpoint:K.tokenEndpoint??null},F=await Z.upsert(H);return Y.json({success:!0,expiresAt:F.expiresAt})});dx.delete("/connections/:connectionId/oauth-token",async(Y)=>{let X=Y.get("meshContext"),Q=Y.req.param("connectionId");if(!(X.auth.user?.id??X.auth.apiKey?.userId??null))return Y.json({error:"Unauthorized"},401);return await new yZ(X.db,X.vault).delete(Q),Y.json({success:!0})});dx.get("/connections/:connectionId/oauth-token/status",async(Y)=>{let X=Y.get("meshContext"),Q=Y.req.param("connectionId");if(!(X.auth.user?.id??X.auth.apiKey?.userId??null))return Y.json({error:"Unauthorized"},401);let G=new yZ(X.db,X.vault),K=await G.get(Q);if(!K)return Y.json({hasToken:!1,isExpired:!0,canRefresh:!1});let W=G.isExpired(K),Z=!!K.refreshToken&&!!K.tokenEndpoint;return Y.json({hasToken:!0,isExpired:W,canRefresh:Z,expiresAt:K.expiresAt})});var vw1=dx;Wx();var CG0=class{writer;encoder;writable;abortSubscribers=[];responseReadable;aborted=!1;closed=!1;constructor(Y,X){this.writable=Y,this.writer=Y.getWriter(),this.encoder=new TextEncoder;let Q=X.getReader();this.abortSubscribers.push(async()=>{await Q.cancel()}),this.responseReadable=new ReadableStream({async pull(J){let{done:G,value:K}=await Q.read();G?J.close():J.enqueue(K)},cancel:()=>{this.abort()}})}async write(Y){try{if(typeof Y==="string")Y=this.encoder.encode(Y);await this.writer.write(Y)}catch{}return this}async writeln(Y){return await this.write(Y+`
1172
1172
  `),this}sleep(Y){return new Promise((X)=>setTimeout(X,Y))}async close(){try{await this.writer.close()}catch{}this.closed=!0}async pipe(Y){this.writer.releaseLock(),await Y.pipeTo(this.writable,{preventClose:!0}),this.writer=this.writable.getWriter()}onAbort(Y){this.abortSubscribers.push(Y)}abort(){if(!this.aborted)this.aborted=!0,this.abortSubscribers.forEach((Y)=>Y())}};var px=()=>{let Y=typeof Bun<"u"?Bun.version:void 0;if(Y===void 0)return!1;let X=Y.startsWith("1.1")||Y.startsWith("1.0")||Y.startsWith("0.");return px=()=>X,X};var _w1=class extends CG0{constructor(Y,X){super(Y,X)}async writeSSE(Y){let Q=(await vM(Y.data,z_.Stringify,!1,{})).split(/\r\n|\r|\n/).map((G)=>{return`data: ${G}`}).join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decocms/mesh",
3
- "version": "2.78.0",
3
+ "version": "2.78.1",
4
4
  "description": "MCP Mesh - Self-hostable MCP Gateway for managing AI connections and tools",
5
5
  "author": "Deco team",
6
6
  "license": "MIT",