singularity-forge/web/app/api/session/command/route.ts
2026-05-05 14:31:16 +02:00

67 lines
1.5 KiB
TypeScript

import {
buildBridgeFailureResponse,
requireProjectCwd,
sendBridgeInput,
} from "../../../../../src/web/bridge-service.ts";
export const runtime = "nodejs";
export const dynamic = "force-dynamic";
function isBridgeInput(value: unknown): value is { type: string } {
return (
typeof value === "object" &&
value !== null &&
typeof (value as { type?: unknown }).type === "string"
);
}
function responseStatus(response: { success: boolean; code?: string }): number {
if (response.success) return 200;
if (response.code === "onboarding_locked") return 423;
return 502;
}
export async function POST(request: Request): Promise<Response> {
let payload: unknown;
try {
payload = await request.json();
} catch (error) {
return Response.json(buildBridgeFailureResponse("parse", error), {
status: 400,
});
}
if (!isBridgeInput(payload)) {
return Response.json(
buildBridgeFailureResponse(
"parse",
"Request body must be a JSON object with a type field",
),
{
status: 400,
},
);
}
try {
const projectCwd = requireProjectCwd(request);
const response = await sendBridgeInput(
payload as Parameters<typeof sendBridgeInput>[0],
projectCwd,
);
if (response === null) {
return Response.json({ ok: true }, { status: 202 });
}
return Response.json(response, {
status: responseStatus(response),
headers: {
"Cache-Control": "no-store",
},
});
} catch (error) {
return Response.json(buildBridgeFailureResponse(payload.type, error), {
status: 503,
});
}
}