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
text/typescript
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 }
)
}
}