@burdenoff/vibe-agent 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +8 -0
- package/LICENSE +22 -0
- package/README.md +290 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +445 -0
- package/dist/app.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1043 -0
- package/dist/cli.js.map +1 -0
- package/dist/db/schema.d.ts +145 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +536 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/ModuleAuth.d.ts +61 -0
- package/dist/middleware/ModuleAuth.d.ts.map +1 -0
- package/dist/middleware/ModuleAuth.js +220 -0
- package/dist/middleware/ModuleAuth.js.map +1 -0
- package/dist/middleware/auth.d.ts +3 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +11 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/migrations/remove-notes-prompts.d.ts +13 -0
- package/dist/migrations/remove-notes-prompts.d.ts.map +1 -0
- package/dist/migrations/remove-notes-prompts.js +148 -0
- package/dist/migrations/remove-notes-prompts.js.map +1 -0
- package/dist/routes/bookmarks.d.ts +3 -0
- package/dist/routes/bookmarks.d.ts.map +1 -0
- package/dist/routes/bookmarks.js +186 -0
- package/dist/routes/bookmarks.js.map +1 -0
- package/dist/routes/config.d.ts +3 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +108 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/files.d.ts +3 -0
- package/dist/routes/files.d.ts.map +1 -0
- package/dist/routes/files.js +471 -0
- package/dist/routes/files.js.map +1 -0
- package/dist/routes/git.d.ts +3 -0
- package/dist/routes/git.d.ts.map +1 -0
- package/dist/routes/git.js +498 -0
- package/dist/routes/git.js.map +1 -0
- package/dist/routes/moduleRegistry.d.ts +41 -0
- package/dist/routes/moduleRegistry.d.ts.map +1 -0
- package/dist/routes/moduleRegistry.js +356 -0
- package/dist/routes/moduleRegistry.js.map +1 -0
- package/dist/routes/notifications.d.ts +3 -0
- package/dist/routes/notifications.d.ts.map +1 -0
- package/dist/routes/notifications.js +250 -0
- package/dist/routes/notifications.js.map +1 -0
- package/dist/routes/port-forward.d.ts +3 -0
- package/dist/routes/port-forward.d.ts.map +1 -0
- package/dist/routes/port-forward.js +205 -0
- package/dist/routes/port-forward.js.map +1 -0
- package/dist/routes/projects.d.ts +3 -0
- package/dist/routes/projects.d.ts.map +1 -0
- package/dist/routes/projects.js +442 -0
- package/dist/routes/projects.js.map +1 -0
- package/dist/routes/ssh.d.ts +3 -0
- package/dist/routes/ssh.d.ts.map +1 -0
- package/dist/routes/ssh.js +192 -0
- package/dist/routes/ssh.js.map +1 -0
- package/dist/routes/tasks.d.ts +3 -0
- package/dist/routes/tasks.d.ts.map +1 -0
- package/dist/routes/tasks.js +183 -0
- package/dist/routes/tasks.js.map +1 -0
- package/dist/routes/tmux.d.ts +3 -0
- package/dist/routes/tmux.d.ts.map +1 -0
- package/dist/routes/tmux.js +1191 -0
- package/dist/routes/tmux.js.map +1 -0
- package/dist/routes/tunnel.d.ts +25 -0
- package/dist/routes/tunnel.d.ts.map +1 -0
- package/dist/routes/tunnel.js +449 -0
- package/dist/routes/tunnel.js.map +1 -0
- package/dist/services/ModulePermissions.d.ts +100 -0
- package/dist/services/ModulePermissions.d.ts.map +1 -0
- package/dist/services/ModulePermissions.js +312 -0
- package/dist/services/ModulePermissions.js.map +1 -0
- package/dist/services/ModuleRegistryService.d.ts +152 -0
- package/dist/services/ModuleRegistryService.d.ts.map +1 -0
- package/dist/services/ModuleRegistryService.js +522 -0
- package/dist/services/ModuleRegistryService.js.map +1 -0
- package/dist/services/agent.service.d.ts +19 -0
- package/dist/services/agent.service.d.ts.map +1 -0
- package/dist/services/agent.service.js +88 -0
- package/dist/services/agent.service.js.map +1 -0
- package/dist/services/bootstrap.d.ts +22 -0
- package/dist/services/bootstrap.d.ts.map +1 -0
- package/dist/services/bootstrap.js +206 -0
- package/dist/services/bootstrap.js.map +1 -0
- package/dist/services/service-manager.d.ts +50 -0
- package/dist/services/service-manager.d.ts.map +1 -0
- package/dist/services/service-manager.js +382 -0
- package/dist/services/service-manager.js.map +1 -0
- package/package.json +107 -0
package/dist/app.js
ADDED
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
import Fastify from 'fastify';
|
|
2
|
+
import cors from '@fastify/cors';
|
|
3
|
+
import helmet from '@fastify/helmet';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import crypto from 'node:crypto';
|
|
6
|
+
import { Server as SocketIOServer } from 'socket.io';
|
|
7
|
+
import { WebSocketServer, WebSocket } from 'ws';
|
|
8
|
+
import AgentDatabase from './db/schema.js';
|
|
9
|
+
import { tmuxRoutes } from './routes/tmux.js';
|
|
10
|
+
import { sshRoutes } from './routes/ssh.js';
|
|
11
|
+
import { portForwardRoutes } from './routes/port-forward.js';
|
|
12
|
+
import { taskRoutes } from './routes/tasks.js';
|
|
13
|
+
import { configRoutes } from './routes/config.js';
|
|
14
|
+
import { gitRoutes } from './routes/git.js';
|
|
15
|
+
import { fileRoutes } from './routes/files.js';
|
|
16
|
+
import { bookmarkRoutes } from './routes/bookmarks.js';
|
|
17
|
+
import { notificationRoutes } from './routes/notifications.js';
|
|
18
|
+
import { projectRoutes } from './routes/projects.js';
|
|
19
|
+
import { moduleRegistryRoutes } from './routes/moduleRegistry.js';
|
|
20
|
+
import { tunnelRoutes, getAgentTunnelUrl, startAgentTunnel, stopAgentTunnel } from './routes/tunnel.js';
|
|
21
|
+
import { bootstrap, checkDependencies } from './services/bootstrap.js';
|
|
22
|
+
// ── Agent API Key ──────────────────────────────────────────────────────
|
|
23
|
+
// Generated fresh on every agent start/restart. Must be provided via
|
|
24
|
+
// `x-agent-api-key` header (or `apiKey` query param) for all requests
|
|
25
|
+
// except /health and /api/agent-identity.
|
|
26
|
+
// The key is printed to stdout on startup so the user can copy it into
|
|
27
|
+
// the agent configuration in the VibeControls UI.
|
|
28
|
+
let agentApiKey = '';
|
|
29
|
+
/**
|
|
30
|
+
* Generate a new cryptographically random API key for this agent instance.
|
|
31
|
+
* Called once at startup.
|
|
32
|
+
*/
|
|
33
|
+
function generateAgentApiKey() {
|
|
34
|
+
return `vcak_${crypto.randomBytes(32).toString('base64url')}`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get the current agent API key.
|
|
38
|
+
*/
|
|
39
|
+
export function getAgentApiKey() {
|
|
40
|
+
return agentApiKey;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate a stable machine fingerprint from hostname + platform + arch.
|
|
44
|
+
* Used by the backend to verify that a tunnel URL reaches the expected machine.
|
|
45
|
+
*/
|
|
46
|
+
function getMachineFingerprint() {
|
|
47
|
+
const raw = `${os.hostname()}|${os.platform()}|${os.arch()}`;
|
|
48
|
+
return crypto.createHash('sha256').update(raw).digest('hex').substring(0, 16);
|
|
49
|
+
}
|
|
50
|
+
export async function startServer() {
|
|
51
|
+
// Generate a fresh API key for this agent instance
|
|
52
|
+
agentApiKey = generateAgentApiKey();
|
|
53
|
+
const app = Fastify({
|
|
54
|
+
logger: process.env.NODE_ENV === 'development' ? {
|
|
55
|
+
level: 'info',
|
|
56
|
+
serializers: {
|
|
57
|
+
req: (req) => {
|
|
58
|
+
return {
|
|
59
|
+
method: req.method,
|
|
60
|
+
url: req.url,
|
|
61
|
+
host: req.headers.host,
|
|
62
|
+
remoteAddress: req.ip,
|
|
63
|
+
remotePort: req.socket?.remotePort,
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
res: (res) => {
|
|
67
|
+
return {
|
|
68
|
+
statusCode: res.statusCode,
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
} : false,
|
|
73
|
+
});
|
|
74
|
+
// Initialize database
|
|
75
|
+
const db = new AgentDatabase(process.env.DB_PATH || './vibecontrols-agent.db');
|
|
76
|
+
// Make db available to routes
|
|
77
|
+
app.decorate('db', db);
|
|
78
|
+
// Register plugins
|
|
79
|
+
await app.register(cors, {
|
|
80
|
+
origin: process.env.CORS_ORIGIN || true,
|
|
81
|
+
credentials: true,
|
|
82
|
+
});
|
|
83
|
+
await app.register(helmet, {
|
|
84
|
+
contentSecurityPolicy: false,
|
|
85
|
+
crossOriginEmbedderPolicy: false,
|
|
86
|
+
frameguard: false, // Allow embedding in iframes (terminal UI)
|
|
87
|
+
});
|
|
88
|
+
// Health check endpoint
|
|
89
|
+
app.get('/health', async () => {
|
|
90
|
+
return {
|
|
91
|
+
status: 'healthy',
|
|
92
|
+
timestamp: new Date().toISOString(),
|
|
93
|
+
version: '1.0.0',
|
|
94
|
+
uptime: process.uptime(),
|
|
95
|
+
tunnelUrl: getAgentTunnelUrl(),
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
// Agent identity endpoint — returns a stable machine fingerprint so the
|
|
99
|
+
// backend can verify that a tunnel URL reaches the EXPECTED machine.
|
|
100
|
+
// This prevents silent misrouting when a cloudflare quick-tunnel URL
|
|
101
|
+
// is stale or was reassigned.
|
|
102
|
+
app.get('/api/agent-identity', async () => {
|
|
103
|
+
return {
|
|
104
|
+
fingerprint: getMachineFingerprint(),
|
|
105
|
+
hostname: os.hostname(),
|
|
106
|
+
platform: os.platform(),
|
|
107
|
+
arch: os.arch(),
|
|
108
|
+
tunnelUrl: getAgentTunnelUrl(),
|
|
109
|
+
pid: process.pid,
|
|
110
|
+
};
|
|
111
|
+
});
|
|
112
|
+
// Agent API key endpoint — returns the current API key.
|
|
113
|
+
// This is auth-exempt so the key can be retrieved from the agent itself
|
|
114
|
+
// (e.g. by the agent CLI or during initial setup). In production, access
|
|
115
|
+
// should be restricted to localhost via network policy.
|
|
116
|
+
app.get('/api/agent-api-key', async () => {
|
|
117
|
+
return {
|
|
118
|
+
apiKey: agentApiKey,
|
|
119
|
+
generatedAt: new Date().toISOString(),
|
|
120
|
+
note: 'This key changes every time the agent restarts. Store it in the agent configuration in VibeControls.',
|
|
121
|
+
};
|
|
122
|
+
});
|
|
123
|
+
// ── API Key Authentication ─────────────────────────────────────────────
|
|
124
|
+
// Every request (except allowlisted paths) must include the agent API key
|
|
125
|
+
// via `x-agent-api-key` header or `apiKey` query parameter.
|
|
126
|
+
// The key is generated fresh on every agent start/restart.
|
|
127
|
+
const AUTH_EXEMPT_PATHS = new Set(['/health', '/api/agent-identity', '/api/agent-api-key']);
|
|
128
|
+
// Terminal proxy paths are exempt because they're accessed via iframe/WS
|
|
129
|
+
// and the key was already verified when the session was started via the backend.
|
|
130
|
+
const AUTH_EXEMPT_PREFIXES = ['/terminal/'];
|
|
131
|
+
app.addHook('onRequest', async (request, reply) => {
|
|
132
|
+
const url = request.url.split('?')[0]; // strip query string for matching
|
|
133
|
+
// Skip auth for exempt paths
|
|
134
|
+
if (AUTH_EXEMPT_PATHS.has(url))
|
|
135
|
+
return;
|
|
136
|
+
for (const prefix of AUTH_EXEMPT_PREFIXES) {
|
|
137
|
+
if (url.startsWith(prefix))
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// Check API key from header or query param
|
|
141
|
+
const headerKey = request.headers['x-agent-api-key'];
|
|
142
|
+
const queryKey = request.query?.apiKey;
|
|
143
|
+
const providedKey = headerKey || queryKey;
|
|
144
|
+
if (!providedKey || providedKey !== agentApiKey) {
|
|
145
|
+
return reply.code(401).send({
|
|
146
|
+
error: 'Unauthorized',
|
|
147
|
+
message: 'Invalid or missing API key. Provide the agent API key via x-agent-api-key header.',
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// Register routes
|
|
152
|
+
app.register(tmuxRoutes, { prefix: '/api/tmux' });
|
|
153
|
+
app.register(sshRoutes, { prefix: '/api/ssh' });
|
|
154
|
+
app.register(portForwardRoutes, { prefix: '/api/port-forward' });
|
|
155
|
+
app.register(taskRoutes, { prefix: '/api/tasks' });
|
|
156
|
+
app.register(configRoutes, { prefix: '/api/config' });
|
|
157
|
+
app.register(gitRoutes, { prefix: '/api/git' });
|
|
158
|
+
app.register(fileRoutes, { prefix: '/api/files' });
|
|
159
|
+
app.register(bookmarkRoutes, { prefix: '/api/bookmarks' });
|
|
160
|
+
app.register(notificationRoutes, { prefix: '/api/notifications' });
|
|
161
|
+
app.register(projectRoutes, { prefix: '/api/projects' });
|
|
162
|
+
app.register(tunnelRoutes, { prefix: '/api/tunnel' });
|
|
163
|
+
app.register(moduleRegistryRoutes);
|
|
164
|
+
// --- Terminal proxy: forward /terminal/:sessionId/* → ttyd on localhost ---
|
|
165
|
+
// This lets the single agent tunnel proxy all ttyd sessions, removing the need
|
|
166
|
+
// for one cloudflared tunnel per ttyd instance.
|
|
167
|
+
//
|
|
168
|
+
// ttyd uses both HTTP (for its HTML/JS assets) and WebSocket (/ws endpoint).
|
|
169
|
+
// HTTP requests are proxied via fetch(). WebSocket connections are bridged
|
|
170
|
+
// using the `ws` library (WebSocket-to-WebSocket proxy) for reliability.
|
|
171
|
+
app.register(async function terminalProxy(instance) {
|
|
172
|
+
// Helper: resolve ttyd port for a sessionId from the DB
|
|
173
|
+
function resolveTtydPort(sessionId) {
|
|
174
|
+
const session = instance.db.getTmuxSession(sessionId);
|
|
175
|
+
if (!session || !session.ttydPort || !session.ttydPid)
|
|
176
|
+
return null;
|
|
177
|
+
// Verify process is alive
|
|
178
|
+
try {
|
|
179
|
+
process.kill(session.ttydPid, 0);
|
|
180
|
+
return session.ttydPort;
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Helper: proxy an HTTP request to ttyd
|
|
187
|
+
async function proxyToTtyd(request, reply, port, upstreamPath) {
|
|
188
|
+
const fetchInit = {
|
|
189
|
+
method: request.method,
|
|
190
|
+
headers: Object.fromEntries(Object.entries(request.headers)
|
|
191
|
+
.filter(([k, v]) => v != null && !['host', 'connection'].includes(k.toLowerCase()))
|
|
192
|
+
.map(([k, v]) => [k, String(v)])),
|
|
193
|
+
};
|
|
194
|
+
if (request.method !== 'GET' && request.method !== 'HEAD') {
|
|
195
|
+
fetchInit.body = request.body;
|
|
196
|
+
}
|
|
197
|
+
const proxyRes = await fetch(`http://127.0.0.1:${port}${upstreamPath}`, fetchInit);
|
|
198
|
+
reply.code(proxyRes.status);
|
|
199
|
+
for (const [key, value] of proxyRes.headers.entries()) {
|
|
200
|
+
if (!['transfer-encoding', 'connection'].includes(key.toLowerCase())) {
|
|
201
|
+
reply.header(key, value);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
const buf = Buffer.from(await proxyRes.arrayBuffer());
|
|
205
|
+
return reply.send(buf);
|
|
206
|
+
}
|
|
207
|
+
// HTTP proxy for /terminal/:sessionId and /terminal/:sessionId/*
|
|
208
|
+
instance.all('/terminal/:sessionId', async (request, reply) => {
|
|
209
|
+
const { sessionId } = request.params;
|
|
210
|
+
const port = resolveTtydPort(sessionId);
|
|
211
|
+
if (!port)
|
|
212
|
+
return reply.code(502).send({ error: 'Terminal not running for this session' });
|
|
213
|
+
return proxyToTtyd(request, reply, port, '/');
|
|
214
|
+
});
|
|
215
|
+
instance.all('/terminal/:sessionId/*', async (request, reply) => {
|
|
216
|
+
const { sessionId } = request.params;
|
|
217
|
+
const wildcardPath = request.params['*'] || '';
|
|
218
|
+
const port = resolveTtydPort(sessionId);
|
|
219
|
+
if (!port)
|
|
220
|
+
return reply.code(502).send({ error: 'Terminal not running for this session' });
|
|
221
|
+
return proxyToTtyd(request, reply, port, `/${wildcardPath}`);
|
|
222
|
+
});
|
|
223
|
+
// ─── WebSocket proxy for ttyd using the `ws` library ───────────────
|
|
224
|
+
// ttyd uses /ws for its terminal WebSocket. We create a WebSocketServer
|
|
225
|
+
// with noServer mode, intercept upgrade requests matching our path pattern,
|
|
226
|
+
// and bridge the client WS ↔ upstream ttyd WS.
|
|
227
|
+
const terminalWss = new WebSocketServer({
|
|
228
|
+
noServer: true,
|
|
229
|
+
// Handle sub-protocol negotiation: ttyd requires the 'tty' protocol.
|
|
230
|
+
// When the browser sends Sec-WebSocket-Protocol: tty, we must accept it.
|
|
231
|
+
handleProtocols(protocols) {
|
|
232
|
+
if (protocols.has('tty'))
|
|
233
|
+
return 'tty';
|
|
234
|
+
return false;
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
terminalWss.on('connection', (clientWs, req, ttydPort) => {
|
|
238
|
+
// Connect to the local ttyd WebSocket.
|
|
239
|
+
// CRITICAL: ttyd requires the 'tty' sub-protocol. We must forward it
|
|
240
|
+
// from the client's request headers, otherwise ttyd immediately closes
|
|
241
|
+
// the connection.
|
|
242
|
+
const clientProtocols = req.headers['sec-websocket-protocol'];
|
|
243
|
+
const protocols = clientProtocols
|
|
244
|
+
? clientProtocols.split(',').map((p) => p.trim())
|
|
245
|
+
: ['tty']; // Default to 'tty' if browser didn't send it
|
|
246
|
+
const upstreamUrl = `ws://127.0.0.1:${ttydPort}/ws`;
|
|
247
|
+
const upstreamWs = new WebSocket(upstreamUrl, protocols, {
|
|
248
|
+
perMessageDeflate: false,
|
|
249
|
+
});
|
|
250
|
+
let clientAlive = true;
|
|
251
|
+
let upstreamAlive = false;
|
|
252
|
+
// Buffer messages from upstream until bridge is ready
|
|
253
|
+
const upstreamBuffer = [];
|
|
254
|
+
// When upstream ttyd connection opens, flush buffered messages and bridge
|
|
255
|
+
upstreamWs.on('open', () => {
|
|
256
|
+
upstreamAlive = true;
|
|
257
|
+
console.log(`[TerminalProxy] WS bridge established → 127.0.0.1:${ttydPort}/ws (protocol: ${upstreamWs.protocol})`);
|
|
258
|
+
// Flush any buffered messages
|
|
259
|
+
for (const msg of upstreamBuffer) {
|
|
260
|
+
if (clientAlive && clientWs.readyState === WebSocket.OPEN) {
|
|
261
|
+
clientWs.send(msg.data, { binary: msg.isBinary });
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
upstreamBuffer.length = 0;
|
|
265
|
+
});
|
|
266
|
+
// Forward: upstream ttyd → client browser
|
|
267
|
+
upstreamWs.on('message', (data, isBinary) => {
|
|
268
|
+
if (!upstreamAlive) {
|
|
269
|
+
// Buffer until upstream is ready (shouldn't happen, but be safe)
|
|
270
|
+
upstreamBuffer.push({ data, isBinary });
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
if (clientAlive && clientWs.readyState === WebSocket.OPEN) {
|
|
274
|
+
clientWs.send(data, { binary: isBinary });
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
// Forward: client browser → upstream ttyd
|
|
278
|
+
clientWs.on('message', (data, isBinary) => {
|
|
279
|
+
if (upstreamAlive && upstreamWs.readyState === WebSocket.OPEN) {
|
|
280
|
+
upstreamWs.send(data, { binary: isBinary });
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
// Handle close in both directions
|
|
284
|
+
clientWs.on('close', (code, reason) => {
|
|
285
|
+
clientAlive = false;
|
|
286
|
+
console.log(`[TerminalProxy] Client WS closed (code=${code})`);
|
|
287
|
+
if (upstreamWs.readyState === WebSocket.OPEN || upstreamWs.readyState === WebSocket.CONNECTING) {
|
|
288
|
+
upstreamWs.close(1000, 'Client disconnected');
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
upstreamWs.on('close', (code, reason) => {
|
|
292
|
+
upstreamAlive = false;
|
|
293
|
+
console.log(`[TerminalProxy] Upstream ttyd WS closed (code=${code})`);
|
|
294
|
+
if (clientWs.readyState === WebSocket.OPEN || clientWs.readyState === WebSocket.CONNECTING) {
|
|
295
|
+
clientWs.close(1000, 'Upstream closed');
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
// Handle errors
|
|
299
|
+
clientWs.on('error', (err) => {
|
|
300
|
+
console.error('[TerminalProxy] Client WS error:', err.message);
|
|
301
|
+
clientAlive = false;
|
|
302
|
+
if (upstreamWs.readyState === WebSocket.OPEN)
|
|
303
|
+
upstreamWs.close();
|
|
304
|
+
});
|
|
305
|
+
upstreamWs.on('error', (err) => {
|
|
306
|
+
console.error('[TerminalProxy] Upstream WS error:', err.message);
|
|
307
|
+
upstreamAlive = false;
|
|
308
|
+
if (clientWs.readyState === WebSocket.OPEN) {
|
|
309
|
+
clientWs.close(1011, 'Upstream error');
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
// Store the WSS and port resolver on the HTTP server so the master
|
|
314
|
+
// upgrade handler (installed after Socket.IO) can access them.
|
|
315
|
+
instance.server._terminalWss = terminalWss;
|
|
316
|
+
instance.server._resolveTtydPort = resolveTtydPort;
|
|
317
|
+
});
|
|
318
|
+
// --- Agent tunnel management endpoints ---
|
|
319
|
+
app.get('/api/agent-tunnel', async () => {
|
|
320
|
+
return {
|
|
321
|
+
tunnelUrl: getAgentTunnelUrl(),
|
|
322
|
+
status: getAgentTunnelUrl() ? 'active' : 'inactive',
|
|
323
|
+
};
|
|
324
|
+
});
|
|
325
|
+
app.post('/api/agent-tunnel/start', async (_request, reply) => {
|
|
326
|
+
try {
|
|
327
|
+
const port = Number(process.env.PORT || 3005);
|
|
328
|
+
const url = await startAgentTunnel(port);
|
|
329
|
+
return { tunnelUrl: url, status: 'active' };
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
return reply.code(500).send({
|
|
333
|
+
error: 'Failed to start agent tunnel',
|
|
334
|
+
details: err instanceof Error ? err.message : String(err),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
app.post('/api/agent-tunnel/stop', async () => {
|
|
339
|
+
stopAgentTunnel();
|
|
340
|
+
return { status: 'inactive' };
|
|
341
|
+
});
|
|
342
|
+
// Setup/bootstrap endpoint - check and install dependencies
|
|
343
|
+
app.get('/api/setup/check', async () => {
|
|
344
|
+
return { dependencies: checkDependencies() };
|
|
345
|
+
});
|
|
346
|
+
app.post('/api/setup/install', async () => {
|
|
347
|
+
const results = await bootstrap({ verbose: false });
|
|
348
|
+
const failed = results.filter(r => r.status === 'failed');
|
|
349
|
+
return {
|
|
350
|
+
success: failed.length === 0,
|
|
351
|
+
results,
|
|
352
|
+
message: failed.length === 0
|
|
353
|
+
? 'All dependencies installed successfully'
|
|
354
|
+
: `Failed to install: ${failed.map(f => f.tool).join(', ')}`,
|
|
355
|
+
};
|
|
356
|
+
});
|
|
357
|
+
// Version endpoint
|
|
358
|
+
app.get('/api/version', async (_request, _reply) => {
|
|
359
|
+
const packageJson = await import('../package.json', { assert: { type: 'json' } });
|
|
360
|
+
return {
|
|
361
|
+
name: packageJson.default.name,
|
|
362
|
+
version: packageJson.default.version,
|
|
363
|
+
nodeVersion: process.version,
|
|
364
|
+
platform: process.platform,
|
|
365
|
+
arch: process.arch,
|
|
366
|
+
uptime: process.uptime(),
|
|
367
|
+
apiVersion: 'v1'
|
|
368
|
+
};
|
|
369
|
+
});
|
|
370
|
+
// Socket.io for real-time updates
|
|
371
|
+
const io = new SocketIOServer(app.server, {
|
|
372
|
+
cors: {
|
|
373
|
+
origin: process.env.CORS_ORIGIN || true,
|
|
374
|
+
credentials: true
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
io.on('connection', (socket) => {
|
|
378
|
+
console.log('Client connected:', socket.id);
|
|
379
|
+
socket.on('subscribe', (channel) => {
|
|
380
|
+
socket.join(channel);
|
|
381
|
+
console.log(`Client ${socket.id} subscribed to ${channel}`);
|
|
382
|
+
});
|
|
383
|
+
socket.on('unsubscribe', (channel) => {
|
|
384
|
+
socket.leave(channel);
|
|
385
|
+
console.log(`Client ${socket.id} unsubscribed from ${channel}`);
|
|
386
|
+
});
|
|
387
|
+
socket.on('disconnect', () => {
|
|
388
|
+
console.log('Client disconnected:', socket.id);
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
// Make io available to routes
|
|
392
|
+
app.decorate('io', io);
|
|
393
|
+
// ── Terminal WebSocket upgrade handler ──────────────────────────────
|
|
394
|
+
// Install this in onReady hook so that:
|
|
395
|
+
// 1. Fastify plugins (including terminalProxy) have initialized
|
|
396
|
+
// 2. Socket.IO has attached its upgrade listener
|
|
397
|
+
// We replace ALL upgrade listeners with a single master handler that
|
|
398
|
+
// routes terminal WS to our WSS and everything else to Socket.IO.
|
|
399
|
+
app.addHook('onReady', async () => {
|
|
400
|
+
const terminalWss = app.server._terminalWss;
|
|
401
|
+
const resolveTtydPort = app.server._resolveTtydPort;
|
|
402
|
+
if (terminalWss && resolveTtydPort) {
|
|
403
|
+
// Grab all current upgrade listeners (Socket.IO's handler)
|
|
404
|
+
const existingUpgradeListeners = app.server.listeners('upgrade').slice();
|
|
405
|
+
// Remove them all
|
|
406
|
+
app.server.removeAllListeners('upgrade');
|
|
407
|
+
// Add a single master upgrade handler
|
|
408
|
+
app.server.on('upgrade', (req, socket, head) => {
|
|
409
|
+
const match = req.url?.match(/^\/terminal\/([^/]+)\/ws/);
|
|
410
|
+
if (match) {
|
|
411
|
+
// Terminal WebSocket — handle with our WSS
|
|
412
|
+
const sessionId = match[1];
|
|
413
|
+
const port = resolveTtydPort(sessionId);
|
|
414
|
+
if (!port) {
|
|
415
|
+
console.warn(`[TerminalProxy] No ttyd running for session ${sessionId}, rejecting`);
|
|
416
|
+
socket.write('HTTP/1.1 502 Bad Gateway\r\n\r\n');
|
|
417
|
+
socket.destroy();
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
console.log(`[TerminalProxy] Upgrading WS for session ${sessionId} → ttyd port ${port}`);
|
|
421
|
+
terminalWss.handleUpgrade(req, socket, head, (ws) => {
|
|
422
|
+
terminalWss.emit('connection', ws, req, port);
|
|
423
|
+
});
|
|
424
|
+
// Do NOT call other handlers — terminal WS is fully handled
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
// Not a terminal path — pass to Socket.IO and other handlers
|
|
428
|
+
for (const listener of existingUpgradeListeners) {
|
|
429
|
+
listener.call(app.server, req, socket, head);
|
|
430
|
+
}
|
|
431
|
+
});
|
|
432
|
+
console.log('[App] Terminal WS upgrade handler installed (master handler replaces Socket.IO)');
|
|
433
|
+
}
|
|
434
|
+
else {
|
|
435
|
+
console.warn('[App] Terminal proxy not initialized — WS upgrade handler not installed');
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
// Graceful shutdown
|
|
439
|
+
app.addHook('onClose', async () => {
|
|
440
|
+
db.close();
|
|
441
|
+
io.close();
|
|
442
|
+
});
|
|
443
|
+
return app;
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=app.js.map
|
package/dist/app.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC"}
|