"use client"; import { useState } from "react"; import { useScopeEffect } from "@/lib/company-scope"; import { CompanyNameTag } from "@/components/shared/CompanyNameTag"; import {Sparkles } from "lucide-react"; import { listPreMortems, runPreMortem, listRedTeams, runRedTeam } from "@/lib/api-v2"; import { PageContainer, Card, Badge } from "@/components/shared/PageContainer"; import { LoadingSpinner } from "@/components/shared/LoadingSpinner"; import { EmptyState } from "@/components/shared/EmptyState"; import { toast } from "sonner"; /** Pre-mortem 记录项。 */ interface PreMortemItem { company_id?: string; decision_context: string; failure_paths?: FailurePath[]; } /** 失败路径项。 */ interface FailurePath { path?: string; } /** Red Team 记录项。 */ interface RedTeamItem { company_id?: string; perspective: string; analysis: string; } export default function PreMortemsPage() { const [tab, setTab] = useState<"pre-mortem" | "red-team">("pre-mortem"); const [preMortems, setPreMortems] = useState([]); const [redTeams, setRedTeams] = useState([]); const [isLoading, setIsLoading] = useState(true); const [input, setInput] = useState(""); const [perspective, setPerspective] = useState("competitor"); useScopeEffect(() => { Promise.all([listPreMortems(), listRedTeams()]) .then(([pm, rt]) => { setPreMortems((pm.data as PreMortemItem[]) ?? []); setRedTeams((rt.data as RedTeamItem[]) ?? []); }) .catch(() => { setPreMortems([]); setRedTeams([]); }) .finally(() => setIsLoading(false)); }); const handleRun = async () => { if (!input.trim()) { toast.error("请输入内容"); return; } try { if (tab === "pre-mortem") { const resp = await runPreMortem(input); setPreMortems([resp.data as PreMortemItem, ...preMortems]); toast.success("Pre-mortem 分析完成"); } else { const resp = await runRedTeam(input, perspective); setRedTeams([resp.data as RedTeamItem, ...redTeams]); toast.success("Red Team 分析完成"); } } catch { toast.error("分析失败"); } }; return (