Removed:
- All emojis from code and UI (using minimal styling instead)
- Classic debate mode completely (orchestrator.js, debate.js routes)
- Debate components (DebateThread.vue, PromptInput.vue)
- Debate store (debate.js)
- Unused database tables (debates, responses)
Simplified:
- App.vue: Single direct flow (input -> session)
- Backend: Only /api/collaborate routes
- NetworkStatus: Simple dot indicator with colors
- README.md: Consolidated documentation
- UX: Cleaner, more minimal interface
Cleanup focused on keeping only collaborative design system
Files removed: 6 | Files modified: 6
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
90 lines
2.3 KiB
JavaScript
90 lines
2.3 KiB
JavaScript
import express from 'express';
|
|
import cors from 'cors';
|
|
import helmet from 'helmet';
|
|
import dotenv from 'dotenv';
|
|
import { createServer } from 'http';
|
|
import { WebSocketServer } from 'ws';
|
|
import rateLimit from 'express-rate-limit';
|
|
import { parse } from 'url';
|
|
import db from './db/schema.js';
|
|
import collaborateRoutes from './routes/collaborate.js';
|
|
import collaborativeOrchestrator from './services/collaborativeOrchestrator.js';
|
|
|
|
dotenv.config();
|
|
|
|
const app = express();
|
|
const server = createServer(app);
|
|
const wss = new WebSocketServer({ server });
|
|
|
|
const PORT = process.env.PORT || 3000;
|
|
|
|
// Middleware
|
|
app.use(helmet());
|
|
app.use(cors({
|
|
origin: process.env.FRONTEND_URL || 'http://localhost:5173',
|
|
credentials: true
|
|
}));
|
|
app.use(express.json());
|
|
|
|
// Rate limiting
|
|
const limiter = rateLimit({
|
|
windowMs: 60 * 1000, // 1 minute
|
|
max: 10 // 10 requests per minute
|
|
});
|
|
app.use('/api', limiter);
|
|
|
|
// WebSocket connection handling
|
|
wss.on('connection', (ws, req) => {
|
|
const { query } = parse(req.url, true);
|
|
const sessionId = query.sessionId ? parseInt(query.sessionId) : null;
|
|
|
|
console.log('WebSocket connection', sessionId ? `session ${sessionId}` : 'established');
|
|
|
|
if (sessionId) {
|
|
collaborativeOrchestrator.registerWSClient(sessionId, ws);
|
|
|
|
ws.send(JSON.stringify({
|
|
type: 'connected',
|
|
sessionId,
|
|
message: 'Connected to session'
|
|
}));
|
|
}
|
|
|
|
ws.on('message', (message) => {
|
|
try {
|
|
const data = JSON.parse(message.toString());
|
|
console.log('Received:', data);
|
|
|
|
if (data.type === 'subscribe' && data.sessionId) {
|
|
collaborativeOrchestrator.registerWSClient(parseInt(data.sessionId), ws);
|
|
ws.send(JSON.stringify({
|
|
type: 'subscribed',
|
|
sessionId: data.sessionId
|
|
}));
|
|
}
|
|
} catch (error) {
|
|
console.error('WebSocket message error:', error);
|
|
}
|
|
});
|
|
|
|
ws.on('close', () => {
|
|
if (sessionId) {
|
|
collaborativeOrchestrator.unregisterWSClient(sessionId, ws);
|
|
}
|
|
console.log('WebSocket closed');
|
|
});
|
|
});
|
|
|
|
// Routes
|
|
app.get('/api/health', (req, res) => {
|
|
res.json({ status: 'ok' });
|
|
});
|
|
|
|
app.use('/api/collaborate', collaborateRoutes);
|
|
|
|
// Start server
|
|
server.listen(PORT, () => {
|
|
console.log(`Agora AI Backend running on port ${PORT}`);
|
|
console.log(`WebSocket server ready`);
|
|
});
|