@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/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/cloudflare-tunnel.d.ts +9 -0
- package/dist/cloudflare-tunnel.d.ts.map +1 -0
- package/dist/cloudflare-tunnel.js +209 -0
- package/dist/cloudflare-tunnel.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +62 -0
- package/dist/index.js.map +1 -0
- package/dist/pty.d.ts +22 -0
- package/dist/pty.d.ts.map +1 -0
- package/dist/pty.js +172 -0
- package/dist/pty.js.map +1 -0
- package/dist/session.d.ts +2 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +246 -0
- package/dist/session.js.map +1 -0
- package/dist/web-server.d.ts +3 -0
- package/dist/web-server.d.ts.map +1 -0
- package/dist/web-server.js +447 -0
- package/dist/web-server.js.map +1 -0
- package/package.json +67 -0
- package/public/index.html +509 -0
- package/public/js/terminal.js +729 -0
- package/scripts/postinstall.js +66 -0
- package/scripts/verify-install.js +124 -0
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
|
package/dist/pty.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty.js","sourceRoot":"","sources":["../src/pty.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/session.js
ADDED
|
@@ -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 @@
|
|
|
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"}
|