const GET_PROXY_PREFIXES = Object.freeze(["/v1/"]); const GET_PROXY_ROUTES = new Set(["/v1", "/auth/session", "/auth/bootstrap"]); const POST_PROXY_ROUTES = new Set([ "/auth/login", "/auth/register", "/auth/logout", "/v1/agent/chat", "/v1/agent/chat/cancel", "/v1/agent/chat/steer", "/v1/agent/sessions", "/v1/hwpod-node-ops", "/v1/web-performance", "/v1/m3/io", "/v1/skills/uploads" ]); const PUBLIC_PROXY_ROUTES = new Set([ "GET /auth/session", "GET /auth/bootstrap", "POST /auth/login", "POST /auth/register", "POST /auth/logout", "POST /v1/agent/chat", "POST /v1/agent/chat/cancel", "POST /v1/agent/chat/steer", "POST /v1/web-performance" ]); export function cloudWebProxyRoutePolicy(method, pathname) { const normalizedMethod = normalizeMethod(method); const normalizedPath = normalizePathname(pathname); const routeKey = `${normalizedMethod} ${normalizedPath}`; const proxy = isCloudApiProxyRoute(normalizedMethod, normalizedPath); const publicRoute = proxy && ( PUBLIC_PROXY_ROUTES.has(routeKey) || isPublicCodeAgentPollRoute(normalizedMethod, normalizedPath) ); return { proxy, authRequired: proxy && !publicRoute, publicRoute, routeKey }; } export function isCloudApiProxyRoute(method, pathname) { const normalizedMethod = normalizeMethod(method); const normalizedPath = normalizePathname(pathname); if (normalizedMethod === "GET") { return GET_PROXY_ROUTES.has(normalizedPath) || GET_PROXY_PREFIXES.some((prefix) => normalizedPath.startsWith(prefix)); } if (normalizedMethod === "POST") { return POST_PROXY_ROUTES.has(normalizedPath) || isAdminAccessWriteProxyRoute(normalizedMethod, normalizedPath) || isProviderProfileManagementProxyRoute(normalizedMethod, normalizedPath) || isApiKeyWriteProxyRoute(normalizedMethod, normalizedPath) || isAdminBillingWriteProxyRoute(normalizedMethod, normalizedPath) || normalizedPath.startsWith("/v1/rpc/") || normalizedPath.startsWith("/v1/agent/sessions/"); } if (normalizedMethod === "PATCH" || normalizedMethod === "PUT") { return isAdminAccessWriteProxyRoute(normalizedMethod, normalizedPath) || isAdminBillingWriteProxyRoute(normalizedMethod, normalizedPath) || isProviderProfileManagementProxyRoute(normalizedMethod, normalizedPath) || isApiKeyWriteProxyRoute(normalizedMethod, normalizedPath); } if (normalizedMethod === "DELETE") { return isAdminAccessWriteProxyRoute(normalizedMethod, normalizedPath) || isProviderProfileManagementProxyRoute(normalizedMethod, normalizedPath) || isApiKeyWriteProxyRoute(normalizedMethod, normalizedPath); } return false; } function isAdminAccessWriteProxyRoute(method, pathname) { if (method === "POST" && pathname === "/v1/admin/access/check") return true; const parts = pathname.split("/").filter(Boolean); if (parts.length < 5 || parts[0] !== "v1" || parts[1] !== "admin" || parts[2] !== "access" || parts[3] !== "users") return false; if (method === "PATCH" && parts.length === 5) return true; if ((method === "PUT" || method === "DELETE") && parts.length === 8 && parts[5] === "tools" && parts[7] === "can-use") return true; return false; } function isProviderProfileManagementProxyRoute(method, pathname) { const parts = pathname.split("/").filter(Boolean); if (parts.length < 4 || parts[0] !== "v1" || parts[1] !== "admin" || parts[2] !== "provider-profiles") return false; if (method === "DELETE" && parts.length === 4) return true; if (method === "PUT" && parts.length === 5 && parts[4] === "credential") return true; if (method === "PUT" && parts.length === 5 && parts[4] === "config") return true; if (method === "POST" && parts.length === 5 && parts[4] === "validate") return true; return false; } function isApiKeyWriteProxyRoute(method, pathname) { if (pathname === "/v1/api-keys" && method === "POST") return true; if (!pathname.startsWith("/v1/api-keys/")) return false; if (method === "PATCH") return true; if (method === "DELETE") return true; if (method !== "POST") return false; return pathname.endsWith("/regenerate"); } function isAdminBillingWriteProxyRoute(method, pathname) { const parts = pathname.split("/").filter(Boolean); if (parts.length < 4 || parts[0] !== "v1" || parts[1] !== "admin" || parts[2] !== "billing" || parts[3] !== "users") return false; if (method === "POST" && parts.length === 4) return true; if (method === "PATCH" && parts.length === 5) return true; if (method === "PATCH" && parts.length === 6 && parts[5] === "status") return true; if (method === "POST" && parts.length === 7 && parts[5] === "credits" && parts[6] === "adjust") return true; return false; } function isPublicCodeAgentPollRoute(method, pathname) { return method === "GET" && ( pathname.startsWith("/v1/agent/turns/") || pathname.startsWith("/v1/agent/chat/result/") || pathname.startsWith("/v1/agent/traces/") ); } function normalizeMethod(method) { return String(method || "GET").trim().toUpperCase() || "GET"; } function normalizePathname(pathname) { const value = String(pathname || "/").trim(); if (!value || value[0] !== "/") return "/"; return value.replace(/\/+$/u, "") || "/"; }