diff --git a/app/(auth)/auth.ts b/app/(auth)/auth.ts index ce2b00d7e..cd907a049 100644 --- a/app/(auth)/auth.ts +++ b/app/(auth)/auth.ts @@ -3,6 +3,7 @@ import NextAuth, { type DefaultSession } from "next-auth"; import type { DefaultJWT } from "next-auth/jwt"; import Credentials from "next-auth/providers/credentials"; import Google from "next-auth/providers/google"; +import { headers } from "next/headers"; import { DUMMY_PASSWORD } from "@/lib/constants"; import { createGuestUser, getAuthSettings, getUser } from "@/lib/db/queries"; import { buildAuthConfig } from "./auth.config"; @@ -159,6 +160,37 @@ function createBaseProviders(googleClientId?: string, googleClientSecret?: strin return providers; } +function normalizeBaseUrl(input?: string | null) { + if (!input) return ""; + + try { + const parsed = new URL(input); + return `${parsed.protocol}//${parsed.host}`; + } catch { + return ""; + } +} + +async function resolveRuntimeAuthUrl(settingsAuthUrl?: string | null) { + const fromEnv = + normalizeBaseUrl(process.env.AUTH_URL) || + normalizeBaseUrl(process.env.NEXTAUTH_URL); + if (fromEnv) return fromEnv; + + const fromSettings = normalizeBaseUrl(settingsAuthUrl); + if (fromSettings) return fromSettings; + + const requestHeaders = await headers(); + const forwardedHost = requestHeaders.get("x-forwarded-host"); + const host = requestHeaders.get("host"); + const resolvedHost = forwardedHost || host || ""; + if (!resolvedHost) return ""; + + const forwardedProto = requestHeaders.get("x-forwarded-proto"); + const protocol = forwardedProto || "https"; + return `${protocol}://${resolvedHost}`; +} + export const { handlers: { GET, POST }, auth, @@ -167,7 +199,7 @@ export const { } = NextAuth(async () => { const runtimeAuthSettings = await getAuthSettings().catch(() => null as any); const resolvedAuthUrl = - runtimeAuthSettings?.authUrl || process.env.AUTH_URL || undefined; + (await resolveRuntimeAuthUrl(runtimeAuthSettings?.authUrl)) || undefined; const googleClientId = runtimeAuthSettings?.googleClientId || process.env.GOOGLE_CLIENT_ID || ""; const googleClientSecret = diff --git a/app/(chat)/api/chat/route.ts b/app/(chat)/api/chat/route.ts index 1f8b78335..6f1547656 100644 --- a/app/(chat)/api/chat/route.ts +++ b/app/(chat)/api/chat/route.ts @@ -1930,6 +1930,9 @@ export async function POST(request: Request) { const explicitFollowLatestResult = /(上一张|上一轮|刚生成|最新生成|这个结果|该结果|按这个结果|继续在这张|基于这张结果|延续上一次结果)/i.test( textContent ); + const explicitUseOriginalUpload = /(原图|上传图|参考图|最初那张|第一张图|素材图)/i.test( + textContent + ); const latestAssistantImages: string[] = []; const latestUserImages: string[] = []; @@ -1982,22 +1985,24 @@ export async function POST(request: Request) { } } - if (explicitFollowLatestResult && latestAssistantImages.length > 0) { - smartAutoHistoryImages = latestAssistantImages.slice(0, 4); - console.log( - "[Smart Auto Mode] 🖼️ Using latest generated image(s) by explicit instruction:", - smartAutoHistoryImages.length - ); - } else if (latestUserImages.length > 0) { + if (explicitUseOriginalUpload && latestUserImages.length > 0) { smartAutoHistoryImages = latestUserImages.slice(0, 4); console.log( - "[Smart Auto Mode] 🖼️ Using latest user-uploaded image(s) to avoid iterative blur:", + "[Smart Auto Mode] 🖼️ Using latest user-uploaded image(s) by explicit instruction:", smartAutoHistoryImages.length ); } else if (latestAssistantImages.length > 0) { smartAutoHistoryImages = latestAssistantImages.slice(0, 4); console.log( - "[Smart Auto Mode] 🖼️ Fallback to latest generated image(s):", + explicitFollowLatestResult + ? "[Smart Auto Mode] 🖼️ Using latest generated image(s) by explicit instruction:" + : "[Smart Auto Mode] 🖼️ Using latest generated image(s) for continuous edit:", + smartAutoHistoryImages.length + ); + } else if (latestUserImages.length > 0) { + smartAutoHistoryImages = latestUserImages.slice(0, 4); + console.log( + "[Smart Auto Mode] 🖼️ Fallback to latest user-uploaded image(s):", smartAutoHistoryImages.length ); } diff --git a/app/canvas/[id]/model3d/page.tsx b/app/canvas/[id]/model3d/page.tsx index 25ab37d3b..892b29dd1 100644 --- a/app/canvas/[id]/model3d/page.tsx +++ b/app/canvas/[id]/model3d/page.tsx @@ -12,7 +12,6 @@ import { Download, Eye, EyeOff, - FileBox, Grid3X3, History, ImagePlus, @@ -20,12 +19,14 @@ import { Layers3, Loader2, Maximize, + Package, Palette, PenLine, Play, PlusCircle, RefreshCw, RotateCw, + Scissors, Settings2, Sparkles, Sun, @@ -414,6 +415,7 @@ export default function CanvasModel3DPage() { // Effect hooks for data loading and cleanup useEffect(() => { + console.log("CanvasModel3DPage mounted - v2.0"); const loadBalance = async () => { const result = await model3DGenerationService.getBalance(); if (!result.success) return; @@ -1301,7 +1303,10 @@ export default function CanvasModel3DPage() {