@leverageaiapps/gogogo 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.
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.startWebServer = startWebServer;
40
+ exports.stopWebServer = stopWebServer;
41
+ const express_1 = __importDefault(require("express"));
42
+ const cookie_parser_1 = __importDefault(require("cookie-parser"));
43
+ const http_1 = require("http");
44
+ const ws_1 = require("ws");
45
+ const crypto = __importStar(require("crypto"));
46
+ const path = __importStar(require("path"));
47
+ const fs = __importStar(require("fs"));
48
+ const os = __importStar(require("os"));
49
+ const pty_1 = require("./pty");
50
+ let httpServer = null;
51
+ let wss = null;
52
+ let connectedClients = new Map();
53
+ // Token authentication state
54
+ let serverToken = '';
55
+ // Temp directory for uploaded images
56
+ let tempDir = null;
57
+ function getTempDir() {
58
+ if (!tempDir) {
59
+ tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gogogo-img-'));
60
+ }
61
+ return tempDir;
62
+ }
63
+ let outputBuffer = [];
64
+ let nextSeq = 1;
65
+ const MAX_BUFFER_SIZE = 5000;
66
+ const BUFFER_TRIM_SIZE = 3000;
67
+ const MAX_IMAGE_SIZE = 5 * 1024 * 1024; // 5 MB
68
+ const MAX_WS_PAYLOAD = 6 * 1024 * 1024; // 6 MiB (just above image limit)
69
+ const COOKIE_MAX_AGE = 7 * 24 * 60 * 60 * 1000; // 7 days
70
+ const CONTEXT_API_ENTRIES = 50;
71
+ // Regex to detect clear-screen escape sequences
72
+ const CLEAR_SCREEN_RE = /\x1b\[[23]J|\x1bc/;
73
+ // WebSocket heartbeat interval
74
+ const WS_PING_INTERVAL = 30000;
75
+ let pingInterval = null;
76
+ // WebSocket limits
77
+ const MAX_CONNECTIONS = 10;
78
+ const MSG_RATE_WINDOW_MS = 1000;
79
+ const MSG_RATE_LIMIT = 100; // max messages per window
80
+ // Generate unique client ID
81
+ let clientIdCounter = 0;
82
+ function generateClientId() {
83
+ return `client-${Date.now()}-${++clientIdCounter}`;
84
+ }
85
+ // Calculate minimum size across all connected clients and local terminal
86
+ function calculateMinSize() {
87
+ const local = (0, pty_1.getLocalSize)();
88
+ let minCols = local.cols;
89
+ let minRows = local.rows;
90
+ // Find minimum dimensions across all connected clients
91
+ connectedClients.forEach((clientInfo) => {
92
+ if (clientInfo.cols > 0 && clientInfo.rows > 0) {
93
+ minCols = Math.min(minCols, clientInfo.cols);
94
+ minRows = Math.min(minRows, clientInfo.rows);
95
+ }
96
+ });
97
+ return { cols: minCols, rows: minRows };
98
+ }
99
+ // Apply minimum size to PTY
100
+ function applyMinSize() {
101
+ if (connectedClients.size === 0) {
102
+ // No web clients, use local size
103
+ const local = (0, pty_1.getLocalSize)();
104
+ (0, pty_1.resizePTY)(local.cols, local.rows);
105
+ return;
106
+ }
107
+ const { cols, rows } = calculateMinSize();
108
+ if (cols > 0 && rows > 0) {
109
+ (0, pty_1.resizePTY)(cols, rows);
110
+ }
111
+ }
112
+ function safeEqual(a, b) {
113
+ // Pad both to same length to avoid leaking length via timing
114
+ const maxLen = Math.max(a.length, b.length, 1);
115
+ const aBuf = Buffer.alloc(maxLen);
116
+ const bBuf = Buffer.alloc(maxLen);
117
+ aBuf.write(a);
118
+ bBuf.write(b);
119
+ const match = crypto.timingSafeEqual(aBuf, bBuf);
120
+ return match && a.length === b.length;
121
+ }
122
+ /**
123
+ * Check if user is authenticated via cookie
124
+ */
125
+ function isAuthenticated(req) {
126
+ return req.cookies && req.cookies.auth && safeEqual(req.cookies.auth, serverToken);
127
+ }
128
+ /**
129
+ * Detect if connection is over HTTPS (direct or via proxy)
130
+ */
131
+ function isSecure(req) {
132
+ return req.protocol === 'https' || req.get('x-forwarded-proto') === 'https';
133
+ }
134
+ /**
135
+ * Token authentication middleware
136
+ * 1. ?token= query param match → set cookie + 302 redirect to clean URL
137
+ * 2. Cookie valid → pass through
138
+ * 3. Otherwise → 403
139
+ */
140
+ function requireAuth(req, res, next) {
141
+ // Check for token in query parameter (first visit from QR code)
142
+ const queryToken = req.query.token;
143
+ if (queryToken && safeEqual(queryToken, serverToken)) {
144
+ // Set auth cookie and redirect to clean URL (without token)
145
+ res.cookie('auth', serverToken, {
146
+ httpOnly: true,
147
+ secure: isSecure(req),
148
+ maxAge: COOKIE_MAX_AGE,
149
+ sameSite: 'lax'
150
+ });
151
+ // Build redirect URL without the token parameter
152
+ const url = new URL(req.originalUrl, `${req.protocol}://${req.get('host')}`);
153
+ url.searchParams.delete('token');
154
+ const cleanPath = url.pathname + url.search;
155
+ res.redirect(302, cleanPath);
156
+ return;
157
+ }
158
+ // Check if authenticated via cookie
159
+ if (isAuthenticated(req)) {
160
+ next();
161
+ return;
162
+ }
163
+ // Not authenticated
164
+ res.status(403).send('Forbidden');
165
+ }
166
+ function startWebServer(port, token) {
167
+ return new Promise((resolve, reject) => {
168
+ // Set the server token
169
+ serverToken = token;
170
+ // Register local terminal resize callback (inside startWebServer, not at module level)
171
+ (0, pty_1.onLocalTerminalResize)(() => applyMinSize());
172
+ const app = (0, express_1.default)();
173
+ // Trust exactly 1 proxy hop (Cloudflare Tunnel)
174
+ app.set('trust proxy', 1);
175
+ app.use((0, cookie_parser_1.default)());
176
+ app.use(express_1.default.json({ limit: '100kb' }));
177
+ // Security headers
178
+ app.use((req, res, next) => {
179
+ res.setHeader('X-Content-Type-Options', 'nosniff');
180
+ res.setHeader('X-Frame-Options', 'DENY');
181
+ res.setHeader('Referrer-Policy', 'no-referrer');
182
+ res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; connect-src 'self' wss:; img-src 'self' data:");
183
+ if (isSecure(req)) {
184
+ res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
185
+ }
186
+ res.setHeader('Permissions-Policy', 'camera=(), geolocation=(), payment=()');
187
+ next();
188
+ });
189
+ // Health check (no auth required)
190
+ app.get('/api/health', (_req, res) => {
191
+ res.json({ status: 'ok', timestamp: Date.now() });
192
+ });
193
+ // Apply authentication middleware (always enabled)
194
+ app.use(requireAuth);
195
+ app.get('/api/terminal-context', (_req, res) => {
196
+ res.json({
197
+ recentOutput: outputBuffer.slice(-CONTEXT_API_ENTRIES).map(e => e.data),
198
+ bufferLength: outputBuffer.length,
199
+ });
200
+ });
201
+ // Serve static files from public directory
202
+ const publicDir = path.join(__dirname, '..', 'public');
203
+ if (fs.existsSync(publicDir)) {
204
+ app.use(express_1.default.static(publicDir));
205
+ }
206
+ // Fallback for SPA routing - use regex pattern for Express 5 compatibility
207
+ app.use((req, res, next) => {
208
+ // Skip API routes and WebSocket
209
+ if (req.path.startsWith('/api') || req.path === '/ws') {
210
+ return next();
211
+ }
212
+ // Skip static asset requests (favicon, images, etc.)
213
+ const staticExtensions = ['.ico', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.css', '.js', '.map', '.woff', '.woff2', '.ttf', '.eot'];
214
+ if (staticExtensions.some(ext => req.path.endsWith(ext))) {
215
+ return res.status(404).end();
216
+ }
217
+ // Only serve index.html for HTML requests (browser navigation)
218
+ const acceptHeader = req.get('Accept') || '';
219
+ if (!acceptHeader.includes('text/html')) {
220
+ return res.status(404).end();
221
+ }
222
+ const indexPath = path.join(publicDir, 'index.html');
223
+ if (fs.existsSync(indexPath)) {
224
+ res.sendFile(indexPath);
225
+ }
226
+ else {
227
+ res.status(500).send('Static files not found. Try reinstalling with: npm install -g @leverageaiapps/gogogo');
228
+ }
229
+ });
230
+ httpServer = (0, http_1.createServer)(app);
231
+ // WebSocket server - verify authentication on upgrade
232
+ wss = new ws_1.WebSocketServer({
233
+ server: httpServer,
234
+ path: '/ws',
235
+ maxPayload: MAX_WS_PAYLOAD,
236
+ verifyClient: (info, callback) => {
237
+ // Verify Origin matches the server host
238
+ const origin = info.origin || info.req.headers.origin || '';
239
+ const host = info.req.headers.host || '';
240
+ if (origin) {
241
+ try {
242
+ if (new URL(origin).host !== host) {
243
+ callback(false, 403, 'Origin mismatch');
244
+ return;
245
+ }
246
+ }
247
+ catch {
248
+ callback(false, 403, 'Invalid origin');
249
+ return;
250
+ }
251
+ }
252
+ const cookieHeader = info.req.headers.cookie || '';
253
+ const match = cookieHeader.split(';').map(c => c.trim()).find(c => c.startsWith('auth='));
254
+ if (match && safeEqual(match.substring(5), serverToken)) {
255
+ callback(true);
256
+ return;
257
+ }
258
+ callback(false, 403, 'Forbidden');
259
+ }
260
+ });
261
+ // Heartbeat: ping all clients every 30s to keep Cloudflare tunnel alive
262
+ pingInterval = setInterval(() => {
263
+ if (wss) {
264
+ wss.clients.forEach((client) => {
265
+ if (client.readyState === ws_1.WebSocket.OPEN) {
266
+ client.ping();
267
+ }
268
+ });
269
+ }
270
+ }, WS_PING_INTERVAL);
271
+ wss.on('connection', (ws) => {
272
+ // Enforce connection limit
273
+ if (connectedClients.size >= MAX_CONNECTIONS) {
274
+ ws.close(1013, 'Too many connections');
275
+ return;
276
+ }
277
+ const clientId = generateClientId();
278
+ const clientInfo = { cols: 80, rows: 24, id: clientId, synced: false };
279
+ connectedClients.set(ws, clientInfo);
280
+ // Rate limiting state per connection
281
+ let msgCount = 0;
282
+ let msgWindowStart = Date.now();
283
+ ws.on('message', async (data) => {
284
+ // Rate limit check
285
+ const now = Date.now();
286
+ if (now - msgWindowStart > MSG_RATE_WINDOW_MS) {
287
+ msgCount = 0;
288
+ msgWindowStart = now;
289
+ }
290
+ if (++msgCount > MSG_RATE_LIMIT) {
291
+ return; // silently drop messages over limit
292
+ }
293
+ try {
294
+ const msg = JSON.parse(data.toString());
295
+ // Sync handshake: client sends lastSeq on connect
296
+ if (msg.type === 'sync' && !clientInfo.synced) {
297
+ clientInfo.synced = true;
298
+ const lastSeq = typeof msg.lastSeq === 'number' ? msg.lastSeq : 0;
299
+ if (outputBuffer.length === 0) {
300
+ // Nothing to send
301
+ }
302
+ else if (lastSeq > 0 && lastSeq >= outputBuffer[0].seq) {
303
+ // Client has partial history — send only the delta
304
+ const delta = outputBuffer.filter(e => e.seq > lastSeq);
305
+ if (delta.length > 0) {
306
+ ws.send(JSON.stringify({
307
+ type: 'history-delta',
308
+ data: delta.map(e => e.data),
309
+ lastSeq: delta[delta.length - 1].seq
310
+ }));
311
+ }
312
+ }
313
+ else {
314
+ // First connect or lastSeq too old — send full history
315
+ ws.send(JSON.stringify({
316
+ type: 'history',
317
+ data: outputBuffer.map(e => e.data),
318
+ lastSeq: outputBuffer[outputBuffer.length - 1].seq
319
+ }));
320
+ }
321
+ }
322
+ if (msg.type === 'input' && typeof msg.data === 'string') {
323
+ (0, pty_1.writeToPTY)(msg.data);
324
+ }
325
+ if (msg.type === 'resize') {
326
+ const cols = Number(msg.cols);
327
+ const rows = Number(msg.rows);
328
+ if (Number.isInteger(cols) && Number.isInteger(rows) &&
329
+ cols > 0 && cols <= 500 && rows > 0 && rows <= 200) {
330
+ clientInfo.cols = cols;
331
+ clientInfo.rows = rows;
332
+ applyMinSize();
333
+ }
334
+ }
335
+ if (msg.type === 'image_upload' && typeof msg.data === 'string') {
336
+ try {
337
+ const buf = Buffer.from(msg.data, 'base64');
338
+ if (buf.length > MAX_IMAGE_SIZE) {
339
+ ws.send(JSON.stringify({ type: 'image_uploaded', error: 'Image too large (max 5MB)' }));
340
+ return;
341
+ }
342
+ // Sanitize filename: allow only alphanumeric, dash, underscore, dot
343
+ const rawName = (msg.filename || 'clipboard.png').replace(/[^a-zA-Z0-9._-]/g, '_');
344
+ const allowedExts = ['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp'];
345
+ const ext = path.extname(rawName).toLowerCase() || '.png';
346
+ if (!allowedExts.includes(ext)) {
347
+ ws.send(JSON.stringify({ type: 'image_uploaded', error: 'Unsupported image format' }));
348
+ return;
349
+ }
350
+ const baseName = path.basename(rawName, ext).slice(0, 50);
351
+ const fileName = `${Date.now()}-${baseName}${ext}`;
352
+ const filePath = path.join(getTempDir(), fileName);
353
+ fs.writeFileSync(filePath, buf, { mode: 0o600 });
354
+ ws.send(JSON.stringify({ type: 'image_uploaded', path: filePath }));
355
+ }
356
+ catch (imgErr) {
357
+ ws.send(JSON.stringify({ type: 'image_uploaded', error: 'Upload failed' }));
358
+ }
359
+ }
360
+ }
361
+ catch (e) {
362
+ console.error(' [WebServer] Invalid message:', e);
363
+ }
364
+ });
365
+ ws.on('error', (_err) => {
366
+ // Prevent uncaught error from crashing the process
367
+ connectedClients.delete(ws);
368
+ });
369
+ ws.on('close', () => {
370
+ connectedClients.delete(ws);
371
+ // Recalculate minimum size after client disconnection
372
+ applyMinSize();
373
+ });
374
+ });
375
+ // Forward PTY output to all clients
376
+ (0, pty_1.onPTYData)((data) => {
377
+ const seq = nextSeq++;
378
+ outputBuffer.push({ seq, data });
379
+ // Truncate buffer at the last clear-screen sequence
380
+ if (CLEAR_SCREEN_RE.test(data)) {
381
+ const matches = [...data.matchAll(/\x1b\[[23]J|\x1bc/g)];
382
+ const last = matches[matches.length - 1];
383
+ const after = data.slice(last.index + last[0].length);
384
+ outputBuffer = after ? [{ seq, data: after }] : [];
385
+ }
386
+ else if (outputBuffer.length > MAX_BUFFER_SIZE) {
387
+ outputBuffer = outputBuffer.slice(-BUFFER_TRIM_SIZE);
388
+ }
389
+ const msg = JSON.stringify({ type: 'output', seq, data });
390
+ connectedClients.forEach((_clientInfo, client) => {
391
+ if (client.readyState === ws_1.WebSocket.OPEN) {
392
+ client.send(msg);
393
+ }
394
+ });
395
+ });
396
+ // Notify clients on PTY exit
397
+ (0, pty_1.onPTYExit)((code) => {
398
+ const msg = JSON.stringify({ type: 'exit', code });
399
+ connectedClients.forEach((_clientInfo, client) => {
400
+ if (client.readyState === ws_1.WebSocket.OPEN) {
401
+ client.send(msg);
402
+ }
403
+ });
404
+ });
405
+ httpServer.listen(port, '0.0.0.0', () => {
406
+ // Add a small delay to ensure the server is fully ready
407
+ setTimeout(() => {
408
+ resolve();
409
+ }, 100);
410
+ });
411
+ httpServer.on('error', (err) => {
412
+ console.error(' Failed to start server:', err);
413
+ reject(err);
414
+ });
415
+ });
416
+ }
417
+ function stopWebServer() {
418
+ if (pingInterval) {
419
+ clearInterval(pingInterval);
420
+ pingInterval = null;
421
+ }
422
+ if (wss) {
423
+ wss.clients.forEach((client) => client.close());
424
+ wss.close();
425
+ wss = null;
426
+ }
427
+ if (httpServer) {
428
+ httpServer.close();
429
+ httpServer = null;
430
+ }
431
+ connectedClients.clear();
432
+ outputBuffer = [];
433
+ nextSeq = 1;
434
+ clientIdCounter = 0;
435
+ serverToken = '';
436
+ // Clear PTY callbacks registered by this module
437
+ (0, pty_1.clearCallbacks)();
438
+ // Clean up temp image directory
439
+ if (tempDir) {
440
+ try {
441
+ fs.rmSync(tempDir, { recursive: true, force: true });
442
+ }
443
+ catch { }
444
+ tempDir = null;
445
+ }
446
+ }
447
+ //# sourceMappingURL=web-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-server.js","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@leverageaiapps/gogogo",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool to forward terminal sessions to your mobile device via Cloudflare Tunnel. Code anywhere from your pocket.",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "gogogo": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "public/",
12
+ "scripts/"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "dev": "ts-node src/index.ts",
17
+ "start": "node dist/index.js",
18
+ "test": "vitest run",
19
+ "postinstall": "node scripts/postinstall.js",
20
+ "verify": "node scripts/verify-install.js",
21
+ "prepublishOnly": "npm run build",
22
+ "global-install": "npm install && npm run build && npm link"
23
+ },
24
+ "keywords": [
25
+ "terminal",
26
+ "mobile",
27
+ "cloudflare",
28
+ "tunnel",
29
+ "remote",
30
+ "pty",
31
+ "cli",
32
+ "claude-code",
33
+ "ai",
34
+ "coding"
35
+ ],
36
+ "author": "LeverageAI Apps",
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "commander": "^12.1.0",
40
+ "cookie-parser": "^1.4.7",
41
+ "express": "^5.2.1",
42
+ "node-pty": "^1.1.0",
43
+ "qrcode-terminal": "^0.12.0",
44
+ "ws": "^8.19.0"
45
+ },
46
+ "devDependencies": {
47
+ "@types/cookie-parser": "^1.4.10",
48
+ "@types/express": "^5.0.6",
49
+ "@types/node": "^20.17.12",
50
+ "@types/qrcode-terminal": "^0.12.2",
51
+ "@types/ws": "^8.18.1",
52
+ "ts-node": "^10.9.2",
53
+ "typescript": "^5.7.2",
54
+ "vitest": "^3.0.0"
55
+ },
56
+ "engines": {
57
+ "node": ">=18.0.0"
58
+ },
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "https://github.com/leverageaiapp/GoGoGo.git"
62
+ },
63
+ "bugs": {
64
+ "url": "https://github.com/leverageaiapp/GoGoGo/issues"
65
+ },
66
+ "homepage": "https://gogogo.locus.cool"
67
+ }