moflo 4.8.19 → 4.8.20

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 (241) hide show
  1. package/.claude/guidance/shipped/moflo.md +45 -0
  2. package/.claude/helpers/statusline.cjs +1 -1
  3. package/.claude/workflow-state.json +9 -0
  4. package/package.json +2 -2
  5. package/src/@claude-flow/cli/dist/src/init/statusline-generator.js +1 -1
  6. package/src/@claude-flow/cli/dist/src/services/agentic-flow-bridge.js +5 -3
  7. package/src/@claude-flow/cli/package.json +1 -1
  8. package/src/@claude-flow/memory/dist/agent-memory-scope.d.ts +131 -0
  9. package/src/@claude-flow/memory/dist/agent-memory-scope.js +223 -0
  10. package/src/@claude-flow/memory/dist/agent-memory-scope.test.d.ts +8 -0
  11. package/src/@claude-flow/memory/dist/agent-memory-scope.test.js +466 -0
  12. package/src/@claude-flow/memory/dist/agentdb-adapter.d.ts +165 -0
  13. package/src/@claude-flow/memory/dist/agentdb-adapter.js +806 -0
  14. package/src/@claude-flow/memory/dist/agentdb-backend.d.ts +212 -0
  15. package/src/@claude-flow/memory/dist/agentdb-backend.js +842 -0
  16. package/src/@claude-flow/memory/dist/agentdb-backend.test.d.ts +7 -0
  17. package/src/@claude-flow/memory/dist/agentdb-backend.test.js +258 -0
  18. package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.d.ts +65 -0
  19. package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.js +129 -0
  20. package/src/@claude-flow/memory/dist/application/commands/store-memory.command.d.ts +48 -0
  21. package/src/@claude-flow/memory/dist/application/commands/store-memory.command.js +72 -0
  22. package/src/@claude-flow/memory/dist/application/index.d.ts +12 -0
  23. package/src/@claude-flow/memory/dist/application/index.js +15 -0
  24. package/src/@claude-flow/memory/dist/application/queries/search-memory.query.d.ts +72 -0
  25. package/src/@claude-flow/memory/dist/application/queries/search-memory.query.js +143 -0
  26. package/src/@claude-flow/memory/dist/application/services/memory-application-service.d.ts +121 -0
  27. package/src/@claude-flow/memory/dist/application/services/memory-application-service.js +190 -0
  28. package/src/@claude-flow/memory/dist/auto-memory-bridge.d.ts +226 -0
  29. package/src/@claude-flow/memory/dist/auto-memory-bridge.js +709 -0
  30. package/src/@claude-flow/memory/dist/auto-memory-bridge.test.d.ts +8 -0
  31. package/src/@claude-flow/memory/dist/auto-memory-bridge.test.js +757 -0
  32. package/src/@claude-flow/memory/dist/benchmark.test.d.ts +2 -0
  33. package/src/@claude-flow/memory/dist/benchmark.test.js +277 -0
  34. package/src/@claude-flow/memory/dist/cache-manager.d.ts +134 -0
  35. package/src/@claude-flow/memory/dist/cache-manager.js +407 -0
  36. package/src/@claude-flow/memory/dist/controller-registry.d.ts +216 -0
  37. package/src/@claude-flow/memory/dist/controller-registry.js +893 -0
  38. package/src/@claude-flow/memory/dist/controller-registry.test.d.ts +14 -0
  39. package/src/@claude-flow/memory/dist/controller-registry.test.js +593 -0
  40. package/src/@claude-flow/memory/dist/database-provider.d.ts +87 -0
  41. package/src/@claude-flow/memory/dist/database-provider.js +372 -0
  42. package/src/@claude-flow/memory/dist/database-provider.test.d.ts +7 -0
  43. package/src/@claude-flow/memory/dist/database-provider.test.js +287 -0
  44. package/src/@claude-flow/memory/dist/domain/entities/memory-entry.d.ts +143 -0
  45. package/src/@claude-flow/memory/dist/domain/entities/memory-entry.js +226 -0
  46. package/src/@claude-flow/memory/dist/domain/index.d.ts +11 -0
  47. package/src/@claude-flow/memory/dist/domain/index.js +12 -0
  48. package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
  49. package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.js +11 -0
  50. package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.d.ts +105 -0
  51. package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.js +297 -0
  52. package/src/@claude-flow/memory/dist/hnsw-index.d.ts +111 -0
  53. package/src/@claude-flow/memory/dist/hnsw-index.js +781 -0
  54. package/src/@claude-flow/memory/dist/hnsw-lite.d.ts +23 -0
  55. package/src/@claude-flow/memory/dist/hnsw-lite.js +168 -0
  56. package/src/@claude-flow/memory/dist/index.d.ts +204 -0
  57. package/src/@claude-flow/memory/dist/index.js +358 -0
  58. package/src/@claude-flow/memory/dist/infrastructure/index.d.ts +17 -0
  59. package/src/@claude-flow/memory/dist/infrastructure/index.js +16 -0
  60. package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
  61. package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
  62. package/src/@claude-flow/memory/dist/learning-bridge.d.ts +137 -0
  63. package/src/@claude-flow/memory/dist/learning-bridge.js +335 -0
  64. package/src/@claude-flow/memory/dist/learning-bridge.test.d.ts +8 -0
  65. package/src/@claude-flow/memory/dist/learning-bridge.test.js +578 -0
  66. package/src/@claude-flow/memory/dist/memory-graph.d.ts +100 -0
  67. package/src/@claude-flow/memory/dist/memory-graph.js +333 -0
  68. package/src/@claude-flow/memory/dist/memory-graph.test.d.ts +8 -0
  69. package/src/@claude-flow/memory/dist/memory-graph.test.js +609 -0
  70. package/src/@claude-flow/memory/dist/migration.d.ts +68 -0
  71. package/src/@claude-flow/memory/dist/migration.js +513 -0
  72. package/src/@claude-flow/memory/dist/persistent-sona.d.ts +144 -0
  73. package/src/@claude-flow/memory/dist/persistent-sona.js +332 -0
  74. package/src/@claude-flow/memory/dist/query-builder.d.ts +211 -0
  75. package/src/@claude-flow/memory/dist/query-builder.js +438 -0
  76. package/src/@claude-flow/memory/dist/rvf-backend.d.ts +51 -0
  77. package/src/@claude-flow/memory/dist/rvf-backend.js +481 -0
  78. package/src/@claude-flow/memory/dist/rvf-learning-store.d.ts +139 -0
  79. package/src/@claude-flow/memory/dist/rvf-learning-store.js +295 -0
  80. package/src/@claude-flow/memory/dist/rvf-migration.d.ts +45 -0
  81. package/src/@claude-flow/memory/dist/rvf-migration.js +234 -0
  82. package/src/@claude-flow/memory/dist/sqljs-backend.d.ts +127 -0
  83. package/src/@claude-flow/memory/dist/sqljs-backend.js +600 -0
  84. package/src/@claude-flow/memory/dist/types.d.ts +484 -0
  85. package/src/@claude-flow/memory/dist/types.js +58 -0
  86. package/src/@claude-flow/shared/dist/core/config/defaults.d.ts +41 -0
  87. package/src/@claude-flow/shared/dist/core/config/defaults.js +186 -0
  88. package/src/@claude-flow/shared/dist/core/config/index.d.ts +8 -0
  89. package/src/@claude-flow/shared/dist/core/config/index.js +12 -0
  90. package/src/@claude-flow/shared/dist/core/config/loader.d.ts +45 -0
  91. package/src/@claude-flow/shared/dist/core/config/loader.js +222 -0
  92. package/src/@claude-flow/shared/dist/core/config/schema.d.ts +1134 -0
  93. package/src/@claude-flow/shared/dist/core/config/schema.js +158 -0
  94. package/src/@claude-flow/shared/dist/core/config/validator.d.ts +92 -0
  95. package/src/@claude-flow/shared/dist/core/config/validator.js +147 -0
  96. package/src/@claude-flow/shared/dist/core/event-bus.d.ts +31 -0
  97. package/src/@claude-flow/shared/dist/core/event-bus.js +197 -0
  98. package/src/@claude-flow/shared/dist/core/index.d.ts +15 -0
  99. package/src/@claude-flow/shared/dist/core/index.js +19 -0
  100. package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.d.ts +200 -0
  101. package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.js +6 -0
  102. package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.d.ts +310 -0
  103. package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.js +7 -0
  104. package/src/@claude-flow/shared/dist/core/interfaces/event.interface.d.ts +224 -0
  105. package/src/@claude-flow/shared/dist/core/interfaces/event.interface.js +46 -0
  106. package/src/@claude-flow/shared/dist/core/interfaces/index.d.ts +10 -0
  107. package/src/@claude-flow/shared/dist/core/interfaces/index.js +15 -0
  108. package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.d.ts +298 -0
  109. package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.js +7 -0
  110. package/src/@claude-flow/shared/dist/core/interfaces/task.interface.d.ts +185 -0
  111. package/src/@claude-flow/shared/dist/core/interfaces/task.interface.js +6 -0
  112. package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.d.ts +35 -0
  113. package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.js +101 -0
  114. package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.d.ts +60 -0
  115. package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.js +166 -0
  116. package/src/@claude-flow/shared/dist/core/orchestrator/index.d.ts +46 -0
  117. package/src/@claude-flow/shared/dist/core/orchestrator/index.js +64 -0
  118. package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.d.ts +56 -0
  119. package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.js +195 -0
  120. package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.d.ts +83 -0
  121. package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.js +193 -0
  122. package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.d.ts +49 -0
  123. package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.js +253 -0
  124. package/src/@claude-flow/shared/dist/events/domain-events.d.ts +282 -0
  125. package/src/@claude-flow/shared/dist/events/domain-events.js +165 -0
  126. package/src/@claude-flow/shared/dist/events/event-store.d.ts +126 -0
  127. package/src/@claude-flow/shared/dist/events/event-store.js +432 -0
  128. package/src/@claude-flow/shared/dist/events/event-store.test.d.ts +8 -0
  129. package/src/@claude-flow/shared/dist/events/event-store.test.js +297 -0
  130. package/src/@claude-flow/shared/dist/events/example-usage.d.ts +10 -0
  131. package/src/@claude-flow/shared/dist/events/example-usage.js +193 -0
  132. package/src/@claude-flow/shared/dist/events/index.d.ts +21 -0
  133. package/src/@claude-flow/shared/dist/events/index.js +22 -0
  134. package/src/@claude-flow/shared/dist/events/projections.d.ts +177 -0
  135. package/src/@claude-flow/shared/dist/events/projections.js +421 -0
  136. package/src/@claude-flow/shared/dist/events/rvf-event-log.d.ts +82 -0
  137. package/src/@claude-flow/shared/dist/events/rvf-event-log.js +340 -0
  138. package/src/@claude-flow/shared/dist/events/state-reconstructor.d.ts +101 -0
  139. package/src/@claude-flow/shared/dist/events/state-reconstructor.js +263 -0
  140. package/src/@claude-flow/shared/dist/events.d.ts +80 -0
  141. package/src/@claude-flow/shared/dist/events.js +249 -0
  142. package/src/@claude-flow/shared/dist/hooks/example-usage.d.ts +42 -0
  143. package/src/@claude-flow/shared/dist/hooks/example-usage.js +351 -0
  144. package/src/@claude-flow/shared/dist/hooks/executor.d.ts +100 -0
  145. package/src/@claude-flow/shared/dist/hooks/executor.js +267 -0
  146. package/src/@claude-flow/shared/dist/hooks/hooks.test.d.ts +9 -0
  147. package/src/@claude-flow/shared/dist/hooks/hooks.test.js +322 -0
  148. package/src/@claude-flow/shared/dist/hooks/index.d.ts +52 -0
  149. package/src/@claude-flow/shared/dist/hooks/index.js +51 -0
  150. package/src/@claude-flow/shared/dist/hooks/registry.d.ts +133 -0
  151. package/src/@claude-flow/shared/dist/hooks/registry.js +277 -0
  152. package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.d.ts +105 -0
  153. package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.js +481 -0
  154. package/src/@claude-flow/shared/dist/hooks/safety/file-organization.d.ts +144 -0
  155. package/src/@claude-flow/shared/dist/hooks/safety/file-organization.js +328 -0
  156. package/src/@claude-flow/shared/dist/hooks/safety/git-commit.d.ts +158 -0
  157. package/src/@claude-flow/shared/dist/hooks/safety/git-commit.js +450 -0
  158. package/src/@claude-flow/shared/dist/hooks/safety/index.d.ts +17 -0
  159. package/src/@claude-flow/shared/dist/hooks/safety/index.js +17 -0
  160. package/src/@claude-flow/shared/dist/hooks/session-hooks.d.ts +234 -0
  161. package/src/@claude-flow/shared/dist/hooks/session-hooks.js +334 -0
  162. package/src/@claude-flow/shared/dist/hooks/task-hooks.d.ts +163 -0
  163. package/src/@claude-flow/shared/dist/hooks/task-hooks.js +326 -0
  164. package/src/@claude-flow/shared/dist/hooks/types.d.ts +267 -0
  165. package/src/@claude-flow/shared/dist/hooks/types.js +62 -0
  166. package/src/@claude-flow/shared/dist/hooks/verify-exports.test.d.ts +9 -0
  167. package/src/@claude-flow/shared/dist/hooks/verify-exports.test.js +93 -0
  168. package/src/@claude-flow/shared/dist/index.d.ts +20 -0
  169. package/src/@claude-flow/shared/dist/index.js +50 -0
  170. package/src/@claude-flow/shared/dist/mcp/connection-pool.d.ts +98 -0
  171. package/src/@claude-flow/shared/dist/mcp/connection-pool.js +364 -0
  172. package/src/@claude-flow/shared/dist/mcp/index.d.ts +69 -0
  173. package/src/@claude-flow/shared/dist/mcp/index.js +84 -0
  174. package/src/@claude-flow/shared/dist/mcp/server.d.ts +166 -0
  175. package/src/@claude-flow/shared/dist/mcp/server.js +593 -0
  176. package/src/@claude-flow/shared/dist/mcp/session-manager.d.ts +136 -0
  177. package/src/@claude-flow/shared/dist/mcp/session-manager.js +335 -0
  178. package/src/@claude-flow/shared/dist/mcp/tool-registry.d.ts +178 -0
  179. package/src/@claude-flow/shared/dist/mcp/tool-registry.js +439 -0
  180. package/src/@claude-flow/shared/dist/mcp/transport/http.d.ts +104 -0
  181. package/src/@claude-flow/shared/dist/mcp/transport/http.js +476 -0
  182. package/src/@claude-flow/shared/dist/mcp/transport/index.d.ts +102 -0
  183. package/src/@claude-flow/shared/dist/mcp/transport/index.js +238 -0
  184. package/src/@claude-flow/shared/dist/mcp/transport/stdio.d.ts +104 -0
  185. package/src/@claude-flow/shared/dist/mcp/transport/stdio.js +263 -0
  186. package/src/@claude-flow/shared/dist/mcp/transport/websocket.d.ts +133 -0
  187. package/src/@claude-flow/shared/dist/mcp/transport/websocket.js +396 -0
  188. package/src/@claude-flow/shared/dist/mcp/types.d.ts +438 -0
  189. package/src/@claude-flow/shared/dist/mcp/types.js +54 -0
  190. package/src/@claude-flow/shared/dist/plugin-interface.d.ts +544 -0
  191. package/src/@claude-flow/shared/dist/plugin-interface.js +23 -0
  192. package/src/@claude-flow/shared/dist/plugin-loader.d.ts +139 -0
  193. package/src/@claude-flow/shared/dist/plugin-loader.js +434 -0
  194. package/src/@claude-flow/shared/dist/plugin-registry.d.ts +183 -0
  195. package/src/@claude-flow/shared/dist/plugin-registry.js +457 -0
  196. package/src/@claude-flow/shared/dist/plugins/index.d.ts +10 -0
  197. package/src/@claude-flow/shared/dist/plugins/index.js +10 -0
  198. package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.d.ts +106 -0
  199. package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.js +241 -0
  200. package/src/@claude-flow/shared/dist/plugins/official/index.d.ts +10 -0
  201. package/src/@claude-flow/shared/dist/plugins/official/index.js +10 -0
  202. package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.d.ts +121 -0
  203. package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.js +355 -0
  204. package/src/@claude-flow/shared/dist/plugins/types.d.ts +93 -0
  205. package/src/@claude-flow/shared/dist/plugins/types.js +9 -0
  206. package/src/@claude-flow/shared/dist/resilience/bulkhead.d.ts +105 -0
  207. package/src/@claude-flow/shared/dist/resilience/bulkhead.js +206 -0
  208. package/src/@claude-flow/shared/dist/resilience/circuit-breaker.d.ts +132 -0
  209. package/src/@claude-flow/shared/dist/resilience/circuit-breaker.js +233 -0
  210. package/src/@claude-flow/shared/dist/resilience/index.d.ts +19 -0
  211. package/src/@claude-flow/shared/dist/resilience/index.js +19 -0
  212. package/src/@claude-flow/shared/dist/resilience/rate-limiter.d.ts +168 -0
  213. package/src/@claude-flow/shared/dist/resilience/rate-limiter.js +314 -0
  214. package/src/@claude-flow/shared/dist/resilience/retry.d.ts +91 -0
  215. package/src/@claude-flow/shared/dist/resilience/retry.js +159 -0
  216. package/src/@claude-flow/shared/dist/security/index.d.ts +10 -0
  217. package/src/@claude-flow/shared/dist/security/index.js +12 -0
  218. package/src/@claude-flow/shared/dist/security/input-validation.d.ts +73 -0
  219. package/src/@claude-flow/shared/dist/security/input-validation.js +201 -0
  220. package/src/@claude-flow/shared/dist/security/secure-random.d.ts +92 -0
  221. package/src/@claude-flow/shared/dist/security/secure-random.js +142 -0
  222. package/src/@claude-flow/shared/dist/services/index.d.ts +7 -0
  223. package/src/@claude-flow/shared/dist/services/index.js +7 -0
  224. package/src/@claude-flow/shared/dist/services/v3-progress.service.d.ts +124 -0
  225. package/src/@claude-flow/shared/dist/services/v3-progress.service.js +402 -0
  226. package/src/@claude-flow/shared/dist/types/agent.types.d.ts +137 -0
  227. package/src/@claude-flow/shared/dist/types/agent.types.js +6 -0
  228. package/src/@claude-flow/shared/dist/types/index.d.ts +11 -0
  229. package/src/@claude-flow/shared/dist/types/index.js +17 -0
  230. package/src/@claude-flow/shared/dist/types/mcp.types.d.ts +266 -0
  231. package/src/@claude-flow/shared/dist/types/mcp.types.js +7 -0
  232. package/src/@claude-flow/shared/dist/types/memory.types.d.ts +236 -0
  233. package/src/@claude-flow/shared/dist/types/memory.types.js +7 -0
  234. package/src/@claude-flow/shared/dist/types/swarm.types.d.ts +186 -0
  235. package/src/@claude-flow/shared/dist/types/swarm.types.js +65 -0
  236. package/src/@claude-flow/shared/dist/types/task.types.d.ts +178 -0
  237. package/src/@claude-flow/shared/dist/types/task.types.js +32 -0
  238. package/src/@claude-flow/shared/dist/types.d.ts +197 -0
  239. package/src/@claude-flow/shared/dist/types.js +21 -0
  240. package/src/@claude-flow/shared/dist/utils/secure-logger.d.ts +69 -0
  241. package/src/@claude-flow/shared/dist/utils/secure-logger.js +208 -0
@@ -0,0 +1,476 @@
1
+ /**
2
+ * V3 MCP HTTP Transport
3
+ *
4
+ * HTTP/REST transport for MCP communication:
5
+ * - Express-based with optimized middleware
6
+ * - WebSocket support for real-time notifications
7
+ * - Connection pooling for client connections
8
+ * - Security headers with helmet
9
+ *
10
+ * Performance Targets:
11
+ * - Request handling: <20ms overhead
12
+ * - WebSocket message: <5ms
13
+ */
14
+ import { EventEmitter } from 'events';
15
+ import express from 'express';
16
+ import { createServer } from 'http';
17
+ import { WebSocketServer, WebSocket } from 'ws';
18
+ import cors from 'cors';
19
+ import helmet from 'helmet';
20
+ /**
21
+ * HTTP Transport Implementation
22
+ */
23
+ export class HttpTransport extends EventEmitter {
24
+ logger;
25
+ config;
26
+ type = 'http';
27
+ requestHandler;
28
+ notificationHandler;
29
+ app;
30
+ server;
31
+ wss;
32
+ running = false;
33
+ activeConnections = new Set();
34
+ // Statistics
35
+ messagesReceived = 0;
36
+ messagesSent = 0;
37
+ errors = 0;
38
+ httpRequests = 0;
39
+ wsMessages = 0;
40
+ constructor(logger, config) {
41
+ super();
42
+ this.logger = logger;
43
+ this.config = config;
44
+ this.app = express();
45
+ this.setupMiddleware();
46
+ this.setupRoutes();
47
+ }
48
+ /**
49
+ * Start the transport
50
+ */
51
+ async start() {
52
+ if (this.running) {
53
+ throw new Error('HTTP transport already running');
54
+ }
55
+ this.logger.info('Starting HTTP transport', {
56
+ host: this.config.host,
57
+ port: this.config.port,
58
+ });
59
+ // Create HTTP server
60
+ this.server = createServer(this.app);
61
+ // Create WebSocket server
62
+ this.wss = new WebSocketServer({
63
+ server: this.server,
64
+ path: '/ws',
65
+ });
66
+ this.setupWebSocketHandlers();
67
+ // Start server
68
+ await new Promise((resolve, reject) => {
69
+ this.server.listen(this.config.port, this.config.host, () => {
70
+ resolve();
71
+ });
72
+ this.server.on('error', reject);
73
+ });
74
+ this.running = true;
75
+ this.logger.info('HTTP transport started', {
76
+ url: `http://${this.config.host}:${this.config.port}`,
77
+ });
78
+ }
79
+ /**
80
+ * Stop the transport
81
+ */
82
+ async stop() {
83
+ if (!this.running) {
84
+ return;
85
+ }
86
+ this.logger.info('Stopping HTTP transport');
87
+ this.running = false;
88
+ // Close all WebSocket connections
89
+ for (const ws of this.activeConnections) {
90
+ try {
91
+ ws.close(1000, 'Server shutting down');
92
+ }
93
+ catch {
94
+ // Ignore errors
95
+ }
96
+ }
97
+ this.activeConnections.clear();
98
+ // Close WebSocket server
99
+ if (this.wss) {
100
+ this.wss.close();
101
+ this.wss = undefined;
102
+ }
103
+ // Close HTTP server
104
+ if (this.server) {
105
+ await new Promise((resolve) => {
106
+ this.server.close(() => resolve());
107
+ });
108
+ this.server = undefined;
109
+ }
110
+ this.logger.info('HTTP transport stopped');
111
+ }
112
+ /**
113
+ * Register request handler
114
+ */
115
+ onRequest(handler) {
116
+ this.requestHandler = handler;
117
+ }
118
+ /**
119
+ * Register notification handler
120
+ */
121
+ onNotification(handler) {
122
+ this.notificationHandler = handler;
123
+ }
124
+ /**
125
+ * Get health status
126
+ */
127
+ async getHealthStatus() {
128
+ return {
129
+ healthy: this.running,
130
+ metrics: {
131
+ messagesReceived: this.messagesReceived,
132
+ messagesSent: this.messagesSent,
133
+ errors: this.errors,
134
+ httpRequests: this.httpRequests,
135
+ wsMessages: this.wsMessages,
136
+ activeConnections: this.activeConnections.size,
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * Send notification to all connected WebSocket clients
142
+ */
143
+ async sendNotification(notification) {
144
+ const message = JSON.stringify(notification);
145
+ for (const ws of this.activeConnections) {
146
+ try {
147
+ if (ws.readyState === WebSocket.OPEN) {
148
+ ws.send(message);
149
+ this.messagesSent++;
150
+ }
151
+ }
152
+ catch (error) {
153
+ this.logger.error('Failed to send notification', { error });
154
+ this.errors++;
155
+ }
156
+ }
157
+ }
158
+ /**
159
+ * Setup Express middleware
160
+ */
161
+ setupMiddleware() {
162
+ // Security headers
163
+ this.app.use(helmet({
164
+ contentSecurityPolicy: false, // Allow for flexibility
165
+ }));
166
+ // CORS - Secure defaults (no wildcard in production)
167
+ if (this.config.corsEnabled !== false) {
168
+ const allowedOrigins = this.config.corsOrigins;
169
+ // SECURITY: Reject wildcard CORS in production unless explicitly configured
170
+ if (!allowedOrigins || allowedOrigins.length === 0) {
171
+ this.logger.warn('CORS: No origins configured, restricting to same-origin only');
172
+ }
173
+ this.app.use(cors({
174
+ origin: (origin, callback) => {
175
+ // Allow requests with no origin (same-origin, curl, etc.)
176
+ if (!origin) {
177
+ callback(null, true);
178
+ return;
179
+ }
180
+ // Check against allowed origins
181
+ if (allowedOrigins && allowedOrigins.length > 0) {
182
+ if (allowedOrigins.includes(origin) || allowedOrigins.includes('*')) {
183
+ callback(null, true);
184
+ }
185
+ else {
186
+ callback(new Error(`CORS: Origin '${origin}' not allowed`));
187
+ }
188
+ }
189
+ else {
190
+ // No origins configured - reject cross-origin requests
191
+ callback(new Error('CORS: Cross-origin requests not allowed'));
192
+ }
193
+ },
194
+ credentials: true,
195
+ maxAge: 86400,
196
+ methods: ['GET', 'POST', 'OPTIONS'],
197
+ allowedHeaders: ['Content-Type', 'Authorization', 'X-Request-ID'],
198
+ }));
199
+ }
200
+ // Body parsing
201
+ this.app.use(express.json({
202
+ limit: this.config.maxRequestSize || '10mb',
203
+ }));
204
+ // Request timeout
205
+ if (this.config.requestTimeout) {
206
+ this.app.use((req, res, next) => {
207
+ res.setTimeout(this.config.requestTimeout, () => {
208
+ res.status(408).json({
209
+ jsonrpc: '2.0',
210
+ id: null,
211
+ error: { code: -32000, message: 'Request timeout' },
212
+ });
213
+ });
214
+ next();
215
+ });
216
+ }
217
+ // Request logging
218
+ this.app.use((req, res, next) => {
219
+ const startTime = performance.now();
220
+ res.on('finish', () => {
221
+ const duration = performance.now() - startTime;
222
+ this.logger.debug('HTTP request', {
223
+ method: req.method,
224
+ path: req.path,
225
+ status: res.statusCode,
226
+ duration: `${duration.toFixed(2)}ms`,
227
+ });
228
+ });
229
+ next();
230
+ });
231
+ }
232
+ /**
233
+ * Setup Express routes
234
+ */
235
+ setupRoutes() {
236
+ // Health check
237
+ this.app.get('/health', (req, res) => {
238
+ res.json({
239
+ status: 'ok',
240
+ timestamp: new Date().toISOString(),
241
+ connections: this.activeConnections.size,
242
+ });
243
+ });
244
+ // MCP JSON-RPC endpoint
245
+ this.app.post('/rpc', async (req, res) => {
246
+ await this.handleHttpRequest(req, res);
247
+ });
248
+ // Alternative MCP endpoint
249
+ this.app.post('/mcp', async (req, res) => {
250
+ await this.handleHttpRequest(req, res);
251
+ });
252
+ // Server info
253
+ this.app.get('/info', (req, res) => {
254
+ res.json({
255
+ name: 'Claude-Flow MCP Server V3',
256
+ version: '3.0.0',
257
+ transport: 'http',
258
+ capabilities: {
259
+ jsonrpc: true,
260
+ websocket: true,
261
+ },
262
+ });
263
+ });
264
+ // 404 handler
265
+ this.app.use((req, res) => {
266
+ res.status(404).json({
267
+ error: 'Not found',
268
+ path: req.path,
269
+ });
270
+ });
271
+ // Error handler
272
+ this.app.use((err, req, res, next) => {
273
+ this.logger.error('Express error', { error: err });
274
+ this.errors++;
275
+ res.status(500).json({
276
+ jsonrpc: '2.0',
277
+ id: null,
278
+ error: { code: -32603, message: 'Internal error' },
279
+ });
280
+ });
281
+ }
282
+ /**
283
+ * Setup WebSocket handlers
284
+ */
285
+ setupWebSocketHandlers() {
286
+ if (!this.wss)
287
+ return;
288
+ this.wss.on('connection', (ws, req) => {
289
+ this.activeConnections.add(ws);
290
+ this.logger.info('WebSocket client connected', {
291
+ total: this.activeConnections.size,
292
+ });
293
+ ws.on('message', async (data) => {
294
+ await this.handleWebSocketMessage(ws, data.toString());
295
+ });
296
+ ws.on('close', () => {
297
+ this.activeConnections.delete(ws);
298
+ this.logger.info('WebSocket client disconnected', {
299
+ total: this.activeConnections.size,
300
+ });
301
+ });
302
+ ws.on('error', (error) => {
303
+ this.logger.error('WebSocket error', { error });
304
+ this.errors++;
305
+ this.activeConnections.delete(ws);
306
+ });
307
+ });
308
+ }
309
+ /**
310
+ * Handle HTTP request
311
+ */
312
+ async handleHttpRequest(req, res) {
313
+ this.httpRequests++;
314
+ this.messagesReceived++;
315
+ // Validate authentication (ALWAYS check, not just when explicitly enabled)
316
+ // SECURITY: Auth should be opt-out, not opt-in
317
+ const requiresAuth = this.config.auth?.enabled !== false; // Default to requiring auth
318
+ if (requiresAuth && this.config.auth) {
319
+ const authResult = this.validateAuth(req);
320
+ if (!authResult.valid) {
321
+ this.logger.warn('Authentication failed', {
322
+ ip: req.ip,
323
+ path: req.path,
324
+ error: authResult.error,
325
+ });
326
+ res.status(401).json({
327
+ jsonrpc: '2.0',
328
+ id: null,
329
+ error: { code: -32001, message: 'Unauthorized' },
330
+ });
331
+ return;
332
+ }
333
+ }
334
+ else if (requiresAuth && !this.config.auth) {
335
+ // No auth configured but auth is required - warn and continue (development mode)
336
+ this.logger.warn('No authentication configured - running in development mode');
337
+ }
338
+ const message = req.body;
339
+ // Validate JSON-RPC format
340
+ if (message.jsonrpc !== '2.0') {
341
+ res.status(400).json({
342
+ jsonrpc: '2.0',
343
+ id: message.id || null,
344
+ error: { code: -32600, message: 'Invalid JSON-RPC version' },
345
+ });
346
+ return;
347
+ }
348
+ if (!message.method) {
349
+ res.status(400).json({
350
+ jsonrpc: '2.0',
351
+ id: message.id || null,
352
+ error: { code: -32600, message: 'Missing method' },
353
+ });
354
+ return;
355
+ }
356
+ // Handle notification vs request
357
+ if (message.id === undefined) {
358
+ // Notification
359
+ if (this.notificationHandler) {
360
+ await this.notificationHandler(message);
361
+ }
362
+ res.status(204).end();
363
+ }
364
+ else {
365
+ // Request
366
+ if (!this.requestHandler) {
367
+ res.status(500).json({
368
+ jsonrpc: '2.0',
369
+ id: message.id,
370
+ error: { code: -32603, message: 'No request handler' },
371
+ });
372
+ return;
373
+ }
374
+ try {
375
+ const response = await this.requestHandler(message);
376
+ res.json(response);
377
+ this.messagesSent++;
378
+ }
379
+ catch (error) {
380
+ this.errors++;
381
+ res.status(500).json({
382
+ jsonrpc: '2.0',
383
+ id: message.id,
384
+ error: {
385
+ code: -32603,
386
+ message: error instanceof Error ? error.message : 'Internal error',
387
+ },
388
+ });
389
+ }
390
+ }
391
+ }
392
+ /**
393
+ * Handle WebSocket message
394
+ */
395
+ async handleWebSocketMessage(ws, data) {
396
+ this.wsMessages++;
397
+ this.messagesReceived++;
398
+ try {
399
+ const message = JSON.parse(data);
400
+ if (message.jsonrpc !== '2.0') {
401
+ ws.send(JSON.stringify({
402
+ jsonrpc: '2.0',
403
+ id: message.id || null,
404
+ error: { code: -32600, message: 'Invalid JSON-RPC version' },
405
+ }));
406
+ return;
407
+ }
408
+ if (message.id === undefined) {
409
+ // Notification
410
+ if (this.notificationHandler) {
411
+ await this.notificationHandler(message);
412
+ }
413
+ }
414
+ else {
415
+ // Request
416
+ if (!this.requestHandler) {
417
+ ws.send(JSON.stringify({
418
+ jsonrpc: '2.0',
419
+ id: message.id,
420
+ error: { code: -32603, message: 'No request handler' },
421
+ }));
422
+ return;
423
+ }
424
+ const response = await this.requestHandler(message);
425
+ ws.send(JSON.stringify(response));
426
+ this.messagesSent++;
427
+ }
428
+ }
429
+ catch (error) {
430
+ this.errors++;
431
+ this.logger.error('WebSocket message error', { error });
432
+ try {
433
+ const parsed = JSON.parse(data);
434
+ ws.send(JSON.stringify({
435
+ jsonrpc: '2.0',
436
+ id: parsed.id || null,
437
+ error: { code: -32700, message: 'Parse error' },
438
+ }));
439
+ }
440
+ catch {
441
+ ws.send(JSON.stringify({
442
+ jsonrpc: '2.0',
443
+ id: null,
444
+ error: { code: -32700, message: 'Parse error' },
445
+ }));
446
+ }
447
+ }
448
+ }
449
+ /**
450
+ * Validate authentication
451
+ */
452
+ validateAuth(req) {
453
+ const auth = req.headers.authorization;
454
+ if (!auth) {
455
+ return { valid: false, error: 'Authorization header required' };
456
+ }
457
+ const tokenMatch = auth.match(/^Bearer\s+(.+)$/i);
458
+ if (!tokenMatch) {
459
+ return { valid: false, error: 'Invalid authorization format' };
460
+ }
461
+ const token = tokenMatch[1];
462
+ if (this.config.auth?.tokens?.length) {
463
+ if (!this.config.auth.tokens.includes(token)) {
464
+ return { valid: false, error: 'Invalid token' };
465
+ }
466
+ }
467
+ return { valid: true };
468
+ }
469
+ }
470
+ /**
471
+ * Create HTTP transport
472
+ */
473
+ export function createHttpTransport(logger, config) {
474
+ return new HttpTransport(logger, config);
475
+ }
476
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1,102 @@
1
+ /**
2
+ * V3 MCP Transport Factory
3
+ *
4
+ * Central factory for creating transport instances:
5
+ * - Unified transport creation API
6
+ * - Transport type validation
7
+ * - Configuration defaults
8
+ * - Multi-transport support
9
+ *
10
+ * Supported transports:
11
+ * - stdio: Standard I/O (default for CLI)
12
+ * - http: HTTP/REST with WebSocket upgrade
13
+ * - websocket: Standalone WebSocket
14
+ * - in-process: Direct function calls (fastest)
15
+ */
16
+ import { ITransport, TransportType, ILogger } from '../types.js';
17
+ import { StdioTransportConfig } from './stdio.js';
18
+ import { HttpTransportConfig } from './http.js';
19
+ import { WebSocketTransportConfig } from './websocket.js';
20
+ export { StdioTransport } from './stdio.js';
21
+ export { HttpTransport } from './http.js';
22
+ export { WebSocketTransport } from './websocket.js';
23
+ export type { StdioTransportConfig } from './stdio.js';
24
+ export type { HttpTransportConfig } from './http.js';
25
+ export type { WebSocketTransportConfig } from './websocket.js';
26
+ /**
27
+ * Transport configuration union
28
+ */
29
+ export type TransportConfig = {
30
+ type: 'stdio';
31
+ } & StdioTransportConfig | {
32
+ type: 'http';
33
+ } & HttpTransportConfig | {
34
+ type: 'websocket';
35
+ } & WebSocketTransportConfig | {
36
+ type: 'in-process';
37
+ };
38
+ /**
39
+ * Create a transport instance based on type
40
+ */
41
+ export declare function createTransport(type: TransportType, logger: ILogger, config?: Partial<TransportConfig>): ITransport;
42
+ /**
43
+ * Create in-process transport
44
+ */
45
+ export declare function createInProcessTransport(logger: ILogger): ITransport;
46
+ /**
47
+ * Transport manager for multi-transport scenarios
48
+ */
49
+ export declare class TransportManager {
50
+ private readonly logger;
51
+ private transports;
52
+ private running;
53
+ constructor(logger: ILogger);
54
+ /**
55
+ * Add a transport
56
+ */
57
+ addTransport(name: string, transport: ITransport): void;
58
+ /**
59
+ * Remove a transport
60
+ */
61
+ removeTransport(name: string): Promise<boolean>;
62
+ /**
63
+ * Get a transport by name
64
+ */
65
+ getTransport(name: string): ITransport | undefined;
66
+ /**
67
+ * Get all transport names
68
+ */
69
+ getTransportNames(): string[];
70
+ /**
71
+ * Start all transports
72
+ */
73
+ startAll(): Promise<void>;
74
+ /**
75
+ * Stop all transports
76
+ */
77
+ stopAll(): Promise<void>;
78
+ /**
79
+ * Get health status of all transports
80
+ */
81
+ getHealthStatus(): Promise<Record<string, {
82
+ healthy: boolean;
83
+ error?: string;
84
+ }>>;
85
+ /**
86
+ * Check if any transport is running
87
+ */
88
+ isRunning(): boolean;
89
+ }
90
+ /**
91
+ * Create a transport manager
92
+ */
93
+ export declare function createTransportManager(logger: ILogger): TransportManager;
94
+ /**
95
+ * Default transport configurations
96
+ */
97
+ export declare const DEFAULT_TRANSPORT_CONFIGS: {
98
+ readonly stdio: StdioTransportConfig;
99
+ readonly http: HttpTransportConfig;
100
+ readonly websocket: WebSocketTransportConfig;
101
+ };
102
+ //# sourceMappingURL=index.d.ts.map