import { NextResponse } from "next/server"; import { exec } from "child_process"; import os from "os"; export async function POST(req: Request) { // Never run in production if (process.env.NODE_ENV !== "development") { return NextResponse.json( { message: "Not available in production" }, { status: 404 } ); } try { const { locator } = await req.json(); if (!locator) { return NextResponse.json( { message: "Locator is required" }, { status: 400 } ); } const isWindows = os.platform() === "win32"; const bin = isWindows ? "antigravity-ide.cmd" : "antigravity-ide"; const cmd = `${bin} -r -g "${locator}"`; return new Promise((resolve) => { exec(cmd, (error) => { if (error) { // If primary IDE launcher isn't available, try fallback to code/cursor const fallbackBin = isWindows ? "code.cmd" : "code"; const fallbackCmd = `${fallbackBin} -r -g "${locator}"`; exec(fallbackCmd, (fallbackError) => { if (fallbackError) { console.error( `[open-in-ide] Error opening file: ${error.message} / Fallback error: ${fallbackError.message}` ); resolve( NextResponse.json( { message: "Failed to open file in IDE", error: error.message, }, { status: 500 } ) ); } else { resolve(NextResponse.json({ success: true, via: "code" })); } }); return; } resolve(NextResponse.json({ success: true, via: "antigravity" })); }); }); } catch (err: unknown) { const message = err instanceof Error ? err.message : String(err); console.error("[open-in-ide] Handler error:", err); return NextResponse.json( { message: "Internal server error", error: message }, { status: 500 } ); } }