Add harness app: agent orchestrator with cluster deployment

- Next.js app for orchestrating coding agent benchmarks (Claude Code, Codex, OpenCode)
- Dockerfile installs git, gh CLI, and agent CLIs for headless execution
- K8s deployment with workspace volume, sealed credentials for Claude + OpenCode
- Traefik IngressRoute at harness.coreworlds.io with internal-only middleware + TLS
- CI pipeline path filter for harness builds
- Fix OpenCode runtime flags (subcommand-based headless mode)
This commit is contained in:
Julia McGhee
2026-03-21 15:26:09 +00:00
parent 9e7077cd82
commit 6dde7c8aef
46 changed files with 4675 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
import { NextRequest, NextResponse } from "next/server";
import { getAllTasks, createTask } from "@/lib/store";
import { getAgentConfig } from "@/lib/agents";
import { Task, TaskSpec } from "@/lib/types";
export async function GET() {
return NextResponse.json(getAllTasks());
}
export async function POST(request: NextRequest) {
const spec: TaskSpec = await request.json();
if (!spec.slug || !spec.goal) {
return NextResponse.json({ error: "slug and goal are required" }, { status: 400 });
}
if (!spec.agentId) {
return NextResponse.json({ error: "agentId is required" }, { status: 400 });
}
const agentConfig = getAgentConfig(spec.agentId);
if (!agentConfig) {
return NextResponse.json(
{ error: `Agent config not found: ${spec.agentId}` },
{ status: 400 },
);
}
const task: Task = {
id: `task-${Date.now()}`,
slug: spec.slug,
goal: spec.goal,
project: spec.project || "—",
status: "pending",
iteration: 0,
maxIterations: spec.maxIterations || 6,
startedAt: null,
evals: {},
iterations: [],
spec,
};
const created = createTask(task);
return NextResponse.json(created, { status: 201 });
}