import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { useHitl } from "@/hooks/useHitl"; import { Shield, ShieldCheck, ShieldOff, Timer } from "lucide-react"; import { useEffect, useState } from "react"; import { CustomTarget } from "./targets/custom"; import { KiCadTarget } from "./targets/kicad"; import { LibreOfficeTarget } from "./targets/libreoffice"; import { NotepadTarget } from "./targets/notepad"; import { VRoidTarget } from "./targets/vroid"; const TABS = [ { id: "notepad", label: "Notepad", component: NotepadTarget }, { id: "libreoffice", label: "LibreOffice", component: LibreOfficeTarget }, { id: "vroid", label: "VRoid Studio", component: VRoidTarget }, { id: "kicad", label: "KiCad", component: KiCadTarget }, { id: "custom", label: "Custom", component: CustomTarget }, ] as const; type TabId = (typeof TABS)[number]["id"]; function HitlBar() { const hitl = useHitl(); const [nowMs, setNowMs] = useState(() => Date.now()); useEffect(() => { const id = window.setInterval(() => setNowMs(Date.now()), 1000); return () => clearInterval(id); }, []); const secondsLeft = hitl.expiresAt ? Math.max(0, Math.round(hitl.expiresAt - nowMs / 1000)) : 0; return (
{hitl.killSwitchActive ? ( ) : hitl.approved ? ( ) : ( )} HITL {hitl.killSwitchActive && ( Kill switch active )} {hitl.bypassActive && ( Bypass active )} {!hitl.killSwitchActive && hitl.approved && ( {secondsLeft}s remaining )} {!hitl.killSwitchActive && !hitl.approved && !hitl.bypassActive && ( Approval required )} {hitl.actionsLast60s} actions/min
); } export function Targets() { const [activeTab, setActiveTab] = useState(() => { const stored = localStorage.getItem("targets-tab"); if (stored && TABS.some((t) => t.id === stored)) { return stored as TabId; } return "notepad"; }); const handleTabChange = (id: TabId) => { setActiveTab(id); localStorage.setItem("targets-tab", id); }; const ActiveComponent = TABS.find((t) => t.id === activeTab)?.component ?? NotepadTarget; return (

Automation Targets

Operator console — fire automation_task runs, review evidence, manage HITL.

{TABS.map((tab) => ( ))}
); }