next-workflow-builder 0.7.1 → 0.7.4
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.
- package/CHANGELOG.md +33 -0
- package/dist/chunk-3YVRTDK2.js +1 -0
- package/dist/chunk-CI7FTYZR.js +42 -0
- package/dist/chunk-VUDOAZ3W.js +14 -0
- package/dist/chunk-WT4BSMUD.js +1 -0
- package/dist/client/index.d.ts +12 -2
- package/dist/client/index.js +36 -17
- package/dist/handler-67JKCHM5.js +1 -0
- package/dist/run-workflow-VFZV5YLI.js +1 -0
- package/dist/run-workflows-in-sequence-3APONBOX.js +1 -0
- package/dist/server/api/index.js +2 -2
- package/dist/styles.css +29 -0
- package/package.json +1 -1
- package/dist/chunk-DMHGXYVW.js +0 -14
- package/dist/chunk-QMJQ5NK5.js +0 -42
- package/dist/handler-YTQRRHEK.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as N,e as I}from"./chunk-CI7FTYZR.js";import"./chunk-WT4BSMUD.js";import"./chunk-VUDOAZ3W.js";import"./chunk-3YVRTDK2.js";import{b as O}from"./chunk-IEOZJAW2.js";import"./chunk-6UXAINJQ.js";import"./chunk-BNX2SV7E.js";import{i as k}from"./chunk-KFTXS23Q.js";import{k as h,w as A}from"./chunk-QRG4O4PE.js";import{a as m,i as c,j as l,k as f,l as g,o as s}from"./chunk-5J6TNMJG.js";import{WebStandardStreamableHTTPServerTransport as W}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";import{withMcpAuth as _}from"better-auth/plugins";import{McpServer as E}from"@modelcontextprotocol/sdk/server/mcp.js";import{and as y,desc as v,eq as a,inArray as J}from"drizzle-orm";import{z as r}from"zod";function T(d,i){d.registerTool("list_workflows",{description:"List the authenticated user's workflows",inputSchema:{limit:r.number().optional(),offset:r.number().optional()}},async({limit:e,offset:t})=>{let o=await s.select().from(c).where(a(c.userId,i)).orderBy(v(c.updatedAt)).limit(e??50).offset(t??0);return{content:[{type:"text",text:JSON.stringify(o.map(n=>({...n,createdAt:n.createdAt.toISOString(),updatedAt:n.updatedAt.toISOString()})))}]}}),d.registerTool("get_workflow",{description:"Get a workflow by ID",inputSchema:{workflowId:r.string()}},async({workflowId:e})=>{let t=await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))});return t?{content:[{type:"text",text:JSON.stringify({...t,createdAt:t.createdAt.toISOString(),updatedAt:t.updatedAt.toISOString()})}]}:{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]}}),d.registerTool("create_workflow",{description:"Create a new workflow",inputSchema:{name:r.string(),description:r.string().optional(),nodes:r.array(r.record(r.string(),r.unknown())),edges:r.array(r.record(r.string(),r.unknown()))}},async({name:e,description:t,nodes:o,edges:n})=>{if(!(await k(o,i)).valid)return{content:[{type:"text",text:JSON.stringify({error:"Invalid integration references"})}]};let x=m(),[u]=await s.insert(c).values({id:x,name:e,description:t,nodes:o,edges:n,userId:i}).returning();return{content:[{type:"text",text:JSON.stringify({...u,createdAt:u.createdAt.toISOString(),updatedAt:u.updatedAt.toISOString()})}]}}),d.registerTool("update_workflow",{description:"Update an existing workflow",inputSchema:{workflowId:r.string(),name:r.string().optional(),description:r.string().optional(),nodes:r.array(r.record(r.string(),r.unknown())).optional(),edges:r.array(r.record(r.string(),r.unknown())).optional()}},async({workflowId:e,name:t,description:o,nodes:n,edges:w})=>{if(!await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))}))return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};if(n&&!(await k(n,i)).valid)return{content:[{type:"text",text:JSON.stringify({error:"Invalid integration references"})}]};let u={updatedAt:new Date};t!==void 0&&(u.name=t),o!==void 0&&(u.description=o),n!==void 0&&(u.nodes=n),w!==void 0&&(u.edges=w);let[p]=await s.update(c).set(u).where(a(c.id,e)).returning();return{content:[{type:"text",text:JSON.stringify({...p,createdAt:p.createdAt.toISOString(),updatedAt:p.updatedAt.toISOString()})}]}}),d.registerTool("delete_workflow",{description:"Delete a workflow",inputSchema:{workflowId:r.string()}},async({workflowId:e})=>{if(!await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))}))return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};let n=(await s.query.workflowExecutions.findMany({where:a(f.workflowId,e),columns:{id:!0}})).map(w=>w.id);return n.length>0&&(await s.delete(g).where(J(g.executionId,n)),await s.delete(f).where(a(f.workflowId,e))),await s.delete(c).where(a(c.id,e)),{content:[{type:"text",text:JSON.stringify({success:!0})}]}}),d.registerTool("duplicate_workflow",{description:"Duplicate a workflow",inputSchema:{workflowId:r.string()}},async({workflowId:e})=>{let t=await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))});if(!t)return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};let o=t.nodes,n=o.map(p=>({...p,id:m()})),w=new Map(o.map((p,S)=>[p.id,n[S].id])),x=t.edges.map(p=>({...p,id:m(),source:w.get(p.source)||p.source,target:w.get(p.target)||p.target})),[u]=await s.insert(c).values({id:m(),name:`${t.name} (Copy)`,description:t.description,nodes:n,edges:x,userId:i,visibility:"private"}).returning();return{content:[{type:"text",text:JSON.stringify({...u,createdAt:u.createdAt.toISOString(),updatedAt:u.updatedAt.toISOString()})}]}}),d.registerTool("execute_workflow",{description:"Execute a workflow",inputSchema:{workflowId:r.string(),input:r.record(r.string(),r.unknown()).optional()}},async({workflowId:e,input:t})=>{let o=await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))});if(!o)return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};if(!(await k(o.nodes,i)).valid)return{content:[{type:"text",text:JSON.stringify({error:"Invalid integration references"})}]};let[w]=await s.insert(f).values({workflowId:e,userId:i,status:"running",input:t??{}}).returning();return I(w.id,e,o.nodes,o.edges,t??{}),{content:[{type:"text",text:JSON.stringify({executionId:w.id,status:"running"})}]}}),d.registerTool("get_execution_status",{description:"Get execution status and logs",inputSchema:{executionId:r.string()}},async({executionId:e})=>{let t=await s.query.workflowExecutions.findFirst({where:a(f.id,e),with:{workflow:!0}});if(!t||t.workflow.userId!==i)return{content:[{type:"text",text:JSON.stringify({error:"Execution not found"})}]};let o=await s.query.workflowExecutionLogs.findMany({where:a(g.executionId,e),orderBy:[v(g.timestamp)]});return{content:[{type:"text",text:JSON.stringify({status:t.status,input:t.input,output:t.output,error:t.error,startedAt:t.startedAt.toISOString(),completedAt:t.completedAt?.toISOString(),logs:o.map(n=>({nodeId:n.nodeId,nodeName:n.nodeName,nodeType:n.nodeType,status:n.status,input:n.input,output:n.output,error:n.error}))})}]}}),d.registerTool("cancel_execution",{description:"Cancel a running workflow execution",inputSchema:{executionId:r.string()}},async({executionId:e})=>{let t=await s.query.workflowExecutions.findFirst({where:a(f.id,e),with:{workflow:!0}});if(!t||t.workflow.userId!==i)return{content:[{type:"text",text:JSON.stringify({error:"Execution not found"})}]};if(t.status!=="running"&&t.status!=="pending")return{content:[{type:"text",text:JSON.stringify({error:"Execution is not running",status:t.status})}]};await s.update(f).set({status:"cancelled",completedAt:new Date,duration:String(Date.now()-new Date(t.startedAt).getTime())}).where(a(f.id,e));let o=await s.query.workflowExecutionLogs.findMany({where:y(a(g.executionId,e),J(g.status,["pending","running"]))});for(let n of o)await s.update(g).set({status:"error",error:"Cancelled",completedAt:new Date}).where(a(g.id,n.id));return{content:[{type:"text",text:JSON.stringify({success:!0,status:"cancelled"})}]}}),d.registerTool("list_available_actions",{description:"List all available plugin actions with their config fields"},async()=>{let t=h().map(o=>({id:o.id,label:o.label,description:o.description,category:o.category,integration:o.integration,configFields:A(o.configFields).map(n=>({key:n.key,label:n.label,type:n.type,required:n.required,placeholder:n.placeholder}))}));return{content:[{type:"text",text:JSON.stringify(t)}]}}),d.registerTool("list_integrations",{description:"List the authenticated user's connected integrations"},async()=>{let e=await s.select({id:l.id,name:l.name,type:l.type,isManaged:l.isManaged,createdAt:l.createdAt,updatedAt:l.updatedAt}).from(l).where(a(l.userId,i));return{content:[{type:"text",text:JSON.stringify(e.map(t=>({...t,createdAt:t.createdAt.toISOString(),updatedAt:t.updatedAt.toISOString()})))}]}})}function L(d){let i=new E({name:"workflow-builder",version:"1.0.0"});return T(i,d),i}async function M(d,i){let e=L(i),t=new W({sessionIdGenerator:void 0});return await e.connect(t),await t.handleRequest(d)}async function V(d){if(d.method==="POST"){if(process.env.NWB_ANONYMOUS_AUTH!=="false"){let i=await N(d);if(i)return M(d,i.id)}return _(O,async(i,e)=>M(i,e.userId))(d)}return new Response("Method not allowed",{status:405})}export{V as handleMcpRequest};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as w}from"./chunk-WT4BSMUD.js";import"./chunk-3YVRTDK2.js";import"./chunk-R5GS6TJS.js";import"./chunk-CYVALTSI.js";import"./chunk-IEOZJAW2.js";import"./chunk-6UXAINJQ.js";import"./chunk-BNX2SV7E.js";import"./chunk-PRVESNIO.js";import"./chunk-KFTXS23Q.js";import"./chunk-QRG4O4PE.js";import"./chunk-7WFHHPX4.js";import{a as c,i,k as l,o as f,q as p}from"./chunk-5J6TNMJG.js";import"server-only";import{eq as d}from"drizzle-orm";async function k(t){let{workflowId:r,input:e}=t;if(!r)return{success:!1,error:"No workflow selected"};let[o]=await f.select().from(i).where(d(i.id,r)).limit(1);if(!o)return{success:!1,error:`Workflow "${r}" not found`};let s={};if(e&&e.trim())try{s=JSON.parse(e)}catch{return{success:!1,error:`Invalid JSON input: ${e}`}}let u=c();await f.insert(l).values({id:u,workflowId:r,userId:o.userId,status:"running",input:s});let n=await w({nodes:o.nodes,edges:o.edges,triggerInput:s,executionId:u,workflowId:r});if(n.success){let a=Object.values(n.outputs||{}).at(-1)?.data;return{success:!0,executionId:u,output:a}}return{success:!1,error:n.error||"Sub-workflow execution failed"}}async function m(t){"use step";return p(t,()=>k(t))}m.maxRetries=0;export{m as runWorkflowStep};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as d}from"./chunk-WT4BSMUD.js";import"./chunk-3YVRTDK2.js";import"./chunk-R5GS6TJS.js";import"./chunk-CYVALTSI.js";import"./chunk-IEOZJAW2.js";import"./chunk-6UXAINJQ.js";import"./chunk-BNX2SV7E.js";import"./chunk-PRVESNIO.js";import"./chunk-KFTXS23Q.js";import"./chunk-QRG4O4PE.js";import"./chunk-7WFHHPX4.js";import{a,i as c,k as w,o as i,q as p}from"./chunk-5J6TNMJG.js";import"server-only";import{eq as g}from"drizzle-orm";function R(e){if(!e||!e.trim())return[];try{let t=JSON.parse(e);if(Array.isArray(t))return t.filter(Boolean)}catch{}return e.split(",").map(t=>t.trim()).filter(Boolean)}async function W(e){let t=R(e.workflowIds),f=e.continueOnFailure==="true";if(t.length===0)return{success:!1,error:"No workflows selected"};let u={};if(e.input&&e.input.trim())try{u=JSON.parse(e.input)}catch{return{success:!1,error:`Invalid JSON input: ${e.input}`}}let o=[];for(let r of t){let[s]=await i.select().from(c).where(g(c.id,r)).limit(1);if(!s){let I={workflowId:r,workflowName:"Unknown",executionId:"",success:!1,error:`Workflow "${r}" not found`};if(o.push(I),!f)break;continue}let l=a();await i.insert(w).values({id:l,workflowId:r,userId:s.userId,status:"running",input:u});let n=await d({nodes:s.nodes,edges:s.edges,triggerInput:u,executionId:l,workflowId:r}),k=Object.values(n.outputs||{}).at(-1)?.data,m={workflowId:r,workflowName:s.name,executionId:l,success:n.success,output:k,error:n.error};if(o.push(m),!n.success&&!f)break}return{success:!0,results:o,succeeded:o.filter(r=>r.success).length,failed:o.filter(r=>!r.success).length,total:t.length}}async function S(e){"use step";return p(e,()=>W(e))}S.maxRetries=0;export{S as runWorkflowsInSequenceStep};
|
package/dist/server/api/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as h,b as W,c as Se,d as Te,e as H,f as Fe,g as ve,h as se,i as Ue,j as Ce,k as Oe,l as ae}from"../../chunk-QMJQ5NK5.js";import{a as xe,b as Ee,c as Ie}from"../../chunk-NI6U7PHC.js";import{a as re,b as me,c as he,d as ke,e as ye,f as je,g as J,h as G}from"../../chunk-DMHGXYVW.js";import{b as M}from"../../chunk-IEOZJAW2.js";import"../../chunk-6UXAINJQ.js";import{j as Re,k as Ae,n as Pe}from"../../chunk-BNX2SV7E.js";import{c as be,d as ne,f as Ne,g as We,h as $e,i as K}from"../../chunk-KFTXS23Q.js";import{m as ge}from"../../chunk-QRG4O4PE.js";import{a as _,b as V,d as oe,i as f,k as R,l as T,m as A,o as c}from"../../chunk-5J6TNMJG.js";import{NextResponse as ee}from"next/server";import{and as Pt,eq as ie}from"drizzle-orm";import{NextResponse as $}from"next/server";import{createHash as bt}from"crypto";async function Me(r){try{let t=await h(r);if(!t)return $.json({error:"Unauthorized"},{status:401});let e=await c.query.apiKeys.findMany({where:ie(A.userId,t.id),columns:{id:!0,name:!0,keyPrefix:!0,createdAt:!0,lastUsedAt:!0},orderBy:(o,{desc:n})=>[n(o.createdAt)]});return $.json(e)}catch(t){return console.error("Failed to list API keys:",t),$.json({error:"Failed to list API keys"},{status:500})}}async function De(r){try{let t=await h(r);if(!t)return $.json({error:"Unauthorized"},{status:401});if(t.name==="Anonymous"||t.email?.startsWith("temp-"))return $.json({error:"Anonymous users cannot create API keys"},{status:403});let n=(await r.json().catch(()=>({}))).name||null,{randomBytes:u}=await import("crypto"),d=`wfb_${u(24).toString("base64url")}`,g=bt("sha256").update(d).digest("hex"),E=d.slice(0,11),[I]=await c.insert(A).values({userId:t.id,name:n,keyHash:g,keyPrefix:E}).returning({id:A.id,name:A.name,keyPrefix:A.keyPrefix,createdAt:A.createdAt});return $.json({...I,key:d})}catch(t){return console.error("Failed to create API key:",t),$.json({error:"Failed to create API key"},{status:500})}}async function Ge(r,t){try{let e=await h(r);return e?(await c.delete(A).where(Pt(ie(A.id,t),ie(A.userId,e.id))).returning({id:A.id})).length===0?$.json({error:"API key not found"},{status:404}):$.json({success:!0}):$.json({error:"Unauthorized"},{status:401})}catch(e){return console.error("Failed to delete API key:",e),$.json({error:"Failed to delete API key"},{status:500})}}import{toNextJsHandler as Nt}from"better-auth/next-js";var{GET:Wt,POST:$t}=Nt(M);async function ue(r,t){let e="/api/auth/"+t.slice(1).join("/"),o=new URL(r.url),n=`${o.origin}${e}${o.search}`,u=Te(r,n),l=r.method==="GET"?await Wt(u):await $t(u);return l.status>=500&&!await l.clone().text()?new Response(JSON.stringify({debug:"500 with empty body from better-auth",path:e}),{status:500,headers:{"Content-Type":"application/json"}}):l}import{eq as St}from"drizzle-orm";import{NextResponse as X}from"next/server";async function _e(r,t){try{if(r.headers.get("authorization")!==`Bearer ${process.env.CRON_SECRET}`)return X.json({error:"Unauthorized"},{status:401});let o=await c.query.workflows.findFirst({where:St(f.id,t)});if(!o)return X.json({error:"Workflow not found"},{status:404});let[n]=await c.insert(R).values({workflowId:t,userId:o.userId,status:"running",input:{}}).returning();return H(n.id,t,o.nodes,o.edges,{}),X.json({success:!0,workflowId:t,executionId:n.id,message:"Workflow execution started"})}catch(e){return console.error("[Cron] Scheduled workflow execution error:",e),X.json({error:"Execution failed",message:e instanceof Error?e.message:"Unknown error"},{status:500})}}import{oAuthDiscoveryMetadata as Tt,oAuthProtectedResourceMetadata as Ft}from"better-auth/plugins";var de=Tt(M),ce=Ft(M);import{NextResponse as y}from"next/server";async function ze(r){try{let t=await h(r);if(!t)return y.json({error:"Unauthorized"},{status:401});let{searchParams:e}=new URL(r.url),o=e.get("type"),n=await be(t.id,o||void 0);return y.json(n.map(u=>({id:u.id,name:u.name,type:u.type,isManaged:u.isManaged??!1,createdAt:u.createdAt.toISOString(),updatedAt:u.updatedAt.toISOString()})))}catch(t){return console.error("Failed to get integrations:",t),y.json({error:"Failed to get integrations",details:t instanceof Error?t.message:"Unknown error"},{status:500})}}async function Le(r){try{let t=await h(r);if(!t)return y.json({error:"Unauthorized"},{status:401});let e=await r.json();if(!(e.type&&e.config))return y.json({error:"Type and config are required"},{status:400});let o=await Ne(t.id,e.name||"",e.type,e.config);return y.json({id:o.id,name:o.name,type:o.type,createdAt:o.createdAt.toISOString(),updatedAt:o.updatedAt.toISOString()})}catch(t){return console.error("Failed to create integration:",t),y.json({error:"Failed to create integration",details:t instanceof Error?t.message:"Unknown error"},{status:500})}}async function qe(r,t){try{let e=await h(r);if(!e)return y.json({error:"Unauthorized"},{status:401});let o=await ne(t,e.id);return o?y.json({id:o.id,name:o.name,type:o.type,config:o.config,createdAt:o.createdAt.toISOString(),updatedAt:o.updatedAt.toISOString()}):y.json({error:"Integration not found"},{status:404})}catch(e){return console.error("Failed to get integration:",e),y.json({error:"Failed to get integration",details:e instanceof Error?e.message:"Unknown error"},{status:500})}}async function Ke(r,t){try{let e=await h(r);if(!e)return y.json({error:"Unauthorized"},{status:401});let o=await r.json(),n=await We(t,e.id,o);return n?y.json({id:n.id,name:n.name,type:n.type,config:n.config,createdAt:n.createdAt.toISOString(),updatedAt:n.updatedAt.toISOString()}):y.json({error:"Integration not found"},{status:404})}catch(e){return console.error("Failed to update integration:",e),y.json({error:"Failed to update integration",details:e instanceof Error?e.message:"Unknown error"},{status:500})}}async function He(r,t){try{let e=await h(r);return e?await $e(t,e.id)?y.json({success:!0}):y.json({error:"Integration not found"},{status:404}):y.json({error:"Unauthorized"},{status:401})}catch(e){return console.error("Failed to delete integration:",e),y.json({error:"Failed to delete integration",details:e instanceof Error?e.message:"Unknown error"},{status:500})}}async function Be(r,t){try{let e=await h(r);if(!e)return y.json({error:"Unauthorized"},{status:401});let o=await ne(t,e.id);return o?o.type==="database"?y.json({status:"success",message:"Integration exists"}):y.json({status:"success",message:"Integration exists"}):y.json({error:"Integration not found"},{status:404})}catch(e){return console.error("Failed to test integration:",e),y.json({status:"error",message:e instanceof Error?e.message:"Failed to test connection"},{status:500})}}async function Ye(r){try{if(!await h(r))return y.json({error:"Unauthorized"},{status:401});let e=await r.json();return e.type&&e.config?y.json({status:"success",message:"Credentials accepted"}):y.json({error:"Type and config are required"},{status:400})}catch(t){return console.error("Failed to test credentials:",t),y.json({status:"error",message:t instanceof Error?t.message:"Failed to test connection"},{status:500})}}import{eq as Q}from"drizzle-orm";import{NextResponse as D}from"next/server";async function Je(r){try{let t=await h(r);if(!t)return D.json({error:"Unauthorized"},{status:401});let e=await c.query.users.findFirst({where:Q(V.id,t.id),columns:{id:!0,name:!0,email:!0,image:!0,isAnonymous:!0}});if(!e)return D.json({error:"User not found"},{status:404});let o=await c.query.accounts.findFirst({where:Q(oe.userId,t.id),columns:{providerId:!0}});return D.json({...e,providerId:o?.providerId??null})}catch(t){return console.error("Failed to get user:",t),D.json({error:t instanceof Error?t.message:"Failed to get user"},{status:500})}}async function Ve(r){try{let t=await h(r);if(!t)return D.json({error:"Unauthorized"},{status:401});let e=await c.query.accounts.findFirst({where:Q(oe.userId,t.id),columns:{providerId:!0}});if(e&&["vercel","github","google"].includes(e.providerId))return D.json({error:"Cannot update profile for OAuth users"},{status:403});let n=await r.json(),u={};return n.name!==void 0&&(u.name=n.name),n.email!==void 0&&(u.email=n.email),await c.update(V).set(u).where(Q(V.id,t.id)),D.json({success:!0})}catch(t){return console.error("Failed to update user:",t),D.json({error:t instanceof Error?t.message:"Failed to update user"},{status:500})}}import{and as v,desc as Z,eq as p,inArray as Qe}from"drizzle-orm";import{NextResponse as a}from"next/server";import{createHash as zt}from"crypto";import"server-only";var vt={"Database Query":Ee.codeGenerator,"HTTP Request":Ie.codeGenerator,Condition:xe.codeGenerator},Ut=/export\s+(?:async\s+)?function\s+\w+\s*\([^)]*\)\s*(?::\s*[^{]+)?\s*\{([\s\S]*)\}/;function Ct(r){let t=vt[r];if(!t){let e=ge(r);e?.codegenTemplate&&(t=e.codegenTemplate)}if(!t)return null;try{let e=t.match(Ut);return e?e[1].trim():null}catch{return null}}function Ot(r,t){let e=r.substring(1),o=e.indexOf(":");if(o===-1)return t;let n=e.substring(0,o),u=e.substring(o+1),l=u.indexOf("."),d=l!==-1?u.substring(l+1):"",g=n.replace(/[^a-zA-Z0-9]/g,"_");if(!d)return`\${outputs?.['${g}']?.data}`;let E=d.split(".").map(I=>{let b=I.match(re);return b?`?.${b[1]}?.[${b[2]}]`:`?.${I}`}).join("");return`\${outputs?.['${g}']?.data${E}}`}function Mt(r){let t=r.substring(1);if(!(t.includes(".")||t.includes("[")))return`\${outputs?.['${t.replace(/[^a-zA-Z0-9]/g,"_")}']?.data}`;let e=t.split("."),n=e[0].replace(/[^a-zA-Z0-9]/g,"_"),u=e.slice(1).join(".");if(!u)return`\${outputs?.['${n}']?.data}`;let l=u.split(".").map(d=>{let g=d.match(re);return g?`?.${g[1]}?.[${g[2]}]`:`?.${d}`}).join("");return`\${outputs?.['${n}']?.data${l}}`}function m(r){if(!r||typeof r!="string")return r;let t=/\{\{([^}]+)\}\}/g;return r.replace(t,(e,o)=>{let n=o.trim();return n.startsWith("@")?Ot(n,e):n.startsWith("$")?Mt(n):e})}function Dt(r){let t=me(r),e=r.at(-1);return e&&t.add(e.id),t}function Gt(r){let t=new Map,e=new Map;for(let o of r)if(o.data.type==="action"){let u=(o.data.config||{}).actionType,l=o.data.label||u||"UnnamedStep",d=J(l),g=t.get(d)||0;t.set(d,g+1);let E=g>0?`${d}${g+1}`:d;e.set(o.id,E)}return e}function _t(r,t,e){let o=[];for(let n of r)if(n.data.type==="action"){let u=t.get(n.id);o.push(e(n,u))}return o}function Xe(r,t,e){let o=new Set,n=[],u=new Map(t.map(s=>[s.id,s])),l=he(e),d=ke(t,e),g=Dt(t);o.add("import { sleep, FatalError } from 'workflow';");function E(s){return o.add("import { Resend } from 'resend';"),["fromEmail: process.env.RESEND_FROM_EMAIL || 'noreply@example.com'",`emailTo: \`${m(s.emailTo||"user@example.com")}\``,`emailSubject: \`${m(s.emailSubject||"Notification")}\``,`emailBody: \`${m(s.emailBody||"No content")}\``,"apiKey: process.env.RESEND_API_KEY!"]}function I(s){return o.add("import { WebClient } from '@slack/web-api';"),[`slackChannel: \`${m(s.slackChannel||"#general")}\``,`slackMessage: \`${m(s.slackMessage||"No message")}\``,"apiKey: process.env.SLACK_API_KEY!"]}function b(s){o.add("import { LinearClient } from '@linear/sdk';");let i=[`ticketTitle: \`${m(s.ticketTitle||"New Issue")}\``,`ticketDescription: \`${m(s.ticketDescription||"")}\``,"apiKey: process.env.LINEAR_API_KEY!"];return s.teamId&&i.push(`teamId: "${s.teamId}"`),i}function z(s){o.add("import { generateText } from 'ai';");let i=s.aiModel||"meta/llama-4-scout",k;if(i.includes("/"))k=i;else{let w;i.startsWith("gpt-")||i.startsWith("o1-")?w="openai":i.startsWith("claude-")?w="anthropic":w="openai",k=`${w}/${i}`}return[`model: "${k}"`,`prompt: \`${m(s.aiPrompt||"")}\``,"apiKey: process.env.OPENAI_API_KEY!"]}function L(s){return o.add("import { experimental_generateImage as generateImage } from 'ai';"),[`model: "${s.imageModel||"google/imagen-4.0-generate"}"`,`prompt: \`${m(s.imagePrompt||"")}\``,'size: "1024x1024"',"providerOptions: { openai: { apiKey: process.env.AI_GATEWAY_API_KEY! } }"]}function q(s){return[`query: \`${m(s.dbQuery||"SELECT 1")}\``]}function x(s){let i=[`url: "${s.endpoint||"https://api.example.com/endpoint"}"`,`method: "${s.httpMethod||"POST"}"`,`headers: ${s.httpHeaders||"{}"}`];return s.httpBody&&i.push(`body: ${s.httpBody}`),i}function U(s){return[`condition: ${m(s.condition||"true")}`]}function C(s,i){o.add("import FirecrawlApp from '@mendable/firecrawl-js';");let k=s==="Search"?"search":"scrape",w=i.formats?JSON.stringify(i.formats):"['markdown']",j=[`mode: '${k}'`,"apiKey: process.env.FIRECRAWL_API_KEY!",`formats: ${w}`];return i.url&&j.push(`url: \`${m(i.url||"")}\``),i.query&&j.push(`query: \`${m(i.query||"")}\``),i.limit&&j.push(`limit: ${i.limit}`),j}function fe(s){o.add("import { createClient } from 'v0-sdk';");let i=[`message: \`${m(s.message||"")}\``,"apiKey: process.env.V0_API_KEY!"];return s.system&&i.push(`system: \`${m(s.system||"")}\``),i}function te(s){return o.add("import { createClient } from 'v0-sdk';"),[`chatId: \`${m(s.chatId||"")}\``,`message: \`${m(s.message||"")}\``,"apiKey: process.env.V0_API_KEY!"]}function mt(s){return[`userId: \`${m(s.userId||"")}\``]}function ht(s){let i=[`emailAddress: \`${m(s.emailAddress||"")}\``];return s.password&&i.push(`password: \`${m(s.password)}\``),s.firstName&&i.push(`firstName: \`${m(s.firstName)}\``),s.lastName&&i.push(`lastName: \`${m(s.lastName)}\``),s.publicMetadata&&i.push(`publicMetadata: \`${m(s.publicMetadata)}\``),s.privateMetadata&&i.push(`privateMetadata: \`${m(s.privateMetadata)}\``),i}function kt(s){let i=[`userId: \`${m(s.userId||"")}\``];return s.firstName&&i.push(`firstName: \`${m(s.firstName)}\``),s.lastName&&i.push(`lastName: \`${m(s.lastName)}\``),s.publicMetadata&&i.push(`publicMetadata: \`${m(s.publicMetadata)}\``),s.privateMetadata&&i.push(`privateMetadata: \`${m(s.privateMetadata)}\``),i}function yt(s){return[`userId: \`${m(s.userId||"")}\``]}function jt(s,i){let w={"Send Email":()=>E(i),"Send Slack Message":()=>I(i),"Create Ticket":()=>b(i),"Generate Text":()=>z(i),"Generate Image":()=>L(i),"Database Query":()=>q(i),"HTTP Request":()=>x(i),Condition:()=>U(i),Scrape:()=>C(s,i),Search:()=>C(s,i),"Create Chat":()=>fe(i),"Send Message":()=>te(i),"Get User":()=>mt(i),"Create User":()=>ht(i),"Update User":()=>kt(i),"Delete User":()=>yt(i)}[s];return w?w():[]}function xt(s,i){let k=s.data.config||{},w=k.actionType,j=s.data.label||w||"UnnamedStep",F=i||J(j),P=Ct(w),N;return P&&s.data.type==="action"?N=` // Call step function with constructed input
|
|
1
|
+
import{a as h,b as W,c as Se,d as Te,e as H,f as Fe,g as ve,h as se,i as Ue,j as Ce,k as Oe,l as ae}from"../../chunk-CI7FTYZR.js";import"../../chunk-WT4BSMUD.js";import{a as xe,b as Ee,c as Ie}from"../../chunk-NI6U7PHC.js";import{a as re,b as me,c as he,d as ke,e as ye,f as je,g as J,h as G}from"../../chunk-VUDOAZ3W.js";import"../../chunk-3YVRTDK2.js";import{b as M}from"../../chunk-IEOZJAW2.js";import"../../chunk-6UXAINJQ.js";import{j as Re,k as Ae,n as Pe}from"../../chunk-BNX2SV7E.js";import{c as be,d as ne,f as Ne,g as We,h as $e,i as K}from"../../chunk-KFTXS23Q.js";import{m as ge}from"../../chunk-QRG4O4PE.js";import{a as _,b as V,d as oe,i as f,k as R,l as T,m as A,o as c}from"../../chunk-5J6TNMJG.js";import{NextResponse as ee}from"next/server";import{and as Pt,eq as ie}from"drizzle-orm";import{NextResponse as $}from"next/server";import{createHash as bt}from"crypto";async function Me(r){try{let t=await h(r);if(!t)return $.json({error:"Unauthorized"},{status:401});let e=await c.query.apiKeys.findMany({where:ie(A.userId,t.id),columns:{id:!0,name:!0,keyPrefix:!0,createdAt:!0,lastUsedAt:!0},orderBy:(o,{desc:n})=>[n(o.createdAt)]});return $.json(e)}catch(t){return console.error("Failed to list API keys:",t),$.json({error:"Failed to list API keys"},{status:500})}}async function De(r){try{let t=await h(r);if(!t)return $.json({error:"Unauthorized"},{status:401});if(t.name==="Anonymous"||t.email?.startsWith("temp-"))return $.json({error:"Anonymous users cannot create API keys"},{status:403});let n=(await r.json().catch(()=>({}))).name||null,{randomBytes:u}=await import("crypto"),d=`wfb_${u(24).toString("base64url")}`,g=bt("sha256").update(d).digest("hex"),E=d.slice(0,11),[I]=await c.insert(A).values({userId:t.id,name:n,keyHash:g,keyPrefix:E}).returning({id:A.id,name:A.name,keyPrefix:A.keyPrefix,createdAt:A.createdAt});return $.json({...I,key:d})}catch(t){return console.error("Failed to create API key:",t),$.json({error:"Failed to create API key"},{status:500})}}async function Ge(r,t){try{let e=await h(r);return e?(await c.delete(A).where(Pt(ie(A.id,t),ie(A.userId,e.id))).returning({id:A.id})).length===0?$.json({error:"API key not found"},{status:404}):$.json({success:!0}):$.json({error:"Unauthorized"},{status:401})}catch(e){return console.error("Failed to delete API key:",e),$.json({error:"Failed to delete API key"},{status:500})}}import{toNextJsHandler as Nt}from"better-auth/next-js";var{GET:Wt,POST:$t}=Nt(M);async function ue(r,t){let e="/api/auth/"+t.slice(1).join("/"),o=new URL(r.url),n=`${o.origin}${e}${o.search}`,u=Te(r,n),l=r.method==="GET"?await Wt(u):await $t(u);return l.status>=500&&!await l.clone().text()?new Response(JSON.stringify({debug:"500 with empty body from better-auth",path:e}),{status:500,headers:{"Content-Type":"application/json"}}):l}import{eq as St}from"drizzle-orm";import{NextResponse as X}from"next/server";async function _e(r,t){try{if(r.headers.get("authorization")!==`Bearer ${process.env.CRON_SECRET}`)return X.json({error:"Unauthorized"},{status:401});let o=await c.query.workflows.findFirst({where:St(f.id,t)});if(!o)return X.json({error:"Workflow not found"},{status:404});let[n]=await c.insert(R).values({workflowId:t,userId:o.userId,status:"running",input:{}}).returning();return await H(n.id,t,o.nodes,o.edges,{}),X.json({success:!0,workflowId:t,executionId:n.id,message:"Workflow execution completed"})}catch(e){return console.error("[Cron] Scheduled workflow execution error:",e),X.json({error:"Execution failed",message:e instanceof Error?e.message:"Unknown error"},{status:500})}}import{oAuthDiscoveryMetadata as Tt,oAuthProtectedResourceMetadata as Ft}from"better-auth/plugins";var de=Tt(M),ce=Ft(M);import{NextResponse as y}from"next/server";async function ze(r){try{let t=await h(r);if(!t)return y.json({error:"Unauthorized"},{status:401});let{searchParams:e}=new URL(r.url),o=e.get("type"),n=await be(t.id,o||void 0);return y.json(n.map(u=>({id:u.id,name:u.name,type:u.type,isManaged:u.isManaged??!1,createdAt:u.createdAt.toISOString(),updatedAt:u.updatedAt.toISOString()})))}catch(t){return console.error("Failed to get integrations:",t),y.json({error:"Failed to get integrations",details:t instanceof Error?t.message:"Unknown error"},{status:500})}}async function Le(r){try{let t=await h(r);if(!t)return y.json({error:"Unauthorized"},{status:401});let e=await r.json();if(!(e.type&&e.config))return y.json({error:"Type and config are required"},{status:400});let o=await Ne(t.id,e.name||"",e.type,e.config);return y.json({id:o.id,name:o.name,type:o.type,createdAt:o.createdAt.toISOString(),updatedAt:o.updatedAt.toISOString()})}catch(t){return console.error("Failed to create integration:",t),y.json({error:"Failed to create integration",details:t instanceof Error?t.message:"Unknown error"},{status:500})}}async function qe(r,t){try{let e=await h(r);if(!e)return y.json({error:"Unauthorized"},{status:401});let o=await ne(t,e.id);return o?y.json({id:o.id,name:o.name,type:o.type,config:o.config,createdAt:o.createdAt.toISOString(),updatedAt:o.updatedAt.toISOString()}):y.json({error:"Integration not found"},{status:404})}catch(e){return console.error("Failed to get integration:",e),y.json({error:"Failed to get integration",details:e instanceof Error?e.message:"Unknown error"},{status:500})}}async function Ke(r,t){try{let e=await h(r);if(!e)return y.json({error:"Unauthorized"},{status:401});let o=await r.json(),n=await We(t,e.id,o);return n?y.json({id:n.id,name:n.name,type:n.type,config:n.config,createdAt:n.createdAt.toISOString(),updatedAt:n.updatedAt.toISOString()}):y.json({error:"Integration not found"},{status:404})}catch(e){return console.error("Failed to update integration:",e),y.json({error:"Failed to update integration",details:e instanceof Error?e.message:"Unknown error"},{status:500})}}async function He(r,t){try{let e=await h(r);return e?await $e(t,e.id)?y.json({success:!0}):y.json({error:"Integration not found"},{status:404}):y.json({error:"Unauthorized"},{status:401})}catch(e){return console.error("Failed to delete integration:",e),y.json({error:"Failed to delete integration",details:e instanceof Error?e.message:"Unknown error"},{status:500})}}async function Be(r,t){try{let e=await h(r);if(!e)return y.json({error:"Unauthorized"},{status:401});let o=await ne(t,e.id);return o?o.type==="database"?y.json({status:"success",message:"Integration exists"}):y.json({status:"success",message:"Integration exists"}):y.json({error:"Integration not found"},{status:404})}catch(e){return console.error("Failed to test integration:",e),y.json({status:"error",message:e instanceof Error?e.message:"Failed to test connection"},{status:500})}}async function Ye(r){try{if(!await h(r))return y.json({error:"Unauthorized"},{status:401});let e=await r.json();return e.type&&e.config?y.json({status:"success",message:"Credentials accepted"}):y.json({error:"Type and config are required"},{status:400})}catch(t){return console.error("Failed to test credentials:",t),y.json({status:"error",message:t instanceof Error?t.message:"Failed to test connection"},{status:500})}}import{eq as Q}from"drizzle-orm";import{NextResponse as D}from"next/server";async function Je(r){try{let t=await h(r);if(!t)return D.json({error:"Unauthorized"},{status:401});let e=await c.query.users.findFirst({where:Q(V.id,t.id),columns:{id:!0,name:!0,email:!0,image:!0,isAnonymous:!0}});if(!e)return D.json({error:"User not found"},{status:404});let o=await c.query.accounts.findFirst({where:Q(oe.userId,t.id),columns:{providerId:!0}});return D.json({...e,providerId:o?.providerId??null})}catch(t){return console.error("Failed to get user:",t),D.json({error:t instanceof Error?t.message:"Failed to get user"},{status:500})}}async function Ve(r){try{let t=await h(r);if(!t)return D.json({error:"Unauthorized"},{status:401});let e=await c.query.accounts.findFirst({where:Q(oe.userId,t.id),columns:{providerId:!0}});if(e&&["vercel","github","google"].includes(e.providerId))return D.json({error:"Cannot update profile for OAuth users"},{status:403});let n=await r.json(),u={};return n.name!==void 0&&(u.name=n.name),n.email!==void 0&&(u.email=n.email),await c.update(V).set(u).where(Q(V.id,t.id)),D.json({success:!0})}catch(t){return console.error("Failed to update user:",t),D.json({error:t instanceof Error?t.message:"Failed to update user"},{status:500})}}import{and as v,desc as Z,eq as p,inArray as Qe}from"drizzle-orm";import{NextResponse as a}from"next/server";import{createHash as zt}from"crypto";import"server-only";var vt={"Database Query":Ee.codeGenerator,"HTTP Request":Ie.codeGenerator,Condition:xe.codeGenerator},Ut=/export\s+(?:async\s+)?function\s+\w+\s*\([^)]*\)\s*(?::\s*[^{]+)?\s*\{([\s\S]*)\}/;function Ct(r){let t=vt[r];if(!t){let e=ge(r);e?.codegenTemplate&&(t=e.codegenTemplate)}if(!t)return null;try{let e=t.match(Ut);return e?e[1].trim():null}catch{return null}}function Ot(r,t){let e=r.substring(1),o=e.indexOf(":");if(o===-1)return t;let n=e.substring(0,o),u=e.substring(o+1),l=u.indexOf("."),d=l!==-1?u.substring(l+1):"",g=n.replace(/[^a-zA-Z0-9]/g,"_");if(!d)return`\${outputs?.['${g}']?.data}`;let E=d.split(".").map(I=>{let b=I.match(re);return b?`?.${b[1]}?.[${b[2]}]`:`?.${I}`}).join("");return`\${outputs?.['${g}']?.data${E}}`}function Mt(r){let t=r.substring(1);if(!(t.includes(".")||t.includes("[")))return`\${outputs?.['${t.replace(/[^a-zA-Z0-9]/g,"_")}']?.data}`;let e=t.split("."),n=e[0].replace(/[^a-zA-Z0-9]/g,"_"),u=e.slice(1).join(".");if(!u)return`\${outputs?.['${n}']?.data}`;let l=u.split(".").map(d=>{let g=d.match(re);return g?`?.${g[1]}?.[${g[2]}]`:`?.${d}`}).join("");return`\${outputs?.['${n}']?.data${l}}`}function m(r){if(!r||typeof r!="string")return r;let t=/\{\{([^}]+)\}\}/g;return r.replace(t,(e,o)=>{let n=o.trim();return n.startsWith("@")?Ot(n,e):n.startsWith("$")?Mt(n):e})}function Dt(r){let t=me(r),e=r.at(-1);return e&&t.add(e.id),t}function Gt(r){let t=new Map,e=new Map;for(let o of r)if(o.data.type==="action"){let u=(o.data.config||{}).actionType,l=o.data.label||u||"UnnamedStep",d=J(l),g=t.get(d)||0;t.set(d,g+1);let E=g>0?`${d}${g+1}`:d;e.set(o.id,E)}return e}function _t(r,t,e){let o=[];for(let n of r)if(n.data.type==="action"){let u=t.get(n.id);o.push(e(n,u))}return o}function Xe(r,t,e){let o=new Set,n=[],u=new Map(t.map(s=>[s.id,s])),l=he(e),d=ke(t,e),g=Dt(t);o.add("import { sleep, FatalError } from 'workflow';");function E(s){return o.add("import { Resend } from 'resend';"),["fromEmail: process.env.RESEND_FROM_EMAIL || 'noreply@example.com'",`emailTo: \`${m(s.emailTo||"user@example.com")}\``,`emailSubject: \`${m(s.emailSubject||"Notification")}\``,`emailBody: \`${m(s.emailBody||"No content")}\``,"apiKey: process.env.RESEND_API_KEY!"]}function I(s){return o.add("import { WebClient } from '@slack/web-api';"),[`slackChannel: \`${m(s.slackChannel||"#general")}\``,`slackMessage: \`${m(s.slackMessage||"No message")}\``,"apiKey: process.env.SLACK_API_KEY!"]}function b(s){o.add("import { LinearClient } from '@linear/sdk';");let i=[`ticketTitle: \`${m(s.ticketTitle||"New Issue")}\``,`ticketDescription: \`${m(s.ticketDescription||"")}\``,"apiKey: process.env.LINEAR_API_KEY!"];return s.teamId&&i.push(`teamId: "${s.teamId}"`),i}function z(s){o.add("import { generateText } from 'ai';");let i=s.aiModel||"meta/llama-4-scout",k;if(i.includes("/"))k=i;else{let w;i.startsWith("gpt-")||i.startsWith("o1-")?w="openai":i.startsWith("claude-")?w="anthropic":w="openai",k=`${w}/${i}`}return[`model: "${k}"`,`prompt: \`${m(s.aiPrompt||"")}\``,"apiKey: process.env.OPENAI_API_KEY!"]}function L(s){return o.add("import { experimental_generateImage as generateImage } from 'ai';"),[`model: "${s.imageModel||"google/imagen-4.0-generate"}"`,`prompt: \`${m(s.imagePrompt||"")}\``,'size: "1024x1024"',"providerOptions: { openai: { apiKey: process.env.AI_GATEWAY_API_KEY! } }"]}function q(s){return[`query: \`${m(s.dbQuery||"SELECT 1")}\``]}function x(s){let i=[`url: "${s.endpoint||"https://api.example.com/endpoint"}"`,`method: "${s.httpMethod||"POST"}"`,`headers: ${s.httpHeaders||"{}"}`];return s.httpBody&&i.push(`body: ${s.httpBody}`),i}function U(s){return[`condition: ${m(s.condition||"true")}`]}function C(s,i){o.add("import FirecrawlApp from '@mendable/firecrawl-js';");let k=s==="Search"?"search":"scrape",w=i.formats?JSON.stringify(i.formats):"['markdown']",j=[`mode: '${k}'`,"apiKey: process.env.FIRECRAWL_API_KEY!",`formats: ${w}`];return i.url&&j.push(`url: \`${m(i.url||"")}\``),i.query&&j.push(`query: \`${m(i.query||"")}\``),i.limit&&j.push(`limit: ${i.limit}`),j}function fe(s){o.add("import { createClient } from 'v0-sdk';");let i=[`message: \`${m(s.message||"")}\``,"apiKey: process.env.V0_API_KEY!"];return s.system&&i.push(`system: \`${m(s.system||"")}\``),i}function te(s){return o.add("import { createClient } from 'v0-sdk';"),[`chatId: \`${m(s.chatId||"")}\``,`message: \`${m(s.message||"")}\``,"apiKey: process.env.V0_API_KEY!"]}function mt(s){return[`userId: \`${m(s.userId||"")}\``]}function ht(s){let i=[`emailAddress: \`${m(s.emailAddress||"")}\``];return s.password&&i.push(`password: \`${m(s.password)}\``),s.firstName&&i.push(`firstName: \`${m(s.firstName)}\``),s.lastName&&i.push(`lastName: \`${m(s.lastName)}\``),s.publicMetadata&&i.push(`publicMetadata: \`${m(s.publicMetadata)}\``),s.privateMetadata&&i.push(`privateMetadata: \`${m(s.privateMetadata)}\``),i}function kt(s){let i=[`userId: \`${m(s.userId||"")}\``];return s.firstName&&i.push(`firstName: \`${m(s.firstName)}\``),s.lastName&&i.push(`lastName: \`${m(s.lastName)}\``),s.publicMetadata&&i.push(`publicMetadata: \`${m(s.publicMetadata)}\``),s.privateMetadata&&i.push(`privateMetadata: \`${m(s.privateMetadata)}\``),i}function yt(s){return[`userId: \`${m(s.userId||"")}\``]}function jt(s,i){let w={"Send Email":()=>E(i),"Send Slack Message":()=>I(i),"Create Ticket":()=>b(i),"Generate Text":()=>z(i),"Generate Image":()=>L(i),"Database Query":()=>q(i),"HTTP Request":()=>x(i),Condition:()=>U(i),Scrape:()=>C(s,i),Search:()=>C(s,i),"Create Chat":()=>fe(i),"Send Message":()=>te(i),"Get User":()=>mt(i),"Create User":()=>ht(i),"Update User":()=>kt(i),"Delete User":()=>yt(i)}[s];return w?w():[]}function xt(s,i){let k=s.data.config||{},w=k.actionType,j=s.data.label||w||"UnnamedStep",F=i||J(j),P=Ct(w),N;return P&&s.data.type==="action"?N=` // Call step function with constructed input
|
|
2
2
|
const stepInput = {
|
|
3
3
|
${jt(w,k).join(`,
|
|
4
4
|
`)}
|
|
@@ -75,4 +75,4 @@ vercel deploy
|
|
|
75
75
|
\`\`\`
|
|
76
76
|
|
|
77
77
|
For more information, visit the [Workflow documentation](https://workflow.is).
|
|
78
|
-
`,g[".env.example"]=Oe(),a.json({success:!0,files:g})}catch(e){return console.error("Failed to prepare workflow download:",e),a.json({success:!1,error:e instanceof Error?e.message:"Failed to prepare workflow download"},{status:500})}}import"virtual:workflow-builder-plugins";async function B(r){let t=Se(r),e=r.method.toUpperCase();if(t.length===0)return ee.json({error:"Not found"},{status:404});let[o,n,u,l]=t;if(o===".well-known")return n==="oauth-authorization-server"?de(r):n==="oauth-protected-resource"?ce(r):ue(r,["auth",...t]);if(o==="auth")return ue(r,t);if(o==="mcp"){if(process.env.NWB_MCP_ENABLED!=="true")return ee.json({error:"MCP server is not enabled"},{status:404});let{handleMcpRequest:d}=await import("../../handler-
|
|
78
|
+
`,g[".env.example"]=Oe(),a.json({success:!0,files:g})}catch(e){return console.error("Failed to prepare workflow download:",e),a.json({success:!1,error:e instanceof Error?e.message:"Failed to prepare workflow download"},{status:500})}}import"virtual:workflow-builder-plugins";async function B(r){let t=Se(r),e=r.method.toUpperCase();if(t.length===0)return ee.json({error:"Not found"},{status:404});let[o,n,u,l]=t;if(o===".well-known")return n==="oauth-authorization-server"?de(r):n==="oauth-protected-resource"?ce(r):ue(r,["auth",...t]);if(o==="auth")return ue(r,t);if(o==="mcp"){if(process.env.NWB_MCP_ENABLED!=="true")return ee.json({error:"MCP server is not enabled"},{status:404});let{handleMcpRequest:d}=await import("../../handler-67JKCHM5.js");return d(r)}if(o==="workflows"){if(n===void 0&&e==="GET")return tt(r);if(n==="create"&&e==="POST")return rt(r);if(n==="current"){if(e==="GET")return ot(r);if(e==="POST")return nt(r)}if(n==="executions"&&u){let d=u;if(l==="status"&&e==="GET")return st(r,d);if(l==="logs"&&e==="GET")return at(r,d);if(l==="cancel"&&e==="POST")return lt(r,d)}if(n&&n!=="create"&&n!=="current"&&n!=="executions"){let d=n;if(u===void 0){if(e==="GET")return et(r,d);if(e==="PATCH")return it(r,d);if(e==="DELETE")return ut(r,d)}if(u==="code"&&e==="GET")return wt(r,d);if(u==="download"&&e==="GET")return gt(r,d);if(u==="duplicate"&&e==="POST")return dt(r,d);if(u==="executions"){if(e==="GET")return ct(r,d);if(e==="DELETE")return ft(r,d)}if(u==="webhook"&&e==="POST")return pt(r,d)}}if(o==="workflow"&&n){if(u==="execute"&&e==="POST")return Ze(r,n);if(u==="cron"&&e==="GET")return _e(r,n)}if(o==="integrations"){if(n===void 0){if(e==="GET")return ze(r);if(e==="POST")return Le(r)}if(n==="test"&&u===void 0&&e==="POST")return Ye(r);if(n&&n!=="test"){let d=n;if(u===void 0){if(e==="GET")return qe(r,d);if(e==="PUT")return Ke(r,d);if(e==="DELETE")return He(r,d)}if(u==="test"&&e==="POST")return Be(r,d)}}if(o==="user"){if(e==="GET")return Je(r);if(e==="PATCH")return Ve(r)}if(o==="api-keys"){if(n===void 0){if(e==="GET")return Me(r);if(e==="POST")return De(r)}if(n&&u===void 0&&e==="DELETE")return Ge(r,n)}return ee.json({error:"Not found"},{status:404})}async function Zr(r){return B(r)}async function eo(r){return B(r)}async function to(r){return B(r)}async function ro(r){return B(r)}async function oo(r){return B(r)}async function no(r){return ee.json({},{headers:W})}export{oo as DELETE,Zr as GET,no as OPTIONS,ro as PATCH,eo as POST,to as PUT,de as oAuthDiscoveryHandler,ce as oAuthResourceHandler};
|
package/dist/styles.css
CHANGED
|
@@ -16,8 +16,10 @@
|
|
|
16
16
|
--color-yellow-500: oklch(79.5% 0.184 86.047);
|
|
17
17
|
--color-yellow-600: oklch(68.1% 0.162 75.834);
|
|
18
18
|
--color-green-300: oklch(87.1% 0.15 154.449);
|
|
19
|
+
--color-green-400: oklch(79.2% 0.209 151.711);
|
|
19
20
|
--color-green-500: oklch(72.3% 0.219 149.579);
|
|
20
21
|
--color-green-600: oklch(62.7% 0.194 149.214);
|
|
22
|
+
--color-emerald-300: oklch(84.5% 0.143 164.978);
|
|
21
23
|
--color-cyan-300: oklch(86.5% 0.127 207.078);
|
|
22
24
|
--color-blue-300: oklch(80.9% 0.105 251.813);
|
|
23
25
|
--color-blue-400: oklch(70.7% 0.165 254.624);
|
|
@@ -537,6 +539,9 @@
|
|
|
537
539
|
.hidden {
|
|
538
540
|
display: none;
|
|
539
541
|
}
|
|
542
|
+
.inline {
|
|
543
|
+
display: inline;
|
|
544
|
+
}
|
|
540
545
|
.inline-block {
|
|
541
546
|
display: inline-block;
|
|
542
547
|
}
|
|
@@ -1433,6 +1438,12 @@
|
|
|
1433
1438
|
background-color: color-mix(in oklab, var(--color-gray-500) 50%, transparent);
|
|
1434
1439
|
}
|
|
1435
1440
|
}
|
|
1441
|
+
.bg-green-500\/10 {
|
|
1442
|
+
background-color: color-mix(in srgb, oklch(72.3% 0.219 149.579) 10%, transparent);
|
|
1443
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1444
|
+
background-color: color-mix(in oklab, var(--color-green-500) 10%, transparent);
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1436
1447
|
.bg-green-500\/50 {
|
|
1437
1448
|
background-color: color-mix(in srgb, oklch(72.3% 0.219 149.579) 50%, transparent);
|
|
1438
1449
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -1607,6 +1618,9 @@
|
|
|
1607
1618
|
.px-0 {
|
|
1608
1619
|
padding-inline: calc(var(--spacing) * 0);
|
|
1609
1620
|
}
|
|
1621
|
+
.px-1 {
|
|
1622
|
+
padding-inline: calc(var(--spacing) * 1);
|
|
1623
|
+
}
|
|
1610
1624
|
.px-1\.5 {
|
|
1611
1625
|
padding-inline: calc(var(--spacing) * 1.5);
|
|
1612
1626
|
}
|
|
@@ -1727,6 +1741,9 @@
|
|
|
1727
1741
|
.text-left {
|
|
1728
1742
|
text-align: left;
|
|
1729
1743
|
}
|
|
1744
|
+
.text-right {
|
|
1745
|
+
text-align: right;
|
|
1746
|
+
}
|
|
1730
1747
|
.text-start {
|
|
1731
1748
|
text-align: start;
|
|
1732
1749
|
}
|
|
@@ -1869,6 +1886,9 @@
|
|
|
1869
1886
|
.text-blue-300 {
|
|
1870
1887
|
color: var(--color-blue-300);
|
|
1871
1888
|
}
|
|
1889
|
+
.text-blue-400 {
|
|
1890
|
+
color: var(--color-blue-400);
|
|
1891
|
+
}
|
|
1872
1892
|
.text-blue-500 {
|
|
1873
1893
|
color: var(--color-blue-500);
|
|
1874
1894
|
}
|
|
@@ -1887,6 +1907,9 @@
|
|
|
1887
1907
|
.text-destructive {
|
|
1888
1908
|
color: var(--destructive);
|
|
1889
1909
|
}
|
|
1910
|
+
.text-emerald-300 {
|
|
1911
|
+
color: var(--color-emerald-300);
|
|
1912
|
+
}
|
|
1890
1913
|
.text-foreground {
|
|
1891
1914
|
color: var(--foreground);
|
|
1892
1915
|
}
|
|
@@ -1902,6 +1925,9 @@
|
|
|
1902
1925
|
.text-green-300 {
|
|
1903
1926
|
color: var(--color-green-300);
|
|
1904
1927
|
}
|
|
1928
|
+
.text-green-400 {
|
|
1929
|
+
color: var(--color-green-400);
|
|
1930
|
+
}
|
|
1905
1931
|
.text-green-600 {
|
|
1906
1932
|
color: var(--color-green-600);
|
|
1907
1933
|
}
|
|
@@ -1929,6 +1955,9 @@
|
|
|
1929
1955
|
.text-primary-foreground {
|
|
1930
1956
|
color: var(--primary-foreground);
|
|
1931
1957
|
}
|
|
1958
|
+
.text-red-400 {
|
|
1959
|
+
color: var(--color-red-400);
|
|
1960
|
+
}
|
|
1932
1961
|
.text-red-500 {
|
|
1933
1962
|
color: var(--color-red-500);
|
|
1934
1963
|
}
|
package/package.json
CHANGED
package/dist/chunk-DMHGXYVW.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import{m as I,w as M}from"./chunk-QRG4O4PE.js";var v=/\{\{([^}]+)\}\}/g,U=/\s+/,Pt=/[^a-zA-Z0-9]/g,Et=/^([^[]+)\[(\d+)\]$/,Wt=/^[a-zA-Z_$][a-zA-Z0-9_$]*$/,J=/^[0-9]/;function It(a){let l=new Set;if(!a||typeof a!="string")return l;let u;for(;(u=v.exec(a))!==null;){let d=u[1].trim();if(d.startsWith("@")){let g=d.substring(1),c=g.indexOf(":");if(c!==-1){let w=g.substring(0,c);l.add(w)}}else if(d.startsWith("$")){let c=d.substring(1).split(".");c.length>0&&l.add(c[0])}}return l}function Ot(a){let l=new Set;if(typeof a=="string"){let u=It(a);for(let d of u)l.add(d)}return l}function Q(a){let l=new Set;for(let u of a){if(u.data.type!=="action")continue;let d=u.data.config||{};for(let g of Object.values(d)){let c=Ot(g);for(let w of c)l.add(w)}}return l}function Mt(a){let l=new Map;for(let u of a){let d=l.get(u.source)||[];d.push(u.target),l.set(u.source,d)}return l}function _t(a,l){let u=new Set(l.map(d=>d.target));return a.filter(d=>d.data.type==="trigger"&&!u.has(d.id))}function O(a){return a.split(".").map(l=>{let u=Et.exec(l);return u?`.${u[1]}[${u[2]}]`:`.${l}`}).join("")}function H(a,l){return`${(a||l||"result").split(U).map((g,c)=>{let w=g.replace(Pt,"");return w?c===0?w.toLowerCase():w.charAt(0).toUpperCase()+w.slice(1).toLowerCase():""}).filter(g=>g.length>0).join("")}Result`}function _(a){return a.replace(/\u00a0/g," ").replace(/[\u2000-\u200B\u2028\u2029]/g," ")}function Lt(a){return a?a.replace(/\\/g,"\\\\").replace(/`/g,"\\`"):""}function jt(a){return a.replace(/[^a-zA-Z0-9]/g,"_").replace(J,"_$&").replace(/_+/g,"_")}function Bt(a){let l=a.split(U).filter(d=>d.length>0).map((d,g)=>{let c=d.replace(/[^a-zA-Z0-9]/g,"");return c?g===0?c.toLowerCase():c.charAt(0).toUpperCase()+c.slice(1).toLowerCase():""}).filter(d=>d.length>0).join("");return!l||l.length===0?"unnamedStep":`${l.replace(J,"_$&")}Step`}function zt(a){return a.replace(/[^a-zA-Z0-9]/g,"_")}function R(a){return a===null?"null":a===void 0?"undefined":typeof a=="string"?JSON.stringify(a):typeof a=="number"||typeof a=="boolean"?String(a):Array.isArray(a)?`[${a.map(u=>R(u)).join(", ")}]`:typeof a=="object"?`{${Object.entries(a).map(([u,d])=>`${Wt.test(u)?u:JSON.stringify(u)}: ${R(d)}`).join(", ")}}`:String(a)}var Rt={"Database Query":{functionName:"databaseQueryStep",importPath:"./steps/database-query-step"},"HTTP Request":{functionName:"httpRequestStep",importPath:"./steps/http-request-step"},Condition:{functionName:"conditionStep",importPath:"./steps/condition-step"}};function b(a){let l=Rt[a];if(l)return l;let u=I(a);return u?{functionName:u.stepFunction,importPath:`./steps/${u.stepImportPath}-step`}:{functionName:"unknownStep",importPath:"./steps/unknown-step"}}var Z=/^(\s*)(const\s+\w+\s*=\s*)(.*)$/;function vt(a,l,u={}){let{functionName:d="executeWorkflow"}=u,g=Q(a),c=new Set,w=new Map(a.map(s=>[s.id,s])),k=new Map;for(let s of l){let t=k.get(s.source)||[];t.push(s.target),k.set(s.source,t)}let Y=new Set(l.map(s=>s.target)),D=a.filter(s=>s.data.type==="trigger"&&!Y.has(s.id)),V=D.some(s=>g.has(s.id)),A=[],C=new Set,X=V?`export async function ${d}<TInput>(input: TInput) {`:`export async function ${d}() {`;A.push(X),A.push(' "use workflow";'),A.push("");let P=new Map,L=new Set;for(let s of a){let t;if(s.data.type==="action"){let r=s.data.config?.actionType,e=s.data.label||"",n=H(e,r);t=n;let o=1;for(;L.has(t);)t=`${n}${o}`,o+=1;L.add(t)}else t="input";P.set(s.id,t)}function K(s,t){let r=s.substring(1),e=r.indexOf(":");if(e===-1)return t;let n=r.substring(0,e),o=r.substring(e+1),i=o.indexOf("."),f=i!==-1?o.substring(i+1):"",p=P.get(n);if(!p)return t;if(!f)return`\${${p}}`;let $=O(f);return`\${${p}${$}}`}function tt(s,t){let e=s.substring(1).split("."),n=e[0],o=e.slice(1).join("."),i=P.get(n);if(!i)return t;if(!o)return`\${${i}}`;let f=O(o);return`\${${i}${f}}`}function et(s,t){let r=s.substring(1),e=r.indexOf(":");if(e===-1)return t;let n=r.substring(0,e),o=r.substring(e+1),i=o.indexOf("."),f=i!==-1?o.substring(i+1):"",p=P.get(n);if(!p)return t;if(!f)return p;let $=O(f);return`${p}${$}`}function nt(s,t){let e=s.substring(1).split("."),n=e[0],o=e.slice(1).join("."),i=P.get(n);if(!i)return t;if(!o)return i;let f=O(o);return`${i}${f}`}function S(s){return!s||typeof s!="string"?s:s.replace(v,(t,r)=>{let e=r.trim();return e.startsWith("@")?K(e,t):e.startsWith("$")?tt(e,t):t})}function j(s){if(!s||typeof s!="string")return s;let r=_(s).replace(v,(e,n)=>{let o=n.trim();return o.startsWith("@")?et(o,e):o.startsWith("$")?nt(o,e):e});return _(r)}function st(s,t,r){let e=b("Send Email");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.emailTo||"user@example.com",i=n.emailSubject||"Notification",f=n.emailBody||"No content",p=S(o),$=S(i),h=S(f),m=q=>q.includes("${"),y=q=>q.replace(/\$\{/g,"$${"),N=m(p)?`\`${y(p).replace(/`/g,"\\`")}\``:`'${o.replace(/'/g,"\\'")}'`,T=m($)?`\`${y($).replace(/`/g,"\\`")}\``:`'${i.replace(/'/g,"\\'")}'`,W=m(h)?`\`${y(h).replace(/`/g,"\\`")}\``:`'${f.replace(/'/g,"\\'")}'`;return[`${t}const ${r} = await ${e.functionName}({`,`${t} emailTo: ${N},`,`${t} emailSubject: ${T},`,`${t} emailBody: ${W},`,`${t}});`]}function rt(s,t,r){let e=b("Create Ticket");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.ticketTitle||"New Ticket",i=n.ticketDescription||"",f=S(o),p=S(i),$=N=>N.includes("${"),h=N=>N.replace(/\$\{/g,"$${"),m=$(f)?`\`${h(f).replace(/`/g,"\\`")}\``:`'${o.replace(/'/g,"\\'")}'`,y=$(p)?`\`${h(p).replace(/`/g,"\\`")}\``:`'${i.replace(/'/g,"\\'")}'`;return[`${t}const ${r} = await ${e.functionName}({`,`${t} ticketTitle: ${m},`,`${t} ticketDescription: ${y},`,`${t}});`]}function ot(s,t,r){let e=b("Database Query");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.dbQuery||"",i=n.dataSource||"",f=n.dbTable||n.tableName||"your_table",p=[`${t}const ${r} = await ${e.functionName}({`];if(i?p.push(`${t} dataSource: { name: "${i}" },`):p.push(`${t} dataSource: {},`),o){let $=S(o),y=$.includes("${")?`\`${(N=>N.replace(/\$\{/g,"$${"))($).replace(/`/g,"\\`")}\``:`\`${o.replace(/`/g,"\\`")}\``;p.push(`${t} query: ${y},`)}else p.push(`${t} query: "${f}",`);return p.push(`${t}});`),p}function it(s,t,r){let e=b("HTTP Request");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.endpoint||"https://api.example.com/endpoint",i=n.httpMethod||"POST";return[`${t}const ${r} = await ${e.functionName}({`,`${t} url: '${o}',`,`${t} method: '${i}',`,`${t} body: {},`,`${t}});`]}function at(s){if(!s)return null;try{let t=JSON.parse(s),r=Array.isArray(t)?t.map(e=>{let{id:n,...o}=e;return o}):t;return R(r)}catch{return null}}function ct(s){let t=S(s),r=t.includes("${"),e=n=>n.replace(/\$\{/g,"$${");return r?`\`${e(t).replace(/`/g,"\\`")}\``:`\`${s.replace(/`/g,"\\`")}\``}function ut(s,t,r){let e=b("Generate Text");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.aiPrompt||"Generate a summary",i=n.aiModel||"meta/llama-4-scout",f=n.aiFormat||"text",p=n.aiSchema,$=ct(o),h=[`${t}// Generate text using AI`,`${t}const ${r} = await ${e.functionName}({`,`${t} model: "${i}",`,`${t} prompt: ${$},`];if(f==="object"){h.push(`${t} format: "object",`);let m=at(p);m&&h.push(`${t} schema: ${m},`)}return h.push(`${t}});`),h}function lt(s,t,r){c.add("import { experimental_generateImage as generateImage } from 'ai';");let e=s.data.config?.imagePrompt||"A beautiful landscape",n=s.data.config?.imageModel||"google/imagen-4.0-generate";return[`${t}// Generate image using AI`,`${t}const ${r} = await generateImage({`,`${t} model: "${n}",`,`${t} prompt: \`${e}\`,`,`${t} size: "1024x1024",`,`${t}});`]}function gt(s,t,r){let e=b("Send Slack Message");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.slackChannel||"#general",i=n.slackMessage||"Message content",f=S(o),p=S(i),$=N=>N.includes("${"),h=N=>N.replace(/\$\{/g,"$${"),m=$(f)?`\`${h(f).replace(/`/g,"\\`")}\``:`"${o}"`,y=$(p)?`\`${h(p).replace(/`/g,"\\`")}\``:`"${i}"`;return[`${t}const ${r} = await ${e.functionName}({`,`${t} slackChannel: ${m},`,`${t} slackMessage: ${y},`,`${t}});`]}function x(s){let t=S(s),r=t.includes("${"),e=t.replace(/\$\{/g,"$${").replace(/`/g,"\\`");return r?`\`${e}\``:`\`${s.replace(/`/g,"\\`")}\``}function ft(s,t,r){let e=s.data.config?.actionType,n=b(e);c.add(`import { ${n.functionName} } from '${n.importPath}';`);let o=s.data.config||{},i=o.url||"",f=o.query||"",p=o.limit?Number(o.limit):void 0,$=[`${t}const ${r} = await ${n.functionName}({`];return i&&$.push(`${t} url: ${x(i)},`),f&&$.push(`${t} query: ${x(f)},`),p&&$.push(`${t} limit: ${p},`),$.push(`${t}});`),$}function pt(s,t,r){let e=b("Create Chat");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.message||"",i=n.system||"",f=[`${t}const ${r} = await ${e.functionName}({`,`${t} message: ${x(o)},`];return i&&f.push(`${t} system: ${x(i)},`),f.push(`${t}});`),f}function $t(s,t,r){let e=b("Send Message");c.add(`import { ${e.functionName} } from '${e.importPath}';`);let n=s.data.config||{},o=n.chatId||"",i=n.message||"";return[`${t}const ${r} = await ${e.functionName}({`,`${t} chatId: ${x(o)},`,`${t} message: ${x(i)},`,`${t}});`]}function B(s,t,r,e){let o={"template-input":()=>`${r} ${e}: ${x(String(t))},`,"template-textarea":()=>`${r} ${e}: ${x(String(t))},`,number:()=>`${r} ${e}: ${t},`,select:()=>`${r} ${e}: "${t}",`,"schema-builder":()=>`${r} ${e}: ${JSON.stringify(t)},`}[s];return o?o():`${r} ${e}: "${t}",`}function dt(s,t,r,e){let n=I(t);if(!n)return null;let o=b(t);c.add(`import { ${o.functionName} } from '${o.importPath}';`);let i=s.data.config||{},f=M(n.configFields),p=[];for(let h of f){let m=i[h.key];m==null||m===""||p.push(B(h.type,m,r,h.key))}let $=[];return p.length>0?($.push(`${r}const ${e} = await ${o.functionName}({`),$.push(...p),$.push(`${r}});`)):$.push(`${r}const ${e} = await ${o.functionName}({});`),$}function mt(s,t,r,e){let n=s.data.config?.actionType,o=s.data.label||n||"Unknown Action",i=[`${r}// Action: ${o}`];s.data.description&&i.push(`${r}// ${s.data.description}`);let f=g.has(t);function p(y){let N=Z.exec(y);if(N){let[,T,,W]=N;return`${T}${W}`}return y}function $(y){let N=Z.exec(y);if(N){let[,T,,W]=N;return`${T}void ${W}`}return y}function h(y){let N=[];for(let T of y)T.includes("await")?N.push(p(T)):T.trim().startsWith("const")&&T.includes("{")?N.push($(T)):N.push(T);return N}let m=y=>f?y:h(y);if(n==="Generate Text")i.push(...m(ut(s,r,e)));else if(n==="Generate Image")i.push(...m(lt(s,r,e)));else if(n==="Send Email")i.push(...m(st(s,r,e)));else if(n==="Send Slack Message")i.push(...m(gt(s,r,e)));else if(n==="Create Ticket")i.push(...m(rt(s,r,e)));else if(n==="Scrape"||n==="Search")i.push(...m(ft(s,r,e)));else if(n==="Create Chat")i.push(...m(pt(s,r,e)));else if(n==="Send Message")i.push(...m($t(s,r,e)));else if(n==="Database Query")i.push(...m(ot(s,r,e)));else if(n==="HTTP Request")i.push(...m(it(s,r,e)));else{let y=dt(s,n,r,e);y?i.push(...m(y)):f?(i.push(`${r}// TODO: Implement action type "${n}"`),i.push(`${r}const ${e} = { status: 'pending', actionType: "${n}" };`)):(i.push(`${r}// TODO: Implement action type "${n}"`),i.push(`${r}void ({ status: 'pending', actionType: "${n}" });`))}return i}function ht(s,t,r){let e=[`${r}// Condition: ${s.data.label}`];s.data.description&&e.push(`${r}// ${s.data.description}`);let n=s.data.config?.condition,o=k.get(t)||[];if(o.length>0){let i=o[0],f=o[1],p=n?j(n):"true";if(e.push(`${r}if (${p}) {`),i){let $=F(i,`${r} `);e.push(...$)}if(f){e.push(`${r}} else {`);let $=F(f,`${r} `);e.push(...$)}e.push(`${r}}`)}return e}function yt(s,t){let r=k.get(s)||[];return{lines:z(r,t),wasSkipped:!0}}function Nt(s,t,r,e){let n=[];return s.data.config?.actionType==="Condition"?(n.push(...ht(s,t,e)),n):(n.push(...mt(s,t,e,r)),n)}function E(s,t,r){if(r.has(s))return[];r.add(s);let e=w.get(s);if(!e)return[];let n=[];if(e.data.type==="action")if(e.data.config?.actionType==="Condition")n.push(...wt(e,s,t,r));else{n.push(...Tt(e,t));let i=k.get(s)||[];i.length>0&&(n.push(""),n.push(...bt(i,t,r)))}return n}function wt(s,t,r,e){let n=[`${r}// Condition: ${s.data.label}`],o=s.data.config?.condition,i=k.get(t)||[];if(i.length>0){let f=o?j(o):"true";n.push(`${r}if (${f}) {`),i[0]&&n.push(...E(i[0],`${r} `,e)),i[1]&&(n.push(`${r}} else {`),n.push(...E(i[1],`${r} `,e))),n.push(`${r}}`)}return n}function Tt(s,t){let r=s.data.config?.actionType,e=s.data.label||r||"Unknown Action",n=b(r),o=Ct(s,`${t} `);c.add(`import { ${n.functionName} } from '${n.importPath}';`);let i=[`${t}// ${e}`];return o.length>0?(i.push(`${t}await ${n.functionName}({`),i.push(...o),i.push(`${t}});`)):i.push(`${t}await ${n.functionName}({});`),i}function bt(s,t,r){let e=s.filter(o=>!r.has(o));if(e.length===0)return[];if(e.length===1)return E(e[0],t,r);let n=[`${t}await Promise.all([`];for(let o=0;o<e.length;o++){let i=e[o],p=o===e.length-1?"":",",$=new Set(r),h=E(i,`${t} `,$);h.length>0&&(n.push(`${t} (async () => {`),n.push(...h),n.push(`${t} })()${p}`))}return n.push(`${t}]);`),n}function St(s,t,r){let e=new Set(C);e.delete(s);let n=E(s,`${t} `,e),o=r?"":",";return n.length===0?[]:[`${t} (async () => {`,...n,`${t} })()${o}`]}function z(s,t){if(s.length===0)return[];let r=s.filter(n=>!C.has(n)&&w.get(n)?.data.type==="action");if(r.length===0)return[];if(r.length===1){let n=new Set(C);return C.add(r[0]),E(r[0],t,n)}for(let n of r)C.add(n);let e=[`${t}await Promise.all([`];for(let n=0;n<r.length;n++)e.push(...St(r[n],t,n===r.length-1));return e.push(`${t}]);`),e}function xt(s,t,r){let e=I(t);if(!e)return[];let n=[];for(let o of M(e.configFields)){let i=s[o.key];i==null||i===""||n.push(B(o.type,i,r,o.key))}return n}let kt=new Set(["actionType","integrationId"]);function At(s,t){let r=[];for(let[e,n]of Object.entries(s))kt.has(e)||n===void 0||n===null||(typeof n=="string"?r.push(`${t}${e}: ${x(n)},`):typeof n=="number"||typeof n=="boolean"?r.push(`${t}${e}: ${n},`):r.push(`${t}${e}: ${JSON.stringify(n)},`));return r}function Ct(s,t){let r=s.data.config?.actionType,e=s.data.config||{},n=xt(e,r,t);return n.length>0?n:At(e,t)}function G(s,t,r){let e=k.get(s)||[],n=[...t];return t.length>0&&e.length>0&&n.push(""),n.push(...z(e,r)),n}function F(s,t=" "){if(C.has(s))return[`${t}// Already processed: ${s}`];C.add(s);let r=w.get(s);if(!r)return[];let e=P.get(s)||`${r.data.type}_${s.replace(/-/g,"_")}`,n=[];switch(r.data.type){case"trigger":{let{lines:o,wasSkipped:i}=yt(s,t);return i?o:G(s,o,t)}case"action":{let o=Nt(r,s,e,t);if(r.data.config?.actionType==="Condition")return o;n=o;break}default:n.push(`${t}// Unknown node type: ${r.data.type}`);break}return G(s,n,t)}if(D.length===0)A.push(" // No trigger nodes found");else for(let s of D){let t=F(s.id," ");A.push(...t)}return A.push("}"),{code:`${Array.from(c).join(`
|
|
2
|
-
`)}
|
|
3
|
-
|
|
4
|
-
${A.join(`
|
|
5
|
-
`)}
|
|
6
|
-
`,functionName:d,imports:Array.from(c)}}function Qt(a,l,u,d={}){let{code:g}=vt(l,u,d);return`/**
|
|
7
|
-
* Generated Workflow: ${a}
|
|
8
|
-
*
|
|
9
|
-
* This file was automatically generated from a workflow definition.
|
|
10
|
-
* DO NOT EDIT MANUALLY - regenerate from the workflow editor instead.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
${g}
|
|
14
|
-
`}var Zt=[{value:"string",label:"String"},{value:"number",label:"Number"},{value:"boolean",label:"Boolean"},{value:"datetime",label:"Date & Time"}],Yt={string:[{value:"exists",label:"exists",unary:!0},{value:"doesNotExist",label:"does not exist",unary:!0},{value:"isEmpty",label:"is empty",unary:!0},{value:"isNotEmpty",label:"is not empty",unary:!0},{value:"equals",label:"equals",unary:!1},{value:"notEquals",label:"does not equal",unary:!1},{value:"contains",label:"contains",unary:!1},{value:"doesNotContain",label:"does not contain",unary:!1},{value:"startsWith",label:"starts with",unary:!1},{value:"doesNotStartWith",label:"does not start with",unary:!1},{value:"endsWith",label:"ends with",unary:!1},{value:"doesNotEndWith",label:"does not end with",unary:!1},{value:"matchesRegex",label:"matches regex",unary:!1},{value:"doesNotMatchRegex",label:"does not match regex",unary:!1}],number:[{value:"equals",label:"equals",unary:!1},{value:"notEquals",label:"does not equal",unary:!1},{value:"greaterThan",label:"greater than",unary:!1},{value:"lessThan",label:"less than",unary:!1},{value:"greaterThanOrEqual",label:"greater than or equal",unary:!1},{value:"lessThanOrEqual",label:"less than or equal",unary:!1}],boolean:[{value:"isTrue",label:"is true",unary:!0},{value:"isFalse",label:"is false",unary:!0},{value:"exists",label:"exists",unary:!0},{value:"doesNotExist",label:"does not exist",unary:!0}],datetime:[{value:"isBefore",label:"is before",unary:!1},{value:"isAfter",label:"is after",unary:!1},{value:"equals",label:"equals",unary:!1}]};function Vt(a,l,u,d){switch(l){case"exists":return u!=null;case"doesNotExist":return u==null;case"isEmpty":return u==null||String(u)==="";case"isNotEmpty":return u!=null&&String(u)!=="";case"isTrue":return!!u;case"isFalse":return!u}switch(a){case"string":{let g=String(u??""),c=String(d??"");switch(l){case"equals":return g===c;case"notEquals":return g!==c;case"contains":return g.includes(c);case"doesNotContain":return!g.includes(c);case"startsWith":return g.startsWith(c);case"doesNotStartWith":return!g.startsWith(c);case"endsWith":return g.endsWith(c);case"doesNotEndWith":return!g.endsWith(c);case"matchesRegex":try{return new RegExp(c).test(g)}catch{return!1}case"doesNotMatchRegex":try{return!new RegExp(c).test(g)}catch{return!1}}break}case"number":{let g=Number(u),c=Number(d);if(Number.isNaN(g)||Number.isNaN(c))return!1;switch(l){case"equals":return g===c;case"notEquals":return g!==c;case"greaterThan":return g>c;case"lessThan":return g<c;case"greaterThanOrEqual":return g>=c;case"lessThanOrEqual":return g<=c}break}case"boolean":break;case"datetime":{let g=new Date(u).getTime(),c=new Date(d).getTime();if(Number.isNaN(g)||Number.isNaN(c))return!1;switch(l){case"isBefore":return g<c;case"isAfter":return g>c;case"equals":return g===c}break}}return console.warn(`[Condition] Unknown operator "${l}" for data type "${a}"`),!1}export{Et as a,Q as b,Mt as c,_t as d,Lt as e,jt as f,Bt as g,zt as h,vt as i,Qt as j,Zt as k,Yt as l,Vt as m};
|
package/dist/chunk-QMJQ5NK5.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import{j as q,m as L}from"./chunk-DMHGXYVW.js";import{a as Z,b as J}from"./chunk-IEOZJAW2.js";import{b as $}from"./chunk-6UXAINJQ.js";import{l as M,m as z}from"./chunk-BNX2SV7E.js";import{r as V,t as U}from"./chunk-QRG4O4PE.js";import{k as P,o as j,p as B,q as H}from"./chunk-5J6TNMJG.js";async function fe(e){let r=Z();if(r.getUser)return r.getUser(e);let o=await J.api.getSession({headers:e.headers});return o?.user?{id:o.user.id,email:o.user.email??void 0,name:o.user.name??void 0}:null}import{eq as re}from"drizzle-orm";import{readdir as ne,readFile as se}from"fs/promises";import{join as ie}from"path";import{eq as K}from"drizzle-orm";import"server-only";function Y(e){return{success:!0,data:e.triggerData}}async function O(e){"use step";return e._workflowComplete?(await B(e._workflowComplete),{success:!0,data:{}}):H(e,()=>Promise.resolve(Y(e)))}O.maxRetries=0;var D={"Database Query":{importer:()=>import("./database-query-OHFQUPLV.js"),stepFunction:"databaseQueryStep"},"HTTP Request":{importer:()=>import("./http-request-EHJHOTNA.js"),stepFunction:"httpRequestStep"},Condition:{importer:()=>import("./condition-CFAA7UDI.js"),stepFunction:"conditionStep"},Loop:{importer:()=>import("./loop-5LPVY452.js"),stepFunction:"loopStep"},Switch:{importer:()=>import("./switch-ZPVREROE.js"),stepFunction:"switchStep"},Merge:{importer:()=>import("./merge-HYBHX22D.js"),stepFunction:"mergeStep"}};function G(e,r){if(e===void 0||e==="")return;let o=/\{\{@([^:]+):([^}]+)\}\}/g,n=[...e.matchAll(o)];if(n.length===0)return e;function s(i,a){let u=i.replace(/[^a-zA-Z0-9]/g,"_"),d=r[u];if(!d)return;let w=a.indexOf(".");if(w===-1)return d.data;if(d.data===null||d.data===void 0)return;let x=a.substring(w+1).split("."),f=d.data,b=x[0];f&&typeof f=="object"&&"success"in f&&"data"in f&&b!=="success"&&b!=="data"&&b!=="error"&&!(b in f)&&(f=f.data);for(let W of x)if(f&&typeof f=="object")f=f[W];else return;return f}return n.length===1&&n[0][0]===e?s(n[0][1],n[0][2]):e.replace(o,(i,a,u)=>{let d=s(a,u);return d==null?"":typeof d=="object"?JSON.stringify(d):String(d)})}function ee(e,r){let o=e.dataType||"string",n=e.operator,s=e.leftValue,i=e.rightValue,a=G(s,r),u=G(i,r);return console.log("[Condition] Evaluating:",{dataType:o,operator:n,leftResolved:a,rightResolved:u}),{result:L(o,n,a,u),resolvedValues:{leftValue:a,rightValue:u}}}async function te(e){let{actionType:r,config:o,outputs:n,context:s}=e,i={...o,_context:s};if(r==="Condition"){let w=D.Condition,k=await w.importer(),{result:x,resolvedValues:f}=ee(o,n);return console.log("[Condition] Final result:",x),await k[w.stepFunction]({condition:x,dataType:o.dataType,operator:o.operator,leftValue:f.leftValue,rightValue:f.rightValue,_context:s})}let a=D[r];if(a){let k=(await a.importer())[a.stepFunction];return await k(i)}let{getStepImporter:u}=await import("virtual:workflow-builder-step-registry"),d=u(r);if(d){let k=(await d.importer())[d.stepFunction];return k?await k(i):{success:!1,error:`Step function "${d.stepFunction}" not found in module for action "${r}". Check that the plugin exports the correct function name.`}}return{success:!1,error:`Unknown action type: "${r}". This action is not registered in the plugin system. Available system actions: ${Object.keys(D).join(", ")}.`}}function oe(e,r){let o={};for(let[n,s]of Object.entries(e))if(typeof s=="string"){let i=s,a=/\{\{@([^:]+):([^}]+)\}\}/g;i=i.replace(a,(u,d,w)=>{let k=d.replace(/[^a-zA-Z0-9]/g,"_"),x=r[k];if(!x)return u;let f=w.indexOf(".");if(f===-1){let t=x.data;return t==null?"":typeof t=="object"?JSON.stringify(t):String(t)}if(x.data===null||x.data===void 0)return"";let W=w.substring(f+1).split("."),p=x.data,R=W[0];p&&typeof p=="object"&&"success"in p&&"data"in p&&R!=="success"&&R!=="data"&&R!=="error"&&!(R in p)&&(p=p.data);for(let t of W)if(p&&typeof p=="object")p=p[t];else return"";return p==null?"":typeof p=="object"?JSON.stringify(p):String(p)}),o[n]=i}else o[n]=s;return o}async function Q(e){"use workflow";console.log("[Workflow Executor] Starting workflow execution");let{nodes:r,edges:o,triggerInput:n={},executionId:s,workflowId:i}=e;console.log("[Workflow Executor] Input:",{nodeCount:r.length,edgeCount:o.length,hasExecutionId:!!s,workflowId:i||"none"});let a={},u={},d=new Map(r.map(t=>[t.id,t])),w=new Map,k=new Map;for(let t of o){let g=w.get(t.source)||[];g.push(t.target),w.set(t.source,g);let c=k.get(t.target)||[];c.push(t.source),k.set(t.target,c)}let x=new Set(o.map(t=>t.target)),f=r.filter(t=>t.data.type==="trigger"&&!x.has(t.id));console.log("[Workflow Executor] Found",f.length,"trigger nodes");let{getActionLabel:b}=await import("virtual:workflow-builder-step-registry");function W(t){if(t.data.label)return t.data.label;if(t.data.type==="action"){let g=t.data.config?.actionType;if(g){let c=b(g);if(c)return c}return"Action"}return t.data.type==="trigger"?t.data.config?.triggerType||"Trigger":t.data.type}async function p(){return s?(await j.query.workflowExecutions.findFirst({where:K(P.id,s),columns:{status:!0}}))?.status==="cancelled":!1}async function R(t,g=new Set){if(console.log("[Workflow Executor] Executing node:",t),await p()){console.log("[Workflow Executor] Execution cancelled, stopping");return}if(g.has(t)){console.log("[Workflow Executor] Node already visited, skipping");return}g.add(t);let c=d.get(t);if(!c){console.log("[Workflow Executor] Node not found:",t);return}if(c.data.enabled===!1){console.log("[Workflow Executor] Skipping disabled node:",t);let l=t.replace(/[^a-zA-Z0-9]/g,"_");a[l]={label:c.data.label||t,data:null};let v=w.get(t)||[];await Promise.all(v.map(h=>R(h,g)));return}try{let l;if(c.data.type==="trigger"){console.log("[Workflow Executor] Executing trigger node");let h=c.data.config||{},m=h.triggerType,y={triggered:!0,timestamp:Date.now()};if(m==="Webhook"&&h.webhookMockRequest&&(!n||Object.keys(n).length===0))try{let S=JSON.parse(h.webhookMockRequest);y={...y,...S},console.log("[Workflow Executor] Using webhook mock request data:",S)}catch(S){console.error("[Workflow Executor] Failed to parse webhook mock request:",S)}else n&&Object.keys(n).length>0&&(y={...y,...n});let C={executionId:s,nodeId:c.id,nodeName:W(c),nodeType:c.data.type},T=await O({triggerData:y,_context:C});l={success:T.success,data:T.data}}else if(c.data.type==="action"){let h=c.data.config||{},m=h.actionType;if(console.log("[Workflow Executor] Executing action node:",m),!m){l={success:!1,error:`Action node "${c.data.label||c.id}" has no action type configured`},u[t]=l;return}let y=oe(h,a),C={executionId:s,nodeId:c.id,nodeName:W(c),nodeType:m},T={},S=k.get(t)||[];for(let A of S){let F=A.replace(/[^a-zA-Z0-9]/g,"_"),I=a[F];if(I?.data&&typeof I.data=="object"){let N=I.data;"success"in N&&"data"in N&&N.data&&typeof N.data=="object"&&(N=N.data);for(let[_,X]of Object.entries(N))_!=="success"&&_!=="error"&&(T[_]=X)}}console.log("[Workflow Executor] Calling executeActionStep");let E=await te({actionType:m,config:{...T,...y},outputs:a,context:C});if(console.log("[Workflow Executor] Step result received:",{hasResult:!!E,resultType:typeof E}),E&&typeof E=="object"&&"success"in E&&E.success===!1){let A=E,F=typeof A.error=="string"?A.error:A.error?.message||`Step "${m}" in node "${c.data.label||c.id}" failed without a specific error message.`;console.error(`[Workflow Executor] Step "${m}" failed:`,F),l={success:!1,error:F}}else l={success:!0,data:E}}else console.log("[Workflow Executor] Unknown node type:",c.data.type),l={success:!1,error:`Unknown node type "${c.data.type}" in node "${c.data.label||c.id}". Expected "trigger" or "action".`};u[t]=l;let v=t.replace(/[^a-zA-Z0-9]/g,"_");if(a[v]={label:c.data.label||t,data:l.data},console.log("[Workflow Executor] Node execution completed:",{nodeId:t,success:l.success}),l.success)if(c.data.type==="action"&&c.data.config?.actionType==="Condition"){let m=l.data?.condition;if(console.log("[Workflow Executor] Condition node result:",m),m===!0){let y=w.get(t)||[];console.log("[Workflow Executor] Condition is true, executing",y.length,"next nodes in parallel"),await Promise.all(y.map(C=>R(C,g)))}else console.log("[Workflow Executor] Condition is false, skipping next nodes")}else{let m=w.get(t)||[];console.log("[Workflow Executor] Executing",m.length,"next nodes in parallel"),await Promise.all(m.map(y=>R(y,g)))}}catch(l){console.error("[Workflow Executor] Error executing node:",t,l);let h={success:!1,error:await $(l)};u[t]=h}}try{console.log("[Workflow Executor] Starting execution from trigger nodes");let t=Date.now();await Promise.all(f.map(l=>R(l.id)));let g=Object.values(u).every(l=>l.success),c=Date.now()-t;if(console.log("[Workflow Executor] Workflow execution completed:",{success:g,resultCount:Object.keys(u).length,duration:c}),s&&!await p())try{await O({triggerData:{},_workflowComplete:{executionId:s,status:g?"success":"error",output:Object.values(u).at(-1)?.data,error:Object.values(u).find(l=>!l.success)?.error,startTime:t}}),console.log("[Workflow Executor] Updated execution record")}catch(l){console.error("[Workflow Executor] Failed to update execution record:",l)}return{success:g,results:u,outputs:a}}catch(t){console.error("[Workflow Executor] Fatal error during workflow execution:",t);let g=await $(t);if(s)try{await O({triggerData:{},_workflowComplete:{executionId:s,status:"error",error:g,startTime:Date.now()}})}catch(c){console.error("[Workflow Executor] Failed to log error:",c)}return{success:!1,results:u,outputs:a,error:g}}}var Fe={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization"};function je(e){let o=new URL(e.url).pathname,n="/api/workflow-builder/",s=o.indexOf(n);if(s===-1){let a=o.indexOf("/api/");return a===-1?[]:o.slice(a+5).split("/").filter(Boolean)}return o.slice(s+n.length).split("/").filter(Boolean)}function Ie(e,r){return new Request(r,{method:e.method,headers:e.headers,body:e.body,duplex:"half"})}async function _e(e,r,o,n,s){try{await Q({nodes:o,edges:n,triggerInput:s,executionId:e,workflowId:r})}catch(i){console.error("[Workflow Execute] Error during execution:",i),await j.update(P).set({status:"error",error:i instanceof Error?i.message:"Unknown error",completedAt:new Date}).where(re(P.id,e))}}function $e(e){let r={updatedAt:new Date};return e.name!==void 0&&(r.name=e.name),e.description!==void 0&&(r.description=e.description),e.nodes!==void 0&&(r.nodes=e.nodes),e.edges!==void 0&&(r.edges=e.edges),e.visibility!==void 0&&(r.visibility=e.visibility),r}function De(e){return e.map(r=>{let o={...r};if(o.data&&typeof o.data=="object"&&o.data!==null){let n={...o.data};if(n.config&&typeof n.config=="object"&&n.config!==null){let{integrationId:s,...i}=n.config;n.config=i}o.data=n}return o})}async function ae(e,r=e){let o={},n=await ne(e,{withFileTypes:!0});for(let s of n){let i=ie(e,s.name);if(s.isDirectory()){let a=await ae(i,r);Object.assign(o,a)}else if(s.isFile()){let a=await se(i,"utf-8"),u=i.substring(r.length+1);o[u]=a}}return o}function Ve(e){let r={},n=`${e.name.replace(M,"").split(z).map((a,u)=>u===0?a.toLowerCase():a.charAt(0).toUpperCase()+a.slice(1).toLowerCase()).join("")||"execute"}Workflow`,s=q(e.name,e.nodes,e.edges,{functionName:n}),i=ce(e.name);return r[`workflows/${i}.ts`]=s,r[`app/api/workflows/${i}/route.ts`]=`import { start } from 'workflow/api';
|
|
2
|
-
import { ${n} } from '@/workflows/${i}';
|
|
3
|
-
import { NextResponse } from 'next/server';
|
|
4
|
-
|
|
5
|
-
export async function POST(request: Request) {
|
|
6
|
-
try {
|
|
7
|
-
const body = await request.json();
|
|
8
|
-
|
|
9
|
-
// Start the workflow execution
|
|
10
|
-
await start(${n}, [body]);
|
|
11
|
-
|
|
12
|
-
return NextResponse.json({
|
|
13
|
-
success: true,
|
|
14
|
-
message: 'Workflow started successfully',
|
|
15
|
-
});
|
|
16
|
-
} catch (error) {
|
|
17
|
-
return NextResponse.json(
|
|
18
|
-
{
|
|
19
|
-
success: false,
|
|
20
|
-
error: error instanceof Error ? error.message : 'Unknown error',
|
|
21
|
-
},
|
|
22
|
-
{ status: 500 }
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
`,r["app/page.tsx"]=`export default function Home() {
|
|
27
|
-
return (
|
|
28
|
-
<main className="p-8">
|
|
29
|
-
<h1 className="text-2xl font-bold mb-4">Workflow: ${e.name}</h1>
|
|
30
|
-
<p className="mb-4 text-gray-600">API endpoint:</p>
|
|
31
|
-
<ul className="list-disc pl-6 space-y-2">
|
|
32
|
-
<li>
|
|
33
|
-
<a href="/api/workflows/${i}" className="text-blue-600 hover:underline">
|
|
34
|
-
/api/workflows/${i}
|
|
35
|
-
</a>
|
|
36
|
-
</li>
|
|
37
|
-
</ul>
|
|
38
|
-
</main>
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
`,r}function Ue(e){let r=e.filter(o=>o.data.type==="action").map(o=>o.data.config?.actionType).filter(Boolean);return V(r)}function qe(){let e=["# Add your environment variables here"];e.push(""),e.push("# For database integrations"),e.push("DATABASE_URL=your_database_url");let r=U(),o={};for(let n of r){let s=n.name.split("_")[0];o[s]||(o[s]=[]),o[s].push(n)}for(let[n,s]of Object.entries(o)){e.push(`# For ${n.charAt(0)+n.slice(1).toLowerCase()} integration`);for(let i of s)e.push(`${i.name}=your_${i.name.toLowerCase()}`);e.push("")}return e.join(`
|
|
42
|
-
`)}function ce(e){return e.toLowerCase().replace(/[^a-z0-9]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")}export{fe as a,Fe as b,je as c,Ie as d,_e as e,$e as f,De as g,ae as h,Ve as i,Ue as j,qe as k,ce as l};
|
package/dist/handler-YTQRRHEK.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as N,e as I}from"./chunk-QMJQ5NK5.js";import"./chunk-DMHGXYVW.js";import{b as O}from"./chunk-IEOZJAW2.js";import"./chunk-6UXAINJQ.js";import"./chunk-BNX2SV7E.js";import{i as k}from"./chunk-KFTXS23Q.js";import{k as h,w as A}from"./chunk-QRG4O4PE.js";import{a as m,i as c,j as l,k as f,l as g,o as s}from"./chunk-5J6TNMJG.js";import{WebStandardStreamableHTTPServerTransport as W}from"@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js";import{withMcpAuth as _}from"better-auth/plugins";import{McpServer as E}from"@modelcontextprotocol/sdk/server/mcp.js";import{and as y,desc as v,eq as a,inArray as J}from"drizzle-orm";import{z as r}from"zod";function T(d,i){d.registerTool("list_workflows",{description:"List the authenticated user's workflows",inputSchema:{limit:r.number().optional(),offset:r.number().optional()}},async({limit:e,offset:t})=>{let o=await s.select().from(c).where(a(c.userId,i)).orderBy(v(c.updatedAt)).limit(e??50).offset(t??0);return{content:[{type:"text",text:JSON.stringify(o.map(n=>({...n,createdAt:n.createdAt.toISOString(),updatedAt:n.updatedAt.toISOString()})))}]}}),d.registerTool("get_workflow",{description:"Get a workflow by ID",inputSchema:{workflowId:r.string()}},async({workflowId:e})=>{let t=await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))});return t?{content:[{type:"text",text:JSON.stringify({...t,createdAt:t.createdAt.toISOString(),updatedAt:t.updatedAt.toISOString()})}]}:{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]}}),d.registerTool("create_workflow",{description:"Create a new workflow",inputSchema:{name:r.string(),description:r.string().optional(),nodes:r.array(r.record(r.string(),r.unknown())),edges:r.array(r.record(r.string(),r.unknown()))}},async({name:e,description:t,nodes:o,edges:n})=>{if(!(await k(o,i)).valid)return{content:[{type:"text",text:JSON.stringify({error:"Invalid integration references"})}]};let x=m(),[u]=await s.insert(c).values({id:x,name:e,description:t,nodes:o,edges:n,userId:i}).returning();return{content:[{type:"text",text:JSON.stringify({...u,createdAt:u.createdAt.toISOString(),updatedAt:u.updatedAt.toISOString()})}]}}),d.registerTool("update_workflow",{description:"Update an existing workflow",inputSchema:{workflowId:r.string(),name:r.string().optional(),description:r.string().optional(),nodes:r.array(r.record(r.string(),r.unknown())).optional(),edges:r.array(r.record(r.string(),r.unknown())).optional()}},async({workflowId:e,name:t,description:o,nodes:n,edges:w})=>{if(!await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))}))return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};if(n&&!(await k(n,i)).valid)return{content:[{type:"text",text:JSON.stringify({error:"Invalid integration references"})}]};let u={updatedAt:new Date};t!==void 0&&(u.name=t),o!==void 0&&(u.description=o),n!==void 0&&(u.nodes=n),w!==void 0&&(u.edges=w);let[p]=await s.update(c).set(u).where(a(c.id,e)).returning();return{content:[{type:"text",text:JSON.stringify({...p,createdAt:p.createdAt.toISOString(),updatedAt:p.updatedAt.toISOString()})}]}}),d.registerTool("delete_workflow",{description:"Delete a workflow",inputSchema:{workflowId:r.string()}},async({workflowId:e})=>{if(!await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))}))return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};let n=(await s.query.workflowExecutions.findMany({where:a(f.workflowId,e),columns:{id:!0}})).map(w=>w.id);return n.length>0&&(await s.delete(g).where(J(g.executionId,n)),await s.delete(f).where(a(f.workflowId,e))),await s.delete(c).where(a(c.id,e)),{content:[{type:"text",text:JSON.stringify({success:!0})}]}}),d.registerTool("duplicate_workflow",{description:"Duplicate a workflow",inputSchema:{workflowId:r.string()}},async({workflowId:e})=>{let t=await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))});if(!t)return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};let o=t.nodes,n=o.map(p=>({...p,id:m()})),w=new Map(o.map((p,S)=>[p.id,n[S].id])),x=t.edges.map(p=>({...p,id:m(),source:w.get(p.source)||p.source,target:w.get(p.target)||p.target})),[u]=await s.insert(c).values({id:m(),name:`${t.name} (Copy)`,description:t.description,nodes:n,edges:x,userId:i,visibility:"private"}).returning();return{content:[{type:"text",text:JSON.stringify({...u,createdAt:u.createdAt.toISOString(),updatedAt:u.updatedAt.toISOString()})}]}}),d.registerTool("execute_workflow",{description:"Execute a workflow",inputSchema:{workflowId:r.string(),input:r.record(r.string(),r.unknown()).optional()}},async({workflowId:e,input:t})=>{let o=await s.query.workflows.findFirst({where:y(a(c.id,e),a(c.userId,i))});if(!o)return{content:[{type:"text",text:JSON.stringify({error:"Workflow not found"})}]};if(!(await k(o.nodes,i)).valid)return{content:[{type:"text",text:JSON.stringify({error:"Invalid integration references"})}]};let[w]=await s.insert(f).values({workflowId:e,userId:i,status:"running",input:t??{}}).returning();return I(w.id,e,o.nodes,o.edges,t??{}),{content:[{type:"text",text:JSON.stringify({executionId:w.id,status:"running"})}]}}),d.registerTool("get_execution_status",{description:"Get execution status and logs",inputSchema:{executionId:r.string()}},async({executionId:e})=>{let t=await s.query.workflowExecutions.findFirst({where:a(f.id,e),with:{workflow:!0}});if(!t||t.workflow.userId!==i)return{content:[{type:"text",text:JSON.stringify({error:"Execution not found"})}]};let o=await s.query.workflowExecutionLogs.findMany({where:a(g.executionId,e),orderBy:[v(g.timestamp)]});return{content:[{type:"text",text:JSON.stringify({status:t.status,input:t.input,output:t.output,error:t.error,startedAt:t.startedAt.toISOString(),completedAt:t.completedAt?.toISOString(),logs:o.map(n=>({nodeId:n.nodeId,nodeName:n.nodeName,nodeType:n.nodeType,status:n.status,input:n.input,output:n.output,error:n.error}))})}]}}),d.registerTool("cancel_execution",{description:"Cancel a running workflow execution",inputSchema:{executionId:r.string()}},async({executionId:e})=>{let t=await s.query.workflowExecutions.findFirst({where:a(f.id,e),with:{workflow:!0}});if(!t||t.workflow.userId!==i)return{content:[{type:"text",text:JSON.stringify({error:"Execution not found"})}]};if(t.status!=="running"&&t.status!=="pending")return{content:[{type:"text",text:JSON.stringify({error:"Execution is not running",status:t.status})}]};await s.update(f).set({status:"cancelled",completedAt:new Date,duration:String(Date.now()-new Date(t.startedAt).getTime())}).where(a(f.id,e));let o=await s.query.workflowExecutionLogs.findMany({where:y(a(g.executionId,e),J(g.status,["pending","running"]))});for(let n of o)await s.update(g).set({status:"error",error:"Cancelled",completedAt:new Date}).where(a(g.id,n.id));return{content:[{type:"text",text:JSON.stringify({success:!0,status:"cancelled"})}]}}),d.registerTool("list_available_actions",{description:"List all available plugin actions with their config fields"},async()=>{let t=h().map(o=>({id:o.id,label:o.label,description:o.description,category:o.category,integration:o.integration,configFields:A(o.configFields).map(n=>({key:n.key,label:n.label,type:n.type,required:n.required,placeholder:n.placeholder}))}));return{content:[{type:"text",text:JSON.stringify(t)}]}}),d.registerTool("list_integrations",{description:"List the authenticated user's connected integrations"},async()=>{let e=await s.select({id:l.id,name:l.name,type:l.type,isManaged:l.isManaged,createdAt:l.createdAt,updatedAt:l.updatedAt}).from(l).where(a(l.userId,i));return{content:[{type:"text",text:JSON.stringify(e.map(t=>({...t,createdAt:t.createdAt.toISOString(),updatedAt:t.updatedAt.toISOString()})))}]}})}function L(d){let i=new E({name:"workflow-builder",version:"1.0.0"});return T(i,d),i}async function M(d,i){let e=L(i),t=new W({sessionIdGenerator:void 0});return await e.connect(t),await t.handleRequest(d)}async function V(d){if(d.method==="POST"){if(process.env.NWB_ANONYMOUS_AUTH!=="false"){let i=await N(d);if(i)return M(d,i.id)}return _(O,async(i,e)=>M(i,e.userId))(d)}return new Response("Method not allowed",{status:405})}export{V as handleMcpRequest};
|