import { Suspense } from 'react';
import { getWorkflowsApiV1WorkflowFetchGet, listFoldersApiV1FolderGet } from '@/client/sdk.gen';
import type { FolderResponse, WorkflowListResponse } from '@/client/types.gen';
import { Card, CardContent } from '@/components/ui/card';
import { CreateWorkflowButton } from "@/components/workflow/CreateWorkflowButton";
import { AgentFolderView } from '@/components/workflow/folders/AgentFolderView';
import { CreateFolderButton } from '@/components/workflow/folders/CreateFolderButton';
import { FolderSection } from '@/components/workflow/folders/FolderSection';
import { UploadWorkflowButton } from '@/components/workflow/UploadWorkflowButton';
import { getServerAccessToken, getServerAuthProvider } from '@/lib/auth/server';
import logger from '@/lib/logger';
import WorkflowLayout from "./WorkflowLayout";
export const dynamic = 'force-dynamic';
// Server component for workflow list
async function WorkflowList() {
const authProvider = await getServerAuthProvider();
const accessToken = await getServerAccessToken();
if (!accessToken) {
// If no token, user needs to sign in
const { redirect } = await import('next/navigation');
if (authProvider === 'stack') {
redirect('/');
} else {
// For OSS mode, this shouldn't happen as token is auto-generated
return (
Authentication required. Please refresh the page.
);
}
}
try {
// Fetch both active and archived workflows in a single request
const response = await getWorkflowsApiV1WorkflowFetchGet({
headers: {
'Authorization': `Bearer ${accessToken}`,
},
query: {
status: 'active,archived'
}
});
const allWorkflowData = response.data ? (Array.isArray(response.data) ? response.data : [response.data]) : [];
// Separate active and archived workflows
const activeWorkflows = allWorkflowData
.filter((w: WorkflowListResponse) => w.status === 'active')
.sort((a: WorkflowListResponse, b: WorkflowListResponse) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
const archivedWorkflows = allWorkflowData
.filter((w: WorkflowListResponse) => w.status === 'archived')
.sort((a: WorkflowListResponse, b: WorkflowListResponse) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
// Fetch folders for grouping active agents. A failure here shouldn't
// break the page — fall back to an empty list (flat, ungrouped view).
let folders: FolderResponse[] = [];
try {
const foldersResponse = await listFoldersApiV1FolderGet({
headers: {
'Authorization': `Bearer ${accessToken}`,
},
});
folders = foldersResponse.data ?? [];
} catch (folderErr) {
logger.error(`Error fetching folders: ${folderErr}`);
}
return (
<>
{/* Active Workflows Section */}
Active Agents
{activeWorkflows.length > 0 || folders.length > 0 ? (
) : (
No active workflows found. Create your first workflow to get started.
)}
{/* Archived Section — collapsible, same design as the folder/Uncategorized sections */}
{archivedWorkflows.length > 0 && (
)}
>
);
} catch (err) {
logger.error(`Error fetching workflows: ${err}`);
return (
Failed to load Workflows. Please Try Again Later.
);
}
}
async function PageContent() {
const workflowList = await WorkflowList();
return (
{/* Your Workflows Section */}
);
}
function WorkflowsLoading() {
return (
{/* Get Started Section Loading */}
{Array.from({ length: 3 }, (_, i) => (
))}
{/* Your Workflows Section Loading */}
);
}
export default function WorkflowPage() {
return (
}>
);
}