mycontext-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +440 -0
- package/dist/cli/src/agents/implementations/CodeGenSubAgent.d.ts +43 -0
- package/dist/cli/src/agents/implementations/CodeGenSubAgent.d.ts.map +1 -0
- package/dist/cli/src/agents/implementations/CodeGenSubAgent.js +1440 -0
- package/dist/cli/src/agents/implementations/CodeGenSubAgent.js.map +1 -0
- package/dist/cli/src/agents/implementations/DocsSubAgent.d.ts +35 -0
- package/dist/cli/src/agents/implementations/DocsSubAgent.d.ts.map +1 -0
- package/dist/cli/src/agents/implementations/DocsSubAgent.js +351 -0
- package/dist/cli/src/agents/implementations/DocsSubAgent.js.map +1 -0
- package/dist/cli/src/agents/implementations/QASubAgent.d.ts +31 -0
- package/dist/cli/src/agents/implementations/QASubAgent.d.ts.map +1 -0
- package/dist/cli/src/agents/implementations/QASubAgent.js +190 -0
- package/dist/cli/src/agents/implementations/QASubAgent.js.map +1 -0
- package/dist/cli/src/agents/interfaces/SubAgent.d.ts +157 -0
- package/dist/cli/src/agents/interfaces/SubAgent.d.ts.map +1 -0
- package/dist/cli/src/agents/interfaces/SubAgent.js +7 -0
- package/dist/cli/src/agents/interfaces/SubAgent.js.map +1 -0
- package/dist/cli/src/agents/orchestrator/SubAgentOrchestrator.d.ts +59 -0
- package/dist/cli/src/agents/orchestrator/SubAgentOrchestrator.d.ts.map +1 -0
- package/dist/cli/src/agents/orchestrator/SubAgentOrchestrator.js +305 -0
- package/dist/cli/src/agents/orchestrator/SubAgentOrchestrator.js.map +1 -0
- package/dist/cli/src/agents/personalities/definitions.d.ts +34 -0
- package/dist/cli/src/agents/personalities/definitions.d.ts.map +1 -0
- package/dist/cli/src/agents/personalities/definitions.js +360 -0
- package/dist/cli/src/agents/personalities/definitions.js.map +1 -0
- package/dist/cli/src/cli.d.ts +3 -0
- package/dist/cli/src/cli.d.ts.map +1 -0
- package/dist/cli/src/cli.js +286 -0
- package/dist/cli/src/cli.js.map +1 -0
- package/dist/cli/src/commands/auth.d.ts +23 -0
- package/dist/cli/src/commands/auth.d.ts.map +1 -0
- package/dist/cli/src/commands/auth.js +212 -0
- package/dist/cli/src/commands/auth.js.map +1 -0
- package/dist/cli/src/commands/generate-components.d.ts +28 -0
- package/dist/cli/src/commands/generate-components.d.ts.map +1 -0
- package/dist/cli/src/commands/generate-components.js +680 -0
- package/dist/cli/src/commands/generate-components.js.map +1 -0
- package/dist/cli/src/commands/generate.d.ts +108 -0
- package/dist/cli/src/commands/generate.d.ts.map +1 -0
- package/dist/cli/src/commands/generate.js +1984 -0
- package/dist/cli/src/commands/generate.js.map +1 -0
- package/dist/cli/src/commands/init.d.ts +13 -0
- package/dist/cli/src/commands/init.d.ts.map +1 -0
- package/dist/cli/src/commands/init.js +91 -0
- package/dist/cli/src/commands/init.js.map +1 -0
- package/dist/cli/src/commands/list.d.ts +17 -0
- package/dist/cli/src/commands/list.d.ts.map +1 -0
- package/dist/cli/src/commands/list.js +209 -0
- package/dist/cli/src/commands/list.js.map +1 -0
- package/dist/cli/src/commands/preview.d.ts +23 -0
- package/dist/cli/src/commands/preview.d.ts.map +1 -0
- package/dist/cli/src/commands/preview.js +1200 -0
- package/dist/cli/src/commands/preview.js.map +1 -0
- package/dist/cli/src/commands/status.d.ts +21 -0
- package/dist/cli/src/commands/status.d.ts.map +1 -0
- package/dist/cli/src/commands/status.js +287 -0
- package/dist/cli/src/commands/status.js.map +1 -0
- package/dist/cli/src/commands/validate.d.ts +22 -0
- package/dist/cli/src/commands/validate.d.ts.map +1 -0
- package/dist/cli/src/commands/validate.js +259 -0
- package/dist/cli/src/commands/validate.js.map +1 -0
- package/dist/cli/src/types/index.d.ts +152 -0
- package/dist/cli/src/types/index.d.ts.map +1 -0
- package/dist/cli/src/types/index.js +3 -0
- package/dist/cli/src/types/index.js.map +1 -0
- package/dist/cli/src/utils/apiKeyManager.d.ts +137 -0
- package/dist/cli/src/utils/apiKeyManager.d.ts.map +1 -0
- package/dist/cli/src/utils/apiKeyManager.js +471 -0
- package/dist/cli/src/utils/apiKeyManager.js.map +1 -0
- package/dist/cli/src/utils/errorHandler.d.ts +105 -0
- package/dist/cli/src/utils/errorHandler.d.ts.map +1 -0
- package/dist/cli/src/utils/errorHandler.js +332 -0
- package/dist/cli/src/utils/errorHandler.js.map +1 -0
- package/dist/cli/src/utils/fileSystem.d.ts +58 -0
- package/dist/cli/src/utils/fileSystem.d.ts.map +1 -0
- package/dist/cli/src/utils/fileSystem.js +230 -0
- package/dist/cli/src/utils/fileSystem.js.map +1 -0
- package/dist/cli/src/utils/githubModels.d.ts +53 -0
- package/dist/cli/src/utils/githubModels.d.ts.map +1 -0
- package/dist/cli/src/utils/githubModels.js +239 -0
- package/dist/cli/src/utils/githubModels.js.map +1 -0
- package/dist/cli/src/utils/spinner.d.ts +28 -0
- package/dist/cli/src/utils/spinner.d.ts.map +1 -0
- package/dist/cli/src/utils/spinner.js +112 -0
- package/dist/cli/src/utils/spinner.js.map +1 -0
- package/dist/cli/src/utils/xaiClient.d.ts +59 -0
- package/dist/cli/src/utils/xaiClient.d.ts.map +1 -0
- package/dist/cli/src/utils/xaiClient.js +244 -0
- package/dist/cli/src/utils/xaiClient.js.map +1 -0
- package/dist/lib/analytics/usage-tracker.d.ts +125 -0
- package/dist/lib/analytics/usage-tracker.d.ts.map +1 -0
- package/dist/lib/analytics/usage-tracker.js +429 -0
- package/dist/lib/analytics/usage-tracker.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Secure API Key Management System for MyContext CLI
|
|
4
|
+
*
|
|
5
|
+
* Handles storage, validation, and secure access to API keys for multiple AI providers.
|
|
6
|
+
* Supports environment variables, encrypted local storage, and secure key rotation.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.listAPIKeys = exports.removeAPIKey = exports.validateAPIKey = exports.setAPIKey = exports.getAPIKey = exports.apiKeyManager = exports.APIKeyManager = void 0;
|
|
43
|
+
const fs = __importStar(require("fs-extra"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const os = __importStar(require("os"));
|
|
46
|
+
const crypto = __importStar(require("crypto"));
|
|
47
|
+
const errorHandler_1 = require("./errorHandler");
|
|
48
|
+
class APIKeyManager {
|
|
49
|
+
constructor() {
|
|
50
|
+
this.keys = new Map();
|
|
51
|
+
this.providers = new Map();
|
|
52
|
+
this.configPath = path.join(os.homedir(), ".mycontext", "api-keys.json");
|
|
53
|
+
this.encryptionKey = this.getEncryptionKey();
|
|
54
|
+
this.initializeProviders();
|
|
55
|
+
}
|
|
56
|
+
static getInstance() {
|
|
57
|
+
if (!APIKeyManager.instance) {
|
|
58
|
+
APIKeyManager.instance = new APIKeyManager();
|
|
59
|
+
}
|
|
60
|
+
return APIKeyManager.instance;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Initialize supported AI providers
|
|
64
|
+
*/
|
|
65
|
+
initializeProviders() {
|
|
66
|
+
const providers = [
|
|
67
|
+
{
|
|
68
|
+
name: "xai",
|
|
69
|
+
envVar: "XAI_API_KEY",
|
|
70
|
+
validationUrl: "https://api.x.ai/v1/models",
|
|
71
|
+
requiredPermissions: ["chat:completions"],
|
|
72
|
+
rateLimits: { requests: 100, window: 3600 },
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "openai",
|
|
76
|
+
envVar: "OPENAI_API_KEY",
|
|
77
|
+
validationUrl: "https://api.openai.com/v1/models",
|
|
78
|
+
requiredPermissions: ["chat:completions"],
|
|
79
|
+
rateLimits: { requests: 3000, window: 3600 },
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
name: "anthropic",
|
|
83
|
+
envVar: "ANTHROPIC_API_KEY",
|
|
84
|
+
validationUrl: "https://api.anthropic.com/v1/models",
|
|
85
|
+
requiredPermissions: ["messages"],
|
|
86
|
+
rateLimits: { requests: 100, window: 3600 },
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "google",
|
|
90
|
+
envVar: "GOOGLE_API_KEY",
|
|
91
|
+
validationUrl: "https://generativelanguage.googleapis.com/v1beta/models",
|
|
92
|
+
requiredPermissions: ["generateContent"],
|
|
93
|
+
rateLimits: { requests: 1000, window: 3600 },
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
providers.forEach((provider) => {
|
|
97
|
+
this.providers.set(provider.name, provider);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get or generate encryption key for secure storage
|
|
102
|
+
*/
|
|
103
|
+
getEncryptionKey() {
|
|
104
|
+
const keyPath = path.join(os.homedir(), ".mycontext", ".encryption-key");
|
|
105
|
+
try {
|
|
106
|
+
if (fs.existsSync(keyPath)) {
|
|
107
|
+
return fs.readFileSync(keyPath, "utf-8");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.warn("Could not read existing encryption key:", error);
|
|
112
|
+
}
|
|
113
|
+
// Generate new encryption key
|
|
114
|
+
const newKey = crypto.randomBytes(32).toString("hex");
|
|
115
|
+
try {
|
|
116
|
+
fs.ensureDirSync(path.dirname(keyPath));
|
|
117
|
+
fs.writeFileSync(keyPath, newKey, { mode: 0o600 }); // Read/write for owner only
|
|
118
|
+
return newKey;
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.warn("Could not save encryption key, using fallback:", error);
|
|
122
|
+
// Fallback to environment-based key
|
|
123
|
+
return (process.env.MYCONTEXT_ENCRYPTION_KEY ||
|
|
124
|
+
crypto.randomBytes(32).toString("hex"));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Encrypt sensitive data
|
|
129
|
+
*/
|
|
130
|
+
encrypt(data) {
|
|
131
|
+
const iv = crypto.randomBytes(16);
|
|
132
|
+
// Use PBKDF2 to derive a key from the encryption key
|
|
133
|
+
const key = crypto.pbkdf2Sync(this.encryptionKey, iv, 100000, 32, "sha256");
|
|
134
|
+
const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
|
|
135
|
+
let encrypted = cipher.update(data, "utf8", "hex");
|
|
136
|
+
encrypted += cipher.final("hex");
|
|
137
|
+
return iv.toString("hex") + ":" + encrypted;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Decrypt sensitive data
|
|
141
|
+
*/
|
|
142
|
+
decrypt(encryptedData) {
|
|
143
|
+
try {
|
|
144
|
+
const [ivHex, encrypted] = encryptedData.split(":");
|
|
145
|
+
const iv = Buffer.from(ivHex, "hex");
|
|
146
|
+
// Use PBKDF2 to derive the same key from the encryption key
|
|
147
|
+
const key = crypto.pbkdf2Sync(this.encryptionKey, iv, 100000, 32, "sha256");
|
|
148
|
+
const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
|
|
149
|
+
let decrypted = decipher.update(encrypted, "hex", "utf8");
|
|
150
|
+
decrypted += decipher.final("utf8");
|
|
151
|
+
return decrypted;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
throw new Error("Failed to decrypt API key data");
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Load API keys from secure storage
|
|
159
|
+
*/
|
|
160
|
+
async loadKeys() {
|
|
161
|
+
try {
|
|
162
|
+
if (!fs.existsSync(this.configPath)) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const encryptedData = await fs.readFile(this.configPath, "utf-8");
|
|
166
|
+
const decryptedData = this.decrypt(encryptedData);
|
|
167
|
+
const keysData = JSON.parse(decryptedData);
|
|
168
|
+
this.keys.clear();
|
|
169
|
+
Object.entries(keysData).forEach(([provider, config]) => {
|
|
170
|
+
this.keys.set(provider, config);
|
|
171
|
+
});
|
|
172
|
+
console.log(`📁 Loaded ${this.keys.size} API keys from secure storage`);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.warn("Failed to load API keys from storage:", error);
|
|
176
|
+
// Continue with environment variables only
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Save API keys to secure storage
|
|
181
|
+
*/
|
|
182
|
+
async saveKeys() {
|
|
183
|
+
try {
|
|
184
|
+
const keysData = {};
|
|
185
|
+
this.keys.forEach((config, provider) => {
|
|
186
|
+
keysData[provider] = config;
|
|
187
|
+
});
|
|
188
|
+
const jsonData = JSON.stringify(keysData, null, 2);
|
|
189
|
+
const encryptedData = this.encrypt(jsonData);
|
|
190
|
+
await fs.ensureDir(path.dirname(this.configPath));
|
|
191
|
+
await fs.writeFile(this.configPath, encryptedData, { mode: 0o600 });
|
|
192
|
+
console.log(`💾 Saved ${this.keys.size} API keys to secure storage`);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
throw (0, errorHandler_1.createError)(error, { operation: "save_api_keys" }, errorHandler_1.ErrorType.FILE_SYSTEM_ERROR);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get API key for a provider
|
|
200
|
+
*/
|
|
201
|
+
async getKey(provider) {
|
|
202
|
+
// Check environment variables first
|
|
203
|
+
const envKey = this.getKeyFromEnvironment(provider);
|
|
204
|
+
if (envKey) {
|
|
205
|
+
return envKey;
|
|
206
|
+
}
|
|
207
|
+
// Check stored keys
|
|
208
|
+
const storedKey = this.keys.get(provider);
|
|
209
|
+
if (storedKey?.key) {
|
|
210
|
+
// Update last used timestamp
|
|
211
|
+
storedKey.lastUsed = new Date().toISOString();
|
|
212
|
+
await this.saveKeys();
|
|
213
|
+
return storedKey.key;
|
|
214
|
+
}
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get API key from environment variables
|
|
219
|
+
*/
|
|
220
|
+
getKeyFromEnvironment(provider) {
|
|
221
|
+
const providerConfig = this.providers.get(provider);
|
|
222
|
+
if (!providerConfig) {
|
|
223
|
+
return null;
|
|
224
|
+
}
|
|
225
|
+
return process.env[providerConfig.envVar] || null;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Set API key for a provider
|
|
229
|
+
*/
|
|
230
|
+
async setKey(provider, key, options = {}) {
|
|
231
|
+
// Validate the key format
|
|
232
|
+
if (!this.validateKeyFormat(provider, key)) {
|
|
233
|
+
throw (0, errorHandler_1.createError)(new Error(`Invalid API key format for ${provider}`), { operation: "set_api_key", provider }, errorHandler_1.ErrorType.VALIDATION_ERROR);
|
|
234
|
+
}
|
|
235
|
+
const config = {
|
|
236
|
+
provider,
|
|
237
|
+
key,
|
|
238
|
+
createdAt: new Date().toISOString(),
|
|
239
|
+
isValid: true,
|
|
240
|
+
...options,
|
|
241
|
+
};
|
|
242
|
+
this.keys.set(provider, config);
|
|
243
|
+
await this.saveKeys();
|
|
244
|
+
console.log(`✅ API key set for ${provider}`);
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Validate API key format
|
|
248
|
+
*/
|
|
249
|
+
validateKeyFormat(provider, key) {
|
|
250
|
+
if (!key || typeof key !== "string" || key.length < 10) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
// Provider-specific validation
|
|
254
|
+
switch (provider) {
|
|
255
|
+
case "xai":
|
|
256
|
+
return key.startsWith("xai_") && key.length >= 50;
|
|
257
|
+
case "openai":
|
|
258
|
+
return key.startsWith("sk-") && key.length >= 50;
|
|
259
|
+
case "anthropic":
|
|
260
|
+
return key.startsWith("sk-ant-") && key.length >= 50;
|
|
261
|
+
case "google":
|
|
262
|
+
return key.length >= 30; // Google API keys vary in format
|
|
263
|
+
default:
|
|
264
|
+
return key.length >= 20; // Generic minimum
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Validate API key with provider
|
|
269
|
+
*/
|
|
270
|
+
async validateKey(provider, key) {
|
|
271
|
+
const apiKey = key || (await this.getKey(provider));
|
|
272
|
+
if (!apiKey) {
|
|
273
|
+
return {
|
|
274
|
+
isValid: false,
|
|
275
|
+
provider,
|
|
276
|
+
error: "No API key found",
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const providerConfig = this.providers.get(provider);
|
|
280
|
+
if (!providerConfig) {
|
|
281
|
+
return {
|
|
282
|
+
isValid: false,
|
|
283
|
+
provider,
|
|
284
|
+
error: "Unknown provider",
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// Basic format validation
|
|
288
|
+
if (!this.validateKeyFormat(provider, apiKey)) {
|
|
289
|
+
return {
|
|
290
|
+
isValid: false,
|
|
291
|
+
provider,
|
|
292
|
+
error: "Invalid key format",
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
// Online validation if URL is provided
|
|
296
|
+
if (providerConfig.validationUrl) {
|
|
297
|
+
try {
|
|
298
|
+
const isValid = await this.validateWithProvider(provider, apiKey, providerConfig.validationUrl);
|
|
299
|
+
return {
|
|
300
|
+
isValid,
|
|
301
|
+
provider,
|
|
302
|
+
permissions: providerConfig.requiredPermissions,
|
|
303
|
+
rateLimit: providerConfig.rateLimits,
|
|
304
|
+
error: isValid ? undefined : "Key validation failed",
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
return {
|
|
309
|
+
isValid: false,
|
|
310
|
+
provider,
|
|
311
|
+
error: `Validation error: ${error instanceof Error ? error.message : "Unknown error"}`,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Offline validation only
|
|
316
|
+
return {
|
|
317
|
+
isValid: true,
|
|
318
|
+
provider,
|
|
319
|
+
permissions: providerConfig.requiredPermissions,
|
|
320
|
+
rateLimit: providerConfig.rateLimits,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Validate API key with provider's API
|
|
325
|
+
*/
|
|
326
|
+
async validateWithProvider(provider, key, validationUrl) {
|
|
327
|
+
try {
|
|
328
|
+
const response = await fetch(validationUrl, {
|
|
329
|
+
method: "GET",
|
|
330
|
+
headers: {
|
|
331
|
+
Authorization: `Bearer ${key}`,
|
|
332
|
+
"User-Agent": "MyContext-CLI/1.0.0",
|
|
333
|
+
},
|
|
334
|
+
signal: AbortSignal.timeout(10000), // 10 second timeout
|
|
335
|
+
});
|
|
336
|
+
return response.ok;
|
|
337
|
+
}
|
|
338
|
+
catch (error) {
|
|
339
|
+
console.warn(`Failed to validate ${provider} API key:`, error);
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Remove API key for a provider
|
|
345
|
+
*/
|
|
346
|
+
async removeKey(provider) {
|
|
347
|
+
if (this.keys.has(provider)) {
|
|
348
|
+
this.keys.delete(provider);
|
|
349
|
+
await this.saveKeys();
|
|
350
|
+
console.log(`🗑️ API key removed for ${provider}`);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
console.log(`ℹ️ No stored API key found for ${provider}`);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* List all configured API keys
|
|
358
|
+
*/
|
|
359
|
+
listKeys() {
|
|
360
|
+
const result = [];
|
|
361
|
+
this.providers.forEach((config, provider) => {
|
|
362
|
+
const envKey = this.getKeyFromEnvironment(provider);
|
|
363
|
+
const storedKey = this.keys.get(provider);
|
|
364
|
+
let source = "none";
|
|
365
|
+
let hasKey = false;
|
|
366
|
+
if (envKey) {
|
|
367
|
+
source = "environment";
|
|
368
|
+
hasKey = true;
|
|
369
|
+
}
|
|
370
|
+
else if (storedKey?.key) {
|
|
371
|
+
source = "storage";
|
|
372
|
+
hasKey = true;
|
|
373
|
+
}
|
|
374
|
+
result.push({ provider, hasKey, source });
|
|
375
|
+
});
|
|
376
|
+
return result;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Get provider configuration
|
|
380
|
+
*/
|
|
381
|
+
getProviderConfig(provider) {
|
|
382
|
+
return this.providers.get(provider);
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* List all supported providers
|
|
386
|
+
*/
|
|
387
|
+
getSupportedProviders() {
|
|
388
|
+
return Array.from(this.providers.keys());
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Clear all stored API keys
|
|
392
|
+
*/
|
|
393
|
+
async clearAllKeys() {
|
|
394
|
+
this.keys.clear();
|
|
395
|
+
await this.saveKeys();
|
|
396
|
+
console.log("🗑️ All stored API keys cleared");
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Export API keys (for backup purposes)
|
|
400
|
+
*/
|
|
401
|
+
async exportKeys(password) {
|
|
402
|
+
const keysData = {};
|
|
403
|
+
this.keys.forEach((config, provider) => {
|
|
404
|
+
keysData[provider] = config;
|
|
405
|
+
});
|
|
406
|
+
const jsonData = JSON.stringify(keysData, null, 2);
|
|
407
|
+
const encryptedData = this.encrypt(jsonData);
|
|
408
|
+
// Additional encryption with user password
|
|
409
|
+
const salt = crypto.randomBytes(16);
|
|
410
|
+
const key = crypto.pbkdf2Sync(password, salt, 100000, 32, "sha256");
|
|
411
|
+
const iv = crypto.randomBytes(16);
|
|
412
|
+
const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
|
|
413
|
+
let encrypted = cipher.update(encryptedData, "utf8", "hex");
|
|
414
|
+
encrypted += cipher.final("hex");
|
|
415
|
+
encrypted =
|
|
416
|
+
salt.toString("hex") + ":" + iv.toString("hex") + ":" + encrypted;
|
|
417
|
+
return JSON.stringify({
|
|
418
|
+
version: "1.0",
|
|
419
|
+
salt: salt.toString("hex"),
|
|
420
|
+
data: encrypted,
|
|
421
|
+
timestamp: new Date().toISOString(),
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Import API keys from backup
|
|
426
|
+
*/
|
|
427
|
+
async importKeys(backupData, password) {
|
|
428
|
+
try {
|
|
429
|
+
const backup = JSON.parse(backupData);
|
|
430
|
+
if (backup.version !== "1.0") {
|
|
431
|
+
throw new Error("Unsupported backup version");
|
|
432
|
+
}
|
|
433
|
+
// Decrypt with user password
|
|
434
|
+
const [saltHex, ivHex, encrypted] = backup.data.split(":");
|
|
435
|
+
const salt = Buffer.from(saltHex, "hex");
|
|
436
|
+
const iv = Buffer.from(ivHex, "hex");
|
|
437
|
+
const key = crypto.pbkdf2Sync(password, salt, 100000, 32, "sha256");
|
|
438
|
+
const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
|
|
439
|
+
let decrypted = decipher.update(encrypted, "hex", "utf8");
|
|
440
|
+
decrypted += decipher.final("utf8");
|
|
441
|
+
// Decrypt with internal key
|
|
442
|
+
const keysData = JSON.parse(this.decrypt(decrypted));
|
|
443
|
+
// Validate and import keys
|
|
444
|
+
for (const [provider, config] of Object.entries(keysData)) {
|
|
445
|
+
if (this.validateKeyFormat(provider, config.key)) {
|
|
446
|
+
this.keys.set(provider, config);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
await this.saveKeys();
|
|
450
|
+
console.log(`📥 Imported ${Object.keys(keysData).length} API keys from backup`);
|
|
451
|
+
}
|
|
452
|
+
catch (error) {
|
|
453
|
+
throw (0, errorHandler_1.createError)(error, { operation: "import_api_keys" }, errorHandler_1.ErrorType.VALIDATION_ERROR);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
exports.APIKeyManager = APIKeyManager;
|
|
458
|
+
// Export singleton instance
|
|
459
|
+
exports.apiKeyManager = APIKeyManager.getInstance();
|
|
460
|
+
// Utility functions
|
|
461
|
+
const getAPIKey = (provider) => exports.apiKeyManager.getKey(provider);
|
|
462
|
+
exports.getAPIKey = getAPIKey;
|
|
463
|
+
const setAPIKey = (provider, key, options) => exports.apiKeyManager.setKey(provider, key, options);
|
|
464
|
+
exports.setAPIKey = setAPIKey;
|
|
465
|
+
const validateAPIKey = (provider, key) => exports.apiKeyManager.validateKey(provider, key);
|
|
466
|
+
exports.validateAPIKey = validateAPIKey;
|
|
467
|
+
const removeAPIKey = (provider) => exports.apiKeyManager.removeKey(provider);
|
|
468
|
+
exports.removeAPIKey = removeAPIKey;
|
|
469
|
+
const listAPIKeys = () => exports.apiKeyManager.listKeys();
|
|
470
|
+
exports.listAPIKeys = listAPIKeys;
|
|
471
|
+
//# sourceMappingURL=apiKeyManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apiKeyManager.js","sourceRoot":"","sources":["../../../../src/utils/apiKeyManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comprehensive Error Handling System for MyContext CLI
|
|
3
|
+
*
|
|
4
|
+
* Provides structured error handling, logging, and recovery mechanisms
|
|
5
|
+
* for AI providers, API calls, and CLI operations.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum ErrorType {
|
|
8
|
+
API_ERROR = "API_ERROR",
|
|
9
|
+
NETWORK_ERROR = "NETWORK_ERROR",
|
|
10
|
+
AUTHENTICATION_ERROR = "AUTHENTICATION_ERROR",
|
|
11
|
+
VALIDATION_ERROR = "VALIDATION_ERROR",
|
|
12
|
+
FILE_SYSTEM_ERROR = "FILE_SYSTEM_ERROR",
|
|
13
|
+
CONFIGURATION_ERROR = "CONFIGURATION_ERROR",
|
|
14
|
+
AI_PROVIDER_ERROR = "AI_PROVIDER_ERROR",
|
|
15
|
+
RATE_LIMIT_ERROR = "RATE_LIMIT_ERROR",
|
|
16
|
+
TIMEOUT_ERROR = "TIMEOUT_ERROR",
|
|
17
|
+
UNKNOWN_ERROR = "UNKNOWN_ERROR"
|
|
18
|
+
}
|
|
19
|
+
export declare enum ErrorSeverity {
|
|
20
|
+
LOW = "LOW",
|
|
21
|
+
MEDIUM = "MEDIUM",
|
|
22
|
+
HIGH = "HIGH",
|
|
23
|
+
CRITICAL = "CRITICAL"
|
|
24
|
+
}
|
|
25
|
+
export interface StructuredError {
|
|
26
|
+
type: ErrorType;
|
|
27
|
+
severity: ErrorSeverity;
|
|
28
|
+
message: string;
|
|
29
|
+
code?: string | number;
|
|
30
|
+
details?: Record<string, unknown>;
|
|
31
|
+
timestamp: string;
|
|
32
|
+
source?: string;
|
|
33
|
+
retryable?: boolean;
|
|
34
|
+
retryAfter?: number;
|
|
35
|
+
suggestions?: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface ErrorContext {
|
|
38
|
+
operation?: string;
|
|
39
|
+
provider?: string;
|
|
40
|
+
userId?: string;
|
|
41
|
+
requestId?: string;
|
|
42
|
+
metadata?: Record<string, unknown>;
|
|
43
|
+
}
|
|
44
|
+
export declare class MyContextError extends Error {
|
|
45
|
+
readonly type: ErrorType;
|
|
46
|
+
readonly severity: ErrorSeverity;
|
|
47
|
+
readonly code?: string | number;
|
|
48
|
+
readonly details?: Record<string, unknown>;
|
|
49
|
+
readonly timestamp: string;
|
|
50
|
+
readonly source?: string;
|
|
51
|
+
readonly retryable?: boolean;
|
|
52
|
+
readonly retryAfter?: number;
|
|
53
|
+
readonly suggestions?: string[];
|
|
54
|
+
constructor(structuredError: StructuredError);
|
|
55
|
+
toJSON(): StructuredError;
|
|
56
|
+
}
|
|
57
|
+
export declare class ErrorHandler {
|
|
58
|
+
private static instance;
|
|
59
|
+
private errorLog;
|
|
60
|
+
private maxLogSize;
|
|
61
|
+
private constructor();
|
|
62
|
+
static getInstance(): ErrorHandler;
|
|
63
|
+
/**
|
|
64
|
+
* Create a structured error from various input types
|
|
65
|
+
*/
|
|
66
|
+
createError(error: unknown, context?: ErrorContext, defaultType?: ErrorType): MyContextError;
|
|
67
|
+
/**
|
|
68
|
+
* Handle AI provider specific errors
|
|
69
|
+
*/
|
|
70
|
+
handleAIProviderError(error: unknown, provider: string, operation: string, requestData?: Record<string, unknown>): MyContextError;
|
|
71
|
+
/**
|
|
72
|
+
* Handle network and connectivity errors
|
|
73
|
+
*/
|
|
74
|
+
handleNetworkError(error: unknown, context?: ErrorContext): MyContextError;
|
|
75
|
+
/**
|
|
76
|
+
* Handle file system errors
|
|
77
|
+
*/
|
|
78
|
+
handleFileSystemError(error: unknown, filePath?: string): MyContextError;
|
|
79
|
+
/**
|
|
80
|
+
* Log error for debugging and monitoring
|
|
81
|
+
*/
|
|
82
|
+
private logError;
|
|
83
|
+
/**
|
|
84
|
+
* Get recent errors for debugging
|
|
85
|
+
*/
|
|
86
|
+
getRecentErrors(count?: number): StructuredError[];
|
|
87
|
+
/**
|
|
88
|
+
* Clear error log
|
|
89
|
+
*/
|
|
90
|
+
clearErrors(): void;
|
|
91
|
+
/**
|
|
92
|
+
* Handle standard JavaScript errors
|
|
93
|
+
*/
|
|
94
|
+
private handleStandardError;
|
|
95
|
+
/**
|
|
96
|
+
* Handle object-type errors (API responses, etc.)
|
|
97
|
+
*/
|
|
98
|
+
private handleObjectError;
|
|
99
|
+
}
|
|
100
|
+
export declare const errorHandler: ErrorHandler;
|
|
101
|
+
export declare const createAIProviderError: (error: unknown, provider: string, operation: string) => MyContextError;
|
|
102
|
+
export declare const createNetworkError: (error: unknown, context?: ErrorContext) => MyContextError;
|
|
103
|
+
export declare const createFileSystemError: (error: unknown, filePath?: string) => MyContextError;
|
|
104
|
+
export declare const createError: (error: unknown, context?: ErrorContext, type?: ErrorType) => MyContextError;
|
|
105
|
+
//# sourceMappingURL=errorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../../../src/utils/errorHandler.ts"],"names":[],"mappings":"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"}
|