import { useEffect, useState } from 'react'; import { useConnectionStore } from '../../store/connectionStore'; import { useConfigStore } from '../../store/configStore'; import { silentErrorHandler } from '../../lib/error-utils'; import { Wrench, Zap, FileCode, Globe, Mail, Database, Search, MessageSquare } from 'lucide-react'; // ZCLAW 内置系统技能 const SYSTEM_SKILLS = [ { id: 'code-assistant', name: '代码助手', description: '代码编写、调试、重构和优化', category: '开发', icon: FileCode, }, { id: 'web-search', name: '网络搜索', description: '实时搜索互联网信息', category: '信息', icon: Search, }, { id: 'file-manager', name: '文件管理', description: '文件读写、搜索和整理', category: '系统', icon: Database, }, { id: 'web-browsing', name: '网页浏览', description: '访问和解析网页内容', category: '信息', icon: Globe, }, { id: 'email-handler', name: '邮件处理', description: '发送和管理电子邮件', category: '通讯', icon: Mail, }, { id: 'chat-skill', name: '对话技能', description: '自然语言对话和问答', category: '交互', icon: MessageSquare, }, { id: 'automation', name: '自动化任务', description: '自动化工作流程执行', category: '系统', icon: Zap, }, { id: 'tool-executor', name: '工具执行器', description: '执行系统命令和脚本', category: '系统', icon: Wrench, }, ]; export function Skills() { const connectionState = useConnectionStore((s) => s.connectionState); const quickConfig = useConfigStore((s) => s.quickConfig); const skillsCatalog = useConfigStore((s) => s.skillsCatalog); const loadSkillsCatalog = useConfigStore((s) => s.loadSkillsCatalog); const saveQuickConfig = useConfigStore((s) => s.saveQuickConfig); const connected = connectionState === 'connected'; const [extraDir, setExtraDir] = useState(''); const [activeFilter, setActiveFilter] = useState<'all' | 'system' | 'builtin' | 'extra'>('all'); useEffect(() => { if (connected) { loadSkillsCatalog().catch(silentErrorHandler('Skills')); } }, [connected]); const extraDirs = quickConfig.skillsExtraDirs || []; const handleAddDir = async () => { const nextDir = extraDir.trim(); if (!nextDir) return; const nextDirs = Array.from(new Set([...extraDirs, nextDir])); await saveQuickConfig({ skillsExtraDirs: nextDirs }); setExtraDir(''); await loadSkillsCatalog(); }; const filteredCatalog = skillsCatalog.filter(skill => { if (activeFilter === 'all') return true; if (activeFilter === 'builtin') return skill.source === 'builtin'; if (activeFilter === 'extra') return skill.source === 'extra'; return true; }); return (
{skill.description}
包含 SKILL.md 文件的额外目录。保存到 Gateway 配置的 skills.load.extraDirs 中。
暂无技能
连接 Gateway 后将自动加载技能列表