@1mcp/agent 0.21.0 → 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 +1 -0
- 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 +2 -40
- 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 +2 -2
- package/build/commands/mcp/tokens.d.ts.map +1 -1
- package/build/commands/mcp/tokens.js.map +1 -1
- package/build/commands/mcp/update.d.ts +2 -2
- package/build/commands/mcp/update.d.ts.map +1 -1
- 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/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 +6 -1
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
import logger from '../logger/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* PresetNotificationService manages client tracking and notifications
|
|
5
|
+
* when presets are modified. Sends listChanged notifications to affected clients.
|
|
6
|
+
*/
|
|
7
|
+
export class PresetNotificationService extends EventEmitter {
|
|
8
|
+
static instance;
|
|
9
|
+
clientsByPreset = new Map();
|
|
10
|
+
clientsById = new Map();
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
}
|
|
14
|
+
static getInstance() {
|
|
15
|
+
if (!PresetNotificationService.instance) {
|
|
16
|
+
PresetNotificationService.instance = new PresetNotificationService();
|
|
17
|
+
}
|
|
18
|
+
return PresetNotificationService.instance;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Track a client connection with its associated preset
|
|
22
|
+
*/
|
|
23
|
+
trackClient(client, presetName) {
|
|
24
|
+
// Store client by ID for quick lookup
|
|
25
|
+
this.clientsById.set(client.id, client);
|
|
26
|
+
if (presetName) {
|
|
27
|
+
// Track client by preset
|
|
28
|
+
if (!this.clientsByPreset.has(presetName)) {
|
|
29
|
+
this.clientsByPreset.set(presetName, new Set());
|
|
30
|
+
}
|
|
31
|
+
const clientSet = this.clientsByPreset.get(presetName);
|
|
32
|
+
clientSet.add(client);
|
|
33
|
+
// Update client's preset association
|
|
34
|
+
client.presetName = presetName;
|
|
35
|
+
logger.debug('Client tracked for preset', {
|
|
36
|
+
clientId: client.id,
|
|
37
|
+
presetName,
|
|
38
|
+
totalClientsForPreset: clientSet.size,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
logger.debug('Client tracked without preset', { clientId: client.id });
|
|
43
|
+
}
|
|
44
|
+
this.emit('client_tracked', { client, presetName });
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Untrack a client connection
|
|
48
|
+
*/
|
|
49
|
+
untrackClient(clientId) {
|
|
50
|
+
const client = this.clientsById.get(clientId);
|
|
51
|
+
if (!client) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Remove from clients by ID
|
|
55
|
+
this.clientsById.delete(clientId);
|
|
56
|
+
// Remove from preset tracking if associated
|
|
57
|
+
if (client.presetName) {
|
|
58
|
+
const clientSet = this.clientsByPreset.get(client.presetName);
|
|
59
|
+
if (clientSet) {
|
|
60
|
+
clientSet.delete(client);
|
|
61
|
+
// Clean up empty preset sets
|
|
62
|
+
if (clientSet.size === 0) {
|
|
63
|
+
this.clientsByPreset.delete(client.presetName);
|
|
64
|
+
}
|
|
65
|
+
logger.debug('Client untracked from preset', {
|
|
66
|
+
clientId,
|
|
67
|
+
presetName: client.presetName,
|
|
68
|
+
remainingClientsForPreset: clientSet.size,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
this.emit('client_untracked', { clientId, presetName: client.presetName });
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Update a client's preset association
|
|
76
|
+
*/
|
|
77
|
+
updateClientPreset(clientId, newPresetName) {
|
|
78
|
+
const client = this.clientsById.get(clientId);
|
|
79
|
+
if (!client) {
|
|
80
|
+
logger.warn('Attempted to update preset for unknown client', { clientId });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const oldPresetName = client.presetName;
|
|
84
|
+
// Remove from old preset tracking
|
|
85
|
+
if (oldPresetName) {
|
|
86
|
+
const oldClientSet = this.clientsByPreset.get(oldPresetName);
|
|
87
|
+
if (oldClientSet) {
|
|
88
|
+
oldClientSet.delete(client);
|
|
89
|
+
if (oldClientSet.size === 0) {
|
|
90
|
+
this.clientsByPreset.delete(oldPresetName);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Add to new preset tracking
|
|
95
|
+
if (newPresetName) {
|
|
96
|
+
if (!this.clientsByPreset.has(newPresetName)) {
|
|
97
|
+
this.clientsByPreset.set(newPresetName, new Set());
|
|
98
|
+
}
|
|
99
|
+
this.clientsByPreset.get(newPresetName).add(client);
|
|
100
|
+
}
|
|
101
|
+
// Update client association
|
|
102
|
+
client.presetName = newPresetName;
|
|
103
|
+
logger.debug('Client preset updated', {
|
|
104
|
+
clientId,
|
|
105
|
+
oldPresetName,
|
|
106
|
+
newPresetName,
|
|
107
|
+
});
|
|
108
|
+
this.emit('client_preset_updated', { clientId, oldPresetName, newPresetName });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Send listChanged notifications to all clients using a specific preset
|
|
112
|
+
*/
|
|
113
|
+
async notifyPresetChange(presetName) {
|
|
114
|
+
const clients = this.clientsByPreset.get(presetName) || new Set();
|
|
115
|
+
if (clients.size === 0) {
|
|
116
|
+
logger.debug('No clients to notify for preset change', { presetName });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
logger.info('Sending preset change notifications', {
|
|
120
|
+
presetName,
|
|
121
|
+
clientCount: clients.size,
|
|
122
|
+
});
|
|
123
|
+
// Send notifications in parallel
|
|
124
|
+
const notifications = Array.from(clients).map(async (client) => {
|
|
125
|
+
if (!client.isConnected()) {
|
|
126
|
+
logger.debug('Skipping disconnected client', {
|
|
127
|
+
clientId: client.id,
|
|
128
|
+
presetName,
|
|
129
|
+
});
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
// Send all three types of listChanged notifications
|
|
134
|
+
await Promise.all([
|
|
135
|
+
client.sendNotification('notifications/tools/listChanged'),
|
|
136
|
+
client.sendNotification('notifications/resources/listChanged'),
|
|
137
|
+
client.sendNotification('notifications/prompts/listChanged'),
|
|
138
|
+
]);
|
|
139
|
+
logger.debug('Preset change notifications sent to client', {
|
|
140
|
+
clientId: client.id,
|
|
141
|
+
presetName,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
logger.error('Failed to send preset change notification to client', {
|
|
146
|
+
clientId: client.id,
|
|
147
|
+
presetName,
|
|
148
|
+
error,
|
|
149
|
+
});
|
|
150
|
+
// If client is no longer reachable, untrack it
|
|
151
|
+
if (error instanceof Error && (error.message.includes('connection') || error.message.includes('closed'))) {
|
|
152
|
+
this.untrackClient(client.id);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
await Promise.allSettled(notifications);
|
|
157
|
+
logger.info('Preset change notifications completed', {
|
|
158
|
+
presetName,
|
|
159
|
+
clientCount: clients.size,
|
|
160
|
+
});
|
|
161
|
+
this.emit('preset_notifications_sent', { presetName, clientCount: clients.size });
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get statistics about tracked clients
|
|
165
|
+
*/
|
|
166
|
+
getStats() {
|
|
167
|
+
const clientsByPreset = {};
|
|
168
|
+
for (const [presetName, clientSet] of this.clientsByPreset) {
|
|
169
|
+
clientsByPreset[presetName] = clientSet.size;
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
totalClients: this.clientsById.size,
|
|
173
|
+
presetCount: this.clientsByPreset.size,
|
|
174
|
+
clientsByPreset,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Clean up disconnected clients
|
|
179
|
+
*/
|
|
180
|
+
async cleanup() {
|
|
181
|
+
let removedCount = 0;
|
|
182
|
+
for (const [clientId, client] of this.clientsById) {
|
|
183
|
+
if (!client.isConnected()) {
|
|
184
|
+
this.untrackClient(clientId);
|
|
185
|
+
removedCount++;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (removedCount > 0) {
|
|
189
|
+
logger.info('Cleaned up disconnected clients', { removedCount });
|
|
190
|
+
}
|
|
191
|
+
return removedCount;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get clients for a specific preset
|
|
195
|
+
*/
|
|
196
|
+
getClientsForPreset(presetName) {
|
|
197
|
+
const clientSet = this.clientsByPreset.get(presetName);
|
|
198
|
+
return clientSet ? Array.from(clientSet) : [];
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Check if a preset has any tracked clients
|
|
202
|
+
*/
|
|
203
|
+
hasClientsForPreset(presetName) {
|
|
204
|
+
const clientSet = this.clientsByPreset.get(presetName);
|
|
205
|
+
return !!(clientSet && clientSet.size > 0);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get all tracked preset names
|
|
209
|
+
*/
|
|
210
|
+
getTrackedPresets() {
|
|
211
|
+
return Array.from(this.clientsByPreset.keys());
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=presetNotificationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetNotificationService.js","sourceRoot":"","sources":["../../src/utils/presetNotificationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility for detecting changes in preset server lists
|
|
3
|
+
* Compares before/after server lists to determine if notifications are needed
|
|
4
|
+
*/
|
|
5
|
+
export interface ServerListChange {
|
|
6
|
+
hasChanged: boolean;
|
|
7
|
+
added: string[];
|
|
8
|
+
removed: string[];
|
|
9
|
+
unchanged: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare class PresetServerChangeDetector {
|
|
12
|
+
private previousServerLists;
|
|
13
|
+
/**
|
|
14
|
+
* Detect changes between previous and current server lists for a preset
|
|
15
|
+
*/
|
|
16
|
+
detectChanges(presetName: string, currentServers: string[]): ServerListChange;
|
|
17
|
+
/**
|
|
18
|
+
* Update the stored server list for a preset
|
|
19
|
+
*/
|
|
20
|
+
updateServerList(presetName: string, servers: string[]): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get the previously stored server list for a preset
|
|
23
|
+
*/
|
|
24
|
+
getPreviousServerList(presetName: string): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Check if we have stored data for a preset
|
|
27
|
+
*/
|
|
28
|
+
hasPreset(presetName: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Remove tracking for a preset (cleanup when preset is deleted)
|
|
31
|
+
*/
|
|
32
|
+
removePreset(presetName: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get all tracked preset names
|
|
35
|
+
*/
|
|
36
|
+
getTrackedPresets(): string[];
|
|
37
|
+
/**
|
|
38
|
+
* Clear all stored server lists (useful for testing)
|
|
39
|
+
*/
|
|
40
|
+
clear(): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get statistics about tracked presets
|
|
43
|
+
*/
|
|
44
|
+
getStats(): {
|
|
45
|
+
totalPresets: number;
|
|
46
|
+
totalUniqueServers: number;
|
|
47
|
+
serverCounts: Record<string, number>;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=presetServerChangeDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetServerChangeDetector.d.ts","sourceRoot":"","sources":["../../src/utils/presetServerChangeDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,0BAA0B;IACrC,OAAO,CAAC,mBAAmB,CAA+B;IAE1D;;OAEG;IACI,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,gBAAgB;IA8CpF;;OAEG;IACI,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAIpE;;OAEG;IACI,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAI1D;;OAEG;IACI,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI7C;;OAEG;IACI,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI7C;;OAEG;IACI,iBAAiB,IAAI,MAAM,EAAE;IAIpC;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,QAAQ,IAAI;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACtC;CAiBF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export class PresetServerChangeDetector {
|
|
2
|
+
previousServerLists = new Map();
|
|
3
|
+
/**
|
|
4
|
+
* Detect changes between previous and current server lists for a preset
|
|
5
|
+
*/
|
|
6
|
+
detectChanges(presetName, currentServers) {
|
|
7
|
+
const previousServers = this.previousServerLists.get(presetName);
|
|
8
|
+
// If no previous data exists, consider it as initialization (no change)
|
|
9
|
+
if (!previousServers) {
|
|
10
|
+
return {
|
|
11
|
+
hasChanged: false,
|
|
12
|
+
added: [],
|
|
13
|
+
removed: [],
|
|
14
|
+
unchanged: [...currentServers].sort(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
const previousSet = new Set(previousServers);
|
|
18
|
+
const currentSet = new Set(currentServers);
|
|
19
|
+
const added = [];
|
|
20
|
+
const removed = [];
|
|
21
|
+
const unchanged = [];
|
|
22
|
+
// Find added servers
|
|
23
|
+
for (const server of currentServers) {
|
|
24
|
+
if (!previousSet.has(server)) {
|
|
25
|
+
added.push(server);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
unchanged.push(server);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Find removed servers
|
|
32
|
+
for (const server of previousServers) {
|
|
33
|
+
if (!currentSet.has(server)) {
|
|
34
|
+
removed.push(server);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const hasChanged = added.length > 0 || removed.length > 0;
|
|
38
|
+
return {
|
|
39
|
+
hasChanged,
|
|
40
|
+
added: added.sort(),
|
|
41
|
+
removed: removed.sort(),
|
|
42
|
+
unchanged: unchanged.sort(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Update the stored server list for a preset
|
|
47
|
+
*/
|
|
48
|
+
updateServerList(presetName, servers) {
|
|
49
|
+
this.previousServerLists.set(presetName, [...servers].sort());
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get the previously stored server list for a preset
|
|
53
|
+
*/
|
|
54
|
+
getPreviousServerList(presetName) {
|
|
55
|
+
return [...(this.previousServerLists.get(presetName) || [])];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if we have stored data for a preset
|
|
59
|
+
*/
|
|
60
|
+
hasPreset(presetName) {
|
|
61
|
+
return this.previousServerLists.has(presetName);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Remove tracking for a preset (cleanup when preset is deleted)
|
|
65
|
+
*/
|
|
66
|
+
removePreset(presetName) {
|
|
67
|
+
this.previousServerLists.delete(presetName);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get all tracked preset names
|
|
71
|
+
*/
|
|
72
|
+
getTrackedPresets() {
|
|
73
|
+
return Array.from(this.previousServerLists.keys()).sort();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Clear all stored server lists (useful for testing)
|
|
77
|
+
*/
|
|
78
|
+
clear() {
|
|
79
|
+
this.previousServerLists.clear();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get statistics about tracked presets
|
|
83
|
+
*/
|
|
84
|
+
getStats() {
|
|
85
|
+
const allServers = new Set();
|
|
86
|
+
const serverCounts = {};
|
|
87
|
+
for (const [presetName, servers] of this.previousServerLists) {
|
|
88
|
+
serverCounts[presetName] = servers.length;
|
|
89
|
+
for (const server of servers) {
|
|
90
|
+
allServers.add(server);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
totalPresets: this.previousServerLists.size,
|
|
95
|
+
totalUniqueServers: allServers.size,
|
|
96
|
+
serverCounts,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=presetServerChangeDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetServerChangeDetector.js","sourceRoot":"","sources":["../../src/utils/presetServerChangeDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the dynamic preset system
|
|
3
|
+
*/
|
|
4
|
+
export type PresetStrategy = 'or' | 'and' | 'advanced';
|
|
5
|
+
/**
|
|
6
|
+
* JSON-based tag query for MongoDB-like queries
|
|
7
|
+
* Examples:
|
|
8
|
+
* - { "tag": "web" } - servers with "web" tag
|
|
9
|
+
* - { "$or": [{ "tag": "web" }, { "tag": "api" }] } - servers with "web" OR "api"
|
|
10
|
+
* - { "$and": [{ "tag": "web" }, { "tag": "secure" }] } - servers with BOTH "web" AND "secure"
|
|
11
|
+
* - { "tag": { "$in": ["web", "api", "database"] } } - servers with any of these tags
|
|
12
|
+
*/
|
|
13
|
+
export interface TagQuery {
|
|
14
|
+
tag?: string;
|
|
15
|
+
$or?: TagQuery[];
|
|
16
|
+
$and?: TagQuery[];
|
|
17
|
+
$not?: TagQuery;
|
|
18
|
+
$in?: string[];
|
|
19
|
+
[key: string]: any;
|
|
20
|
+
}
|
|
21
|
+
export interface PresetConfig {
|
|
22
|
+
name: string;
|
|
23
|
+
description?: string;
|
|
24
|
+
strategy: PresetStrategy;
|
|
25
|
+
tagQuery: TagQuery;
|
|
26
|
+
created: string;
|
|
27
|
+
lastModified: string;
|
|
28
|
+
lastUsed?: string;
|
|
29
|
+
}
|
|
30
|
+
export interface PresetStorage {
|
|
31
|
+
presets: Record<string, PresetConfig>;
|
|
32
|
+
version?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PresetValidationResult {
|
|
35
|
+
isValid: boolean;
|
|
36
|
+
errors: string[];
|
|
37
|
+
warnings: string[];
|
|
38
|
+
}
|
|
39
|
+
export interface PresetUsageStats {
|
|
40
|
+
name: string;
|
|
41
|
+
serverCount: number;
|
|
42
|
+
lastUsed?: string;
|
|
43
|
+
usageFrequency: number;
|
|
44
|
+
}
|
|
45
|
+
export interface PresetListItem {
|
|
46
|
+
name: string;
|
|
47
|
+
description?: string;
|
|
48
|
+
strategy: PresetStrategy;
|
|
49
|
+
lastUsed?: string;
|
|
50
|
+
tagQuery: TagQuery;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=presetTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetTypes.d.ts","sourceRoot":"","sources":["../../src/utils/presetTypes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,cAAc,GAAG,IAAI,GAAG,KAAK,GAAG,UAAU,CAAC;AAEvD;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presetTypes.js","sourceRoot":"","sources":["../../src/utils/presetTypes.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-based tag query evaluator for MongoDB-like queries
|
|
3
|
+
* Supports three-state tag selection: empty, selected, not selected
|
|
4
|
+
*/
|
|
5
|
+
import { TagQuery } from './presetTypes.js';
|
|
6
|
+
/**
|
|
7
|
+
* Three-state tag selection states
|
|
8
|
+
*/
|
|
9
|
+
export type TagState = 'empty' | 'selected' | 'not-selected';
|
|
10
|
+
/**
|
|
11
|
+
* Tag selection entry for three-state system
|
|
12
|
+
*/
|
|
13
|
+
export interface TagSelection {
|
|
14
|
+
tag: string;
|
|
15
|
+
state: TagState;
|
|
16
|
+
servers: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare class TagQueryEvaluator {
|
|
19
|
+
/**
|
|
20
|
+
* Evaluate a JSON tag query against a set of server tags
|
|
21
|
+
*/
|
|
22
|
+
static evaluate(query: TagQuery, serverTags: string[]): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Convert string-based tag expression to JSON query
|
|
25
|
+
* For backward compatibility with existing presets
|
|
26
|
+
*/
|
|
27
|
+
static stringToQuery(tagExpression: string, strategy?: 'or' | 'and' | 'advanced'): TagQuery;
|
|
28
|
+
/**
|
|
29
|
+
* Convert JSON query to human-readable string
|
|
30
|
+
*/
|
|
31
|
+
static queryToString(query: TagQuery): string;
|
|
32
|
+
/**
|
|
33
|
+
* Validate JSON query structure
|
|
34
|
+
*/
|
|
35
|
+
static validateQuery(query: TagQuery): {
|
|
36
|
+
isValid: boolean;
|
|
37
|
+
errors: string[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Build tag-to-servers mapping from MCP configuration
|
|
41
|
+
*/
|
|
42
|
+
static buildTagServerMap(servers: Record<string, any>): Map<string, string[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Convert three-state tag selections to TagQuery
|
|
45
|
+
*/
|
|
46
|
+
static buildQueryFromSelections(selections: TagSelection[], strategy?: 'or' | 'and' | 'advanced'): TagQuery;
|
|
47
|
+
/**
|
|
48
|
+
* Get servers that match the current tag selections
|
|
49
|
+
*/
|
|
50
|
+
static getMatchingServers(selections: TagSelection[], servers: Record<string, any>, strategy?: 'or' | 'and' | 'advanced'): string[];
|
|
51
|
+
/**
|
|
52
|
+
* Format server list for display (e.g., "server1, server2 +3 more")
|
|
53
|
+
*/
|
|
54
|
+
static formatServerList(servers: string[], maxDisplay?: number): string;
|
|
55
|
+
/**
|
|
56
|
+
* Cycle tag state: empty -> selected -> not-selected -> empty
|
|
57
|
+
*/
|
|
58
|
+
static cycleTagState(currentState: TagState): TagState;
|
|
59
|
+
/**
|
|
60
|
+
* Get display symbol for tag state
|
|
61
|
+
*/
|
|
62
|
+
static getTagStateSymbol(state: TagState): string;
|
|
63
|
+
/**
|
|
64
|
+
* Get display color for tag state (for terminals that support colors)
|
|
65
|
+
*/
|
|
66
|
+
static getTagStateColor(state: TagState): string;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=tagQueryEvaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tagQueryEvaluator.d.ts","sourceRoot":"","sources":["../../src/utils/tagQueryEvaluator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,qBAAa,iBAAiB;IAC5B;;OAEG;WACW,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO;IA0DtE;;;OAGG;WACW,aAAa,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,GAAE,IAAI,GAAG,KAAK,GAAG,UAAiB,GAAG,QAAQ;IAqCxG;;OAEG;WACW,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAkDpD;;OAEG;WACW,aAAa,CAAC,KAAK,EAAE,QAAQ,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAoCpF;;OAEG;WACW,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAgBpF;;OAEG;WACW,wBAAwB,CACpC,UAAU,EAAE,YAAY,EAAE,EAC1B,QAAQ,GAAE,IAAI,GAAG,KAAK,GAAG,UAAiB,GACzC,QAAQ;IAqCX;;OAEG;WACW,kBAAkB,CAC9B,UAAU,EAAE,YAAY,EAAE,EAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,QAAQ,GAAE,IAAI,GAAG,KAAK,GAAG,UAAiB,GACzC,MAAM,EAAE;IAWX;;OAEG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,UAAU,GAAE,MAAU,GAAG,MAAM;IAcjF;;OAEG;WACW,aAAa,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ;IAa7D;;OAEG;WACW,iBAAiB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAaxD;;OAEG;WACW,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM;CAYxD"}
|