2025-05-28 12:26:47 -07:00
|
|
|
import { initApiPassthrough } from "langgraph-nextjs-api-passthrough";
|
2025-06-15 12:37:31 -07:00
|
|
|
import {
|
|
|
|
|
GITHUB_TOKEN_COOKIE,
|
|
|
|
|
GITHUB_INSTALLATION_TOKEN_COOKIE,
|
|
|
|
|
} from "@open-swe/shared/constants";
|
|
|
|
|
import { encryptGitHubToken } from "@open-swe/shared/crypto";
|
|
|
|
|
import { NextRequest } from "next/server";
|
|
|
|
|
import { getInstallationToken } from "@/utils/github";
|
|
|
|
|
import { GITHUB_INSTALLATION_ID_COOKIE } from "@/lib/auth";
|
|
|
|
|
|
|
|
|
|
function getGitHubAccessTokenOrThrow(
|
|
|
|
|
req: NextRequest,
|
|
|
|
|
encryptionKey: string,
|
|
|
|
|
): string {
|
|
|
|
|
const token = req.cookies.get(GITHUB_TOKEN_COOKIE)?.value ?? "";
|
|
|
|
|
|
|
|
|
|
if (!token) {
|
|
|
|
|
throw new Error("No GitHub access token cookie found.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return encryptGitHubToken(token, encryptionKey);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function getGitHubInstallationTokenOrThrow(
|
|
|
|
|
req: NextRequest,
|
|
|
|
|
encryptionKey: string,
|
|
|
|
|
): Promise<string> {
|
|
|
|
|
const installationIdCookie = req.cookies.get(
|
|
|
|
|
GITHUB_INSTALLATION_ID_COOKIE,
|
|
|
|
|
)?.value;
|
|
|
|
|
if (!installationIdCookie) {
|
|
|
|
|
throw new Error("No GitHub installation ID cookie found.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const appId = process.env.GITHUB_APP_ID;
|
|
|
|
|
const privateAppKey = process.env.GITHUB_APP_PRIVATE_KEY;
|
|
|
|
|
if (!appId || !privateAppKey) {
|
|
|
|
|
throw new Error("GitHub App ID or Private App Key is not configured.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const token = await getInstallationToken(
|
|
|
|
|
installationIdCookie,
|
|
|
|
|
appId,
|
|
|
|
|
privateAppKey,
|
|
|
|
|
);
|
|
|
|
|
return encryptGitHubToken(token, encryptionKey);
|
|
|
|
|
}
|
2025-05-28 12:26:47 -07:00
|
|
|
|
|
|
|
|
// This file acts as a proxy for requests to your LangGraph server.
|
|
|
|
|
// Read the [Going to Production](https://github.com/langchain-ai/agent-chat-ui?tab=readme-ov-file#going-to-production) section for more information.
|
|
|
|
|
|
|
|
|
|
export const { GET, POST, PUT, PATCH, DELETE, OPTIONS, runtime } =
|
|
|
|
|
initApiPassthrough({
|
2025-06-11 14:00:08 -07:00
|
|
|
apiUrl: process.env.LANGGRAPH_API_URL ?? "http://localhost:2024",
|
2025-05-28 12:26:47 -07:00
|
|
|
runtime: "edge", // default
|
2025-06-11 14:00:08 -07:00
|
|
|
disableWarningLog: true,
|
2025-06-15 12:37:31 -07:00
|
|
|
headers: async (req) => {
|
|
|
|
|
const encryptionKey = process.env.GITHUB_TOKEN_ENCRYPTION_KEY;
|
|
|
|
|
if (!encryptionKey) {
|
|
|
|
|
throw new Error(
|
|
|
|
|
"GITHUB_TOKEN_ENCRYPTION_KEY environment variable is required",
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-11 14:00:08 -07:00
|
|
|
return {
|
2025-06-15 12:37:31 -07:00
|
|
|
[GITHUB_TOKEN_COOKIE]: getGitHubAccessTokenOrThrow(req, encryptionKey),
|
|
|
|
|
[GITHUB_INSTALLATION_TOKEN_COOKIE]:
|
|
|
|
|
await getGitHubInstallationTokenOrThrow(req, encryptionKey),
|
2025-06-11 14:00:08 -07:00
|
|
|
};
|
|
|
|
|
},
|
2025-05-28 12:26:47 -07:00
|
|
|
});
|