import { NextResponse } from "next/server"; import { ZodError } from "zod"; import { auth } from "@/app/(auth)/auth"; import { RmbgServiceError } from "@/lib/ai/rmbg/service"; import { canvasCapabilityClientCommandSchema } from "@/lib/canvas/capabilities/client-command"; import { CanvasCapabilityRuntimeError } from "@/lib/canvas/capabilities/context"; import { getCanvasCapabilityManifest } from "@/lib/canvas/capabilities/registry"; import { executeCanvasCapabilityRuntime } from "@/lib/canvas/capabilities/runtime"; import { getCanvasCapabilityTask } from "@/lib/canvas/capabilities/task-store"; import { CanvasAgentMutationError } from "@/lib/canvas/agent-mutations"; import { formatRequestFailure, getRequestFailureDetails } from "@/lib/request-error"; export const dynamic = "force-dynamic"; export const maxDuration = 600; export async function GET( request: Request, { params }: { params: Promise<{ id: string }> } ) { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); } const { id } = await params; const requestId = new URL(request.url).searchParams.get("requestId"); if (!requestId) { return NextResponse.json({ success: true, capabilities: getCanvasCapabilityManifest(), }); } const task = await getCanvasCapabilityTask({ requestId, userId: session.user.id, projectId: id, }); if (!task) { return NextResponse.json( { success: false, error: "能力任务不存在" }, { status: 404 } ); } const failure = task.status === "failed" ? getRequestFailureDetails(task.error) : undefined; return NextResponse.json({ success: true, task: { ...task, failure, error: failure ? formatRequestFailure(failure, task.id) : task.error } }); } export async function POST( request: Request, { params }: { params: Promise<{ id: string }> } ) { const session = await auth(); if (!session?.user?.id) { return NextResponse.json({ success: false, error: "未登录" }, { status: 401 }); } let requestId: string | undefined; try { const { id } = await params; const command = canvasCapabilityClientCommandSchema.parse(await request.json()); requestId = command.requestId; const result = await executeCanvasCapabilityRuntime({ command, projectId: id, requestHeaders: request.headers, requestUrl: request.url, userId: session.user.id, }); return NextResponse.json({ success: true, ...result }); } catch (error) { if ( error instanceof CanvasCapabilityRuntimeError || error instanceof CanvasAgentMutationError ) { const failure = getRequestFailureDetails(error); return NextResponse.json( { success: false, error: formatRequestFailure(failure, requestId), code: error.code, failure, requestId }, { status: error.status } ); } if (error instanceof ZodError) { return NextResponse.json( { success: false, error: "画布能力参数无效", issues: error.issues, }, { status: 400 } ); } const failure = getRequestFailureDetails(error, "执行画布能力失败"); return NextResponse.json( { success: false, error: formatRequestFailure(failure, requestId), failure, requestId }, { status: error instanceof RmbgServiceError ? error.status : 500 } ); } }