"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 } 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 renderPreview = () => { if (!previewData) return (

No active preview to display

); switch (previewData.type) { case "code": case "web": case "app": return (
Live Execution Sandbox
Secure Booted
{previewData.data}
); case "design": return (
UI Layout Preview
{previewData.data}
); default: return (
{previewData.data}
); } }; return (
{/* Header Section */}

{t.title}

{t.description}

{/* Chat Panel */}
Conversation Thread
{AGENTS.map((agent) => ( ))}
{aiAssistHistory.length === 0 ? (

{t.chatStart}

Start a conversation to activate specialized AI agents for code, design, SEO, and more.

) : ( aiAssistHistory.map((msg, i) => (
{msg.role === "user" ? : }
{msg.agent && ( {AGENTS.find(a => a.id === msg.agent)?.label || msg.agent} )}
{msg.content}
{msg.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
)) )} {isProcessing && (
)}
{/* Input Area */}
setInput(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && !e.shiftKey && handleSendMessage()} placeholder={t.placeholder} className="h-14 pl-12 pr-4 bg-slate-50 border-slate-200 focus:bg-white focus:ring-4 focus:ring-indigo-500/10 transition-all rounded-2xl font-medium" />
Powered by {selectedProvider.toUpperCase()} / {selectedModels[selectedProvider]}
{/* Preview Panel (Conditional) */} {activeTab === "preview" && (
{t.preview}
{renderPreview()}
)}
); }; export default AIAssist;