import { useState, useEffect } from 'react'; import { Wrench, Search, ChevronDown, ChevronRight, Terminal, Package, } from 'lucide-react'; import type { ToolSpec, CliTool } from '@/types/api'; import { getTools, getCliTools } from '@/lib/api'; import { t } from '@/lib/i18n'; export default function Tools() { const [tools, setTools] = useState([]); const [cliTools, setCliTools] = useState([]); const [search, setSearch] = useState(''); const [expandedTool, setExpandedTool] = useState(null); const [agentSectionOpen, setAgentSectionOpen] = useState(true); const [cliSectionOpen, setCliSectionOpen] = useState(true); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { Promise.all([getTools(), getCliTools()]) .then(([t, c]) => { setTools(t); setCliTools(c); }) .catch((err) => setError(err.message)) .finally(() => setLoading(false)); }, []); const filtered = tools.filter((t) => t.name.toLowerCase().includes(search.toLowerCase()) || t.description.toLowerCase().includes(search.toLowerCase()), ); const filteredCli = cliTools.filter((t) => t.name.toLowerCase().includes(search.toLowerCase()) || t.category.toLowerCase().includes(search.toLowerCase()), ); if (error) { return (
{t('tools.load_error')}: {error}
); } if (loading) { return (
); } return (
{/* Search */}
setSearch(e.target.value)} placeholder={t('tools.search')} className="input-electric w-full pl-10 pr-4 py-2.5 text-sm" />
{/* Agent Tools Grid */}
{agentSectionOpen && (filtered.length === 0 ? (

{t('tools.empty')}

) : (
{filtered.map((tool) => { const isExpanded = expandedTool === tool.name; return (
{isExpanded && tool.parameters && (

{t('tools.parameter_schema')}

                          {JSON.stringify(tool.parameters, null, 2)}
                        
)}
); })}
))}
{/* CLI Tools Section */} {filteredCli.length > 0 && (
{cliSectionOpen &&
{filteredCli.map((tool) => ( ))}
{t('tools.name')} {t('tools.path')} {t('tools.version')} {t('tools.category')}
{tool.name} {tool.path} {tool.version ?? '-'} {tool.category}
}
)}
); }