claude-flow 3.0.0-alpha.10 → 3.0.0-alpha.12

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 (243) hide show
  1. package/README.md +41 -1151
  2. package/bin/cli.js +30 -8
  3. package/dist/index.d.ts +40 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +43 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +52 -12
  8. package/dist/src/commands/agent.d.ts +0 -8
  9. package/dist/src/commands/agent.d.ts.map +0 -1
  10. package/dist/src/commands/agent.js +0 -819
  11. package/dist/src/commands/agent.js.map +0 -1
  12. package/dist/src/commands/config.d.ts +0 -8
  13. package/dist/src/commands/config.d.ts.map +0 -1
  14. package/dist/src/commands/config.js +0 -406
  15. package/dist/src/commands/config.js.map +0 -1
  16. package/dist/src/commands/daemon.d.ts +0 -8
  17. package/dist/src/commands/daemon.d.ts.map +0 -1
  18. package/dist/src/commands/daemon.js +0 -545
  19. package/dist/src/commands/daemon.js.map +0 -1
  20. package/dist/src/commands/hive-mind.d.ts +0 -8
  21. package/dist/src/commands/hive-mind.d.ts.map +0 -1
  22. package/dist/src/commands/hive-mind.js +0 -844
  23. package/dist/src/commands/hive-mind.js.map +0 -1
  24. package/dist/src/commands/hooks.d.ts +0 -8
  25. package/dist/src/commands/hooks.d.ts.map +0 -1
  26. package/dist/src/commands/hooks.js +0 -2098
  27. package/dist/src/commands/hooks.js.map +0 -1
  28. package/dist/src/commands/index.d.ts +0 -52
  29. package/dist/src/commands/index.d.ts.map +0 -1
  30. package/dist/src/commands/index.js +0 -108
  31. package/dist/src/commands/index.js.map +0 -1
  32. package/dist/src/commands/init.d.ts +0 -8
  33. package/dist/src/commands/init.d.ts.map +0 -1
  34. package/dist/src/commands/init.js +0 -532
  35. package/dist/src/commands/init.js.map +0 -1
  36. package/dist/src/commands/mcp.d.ts +0 -11
  37. package/dist/src/commands/mcp.d.ts.map +0 -1
  38. package/dist/src/commands/mcp.js +0 -662
  39. package/dist/src/commands/mcp.js.map +0 -1
  40. package/dist/src/commands/memory.d.ts +0 -8
  41. package/dist/src/commands/memory.d.ts.map +0 -1
  42. package/dist/src/commands/memory.js +0 -977
  43. package/dist/src/commands/memory.js.map +0 -1
  44. package/dist/src/commands/migrate.d.ts +0 -8
  45. package/dist/src/commands/migrate.d.ts.map +0 -1
  46. package/dist/src/commands/migrate.js +0 -398
  47. package/dist/src/commands/migrate.js.map +0 -1
  48. package/dist/src/commands/process.d.ts +0 -10
  49. package/dist/src/commands/process.d.ts.map +0 -1
  50. package/dist/src/commands/process.js +0 -641
  51. package/dist/src/commands/process.js.map +0 -1
  52. package/dist/src/commands/session.d.ts +0 -8
  53. package/dist/src/commands/session.d.ts.map +0 -1
  54. package/dist/src/commands/session.js +0 -750
  55. package/dist/src/commands/session.js.map +0 -1
  56. package/dist/src/commands/start.d.ts +0 -8
  57. package/dist/src/commands/start.d.ts.map +0 -1
  58. package/dist/src/commands/start.js +0 -398
  59. package/dist/src/commands/start.js.map +0 -1
  60. package/dist/src/commands/status.d.ts +0 -8
  61. package/dist/src/commands/status.d.ts.map +0 -1
  62. package/dist/src/commands/status.js +0 -584
  63. package/dist/src/commands/status.js.map +0 -1
  64. package/dist/src/commands/swarm.d.ts +0 -8
  65. package/dist/src/commands/swarm.d.ts.map +0 -1
  66. package/dist/src/commands/swarm.js +0 -573
  67. package/dist/src/commands/swarm.js.map +0 -1
  68. package/dist/src/commands/task.d.ts +0 -8
  69. package/dist/src/commands/task.d.ts.map +0 -1
  70. package/dist/src/commands/task.js +0 -671
  71. package/dist/src/commands/task.js.map +0 -1
  72. package/dist/src/commands/workflow.d.ts +0 -8
  73. package/dist/src/commands/workflow.d.ts.map +0 -1
  74. package/dist/src/commands/workflow.js +0 -617
  75. package/dist/src/commands/workflow.js.map +0 -1
  76. package/dist/src/config-adapter.d.ts +0 -15
  77. package/dist/src/config-adapter.d.ts.map +0 -1
  78. package/dist/src/config-adapter.js +0 -185
  79. package/dist/src/config-adapter.js.map +0 -1
  80. package/dist/src/index.d.ts +0 -55
  81. package/dist/src/index.d.ts.map +0 -1
  82. package/dist/src/index.js +0 -353
  83. package/dist/src/index.js.map +0 -1
  84. package/dist/src/infrastructure/in-memory-repositories.d.ts +0 -68
  85. package/dist/src/infrastructure/in-memory-repositories.d.ts.map +0 -1
  86. package/dist/src/infrastructure/in-memory-repositories.js +0 -264
  87. package/dist/src/infrastructure/in-memory-repositories.js.map +0 -1
  88. package/dist/src/init/claudemd-generator.d.ts +0 -15
  89. package/dist/src/init/claudemd-generator.d.ts.map +0 -1
  90. package/dist/src/init/claudemd-generator.js +0 -626
  91. package/dist/src/init/claudemd-generator.js.map +0 -1
  92. package/dist/src/init/executor.d.ts +0 -11
  93. package/dist/src/init/executor.d.ts.map +0 -1
  94. package/dist/src/init/executor.js +0 -652
  95. package/dist/src/init/executor.js.map +0 -1
  96. package/dist/src/init/helpers-generator.d.ts +0 -42
  97. package/dist/src/init/helpers-generator.d.ts.map +0 -1
  98. package/dist/src/init/helpers-generator.js +0 -613
  99. package/dist/src/init/helpers-generator.js.map +0 -1
  100. package/dist/src/init/index.d.ts +0 -12
  101. package/dist/src/init/index.d.ts.map +0 -1
  102. package/dist/src/init/index.js +0 -15
  103. package/dist/src/init/index.js.map +0 -1
  104. package/dist/src/init/mcp-generator.d.ts +0 -18
  105. package/dist/src/init/mcp-generator.d.ts.map +0 -1
  106. package/dist/src/init/mcp-generator.js +0 -71
  107. package/dist/src/init/mcp-generator.js.map +0 -1
  108. package/dist/src/init/settings-generator.d.ts +0 -14
  109. package/dist/src/init/settings-generator.d.ts.map +0 -1
  110. package/dist/src/init/settings-generator.js +0 -267
  111. package/dist/src/init/settings-generator.js.map +0 -1
  112. package/dist/src/init/statusline-generator.d.ts +0 -14
  113. package/dist/src/init/statusline-generator.d.ts.map +0 -1
  114. package/dist/src/init/statusline-generator.js +0 -206
  115. package/dist/src/init/statusline-generator.js.map +0 -1
  116. package/dist/src/init/types.d.ts +0 -240
  117. package/dist/src/init/types.d.ts.map +0 -1
  118. package/dist/src/init/types.js +0 -210
  119. package/dist/src/init/types.js.map +0 -1
  120. package/dist/src/mcp-client.d.ts +0 -92
  121. package/dist/src/mcp-client.d.ts.map +0 -1
  122. package/dist/src/mcp-client.js +0 -203
  123. package/dist/src/mcp-client.js.map +0 -1
  124. package/dist/src/mcp-server.d.ts +0 -153
  125. package/dist/src/mcp-server.d.ts.map +0 -1
  126. package/dist/src/mcp-server.js +0 -453
  127. package/dist/src/mcp-server.js.map +0 -1
  128. package/dist/src/mcp-tools/agent-tools.d.ts +0 -8
  129. package/dist/src/mcp-tools/agent-tools.d.ts.map +0 -1
  130. package/dist/src/mcp-tools/agent-tools.js +0 -426
  131. package/dist/src/mcp-tools/agent-tools.js.map +0 -1
  132. package/dist/src/mcp-tools/config-tools.d.ts +0 -8
  133. package/dist/src/mcp-tools/config-tools.d.ts.map +0 -1
  134. package/dist/src/mcp-tools/config-tools.js +0 -333
  135. package/dist/src/mcp-tools/config-tools.js.map +0 -1
  136. package/dist/src/mcp-tools/hive-mind-tools.d.ts +0 -8
  137. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +0 -1
  138. package/dist/src/mcp-tools/hive-mind-tools.js +0 -447
  139. package/dist/src/mcp-tools/hive-mind-tools.js.map +0 -1
  140. package/dist/src/mcp-tools/hooks-tools.d.ts +0 -41
  141. package/dist/src/mcp-tools/hooks-tools.d.ts.map +0 -1
  142. package/dist/src/mcp-tools/hooks-tools.js +0 -1711
  143. package/dist/src/mcp-tools/hooks-tools.js.map +0 -1
  144. package/dist/src/mcp-tools/index.d.ts +0 -16
  145. package/dist/src/mcp-tools/index.d.ts.map +0 -1
  146. package/dist/src/mcp-tools/index.js +0 -15
  147. package/dist/src/mcp-tools/index.js.map +0 -1
  148. package/dist/src/mcp-tools/memory-tools.d.ts +0 -8
  149. package/dist/src/mcp-tools/memory-tools.d.ts.map +0 -1
  150. package/dist/src/mcp-tools/memory-tools.js +0 -235
  151. package/dist/src/mcp-tools/memory-tools.js.map +0 -1
  152. package/dist/src/mcp-tools/session-tools.d.ts +0 -8
  153. package/dist/src/mcp-tools/session-tools.d.ts.map +0 -1
  154. package/dist/src/mcp-tools/session-tools.js +0 -315
  155. package/dist/src/mcp-tools/session-tools.js.map +0 -1
  156. package/dist/src/mcp-tools/swarm-tools.d.ts +0 -8
  157. package/dist/src/mcp-tools/swarm-tools.d.ts.map +0 -1
  158. package/dist/src/mcp-tools/swarm-tools.js +0 -102
  159. package/dist/src/mcp-tools/swarm-tools.js.map +0 -1
  160. package/dist/src/mcp-tools/task-tools.d.ts +0 -8
  161. package/dist/src/mcp-tools/task-tools.d.ts.map +0 -1
  162. package/dist/src/mcp-tools/task-tools.js +0 -302
  163. package/dist/src/mcp-tools/task-tools.js.map +0 -1
  164. package/dist/src/mcp-tools/types.d.ts +0 -31
  165. package/dist/src/mcp-tools/types.d.ts.map +0 -1
  166. package/dist/src/mcp-tools/types.js +0 -7
  167. package/dist/src/mcp-tools/types.js.map +0 -1
  168. package/dist/src/mcp-tools/workflow-tools.d.ts +0 -8
  169. package/dist/src/mcp-tools/workflow-tools.d.ts.map +0 -1
  170. package/dist/src/mcp-tools/workflow-tools.js +0 -481
  171. package/dist/src/mcp-tools/workflow-tools.js.map +0 -1
  172. package/dist/src/output.d.ts +0 -133
  173. package/dist/src/output.d.ts.map +0 -1
  174. package/dist/src/output.js +0 -513
  175. package/dist/src/output.js.map +0 -1
  176. package/dist/src/parser.d.ts +0 -41
  177. package/dist/src/parser.d.ts.map +0 -1
  178. package/dist/src/parser.js +0 -353
  179. package/dist/src/parser.js.map +0 -1
  180. package/dist/src/prompt.d.ts +0 -44
  181. package/dist/src/prompt.d.ts.map +0 -1
  182. package/dist/src/prompt.js +0 -501
  183. package/dist/src/prompt.js.map +0 -1
  184. package/dist/src/services/index.d.ts +0 -7
  185. package/dist/src/services/index.d.ts.map +0 -1
  186. package/dist/src/services/index.js +0 -6
  187. package/dist/src/services/index.js.map +0 -1
  188. package/dist/src/services/worker-daemon.d.ts +0 -153
  189. package/dist/src/services/worker-daemon.d.ts.map +0 -1
  190. package/dist/src/services/worker-daemon.js +0 -567
  191. package/dist/src/services/worker-daemon.js.map +0 -1
  192. package/dist/src/types.d.ts +0 -198
  193. package/dist/src/types.d.ts.map +0 -1
  194. package/dist/src/types.js +0 -38
  195. package/dist/src/types.js.map +0 -1
  196. package/dist/tsconfig.tsbuildinfo +0 -1
  197. package/src/commands/agent.ts +0 -955
  198. package/src/commands/config.ts +0 -452
  199. package/src/commands/daemon.ts +0 -621
  200. package/src/commands/hive-mind.ts +0 -928
  201. package/src/commands/hooks.ts +0 -2603
  202. package/src/commands/index.ts +0 -118
  203. package/src/commands/init.ts +0 -597
  204. package/src/commands/mcp.ts +0 -753
  205. package/src/commands/memory.ts +0 -1161
  206. package/src/commands/migrate.ts +0 -447
  207. package/src/commands/process.ts +0 -695
  208. package/src/commands/session.ts +0 -891
  209. package/src/commands/start.ts +0 -457
  210. package/src/commands/status.ts +0 -736
  211. package/src/commands/swarm.ts +0 -648
  212. package/src/commands/task.ts +0 -792
  213. package/src/commands/workflow.ts +0 -742
  214. package/src/config-adapter.ts +0 -210
  215. package/src/index.ts +0 -427
  216. package/src/infrastructure/in-memory-repositories.ts +0 -310
  217. package/src/init/claudemd-generator.ts +0 -631
  218. package/src/init/executor.ts +0 -762
  219. package/src/init/helpers-generator.ts +0 -628
  220. package/src/init/index.ts +0 -60
  221. package/src/init/mcp-generator.ts +0 -83
  222. package/src/init/settings-generator.ts +0 -284
  223. package/src/init/statusline-generator.ts +0 -211
  224. package/src/init/types.ts +0 -447
  225. package/src/mcp-client.ts +0 -241
  226. package/src/mcp-server.ts +0 -577
  227. package/src/mcp-tools/agent-tools.ts +0 -466
  228. package/src/mcp-tools/config-tools.ts +0 -370
  229. package/src/mcp-tools/hive-mind-tools.ts +0 -521
  230. package/src/mcp-tools/hooks-tools.ts +0 -1888
  231. package/src/mcp-tools/index.ts +0 -16
  232. package/src/mcp-tools/memory-tools.ts +0 -270
  233. package/src/mcp-tools/session-tools.ts +0 -359
  234. package/src/mcp-tools/swarm-tools.ts +0 -105
  235. package/src/mcp-tools/task-tools.ts +0 -347
  236. package/src/mcp-tools/types.ts +0 -33
  237. package/src/mcp-tools/workflow-tools.ts +0 -573
  238. package/src/output.ts +0 -639
  239. package/src/parser.ts +0 -417
  240. package/src/prompt.ts +0 -619
  241. package/src/services/index.ts +0 -15
  242. package/src/services/worker-daemon.ts +0 -726
  243. package/src/types.ts +0 -287
package/src/mcp-server.ts DELETED
@@ -1,577 +0,0 @@
1
- /**
2
- * V3 CLI MCP Server Management
3
- *
4
- * Provides server lifecycle management for MCP integration:
5
- * - Start/stop/status methods with process management
6
- * - Health check endpoint integration
7
- * - Graceful shutdown handling
8
- * - PID file management for daemon detection
9
- * - Event-based status monitoring
10
- *
11
- * Performance Targets:
12
- * - Server startup: <400ms
13
- * - Health check: <10ms
14
- * - Graceful shutdown: <5s
15
- *
16
- * @module @claude-flow/cli/mcp-server
17
- * @version 3.0.0
18
- */
19
-
20
- import { EventEmitter } from 'events';
21
- import { spawn, ChildProcess } from 'child_process';
22
- import { createServer, Server } from 'http';
23
- import * as path from 'path';
24
- import * as fs from 'fs';
25
- import * as os from 'os';
26
- import { fileURLToPath } from 'url';
27
- import { dirname } from 'path';
28
-
29
- // ESM-compatible __dirname
30
- const __filename = fileURLToPath(import.meta.url);
31
- const __dirname = dirname(__filename);
32
-
33
- /**
34
- * MCP Server configuration
35
- */
36
- export interface MCPServerOptions {
37
- transport?: 'stdio' | 'http' | 'websocket';
38
- host?: string;
39
- port?: number;
40
- pidFile?: string;
41
- logFile?: string;
42
- tools?: string[] | 'all';
43
- daemonize?: boolean;
44
- timeout?: number;
45
- }
46
-
47
- /**
48
- * MCP Server status
49
- */
50
- export interface MCPServerStatus {
51
- running: boolean;
52
- pid?: number;
53
- transport?: string;
54
- host?: string;
55
- port?: number;
56
- uptime?: number;
57
- tools?: number;
58
- startedAt?: string;
59
- health?: {
60
- healthy: boolean;
61
- error?: string;
62
- metrics?: Record<string, number>;
63
- };
64
- }
65
-
66
- /**
67
- * Default configuration
68
- */
69
- const DEFAULT_OPTIONS: Required<MCPServerOptions> = {
70
- transport: 'stdio',
71
- host: 'localhost',
72
- port: 3000,
73
- pidFile: path.join(os.tmpdir(), 'claude-flow-mcp.pid'),
74
- logFile: path.join(os.tmpdir(), 'claude-flow-mcp.log'),
75
- tools: 'all',
76
- daemonize: false,
77
- timeout: 30000,
78
- };
79
-
80
- /**
81
- * MCP Server Manager
82
- *
83
- * Manages the lifecycle of the MCP server process
84
- */
85
- export class MCPServerManager extends EventEmitter {
86
- private options: Required<MCPServerOptions>;
87
- private process?: ChildProcess;
88
- private server?: Server;
89
- private startTime?: Date;
90
- private healthCheckInterval?: NodeJS.Timeout;
91
-
92
- constructor(options: MCPServerOptions = {}) {
93
- super();
94
- this.options = { ...DEFAULT_OPTIONS, ...options };
95
- }
96
-
97
- /**
98
- * Start the MCP server
99
- */
100
- async start(): Promise<MCPServerStatus> {
101
- // Check if already running
102
- const status = await this.getStatus();
103
- if (status.running) {
104
- throw new Error(`MCP Server already running (PID: ${status.pid})`);
105
- }
106
-
107
- const startTime = performance.now();
108
- this.startTime = new Date();
109
-
110
- this.emit('starting', { options: this.options });
111
-
112
- try {
113
- if (this.options.transport === 'stdio') {
114
- // For stdio transport, spawn the server process
115
- await this.startStdioServer();
116
- } else {
117
- // For HTTP/WebSocket, start in-process server
118
- await this.startHttpServer();
119
- }
120
-
121
- const duration = performance.now() - startTime;
122
-
123
- // Write PID file
124
- await this.writePidFile();
125
-
126
- // Start health check monitoring
127
- this.startHealthMonitoring();
128
-
129
- const finalStatus = await this.getStatus();
130
-
131
- this.emit('started', {
132
- ...finalStatus,
133
- startupTime: duration,
134
- });
135
-
136
- return finalStatus;
137
- } catch (error) {
138
- this.emit('error', error);
139
- throw error;
140
- }
141
- }
142
-
143
- /**
144
- * Stop the MCP server
145
- */
146
- async stop(force = false): Promise<void> {
147
- const status = await this.getStatus();
148
-
149
- if (!status.running) {
150
- return;
151
- }
152
-
153
- this.emit('stopping', { force });
154
-
155
- try {
156
- // Stop health monitoring
157
- if (this.healthCheckInterval) {
158
- clearInterval(this.healthCheckInterval);
159
- this.healthCheckInterval = undefined;
160
- }
161
-
162
- if (this.process) {
163
- // Graceful shutdown
164
- if (!force) {
165
- this.process.kill('SIGTERM');
166
- await this.waitForExit(5000);
167
- }
168
-
169
- // Force kill if still running
170
- if (this.process && !this.process.killed) {
171
- this.process.kill('SIGKILL');
172
- }
173
-
174
- this.process = undefined;
175
- }
176
-
177
- if (this.server) {
178
- await new Promise<void>((resolve) => {
179
- this.server!.close(() => resolve());
180
- });
181
- this.server = undefined;
182
- }
183
-
184
- // Remove PID file
185
- await this.removePidFile();
186
-
187
- this.startTime = undefined;
188
- this.emit('stopped');
189
- } catch (error) {
190
- this.emit('error', error);
191
- throw error;
192
- }
193
- }
194
-
195
- /**
196
- * Get server status
197
- */
198
- async getStatus(): Promise<MCPServerStatus> {
199
- // Check PID file
200
- const pid = await this.readPidFile();
201
-
202
- if (!pid) {
203
- return { running: false };
204
- }
205
-
206
- // Check if process is running
207
- const isRunning = this.isProcessRunning(pid);
208
-
209
- if (!isRunning) {
210
- // Clean up stale PID file
211
- await this.removePidFile();
212
- return { running: false };
213
- }
214
-
215
- // Build status
216
- const status: MCPServerStatus = {
217
- running: true,
218
- pid,
219
- transport: this.options.transport,
220
- host: this.options.host,
221
- port: this.options.port,
222
- startedAt: this.startTime?.toISOString(),
223
- uptime: this.startTime
224
- ? Math.floor((Date.now() - this.startTime.getTime()) / 1000)
225
- : undefined,
226
- };
227
-
228
- // Get health status for HTTP transport
229
- if (this.options.transport !== 'stdio') {
230
- status.health = await this.checkHealth();
231
- }
232
-
233
- return status;
234
- }
235
-
236
- /**
237
- * Check server health
238
- */
239
- async checkHealth(): Promise<{
240
- healthy: boolean;
241
- error?: string;
242
- metrics?: Record<string, number>;
243
- }> {
244
- if (this.options.transport === 'stdio') {
245
- // For stdio, just check if process is running
246
- const pid = await this.readPidFile();
247
- return {
248
- healthy: pid !== null && this.isProcessRunning(pid),
249
- };
250
- }
251
-
252
- // For HTTP/WebSocket, make health check request
253
- try {
254
- const response = await this.httpRequest(
255
- `http://${this.options.host}:${this.options.port}/health`,
256
- 'GET',
257
- this.options.timeout
258
- );
259
-
260
- return {
261
- healthy: response.status === 'ok',
262
- metrics: {
263
- connections: response.connections || 0,
264
- },
265
- };
266
- } catch (error) {
267
- return {
268
- healthy: false,
269
- error: error instanceof Error ? error.message : 'Unknown error',
270
- };
271
- }
272
- }
273
-
274
- /**
275
- * Restart the server
276
- */
277
- async restart(): Promise<MCPServerStatus> {
278
- await this.stop();
279
- return await this.start();
280
- }
281
-
282
- /**
283
- * Start stdio server process
284
- */
285
- private async startStdioServer(): Promise<void> {
286
- // Resolve server script path relative to this file
287
- const serverScript = path.resolve(
288
- __dirname,
289
- '../../../mcp/server-entry.ts'
290
- );
291
-
292
- // Check if tsx is available
293
- const command = 'npx';
294
- const args = [
295
- 'tsx',
296
- serverScript,
297
- '--transport', this.options.transport,
298
- '--host', this.options.host,
299
- '--port', String(this.options.port),
300
- ];
301
-
302
- if (this.options.tools !== 'all') {
303
- args.push('--tools', this.options.tools.join(','));
304
- }
305
-
306
- this.process = spawn(command, args, {
307
- stdio: this.options.daemonize ? 'ignore' : ['pipe', 'pipe', 'pipe'],
308
- detached: this.options.daemonize,
309
- env: {
310
- ...process.env,
311
- NODE_ENV: process.env.NODE_ENV || 'production',
312
- MCP_SERVER_MODE: 'true',
313
- },
314
- });
315
-
316
- if (this.options.daemonize) {
317
- this.process.unref();
318
- }
319
-
320
- // Handle process events
321
- this.process.on('error', (error) => {
322
- this.emit('error', error);
323
- });
324
-
325
- this.process.on('exit', (code, signal) => {
326
- this.emit('exit', { code, signal });
327
- this.process = undefined;
328
- });
329
-
330
- // Wait for server to be ready
331
- await this.waitForReady();
332
- }
333
-
334
- /**
335
- * Start HTTP server in-process
336
- */
337
- private async startHttpServer(): Promise<void> {
338
- // Dynamically import the MCP server
339
- // Note: Path is relative to the compiled output location
340
- const mcpServerPath = path.resolve(__dirname, '../../../mcp/server.js');
341
- const { MCPServer, createMCPServer } = await import(mcpServerPath);
342
-
343
- const logger = {
344
- debug: (msg: string, data?: unknown) => this.emit('log', { level: 'debug', msg, data }),
345
- info: (msg: string, data?: unknown) => this.emit('log', { level: 'info', msg, data }),
346
- warn: (msg: string, data?: unknown) => this.emit('log', { level: 'warn', msg, data }),
347
- error: (msg: string, data?: unknown) => this.emit('log', { level: 'error', msg, data }),
348
- };
349
-
350
- const mcpServer = createMCPServer(
351
- {
352
- name: 'Claude-Flow MCP Server V3',
353
- version: '3.0.0',
354
- transport: this.options.transport as 'http' | 'websocket',
355
- host: this.options.host,
356
- port: this.options.port,
357
- enableMetrics: true,
358
- enableCaching: true,
359
- },
360
- logger
361
- );
362
-
363
- await mcpServer.start();
364
-
365
- // Store reference for stopping
366
- (this as any)._mcpServer = mcpServer;
367
- }
368
-
369
- /**
370
- * Wait for server to be ready
371
- */
372
- private async waitForReady(timeout = 10000): Promise<void> {
373
- const startTime = Date.now();
374
-
375
- while (Date.now() - startTime < timeout) {
376
- const health = await this.checkHealth();
377
- if (health.healthy) {
378
- return;
379
- }
380
- await this.sleep(100);
381
- }
382
-
383
- // For stdio, just check if process is running
384
- if (this.options.transport === 'stdio' && this.process && !this.process.killed) {
385
- return;
386
- }
387
-
388
- throw new Error('Server failed to start within timeout');
389
- }
390
-
391
- /**
392
- * Wait for process to exit
393
- */
394
- private async waitForExit(timeout: number): Promise<void> {
395
- if (!this.process) return;
396
-
397
- return new Promise((resolve) => {
398
- const timer = setTimeout(() => {
399
- resolve();
400
- }, timeout);
401
-
402
- this.process!.once('exit', () => {
403
- clearTimeout(timer);
404
- resolve();
405
- });
406
- });
407
- }
408
-
409
- /**
410
- * Start health monitoring
411
- */
412
- private startHealthMonitoring(): void {
413
- this.healthCheckInterval = setInterval(async () => {
414
- try {
415
- const health = await this.checkHealth();
416
- this.emit('health', health);
417
-
418
- if (!health.healthy) {
419
- this.emit('unhealthy', health);
420
- }
421
- } catch (error) {
422
- this.emit('health-error', error);
423
- }
424
- }, 30000);
425
- }
426
-
427
- /**
428
- * Write PID file
429
- */
430
- private async writePidFile(): Promise<void> {
431
- const pid = this.process?.pid || process.pid;
432
- await fs.promises.writeFile(this.options.pidFile, String(pid), 'utf8');
433
- }
434
-
435
- /**
436
- * Read PID file
437
- */
438
- private async readPidFile(): Promise<number | null> {
439
- try {
440
- const content = await fs.promises.readFile(this.options.pidFile, 'utf8');
441
- const pid = parseInt(content.trim(), 10);
442
- return isNaN(pid) ? null : pid;
443
- } catch {
444
- return null;
445
- }
446
- }
447
-
448
- /**
449
- * Remove PID file
450
- */
451
- private async removePidFile(): Promise<void> {
452
- try {
453
- await fs.promises.unlink(this.options.pidFile);
454
- } catch {
455
- // Ignore errors
456
- }
457
- }
458
-
459
- /**
460
- * Check if process is running
461
- */
462
- private isProcessRunning(pid: number): boolean {
463
- try {
464
- process.kill(pid, 0);
465
- return true;
466
- } catch {
467
- return false;
468
- }
469
- }
470
-
471
- /**
472
- * Make HTTP request
473
- */
474
- private async httpRequest(
475
- url: string,
476
- method: string,
477
- timeout: number
478
- ): Promise<any> {
479
- return new Promise((resolve, reject) => {
480
- const urlObj = new URL(url);
481
- const http = require('http');
482
-
483
- const req = http.request(
484
- {
485
- hostname: urlObj.hostname,
486
- port: urlObj.port,
487
- path: urlObj.pathname,
488
- method,
489
- timeout,
490
- },
491
- (res: any) => {
492
- let data = '';
493
- res.on('data', (chunk: string) => {
494
- data += chunk;
495
- });
496
- res.on('end', () => {
497
- try {
498
- resolve(JSON.parse(data));
499
- } catch {
500
- resolve({ status: res.statusCode === 200 ? 'ok' : 'error' });
501
- }
502
- });
503
- }
504
- );
505
-
506
- req.on('error', reject);
507
- req.on('timeout', () => {
508
- req.destroy();
509
- reject(new Error('Request timeout'));
510
- });
511
-
512
- req.end();
513
- });
514
- }
515
-
516
- /**
517
- * Sleep utility
518
- */
519
- private sleep(ms: number): Promise<void> {
520
- return new Promise((resolve) => setTimeout(resolve, ms));
521
- }
522
- }
523
-
524
- /**
525
- * Create MCP server manager
526
- */
527
- export function createMCPServerManager(
528
- options?: MCPServerOptions
529
- ): MCPServerManager {
530
- return new MCPServerManager(options);
531
- }
532
-
533
- /**
534
- * Singleton server manager instance
535
- */
536
- let serverManager: MCPServerManager | null = null;
537
-
538
- /**
539
- * Get or create server manager singleton
540
- */
541
- export function getServerManager(
542
- options?: MCPServerOptions
543
- ): MCPServerManager {
544
- if (!serverManager) {
545
- serverManager = new MCPServerManager(options);
546
- }
547
- return serverManager;
548
- }
549
-
550
- /**
551
- * Quick start MCP server
552
- */
553
- export async function startMCPServer(
554
- options?: MCPServerOptions
555
- ): Promise<MCPServerStatus> {
556
- const manager = getServerManager(options);
557
- return await manager.start();
558
- }
559
-
560
- /**
561
- * Quick stop MCP server
562
- */
563
- export async function stopMCPServer(force = false): Promise<void> {
564
- if (serverManager) {
565
- await serverManager.stop(force);
566
- }
567
- }
568
-
569
- /**
570
- * Get MCP server status
571
- */
572
- export async function getMCPServerStatus(): Promise<MCPServerStatus> {
573
- const manager = getServerManager();
574
- return await manager.getStatus();
575
- }
576
-
577
- export default MCPServerManager;