agora-ai/backend/src/index.js
Muyue 08056ce9fd Clean up: Remove emojis, unused APIs and files
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>
2025-10-17 17:22:49 +02:00

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`);
});