({
tools,
listTools,
clearTools,
callTool,
selectedTool,
setSelectedTool,
toolResult,
isPollingTask,
nextCursor,
error,
resourceContent,
onReadResource,
serverSupportsTaskRequests,
}: {
tools: Tool[];
listTools: () => void;
clearTools: () => void;
callTool: (
name: string,
params: Record<string, unknown>,
metadata?: Record<string, unknown>,
runAsTask?: boolean,
) => Promise<CompatibilityCallToolResult>;
selectedTool: Tool | null;
setSelectedTool: (tool: Tool | null) => void;
toolResult: CompatibilityCallToolResult | null;
isPollingTask?: boolean;
nextCursor: ListToolsResult["nextCursor"];
error: string | null;
resourceContent: Record<string, string>;
onReadResource?: (uri: string) => void;
serverSupportsTaskRequests: boolean;
})
| 165 | }; |
| 166 | |
| 167 | const ToolsTab = ({ |
| 168 | tools, |
| 169 | listTools, |
| 170 | clearTools, |
| 171 | callTool, |
| 172 | selectedTool, |
| 173 | setSelectedTool, |
| 174 | toolResult, |
| 175 | isPollingTask, |
| 176 | nextCursor, |
| 177 | error, |
| 178 | resourceContent, |
| 179 | onReadResource, |
| 180 | serverSupportsTaskRequests, |
| 181 | }: { |
| 182 | tools: Tool[]; |
| 183 | listTools: () => void; |
| 184 | clearTools: () => void; |
| 185 | callTool: ( |
| 186 | name: string, |
| 187 | params: Record<string, unknown>, |
| 188 | metadata?: Record<string, unknown>, |
| 189 | runAsTask?: boolean, |
| 190 | ) => Promise<CompatibilityCallToolResult>; |
| 191 | selectedTool: Tool | null; |
| 192 | setSelectedTool: (tool: Tool | null) => void; |
| 193 | toolResult: CompatibilityCallToolResult | null; |
| 194 | isPollingTask?: boolean; |
| 195 | nextCursor: ListToolsResult["nextCursor"]; |
| 196 | error: string | null; |
| 197 | resourceContent: Record<string, string>; |
| 198 | onReadResource?: (uri: string) => void; |
| 199 | serverSupportsTaskRequests: boolean; |
| 200 | }) => { |
| 201 | const [params, setParams] = useState<Record<string, unknown>>({}); |
| 202 | const [runAsTask, setRunAsTask] = useState(false); |
| 203 | const [isToolRunning, setIsToolRunning] = useState(false); |
| 204 | const [isOutputSchemaExpanded, setIsOutputSchemaExpanded] = useState(false); |
| 205 | const [isMetadataExpanded, setIsMetadataExpanded] = useState(false); |
| 206 | const [metadataEntries, setMetadataEntries] = useState< |
| 207 | { id: string; key: string; value: string }[] |
| 208 | >([]); |
| 209 | const [hasValidationErrors, setHasValidationErrors] = useState(false); |
| 210 | const formRefs = useRef<Record<string, DynamicJsonFormRef | null>>({}); |
| 211 | const { toast } = useToast(); |
| 212 | const { copied, setCopied } = useCopy(); |
| 213 | |
| 214 | // Function to check if any form has validation errors |
| 215 | const checkValidationErrors = (validateChildren: boolean = false) => { |
| 216 | const errors = Object.values(formRefs.current).some( |
| 217 | (ref) => |
| 218 | ref && |
| 219 | (validateChildren ? !ref.validateJson().isValid : ref.hasJsonError()), |
| 220 | ); |
| 221 | setHasValidationErrors(errors); |
| 222 | return errors; |
| 223 | }; |
| 224 |
nothing calls this directly
no test coverage detected