"use client"; import { memo } from "react"; import { Handle, Position, NodeProps } from "@xyflow/react"; import { Bot, Globe, FileText } from "lucide-react"; import { AgentNodeData } from "@/app/types/council"; import { useCouncilStore } from "@/app/store/council-store"; const MODEL_LABELS: Record = { "claude-3-5-sonnet": "Claude 3.5", "gpt-4o": "GPT-4o", local: "Lokal", }; const MODEL_COLORS: Record = { "claude-3-5-sonnet": "bg-orange-100 text-orange-700 border-orange-300", "gpt-4o": "bg-green-100 text-green-700 border-green-300", local: "bg-gray-100 text-gray-700 border-gray-300", }; export const AgentNode = memo(function AgentNode({ id, data, selected, }: NodeProps) { const nodeData = data as AgentNodeData; const selectNode = useCouncilStore((s) => s.selectNode); const isActive = nodeData.isActive; return (
selectNode(id)} className={[ "w-52 rounded-xl border-2 bg-white shadow-md transition-all duration-300 cursor-pointer", isActive ? "border-indigo-500 shadow-indigo-200 shadow-lg animate-pulse" : selected ? "border-indigo-400 shadow-indigo-100" : "border-slate-200 hover:border-slate-400", ].join(" ")} > {/* Header */}
{nodeData.label} {isActive && ( aktiv )}
{/* Body */}
{/* System prompt preview */}

{nodeData.systemPrompt || ( Kein System-Prompt )}

{/* Model badge */} {MODEL_LABELS[nodeData.model] ?? nodeData.model} {/* Tool toggles */} {(nodeData.tools.webSearch || nodeData.tools.pdfReader) && (
{nodeData.tools.webSearch && ( Web )} {nodeData.tools.pdfReader && ( PDF )}
)}
{/* Handles */}
); });