ai-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.
- package/LICENSE +21 -0
- package/README.md +193 -0
- package/dist/api/index.d.ts +27 -0
- package/dist/api/index.js +213 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware/security.d.ts +6 -0
- package/dist/api/middleware/security.js +28 -0
- package/dist/api/middleware/security.js.map +1 -0
- package/dist/api/routes/chat.d.ts +2 -0
- package/dist/api/routes/chat.js +78 -0
- package/dist/api/routes/chat.js.map +1 -0
- package/dist/api/routes/config.d.ts +2 -0
- package/dist/api/routes/config.js +81 -0
- package/dist/api/routes/config.js.map +1 -0
- package/dist/api/routes/providers.d.ts +2 -0
- package/dist/api/routes/providers.js +225 -0
- package/dist/api/routes/providers.js.map +1 -0
- package/dist/api/standalone-server.d.ts +12 -0
- package/dist/api/standalone-server.js +117 -0
- package/dist/api/standalone-server.js.map +1 -0
- package/dist/config/defaults.d.ts +17 -0
- package/dist/config/defaults.js +30 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/encryption.d.ts +12 -0
- package/dist/config/encryption.js +85 -0
- package/dist/config/encryption.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +62 -0
- package/dist/config/manager.js +210 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/prompts.d.ts +10 -0
- package/dist/config/prompts.js +168 -0
- package/dist/config/prompts.js.map +1 -0
- package/dist/config/schema.d.ts +141 -0
- package/dist/config/schema.js +54 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +260 -0
- package/dist/index.js.map +1 -0
- package/dist/installer/detector.d.ts +48 -0
- package/dist/installer/detector.js +164 -0
- package/dist/installer/detector.js.map +1 -0
- package/dist/installer/index.d.ts +7 -0
- package/dist/installer/index.js +10 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/installer.d.ts +16 -0
- package/dist/installer/installer.js +262 -0
- package/dist/installer/installer.js.map +1 -0
- package/dist/installer/tools.d.ts +16 -0
- package/dist/installer/tools.js +327 -0
- package/dist/installer/tools.js.map +1 -0
- package/dist/installer/types.d.ts +68 -0
- package/dist/installer/types.js +5 -0
- package/dist/installer/types.js.map +1 -0
- package/dist/providers/base.d.ts +44 -0
- package/dist/providers/base.js +84 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/deepseek.d.ts +30 -0
- package/dist/providers/deepseek.js +148 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +30 -0
- package/dist/providers/openai.js +123 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/registry.d.ts +37 -0
- package/dist/providers/registry.js +65 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/providers/types.d.ts +71 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/server/conversation.d.ts +105 -0
- package/dist/server/conversation.js +279 -0
- package/dist/server/conversation.js.map +1 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/tools/consult.d.ts +15 -0
- package/dist/server/tools/consult.js +164 -0
- package/dist/server/tools/consult.js.map +1 -0
- package/dist/server/tools/index.d.ts +1 -0
- package/dist/server/tools/index.js +2 -0
- package/dist/server/tools/index.js.map +1 -0
- package/dist/types/config.d.ts +20 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +48 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/models.d.ts +39 -0
- package/dist/types/models.js +66 -0
- package/dist/types/models.js.map +1 -0
- package/dist/ui/index.html +1244 -0
- package/dist/utils/errors.d.ts +32 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.js +73 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import { getConfigManager } from '../../config/index.js';
|
|
3
|
+
import { MODEL_TYPES } from '../../types/index.js';
|
|
4
|
+
const router = Router();
|
|
5
|
+
/**
|
|
6
|
+
* GET /api/config - Get current configuration (with masked keys)
|
|
7
|
+
*/
|
|
8
|
+
router.get('/', (_req, res) => {
|
|
9
|
+
try {
|
|
10
|
+
const config = getConfigManager().getConfig();
|
|
11
|
+
// Build safe response with masked keys
|
|
12
|
+
const safeConfig = {
|
|
13
|
+
defaultModel: config.defaultModel,
|
|
14
|
+
maxMessages: config.maxMessages,
|
|
15
|
+
availableModels: MODEL_TYPES,
|
|
16
|
+
providers: Object.fromEntries(Object.entries(config.providers).map(([id, cfg]) => [
|
|
17
|
+
id,
|
|
18
|
+
{
|
|
19
|
+
enabled: cfg.enabled,
|
|
20
|
+
hasKey: !!cfg.apiKey,
|
|
21
|
+
},
|
|
22
|
+
])),
|
|
23
|
+
};
|
|
24
|
+
res.json(safeConfig);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
res.status(500).json({
|
|
28
|
+
error: 'Failed to get configuration',
|
|
29
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* PATCH /api/config - Update configuration (defaultModel, maxMessages)
|
|
35
|
+
*/
|
|
36
|
+
router.patch('/', async (req, res) => {
|
|
37
|
+
try {
|
|
38
|
+
const { defaultModel, maxMessages } = req.body;
|
|
39
|
+
const updates = {};
|
|
40
|
+
// Validate defaultModel
|
|
41
|
+
if (defaultModel !== undefined) {
|
|
42
|
+
if (!MODEL_TYPES.includes(defaultModel)) {
|
|
43
|
+
res.status(400).json({
|
|
44
|
+
error: 'Invalid model',
|
|
45
|
+
message: `Model must be one of: ${MODEL_TYPES.join(', ')}`,
|
|
46
|
+
});
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
updates.defaultModel = defaultModel;
|
|
50
|
+
}
|
|
51
|
+
// Validate maxMessages
|
|
52
|
+
if (maxMessages !== undefined) {
|
|
53
|
+
const num = parseInt(maxMessages, 10);
|
|
54
|
+
if (isNaN(num) || num < 1 || num > 50) {
|
|
55
|
+
res.status(400).json({
|
|
56
|
+
error: 'Invalid maxMessages',
|
|
57
|
+
message: 'maxMessages must be between 1 and 50',
|
|
58
|
+
});
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
updates.maxMessages = num;
|
|
62
|
+
}
|
|
63
|
+
if (Object.keys(updates).length === 0) {
|
|
64
|
+
res.status(400).json({
|
|
65
|
+
error: 'No updates provided',
|
|
66
|
+
message: 'Provide at least one of: defaultModel, maxMessages',
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
await getConfigManager().update(updates);
|
|
71
|
+
res.json({ success: true, updated: updates });
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
res.status(500).json({
|
|
75
|
+
error: 'Failed to update configuration',
|
|
76
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
export { router as configRoutes };
|
|
81
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/api/routes/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -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: 'ChatGPT',
|
|
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 (fixed length + last 4 characters)
|
|
29
|
+
*/
|
|
30
|
+
function maskKey(key) {
|
|
31
|
+
if (key.length <= 4)
|
|
32
|
+
return '••••••••';
|
|
33
|
+
return '••••••••' + 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 (with auto port finding)
|
|
8
|
+
* 2. Opening the browser automatically
|
|
9
|
+
*
|
|
10
|
+
* Usage: node dist/api/standalone-server.js [port]
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
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 (with auto port finding)
|
|
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 net from 'net';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
import open from 'open';
|
|
17
|
+
import { getConfigManager } from '../config/index.js';
|
|
18
|
+
import { configRoutes } from './routes/config.js';
|
|
19
|
+
import { providerRoutes } from './routes/providers.js';
|
|
20
|
+
import chatRoutes from './routes/chat.js';
|
|
21
|
+
import { securityMiddleware } from './middleware/security.js';
|
|
22
|
+
// Get __dirname equivalent in ES modules
|
|
23
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
24
|
+
const __dirname = path.dirname(__filename);
|
|
25
|
+
const DEFAULT_PORT = 3456;
|
|
26
|
+
const MAX_PORT_ATTEMPTS = 10;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a port is available
|
|
29
|
+
*/
|
|
30
|
+
function isPortAvailable(port) {
|
|
31
|
+
return new Promise((resolve) => {
|
|
32
|
+
const server = net.createServer();
|
|
33
|
+
server.once('error', () => resolve(false));
|
|
34
|
+
server.once('listening', () => {
|
|
35
|
+
server.close();
|
|
36
|
+
resolve(true);
|
|
37
|
+
});
|
|
38
|
+
server.listen(port, '127.0.0.1');
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Find an available port starting from the given port
|
|
43
|
+
*/
|
|
44
|
+
async function findAvailablePort(startPort) {
|
|
45
|
+
for (let port = startPort; port < startPort + MAX_PORT_ATTEMPTS; port++) {
|
|
46
|
+
if (await isPortAvailable(port)) {
|
|
47
|
+
return port;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
throw new Error(`No available port found between ${startPort} and ${startPort + MAX_PORT_ATTEMPTS - 1}`);
|
|
51
|
+
}
|
|
52
|
+
async function main() {
|
|
53
|
+
// Parse preferred port from command line args
|
|
54
|
+
const preferredPort = parseInt(process.argv[2], 10) || DEFAULT_PORT;
|
|
55
|
+
// Find available port (auto-increment if busy)
|
|
56
|
+
let port;
|
|
57
|
+
try {
|
|
58
|
+
port = await findAvailablePort(preferredPort);
|
|
59
|
+
if (port !== preferredPort) {
|
|
60
|
+
console.log(`Port ${preferredPort} in use, using port ${port} instead`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
console.error(`No available ports found. Please close some applications and try again.`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
// Initialize config
|
|
68
|
+
const configManager = getConfigManager();
|
|
69
|
+
await configManager.init();
|
|
70
|
+
const app = express();
|
|
71
|
+
// Middleware
|
|
72
|
+
app.use(express.json());
|
|
73
|
+
app.use(securityMiddleware);
|
|
74
|
+
// API routes
|
|
75
|
+
app.use('/api/config', configRoutes);
|
|
76
|
+
app.use('/api/providers', providerRoutes);
|
|
77
|
+
app.use('/api/chat', chatRoutes);
|
|
78
|
+
// Serve static UI files
|
|
79
|
+
const uiPath = path.join(__dirname, '../ui');
|
|
80
|
+
app.use(express.static(uiPath));
|
|
81
|
+
// Fallback to index.html for SPA-like behavior
|
|
82
|
+
app.use((_req, res, next) => {
|
|
83
|
+
if (!_req.path.startsWith('/api') && !path.extname(_req.path)) {
|
|
84
|
+
res.sendFile(path.join(uiPath, 'index.html'));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
next();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// Error handling middleware
|
|
91
|
+
app.use((err, _req, res, _next) => {
|
|
92
|
+
console.error('HTTP server error:', err.message);
|
|
93
|
+
res.status(500).json({
|
|
94
|
+
error: 'Internal server error',
|
|
95
|
+
message: err.message,
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
// Start server
|
|
99
|
+
const server = app.listen(port, '127.0.0.1', () => {
|
|
100
|
+
const url = `http://127.0.0.1:${port}`;
|
|
101
|
+
console.log(`Web UI server started at ${url}`);
|
|
102
|
+
// Open browser
|
|
103
|
+
open(url, { wait: false }).catch((err) => {
|
|
104
|
+
console.error('Failed to open browser:', err.message);
|
|
105
|
+
console.log(`Please open ${url} in your browser manually`);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
server.on('error', (err) => {
|
|
109
|
+
console.error('Server error:', err.message);
|
|
110
|
+
process.exit(1);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
main().catch((error) => {
|
|
114
|
+
console.error('Failed to start standalone server:', error);
|
|
115
|
+
process.exit(1);
|
|
116
|
+
});
|
|
117
|
+
//# 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 @@
|
|
|
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"}
|