import React, { useState, useMemo } from 'react'; import { ToolDefinition, GeneratedCode, ToolType, FunctionDefinition, ParameterType } from './types'; import ToolForm from './components/ToolForm'; import CodeOutput from './components/CodeOutput'; import { generateAllCode } from './services/codeGenerator'; import { nmapScannerExample } from './examples'; import Button from './components/ui/Button'; import AiPrompt from './components/AiPrompt'; import { generateToolDefinitionFromPrompt } from './services/aiService'; const initialFunction: FunctionDefinition = { id: crypto.randomUUID(), name: 'example_function', description: 'Краткое описание того, что делает эта функция.', parameters: [ { id: crypto.randomUUID(), name: 'example_param', type: ParameterType.STRING, // Исправлено с 'str' as any description: 'Описание параметра.', required: true, }, ], returnType: ParameterType.STRING, // Исправлено с 'str' as any returnDescription: 'Описание возвращаемого значения.', }; const initialToolDefinition: ToolDefinition = { name: 'my_tool', type: ToolType.UTILITY, dependencies: '', functions: [initialFunction], }; const App: React.FC = () => { const [toolDefinition, setToolDefinition] = useState(initialToolDefinition); const [aiPrompt, setAiPrompt] = useState(''); const [isGenerating, setIsGenerating] = useState(false); const [aiError, setAiError] = useState(null); const generatedCode = useMemo(() => { try { if (toolDefinition.name && toolDefinition.functions.length > 0 && toolDefinition.functions.every(f => f.name)) { return generateAllCode(toolDefinition); } return null; } catch (error) { console.error("Error generating code:", error); return null; } }, [toolDefinition]); const loadNmapExample = () => { setToolDefinition(nmapScannerExample); }; const handleAiGenerate = async () => { if (!aiPrompt.trim()) { setAiError("Пожалуйста, введите описание инструмента."); return; } setIsGenerating(true); setAiError(null); try { const jsonString = await generateToolDefinitionFromPrompt(aiPrompt); // Бэкенд уже должен был очистить markdown, но на всякий случай const cleanedJsonString = jsonString.replace(/^```json\s*|\s*```$/g, '').trim(); const newToolDefinition = JSON.parse(cleanedJsonString); // Добавим уникальные ID, так как AI их не генерирует if (newToolDefinition.functions) { newToolDefinition.functions.forEach((func: FunctionDefinition) => { func.id = crypto.randomUUID(); if (func.parameters) { func.parameters.forEach((param: any) => { param.id = crypto.randomUUID(); }); } else { func.parameters = []; // Убедимся, что параметры существуют } }); } else { newToolDefinition.functions = []; // Убедимся, что функции существуют } setToolDefinition(newToolDefinition); } catch (error) { console.error("AI generation failed:", error); setAiError(`Не удалось сгенерировать инструмент: ${error.message}. Проверьте консоль.`); } finally { setIsGenerating(false); } }; return (

Gemini CLI Tool Generator

Создайте кастомные расширения, которые Gemini сможет вызывать для решения ваших задач.

); }; export default App;