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 */}

Your Agents

{workflowList}
); } function WorkflowsLoading() { return (
{/* Get Started Section Loading */}
{Array.from({ length: 3 }, (_, i) => (
))}
{/* Your Workflows Section Loading */}
); } export default function WorkflowPage() { return ( }> ); }