@1mcp/agent 0.20.3 → 0.22.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 +2 -1
- package/build/commands/app/backups.d.ts +2 -1
- package/build/commands/app/backups.d.ts.map +1 -1
- package/build/commands/app/backups.js.map +1 -1
- package/build/commands/app/consolidate.d.ts +2 -1
- package/build/commands/app/consolidate.d.ts.map +1 -1
- package/build/commands/app/consolidate.js.map +1 -1
- package/build/commands/app/discover.d.ts +2 -1
- package/build/commands/app/discover.d.ts.map +1 -1
- package/build/commands/app/discover.js.map +1 -1
- package/build/commands/app/index.d.ts.map +1 -1
- package/build/commands/app/index.js +4 -2
- package/build/commands/app/index.js.map +1 -1
- package/build/commands/app/list.d.ts +2 -1
- package/build/commands/app/list.d.ts.map +1 -1
- package/build/commands/app/list.js.map +1 -1
- package/build/commands/app/restore.d.ts +2 -1
- package/build/commands/app/restore.d.ts.map +1 -1
- package/build/commands/app/restore.js.map +1 -1
- package/build/commands/app/status.d.ts +2 -1
- package/build/commands/app/status.d.ts.map +1 -1
- package/build/commands/app/status.js.map +1 -1
- package/build/commands/mcp/add.d.ts +2 -2
- package/build/commands/mcp/add.d.ts.map +1 -1
- package/build/commands/mcp/enable.d.ts +2 -2
- package/build/commands/mcp/enable.d.ts.map +1 -1
- package/build/commands/mcp/enable.js.map +1 -1
- package/build/commands/mcp/index.d.ts.map +1 -1
- package/build/commands/mcp/index.js +42 -35
- package/build/commands/mcp/index.js.map +1 -1
- package/build/commands/mcp/list.d.ts +2 -2
- package/build/commands/mcp/list.d.ts.map +1 -1
- package/build/commands/mcp/list.js.map +1 -1
- package/build/commands/mcp/remove.d.ts +2 -2
- package/build/commands/mcp/remove.d.ts.map +1 -1
- package/build/commands/mcp/status.d.ts +2 -2
- package/build/commands/mcp/status.d.ts.map +1 -1
- package/build/commands/mcp/status.js.map +1 -1
- package/build/commands/mcp/tokens.d.ts +13 -0
- package/build/commands/mcp/tokens.d.ts.map +1 -0
- package/build/commands/mcp/tokens.js +273 -0
- package/build/commands/mcp/tokens.js.map +1 -0
- package/build/commands/mcp/update.d.ts +2 -2
- package/build/commands/mcp/update.d.ts.map +1 -1
- package/build/commands/mcp/utils/connectionHelper.d.ts +29 -0
- package/build/commands/mcp/utils/connectionHelper.d.ts.map +1 -0
- package/build/commands/mcp/utils/connectionHelper.js +162 -0
- package/build/commands/mcp/utils/connectionHelper.js.map +1 -0
- package/build/commands/preset/create.d.ts +16 -0
- package/build/commands/preset/create.d.ts.map +1 -0
- package/build/commands/preset/create.js +96 -0
- package/build/commands/preset/create.js.map +1 -0
- package/build/commands/preset/delete.d.ts +14 -0
- package/build/commands/preset/delete.d.ts.map +1 -0
- package/build/commands/preset/delete.js +36 -0
- package/build/commands/preset/delete.js.map +1 -0
- package/build/commands/preset/edit.d.ts +15 -0
- package/build/commands/preset/edit.d.ts.map +1 -0
- package/build/commands/preset/edit.js +54 -0
- package/build/commands/preset/edit.js.map +1 -0
- package/build/commands/preset/index.d.ts +6 -0
- package/build/commands/preset/index.d.ts.map +1 -0
- package/build/commands/preset/index.js +192 -0
- package/build/commands/preset/index.js.map +1 -0
- package/build/commands/preset/interactive.d.ts +13 -0
- package/build/commands/preset/interactive.d.ts.map +1 -0
- package/build/commands/preset/interactive.js +131 -0
- package/build/commands/preset/interactive.js.map +1 -0
- package/build/commands/preset/list.d.ts +12 -0
- package/build/commands/preset/list.d.ts.map +1 -0
- package/build/commands/preset/list.js +122 -0
- package/build/commands/preset/list.js.map +1 -0
- package/build/commands/preset/show.d.ts +13 -0
- package/build/commands/preset/show.d.ts.map +1 -0
- package/build/commands/preset/show.js +104 -0
- package/build/commands/preset/show.js.map +1 -0
- package/build/commands/preset/test.d.ts +14 -0
- package/build/commands/preset/test.d.ts.map +1 -0
- package/build/commands/preset/test.js +36 -0
- package/build/commands/preset/test.js.map +1 -0
- package/build/commands/preset/url.d.ts +14 -0
- package/build/commands/preset/url.d.ts.map +1 -0
- package/build/commands/preset/url.js +37 -0
- package/build/commands/preset/url.js.map +1 -0
- package/build/constants.d.ts +6 -1
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +13 -5
- package/build/constants.js.map +1 -1
- package/build/core/server/agentConfig.d.ts +6 -0
- package/build/core/server/agentConfig.d.ts.map +1 -1
- package/build/core/server/agentConfig.js +9 -1
- package/build/core/server/agentConfig.js.map +1 -1
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +38 -0
- package/build/core/server/serverManager.js.map +1 -1
- package/build/core/types/server.d.ts +4 -1
- package/build/core/types/server.d.ts.map +1 -1
- package/build/core/types/server.js.map +1 -1
- package/build/globalOptions.d.ts +46 -0
- package/build/globalOptions.d.ts.map +1 -0
- package/build/globalOptions.js +37 -0
- package/build/globalOptions.js.map +1 -0
- package/build/handlers/requestHandlers.d.ts.map +1 -1
- package/build/handlers/requestHandlers.js +23 -1
- package/build/handlers/requestHandlers.js.map +1 -1
- package/build/index.js +92 -47
- package/build/index.js.map +1 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +26 -0
- package/build/server.js.map +1 -1
- package/build/services/tokenEstimationService.d.ts +95 -0
- package/build/services/tokenEstimationService.d.ts.map +1 -0
- package/build/services/tokenEstimationService.js +233 -0
- package/build/services/tokenEstimationService.js.map +1 -0
- package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts +10 -1
- package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts.map +1 -1
- package/build/transport/http/middlewares/scopeAuthMiddleware.js +12 -0
- package/build/transport/http/middlewares/scopeAuthMiddleware.js.map +1 -1
- package/build/transport/http/middlewares/tagsExtractor.d.ts +7 -3
- package/build/transport/http/middlewares/tagsExtractor.d.ts.map +1 -1
- package/build/transport/http/middlewares/tagsExtractor.js +128 -6
- package/build/transport/http/middlewares/tagsExtractor.js.map +1 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +5 -1
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +5 -1
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/utils/interactiveSelector.d.ts +88 -0
- package/build/utils/interactiveSelector.d.ts.map +1 -0
- package/build/utils/interactiveSelector.js +616 -0
- package/build/utils/interactiveSelector.js.map +1 -0
- package/build/utils/presetErrorHandler.d.ts +62 -0
- package/build/utils/presetErrorHandler.d.ts.map +1 -0
- package/build/utils/presetErrorHandler.js +159 -0
- package/build/utils/presetErrorHandler.js.map +1 -0
- package/build/utils/presetManager.d.ts +114 -0
- package/build/utils/presetManager.d.ts.map +1 -0
- package/build/utils/presetManager.js +565 -0
- package/build/utils/presetManager.js.map +1 -0
- package/build/utils/presetNotificationService.d.ts +62 -0
- package/build/utils/presetNotificationService.d.ts.map +1 -0
- package/build/utils/presetNotificationService.js +214 -0
- package/build/utils/presetNotificationService.js.map +1 -0
- package/build/utils/presetServerChangeDetector.d.ts +50 -0
- package/build/utils/presetServerChangeDetector.d.ts.map +1 -0
- package/build/utils/presetServerChangeDetector.js +100 -0
- package/build/utils/presetServerChangeDetector.js.map +1 -0
- package/build/utils/presetTypes.d.ts +52 -0
- package/build/utils/presetTypes.d.ts.map +1 -0
- package/build/utils/presetTypes.js +5 -0
- package/build/utils/presetTypes.js.map +1 -0
- package/build/utils/tagQueryEvaluator.d.ts +68 -0
- package/build/utils/tagQueryEvaluator.d.ts.map +1 -0
- package/build/utils/tagQueryEvaluator.js +292 -0
- package/build/utils/tagQueryEvaluator.js.map +1 -0
- package/build/utils/tagQueryParser.d.ts +11 -0
- package/build/utils/tagQueryParser.d.ts.map +1 -1
- package/build/utils/tagQueryParser.js +46 -0
- package/build/utils/tagQueryParser.js.map +1 -1
- package/build/utils/urlGenerator.d.ts +68 -0
- package/build/utils/urlGenerator.d.ts.map +1 -0
- package/build/utils/urlGenerator.js +208 -0
- package/build/utils/urlGenerator.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { watch } from 'fs';
|
|
4
|
+
import { getConfigDir } from '../constants.js';
|
|
5
|
+
import { TagQueryParser } from './tagQueryParser.js';
|
|
6
|
+
import { TagQueryEvaluator } from './tagQueryEvaluator.js';
|
|
7
|
+
import { McpConfigManager } from '../config/mcpConfigManager.js';
|
|
8
|
+
import { PresetServerChangeDetector } from './presetServerChangeDetector.js';
|
|
9
|
+
import { PresetErrorHandler } from './presetErrorHandler.js';
|
|
10
|
+
import logger from '../logger/logger.js';
|
|
11
|
+
/**
|
|
12
|
+
* PresetManager handles dynamic preset storage, validation, and hot-reloading.
|
|
13
|
+
* Integrates with client notification system for real-time updates.
|
|
14
|
+
*/
|
|
15
|
+
export class PresetManager {
|
|
16
|
+
static instance = null;
|
|
17
|
+
presets = new Map();
|
|
18
|
+
configPath;
|
|
19
|
+
watcher = null;
|
|
20
|
+
reloadTimeout = null;
|
|
21
|
+
DEBOUNCE_DELAY = 500; // 500ms debounce delay
|
|
22
|
+
notificationCallbacks = new Set();
|
|
23
|
+
configDirOption;
|
|
24
|
+
changeDetector = new PresetServerChangeDetector();
|
|
25
|
+
constructor(configDirOption) {
|
|
26
|
+
// Store presets in config directory based on CLI option, environment, or default
|
|
27
|
+
this.configDirOption = configDirOption;
|
|
28
|
+
const configDir = getConfigDir(configDirOption);
|
|
29
|
+
this.configPath = join(configDir, 'presets.json');
|
|
30
|
+
}
|
|
31
|
+
static getInstance(configDirOption) {
|
|
32
|
+
if (!PresetManager.instance) {
|
|
33
|
+
PresetManager.instance = new PresetManager(configDirOption);
|
|
34
|
+
}
|
|
35
|
+
return PresetManager.instance;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Reset the singleton instance. Primarily for testing.
|
|
39
|
+
*/
|
|
40
|
+
static resetInstance() {
|
|
41
|
+
if (PresetManager.instance) {
|
|
42
|
+
PresetManager.instance.cleanup().catch((error) => {
|
|
43
|
+
console.warn('Failed to cleanup PresetManager during reset:', error);
|
|
44
|
+
});
|
|
45
|
+
PresetManager.instance = null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initialize preset manager and start file watching
|
|
50
|
+
*/
|
|
51
|
+
async initialize() {
|
|
52
|
+
try {
|
|
53
|
+
await this.loadPresets();
|
|
54
|
+
await this.startWatching();
|
|
55
|
+
logger.info('PresetManager initialized successfully', {
|
|
56
|
+
presetsLoaded: this.presets.size,
|
|
57
|
+
configPath: this.configPath,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
logger.error('Failed to initialize PresetManager', { error });
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Register callback for preset change notifications
|
|
67
|
+
*/
|
|
68
|
+
onPresetChange(callback) {
|
|
69
|
+
this.notificationCallbacks.add(callback);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Remove notification callback
|
|
73
|
+
*/
|
|
74
|
+
offPresetChange(callback) {
|
|
75
|
+
this.notificationCallbacks.delete(callback);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Load presets from storage file
|
|
79
|
+
*/
|
|
80
|
+
async loadPresets(skipChangeDetectorInit = false) {
|
|
81
|
+
try {
|
|
82
|
+
await this.ensureConfigDirectory();
|
|
83
|
+
try {
|
|
84
|
+
const data = await fs.readFile(this.configPath, 'utf-8');
|
|
85
|
+
const storage = JSON.parse(data);
|
|
86
|
+
// Clear existing presets
|
|
87
|
+
this.presets.clear();
|
|
88
|
+
// Load presets into memory
|
|
89
|
+
for (const [name, config] of Object.entries(storage.presets || {})) {
|
|
90
|
+
this.presets.set(name, config);
|
|
91
|
+
}
|
|
92
|
+
logger.debug('Presets loaded from file', {
|
|
93
|
+
presetCount: this.presets.size,
|
|
94
|
+
presetNames: Array.from(this.presets.keys()),
|
|
95
|
+
});
|
|
96
|
+
// Initialize change detector with current server lists
|
|
97
|
+
if (!skipChangeDetectorInit) {
|
|
98
|
+
await this.initializeChangeDetector();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error.code === 'ENOENT') {
|
|
103
|
+
// File doesn't exist, start with empty presets
|
|
104
|
+
logger.info('No preset file found, starting with empty presets');
|
|
105
|
+
await this.savePresets();
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
logger.error('Failed to load presets', { error });
|
|
114
|
+
PresetErrorHandler.throwError(`Failed to load presets: ${error instanceof Error ? error.message : 'Unknown error'}`, { context: 'preset loading', exitCode: 2 });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Reload presets and notify clients of any server list changes
|
|
119
|
+
*/
|
|
120
|
+
async reloadAndNotifyChanges() {
|
|
121
|
+
// Store current server lists before reloading
|
|
122
|
+
const previousServerLists = new Map();
|
|
123
|
+
for (const presetName of this.presets.keys()) {
|
|
124
|
+
try {
|
|
125
|
+
const testResult = await this.testPreset(presetName);
|
|
126
|
+
previousServerLists.set(presetName, testResult.servers);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
logger.warn('Failed to get server list before reload', { presetName, error });
|
|
130
|
+
previousServerLists.set(presetName, []);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Reload presets from file (skip change detector initialization)
|
|
134
|
+
await this.loadPresets(true);
|
|
135
|
+
// Check for changes and notify affected presets
|
|
136
|
+
const changedPresets = [];
|
|
137
|
+
for (const presetName of this.presets.keys()) {
|
|
138
|
+
try {
|
|
139
|
+
const newTestResult = await this.testPreset(presetName);
|
|
140
|
+
const previousServers = previousServerLists.get(presetName) || [];
|
|
141
|
+
// Manually check for changes by comparing server lists
|
|
142
|
+
const previousSet = new Set(previousServers);
|
|
143
|
+
const currentSet = new Set(newTestResult.servers);
|
|
144
|
+
const hasChanged = previousServers.length !== newTestResult.servers.length ||
|
|
145
|
+
!newTestResult.servers.every((server) => previousSet.has(server));
|
|
146
|
+
if (hasChanged) {
|
|
147
|
+
const added = newTestResult.servers.filter((s) => !previousSet.has(s));
|
|
148
|
+
const removed = previousServers.filter((s) => !currentSet.has(s));
|
|
149
|
+
logger.info('Detected server list changes for preset', {
|
|
150
|
+
presetName,
|
|
151
|
+
added,
|
|
152
|
+
removed,
|
|
153
|
+
previousCount: previousServers.length,
|
|
154
|
+
currentCount: newTestResult.servers.length,
|
|
155
|
+
});
|
|
156
|
+
changedPresets.push(presetName);
|
|
157
|
+
}
|
|
158
|
+
// Update the detector with the new server list
|
|
159
|
+
try {
|
|
160
|
+
this.changeDetector.updateServerList(presetName, newTestResult.servers);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
logger.error('Failed to update change detector for preset', {
|
|
164
|
+
presetName,
|
|
165
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
logger.error('Failed to check for preset changes', {
|
|
171
|
+
presetName,
|
|
172
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Handle deleted presets
|
|
177
|
+
const currentPresetNames = new Set(this.presets.keys());
|
|
178
|
+
const trackedPresetNames = this.changeDetector.getTrackedPresets();
|
|
179
|
+
for (const trackedPresetName of trackedPresetNames) {
|
|
180
|
+
if (!currentPresetNames.has(trackedPresetName)) {
|
|
181
|
+
logger.info('Preset was deleted, cleaning up tracking', { presetName: trackedPresetName });
|
|
182
|
+
this.changeDetector.removePreset(trackedPresetName);
|
|
183
|
+
// Note: We don't need to notify for deleted presets as clients will get errors
|
|
184
|
+
// when trying to use them and will handle gracefully
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Notify clients for presets with server list changes
|
|
188
|
+
if (changedPresets.length > 0) {
|
|
189
|
+
logger.info('Notifying clients of preset changes', {
|
|
190
|
+
changedPresets,
|
|
191
|
+
totalChangedPresets: changedPresets.length,
|
|
192
|
+
});
|
|
193
|
+
for (const presetName of changedPresets) {
|
|
194
|
+
await this.notifyPresetChange(presetName);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
logger.debug('No preset server list changes detected, skipping notifications');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Initialize change detector with current preset server lists
|
|
203
|
+
*/
|
|
204
|
+
async initializeChangeDetector() {
|
|
205
|
+
for (const presetName of this.presets.keys()) {
|
|
206
|
+
try {
|
|
207
|
+
const testResult = await this.testPreset(presetName);
|
|
208
|
+
this.changeDetector.updateServerList(presetName, testResult.servers);
|
|
209
|
+
logger.debug('Initialized change detector for preset', {
|
|
210
|
+
presetName,
|
|
211
|
+
serverCount: testResult.servers.length,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
logger.warn('Failed to initialize change detector for preset', {
|
|
216
|
+
presetName,
|
|
217
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
218
|
+
});
|
|
219
|
+
this.changeDetector.updateServerList(presetName, []);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Save presets to storage file
|
|
225
|
+
*/
|
|
226
|
+
async savePresets() {
|
|
227
|
+
try {
|
|
228
|
+
await this.ensureConfigDirectory();
|
|
229
|
+
const storage = {
|
|
230
|
+
version: '1.0.0',
|
|
231
|
+
presets: Object.fromEntries(this.presets),
|
|
232
|
+
};
|
|
233
|
+
await fs.writeFile(this.configPath, JSON.stringify(storage, null, 2), 'utf-8');
|
|
234
|
+
logger.debug('Presets saved to file', {
|
|
235
|
+
presetCount: this.presets.size,
|
|
236
|
+
configPath: this.configPath,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
logger.error('Failed to save presets', { error });
|
|
241
|
+
PresetErrorHandler.throwError(`Failed to save presets: ${error instanceof Error ? error.message : 'Unknown error'}`, { context: 'preset saving', exitCode: 3 });
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Ensure config directory exists
|
|
246
|
+
*/
|
|
247
|
+
async ensureConfigDirectory() {
|
|
248
|
+
const configDir = getConfigDir(this.configDirOption);
|
|
249
|
+
try {
|
|
250
|
+
await fs.mkdir(configDir, { recursive: true });
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
if (error.code !== 'EEXIST') {
|
|
254
|
+
throw error;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Start watching preset file for changes
|
|
260
|
+
*/
|
|
261
|
+
async startWatching() {
|
|
262
|
+
if (this.watcher) {
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
try {
|
|
266
|
+
this.watcher = watch(this.configPath, { persistent: false }, async (eventType) => {
|
|
267
|
+
if (eventType === 'change') {
|
|
268
|
+
logger.debug('Preset file changed, scheduling reload...');
|
|
269
|
+
// Clear any existing debounce timeout
|
|
270
|
+
if (this.reloadTimeout) {
|
|
271
|
+
clearTimeout(this.reloadTimeout);
|
|
272
|
+
}
|
|
273
|
+
// Schedule debounced reload
|
|
274
|
+
this.reloadTimeout = setTimeout(async () => {
|
|
275
|
+
try {
|
|
276
|
+
await this.reloadAndNotifyChanges();
|
|
277
|
+
logger.info('Presets reloaded successfully');
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
logger.error('Failed to reload presets', { error });
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
this.reloadTimeout = null;
|
|
284
|
+
}
|
|
285
|
+
}, this.DEBOUNCE_DELAY);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
logger.debug('Started watching preset file', { path: this.configPath, debounceDelay: this.DEBOUNCE_DELAY });
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
logger.warn('Failed to start preset file watching', { error });
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Stop watching preset file
|
|
296
|
+
*/
|
|
297
|
+
async cleanup() {
|
|
298
|
+
logger.debug('Starting PresetManager cleanup');
|
|
299
|
+
try {
|
|
300
|
+
// Clear any pending debounce timeout
|
|
301
|
+
if (this.reloadTimeout) {
|
|
302
|
+
clearTimeout(this.reloadTimeout);
|
|
303
|
+
this.reloadTimeout = null;
|
|
304
|
+
logger.debug('Cleared pending reload timeout');
|
|
305
|
+
}
|
|
306
|
+
// Stop file watching
|
|
307
|
+
if (this.watcher) {
|
|
308
|
+
this.watcher.close();
|
|
309
|
+
this.watcher = null;
|
|
310
|
+
logger.debug('Stopped watching preset file');
|
|
311
|
+
}
|
|
312
|
+
// Clear all notification callbacks to prevent memory leaks
|
|
313
|
+
if (this.notificationCallbacks.size > 0) {
|
|
314
|
+
const callbackCount = this.notificationCallbacks.size;
|
|
315
|
+
this.notificationCallbacks.clear();
|
|
316
|
+
logger.debug('Cleared notification callbacks', { count: callbackCount });
|
|
317
|
+
}
|
|
318
|
+
// Clean up change detector
|
|
319
|
+
if (this.changeDetector) {
|
|
320
|
+
// Check if change detector has cleanup method
|
|
321
|
+
if (typeof this.changeDetector.clear === 'function') {
|
|
322
|
+
this.changeDetector.clear();
|
|
323
|
+
logger.debug('Cleared change detector');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Clear presets from memory
|
|
327
|
+
if (this.presets.size > 0) {
|
|
328
|
+
const presetCount = this.presets.size;
|
|
329
|
+
this.presets.clear();
|
|
330
|
+
logger.debug('Cleared presets from memory', { count: presetCount });
|
|
331
|
+
}
|
|
332
|
+
logger.debug('PresetManager cleanup completed successfully');
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
logger.error('Error during PresetManager cleanup', { error });
|
|
336
|
+
// Don't throw during cleanup to prevent cascading failures
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Create or update a preset
|
|
341
|
+
*/
|
|
342
|
+
async savePreset(name, config) {
|
|
343
|
+
const validation = await this.validatePreset(name, config);
|
|
344
|
+
if (!validation.isValid) {
|
|
345
|
+
throw new Error(`Invalid preset: ${validation.errors.join('; ')}`);
|
|
346
|
+
}
|
|
347
|
+
const now = new Date().toISOString();
|
|
348
|
+
const existingPreset = this.presets.get(name);
|
|
349
|
+
const presetConfig = {
|
|
350
|
+
...config,
|
|
351
|
+
name,
|
|
352
|
+
created: existingPreset?.created || now,
|
|
353
|
+
lastModified: now,
|
|
354
|
+
};
|
|
355
|
+
this.presets.set(name, presetConfig);
|
|
356
|
+
await this.savePresets();
|
|
357
|
+
// Notify clients of preset change
|
|
358
|
+
await this.notifyPresetChange(name);
|
|
359
|
+
logger.info('Preset saved successfully', {
|
|
360
|
+
name,
|
|
361
|
+
strategy: config.strategy,
|
|
362
|
+
tagQuery: config.tagQuery,
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get a preset by name
|
|
367
|
+
*/
|
|
368
|
+
getPreset(name) {
|
|
369
|
+
return this.presets.get(name) || null;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Get all presets as list items
|
|
373
|
+
*/
|
|
374
|
+
getPresetList() {
|
|
375
|
+
return Array.from(this.presets.values()).map((preset) => ({
|
|
376
|
+
name: preset.name,
|
|
377
|
+
description: preset.description,
|
|
378
|
+
strategy: preset.strategy,
|
|
379
|
+
lastUsed: preset.lastUsed,
|
|
380
|
+
tagQuery: preset.tagQuery,
|
|
381
|
+
}));
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Delete a preset
|
|
385
|
+
*/
|
|
386
|
+
async deletePreset(name) {
|
|
387
|
+
if (!this.presets.has(name)) {
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
this.presets.delete(name);
|
|
391
|
+
await this.savePresets();
|
|
392
|
+
logger.info('Preset deleted successfully', { name });
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Update preset usage timestamp
|
|
397
|
+
*/
|
|
398
|
+
async markPresetUsed(name) {
|
|
399
|
+
const preset = this.presets.get(name);
|
|
400
|
+
if (!preset) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
preset.lastUsed = new Date().toISOString();
|
|
404
|
+
await this.savePresets();
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Validate a preset configuration
|
|
408
|
+
*/
|
|
409
|
+
async validatePreset(name, config) {
|
|
410
|
+
const errors = [];
|
|
411
|
+
const warnings = [];
|
|
412
|
+
// Validate name
|
|
413
|
+
if (!name || typeof name !== 'string') {
|
|
414
|
+
errors.push('Preset name is required and must be a string');
|
|
415
|
+
}
|
|
416
|
+
else if (name.length > 50) {
|
|
417
|
+
errors.push('Preset name must be 50 characters or less');
|
|
418
|
+
}
|
|
419
|
+
else if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
|
|
420
|
+
errors.push('Preset name can only contain letters, numbers, hyphens, and underscores');
|
|
421
|
+
}
|
|
422
|
+
// Validate strategy
|
|
423
|
+
if (!config.strategy || !['or', 'and', 'advanced'].includes(config.strategy)) {
|
|
424
|
+
errors.push('Strategy must be one of: or, and, advanced');
|
|
425
|
+
}
|
|
426
|
+
// Validate tag query
|
|
427
|
+
if (!config.tagQuery || typeof config.tagQuery !== 'object') {
|
|
428
|
+
errors.push('Tag query is required and must be an object');
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
try {
|
|
432
|
+
// Validate JSON query structure
|
|
433
|
+
const validation = TagQueryEvaluator.validateQuery(config.tagQuery);
|
|
434
|
+
if (!validation.isValid) {
|
|
435
|
+
errors.push(...validation.errors.map((err) => `Tag query: ${err}`));
|
|
436
|
+
}
|
|
437
|
+
// Check if query has any meaningful content
|
|
438
|
+
const queryString = TagQueryEvaluator.queryToString(config.tagQuery);
|
|
439
|
+
if (!queryString.trim()) {
|
|
440
|
+
warnings.push('Tag query produces no meaningful filter');
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
errors.push(`Invalid tag query: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
return {
|
|
448
|
+
isValid: errors.length === 0,
|
|
449
|
+
errors,
|
|
450
|
+
warnings,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Resolve preset to tag expression for filtering
|
|
455
|
+
*/
|
|
456
|
+
resolvePresetToExpression(name) {
|
|
457
|
+
const preset = this.presets.get(name);
|
|
458
|
+
if (!preset) {
|
|
459
|
+
logger.warn('Attempted to resolve non-existent preset', { name });
|
|
460
|
+
return null;
|
|
461
|
+
}
|
|
462
|
+
try {
|
|
463
|
+
// Mark preset as used
|
|
464
|
+
this.markPresetUsed(name).catch((error) => {
|
|
465
|
+
logger.warn('Failed to update preset usage', { name, error });
|
|
466
|
+
});
|
|
467
|
+
// Convert JSON query to string representation for backward compatibility
|
|
468
|
+
const expression = TagQueryEvaluator.queryToString(preset.tagQuery);
|
|
469
|
+
if (!expression || expression.trim() === '') {
|
|
470
|
+
logger.warn('Preset resolved to empty expression', { name, tagQuery: preset.tagQuery });
|
|
471
|
+
return null;
|
|
472
|
+
}
|
|
473
|
+
return expression;
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
logger.error('Failed to resolve preset to expression', {
|
|
477
|
+
name,
|
|
478
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
479
|
+
tagQuery: preset.tagQuery,
|
|
480
|
+
});
|
|
481
|
+
return null;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Test a preset against current server configuration
|
|
486
|
+
*/
|
|
487
|
+
async testPreset(name) {
|
|
488
|
+
const preset = this.presets.get(name);
|
|
489
|
+
if (!preset) {
|
|
490
|
+
throw new Error(`Preset '${name}' not found`);
|
|
491
|
+
}
|
|
492
|
+
const mcpConfig = McpConfigManager.getInstance();
|
|
493
|
+
const availableServers = mcpConfig.getTransportConfig();
|
|
494
|
+
// Find matching servers based on tag expression
|
|
495
|
+
const matchingServers = [];
|
|
496
|
+
const allTags = new Set();
|
|
497
|
+
for (const [serverName, serverConfig] of Object.entries(availableServers)) {
|
|
498
|
+
const serverTags = serverConfig.tags || [];
|
|
499
|
+
// Add server tags to collection
|
|
500
|
+
serverTags.forEach((tag) => allTags.add(tag));
|
|
501
|
+
// Test if server matches preset expression
|
|
502
|
+
let matches = false;
|
|
503
|
+
try {
|
|
504
|
+
// Use unified JSON query evaluator
|
|
505
|
+
// Convert any legacy $advanced expressions to JSON format first
|
|
506
|
+
let jsonQuery = preset.tagQuery;
|
|
507
|
+
if (preset.strategy === 'advanced' && preset.tagQuery.$advanced) {
|
|
508
|
+
// Convert legacy advanced expression to JSON format
|
|
509
|
+
jsonQuery = TagQueryParser.advancedQueryToJSON(preset.tagQuery.$advanced);
|
|
510
|
+
}
|
|
511
|
+
matches = TagQueryEvaluator.evaluate(jsonQuery, serverTags);
|
|
512
|
+
}
|
|
513
|
+
catch (error) {
|
|
514
|
+
logger.warn('Failed to evaluate preset against server', {
|
|
515
|
+
preset: name,
|
|
516
|
+
server: serverName,
|
|
517
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
518
|
+
tagQuery: preset.tagQuery,
|
|
519
|
+
serverTags,
|
|
520
|
+
});
|
|
521
|
+
// Ensure failed evaluation doesn't match any servers
|
|
522
|
+
matches = false;
|
|
523
|
+
}
|
|
524
|
+
if (matches) {
|
|
525
|
+
matchingServers.push(serverName);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
return {
|
|
529
|
+
servers: matchingServers,
|
|
530
|
+
tags: Array.from(allTags).sort(),
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Notify clients of preset changes
|
|
535
|
+
*/
|
|
536
|
+
async notifyPresetChange(presetName) {
|
|
537
|
+
const promises = Array.from(this.notificationCallbacks).map((callback) => callback(presetName).catch((error) => {
|
|
538
|
+
logger.error('Preset change notification failed', { presetName, error });
|
|
539
|
+
}));
|
|
540
|
+
await Promise.all(promises);
|
|
541
|
+
logger.debug('Preset change notifications sent', {
|
|
542
|
+
presetName,
|
|
543
|
+
callbackCount: this.notificationCallbacks.size,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* Check if a preset exists
|
|
548
|
+
*/
|
|
549
|
+
hasPreset(name) {
|
|
550
|
+
return this.presets.has(name);
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* Get preset names
|
|
554
|
+
*/
|
|
555
|
+
getPresetNames() {
|
|
556
|
+
return Array.from(this.presets.keys());
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Get the configuration path
|
|
560
|
+
*/
|
|
561
|
+
getConfigPath() {
|
|
562
|
+
return this.configPath;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
//# sourceMappingURL=presetManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetManager.js","sourceRoot":"","sources":["../../src/utils/presetManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
/**
|
|
3
|
+
* Client connection interface for tracking
|
|
4
|
+
*/
|
|
5
|
+
export interface ClientConnection {
|
|
6
|
+
id: string;
|
|
7
|
+
presetName?: string;
|
|
8
|
+
sendNotification(method: string, params?: any): Promise<void>;
|
|
9
|
+
isConnected(): boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* PresetNotificationService manages client tracking and notifications
|
|
13
|
+
* when presets are modified. Sends listChanged notifications to affected clients.
|
|
14
|
+
*/
|
|
15
|
+
export declare class PresetNotificationService extends EventEmitter {
|
|
16
|
+
private static instance;
|
|
17
|
+
private clientsByPreset;
|
|
18
|
+
private clientsById;
|
|
19
|
+
private constructor();
|
|
20
|
+
static getInstance(): PresetNotificationService;
|
|
21
|
+
/**
|
|
22
|
+
* Track a client connection with its associated preset
|
|
23
|
+
*/
|
|
24
|
+
trackClient(client: ClientConnection, presetName?: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Untrack a client connection
|
|
27
|
+
*/
|
|
28
|
+
untrackClient(clientId: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Update a client's preset association
|
|
31
|
+
*/
|
|
32
|
+
updateClientPreset(clientId: string, newPresetName?: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Send listChanged notifications to all clients using a specific preset
|
|
35
|
+
*/
|
|
36
|
+
notifyPresetChange(presetName: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get statistics about tracked clients
|
|
39
|
+
*/
|
|
40
|
+
getStats(): {
|
|
41
|
+
totalClients: number;
|
|
42
|
+
presetCount: number;
|
|
43
|
+
clientsByPreset: Record<string, number>;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Clean up disconnected clients
|
|
47
|
+
*/
|
|
48
|
+
cleanup(): Promise<number>;
|
|
49
|
+
/**
|
|
50
|
+
* Get clients for a specific preset
|
|
51
|
+
*/
|
|
52
|
+
getClientsForPreset(presetName: string): ClientConnection[];
|
|
53
|
+
/**
|
|
54
|
+
* Check if a preset has any tracked clients
|
|
55
|
+
*/
|
|
56
|
+
hasClientsForPreset(presetName: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Get all tracked preset names
|
|
59
|
+
*/
|
|
60
|
+
getTrackedPresets(): string[];
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=presetNotificationService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetNotificationService.d.ts","sourceRoot":"","sources":["../../src/utils/presetNotificationService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,WAAW,IAAI,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,YAAY;IACzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,eAAe,CAA4C;IACnE,OAAO,CAAC,WAAW,CAAuC;IAE1D,OAAO;WAIO,WAAW,IAAI,yBAAyB;IAOtD;;OAEG;IACI,WAAW,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IA4BvE;;OAEG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IA+B5C;;OAEG;IACI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAwCzE;;OAEG;IACU,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DlE;;OAEG;IACI,QAAQ,IAAI;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzC;IAcD;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAiBvC;;OAEG;IACI,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,EAAE;IAKlE;;OAEG;IACI,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAKvD;;OAEG;IACI,iBAAiB,IAAI,MAAM,EAAE;CAGrC"}
|