const startTime = Date.now(); process.on('uncaughtException', (err) => { console.error('[fatal] uncaught exception:', err); }); process.on('unhandledRejection', (err) => { console.error('[fatal] unhandled rejection:', err); }); require('dotenv').config(); const path = require('path'); const express = require('express'); const http = require('http'); const { Server } = require('socket.io'); const { createAgent, AGENT_NAME } = require('./src/agent'); const app = express(); const server = http.createServer(app); const io = new Server(server); app.use(express.static(path.join(__dirname, 'public'))); app.get('/health', (_req, res) => res.json({ ok: true, agent: AGENT_NAME, uptime: Date.now() - startTime })); const agent = createAgent(io); io.on('connection', (socket) => { socket.emit('init', { agentName: AGENT_NAME, ...agent.snapshot() }); socket.on('chat:send', async (text) => { try { await agent.handleUserMessage(text); } catch (err) { console.error('[chat:send]', err); io.emit('agent:status', { state: 'idle' }); io.emit('log:entry', { id: `err-${Date.now()}`, type: 'assistant', ts: new Date().toISOString(), content: `Something went wrong on my end: ${err.message}` }); } }); socket.on('tool:approve', async (toolId) => { try { await agent.handleApprove(toolId); } catch (err) { console.error('[tool:approve]', err); } }); socket.on('tool:reject', async ({ toolId, reason } = {}) => { try { await agent.handleReject(toolId, reason); } catch (err) { console.error('[tool:reject]', err); } }); socket.on('model:change', (modelName) => { agent.setModel(modelName); }); }); const PORT = process.env.PORT || 7860; server.listen(PORT, '0.0.0.0', () => { console.log(`${AGENT_NAME} is listening on 0.0.0.0:${PORT}`); });