import { AlertCircle, AlertTriangle, CheckCircle2, Loader2, Sparkles } from "lucide-react"; import { formatProjectNameWithId, toZhPriority, toZhSeverity } from "@/lib/display"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Textarea } from "@/components/ui/textarea"; import { EXAMPLE_INPUTS } from "../constants"; import type { ProjectFromTextResponse } from "../types"; function formatCharterContent( content: ProjectFromTextResponse["charter"]["content"] | string | null | undefined ): string { if (typeof content === "string") { return content.trim() || "-"; } if (content && typeof content === "object") { const record = content as Record; const text = typeof record.rationale === "string" ? record.rationale.trim() : ""; if (text) { return text; } try { return JSON.stringify(content, null, 2); } catch { return String(content); } } return "-"; } function groupSignalSources(projectResult: ProjectFromTextResponse | null) { const sources = projectResult?.signal_sources ?? []; const groups = new Map(); for (const source of sources) { const section = String(source.section || "其他").trim() || "其他"; const bucket = groups.get(section) || []; bucket.push(source); groups.set(section, bucket); } const preferredOrder = ["核心痛点", "MVP 功能", "其他"]; return [ ...preferredOrder.filter((section) => groups.has(section)), ...Array.from(groups.keys()).filter((section) => !preferredOrder.includes(section)), ].map((section) => ({ section, items: groups.get(section) || [], })); } interface CreateProjectTabProps { input: string; loading: boolean; error: string | null; projectResult: ProjectFromTextResponse | null; onInputChange: (value: string) => void; onSubmit: () => void; onResetProject: () => void; } export default function CreateProjectTab({ input, loading, error, projectResult, onInputChange, onSubmit, onResetProject, }: CreateProjectTabProps) { const techStack = Array.isArray(projectResult?.analysis.tech_stack) ? projectResult.analysis.tech_stack : []; const tasks = Array.isArray(projectResult?.tasks) ? projectResult.tasks : []; const risks = Array.isArray(projectResult?.risks) ? projectResult.risks : []; const requirementItems = Array.isArray(projectResult?.analysis.requirement_items) ? projectResult.analysis.requirement_items : []; const signalSourceGroups = groupSignalSources(projectResult); return ( {!projectResult ? (