66 lines
2.2 KiB
TypeScript
66 lines
2.2 KiB
TypeScript
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,
|
|
},
|
|
);
|
|
}
|