next-workflow-builder 0.7.5 → 0.7.7

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 CHANGED
@@ -1,5 +1,36 @@
1
1
  # next-workflow-builder
2
2
 
3
+ ## 0.7.7
4
+
5
+ ### Features
6
+
7
+ - Add **Switch "All matches" mode** — new Match selector (`First match` / `All matches`). When set to "All matches", the Switch evaluates every route and executes all whose condition is true, instead of stopping at the first match. The executor follows all matched route handles in parallel. Default remains "First match" for backwards compatibility
8
+ - Redesign **Dashboard** page (`/dashboard`) — now shows a workflow-centric table instead of individual execution rows. Each workflow displays aggregated run stats (total, success, error, cancelled), latest run status with relative time, and inline action buttons to execute, stop, or delete workflows directly from the dashboard. Summary cards show total workflows, total runs, successes, and errors. Polls every 5 seconds for live updates
9
+ - Add `GET /workflows/dashboard` API endpoint — returns all workflows for the authenticated user with aggregated execution stats (counts by status, latest run info, running execution ID) using SQL aggregation
10
+ - Add "Dashboard" link in user dropdown menu
11
+ - Export `DashboardPage` component from `next-workflow-builder/client` for consumers with custom routing
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ - Fix workflow run steps showing generic **"Action"** for unlabeled nodes — now displays the actual action type name (e.g. "Switch", "Condition", "Merge") when the node label is empty
17
+
18
+ ## 0.7.6
19
+
20
+ ### Features
21
+
22
+ - Add **Enum** field type to the Webhook payload schema builder — allows defining a fixed set of allowed values with a configurable value type (`string`, `number`, or `boolean`). Enum values are displayed in template autocomplete as `enum<value1 | value2 | ...>`
23
+ - Make **Switch** plugin routes fully dynamic — users can now add and remove routes with no upper limit (minimum 1). Previously hardcoded to exactly 4 routes. Existing workflows with 4 routes continue to work without migration
24
+ - Add **Switch node routing** — Switch nodes now display multiple output handles (one per route + Default) on the right side. Each handle can be connected to a different downstream node. The executor routes execution only to the matched route's connected nodes based on `sourceHandle` IDs on edges
25
+ - Add **Condition node routing** — Condition nodes now display two output handles: **True** and **False**. Each can be connected to different downstream nodes for branching. Backwards compatible with existing workflows (legacy edges without handles still work as before)
26
+ - Add **Switch route condition evaluation** — route conditions in rules mode are now properly evaluated as expressions (supports `===`, `!==`, `>`, `<`, `>=`, `<=`) instead of being passed as raw strings
27
+ - Fix **Switch** code generation showing `unknownStep` — Switch was missing from `SYSTEM_ACTION_TEMPLATES`, now correctly generates `switchStep` code
28
+ - Make **Merge** plugin inputs fully dynamic — users can now add and remove inputs (minimum 2, no upper limit). Previously hardcoded to exactly 2 inputs. Merge nodes display multiple labeled target handles on the left side, one per input. The executor maps incoming edges by `targetHandle` to the correct input slot. Existing workflows with 2 inputs continue to work without migration
29
+
30
+ ### Bug Fixes
31
+
32
+ - Fix **Condition** Data Type select being stuck — changing the data type called `onUpdateConfig` twice in rapid succession, causing the second call to overwrite the first with stale state. Now batches both `dataType` and `operator` updates into a single atomic config change via `onUpdateMultipleConfig`
33
+
3
34
  ## 0.7.5
4
35
 
5
36
  ### Bug Fixes
@@ -1,4 +1,4 @@
1
- import{a as k}from"./chunk-WT4BSMUD.js";import{j as l}from"./chunk-VUDOAZ3W.js";import{a as m,b as w}from"./chunk-IEOZJAW2.js";import{l as d,m as p}from"./chunk-BNX2SV7E.js";import{r as f,t as u}from"./chunk-QRG4O4PE.js";import{k as c,o as g}from"./chunk-5J6TNMJG.js";async function b(e){let r=m();if(r.getUser)return r.getUser(e);let t=await w.api.getSession({headers:e.headers});return t?.user?{id:t.user.id,email:t.user.email??void 0,name:t.user.name??void 0}:null}import{eq as x}from"drizzle-orm";import{readdir as h,readFile as R}from"fs/promises";import{join as y}from"path";var T={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization"};function _(e){let t=new URL(e.url).pathname,n="/api/workflow-builder/",s=t.indexOf(n);if(s===-1){let i=t.indexOf("/api/");return i===-1?[]:t.slice(i+5).split("/").filter(Boolean)}return t.slice(s+n.length).split("/").filter(Boolean)}function q(e,r){return new Request(r,{method:e.method,headers:e.headers,body:e.body,duplex:"half"})}async function D(e,r,t,n,s){try{await k({nodes:t,edges:n,triggerInput:s,executionId:e,workflowId:r})}catch(o){console.error("[Workflow Execute] Error during execution:",o),await g.update(c).set({status:"error",error:o instanceof Error?o.message:"Unknown error",completedAt:new Date}).where(x(c.id,e))}}function S(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 B(e){return e.map(r=>{let t={...r};if(t.data&&typeof t.data=="object"&&t.data!==null){let n={...t.data};if(n.config&&typeof n.config=="object"&&n.config!==null){let{integrationId:s,...o}=n.config;n.config=o}t.data=n}return t})}async function A(e,r=e){let t={},n=await h(e,{withFileTypes:!0});for(let s of n){let o=y(e,s.name);if(s.isDirectory()){let i=await A(o,r);Object.assign(t,i)}else if(s.isFile()){let i=await R(o,"utf-8"),a=o.substring(r.length+1);t[a]=i}}return t}function z(e){let r={},n=`${e.name.replace(d,"").split(p).map((i,a)=>a===0?i.toLowerCase():i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join("")||"execute"}Workflow`,s=l(e.name,e.nodes,e.edges,{functionName:n}),o=N(e.name);return r[`workflows/${o}.ts`]=s,r[`app/api/workflows/${o}/route.ts`]=`import { start } from 'workflow/api';
1
+ import{a as k}from"./chunk-H2FP5MBV.js";import{j as l}from"./chunk-VUDOAZ3W.js";import{a as m,b as w}from"./chunk-IEOZJAW2.js";import{l as d,m as p}from"./chunk-BNX2SV7E.js";import{r as f,t as u}from"./chunk-QRG4O4PE.js";import{k as c,o as g}from"./chunk-5J6TNMJG.js";async function b(e){let r=m();if(r.getUser)return r.getUser(e);let t=await w.api.getSession({headers:e.headers});return t?.user?{id:t.user.id,email:t.user.email??void 0,name:t.user.name??void 0}:null}import{eq as x}from"drizzle-orm";import{readdir as h,readFile as R}from"fs/promises";import{join as y}from"path";var T={"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization"};function _(e){let t=new URL(e.url).pathname,n="/api/workflow-builder/",s=t.indexOf(n);if(s===-1){let i=t.indexOf("/api/");return i===-1?[]:t.slice(i+5).split("/").filter(Boolean)}return t.slice(s+n.length).split("/").filter(Boolean)}function q(e,r){return new Request(r,{method:e.method,headers:e.headers,body:e.body,duplex:"half"})}async function D(e,r,t,n,s){try{await k({nodes:t,edges:n,triggerInput:s,executionId:e,workflowId:r})}catch(o){console.error("[Workflow Execute] Error during execution:",o),await g.update(c).set({status:"error",error:o instanceof Error?o.message:"Unknown error",completedAt:new Date}).where(x(c.id,e))}}function S(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 B(e){return e.map(r=>{let t={...r};if(t.data&&typeof t.data=="object"&&t.data!==null){let n={...t.data};if(n.config&&typeof n.config=="object"&&n.config!==null){let{integrationId:s,...o}=n.config;n.config=o}t.data=n}return t})}async function A(e,r=e){let t={},n=await h(e,{withFileTypes:!0});for(let s of n){let o=y(e,s.name);if(s.isDirectory()){let i=await A(o,r);Object.assign(t,i)}else if(s.isFile()){let i=await R(o,"utf-8"),a=o.substring(r.length+1);t[a]=i}}return t}function z(e){let r={},n=`${e.name.replace(d,"").split(p).map((i,a)=>a===0?i.toLowerCase():i.charAt(0).toUpperCase()+i.slice(1).toLowerCase()).join("")||"execute"}Workflow`,s=l(e.name,e.nodes,e.edges,{functionName:n}),o=N(e.name);return r[`workflows/${o}.ts`]=s,r[`app/api/workflows/${o}/route.ts`]=`import { start } from 'workflow/api';
2
2
  import { ${n} } from '@/workflows/${o}';
3
3
  import { NextResponse } from 'next/server';
4
4
 
@@ -0,0 +1 @@
1
+ import{c as v}from"./chunk-3YVRTDK2.js";import{b as _}from"./chunk-6UXAINJQ.js";import{k as z,o as q,p as B,q as H}from"./chunk-5J6TNMJG.js";import{eq as K}from"drizzle-orm";import"server-only";function Q(a){return{success:!0,data:a.triggerData}}async function A(a){"use step";return a._workflowComplete?(await B(a._workflowComplete),{success:!0,data:{}}):H(a,()=>Promise.resolve(Q(a)))}A.maxRetries=0;var L={"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-2LUIE5RH.js"),stepFunction:"switchStep"},Merge:{importer:()=>import("./merge-LQKF2JKM.js"),stepFunction:"mergeStep"},"Run Workflow":{importer:()=>import("./run-workflow-TSGBN4NF.js"),stepFunction:"runWorkflowStep"},"Run Workflows in Sequence":{importer:()=>import("./run-workflows-in-sequence-K5THSFDS.js"),stepFunction:"runWorkflowsInSequenceStep"}};function Z(a,h){if(a===void 0||a==="")return;let u=/\{\{@([^:]+):([^}]+)\}\}/g,w=[...a.matchAll(u)];if(w.length===0)return a;function d(S,r){let g=S.replace(/[^a-zA-Z0-9]/g,"_"),f=h[g];if(!f)return;let i=r.indexOf(".");if(i===-1)return f.data;if(f.data===null||f.data===void 0)return;let s=r.substring(i+1).split("."),o=f.data,W=s[0];o&&typeof o=="object"&&"success"in o&&"data"in o&&W!=="success"&&W!=="data"&&W!=="error"&&!(W in o)&&(o=o.data);for(let k of s)if(o&&typeof o=="object")o=o[k];else return;return o}return w.length===1&&w[0][0]===a?d(w[0][1],w[0][2]):a.replace(u,(S,r,g)=>{let f=d(r,g);return f==null?"":typeof f=="object"?JSON.stringify(f):String(f)})}function Y(a,h){let u=a.dataType||"string",w=a.operator,d=a.leftValue,S=a.rightValue,r=Z(d,h),g=Z(S,h);return console.log("[Condition] Evaluating:",{dataType:u,operator:w,leftResolved:r,rightResolved:g}),{result:v(u,w,r,g),resolvedValues:{leftValue:r,rightValue:g}}}function G(a){let h=/^(.+?)\s*(===|!==|==|!=|>=|<=|>|<)\s*(.+)$/,u=a.trim().match(h);if(!u){let k=a.trim();return k!==""&&k!=="false"&&k!=="0"&&k!=="null"&&k!=="undefined"}let[,w,d,S]=u,r=w.trim(),g=S.trim(),f=k=>k.startsWith('"')&&k.endsWith('"')||k.startsWith("'")&&k.endsWith("'")?k.slice(1,-1):k,i=f(r),p=f(g),s=Number(i),o=Number(p),W=!Number.isNaN(s)&&!Number.isNaN(o)&&i!==""&&p!=="";switch(d){case"===":case"==":return i===p;case"!==":case"!=":return i!==p;case">":return W?s>o:i>p;case"<":return W?s<o:i<p;case">=":return W?s>=o:i>=p;case"<=":return W?s<=o:i<=p;default:return!1}}async function U(a){let{actionType:h,config:u,outputs:w,context:d}=a,S={...u,_context:d};if(h==="Condition"){let i=L.Condition,p=await i.importer(),{result:s,resolvedValues:o}=Y(u,w);return console.log("[Condition] Final result:",s),await p[i.stepFunction]({condition:s,dataType:u.dataType,operator:u.operator,leftValue:o.leftValue,rightValue:o.rightValue,_context:d})}if(h==="Switch"&&(u.mode||"rules")==="rules"){let p=Number(u.routeCount)||4;for(let s=0;s<p;s++){let o=`routeCondition${s}`,W=S[o];typeof W=="string"&&W.trim()!==""&&(S[o]=G(W))}}let r=L[h];if(r){let p=(await r.importer())[r.stepFunction];return await p(S)}let{getStepImporter:g}=await import("virtual:workflow-builder-step-registry"),f=g(h);if(f){let p=(await f.importer())[f.stepFunction];return p?await p(S):{success:!1,error:`Step function "${f.stepFunction}" not found in module for action "${h}". Check that the plugin exports the correct function name.`}}return{success:!1,error:`Unknown action type: "${h}". This action is not registered in the plugin system. Available system actions: ${Object.keys(L).join(", ")}.`}}function J(a,h){let u={};for(let[w,d]of Object.entries(a))if(typeof d=="string"){let S=d,r=/\{\{@([^:]+):([^}]+)\}\}/g;S=S.replace(r,(g,f,i)=>{let p=f.replace(/[^a-zA-Z0-9]/g,"_"),s=h[p];if(!s)return g;let o=i.indexOf(".");if(o===-1){let E=s.data;return E==null?"":typeof E=="object"?JSON.stringify(E):String(E)}if(s.data===null||s.data===void 0)return"";let k=i.substring(o+1).split("."),x=s.data,F=k[0];x&&typeof x=="object"&&"success"in x&&"data"in x&&F!=="success"&&F!=="data"&&F!=="error"&&!(F in x)&&(x=x.data);for(let E of k)if(x&&typeof x=="object")x=x[E];else return"";return x==null?"":typeof x=="object"?JSON.stringify(x):String(x)}),u[w]=S}else u[w]=d;return u}async function ce(a){"use workflow";console.log("[Workflow Executor] Starting workflow execution");let{nodes:h,edges:u,triggerInput:w={},executionId:d,workflowId:S}=a;console.log("[Workflow Executor] Input:",{nodeCount:h.length,edgeCount:u.length,hasExecutionId:!!d,workflowId:S||"none"});let r={},g={},f=new Map(h.map(e=>[e.id,e])),i=new Map,p=new Map,s=new Map;for(let e of u){let l=i.get(e.source)||[];l.push(e.target),i.set(e.source,l);let t=p.get(e.target)||[];if(t.push(e.source),p.set(e.target,t),e.sourceHandle){let n=`${e.source}:${e.sourceHandle}`,j=s.get(n)||[];j.push(e.target),s.set(n,j)}}let o=new Set(u.map(e=>e.target)),W=h.filter(e=>e.data.type==="trigger"&&!o.has(e.id));console.log("[Workflow Executor] Found",W.length,"trigger nodes");let{getActionLabel:k}=await import("virtual:workflow-builder-step-registry");function x(e){if(e.data.label)return e.data.label;if(e.data.type==="action"){let l=e.data.config?.actionType;if(l){let t=k(l);return t||l}return"Action"}return e.data.type==="trigger"?e.data.config?.triggerType||"Trigger":e.data.type}async function F(){return d?(await q.query.workflowExecutions.findFirst({where:K(z.id,d),columns:{status:!0}}))?.status==="cancelled":!1}async function E(e,l=new Set){if(console.log("[Workflow Executor] Executing node:",e),await F()){console.log("[Workflow Executor] Execution cancelled, stopping");return}if(l.has(e)){console.log("[Workflow Executor] Node already visited, skipping");return}l.add(e);let t=f.get(e);if(!t){console.log("[Workflow Executor] Node not found:",e);return}if(t.data.enabled===!1){console.log("[Workflow Executor] Skipping disabled node:",e);let n=e.replace(/[^a-zA-Z0-9]/g,"_");r[n]={label:t.data.label||e,data:null};let j=i.get(e)||[];await Promise.all(j.map(P=>E(P,l)));return}try{let n;if(t.data.type==="trigger"){console.log("[Workflow Executor] Executing trigger node");let P=t.data.config||{},O=P.triggerType,$={triggered:!0,timestamp:Date.now()};if(O==="Webhook"&&P.webhookMockRequest&&(!w||Object.keys(w).length===0))try{let R=JSON.parse(P.webhookMockRequest);$={...$,...R},console.log("[Workflow Executor] Using webhook mock request data:",R)}catch(R){console.error("[Workflow Executor] Failed to parse webhook mock request:",R)}else w&&Object.keys(w).length>0&&($={...$,...w});let b={executionId:d,nodeId:t.id,nodeName:x(t),nodeType:t.data.type},m=await A({triggerData:$,_context:b});n={success:m.success,data:m.data}}else if(t.data.type==="action"){let P=t.data.config||{},O=P.actionType;if(console.log("[Workflow Executor] Executing action node:",O),!O){n={success:!1,error:`Action node "${t.data.label||t.id}" has no action type configured`},g[e]=n;return}let $=J(P,r),b={executionId:d,nodeId:t.id,nodeName:x(t),nodeType:O},m={};if(O==="Merge"){let T=u.filter(N=>N.target===e);for(let N of T){let D=N.source.replace(/[^a-zA-Z0-9]/g,"_"),M=r[D];if(!M?.data)continue;let y=M.data;if("success"in y&&"data"in y&&y.data&&(y=y.data),N.targetHandle){let I=Number.parseInt(N.targetHandle.replace("input-",""),10);Number.isNaN(I)||(m[`input${I+1}`]=y)}else if(typeof y=="object")for(let[I,V]of Object.entries(y))I!=="success"&&I!=="error"&&(m[I]=V)}}else{let T=p.get(e)||[];for(let N of T){let D=N.replace(/[^a-zA-Z0-9]/g,"_"),M=r[D];if(M?.data&&typeof M.data=="object"){let y=M.data;"success"in y&&"data"in y&&y.data&&typeof y.data=="object"&&(y=y.data);for(let[I,V]of Object.entries(y))I!=="success"&&I!=="error"&&(m[I]=V)}}}console.log("[Workflow Executor] Calling executeActionStep");let c=await U({actionType:O,config:{...m,...$},outputs:r,context:b});if(console.log("[Workflow Executor] Step result received:",{hasResult:!!c,resultType:typeof c}),c&&typeof c=="object"&&"success"in c&&c.success===!1){let T=c,N=typeof T.error=="string"?T.error:T.error?.message||`Step "${O}" in node "${t.data.label||t.id}" failed without a specific error message.`;console.error(`[Workflow Executor] Step "${O}" failed:`,N),n={success:!1,error:N}}else n={success:!0,data:c}}else console.log("[Workflow Executor] Unknown node type:",t.data.type),n={success:!1,error:`Unknown node type "${t.data.type}" in node "${t.data.label||t.id}". Expected "trigger" or "action".`};g[e]=n;let j=e.replace(/[^a-zA-Z0-9]/g,"_");if(r[j]={label:t.data.label||e,data:n.data},console.log("[Workflow Executor] Node execution completed:",{nodeId:e,success:n.success}),n.success){let P=t.data.type==="action"&&t.data.config?.actionType==="Condition",O=t.data.type==="action"&&t.data.config?.actionType==="Switch",$=t.data.type==="action"&&t.data.config?.actionType==="Loop";if(P){let b=n.data?.condition;console.log("[Workflow Executor] Condition node result:",b);let m=b?"condition-true":"condition-false",R=s.get(`${e}:${m}`)||[];if(R.length>0)console.log("[Workflow Executor] Condition routing via handle:",m,"executing",R.length,"next nodes"),await Promise.all(R.map(c=>E(c,l)));else if(b===!0){let c=i.get(e)||[];console.log("[Workflow Executor] Condition is true (legacy), executing",c.length,"next nodes in parallel"),await Promise.all(c.map(C=>E(C,l)))}else console.log("[Workflow Executor] Condition is false, skipping next nodes")}else if(O){let b=n.data,m=b?.matchedRoutes,R=b?.isDefault??!0;if(m&&m.length>0){let c=[];for(let C of m){let T=`route-${C.index}`,N=s.get(`${e}:${T}`)||[];c.push(...N)}console.log("[Workflow Executor] Switch node matched",m.length,"routes, executing",c.length,"next nodes"),c.length>0&&await Promise.all(c.map(C=>E(C,l)))}else if(R){let c=s.get(`${e}:route-default`)||[];console.log("[Workflow Executor] Switch node no match, executing default:",c.length,"next nodes"),c.length>0&&await Promise.all(c.map(C=>E(C,l)))}else{let C=`route-${b?.matchedRouteIndex??-1}`,T=s.get(`${e}:${C}`)||[];console.log("[Workflow Executor] Switch node matched route:",C,"executing",T.length,"next nodes"),T.length>0&&await Promise.all(T.map(N=>E(N,l)))}}else if($){let b=i.get(e)||[],m=n.data;if(m&&b.length>0){let R=new Set(l),c=0;for(;;){console.log("[Workflow Executor] Loop iteration",c,"- batchIndex:",m.currentBatchIndex,"hasMore:",m.hasMore);let C=new Set(R);if(await Promise.all(b.map(I=>E(I,C))),!m.hasMore)break;if(await F()){console.log("[Workflow Executor] Loop cancelled between iterations");break}let T=m.currentBatchIndex+1,N=t.data.config||{},D=J(N,r),M={executionId:d,nodeId:t.id,nodeName:x(t),nodeType:"Loop"},y=await U({actionType:"Loop",config:{...D,currentBatchIndex:T},outputs:r,context:M});r[j]={label:t.data.label||e,data:y},g[e]={success:!0,data:y},m=y,c++}}else b.length>0&&await Promise.all(b.map(R=>E(R,l)))}else{let b=i.get(e)||[];console.log("[Workflow Executor] Executing",b.length,"next nodes in parallel"),await Promise.all(b.map(m=>E(m,l)))}}}catch(n){console.error("[Workflow Executor] Error executing node:",e,n);let P={success:!1,error:await _(n)};g[e]=P}}try{console.log("[Workflow Executor] Starting execution from trigger nodes");let e=Date.now();await Promise.all(W.map(n=>E(n.id)));let l=Object.values(g).every(n=>n.success),t=Date.now()-e;if(console.log("[Workflow Executor] Workflow execution completed:",{success:l,resultCount:Object.keys(g).length,duration:t}),d&&!await F())try{await A({triggerData:{},_workflowComplete:{executionId:d,status:l?"success":"error",output:Object.values(g).at(-1)?.data,error:Object.values(g).find(n=>!n.success)?.error,startTime:e}}),console.log("[Workflow Executor] Updated execution record")}catch(n){console.error("[Workflow Executor] Failed to update execution record:",n)}return{success:l,results:g,outputs:r}}catch(e){console.error("[Workflow Executor] Fatal error during workflow execution:",e);let l=await _(e);if(d)try{await A({triggerData:{},_workflowComplete:{executionId:d,status:"error",error:l,startTime:Date.now()}})}catch(t){console.error("[Workflow Executor] Failed to log error:",t)}return{success:!1,results:g,outputs:r,error:l}}}export{ce as a};
@@ -1,6 +1,8 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { AuthUIProviderProps } from '@daveyplate/better-auth-ui';
3
3
 
4
+ declare function DashboardPage(): react_jsx_runtime.JSX.Element;
5
+
4
6
  declare const WorkflowPage: () => react_jsx_runtime.JSX.Element | null;
5
7
 
6
8
  type Props = {
@@ -39,4 +41,4 @@ declare function isAiGatewayManagedKeysEnabled(): boolean;
39
41
  */
40
42
  declare function isAiGatewayManagedKeysEnabledClient(): boolean;
41
43
 
42
- export { type CanvasOptions, type EdgeStyle, Layout, type LayoutProps, WorkflowEditor, WorkflowPage, isAiGatewayManagedKeysEnabled, isAiGatewayManagedKeysEnabledClient };
44
+ export { type CanvasOptions, DashboardPage, type EdgeStyle, Layout, type LayoutProps, WorkflowEditor, WorkflowPage, isAiGatewayManagedKeysEnabled, isAiGatewayManagedKeysEnabledClient };