lobstercage-cli 0.3.2 → 0.4.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.
- package/dist/commands/apikeys.d.ts.map +1 -1
- package/dist/commands/apikeys.js +14 -0
- package/dist/commands/apikeys.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +6 -11
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/billing.d.ts.map +1 -1
- package/dist/commands/billing.js +25 -5
- package/dist/commands/billing.js.map +1 -1
- package/dist/commands/cages.d.ts +0 -1
- package/dist/commands/cages.d.ts.map +1 -1
- package/dist/commands/cages.js +20 -15
- package/dist/commands/cages.js.map +1 -1
- package/dist/commands/config.d.ts +25 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +148 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +22 -0
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/exec.d.ts +1 -0
- package/dist/commands/exec.d.ts.map +1 -1
- package/dist/commands/exec.js +23 -2
- package/dist/commands/exec.js.map +1 -1
- package/dist/commands/migrate.d.ts +28 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +314 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/ssh-config.d.ts.map +1 -1
- package/dist/commands/ssh-config.js +5 -0
- package/dist/commands/ssh-config.js.map +1 -1
- package/dist/commands/tail.d.ts +5 -0
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +20 -0
- package/dist/commands/tail.js.map +1 -1
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +23 -9
- package/dist/commands/tunnel.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -9
- package/dist/index.js.map +1 -1
- package/dist/lib/api.d.ts +184 -1
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +202 -3
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/error-handler.d.ts.map +1 -1
- package/dist/lib/error-handler.js +24 -3
- package/dist/lib/error-handler.js.map +1 -1
- package/dist/lib/migrate/analyze.d.ts +15 -0
- package/dist/lib/migrate/analyze.d.ts.map +1 -0
- package/dist/lib/migrate/analyze.js +241 -0
- package/dist/lib/migrate/analyze.js.map +1 -0
- package/dist/lib/migrate/cost.d.ts +16 -0
- package/dist/lib/migrate/cost.d.ts.map +1 -0
- package/dist/lib/migrate/cost.js +68 -0
- package/dist/lib/migrate/cost.js.map +1 -0
- package/dist/lib/migrate/detect.d.ts +12 -0
- package/dist/lib/migrate/detect.d.ts.map +1 -0
- package/dist/lib/migrate/detect.js +392 -0
- package/dist/lib/migrate/detect.js.map +1 -0
- package/dist/lib/migrate/display.d.ts +14 -0
- package/dist/lib/migrate/display.d.ts.map +1 -0
- package/dist/lib/migrate/display.js +157 -0
- package/dist/lib/migrate/display.js.map +1 -0
- package/dist/lib/migrate/platform.d.ts +16 -0
- package/dist/lib/migrate/platform.d.ts.map +1 -0
- package/dist/lib/migrate/platform.js +178 -0
- package/dist/lib/migrate/platform.js.map +1 -0
- package/dist/lib/migrate/types.d.ts +84 -0
- package/dist/lib/migrate/types.d.ts.map +1 -0
- package/dist/lib/migrate/types.js +6 -0
- package/dist/lib/migrate/types.js.map +1 -0
- package/dist/lib/migrate/utils.d.ts +9 -0
- package/dist/lib/migrate/utils.d.ts.map +1 -0
- package/dist/lib/migrate/utils.js +19 -0
- package/dist/lib/migrate/utils.js.map +1 -0
- package/dist/lib/output.d.ts.map +1 -1
- package/dist/lib/output.js +0 -1
- package/dist/lib/output.js.map +1 -1
- package/dist/lib/ssh-errors.d.ts +5 -0
- package/dist/lib/ssh-errors.d.ts.map +1 -0
- package/dist/lib/ssh-errors.js +46 -0
- package/dist/lib/ssh-errors.js.map +1 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +21 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/types/index.d.ts +20 -7
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +2 -1
package/dist/lib/api.js
CHANGED
|
@@ -60,6 +60,7 @@ exports.stopCage = stopCage;
|
|
|
60
60
|
exports.restartCage = restartCage;
|
|
61
61
|
exports.hibernateCage = hibernateCage;
|
|
62
62
|
exports.wakeCage = wakeCage;
|
|
63
|
+
exports.updateCageConfig = updateCageConfig;
|
|
63
64
|
exports.getCageHealth = getCageHealth;
|
|
64
65
|
exports.getCageEvents = getCageEvents;
|
|
65
66
|
exports.listEnvVars = listEnvVars;
|
|
@@ -78,6 +79,17 @@ exports.createPortalSession = createPortalSession;
|
|
|
78
79
|
const axios_1 = __importDefault(require("axios"));
|
|
79
80
|
const config_1 = require("./config");
|
|
80
81
|
const package_json_1 = require("../../package.json");
|
|
82
|
+
/**
|
|
83
|
+
* User-friendly messages for specific 401 error codes.
|
|
84
|
+
* Distinguishes between expired sessions, invalid tokens, revoked keys,
|
|
85
|
+
* and missing credentials so users know exactly what went wrong.
|
|
86
|
+
*/
|
|
87
|
+
const AUTH_ERROR_MESSAGES = {
|
|
88
|
+
TOKEN_EXPIRED: "Your session has expired. Run 'lobster login' to re-authenticate.",
|
|
89
|
+
TOKEN_INVALID: "Your session is invalid. Run 'lobster login' to re-authenticate.",
|
|
90
|
+
KEY_REVOKED: 'Your API key has been revoked. Create a new one at the dashboard.',
|
|
91
|
+
AUTH_REQUIRED: "Not authenticated. Run 'lobster login' first.",
|
|
92
|
+
};
|
|
81
93
|
/**
|
|
82
94
|
* Custom error class for API errors
|
|
83
95
|
*/
|
|
@@ -119,14 +131,21 @@ function createApiClient() {
|
|
|
119
131
|
client.interceptors.response.use((response) => response, (error) => {
|
|
120
132
|
if (error.response) {
|
|
121
133
|
const { status, data } = error.response;
|
|
134
|
+
// Support both new envelope format { error: { code, message } }
|
|
135
|
+
// and legacy flat format { code, message } for backward compatibility
|
|
136
|
+
const err = data?.error ?? data;
|
|
122
137
|
// Only clear auth on explicit invalid-token responses, not all 401s
|
|
123
138
|
if (status === 401) {
|
|
124
|
-
const code =
|
|
139
|
+
const code = err?.code;
|
|
125
140
|
if (code === 'TOKEN_EXPIRED' || code === 'TOKEN_INVALID' || code === 'KEY_REVOKED') {
|
|
126
141
|
(0, config_1.clearAuth)();
|
|
127
142
|
}
|
|
128
143
|
}
|
|
129
|
-
|
|
144
|
+
// Map specific 401 error codes to user-friendly messages
|
|
145
|
+
const message = status === 401
|
|
146
|
+
? AUTH_ERROR_MESSAGES[err?.code] ?? err?.message ?? error.message
|
|
147
|
+
: err?.message ?? error.message;
|
|
148
|
+
throw new ApiClientError(message, err?.code || 'UNKNOWN_ERROR', status, err?.details);
|
|
130
149
|
}
|
|
131
150
|
else if (error.request) {
|
|
132
151
|
throw new ApiClientError('Network error - could not connect to API', 'NETWORK_ERROR', 0);
|
|
@@ -167,11 +186,24 @@ async function logout() {
|
|
|
167
186
|
// ============================================
|
|
168
187
|
// API Keys API
|
|
169
188
|
// ============================================
|
|
189
|
+
/**
|
|
190
|
+
* Lists all API keys for the authenticated user.
|
|
191
|
+
* @returns Array of API key metadata (keys are not included — only returned at creation time)
|
|
192
|
+
* @throws {ApiClientError} If the user is not authenticated or the request fails
|
|
193
|
+
*/
|
|
170
194
|
async function listApiKeys() {
|
|
171
195
|
const client = getApiClient();
|
|
172
196
|
const response = await client.get('/api-keys');
|
|
173
197
|
return response.data.keys;
|
|
174
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Creates a new API key.
|
|
201
|
+
* @param name - Human-readable name for the key
|
|
202
|
+
* @param scopes - Optional array of permission scopes to restrict the key
|
|
203
|
+
* @param expiresAt - Optional ISO 8601 expiration timestamp
|
|
204
|
+
* @returns The created key metadata including the plaintext key (only returned once)
|
|
205
|
+
* @throws {ApiClientError} If the user is not authenticated or the request fails
|
|
206
|
+
*/
|
|
175
207
|
async function createApiKey(name, scopes, expiresAt) {
|
|
176
208
|
const client = getApiClient();
|
|
177
209
|
const response = await client.post('/api-keys', {
|
|
@@ -181,64 +213,155 @@ async function createApiKey(name, scopes, expiresAt) {
|
|
|
181
213
|
});
|
|
182
214
|
return response.data;
|
|
183
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Revokes an API key, permanently disabling it.
|
|
218
|
+
* @param keyId - The ID of the API key to revoke
|
|
219
|
+
* @throws {ApiClientError} If the key is not found or the user is not authenticated
|
|
220
|
+
*/
|
|
184
221
|
async function revokeApiKey(keyId) {
|
|
185
222
|
const client = getApiClient();
|
|
186
223
|
await client.delete(`/api-keys/${keyId}`);
|
|
187
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* Lists cages for the authenticated user with optional filtering and pagination.
|
|
227
|
+
* @param options - Filter and pagination options (status, limit, cursor)
|
|
228
|
+
* @returns Paginated list of cages with an optional cursor for the next page
|
|
229
|
+
* @throws {ApiClientError} If the user is not authenticated or the request fails
|
|
230
|
+
*/
|
|
188
231
|
async function listCages(options = {}) {
|
|
189
232
|
const client = getApiClient();
|
|
190
233
|
const response = await client.get('/cages', { params: options });
|
|
191
234
|
return response.data;
|
|
192
235
|
}
|
|
236
|
+
/**
|
|
237
|
+
* Retrieves details for a single cage.
|
|
238
|
+
* @param cageId - The cage identifier
|
|
239
|
+
* @returns The cage object with current status and metadata
|
|
240
|
+
* @throws {ApiClientError} If the cage is not found or the user is not authenticated
|
|
241
|
+
*/
|
|
193
242
|
async function getCage(cageId) {
|
|
194
243
|
const client = getApiClient();
|
|
195
244
|
const response = await client.get(`/cages/${cageId}`);
|
|
196
245
|
return response.data;
|
|
197
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Creates a new cage.
|
|
249
|
+
* @param request - Cage creation parameters (name, image, resources, etc.)
|
|
250
|
+
* @returns The newly created cage object
|
|
251
|
+
* @throws {ApiClientError} If validation fails or the user is not authenticated
|
|
252
|
+
*/
|
|
198
253
|
async function createCage(request) {
|
|
199
254
|
const client = getApiClient();
|
|
200
255
|
const response = await client.post('/cages', request);
|
|
201
256
|
return response.data;
|
|
202
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Updates a cage's properties.
|
|
260
|
+
* @param cageId - The cage identifier
|
|
261
|
+
* @param request - Fields to update (partial update via PATCH)
|
|
262
|
+
* @returns The updated cage object
|
|
263
|
+
* @throws {ApiClientError} If the cage is not found or validation fails
|
|
264
|
+
*/
|
|
203
265
|
async function updateCage(cageId, request) {
|
|
204
266
|
const client = getApiClient();
|
|
205
267
|
const response = await client.patch(`/cages/${cageId}`, request);
|
|
206
268
|
return response.data;
|
|
207
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Permanently deletes a cage and its associated resources.
|
|
272
|
+
* @param cageId - The cage identifier
|
|
273
|
+
* @throws {ApiClientError} If the cage is not found or is currently running
|
|
274
|
+
*/
|
|
208
275
|
async function deleteCage(cageId) {
|
|
209
276
|
const client = getApiClient();
|
|
210
277
|
await client.delete(`/cages/${cageId}`);
|
|
211
278
|
}
|
|
279
|
+
/**
|
|
280
|
+
* Starts a stopped or hibernated cage by launching a new ECS task.
|
|
281
|
+
* @param cageId - The cage identifier
|
|
282
|
+
* @returns The cage object with updated status
|
|
283
|
+
* @throws {ApiClientError} If the cage is not found or is already running
|
|
284
|
+
*/
|
|
212
285
|
async function startCage(cageId) {
|
|
213
286
|
const client = getApiClient();
|
|
214
287
|
const response = await client.post(`/cages/${cageId}/start`);
|
|
215
288
|
return response.data;
|
|
216
289
|
}
|
|
290
|
+
/**
|
|
291
|
+
* Stops a running cage by terminating its ECS task.
|
|
292
|
+
* @param cageId - The cage identifier
|
|
293
|
+
* @param force - If true, forcefully stop without graceful shutdown (default: false)
|
|
294
|
+
* @returns The cage object with updated status
|
|
295
|
+
* @throws {ApiClientError} If the cage is not found or is not running
|
|
296
|
+
*/
|
|
217
297
|
async function stopCage(cageId, force = false) {
|
|
218
298
|
const client = getApiClient();
|
|
219
299
|
const response = await client.post(`/cages/${cageId}/stop`, { force });
|
|
220
300
|
return response.data;
|
|
221
301
|
}
|
|
302
|
+
/**
|
|
303
|
+
* Restarts a running cage (stop then start).
|
|
304
|
+
* @param cageId - The cage identifier
|
|
305
|
+
* @returns The cage object with updated status
|
|
306
|
+
* @throws {ApiClientError} If the cage is not found or is not running
|
|
307
|
+
*/
|
|
222
308
|
async function restartCage(cageId) {
|
|
223
309
|
const client = getApiClient();
|
|
224
310
|
const response = await client.post(`/cages/${cageId}/restart`);
|
|
225
311
|
return response.data;
|
|
226
312
|
}
|
|
313
|
+
/**
|
|
314
|
+
* Hibernates a running cage, preserving state for later wake.
|
|
315
|
+
* @param cageId - The cage identifier
|
|
316
|
+
* @returns The cage object with updated status
|
|
317
|
+
* @throws {ApiClientError} If the cage is not found or is not running
|
|
318
|
+
*/
|
|
227
319
|
async function hibernateCage(cageId) {
|
|
228
320
|
const client = getApiClient();
|
|
229
321
|
const response = await client.post(`/cages/${cageId}/hibernate`);
|
|
230
322
|
return response.data;
|
|
231
323
|
}
|
|
324
|
+
/**
|
|
325
|
+
* Wakes a hibernated cage, restoring it to a running state.
|
|
326
|
+
* @param cageId - The cage identifier
|
|
327
|
+
* @returns The cage object with updated status
|
|
328
|
+
* @throws {ApiClientError} If the cage is not found or is not hibernated
|
|
329
|
+
*/
|
|
232
330
|
async function wakeCage(cageId) {
|
|
233
331
|
const client = getApiClient();
|
|
234
332
|
const response = await client.post(`/cages/${cageId}/wake`);
|
|
235
333
|
return response.data;
|
|
236
334
|
}
|
|
335
|
+
/**
|
|
336
|
+
* Updates cage configuration settings (e.g. idle timeout).
|
|
337
|
+
* @param cageId - The cage identifier
|
|
338
|
+
* @param config - Configuration fields to update
|
|
339
|
+
* @returns The updated configuration with a confirmation message
|
|
340
|
+
* @throws {ApiClientError} If the cage is not found or validation fails
|
|
341
|
+
*/
|
|
342
|
+
async function updateCageConfig(cageId, config) {
|
|
343
|
+
const client = getApiClient();
|
|
344
|
+
const response = await client.patch(`/cages/${cageId}/config`, config);
|
|
345
|
+
return response.data;
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Retrieves the health status of a cage, including OpenClaw process info.
|
|
349
|
+
* @param cageId - The cage identifier
|
|
350
|
+
* @returns Health status including availability, OpenClaw state, and uptime
|
|
351
|
+
* @throws {ApiClientError} If the cage is not found or is not running
|
|
352
|
+
*/
|
|
237
353
|
async function getCageHealth(cageId) {
|
|
238
354
|
const client = getApiClient();
|
|
239
355
|
const response = await client.get(`/cages/${cageId}/health`);
|
|
240
356
|
return response.data;
|
|
241
357
|
}
|
|
358
|
+
/**
|
|
359
|
+
* Retrieves the event log for a cage (audit trail).
|
|
360
|
+
* @param cageId - The cage identifier
|
|
361
|
+
* @param limit - Maximum number of events to return (default: 50)
|
|
362
|
+
* @returns Array of cage events ordered by timestamp
|
|
363
|
+
* @throws {ApiClientError} If the cage is not found or the user is not authenticated
|
|
364
|
+
*/
|
|
242
365
|
async function getCageEvents(cageId, limit = 50) {
|
|
243
366
|
const client = getApiClient();
|
|
244
367
|
const response = await client.get(`/cages/${cageId}/events`, {
|
|
@@ -249,25 +372,57 @@ async function getCageEvents(cageId, limit = 50) {
|
|
|
249
372
|
// ============================================
|
|
250
373
|
// Environment Variables API
|
|
251
374
|
// ============================================
|
|
375
|
+
/**
|
|
376
|
+
* Lists all environment variables set on a cage (values are masked).
|
|
377
|
+
* @param cageId - The cage identifier
|
|
378
|
+
* @returns Array of environment variable metadata
|
|
379
|
+
* @throws {ApiClientError} If the cage is not found or the user is not authenticated
|
|
380
|
+
*/
|
|
252
381
|
async function listEnvVars(cageId) {
|
|
253
382
|
const client = getApiClient();
|
|
254
383
|
const response = await client.get(`/cages/${cageId}/env`);
|
|
255
384
|
return response.data.variables;
|
|
256
385
|
}
|
|
386
|
+
/**
|
|
387
|
+
* Sets environment variables on a cage (creates or overwrites).
|
|
388
|
+
* @param cageId - The cage identifier
|
|
389
|
+
* @param request - Object containing the variables to set
|
|
390
|
+
* @returns The updated variables and any security warnings detected
|
|
391
|
+
* @throws {ApiClientError} If the cage is not found or validation fails
|
|
392
|
+
*/
|
|
257
393
|
async function setEnvVars(cageId, request) {
|
|
258
394
|
const client = getApiClient();
|
|
259
395
|
const response = await client.put(`/cages/${cageId}/env`, request);
|
|
260
396
|
return response.data;
|
|
261
397
|
}
|
|
398
|
+
/**
|
|
399
|
+
* Retrieves a single environment variable's decrypted value.
|
|
400
|
+
* @param cageId - The cage identifier
|
|
401
|
+
* @param varName - The environment variable name
|
|
402
|
+
* @returns The variable name and its decrypted value
|
|
403
|
+
* @throws {ApiClientError} If the cage or variable is not found
|
|
404
|
+
*/
|
|
262
405
|
async function getEnvVar(cageId, varName) {
|
|
263
406
|
const client = getApiClient();
|
|
264
407
|
const response = await client.get(`/cages/${cageId}/env/${varName}`);
|
|
265
408
|
return response.data;
|
|
266
409
|
}
|
|
410
|
+
/**
|
|
411
|
+
* Deletes a single environment variable from a cage.
|
|
412
|
+
* @param cageId - The cage identifier
|
|
413
|
+
* @param varName - The environment variable name to delete
|
|
414
|
+
* @throws {ApiClientError} If the cage or variable is not found
|
|
415
|
+
*/
|
|
267
416
|
async function deleteEnvVar(cageId, varName) {
|
|
268
417
|
const client = getApiClient();
|
|
269
418
|
await client.delete(`/cages/${cageId}/env/${varName}`);
|
|
270
419
|
}
|
|
420
|
+
/**
|
|
421
|
+
* Scans a cage's environment variables for security issues (e.g. leaked secrets).
|
|
422
|
+
* @param cageId - The cage identifier
|
|
423
|
+
* @returns Object containing an array of security warnings found
|
|
424
|
+
* @throws {ApiClientError} If the cage is not found or the user is not authenticated
|
|
425
|
+
*/
|
|
271
426
|
async function scanEnvVars(cageId) {
|
|
272
427
|
const client = getApiClient();
|
|
273
428
|
const response = await client.post(`/cages/${cageId}/env/scan`);
|
|
@@ -276,11 +431,25 @@ async function scanEnvVars(cageId) {
|
|
|
276
431
|
// ============================================
|
|
277
432
|
// Tunnel API
|
|
278
433
|
// ============================================
|
|
434
|
+
/**
|
|
435
|
+
* Creates a tunnel token and returns WebSocket connection details for a cage.
|
|
436
|
+
* @param cageId - The cage identifier
|
|
437
|
+
* @param request - Tunnel configuration (type: ssh, shell, or port)
|
|
438
|
+
* @returns Tunnel connection details including WebSocket URL and single-use token
|
|
439
|
+
* @throws {ApiClientError} If the cage is not found or is not running
|
|
440
|
+
*/
|
|
279
441
|
async function initiateTunnel(cageId, request) {
|
|
280
442
|
const client = getApiClient();
|
|
281
443
|
const response = await client.post(`/cages/${cageId}/tunnel`, request);
|
|
282
444
|
return response.data;
|
|
283
445
|
}
|
|
446
|
+
/**
|
|
447
|
+
* Creates an HTTP port-forward token for accessing a cage port via the tunnel proxy.
|
|
448
|
+
* @param cageId - The cage identifier
|
|
449
|
+
* @param port - The port number inside the cage to forward
|
|
450
|
+
* @returns Port-forward details including the proxy URL and multi-use token
|
|
451
|
+
* @throws {ApiClientError} If the cage is not found or is not running
|
|
452
|
+
*/
|
|
284
453
|
async function createPortForward(cageId, port) {
|
|
285
454
|
const client = getApiClient();
|
|
286
455
|
const response = await client.post(`/cages/${cageId}/port-forward`, { port });
|
|
@@ -313,11 +482,22 @@ async function execInCageViaTunnel(cageId, command) {
|
|
|
313
482
|
// ============================================
|
|
314
483
|
// Account API
|
|
315
484
|
// ============================================
|
|
485
|
+
/**
|
|
486
|
+
* Retrieves the authenticated user's account profile.
|
|
487
|
+
* @returns Account details including plan, credits, and Stripe fields
|
|
488
|
+
* @throws {ApiClientError} If the user is not authenticated
|
|
489
|
+
*/
|
|
316
490
|
async function getAccount() {
|
|
317
491
|
const client = getApiClient();
|
|
318
492
|
const response = await client.get('/account');
|
|
319
493
|
return response.data;
|
|
320
494
|
}
|
|
495
|
+
/**
|
|
496
|
+
* Retrieves usage statistics for the authenticated user.
|
|
497
|
+
* @param period - Time period to aggregate usage over (default: 'month')
|
|
498
|
+
* @returns Usage data for the specified period
|
|
499
|
+
* @throws {ApiClientError} If the user is not authenticated
|
|
500
|
+
*/
|
|
321
501
|
async function getUsage(period = 'month') {
|
|
322
502
|
const client = getApiClient();
|
|
323
503
|
const response = await client.get('/account/usage', { params: { period } });
|
|
@@ -326,19 +506,38 @@ async function getUsage(period = 'month') {
|
|
|
326
506
|
// ============================================
|
|
327
507
|
// Billing API
|
|
328
508
|
// ============================================
|
|
509
|
+
/**
|
|
510
|
+
* Retrieves the current billing status and subscription details.
|
|
511
|
+
* @returns Billing status including plan, payment method, and subscription state
|
|
512
|
+
* @throws {ApiClientError} If the user is not authenticated
|
|
513
|
+
*/
|
|
329
514
|
async function getBillingStatus() {
|
|
330
515
|
const client = getApiClient();
|
|
331
516
|
const response = await client.get('/billing');
|
|
332
517
|
return response.data;
|
|
333
518
|
}
|
|
334
|
-
|
|
519
|
+
/**
|
|
520
|
+
* Creates a Stripe Checkout session for subscribing to a plan.
|
|
521
|
+
* @param successUrl - URL to redirect to after successful payment
|
|
522
|
+
* @param cancelUrl - URL to redirect to if the user cancels checkout
|
|
523
|
+
* @returns Object containing the Stripe Checkout session URL
|
|
524
|
+
* @throws {ApiClientError} If the user is not authenticated or Stripe is misconfigured
|
|
525
|
+
*/
|
|
526
|
+
async function createCheckoutSession(successUrl, cancelUrl, plan) {
|
|
335
527
|
const client = getApiClient();
|
|
336
528
|
const response = await client.post('/billing/checkout', {
|
|
337
529
|
successUrl,
|
|
338
530
|
cancelUrl,
|
|
531
|
+
...(plan && { plan }),
|
|
339
532
|
});
|
|
340
533
|
return response.data;
|
|
341
534
|
}
|
|
535
|
+
/**
|
|
536
|
+
* Creates a Stripe Customer Portal session for managing billing.
|
|
537
|
+
* @param returnUrl - URL to redirect to when the user exits the portal
|
|
538
|
+
* @returns Object containing the Stripe Customer Portal session URL
|
|
539
|
+
* @throws {ApiClientError} If the user is not authenticated or has no Stripe customer
|
|
540
|
+
*/
|
|
342
541
|
async function createPortalSession(returnUrl) {
|
|
343
542
|
const client = getApiClient();
|
|
344
543
|
const response = await client.post('/billing/portal', { returnUrl });
|
package/dist/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/lib/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/lib/error-handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAsC/B,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,GAAE,kBAAuB,GAAG,KAAK,CAoCjF"}
|
|
@@ -53,9 +53,29 @@ const SUGGESTIONS = {
|
|
|
53
53
|
CAGE_RUNNING: 'Stop the cage first with `lobster stop <name>`',
|
|
54
54
|
NETWORK_ERROR: 'Check your internet connection and API URL',
|
|
55
55
|
AUTH_REQUIRED: 'Run `lobster login` first',
|
|
56
|
+
TOKEN_EXPIRED: 'Run `lobster login` to get a new session',
|
|
57
|
+
TOKEN_INVALID: 'Run `lobster login` to get a new session',
|
|
58
|
+
KEY_REVOKED: 'Create a new API key at the dashboard or via `lobster api-keys create`',
|
|
56
59
|
FORBIDDEN: "You don't have permission. Check your API key",
|
|
60
|
+
RATE_LIMIT_EXCEEDED: 'Too many requests. Wait a moment and try again',
|
|
57
61
|
RATE_LIMITED: 'Too many requests. Wait a moment and try again',
|
|
58
|
-
|
|
62
|
+
CAGE_ALREADY_RUNNING: 'The cage is already running',
|
|
63
|
+
CAGE_ALREADY_STOPPED: 'The cage is already stopped',
|
|
64
|
+
CAGE_STARTING: 'The cage is still starting. Wait a moment and check status with `lobster status <name>`',
|
|
65
|
+
CAGE_NAME_EXISTS: 'A cage with this name already exists. Choose a different name',
|
|
66
|
+
NOT_STARTABLE: 'This cage cannot be started. Check its status with `lobster status <name>`',
|
|
67
|
+
CREDIT_LIMIT_REACHED: 'Free plan credits exhausted. Upgrade your plan with `lobster upgrade`',
|
|
68
|
+
VALIDATION_ERROR: 'Invalid input. Check command arguments and try again',
|
|
69
|
+
PAYLOAD_TOO_LARGE: 'Request payload is too large. Reduce the size and try again',
|
|
70
|
+
NETWORK_CHANGE_REQUIRES_STOP: 'Stop the cage first before changing network settings',
|
|
71
|
+
ALREADY_SUBSCRIBED: 'You already have an active subscription',
|
|
72
|
+
LIMIT_EXCEEDED: 'Resource limit reached. Check plan limits or remove unused resources',
|
|
73
|
+
UNAUTHORIZED: 'Session expired or invalid. Run `lobster login` to re-authenticate',
|
|
74
|
+
INTERNAL_ERROR: 'Server error. Try again in a moment, or check https://status.lobstercage.ai',
|
|
75
|
+
CONFLICT: 'Resource conflict. Another operation may be in progress',
|
|
76
|
+
CAGE_STATUS_CHANGED: 'Cage status changed concurrently. Refresh and retry your command',
|
|
77
|
+
NOT_FOUND: 'Resource not found. Verify the identifier and try again',
|
|
78
|
+
BAD_REQUEST: 'Invalid request. Check command arguments and try again',
|
|
59
79
|
};
|
|
60
80
|
/**
|
|
61
81
|
* Check if debug mode is enabled via --debug flag or DEBUG env var.
|
|
@@ -80,10 +100,11 @@ function handleError(err, options = {}) {
|
|
|
80
100
|
}
|
|
81
101
|
if (err instanceof api_1.ApiClientError) {
|
|
82
102
|
if (json) {
|
|
83
|
-
output.json({ error: err.code, message: err.message });
|
|
103
|
+
output.json({ error: err.code, message: err.message, statusCode: err.statusCode });
|
|
84
104
|
}
|
|
85
105
|
else {
|
|
86
|
-
|
|
106
|
+
const label = err.statusCode ? `Error [${err.statusCode}]: ${err.message}` : err.message;
|
|
107
|
+
output.error(label);
|
|
87
108
|
const suggestion = SUGGESTIONS[err.code];
|
|
88
109
|
if (suggestion) {
|
|
89
110
|
output.info(suggestion);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/lib/error-handler.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/lib/error-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource Analysis
|
|
3
|
+
*
|
|
4
|
+
* Samples CPU, memory, and process manager info. Estimates active vs idle time.
|
|
5
|
+
*/
|
|
6
|
+
import type { ResourceSample, ActiveTimeEstimate, TriggerInfo } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Take a quick resource sample from the current machine.
|
|
9
|
+
*/
|
|
10
|
+
export declare function sampleResources(): Promise<ResourceSample>;
|
|
11
|
+
/**
|
|
12
|
+
* Estimate how many hours per day the agent is actively running.
|
|
13
|
+
*/
|
|
14
|
+
export declare function estimateActiveTime(resources: ResourceSample, triggers: TriggerInfo[]): ActiveTimeEstimate;
|
|
15
|
+
//# sourceMappingURL=analyze.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/lib/migrate/analyze.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/E;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC,CAa/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,WAAW,EAAE,GACtB,kBAAkB,CA0CpB"}
|