import { getClient } from "@/api/AxiosClient"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, } from "@/components/ui/pagination"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { useCredentialGetter } from "@/hooks/useCredentialGetter"; import { basicLocalTimeFormat, basicTimeFormat } from "@/util/timeFormat"; import { cn } from "@/util/utils"; import { LightningBoltIcon, MagnifyingGlassIcon, Pencil2Icon, PlayIcon, PlusIcon, ReloadIcon, } from "@radix-ui/react-icons"; import { useQuery } from "@tanstack/react-query"; import { useState } from "react"; import { useNavigate, useSearchParams } from "react-router-dom"; import { useDebounce } from "use-debounce"; import { NarrativeCard } from "./components/header/NarrativeCard"; import { useCreateWorkflowMutation } from "./hooks/useCreateWorkflowMutation"; import { ImportWorkflowButton } from "./ImportWorkflowButton"; import { WorkflowApiResponse } from "./types/workflowTypes"; import { WorkflowCreateYAMLRequest } from "./types/workflowYamlTypes"; import { WorkflowActions } from "./WorkflowActions"; import { WorkflowTemplates } from "../discover/WorkflowTemplates"; const emptyWorkflowRequest: WorkflowCreateYAMLRequest = { title: "New Workflow", description: "", workflow_definition: { blocks: [], parameters: [], }, }; function Workflows() { const credentialGetter = useCredentialGetter(); const navigate = useNavigate(); const createWorkflowMutation = useCreateWorkflowMutation(); const [searchParams, setSearchParams] = useSearchParams(); const [search, setSearch] = useState(""); const [debouncedSearch] = useDebounce(search, 500); const page = searchParams.get("page") ? Number(searchParams.get("page")) : 1; const { data: workflows, isLoading } = useQuery>({ queryKey: ["workflows", debouncedSearch, page], queryFn: async () => { const client = await getClient(credentialGetter); const params = new URLSearchParams(); params.append("page", String(page)); params.append("only_workflows", "true"); params.append("title", debouncedSearch); return client .get(`/workflows`, { params, }) .then((response) => response.data); }, }); function handleRowClick( event: React.MouseEvent, workflowPermanentId: string, ) { if (event.ctrlKey || event.metaKey) { window.open( window.location.origin + `/workflows/${workflowPermanentId}/runs`, "_blank", "noopener,noreferrer", ); return; } navigate(`/workflows/${workflowPermanentId}/runs`); } function handleIconClick( event: React.MouseEvent, path: string, ) { if (event.ctrlKey || event.metaKey) { window.open( window.location.origin + path, "_blank", "noopener,noreferrer", ); return; } navigate(path); } return (

Workflows

Create your own complex workflows by connecting web agents together. Define a series of actions, set it, and forget it.

My Flows

{ setSearch(event.target.value); }} placeholder="Search by title..." className="w-48 pl-9 lg:w-72" />
ID Title Created At {isLoading ? ( Loading... ) : workflows?.length === 0 ? ( No workflows found ) : ( workflows?.map((workflow) => { return ( { handleRowClick(event, workflow.workflow_permanent_id); }} > {workflow.workflow_permanent_id} { handleRowClick(event, workflow.workflow_permanent_id); }} > {workflow.title} { handleRowClick(event, workflow.workflow_permanent_id); }} title={basicTimeFormat(workflow.created_at)} > {basicLocalTimeFormat(workflow.created_at)}
Open in Editor Create New Run
); }) )}
{ if (page === 1) { return; } const params = new URLSearchParams(); params.set("page", String(Math.max(1, page - 1))); setSearchParams(params, { replace: true }); }} /> {page} { const params = new URLSearchParams(); params.set("page", String(page + 1)); setSearchParams(params, { replace: true }); }} />
); } export { Workflows };