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.
Files changed (58) hide show
  1. package/README.md +64 -0
  2. package/dist/commands/auth.d.ts +39 -0
  3. package/dist/commands/auth.d.ts.map +1 -0
  4. package/dist/commands/auth.js +393 -0
  5. package/dist/commands/auth.js.map +1 -0
  6. package/dist/commands/billing.d.ts +11 -0
  7. package/dist/commands/billing.d.ts.map +1 -0
  8. package/dist/commands/billing.js +181 -0
  9. package/dist/commands/billing.js.map +1 -0
  10. package/dist/commands/cages.d.ts +87 -0
  11. package/dist/commands/cages.d.ts.map +1 -0
  12. package/dist/commands/cages.js +603 -0
  13. package/dist/commands/cages.js.map +1 -0
  14. package/dist/commands/env.d.ts +42 -0
  15. package/dist/commands/env.d.ts.map +1 -0
  16. package/dist/commands/env.js +287 -0
  17. package/dist/commands/env.js.map +1 -0
  18. package/dist/commands/exec.d.ts +12 -0
  19. package/dist/commands/exec.d.ts.map +1 -0
  20. package/dist/commands/exec.js +127 -0
  21. package/dist/commands/exec.js.map +1 -0
  22. package/dist/commands/tunnel.d.ts +29 -0
  23. package/dist/commands/tunnel.d.ts.map +1 -0
  24. package/dist/commands/tunnel.js +232 -0
  25. package/dist/commands/tunnel.js.map +1 -0
  26. package/dist/index.d.ts +31 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +138 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/api.d.ts +96 -0
  31. package/dist/lib/api.d.ts.map +1 -0
  32. package/dist/lib/api.js +348 -0
  33. package/dist/lib/api.js.map +1 -0
  34. package/dist/lib/config.d.ts +63 -0
  35. package/dist/lib/config.d.ts.map +1 -0
  36. package/dist/lib/config.js +193 -0
  37. package/dist/lib/config.js.map +1 -0
  38. package/dist/lib/docker.d.ts +52 -0
  39. package/dist/lib/docker.d.ts.map +1 -0
  40. package/dist/lib/docker.js +210 -0
  41. package/dist/lib/docker.js.map +1 -0
  42. package/dist/lib/error-handler.d.ts +30 -0
  43. package/dist/lib/error-handler.d.ts.map +1 -0
  44. package/dist/lib/error-handler.js +113 -0
  45. package/dist/lib/error-handler.js.map +1 -0
  46. package/dist/lib/output.d.ts +71 -0
  47. package/dist/lib/output.d.ts.map +1 -0
  48. package/dist/lib/output.js +237 -0
  49. package/dist/lib/output.js.map +1 -0
  50. package/dist/lib/utils.d.ts +17 -0
  51. package/dist/lib/utils.d.ts.map +1 -0
  52. package/dist/lib/utils.js +71 -0
  53. package/dist/lib/utils.js.map +1 -0
  54. package/dist/types/index.d.ts +158 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +8 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/package.json +63 -0
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ /**
3
+ * Tunnel Commands
4
+ *
5
+ * tunnel, ssh
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.tunnelHandler = tunnelHandler;
45
+ exports.sshHandler = sshHandler;
46
+ exports.createTunnelCommands = createTunnelCommands;
47
+ const ora_1 = __importDefault(require("ora"));
48
+ const ws_1 = __importDefault(require("ws"));
49
+ const net = __importStar(require("net"));
50
+ const api = __importStar(require("../lib/api"));
51
+ const output = __importStar(require("../lib/output"));
52
+ const utils_1 = require("../lib/utils");
53
+ const error_handler_1 = require("../lib/error-handler");
54
+ /**
55
+ * Creates a WebSocket tunnel connection
56
+ */
57
+ async function createTunnel(wsUrl, token, localPort, remotePort) {
58
+ return new Promise((resolve, reject) => {
59
+ // Create local TCP server
60
+ const server = net.createServer((socket) => {
61
+ // Connect to WebSocket tunnel
62
+ const ws = new ws_1.default(wsUrl, {
63
+ headers: {
64
+ 'Authorization': `Bearer ${token}`,
65
+ 'X-Remote-Port': remotePort.toString(),
66
+ },
67
+ });
68
+ let connected = false;
69
+ ws.on('open', () => {
70
+ connected = true;
71
+ output.info(`Connection established to remote port ${remotePort}`);
72
+ });
73
+ ws.on('message', (data) => {
74
+ if (socket.writable) {
75
+ socket.write(data);
76
+ }
77
+ });
78
+ ws.on('close', () => {
79
+ if (!socket.destroyed) {
80
+ socket.end();
81
+ }
82
+ });
83
+ ws.on('error', (err) => {
84
+ output.error(`WebSocket error: ${err.message}`);
85
+ if (!socket.destroyed) {
86
+ socket.destroy();
87
+ }
88
+ });
89
+ socket.on('data', (data) => {
90
+ if (ws.readyState === ws_1.default.OPEN) {
91
+ ws.send(data);
92
+ }
93
+ });
94
+ socket.on('close', () => {
95
+ if (ws.readyState === ws_1.default.OPEN) {
96
+ ws.close();
97
+ }
98
+ });
99
+ socket.on('error', (err) => {
100
+ if (err.code !== 'ECONNRESET') {
101
+ output.error(`Socket error: ${err.message}`);
102
+ }
103
+ if (ws.readyState === ws_1.default.OPEN) {
104
+ ws.close();
105
+ }
106
+ });
107
+ });
108
+ server.on('error', (err) => {
109
+ output.error(`Server error: ${err.message}`);
110
+ reject(err);
111
+ });
112
+ server.listen(localPort, '127.0.0.1', () => {
113
+ output.success(`Tunnel listening on localhost:${localPort} -> cage:${remotePort}`);
114
+ output.info('Press Ctrl+C to close the tunnel');
115
+ // Don't resolve - keep running until Ctrl+C
116
+ });
117
+ // Handle graceful shutdown
118
+ process.on('SIGINT', () => {
119
+ output.info('\nClosing tunnel...');
120
+ server.close(() => {
121
+ resolve();
122
+ process.exit(0);
123
+ });
124
+ });
125
+ });
126
+ }
127
+ /**
128
+ * Tunnel command handler
129
+ */
130
+ async function tunnelHandler(nameOrId, options) {
131
+ // Determine tunnel type and ports
132
+ let tunnelType = options.ssh ? 'ssh' : 'port';
133
+ let remotePort = options.ssh ? 22 : parseInt(options.port || '80', 10);
134
+ let localPort = options.localPort ? parseInt(options.localPort, 10) : remotePort;
135
+ if (tunnelType === 'port' && !options.port) {
136
+ output.error('Remote port is required. Use --port <port> or --ssh');
137
+ process.exit(1);
138
+ }
139
+ if (isNaN(remotePort) || remotePort < 1 || remotePort > 65535) {
140
+ output.error('Invalid remote port number');
141
+ process.exit(1);
142
+ }
143
+ if (isNaN(localPort) || localPort < 1 || localPort > 65535) {
144
+ output.error('Invalid local port number');
145
+ process.exit(1);
146
+ }
147
+ const spinner = (0, ora_1.default)('Initiating tunnel...').start();
148
+ try {
149
+ (0, utils_1.requireAuth)();
150
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
151
+ // Get tunnel token
152
+ const tunnel = await api.initiateTunnel(cageId, {
153
+ type: tunnelType,
154
+ port: remotePort,
155
+ });
156
+ spinner.stop();
157
+ if (options.json) {
158
+ output.json({
159
+ localPort,
160
+ remotePort,
161
+ wsUrl: tunnel.wsUrl,
162
+ expiresAt: tunnel.expiresAt,
163
+ });
164
+ return;
165
+ }
166
+ // Establish the tunnel
167
+ await createTunnel(tunnel.wsUrl, tunnel.token, localPort, remotePort);
168
+ }
169
+ catch (err) {
170
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'initiating tunnel' });
171
+ }
172
+ }
173
+ /**
174
+ * SSH command handler
175
+ *
176
+ * This is a convenience wrapper around tunnel --ssh
177
+ */
178
+ async function sshHandler(nameOrId, options) {
179
+ const localPort = options.localPort ? parseInt(options.localPort, 10) : 2222;
180
+ if (isNaN(localPort) || localPort < 1 || localPort > 65535) {
181
+ output.error('Invalid local port number');
182
+ process.exit(1);
183
+ }
184
+ const spinner = (0, ora_1.default)('Setting up SSH tunnel...').start();
185
+ try {
186
+ (0, utils_1.requireAuth)();
187
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
188
+ // Get SSH tunnel token
189
+ const tunnel = await api.initiateTunnel(cageId, {
190
+ type: 'ssh',
191
+ });
192
+ spinner.stop();
193
+ if (options.json) {
194
+ output.json({
195
+ command: `ssh -p ${localPort} root@localhost`,
196
+ localPort,
197
+ remotePort: 22,
198
+ wsUrl: tunnel.wsUrl,
199
+ expiresAt: tunnel.expiresAt,
200
+ });
201
+ return;
202
+ }
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);
208
+ }
209
+ catch (err) {
210
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'setting up SSH tunnel' });
211
+ }
212
+ }
213
+ /**
214
+ * Create tunnel commands
215
+ */
216
+ function createTunnelCommands(program) {
217
+ program
218
+ .command('tunnel <name>')
219
+ .description('Create a secure tunnel to a cage')
220
+ .option('-p, --port <port>', 'Remote port to tunnel')
221
+ .option('-l, --local-port <port>', 'Local port to listen on (default: same as remote)')
222
+ .option('--ssh', 'Shorthand for --port 22')
223
+ .option('--json', 'Output tunnel info as JSON (don\'t start tunnel)')
224
+ .action(tunnelHandler);
225
+ program
226
+ .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);
231
+ }
232
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * LobsterCage CLI
4
+ *
5
+ * Secure AI Agent Sandboxes
6
+ *
7
+ * Usage:
8
+ * lobster login Login to LobsterCage
9
+ * lobster login --browser Login via browser OAuth
10
+ * lobster deploy <name> Create and start a new cage
11
+ * lobster list List all cages
12
+ * lobster status <name> Get cage status
13
+ * lobster start <name> Start a stopped cage
14
+ * lobster stop <name> Stop a running cage
15
+ * lobster hibernate <name> Hibernate a cage (preserves state)
16
+ * lobster wake <name> Wake a hibernated cage
17
+ * lobster destroy <name> Delete a cage permanently
18
+ * lobster logs <name> View cage logs
19
+ * lobster env list <cage> List environment variables
20
+ * lobster env set <cage> KEY=VAL Set environment variables
21
+ * lobster env get <cage> <name> Get environment variable value
22
+ * lobster env delete <cage> <name> Delete environment variable
23
+ * lobster env scan <cage> Scan for security issues
24
+ * lobster tunnel <name> --port 80 Tunnel to a port
25
+ * lobster ssh <name> SSH into a cage
26
+ * lobster billing View billing status
27
+ * lobster billing portal Open billing portal
28
+ * lobster upgrade Upgrade to Pro plan
29
+ */
30
+ export {};
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG"}
package/dist/index.js ADDED
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * LobsterCage CLI
5
+ *
6
+ * Secure AI Agent Sandboxes
7
+ *
8
+ * Usage:
9
+ * lobster login Login to LobsterCage
10
+ * lobster login --browser Login via browser OAuth
11
+ * lobster deploy <name> Create and start a new cage
12
+ * lobster list List all cages
13
+ * lobster status <name> Get cage status
14
+ * lobster start <name> Start a stopped cage
15
+ * lobster stop <name> Stop a running cage
16
+ * lobster hibernate <name> Hibernate a cage (preserves state)
17
+ * lobster wake <name> Wake a hibernated cage
18
+ * lobster destroy <name> Delete a cage permanently
19
+ * lobster logs <name> View cage logs
20
+ * lobster env list <cage> List environment variables
21
+ * lobster env set <cage> KEY=VAL Set environment variables
22
+ * lobster env get <cage> <name> Get environment variable value
23
+ * lobster env delete <cage> <name> Delete environment variable
24
+ * lobster env scan <cage> Scan for security issues
25
+ * lobster tunnel <name> --port 80 Tunnel to a port
26
+ * lobster ssh <name> SSH into a cage
27
+ * lobster billing View billing status
28
+ * lobster billing portal Open billing portal
29
+ * lobster upgrade Upgrade to Pro plan
30
+ */
31
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
32
+ if (k2 === undefined) k2 = k;
33
+ var desc = Object.getOwnPropertyDescriptor(m, k);
34
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
35
+ desc = { enumerable: true, get: function() { return m[k]; } };
36
+ }
37
+ Object.defineProperty(o, k2, desc);
38
+ }) : (function(o, m, k, k2) {
39
+ if (k2 === undefined) k2 = k;
40
+ o[k2] = m[k];
41
+ }));
42
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
43
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
44
+ }) : function(o, v) {
45
+ o["default"] = v;
46
+ });
47
+ var __importStar = (this && this.__importStar) || (function () {
48
+ var ownKeys = function(o) {
49
+ ownKeys = Object.getOwnPropertyNames || function (o) {
50
+ var ar = [];
51
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
52
+ return ar;
53
+ };
54
+ return ownKeys(o);
55
+ };
56
+ return function (mod) {
57
+ if (mod && mod.__esModule) return mod;
58
+ var result = {};
59
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
60
+ __setModuleDefault(result, mod);
61
+ return result;
62
+ };
63
+ })();
64
+ Object.defineProperty(exports, "__esModule", { value: true });
65
+ const commander_1 = require("commander");
66
+ const auth_1 = require("./commands/auth");
67
+ const cages_1 = require("./commands/cages");
68
+ const env_1 = require("./commands/env");
69
+ const tunnel_1 = require("./commands/tunnel");
70
+ const exec_1 = require("./commands/exec");
71
+ const billing_1 = require("./commands/billing");
72
+ const output = __importStar(require("./lib/output"));
73
+ const api_1 = require("./lib/api");
74
+ const error_handler_1 = require("./lib/error-handler");
75
+ // Read version from package.json at build time (resolveJsonModule)
76
+ const package_json_1 = require("../package.json");
77
+ // Create the main program
78
+ const program = new commander_1.Command();
79
+ program
80
+ .name('lobster')
81
+ .description('LobsterCage CLI - Secure AI Agent Sandboxes')
82
+ .version(package_json_1.version)
83
+ .enablePositionalOptions()
84
+ .option('--api-url <url>', 'Override API URL')
85
+ .option('--debug', 'Show detailed error information and stack traces')
86
+ .hook('preAction', (thisCommand) => {
87
+ const options = thisCommand.opts();
88
+ if (options.apiUrl) {
89
+ // Set custom API URL
90
+ const { setApiUrl } = require('./lib/config');
91
+ setApiUrl(options.apiUrl);
92
+ }
93
+ });
94
+ // Register all command modules
95
+ (0, auth_1.createAuthCommands)(program);
96
+ (0, cages_1.createCageCommands)(program);
97
+ (0, env_1.createEnvCommands)(program);
98
+ (0, tunnel_1.createTunnelCommands)(program);
99
+ (0, exec_1.createExecCommand)(program);
100
+ (0, billing_1.createBillingCommands)(program);
101
+ // Global error handling
102
+ process.on('uncaughtException', (err) => {
103
+ if (err instanceof api_1.ApiClientError) {
104
+ output.error(err.message);
105
+ if (err.code === 'NETWORK_ERROR') {
106
+ output.info('Check your internet connection and try again.');
107
+ }
108
+ }
109
+ else {
110
+ output.error(`Unexpected error: ${err.message}`);
111
+ }
112
+ if ((0, error_handler_1.isDebug)() && err.stack) {
113
+ console.error(err.stack);
114
+ }
115
+ process.exit(1);
116
+ });
117
+ process.on('unhandledRejection', (reason) => {
118
+ if (reason instanceof api_1.ApiClientError) {
119
+ output.error(reason.message);
120
+ }
121
+ else if (reason instanceof Error) {
122
+ output.error(`Unexpected error: ${reason.message}`);
123
+ if ((0, error_handler_1.isDebug)() && reason.stack) {
124
+ console.error(reason.stack);
125
+ }
126
+ }
127
+ else {
128
+ output.error(`Unexpected error: ${reason}`);
129
+ }
130
+ process.exit(1);
131
+ });
132
+ // Parse and execute
133
+ program.parse(process.argv);
134
+ // Show help if no command provided
135
+ if (process.argv.length === 2) {
136
+ program.help();
137
+ }
138
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * LobsterCage API Client
3
+ *
4
+ * Handles all HTTP communication with the LobsterCage API.
5
+ * Includes automatic token refresh and error handling.
6
+ */
7
+ import { AxiosInstance } from 'axios';
8
+ import type { AuthResponse, Cage, CreateCageRequest, UpdateCageRequest, EnvVar, SetEnvRequest, SecurityWarning, TunnelRequest, TunnelResponse, LogEntry, Account, Usage, ApiKey, ApiKeyCreated, BillingStatus } from '../types';
9
+ /**
10
+ * Custom error class for API errors
11
+ */
12
+ export declare class ApiClientError extends Error {
13
+ readonly code: string;
14
+ readonly statusCode: number;
15
+ readonly details?: Record<string, unknown>;
16
+ constructor(message: string, code: string, statusCode: number, details?: Record<string, unknown>);
17
+ }
18
+ /**
19
+ * Creates and configures the API client
20
+ */
21
+ export declare function createApiClient(): AxiosInstance;
22
+ /**
23
+ * Gets the API client instance (creates if needed)
24
+ */
25
+ export declare function getApiClient(): AxiosInstance;
26
+ /**
27
+ * Resets the API client (useful for testing or after URL change)
28
+ */
29
+ export declare function resetApiClient(): void;
30
+ export declare function register(email: string, password: string, name?: string): Promise<AuthResponse>;
31
+ export declare function login(email: string, password: string): Promise<AuthResponse>;
32
+ export declare function refreshToken(token: string): Promise<AuthResponse>;
33
+ export declare function logout(): Promise<void>;
34
+ export declare function listApiKeys(): Promise<ApiKey[]>;
35
+ export declare function createApiKey(name: string, scopes?: string[], expiresAt?: string): Promise<ApiKeyCreated>;
36
+ export declare function revokeApiKey(keyId: string): Promise<void>;
37
+ export interface ListCagesOptions {
38
+ status?: string;
39
+ limit?: number;
40
+ cursor?: string;
41
+ }
42
+ export interface ListCagesResponse {
43
+ cages: Cage[];
44
+ nextCursor?: string;
45
+ }
46
+ export declare function listCages(options?: ListCagesOptions): Promise<ListCagesResponse>;
47
+ export declare function getCage(cageId: string): Promise<Cage>;
48
+ export declare function createCage(request: CreateCageRequest): Promise<Cage>;
49
+ export declare function updateCage(cageId: string, request: UpdateCageRequest): Promise<Cage>;
50
+ export declare function deleteCage(cageId: string): Promise<void>;
51
+ export declare function startCage(cageId: string): Promise<Cage>;
52
+ export declare function stopCage(cageId: string, force?: boolean): Promise<Cage>;
53
+ export declare function restartCage(cageId: string): Promise<Cage>;
54
+ export declare function hibernateCage(cageId: string): Promise<Cage>;
55
+ export declare function wakeCage(cageId: string): Promise<Cage>;
56
+ export interface GetLogsOptions {
57
+ since?: string;
58
+ until?: string;
59
+ tail?: number;
60
+ }
61
+ export interface GetLogsResponse {
62
+ logs: LogEntry[];
63
+ nextToken?: string;
64
+ }
65
+ export declare function getCageLogs(cageId: string, options?: GetLogsOptions): Promise<GetLogsResponse>;
66
+ export interface ExecResult {
67
+ exitCode: number;
68
+ stdout: string;
69
+ stderr: string;
70
+ }
71
+ export declare function execInCage(cageId: string, command: string[]): Promise<ExecResult>;
72
+ export declare function listEnvVars(cageId: string): Promise<EnvVar[]>;
73
+ export interface SetEnvResponse {
74
+ variables: EnvVar[];
75
+ securityWarnings?: SecurityWarning[];
76
+ }
77
+ export declare function setEnvVars(cageId: string, request: SetEnvRequest): Promise<SetEnvResponse>;
78
+ export declare function getEnvVar(cageId: string, varName: string): Promise<{
79
+ name: string;
80
+ value: string;
81
+ }>;
82
+ export declare function deleteEnvVar(cageId: string, varName: string): Promise<void>;
83
+ export declare function scanEnvVars(cageId: string): Promise<{
84
+ warnings: SecurityWarning[];
85
+ }>;
86
+ export declare function initiateTunnel(cageId: string, request: TunnelRequest): Promise<TunnelResponse>;
87
+ export declare function getAccount(): Promise<Account>;
88
+ export declare function getUsage(period?: 'day' | 'week' | 'month'): Promise<Usage>;
89
+ export declare function getBillingStatus(): Promise<BillingStatus>;
90
+ export declare function createCheckoutSession(successUrl: string, cancelUrl: string): Promise<{
91
+ url: string;
92
+ }>;
93
+ export declare function createPortalSession(returnUrl: string): Promise<{
94
+ url: string;
95
+ }>;
96
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}