"use client"; import { useState, useEffect } 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 { ListTodo, Copy, Loader2, CheckCircle2, Clock, AlertTriangle, Settings } from "lucide-react"; import { cn } from "@/lib/utils"; import { translations } from "@/lib/i18n/translations"; export default function ActionPlanGenerator() { const { language, currentPrompt, actionPlan, selectedProvider, selectedModels, availableModels, apiKeys, isProcessing, error, setCurrentPrompt, setSelectedProvider, setActionPlan, setProcessing, setError, setAvailableModels, setSelectedModel, } = useStore(); const t = translations[language].actionPlan; const common = translations[language].common; const [copied, setCopied] = 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 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 handleGenerate = async () => { if (!currentPrompt.trim()) { setError(t.enterPrdError); 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); console.log("[ActionPlanGenerator] Starting action plan generation...", { selectedProvider, selectedModel, hasQwenAuth: modelAdapter.hasQwenAuth() }); try { const result = await modelAdapter.generateActionPlan(currentPrompt, selectedProvider, selectedModel); console.log("[ActionPlanGenerator] Generation result:", result); if (result.success && result.data) { const newPlan = { id: Math.random().toString(36).substr(2, 9), prdId: "", tasks: [], frameworks: [], architecture: { pattern: "", structure: "", technologies: [], bestPractices: [], }, estimatedDuration: "", createdAt: new Date(), rawContent: result.data, }; setActionPlan(newPlan); } else { console.error("[ActionPlanGenerator] Generation failed:", result.error); setError(result.error || t.errorGenerate); } } catch (err) { console.error("[ActionPlanGenerator] Generation error:", err); setError(err instanceof Error ? err.message : t.errorGenerate); } finally { setProcessing(false); } }; const handleCopy = async () => { if (actionPlan?.rawContent) { await navigator.clipboard.writeText(actionPlan.rawContent); setCopied(true); setTimeout(() => setCopied(false), 2000); } }; return (
{t.title} {t.description}
{(["qwen", "ollama", "zai"] as const).map((provider) => ( ))}