@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.
package/dist/pty.js ADDED
@@ -0,0 +1,172 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getLocalSize = getLocalSize;
37
+ exports.spawnPTY = spawnPTY;
38
+ exports.writeToPTY = writeToPTY;
39
+ exports.resizePTY = resizePTY;
40
+ exports.killPTY = killPTY;
41
+ exports.onPTYData = onPTYData;
42
+ exports.onPTYExit = onPTYExit;
43
+ exports.onLocalTerminalResize = onLocalTerminalResize;
44
+ exports.clearCallbacks = clearCallbacks;
45
+ const pty = __importStar(require("node-pty"));
46
+ let ptyProcess = null;
47
+ let dataCallbacks = [];
48
+ let exitCallbacks = [];
49
+ let resizeCallbacks = [];
50
+ let stdinListener = null;
51
+ let resizeListener = null;
52
+ // Track local terminal size
53
+ let localCols = 80;
54
+ let localRows = 24;
55
+ // Get local terminal size
56
+ function getLocalSize() {
57
+ return { cols: localCols, rows: localRows };
58
+ }
59
+ function spawnPTY(options = {}) {
60
+ // Default to user's shell
61
+ const shell = process.env.SHELL || '/bin/sh';
62
+ const command = options.command || shell;
63
+ const args = options.args || [];
64
+ localCols = options.cols || process.stdout.columns || 80;
65
+ localRows = options.rows || process.stdout.rows || 24;
66
+ const cwd = options.cwd || process.cwd();
67
+ // Ensure we have a clean environment with PATH
68
+ const env = {
69
+ ...process.env,
70
+ PATH: process.env.PATH || '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin',
71
+ TERM: 'xterm-256color',
72
+ };
73
+ ptyProcess = pty.spawn(command, args, {
74
+ name: 'xterm-256color',
75
+ cols: localCols,
76
+ rows: localRows,
77
+ cwd,
78
+ env,
79
+ });
80
+ // Handle PTY output - forward to both console and callbacks
81
+ ptyProcess.onData((data) => {
82
+ // Write to local terminal (mirror)
83
+ process.stdout.write(data);
84
+ // Also send to web client via callbacks
85
+ for (const cb of dataCallbacks) {
86
+ cb(data);
87
+ }
88
+ });
89
+ // Handle PTY exit
90
+ ptyProcess.onExit(({ exitCode }) => {
91
+ for (const cb of exitCallbacks) {
92
+ cb(exitCode);
93
+ }
94
+ ptyProcess = null;
95
+ });
96
+ // Forward local stdin to PTY (for local terminal interaction)
97
+ if (process.stdin.isTTY) {
98
+ process.stdin.setRawMode(true);
99
+ }
100
+ process.stdin.resume();
101
+ // Remove previous stdin listener before adding new one
102
+ if (stdinListener) {
103
+ process.stdin.removeListener('data', stdinListener);
104
+ }
105
+ stdinListener = (data) => {
106
+ if (ptyProcess) {
107
+ ptyProcess.write(data.toString());
108
+ }
109
+ };
110
+ process.stdin.on('data', stdinListener);
111
+ // Remove previous resize listener before adding new one
112
+ if (resizeListener) {
113
+ process.stdout.removeListener('resize', resizeListener);
114
+ }
115
+ resizeListener = () => {
116
+ if (process.stdout.columns && process.stdout.rows) {
117
+ localCols = process.stdout.columns;
118
+ localRows = process.stdout.rows;
119
+ for (const cb of resizeCallbacks) {
120
+ cb();
121
+ }
122
+ }
123
+ };
124
+ process.stdout.on('resize', resizeListener);
125
+ return ptyProcess;
126
+ }
127
+ function writeToPTY(data) {
128
+ if (ptyProcess) {
129
+ ptyProcess.write(data);
130
+ }
131
+ }
132
+ function resizePTY(cols, rows) {
133
+ if (ptyProcess) {
134
+ ptyProcess.resize(cols, rows);
135
+ }
136
+ }
137
+ function killPTY() {
138
+ if (ptyProcess) {
139
+ ptyProcess.kill();
140
+ ptyProcess = null;
141
+ }
142
+ // Remove stdin/resize listeners
143
+ if (stdinListener) {
144
+ process.stdin.removeListener('data', stdinListener);
145
+ stdinListener = null;
146
+ }
147
+ if (resizeListener) {
148
+ process.stdout.removeListener('resize', resizeListener);
149
+ resizeListener = null;
150
+ }
151
+ // Restore terminal
152
+ if (process.stdin.isTTY) {
153
+ process.stdin.setRawMode(false);
154
+ }
155
+ process.stdin.pause();
156
+ }
157
+ function onPTYData(callback) {
158
+ dataCallbacks.push(callback);
159
+ }
160
+ function onPTYExit(callback) {
161
+ exitCallbacks.push(callback);
162
+ }
163
+ function onLocalTerminalResize(callback) {
164
+ resizeCallbacks.push(callback);
165
+ }
166
+ /** Clear all registered callbacks (for cleanup/testing) */
167
+ function clearCallbacks() {
168
+ dataCallbacks = [];
169
+ exitCallbacks = [];
170
+ resizeCallbacks = [];
171
+ }
172
+ //# sourceMappingURL=pty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function startSession(_machineName: string, command?: string[]): Promise<void>;
2
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAsGA,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmI1F"}
@@ -0,0 +1,246 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startSession = startSession;
37
+ const crypto = __importStar(require("crypto"));
38
+ const qrcode = __importStar(require("qrcode-terminal"));
39
+ const net = __importStar(require("net"));
40
+ const http = __importStar(require("http"));
41
+ const pty_1 = require("./pty");
42
+ const web_server_1 = require("./web-server");
43
+ const cloudflare_tunnel_1 = require("./cloudflare-tunnel");
44
+ const MIN_PORT = 8000;
45
+ const MAX_PORT = 65535;
46
+ /**
47
+ * Check if a port is available
48
+ */
49
+ function isPortAvailable(port) {
50
+ return new Promise((resolve) => {
51
+ const server = net.createServer();
52
+ server.listen(port, () => {
53
+ server.once('close', () => {
54
+ resolve(true);
55
+ });
56
+ server.close();
57
+ });
58
+ server.on('error', () => {
59
+ resolve(false);
60
+ });
61
+ });
62
+ }
63
+ /**
64
+ * Find an available port in the specified range
65
+ */
66
+ async function findAvailablePort() {
67
+ const maxAttempts = 100;
68
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
69
+ const port = Math.floor(Math.random() * (MAX_PORT - MIN_PORT + 1)) + MIN_PORT;
70
+ if (await isPortAvailable(port)) {
71
+ return port;
72
+ }
73
+ }
74
+ throw new Error(`Unable to find available port after ${maxAttempts} attempts`);
75
+ }
76
+ /**
77
+ * Verify that the web server is actually accessible
78
+ */
79
+ function verifyServerStarted(port) {
80
+ return new Promise((resolve, reject) => {
81
+ const maxAttempts = 10;
82
+ let attempts = 0;
83
+ const checkServer = () => {
84
+ attempts++;
85
+ const req = http.get(`http://localhost:${port}/api/health`, (res) => {
86
+ res.resume(); // Drain response to free the socket
87
+ resolve();
88
+ });
89
+ req.on('error', (_err) => {
90
+ if (attempts >= maxAttempts) {
91
+ reject(new Error(`Server failed to start on port ${port} after ${maxAttempts} attempts`));
92
+ }
93
+ else {
94
+ // Try again after a short delay
95
+ setTimeout(checkServer, 200);
96
+ }
97
+ });
98
+ req.setTimeout(1000, () => {
99
+ req.destroy();
100
+ if (attempts >= maxAttempts) {
101
+ reject(new Error(`Server startup timeout on port ${port}`));
102
+ }
103
+ else {
104
+ setTimeout(checkServer, 200);
105
+ }
106
+ });
107
+ };
108
+ checkServer();
109
+ });
110
+ }
111
+ /**
112
+ * Generate QR code for terminal
113
+ */
114
+ function displayQRCode(url) {
115
+ console.log('');
116
+ console.log(' 📱 Scan this QR code with your phone:');
117
+ console.log('');
118
+ qrcode.generate(url, { small: true }, (qr) => {
119
+ console.log(qr);
120
+ });
121
+ console.log('');
122
+ console.log(` 📱 Or open: ${url}`);
123
+ console.log('');
124
+ }
125
+ async function startSession(_machineName, command) {
126
+ console.log('');
127
+ // Bypass system proxy to avoid issues with Shadowrocket, Clash, etc.
128
+ // These proxies can interfere with localhost connections
129
+ delete process.env.HTTP_PROXY;
130
+ delete process.env.HTTPS_PROXY;
131
+ delete process.env.http_proxy;
132
+ delete process.env.https_proxy;
133
+ delete process.env.ALL_PROXY;
134
+ delete process.env.all_proxy;
135
+ // Set NO_PROXY to ensure local connections bypass any remaining proxy
136
+ process.env.NO_PROXY = 'localhost,127.0.0.1,*.local,*.trycloudflare.com';
137
+ process.env.no_proxy = process.env.NO_PROXY;
138
+ try {
139
+ // Generate a cryptographically secure 128-bit token
140
+ const authToken = crypto.randomBytes(16).toString('hex');
141
+ // Show progress steps
142
+ console.log(' Finding available port...');
143
+ const port = await findAvailablePort();
144
+ console.log(` Using port: ${port}`);
145
+ console.log(' Starting local server...');
146
+ await (0, web_server_1.startWebServer)(port, authToken);
147
+ // Verify server is accessible before creating tunnel
148
+ await verifyServerStarted(port);
149
+ // Cleanup function (defined early so all subsequent code can reference it)
150
+ let cleaningUp = false;
151
+ const cleanup = () => {
152
+ if (cleaningUp)
153
+ return;
154
+ cleaningUp = true;
155
+ (0, pty_1.killPTY)();
156
+ (0, web_server_1.stopWebServer)();
157
+ (0, cloudflare_tunnel_1.stopTunnel)();
158
+ process.exit(0);
159
+ };
160
+ // Register signal handlers early to cover the entire setup phase
161
+ process.once('SIGINT', cleanup);
162
+ process.once('SIGTERM', cleanup);
163
+ console.log(' Creating tunnel...');
164
+ let tunnelUrl;
165
+ try {
166
+ tunnelUrl = await (0, cloudflare_tunnel_1.startTunnel)(port);
167
+ }
168
+ catch (error) {
169
+ console.log('');
170
+ console.log(' ❌ Failed to create tunnel:');
171
+ console.log('');
172
+ console.log(error instanceof Error ? error.message : String(error));
173
+ console.log('');
174
+ (0, web_server_1.stopWebServer)();
175
+ (0, cloudflare_tunnel_1.stopTunnel)();
176
+ process.exit(1);
177
+ }
178
+ // Display QR code and connection info (token embedded in URL)
179
+ displayQRCode(`${tunnelUrl}/?token=${authToken}`);
180
+ console.log('');
181
+ console.log(' Started.');
182
+ console.log('');
183
+ // Determine what to run
184
+ let commandToRun;
185
+ let argsToRun;
186
+ if (command && command.length > 0) {
187
+ // Check if first argument contains spaces (quoted command)
188
+ if (command.length === 1 && command[0].includes(' ')) {
189
+ // Single quoted command like "claude --dangerously-skip-permissions"
190
+ const parts = command[0].split(' ');
191
+ commandToRun = parts[0];
192
+ argsToRun = parts.slice(1);
193
+ }
194
+ else {
195
+ // Normal command with separate arguments
196
+ commandToRun = command[0];
197
+ argsToRun = command.slice(1);
198
+ }
199
+ }
200
+ else {
201
+ // No command provided, just start a shell
202
+ const shell = process.env.SHELL || '/bin/sh';
203
+ commandToRun = shell;
204
+ argsToRun = [];
205
+ }
206
+ // Spawn the command in PTY
207
+ try {
208
+ (0, pty_1.spawnPTY)({
209
+ command: commandToRun,
210
+ args: argsToRun,
211
+ cwd: process.cwd(),
212
+ });
213
+ }
214
+ catch (error) {
215
+ console.error(' ✗ Failed to spawn command:', error instanceof Error ? error.message : String(error));
216
+ (0, web_server_1.stopWebServer)();
217
+ (0, cloudflare_tunnel_1.stopTunnel)();
218
+ process.exit(1);
219
+ }
220
+ // Handle tunnel crash
221
+ (0, cloudflare_tunnel_1.onTunnelCrash)((code) => {
222
+ console.log('');
223
+ console.log(' ⚠️ Tunnel disconnected unexpectedly (exit code: ' + code + ')');
224
+ console.log(' Remote clients can no longer connect. Local terminal is still active.');
225
+ console.log('');
226
+ });
227
+ // Handle command exit
228
+ (0, pty_1.onPTYExit)((_code) => {
229
+ console.log('');
230
+ if (command && command.length > 0) {
231
+ console.log(` ${command.join(' ')} exited. Session ended.`);
232
+ }
233
+ else {
234
+ console.log(' Terminal session ended.');
235
+ }
236
+ cleanup();
237
+ });
238
+ }
239
+ catch (error) {
240
+ console.error(' ✗ Failed to start session:', error);
241
+ (0, web_server_1.stopWebServer)();
242
+ (0, cloudflare_tunnel_1.stopTunnel)();
243
+ process.exit(1);
244
+ }
245
+ }
246
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function startWebServer(port: number, token: string): Promise<void>;
2
+ export declare function stopWebServer(): void;
3
+ //# sourceMappingURL=web-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-server.d.ts","sourceRoot":"","sources":["../src/web-server.ts"],"names":[],"mappings":"AAoJA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuRzE;AAED,wBAAgB,aAAa,IAAI,IAAI,CA+BpC"}