| import { NextRequest, NextResponse } from 'next/server'; |
| import { getSession } from '@/lib/auth/session'; |
| import { taskManager, eventBus } from '@/lib/server-generate/singleton'; |
| import { runServerGeneration } from '@/lib/server-generate/server-orchestrator-runner'; |
| import type { StartGenerationRequest } from '@/lib/server-generate/types'; |
|
|
| export async function POST(request: NextRequest) { |
| const session = await getSession(); |
| if (!session) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 }); |
|
|
| let body: StartGenerationRequest; |
| try { |
| body = await request.json(); |
| } catch { |
| return NextResponse.json({ error: 'Invalid request body' }, { status: 400 }); |
| } |
|
|
| if (!body.projectId || !body.prompt || !body.model || !body.apiKey) { |
| return NextResponse.json( |
| { error: 'Missing required fields: projectId, prompt, model, apiKey' }, |
| { status: 400 }, |
| ); |
| } |
|
|
| const sessionId = session.userId; |
| const workspaceId = body.workspaceId; |
|
|
| let taskId: string; |
| try { |
| taskId = taskManager.createTask(body.projectId, sessionId, body.apiKey, workspaceId); |
| } catch (error) { |
| if (error instanceof Error && error.message.includes('limit')) { |
| return NextResponse.json({ error: error.message }, { status: 429 }); |
| } |
| throw error; |
| } |
|
|
| const task = taskManager.getTask(taskId)!; |
| task.prompt = body.prompt; |
| task.model = body.model; |
| task.projectName = body.projectName; |
|
|
| const port = process.env.PORT || '3000'; |
| const apiBaseUrl = `http://localhost:${port}`; |
|
|
| |
| runServerGeneration(taskId, body, { |
| taskManager, |
| eventBus, |
| createVFS: async (_projectId) => { |
| const { VirtualFileSystem } = await import('@/lib/vfs'); |
| const { getWorkspaceAdapter, getSQLiteAdapter } = await import('@/lib/vfs/adapters/server'); |
| const adapter = workspaceId ? getWorkspaceAdapter(workspaceId) : getSQLiteAdapter(); |
| const serverVFS = new VirtualFileSystem(adapter); |
| await serverVFS.init(); |
| return serverVFS; |
| }, |
| apiBaseUrl, |
| }).catch((err) => { |
| console.error(`Server generation failed for task ${taskId}:`, err); |
| }); |
|
|
| return NextResponse.json({ taskId }); |
| } |
|
|