"use client"; import { useState, useEffect, useCallback } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Textarea } from "@/components/ui/textarea"; import useStore from "@/lib/store"; import modelAdapter from "@/lib/services/adapter-instance"; import { Sparkles, Copy, RefreshCw, Loader2, CheckCircle2, Settings, AlertTriangle, Info, ChevronDown, ChevronUp, Target, Layers, Zap, Brain, FileCode, Bot, Search, Image, Code, Globe } from "lucide-react"; import { cn } from "@/lib/utils"; import { translations } from "@/lib/i18n/translations"; import { runDiagnostics, detectToolCategory, selectTemplate, generateAnalysisReport, estimateTokens, type AnalysisReport, type DiagnosticResult, TOOL_CATEGORIES, TEMPLATES, type ToolCategory, } from "@/lib/enhance-engine"; const toolCategoryIcons: Record = { reasoning: Brain, thinking: Brain, openweight: Zap, agentic: Bot, ide: Code, fullstack: Globe, image: Image, search: Search, }; const toolCategoryNames: Record = { reasoning: "Reasoning LLM", thinking: "Thinking LLM", openweight: "Open-Weight", agentic: "Agentic AI", ide: "IDE AI", fullstack: "Full-Stack Gen", image: "Image AI", search: "Search AI", }; type EnhanceMode = "quick" | "deep"; export default function PromptEnhancer() { const { language, currentPrompt, enhancedPrompt, selectedProvider, selectedModels, availableModels, apiKeys, isProcessing, error, setSelectedProvider, setCurrentPrompt, setEnhancedPrompt, setProcessing, setError, setAvailableModels, setSelectedModel, } = useStore(); const t = translations[language].promptEnhancer; const common = translations[language].common; const [copied, setCopied] = useState(false); const [toolCategory, setToolCategory] = useState("reasoning"); const [templateId, setTemplateId] = useState("RTF"); const [enhanceMode, setEnhanceMode] = useState("deep"); const [showDiagnostics, setShowDiagnostics] = useState(false); const [diagnostics, setDiagnostics] = useState([]); const [analysis, setAnalysis] = useState(null); const [autoDetected, setAutoDetected] = useState(false); const selectedModel = selectedModels[selectedProvider]; const models = availableModels[selectedProvider] || modelAdapter.getAvailableModels(selectedProvider); useEffect(() => { if (typeof window !== "undefined") { loadAvailableModels(); const saved = localStorage.getItem("promptarch-api-keys"); if (saved) { try { const keys = JSON.parse(saved); if (keys.qwen) modelAdapter.updateQwenApiKey(keys.qwen); if (keys.ollama) modelAdapter.updateOllamaApiKey(keys.ollama); if (keys.zai) modelAdapter.updateZaiApiKey(keys.zai); } catch (e) { console.error("Failed to load API keys:", e); } } } }, [selectedProvider]); const analyzePrompt = useCallback((prompt: string) => { if (!prompt.trim()) return; const report = generateAnalysisReport(prompt); if (!autoDetected) { if (report.suggestedTool) setToolCategory(report.suggestedTool); if (report.suggestedTemplate) setTemplateId(report.suggestedTemplate.framework); setAutoDetected(true); } setDiagnostics(report.diagnostics); setAnalysis(report); }, [autoDetected]); useEffect(() => { if (!currentPrompt.trim()) { setDiagnostics([]); setAnalysis(null); setAutoDetected(false); return; } const timer = setTimeout(() => { analyzePrompt(currentPrompt); }, 600); return () => clearTimeout(timer); }, [currentPrompt, analyzePrompt]); const loadAvailableModels = async () => { const fallbackModels = modelAdapter.getAvailableModels(selectedProvider); setAvailableModels(selectedProvider, fallbackModels); try { const result = await modelAdapter.listModels(selectedProvider); if (result.success && result.data) { setAvailableModels(selectedProvider, result.data[selectedProvider] || fallbackModels); } } catch (error) { console.error("Failed to load models:", error); } }; const handleEnhance = async () => { if (!currentPrompt.trim()) { setError(t.enterPromptError); return; } const apiKey = apiKeys[selectedProvider]; const isQwenOAuth = selectedProvider === "qwen" && modelAdapter.hasQwenAuth(); if (!isQwenOAuth && (!apiKey || !apiKey.trim())) { setError(`${common.error}: ${common.configApiKey}`); return; } setProcessing(true); setError(null); const diagnosticsText = enhanceMode === "deep" && diagnostics.length > 0 ? diagnostics.filter(d => d.detected).map(d => `- ${d.pattern.name}: ${d.suggestion}`).join("\n") : ""; const options = enhanceMode === "deep" ? { toolCategory, template: templateId.toLowerCase(), diagnostics: diagnosticsText } : { toolCategory: "reasoning", template: "rtf", diagnostics: "" }; try { const result = await modelAdapter.enhancePrompt( currentPrompt, selectedProvider, selectedModel, options ); if (result.success && result.data) { setEnhancedPrompt(result.data); } else { setError(result.error || t.errorEnhance); } } catch (err) { setError(err instanceof Error ? err.message : t.errorEnhance); } finally { setProcessing(false); } }; const handleCopy = async () => { if (enhancedPrompt) { await navigator.clipboard.writeText(enhancedPrompt); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; const handleClear = () => { setCurrentPrompt(""); setEnhancedPrompt(null); setError(null); setDiagnostics([]); setAnalysis(null); setAutoDetected(false); }; const criticalCount = diagnostics.filter(d => d.detected && d.severity === "critical").length; const warningCount = diagnostics.filter(d => d.detected && d.severity === "warning").length; const toolEntries = Object.entries(TOOL_CATEGORIES) as [ToolCategory, typeof TOOL_CATEGORIES[ToolCategory]][]; return (
{/* Left Column */}
{t.title} {t.description} {/* Enhancement Mode Toggle */}
{/* Deep Mode Options */} {enhanceMode === "deep" && ( <> {/* Target Tool */}
{toolEntries.map(([catId, cat]) => { const Icon = toolCategoryIcons[catId] || Target; return ( ); })}
{/* Template Framework */}
)} {/* AI Provider */}
{(["qwen", "ollama", "zai", "openrouter"] as const).map((provider) => ( ))}
{/* Model */}
{/* Prompt Input */}