import { Check, Clock, Play } from "lucide-react"; import { cn } from "@/lib/utils"; import { PlanItem } from "@open-swe/shared/open-swe/types"; interface PlanViewerProps { planItems: PlanItem[]; className?: string; isProposedPlan?: boolean; } export function PlanViewer({ planItems, className, isProposedPlan, }: PlanViewerProps) { const currentTaskIndex = planItems .filter((item) => !item.completed) .reduce( (minIndex, item) => (item.index < minIndex ? item.index : minIndex), Infinity, ); const getTaskStatus = (item: PlanItem) => { if (isProposedPlan) return "proposed"; if (item.completed) return "completed"; if (item.index === currentTaskIndex) return "current"; return "remaining"; }; return (

{isProposedPlan ? "Proposed" : "Execution"} Plan

{!isProposedPlan && ( {planItems.filter((item) => item.completed).length} of{" "} {planItems.length} completed )}
{planItems .sort((a, b) => a.index - b.index) .map((item) => { const status = getTaskStatus(item); return (
{/* Status Icon */}
{status === "completed" && ( )} {status === "current" && ( )} {["remaining", "proposed"].includes(status) && ( )}
{/* Task Content */}
Step {item.index + 1} {status === "current" && ( In Progress )} {status === "completed" && ( Done )} {status === "proposed" && ( Proposed )}

{item.plan}

{/* Summary for completed tasks */} {item.summary && status === "completed" && (

Summary:

{item.summary}

)}
); })}
); }