Forge / server.js
ausername-12345
add startup diagnostics, explicit 0.0.0.0 bind, uncaught error handlers
131e0a6
Raw
History Blame Contribute Delete
1.85 kB
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}`);
});