"use client"; import { ExternalLink, Globe, Loader2 } from "lucide-react"; import Link from "next/link"; import { useCallback, useEffect, useState } from "react"; import { listToolsApiV1ToolsGet } from "@/client/sdk.gen"; import type { ToolResponse } from "@/client/types.gen"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Label } from "@/components/ui/label"; import { useAuth } from "@/lib/auth"; interface ToolSelectorProps { value: string[]; onChange: (uuids: string[]) => void; disabled?: boolean; label?: string; description?: string; showLabel?: boolean; } export function ToolSelector({ value, onChange, disabled = false, label = "Tools", description = "Select tools that the agent can use during the conversation.", showLabel = true, }: ToolSelectorProps) { const { getAccessToken } = useAuth(); const [tools, setTools] = useState([]); const [loading, setLoading] = useState(false); const fetchTools = useCallback(async () => { setLoading(true); try { const accessToken = await getAccessToken(); const response = await listToolsApiV1ToolsGet({ headers: { Authorization: `Bearer ${accessToken}` }, query: { status: "active" }, }); if (response.error) { console.error("Failed to fetch tools:", response.error); setTools([]); return; } if (response.data) { setTools(response.data); } } catch (error) { console.error("Failed to fetch tools:", error); setTools([]); } finally { setLoading(false); } }, [getAccessToken]); useEffect(() => { fetchTools(); }, [fetchTools]); const handleToggle = (toolUuid: string, checked: boolean) => { if (checked) { onChange([...value, toolUuid]); } else { onChange(value.filter((id) => id !== toolUuid)); } }; return (
{showLabel && ( <> {description && ( )} )} {loading ? (
Loading tools...
) : tools.length === 0 ? (

No tools available.

) : (
{tools.map((tool) => { const isSelected = value.includes(tool.tool_uuid); return ( ); })}
Manage Tools
)} {value.length > 0 && (

{value.length} tool{value.length !== 1 ? "s" : ""} selected

)}
); }