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,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* V3 MCP Tool Registry
|
|
3
|
+
*
|
|
4
|
+
* High-performance tool management with:
|
|
5
|
+
* - Fast O(1) lookup using Map
|
|
6
|
+
* - Category-based organization
|
|
7
|
+
* - Tool validation on registration
|
|
8
|
+
* - Dynamic registration/unregistration
|
|
9
|
+
* - Caching for frequently used tools
|
|
10
|
+
*
|
|
11
|
+
* Performance Targets:
|
|
12
|
+
* - Tool registration: <10ms
|
|
13
|
+
* - Tool lookup: <1ms
|
|
14
|
+
* - Tool validation: <5ms
|
|
15
|
+
*/
|
|
16
|
+
import { EventEmitter } from 'events';
|
|
17
|
+
/**
|
|
18
|
+
* Tool Registry
|
|
19
|
+
*
|
|
20
|
+
* Manages registration, lookup, and execution of MCP tools
|
|
21
|
+
*/
|
|
22
|
+
export class ToolRegistry extends EventEmitter {
|
|
23
|
+
logger;
|
|
24
|
+
tools = new Map();
|
|
25
|
+
categoryIndex = new Map();
|
|
26
|
+
tagIndex = new Map();
|
|
27
|
+
defaultContext;
|
|
28
|
+
// Performance tracking
|
|
29
|
+
totalRegistrations = 0;
|
|
30
|
+
totalLookups = 0;
|
|
31
|
+
totalExecutions = 0;
|
|
32
|
+
constructor(logger) {
|
|
33
|
+
super();
|
|
34
|
+
this.logger = logger;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Register a tool
|
|
38
|
+
*/
|
|
39
|
+
register(tool, options = {}) {
|
|
40
|
+
const startTime = performance.now();
|
|
41
|
+
// Check for existing tool
|
|
42
|
+
if (this.tools.has(tool.name) && !options.override) {
|
|
43
|
+
this.logger.warn('Tool already registered', { name: tool.name });
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
// Validate tool if requested
|
|
47
|
+
if (options.validate !== false) {
|
|
48
|
+
const validation = this.validateTool(tool);
|
|
49
|
+
if (!validation.valid) {
|
|
50
|
+
this.logger.error('Tool validation failed', {
|
|
51
|
+
name: tool.name,
|
|
52
|
+
errors: validation.errors,
|
|
53
|
+
});
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Create metadata
|
|
58
|
+
const metadata = {
|
|
59
|
+
tool,
|
|
60
|
+
registeredAt: new Date(),
|
|
61
|
+
callCount: 0,
|
|
62
|
+
avgExecutionTime: 0,
|
|
63
|
+
errorCount: 0,
|
|
64
|
+
};
|
|
65
|
+
// Register tool
|
|
66
|
+
this.tools.set(tool.name, metadata);
|
|
67
|
+
this.totalRegistrations++;
|
|
68
|
+
// Update category index
|
|
69
|
+
if (tool.category) {
|
|
70
|
+
if (!this.categoryIndex.has(tool.category)) {
|
|
71
|
+
this.categoryIndex.set(tool.category, new Set());
|
|
72
|
+
}
|
|
73
|
+
this.categoryIndex.get(tool.category).add(tool.name);
|
|
74
|
+
}
|
|
75
|
+
// Update tag index
|
|
76
|
+
if (tool.tags) {
|
|
77
|
+
for (const tag of tool.tags) {
|
|
78
|
+
if (!this.tagIndex.has(tag)) {
|
|
79
|
+
this.tagIndex.set(tag, new Set());
|
|
80
|
+
}
|
|
81
|
+
this.tagIndex.get(tag).add(tool.name);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const duration = performance.now() - startTime;
|
|
85
|
+
this.logger.debug('Tool registered', {
|
|
86
|
+
name: tool.name,
|
|
87
|
+
category: tool.category,
|
|
88
|
+
duration: `${duration.toFixed(2)}ms`,
|
|
89
|
+
});
|
|
90
|
+
this.emit('tool:registered', tool.name);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Register multiple tools at once
|
|
95
|
+
*/
|
|
96
|
+
registerBatch(tools, options = {}) {
|
|
97
|
+
const startTime = performance.now();
|
|
98
|
+
const failed = [];
|
|
99
|
+
let registered = 0;
|
|
100
|
+
for (const tool of tools) {
|
|
101
|
+
if (this.register(tool, options)) {
|
|
102
|
+
registered++;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
failed.push(tool.name);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const duration = performance.now() - startTime;
|
|
109
|
+
this.logger.info('Batch registration complete', {
|
|
110
|
+
total: tools.length,
|
|
111
|
+
registered,
|
|
112
|
+
failed: failed.length,
|
|
113
|
+
duration: `${duration.toFixed(2)}ms`,
|
|
114
|
+
});
|
|
115
|
+
return { registered, failed };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Unregister a tool
|
|
119
|
+
*/
|
|
120
|
+
unregister(name) {
|
|
121
|
+
const metadata = this.tools.get(name);
|
|
122
|
+
if (!metadata) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
// Remove from category index
|
|
126
|
+
if (metadata.tool.category) {
|
|
127
|
+
const categoryTools = this.categoryIndex.get(metadata.tool.category);
|
|
128
|
+
categoryTools?.delete(name);
|
|
129
|
+
if (categoryTools?.size === 0) {
|
|
130
|
+
this.categoryIndex.delete(metadata.tool.category);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Remove from tag index
|
|
134
|
+
if (metadata.tool.tags) {
|
|
135
|
+
for (const tag of metadata.tool.tags) {
|
|
136
|
+
const tagTools = this.tagIndex.get(tag);
|
|
137
|
+
tagTools?.delete(name);
|
|
138
|
+
if (tagTools?.size === 0) {
|
|
139
|
+
this.tagIndex.delete(tag);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
this.tools.delete(name);
|
|
144
|
+
this.logger.debug('Tool unregistered', { name });
|
|
145
|
+
this.emit('tool:unregistered', name);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Get a tool by name
|
|
150
|
+
*/
|
|
151
|
+
getTool(name) {
|
|
152
|
+
this.totalLookups++;
|
|
153
|
+
return this.tools.get(name)?.tool;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Check if a tool exists
|
|
157
|
+
*/
|
|
158
|
+
hasTool(name) {
|
|
159
|
+
return this.tools.has(name);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get tool count
|
|
163
|
+
*/
|
|
164
|
+
getToolCount() {
|
|
165
|
+
return this.tools.size;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get all tool names
|
|
169
|
+
*/
|
|
170
|
+
getToolNames() {
|
|
171
|
+
return Array.from(this.tools.keys());
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* List all tools with metadata
|
|
175
|
+
*/
|
|
176
|
+
listTools() {
|
|
177
|
+
return Array.from(this.tools.values()).map(({ tool }) => ({
|
|
178
|
+
name: tool.name,
|
|
179
|
+
description: tool.description,
|
|
180
|
+
category: tool.category,
|
|
181
|
+
tags: tool.tags,
|
|
182
|
+
deprecated: tool.deprecated,
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Search tools by criteria
|
|
187
|
+
*/
|
|
188
|
+
search(options) {
|
|
189
|
+
let results;
|
|
190
|
+
// Filter by category
|
|
191
|
+
if (options.category) {
|
|
192
|
+
const categoryTools = this.categoryIndex.get(options.category);
|
|
193
|
+
if (!categoryTools)
|
|
194
|
+
return [];
|
|
195
|
+
results = new Set(categoryTools);
|
|
196
|
+
}
|
|
197
|
+
// Filter by tags (intersection)
|
|
198
|
+
if (options.tags && options.tags.length > 0) {
|
|
199
|
+
for (const tag of options.tags) {
|
|
200
|
+
const tagTools = this.tagIndex.get(tag);
|
|
201
|
+
if (!tagTools)
|
|
202
|
+
return [];
|
|
203
|
+
if (results) {
|
|
204
|
+
results = new Set([...results].filter((name) => tagTools.has(name)));
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
results = new Set(tagTools);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Get all tools if no filters applied
|
|
212
|
+
if (!results) {
|
|
213
|
+
results = new Set(this.tools.keys());
|
|
214
|
+
}
|
|
215
|
+
// Convert to tools and apply additional filters
|
|
216
|
+
const tools = [];
|
|
217
|
+
for (const name of results) {
|
|
218
|
+
const metadata = this.tools.get(name);
|
|
219
|
+
if (!metadata)
|
|
220
|
+
continue;
|
|
221
|
+
const tool = metadata.tool;
|
|
222
|
+
// Filter by deprecated status
|
|
223
|
+
if (options.deprecated !== undefined && tool.deprecated !== options.deprecated) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
// Filter by cacheable status
|
|
227
|
+
if (options.cacheable !== undefined && tool.cacheable !== options.cacheable) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
tools.push(tool);
|
|
231
|
+
}
|
|
232
|
+
return tools;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get tools by category
|
|
236
|
+
*/
|
|
237
|
+
getByCategory(category) {
|
|
238
|
+
const toolNames = this.categoryIndex.get(category);
|
|
239
|
+
if (!toolNames)
|
|
240
|
+
return [];
|
|
241
|
+
return Array.from(toolNames)
|
|
242
|
+
.map((name) => this.tools.get(name)?.tool)
|
|
243
|
+
.filter((tool) => tool !== undefined);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get tools by tag
|
|
247
|
+
*/
|
|
248
|
+
getByTag(tag) {
|
|
249
|
+
const toolNames = this.tagIndex.get(tag);
|
|
250
|
+
if (!toolNames)
|
|
251
|
+
return [];
|
|
252
|
+
return Array.from(toolNames)
|
|
253
|
+
.map((name) => this.tools.get(name)?.tool)
|
|
254
|
+
.filter((tool) => tool !== undefined);
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Get all categories
|
|
258
|
+
*/
|
|
259
|
+
getCategories() {
|
|
260
|
+
return Array.from(this.categoryIndex.keys());
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Get all tags
|
|
264
|
+
*/
|
|
265
|
+
getTags() {
|
|
266
|
+
return Array.from(this.tagIndex.keys());
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Execute a tool
|
|
270
|
+
*/
|
|
271
|
+
async execute(name, input, context) {
|
|
272
|
+
const startTime = performance.now();
|
|
273
|
+
const metadata = this.tools.get(name);
|
|
274
|
+
if (!metadata) {
|
|
275
|
+
return {
|
|
276
|
+
content: [{ type: 'text', text: `Tool not found: ${name}` }],
|
|
277
|
+
isError: true,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
// Build execution context with required sessionId
|
|
281
|
+
const execContext = {
|
|
282
|
+
sessionId: context?.sessionId || this.defaultContext?.sessionId || 'default-session',
|
|
283
|
+
...this.defaultContext,
|
|
284
|
+
...context,
|
|
285
|
+
};
|
|
286
|
+
this.totalExecutions++;
|
|
287
|
+
metadata.callCount++;
|
|
288
|
+
metadata.lastCalled = new Date();
|
|
289
|
+
try {
|
|
290
|
+
this.emit('tool:called', { name, input });
|
|
291
|
+
const result = await metadata.tool.handler(input, execContext);
|
|
292
|
+
const duration = performance.now() - startTime;
|
|
293
|
+
this.updateAverageExecutionTime(metadata, duration);
|
|
294
|
+
this.logger.debug('Tool executed', {
|
|
295
|
+
name,
|
|
296
|
+
duration: `${duration.toFixed(2)}ms`,
|
|
297
|
+
success: true,
|
|
298
|
+
});
|
|
299
|
+
this.emit('tool:completed', { name, duration, success: true });
|
|
300
|
+
// Format result
|
|
301
|
+
return {
|
|
302
|
+
content: [{
|
|
303
|
+
type: 'text',
|
|
304
|
+
text: typeof result === 'string' ? result : JSON.stringify(result, null, 2),
|
|
305
|
+
}],
|
|
306
|
+
isError: false,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
const duration = performance.now() - startTime;
|
|
311
|
+
metadata.errorCount++;
|
|
312
|
+
this.logger.error('Tool execution failed', { name, error });
|
|
313
|
+
this.emit('tool:error', { name, error, duration });
|
|
314
|
+
return {
|
|
315
|
+
content: [{
|
|
316
|
+
type: 'text',
|
|
317
|
+
text: `Error: ${error instanceof Error ? error.message : String(error)}`,
|
|
318
|
+
}],
|
|
319
|
+
isError: true,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Set default execution context
|
|
325
|
+
*/
|
|
326
|
+
setDefaultContext(context) {
|
|
327
|
+
this.defaultContext = context;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Get tool metadata
|
|
331
|
+
*/
|
|
332
|
+
getMetadata(name) {
|
|
333
|
+
return this.tools.get(name);
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Get registry statistics
|
|
337
|
+
*/
|
|
338
|
+
getStats() {
|
|
339
|
+
// Get top 10 most used tools
|
|
340
|
+
const topTools = Array.from(this.tools.entries())
|
|
341
|
+
.map(([name, metadata]) => ({ name, calls: metadata.callCount }))
|
|
342
|
+
.sort((a, b) => b.calls - a.calls)
|
|
343
|
+
.slice(0, 10);
|
|
344
|
+
return {
|
|
345
|
+
totalTools: this.tools.size,
|
|
346
|
+
totalCategories: this.categoryIndex.size,
|
|
347
|
+
totalTags: this.tagIndex.size,
|
|
348
|
+
totalRegistrations: this.totalRegistrations,
|
|
349
|
+
totalLookups: this.totalLookups,
|
|
350
|
+
totalExecutions: this.totalExecutions,
|
|
351
|
+
topTools,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Validate a tool definition
|
|
356
|
+
*/
|
|
357
|
+
validateTool(tool) {
|
|
358
|
+
const errors = [];
|
|
359
|
+
if (!tool.name || typeof tool.name !== 'string') {
|
|
360
|
+
errors.push('Tool name is required and must be a string');
|
|
361
|
+
}
|
|
362
|
+
else if (!/^[a-zA-Z][a-zA-Z0-9_/:-]*$/.test(tool.name)) {
|
|
363
|
+
errors.push('Tool name must start with a letter and contain only alphanumeric characters, underscores, slashes, colons, and hyphens');
|
|
364
|
+
}
|
|
365
|
+
if (!tool.description || typeof tool.description !== 'string') {
|
|
366
|
+
errors.push('Tool description is required and must be a string');
|
|
367
|
+
}
|
|
368
|
+
if (!tool.inputSchema || typeof tool.inputSchema !== 'object') {
|
|
369
|
+
errors.push('Tool inputSchema is required and must be an object');
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
const schemaErrors = this.validateSchema(tool.inputSchema);
|
|
373
|
+
errors.push(...schemaErrors);
|
|
374
|
+
}
|
|
375
|
+
if (typeof tool.handler !== 'function') {
|
|
376
|
+
errors.push('Tool handler is required and must be a function');
|
|
377
|
+
}
|
|
378
|
+
return {
|
|
379
|
+
valid: errors.length === 0,
|
|
380
|
+
errors,
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Validate JSON Schema
|
|
385
|
+
*/
|
|
386
|
+
validateSchema(schema, path = '') {
|
|
387
|
+
const errors = [];
|
|
388
|
+
if (!schema.type) {
|
|
389
|
+
errors.push(`${path || 'schema'}: type is required`);
|
|
390
|
+
}
|
|
391
|
+
if (schema.type === 'object' && schema.properties) {
|
|
392
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
393
|
+
const propPath = path ? `${path}.${key}` : key;
|
|
394
|
+
errors.push(...this.validateSchema(propSchema, propPath));
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
if (schema.type === 'array' && schema.items) {
|
|
398
|
+
errors.push(...this.validateSchema(schema.items, `${path}[]`));
|
|
399
|
+
}
|
|
400
|
+
return errors;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Update average execution time
|
|
404
|
+
*/
|
|
405
|
+
updateAverageExecutionTime(metadata, duration) {
|
|
406
|
+
const n = metadata.callCount;
|
|
407
|
+
metadata.avgExecutionTime =
|
|
408
|
+
((metadata.avgExecutionTime * (n - 1)) + duration) / n;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Clear all tools
|
|
412
|
+
*/
|
|
413
|
+
clear() {
|
|
414
|
+
this.tools.clear();
|
|
415
|
+
this.categoryIndex.clear();
|
|
416
|
+
this.tagIndex.clear();
|
|
417
|
+
this.logger.info('Tool registry cleared');
|
|
418
|
+
this.emit('registry:cleared');
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Create a tool registry
|
|
423
|
+
*/
|
|
424
|
+
export function createToolRegistry(logger) {
|
|
425
|
+
return new ToolRegistry(logger);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Helper to create a tool definition
|
|
429
|
+
*/
|
|
430
|
+
export function defineTool(name, description, inputSchema, handler, options) {
|
|
431
|
+
return {
|
|
432
|
+
name,
|
|
433
|
+
description,
|
|
434
|
+
inputSchema,
|
|
435
|
+
handler,
|
|
436
|
+
...options,
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1,104 @@
|
|
|
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 { ITransport, TransportType, MCPNotification, RequestHandler, NotificationHandler, TransportHealthStatus, ILogger, AuthConfig } from '../types.js';
|
|
16
|
+
/**
|
|
17
|
+
* HTTP Transport Configuration
|
|
18
|
+
*/
|
|
19
|
+
export interface HttpTransportConfig {
|
|
20
|
+
host: string;
|
|
21
|
+
port: number;
|
|
22
|
+
tlsEnabled?: boolean;
|
|
23
|
+
tlsCert?: string;
|
|
24
|
+
tlsKey?: string;
|
|
25
|
+
corsEnabled?: boolean;
|
|
26
|
+
corsOrigins?: string[];
|
|
27
|
+
auth?: AuthConfig;
|
|
28
|
+
maxRequestSize?: string;
|
|
29
|
+
requestTimeout?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* HTTP Transport Implementation
|
|
33
|
+
*/
|
|
34
|
+
export declare class HttpTransport extends EventEmitter implements ITransport {
|
|
35
|
+
private readonly logger;
|
|
36
|
+
private readonly config;
|
|
37
|
+
readonly type: TransportType;
|
|
38
|
+
private requestHandler?;
|
|
39
|
+
private notificationHandler?;
|
|
40
|
+
private app;
|
|
41
|
+
private server?;
|
|
42
|
+
private wss?;
|
|
43
|
+
private running;
|
|
44
|
+
private activeConnections;
|
|
45
|
+
private messagesReceived;
|
|
46
|
+
private messagesSent;
|
|
47
|
+
private errors;
|
|
48
|
+
private httpRequests;
|
|
49
|
+
private wsMessages;
|
|
50
|
+
constructor(logger: ILogger, config: HttpTransportConfig);
|
|
51
|
+
/**
|
|
52
|
+
* Start the transport
|
|
53
|
+
*/
|
|
54
|
+
start(): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Stop the transport
|
|
57
|
+
*/
|
|
58
|
+
stop(): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Register request handler
|
|
61
|
+
*/
|
|
62
|
+
onRequest(handler: RequestHandler): void;
|
|
63
|
+
/**
|
|
64
|
+
* Register notification handler
|
|
65
|
+
*/
|
|
66
|
+
onNotification(handler: NotificationHandler): void;
|
|
67
|
+
/**
|
|
68
|
+
* Get health status
|
|
69
|
+
*/
|
|
70
|
+
getHealthStatus(): Promise<TransportHealthStatus>;
|
|
71
|
+
/**
|
|
72
|
+
* Send notification to all connected WebSocket clients
|
|
73
|
+
*/
|
|
74
|
+
sendNotification(notification: MCPNotification): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Setup Express middleware
|
|
77
|
+
*/
|
|
78
|
+
private setupMiddleware;
|
|
79
|
+
/**
|
|
80
|
+
* Setup Express routes
|
|
81
|
+
*/
|
|
82
|
+
private setupRoutes;
|
|
83
|
+
/**
|
|
84
|
+
* Setup WebSocket handlers
|
|
85
|
+
*/
|
|
86
|
+
private setupWebSocketHandlers;
|
|
87
|
+
/**
|
|
88
|
+
* Handle HTTP request
|
|
89
|
+
*/
|
|
90
|
+
private handleHttpRequest;
|
|
91
|
+
/**
|
|
92
|
+
* Handle WebSocket message
|
|
93
|
+
*/
|
|
94
|
+
private handleWebSocketMessage;
|
|
95
|
+
/**
|
|
96
|
+
* Validate authentication
|
|
97
|
+
*/
|
|
98
|
+
private validateAuth;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create HTTP transport
|
|
102
|
+
*/
|
|
103
|
+
export declare function createHttpTransport(logger: ILogger, config: HttpTransportConfig): HttpTransport;
|
|
104
|
+
//# sourceMappingURL=http.d.ts.map
|