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.
- package/.claude/guidance/shipped/moflo.md +45 -0
- package/.claude/helpers/statusline.cjs +1 -1
- package/.claude/workflow-state.json +9 -0
- package/package.json +2 -2
- package/src/@claude-flow/cli/dist/src/init/statusline-generator.js +1 -1
- package/src/@claude-flow/cli/dist/src/services/agentic-flow-bridge.js +5 -3
- package/src/@claude-flow/cli/package.json +1 -1
- package/src/@claude-flow/memory/dist/agent-memory-scope.d.ts +131 -0
- package/src/@claude-flow/memory/dist/agent-memory-scope.js +223 -0
- package/src/@claude-flow/memory/dist/agent-memory-scope.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/agent-memory-scope.test.js +466 -0
- package/src/@claude-flow/memory/dist/agentdb-adapter.d.ts +165 -0
- package/src/@claude-flow/memory/dist/agentdb-adapter.js +806 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.d.ts +212 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.js +842 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.test.d.ts +7 -0
- package/src/@claude-flow/memory/dist/agentdb-backend.test.js +258 -0
- package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.d.ts +65 -0
- package/src/@claude-flow/memory/dist/application/commands/delete-memory.command.js +129 -0
- package/src/@claude-flow/memory/dist/application/commands/store-memory.command.d.ts +48 -0
- package/src/@claude-flow/memory/dist/application/commands/store-memory.command.js +72 -0
- package/src/@claude-flow/memory/dist/application/index.d.ts +12 -0
- package/src/@claude-flow/memory/dist/application/index.js +15 -0
- package/src/@claude-flow/memory/dist/application/queries/search-memory.query.d.ts +72 -0
- package/src/@claude-flow/memory/dist/application/queries/search-memory.query.js +143 -0
- package/src/@claude-flow/memory/dist/application/services/memory-application-service.d.ts +121 -0
- package/src/@claude-flow/memory/dist/application/services/memory-application-service.js +190 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.d.ts +226 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.js +709 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/auto-memory-bridge.test.js +757 -0
- package/src/@claude-flow/memory/dist/benchmark.test.d.ts +2 -0
- package/src/@claude-flow/memory/dist/benchmark.test.js +277 -0
- package/src/@claude-flow/memory/dist/cache-manager.d.ts +134 -0
- package/src/@claude-flow/memory/dist/cache-manager.js +407 -0
- package/src/@claude-flow/memory/dist/controller-registry.d.ts +216 -0
- package/src/@claude-flow/memory/dist/controller-registry.js +893 -0
- package/src/@claude-flow/memory/dist/controller-registry.test.d.ts +14 -0
- package/src/@claude-flow/memory/dist/controller-registry.test.js +593 -0
- package/src/@claude-flow/memory/dist/database-provider.d.ts +87 -0
- package/src/@claude-flow/memory/dist/database-provider.js +372 -0
- package/src/@claude-flow/memory/dist/database-provider.test.d.ts +7 -0
- package/src/@claude-flow/memory/dist/database-provider.test.js +287 -0
- package/src/@claude-flow/memory/dist/domain/entities/memory-entry.d.ts +143 -0
- package/src/@claude-flow/memory/dist/domain/entities/memory-entry.js +226 -0
- package/src/@claude-flow/memory/dist/domain/index.d.ts +11 -0
- package/src/@claude-flow/memory/dist/domain/index.js +12 -0
- package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.d.ts +102 -0
- package/src/@claude-flow/memory/dist/domain/repositories/memory-repository.interface.js +11 -0
- package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.d.ts +105 -0
- package/src/@claude-flow/memory/dist/domain/services/memory-domain-service.js +297 -0
- package/src/@claude-flow/memory/dist/hnsw-index.d.ts +111 -0
- package/src/@claude-flow/memory/dist/hnsw-index.js +781 -0
- package/src/@claude-flow/memory/dist/hnsw-lite.d.ts +23 -0
- package/src/@claude-flow/memory/dist/hnsw-lite.js +168 -0
- package/src/@claude-flow/memory/dist/index.d.ts +204 -0
- package/src/@claude-flow/memory/dist/index.js +358 -0
- package/src/@claude-flow/memory/dist/infrastructure/index.d.ts +17 -0
- package/src/@claude-flow/memory/dist/infrastructure/index.js +16 -0
- package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.d.ts +66 -0
- package/src/@claude-flow/memory/dist/infrastructure/repositories/hybrid-memory-repository.js +409 -0
- package/src/@claude-flow/memory/dist/learning-bridge.d.ts +137 -0
- package/src/@claude-flow/memory/dist/learning-bridge.js +335 -0
- package/src/@claude-flow/memory/dist/learning-bridge.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/learning-bridge.test.js +578 -0
- package/src/@claude-flow/memory/dist/memory-graph.d.ts +100 -0
- package/src/@claude-flow/memory/dist/memory-graph.js +333 -0
- package/src/@claude-flow/memory/dist/memory-graph.test.d.ts +8 -0
- package/src/@claude-flow/memory/dist/memory-graph.test.js +609 -0
- package/src/@claude-flow/memory/dist/migration.d.ts +68 -0
- package/src/@claude-flow/memory/dist/migration.js +513 -0
- package/src/@claude-flow/memory/dist/persistent-sona.d.ts +144 -0
- package/src/@claude-flow/memory/dist/persistent-sona.js +332 -0
- package/src/@claude-flow/memory/dist/query-builder.d.ts +211 -0
- package/src/@claude-flow/memory/dist/query-builder.js +438 -0
- package/src/@claude-flow/memory/dist/rvf-backend.d.ts +51 -0
- package/src/@claude-flow/memory/dist/rvf-backend.js +481 -0
- package/src/@claude-flow/memory/dist/rvf-learning-store.d.ts +139 -0
- package/src/@claude-flow/memory/dist/rvf-learning-store.js +295 -0
- package/src/@claude-flow/memory/dist/rvf-migration.d.ts +45 -0
- package/src/@claude-flow/memory/dist/rvf-migration.js +234 -0
- package/src/@claude-flow/memory/dist/sqljs-backend.d.ts +127 -0
- package/src/@claude-flow/memory/dist/sqljs-backend.js +600 -0
- package/src/@claude-flow/memory/dist/types.d.ts +484 -0
- package/src/@claude-flow/memory/dist/types.js +58 -0
- package/src/@claude-flow/shared/dist/core/config/defaults.d.ts +41 -0
- package/src/@claude-flow/shared/dist/core/config/defaults.js +186 -0
- package/src/@claude-flow/shared/dist/core/config/index.d.ts +8 -0
- package/src/@claude-flow/shared/dist/core/config/index.js +12 -0
- package/src/@claude-flow/shared/dist/core/config/loader.d.ts +45 -0
- package/src/@claude-flow/shared/dist/core/config/loader.js +222 -0
- package/src/@claude-flow/shared/dist/core/config/schema.d.ts +1134 -0
- package/src/@claude-flow/shared/dist/core/config/schema.js +158 -0
- package/src/@claude-flow/shared/dist/core/config/validator.d.ts +92 -0
- package/src/@claude-flow/shared/dist/core/config/validator.js +147 -0
- package/src/@claude-flow/shared/dist/core/event-bus.d.ts +31 -0
- package/src/@claude-flow/shared/dist/core/event-bus.js +197 -0
- package/src/@claude-flow/shared/dist/core/index.d.ts +15 -0
- package/src/@claude-flow/shared/dist/core/index.js +19 -0
- package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.d.ts +200 -0
- package/src/@claude-flow/shared/dist/core/interfaces/agent.interface.js +6 -0
- package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.d.ts +310 -0
- package/src/@claude-flow/shared/dist/core/interfaces/coordinator.interface.js +7 -0
- package/src/@claude-flow/shared/dist/core/interfaces/event.interface.d.ts +224 -0
- package/src/@claude-flow/shared/dist/core/interfaces/event.interface.js +46 -0
- package/src/@claude-flow/shared/dist/core/interfaces/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/core/interfaces/index.js +15 -0
- package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.d.ts +298 -0
- package/src/@claude-flow/shared/dist/core/interfaces/memory.interface.js +7 -0
- package/src/@claude-flow/shared/dist/core/interfaces/task.interface.d.ts +185 -0
- package/src/@claude-flow/shared/dist/core/interfaces/task.interface.js +6 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.d.ts +35 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/event-coordinator.js +101 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.d.ts +60 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/health-monitor.js +166 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/index.d.ts +46 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/index.js +64 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.d.ts +56 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/lifecycle-manager.js +195 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.d.ts +83 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/session-manager.js +193 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.d.ts +49 -0
- package/src/@claude-flow/shared/dist/core/orchestrator/task-manager.js +253 -0
- package/src/@claude-flow/shared/dist/events/domain-events.d.ts +282 -0
- package/src/@claude-flow/shared/dist/events/domain-events.js +165 -0
- package/src/@claude-flow/shared/dist/events/event-store.d.ts +126 -0
- package/src/@claude-flow/shared/dist/events/event-store.js +432 -0
- package/src/@claude-flow/shared/dist/events/event-store.test.d.ts +8 -0
- package/src/@claude-flow/shared/dist/events/event-store.test.js +297 -0
- package/src/@claude-flow/shared/dist/events/example-usage.d.ts +10 -0
- package/src/@claude-flow/shared/dist/events/example-usage.js +193 -0
- package/src/@claude-flow/shared/dist/events/index.d.ts +21 -0
- package/src/@claude-flow/shared/dist/events/index.js +22 -0
- package/src/@claude-flow/shared/dist/events/projections.d.ts +177 -0
- package/src/@claude-flow/shared/dist/events/projections.js +421 -0
- package/src/@claude-flow/shared/dist/events/rvf-event-log.d.ts +82 -0
- package/src/@claude-flow/shared/dist/events/rvf-event-log.js +340 -0
- package/src/@claude-flow/shared/dist/events/state-reconstructor.d.ts +101 -0
- package/src/@claude-flow/shared/dist/events/state-reconstructor.js +263 -0
- package/src/@claude-flow/shared/dist/events.d.ts +80 -0
- package/src/@claude-flow/shared/dist/events.js +249 -0
- package/src/@claude-flow/shared/dist/hooks/example-usage.d.ts +42 -0
- package/src/@claude-flow/shared/dist/hooks/example-usage.js +351 -0
- package/src/@claude-flow/shared/dist/hooks/executor.d.ts +100 -0
- package/src/@claude-flow/shared/dist/hooks/executor.js +267 -0
- package/src/@claude-flow/shared/dist/hooks/hooks.test.d.ts +9 -0
- package/src/@claude-flow/shared/dist/hooks/hooks.test.js +322 -0
- package/src/@claude-flow/shared/dist/hooks/index.d.ts +52 -0
- package/src/@claude-flow/shared/dist/hooks/index.js +51 -0
- package/src/@claude-flow/shared/dist/hooks/registry.d.ts +133 -0
- package/src/@claude-flow/shared/dist/hooks/registry.js +277 -0
- package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.d.ts +105 -0
- package/src/@claude-flow/shared/dist/hooks/safety/bash-safety.js +481 -0
- package/src/@claude-flow/shared/dist/hooks/safety/file-organization.d.ts +144 -0
- package/src/@claude-flow/shared/dist/hooks/safety/file-organization.js +328 -0
- package/src/@claude-flow/shared/dist/hooks/safety/git-commit.d.ts +158 -0
- package/src/@claude-flow/shared/dist/hooks/safety/git-commit.js +450 -0
- package/src/@claude-flow/shared/dist/hooks/safety/index.d.ts +17 -0
- package/src/@claude-flow/shared/dist/hooks/safety/index.js +17 -0
- package/src/@claude-flow/shared/dist/hooks/session-hooks.d.ts +234 -0
- package/src/@claude-flow/shared/dist/hooks/session-hooks.js +334 -0
- package/src/@claude-flow/shared/dist/hooks/task-hooks.d.ts +163 -0
- package/src/@claude-flow/shared/dist/hooks/task-hooks.js +326 -0
- package/src/@claude-flow/shared/dist/hooks/types.d.ts +267 -0
- package/src/@claude-flow/shared/dist/hooks/types.js +62 -0
- package/src/@claude-flow/shared/dist/hooks/verify-exports.test.d.ts +9 -0
- package/src/@claude-flow/shared/dist/hooks/verify-exports.test.js +93 -0
- package/src/@claude-flow/shared/dist/index.d.ts +20 -0
- package/src/@claude-flow/shared/dist/index.js +50 -0
- package/src/@claude-flow/shared/dist/mcp/connection-pool.d.ts +98 -0
- package/src/@claude-flow/shared/dist/mcp/connection-pool.js +364 -0
- package/src/@claude-flow/shared/dist/mcp/index.d.ts +69 -0
- package/src/@claude-flow/shared/dist/mcp/index.js +84 -0
- package/src/@claude-flow/shared/dist/mcp/server.d.ts +166 -0
- package/src/@claude-flow/shared/dist/mcp/server.js +593 -0
- package/src/@claude-flow/shared/dist/mcp/session-manager.d.ts +136 -0
- package/src/@claude-flow/shared/dist/mcp/session-manager.js +335 -0
- package/src/@claude-flow/shared/dist/mcp/tool-registry.d.ts +178 -0
- package/src/@claude-flow/shared/dist/mcp/tool-registry.js +439 -0
- package/src/@claude-flow/shared/dist/mcp/transport/http.d.ts +104 -0
- package/src/@claude-flow/shared/dist/mcp/transport/http.js +476 -0
- package/src/@claude-flow/shared/dist/mcp/transport/index.d.ts +102 -0
- package/src/@claude-flow/shared/dist/mcp/transport/index.js +238 -0
- package/src/@claude-flow/shared/dist/mcp/transport/stdio.d.ts +104 -0
- package/src/@claude-flow/shared/dist/mcp/transport/stdio.js +263 -0
- package/src/@claude-flow/shared/dist/mcp/transport/websocket.d.ts +133 -0
- package/src/@claude-flow/shared/dist/mcp/transport/websocket.js +396 -0
- package/src/@claude-flow/shared/dist/mcp/types.d.ts +438 -0
- package/src/@claude-flow/shared/dist/mcp/types.js +54 -0
- package/src/@claude-flow/shared/dist/plugin-interface.d.ts +544 -0
- package/src/@claude-flow/shared/dist/plugin-interface.js +23 -0
- package/src/@claude-flow/shared/dist/plugin-loader.d.ts +139 -0
- package/src/@claude-flow/shared/dist/plugin-loader.js +434 -0
- package/src/@claude-flow/shared/dist/plugin-registry.d.ts +183 -0
- package/src/@claude-flow/shared/dist/plugin-registry.js +457 -0
- package/src/@claude-flow/shared/dist/plugins/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/plugins/index.js +10 -0
- package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.d.ts +106 -0
- package/src/@claude-flow/shared/dist/plugins/official/hive-mind-plugin.js +241 -0
- package/src/@claude-flow/shared/dist/plugins/official/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/plugins/official/index.js +10 -0
- package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.d.ts +121 -0
- package/src/@claude-flow/shared/dist/plugins/official/maestro-plugin.js +355 -0
- package/src/@claude-flow/shared/dist/plugins/types.d.ts +93 -0
- package/src/@claude-flow/shared/dist/plugins/types.js +9 -0
- package/src/@claude-flow/shared/dist/resilience/bulkhead.d.ts +105 -0
- package/src/@claude-flow/shared/dist/resilience/bulkhead.js +206 -0
- package/src/@claude-flow/shared/dist/resilience/circuit-breaker.d.ts +132 -0
- package/src/@claude-flow/shared/dist/resilience/circuit-breaker.js +233 -0
- package/src/@claude-flow/shared/dist/resilience/index.d.ts +19 -0
- package/src/@claude-flow/shared/dist/resilience/index.js +19 -0
- package/src/@claude-flow/shared/dist/resilience/rate-limiter.d.ts +168 -0
- package/src/@claude-flow/shared/dist/resilience/rate-limiter.js +314 -0
- package/src/@claude-flow/shared/dist/resilience/retry.d.ts +91 -0
- package/src/@claude-flow/shared/dist/resilience/retry.js +159 -0
- package/src/@claude-flow/shared/dist/security/index.d.ts +10 -0
- package/src/@claude-flow/shared/dist/security/index.js +12 -0
- package/src/@claude-flow/shared/dist/security/input-validation.d.ts +73 -0
- package/src/@claude-flow/shared/dist/security/input-validation.js +201 -0
- package/src/@claude-flow/shared/dist/security/secure-random.d.ts +92 -0
- package/src/@claude-flow/shared/dist/security/secure-random.js +142 -0
- package/src/@claude-flow/shared/dist/services/index.d.ts +7 -0
- package/src/@claude-flow/shared/dist/services/index.js +7 -0
- package/src/@claude-flow/shared/dist/services/v3-progress.service.d.ts +124 -0
- package/src/@claude-flow/shared/dist/services/v3-progress.service.js +402 -0
- package/src/@claude-flow/shared/dist/types/agent.types.d.ts +137 -0
- package/src/@claude-flow/shared/dist/types/agent.types.js +6 -0
- package/src/@claude-flow/shared/dist/types/index.d.ts +11 -0
- package/src/@claude-flow/shared/dist/types/index.js +17 -0
- package/src/@claude-flow/shared/dist/types/mcp.types.d.ts +266 -0
- package/src/@claude-flow/shared/dist/types/mcp.types.js +7 -0
- package/src/@claude-flow/shared/dist/types/memory.types.d.ts +236 -0
- package/src/@claude-flow/shared/dist/types/memory.types.js +7 -0
- package/src/@claude-flow/shared/dist/types/swarm.types.d.ts +186 -0
- package/src/@claude-flow/shared/dist/types/swarm.types.js +65 -0
- package/src/@claude-flow/shared/dist/types/task.types.d.ts +178 -0
- package/src/@claude-flow/shared/dist/types/task.types.js +32 -0
- package/src/@claude-flow/shared/dist/types.d.ts +197 -0
- package/src/@claude-flow/shared/dist/types.js +21 -0
- package/src/@claude-flow/shared/dist/utils/secure-logger.d.ts +69 -0
- 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
|