@agent-deck/backend 1.1.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 (166) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/cli-runtime.d.ts +4 -0
  3. package/dist/cli-runtime.d.ts.map +1 -0
  4. package/dist/cli-runtime.js +12 -0
  5. package/dist/cli-runtime.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +30 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/lib/agent-deck-context.d.ts +8 -0
  11. package/dist/lib/agent-deck-context.d.ts.map +1 -0
  12. package/dist/lib/agent-deck-context.js +48 -0
  13. package/dist/lib/agent-deck-context.js.map +1 -0
  14. package/dist/lib/bound-deck-scope.d.ts +15 -0
  15. package/dist/lib/bound-deck-scope.d.ts.map +1 -0
  16. package/dist/lib/bound-deck-scope.js +68 -0
  17. package/dist/lib/bound-deck-scope.js.map +1 -0
  18. package/dist/lib/client-scope.d.ts +14 -0
  19. package/dist/lib/client-scope.d.ts.map +1 -0
  20. package/dist/lib/client-scope.js +46 -0
  21. package/dist/lib/client-scope.js.map +1 -0
  22. package/dist/lib/paths.d.ts +2 -0
  23. package/dist/lib/paths.d.ts.map +1 -0
  24. package/dist/lib/paths.js +24 -0
  25. package/dist/lib/paths.js.map +1 -0
  26. package/dist/lib/version.d.ts +3 -0
  27. package/dist/lib/version.d.ts.map +1 -0
  28. package/dist/lib/version.js +20 -0
  29. package/dist/lib/version.js.map +1 -0
  30. package/dist/mcp-index.d.ts +2 -0
  31. package/dist/mcp-index.d.ts.map +1 -0
  32. package/dist/mcp-index.js +32 -0
  33. package/dist/mcp-index.js.map +1 -0
  34. package/dist/mcp-server.d.ts +25 -0
  35. package/dist/mcp-server.d.ts.map +1 -0
  36. package/dist/mcp-server.js +1121 -0
  37. package/dist/mcp-server.js.map +1 -0
  38. package/dist/mcp-stdio.d.ts +2 -0
  39. package/dist/mcp-stdio.d.ts.map +1 -0
  40. package/dist/mcp-stdio.js.map +1 -0
  41. package/dist/models/database.d.ts +64 -0
  42. package/dist/models/database.d.ts.map +1 -0
  43. package/dist/models/database.js +965 -0
  44. package/dist/models/database.js.map +1 -0
  45. package/dist/playbooks/playbook-manager.d.ts +29 -0
  46. package/dist/playbooks/playbook-manager.d.ts.map +1 -0
  47. package/dist/playbooks/playbook-manager.js +198 -0
  48. package/dist/playbooks/playbook-manager.js.map +1 -0
  49. package/dist/playbooks/playbook-parser.d.ts +8 -0
  50. package/dist/playbooks/playbook-parser.d.ts.map +1 -0
  51. package/dist/playbooks/playbook-parser.js +76 -0
  52. package/dist/playbooks/playbook-parser.js.map +1 -0
  53. package/dist/playbooks/playbook-service.d.ts +9 -0
  54. package/dist/playbooks/playbook-service.d.ts.map +1 -0
  55. package/dist/playbooks/playbook-service.js +107 -0
  56. package/dist/playbooks/playbook-service.js.map +1 -0
  57. package/dist/routes/collection.d.ts +3 -0
  58. package/dist/routes/collection.d.ts.map +1 -0
  59. package/dist/routes/collection.js +34 -0
  60. package/dist/routes/collection.js.map +1 -0
  61. package/dist/routes/credentials.d.ts +3 -0
  62. package/dist/routes/credentials.d.ts.map +1 -0
  63. package/dist/routes/credentials.js +241 -0
  64. package/dist/routes/credentials.js.map +1 -0
  65. package/dist/routes/decks.d.ts +3 -0
  66. package/dist/routes/decks.d.ts.map +1 -0
  67. package/dist/routes/decks.js +430 -0
  68. package/dist/routes/decks.js.map +1 -0
  69. package/dist/routes/local-mcp.d.ts +3 -0
  70. package/dist/routes/local-mcp.d.ts.map +1 -0
  71. package/dist/routes/local-mcp.js +189 -0
  72. package/dist/routes/local-mcp.js.map +1 -0
  73. package/dist/routes/mcp.d.ts +3 -0
  74. package/dist/routes/mcp.d.ts.map +1 -0
  75. package/dist/routes/mcp.js +170 -0
  76. package/dist/routes/mcp.js.map +1 -0
  77. package/dist/routes/oauth.d.ts +3 -0
  78. package/dist/routes/oauth.d.ts.map +1 -0
  79. package/dist/routes/oauth.js +242 -0
  80. package/dist/routes/oauth.js.map +1 -0
  81. package/dist/routes/playbooks.d.ts +5 -0
  82. package/dist/routes/playbooks.d.ts.map +1 -0
  83. package/dist/routes/playbooks.js +220 -0
  84. package/dist/routes/playbooks.js.map +1 -0
  85. package/dist/routes/scope.d.ts +3 -0
  86. package/dist/routes/scope.d.ts.map +1 -0
  87. package/dist/routes/scope.js +107 -0
  88. package/dist/routes/scope.js.map +1 -0
  89. package/dist/routes/services.d.ts +3 -0
  90. package/dist/routes/services.d.ts.map +1 -0
  91. package/dist/routes/services.js +281 -0
  92. package/dist/routes/services.js.map +1 -0
  93. package/dist/routes/websocket.d.ts +11 -0
  94. package/dist/routes/websocket.d.ts.map +1 -0
  95. package/dist/routes/websocket.js +154 -0
  96. package/dist/routes/websocket.js.map +1 -0
  97. package/dist/scope/repo-deck.d.ts +10 -0
  98. package/dist/scope/repo-deck.d.ts.map +1 -0
  99. package/dist/scope/repo-deck.js +63 -0
  100. package/dist/scope/repo-deck.js.map +1 -0
  101. package/dist/server/index.d.ts +24 -0
  102. package/dist/server/index.d.ts.map +1 -0
  103. package/dist/server/index.js +111 -0
  104. package/dist/server/index.js.map +1 -0
  105. package/dist/services/collection-warning-service.d.ts +18 -0
  106. package/dist/services/collection-warning-service.d.ts.map +1 -0
  107. package/dist/services/collection-warning-service.js +129 -0
  108. package/dist/services/collection-warning-service.js.map +1 -0
  109. package/dist/services/config-manager.d.ts +32 -0
  110. package/dist/services/config-manager.d.ts.map +1 -0
  111. package/dist/services/config-manager.js +119 -0
  112. package/dist/services/config-manager.js.map +1 -0
  113. package/dist/services/icon-resolver.d.ts +20 -0
  114. package/dist/services/icon-resolver.d.ts.map +1 -0
  115. package/dist/services/icon-resolver.js +224 -0
  116. package/dist/services/icon-resolver.js.map +1 -0
  117. package/dist/services/local-mcp-server-manager.d.ts +51 -0
  118. package/dist/services/local-mcp-server-manager.d.ts.map +1 -0
  119. package/dist/services/local-mcp-server-manager.js +246 -0
  120. package/dist/services/local-mcp-server-manager.js.map +1 -0
  121. package/dist/services/mcp-client-manager.d.ts +22 -0
  122. package/dist/services/mcp-client-manager.d.ts.map +1 -0
  123. package/dist/services/mcp-client-manager.js +257 -0
  124. package/dist/services/mcp-client-manager.js.map +1 -0
  125. package/dist/services/mcp-discovery-service.d.ts +31 -0
  126. package/dist/services/mcp-discovery-service.d.ts.map +1 -0
  127. package/dist/services/mcp-discovery-service.js +164 -0
  128. package/dist/services/mcp-discovery-service.js.map +1 -0
  129. package/dist/services/oauth-manager.d.ts +25 -0
  130. package/dist/services/oauth-manager.d.ts.map +1 -0
  131. package/dist/services/oauth-manager.js +365 -0
  132. package/dist/services/oauth-manager.js.map +1 -0
  133. package/dist/services/service-manager.d.ts +61 -0
  134. package/dist/services/service-manager.d.ts.map +1 -0
  135. package/dist/services/service-manager.js +447 -0
  136. package/dist/services/service-manager.js.map +1 -0
  137. package/dist/test-local-mcp-e2e.d.ts +3 -0
  138. package/dist/test-local-mcp-e2e.d.ts.map +1 -0
  139. package/dist/test-local-mcp-e2e.js +104 -0
  140. package/dist/test-local-mcp-e2e.js.map +1 -0
  141. package/dist/test-local-mcp.d.ts +3 -0
  142. package/dist/test-local-mcp.d.ts.map +1 -0
  143. package/dist/test-local-mcp.js +54 -0
  144. package/dist/test-local-mcp.js.map +1 -0
  145. package/dist/vault/credential-manager.d.ts +45 -0
  146. package/dist/vault/credential-manager.d.ts.map +1 -0
  147. package/dist/vault/credential-manager.js +237 -0
  148. package/dist/vault/credential-manager.js.map +1 -0
  149. package/dist/vault/index.d.ts +4 -0
  150. package/dist/vault/index.d.ts.map +1 -0
  151. package/dist/vault/index.js +20 -0
  152. package/dist/vault/index.js.map +1 -0
  153. package/dist/vault/secret-store.d.ts +36 -0
  154. package/dist/vault/secret-store.d.ts.map +1 -0
  155. package/dist/vault/secret-store.js +207 -0
  156. package/dist/vault/secret-store.js.map +1 -0
  157. package/dist/vault/yaml-sync.d.ts +8 -0
  158. package/dist/vault/yaml-sync.d.ts.map +1 -0
  159. package/dist/vault/yaml-sync.js +60 -0
  160. package/dist/vault/yaml-sync.js.map +1 -0
  161. package/package.json +64 -0
  162. package/static-ui/assets/AgentDeckLogo2-z3pVqJJ3.png +0 -0
  163. package/static-ui/assets/index-BnA3AsqY.css +1 -0
  164. package/static-ui/assets/index-D1IuraRt.js +334 -0
  165. package/static-ui/favicon.png +0 -0
  166. package/static-ui/index.html +17 -0
@@ -0,0 +1,447 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ServiceManager = void 0;
37
+ const shared_1 = require("@agent-deck/shared");
38
+ const config_manager_1 = require("./config-manager");
39
+ const icon_resolver_1 = require("./icon-resolver");
40
+ class ServiceManager {
41
+ db;
42
+ mcpClient;
43
+ oauthManager;
44
+ configManager;
45
+ constructor(db, mcpClient, oauthManager) {
46
+ this.db = db;
47
+ this.mcpClient = mcpClient;
48
+ this.oauthManager = oauthManager;
49
+ this.configManager = new config_manager_1.ConfigManager();
50
+ }
51
+ get mcpClientManager() {
52
+ return this.mcpClient;
53
+ }
54
+ async createService(input) {
55
+ // Validate input
56
+ const validatedInput = shared_1.CreateServiceSchema.parse(input);
57
+ // Check for name conflicts
58
+ const existingServices = await this.db.getAllServices();
59
+ const nameConflict = existingServices.find(s => s.name === validatedInput.name);
60
+ if (nameConflict) {
61
+ throw new Error(`Service with name "${validatedInput.name}" already exists`);
62
+ }
63
+ // Create service in database
64
+ const service = await this.db.createService(validatedInput);
65
+ // Try to discover OAuth configuration if it's an MCP service
66
+ if (service.type === 'mcp' && !service.oauthClientId) {
67
+ try {
68
+ const oauthDiscovery = await this.oauthManager.discoverOAuth(service.url);
69
+ if (oauthDiscovery.hasOAuth && oauthDiscovery.config) {
70
+ await this.db.updateService(service.id, {
71
+ oauthClientId: oauthDiscovery.config.clientId,
72
+ oauthClientSecret: oauthDiscovery.config.clientSecret,
73
+ oauthAuthorizationUrl: oauthDiscovery.config.authorizationUrl,
74
+ oauthTokenUrl: oauthDiscovery.config.tokenUrl,
75
+ oauthRedirectUri: oauthDiscovery.config.redirectUri,
76
+ oauthScope: oauthDiscovery.config.scope,
77
+ });
78
+ }
79
+ }
80
+ catch (error) {
81
+ console.warn(`Failed to discover OAuth for service ${service.id}:`, error);
82
+ }
83
+ }
84
+ void this.refreshServiceIcon(service.id).catch((error) => {
85
+ console.warn(`Failed to resolve icon for service ${service.name}:`, error);
86
+ });
87
+ void this.probeInitialHealth(service.id);
88
+ return service;
89
+ }
90
+ probeInitialHealth(serviceId) {
91
+ void this.discoverServiceTools(serviceId).catch((error) => {
92
+ console.warn(`Initial health probe failed for service ${serviceId}:`, error);
93
+ });
94
+ }
95
+ async refreshUnknownServiceHealth(onUpdate) {
96
+ const services = await this.db.getAllServices();
97
+ await Promise.all(services.map(async (service) => {
98
+ if (!this.shouldBackgroundProbe(service)) {
99
+ return;
100
+ }
101
+ const result = await this.checkServiceHealth(service.id);
102
+ if (!onUpdate || !('health' in result) || !result.success) {
103
+ return;
104
+ }
105
+ onUpdate({
106
+ serviceId: service.id,
107
+ health: result.health,
108
+ isConnected: result.isConnected,
109
+ lastPing: new Date().toISOString(),
110
+ });
111
+ }));
112
+ }
113
+ shouldBackgroundProbe(service) {
114
+ if (service.health !== 'unknown') {
115
+ return false;
116
+ }
117
+ if (service.type === 'local-mcp' || service.type === 'a2a') {
118
+ return true;
119
+ }
120
+ if (service.type !== 'mcp') {
121
+ return false;
122
+ }
123
+ const hasOAuthConfig = Boolean(service.oauthClientId ||
124
+ service.oauthAuthorizationUrl ||
125
+ service.oauthTokenUrl);
126
+ const hasAuth = Boolean(service.oauthAccessToken || service.headers?.Authorization);
127
+ if (hasOAuthConfig && !hasAuth) {
128
+ return false;
129
+ }
130
+ return true;
131
+ }
132
+ async refreshServiceIcon(serviceId) {
133
+ const service = await this.db.getService(serviceId);
134
+ if (!service) {
135
+ return null;
136
+ }
137
+ if (service.type === 'local-mcp' || service.url.startsWith('local://')) {
138
+ return service;
139
+ }
140
+ const result = await (0, icon_resolver_1.cacheIconForService)(serviceId, service.url);
141
+ if (!result.iconPath) {
142
+ return service;
143
+ }
144
+ return await this.db.updateService(serviceId, {
145
+ iconUrl: (0, icon_resolver_1.serviceIconApiPath)(serviceId),
146
+ });
147
+ }
148
+ async getService(id) {
149
+ return await this.db.getService(id);
150
+ }
151
+ async getAllServices() {
152
+ return await this.db.getAllServices();
153
+ }
154
+ async updateService(id, input) {
155
+ // Validate input
156
+ const validatedInput = shared_1.UpdateServiceSchema.parse(input);
157
+ return await this.db.updateService(id, validatedInput);
158
+ }
159
+ async deleteService(id) {
160
+ // First, get the service to check if it's a local MCP server
161
+ const service = await this.db.getService(id);
162
+ if (!service) {
163
+ return false; // Service doesn't exist
164
+ }
165
+ // If it's a local MCP server, stop it first
166
+ if (service.type === 'local-mcp') {
167
+ try {
168
+ console.log(`๐Ÿ›‘ Stopping local MCP server before deletion: ${service.name}`);
169
+ await this.stopLocalServer(id);
170
+ }
171
+ catch (error) {
172
+ console.warn(`โš ๏ธ Failed to stop local MCP server ${service.name}:`, error);
173
+ }
174
+ }
175
+ const dependents = await this.db.getPlaybooksDependingOnService(id);
176
+ if (dependents.length > 0) {
177
+ const { PlaybookDependencyError } = await Promise.resolve().then(() => __importStar(require('../playbooks/playbook-manager')));
178
+ throw new PlaybookDependencyError(`Cannot delete MCP "${service.name}": referenced by playbook(s): ${dependents.map((p) => p.title).join(', ')}`, dependents.map(({ id: playbookId, title }) => ({ id: playbookId, title })));
179
+ }
180
+ return await this.db.deleteService(id);
181
+ }
182
+ async discoverServiceTools(serviceId, options) {
183
+ const service = await this.db.getService(serviceId);
184
+ if (!service) {
185
+ return { success: false, error: 'Service not found' };
186
+ }
187
+ try {
188
+ let tools;
189
+ if (service.type === 'mcp' || service.type === 'local-mcp') {
190
+ tools = await this.mcpClient.discoverTools(service);
191
+ }
192
+ else if (service.type === 'a2a') {
193
+ tools = await this.discoverA2ATools(service);
194
+ }
195
+ else {
196
+ return { success: false, error: `Unsupported service type: ${service.type}` };
197
+ }
198
+ const annotated = this.annotateToolEnabledState(tools, service.disabledToolNames ?? []);
199
+ await this.db.updateServiceStatus(serviceId, true, 'healthy');
200
+ if (options?.forAgent) {
201
+ return annotated.filter((tool) => tool.enabled !== false);
202
+ }
203
+ return annotated;
204
+ }
205
+ catch (error) {
206
+ console.error(`Failed to discover tools for service ${serviceId}:`, error);
207
+ await this.db.updateServiceStatus(serviceId, false, 'unhealthy');
208
+ return { success: false, error: 'Failed to discover tools' };
209
+ }
210
+ }
211
+ async updateToolSettings(serviceId, input) {
212
+ const service = await this.db.getService(serviceId);
213
+ if (!service) {
214
+ return null;
215
+ }
216
+ const discovered = await this.discoverServiceTools(serviceId);
217
+ if (!Array.isArray(discovered)) {
218
+ return this.db.updateServiceDisabledTools(serviceId, input.disabledTools);
219
+ }
220
+ const knownNames = new Set(discovered.map((tool) => tool.name));
221
+ const pruned = input.disabledTools.filter((name) => knownNames.has(name));
222
+ return this.db.updateServiceDisabledTools(serviceId, pruned);
223
+ }
224
+ annotateToolEnabledState(tools, disabledToolNames) {
225
+ const disabled = new Set(disabledToolNames);
226
+ return tools.map((tool) => ({
227
+ ...tool,
228
+ enabled: !disabled.has(tool.name),
229
+ }));
230
+ }
231
+ async callServiceTool(input) {
232
+ // Validate input
233
+ const validatedInput = shared_1.ServiceCallSchema.parse(input);
234
+ const service = await this.db.getService(validatedInput.serviceId);
235
+ if (!service) {
236
+ return {
237
+ success: false,
238
+ error: 'Service not found',
239
+ };
240
+ }
241
+ if ((service.disabledToolNames ?? []).includes(validatedInput.toolName)) {
242
+ return {
243
+ success: false,
244
+ error: `Tool "${validatedInput.toolName}" is disabled for this service`,
245
+ };
246
+ }
247
+ try {
248
+ if (service.type === 'mcp' || service.type === 'local-mcp') {
249
+ const result = await this.mcpClient.callTool(service, validatedInput.toolName, validatedInput.arguments);
250
+ return {
251
+ success: true,
252
+ result: result,
253
+ };
254
+ }
255
+ else if (service.type === 'a2a') {
256
+ const result = await this.callA2ATool(service, validatedInput.toolName, validatedInput.arguments || {});
257
+ return {
258
+ success: true,
259
+ result: result,
260
+ };
261
+ }
262
+ else {
263
+ return {
264
+ success: false,
265
+ error: `Unsupported service type: ${service.type}`,
266
+ };
267
+ }
268
+ }
269
+ catch (error) {
270
+ console.error(`Failed to call tool for service ${validatedInput.serviceId}:`, error);
271
+ return {
272
+ success: false,
273
+ error: 'Failed to call tool',
274
+ };
275
+ }
276
+ }
277
+ async checkServiceHealth(serviceId) {
278
+ const service = await this.db.getService(serviceId);
279
+ if (!service) {
280
+ return { success: false, error: 'Service not found' };
281
+ }
282
+ const result = await this.discoverServiceTools(serviceId);
283
+ if (!Array.isArray(result)) {
284
+ return {
285
+ success: true,
286
+ health: 'unhealthy',
287
+ isConnected: false,
288
+ };
289
+ }
290
+ return {
291
+ success: true,
292
+ health: 'healthy',
293
+ isConnected: true,
294
+ };
295
+ }
296
+ async discoverA2ATools(service) {
297
+ try {
298
+ const response = await fetch(`${service.url}/manifest`);
299
+ if (!response.ok) {
300
+ throw new Error(`Failed to fetch A2A manifest: ${response.statusText}`);
301
+ }
302
+ const manifest = await response.json();
303
+ const tools = [];
304
+ if (manifest.endpoints) {
305
+ for (const [name, endpoint] of Object.entries(manifest.endpoints)) {
306
+ tools.push({
307
+ name,
308
+ description: endpoint.description || `A2A endpoint: ${name}`,
309
+ inputSchema: endpoint.inputSchema || {},
310
+ });
311
+ }
312
+ }
313
+ return tools;
314
+ }
315
+ catch (error) {
316
+ console.error(`Failed to discover A2A tools for service ${service.id}:`, error);
317
+ throw error;
318
+ }
319
+ }
320
+ async callA2ATool(service, toolName, arguments_) {
321
+ try {
322
+ const response = await fetch(`${service.url}/${toolName}`, {
323
+ method: 'POST',
324
+ headers: {
325
+ 'Content-Type': 'application/json',
326
+ ...service.headers,
327
+ },
328
+ body: JSON.stringify(arguments_),
329
+ });
330
+ if (!response.ok) {
331
+ throw new Error(`A2A tool call failed: ${response.statusText}`);
332
+ }
333
+ return await response.json();
334
+ }
335
+ catch (error) {
336
+ console.error(`Failed to call A2A tool ${toolName} for service ${service.id}:`, error);
337
+ throw error;
338
+ }
339
+ }
340
+ /**
341
+ * Import local MCP servers from JSON configuration
342
+ */
343
+ async importLocalServersFromConfig(jsonContent) {
344
+ try {
345
+ const manifest = this.configManager.parseManifest(jsonContent);
346
+ const services = this.configManager.manifestToServices(manifest);
347
+ const createdServices = [];
348
+ for (const serviceInput of services) {
349
+ // Check if service already exists (any type with same name)
350
+ const existingServices = await this.db.getAllServices();
351
+ const existingService = existingServices.find(s => s.name === serviceInput.name);
352
+ if (existingService) {
353
+ console.log(`โš ๏ธ Service with name "${serviceInput.name}" already exists (type: ${existingService.type}), skipping`);
354
+ throw new Error(`Service with name "${serviceInput.name}" already exists`);
355
+ }
356
+ // Validate command safety
357
+ if (!this.configManager.isCommandSafe(serviceInput.localCommand)) {
358
+ console.warn(`โš ๏ธ Skipping potentially unsafe command: ${serviceInput.localCommand}`);
359
+ continue;
360
+ }
361
+ // Sanitize environment variables
362
+ if (serviceInput.localEnv) {
363
+ serviceInput.localEnv = this.configManager.sanitizeEnvironment(serviceInput.localEnv);
364
+ }
365
+ const service = await this.createService(serviceInput);
366
+ createdServices.push(service);
367
+ console.log(`โœ… Created local MCP server: ${service.name}`);
368
+ }
369
+ return createdServices;
370
+ }
371
+ catch (error) {
372
+ console.error('โŒ Failed to import local servers from config:', error);
373
+ throw error;
374
+ }
375
+ }
376
+ /**
377
+ * Get sample configuration
378
+ */
379
+ getSampleConfig() {
380
+ const sampleManifest = this.configManager.generateSampleManifest();
381
+ return this.configManager.manifestToJson(sampleManifest);
382
+ }
383
+ /**
384
+ * Start a local MCP server
385
+ */
386
+ async startLocalServer(serviceId) {
387
+ const service = await this.db.getService(serviceId);
388
+ if (!service) {
389
+ throw new Error('Service not found');
390
+ }
391
+ if (service.type !== 'local-mcp') {
392
+ throw new Error('Service is not a local MCP server');
393
+ }
394
+ // The MCP client manager will handle starting the server when needed
395
+ await this.mcpClient.discoverTools(service);
396
+ }
397
+ /**
398
+ * Stop a local MCP server
399
+ */
400
+ async stopLocalServer(serviceId) {
401
+ const service = await this.db.getService(serviceId);
402
+ if (!service) {
403
+ throw new Error('Service not found');
404
+ }
405
+ if (service.type !== 'local-mcp') {
406
+ throw new Error('Service is not a local MCP server');
407
+ }
408
+ // Get the local server manager from the MCP client manager
409
+ const localManager = this.mcpClient.localServerManager;
410
+ if (localManager) {
411
+ await localManager.stopLocalServer(serviceId);
412
+ }
413
+ }
414
+ /**
415
+ * Get local MCP server status
416
+ */
417
+ async getLocalServerStatus(serviceId) {
418
+ const service = await this.db.getService(serviceId);
419
+ if (!service) {
420
+ throw new Error('Service not found');
421
+ }
422
+ if (service.type !== 'local-mcp') {
423
+ throw new Error('Service is not a local MCP server');
424
+ }
425
+ // Get the local server manager from the MCP client manager
426
+ const localManager = this.mcpClient.localServerManager;
427
+ if (localManager) {
428
+ const processRecord = localManager.getLocalServer(serviceId);
429
+ if (processRecord) {
430
+ return {
431
+ isRunning: processRecord.isRunning,
432
+ startTime: processRecord.startTime,
433
+ lastActivity: processRecord.lastActivity,
434
+ capabilities: processRecord.capabilities
435
+ };
436
+ }
437
+ }
438
+ return {
439
+ isRunning: false,
440
+ startTime: null,
441
+ lastActivity: null,
442
+ capabilities: null
443
+ };
444
+ }
445
+ }
446
+ exports.ServiceManager = ServiceManager;
447
+ //# sourceMappingURL=service-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-manager.js","sourceRoot":"","sources":["../../src/services/service-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=test-local-mcp-e2e.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp-e2e.d.ts","sourceRoot":"","sources":["../src/test-local-mcp-e2e.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const local_mcp_server_manager_1 = require("./services/local-mcp-server-manager");
5
+ const config_manager_1 = require("./services/config-manager");
6
+ const service_manager_1 = require("./services/service-manager");
7
+ const mcp_client_manager_1 = require("./services/mcp-client-manager");
8
+ const oauth_manager_1 = require("./services/oauth-manager");
9
+ const database_1 = require("./models/database");
10
+ async function testLocalMCPServerE2E() {
11
+ console.log('๐Ÿงช Testing Local MCP Server End-to-End Flow...\n');
12
+ // Initialize managers
13
+ const db = new database_1.DatabaseManager();
14
+ const configManager = new config_manager_1.ConfigManager();
15
+ const localManager = new local_mcp_server_manager_1.LocalMCPServerManager();
16
+ // Create MCP client manager with local server manager
17
+ const mcpClient = new mcp_client_manager_1.MCPClientManager();
18
+ mcpClient.localServerManager = localManager;
19
+ // Create OAuth manager (required by ServiceManager)
20
+ const oauthManager = new oauth_manager_1.OAuthManager();
21
+ const serviceManager = new service_manager_1.ServiceManager(db, mcpClient, oauthManager);
22
+ try {
23
+ // Test 1: Import local servers from configuration
24
+ console.log('๐Ÿ“‹ Test 1: Importing local servers from configuration...');
25
+ const config = {
26
+ mcpServers: {
27
+ memory: {
28
+ command: 'npx',
29
+ args: ['-y', '@modelcontextprotocol/server-memory']
30
+ }
31
+ }
32
+ };
33
+ const services = await serviceManager.importLocalServersFromConfig(JSON.stringify(config));
34
+ console.log('โœ… Imported services:', services.length);
35
+ services.forEach(service => {
36
+ console.log(` - ${service.name} (${service.id}): ${service.localCommand} ${service.localArgs?.join(' ')}`);
37
+ });
38
+ if (services.length === 0) {
39
+ throw new Error('No services were imported');
40
+ }
41
+ const memoryService = services[0];
42
+ // Test 2: Start the local MCP server
43
+ console.log('\n๐Ÿ“‹ Test 2: Starting local MCP server...');
44
+ await serviceManager.startLocalServer(memoryService.id);
45
+ console.log('โœ… Local MCP server started');
46
+ // Test 3: Discover tools (using unified API)
47
+ console.log('\n๐Ÿ“‹ Test 3: Discovering tools (unified API)...');
48
+ const tools = await serviceManager.discoverServiceTools(memoryService.id);
49
+ console.log('โœ… Discovered tools:', tools.length);
50
+ tools.forEach(tool => {
51
+ console.log(` - ${tool.name}: ${tool.description}`);
52
+ });
53
+ if (tools.length === 0) {
54
+ console.log('โš ๏ธ No tools discovered - this might be normal for some servers');
55
+ }
56
+ // Test 4: Call a tool (using unified API)
57
+ console.log('\n๐Ÿ“‹ Test 4: Calling tool (unified API)...');
58
+ if (tools.length > 0) {
59
+ const firstTool = tools[0];
60
+ console.log(` Calling tool: ${firstTool.name}`);
61
+ try {
62
+ const result = await serviceManager.callServiceTool(memoryService.id, firstTool.name, {});
63
+ console.log('โœ… Tool call result:', result);
64
+ }
65
+ catch (error) {
66
+ console.log('โš ๏ธ Tool call failed (this might be expected):', error.message);
67
+ }
68
+ }
69
+ else {
70
+ console.log('โš ๏ธ Skipping tool call - no tools available');
71
+ }
72
+ // Test 5: Check service health (using unified API)
73
+ console.log('\n๐Ÿ“‹ Test 5: Checking service health (unified API)...');
74
+ const health = await serviceManager.checkServiceHealth(memoryService.id);
75
+ console.log('โœ… Service health:', health);
76
+ // Test 6: Get local server status
77
+ console.log('\n๐Ÿ“‹ Test 6: Getting local server status...');
78
+ const status = await serviceManager.getLocalServerStatus(memoryService.id);
79
+ console.log('โœ… Local server status:', status);
80
+ // Test 7: Stop the local MCP server
81
+ console.log('\n๐Ÿ“‹ Test 7: Stopping local MCP server...');
82
+ await serviceManager.stopLocalServer(memoryService.id);
83
+ console.log('โœ… Local MCP server stopped');
84
+ // Test 8: Verify server is stopped
85
+ console.log('\n๐Ÿ“‹ Test 8: Verifying server is stopped...');
86
+ const finalStatus = await serviceManager.getLocalServerStatus(memoryService.id);
87
+ console.log('โœ… Final status:', finalStatus);
88
+ console.log('\n๐ŸŽ‰ All end-to-end tests passed! Local MCP server integration is working correctly.');
89
+ }
90
+ catch (error) {
91
+ console.error('โŒ End-to-end test failed:', error);
92
+ process.exit(1);
93
+ }
94
+ finally {
95
+ // Cleanup
96
+ console.log('\n๐Ÿงน Cleaning up...');
97
+ await localManager.cleanup();
98
+ await db.close();
99
+ console.log('โœ… Cleanup completed');
100
+ }
101
+ }
102
+ // Run the end-to-end test
103
+ testLocalMCPServerE2E().catch(console.error);
104
+ //# sourceMappingURL=test-local-mcp-e2e.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp-e2e.js","sourceRoot":"","sources":["../src/test-local-mcp-e2e.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env tsx
2
+ export {};
3
+ //# sourceMappingURL=test-local-mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp.d.ts","sourceRoot":"","sources":["../src/test-local-mcp.ts"],"names":[],"mappings":""}
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env tsx
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const local_mcp_server_manager_1 = require("./services/local-mcp-server-manager");
5
+ const config_manager_1 = require("./services/config-manager");
6
+ async function testLocalMCPServer() {
7
+ console.log('๐Ÿงช Testing Local MCP Server functionality...\n');
8
+ const configManager = new config_manager_1.ConfigManager();
9
+ const localManager = new local_mcp_server_manager_1.LocalMCPServerManager();
10
+ try {
11
+ // Test 1: Parse sample configuration
12
+ console.log('๐Ÿ“‹ Test 1: Parsing sample configuration...');
13
+ const sampleConfig = configManager.generateSampleManifest();
14
+ console.log('โœ… Sample config generated:', JSON.stringify(sampleConfig, null, 2));
15
+ // Test 2: Convert manifest to services
16
+ console.log('\n๐Ÿ“‹ Test 2: Converting manifest to services...');
17
+ const services = configManager.manifestToServices(sampleConfig);
18
+ console.log('โœ… Services created:', services.length);
19
+ services.forEach(service => {
20
+ console.log(` - ${service.name}: ${service.localCommand} ${service.localArgs?.join(' ')}`);
21
+ });
22
+ // Test 3: Validate configuration
23
+ console.log('\n๐Ÿ“‹ Test 3: Validating configuration...');
24
+ configManager.validateLocalServerConfig(sampleConfig.mcpServers.memory);
25
+ console.log('โœ… Configuration validation passed');
26
+ // Test 4: Command safety check
27
+ console.log('\n๐Ÿ“‹ Test 4: Command safety check...');
28
+ const safeCommand = configManager.isCommandSafe('npx');
29
+ const unsafeCommand = configManager.isCommandSafe('rm -rf /');
30
+ console.log('โœ… Safe command check:', safeCommand);
31
+ console.log('โœ… Unsafe command check:', !unsafeCommand);
32
+ // Test 5: Environment sanitization
33
+ console.log('\n๐Ÿ“‹ Test 5: Environment sanitization...');
34
+ const testEnv = {
35
+ 'SAFE_VAR': 'value',
36
+ 'unsafe-var': 'value',
37
+ '123UNSAFE': 'value'
38
+ };
39
+ const sanitized = configManager.sanitizeEnvironment(testEnv);
40
+ console.log('โœ… Environment sanitized:', sanitized);
41
+ console.log('\n๐ŸŽ‰ All tests passed! Local MCP server functionality is working correctly.');
42
+ }
43
+ catch (error) {
44
+ console.error('โŒ Test failed:', error);
45
+ process.exit(1);
46
+ }
47
+ finally {
48
+ // Cleanup
49
+ await localManager.cleanup();
50
+ }
51
+ }
52
+ // Run the test
53
+ testLocalMCPServer().catch(console.error);
54
+ //# sourceMappingURL=test-local-mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-local-mcp.js","sourceRoot":"","sources":["../src/test-local-mcp.ts"],"names":[],"mappings":";;;AAEA,kFAA4E;AAC5E,8DAA0D;AAG1D,KAAK,UAAU,kBAAkB;IAC/B,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;IAE9D,MAAM,aAAa,GAAG,IAAI,8BAAa,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,IAAI,gDAAqB,EAAE,CAAC;IAEjD,IAAI,CAAC;QACH,qCAAqC;QACrC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,aAAa,CAAC,sBAAsB,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAEjF,uCAAuC;QACvC,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YACzB,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QAEH,iCAAiC;QACjC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,aAAa,CAAC,yBAAyB,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAEjD,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QACpD,MAAM,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,aAAa,GAAG,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC,aAAa,CAAC,CAAC;QAEvD,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG;YACd,UAAU,EAAE,OAAO;YACnB,YAAY,EAAE,OAAO;YACrB,WAAW,EAAE,OAAO;SACrB,CAAC;QACF,MAAM,SAAS,GAAG,aAAa,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;QAEnD,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAC;IAE7F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,UAAU;QACV,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,eAAe;AACf,kBAAkB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}