File size: 1,852 Bytes
131e0a6 4381a41 131e0a6 4381a41 c3e18bc 4381a41 c3e18bc 4381a41 131e0a6 4381a41 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 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}`);
});
|