import { useState, useCallback } from "react"; import { useNavigate } from "react-router"; import type { ContractWithRelations } from "../../lib/api"; import { getSupervisorStatus, startSupervisor, stopSupervisor, resumeSupervisor, updateContract, type SupervisorStatus, } from "../../lib/api"; interface CommandModePanelProps { contract: ContractWithRelations; onUpdate: () => void; } const statusConfig: Record< SupervisorStatus["status"], { label: string; color: string; bgColor: string } > = { not_configured: { label: "Not Configured", color: "text-[#555]", bgColor: "bg-[#555]/10", }, pending: { label: "Ready", color: "text-yellow-400", bgColor: "bg-yellow-400/10", }, starting: { label: "Starting...", color: "text-blue-400", bgColor: "bg-blue-400/10", }, running: { label: "Running", color: "text-green-400", bgColor: "bg-green-400/10", }, paused: { label: "Paused", color: "text-orange-400", bgColor: "bg-orange-400/10", }, done: { label: "Completed", color: "text-blue-400", bgColor: "bg-blue-400/10", }, failed: { label: "Failed", color: "text-red-400", bgColor: "bg-red-400/10", }, }; export function CommandModePanel({ contract, onUpdate }: CommandModePanelProps) { const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const supervisorStatus = getSupervisorStatus(contract); const handleGoToSupervisor = useCallback(() => { if (supervisorStatus.supervisorTaskId) { navigate(`/exec/${supervisorStatus.supervisorTaskId}`); } }, [supervisorStatus.supervisorTaskId, navigate]); const config = statusConfig[supervisorStatus.status]; const handleStart = useCallback(async () => { if (!supervisorStatus.supervisorTaskId) return; setLoading(true); setError(null); try { await startSupervisor(supervisorStatus.supervisorTaskId); onUpdate(); } catch (e) { setError(e instanceof Error ? e.message : "Failed to start command mode"); } finally { setLoading(false); } }, [supervisorStatus.supervisorTaskId, onUpdate]); const handleStop = useCallback(async () => { if (!supervisorStatus.supervisorTaskId) return; setLoading(true); setError(null); try { await stopSupervisor(supervisorStatus.supervisorTaskId); onUpdate(); } catch (e) { setError(e instanceof Error ? e.message : "Failed to stop command mode"); } finally { setLoading(false); } }, [supervisorStatus.supervisorTaskId, onUpdate]); const handleResume = useCallback(async () => { setLoading(true); setError(null); try { await resumeSupervisor(contract.id, { resumeMode: "continue" }); // After resuming, we need to start the task if (supervisorStatus.supervisorTaskId) { await startSupervisor(supervisorStatus.supervisorTaskId); } onUpdate(); } catch (e) { setError(e instanceof Error ? e.message : "Failed to resume command mode"); } finally { setLoading(false); } }, [contract.id, supervisorStatus.supervisorTaskId, onUpdate]); const handlePhaseGuardChange = useCallback(async (enabled: boolean) => { setLoading(true); setError(null); try { await updateContract(contract.id, { phaseGuard: enabled, version: contract.version, }); onUpdate(); } catch (e) { setError(e instanceof Error ? e.message : "Failed to update phase guard setting"); } finally { setLoading(false); } }, [contract.id, contract.version, onUpdate]); return (

Command Mode

{supervisorStatus.supervisorTaskId && ( )}
{config.label}

{supervisorStatus.status === "not_configured" ? ( "This contract does not have a Command Mode supervisor configured." ) : supervisorStatus.status === "running" ? ( "Command Mode is actively working on this contract, spawning tasks and managing progress." ) : supervisorStatus.status === "pending" ? ( "Command Mode is ready to start. Click 'Enable' to begin autonomous work." ) : supervisorStatus.status === "paused" ? ( "Command Mode is paused. Click 'Resume' to continue work." ) : supervisorStatus.status === "failed" ? ( "Command Mode encountered an error. You can resume to retry." ) : supervisorStatus.status === "done" ? ( "Command Mode has completed its work on this contract." ) : ( "Command Mode is initializing..." )}

{error && (
{error}
)}
{supervisorStatus.canStart && ( )} {supervisorStatus.canResume && ( )} {supervisorStatus.canStop && ( )}
{/* Phase Guard Toggle */}