"use client"; import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { Loader2, Plus, Wrench, X } from "lucide-react"; import { useParams } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { api } from "@/lib/trpc"; import type { HarnessType } from "@tasks/shared/worker"; const HARNESS_TYPES: HarnessType[] = ["minimal", "crewai", "langgraph", "remote-ag-ui"]; type HarnessForm = { alias: string; displayName: string; harnessType: HarnessType; endpointUrl: string; authEnvVar: string; enabled: boolean; }; const EMPTY_FORM: HarnessForm = { alias: "", displayName: "", harnessType: "minimal", endpointUrl: "", authEnvVar: "", enabled: true, }; export default function HarnessesSettingsPage() { const params = useParams(); const workspaceSlug = params?.workspaceSlug as string | undefined; const utils = api.useUtils(); const listQuery = api.harnesses.list.useQuery({ workspace: workspaceSlug ?? "" }, { enabled: Boolean(workspaceSlug) }); const routesQuery = api.harnesses.listRoutes.useQuery({ workspace: workspaceSlug ?? "" }, { enabled: Boolean(workspaceSlug) }); const [dialogOpen, setDialogOpen] = React.useState(false); const [editingId, setEditingId] = React.useState(null); const [form, setForm] = React.useState(EMPTY_FORM); const [testResult, setTestResult] = React.useState>({}); const [newRoleId, setNewRoleId] = React.useState(""); const [newHarnessId, setNewHarnessId] = React.useState(""); const createMut = api.harnesses.create.useMutation({ onSuccess: () => { void utils.harnesses.list.invalidate(); setDialogOpen(false); } }); const updateMut = api.harnesses.update.useMutation({ onSuccess: () => { void utils.harnesses.list.invalidate(); setDialogOpen(false); } }); const deleteMut = api.harnesses.delete.useMutation({ onSuccess: () => void utils.harnesses.list.invalidate() }); const testMut = api.harnesses.testHarness.useMutation({ onSuccess: (result, vars) => { setTestResult((prev) => ({ ...prev, [vars.harnessId]: result.ok ? `OK in ${result.latencyMs}ms` : `Failed: ${result.error ?? "unknown"}` })); }, }); const upsertRouteMut = api.harnesses.upsertRoute.useMutation({ onSuccess: () => { void utils.harnesses.listRoutes.invalidate(); setNewRoleId(""); setNewHarnessId(""); } }); const deleteRouteMut = api.harnesses.deleteRoute.useMutation({ onSuccess: () => void utils.harnesses.listRoutes.invalidate() }); const canManage = listQuery.data?.canManage ?? false; const harnesses = listQuery.data?.harnesses ?? []; const routes = routesQuery.data?.routes ?? []; const openCreate = () => { setEditingId(null); setForm(EMPTY_FORM); setDialogOpen(true); }; const openEdit = (h: (typeof harnesses)[number]) => { setEditingId(h.id); setForm({ alias: h.alias, displayName: h.displayName, harnessType: h.harnessType as HarnessType, endpointUrl: h.endpointUrl ?? "", authEnvVar: h.authEnvVar ?? "", enabled: h.enabled }); setDialogOpen(true); }; const submit = () => { if (!workspaceSlug) return; const payload = { workspace: workspaceSlug, alias: form.alias, displayName: form.displayName, harnessType: form.harnessType, endpointUrl: form.endpointUrl.trim() || null, authEnvVar: form.authEnvVar.trim() || null, enabled: form.enabled }; if (editingId) updateMut.mutate({ ...payload, id: editingId }); else createMut.mutate(payload); }; if (!workspaceSlug) return

No workspace selected.

; return (

Harnesses

Providers for minimal|crewai|langgraph|remote-ag-ui + role routing. Auth tokens stay in server env.

{canManage ? : null}
{listQuery.isLoading ?
: listQuery.error ?

{listQuery.error.message}

: harnesses.length === 0 ?
No harnesses yet. Add minimal or a remote AG-UI endpoint.
: (
{canManage ? : null} {harnesses.map((h) => ( {canManage ? ( ) : null} ))}
AliasTypeEndpointOnActions
{h.alias}
{h.displayName}
{h.harnessType} {h.endpointUrl ?? "—"} {h.enabled ? "yes" : "no"} {testResult[h.id] ?
{testResult[h.id]}
: null}
)}
Role → harness routing
{routesQuery.isLoading ?
: ( {canManage ? : null} {routes.length === 0 ? : routes.map((r) => ( {canManage ? : null} ))}
RoleHarnessTypeActions
No harness routes. Map role-implementer to crewai etc.
{r.roleId} {r.harnessAlias} {r.harnessType}
)} {canManage && harnesses.length > 0 ? (
setNewRoleId(e.target.value)} />
) : null}
{editingId ? "Edit harness" : "Add harness"}
setForm((f) => ({ ...f, alias: e.target.value }))} /> setForm((f) => ({ ...f, displayName: e.target.value }))} /> setForm((f) => ({ ...f, endpointUrl: e.target.value }))} /> setForm((f) => ({ ...f, authEnvVar: e.target.value }))} />

Token lives in server env, never returned to browser.

); } function Field({ label, children }: { label: string; children: React.ReactNode }) { return
{children}
; }