import { BlockButton } from '@/components/ui/button'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import { cn } from '@/lib/utils'; import { Position } from '@xyflow/react'; import { PencilLine, X } from 'lucide-react'; import { MouseEventHandler, PropsWithChildren, useCallback, useContext, useMemo, } from 'react'; import { Operator } from '../../constant'; import { AgentInstanceContext } from '../../context'; import { useFindMcpById } from '../../hooks/use-find-mcp-by-id'; import { INextOperatorForm } from '../../interface'; import OperatorIcon from '../../operator-icon'; import useGraphStore from '../../store'; import { filterDownstreamAgentNodeIds } from '../../utils/filter-downstream-nodes'; import { ToolPopover } from './tool-popover'; import { useDeleteAgentNodeMCP } from './tool-popover/use-update-mcp'; import { useDeleteAgentNodeTools } from './tool-popover/use-update-tools'; import { useGetAgentMCPIds, useGetAgentToolNames } from './use-get-tools'; export function ToolCard({ children, className, ...props }: PropsWithChildren & React.HTMLAttributes) { const element = useMemo(() => { return (
  • {children}
  • ); }, [children, className, props]); if (children === Operator.Code) { return ( {element}

    It doesn't have any config.

    ); } return element; } type ActionButtonProps = { record: T; deleteRecord(record: T): void; edit: MouseEventHandler; }; function ActionButton({ deleteRecord, record, edit }: ActionButtonProps) { const handleDelete = useCallback(() => { deleteRecord(record); }, [deleteRecord, record]); return (
    ); } export function AgentTools() { const { toolNames } = useGetAgentToolNames(); const { deleteNodeTool } = useDeleteAgentNodeTools(); const { mcpIds } = useGetAgentMCPIds(); const { findMcpById } = useFindMcpById(); const { deleteNodeMCP } = useDeleteAgentNodeMCP(); const { showFormDrawer } = useContext(AgentInstanceContext); const { clickedNodeId, findAgentToolNodeById, selectNodeIds } = useGraphStore( (state) => state, ); const handleEdit: MouseEventHandler = useCallback( (e) => { const toolNodeId = findAgentToolNodeById(clickedNodeId); if (toolNodeId) { selectNodeIds([toolNodeId]); showFormDrawer(e, toolNodeId); } }, [clickedNodeId, findAgentToolNodeById, selectNodeIds, showFormDrawer], ); return (
    Tools
      {toolNames.map((x) => (
      {x}
      ))} {mcpIds.map((id) => ( {findMcpById(id)?.name} ))}
    Add Tool
    ); } export function Agents({ node }: INextOperatorForm) { const { addCanvasNode } = useContext(AgentInstanceContext); const { deleteAgentDownstreamNodesById, edges, getNode, selectNodeIds } = useGraphStore((state) => state); const { showFormDrawer } = useContext(AgentInstanceContext); const handleEdit = useCallback( (nodeId: string): MouseEventHandler => (e) => { selectNodeIds([nodeId]); showFormDrawer(e, nodeId); }, [selectNodeIds, showFormDrawer], ); const subBottomAgentNodeIds = useMemo(() => { return filterDownstreamAgentNodeIds(edges, node?.id); }, [edges, node?.id]); return (
    Agents
      {subBottomAgentNodeIds.map((id) => { const currentNode = getNode(id); return ( {currentNode?.data.name} ); })}
    Add Agent
    ); }