lobstercage-cli 0.1.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/README.md +64 -0
- package/dist/commands/auth.d.ts +39 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +393 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/billing.d.ts +11 -0
- package/dist/commands/billing.d.ts.map +1 -0
- package/dist/commands/billing.js +181 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/cages.d.ts +87 -0
- package/dist/commands/cages.d.ts.map +1 -0
- package/dist/commands/cages.js +603 -0
- package/dist/commands/cages.js.map +1 -0
- package/dist/commands/env.d.ts +42 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +287 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/exec.d.ts +12 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +127 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/tunnel.d.ts +29 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +232 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +138 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +96 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +348 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/config.d.ts +63 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +193 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/docker.d.ts +52 -0
- package/dist/lib/docker.d.ts.map +1 -0
- package/dist/lib/docker.js +210 -0
- package/dist/lib/docker.js.map +1 -0
- package/dist/lib/error-handler.d.ts +30 -0
- package/dist/lib/error-handler.d.ts.map +1 -0
- package/dist/lib/error-handler.js +113 -0
- package/dist/lib/error-handler.js.map +1 -0
- package/dist/lib/output.d.ts +71 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +237 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/utils.d.ts +17 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +71 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/types/index.d.ts +158 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +63 -0
package/README.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# @lobstercage/cli
|
|
2
|
+
|
|
3
|
+
Command-line interface for [LobsterCage](https://github.com/aptheon/lobster-cage) — Secure AI Agent Sandboxes.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g @lobstercage/cli
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Requires Node.js >= 20.0.0.
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Authenticate
|
|
17
|
+
lobster login --browser
|
|
18
|
+
|
|
19
|
+
# Deploy a new cage
|
|
20
|
+
lobster deploy my-cage
|
|
21
|
+
|
|
22
|
+
# Open an interactive shell
|
|
23
|
+
lobster ssh my-cage
|
|
24
|
+
|
|
25
|
+
# Tunnel a port to localhost
|
|
26
|
+
lobster tunnel my-cage --port 3000
|
|
27
|
+
|
|
28
|
+
# Run a command inside a cage
|
|
29
|
+
lobster exec my-cage -- ls -la /workspace
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Commands
|
|
33
|
+
|
|
34
|
+
| Command | Description |
|
|
35
|
+
| --- | --- |
|
|
36
|
+
| `lobster login` | Authenticate with LobsterCage |
|
|
37
|
+
| `lobster deploy <name>` | Create and start a new cage |
|
|
38
|
+
| `lobster list` | List all cages |
|
|
39
|
+
| `lobster status <name>` | Show cage status |
|
|
40
|
+
| `lobster start <name>` | Start a stopped cage |
|
|
41
|
+
| `lobster stop <name>` | Stop a running cage |
|
|
42
|
+
| `lobster hibernate <name>` | Hibernate a cage (preserves state) |
|
|
43
|
+
| `lobster wake <name>` | Wake a hibernated cage |
|
|
44
|
+
| `lobster destroy <name>` | Delete a cage permanently |
|
|
45
|
+
| `lobster logs <name>` | View cage logs |
|
|
46
|
+
| `lobster env list <cage>` | List environment variables |
|
|
47
|
+
| `lobster env set <cage> KEY=VAL` | Set environment variables |
|
|
48
|
+
| `lobster env get <cage> <key>` | Get an environment variable |
|
|
49
|
+
| `lobster env delete <cage> <key>` | Delete an environment variable |
|
|
50
|
+
| `lobster env scan <cage>` | Scan for leaked secrets |
|
|
51
|
+
| `lobster tunnel <name> --port <port>` | Tunnel a port to localhost |
|
|
52
|
+
| `lobster ssh <name>` | Interactive shell into a cage |
|
|
53
|
+
| `lobster exec <name> -- <cmd>` | Run a command in a cage |
|
|
54
|
+
| `lobster billing` | View billing status |
|
|
55
|
+
| `lobster billing portal` | Open the billing portal |
|
|
56
|
+
| `lobster upgrade` | Upgrade to Pro plan |
|
|
57
|
+
|
|
58
|
+
## Documentation
|
|
59
|
+
|
|
60
|
+
See the [Quickstart Guide](../docs/QUICKSTART.md) for the full walkthrough.
|
|
61
|
+
|
|
62
|
+
## License
|
|
63
|
+
|
|
64
|
+
[BUSL-1.1](../LICENSE)
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Commands
|
|
3
|
+
*
|
|
4
|
+
* login, logout, register, whoami
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Login command handler
|
|
9
|
+
*/
|
|
10
|
+
export declare function loginHandler(options: {
|
|
11
|
+
email?: string;
|
|
12
|
+
browser?: boolean;
|
|
13
|
+
json?: boolean;
|
|
14
|
+
}): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Register command handler
|
|
17
|
+
*/
|
|
18
|
+
export declare function registerHandler(options: {
|
|
19
|
+
email?: string;
|
|
20
|
+
name?: string;
|
|
21
|
+
json?: boolean;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Logout command handler
|
|
25
|
+
*/
|
|
26
|
+
export declare function logoutHandler(options: {
|
|
27
|
+
json?: boolean;
|
|
28
|
+
}): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Whoami command handler
|
|
31
|
+
*/
|
|
32
|
+
export declare function whoamiHandler(options: {
|
|
33
|
+
json?: boolean;
|
|
34
|
+
}): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Create auth commands
|
|
37
|
+
*/
|
|
38
|
+
export declare function createAuthCommands(program: Command): void;
|
|
39
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqJpC;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ChH;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkE/G;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B9E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC9E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4BzD"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication Commands
|
|
4
|
+
*
|
|
5
|
+
* login, logout, register, whoami
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.loginHandler = loginHandler;
|
|
45
|
+
exports.registerHandler = registerHandler;
|
|
46
|
+
exports.logoutHandler = logoutHandler;
|
|
47
|
+
exports.whoamiHandler = whoamiHandler;
|
|
48
|
+
exports.createAuthCommands = createAuthCommands;
|
|
49
|
+
const http = __importStar(require("http"));
|
|
50
|
+
const url = __importStar(require("url"));
|
|
51
|
+
const node_crypto_1 = require("node:crypto");
|
|
52
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
53
|
+
const ora_1 = __importDefault(require("ora"));
|
|
54
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
55
|
+
const api = __importStar(require("../lib/api"));
|
|
56
|
+
const config = __importStar(require("../lib/config"));
|
|
57
|
+
const output = __importStar(require("../lib/output"));
|
|
58
|
+
const error_handler_1 = require("../lib/error-handler");
|
|
59
|
+
/**
|
|
60
|
+
* Validates email format
|
|
61
|
+
*/
|
|
62
|
+
function isValidEmail(email) {
|
|
63
|
+
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
64
|
+
return emailRegex.test(email);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Validates password strength
|
|
68
|
+
*/
|
|
69
|
+
function isValidPassword(password) {
|
|
70
|
+
if (password.length < 12) {
|
|
71
|
+
return { valid: false, message: 'Password must be at least 12 characters' };
|
|
72
|
+
}
|
|
73
|
+
if (!/[a-z]/.test(password)) {
|
|
74
|
+
return { valid: false, message: 'Password must contain a lowercase letter' };
|
|
75
|
+
}
|
|
76
|
+
if (!/[A-Z]/.test(password)) {
|
|
77
|
+
return { valid: false, message: 'Password must contain an uppercase letter' };
|
|
78
|
+
}
|
|
79
|
+
if (!/[0-9]/.test(password)) {
|
|
80
|
+
return { valid: false, message: 'Password must contain a number' };
|
|
81
|
+
}
|
|
82
|
+
if (!/[^a-zA-Z0-9]/.test(password)) {
|
|
83
|
+
return { valid: false, message: 'Password must contain a special character' };
|
|
84
|
+
}
|
|
85
|
+
return { valid: true };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Start a local HTTP server and wait for the browser callback with token
|
|
89
|
+
*/
|
|
90
|
+
function waitForBrowserCallback(port, expectedState, timeoutMs = 120000) {
|
|
91
|
+
return new Promise((resolve, reject) => {
|
|
92
|
+
const server = http.createServer((req, res) => {
|
|
93
|
+
const parsed = url.parse(req.url || '', true);
|
|
94
|
+
if (parsed.pathname === '/callback') {
|
|
95
|
+
const token = parsed.query.token;
|
|
96
|
+
const errorMsg = parsed.query.error;
|
|
97
|
+
const state = parsed.query.state;
|
|
98
|
+
if (errorMsg) {
|
|
99
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
100
|
+
res.end('<html><body style="font-family:sans-serif;text-align:center;padding:40px"><h2>Authentication Failed</h2><p>You can close this tab.</p></body></html>');
|
|
101
|
+
server.close();
|
|
102
|
+
reject(new Error(errorMsg));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (state !== expectedState) {
|
|
106
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
107
|
+
res.end('<html><body style="font-family:sans-serif;text-align:center;padding:40px"><h2>Authentication Failed</h2><p>Invalid state parameter. You can close this tab.</p></body></html>');
|
|
108
|
+
server.close();
|
|
109
|
+
reject(new Error('State mismatch — possible CSRF attack. Please try again.'));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (token) {
|
|
113
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
114
|
+
res.end('<html><body style="font-family:sans-serif;text-align:center;padding:40px"><h2>Authenticated!</h2><p>You can close this tab and return to the terminal.</p></body></html>');
|
|
115
|
+
server.close();
|
|
116
|
+
resolve(token);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
res.writeHead(404);
|
|
121
|
+
res.end('Not found');
|
|
122
|
+
});
|
|
123
|
+
const timeout = setTimeout(() => {
|
|
124
|
+
server.close();
|
|
125
|
+
reject(new Error('Browser login timed out after 2 minutes'));
|
|
126
|
+
}, timeoutMs);
|
|
127
|
+
server.on('close', () => clearTimeout(timeout));
|
|
128
|
+
server.listen(port, '127.0.0.1');
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Browser login — opens dashboard in browser, receives API key via local callback
|
|
133
|
+
*/
|
|
134
|
+
async function browserLoginHandler(options) {
|
|
135
|
+
// Find a free port
|
|
136
|
+
const server = http.createServer();
|
|
137
|
+
const port = await new Promise((resolve, reject) => {
|
|
138
|
+
server.listen(0, '127.0.0.1', () => {
|
|
139
|
+
const addr = server.address();
|
|
140
|
+
if (addr && typeof addr === 'object') {
|
|
141
|
+
const p = addr.port;
|
|
142
|
+
server.close(() => resolve(p));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
reject(new Error('Failed to find free port'));
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
const state = (0, node_crypto_1.randomBytes)(32).toString('hex');
|
|
150
|
+
const dashboardUrl = `https://app.lobstercage.ai/cli-auth?port=${port}&state=${state}`;
|
|
151
|
+
output.info('Opening browser for authentication...');
|
|
152
|
+
console.log(` ${chalk_1.default.cyan.underline(dashboardUrl)}`);
|
|
153
|
+
console.log();
|
|
154
|
+
// Try to open browser
|
|
155
|
+
try {
|
|
156
|
+
const open = (await Promise.resolve().then(() => __importStar(require('open')))).default;
|
|
157
|
+
await open(dashboardUrl);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
output.warning('Could not open browser automatically.');
|
|
161
|
+
output.info('Open the URL above in your browser to continue.');
|
|
162
|
+
}
|
|
163
|
+
const spinner = (0, ora_1.default)('Waiting for browser authentication...').start();
|
|
164
|
+
try {
|
|
165
|
+
const token = await waitForBrowserCallback(port, state);
|
|
166
|
+
spinner.stop();
|
|
167
|
+
// Store the API key as access token
|
|
168
|
+
config.updateConfig({
|
|
169
|
+
accessToken: token,
|
|
170
|
+
});
|
|
171
|
+
if (options.json) {
|
|
172
|
+
output.json({ success: true, method: 'browser' });
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
output.success('Authenticated via browser!');
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
(0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'browser authentication' });
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Login command handler
|
|
184
|
+
*/
|
|
185
|
+
async function loginHandler(options) {
|
|
186
|
+
if (options.browser) {
|
|
187
|
+
return browserLoginHandler(options);
|
|
188
|
+
}
|
|
189
|
+
let email = options.email;
|
|
190
|
+
let password;
|
|
191
|
+
// Interactive prompts if not provided
|
|
192
|
+
if (!email) {
|
|
193
|
+
const answers = await inquirer_1.default.prompt([
|
|
194
|
+
{
|
|
195
|
+
type: 'input',
|
|
196
|
+
name: 'email',
|
|
197
|
+
message: 'Email:',
|
|
198
|
+
validate: (input) => isValidEmail(input) || 'Invalid email address',
|
|
199
|
+
},
|
|
200
|
+
]);
|
|
201
|
+
email = answers.email;
|
|
202
|
+
}
|
|
203
|
+
const passwordAnswer = await inquirer_1.default.prompt([
|
|
204
|
+
{
|
|
205
|
+
type: 'password',
|
|
206
|
+
name: 'password',
|
|
207
|
+
message: 'Password:',
|
|
208
|
+
mask: '*',
|
|
209
|
+
},
|
|
210
|
+
]);
|
|
211
|
+
password = passwordAnswer.password;
|
|
212
|
+
const spinner = (0, ora_1.default)('Logging in...').start();
|
|
213
|
+
try {
|
|
214
|
+
const result = await api.login(email, password);
|
|
215
|
+
spinner.stop();
|
|
216
|
+
if (options.json) {
|
|
217
|
+
output.json({ success: true, user: result.user });
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
output.success(`Logged in as ${result.user.email}`);
|
|
221
|
+
console.log(` Plan: ${result.user.plan}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch (err) {
|
|
225
|
+
(0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'logging in' });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Register command handler
|
|
230
|
+
*/
|
|
231
|
+
async function registerHandler(options) {
|
|
232
|
+
let email = options.email;
|
|
233
|
+
let name = options.name;
|
|
234
|
+
let password;
|
|
235
|
+
// Interactive prompts
|
|
236
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
237
|
+
const prompts = [];
|
|
238
|
+
if (!email) {
|
|
239
|
+
prompts.push({
|
|
240
|
+
type: 'input',
|
|
241
|
+
name: 'email',
|
|
242
|
+
message: 'Email:',
|
|
243
|
+
validate: (input) => isValidEmail(input) || 'Invalid email address',
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
if (!name) {
|
|
247
|
+
prompts.push({
|
|
248
|
+
type: 'input',
|
|
249
|
+
name: 'name',
|
|
250
|
+
message: 'Name (optional):',
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
prompts.push({
|
|
254
|
+
type: 'password',
|
|
255
|
+
name: 'password',
|
|
256
|
+
message: 'Password:',
|
|
257
|
+
mask: '*',
|
|
258
|
+
validate: (input) => {
|
|
259
|
+
const result = isValidPassword(input);
|
|
260
|
+
return result.valid || result.message;
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
prompts.push({
|
|
264
|
+
type: 'password',
|
|
265
|
+
name: 'confirmPassword',
|
|
266
|
+
message: 'Confirm password:',
|
|
267
|
+
mask: '*',
|
|
268
|
+
validate: (input, answers) => {
|
|
269
|
+
return input === answers.password || 'Passwords do not match';
|
|
270
|
+
},
|
|
271
|
+
});
|
|
272
|
+
const answers = await inquirer_1.default.prompt(prompts);
|
|
273
|
+
email = email || answers.email;
|
|
274
|
+
name = name || answers.name;
|
|
275
|
+
password = answers.password;
|
|
276
|
+
const spinner = (0, ora_1.default)('Creating account...').start();
|
|
277
|
+
try {
|
|
278
|
+
const result = await api.register(email, password, name || undefined);
|
|
279
|
+
spinner.stop();
|
|
280
|
+
if (options.json) {
|
|
281
|
+
output.json({ success: true, user: result.user });
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
output.success(`Account created! Logged in as ${result.user.email}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch (err) {
|
|
288
|
+
(0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'creating account' });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Logout command handler
|
|
293
|
+
*/
|
|
294
|
+
async function logoutHandler(options) {
|
|
295
|
+
if (!config.isAuthenticated()) {
|
|
296
|
+
if (options.json) {
|
|
297
|
+
output.json({ success: true, message: 'Not logged in' });
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
output.info('Not logged in');
|
|
301
|
+
}
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const spinner = (0, ora_1.default)('Logging out...').start();
|
|
305
|
+
try {
|
|
306
|
+
await api.logout();
|
|
307
|
+
spinner.stop();
|
|
308
|
+
if (options.json) {
|
|
309
|
+
output.json({ success: true });
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
output.success('Logged out');
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
catch (err) {
|
|
316
|
+
spinner.stop();
|
|
317
|
+
// Even if API call fails, local auth is cleared
|
|
318
|
+
if (options.json) {
|
|
319
|
+
output.json({ success: true });
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
output.success('Logged out');
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Whoami command handler
|
|
328
|
+
*/
|
|
329
|
+
async function whoamiHandler(options) {
|
|
330
|
+
if (!config.isAuthenticated()) {
|
|
331
|
+
if (options.json) {
|
|
332
|
+
output.json({ authenticated: false });
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
output.info('Not logged in. Run `lobster login` to authenticate.');
|
|
336
|
+
}
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
try {
|
|
340
|
+
const account = await api.getAccount();
|
|
341
|
+
if (options.json) {
|
|
342
|
+
output.json({ authenticated: true, ...account });
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
console.log();
|
|
346
|
+
console.log(` Email: ${account.user.email}`);
|
|
347
|
+
console.log(` Name: ${account.user.name || '-'}`);
|
|
348
|
+
console.log(` Plan: ${account.plan.displayName}`);
|
|
349
|
+
console.log();
|
|
350
|
+
console.log(' Limits:');
|
|
351
|
+
console.log(` Max cages: ${account.limits.maxCages}`);
|
|
352
|
+
console.log(` Max CPU: ${account.limits.maxCpuPerCage / 1024} vCPU`);
|
|
353
|
+
console.log(` Max RAM: ${account.limits.maxMemoryPerCage} MB`);
|
|
354
|
+
if (account.limits.monthlyComputeHours) {
|
|
355
|
+
console.log(` Compute: ${account.limits.monthlyComputeHours} hours/month`);
|
|
356
|
+
}
|
|
357
|
+
console.log();
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
(0, error_handler_1.handleError)(err, { json: options.json, context: 'fetching account info' });
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Create auth commands
|
|
366
|
+
*/
|
|
367
|
+
function createAuthCommands(program) {
|
|
368
|
+
program
|
|
369
|
+
.command('login')
|
|
370
|
+
.description('Login to LobsterCage')
|
|
371
|
+
.option('-e, --email <email>', 'Email address')
|
|
372
|
+
.option('-b, --browser', 'Authenticate via browser (opens dashboard)')
|
|
373
|
+
.option('--json', 'Output as JSON')
|
|
374
|
+
.action(loginHandler);
|
|
375
|
+
program
|
|
376
|
+
.command('register')
|
|
377
|
+
.description('Create a new LobsterCage account')
|
|
378
|
+
.option('-e, --email <email>', 'Email address')
|
|
379
|
+
.option('-n, --name <name>', 'Your name')
|
|
380
|
+
.option('--json', 'Output as JSON')
|
|
381
|
+
.action(registerHandler);
|
|
382
|
+
program
|
|
383
|
+
.command('logout')
|
|
384
|
+
.description('Logout from LobsterCage')
|
|
385
|
+
.option('--json', 'Output as JSON')
|
|
386
|
+
.action(logoutHandler);
|
|
387
|
+
program
|
|
388
|
+
.command('whoami')
|
|
389
|
+
.description('Display current user information')
|
|
390
|
+
.option('--json', 'Output as JSON')
|
|
391
|
+
.action(whoamiHandler);
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Billing Commands
|
|
3
|
+
*
|
|
4
|
+
* View billing status and manage subscription.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Register billing commands
|
|
9
|
+
*/
|
|
10
|
+
export declare function createBillingCommands(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"billing.d.ts","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwIpC;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB5D"}
|