import React, { useEffect, useState } from 'react'; import { Search, Filter, Plus, Wrench, Terminal, Globe, Camera, CameraOff, Image, Images, CloudSun, Calendar, TrendingUp, Coins, Trash2, Edit2, Box, Lock } from 'lucide-react'; import { Button, Input, Badge, Dialog } from '../components/UI'; import { Tool } from '../types'; import { createTool, deleteTool, fetchTools, updateTool } from '../services/backendApi'; const iconMap: Record = { Camera: , CameraOff: , Image: , Images: , CloudSun: , Calendar: , TrendingUp: , Coins: , Terminal: , Globe: , Wrench: , Box: , }; export const ToolLibraryPage: React.FC = () => { const [tools, setTools] = useState([]); const [searchTerm, setSearchTerm] = useState(''); const [categoryFilter, setCategoryFilter] = useState<'all' | 'system' | 'query'>('all'); const [isLoading, setIsLoading] = useState(true); const [isToolModalOpen, setIsToolModalOpen] = useState(false); const [editingTool, setEditingTool] = useState(null); const [toolName, setToolName] = useState(''); const [toolDesc, setToolDesc] = useState(''); const [toolCategory, setToolCategory] = useState<'system' | 'query'>('system'); const [toolIcon, setToolIcon] = useState('Wrench'); const [toolEnabled, setToolEnabled] = useState(true); const [saving, setSaving] = useState(false); const loadTools = async () => { setIsLoading(true); try { setTools(await fetchTools()); } catch (error) { console.error(error); setTools([]); } finally { setIsLoading(false); } }; useEffect(() => { loadTools(); }, []); const openAdd = () => { setEditingTool(null); setToolName(''); setToolDesc(''); setToolCategory('system'); setToolIcon('Wrench'); setToolEnabled(true); setIsToolModalOpen(true); }; const openEdit = (tool: Tool) => { setEditingTool(tool); setToolName(tool.name); setToolDesc(tool.description || ''); setToolCategory(tool.category); setToolIcon(tool.icon || 'Wrench'); setToolEnabled(tool.enabled ?? true); setIsToolModalOpen(true); }; const filteredTools = tools.filter((tool) => { const q = searchTerm.toLowerCase(); const matchesSearch = tool.name.toLowerCase().includes(q) || (tool.description || '').toLowerCase().includes(q) || tool.id.toLowerCase().includes(q); const matchesCategory = categoryFilter === 'all' || tool.category === categoryFilter; return matchesSearch && matchesCategory; }); const handleSaveTool = async () => { if (!toolName.trim()) { alert('请填写工具名称'); return; } try { setSaving(true); if (editingTool) { const updated = await updateTool(editingTool.id, { name: toolName.trim(), description: toolDesc, category: toolCategory, icon: toolIcon, enabled: toolEnabled, }); setTools((prev) => prev.map((item) => (item.id === updated.id ? updated : item))); } else { const created = await createTool({ name: toolName.trim(), description: toolDesc, category: toolCategory, icon: toolIcon, enabled: toolEnabled, }); setTools((prev) => [created, ...prev]); } setIsToolModalOpen(false); } catch (error: any) { alert(error?.message || '保存工具失败'); } finally { setSaving(false); } }; const handleDeleteTool = async (e: React.MouseEvent, tool: Tool) => { e.stopPropagation(); if (tool.isSystem) { alert('系统工具不可删除'); return; } if (!confirm('确认删除该工具吗?')) return; try { await deleteTool(tool.id); setTools((prev) => prev.filter((item) => item.id !== tool.id)); } catch (error: any) { alert(error?.message || '删除失败'); } }; return (

工具与插件

setSearchTerm(e.target.value)} />
{!isLoading && filteredTools.map((tool) => (
{iconMap[tool.icon] || }
{tool.name} {tool.isSystem ? ( SYSTEM ) : ( CUSTOM )}
{tool.category === 'system' ? 'SYSTEM' : 'QUERY'} ID: {tool.id}

{tool.description}

{tool.isSystem ? ( 系统工具只读 ) : ( 可编辑自定义工具 )}
))} {!isLoading && filteredTools.length === 0 && (

未找到相关工具

)} {isLoading && (

加载中...

)}
setIsToolModalOpen(false)} title={editingTool ? '编辑自定义工具' : '添加自定义工具'} footer={ <> } >
setToolName(e.target.value)} placeholder="例如: 智能家居控制" autoFocus />