geni-bioinfo 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/dist/auth.d.ts +8 -0
  2. package/dist/auth.js +76 -0
  3. package/dist/aws/clients.d.ts +18 -0
  4. package/dist/aws/clients.js +34 -0
  5. package/dist/commands/activate.d.ts +2 -0
  6. package/dist/commands/activate.js +20 -0
  7. package/dist/commands/activity-log.d.ts +2 -0
  8. package/dist/commands/activity-log.js +31 -0
  9. package/dist/commands/api-token.d.ts +2 -0
  10. package/dist/commands/api-token.js +96 -0
  11. package/dist/commands/auth.d.ts +2 -0
  12. package/dist/commands/auth.js +55 -0
  13. package/dist/commands/engine.d.ts +2 -0
  14. package/dist/commands/engine.js +83 -0
  15. package/dist/commands/environment.d.ts +2 -0
  16. package/dist/commands/environment.js +69 -0
  17. package/dist/commands/image.d.ts +2 -0
  18. package/dist/commands/image.js +40 -0
  19. package/dist/commands/instance.d.ts +2 -0
  20. package/dist/commands/instance.js +39 -0
  21. package/dist/commands/log.d.ts +3 -0
  22. package/dist/commands/log.js +43 -0
  23. package/dist/commands/login.d.ts +2 -0
  24. package/dist/commands/login.js +24 -0
  25. package/dist/commands/plugin.d.ts +2 -0
  26. package/dist/commands/plugin.js +80 -0
  27. package/dist/commands/queue.d.ts +2 -0
  28. package/dist/commands/queue.js +74 -0
  29. package/dist/commands/registry.d.ts +2 -0
  30. package/dist/commands/registry.js +72 -0
  31. package/dist/commands/setup/create.d.ts +2 -0
  32. package/dist/commands/setup/create.js +254 -0
  33. package/dist/commands/setup/delete.d.ts +2 -0
  34. package/dist/commands/setup/delete.js +97 -0
  35. package/dist/commands/setup/status.d.ts +2 -0
  36. package/dist/commands/setup/status.js +46 -0
  37. package/dist/commands/setup.d.ts +2 -0
  38. package/dist/commands/setup.js +13 -0
  39. package/dist/commands/storage.d.ts +2 -0
  40. package/dist/commands/storage.js +67 -0
  41. package/dist/commands/submission.d.ts +2 -0
  42. package/dist/commands/submission.js +87 -0
  43. package/dist/commands/task.d.ts +2 -0
  44. package/dist/commands/task.js +21 -0
  45. package/dist/commands/tenant.d.ts +2 -0
  46. package/dist/commands/tenant.js +68 -0
  47. package/dist/commands/user.d.ts +2 -0
  48. package/dist/commands/user.js +82 -0
  49. package/dist/commands/workflow.d.ts +2 -0
  50. package/dist/commands/workflow.js +80 -0
  51. package/dist/errors.d.ts +38 -0
  52. package/dist/errors.js +194 -0
  53. package/dist/format.d.ts +22 -0
  54. package/dist/format.js +155 -0
  55. package/dist/index.d.ts +2 -0
  56. package/dist/index.js +91 -0
  57. package/dist/templates/setup.yaml +503 -0
  58. package/package.json +49 -0
package/dist/auth.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export declare function apiUrl(apiPath: string): string;
2
+ export declare function getAuthHeaders(): Record<string, string>;
3
+ export declare function fetchJson(url: string, init?: RequestInit): Promise<unknown>;
4
+ export declare function readJsonResponse(res: Response, context?: {
5
+ method?: string;
6
+ url?: string;
7
+ }): Promise<unknown>;
8
+ export declare function saveCredentials(token: string): void;
package/dist/auth.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.apiUrl = apiUrl;
7
+ exports.getAuthHeaders = getAuthHeaders;
8
+ exports.fetchJson = fetchJson;
9
+ exports.readJsonResponse = readJsonResponse;
10
+ exports.saveCredentials = saveCredentials;
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const path_1 = __importDefault(require("path"));
13
+ const os_1 = __importDefault(require("os"));
14
+ const errors_1 = require("./errors");
15
+ const CREDENTIALS_FILE = path_1.default.join(os_1.default.homedir(), '.geni', 'credentials.json');
16
+ function apiUrl(apiPath) {
17
+ const base = process.env.GENI_API_URL ?? 'https://workflows-api.geni-bioinfo.com.br';
18
+ return `${base}${apiPath}`;
19
+ }
20
+ function getAuthHeaders() {
21
+ // 1. API token from env var → X-API-Key
22
+ if (process.env.GENI_API_TOKEN) {
23
+ return { 'X-API-Key': process.env.GENI_API_TOKEN };
24
+ }
25
+ // 2. Stored JWT from login → Authorization: Bearer
26
+ try {
27
+ const data = JSON.parse(fs_1.default.readFileSync(CREDENTIALS_FILE, 'utf-8'));
28
+ if (data.token) {
29
+ return { Authorization: `Bearer ${data.token}` };
30
+ }
31
+ }
32
+ catch {
33
+ // No stored credentials
34
+ }
35
+ return {};
36
+ }
37
+ async function fetchJson(url, init) {
38
+ const headers = {
39
+ ...getAuthHeaders(),
40
+ ...(init?.headers ?? {}),
41
+ };
42
+ const res = await fetch(url, { ...init, headers });
43
+ return readJsonResponse(res, { method: (init?.method ?? 'GET').toUpperCase(), url });
44
+ }
45
+ async function readJsonResponse(res, context) {
46
+ const body = await res.text();
47
+ const parsedBody = parseJsonBody(body);
48
+ if (!res.ok) {
49
+ throw new errors_1.HttpRequestError({
50
+ status: res.status,
51
+ method: context?.method ?? 'GET',
52
+ url: context?.url ?? res.url,
53
+ body,
54
+ parsedBody,
55
+ });
56
+ }
57
+ return parsedBody;
58
+ }
59
+ function parseJsonBody(body) {
60
+ if (!body)
61
+ return null;
62
+ try {
63
+ return JSON.parse(body);
64
+ }
65
+ catch {
66
+ return body;
67
+ }
68
+ }
69
+ function saveCredentials(token) {
70
+ const dir = path_1.default.dirname(CREDENTIALS_FILE);
71
+ if (!fs_1.default.existsSync(dir)) {
72
+ fs_1.default.mkdirSync(dir, { recursive: true });
73
+ }
74
+ fs_1.default.writeFileSync(CREDENTIALS_FILE, JSON.stringify({ token }, null, 2), { mode: 0o600 });
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0Esd0JBR0M7QUFFRCx3Q0FpQkM7QUFFRCw4QkFRQztBQUVELDRDQWdCQztBQVdELDBDQU1DO0FBMUVELDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLHFDQUE0QztBQUU1QyxNQUFNLGdCQUFnQixHQUFHLGNBQUksQ0FBQyxJQUFJLENBQUMsWUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBRTlFLFNBQWdCLE1BQU0sQ0FBQyxPQUFlO0lBQ3BDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLDJDQUEyQyxDQUFDO0lBQ3JGLE9BQU8sR0FBRyxJQUFJLEdBQUcsT0FBTyxFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVELFNBQWdCLGNBQWM7SUFDNUIsd0NBQXdDO0lBQ3hDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMvQixPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxJQUFJLENBQUM7UUFDSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHdCQUF3QjtJQUMxQixDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRU0sS0FBSyxVQUFVLFNBQVMsQ0FBQyxHQUFXLEVBQUUsSUFBa0I7SUFDN0QsTUFBTSxPQUFPLEdBQTJCO1FBQ3RDLEdBQUcsY0FBYyxFQUFFO1FBQ25CLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBaUMsSUFBSSxFQUFFLENBQUM7S0FDbkQsQ0FBQztJQUVGLE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkQsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUVNLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsR0FBYSxFQUNiLE9BQTJDO0lBRTNDLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLHlCQUFnQixDQUFDO1lBQ3pCLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTTtZQUNsQixNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxLQUFLO1lBQ2hDLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHO1lBQzVCLElBQUk7WUFDSixVQUFVO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUNELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQ2pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLEtBQWE7SUFDM0MsTUFBTSxHQUFHLEdBQUcsY0FBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxZQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsWUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsWUFBRSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDMUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgeyBIdHRwUmVxdWVzdEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5jb25zdCBDUkVERU5USUFMU19GSUxFID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5nZW5pJywgJ2NyZWRlbnRpYWxzLmpzb24nKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFwaVVybChhcGlQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gcHJvY2Vzcy5lbnYuR0VOSV9BUElfVVJMID8/ICdodHRwczovL3dvcmtmbG93cy1hcGkuZ2VuaS1iaW9pbmZvLmNvbS5icic7XG4gIHJldHVybiBgJHtiYXNlfSR7YXBpUGF0aH1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aEhlYWRlcnMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIC8vIDEuIEFQSSB0b2tlbiBmcm9tIGVudiB2YXIg4oaSIFgtQVBJLUtleVxuICBpZiAocHJvY2Vzcy5lbnYuR0VOSV9BUElfVE9LRU4pIHtcbiAgICByZXR1cm4geyAnWC1BUEktS2V5JzogcHJvY2Vzcy5lbnYuR0VOSV9BUElfVE9LRU4gfTtcbiAgfVxuXG4gIC8vIDIuIFN0b3JlZCBKV1QgZnJvbSBsb2dpbiDihpIgQXV0aG9yaXphdGlvbjogQmVhcmVyXG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKENSRURFTlRJQUxTX0ZJTEUsICd1dGYtOCcpKTtcbiAgICBpZiAoZGF0YS50b2tlbikge1xuICAgICAgcmV0dXJuIHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2RhdGEudG9rZW59YCB9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gTm8gc3RvcmVkIGNyZWRlbnRpYWxzXG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmZXRjaEpzb24odXJsOiBzdHJpbmcsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIC4uLmdldEF1dGhIZWFkZXJzKCksXG4gICAgLi4uKGluaXQ/LmhlYWRlcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiA/PyB7fSksXG4gIH07XG5cbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IC4uLmluaXQsIGhlYWRlcnMgfSk7XG4gIHJldHVybiByZWFkSnNvblJlc3BvbnNlKHJlcywgeyBtZXRob2Q6IChpbml0Py5tZXRob2QgPz8gJ0dFVCcpLnRvVXBwZXJDYXNlKCksIHVybCB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRKc29uUmVzcG9uc2UoXG4gIHJlczogUmVzcG9uc2UsXG4gIGNvbnRleHQ/OiB7IG1ldGhvZD86IHN0cmluZzsgdXJsPzogc3RyaW5nIH0sXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gIGNvbnN0IHBhcnNlZEJvZHkgPSBwYXJzZUpzb25Cb2R5KGJvZHkpO1xuICBpZiAoIXJlcy5vaykge1xuICAgIHRocm93IG5ldyBIdHRwUmVxdWVzdEVycm9yKHtcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIG1ldGhvZDogY29udGV4dD8ubWV0aG9kID8/ICdHRVQnLFxuICAgICAgdXJsOiBjb250ZXh0Py51cmwgPz8gcmVzLnVybCxcbiAgICAgIGJvZHksXG4gICAgICBwYXJzZWRCb2R5LFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXJzZWRCb2R5O1xufVxuXG5mdW5jdGlvbiBwYXJzZUpzb25Cb2R5KGJvZHk6IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoIWJvZHkpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGJvZHkpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gYm9keTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2F2ZUNyZWRlbnRpYWxzKHRva2VuOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGlyID0gcGF0aC5kaXJuYW1lKENSRURFTlRJQUxTX0ZJTEUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG4gIGZzLndyaXRlRmlsZVN5bmMoQ1JFREVOVElBTFNfRklMRSwgSlNPTi5zdHJpbmdpZnkoeyB0b2tlbiB9LCBudWxsLCAyKSwgeyBtb2RlOiAwbzYwMCB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,18 @@
1
+ import { CloudFormationClient } from '@aws-sdk/client-cloudformation';
2
+ import { IAMClient } from '@aws-sdk/client-iam';
3
+ import { S3Client } from '@aws-sdk/client-s3';
4
+ import { STSClient } from '@aws-sdk/client-sts';
5
+ export declare function createClients(region: string, profile?: string): {
6
+ cfn: CloudFormationClient;
7
+ iam: IAMClient;
8
+ s3: S3Client;
9
+ sts: STSClient;
10
+ };
11
+ export declare function getCallerIdentity(sts: STSClient): Promise<{
12
+ account: string;
13
+ arn: string;
14
+ }>;
15
+ export declare function parseAwsUri(uri: string): {
16
+ account: string;
17
+ region: string;
18
+ };
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createClients = createClients;
4
+ exports.getCallerIdentity = getCallerIdentity;
5
+ exports.parseAwsUri = parseAwsUri;
6
+ const client_cloudformation_1 = require("@aws-sdk/client-cloudformation");
7
+ const client_iam_1 = require("@aws-sdk/client-iam");
8
+ const client_s3_1 = require("@aws-sdk/client-s3");
9
+ const client_sts_1 = require("@aws-sdk/client-sts");
10
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
11
+ const errors_1 = require("../errors");
12
+ function createClients(region, profile) {
13
+ const credentials = (0, credential_providers_1.fromNodeProviderChain)({ profile });
14
+ const cfn = new client_cloudformation_1.CloudFormationClient({ region, credentials });
15
+ const iam = new client_iam_1.IAMClient({ credentials }); // IAM is global — no region needed
16
+ const s3 = new client_s3_1.S3Client({ region, credentials });
17
+ const sts = new client_sts_1.STSClient({ region, credentials });
18
+ return { cfn, iam, s3, sts };
19
+ }
20
+ async function getCallerIdentity(sts) {
21
+ const response = await sts.send(new client_sts_1.GetCallerIdentityCommand({}));
22
+ return {
23
+ account: response.Account,
24
+ arn: response.Arn,
25
+ };
26
+ }
27
+ function parseAwsUri(uri) {
28
+ const match = uri.match(/^aws:\/\/(\d{12})\/([a-z0-9-]+)$/);
29
+ if (!match) {
30
+ throw (0, errors_1.invalidArgument)(`Invalid AWS URI: "${uri}". Expected format: aws://<12-digit-account>/<region>`, 'Example: aws://123456789012/us-east-1');
31
+ }
32
+ return { account: match[1], region: match[2] };
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hd3MvY2xpZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQU9BLHNDQVNDO0FBRUQsOENBTUM7QUFFRCxrQ0FTQztBQW5DRCwwRUFBc0U7QUFDdEUsb0RBQWdEO0FBQ2hELGtEQUE4QztBQUM5QyxvREFBMEU7QUFDMUUsd0VBQXNFO0FBQ3RFLHNDQUE0QztBQUU1QyxTQUFnQixhQUFhLENBQUMsTUFBYyxFQUFFLE9BQWdCO0lBQzFELE1BQU0sV0FBVyxHQUFHLElBQUEsNENBQXFCLEVBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBRXZELE1BQU0sR0FBRyxHQUFHLElBQUksNENBQW9CLENBQUMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLHNCQUFTLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUNBQW1DO0lBQy9FLE1BQU0sRUFBRSxHQUFHLElBQUksb0JBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksc0JBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqQyxDQUFDO0FBRU0sS0FBSyxVQUFVLGlCQUFpQixDQUFDLEdBQWM7SUFDbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUkscUNBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPO1FBQ0gsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFRO1FBQzFCLEdBQUcsRUFBRSxRQUFRLENBQUMsR0FBSTtLQUNyQixDQUFDO0FBQ04sQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxHQUFXO0lBQ25DLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVCxNQUFNLElBQUEsd0JBQWUsRUFDakIscUJBQXFCLEdBQUcsdURBQXVELEVBQy9FLHVDQUF1QyxDQUMxQyxDQUFDO0lBQ04sQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtY2xvdWRmb3JtYXRpb24nO1xuaW1wb3J0IHsgSUFNQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWlhbSc7XG5pbXBvcnQgeyBTM0NsaWVudCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zMyc7XG5pbXBvcnQgeyBTVFNDbGllbnQsIEdldENhbGxlcklkZW50aXR5Q29tbWFuZCB9IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1zdHMnO1xuaW1wb3J0IHsgZnJvbU5vZGVQcm92aWRlckNoYWluIH0gZnJvbSAnQGF3cy1zZGsvY3JlZGVudGlhbC1wcm92aWRlcnMnO1xuaW1wb3J0IHsgaW52YWxpZEFyZ3VtZW50IH0gZnJvbSAnLi4vZXJyb3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNsaWVudHMocmVnaW9uOiBzdHJpbmcsIHByb2ZpbGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IGZyb21Ob2RlUHJvdmlkZXJDaGFpbih7IHByb2ZpbGUgfSk7XG5cbiAgICBjb25zdCBjZm4gPSBuZXcgQ2xvdWRGb3JtYXRpb25DbGllbnQoeyByZWdpb24sIGNyZWRlbnRpYWxzIH0pO1xuICAgIGNvbnN0IGlhbSA9IG5ldyBJQU1DbGllbnQoeyBjcmVkZW50aWFscyB9KTsgLy8gSUFNIGlzIGdsb2JhbCDigJQgbm8gcmVnaW9uIG5lZWRlZFxuICAgIGNvbnN0IHMzID0gbmV3IFMzQ2xpZW50KHsgcmVnaW9uLCBjcmVkZW50aWFscyB9KTtcbiAgICBjb25zdCBzdHMgPSBuZXcgU1RTQ2xpZW50KHsgcmVnaW9uLCBjcmVkZW50aWFscyB9KTtcblxuICAgIHJldHVybiB7IGNmbiwgaWFtLCBzMywgc3RzIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDYWxsZXJJZGVudGl0eShzdHM6IFNUU0NsaWVudCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RzLnNlbmQobmV3IEdldENhbGxlcklkZW50aXR5Q29tbWFuZCh7fSkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFjY291bnQ6IHJlc3BvbnNlLkFjY291bnQhLFxuICAgICAgICBhcm46IHJlc3BvbnNlLkFybiEsXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQXdzVXJpKHVyaTogc3RyaW5nKTogeyBhY2NvdW50OiBzdHJpbmc7IHJlZ2lvbjogc3RyaW5nIH0ge1xuICAgIGNvbnN0IG1hdGNoID0gdXJpLm1hdGNoKC9eYXdzOlxcL1xcLyhcXGR7MTJ9KVxcLyhbYS16MC05LV0rKSQvKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgIHRocm93IGludmFsaWRBcmd1bWVudChcbiAgICAgICAgICAgIGBJbnZhbGlkIEFXUyBVUkk6IFwiJHt1cml9XCIuIEV4cGVjdGVkIGZvcm1hdDogYXdzOi8vPDEyLWRpZ2l0LWFjY291bnQ+LzxyZWdpb24+YCxcbiAgICAgICAgICAgICdFeGFtcGxlOiBhd3M6Ly8xMjM0NTY3ODkwMTIvdXMtZWFzdC0xJyxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgYWNjb3VudDogbWF0Y2hbMV0sIHJlZ2lvbjogbWF0Y2hbMl0gfTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const activateCommand: Command;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.activateCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const auth_1 = require("../auth");
6
+ exports.activateCommand = new commander_1.Command('activate')
7
+ .description('Activate your user or reset password')
8
+ .requiredOption('--token <token>', 'Activation token from the email link')
9
+ .requiredOption('--password <password>', 'Password to set for your account')
10
+ .action(async (opts) => {
11
+ const res = await fetch((0, auth_1.apiUrl)('/auth/activate'), {
12
+ method: 'POST',
13
+ headers: { 'Content-Type': 'application/json' },
14
+ body: JSON.stringify({ token: opts.token, password: opts.password }),
15
+ });
16
+ const data = await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/activate') });
17
+ (0, auth_1.saveCredentials)(data.accessToken);
18
+ console.log('Account activated. Credentials saved to ~/.geni/credentials.json');
19
+ });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYWN0aXZhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQW9DO0FBQ3BDLGtDQUFvRTtBQUV2RCxRQUFBLGVBQWUsR0FBRyxJQUFJLG1CQUFPLENBQUMsVUFBVSxDQUFDO0tBQ25ELFdBQVcsQ0FBQyxzQ0FBc0MsQ0FBQztLQUNuRCxjQUFjLENBQUMsaUJBQWlCLEVBQUUsc0NBQXNDLENBQUM7S0FDekUsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGtDQUFrQyxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBeUMsRUFBRSxFQUFFO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDaEQsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7UUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3JFLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSx1QkFBZ0IsRUFBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFBLGFBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBRXpGLENBQUM7SUFDRixJQUFBLHNCQUFlLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0VBQWtFLENBQUMsQ0FBQztBQUNsRixDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYXBpVXJsLCByZWFkSnNvblJlc3BvbnNlLCBzYXZlQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hdXRoJztcblxuZXhwb3J0IGNvbnN0IGFjdGl2YXRlQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdhY3RpdmF0ZScpXG4gIC5kZXNjcmlwdGlvbignQWN0aXZhdGUgeW91ciB1c2VyIG9yIHJlc2V0IHBhc3N3b3JkJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLXRva2VuIDx0b2tlbj4nLCAnQWN0aXZhdGlvbiB0b2tlbiBmcm9tIHRoZSBlbWFpbCBsaW5rJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLXBhc3N3b3JkIDxwYXNzd29yZD4nLCAnUGFzc3dvcmQgdG8gc2V0IGZvciB5b3VyIGFjY291bnQnKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzOiB7IHRva2VuOiBzdHJpbmc7IHBhc3N3b3JkOiBzdHJpbmcgfSkgPT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGFwaVVybCgnL2F1dGgvYWN0aXZhdGUnKSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9rZW46IG9wdHMudG9rZW4sIHBhc3N3b3JkOiBvcHRzLnBhc3N3b3JkIH0pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZWFkSnNvblJlc3BvbnNlKHJlcywgeyBtZXRob2Q6ICdQT1NUJywgdXJsOiBhcGlVcmwoJy9hdXRoL2FjdGl2YXRlJykgfSkgYXMge1xuICAgICAgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgICB9O1xuICAgIHNhdmVDcmVkZW50aWFscyhkYXRhLmFjY2Vzc1Rva2VuKTtcbiAgICBjb25zb2xlLmxvZygnQWNjb3VudCBhY3RpdmF0ZWQuIENyZWRlbnRpYWxzIHNhdmVkIHRvIH4vLmdlbmkvY3JlZGVudGlhbHMuanNvbicpO1xuICB9KTtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const activityLogCommand: Command;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.activityLogCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const auth_1 = require("../auth");
6
+ const format_js_1 = require("../format.js");
7
+ exports.activityLogCommand = new commander_1.Command('activity-log')
8
+ .description('Manage activity logs');
9
+ exports.activityLogCommand
10
+ .command('list')
11
+ .description('List activity logs')
12
+ .option('--action <action>', 'Filter by action (CREATE, UPDATE, DELETE)')
13
+ .option('--entity-type <type>', 'Filter by entity type')
14
+ .option('--entity-id <id>', 'Filter by entity ID')
15
+ .option('--user-id <id>', 'Filter by user ID')
16
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
17
+ .action(async (opts) => {
18
+ const params = new URLSearchParams();
19
+ if (opts.action)
20
+ params.set('action', opts.action);
21
+ if (opts.entityType)
22
+ params.set('entityType', opts.entityType);
23
+ if (opts.entityId)
24
+ params.set('entityId', opts.entityId);
25
+ if (opts.userId)
26
+ params.set('userId', opts.userId);
27
+ const query = params.toString() ? `?${params.toString()}` : '';
28
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/activity-logs${query}`));
29
+ (0, format_js_1.formatOutput)(opts.format === 'json' ? data : data.items, opts.format, format_js_1.activityLogColumns);
30
+ });
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZpdHktbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2FjdGl2aXR5LWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBMkM7QUFDM0Msa0NBQTJDO0FBQzNDLDRDQUFrRjtBQUVyRSxRQUFBLGtCQUFrQixHQUFHLElBQUksbUJBQU8sQ0FBQyxjQUFjLENBQUM7S0FDMUQsV0FBVyxDQUFDLHNCQUFzQixDQUFDLENBQUE7QUFFdEMsMEJBQWtCO0tBQ2YsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNmLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztLQUNqQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsMkNBQTJDLENBQUM7S0FDeEUsTUFBTSxDQUFDLHNCQUFzQixFQUFFLHVCQUF1QixDQUFDO0tBQ3ZELE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxxQkFBcUIsQ0FBQztLQUNqRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsbUJBQW1CLENBQUM7S0FDN0MsU0FBUyxDQUFDLElBQUksa0JBQU0sQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQzlHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFNZCxFQUFFLEVBQUU7SUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFBO0lBQ3BDLElBQUksSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsSUFBSSxJQUFJLENBQUMsVUFBVTtRQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUM5RCxJQUFJLElBQUksQ0FBQyxRQUFRO1FBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQ3hELElBQUksSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFBLGdCQUFTLEVBQUMsSUFBQSxhQUFNLEVBQUMsaUJBQWlCLEtBQUssRUFBRSxDQUFDLENBQXlCLENBQUE7SUFDdEYsSUFBQSx3QkFBWSxFQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSw4QkFBa0IsQ0FBQyxDQUFBO0FBQzNGLENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY29tbWFuZGVyJ1xuaW1wb3J0IHsgYXBpVXJsLCBmZXRjaEpzb24gfSBmcm9tICcuLi9hdXRoJ1xuaW1wb3J0IHsgZm9ybWF0T3V0cHV0LCBhY3Rpdml0eUxvZ0NvbHVtbnMsIHR5cGUgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnLi4vZm9ybWF0LmpzJ1xuXG5leHBvcnQgY29uc3QgYWN0aXZpdHlMb2dDb21tYW5kID0gbmV3IENvbW1hbmQoJ2FjdGl2aXR5LWxvZycpXG4gIC5kZXNjcmlwdGlvbignTWFuYWdlIGFjdGl2aXR5IGxvZ3MnKVxuXG5hY3Rpdml0eUxvZ0NvbW1hbmRcbiAgLmNvbW1hbmQoJ2xpc3QnKVxuICAuZGVzY3JpcHRpb24oJ0xpc3QgYWN0aXZpdHkgbG9ncycpXG4gIC5vcHRpb24oJy0tYWN0aW9uIDxhY3Rpb24+JywgJ0ZpbHRlciBieSBhY3Rpb24gKENSRUFURSwgVVBEQVRFLCBERUxFVEUpJylcbiAgLm9wdGlvbignLS1lbnRpdHktdHlwZSA8dHlwZT4nLCAnRmlsdGVyIGJ5IGVudGl0eSB0eXBlJylcbiAgLm9wdGlvbignLS1lbnRpdHktaWQgPGlkPicsICdGaWx0ZXIgYnkgZW50aXR5IElEJylcbiAgLm9wdGlvbignLS11c2VyLWlkIDxpZD4nLCAnRmlsdGVyIGJ5IHVzZXIgSUQnKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czoge1xuICAgIGFjdGlvbj86IHN0cmluZ1xuICAgIGVudGl0eVR5cGU/OiBzdHJpbmdcbiAgICBlbnRpdHlJZD86IHN0cmluZ1xuICAgIHVzZXJJZD86IHN0cmluZ1xuICAgIGZvcm1hdDogT3V0cHV0Rm9ybWF0XG4gIH0pID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICBpZiAob3B0cy5hY3Rpb24pIHBhcmFtcy5zZXQoJ2FjdGlvbicsIG9wdHMuYWN0aW9uKVxuICAgIGlmIChvcHRzLmVudGl0eVR5cGUpIHBhcmFtcy5zZXQoJ2VudGl0eVR5cGUnLCBvcHRzLmVudGl0eVR5cGUpXG4gICAgaWYgKG9wdHMuZW50aXR5SWQpIHBhcmFtcy5zZXQoJ2VudGl0eUlkJywgb3B0cy5lbnRpdHlJZClcbiAgICBpZiAob3B0cy51c2VySWQpIHBhcmFtcy5zZXQoJ3VzZXJJZCcsIG9wdHMudXNlcklkKVxuICAgIGNvbnN0IHF1ZXJ5ID0gcGFyYW1zLnRvU3RyaW5nKCkgPyBgPyR7cGFyYW1zLnRvU3RyaW5nKCl9YCA6ICcnXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoSnNvbihhcGlVcmwoYC9hY3Rpdml0eS1sb2dzJHtxdWVyeX1gKSkgYXMgeyBpdGVtczogdW5rbm93bltdIH1cbiAgICBmb3JtYXRPdXRwdXQob3B0cy5mb3JtYXQgPT09ICdqc29uJyA/IGRhdGEgOiBkYXRhLml0ZW1zLCBvcHRzLmZvcm1hdCwgYWN0aXZpdHlMb2dDb2x1bW5zKVxuICB9KVxuIl19
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const apiTokenCommand: Command;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.apiTokenCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const auth_1 = require("../auth");
6
+ const format_js_1 = require("../format.js");
7
+ const apiTokenColumns = [
8
+ { header: 'ID', value: (r) => r.id },
9
+ { header: 'Prefix', value: (r) => r.token_prefix },
10
+ { header: 'Role', value: (r) => r.role ?? '' },
11
+ { header: 'Description', value: (r) => r.description },
12
+ { header: 'Environment ID', value: (r) => r.environment_id ?? '' },
13
+ { header: 'Created By', value: (r) => r.created_by },
14
+ { header: 'Expires At', value: (r) => r.expires_at },
15
+ { header: 'Last Used At', value: (r) => r.last_used_at },
16
+ { header: 'Active', value: (r) => r.is_active },
17
+ ];
18
+ exports.apiTokenCommand = new commander_1.Command('api-token')
19
+ .description('Manage API tokens');
20
+ exports.apiTokenCommand
21
+ .command('list')
22
+ .description('List API tokens for the current tenant')
23
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
24
+ .action(async (opts) => {
25
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/api-tokens'));
26
+ (0, format_js_1.formatOutput)(data, opts.format, apiTokenColumns);
27
+ });
28
+ exports.apiTokenCommand
29
+ .command('get <id>')
30
+ .description('Get details of an API token')
31
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
32
+ .action(async (id, opts) => {
33
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/api-tokens/${id}`));
34
+ (0, format_js_1.formatOutput)(data, opts.format, apiTokenColumns);
35
+ });
36
+ exports.apiTokenCommand
37
+ .command('create')
38
+ .description('Create a new API token (token is shown only once)')
39
+ .requiredOption('--name <name>', 'Token name')
40
+ .addOption(new commander_1.Option('--role <role>', 'Token role').choices(['automation']).makeOptionMandatory())
41
+ .option('--description <text>', 'Human-readable label for this token')
42
+ .option('--expires-at <date>', 'Expiration date in ISO 8601 format (max 1 year, default 1 year)')
43
+ .option('--environment-id <uuid>', 'Optional — restrict token submissions to this environment')
44
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
45
+ .action(async (opts) => {
46
+ const body = { name: opts.name, role: opts.role };
47
+ if (opts.description)
48
+ body.description = opts.description;
49
+ if (opts.expiresAt)
50
+ body.expires_at = opts.expiresAt;
51
+ if (opts.environmentId)
52
+ body.environment_id = opts.environmentId;
53
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/api-tokens'), {
54
+ method: 'POST',
55
+ headers: { 'Content-Type': 'application/json' },
56
+ body: JSON.stringify(body),
57
+ });
58
+ if (opts.format === 'json') {
59
+ console.log(JSON.stringify(data, null, 2));
60
+ }
61
+ else {
62
+ console.log('');
63
+ console.log('API token created. Save this token — it will not be shown again.');
64
+ console.log('');
65
+ console.log(`Token: ${data.token}`);
66
+ console.log('');
67
+ const row = { ...data };
68
+ delete row.token;
69
+ (0, format_js_1.formatOutput)(row, opts.format, apiTokenColumns);
70
+ }
71
+ });
72
+ exports.apiTokenCommand
73
+ .command('revoke <id>')
74
+ .description('Revoke an API token')
75
+ .action(async (id) => {
76
+ await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/api-tokens/${id}`), { method: 'DELETE' });
77
+ console.log('Token revoked.');
78
+ });
79
+ exports.apiTokenCommand
80
+ .command('revoke-batch')
81
+ .description('Revoke multiple API tokens at once (Admin only)')
82
+ .requiredOption('--ids <ids>', 'Comma-separated list of token IDs to revoke')
83
+ .action(async (opts) => {
84
+ const ids = opts.ids.split(',').map((id) => id.trim()).filter(Boolean);
85
+ if (ids.length === 0) {
86
+ console.error('No IDs provided.');
87
+ process.exit(1);
88
+ }
89
+ await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/api-tokens/revoke-batch'), {
90
+ method: 'POST',
91
+ headers: { 'Content-Type': 'application/json' },
92
+ body: JSON.stringify({ ids }),
93
+ });
94
+ console.log(`${ids.length} token(s) revoked.`);
95
+ });
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2FwaS10b2tlbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBNEM7QUFDNUMsa0NBQTRDO0FBQzVDLDRDQUErRDtBQUUvRCxNQUFNLGVBQWUsR0FBRztJQUN0QixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUM3RCxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFBRTtJQUMzRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLEVBQUU7SUFDdkUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7SUFDL0UsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsSUFBSSxFQUFFLEVBQUU7SUFDM0YsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDN0UsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUU7SUFDN0UsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUU7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aW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGFwaVVybCwgZmV0Y2hKc29uIH0gZnJvbSAnLi4vYXV0aCc7XG5pbXBvcnQgeyBmb3JtYXRPdXRwdXQsIHR5cGUgT3V0cHV0Rm9ybWF0IH0gZnJvbSAnLi4vZm9ybWF0LmpzJztcblxuY29uc3QgYXBpVG9rZW5Db2x1bW5zID0gW1xuICB7IGhlYWRlcjogJ0lEJywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5pZCB9LFxuICB7IGhlYWRlcjogJ1ByZWZpeCcsIHZhbHVlOiAocjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHIudG9rZW5fcHJlZml4IH0sXG4gIHsgaGVhZGVyOiAnUm9sZScsIHZhbHVlOiAocjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHIucm9sZSA/PyAnJyB9LFxuICB7IGhlYWRlcjogJ0Rlc2NyaXB0aW9uJywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5kZXNjcmlwdGlvbiB9LFxuICB7IGhlYWRlcjogJ0Vudmlyb25tZW50IElEJywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5lbnZpcm9ubWVudF9pZCA/PyAnJyB9LFxuICB7IGhlYWRlcjogJ0NyZWF0ZWQgQnknLCB2YWx1ZTogKHI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiByLmNyZWF0ZWRfYnkgfSxcbiAgeyBoZWFkZXI6ICdFeHBpcmVzIEF0JywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5leHBpcmVzX2F0IH0sXG4gIHsgaGVhZGVyOiAnTGFzdCBVc2VkIEF0JywgdmFsdWU6IChyOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gci5sYXN0X3VzZWRfYXQgfSxcbiAgeyBoZWFkZXI6ICdBY3RpdmUnLCB2YWx1ZTogKHI6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiByLmlzX2FjdGl2ZSB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IGFwaVRva2VuQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdhcGktdG9rZW4nKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBBUEkgdG9rZW5zJyk7XG5cbmFwaVRva2VuQ29tbWFuZFxuICAuY29tbWFuZCgnbGlzdCcpXG4gIC5kZXNjcmlwdGlvbignTGlzdCBBUEkgdG9rZW5zIGZvciB0aGUgY3VycmVudCB0ZW5hbnQnKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyBmb3JtYXQ6IE91dHB1dEZvcm1hdCB9KSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoSnNvbihhcGlVcmwoJy9hZG1pbi9hcGktdG9rZW5zJykpO1xuICAgIGZvcm1hdE91dHB1dChkYXRhLCBvcHRzLmZvcm1hdCwgYXBpVG9rZW5Db2x1bW5zKTtcbiAgfSk7XG5cbmFwaVRva2VuQ29tbWFuZFxuICAuY29tbWFuZCgnZ2V0IDxpZD4nKVxuICAuZGVzY3JpcHRpb24oJ0dldCBkZXRhaWxzIG9mIGFuIEFQSSB0b2tlbicpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nLCBvcHRzOiB7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hKc29uKGFwaVVybChgL2FkbWluL2FwaS10b2tlbnMvJHtpZH1gKSk7XG4gICAgZm9ybWF0T3V0cHV0KGRhdGEsIG9wdHMuZm9ybWF0LCBhcGlUb2tlbkNvbHVtbnMpO1xuICB9KTtcblxuYXBpVG9rZW5Db21tYW5kXG4gIC5jb21tYW5kKCdjcmVhdGUnKVxuICAuZGVzY3JpcHRpb24oJ0NyZWF0ZSBhIG5ldyBBUEkgdG9rZW4gKHRva2VuIGlzIHNob3duIG9ubHkgb25jZSknKVxuICAucmVxdWlyZWRPcHRpb24oJy0tbmFtZSA8bmFtZT4nLCAnVG9rZW4gbmFtZScpXG4gIC5hZGRPcHRpb24oXG4gICAgbmV3IE9wdGlvbignLS1yb2xlIDxyb2xlPicsICdUb2tlbiByb2xlJykuY2hvaWNlcyhbJ2F1dG9tYXRpb24nXSkubWFrZU9wdGlvbk1hbmRhdG9yeSgpLFxuICApXG4gIC5vcHRpb24oJy0tZGVzY3JpcHRpb24gPHRleHQ+JywgJ0h1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIHRva2VuJylcbiAgLm9wdGlvbignLS1leHBpcmVzLWF0IDxkYXRlPicsICdFeHBpcmF0aW9uIGRhdGUgaW4gSVNPIDg2MDEgZm9ybWF0IChtYXggMSB5ZWFyLCBkZWZhdWx0IDEgeWVhciknKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50LWlkIDx1dWlkPicsICdPcHRpb25hbCDigJQgcmVzdHJpY3QgdG9rZW4gc3VibWlzc2lvbnMgdG8gdGhpcyBlbnZpcm9ubWVudCcpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzOiB7IG5hbWU6IHN0cmluZzsgcm9sZTogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgZXhwaXJlc0F0Pzogc3RyaW5nOyBlbnZpcm9ubWVudElkPzogc3RyaW5nOyBmb3JtYXQ6IE91dHB1dEZvcm1hdCB9KSA9PiB7XG4gICAgY29uc3QgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IG5hbWU6IG9wdHMubmFtZSwgcm9sZTogb3B0cy5yb2xlIH07XG4gICAgaWYgKG9wdHMuZGVzY3JpcHRpb24pIGJvZHkuZGVzY3JpcHRpb24gPSBvcHRzLmRlc2NyaXB0aW9uO1xuICAgIGlmIChvcHRzLmV4cGlyZXNBdCkgYm9keS5leHBpcmVzX2F0ID0gb3B0cy5leHBpcmVzQXQ7XG4gICAgaWYgKG9wdHMuZW52aXJvbm1lbnRJZCkgYm9keS5lbnZpcm9ubWVudF9pZCA9IG9wdHMuZW52aXJvbm1lbnRJZDtcblxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKCcvYWRtaW4vYXBpLXRva2VucycpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICBpZiAob3B0cy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICBjb25zb2xlLmxvZygnQVBJIHRva2VuIGNyZWF0ZWQuIFNhdmUgdGhpcyB0b2tlbiDigJQgaXQgd2lsbCBub3QgYmUgc2hvd24gYWdhaW4uJyk7XG4gICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICBjb25zb2xlLmxvZyhgVG9rZW46ICR7ZGF0YS50b2tlbn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgIGNvbnN0IHJvdyA9IHsgLi4uZGF0YSB9O1xuICAgICAgZGVsZXRlIHJvdy50b2tlbjtcbiAgICAgIGZvcm1hdE91dHB1dChyb3csIG9wdHMuZm9ybWF0LCBhcGlUb2tlbkNvbHVtbnMpO1xuICAgIH1cbiAgfSk7XG5cbmFwaVRva2VuQ29tbWFuZFxuICAuY29tbWFuZCgncmV2b2tlIDxpZD4nKVxuICAuZGVzY3JpcHRpb24oJ1Jldm9rZSBhbiBBUEkgdG9rZW4nKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4gICAgYXdhaXQgZmV0Y2hKc29uKGFwaVVybChgL2FkbWluL2FwaS10b2tlbnMvJHtpZH1gKSwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgIGNvbnNvbGUubG9nKCdUb2tlbiByZXZva2VkLicpO1xuICB9KTtcblxuYXBpVG9rZW5Db21tYW5kXG4gIC5jb21tYW5kKCdyZXZva2UtYmF0Y2gnKVxuICAuZGVzY3JpcHRpb24oJ1Jldm9rZSBtdWx0aXBsZSBBUEkgdG9rZW5zIGF0IG9uY2UgKEFkbWluIG9ubHkpJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLWlkcyA8aWRzPicsICdDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0b2tlbiBJRHMgdG8gcmV2b2tlJylcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyBpZHM6IHN0cmluZyB9KSA9PiB7XG4gICAgY29uc3QgaWRzID0gb3B0cy5pZHMuc3BsaXQoJywnKS5tYXAoKGlkKSA9PiBpZC50cmltKCkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5lcnJvcignTm8gSURzIHByb3ZpZGVkLicpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgICBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKCcvYWRtaW4vYXBpLXRva2Vucy9yZXZva2UtYmF0Y2gnKSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWRzIH0pLFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKGAke2lkcy5sZW5ndGh9IHRva2VuKHMpIHJldm9rZWQuYCk7XG4gIH0pO1xuIl19
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const authCommand: Command;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const auth_1 = require("../auth");
6
+ const loginSubCommand = new commander_1.Command('login')
7
+ .description('Login into GENI Workflows and store credentials')
8
+ .option('--email <email>', 'User email')
9
+ .option('--password <password>', 'User password')
10
+ .action(async (opts) => {
11
+ if (!opts.email || !opts.password) {
12
+ loginSubCommand.help();
13
+ return;
14
+ }
15
+ const res = await fetch((0, auth_1.apiUrl)('/auth/login'), {
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json' },
18
+ body: JSON.stringify({ email: opts.email, password: opts.password }),
19
+ });
20
+ const data = await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/login') });
21
+ (0, auth_1.saveCredentials)(data.accessToken);
22
+ console.log('Logged in. Credentials saved to ~/.geni/credentials.json');
23
+ });
24
+ const activateSubCommand = new commander_1.Command('activate')
25
+ .description('Activate your user account')
26
+ .requiredOption('--token <token>', 'Activation token from the email link')
27
+ .requiredOption('--password <password>', 'Password to set for your account')
28
+ .action(async (opts) => {
29
+ const res = await fetch((0, auth_1.apiUrl)('/auth/activate'), {
30
+ method: 'POST',
31
+ headers: { 'Content-Type': 'application/json' },
32
+ body: JSON.stringify({ token: opts.token, password: opts.password }),
33
+ });
34
+ const data = await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/activate') });
35
+ (0, auth_1.saveCredentials)(data.accessToken);
36
+ console.log('Account activated. Credentials saved to ~/.geni/credentials.json');
37
+ });
38
+ const resetSubCommand = new commander_1.Command('reset')
39
+ .description('Request a password reset email')
40
+ .requiredOption('--email <email>', 'Email address of the account')
41
+ .action(async (opts) => {
42
+ const res = await fetch((0, auth_1.apiUrl)('/auth/forgot-password'), {
43
+ method: 'POST',
44
+ headers: { 'Content-Type': 'application/json' },
45
+ body: JSON.stringify({ email: opts.email }),
46
+ });
47
+ await (0, auth_1.readJsonResponse)(res, { method: 'POST', url: (0, auth_1.apiUrl)('/auth/reset') });
48
+ console.log('Password reset email sent.');
49
+ });
50
+ exports.authCommand = new commander_1.Command('auth')
51
+ .description('Authentication commands')
52
+ .addCommand(loginSubCommand)
53
+ .addCommand(activateSubCommand)
54
+ .addCommand(resetSubCommand);
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUFvQztBQUNwQyxrQ0FBb0U7QUFFcEUsTUFBTSxlQUFlLEdBQUcsSUFBSSxtQkFBTyxDQUFDLE9BQU8sQ0FBQztLQUN6QyxXQUFXLENBQUMsaURBQWlELENBQUM7S0FDOUQsTUFBTSxDQUFDLGlCQUFpQixFQUFFLFlBQVksQ0FBQztLQUN2QyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsZUFBZSxDQUFDO0tBQ2hELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBMkMsRUFBRSxFQUFFO0lBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUN0QixPQUFNO0lBQ1IsQ0FBQztJQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQzdDLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUNyRSxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsdUJBQWdCLEVBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBQSxhQUFNLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FFdEYsQ0FBQztJQUNGLElBQUEsc0JBQWUsRUFBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbEMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyxDQUFDO0FBRUwsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLG1CQUFPLENBQUMsVUFBVSxDQUFDO0tBQy9DLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQztLQUN6QyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsc0NBQXNDLENBQUM7S0FDekUsY0FBYyxDQUFDLHVCQUF1QixFQUFFLGtDQUFrQyxDQUFDO0tBQzNFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBeUMsRUFBRSxFQUFFO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLElBQUEsYUFBTSxFQUFDLGdCQUFnQixDQUFDLEVBQUU7UUFDaEQsTUFBTSxFQUFFLE1BQU07UUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7UUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ3JFLENBQUMsQ0FBQztJQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBQSx1QkFBZ0IsRUFBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFBLGFBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBRXpGLENBQUM7SUFDRixJQUFBLHNCQUFlLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0VBQWtFLENBQUMsQ0FBQztBQUNsRixDQUFDLENBQUMsQ0FBQztBQUVMLE1BQU0sZUFBZSxHQUFHLElBQUksbUJBQU8sQ0FBQyxPQUFPLENBQUM7S0FDekMsV0FBVyxDQUFDLGdDQUFnQyxDQUFDO0tBQzdDLGNBQWMsQ0FBQyxpQkFBaUIsRUFBRSw4QkFBOEIsQ0FBQztLQUNqRSxNQUFNLENBQUMsS0FBSyxFQUFFLElBQXVCLEVBQUUsRUFBRTtJQUN4QyxNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFBLGFBQU0sRUFBQyx1QkFBdUIsQ0FBQyxFQUFFO1FBQ3ZELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztLQUM1QyxDQUFDLENBQUM7SUFDSCxNQUFNLElBQUEsdUJBQWdCLEVBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBQSxhQUFNLEVBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUMsQ0FBQztBQUVRLFFBQUEsV0FBVyxHQUFHLElBQUksbUJBQU8sQ0FBQyxNQUFNLENBQUM7S0FDM0MsV0FBVyxDQUFDLHlCQUF5QixDQUFDO0tBQ3RDLFVBQVUsQ0FBQyxlQUFlLENBQUM7S0FDM0IsVUFBVSxDQUFDLGtCQUFrQixDQUFDO0tBQzlCLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYXBpVXJsLCByZWFkSnNvblJlc3BvbnNlLCBzYXZlQ3JlZGVudGlhbHMgfSBmcm9tICcuLi9hdXRoJztcblxuY29uc3QgbG9naW5TdWJDb21tYW5kID0gbmV3IENvbW1hbmQoJ2xvZ2luJylcbiAgLmRlc2NyaXB0aW9uKCdMb2dpbiBpbnRvIEdFTkkgV29ya2Zsb3dzIGFuZCBzdG9yZSBjcmVkZW50aWFscycpXG4gIC5vcHRpb24oJy0tZW1haWwgPGVtYWlsPicsICdVc2VyIGVtYWlsJylcbiAgLm9wdGlvbignLS1wYXNzd29yZCA8cGFzc3dvcmQ+JywgJ1VzZXIgcGFzc3dvcmQnKVxuICAuYWN0aW9uKGFzeW5jIChvcHRzOiB7IGVtYWlsPzogc3RyaW5nOyBwYXNzd29yZD86IHN0cmluZyB9KSA9PiB7XG4gICAgaWYgKCFvcHRzLmVtYWlsIHx8ICFvcHRzLnBhc3N3b3JkKSB7XG4gICAgICBsb2dpblN1YkNvbW1hbmQuaGVscCgpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYXBpVXJsKCcvYXV0aC9sb2dpbicpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlbWFpbDogb3B0cy5lbWFpbCwgcGFzc3dvcmQ6IG9wdHMucGFzc3dvcmQgfSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlYWRKc29uUmVzcG9uc2UocmVzLCB7IG1ldGhvZDogJ1BPU1QnLCB1cmw6IGFwaVVybCgnL2F1dGgvbG9naW4nKSB9KSBhcyB7XG4gICAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICAgIH07XG4gICAgc2F2ZUNyZWRlbnRpYWxzKGRhdGEuYWNjZXNzVG9rZW4pO1xuICAgIGNvbnNvbGUubG9nKCdMb2dnZWQgaW4uIENyZWRlbnRpYWxzIHNhdmVkIHRvIH4vLmdlbmkvY3JlZGVudGlhbHMuanNvbicpO1xuICB9KTtcblxuY29uc3QgYWN0aXZhdGVTdWJDb21tYW5kID0gbmV3IENvbW1hbmQoJ2FjdGl2YXRlJylcbiAgLmRlc2NyaXB0aW9uKCdBY3RpdmF0ZSB5b3VyIHVzZXIgYWNjb3VudCcpXG4gIC5yZXF1aXJlZE9wdGlvbignLS10b2tlbiA8dG9rZW4+JywgJ0FjdGl2YXRpb24gdG9rZW4gZnJvbSB0aGUgZW1haWwgbGluaycpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1wYXNzd29yZCA8cGFzc3dvcmQ+JywgJ1Bhc3N3b3JkIHRvIHNldCBmb3IgeW91ciBhY2NvdW50JylcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyB0b2tlbjogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH0pID0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChhcGlVcmwoJy9hdXRoL2FjdGl2YXRlJyksIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRva2VuOiBvcHRzLnRva2VuLCBwYXNzd29yZDogb3B0cy5wYXNzd29yZCB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVhZEpzb25SZXNwb25zZShyZXMsIHsgbWV0aG9kOiAnUE9TVCcsIHVybDogYXBpVXJsKCcvYXV0aC9hY3RpdmF0ZScpIH0pIGFzIHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gICAgfTtcbiAgICBzYXZlQ3JlZGVudGlhbHMoZGF0YS5hY2Nlc3NUb2tlbik7XG4gICAgY29uc29sZS5sb2coJ0FjY291bnQgYWN0aXZhdGVkLiBDcmVkZW50aWFscyBzYXZlZCB0byB+Ly5nZW5pL2NyZWRlbnRpYWxzLmpzb24nKTtcbiAgfSk7XG5cbmNvbnN0IHJlc2V0U3ViQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdyZXNldCcpXG4gIC5kZXNjcmlwdGlvbignUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGVtYWlsJylcbiAgLnJlcXVpcmVkT3B0aW9uKCctLWVtYWlsIDxlbWFpbD4nLCAnRW1haWwgYWRkcmVzcyBvZiB0aGUgYWNjb3VudCcpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdHM6IHsgZW1haWw6IHN0cmluZyB9KSA9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYXBpVXJsKCcvYXV0aC9mb3Jnb3QtcGFzc3dvcmQnKSwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW1haWw6IG9wdHMuZW1haWwgfSksXG4gICAgfSk7XG4gICAgYXdhaXQgcmVhZEpzb25SZXNwb25zZShyZXMsIHsgbWV0aG9kOiAnUE9TVCcsIHVybDogYXBpVXJsKCcvYXV0aC9yZXNldCcpIH0pO1xuICAgIGNvbnNvbGUubG9nKCdQYXNzd29yZCByZXNldCBlbWFpbCBzZW50LicpO1xuICB9KTtcblxuZXhwb3J0IGNvbnN0IGF1dGhDb21tYW5kID0gbmV3IENvbW1hbmQoJ2F1dGgnKVxuICAuZGVzY3JpcHRpb24oJ0F1dGhlbnRpY2F0aW9uIGNvbW1hbmRzJylcbiAgLmFkZENvbW1hbmQobG9naW5TdWJDb21tYW5kKVxuICAuYWRkQ29tbWFuZChhY3RpdmF0ZVN1YkNvbW1hbmQpXG4gIC5hZGRDb21tYW5kKHJlc2V0U3ViQ29tbWFuZCk7XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const engineCommand: Command;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.engineCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const auth_1 = require("../auth");
6
+ const format_js_1 = require("../format.js");
7
+ const errors_js_1 = require("../errors.js");
8
+ function parseS3Uri(uri) {
9
+ const match = uri.match(/^s3:\/\/([^/]+)(\/(.+))?$/);
10
+ if (!match)
11
+ throw (0, errors_js_1.invalidArgument)(`Invalid S3 URI: "${uri}". Expected format: s3://bucket or s3://bucket/prefix`);
12
+ return { bucketName: match[1], prefix: match[3] || undefined };
13
+ }
14
+ const collect = (val, prev) => [...prev, val];
15
+ exports.engineCommand = new commander_1.Command('engine')
16
+ .description('Manage engines');
17
+ exports.engineCommand
18
+ .command('list')
19
+ .description('List engines')
20
+ .option('--status <status>', 'Filter by status (e.g. ACTIVE, PENDING, FAILED, DELETED)')
21
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
22
+ .action(async (opts) => {
23
+ const params = new URLSearchParams();
24
+ if (opts.status)
25
+ params.set('status', opts.status);
26
+ if (process.env.GENI_TENANT_ID)
27
+ params.set('tenantId', process.env.GENI_TENANT_ID);
28
+ const query = params.size ? `?${params}` : '';
29
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/engines${query}`));
30
+ (0, format_js_1.formatOutput)(opts.format === 'json' ? data : data.items, opts.format, format_js_1.engineColumns);
31
+ });
32
+ exports.engineCommand
33
+ .command('get <id>')
34
+ .description('Get an engine by ID')
35
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
36
+ .action(async (id, opts) => {
37
+ const query = process.env.GENI_TENANT_ID ? `?tenantId=${process.env.GENI_TENANT_ID}` : '';
38
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/engines/${id}${query}`));
39
+ (0, format_js_1.formatOutput)(data, opts.format, format_js_1.engineColumns);
40
+ });
41
+ exports.engineCommand
42
+ .command('delete <id>')
43
+ .description('Delete an engine')
44
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
45
+ .action(async (id, opts) => {
46
+ const query = process.env.GENI_TENANT_ID ? `?tenantId=${process.env.GENI_TENANT_ID}` : '';
47
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)(`/admin/engines/${id}${query}`), {
48
+ method: 'DELETE',
49
+ });
50
+ (0, format_js_1.formatOutput)(data, opts.format, format_js_1.engineColumns);
51
+ });
52
+ exports.engineCommand
53
+ .command('create')
54
+ .description('Create an engine')
55
+ .requiredOption('--name <name>', 'Engine name')
56
+ .requiredOption('--environment-id <id>', 'Environment ID')
57
+ .option('--engine <engine>', 'Engine type', 'nextflow')
58
+ .option('--engine-version <version>', 'Engine version', '25.10.4')
59
+ .option('--read-only <uri>', 'Read-only access to S3 bucket/prefix, e.g. s3://bucket/prefix (repeatable)', collect, [])
60
+ .option('--read-write <uri>', 'Read-write access to S3 bucket/prefix (repeatable)', collect, [])
61
+ .option('--write-only <uri>', 'Write-only access to S3 bucket/prefix (repeatable)', collect, [])
62
+ .addOption(new commander_1.Option('--format <format>', 'Output format').choices(['table', 'json', 'csv']).default('table'))
63
+ .action(async (opts) => {
64
+ const s3Buckets = [
65
+ ...opts.readOnly.map(u => ({ ...parseS3Uri(u), permissionMode: 'read-only' })),
66
+ ...opts.readWrite.map(u => ({ ...parseS3Uri(u), permissionMode: 'read-write' })),
67
+ ...opts.writeOnly.map(u => ({ ...parseS3Uri(u), permissionMode: 'write-only' })),
68
+ ];
69
+ const data = await (0, auth_1.fetchJson)((0, auth_1.apiUrl)('/admin/engines'), {
70
+ method: 'POST',
71
+ headers: { 'Content-Type': 'application/json' },
72
+ body: JSON.stringify({
73
+ name: opts.name,
74
+ environmentId: opts.environmentId,
75
+ engine: opts.engine,
76
+ engineVersion: opts.engineVersion,
77
+ ...(s3Buckets.length > 0 ? { s3Buckets } : {}),
78
+ ...(process.env.GENI_TENANT_ID ? { tenantId: process.env.GENI_TENANT_ID } : {}),
79
+ }),
80
+ });
81
+ (0, format_js_1.formatOutput)(data, opts.format, format_js_1.engineColumns);
82
+ });
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2VuZ2luZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5Q0FBMkM7QUFDM0Msa0NBQTJDO0FBQzNDLDRDQUE2RTtBQUM3RSw0Q0FBOEM7QUFVOUMsU0FBUyxVQUFVLENBQUMsR0FBVztJQUM3QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7SUFDcEQsSUFBSSxDQUFDLEtBQUs7UUFBRSxNQUFNLElBQUEsMkJBQWUsRUFBQyxvQkFBb0IsR0FBRyx1REFBdUQsQ0FBQyxDQUFBO0lBQ2pILE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFLENBQUE7QUFDaEUsQ0FBQztBQUVELE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQTtBQUVsRCxRQUFBLGFBQWEsR0FBRyxJQUFJLG1CQUFPLENBQUMsUUFBUSxDQUFDO0tBQy9DLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0FBRWhDLHFCQUFhO0tBQ1YsT0FBTyxDQUFDLE1BQU0sQ0FBQztLQUNmLFdBQVcsQ0FBQyxjQUFjLENBQUM7S0FDM0IsTUFBTSxDQUFDLG1CQUFtQixFQUFFLDBEQUEwRCxDQUFDO0tBQ3ZGLFNBQVMsQ0FBQyxJQUFJLGtCQUFNLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM5RyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQStDLEVBQUUsRUFBRTtJQUNoRSxN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QUFDLEVBQUUsY0FBYyxFQUFFLFlBQThCLEVBQUUsQ0FBQyxDQUFDO0tBQ25HLENBQUE7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsZ0JBQVMsRUFBQyxJQUFBLGFBQU0sRUFBQyxnQkFBZ0IsQ0FBQyxFQUFFO1FBQ3JELE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO1FBQy9DLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO1lBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQzlDLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2hGLENBQUM7S0FDSCxDQUFDLENBQUE7SUFDRixJQUFBLHdCQUFZLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUseUJBQWEsQ0FBQyxDQUFBO0FBQ2hELENBQUMsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCwgT3B0aW9uIH0gZnJvbSAnY29tbWFuZGVyJ1xuaW1wb3J0IHsgYXBpVXJsLCBmZXRjaEpzb24gfSBmcm9tICcuLi9hdXRoJ1xuaW1wb3J0IHsgZm9ybWF0T3V0cHV0LCBlbmdpbmVDb2x1bW5zLCB0eXBlIE91dHB1dEZvcm1hdCB9IGZyb20gJy4uL2Zvcm1hdC5qcydcbmltcG9ydCB7IGludmFsaWRBcmd1bWVudCB9IGZyb20gJy4uL2Vycm9ycy5qcydcblxudHlwZSBQZXJtaXNzaW9uTW9kZSA9ICdyZWFkLW9ubHknIHwgJ3JlYWQtd3JpdGUnIHwgJ3dyaXRlLW9ubHknXG5cbmludGVyZmFjZSBTM0J1Y2tldFBlcm1pc3Npb24ge1xuICBidWNrZXROYW1lOiBzdHJpbmdcbiAgcHJlZml4Pzogc3RyaW5nXG4gIHBlcm1pc3Npb25Nb2RlOiBQZXJtaXNzaW9uTW9kZVxufVxuXG5mdW5jdGlvbiBwYXJzZVMzVXJpKHVyaTogc3RyaW5nKTogeyBidWNrZXROYW1lOiBzdHJpbmc7IHByZWZpeD86IHN0cmluZyB9IHtcbiAgY29uc3QgbWF0Y2ggPSB1cmkubWF0Y2goL15zMzpcXC9cXC8oW14vXSspKFxcLyguKykpPyQvKVxuICBpZiAoIW1hdGNoKSB0aHJvdyBpbnZhbGlkQXJndW1lbnQoYEludmFsaWQgUzMgVVJJOiBcIiR7dXJpfVwiLiBFeHBlY3RlZCBmb3JtYXQ6IHMzOi8vYnVja2V0IG9yIHMzOi8vYnVja2V0L3ByZWZpeGApXG4gIHJldHVybiB7IGJ1Y2tldE5hbWU6IG1hdGNoWzFdLCBwcmVmaXg6IG1hdGNoWzNdIHx8IHVuZGVmaW5lZCB9XG59XG5cbmNvbnN0IGNvbGxlY3QgPSAodmFsOiBzdHJpbmcsIHByZXY6IHN0cmluZ1tdKSA9PiBbLi4ucHJldiwgdmFsXVxuXG5leHBvcnQgY29uc3QgZW5naW5lQ29tbWFuZCA9IG5ldyBDb21tYW5kKCdlbmdpbmUnKVxuICAuZGVzY3JpcHRpb24oJ01hbmFnZSBlbmdpbmVzJylcblxuZW5naW5lQ29tbWFuZFxuICAuY29tbWFuZCgnbGlzdCcpXG4gIC5kZXNjcmlwdGlvbignTGlzdCBlbmdpbmVzJylcbiAgLm9wdGlvbignLS1zdGF0dXMgPHN0YXR1cz4nLCAnRmlsdGVyIGJ5IHN0YXR1cyAoZS5nLiBBQ1RJVkUsIFBFTkRJTkcsIEZBSUxFRCwgREVMRVRFRCknKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czogeyBzdGF0dXM/OiBzdHJpbmc7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKClcbiAgICBpZiAob3B0cy5zdGF0dXMpIHBhcmFtcy5zZXQoJ3N0YXR1cycsIG9wdHMuc3RhdHVzKVxuICAgIGlmIChwcm9jZXNzLmVudi5HRU5JX1RFTkFOVF9JRCkgcGFyYW1zLnNldCgndGVuYW50SWQnLCBwcm9jZXNzLmVudi5HRU5JX1RFTkFOVF9JRClcbiAgICBjb25zdCBxdWVyeSA9IHBhcmFtcy5zaXplID8gYD8ke3BhcmFtc31gIDogJydcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hKc29uKGFwaVVybChgL2FkbWluL2VuZ2luZXMke3F1ZXJ5fWApKSBhcyB7IGl0ZW1zOiB1bmtub3duW10gfVxuICAgIGZvcm1hdE91dHB1dChvcHRzLmZvcm1hdCA9PT0gJ2pzb24nID8gZGF0YSA6IGRhdGEuaXRlbXMsIG9wdHMuZm9ybWF0LCBlbmdpbmVDb2x1bW5zKVxuICB9KVxuXG5lbmdpbmVDb21tYW5kXG4gIC5jb21tYW5kKCdnZXQgPGlkPicpXG4gIC5kZXNjcmlwdGlvbignR2V0IGFuIGVuZ2luZSBieSBJRCcpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nLCBvcHRzOiB7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IHByb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEID8gYD90ZW5hbnRJZD0ke3Byb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEfWAgOiAnJ1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKGAvYWRtaW4vZW5naW5lcy8ke2lkfSR7cXVlcnl9YCkpXG4gICAgZm9ybWF0T3V0cHV0KGRhdGEsIG9wdHMuZm9ybWF0LCBlbmdpbmVDb2x1bW5zKVxuICB9KVxuXG5lbmdpbmVDb21tYW5kXG4gIC5jb21tYW5kKCdkZWxldGUgPGlkPicpXG4gIC5kZXNjcmlwdGlvbignRGVsZXRlIGFuIGVuZ2luZScpXG4gIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1mb3JtYXQgPGZvcm1hdD4nLCAnT3V0cHV0IGZvcm1hdCcpLmNob2ljZXMoWyd0YWJsZScsICdqc29uJywgJ2NzdiddKS5kZWZhdWx0KCd0YWJsZScpKVxuICAuYWN0aW9uKGFzeW5jIChpZDogc3RyaW5nLCBvcHRzOiB7IGZvcm1hdDogT3V0cHV0Rm9ybWF0IH0pID0+IHtcbiAgICBjb25zdCBxdWVyeSA9IHByb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEID8gYD90ZW5hbnRJZD0ke3Byb2Nlc3MuZW52LkdFTklfVEVOQU5UX0lEfWAgOiAnJ1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKGAvYWRtaW4vZW5naW5lcy8ke2lkfSR7cXVlcnl9YCksIHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgfSlcbiAgICBmb3JtYXRPdXRwdXQoZGF0YSwgb3B0cy5mb3JtYXQsIGVuZ2luZUNvbHVtbnMpXG4gIH0pXG5cbmVuZ2luZUNvbW1hbmRcbiAgLmNvbW1hbmQoJ2NyZWF0ZScpXG4gIC5kZXNjcmlwdGlvbignQ3JlYXRlIGFuIGVuZ2luZScpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1uYW1lIDxuYW1lPicsICdFbmdpbmUgbmFtZScpXG4gIC5yZXF1aXJlZE9wdGlvbignLS1lbnZpcm9ubWVudC1pZCA8aWQ+JywgJ0Vudmlyb25tZW50IElEJylcbiAgLm9wdGlvbignLS1lbmdpbmUgPGVuZ2luZT4nLCAnRW5naW5lIHR5cGUnLCAnbmV4dGZsb3cnKVxuICAub3B0aW9uKCctLWVuZ2luZS12ZXJzaW9uIDx2ZXJzaW9uPicsICdFbmdpbmUgdmVyc2lvbicsICcyNS4xMC40JylcbiAgLm9wdGlvbignLS1yZWFkLW9ubHkgPHVyaT4nLCAnUmVhZC1vbmx5IGFjY2VzcyB0byBTMyBidWNrZXQvcHJlZml4LCBlLmcuIHMzOi8vYnVja2V0L3ByZWZpeCAocmVwZWF0YWJsZSknLCBjb2xsZWN0LCBbXSBhcyBzdHJpbmdbXSlcbiAgLm9wdGlvbignLS1yZWFkLXdyaXRlIDx1cmk+JywgJ1JlYWQtd3JpdGUgYWNjZXNzIHRvIFMzIGJ1Y2tldC9wcmVmaXggKHJlcGVhdGFibGUpJywgY29sbGVjdCwgW10gYXMgc3RyaW5nW10pXG4gIC5vcHRpb24oJy0td3JpdGUtb25seSA8dXJpPicsICdXcml0ZS1vbmx5IGFjY2VzcyB0byBTMyBidWNrZXQvcHJlZml4IChyZXBlYXRhYmxlKScsIGNvbGxlY3QsIFtdIGFzIHN0cmluZ1tdKVxuICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQnKS5jaG9pY2VzKFsndGFibGUnLCAnanNvbicsICdjc3YnXSkuZGVmYXVsdCgndGFibGUnKSlcbiAgLmFjdGlvbihhc3luYyAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGVudmlyb25tZW50SWQ6IHN0cmluZ1xuICAgIGVuZ2luZTogc3RyaW5nXG4gICAgZW5naW5lVmVyc2lvbjogc3RyaW5nXG4gICAgcmVhZE9ubHk6IHN0cmluZ1tdXG4gICAgcmVhZFdyaXRlOiBzdHJpbmdbXVxuICAgIHdyaXRlT25seTogc3RyaW5nW11cbiAgICBmb3JtYXQ6IE91dHB1dEZvcm1hdFxuICB9KSA9PiB7XG4gICAgY29uc3QgczNCdWNrZXRzOiBTM0J1Y2tldFBlcm1pc3Npb25bXSA9IFtcbiAgICAgIC4uLm9wdHMucmVhZE9ubHkubWFwKHUgPT4gKHsgLi4ucGFyc2VTM1VyaSh1KSwgcGVybWlzc2lvbk1vZGU6ICdyZWFkLW9ubHknIGFzIFBlcm1pc3Npb25Nb2RlIH0pKSxcbiAgICAgIC4uLm9wdHMucmVhZFdyaXRlLm1hcCh1ID0+ICh7IC4uLnBhcnNlUzNVcmkodSksIHBlcm1pc3Npb25Nb2RlOiAncmVhZC13cml0ZScgYXMgUGVybWlzc2lvbk1vZGUgfSkpLFxuICAgICAgLi4ub3B0cy53cml0ZU9ubHkubWFwKHUgPT4gKHsgLi4ucGFyc2VTM1VyaSh1KSwgcGVybWlzc2lvbk1vZGU6ICd3cml0ZS1vbmx5JyBhcyBQZXJtaXNzaW9uTW9kZSB9KSksXG4gICAgXVxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBmZXRjaEpzb24oYXBpVXJsKCcvYWRtaW4vZW5naW5lcycpLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiBvcHRzLm5hbWUsXG4gICAgICAgIGVudmlyb25tZW50SWQ6IG9wdHMuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgZW5naW5lOiBvcHRzLmVuZ2luZSxcbiAgICAgICAgZW5naW5lVmVyc2lvbjogb3B0cy5lbmdpbmVWZXJzaW9uLFxuICAgICAgICAuLi4oczNCdWNrZXRzLmxlbmd0aCA+IDAgPyB7IHMzQnVja2V0cyB9IDoge30pLFxuICAgICAgICAuLi4ocHJvY2Vzcy5lbnYuR0VOSV9URU5BTlRfSUQgPyB7IHRlbmFudElkOiBwcm9jZXNzLmVudi5HRU5JX1RFTkFOVF9JRCB9IDoge30pLFxuICAgICAgfSksXG4gICAgfSlcbiAgICBmb3JtYXRPdXRwdXQoZGF0YSwgb3B0cy5mb3JtYXQsIGVuZ2luZUNvbHVtbnMpXG4gIH0pXG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const environmentCommand: Command;