require('dotenv').config(); const express = require('express'); const socketIo = require('socket.io'); const multer = require('multer'); const pdfParse = require('pdf-parse'); const mammoth = require('mammoth'); const fetch = require('node-fetch'); const app = express(); // Initialize Express app // Middleware app.use(express.json()); // Multer for file uploads const upload = multer({ dest: 'uploads/' }); // Socket.io setup (Passenger handles HTTP server) const io = require('socket.io')(3000, { path: '/myapp/socket.io' }); const sessions = {}; io.on('connection', (socket) => { socket.on('joinSession', (data) => { const { sessionId, mode } = data; socket.join(sessionId); if (!sessions[sessionId]) { sessions[sessionId] = { history: [{ role: 'system', content: getSystemPrompt(mode) }] }; } socket.emit('chatHistory', sessions[sessionId].history); }); socket.on('sendMessage', async ({ sessionId, message, mode }) => { const session = sessions[sessionId]; session.history.push({ role: 'user', content: message }); io.to(sessionId).emit('newMessage', { role: 'user', content: message }); const response = await fetch('https://api.openai.com/v1/chat/completions', { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'gpt-4o-mini', messages: session.history, temperature: 0.7, max_tokens: 1000 }) }); const data = await response.json(); const aiReply = data.choices[0].message.content; session.history.push({ role: 'assistant', content: aiReply }); io.to(sessionId).emit('newMessage', { role: 'assistant', content: aiReply }); }); }); app.post('/api/extract', upload.single('file'), async (req, res) => { const file = req.file; let text = ''; if (file.mimetype === 'application/pdf') { const buffer = require('fs').readFileSync(file.path); const data = await pdfParse(buffer); text = data.text; } else if (file.mimetype === 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') { const result = await mammoth.extractRawText({ path: file.path }); text = result.value; } require('fs').unlinkSync(file.path); res.json({ text }); }); function getSystemPrompt(mode) { const prompts = { 1: "You are a neutral mediator for non-legal roommate/family disputes. Guide users through empathetic dialogue, suggest compromises, and facilitate resolution without legal binding. Disclaim: This is not legal advice; consult a professional if needed.", 2: "You are a legal mediator for binding agreements. Analyze uploaded documents, facilitate negotiation, and draft enforceable terms. Disclaim: This is not legal advice; ensure compliance with local laws and consult an attorney. Suggest e-signature if binding.", 3: "You are a contract reviewer. Analyze uploaded documents for clauses, risks, fairness, and suggest revisions. Provide neutral, evidence-based feedback. Disclaim: This is not legal advice; consult a lawyer for final review." }; return prompts[mode]; } // Remove server.listen - Passenger handles this // No need for http.createServer(app) since Passenger serves the app module.exports = app; // Export app for Passenger (optional, depending on setup)