a4f8226f3f
"What is running where" was answerable only by asking someone. Each tool now reports its own version on startup into a ToolVersion registry, shown on Pipeline → Machines. The worker's version moves out of config.json and into the assembly: a hand-maintained string on each machine is exactly the thing that goes stale, and a machine reporting a version it is not running is worse than no version at all. publish.ps1 stamps the git SHA via SourceRevisionId, so a deployed exe traces back to a commit (1.1.0+feb1c7b). The panel gains PANEL_VERSION, shown in its title and every diagnostics report, and pings on load. Staleness is derived rather than declared: the newest version seen for a tool is the benchmark, so updating one machine is what flags the rest. There is no expected-version list to keep in sync — which would have been one more thing to forget. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
36 lines
1.3 KiB
TypeScript
36 lines
1.3 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { isExtAuthorized } from "@/lib/render-pipeline/ext-auth";
|
|
import { toErrorResponse } from "@/lib/render-pipeline/errors";
|
|
import { recordToolVersion, toolPingSchema } from "@/lib/render-pipeline/tools";
|
|
|
|
// ── POST /api/ext/tools/ping ─────────────────────────────────────────────────
|
|
//
|
|
// A studio tool reporting its own version on startup. Fire-and-forget by
|
|
// design: callers must not fail if this errors.
|
|
|
|
export async function POST(req: NextRequest) {
|
|
if (!isExtAuthorized(req)) {
|
|
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
}
|
|
|
|
let raw: unknown;
|
|
try {
|
|
raw = await req.json();
|
|
} catch {
|
|
return NextResponse.json({ error: "Invalid JSON" }, { status: 400 });
|
|
}
|
|
|
|
const parsed = toolPingSchema.safeParse(raw);
|
|
if (!parsed.success) {
|
|
return NextResponse.json({ error: "Invalid tool ping", details: parsed.error.issues }, { status: 422 });
|
|
}
|
|
|
|
try {
|
|
const result = await recordToolVersion(parsed.data);
|
|
return NextResponse.json(result);
|
|
} catch (err) {
|
|
const { body, status } = toErrorResponse(err);
|
|
return NextResponse.json(body, { status });
|
|
}
|
|
}
|