lobstercage-cli 0.1.3 → 0.2.1

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,148 @@
1
+ "use strict";
2
+ /**
3
+ * SSH Config Command
4
+ *
5
+ * Generates and installs SSH config for LobsterCage cages.
6
+ * Enables `ssh agent@my-cage.lobster`, VS Code Remote SSH, scp, sftp.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.sshConfigHandler = sshConfigHandler;
46
+ exports.createSshConfigCommand = createSshConfigCommand;
47
+ const fs = __importStar(require("fs"));
48
+ const path = __importStar(require("path"));
49
+ const os = __importStar(require("os"));
50
+ const chalk_1 = __importDefault(require("chalk"));
51
+ const output = __importStar(require("../lib/output"));
52
+ const SSH_CONFIG_PATH = path.join(os.homedir(), '.ssh', 'config');
53
+ const BEGIN_MARKER = '# --- LobsterCage ---';
54
+ const END_MARKER = '# --- End LobsterCage ---';
55
+ function generateBlock() {
56
+ const lines = [
57
+ BEGIN_MARKER,
58
+ 'Host *.lobster',
59
+ ' ProxyCommand lobster proxy %n',
60
+ ' User agent',
61
+ ' StrictHostKeyChecking no',
62
+ ' UserKnownHostsFile /dev/null',
63
+ ' LogLevel ERROR',
64
+ END_MARKER,
65
+ ];
66
+ return lines.join('\n');
67
+ }
68
+ /**
69
+ * SSH config command handler
70
+ */
71
+ async function sshConfigHandler(options) {
72
+ if (options.print) {
73
+ console.log(generateBlock());
74
+ return;
75
+ }
76
+ if (options.remove) {
77
+ return removeSshConfig();
78
+ }
79
+ return installSshConfig();
80
+ }
81
+ function removeSshConfig() {
82
+ if (!fs.existsSync(SSH_CONFIG_PATH)) {
83
+ output.info('No SSH config file found.');
84
+ return;
85
+ }
86
+ const existing = fs.readFileSync(SSH_CONFIG_PATH, 'utf-8');
87
+ const beginIdx = existing.indexOf(BEGIN_MARKER);
88
+ const endIdx = existing.indexOf(END_MARKER);
89
+ if (beginIdx === -1 || endIdx === -1) {
90
+ output.info('No LobsterCage SSH config block found.');
91
+ return;
92
+ }
93
+ const before = existing.slice(0, beginIdx);
94
+ const after = existing.slice(endIdx + END_MARKER.length);
95
+ const updated = (before + after).replace(/\n{3,}/g, '\n\n').trim();
96
+ fs.writeFileSync(SSH_CONFIG_PATH, updated ? updated + '\n' : '', { mode: 0o600 });
97
+ output.success('LobsterCage SSH config removed.');
98
+ }
99
+ function installSshConfig() {
100
+ // Ensure ~/.ssh directory exists
101
+ const sshDir = path.dirname(SSH_CONFIG_PATH);
102
+ if (!fs.existsSync(sshDir)) {
103
+ fs.mkdirSync(sshDir, { mode: 0o700 });
104
+ }
105
+ const block = generateBlock();
106
+ let existing = '';
107
+ if (fs.existsSync(SSH_CONFIG_PATH)) {
108
+ existing = fs.readFileSync(SSH_CONFIG_PATH, 'utf-8');
109
+ // Check if block already exists
110
+ const beginIdx = existing.indexOf(BEGIN_MARKER);
111
+ const endIdx = existing.indexOf(END_MARKER);
112
+ if (beginIdx !== -1 && endIdx !== -1) {
113
+ // Replace existing block
114
+ const before = existing.slice(0, beginIdx);
115
+ const after = existing.slice(endIdx + END_MARKER.length);
116
+ const updated = before + block + after;
117
+ fs.writeFileSync(SSH_CONFIG_PATH, updated, { mode: 0o600 });
118
+ output.success('LobsterCage SSH config updated.');
119
+ printUsage();
120
+ return;
121
+ }
122
+ }
123
+ // Append new block
124
+ const sep = existing && !existing.endsWith('\n') ? '\n\n' : existing ? '\n' : '';
125
+ fs.writeFileSync(SSH_CONFIG_PATH, existing + sep + block + '\n', { mode: 0o600 });
126
+ output.success('LobsterCage SSH config installed.');
127
+ printUsage();
128
+ }
129
+ function printUsage() {
130
+ console.log();
131
+ console.log(' You can now SSH into cages with:');
132
+ console.log(` ${chalk_1.default.cyan('ssh agent@my-cage.lobster')}`);
133
+ console.log();
134
+ console.log(' Or use VS Code Remote SSH, scp, sftp, etc.');
135
+ console.log();
136
+ }
137
+ /**
138
+ * Create ssh-config command
139
+ */
140
+ function createSshConfigCommand(program) {
141
+ program
142
+ .command('ssh-config')
143
+ .description('Install SSH config for *.lobster hosts')
144
+ .option('--print', 'Print the config block without installing')
145
+ .option('--remove', 'Remove the LobsterCage SSH config block')
146
+ .action(sshConfigHandler);
147
+ }
148
+ //# sourceMappingURL=ssh-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-config.js","sourceRoot":"","sources":["../../src/commands/ssh-config.ts"],"names":[],"mappings":"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"}
@@ -16,9 +16,25 @@ export declare function tunnelHandler(nameOrId: string, options: {
16
16
  /**
17
17
  * SSH command handler
18
18
  *
19
- * This is a convenience wrapper around tunnel --ssh
19
+ * Spawns a real SSH session using `lobster proxy` as ProxyCommand.
20
+ * This gives you real SSH features: scp, sftp, VS Code Remote SSH, port forwarding.
20
21
  */
21
22
  export declare function sshHandler(nameOrId: string, options: {
23
+ json?: boolean;
24
+ }, extraArgs?: string[]): Promise<void>;
25
+ export declare function dashboardHandler(nameOrId: string, options: {
26
+ port?: string;
27
+ noBrowser?: boolean;
28
+ json?: boolean;
29
+ }): Promise<void>;
30
+ /**
31
+ * Port-forward command handler
32
+ *
33
+ * Creates an HTTPS proxy URL for accessing a port in a cage,
34
+ * and optionally starts a local HTTP proxy server.
35
+ */
36
+ export declare function portForwardHandler(nameOrId: string, options: {
37
+ port: string;
22
38
  localPort?: string;
23
39
  json?: boolean;
24
40
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmGpC;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9C,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB3D"}
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqIpC;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,EAC3B,SAAS,GAAE,MAAM,EAAO,GACvB,OAAO,CAAC,IAAI,CAAC,CAqDf;AAmCD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9D,OAAO,CAAC,IAAI,CAAC,CAwEf;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CA0Ff;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsC3D"}
@@ -43,10 +43,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
43
43
  Object.defineProperty(exports, "__esModule", { value: true });
44
44
  exports.tunnelHandler = tunnelHandler;
45
45
  exports.sshHandler = sshHandler;
46
+ exports.dashboardHandler = dashboardHandler;
47
+ exports.portForwardHandler = portForwardHandler;
46
48
  exports.createTunnelCommands = createTunnelCommands;
47
49
  const ora_1 = __importDefault(require("ora"));
48
50
  const ws_1 = __importDefault(require("ws"));
49
51
  const net = __importStar(require("net"));
52
+ const child_process_1 = require("child_process");
53
+ const chalk_1 = __importDefault(require("chalk"));
50
54
  const api = __importStar(require("../lib/api"));
51
55
  const output = __importStar(require("../lib/output"));
52
56
  const utils_1 = require("../lib/utils");
@@ -62,17 +66,44 @@ async function createTunnel(wsUrl, token, localPort, remotePort) {
62
66
  const ws = new ws_1.default(wsUrl, {
63
67
  headers: {
64
68
  'Authorization': `Bearer ${token}`,
65
- 'X-Remote-Port': remotePort.toString(),
66
69
  },
67
70
  });
68
- let connected = false;
71
+ let authenticated = false;
69
72
  ws.on('open', () => {
70
- connected = true;
71
- output.info(`Connection established to remote port ${remotePort}`);
73
+ // Auth is handled via header — wait for auth_ok
72
74
  });
73
- ws.on('message', (data) => {
74
- if (socket.writable) {
75
- socket.write(data);
75
+ ws.on('message', (raw) => {
76
+ try {
77
+ const msg = JSON.parse(raw.toString());
78
+ if (msg.type === 'auth_ok') {
79
+ authenticated = true;
80
+ output.info(`Connection established to remote port ${remotePort}`);
81
+ return;
82
+ }
83
+ if (msg.type === 'auth_error' || msg.type === 'error') {
84
+ output.error(`Tunnel error: ${msg.error || msg.message || 'Unknown error'}`);
85
+ if (!socket.destroyed)
86
+ socket.destroy();
87
+ return;
88
+ }
89
+ if (msg.type === 'data' && msg.payload) {
90
+ // Decode base64 payload and write raw bytes to TCP socket
91
+ if (socket.writable) {
92
+ socket.write(Buffer.from(msg.payload, 'base64'));
93
+ }
94
+ return;
95
+ }
96
+ if (msg.type === 'close') {
97
+ if (!socket.destroyed)
98
+ socket.end();
99
+ return;
100
+ }
101
+ }
102
+ catch {
103
+ // Not JSON — treat as raw binary (shouldn't happen)
104
+ if (socket.writable) {
105
+ socket.write(raw);
106
+ }
76
107
  }
77
108
  });
78
109
  ws.on('close', () => {
@@ -88,7 +119,11 @@ async function createTunnel(wsUrl, token, localPort, remotePort) {
88
119
  });
89
120
  socket.on('data', (data) => {
90
121
  if (ws.readyState === ws_1.default.OPEN) {
91
- ws.send(data);
122
+ // Wrap TCP data in JSON envelope with base64 encoding
123
+ ws.send(JSON.stringify({
124
+ type: 'data',
125
+ payload: data.toString('base64'),
126
+ }));
92
127
  }
93
128
  });
94
129
  socket.on('close', () => {
@@ -173,41 +208,234 @@ async function tunnelHandler(nameOrId, options) {
173
208
  /**
174
209
  * SSH command handler
175
210
  *
176
- * This is a convenience wrapper around tunnel --ssh
211
+ * Spawns a real SSH session using `lobster proxy` as ProxyCommand.
212
+ * This gives you real SSH features: scp, sftp, VS Code Remote SSH, port forwarding.
213
+ */
214
+ async function sshHandler(nameOrId, options, extraArgs = []) {
215
+ try {
216
+ (0, utils_1.requireAuth)();
217
+ // Verify the cage exists and is running before spawning SSH
218
+ const spinner = (0, ora_1.default)('Connecting...').start();
219
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
220
+ const cageStatus = await api.getCage(cageId);
221
+ if (cageStatus.status !== 'running') {
222
+ spinner.stop();
223
+ output.error(`Cage is not running (status: ${cageStatus.status})`);
224
+ process.exit(1);
225
+ }
226
+ spinner.stop();
227
+ if (options.json) {
228
+ output.json({
229
+ command: `ssh -o ProxyCommand="lobster proxy ${nameOrId}" agent@${nameOrId}`,
230
+ cage: nameOrId,
231
+ user: 'agent',
232
+ });
233
+ return;
234
+ }
235
+ // Build SSH args — extra args (e.g. -L 8787:localhost:8787) are passed through
236
+ const sshArgs = [
237
+ '-o', `ProxyCommand=lobster proxy ${nameOrId}`,
238
+ '-o', 'StrictHostKeyChecking=no',
239
+ '-o', 'UserKnownHostsFile=/dev/null',
240
+ '-o', 'LogLevel=ERROR',
241
+ ...extraArgs,
242
+ `agent@${nameOrId}`,
243
+ ];
244
+ // Spawn SSH with inherited stdio so it's fully interactive
245
+ const child = (0, child_process_1.spawn)('ssh', sshArgs, {
246
+ stdio: 'inherit',
247
+ });
248
+ child.on('exit', (code) => {
249
+ process.exit(code ?? 0);
250
+ });
251
+ child.on('error', (err) => {
252
+ output.error(`Failed to start SSH: ${err.message}`);
253
+ output.info('Make sure `ssh` is installed and in your PATH.');
254
+ process.exit(1);
255
+ });
256
+ }
257
+ catch (err) {
258
+ (0, error_handler_1.handleError)(err, { json: options.json, context: 'setting up SSH' });
259
+ }
260
+ }
261
+ /**
262
+ * Dashboard command handler
263
+ *
264
+ * Opens the OpenClaw Control UI by:
265
+ * 1. Reading the gateway token from inside the cage
266
+ * 2. Tunneling to port 18789 (OpenClaw gateway)
267
+ * 3. Opening the browser with the token in the URL
177
268
  */
178
- async function sshHandler(nameOrId, options) {
179
- const localPort = options.localPort ? parseInt(options.localPort, 10) : 2222;
269
+ const OPENCLAW_GW_PORT = 18789;
270
+ async function fetchGatewayToken(cageId) {
271
+ try {
272
+ // Try env var first, then config file
273
+ const result = await api.execInCage(cageId, [
274
+ 'sh', '-c',
275
+ 'echo "${OPENCLAW_GATEWAY_TOKEN:-}" || true',
276
+ ]);
277
+ const envToken = result.stdout?.trim();
278
+ if (envToken)
279
+ return envToken;
280
+ // Fall back to config file
281
+ const configResult = await api.execInCage(cageId, [
282
+ 'sh', '-c',
283
+ 'node -e "const f=require(\'fs\');try{const c=JSON.parse(f.readFileSync(process.env.HOME+\'/.openclaw/openclaw.json\',\'utf8\'));console.log(c.gateway?.auth?.token||\'\')}catch{}" 2>/dev/null || true',
284
+ ]);
285
+ const configToken = configResult.stdout?.trim();
286
+ if (configToken)
287
+ return configToken;
288
+ }
289
+ catch {
290
+ // Non-fatal — dashboard may not require auth
291
+ }
292
+ return null;
293
+ }
294
+ async function dashboardHandler(nameOrId, options) {
295
+ const localPort = options.port ? parseInt(options.port, 10) : OPENCLAW_GW_PORT;
180
296
  if (isNaN(localPort) || localPort < 1 || localPort > 65535) {
181
- output.error('Invalid local port number');
297
+ output.error('Invalid port number');
182
298
  process.exit(1);
183
299
  }
184
- const spinner = (0, ora_1.default)('Setting up SSH tunnel...').start();
300
+ const spinner = (0, ora_1.default)('Connecting to OpenClaw dashboard...').start();
185
301
  try {
186
302
  (0, utils_1.requireAuth)();
187
303
  const cageId = await (0, utils_1.resolveCageId)(nameOrId);
188
- // Get SSH tunnel token
304
+ const cageStatus = await api.getCage(cageId);
305
+ if (cageStatus.status !== 'running') {
306
+ spinner.stop();
307
+ output.error(`Cage is not running (status: ${cageStatus.status})`);
308
+ process.exit(1);
309
+ }
310
+ // Fetch gateway token from inside the cage
311
+ spinner.text = 'Fetching gateway token...';
312
+ const token = await fetchGatewayToken(cageId);
313
+ spinner.text = 'Setting up tunnel...';
189
314
  const tunnel = await api.initiateTunnel(cageId, {
190
- type: 'ssh',
315
+ type: 'port',
316
+ port: OPENCLAW_GW_PORT,
191
317
  });
192
318
  spinner.stop();
319
+ // Build URL with token if available
320
+ const baseUrl = `http://localhost:${localPort}`;
321
+ const dashUrl = token
322
+ ? `${baseUrl}/?gatewayUrl=ws://localhost:${localPort}&token=${encodeURIComponent(token)}`
323
+ : baseUrl;
193
324
  if (options.json) {
194
325
  output.json({
195
- command: `ssh -p ${localPort} root@localhost`,
326
+ url: dashUrl,
196
327
  localPort,
197
- remotePort: 22,
328
+ remotePort: OPENCLAW_GW_PORT,
329
+ token: token || undefined,
198
330
  wsUrl: tunnel.wsUrl,
199
331
  expiresAt: tunnel.expiresAt,
200
332
  });
201
333
  return;
202
334
  }
203
- output.info(`SSH tunnel will be available at localhost:${localPort}`);
204
- output.info(`Connect with: ssh -p ${localPort} root@localhost`);
205
- console.log();
206
- // Establish the SSH tunnel
207
- await createTunnel(tunnel.wsUrl, tunnel.token, localPort, 22);
335
+ output.success(`OpenClaw dashboard tunneled to ${chalk_1.default.cyan(baseUrl)}`);
336
+ if (!token) {
337
+ output.warning('Could not read gateway token — you may need to enter it manually.');
338
+ }
339
+ if (!options.noBrowser) {
340
+ try {
341
+ const open = (await Promise.resolve().then(() => __importStar(require('open')))).default;
342
+ await open(dashUrl);
343
+ output.info('Opened browser. Press Ctrl+C to close the tunnel.');
344
+ }
345
+ catch {
346
+ output.info(`Open ${chalk_1.default.cyan(dashUrl)} in your browser. Press Ctrl+C to close.`);
347
+ }
348
+ }
349
+ else {
350
+ output.info('Press Ctrl+C to close the tunnel.');
351
+ }
352
+ await createTunnel(tunnel.wsUrl, tunnel.token, localPort, OPENCLAW_GW_PORT);
208
353
  }
209
354
  catch (err) {
210
- (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'setting up SSH tunnel' });
355
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'opening dashboard' });
356
+ }
357
+ }
358
+ /**
359
+ * Port-forward command handler
360
+ *
361
+ * Creates an HTTPS proxy URL for accessing a port in a cage,
362
+ * and optionally starts a local HTTP proxy server.
363
+ */
364
+ async function portForwardHandler(nameOrId, options) {
365
+ const remotePort = parseInt(options.port, 10);
366
+ if (isNaN(remotePort) || remotePort < 1 || remotePort > 65535) {
367
+ output.error('Invalid port number');
368
+ process.exit(1);
369
+ }
370
+ const localPort = options.localPort ? parseInt(options.localPort, 10) : undefined;
371
+ const spinner = (0, ora_1.default)('Creating port forward...').start();
372
+ try {
373
+ (0, utils_1.requireAuth)();
374
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
375
+ const pf = await api.createPortForward(cageId, remotePort);
376
+ spinner.stop();
377
+ if (options.json) {
378
+ output.json({
379
+ proxyUrl: pf.proxyUrl,
380
+ tunnelId: pf.tunnelId,
381
+ expiresAt: pf.expiresAt,
382
+ ...(localPort ? { localPort } : {}),
383
+ });
384
+ if (!localPort)
385
+ return;
386
+ }
387
+ if (!localPort) {
388
+ // Just print the proxy URL
389
+ output.success(`Port forward created`);
390
+ console.log();
391
+ console.log(` Proxy URL: ${pf.proxyUrl}`);
392
+ console.log(` Expires: ${pf.expiresAt}`);
393
+ console.log();
394
+ console.log(` Example: curl ${pf.proxyUrl}/`);
395
+ return;
396
+ }
397
+ // Start local HTTP proxy
398
+ const http = await Promise.resolve().then(() => __importStar(require('http')));
399
+ const https = await Promise.resolve().then(() => __importStar(require('https')));
400
+ const { URL } = await Promise.resolve().then(() => __importStar(require('url')));
401
+ const proxyBase = new URL(pf.proxyUrl);
402
+ const server = http.createServer((req, res) => {
403
+ // Append local path to proxy base path (don't replace it)
404
+ const localPath = req.url || '/';
405
+ const basePath = proxyBase.pathname.replace(/\/$/, '');
406
+ const targetUrl = new URL(basePath + localPath, proxyBase);
407
+ const proxyReq = https.request(targetUrl, {
408
+ method: req.method,
409
+ headers: {
410
+ ...req.headers,
411
+ host: proxyBase.host,
412
+ },
413
+ }, (proxyRes) => {
414
+ res.writeHead(proxyRes.statusCode || 502, proxyRes.headers);
415
+ proxyRes.pipe(res);
416
+ });
417
+ proxyReq.on('error', (err) => {
418
+ if (!res.headersSent) {
419
+ res.writeHead(502);
420
+ res.end(`Proxy error: ${err.message}`);
421
+ }
422
+ });
423
+ req.pipe(proxyReq);
424
+ });
425
+ server.listen(localPort, '127.0.0.1', () => {
426
+ output.success(`Port forward listening on http://localhost:${localPort}`);
427
+ console.log(` → forwarding to cage port ${remotePort}`);
428
+ console.log(` Press Ctrl+C to stop`);
429
+ });
430
+ process.on('SIGINT', () => {
431
+ output.info('\nClosing port forward...');
432
+ server.close(() => process.exit(0));
433
+ });
434
+ // Keep alive
435
+ await new Promise(() => { });
436
+ }
437
+ catch (err) {
438
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'creating port forward' });
211
439
  }
212
440
  }
213
441
  /**
@@ -224,9 +452,29 @@ function createTunnelCommands(program) {
224
452
  .action(tunnelHandler);
225
453
  program
226
454
  .command('ssh <name>')
227
- .description('SSH into a cage (shorthand for tunnel --ssh)')
228
- .option('-l, --local-port <port>', 'Local port to listen on (default: 2222)')
229
- .option('--json', 'Output tunnel info as JSON')
230
- .action(sshHandler);
455
+ .description('SSH into a running cage (extra args passed to ssh)')
456
+ .option('--json', 'Output SSH command as JSON (don\'t connect)')
457
+ .allowUnknownOption()
458
+ .passThroughOptions()
459
+ .action((name, opts, cmd) => {
460
+ // cmd.args contains the <name> plus any extra passthrough args
461
+ const extra = cmd.args.slice(1);
462
+ return sshHandler(name, opts, extra);
463
+ });
464
+ program
465
+ .command('dashboard <name>')
466
+ .description('Open the OpenClaw dashboard for a running cage')
467
+ .option('-p, --port <port>', 'Local port (default: 18789)')
468
+ .option('--no-browser', 'Don\'t open browser automatically')
469
+ .option('--json', 'Output tunnel info as JSON (don\'t connect)')
470
+ .action(dashboardHandler);
471
+ program
472
+ .command('port-forward <name>')
473
+ .alias('pf')
474
+ .description('Forward a port from a cage to localhost')
475
+ .requiredOption('-p, --port <port>', 'Remote port in the cage')
476
+ .option('-l, --local-port <port>', 'Local port to listen on (starts local proxy)')
477
+ .option('--json', 'Output as JSON')
478
+ .action(portForwardHandler);
231
479
  }
232
480
  //# sourceMappingURL=tunnel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -67,7 +67,10 @@ const auth_1 = require("./commands/auth");
67
67
  const cages_1 = require("./commands/cages");
68
68
  const env_1 = require("./commands/env");
69
69
  const tunnel_1 = require("./commands/tunnel");
70
+ const proxy_1 = require("./commands/proxy");
70
71
  const exec_1 = require("./commands/exec");
72
+ const ssh_config_1 = require("./commands/ssh-config");
73
+ const apikeys_1 = require("./commands/apikeys");
71
74
  const billing_1 = require("./commands/billing");
72
75
  const output = __importStar(require("./lib/output"));
73
76
  const api_1 = require("./lib/api");
@@ -96,7 +99,10 @@ program
96
99
  (0, cages_1.createCageCommands)(program);
97
100
  (0, env_1.createEnvCommands)(program);
98
101
  (0, tunnel_1.createTunnelCommands)(program);
102
+ (0, proxy_1.createProxyCommand)(program);
99
103
  (0, exec_1.createExecCommand)(program);
104
+ (0, ssh_config_1.createSshConfigCommand)(program);
105
+ (0, apikeys_1.createApiKeyCommands)(program);
100
106
  (0, billing_1.createBillingCommands)(program);
101
107
  // Global error handling
102
108
  process.on('uncaughtException', (err) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/lib/api.d.ts CHANGED
@@ -84,6 +84,12 @@ export declare function scanEnvVars(cageId: string): Promise<{
84
84
  warnings: SecurityWarning[];
85
85
  }>;
86
86
  export declare function initiateTunnel(cageId: string, request: TunnelRequest): Promise<TunnelResponse>;
87
+ export interface PortForwardResponse {
88
+ tunnelId: string;
89
+ proxyUrl: string;
90
+ expiresAt: string;
91
+ }
92
+ export declare function createPortForward(cageId: string, port: number): Promise<PortForwardResponse>;
87
93
  export declare function getAccount(): Promise<Account>;
88
94
  export declare function getUsage(period?: 'day' | 'week' | 'month'): Promise<Usage>;
89
95
  export declare function getBillingStatus(): Promise<BillingStatus>;