"use client"; import { useState, useRef, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card, CardHeader, CardTitle, CardDescription, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Select } from "@/components/ui/select"; import useStore from "@/lib/store"; import { translations } from "@/lib/i18n/translations"; import modelAdapter from "@/lib/services/adapter-instance"; import { MessageSquare, Send, Sparkles, Brain, Cpu, Code2, Palette, FileText, Search, BarChart, Rocket, Terminal, Eye, History, Trash2, Loader2, Bot, User, Settings, Layers, AppWindow, Smartphone, Monitor, X, ArrowLeftRight, RotateCcw, CheckCircle2 } from "lucide-react"; import { cn } from "@/lib/utils"; import { AIAssistMessage } from "@/types"; const AGENTS = [ { id: "general", label: "General Intel", icon: Bot, color: "slate" }, { id: "content", label: "Content Optimization", icon: FileText, color: "amber" }, { id: "seo", label: "SEO Analyst", icon: Search, color: "emerald" }, { id: "smm", label: "SMM Strategy", icon: BarChart, color: "pink" }, { id: "pm", label: "Project Manager", icon: Rocket, color: "indigo" }, { id: "code", label: "Code Architect", icon: Terminal, color: "violet" }, { id: "design", label: "UI/UX Designer", icon: Palette, color: "orange" }, { id: "web", label: "Web Dev Preview", icon: Monitor, color: "blue" }, { id: "app", label: "App Dev Preview", icon: Smartphone, color: "cyan" } ]; const AIAssist = () => { const { language, selectedProvider, selectedModels, setSelectedModel, apiKeys, aiAssistHistory, setAIAssistHistory } = useStore(); const t = translations[language].aiAssist; const common = translations[language].common; const [input, setInput] = useState(""); const [isProcessing, setIsProcessing] = useState(false); const [currentAgent, setCurrentAgent] = useState("general"); const [activeTab, setActiveTab] = useState("chat"); const [previewData, setPreviewData] = useState<{ type: string; data: string; language?: string } | null>(null); const [availableModels, setAvailableModels] = useState([]); const scrollRef = useRef(null); useEffect(() => { if (scrollRef.current) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [aiAssistHistory]); useEffect(() => { const loadModels = async () => { try { const models = await modelAdapter.listModels(selectedProvider); if (models.success && models.data) { setAvailableModels(models.data[selectedProvider] || []); } } catch (e) { setAvailableModels(modelAdapter.getAvailableModels(selectedProvider)); } }; loadModels(); }, [selectedProvider]); const handleSendMessage = async () => { if (!input.trim() || isProcessing) return; const userMessage: AIAssistMessage = { role: "user", content: input, timestamp: new Date() }; setAIAssistHistory(prev => [...prev, userMessage]); setInput(""); setIsProcessing(true); try { const apiKey = apiKeys[selectedProvider]; const isQwenOAuth = selectedProvider === "qwen" && modelAdapter.hasQwenAuth(); if (!isQwenOAuth && (!apiKey || !apiKey.trim())) { throw new Error(`Please configure your ${selectedProvider.toUpperCase()} API key in Settings`); } // Convert history to clean message format for API const cleanMessages = aiAssistHistory.concat(userMessage).map(m => ({ role: m.role, content: String(m.content || "") })); // Call model adapter for AI Assist const result = await modelAdapter.generateAIAssist({ messages: cleanMessages as any, currentAgent }, selectedProvider, selectedModels[selectedProvider]); if (result.success && result.data) { try { // Expecting a structured response with possible agent switch and preview const cleanJson = result.data.replace(/```json\s*([\s\S]*?)\s*```/i, '$1').trim(); const parsed = JSON.parse(cleanJson); const assistantMessage: AIAssistMessage = { role: "assistant", content: parsed.content, agent: parsed.agent || currentAgent, preview: parsed.preview, timestamp: new Date() }; if (parsed.agent && parsed.agent !== currentAgent) { setCurrentAgent(parsed.agent); } if (parsed.preview) { setPreviewData(parsed.preview); setActiveTab("preview"); } setAIAssistHistory(prev => [...prev, assistantMessage]); } catch (e) { // Fallback to plain text if JSON parsing fails const assistantMessage: AIAssistMessage = { role: "assistant", content: result.data, agent: currentAgent, timestamp: new Date() }; setAIAssistHistory(prev => [...prev, assistantMessage]); } } else { throw new Error(result.error || "Failed to get response"); } } catch (err) { const errorMessage: AIAssistMessage = { role: "system", content: err instanceof Error ? err.message : "An unexpected error occurred", timestamp: new Date() }; setAIAssistHistory(prev => [...prev, errorMessage]); } finally { setIsProcessing(false); } }; const clearHistory = () => { setAIAssistHistory([]); setPreviewData(null); setActiveTab("chat"); setCurrentAgent("general"); }; const undoLast = () => { if (aiAssistHistory.length === 0) return; setAIAssistHistory(prev => prev.slice(0, -2)); }; const renderPreview = () => { if (!previewData) return (

No active preview to display

); switch (previewData.type) { case "web": case "app": return (
Live Runtime Sandbox