@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.
Files changed (100) hide show
  1. package/.env.example +8 -0
  2. package/LICENSE +22 -0
  3. package/README.md +290 -0
  4. package/dist/app.d.ts +15 -0
  5. package/dist/app.d.ts.map +1 -0
  6. package/dist/app.js +445 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +1043 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/db/schema.d.ts +145 -0
  13. package/dist/db/schema.d.ts.map +1 -0
  14. package/dist/db/schema.js +536 -0
  15. package/dist/db/schema.js.map +1 -0
  16. package/dist/index.d.ts +2 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +61 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/middleware/ModuleAuth.d.ts +61 -0
  21. package/dist/middleware/ModuleAuth.d.ts.map +1 -0
  22. package/dist/middleware/ModuleAuth.js +220 -0
  23. package/dist/middleware/ModuleAuth.js.map +1 -0
  24. package/dist/middleware/auth.d.ts +3 -0
  25. package/dist/middleware/auth.d.ts.map +1 -0
  26. package/dist/middleware/auth.js +11 -0
  27. package/dist/middleware/auth.js.map +1 -0
  28. package/dist/migrations/remove-notes-prompts.d.ts +13 -0
  29. package/dist/migrations/remove-notes-prompts.d.ts.map +1 -0
  30. package/dist/migrations/remove-notes-prompts.js +148 -0
  31. package/dist/migrations/remove-notes-prompts.js.map +1 -0
  32. package/dist/routes/bookmarks.d.ts +3 -0
  33. package/dist/routes/bookmarks.d.ts.map +1 -0
  34. package/dist/routes/bookmarks.js +186 -0
  35. package/dist/routes/bookmarks.js.map +1 -0
  36. package/dist/routes/config.d.ts +3 -0
  37. package/dist/routes/config.d.ts.map +1 -0
  38. package/dist/routes/config.js +108 -0
  39. package/dist/routes/config.js.map +1 -0
  40. package/dist/routes/files.d.ts +3 -0
  41. package/dist/routes/files.d.ts.map +1 -0
  42. package/dist/routes/files.js +471 -0
  43. package/dist/routes/files.js.map +1 -0
  44. package/dist/routes/git.d.ts +3 -0
  45. package/dist/routes/git.d.ts.map +1 -0
  46. package/dist/routes/git.js +498 -0
  47. package/dist/routes/git.js.map +1 -0
  48. package/dist/routes/moduleRegistry.d.ts +41 -0
  49. package/dist/routes/moduleRegistry.d.ts.map +1 -0
  50. package/dist/routes/moduleRegistry.js +356 -0
  51. package/dist/routes/moduleRegistry.js.map +1 -0
  52. package/dist/routes/notifications.d.ts +3 -0
  53. package/dist/routes/notifications.d.ts.map +1 -0
  54. package/dist/routes/notifications.js +250 -0
  55. package/dist/routes/notifications.js.map +1 -0
  56. package/dist/routes/port-forward.d.ts +3 -0
  57. package/dist/routes/port-forward.d.ts.map +1 -0
  58. package/dist/routes/port-forward.js +205 -0
  59. package/dist/routes/port-forward.js.map +1 -0
  60. package/dist/routes/projects.d.ts +3 -0
  61. package/dist/routes/projects.d.ts.map +1 -0
  62. package/dist/routes/projects.js +442 -0
  63. package/dist/routes/projects.js.map +1 -0
  64. package/dist/routes/ssh.d.ts +3 -0
  65. package/dist/routes/ssh.d.ts.map +1 -0
  66. package/dist/routes/ssh.js +192 -0
  67. package/dist/routes/ssh.js.map +1 -0
  68. package/dist/routes/tasks.d.ts +3 -0
  69. package/dist/routes/tasks.d.ts.map +1 -0
  70. package/dist/routes/tasks.js +183 -0
  71. package/dist/routes/tasks.js.map +1 -0
  72. package/dist/routes/tmux.d.ts +3 -0
  73. package/dist/routes/tmux.d.ts.map +1 -0
  74. package/dist/routes/tmux.js +1191 -0
  75. package/dist/routes/tmux.js.map +1 -0
  76. package/dist/routes/tunnel.d.ts +25 -0
  77. package/dist/routes/tunnel.d.ts.map +1 -0
  78. package/dist/routes/tunnel.js +449 -0
  79. package/dist/routes/tunnel.js.map +1 -0
  80. package/dist/services/ModulePermissions.d.ts +100 -0
  81. package/dist/services/ModulePermissions.d.ts.map +1 -0
  82. package/dist/services/ModulePermissions.js +312 -0
  83. package/dist/services/ModulePermissions.js.map +1 -0
  84. package/dist/services/ModuleRegistryService.d.ts +152 -0
  85. package/dist/services/ModuleRegistryService.d.ts.map +1 -0
  86. package/dist/services/ModuleRegistryService.js +522 -0
  87. package/dist/services/ModuleRegistryService.js.map +1 -0
  88. package/dist/services/agent.service.d.ts +19 -0
  89. package/dist/services/agent.service.d.ts.map +1 -0
  90. package/dist/services/agent.service.js +88 -0
  91. package/dist/services/agent.service.js.map +1 -0
  92. package/dist/services/bootstrap.d.ts +22 -0
  93. package/dist/services/bootstrap.d.ts.map +1 -0
  94. package/dist/services/bootstrap.js +206 -0
  95. package/dist/services/bootstrap.js.map +1 -0
  96. package/dist/services/service-manager.d.ts +50 -0
  97. package/dist/services/service-manager.d.ts.map +1 -0
  98. package/dist/services/service-manager.js +382 -0
  99. package/dist/services/service-manager.js.map +1 -0
  100. 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
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC"}