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