@1mcp/agent 0.21.0 → 0.22.1

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 (196) hide show
  1. package/README.md +123 -148
  2. package/build/commands/app/backups.d.ts +13 -1
  3. package/build/commands/app/backups.d.ts.map +1 -1
  4. package/build/commands/app/backups.js +25 -0
  5. package/build/commands/app/backups.js.map +1 -1
  6. package/build/commands/app/consolidate.d.ts +21 -1
  7. package/build/commands/app/consolidate.d.ts.map +1 -1
  8. package/build/commands/app/consolidate.js +63 -0
  9. package/build/commands/app/consolidate.js.map +1 -1
  10. package/build/commands/app/discover.d.ts +11 -1
  11. package/build/commands/app/discover.d.ts.map +1 -1
  12. package/build/commands/app/discover.js +21 -0
  13. package/build/commands/app/discover.js.map +1 -1
  14. package/build/commands/app/index.d.ts.map +1 -1
  15. package/build/commands/app/index.js +15 -193
  16. package/build/commands/app/index.js.map +1 -1
  17. package/build/commands/app/list.d.ts +11 -1
  18. package/build/commands/app/list.d.ts.map +1 -1
  19. package/build/commands/app/list.js +21 -0
  20. package/build/commands/app/list.js.map +1 -1
  21. package/build/commands/app/restore.d.ts +21 -1
  22. package/build/commands/app/restore.d.ts.map +1 -1
  23. package/build/commands/app/restore.js +59 -0
  24. package/build/commands/app/restore.js.map +1 -1
  25. package/build/commands/app/status.d.ts +11 -1
  26. package/build/commands/app/status.d.ts.map +1 -1
  27. package/build/commands/app/status.js +21 -0
  28. package/build/commands/app/status.js.map +1 -1
  29. package/build/commands/mcp/add.d.ts +35 -2
  30. package/build/commands/mcp/add.d.ts.map +1 -1
  31. package/build/commands/mcp/add.js +86 -0
  32. package/build/commands/mcp/add.js.map +1 -1
  33. package/build/commands/mcp/enable.d.ts +15 -2
  34. package/build/commands/mcp/enable.d.ts.map +1 -1
  35. package/build/commands/mcp/enable.js +24 -0
  36. package/build/commands/mcp/enable.js.map +1 -1
  37. package/build/commands/mcp/index.d.ts.map +1 -1
  38. package/build/commands/mcp/index.js +18 -302
  39. package/build/commands/mcp/index.js.map +1 -1
  40. package/build/commands/mcp/list.d.ts +15 -2
  41. package/build/commands/mcp/list.d.ts.map +1 -1
  42. package/build/commands/mcp/list.js +35 -1
  43. package/build/commands/mcp/list.js.map +1 -1
  44. package/build/commands/mcp/remove.d.ts +11 -2
  45. package/build/commands/mcp/remove.d.ts.map +1 -1
  46. package/build/commands/mcp/remove.js +21 -0
  47. package/build/commands/mcp/remove.js.map +1 -1
  48. package/build/commands/mcp/status.d.ts +11 -2
  49. package/build/commands/mcp/status.d.ts.map +1 -1
  50. package/build/commands/mcp/status.js +23 -1
  51. package/build/commands/mcp/status.js.map +1 -1
  52. package/build/commands/mcp/tokens.d.ts +13 -3
  53. package/build/commands/mcp/tokens.d.ts.map +1 -1
  54. package/build/commands/mcp/tokens.js +31 -0
  55. package/build/commands/mcp/tokens.js.map +1 -1
  56. package/build/commands/mcp/update.d.ts +33 -2
  57. package/build/commands/mcp/update.d.ts.map +1 -1
  58. package/build/commands/mcp/update.js +72 -0
  59. package/build/commands/mcp/update.js.map +1 -1
  60. package/build/commands/preset/create.d.ts +26 -0
  61. package/build/commands/preset/create.d.ts.map +1 -0
  62. package/build/commands/preset/create.js +117 -0
  63. package/build/commands/preset/create.js.map +1 -0
  64. package/build/commands/preset/delete.d.ts +20 -0
  65. package/build/commands/preset/delete.d.ts.map +1 -0
  66. package/build/commands/preset/delete.js +46 -0
  67. package/build/commands/preset/delete.js.map +1 -0
  68. package/build/commands/preset/edit.d.ts +23 -0
  69. package/build/commands/preset/edit.d.ts.map +1 -0
  70. package/build/commands/preset/edit.js +68 -0
  71. package/build/commands/preset/edit.js.map +1 -0
  72. package/build/commands/preset/index.d.ts +6 -0
  73. package/build/commands/preset/index.d.ts.map +1 -0
  74. package/build/commands/preset/index.js +141 -0
  75. package/build/commands/preset/index.js.map +1 -0
  76. package/build/commands/preset/interactive.d.ts +12 -0
  77. package/build/commands/preset/interactive.d.ts.map +1 -0
  78. package/build/commands/preset/interactive.js +131 -0
  79. package/build/commands/preset/interactive.js.map +1 -0
  80. package/build/commands/preset/list.d.ts +16 -0
  81. package/build/commands/preset/list.d.ts.map +1 -0
  82. package/build/commands/preset/list.js +128 -0
  83. package/build/commands/preset/list.js.map +1 -0
  84. package/build/commands/preset/show.d.ts +19 -0
  85. package/build/commands/preset/show.d.ts.map +1 -0
  86. package/build/commands/preset/show.js +114 -0
  87. package/build/commands/preset/show.js.map +1 -0
  88. package/build/commands/preset/test.d.ts +20 -0
  89. package/build/commands/preset/test.d.ts.map +1 -0
  90. package/build/commands/preset/test.js +46 -0
  91. package/build/commands/preset/test.js.map +1 -0
  92. package/build/commands/preset/url.d.ts +20 -0
  93. package/build/commands/preset/url.d.ts.map +1 -0
  94. package/build/commands/preset/url.js +47 -0
  95. package/build/commands/preset/url.js.map +1 -0
  96. package/build/commands/serve/index.d.ts +106 -0
  97. package/build/commands/serve/index.d.ts.map +1 -0
  98. package/build/commands/serve/index.js +143 -0
  99. package/build/commands/serve/index.js.map +1 -0
  100. package/build/commands/serve/serve.d.ts +28 -0
  101. package/build/commands/serve/serve.d.ts.map +1 -0
  102. package/build/commands/serve/serve.js +213 -0
  103. package/build/commands/serve/serve.js.map +1 -0
  104. package/build/constants.d.ts +6 -1
  105. package/build/constants.d.ts.map +1 -1
  106. package/build/constants.js +13 -5
  107. package/build/constants.js.map +1 -1
  108. package/build/core/server/agentConfig.d.ts +6 -0
  109. package/build/core/server/agentConfig.d.ts.map +1 -1
  110. package/build/core/server/agentConfig.js +9 -1
  111. package/build/core/server/agentConfig.js.map +1 -1
  112. package/build/core/server/serverManager.d.ts.map +1 -1
  113. package/build/core/server/serverManager.js +41 -0
  114. package/build/core/server/serverManager.js.map +1 -1
  115. package/build/core/types/server.d.ts +4 -1
  116. package/build/core/types/server.d.ts.map +1 -1
  117. package/build/core/types/server.js.map +1 -1
  118. package/build/core/types/transport.d.ts +16 -77
  119. package/build/core/types/transport.d.ts.map +1 -1
  120. package/build/core/types/transport.js +2 -2
  121. package/build/core/types/transport.js.map +1 -1
  122. package/build/globalOptions.d.ts +46 -0
  123. package/build/globalOptions.d.ts.map +1 -0
  124. package/build/globalOptions.js +37 -0
  125. package/build/globalOptions.js.map +1 -0
  126. package/build/handlers/requestHandlers.d.ts.map +1 -1
  127. package/build/handlers/requestHandlers.js +23 -1
  128. package/build/handlers/requestHandlers.js.map +1 -1
  129. package/build/index.js +58 -347
  130. package/build/index.js.map +1 -1
  131. package/build/logger/logger.d.ts.map +1 -1
  132. package/build/logger/logger.js +4 -2
  133. package/build/logger/logger.js.map +1 -1
  134. package/build/logger/mcpLoggingEnhancer.d.ts.map +1 -1
  135. package/build/logger/mcpLoggingEnhancer.js +10 -6
  136. package/build/logger/mcpLoggingEnhancer.js.map +1 -1
  137. package/build/server.d.ts.map +1 -1
  138. package/build/server.js +26 -0
  139. package/build/server.js.map +1 -1
  140. package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts +10 -1
  141. package/build/transport/http/middlewares/scopeAuthMiddleware.d.ts.map +1 -1
  142. package/build/transport/http/middlewares/scopeAuthMiddleware.js +12 -0
  143. package/build/transport/http/middlewares/scopeAuthMiddleware.js.map +1 -1
  144. package/build/transport/http/middlewares/tagsExtractor.d.ts +7 -3
  145. package/build/transport/http/middlewares/tagsExtractor.d.ts.map +1 -1
  146. package/build/transport/http/middlewares/tagsExtractor.js +128 -6
  147. package/build/transport/http/middlewares/tagsExtractor.js.map +1 -1
  148. package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
  149. package/build/transport/http/routes/sseRoutes.js +5 -1
  150. package/build/transport/http/routes/sseRoutes.js.map +1 -1
  151. package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
  152. package/build/transport/http/routes/streamableHttpRoutes.js +5 -1
  153. package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
  154. package/build/transport/transportFactory.js +1 -1
  155. package/build/transport/transportFactory.js.map +1 -1
  156. package/build/utils/configureGlobalLogger.d.ts +12 -0
  157. package/build/utils/configureGlobalLogger.d.ts.map +1 -0
  158. package/build/utils/configureGlobalLogger.js +18 -0
  159. package/build/utils/configureGlobalLogger.js.map +1 -0
  160. package/build/utils/interactiveSelector.d.ts +88 -0
  161. package/build/utils/interactiveSelector.d.ts.map +1 -0
  162. package/build/utils/interactiveSelector.js +616 -0
  163. package/build/utils/interactiveSelector.js.map +1 -0
  164. package/build/utils/presetErrorHandler.d.ts +62 -0
  165. package/build/utils/presetErrorHandler.d.ts.map +1 -0
  166. package/build/utils/presetErrorHandler.js +159 -0
  167. package/build/utils/presetErrorHandler.js.map +1 -0
  168. package/build/utils/presetManager.d.ts +114 -0
  169. package/build/utils/presetManager.d.ts.map +1 -0
  170. package/build/utils/presetManager.js +565 -0
  171. package/build/utils/presetManager.js.map +1 -0
  172. package/build/utils/presetNotificationService.d.ts +62 -0
  173. package/build/utils/presetNotificationService.d.ts.map +1 -0
  174. package/build/utils/presetNotificationService.js +214 -0
  175. package/build/utils/presetNotificationService.js.map +1 -0
  176. package/build/utils/presetServerChangeDetector.d.ts +50 -0
  177. package/build/utils/presetServerChangeDetector.d.ts.map +1 -0
  178. package/build/utils/presetServerChangeDetector.js +100 -0
  179. package/build/utils/presetServerChangeDetector.js.map +1 -0
  180. package/build/utils/presetTypes.d.ts +52 -0
  181. package/build/utils/presetTypes.d.ts.map +1 -0
  182. package/build/utils/presetTypes.js +5 -0
  183. package/build/utils/presetTypes.js.map +1 -0
  184. package/build/utils/tagQueryEvaluator.d.ts +68 -0
  185. package/build/utils/tagQueryEvaluator.d.ts.map +1 -0
  186. package/build/utils/tagQueryEvaluator.js +292 -0
  187. package/build/utils/tagQueryEvaluator.js.map +1 -0
  188. package/build/utils/tagQueryParser.d.ts +11 -0
  189. package/build/utils/tagQueryParser.d.ts.map +1 -1
  190. package/build/utils/tagQueryParser.js +46 -0
  191. package/build/utils/tagQueryParser.js.map +1 -1
  192. package/build/utils/urlGenerator.d.ts +68 -0
  193. package/build/utils/urlGenerator.d.ts.map +1 -0
  194. package/build/utils/urlGenerator.js +208 -0
  195. package/build/utils/urlGenerator.js.map +1 -0
  196. package/package.json +21 -17
@@ -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"}