UNPKG

flutty-cli-agent

Version:

Flutty CLI Agent - AI-powered development assistant with web chat interface, context memory, and full tool integration using DeepSeek API

92 lines (77 loc) 2.6 kB
import { NextRequest, NextResponse } from 'next/server' import * as http from 'http' import { URL } from 'url' // Use global variable to persist across hot reloads in development declare global { var runningServers: Map<number, any> | undefined } global.runningServers = global.runningServers || new Map() const runningServers = global.runningServers export async function POST(request: NextRequest) { try { const { code, port = 3001 } = await request.json() // Find an available port let availablePort = port while (runningServers.has(availablePort)) { availablePort++ } // Create HTTP server const server = http.createServer((req, res) => { const parsedUrl = new URL(req.url || '/', `http://localhost:${availablePort}`) // Set CORS headers res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') res.setHeader('Access-Control-Allow-Headers', 'Content-Type') // Handle preflight requests if (req.method === 'OPTIONS') { res.writeHead(200) res.end() return } if (parsedUrl.pathname === '/' || parsedUrl.pathname === '/index.html') { // Get the current code from the stored server info const serverInfo = runningServers.get(availablePort) const currentCode = serverInfo ? serverInfo.code : code res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }) res.end(currentCode) } else { res.writeHead(404, { 'Content-Type': 'text/plain' }) res.end('Not Found') } }) // Start the server await new Promise<void>((resolve, reject) => { server.listen(availablePort, (err?: Error) => { if (err) { reject(err) } else { resolve() } }) }) // Store the server runningServers.set(availablePort, { server, code, startTime: Date.now(), }) // Handle server errors server.on('error', (error) => { console.error(`Server error on port ${availablePort}:`, error) runningServers.delete(availablePort) }) const previewUrl = `http://localhost:${availablePort}` return NextResponse.json({ success: true, url: previewUrl, port: availablePort, message: 'Server started successfully' }) } catch (error) { console.error('Error starting server:', error) return NextResponse.json( { success: false, error: 'Failed to start server' }, { status: 500 } ) } }