You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
2.0 KiB
67 lines
2.0 KiB
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<Response>((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 }
|
|
);
|
|
}
|
|
}
|