import { NextResponse } from "next/server"; import { z } from "zod"; import { auth } from "@/app/(auth)/auth"; import { AgentRunError, agentRunView, assertAgentRunOwnership, controlAgentRun, getAgentRun, } from "@/lib/ai/canvas-agent-runtime/store"; import { publicAgentError } from "@/lib/ai/canvas-agent-runtime/protocol"; export const dynamic = "force-dynamic"; const scope = z.object({ chatId: z.string().uuid(), projectId: z.string().uuid(), runId: z.string().uuid().optional(), }); const control = scope .extend({ runId: z.string().uuid(), action: z.enum(["steer", "cancel"]), inputId: z.string().uuid().optional(), text: z.string().trim().min(1).max(2000).optional(), }) .refine( (input) => input.action !== "steer" || Boolean(input.inputId && input.text), "补充要求缺少内容或请求号", ); export async function GET(request: Request) { const session = await auth(); if (!session?.user?.id) return NextResponse.json({ error: "未登录" }, { status: 401 }); try { const input = scope.parse(Object.fromEntries(new URL(request.url).searchParams)); await assertAgentRunOwnership(session.user.id, input.projectId, input.chatId); const run = await getAgentRun(session.user.id, input.chatId, input.projectId, input.runId); return NextResponse.json( { run: run ? agentRunView(run) : null }, { headers: { "Cache-Control": "private, no-store" } }, ); } catch (error) { return failure(error); } } export async function POST(request: Request) { const session = await auth(); if (!session?.user?.id) return NextResponse.json({ error: "未登录" }, { status: 401 }); try { const input = control.parse(await request.json()); await assertAgentRunOwnership(session.user.id, input.projectId, input.chatId); return NextResponse.json({ run: await controlAgentRun({ ...input, userId: session.user.id }) }); } catch (error) { return failure(error); } } function failure(error: unknown) { return NextResponse.json( { error: publicAgentError(error) }, { status: error instanceof AgentRunError ? error.status : error instanceof z.ZodError ? 400 : 503, }, ); }