berget 2.2.6 → 2.2.8
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/.github/workflows/publish.yml +2 -2
- package/.github/workflows/test.yml +10 -4
- package/.husky/pre-commit +1 -0
- package/.prettierignore +15 -0
- package/.prettierrc +7 -3
- package/CONTRIBUTING.md +38 -0
- package/README.md +2 -148
- package/dist/index.js +10 -11
- package/dist/package.json +30 -2
- package/dist/src/agents/app.js +28 -0
- package/dist/src/agents/backend.js +25 -0
- package/dist/src/agents/devops.js +34 -0
- package/dist/src/agents/frontend.js +25 -0
- package/dist/src/agents/fullstack.js +25 -0
- package/dist/src/agents/index.js +61 -0
- package/dist/src/agents/quality.js +70 -0
- package/dist/src/agents/security.js +26 -0
- package/dist/src/agents/types.js +2 -0
- package/dist/src/client.js +97 -117
- package/dist/src/commands/api-keys.js +75 -90
- package/dist/src/commands/auth.js +7 -16
- package/dist/src/commands/autocomplete.js +1 -1
- package/dist/src/commands/billing.js +6 -17
- package/dist/src/commands/chat.js +68 -101
- package/dist/src/commands/clusters.js +9 -18
- package/dist/src/commands/code/__tests__/auth-sync.test.js +351 -0
- package/dist/src/commands/code/__tests__/fake-api-key-service.js +13 -0
- package/dist/src/commands/code/__tests__/fake-auth-service.js +47 -0
- package/dist/src/commands/code/__tests__/fake-command-runner.js +21 -34
- package/dist/src/commands/code/__tests__/fake-file-store.js +20 -33
- package/dist/src/commands/code/__tests__/fake-prompter.js +83 -57
- package/dist/src/commands/code/__tests__/setup-flow.test.js +359 -92
- package/dist/src/commands/code/adapters/clack-prompter.js +15 -22
- package/dist/src/commands/code/adapters/fs-file-store.js +26 -40
- package/dist/src/commands/code/adapters/spawn-command-runner.js +27 -37
- package/dist/src/commands/code/auth-sync.js +270 -0
- package/dist/src/commands/code/errors.js +12 -9
- package/dist/src/commands/code/ports/auth-services.js +2 -0
- package/dist/src/commands/code/setup.js +387 -281
- package/dist/src/commands/code.js +205 -332
- package/dist/src/commands/index.js +5 -5
- package/dist/src/commands/models.js +6 -17
- package/dist/src/commands/users.js +5 -16
- package/dist/src/constants/command-structure.js +104 -104
- package/dist/src/services/api-key-service.js +132 -157
- package/dist/src/services/auth-service.js +89 -342
- package/dist/src/services/browser-auth.js +268 -0
- package/dist/src/services/chat-service.js +371 -401
- package/dist/src/services/cluster-service.js +47 -62
- package/dist/src/services/collaborator-service.js +10 -25
- package/dist/src/services/flux-service.js +14 -29
- package/dist/src/services/helm-service.js +10 -25
- package/dist/src/services/kubectl-service.js +16 -33
- package/dist/src/utils/config-checker.js +3 -3
- package/dist/src/utils/config-loader.js +95 -95
- package/dist/src/utils/default-api-key.js +124 -134
- package/dist/src/utils/env-manager.js +55 -66
- package/dist/src/utils/error-handler.js +20 -21
- package/dist/src/utils/logger.js +72 -65
- package/dist/src/utils/markdown-renderer.js +27 -27
- package/dist/src/utils/opencode-validator.js +63 -68
- package/dist/src/utils/token-manager.js +74 -45
- package/dist/tests/commands/chat.test.js +16 -25
- package/dist/tests/commands/code.test.js +95 -104
- package/dist/tests/utils/config-loader.test.js +48 -48
- package/dist/tests/utils/env-manager.test.js +43 -52
- package/dist/tests/utils/opencode-validator.test.js +22 -21
- package/dist/vitest.config.js +1 -1
- package/eslint.config.mjs +67 -0
- package/index.ts +35 -42
- package/package.json +30 -2
- package/src/agents/app.ts +27 -0
- package/src/agents/backend.ts +24 -0
- package/src/agents/devops.ts +33 -0
- package/src/agents/frontend.ts +24 -0
- package/src/agents/fullstack.ts +24 -0
- package/src/agents/index.ts +73 -0
- package/src/agents/quality.ts +69 -0
- package/src/agents/security.ts +26 -0
- package/src/agents/types.ts +17 -0
- package/src/client.ts +118 -152
- package/src/commands/api-keys.ts +241 -333
- package/src/commands/auth.ts +22 -27
- package/src/commands/autocomplete.ts +9 -9
- package/src/commands/billing.ts +20 -24
- package/src/commands/chat.ts +248 -338
- package/src/commands/clusters.ts +27 -26
- package/src/commands/code/__tests__/auth-sync.test.ts +482 -0
- package/src/commands/code/__tests__/fake-api-key-service.ts +13 -0
- package/src/commands/code/__tests__/fake-auth-service.ts +50 -0
- package/src/commands/code/__tests__/fake-command-runner.ts +45 -42
- package/src/commands/code/__tests__/fake-file-store.ts +32 -23
- package/src/commands/code/__tests__/fake-prompter.ts +116 -77
- package/src/commands/code/__tests__/setup-flow.test.ts +624 -268
- package/src/commands/code/adapters/clack-prompter.ts +53 -39
- package/src/commands/code/adapters/fs-file-store.ts +32 -27
- package/src/commands/code/adapters/spawn-command-runner.ts +38 -29
- package/src/commands/code/auth-sync.ts +329 -0
- package/src/commands/code/errors.ts +18 -18
- package/src/commands/code/ports/auth-services.ts +14 -0
- package/src/commands/code/ports/command-runner.ts +8 -4
- package/src/commands/code/ports/file-store.ts +5 -4
- package/src/commands/code/ports/prompter.ts +24 -18
- package/src/commands/code/setup.ts +570 -340
- package/src/commands/code.ts +338 -539
- package/src/commands/index.ts +20 -19
- package/src/commands/models.ts +28 -32
- package/src/commands/users.ts +15 -21
- package/src/constants/command-structure.ts +134 -157
- package/src/services/api-key-service.ts +105 -122
- package/src/services/auth-service.ts +99 -345
- package/src/services/browser-auth.ts +296 -0
- package/src/services/chat-service.ts +265 -299
- package/src/services/cluster-service.ts +42 -45
- package/src/services/collaborator-service.ts +14 -19
- package/src/services/flux-service.ts +23 -25
- package/src/services/helm-service.ts +19 -21
- package/src/services/kubectl-service.ts +17 -19
- package/src/types/api.d.ts +1905 -1907
- package/src/types/json.d.ts +2 -2
- package/src/utils/config-checker.ts +10 -10
- package/src/utils/config-loader.ts +162 -178
- package/src/utils/default-api-key.ts +114 -125
- package/src/utils/env-manager.ts +53 -57
- package/src/utils/error-handler.ts +61 -56
- package/src/utils/logger.ts +79 -73
- package/src/utils/markdown-renderer.ts +31 -31
- package/src/utils/opencode-validator.ts +85 -89
- package/src/utils/token-manager.ts +108 -87
- package/templates/agents/app.md +1 -0
- package/templates/agents/backend.md +1 -0
- package/templates/agents/devops.md +2 -0
- package/templates/agents/frontend.md +1 -0
- package/templates/agents/fullstack.md +1 -0
- package/templates/agents/quality.md +45 -40
- package/templates/agents/security.md +1 -0
- package/tests/commands/chat.test.ts +53 -62
- package/tests/commands/code.test.ts +265 -310
- package/tests/utils/config-loader.test.ts +189 -188
- package/tests/utils/env-manager.test.ts +110 -113
- package/tests/utils/opencode-validator.test.ts +52 -56
- package/tsconfig.json +4 -3
- package/vitest.config.ts +3 -3
- package/AGENTS.md +0 -374
- package/TODO.md +0 -19
|
@@ -1,199 +1,174 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.ApiKeyService = void 0;
|
|
13
4
|
const client_1 = require("../client");
|
|
14
|
-
const error_handler_1 = require("../utils/error-handler");
|
|
15
5
|
const command_structure_1 = require("../constants/command-structure");
|
|
6
|
+
const error_handler_1 = require("../utils/error-handler");
|
|
16
7
|
/**
|
|
17
8
|
* Service for managing API keys
|
|
18
9
|
* Command group: api-keys
|
|
19
10
|
*/
|
|
20
11
|
class ApiKeyService {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
12
|
+
// Command group name for this service
|
|
13
|
+
static COMMAND_GROUP = command_structure_1.COMMAND_GROUPS.API_KEYS;
|
|
14
|
+
// Subcommands for this service
|
|
15
|
+
static COMMANDS = command_structure_1.SUBCOMMANDS.API_KEYS;
|
|
16
|
+
static instance;
|
|
17
|
+
client = (0, client_1.createAuthenticatedClient)();
|
|
18
|
+
constructor() { }
|
|
24
19
|
static getInstance() {
|
|
25
20
|
if (!ApiKeyService.instance) {
|
|
26
21
|
ApiKeyService.instance = new ApiKeyService();
|
|
27
22
|
}
|
|
28
23
|
return ApiKeyService.instance;
|
|
29
24
|
}
|
|
30
|
-
/**
|
|
31
|
-
* List all API keys
|
|
32
|
-
* Command: berget api-keys list
|
|
33
|
-
*/
|
|
34
|
-
list() {
|
|
35
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
-
try {
|
|
37
|
-
const { data, error } = yield this.client.GET('/v1/api-keys');
|
|
38
|
-
if (error)
|
|
39
|
-
throw error;
|
|
40
|
-
return data || [];
|
|
41
|
-
}
|
|
42
|
-
catch (error) {
|
|
43
|
-
(0, error_handler_1.handleError)('Failed to list API keys', error);
|
|
44
|
-
throw error;
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
25
|
/**
|
|
49
26
|
* Create a new API key
|
|
50
27
|
* Command: berget api-keys create
|
|
51
28
|
*/
|
|
52
|
-
create(options) {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (options.description && options.description.length > 500) {
|
|
64
|
-
throw new Error('API key description must be 500 characters or less');
|
|
65
|
-
}
|
|
66
|
-
const { data, error } = yield this.client.POST('/v1/api-keys', {
|
|
67
|
-
body: options,
|
|
68
|
-
});
|
|
69
|
-
if (error) {
|
|
70
|
-
// Enhanced error handling with specific troubleshooting
|
|
71
|
-
// Handle specific error cases
|
|
72
|
-
if (typeof error === 'object' && error !== null) {
|
|
73
|
-
const errorObj = error;
|
|
74
|
-
if (((_a = errorObj.error) === null || _a === void 0 ? void 0 : _a.code) === 'API_KEY_CREATION_FAILED') {
|
|
75
|
-
let detailedMessage = 'Failed to create API key. This could be due to:\n';
|
|
76
|
-
detailedMessage += '• Account limits or quota restrictions\n';
|
|
77
|
-
detailedMessage +=
|
|
78
|
-
'• Insufficient permissions for API key creation\n';
|
|
79
|
-
detailedMessage += '• Temporary server issues\n';
|
|
80
|
-
detailedMessage += '• Billing or subscription issues\n\n';
|
|
81
|
-
detailedMessage += 'Troubleshooting steps:\n';
|
|
82
|
-
detailedMessage +=
|
|
83
|
-
'1. Check if you have reached your API key limit\n';
|
|
84
|
-
detailedMessage +=
|
|
85
|
-
'2. Verify your account has API key creation permissions\n';
|
|
86
|
-
detailedMessage += '3. Check your billing status and subscription\n';
|
|
87
|
-
detailedMessage +=
|
|
88
|
-
'4. Try again in a few minutes if this is a temporary issue\n';
|
|
89
|
-
detailedMessage += '5. Contact support if the problem persists';
|
|
90
|
-
throw new Error(detailedMessage);
|
|
91
|
-
}
|
|
92
|
-
if (((_b = errorObj.error) === null || _b === void 0 ? void 0 : _b.code) === 'USER_NOT_FOUND') {
|
|
93
|
-
throw new Error('Your account is still being set up. Please wait a moment and try again.\n\nIf this issue persists, please contact support at support@berget.ai');
|
|
94
|
-
}
|
|
95
|
-
if (((_c = errorObj.error) === null || _c === void 0 ? void 0 : _c.code) === 'QUOTA_EXCEEDED') {
|
|
96
|
-
throw new Error('You have reached your API key limit. Please delete existing keys or contact support to increase your quota.');
|
|
97
|
-
}
|
|
98
|
-
if (((_d = errorObj.error) === null || _d === void 0 ? void 0 : _d.code) === 'INSUFFICIENT_PERMISSIONS') {
|
|
99
|
-
throw new Error('Your account does not have permission to create API keys. Please contact your administrator.');
|
|
100
|
-
}
|
|
101
|
-
if (((_e = errorObj.error) === null || _e === void 0 ? void 0 : _e.code) === 'BILLING_REQUIRED') {
|
|
102
|
-
throw new Error('A valid billing method is required to create API keys. Please add a payment method.');
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
throw new Error(JSON.stringify(error));
|
|
106
|
-
}
|
|
107
|
-
if (!data) {
|
|
108
|
-
throw new Error('No data received from server');
|
|
109
|
-
}
|
|
110
|
-
return data;
|
|
29
|
+
async create(options) {
|
|
30
|
+
try {
|
|
31
|
+
// Validate input before sending request
|
|
32
|
+
if (!options.name || options.name.trim().length === 0) {
|
|
33
|
+
throw new Error('API key name is required and cannot be empty');
|
|
34
|
+
}
|
|
35
|
+
if (options.name.length > 100) {
|
|
36
|
+
throw new Error('API key name must be 100 characters or less');
|
|
37
|
+
}
|
|
38
|
+
if (options.description && options.description.length > 500) {
|
|
39
|
+
throw new Error('API key description must be 500 characters or less');
|
|
111
40
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
41
|
+
const { data, error } = await this.client.POST('/v1/api-keys', {
|
|
42
|
+
body: options,
|
|
43
|
+
});
|
|
44
|
+
if (error) {
|
|
45
|
+
// Enhanced error handling with specific troubleshooting
|
|
46
|
+
// Handle specific error cases
|
|
47
|
+
if (typeof error === 'object' && error !== null) {
|
|
48
|
+
const errorObject = error;
|
|
49
|
+
if (errorObject.error?.code === 'API_KEY_CREATION_FAILED') {
|
|
50
|
+
let detailedMessage = 'Failed to create API key. This could be due to:\n';
|
|
51
|
+
detailedMessage += '• Account limits or quota restrictions\n';
|
|
52
|
+
detailedMessage += '• Insufficient permissions for API key creation\n';
|
|
53
|
+
detailedMessage += '• Temporary server issues\n';
|
|
54
|
+
detailedMessage += '• Billing or subscription issues\n\n';
|
|
55
|
+
detailedMessage += 'Troubleshooting steps:\n';
|
|
56
|
+
detailedMessage += '1. Check if you have reached your API key limit\n';
|
|
57
|
+
detailedMessage += '2. Verify your account has API key creation permissions\n';
|
|
58
|
+
detailedMessage += '3. Check your billing status and subscription\n';
|
|
59
|
+
detailedMessage += '4. Try again in a few minutes if this is a temporary issue\n';
|
|
60
|
+
detailedMessage += '5. Contact support if the problem persists';
|
|
61
|
+
throw new Error(detailedMessage);
|
|
118
62
|
}
|
|
119
|
-
if (error
|
|
120
|
-
throw new Error('
|
|
63
|
+
if (errorObject.error?.code === 'USER_NOT_FOUND') {
|
|
64
|
+
throw new Error('Your account is still being set up. Please wait a moment and try again.\n\nIf this issue persists, please contact support at support@berget.ai');
|
|
121
65
|
}
|
|
122
|
-
if (error
|
|
123
|
-
|
|
124
|
-
throw new Error('Authentication failed. Please run `berget auth login` to log in again.');
|
|
66
|
+
if (errorObject.error?.code === 'QUOTA_EXCEEDED') {
|
|
67
|
+
throw new Error('You have reached your API key limit. Please delete existing keys or contact support to increase your quota.');
|
|
125
68
|
}
|
|
126
|
-
if (error
|
|
127
|
-
throw new Error('
|
|
69
|
+
if (errorObject.error?.code === 'INSUFFICIENT_PERMISSIONS') {
|
|
70
|
+
throw new Error('Your account does not have permission to create API keys. Please contact your administrator.');
|
|
71
|
+
}
|
|
72
|
+
if (errorObject.error?.code === 'BILLING_REQUIRED') {
|
|
73
|
+
throw new Error('A valid billing method is required to create API keys. Please add a payment method.');
|
|
128
74
|
}
|
|
129
75
|
}
|
|
130
|
-
throw error;
|
|
76
|
+
throw new Error(JSON.stringify(error));
|
|
77
|
+
}
|
|
78
|
+
if (!data) {
|
|
79
|
+
throw new Error('No data received from server');
|
|
131
80
|
}
|
|
132
|
-
|
|
81
|
+
return data;
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error('Failed to create API key:', error);
|
|
85
|
+
// Add additional context for common issues
|
|
86
|
+
if (error instanceof Error) {
|
|
87
|
+
if (error.message.includes('ECONNREFUSED')) {
|
|
88
|
+
throw new Error('Cannot connect to Berget API. Please check your internet connection.');
|
|
89
|
+
}
|
|
90
|
+
if (error.message.includes('ENOTFOUND')) {
|
|
91
|
+
throw new Error('Cannot resolve Berget API hostname. Please check your DNS settings.');
|
|
92
|
+
}
|
|
93
|
+
if (error.message.includes('401') || error.message.includes('Unauthorized')) {
|
|
94
|
+
throw new Error('Authentication failed. Please run `berget auth login` to log in again.');
|
|
95
|
+
}
|
|
96
|
+
if (error.message.includes('403')) {
|
|
97
|
+
throw new Error('Access forbidden. Your account may not have permission to create API keys.');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
133
102
|
}
|
|
134
103
|
/**
|
|
135
104
|
* Delete an API key
|
|
136
105
|
* Command: berget api-keys delete
|
|
137
106
|
*/
|
|
138
|
-
delete(id) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
});
|
|
107
|
+
async delete(id) {
|
|
108
|
+
try {
|
|
109
|
+
const { error } = await this.client.DELETE('/v1/api-keys/{id}', {
|
|
110
|
+
params: { path: { id } },
|
|
111
|
+
});
|
|
112
|
+
if (error)
|
|
113
|
+
throw new Error(JSON.stringify(error));
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
console.error('Failed to delete API key:', error);
|
|
118
|
+
throw error;
|
|
119
|
+
}
|
|
153
120
|
}
|
|
154
121
|
/**
|
|
155
|
-
*
|
|
156
|
-
* Command: berget api-keys
|
|
122
|
+
* Get usage statistics for an API key
|
|
123
|
+
* Command: berget api-keys describe
|
|
157
124
|
*/
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
}
|
|
172
|
-
});
|
|
125
|
+
async describe(id) {
|
|
126
|
+
try {
|
|
127
|
+
const { data, error } = await this.client.GET('/v1/api-keys/{id}/usage', {
|
|
128
|
+
params: { path: { id } },
|
|
129
|
+
});
|
|
130
|
+
if (error)
|
|
131
|
+
throw new Error(JSON.stringify(error));
|
|
132
|
+
return data;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error('Failed to get API key usage:', error);
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
173
138
|
}
|
|
174
139
|
/**
|
|
175
|
-
*
|
|
176
|
-
* Command: berget api-keys
|
|
140
|
+
* List all API keys
|
|
141
|
+
* Command: berget api-keys list
|
|
177
142
|
*/
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
params: { path: { id } },
|
|
183
|
-
});
|
|
184
|
-
if (error)
|
|
185
|
-
throw new Error(JSON.stringify(error));
|
|
186
|
-
return data;
|
|
187
|
-
}
|
|
188
|
-
catch (error) {
|
|
189
|
-
console.error('Failed to get API key usage:', error);
|
|
143
|
+
async list() {
|
|
144
|
+
try {
|
|
145
|
+
const { data, error } = await this.client.GET('/v1/api-keys');
|
|
146
|
+
if (error)
|
|
190
147
|
throw error;
|
|
191
|
-
|
|
192
|
-
}
|
|
148
|
+
return data || [];
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
(0, error_handler_1.handleError)('Failed to list API keys', error);
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Rotate an API key
|
|
157
|
+
* Command: berget api-keys rotate
|
|
158
|
+
*/
|
|
159
|
+
async rotate(id) {
|
|
160
|
+
try {
|
|
161
|
+
const { data, error } = await this.client.PUT('/v1/api-keys/{id}/rotate', {
|
|
162
|
+
params: { path: { id } },
|
|
163
|
+
});
|
|
164
|
+
if (error)
|
|
165
|
+
throw new Error(JSON.stringify(error));
|
|
166
|
+
return data;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error('Failed to rotate API key:', error);
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
193
172
|
}
|
|
194
173
|
}
|
|
195
174
|
exports.ApiKeyService = ApiKeyService;
|
|
196
|
-
// Command group name for this service
|
|
197
|
-
ApiKeyService.COMMAND_GROUP = command_structure_1.COMMAND_GROUPS.API_KEYS;
|
|
198
|
-
// Subcommands for this service
|
|
199
|
-
ApiKeyService.COMMANDS = command_structure_1.SUBCOMMANDS.API_KEYS;
|