snow-flow 2.0.2 → 2.0.3
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/{.claude/mcp-config.json → .mcp.json} +13 -12
- package/.releaserc.json +47 -0
- package/README.md +6 -0
- package/package.json +1 -1
- package/.claude/claude-settings.json +0 -15
- package/.claude/commands/analysis/README.md +0 -9
- package/.claude/commands/automation/README.md +0 -9
- package/.claude/commands/github/README.md +0 -11
- package/.claude/commands/helpers/standard-checkpoint-hooks.sh +0 -179
- package/.claude/commands/hooks/README.md +0 -11
- package/.claude/commands/monitoring/README.md +0 -9
- package/.claude/commands/optimization/README.md +0 -9
- package/.claude/commands/training/README.md +0 -9
- package/.claude/commands/workflows/README.md +0 -9
- package/.claude/config.json +0 -36
- package/.claude/helpers/github-setup.sh +0 -28
- package/.claude/helpers/quick-start.sh +0 -19
- package/.claude/helpers/setup-mcp.sh +0 -18
- package/.claude/settings.json +0 -114
- package/.claude/settings.local.json +0 -33
- package/.claude-flow/metrics/agent-metrics.json +0 -1
- package/.claude-flow/metrics/performance.json +0 -9
- package/.claude-flow/metrics/system-metrics.json +0 -15986
- package/.claude-flow/metrics/task-metrics.json +0 -10
- package/.roo/README.md +0 -402
- package/.roo/mcp-list.txt +0 -257
- package/.roo/mcp.json +0 -32
- package/.roo/workflows/basic-tdd.json +0 -32
- package/.roomodes +0 -201
- package/CLAUDE.md +0 -393
- package/bin/snow-flow.js +0 -3
- package/dist/cli.js.bak +0 -2052
- package/dist/config/snow-flow-config.d.ts +0 -1492
- package/dist/config/snow-flow-config.js +0 -938
- package/scripts/create-env.js +0 -91
- package/scripts/postinstall.js +0 -30
- package/scripts/register-mcp-servers.js +0 -210
- package/scripts/reset-mcp-servers.js +0 -246
- package/scripts/setup-mcp.js +0 -106
- package/scripts/update-version.js +0 -31
- package/src/agents/README.md +0 -192
- package/src/agents/base-agent.ts +0 -251
- package/src/agents/coordinator.ts +0 -971
- package/src/agents/index.ts +0 -18
- package/src/agents/queen-403-handler.ts +0 -230
- package/src/agents/queen-agent.ts +0 -1399
- package/src/agents/script-writer-agent.ts +0 -769
- package/src/agents/security-agent.ts +0 -726
- package/src/agents/widget-creator-agent.ts +0 -568
- package/src/api/error-handling.ts +0 -1758
- package/src/api/natural-language-mapper.ts +0 -630
- package/src/api/performance-optimizer.ts +0 -891
- package/src/api/transaction-manager.ts +0 -754
- package/src/cli/deploy-artifact.ts +0 -304
- package/src/cli/snow-flow-cli-integration.ts +0 -434
- package/src/cli.ts +0 -4455
- package/src/cli.ts.bak +0 -5616
- package/src/compliance/advanced-compliance-system.ts +0 -1268
- package/src/compliance/index.ts +0 -19
- package/src/config/snow-flow-config.ts +0 -1019
- package/src/documentation/index.ts +0 -16
- package/src/documentation/self-documenting-system.ts +0 -1421
- package/src/dynamic-version.ts +0 -44
- package/src/healing/index.ts +0 -20
- package/src/healing/self-healing-system.ts +0 -1435
- package/src/health/README.md +0 -161
- package/src/health/system-health.ts +0 -995
- package/src/index.ts +0 -60
- package/src/intelligence/acl-analyzer.ts +0 -377
- package/src/intelligence/auto-resolution-engine.ts +0 -643
- package/src/intelligence/gap-analysis-engine.ts +0 -488
- package/src/intelligence/manual-instructions-generator.ts +0 -744
- package/src/intelligence/mcp-coverage-analyzer.ts +0 -708
- package/src/intelligence/multi-pass-requirements-analyzer.ts +0 -603
- package/src/intelligence/performance-recommendations-engine.ts +0 -1223
- package/src/intelligence/requirements-analyzer.ts +0 -1148
- package/src/intelligence/task-analyzer.ts +0 -628
- package/src/managers/scope-manager.ts +0 -555
- package/src/mcp/advanced/servicenow-advanced-features-mcp.ts +0 -16110
- package/src/mcp/base-mcp-server.ts +0 -660
- package/src/mcp/http-transport-wrapper.ts +0 -426
- package/src/mcp/service-discovery-client.ts +0 -312
- package/src/mcp/servicenow-automation-mcp-refactored.ts +0 -678
- package/src/mcp/servicenow-automation-mcp.ts +0 -838
- package/src/mcp/servicenow-deployment-mcp-refactored.ts +0 -1292
- package/src/mcp/servicenow-deployment-mcp.ts +0 -7244
- package/src/mcp/servicenow-graph-memory-mcp-refactored.ts +0 -721
- package/src/mcp/servicenow-graph-memory-mcp.ts +0 -832
- package/src/mcp/servicenow-integration-mcp-refactored.ts +0 -655
- package/src/mcp/servicenow-integration-mcp.ts +0 -819
- package/src/mcp/servicenow-intelligent-mcp-refactored.ts +0 -977
- package/src/mcp/servicenow-intelligent-mcp.ts +0 -4638
- package/src/mcp/servicenow-mcp-server.ts +0 -728
- package/src/mcp/servicenow-memory-mcp.ts +0 -474
- package/src/mcp/servicenow-operations-mcp-refactored.ts +0 -1995
- package/src/mcp/servicenow-operations-mcp.ts +0 -3384
- package/src/mcp/servicenow-platform-development-mcp-refactored.ts +0 -611
- package/src/mcp/servicenow-platform-development-mcp.ts +0 -970
- package/src/mcp/servicenow-progressive-indexer.ts +0 -370
- package/src/mcp/servicenow-reporting-analytics-mcp-refactored.ts +0 -695
- package/src/mcp/servicenow-reporting-analytics-mcp.ts +0 -1123
- package/src/mcp/servicenow-security-compliance-mcp-refactored.ts +0 -642
- package/src/mcp/servicenow-security-compliance-mcp.ts +0 -1157
- package/src/mcp/servicenow-update-set-mcp-refactored.ts +0 -751
- package/src/mcp/servicenow-update-set-mcp.ts +0 -811
- package/src/mcp/shared/agent-context-provider.ts +0 -365
- package/src/mcp/shared/base-mcp-server.ts +0 -2463
- package/src/mcp/shared/mcp-memory-manager.ts +0 -540
- package/src/mcp/shared/mcp-resource-manager.ts +0 -367
- package/src/mcp/snow-flow-mcp.ts +0 -911
- package/src/mcp/start-all-mcp-servers.ts +0 -102
- package/src/mcp/start-servicenow-mcp.ts +0 -67
- package/src/monitoring/enhanced-monitoring-system.ts +0 -1345
- package/src/monitoring/performance-tracker.ts +0 -777
- package/src/optimization/cost-optimization-engine.ts +0 -1125
- package/src/optimization/index.ts +0 -10
- package/src/queen/README.md +0 -403
- package/src/queen/agent-factory.ts +0 -574
- package/src/queen/index.ts +0 -94
- package/src/queen/mcp-execution-bridge.ts +0 -681
- package/src/queen/neural-learning.ts +0 -319
- package/src/queen/parallel-agent-engine.ts +0 -848
- package/src/queen/queen-memory-system.ts +0 -490
- package/src/queen/queen-memory.ts +0 -456
- package/src/queen/servicenow-queen.ts +0 -1029
- package/src/queen/types.ts +0 -87
- package/src/rollback/smart-rollback-system.ts +0 -866
- package/src/schemas/deployment.schema.json +0 -58
- package/src/schemas/flow.schema.json +0 -79
- package/src/schemas/widget.schema.json +0 -72
- package/src/snow-flow-system.ts +0 -541
- package/src/sparc/sparc-help.ts +0 -49
- package/src/sparc/team-sparc.ts +0 -88
- package/src/strategies/global-scope-strategy.ts +0 -736
- package/src/templates/base/application.template.json +0 -45
- package/src/templates/base/business_rule.template.json +0 -33
- package/src/templates/base/script_include.template.json +0 -18
- package/src/templates/base/table.template.json +0 -64
- package/src/templates/base/widget.template.json +0 -25
- package/src/templates/patterns/composite.incident-management.template.json +0 -140
- package/src/templates/patterns/widget.dashboard.template.json +0 -238
- package/src/templates/patterns/widget.datatable.template.json +0 -292
- package/src/testing/integration-test-suite.ts +0 -1276
- package/src/types/index.ts +0 -183
- package/src/types/neo4j-driver.d.ts +0 -23
- package/src/types/servicenow.types.ts +0 -307
- package/src/types/snow-flow.types.ts +0 -186
- package/src/types/todo.types.ts +0 -70
- package/src/utils/action-type-cache.ts +0 -286
- package/src/utils/agent-detector.ts +0 -573
- package/src/utils/artifact-tracker.ts +0 -379
- package/src/utils/dependency-detector.ts +0 -233
- package/src/utils/deployment-metadata-handler.ts +0 -518
- package/src/utils/error-recovery.ts +0 -680
- package/src/utils/logger.ts +0 -60
- package/src/utils/mcp-auth-middleware.ts +0 -262
- package/src/utils/mcp-config-manager.ts +0 -270
- package/src/utils/mcp-server-manager.ts +0 -446
- package/src/utils/mcp-tool-registry.ts +0 -298
- package/src/utils/migrate-snow-flow.ts +0 -98
- package/src/utils/oauth-html-templates.ts +0 -188
- package/src/utils/scope-utils.ts +0 -443
- package/src/utils/servicenow-client.ts +0 -3321
- package/src/utils/servicenow-id-generator.ts +0 -181
- package/src/utils/snow-memory-manager.ts +0 -605
- package/src/utils/snow-oauth.ts +0 -797
- package/src/utils/template-engine.ts +0 -463
- package/src/utils/theme-manager.ts +0 -295
- package/src/utils/unified-auth-store.ts +0 -222
- package/src/utils/update-set-importer.ts +0 -422
- package/src/utils/update-set-xml-packager.ts +0 -371
- package/src/utils/widget-template-generator.ts +0 -1744
- package/src/version.ts +0 -1950
|
@@ -1,446 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* MCP Server Manager - Manages background MCP servers for Claude Code integration
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { spawn, ChildProcess } from 'child_process';
|
|
6
|
-
import { promises as fs } from 'fs';
|
|
7
|
-
import { join } from 'path';
|
|
8
|
-
import { EventEmitter } from 'events';
|
|
9
|
-
import os from 'os';
|
|
10
|
-
import { unifiedAuthStore } from './unified-auth-store.js';
|
|
11
|
-
|
|
12
|
-
export interface MCPServer {
|
|
13
|
-
name: string;
|
|
14
|
-
script: string;
|
|
15
|
-
port?: number;
|
|
16
|
-
host?: string;
|
|
17
|
-
process?: ChildProcess;
|
|
18
|
-
pid?: number;
|
|
19
|
-
status: 'stopped' | 'starting' | 'running' | 'error';
|
|
20
|
-
startedAt?: Date;
|
|
21
|
-
lastError?: string;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface MCPServerConfig {
|
|
25
|
-
name: string;
|
|
26
|
-
script: string;
|
|
27
|
-
port?: number;
|
|
28
|
-
host?: string;
|
|
29
|
-
autoStart?: boolean;
|
|
30
|
-
env?: Record<string, string>;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export class MCPServerManager extends EventEmitter {
|
|
34
|
-
private servers: Map<string, MCPServer> = new Map();
|
|
35
|
-
private configPath: string;
|
|
36
|
-
private logPath: string;
|
|
37
|
-
|
|
38
|
-
constructor(configPath?: string) {
|
|
39
|
-
super();
|
|
40
|
-
this.configPath = configPath || join(process.env.SNOW_FLOW_HOME || join(os.homedir(), '.snow-flow'), 'mcp-servers.json');
|
|
41
|
-
this.logPath = join(process.env.SNOW_FLOW_HOME || join(os.homedir(), '.snow-flow'), 'logs');
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Initialize MCP server manager
|
|
46
|
-
*/
|
|
47
|
-
async initialize(): Promise<void> {
|
|
48
|
-
// Ensure directories exist
|
|
49
|
-
await fs.mkdir(process.env.SNOW_FLOW_HOME || join(os.homedir(), '.snow-flow'), { recursive: true });
|
|
50
|
-
await fs.mkdir(this.logPath, { recursive: true });
|
|
51
|
-
|
|
52
|
-
// Load existing configuration
|
|
53
|
-
await this.loadConfiguration();
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Load MCP server configuration
|
|
58
|
-
*/
|
|
59
|
-
async loadConfiguration(): Promise<void> {
|
|
60
|
-
try {
|
|
61
|
-
const configData = await fs.readFile(this.configPath, 'utf-8');
|
|
62
|
-
const configs: MCPServerConfig[] = JSON.parse(configData);
|
|
63
|
-
|
|
64
|
-
for (const config of configs) {
|
|
65
|
-
this.servers.set(config.name, {
|
|
66
|
-
name: config.name,
|
|
67
|
-
script: config.script,
|
|
68
|
-
port: config.port,
|
|
69
|
-
host: config.host,
|
|
70
|
-
status: 'stopped'
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
} catch (error) {
|
|
74
|
-
// No configuration file exists yet, create default
|
|
75
|
-
await this.createDefaultConfiguration();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Create default MCP server configuration
|
|
81
|
-
*/
|
|
82
|
-
async createDefaultConfiguration(): Promise<void> {
|
|
83
|
-
const defaultServers: MCPServerConfig[] = [
|
|
84
|
-
{
|
|
85
|
-
name: 'ServiceNow Deployment MCP',
|
|
86
|
-
script: 'dist/mcp/servicenow-deployment-mcp.js',
|
|
87
|
-
autoStart: true,
|
|
88
|
-
env: {
|
|
89
|
-
'SNOW_INSTANCE': process.env.SNOW_INSTANCE || '',
|
|
90
|
-
'SNOW_CLIENT_ID': process.env.SNOW_CLIENT_ID || '',
|
|
91
|
-
'SNOW_CLIENT_SECRET': process.env.SNOW_CLIENT_SECRET || ''
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
name: 'ServiceNow Update Set MCP',
|
|
96
|
-
script: 'dist/mcp/servicenow-update-set-mcp.js',
|
|
97
|
-
autoStart: true
|
|
98
|
-
},
|
|
99
|
-
{
|
|
100
|
-
name: 'ServiceNow Intelligent MCP',
|
|
101
|
-
script: 'dist/mcp/servicenow-intelligent-mcp.js',
|
|
102
|
-
autoStart: true
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
name: 'ServiceNow Graph Memory MCP',
|
|
106
|
-
script: 'dist/mcp/servicenow-graph-memory-mcp.js',
|
|
107
|
-
autoStart: true,
|
|
108
|
-
env: {
|
|
109
|
-
'NEO4J_URI': process.env.NEO4J_URI || '',
|
|
110
|
-
'NEO4J_USER': process.env.NEO4J_USER || '',
|
|
111
|
-
'NEO4J_PASSWORD': process.env.NEO4J_PASSWORD || ''
|
|
112
|
-
}
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
name: 'ServiceNow Operations MCP',
|
|
116
|
-
script: 'dist/mcp/servicenow-operations-mcp.js',
|
|
117
|
-
autoStart: true
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
name: 'ServiceNow Platform Development MCP',
|
|
121
|
-
script: 'dist/mcp/servicenow-platform-development-mcp.js',
|
|
122
|
-
autoStart: true
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
name: 'ServiceNow Integration MCP',
|
|
126
|
-
script: 'dist/mcp/servicenow-integration-mcp.js',
|
|
127
|
-
autoStart: true
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
name: 'ServiceNow Automation MCP',
|
|
131
|
-
script: 'dist/mcp/servicenow-automation-mcp.js',
|
|
132
|
-
autoStart: true
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
name: 'ServiceNow Security & Compliance MCP',
|
|
136
|
-
script: 'dist/mcp/servicenow-security-compliance-mcp.js',
|
|
137
|
-
autoStart: true
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
name: 'ServiceNow Reporting & Analytics MCP',
|
|
141
|
-
script: 'dist/mcp/servicenow-reporting-analytics-mcp.js',
|
|
142
|
-
autoStart: true
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
name: 'ServiceNow Memory MCP',
|
|
146
|
-
script: 'dist/mcp/servicenow-memory-mcp.js',
|
|
147
|
-
autoStart: true
|
|
148
|
-
}
|
|
149
|
-
];
|
|
150
|
-
|
|
151
|
-
await this.saveConfiguration(defaultServers);
|
|
152
|
-
|
|
153
|
-
// Initialize server entries
|
|
154
|
-
for (const config of defaultServers) {
|
|
155
|
-
this.servers.set(config.name, {
|
|
156
|
-
name: config.name,
|
|
157
|
-
script: config.script,
|
|
158
|
-
port: config.port,
|
|
159
|
-
host: config.host,
|
|
160
|
-
status: 'stopped'
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Save MCP server configuration
|
|
167
|
-
*/
|
|
168
|
-
async saveConfiguration(configs: MCPServerConfig[]): Promise<void> {
|
|
169
|
-
await fs.writeFile(this.configPath, JSON.stringify(configs, null, 2));
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/**
|
|
173
|
-
* Start a specific MCP server
|
|
174
|
-
*/
|
|
175
|
-
async startServer(name: string): Promise<boolean> {
|
|
176
|
-
const server = this.servers.get(name);
|
|
177
|
-
if (!server) {
|
|
178
|
-
throw new Error(`Server '${name}' not found`);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (server.status === 'running') {
|
|
182
|
-
return true; // Already running
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
server.status = 'starting';
|
|
186
|
-
this.emit('serverStarting', name);
|
|
187
|
-
|
|
188
|
-
try {
|
|
189
|
-
// Determine script path based on installation type
|
|
190
|
-
let scriptPath = server.script;
|
|
191
|
-
|
|
192
|
-
// If script is a relative path, resolve it
|
|
193
|
-
if (!scriptPath.startsWith('/')) {
|
|
194
|
-
// Check if we're in a global npm installation
|
|
195
|
-
const isGlobalInstall = __dirname.includes('node_modules/snow-flow');
|
|
196
|
-
|
|
197
|
-
if (isGlobalInstall) {
|
|
198
|
-
// For global installs, use the absolute path from __dirname
|
|
199
|
-
const packageRoot = __dirname.split('node_modules/snow-flow')[0] + 'node_modules/snow-flow';
|
|
200
|
-
scriptPath = join(packageRoot, server.script);
|
|
201
|
-
} else {
|
|
202
|
-
// For local development, use process.cwd()
|
|
203
|
-
scriptPath = join(process.cwd(), server.script);
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Check if script exists
|
|
208
|
-
await fs.access(scriptPath);
|
|
209
|
-
|
|
210
|
-
// Bridge OAuth tokens to MCP servers
|
|
211
|
-
await unifiedAuthStore.bridgeToMCP();
|
|
212
|
-
|
|
213
|
-
// Get current tokens for the MCP server
|
|
214
|
-
const tokens = await unifiedAuthStore.getTokens();
|
|
215
|
-
const authEnv: Record<string, string> = {};
|
|
216
|
-
|
|
217
|
-
if (tokens) {
|
|
218
|
-
authEnv.SNOW_OAUTH_TOKENS = JSON.stringify(tokens);
|
|
219
|
-
authEnv.SNOW_INSTANCE = tokens.instance;
|
|
220
|
-
authEnv.SNOW_CLIENT_ID = tokens.clientId;
|
|
221
|
-
authEnv.SNOW_CLIENT_SECRET = tokens.clientSecret;
|
|
222
|
-
|
|
223
|
-
if (tokens.accessToken) {
|
|
224
|
-
authEnv.SNOW_ACCESS_TOKEN = tokens.accessToken;
|
|
225
|
-
}
|
|
226
|
-
if (tokens.refreshToken) {
|
|
227
|
-
authEnv.SNOW_REFRESH_TOKEN = tokens.refreshToken;
|
|
228
|
-
}
|
|
229
|
-
if (tokens.expiresAt) {
|
|
230
|
-
authEnv.SNOW_TOKEN_EXPIRES_AT = tokens.expiresAt;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Start the process with OAuth tokens
|
|
235
|
-
const childProcess = spawn('node', [scriptPath], {
|
|
236
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
237
|
-
detached: true,
|
|
238
|
-
env: {
|
|
239
|
-
...process.env,
|
|
240
|
-
...authEnv
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
// Set up logging
|
|
245
|
-
const logFile = join(this.logPath, `${name.replace(/\\s+/g, '_').toLowerCase()}.log`);
|
|
246
|
-
const logStream = await fs.open(logFile, 'a');
|
|
247
|
-
|
|
248
|
-
childProcess.stdout?.on('data', (data: any) => {
|
|
249
|
-
logStream.write(`[${new Date().toISOString()}] STDOUT: ${data}`);
|
|
250
|
-
});
|
|
251
|
-
|
|
252
|
-
childProcess.stderr?.on('data', (data: any) => {
|
|
253
|
-
logStream.write(`[${new Date().toISOString()}] STDERR: ${data}`);
|
|
254
|
-
server.lastError = data.toString();
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
childProcess.on('exit', (code: any) => {
|
|
258
|
-
logStream.write(`[${new Date().toISOString()}] Process exited with code: ${code}\\n`);
|
|
259
|
-
logStream.close();
|
|
260
|
-
server.status = code === 0 ? 'stopped' : 'error';
|
|
261
|
-
server.process = undefined;
|
|
262
|
-
server.pid = undefined;
|
|
263
|
-
this.emit('serverStopped', name, code);
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
childProcess.on('error', (error: any) => {
|
|
267
|
-
server.status = 'error';
|
|
268
|
-
server.lastError = error.message;
|
|
269
|
-
server.process = undefined;
|
|
270
|
-
server.pid = undefined;
|
|
271
|
-
this.emit('serverError', name, error);
|
|
272
|
-
});
|
|
273
|
-
|
|
274
|
-
// Update server info
|
|
275
|
-
server.process = childProcess;
|
|
276
|
-
server.pid = childProcess.pid;
|
|
277
|
-
server.status = 'running';
|
|
278
|
-
server.startedAt = new Date();
|
|
279
|
-
server.lastError = undefined;
|
|
280
|
-
|
|
281
|
-
// Detach process so it runs independently
|
|
282
|
-
childProcess.unref();
|
|
283
|
-
|
|
284
|
-
this.emit('serverStarted', name, childProcess.pid);
|
|
285
|
-
return true;
|
|
286
|
-
|
|
287
|
-
} catch (error) {
|
|
288
|
-
server.status = 'error';
|
|
289
|
-
server.lastError = error instanceof Error ? error.message : String(error);
|
|
290
|
-
this.emit('serverError', name, error);
|
|
291
|
-
return false;
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Stop a specific MCP server
|
|
297
|
-
*/
|
|
298
|
-
async stopServer(name: string): Promise<boolean> {
|
|
299
|
-
const server = this.servers.get(name);
|
|
300
|
-
if (!server || !server.process) {
|
|
301
|
-
return true; // Already stopped
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
try {
|
|
305
|
-
// Try graceful shutdown first
|
|
306
|
-
server.process.kill('SIGTERM');
|
|
307
|
-
|
|
308
|
-
// Wait for graceful shutdown
|
|
309
|
-
await new Promise((resolve) => {
|
|
310
|
-
const timeout = setTimeout(() => {
|
|
311
|
-
// Force kill if graceful shutdown fails
|
|
312
|
-
if (server.process) {
|
|
313
|
-
server.process.kill('SIGKILL');
|
|
314
|
-
}
|
|
315
|
-
resolve(undefined);
|
|
316
|
-
}, 5000);
|
|
317
|
-
|
|
318
|
-
server.process?.on('exit', () => {
|
|
319
|
-
clearTimeout(timeout);
|
|
320
|
-
resolve(undefined);
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
server.status = 'stopped';
|
|
325
|
-
server.process = undefined;
|
|
326
|
-
server.pid = undefined;
|
|
327
|
-
|
|
328
|
-
this.emit('serverStopped', name, 0);
|
|
329
|
-
return true;
|
|
330
|
-
|
|
331
|
-
} catch (error) {
|
|
332
|
-
server.lastError = error instanceof Error ? error.message : String(error);
|
|
333
|
-
this.emit('serverError', name, error);
|
|
334
|
-
return false;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Start all configured MCP servers
|
|
340
|
-
*/
|
|
341
|
-
async startAllServers(): Promise<void> {
|
|
342
|
-
const promises = Array.from(this.servers.keys()).map(name =>
|
|
343
|
-
this.startServer(name).catch(error => {
|
|
344
|
-
console.error(`Failed to start server '${name}':`, error);
|
|
345
|
-
return false;
|
|
346
|
-
})
|
|
347
|
-
);
|
|
348
|
-
|
|
349
|
-
await Promise.all(promises);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/**
|
|
353
|
-
* Stop all running MCP servers
|
|
354
|
-
*/
|
|
355
|
-
async stopAllServers(): Promise<void> {
|
|
356
|
-
const promises = Array.from(this.servers.keys()).map(name =>
|
|
357
|
-
this.stopServer(name).catch(error => {
|
|
358
|
-
console.error(`Failed to stop server '${name}':`, error);
|
|
359
|
-
return false;
|
|
360
|
-
})
|
|
361
|
-
);
|
|
362
|
-
|
|
363
|
-
await Promise.all(promises);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
/**
|
|
367
|
-
* Get status of all servers
|
|
368
|
-
*/
|
|
369
|
-
getServerStatus(): MCPServer[] {
|
|
370
|
-
return Array.from(this.servers.values());
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
/**
|
|
374
|
-
* Get status of a specific server
|
|
375
|
-
*/
|
|
376
|
-
getServer(name: string): MCPServer | undefined {
|
|
377
|
-
return this.servers.get(name);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
* Check if all servers are running
|
|
382
|
-
*/
|
|
383
|
-
areAllServersRunning(): boolean {
|
|
384
|
-
return Array.from(this.servers.values()).every(server => server.status === 'running');
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/**
|
|
388
|
-
* Get running servers count
|
|
389
|
-
*/
|
|
390
|
-
getRunningServersCount(): number {
|
|
391
|
-
return Array.from(this.servers.values()).filter(server => server.status === 'running').length;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
/**
|
|
395
|
-
* Add a new server configuration
|
|
396
|
-
*/
|
|
397
|
-
async addServer(config: MCPServerConfig): Promise<void> {
|
|
398
|
-
this.servers.set(config.name, {
|
|
399
|
-
name: config.name,
|
|
400
|
-
script: config.script,
|
|
401
|
-
port: config.port,
|
|
402
|
-
host: config.host,
|
|
403
|
-
status: 'stopped'
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
// Save updated configuration
|
|
407
|
-
const configs = Array.from(this.servers.values()).map(server => ({
|
|
408
|
-
name: server.name,
|
|
409
|
-
script: server.script,
|
|
410
|
-
port: server.port,
|
|
411
|
-
host: server.host,
|
|
412
|
-
autoStart: true
|
|
413
|
-
}));
|
|
414
|
-
|
|
415
|
-
await this.saveConfiguration(configs);
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
/**
|
|
419
|
-
* Remove a server configuration
|
|
420
|
-
*/
|
|
421
|
-
async removeServer(name: string): Promise<void> {
|
|
422
|
-
// Stop server first if running
|
|
423
|
-
await this.stopServer(name);
|
|
424
|
-
|
|
425
|
-
// Remove from memory
|
|
426
|
-
this.servers.delete(name);
|
|
427
|
-
|
|
428
|
-
// Save updated configuration
|
|
429
|
-
const configs = Array.from(this.servers.values()).map(server => ({
|
|
430
|
-
name: server.name,
|
|
431
|
-
script: server.script,
|
|
432
|
-
port: server.port,
|
|
433
|
-
host: server.host,
|
|
434
|
-
autoStart: true
|
|
435
|
-
}));
|
|
436
|
-
|
|
437
|
-
await this.saveConfiguration(configs);
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* Cleanup - stop all servers and clean up resources
|
|
442
|
-
*/
|
|
443
|
-
async cleanup(): Promise<void> {
|
|
444
|
-
await this.stopAllServers();
|
|
445
|
-
}
|
|
446
|
-
}
|