import { Check, Clock, Pencil, Play, Trash } from "lucide-react"; import { cn } from "@/lib/utils"; import { PlanItem } from "@open-swe/shared/open-swe/types"; import { TooltipIconButton } from "../ui/tooltip-icon-button"; import { Dispatch, SetStateAction, useState } from "react"; import { Textarea } from "../ui/textarea"; import { Button } from "../ui/button"; interface PlanViewerProps { planItems: PlanItem[]; className?: string; isProposedPlan?: boolean; setPlanItems?: Dispatch>; } export function PlanViewer({ planItems, className, isProposedPlan, setPlanItems, }: PlanViewerProps) { const [isEditing, setIsEditing] = useState>({}); const [newPlanItem, setNewPlanItem] = useState(""); 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 )}
{isProposedPlan && (
setIsEditing((p) => ({ ...p, [item.index]: !p[item.index], })) } tooltip={ isEditing[item.index] ? `Save Plan` : `Edit Plan` } > {isEditing[item.index] ? ( ) : ( )} setPlanItems?.((prev) => { const newArr = prev.filter( (i) => i.index !== item.index, ); return newArr.map((i, index) => ({ ...i, index, })); }) } tooltip="Delete Plan" className="transition-colors hover:text-red-500" >
)}
{isEditing[item.index] ? (