Fix executor

This commit is contained in:
Louis Knight-Webb
2025-06-21 20:04:15 +01:00
parent d7ab69e8ae
commit a455efa971
3 changed files with 58 additions and 48 deletions

View File

@@ -60,8 +60,6 @@ const statusLabels: Record<TaskStatus, string> = {
const getAttemptStatusDisplay = (status: TaskAttemptStatus): { label: string; className: string } => { const getAttemptStatusDisplay = (status: TaskAttemptStatus): { label: string; className: string } => {
switch (status) { switch (status) {
case "init":
return { label: "Init", className: "bg-status-init text-status-init-foreground" };
case "setuprunning": case "setuprunning":
return { label: "Setup Running", className: "bg-status-running text-status-running-foreground" }; return { label: "Setup Running", className: "bg-status-running text-status-running-foreground" };
case "setupcomplete": case "setupcomplete":
@@ -74,8 +72,6 @@ const getAttemptStatusDisplay = (status: TaskAttemptStatus): { label: string; cl
return { label: "Executor Complete", className: "bg-status-complete text-status-complete-foreground" }; return { label: "Executor Complete", className: "bg-status-complete text-status-complete-foreground" };
case "executorfailed": case "executorfailed":
return { label: "Executor Failed", className: "bg-status-failed text-status-failed-foreground" }; return { label: "Executor Failed", className: "bg-status-failed text-status-failed-foreground" };
case "paused":
return { label: "Paused", className: "bg-status-paused text-status-paused-foreground" };
default: default:
return { label: "Unknown", className: "bg-status-init text-status-init-foreground" }; return { label: "Unknown", className: "bg-status-init text-status-init-foreground" };
} }
@@ -112,8 +108,7 @@ export function TaskDetailsDialog({
const isAttemptRunning = const isAttemptRunning =
selectedAttempt && selectedAttempt &&
attemptActivities.length > 0 && attemptActivities.length > 0 &&
(attemptActivities[0].status === "init" || (attemptActivities[0].status === "setuprunning" ||
attemptActivities[0].status === "setuprunning" ||
attemptActivities[0].status === "setupcomplete" || attemptActivities[0].status === "setupcomplete" ||
attemptActivities[0].status === "executorrunning"); attemptActivities[0].status === "executorrunning");

View File

@@ -9,6 +9,8 @@ import {
ChevronDown, ChevronDown,
ChevronUp, ChevronUp,
Plus, Plus,
Settings,
Settings2,
} from "lucide-react"; } from "lucide-react";
import { Button } from "@/components/ui/button"; import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card"; import { Card, CardContent } from "@/components/ui/card";
@@ -22,13 +24,6 @@ import {
DropdownMenuTrigger, DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"; } from "@/components/ui/dropdown-menu";
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from "@/components/ui/tooltip";
import { makeRequest } from "@/lib/api"; import { makeRequest } from "@/lib/api";
import { import {
getTaskPanelClasses, getTaskPanelClasses,
@@ -62,11 +57,6 @@ const getAttemptStatusDisplay = (
status: TaskAttemptStatus status: TaskAttemptStatus
): { label: string; className: string } => { ): { label: string; className: string } => {
switch (status) { switch (status) {
case "init":
return {
label: "Init",
className: "bg-status-init text-status-init-foreground",
};
case "setuprunning": case "setuprunning":
return { return {
label: "Setup Running", label: "Setup Running",
@@ -97,11 +87,6 @@ const getAttemptStatusDisplay = (
label: "Executor Failed", label: "Executor Failed",
className: "bg-status-failed text-status-failed-foreground", className: "bg-status-failed text-status-failed-foreground",
}; };
case "paused":
return {
label: "Paused",
className: "bg-status-paused text-status-paused-foreground",
};
default: default:
return { return {
label: "Unknown", label: "Unknown",
@@ -126,13 +111,20 @@ export function TaskDetailsPanel({
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [followUpMessage, setFollowUpMessage] = useState(""); const [followUpMessage, setFollowUpMessage] = useState("");
const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false); const [isDescriptionExpanded, setIsDescriptionExpanded] = useState(false);
const [selectedExecutor, setSelectedExecutor] = useState("claude");
// Available executors
const availableExecutors = [
{ id: "echo", name: "Echo" },
{ id: "claude", name: "Claude" },
{ id: "amp", name: "Amp" },
];
// Check if the selected attempt is active (not in a final state) // Check if the selected attempt is active (not in a final state)
const isAttemptRunning = const isAttemptRunning =
selectedAttempt && selectedAttempt &&
attemptActivities.length > 0 && attemptActivities.length > 0 &&
(attemptActivities[0].status === "init" || (attemptActivities[0].status === "setuprunning" ||
attemptActivities[0].status === "setuprunning" ||
attemptActivities[0].status === "setupcomplete" || attemptActivities[0].status === "setupcomplete" ||
attemptActivities[0].status === "executorrunning"); attemptActivities[0].status === "executorrunning");
@@ -243,7 +235,7 @@ export function TaskDetailsPanel({
} }
}; };
const createNewAttempt = async () => { const createNewAttempt = async (executor?: string) => {
if (!task) return; if (!task) return;
try { try {
@@ -254,6 +246,9 @@ export function TaskDetailsPanel({
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
}, },
body: JSON.stringify({
executor: executor || selectedExecutor,
}),
} }
); );
@@ -377,8 +372,7 @@ export function TaskDetailsPanel({
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger asChild> <DropdownMenuTrigger asChild>
<Button variant="outline" size="sm"> <Button variant="outline" size="sm">
<History className="h-4 w-4 mr-1" /> <History className="h-4 w-4" />
History
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<DropdownMenuContent align="start" className="w-64"> <DropdownMenuContent align="start" className="w-64">
@@ -410,23 +404,49 @@ export function TaskDetailsPanel({
</DropdownMenuContent> </DropdownMenuContent>
</DropdownMenu> </DropdownMenu>
)} )}
<TooltipProvider> <div className="flex">
<Tooltip> <Button
<TooltipTrigger asChild> variant="outline"
size="sm"
onClick={() => createNewAttempt()}
className="rounded-r-none border-r-0"
>
Attempt with{" "}
{
availableExecutors.find(
(e) => e.id === selectedExecutor
)?.name
}
</Button>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button <Button
variant="outline" variant="outline"
size="default" size="sm"
onClick={createNewAttempt} className="rounded-l-none px-2"
className="h-9 w-9 p-0"
> >
<Plus className="h-4 w-4" /> <Settings2 className="h-4 w-4" />
</Button> </Button>
</TooltipTrigger> </DropdownMenuTrigger>
<TooltipContent> <DropdownMenuContent align="end">
<p>Create new attempt</p> {availableExecutors.map((executor) => (
</TooltipContent> <DropdownMenuItem
</Tooltip> key={executor.id}
</TooltipProvider> onClick={() => setSelectedExecutor(executor.id)}
className={
selectedExecutor === executor.id
? "bg-accent"
: ""
}
>
{executor.name}
{selectedExecutor === executor.id &&
" (Default)"}
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
</div>
</div> </div>
</div> </div>
@@ -479,7 +499,7 @@ export function TaskDetailsPanel({
</div> </div>
) : ( ) : (
<div className="space-y-3"> <div className="space-y-3">
{attemptActivities.slice().reverse().map((activity) => ( {attemptActivities.slice().map((activity) => (
<Card key={activity.id} className="border"> <Card key={activity.id} className="border">
<CardContent className="p-4"> <CardContent className="p-4">
<div className="flex items-center justify-between mb-2"> <div className="flex items-center justify-between mb-2">

View File

@@ -49,8 +49,6 @@ const statusLabels: Record<TaskStatus, string> = {
const getAttemptStatusDisplay = (status: TaskAttemptStatus): { label: string; className: string } => { const getAttemptStatusDisplay = (status: TaskAttemptStatus): { label: string; className: string } => {
switch (status) { switch (status) {
case "init":
return { label: "Init", className: "bg-status-init text-status-init-foreground" };
case "setuprunning": case "setuprunning":
return { label: "Setup Running", className: "bg-status-running text-status-running-foreground" }; return { label: "Setup Running", className: "bg-status-running text-status-running-foreground" };
case "setupcomplete": case "setupcomplete":
@@ -63,8 +61,6 @@ const getAttemptStatusDisplay = (status: TaskAttemptStatus): { label: string; cl
return { label: "Executor Complete", className: "bg-status-complete text-status-complete-foreground" }; return { label: "Executor Complete", className: "bg-status-complete text-status-complete-foreground" };
case "executorfailed": case "executorfailed":
return { label: "Executor Failed", className: "bg-status-failed text-status-failed-foreground" }; return { label: "Executor Failed", className: "bg-status-failed text-status-failed-foreground" };
case "paused":
return { label: "Paused", className: "bg-status-paused text-status-paused-foreground" };
default: default:
return { label: "Unknown", className: "bg-status-init text-status-init-foreground" }; return { label: "Unknown", className: "bg-status-init text-status-init-foreground" };
} }
@@ -143,8 +139,7 @@ export function TaskDetailsPage() {
const isAttemptRunning = const isAttemptRunning =
selectedAttempt && selectedAttempt &&
attemptActivities.length > 0 && attemptActivities.length > 0 &&
(attemptActivities[0].status === "init" || (attemptActivities[0].status === "setuprunning" ||
attemptActivities[0].status === "setuprunning" ||
attemptActivities[0].status === "setupcomplete" || attemptActivities[0].status === "setupcomplete" ||
attemptActivities[0].status === "executorrunning"); attemptActivities[0].status === "executorrunning");