import { useDeferredValue, useMemo, useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { Link } from "react-router-dom"; import { listOperations } from "../../entities/operation/api"; import { PageSection } from "../../shared/ui/page-section"; export function OperationListPage() { const [searchTerm, setSearchTerm] = useState(""); const deferredSearchTerm = useDeferredValue(searchTerm); const operationsQuery = useQuery({ queryKey: ["operations"], queryFn: listOperations, }); const filteredItems = useMemo(() => { const items = operationsQuery.data?.items ?? []; const normalizedSearchTerm = deferredSearchTerm.trim().toLowerCase(); if (!normalizedSearchTerm) { return items; } return items.filter((item) => `${item.name} ${item.display_name} ${item.protocol} ${item.status}` .toLowerCase() .includes(normalizedSearchTerm), ); }, [deferredSearchTerm, operationsQuery.data?.items]); const metrics = useMemo(() => { const items = operationsQuery.data?.items ?? []; return { total: items.length, published: items.filter((item) => item.status === "published").length, drafts: items.filter((item) => item.status === "draft").length, protocols: Array.from(new Set(items.map((item) => item.protocol))).length, }; }, [operationsQuery.data?.items]); return (
New operation } >

Catalog health

{metrics.total} tools registered

Published and draft operations share one operator surface and one MCP publication path.

Published {metrics.published}
Drafts {metrics.drafts}
Protocols {metrics.protocols}
{filteredItems.length} visible {operationsQuery.data?.items.length ?? 0} total
{operationsQuery.isLoading ? (

Loading operations

Fetching the current registry snapshot from the admin backend.

) : null} {operationsQuery.data && filteredItems.length === 0 ? (

No matching operations

Adjust the search term or create a new contract for REST, GraphQL or unary gRPC.

Create operation
) : null} {operationsQuery.data && filteredItems.length > 0 ? (
{filteredItems.map((item) => (
{item.protocol} {item.status}

{item.display_name}

{item.name}

Draft
{item.current_draft_version}
Published
{item.latest_published_version ?? "none"}
Updated
{new Date(item.updated_at).toLocaleString()}
Open workspace
))}
) : null}
); }