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