import { getSessionCookie } from "better-auth/cookies" import { NextResponse } from "next/server" import { getPublicRequestUrl } from "@/lib/url-helpers" function getAuthSessionCookie(request: Request): string | null { return ( getSessionCookie(request) ?? getSessionCookie(request, { cookiePrefix: "better-auth-dev" }) ) } export default async function proxy(request: Request) { console.debug("[PROXY] === PROXY START ===") const url = getPublicRequestUrl(request) console.debug("[PROXY] Path:", url.pathname) console.debug("[PROXY] Method:", request.method) const sessionCookie = getAuthSessionCookie(request) console.debug("[PROXY] Session cookie exists:", !!sessionCookie) // Always allow access to login and waitlist pages const publicPaths = ["/login", "/login/new"] if (publicPaths.includes(url.pathname)) { console.debug("[PROXY] Public path, allowing access") return NextResponse.next() } // MCP setup page is public — no auth required if (url.searchParams.get("view") === "mcp") { return NextResponse.next() } // Integrations index is public in guest mode; actions still require login. if (url.pathname === "/" && url.searchParams.get("view") === "integrations") { return NextResponse.next() } if (url.pathname.startsWith("/api/")) { if (!sessionCookie) { console.debug("[MIDDLEWARE] API route without session, returning 401") return new Response(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "Content-Type": "application/json" }, }) } console.debug("[MIDDLEWARE] API route with session, allowing access") return NextResponse.next() } // If no session cookie and not on a public path, redirect to login if (!sessionCookie) { console.debug( "[PROXY] No session cookie and not on public path, redirecting to /login", ) const loginUrl = new URL("/login", url.origin) loginUrl.searchParams.set("redirect", url.toString()) return NextResponse.redirect(loginUrl) } // TEMPORARILY DISABLED: Waitlist check // if (url.pathname !== "/waitlist") { // const response = await $fetch("@get/waitlist/status", { // headers: { // Authorization: `Bearer ${sessionCookie}`, // }, // console.debug("[PROXY] Waitlist status:", response.data); // if (response.data && !response.data.accessGranted) { // return NextResponse.redirect(new URL("/waitlist", request.url)); // } // } console.debug("[PROXY] Passing through to next handler") console.debug("[PROXY] === PROXY END ===") const response = NextResponse.next() response.cookies.set({ name: "last-site-visited", value: "https://app.supermemory.ai", domain: "supermemory.ai", }) return response } export const config = { matcher: [ "/((?!_next/static|_next/image|images|icon.png|favicon.ico|favicon-16x16.png|favicon-32x32.png|apple-touch-icon.png|android-chrome-192x192.png|android-chrome-512x512.png|manifest.webmanifest|site.webmanifest|monitoring|opengraph-image.png|bg-rectangle.png|onboarding|ingest|login|api/emails|mcp-supported-tools|mcp-icon.svg).*)", ], }