agent-consultation-mcp 1.0.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 (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +140 -0
  3. package/dist/api/index.d.ts +27 -0
  4. package/dist/api/index.js +213 -0
  5. package/dist/api/index.js.map +1 -0
  6. package/dist/api/middleware/security.d.ts +6 -0
  7. package/dist/api/middleware/security.js +28 -0
  8. package/dist/api/middleware/security.js.map +1 -0
  9. package/dist/api/routes/chat.d.ts +2 -0
  10. package/dist/api/routes/chat.js +61 -0
  11. package/dist/api/routes/chat.js.map +1 -0
  12. package/dist/api/routes/config.d.ts +2 -0
  13. package/dist/api/routes/config.js +81 -0
  14. package/dist/api/routes/config.js.map +1 -0
  15. package/dist/api/routes/providers.d.ts +2 -0
  16. package/dist/api/routes/providers.js +225 -0
  17. package/dist/api/routes/providers.js.map +1 -0
  18. package/dist/api/standalone-server.d.ts +12 -0
  19. package/dist/api/standalone-server.js +91 -0
  20. package/dist/api/standalone-server.js.map +1 -0
  21. package/dist/config/defaults.d.ts +17 -0
  22. package/dist/config/defaults.js +30 -0
  23. package/dist/config/defaults.js.map +1 -0
  24. package/dist/config/encryption.d.ts +12 -0
  25. package/dist/config/encryption.js +85 -0
  26. package/dist/config/encryption.js.map +1 -0
  27. package/dist/config/index.d.ts +5 -0
  28. package/dist/config/index.js +6 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/manager.d.ts +62 -0
  31. package/dist/config/manager.js +186 -0
  32. package/dist/config/manager.js.map +1 -0
  33. package/dist/config/prompts.d.ts +10 -0
  34. package/dist/config/prompts.js +140 -0
  35. package/dist/config/prompts.js.map +1 -0
  36. package/dist/config/schema.d.ts +141 -0
  37. package/dist/config/schema.js +54 -0
  38. package/dist/config/schema.js.map +1 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +224 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/providers/base.d.ts +44 -0
  43. package/dist/providers/base.js +84 -0
  44. package/dist/providers/base.js.map +1 -0
  45. package/dist/providers/deepseek.d.ts +30 -0
  46. package/dist/providers/deepseek.js +148 -0
  47. package/dist/providers/deepseek.js.map +1 -0
  48. package/dist/providers/index.d.ts +5 -0
  49. package/dist/providers/index.js +8 -0
  50. package/dist/providers/index.js.map +1 -0
  51. package/dist/providers/openai.d.ts +30 -0
  52. package/dist/providers/openai.js +123 -0
  53. package/dist/providers/openai.js.map +1 -0
  54. package/dist/providers/registry.d.ts +37 -0
  55. package/dist/providers/registry.js +65 -0
  56. package/dist/providers/registry.js.map +1 -0
  57. package/dist/providers/types.d.ts +71 -0
  58. package/dist/providers/types.js +2 -0
  59. package/dist/providers/types.js.map +1 -0
  60. package/dist/server/conversation.d.ts +101 -0
  61. package/dist/server/conversation.js +275 -0
  62. package/dist/server/conversation.js.map +1 -0
  63. package/dist/server/index.d.ts +2 -0
  64. package/dist/server/index.js +3 -0
  65. package/dist/server/index.js.map +1 -0
  66. package/dist/server/tools/consult.d.ts +15 -0
  67. package/dist/server/tools/consult.js +164 -0
  68. package/dist/server/tools/consult.js.map +1 -0
  69. package/dist/server/tools/index.d.ts +1 -0
  70. package/dist/server/tools/index.js +2 -0
  71. package/dist/server/tools/index.js.map +1 -0
  72. package/dist/types/config.d.ts +20 -0
  73. package/dist/types/config.js +2 -0
  74. package/dist/types/config.js.map +1 -0
  75. package/dist/types/index.d.ts +3 -0
  76. package/dist/types/index.js +4 -0
  77. package/dist/types/index.js.map +1 -0
  78. package/dist/types/messages.d.ts +48 -0
  79. package/dist/types/messages.js +2 -0
  80. package/dist/types/messages.js.map +1 -0
  81. package/dist/types/models.d.ts +39 -0
  82. package/dist/types/models.js +66 -0
  83. package/dist/types/models.js.map +1 -0
  84. package/dist/ui/index.html +1044 -0
  85. package/dist/utils/errors.d.ts +32 -0
  86. package/dist/utils/errors.js +53 -0
  87. package/dist/utils/errors.js.map +1 -0
  88. package/dist/utils/index.d.ts +2 -0
  89. package/dist/utils/index.js +3 -0
  90. package/dist/utils/index.js.map +1 -0
  91. package/dist/utils/logger.d.ts +13 -0
  92. package/dist/utils/logger.js +73 -0
  93. package/dist/utils/logger.js.map +1 -0
  94. package/package.json +65 -0
@@ -0,0 +1,225 @@
1
+ import { Router } from 'express';
2
+ import { getConfigManager } from '../../config/index.js';
3
+ import { MODEL_TO_PROVIDER, MODEL_CONFIG } from '../../types/index.js';
4
+ import { logger } from '../../utils/index.js';
5
+ const router = Router();
6
+ /**
7
+ * Provider display information
8
+ */
9
+ const PROVIDER_INFO = {
10
+ deepseek: {
11
+ name: 'DeepSeek',
12
+ description: 'DeepSeek Chat and Reasoner models',
13
+ },
14
+ openai: {
15
+ name: 'OpenAI',
16
+ description: 'GPT-5.2 and GPT-5.2 Pro models',
17
+ },
18
+ };
19
+ /**
20
+ * Get models for a specific provider
21
+ */
22
+ function getModelsForProvider(providerId) {
23
+ return Object.entries(MODEL_TO_PROVIDER)
24
+ .filter(([_, provider]) => provider === providerId)
25
+ .map(([model]) => model);
26
+ }
27
+ /**
28
+ * Mask API key for display (show only last 4 characters)
29
+ */
30
+ function maskKey(key) {
31
+ if (key.length <= 8)
32
+ return '••••••••';
33
+ return '•'.repeat(key.length - 4) + key.slice(-4);
34
+ }
35
+ /**
36
+ * GET /api/providers - List all providers with status
37
+ */
38
+ router.get('/', (_req, res) => {
39
+ try {
40
+ const config = getConfigManager().getConfig();
41
+ const providers = Object.keys(PROVIDER_INFO).map((id) => {
42
+ const providerConfig = config.providers[id];
43
+ const models = getModelsForProvider(id);
44
+ return {
45
+ id,
46
+ name: PROVIDER_INFO[id].name,
47
+ description: PROVIDER_INFO[id].description,
48
+ enabled: providerConfig?.enabled ?? false,
49
+ hasKey: !!providerConfig?.apiKey,
50
+ maskedKey: providerConfig?.apiKey ? maskKey(providerConfig.apiKey) : null,
51
+ models: models.map((m) => ({
52
+ id: m,
53
+ name: m,
54
+ isReasoning: MODEL_CONFIG[m]?.isReasoning ?? false,
55
+ })),
56
+ };
57
+ });
58
+ res.json(providers);
59
+ }
60
+ catch (error) {
61
+ res.status(500).json({
62
+ error: 'Failed to list providers',
63
+ message: error instanceof Error ? error.message : 'Unknown error',
64
+ });
65
+ }
66
+ });
67
+ /**
68
+ * GET /api/providers/:id - Get single provider details
69
+ */
70
+ router.get('/:id', (req, res) => {
71
+ try {
72
+ const { id } = req.params;
73
+ if (!PROVIDER_INFO[id]) {
74
+ res.status(404).json({ error: 'Provider not found' });
75
+ return;
76
+ }
77
+ const config = getConfigManager().getConfig();
78
+ const providerConfig = config.providers[id];
79
+ const models = getModelsForProvider(id);
80
+ res.json({
81
+ id,
82
+ name: PROVIDER_INFO[id].name,
83
+ description: PROVIDER_INFO[id].description,
84
+ enabled: providerConfig?.enabled ?? false,
85
+ hasKey: !!providerConfig?.apiKey,
86
+ maskedKey: providerConfig?.apiKey ? maskKey(providerConfig.apiKey) : null,
87
+ models: models.map((m) => ({
88
+ id: m,
89
+ name: m,
90
+ isReasoning: MODEL_CONFIG[m]?.isReasoning ?? false,
91
+ })),
92
+ });
93
+ }
94
+ catch (error) {
95
+ res.status(500).json({
96
+ error: 'Failed to get provider',
97
+ message: error instanceof Error ? error.message : 'Unknown error',
98
+ });
99
+ }
100
+ });
101
+ /**
102
+ * PUT /api/providers/:id - Set provider API key
103
+ */
104
+ router.put('/:id', async (req, res) => {
105
+ try {
106
+ const { id } = req.params;
107
+ const { apiKey } = req.body;
108
+ if (!PROVIDER_INFO[id]) {
109
+ res.status(404).json({ error: 'Provider not found' });
110
+ return;
111
+ }
112
+ if (!apiKey || typeof apiKey !== 'string' || apiKey.trim().length === 0) {
113
+ res.status(400).json({
114
+ error: 'Invalid API key',
115
+ message: 'API key is required and must be a non-empty string',
116
+ });
117
+ return;
118
+ }
119
+ await getConfigManager().setProviderKey(id, apiKey.trim());
120
+ logger.info(`API key updated for provider: ${id}`);
121
+ res.json({
122
+ success: true,
123
+ provider: id,
124
+ maskedKey: maskKey(apiKey.trim()),
125
+ });
126
+ }
127
+ catch (error) {
128
+ res.status(500).json({
129
+ error: 'Failed to set API key',
130
+ message: error instanceof Error ? error.message : 'Unknown error',
131
+ });
132
+ }
133
+ });
134
+ /**
135
+ * DELETE /api/providers/:id - Remove provider API key
136
+ */
137
+ router.delete('/:id', async (req, res) => {
138
+ try {
139
+ const { id } = req.params;
140
+ if (!PROVIDER_INFO[id]) {
141
+ res.status(404).json({ error: 'Provider not found' });
142
+ return;
143
+ }
144
+ await getConfigManager().removeProviderKey(id);
145
+ logger.info(`API key removed for provider: ${id}`);
146
+ res.json({
147
+ success: true,
148
+ provider: id,
149
+ });
150
+ }
151
+ catch (error) {
152
+ res.status(500).json({
153
+ error: 'Failed to remove API key',
154
+ message: error instanceof Error ? error.message : 'Unknown error',
155
+ });
156
+ }
157
+ });
158
+ /**
159
+ * POST /api/providers/:id/test - Test API key validity
160
+ * Makes a minimal API call to verify the key works
161
+ */
162
+ router.post('/:id/test', async (req, res) => {
163
+ try {
164
+ const { id } = req.params;
165
+ const { apiKey } = req.body;
166
+ if (!PROVIDER_INFO[id]) {
167
+ res.status(404).json({ error: 'Provider not found' });
168
+ return;
169
+ }
170
+ // Use provided apiKey or stored key
171
+ const config = getConfigManager().getConfig();
172
+ const keyToTest = apiKey || config.providers[id]?.apiKey;
173
+ if (!keyToTest) {
174
+ res.json({
175
+ valid: false,
176
+ message: 'No API key provided or configured',
177
+ });
178
+ return;
179
+ }
180
+ // Test the API key with a minimal request
181
+ const testResult = await testProviderApiKey(id, keyToTest);
182
+ res.json(testResult);
183
+ }
184
+ catch (error) {
185
+ res.json({
186
+ valid: false,
187
+ message: error instanceof Error ? error.message : 'Unknown error',
188
+ });
189
+ }
190
+ });
191
+ /**
192
+ * Test provider API key by making a minimal API call
193
+ */
194
+ async function testProviderApiKey(providerId, apiKey) {
195
+ try {
196
+ const { default: OpenAI } = await import('openai');
197
+ // Configure client based on provider
198
+ const clientOptions = { apiKey };
199
+ if (providerId === 'deepseek') {
200
+ clientOptions.baseURL = 'https://api.deepseek.com';
201
+ }
202
+ const client = new OpenAI(clientOptions);
203
+ await client.models.list();
204
+ const providerName = PROVIDER_INFO[providerId].name;
205
+ return { valid: true, message: `${providerName} API key is valid` };
206
+ }
207
+ catch (error) {
208
+ const message = error instanceof Error ? error.message : 'Unknown error';
209
+ // Check for common auth errors
210
+ if (message.includes('401') ||
211
+ message.includes('403') ||
212
+ message.includes('Unauthorized') ||
213
+ message.includes('Invalid API Key') ||
214
+ message.includes('authentication')) {
215
+ return { valid: false, message: 'Invalid API key: Authentication failed' };
216
+ }
217
+ // Rate limit is actually a valid key
218
+ if (message.includes('429') || message.includes('rate limit')) {
219
+ return { valid: true, message: 'API key is valid (rate limited)' };
220
+ }
221
+ return { valid: false, message: `API test failed: ${message}` };
222
+ }
223
+ }
224
+ export { router as providerRoutes };
225
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/api/routes/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Standalone Web UI Server
4
+ *
5
+ * This script runs as a completely separate process from the MCP server.
6
+ * It's spawned by openWebUI() and handles:
7
+ * 1. Starting the Express server
8
+ * 2. Opening the browser automatically
9
+ *
10
+ * Usage: node dist/api/standalone-server.js [port]
11
+ */
12
+ export {};
@@ -0,0 +1,91 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Standalone Web UI Server
4
+ *
5
+ * This script runs as a completely separate process from the MCP server.
6
+ * It's spawned by openWebUI() and handles:
7
+ * 1. Starting the Express server
8
+ * 2. Opening the browser automatically
9
+ *
10
+ * Usage: node dist/api/standalone-server.js [port]
11
+ */
12
+ import express from 'express';
13
+ import path from 'path';
14
+ import { fileURLToPath } from 'url';
15
+ import open from 'open';
16
+ import { getConfigManager } from '../config/index.js';
17
+ import { configRoutes } from './routes/config.js';
18
+ import { providerRoutes } from './routes/providers.js';
19
+ import chatRoutes from './routes/chat.js';
20
+ import { securityMiddleware } from './middleware/security.js';
21
+ // Get __dirname equivalent in ES modules
22
+ const __filename = fileURLToPath(import.meta.url);
23
+ const __dirname = path.dirname(__filename);
24
+ const DEFAULT_PORT = 3456;
25
+ async function main() {
26
+ // Parse port from command line args
27
+ const port = parseInt(process.argv[2], 10) || DEFAULT_PORT;
28
+ // Initialize config
29
+ const configManager = getConfigManager();
30
+ await configManager.init();
31
+ const app = express();
32
+ // Middleware
33
+ app.use(express.json());
34
+ app.use(securityMiddleware);
35
+ // API routes
36
+ app.use('/api/config', configRoutes);
37
+ app.use('/api/providers', providerRoutes);
38
+ app.use('/api/chat', chatRoutes);
39
+ // Serve static UI files
40
+ const uiPath = path.join(__dirname, '../ui');
41
+ app.use(express.static(uiPath));
42
+ // Fallback to index.html for SPA-like behavior
43
+ app.use((_req, res, next) => {
44
+ if (!_req.path.startsWith('/api') && !path.extname(_req.path)) {
45
+ res.sendFile(path.join(uiPath, 'index.html'));
46
+ }
47
+ else {
48
+ next();
49
+ }
50
+ });
51
+ // Error handling middleware
52
+ app.use((err, _req, res, _next) => {
53
+ console.error('HTTP server error:', err.message);
54
+ res.status(500).json({
55
+ error: 'Internal server error',
56
+ message: err.message,
57
+ });
58
+ });
59
+ // Start server
60
+ const server = app.listen(port, '127.0.0.1', () => {
61
+ const url = `http://127.0.0.1:${port}`;
62
+ console.log(`Web UI server started at ${url}`);
63
+ // Open browser
64
+ open(url, { wait: false }).catch((err) => {
65
+ console.error('Failed to open browser:', err.message);
66
+ console.log(`Please open ${url} in your browser manually`);
67
+ });
68
+ });
69
+ server.on('error', (err) => {
70
+ if (err.code === 'EADDRINUSE') {
71
+ // Port already in use - server might already be running
72
+ // Just try to open browser
73
+ const url = `http://127.0.0.1:${port}`;
74
+ console.log(`Port ${port} already in use, attempting to open browser...`);
75
+ open(url, { wait: false }).catch(() => {
76
+ console.log(`Please open ${url} in your browser manually`);
77
+ });
78
+ // Exit after attempting to open browser
79
+ setTimeout(() => process.exit(0), 1000);
80
+ }
81
+ else {
82
+ console.error('Server error:', err.message);
83
+ process.exit(1);
84
+ }
85
+ });
86
+ }
87
+ main().catch((error) => {
88
+ console.error('Failed to start standalone server:', error);
89
+ process.exit(1);
90
+ });
91
+ //# sourceMappingURL=standalone-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standalone-server.js","sourceRoot":"","sources":["../../src/api/standalone-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Config } from '../types/index.js';
2
+ /**
3
+ * Default configuration values
4
+ */
5
+ export declare const DEFAULT_CONFIG: Config;
6
+ /**
7
+ * Default system prompt for consultations
8
+ */
9
+ export declare const DEFAULT_SYSTEM_PROMPT = "You are a helpful AI assistant being consulted for a second opinion on a problem or task.\nProvide thoughtful, well-reasoned responses that offer a fresh perspective.\nBe concise but thorough in your analysis.";
10
+ /**
11
+ * Maximum allowed messages per conversation
12
+ */
13
+ export declare const MAX_MESSAGES_LIMIT = 5;
14
+ /**
15
+ * Conversation timeout in milliseconds (30 minutes)
16
+ */
17
+ export declare const CONVERSATION_TIMEOUT_MS: number;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Default configuration values
3
+ */
4
+ export const DEFAULT_CONFIG = {
5
+ defaultModel: 'deepseek-reasoner',
6
+ maxMessages: 5,
7
+ providers: {
8
+ deepseek: {
9
+ enabled: false,
10
+ },
11
+ openai: {
12
+ enabled: false,
13
+ },
14
+ },
15
+ };
16
+ /**
17
+ * Default system prompt for consultations
18
+ */
19
+ export const DEFAULT_SYSTEM_PROMPT = `You are a helpful AI assistant being consulted for a second opinion on a problem or task.
20
+ Provide thoughtful, well-reasoned responses that offer a fresh perspective.
21
+ Be concise but thorough in your analysis.`;
22
+ /**
23
+ * Maximum allowed messages per conversation
24
+ */
25
+ export const MAX_MESSAGES_LIMIT = 5;
26
+ /**
27
+ * Conversation timeout in milliseconds (30 minutes)
28
+ */
29
+ export const CONVERSATION_TIMEOUT_MS = 30 * 60 * 1000;
30
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAW;IACpC,YAAY,EAAE,mBAAmB;IACjC,WAAW,EAAE,CAAC;IACd,SAAS,EAAE;QACT,QAAQ,EAAE;YACR,OAAO,EAAE,KAAK;SACf;QACD,MAAM,EAAE;YACN,OAAO,EAAE,KAAK;SACf;KACF;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;0CAEK,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Encrypts a string using AES-256-GCM
3
+ */
4
+ export declare function encrypt(plaintext: string): string;
5
+ /**
6
+ * Decrypts a string encrypted with AES-256-GCM
7
+ */
8
+ export declare function decrypt(encryptedData: string): string;
9
+ /**
10
+ * Checks if a string appears to be encrypted (base64 with proper length)
11
+ */
12
+ export declare function isEncrypted(value: string): boolean;
@@ -0,0 +1,85 @@
1
+ import crypto from 'node:crypto';
2
+ import { ConfigError } from '../utils/index.js';
3
+ const ALGORITHM = 'aes-256-gcm';
4
+ const KEY_LENGTH = 32; // 256 bits
5
+ const IV_LENGTH = 16; // 128 bits
6
+ const AUTH_TAG_LENGTH = 16; // 128 bits
7
+ /**
8
+ * Derives a consistent encryption key from a machine-specific identifier
9
+ */
10
+ function deriveKey() {
11
+ // Use a combination of machine-specific values for key derivation
12
+ const machineId = process.env.USER ||
13
+ process.env.USERNAME ||
14
+ process.env.HOME ||
15
+ 'default-user';
16
+ const salt = 'agent-consultation-mcp-v1';
17
+ return crypto.pbkdf2Sync(machineId, salt, 100000, KEY_LENGTH, 'sha256');
18
+ }
19
+ /**
20
+ * Encrypts a string using AES-256-GCM
21
+ */
22
+ export function encrypt(plaintext) {
23
+ if (!plaintext) {
24
+ return '';
25
+ }
26
+ try {
27
+ const key = deriveKey();
28
+ const iv = crypto.randomBytes(IV_LENGTH);
29
+ const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
30
+ let encrypted = cipher.update(plaintext, 'utf8', 'base64');
31
+ encrypted += cipher.final('base64');
32
+ const authTag = cipher.getAuthTag();
33
+ // Combine IV + AuthTag + Encrypted data
34
+ const combined = Buffer.concat([
35
+ iv,
36
+ authTag,
37
+ Buffer.from(encrypted, 'base64'),
38
+ ]);
39
+ return combined.toString('base64');
40
+ }
41
+ catch (error) {
42
+ throw new ConfigError(`Encryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
43
+ }
44
+ }
45
+ /**
46
+ * Decrypts a string encrypted with AES-256-GCM
47
+ */
48
+ export function decrypt(encryptedData) {
49
+ if (!encryptedData) {
50
+ return '';
51
+ }
52
+ try {
53
+ const key = deriveKey();
54
+ const combined = Buffer.from(encryptedData, 'base64');
55
+ // Extract IV, AuthTag, and encrypted data
56
+ const iv = combined.subarray(0, IV_LENGTH);
57
+ const authTag = combined.subarray(IV_LENGTH, IV_LENGTH + AUTH_TAG_LENGTH);
58
+ const encrypted = combined.subarray(IV_LENGTH + AUTH_TAG_LENGTH);
59
+ const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
60
+ decipher.setAuthTag(authTag);
61
+ let decrypted = decipher.update(encrypted.toString('base64'), 'base64', 'utf8');
62
+ decrypted += decipher.final('utf8');
63
+ return decrypted;
64
+ }
65
+ catch (error) {
66
+ throw new ConfigError(`Decryption failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
67
+ }
68
+ }
69
+ /**
70
+ * Checks if a string appears to be encrypted (base64 with proper length)
71
+ */
72
+ export function isEncrypted(value) {
73
+ if (!value) {
74
+ return false;
75
+ }
76
+ try {
77
+ const decoded = Buffer.from(value, 'base64');
78
+ // Minimum length: IV (16) + AuthTag (16) + at least 1 byte of data
79
+ return decoded.length > IV_LENGTH + AUTH_TAG_LENGTH;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../src/config/encryption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './defaults.js';
2
+ export * from './encryption.js';
3
+ export * from './schema.js';
4
+ export * from './prompts.js';
5
+ export { ConfigManager, getConfigManager } from './manager.js';
@@ -0,0 +1,6 @@
1
+ export * from './defaults.js';
2
+ export * from './encryption.js';
3
+ export * from './schema.js';
4
+ export * from './prompts.js';
5
+ export { ConfigManager, getConfigManager } from './manager.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { Config } from '../types/index.js';
2
+ /**
3
+ * Configuration file manager
4
+ * Handles loading, saving, and encrypting configuration
5
+ */
6
+ export declare class ConfigManager {
7
+ private config;
8
+ private configPath;
9
+ constructor(configPath?: string);
10
+ /**
11
+ * Initialize the config manager and load configuration
12
+ */
13
+ init(): Promise<void>;
14
+ /**
15
+ * Load configuration from file
16
+ */
17
+ load(): Promise<Config>;
18
+ /**
19
+ * Save configuration to file
20
+ */
21
+ save(): Promise<void>;
22
+ /**
23
+ * Get current configuration (with decrypted keys)
24
+ */
25
+ getConfig(): Config;
26
+ /**
27
+ * Get configuration without API keys (safe for display)
28
+ */
29
+ getSafeConfig(): Config;
30
+ /**
31
+ * Update configuration
32
+ */
33
+ update(updates: Partial<Config>): Promise<void>;
34
+ /**
35
+ * Set provider API key
36
+ */
37
+ setProviderKey(provider: keyof Config['providers'], apiKey: string): Promise<void>;
38
+ /**
39
+ * Remove provider API key
40
+ */
41
+ removeProviderKey(provider: keyof Config['providers']): Promise<void>;
42
+ /**
43
+ * Check if a provider is configured
44
+ */
45
+ isProviderConfigured(provider: keyof Config['providers']): boolean;
46
+ /**
47
+ * Get API key for a provider (decrypted)
48
+ */
49
+ getProviderKey(provider: keyof Config['providers']): string | undefined;
50
+ /**
51
+ * Encrypt API keys in config object
52
+ */
53
+ private encryptApiKeys;
54
+ /**
55
+ * Decrypt API keys in config object
56
+ */
57
+ private decryptApiKeys;
58
+ }
59
+ /**
60
+ * Get the config manager instance
61
+ */
62
+ export declare function getConfigManager(configPath?: string): ConfigManager;