genbox-agent 1.0.39 → 1.0.41

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 (67) hide show
  1. package/dist/hook.d.ts +6 -5
  2. package/dist/hook.d.ts.map +1 -1
  3. package/dist/hook.js +200 -81
  4. package/dist/hook.js.map +1 -1
  5. package/dist/hooks/daemon-client.d.ts +39 -0
  6. package/dist/hooks/daemon-client.d.ts.map +1 -0
  7. package/dist/hooks/daemon-client.js +238 -0
  8. package/dist/hooks/daemon-client.js.map +1 -0
  9. package/dist/hooks/index.d.ts +7 -0
  10. package/dist/hooks/index.d.ts.map +1 -0
  11. package/dist/hooks/index.js +23 -0
  12. package/dist/hooks/index.js.map +1 -0
  13. package/dist/server/auth.d.ts +51 -0
  14. package/dist/server/auth.d.ts.map +1 -0
  15. package/dist/server/auth.js +154 -0
  16. package/dist/server/auth.js.map +1 -0
  17. package/dist/server/index.d.ts +156 -0
  18. package/dist/server/index.d.ts.map +1 -0
  19. package/dist/server/index.js +595 -0
  20. package/dist/server/index.js.map +1 -0
  21. package/dist/server/port-finder.d.ts +45 -0
  22. package/dist/server/port-finder.d.ts.map +1 -0
  23. package/dist/server/port-finder.js +267 -0
  24. package/dist/server/port-finder.js.map +1 -0
  25. package/dist/storage/index.d.ts +82 -0
  26. package/dist/storage/index.d.ts.map +1 -0
  27. package/dist/storage/index.js +209 -0
  28. package/dist/storage/index.js.map +1 -0
  29. package/dist/storage/manager.d.ts +112 -0
  30. package/dist/storage/manager.d.ts.map +1 -0
  31. package/dist/storage/manager.js +200 -0
  32. package/dist/storage/manager.js.map +1 -0
  33. package/dist/storage/repositories/events.d.ts +101 -0
  34. package/dist/storage/repositories/events.d.ts.map +1 -0
  35. package/dist/storage/repositories/events.js +258 -0
  36. package/dist/storage/repositories/events.js.map +1 -0
  37. package/dist/storage/repositories/index.d.ts +9 -0
  38. package/dist/storage/repositories/index.d.ts.map +1 -0
  39. package/dist/storage/repositories/index.js +25 -0
  40. package/dist/storage/repositories/index.js.map +1 -0
  41. package/dist/storage/repositories/messages.d.ts +123 -0
  42. package/dist/storage/repositories/messages.d.ts.map +1 -0
  43. package/dist/storage/repositories/messages.js +209 -0
  44. package/dist/storage/repositories/messages.js.map +1 -0
  45. package/dist/storage/repositories/sessions.d.ts +158 -0
  46. package/dist/storage/repositories/sessions.d.ts.map +1 -0
  47. package/dist/storage/repositories/sessions.js +342 -0
  48. package/dist/storage/repositories/sessions.js.map +1 -0
  49. package/dist/storage/schema.d.ts +42 -0
  50. package/dist/storage/schema.d.ts.map +1 -0
  51. package/dist/storage/schema.js +278 -0
  52. package/dist/storage/schema.js.map +1 -0
  53. package/dist/sync/background-sync.d.ts +83 -0
  54. package/dist/sync/background-sync.d.ts.map +1 -0
  55. package/dist/sync/background-sync.js +367 -0
  56. package/dist/sync/background-sync.js.map +1 -0
  57. package/dist/sync/index.d.ts +7 -0
  58. package/dist/sync/index.d.ts.map +1 -0
  59. package/dist/sync/index.js +23 -0
  60. package/dist/sync/index.js.map +1 -0
  61. package/dist/unified-daemon.js +219 -0
  62. package/dist/unified-daemon.js.map +1 -1
  63. package/dist/unified-hook.d.ts +4 -3
  64. package/dist/unified-hook.d.ts.map +1 -1
  65. package/dist/unified-hook.js +155 -31
  66. package/dist/unified-hook.js.map +1 -1
  67. package/package.json +4 -1
@@ -0,0 +1,595 @@
1
+ "use strict";
2
+ /**
3
+ * Genbox Agent Local Server
4
+ *
5
+ * HTTP + WebSocket server that runs on genbox VMs and local machines.
6
+ * Provides direct access to session management, output streaming, and stats.
7
+ *
8
+ * This enables edge-first architecture where:
9
+ * - Clients connect directly to genbox for real-time data
10
+ * - API server only handles registry + historical sync
11
+ * - Reduces load on central API server
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.AgentServer = exports.BASE_PORT = void 0;
48
+ const http = __importStar(require("http"));
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const socket_io_1 = require("socket.io");
52
+ const port_finder_1 = require("./port-finder");
53
+ const auth_1 = require("./auth");
54
+ // Re-export for external use
55
+ var port_finder_2 = require("./port-finder");
56
+ Object.defineProperty(exports, "BASE_PORT", { enumerable: true, get: function () { return port_finder_2.BASE_PORT; } });
57
+ // Port file location for hooks to find the daemon
58
+ const PORT_FILE = path.join(process.env.HOME || '/tmp', '.genbox-daemon-port');
59
+ /**
60
+ * Local Agent Server
61
+ * Exposes daemon functionality via HTTP/WebSocket
62
+ */
63
+ class AgentServer {
64
+ config;
65
+ handlers;
66
+ httpServer = null;
67
+ io = null;
68
+ port = 0;
69
+ running = false;
70
+ outputPollers = new Map();
71
+ connectedClients = new Set();
72
+ storageManager = null;
73
+ constructor(config, handlers) {
74
+ this.config = config;
75
+ this.handlers = handlers;
76
+ }
77
+ /**
78
+ * Set the storage manager for event recording
79
+ */
80
+ setStorageManager(manager) {
81
+ this.storageManager = manager;
82
+ }
83
+ /**
84
+ * Start the server
85
+ */
86
+ async start() {
87
+ if (this.running) {
88
+ console.log('[server] Already running');
89
+ return this.port;
90
+ }
91
+ // Find available port
92
+ this.port = await (0, port_finder_1.findAndLockPort)(this.config.port || port_finder_1.BASE_PORT);
93
+ if (this.port === 0) {
94
+ throw new Error('Failed to find available port');
95
+ }
96
+ // Create HTTP server
97
+ this.httpServer = http.createServer((req, res) => {
98
+ this.handleHttpRequest(req, res);
99
+ });
100
+ // Create WebSocket server
101
+ this.io = new socket_io_1.Server(this.httpServer, {
102
+ cors: this.config.enableCors ? {
103
+ origin: '*',
104
+ methods: ['GET', 'POST'],
105
+ } : undefined,
106
+ transports: ['websocket', 'polling'],
107
+ });
108
+ // Handle WebSocket connections
109
+ this.io.on('connection', (socket) => {
110
+ this.handleSocketConnection(socket);
111
+ });
112
+ // Start listening
113
+ return new Promise((resolve, reject) => {
114
+ const host = this.config.host || '0.0.0.0';
115
+ this.httpServer.once('error', (err) => {
116
+ console.error(`[server] Failed to start: ${err.message}`);
117
+ (0, port_finder_1.removePortLock)(this.port);
118
+ reject(err);
119
+ });
120
+ this.httpServer.listen(this.port, host, () => {
121
+ this.running = true;
122
+ // Write port to file for hooks to find
123
+ try {
124
+ fs.writeFileSync(PORT_FILE, String(this.port));
125
+ }
126
+ catch (err) {
127
+ console.warn(`[server] Failed to write port file: ${err}`);
128
+ }
129
+ console.log(`[server] Listening on ${host}:${this.port}`);
130
+ resolve(this.port);
131
+ });
132
+ });
133
+ }
134
+ /**
135
+ * Stop the server
136
+ */
137
+ async stop() {
138
+ if (!this.running)
139
+ return;
140
+ this.running = false;
141
+ // Stop all output pollers
142
+ for (const [sessionId, poller] of this.outputPollers) {
143
+ clearInterval(poller);
144
+ }
145
+ this.outputPollers.clear();
146
+ // Disconnect all clients
147
+ for (const socket of this.connectedClients) {
148
+ socket.disconnect(true);
149
+ }
150
+ this.connectedClients.clear();
151
+ // Close socket.io
152
+ if (this.io) {
153
+ this.io.close();
154
+ this.io = null;
155
+ }
156
+ // Close HTTP server
157
+ if (this.httpServer) {
158
+ await new Promise((resolve) => {
159
+ this.httpServer.close(() => resolve());
160
+ });
161
+ this.httpServer = null;
162
+ }
163
+ // Release port lock
164
+ (0, port_finder_1.removePortLock)(this.port);
165
+ // Remove port file
166
+ try {
167
+ if (fs.existsSync(PORT_FILE)) {
168
+ fs.unlinkSync(PORT_FILE);
169
+ }
170
+ }
171
+ catch {
172
+ // Ignore errors
173
+ }
174
+ console.log('[server] Stopped');
175
+ }
176
+ /**
177
+ * Get the port the server is running on
178
+ */
179
+ getPort() {
180
+ return this.port;
181
+ }
182
+ /**
183
+ * Check if server is running
184
+ */
185
+ isRunning() {
186
+ return this.running;
187
+ }
188
+ /**
189
+ * Broadcast output update to all connected clients
190
+ */
191
+ broadcastOutput(sessionId, output, status) {
192
+ this.io?.emit('output', {
193
+ sessionId,
194
+ output,
195
+ status,
196
+ timestamp: Date.now(),
197
+ });
198
+ }
199
+ /**
200
+ * Broadcast system stats to all connected clients
201
+ */
202
+ broadcastStats(stats) {
203
+ this.io?.emit('stats', {
204
+ stats,
205
+ timestamp: Date.now(),
206
+ });
207
+ }
208
+ /**
209
+ * Broadcast session event to all connected clients
210
+ */
211
+ broadcastEvent(event) {
212
+ this.io?.emit('event', {
213
+ ...event,
214
+ timestamp: Date.now(),
215
+ });
216
+ }
217
+ /**
218
+ * Handle HTTP request
219
+ */
220
+ handleHttpRequest(req, res) {
221
+ const url = new URL(req.url || '/', `http://${req.headers.host}`);
222
+ const path = url.pathname;
223
+ const method = req.method?.toUpperCase() || 'GET';
224
+ // CORS headers
225
+ if (this.config.enableCors) {
226
+ res.setHeader('Access-Control-Allow-Origin', '*');
227
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE, OPTIONS');
228
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Control-Token');
229
+ }
230
+ // Handle OPTIONS preflight
231
+ if (method === 'OPTIONS') {
232
+ res.writeHead(204);
233
+ res.end();
234
+ return;
235
+ }
236
+ // Health check (no auth required)
237
+ if (path === '/health' && method === 'GET') {
238
+ this.handleHealth(req, res);
239
+ return;
240
+ }
241
+ // Authenticate all other requests
242
+ const authContext = this.authenticate(req);
243
+ if (!authContext.authenticated) {
244
+ this.sendError(res, 401, 'Unauthorized');
245
+ return;
246
+ }
247
+ // Route request
248
+ try {
249
+ if (path === '/api/sessions' && method === 'GET') {
250
+ this.handleListSessions(req, res);
251
+ }
252
+ else if (path.startsWith('/api/sessions/') && method === 'GET') {
253
+ const sessionId = path.split('/')[3];
254
+ if (path.endsWith('/output')) {
255
+ this.handleGetOutput(req, res, sessionId.replace('/output', ''), url);
256
+ }
257
+ else {
258
+ this.handleGetSession(req, res, sessionId);
259
+ }
260
+ }
261
+ else if (path.startsWith('/api/sessions/') && method === 'POST') {
262
+ const parts = path.split('/');
263
+ const sessionId = parts[3];
264
+ const action = parts[4];
265
+ if (action === 'prompt') {
266
+ this.handleSendPrompt(req, res, sessionId);
267
+ }
268
+ else if (action === 'keystroke') {
269
+ this.handleSendKeystroke(req, res, sessionId);
270
+ }
271
+ else {
272
+ this.sendError(res, 404, 'Not Found');
273
+ }
274
+ }
275
+ else if (path === '/api/sessions' && method === 'POST') {
276
+ this.handleCreateSession(req, res);
277
+ }
278
+ else if (path.startsWith('/api/sessions/') && method === 'DELETE') {
279
+ const sessionId = path.split('/')[3];
280
+ this.handleKillSession(req, res, sessionId);
281
+ }
282
+ else if (path === '/api/stats' && method === 'GET') {
283
+ this.handleGetStats(req, res);
284
+ }
285
+ else if (path === '/api/events' && method === 'POST') {
286
+ this.handleRecordEvent(req, res);
287
+ }
288
+ else if (path === '/api/storage/stats' && method === 'GET') {
289
+ this.handleStorageStats(req, res);
290
+ }
291
+ else if (path === '/api/storage/pending' && method === 'GET') {
292
+ this.handlePendingSync(req, res);
293
+ }
294
+ else {
295
+ this.sendError(res, 404, 'Not Found');
296
+ }
297
+ }
298
+ catch (err) {
299
+ console.error(`[server] Error handling request: ${err.message}`);
300
+ this.sendError(res, 500, 'Internal Server Error');
301
+ }
302
+ }
303
+ /**
304
+ * Authenticate request
305
+ */
306
+ authenticate(req) {
307
+ const controlToken = req.headers['x-control-token'];
308
+ const authHeader = req.headers['authorization'];
309
+ // Try control token first
310
+ if (controlToken && this.config.controlToken) {
311
+ return (0, auth_1.validateControlToken)(controlToken, this.config.controlToken);
312
+ }
313
+ // Try Bearer token (API key)
314
+ if (authHeader?.startsWith('Bearer ') && this.config.apiKey) {
315
+ const token = authHeader.slice(7);
316
+ return (0, auth_1.validateApiKey)(token, this.config.apiKey);
317
+ }
318
+ // No auth configured = allow all (local mode)
319
+ if (!this.config.controlToken && !this.config.apiKey) {
320
+ return { authenticated: true, type: 'none' };
321
+ }
322
+ return { authenticated: false };
323
+ }
324
+ /**
325
+ * Handle WebSocket connection
326
+ */
327
+ handleSocketConnection(socket) {
328
+ console.log(`[server] Client connected: ${socket.id}`);
329
+ this.connectedClients.add(socket);
330
+ // Authenticate
331
+ const controlToken = socket.handshake.auth?.controlToken || socket.handshake.query?.controlToken;
332
+ if (this.config.controlToken && controlToken !== this.config.controlToken) {
333
+ console.log(`[server] Client ${socket.id} failed authentication`);
334
+ socket.disconnect(true);
335
+ return;
336
+ }
337
+ // Send initial data
338
+ socket.emit('connected', {
339
+ genboxId: this.config.genboxId,
340
+ port: this.port,
341
+ sessions: this.handlers.listSessions(),
342
+ stats: this.handlers.getSystemStats(),
343
+ });
344
+ // Handle subscribe to session output
345
+ socket.on('subscribe', (data) => {
346
+ if (data.sessionId) {
347
+ this.startOutputPolling(data.sessionId);
348
+ socket.join(`session:${data.sessionId}`);
349
+ console.log(`[server] Client ${socket.id} subscribed to session ${data.sessionId}`);
350
+ }
351
+ });
352
+ // Handle unsubscribe
353
+ socket.on('unsubscribe', (data) => {
354
+ if (data.sessionId) {
355
+ socket.leave(`session:${data.sessionId}`);
356
+ console.log(`[server] Client ${socket.id} unsubscribed from session ${data.sessionId}`);
357
+ }
358
+ });
359
+ // Handle send prompt
360
+ socket.on('prompt', (data) => {
361
+ const success = this.handlers.sendPrompt(data.sessionId, data.prompt);
362
+ socket.emit('prompt_result', { sessionId: data.sessionId, success });
363
+ });
364
+ // Handle send keystroke
365
+ socket.on('keystroke', (data) => {
366
+ const success = this.handlers.sendKeystroke(data.sessionId, data.key);
367
+ socket.emit('keystroke_result', { sessionId: data.sessionId, success });
368
+ });
369
+ // Handle create session
370
+ socket.on('create_session', (data) => {
371
+ const session = this.handlers.createSession(data.projectPath, data.provider);
372
+ socket.emit('session_created', { success: !!session, session });
373
+ });
374
+ // Handle kill session
375
+ socket.on('kill_session', (data) => {
376
+ const success = this.handlers.killSession(data.sessionId);
377
+ socket.emit('session_killed', { sessionId: data.sessionId, success });
378
+ });
379
+ // Handle disconnect
380
+ socket.on('disconnect', () => {
381
+ console.log(`[server] Client disconnected: ${socket.id}`);
382
+ this.connectedClients.delete(socket);
383
+ });
384
+ }
385
+ /**
386
+ * Start polling output for a session
387
+ */
388
+ startOutputPolling(sessionId) {
389
+ if (this.outputPollers.has(sessionId))
390
+ return;
391
+ let lastOutput = '';
392
+ const poller = setInterval(() => {
393
+ if (!this.running) {
394
+ this.stopOutputPolling(sessionId);
395
+ return;
396
+ }
397
+ const output = this.handlers.getSessionOutput(sessionId, 100);
398
+ const status = this.handlers.getSessionStatus(sessionId);
399
+ if (output && output !== lastOutput) {
400
+ lastOutput = output;
401
+ // Emit to room for this session
402
+ this.io?.to(`session:${sessionId}`).emit('output', {
403
+ sessionId,
404
+ output,
405
+ status,
406
+ timestamp: Date.now(),
407
+ });
408
+ }
409
+ if (status === 'ended') {
410
+ this.stopOutputPolling(sessionId);
411
+ }
412
+ }, 500);
413
+ this.outputPollers.set(sessionId, poller);
414
+ }
415
+ /**
416
+ * Stop polling output for a session
417
+ */
418
+ stopOutputPolling(sessionId) {
419
+ const poller = this.outputPollers.get(sessionId);
420
+ if (poller) {
421
+ clearInterval(poller);
422
+ this.outputPollers.delete(sessionId);
423
+ }
424
+ }
425
+ // HTTP Handlers
426
+ handleHealth(req, res) {
427
+ const stats = this.handlers.getSystemStats();
428
+ this.sendJson(res, 200, {
429
+ status: 'ok',
430
+ genboxId: this.config.genboxId,
431
+ port: this.port,
432
+ uptime: stats?.uptimeSeconds || 0,
433
+ version: '1.0.0',
434
+ timestamp: Date.now(),
435
+ });
436
+ }
437
+ handleListSessions(req, res) {
438
+ const sessions = this.handlers.listSessions();
439
+ this.sendJson(res, 200, { sessions });
440
+ }
441
+ handleGetSession(req, res, sessionId) {
442
+ const session = this.handlers.getSession(sessionId);
443
+ if (!session) {
444
+ this.sendError(res, 404, 'Session not found');
445
+ return;
446
+ }
447
+ const output = this.handlers.getSessionOutput(sessionId, 100);
448
+ const status = this.handlers.getSessionStatus(sessionId);
449
+ this.sendJson(res, 200, { ...session, output, status });
450
+ }
451
+ handleGetOutput(req, res, sessionId, url) {
452
+ const lines = parseInt(url.searchParams.get('lines') || '100', 10);
453
+ const output = this.handlers.getSessionOutput(sessionId, lines);
454
+ const status = this.handlers.getSessionStatus(sessionId);
455
+ if (output === null) {
456
+ this.sendError(res, 404, 'Session not found');
457
+ return;
458
+ }
459
+ this.sendJson(res, 200, { sessionId, output, status });
460
+ }
461
+ handleSendPrompt(req, res, sessionId) {
462
+ this.readBody(req, (body) => {
463
+ const { prompt } = body;
464
+ if (!prompt) {
465
+ this.sendError(res, 400, 'Missing prompt');
466
+ return;
467
+ }
468
+ const success = this.handlers.sendPrompt(sessionId, prompt);
469
+ this.sendJson(res, success ? 200 : 500, { success });
470
+ });
471
+ }
472
+ handleSendKeystroke(req, res, sessionId) {
473
+ this.readBody(req, (body) => {
474
+ const { key } = body;
475
+ if (!key) {
476
+ this.sendError(res, 400, 'Missing key');
477
+ return;
478
+ }
479
+ const success = this.handlers.sendKeystroke(sessionId, key);
480
+ this.sendJson(res, success ? 200 : 500, { success });
481
+ });
482
+ }
483
+ handleCreateSession(req, res) {
484
+ this.readBody(req, (body) => {
485
+ const { projectPath = process.cwd(), provider } = body;
486
+ const session = this.handlers.createSession(projectPath, provider);
487
+ if (!session) {
488
+ this.sendError(res, 500, 'Failed to create session');
489
+ return;
490
+ }
491
+ this.sendJson(res, 201, { success: true, session });
492
+ });
493
+ }
494
+ handleKillSession(req, res, sessionId) {
495
+ const success = this.handlers.killSession(sessionId);
496
+ this.stopOutputPolling(sessionId);
497
+ this.sendJson(res, success ? 200 : 404, { success });
498
+ }
499
+ handleGetStats(req, res) {
500
+ const stats = this.handlers.getSystemStats();
501
+ this.sendJson(res, 200, { stats });
502
+ }
503
+ /**
504
+ * Handle recording a hook event
505
+ */
506
+ handleRecordEvent(req, res) {
507
+ if (!this.storageManager) {
508
+ this.sendError(res, 503, 'Storage not available');
509
+ return;
510
+ }
511
+ this.readBody(req, (body) => {
512
+ const { eventType, sessionId, provider = 'claude', projectPath, data, inputTokens, outputTokens, cacheReadTokens, cacheWriteTokens, contextTokens, costCents, } = body;
513
+ if (!eventType || !sessionId) {
514
+ this.sendError(res, 400, 'Missing eventType or sessionId');
515
+ return;
516
+ }
517
+ try {
518
+ const result = this.storageManager.recordHookEvent({
519
+ sessionId,
520
+ eventType: eventType,
521
+ provider: provider,
522
+ projectPath,
523
+ data,
524
+ inputTokens,
525
+ outputTokens,
526
+ cacheReadTokens,
527
+ cacheWriteTokens,
528
+ contextTokens,
529
+ costCents,
530
+ });
531
+ // Broadcast to connected clients
532
+ this.broadcastEvent({
533
+ type: eventType,
534
+ sessionId,
535
+ data,
536
+ });
537
+ this.sendJson(res, 201, {
538
+ success: true,
539
+ sessionId: result.session.id,
540
+ eventId: result.event.id,
541
+ });
542
+ }
543
+ catch (err) {
544
+ console.error(`[server] Failed to record event: ${err.message}`);
545
+ this.sendError(res, 500, 'Failed to record event');
546
+ }
547
+ });
548
+ }
549
+ /**
550
+ * Handle getting storage stats
551
+ */
552
+ handleStorageStats(req, res) {
553
+ if (!this.storageManager) {
554
+ this.sendError(res, 503, 'Storage not available');
555
+ return;
556
+ }
557
+ const stats = this.storageManager.getStats();
558
+ this.sendJson(res, 200, { stats });
559
+ }
560
+ /**
561
+ * Handle getting pending sync counts
562
+ */
563
+ handlePendingSync(req, res) {
564
+ if (!this.storageManager) {
565
+ this.sendError(res, 503, 'Storage not available');
566
+ return;
567
+ }
568
+ const pending = this.storageManager.getPendingSyncCounts();
569
+ this.sendJson(res, 200, { pending });
570
+ }
571
+ // Utility methods
572
+ sendJson(res, status, data) {
573
+ res.writeHead(status, { 'Content-Type': 'application/json' });
574
+ res.end(JSON.stringify(data));
575
+ }
576
+ sendError(res, status, message) {
577
+ this.sendJson(res, status, { error: message });
578
+ }
579
+ readBody(req, callback) {
580
+ let body = '';
581
+ req.on('data', (chunk) => {
582
+ body += chunk;
583
+ });
584
+ req.on('end', () => {
585
+ try {
586
+ callback(body ? JSON.parse(body) : {});
587
+ }
588
+ catch {
589
+ callback({});
590
+ }
591
+ });
592
+ }
593
+ }
594
+ exports.AgentServer = AgentServer;
595
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Port Finder Utility
3
+ *
4
+ * Finds an available port for the genbox-agent server.
5
+ * Uses base port 47191 with automatic fallback to 47192, 47193, etc.
6
+ *
7
+ * Why 47191?
8
+ * - Not in common port lists (IANA, Docker, dev tools)
9
+ * - High enough to avoid privileged range
10
+ * - Memorable pattern: 47-1-91
11
+ * - Unlikely to conflict with other services
12
+ */
13
+ export declare const BASE_PORT = 47191;
14
+ /**
15
+ * Check if a port is available for binding
16
+ */
17
+ export declare function isPortAvailable(port: number, host?: string): Promise<boolean>;
18
+ /**
19
+ * Find an available port starting from basePort
20
+ * Returns the first available port, or 0 if none found (let OS assign)
21
+ */
22
+ export declare function findAvailablePort(basePort?: number): Promise<number>;
23
+ /**
24
+ * Create a lock file for a port (prevents race conditions with other daemon instances)
25
+ */
26
+ export declare function createPortLock(port: number): boolean;
27
+ /**
28
+ * Remove port lock file
29
+ */
30
+ export declare function removePortLock(port: number): void;
31
+ /**
32
+ * Get currently locked port by this process (if any)
33
+ * Useful for finding which port the daemon is using
34
+ */
35
+ export declare function getLockedPort(): number | null;
36
+ /**
37
+ * Find and lock an available port
38
+ * Combines findAvailablePort with createPortLock for atomic operation
39
+ */
40
+ export declare function findAndLockPort(basePort?: number): Promise<number>;
41
+ /**
42
+ * Cleanup stale lock files (for maintenance)
43
+ */
44
+ export declare function cleanupStaleLocks(): number;
45
+ //# sourceMappingURL=port-finder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-finder.d.ts","sourceRoot":"","sources":["../../src/server/port-finder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,eAAO,MAAM,SAAS,QAAQ,CAAC;AAQ/B;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,SAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBtF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAc7E;AAWD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmCpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUjD;AAED;;;GAGG;AACH,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAuB7C;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA8B3E;AAuBD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA+B1C"}