snow-flow 3.0.9 → 3.0.13
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-flow.bat +0 -0
- package/claude-flow.ps1 +0 -0
- package/dist/mcp/intelligent-reporting-mcp.d.ts +7 -0
- package/dist/mcp/intelligent-reporting-mcp.js +379 -0
- package/dist/mcp/servicenow-automation-mcp.js +0 -0
- package/dist/mcp/servicenow-deployment-mcp.js +0 -0
- package/dist/mcp/servicenow-integration-mcp.js +0 -0
- package/dist/mcp/servicenow-mcp-server.js +0 -0
- package/dist/mcp/servicenow-operations-mcp.js +0 -0
- package/dist/mcp/servicenow-platform-development-mcp.js +0 -0
- package/dist/mcp/servicenow-progressive-indexer.js +0 -0
- package/dist/mcp/servicenow-reporting-analytics-mcp.js +280 -29
- package/dist/mcp/servicenow-security-compliance-mcp.js +0 -0
- package/dist/mcp/servicenow-update-set-mcp.js +0 -0
- package/dist/mcp/start-all-mcp-servers.js +0 -0
- package/dist/mcp/start-servicenow-mcp.js +0 -0
- package/dist/services/widget-deployment-service.d.ts +2 -1
- package/dist/services/widget-deployment-service.js +17 -16
- package/dist/utils/anti-mock-data-validator.d.ts +66 -0
- package/dist/utils/anti-mock-data-validator.js +316 -0
- package/dist/utils/servicenow-eventual-consistency.d.ts +120 -0
- package/dist/utils/servicenow-eventual-consistency.js +220 -0
- package/memory/agents/README.md +1 -1
- package/memory/claude-flow-data.json +1 -1
- package/memory/sessions/README.md +1 -1
- package/package.json +4 -3
- package/.mcp.json +0 -22
- package/claude-flow.config.json +0 -20
- package/dist/agents/app-creator.agent.d.ts +0 -55
- package/dist/agents/app-creator.agent.js +0 -1292
- package/dist/agents/base/base-snow-agent.d.ts +0 -75
- package/dist/agents/base/base-snow-agent.js +0 -169
- package/dist/agents/base-snow-agent.d.ts +0 -63
- package/dist/agents/base-snow-agent.js +0 -296
- package/dist/agents/coordinator.d.ts +0 -200
- package/dist/agents/coordinator.js +0 -777
- package/dist/agents/flow-builder-agent.d.ts +0 -18
- package/dist/agents/flow-builder-agent.js +0 -197
- package/dist/agents/queen-403-handler.d.ts +0 -47
- package/dist/agents/queen-403-handler.js +0 -175
- package/dist/agents/queen-agent-example.d.ts +0 -23
- package/dist/agents/queen-agent-example.js +0 -240
- package/dist/agents/queen-agent.test.d.ts +0 -6
- package/dist/agents/script-generator.agent.d.ts +0 -32
- package/dist/agents/script-generator.agent.js +0 -772
- package/dist/agents/script-writer-agent.d.ts +0 -22
- package/dist/agents/script-writer-agent.js +0 -695
- package/dist/agents/security-agent.d.ts +0 -23
- package/dist/agents/security-agent.js +0 -619
- package/dist/agents/specialists/automation-specialist.agent.d.ts +0 -44
- package/dist/agents/specialists/automation-specialist.agent.js +0 -204
- package/dist/agents/specialists/data-specialist.agent.d.ts +0 -165
- package/dist/agents/specialists/data-specialist.agent.js +0 -484
- package/dist/agents/specialists/integration-specialist.agent.d.ts +0 -227
- package/dist/agents/specialists/integration-specialist.agent.js +0 -725
- package/dist/agents/specialists/reporting-specialist.agent.d.ts +0 -54
- package/dist/agents/specialists/reporting-specialist.agent.js +0 -193
- package/dist/agents/specialists/security-specialist.agent.d.ts +0 -85
- package/dist/agents/specialists/security-specialist.agent.js +0 -309
- package/dist/agents/teams/adaptive/adaptive-coordinator.agent.d.ts +0 -111
- package/dist/agents/teams/adaptive/adaptive-coordinator.agent.js +0 -383
- package/dist/agents/teams/base-team.d.ts +0 -72
- package/dist/agents/teams/base-team.js +0 -253
- package/dist/agents/teams/team-types.d.ts +0 -265
- package/dist/agents/teams/team-types.js +0 -3
- package/dist/agents/teams/widget/widget-architect.agent.d.ts +0 -61
- package/dist/agents/teams/widget/widget-architect.agent.js +0 -436
- package/dist/agents/teams/widget/widget-backend.agent.d.ts +0 -74
- package/dist/agents/teams/widget/widget-backend.agent.js +0 -1531
- package/dist/agents/teams/widget/widget-frontend.agent.d.ts +0 -67
- package/dist/agents/teams/widget/widget-frontend.agent.js +0 -1014
- package/dist/agents/teams/widget/widget-platform.agent.d.ts +0 -90
- package/dist/agents/teams/widget/widget-platform.agent.js +0 -1190
- package/dist/agents/teams/widget/widget-uiux.agent.d.ts +0 -107
- package/dist/agents/teams/widget/widget-uiux.agent.js +0 -1033
- package/dist/agents/test-agent.d.ts +0 -26
- package/dist/agents/test-agent.js +0 -734
- package/dist/agents/test-agents.d.ts +0 -7
- package/dist/agents/test-agents.js +0 -64
- package/dist/agents/ui-builder.agent.d.ts +0 -50
- package/dist/agents/ui-builder.agent.js +0 -1539
- package/dist/agents/widget-builder.agent.d.ts +0 -32
- package/dist/agents/widget-builder.agent.js +0 -439
- package/dist/agents/widget-creator-agent.d.ts +0 -18
- package/dist/agents/widget-creator-agent.js +0 -498
- package/dist/agents/workflow-designer.agent.d.ts +0 -31
- package/dist/agents/workflow-designer.agent.js +0 -583
- package/dist/api/error-handling.d.ts +0 -325
- package/dist/api/error-handling.js +0 -1488
- package/dist/api/flow-designer-api.d.ts +0 -167
- package/dist/api/flow-designer-api.js +0 -554
- package/dist/api/natural-language-mapper.d.ts +0 -124
- package/dist/api/natural-language-mapper.js +0 -501
- package/dist/api/performance-optimizer.d.ts +0 -240
- package/dist/api/performance-optimizer.js +0 -706
- package/dist/api/transaction-manager.d.ts +0 -189
- package/dist/api/transaction-manager.js +0 -576
- package/dist/assembly/team-assembler.d.ts +0 -140
- package/dist/assembly/team-assembler.js +0 -502
- package/dist/benchmark-performance.d.ts +0 -41
- package/dist/benchmark-performance.js +0 -230
- package/dist/cli/snow-flow-cli-integration.d.ts +0 -30
- package/dist/cli/snow-flow-cli-integration.js +0 -396
- package/dist/coordination/coordination-engine.d.ts +0 -41
- package/dist/coordination/coordination-engine.js +0 -324
- package/dist/coordination/coordination.test.d.ts +0 -6
- package/dist/coordination/example.d.ts +0 -31
- package/dist/coordination/example.js +0 -394
- package/dist/coordination/execution-patterns.d.ts +0 -43
- package/dist/coordination/execution-patterns.js +0 -507
- package/dist/coordination/factory.d.ts +0 -94
- package/dist/coordination/factory.js +0 -433
- package/dist/coordination/index.d.ts +0 -71
- package/dist/coordination/index.js +0 -135
- package/dist/coordination/progress-monitor.d.ts +0 -71
- package/dist/coordination/progress-monitor.js +0 -505
- package/dist/coordination/quality-gates.d.ts +0 -124
- package/dist/coordination/quality-gates.js +0 -577
- package/dist/coordination/shared-memory.d.ts +0 -39
- package/dist/coordination/shared-memory.js +0 -289
- package/dist/coordination/task-dependencies.d.ts +0 -50
- package/dist/coordination/task-dependencies.js +0 -407
- package/dist/coordination/team-coordinator.d.ts +0 -59
- package/dist/coordination/team-coordinator.js +0 -550
- package/dist/coordination/types.d.ts +0 -152
- package/dist/coordination/types.js +0 -3
- package/dist/mcp/mcp-wrapper.d.ts +0 -8
- package/dist/mcp/mcp-wrapper.js +0 -77
- package/dist/mcp/servicenow-flow-composer-enhanced.js +0 -396
- package/dist/mcp/servicenow-flow-composer-mcp.d.ts +0 -7
- package/dist/mcp/servicenow-flow-composer-mcp.js +0 -3103
- package/dist/mcp/servicenow-graph-memory-mcp.d.ts +0 -7
- package/dist/mcp/servicenow-intelligent-mcp.d.ts +0 -143
- package/dist/mcp/servicenow-intelligent-mcp.js +0 -4156
- package/dist/mcp/servicenow-xml-flow-mcp.d.ts +0 -53
- package/dist/mcp/servicenow-xml-flow-mcp.js +0 -1704
- package/dist/mcp/singleton-check.js +0 -31
- package/dist/mcp/test-simple-mcp.d.ts +0 -6
- package/dist/mcp/test-simple-mcp.js +0 -63
- package/dist/memory/hierarchical-memory-system.d.ts +0 -90
- package/dist/memory/hierarchical-memory-system.js +0 -400
- package/dist/memory/index.d.ts +0 -9
- package/dist/memory/index.js +0 -20
- package/dist/memory/mcp-integration-example.d.ts +0 -6
- package/dist/memory/mcp-integration-example.js +0 -281
- package/dist/memory/memory-client.d.ts +0 -199
- package/dist/memory/memory-client.js +0 -364
- package/dist/memory/memory-manager.d.ts +0 -29
- package/dist/memory/memory-manager.js +0 -280
- package/dist/memory/memory-operations.d.ts +0 -179
- package/dist/memory/memory-operations.js +0 -691
- package/dist/memory/memory-system.d.ts +0 -153
- package/dist/memory/memory-system.js +0 -651
- package/dist/memory/memory-test.d.ts +0 -6
- package/dist/memory/memory-test.js +0 -161
- package/dist/memory/snow-flow-memory-patterns.d.ts +0 -213
- package/dist/memory/snow-flow-memory-patterns.js +0 -200
- package/dist/memory/snow-memory.d.ts +0 -54
- package/dist/memory/snow-memory.js +0 -301
- package/dist/memory/swarm-memory.d.ts +0 -135
- package/dist/memory/swarm-memory.js +0 -378
- package/dist/optimization/flow-performance-optimizer.js +0 -723
- package/dist/orchestration/discovery/service-discovery.d.ts +0 -81
- package/dist/orchestration/discovery/service-discovery.js +0 -808
- package/dist/orchestration/distributed-orchestrator.d.ts +0 -131
- package/dist/orchestration/distributed-orchestrator.js +0 -712
- package/dist/orchestration/distribution/task-distribution-engine.d.ts +0 -53
- package/dist/orchestration/distribution/task-distribution-engine.js +0 -586
- package/dist/orchestration/flow-update-orchestrator.js +0 -648
- package/dist/orchestration/interfaces/distributed-orchestration.interface.d.ts +0 -606
- package/dist/orchestration/interfaces/distributed-orchestration.interface.js +0 -65
- package/dist/orchestration/protocols/mcpx-protocol.d.ts +0 -71
- package/dist/orchestration/protocols/mcpx-protocol.js +0 -668
- package/dist/orchestration/state/distributed-state-manager.d.ts +0 -89
- package/dist/orchestration/state/distributed-state-manager.js +0 -716
- package/dist/orchestrator/flow-composer.d.ts +0 -105
- package/dist/orchestrator/flow-composer.js +0 -404
- package/dist/orchestrator/flow-pattern-templates.d.ts +0 -260
- package/dist/orchestrator/flow-pattern-templates.js +0 -908
- package/dist/orchestrator/flow-subflow-decision-engine.d.ts +0 -202
- package/dist/orchestrator/flow-subflow-decision-engine.js +0 -769
- package/dist/orchestrator/flow-validation-engine.d.ts +0 -169
- package/dist/orchestrator/flow-validation-engine.js +0 -913
- package/dist/orchestrator/snow-orchestrator.d.ts +0 -49
- package/dist/orchestrator/snow-orchestrator.js +0 -235
- package/dist/orchestrator/subflow-creation-handler.d.ts +0 -230
- package/dist/orchestrator/subflow-creation-handler.js +0 -791
- package/dist/patterns/adaptive-patterns.d.ts +0 -140
- package/dist/patterns/adaptive-patterns.js +0 -549
- package/dist/queen/advanced-integration-test.d.ts +0 -48
- package/dist/queen/advanced-integration-test.js +0 -473
- package/dist/queen/integration-example.d.ts +0 -82
- package/dist/queen/integration-example.js +0 -219
- package/dist/queen/integration-test.d.ts +0 -72
- package/dist/queen/integration-test.js +0 -563
- package/dist/queen/mock-mcp-client.d.ts +0 -71
- package/dist/queen/mock-mcp-client.js +0 -317
- package/dist/queen/run-integration-tests.d.ts +0 -9
- package/dist/queen/run-integration-tests.js +0 -27
- package/dist/sparc/coordinators/adaptive-coordinator.d.ts +0 -54
- package/dist/sparc/coordinators/adaptive-coordinator.js +0 -367
- package/dist/sparc/coordinators/team-coordinator.d.ts +0 -66
- package/dist/sparc/coordinators/team-coordinator.js +0 -402
- package/dist/sparc/modes/team-modes.d.ts +0 -33
- package/dist/sparc/modes/team-modes.js +0 -399
- package/dist/sparc/teams/application-team.d.ts +0 -73
- package/dist/sparc/teams/application-team.js +0 -463
- package/dist/sparc/teams/flow-team.d.ts +0 -67
- package/dist/sparc/teams/flow-team.js +0 -373
- package/dist/sparc/teams/widget-team.d.ts +0 -61
- package/dist/sparc/teams/widget-team.js +0 -280
- package/dist/specialists/app-specialists.d.ts +0 -93
- package/dist/specialists/app-specialists.js +0 -1639
- package/dist/specialists/base-specialist.d.ts +0 -19
- package/dist/specialists/base-specialist.js +0 -54
- package/dist/specialists/flow-specialists.d.ts +0 -113
- package/dist/specialists/flow-specialists.js +0 -1787
- package/dist/specialists/individual-specialists.d.ts +0 -67
- package/dist/specialists/individual-specialists.js +0 -632
- package/dist/specialists/widget-specialists.d.ts +0 -70
- package/dist/specialists/widget-specialists.js +0 -1264
- package/dist/src/utils/agent-detector.js +0 -655
- package/dist/teams/adaptive-team.d.ts +0 -81
- package/dist/teams/adaptive-team.js +0 -1153
- package/dist/teams/application-team.d.ts +0 -30
- package/dist/teams/application-team.js +0 -547
- package/dist/teams/base-team.d.ts +0 -55
- package/dist/teams/base-team.js +0 -243
- package/dist/teams/flow-team.d.ts +0 -28
- package/dist/teams/flow-team.js +0 -525
- package/dist/teams/widget-team.d.ts +0 -26
- package/dist/teams/widget-team.js +0 -459
- package/dist/templates/flow-template-system.js +0 -625
- package/dist/test-fetch-incidents.d.ts +0 -2
- package/dist/test-fetch-incidents.js +0 -84
- package/dist/test-incident-access.d.ts +0 -2
- package/dist/test-incident-access.js +0 -72
- package/dist/test-iphone-flow.js +0 -189
- package/dist/test-limit-problem.d.ts +0 -2
- package/dist/test-limit-problem.js +0 -60
- package/dist/test-ml-batch-fix.d.ts +0 -2
- package/dist/test-ml-batch-fix.js +0 -104
- package/dist/test-ml-batch.d.ts +0 -2
- package/dist/test-ml-batch.js +0 -87
- package/dist/test-ml-query.d.ts +0 -2
- package/dist/test-ml-query.js +0 -100
- package/dist/test-ml-training-fix.d.ts +0 -12
- package/dist/test-ml-training-fix.js +0 -113
- package/dist/test-ml-training.d.ts +0 -2
- package/dist/test-ml-training.js +0 -32
- package/dist/test-operations-query.d.ts +0 -2
- package/dist/test-operations-query.js +0 -84
- package/dist/test-performance-query.d.ts +0 -2
- package/dist/test-performance-query.js +0 -52
- package/dist/test-singleton-protection.d.ts +0 -8
- package/dist/test-singleton-protection.js +0 -110
- package/dist/test-smart-limits.d.ts +0 -13
- package/dist/test-smart-limits.js +0 -100
- package/dist/test-snow-query-incidents.d.ts +0 -2
- package/dist/test-snow-query-incidents.js +0 -66
- package/dist/test-universal-query.d.ts +0 -2
- package/dist/test-universal-query.js +0 -106
- package/dist/testing/flow-testing-automation.js +0 -641
- package/dist/utils/complete-flow-xml-generator.js +0 -1285
- package/dist/utils/file-storage-fallback.d.ts +0 -62
- package/dist/utils/file-storage-fallback.js +0 -289
- package/dist/utils/flow-api-discovery.d.ts +0 -151
- package/dist/utils/flow-api-discovery.js +0 -439
- package/dist/utils/flow-examples.js +0 -720
- package/dist/utils/flow-structure-builder.js +0 -677
- package/dist/utils/flow-xml-generator.d.ts +0 -41
- package/dist/utils/flow-xml-generator.js +0 -258
- package/dist/utils/improved-flow-xml-generator.js +0 -820
- package/dist/utils/mcp-process-manager.backup.d.ts +0 -58
- package/dist/utils/mcp-process-manager.backup.js +0 -220
- package/dist/utils/mcp-singleton-enforcer.d.ts +0 -36
- package/dist/utils/mcp-singleton-enforcer.js +0 -201
- package/dist/utils/mcp-timeout-fix.d.ts +0 -53
- package/dist/utils/mcp-timeout-fix.js +0 -221
- package/dist/utils/migrate-claude-flow.d.ts +0 -22
- package/dist/utils/migrate-claude-flow.js +0 -120
- package/dist/utils/scope-utils.d.ts +0 -72
- package/dist/utils/scope-utils.js +0 -386
- package/dist/utils/snow-oauth-old.d.ts +0 -65
- package/dist/utils/snow-oauth-old.js +0 -345
- package/dist/utils/xml-first-flow-generator.js +0 -513
- package/memory/servicenow_artifacts/000d9224c895221055906c7518aa2d3d.json +0 -30
- package/memory/servicenow_artifacts/0196b66173303010e46b4a2214f6a7a2.json +0 -36
- package/memory/servicenow_artifacts/125e5d1d837e2a102a7ea130ceaad397.json +0 -30
- package/memory/servicenow_artifacts/7637c1f2b7112210a5e5911cde11a972.json +0 -30
- package/memory/servicenow_artifacts/default_documentation_tables_1754056582292.json +0 -55
- package/memory/servicenow_artifacts/default_documentation_tables_1754057477189.json +0 -55
- package/memory/update-set-sessions/01f82af583faea102a7ea130ceaad3d4.json +0 -9
- package/memory/update-set-sessions/27718fb983faea102a7ea130ceaad34b.json +0 -9
- package/memory/update-set-sessions/412e9bf6833e22502a7ea130ceaad30a.json +0 -8
- package/memory/update-set-sessions/66fc5a79837aea102a7ea130ceaad3ab.json +0 -9
- package/memory/update-set-sessions/71a30ff5837eea102a7ea130ceaad37f.json +0 -9
- package/memory/update-set-sessions/74fba27983faea102a7ea130ceaad3bd.json +0 -9
- package/memory/update-set-sessions/a0b147b5837eea102a7ea130ceaad344.json +0 -58
- package/memory/update-set-sessions/b13f5eb983baea102a7ea130ceaad33e.json +0 -9
- package/reports/swarm-auto-centralized-1752649029776.json +0 -13
- package/src/memory/README.md +0 -240
|
@@ -1,808 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Service Discovery System
|
|
4
|
-
*
|
|
5
|
-
* Handles automatic discovery and registration of Claude Code instances and MCP servers
|
|
6
|
-
* in the distributed orchestration environment.
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.MCPDiscoveryError = exports.AgentDiscoveryError = exports.MCPServiceDiscovery = exports.AgentDiscoveryService = void 0;
|
|
10
|
-
const events_1 = require("events");
|
|
11
|
-
const distributed_orchestration_interface_1 = require("../interfaces/distributed-orchestration.interface");
|
|
12
|
-
const logger_1 = require("../../utils/logger");
|
|
13
|
-
class AgentDiscoveryService extends events_1.EventEmitter {
|
|
14
|
-
constructor(config) {
|
|
15
|
-
super();
|
|
16
|
-
// Watch management
|
|
17
|
-
this.watchMappings = new Map();
|
|
18
|
-
this.discoveryConfig = config;
|
|
19
|
-
this.registry = new InMemoryServiceRegistry();
|
|
20
|
-
this.healthChecker = new HealthChecker(config.healthCheck);
|
|
21
|
-
this.announcer = new ServiceAnnouncer(config.announcement);
|
|
22
|
-
this.capabilityMatcher = new CapabilityMatcher();
|
|
23
|
-
this.loadMonitor = new LoadMonitor();
|
|
24
|
-
this.startPeriodicDiscovery();
|
|
25
|
-
}
|
|
26
|
-
// ========================================
|
|
27
|
-
// Agent Discovery
|
|
28
|
-
// ========================================
|
|
29
|
-
async discoverAgents(criteria = {}) {
|
|
30
|
-
logger_1.logger.info('🔍 Starting agent discovery', { criteria });
|
|
31
|
-
try {
|
|
32
|
-
// 1. Query registry for available services
|
|
33
|
-
const services = await this.registry.findServices('claude-code-agent', criteria);
|
|
34
|
-
logger_1.logger.info(`📋 Found ${services.length} registered services`);
|
|
35
|
-
// 2. Convert services to Claude Code instances
|
|
36
|
-
const instances = await this.convertServicesToInstances(services);
|
|
37
|
-
// 3. Filter by health status
|
|
38
|
-
const healthyInstances = await this.filterHealthyAgents(instances);
|
|
39
|
-
logger_1.logger.info(`💚 ${healthyInstances.length} healthy instances found`);
|
|
40
|
-
// 4. Apply discovery filters
|
|
41
|
-
const filteredInstances = this.applyFilters(healthyInstances, criteria.filters || []);
|
|
42
|
-
// 5. Sort by capability match and performance
|
|
43
|
-
const sortedInstances = await this.sortByRelevance(filteredInstances, criteria);
|
|
44
|
-
logger_1.logger.info(`✅ Discovery completed: ${sortedInstances.length} agents available`);
|
|
45
|
-
this.emit('agents:discovered', { agents: sortedInstances, criteria });
|
|
46
|
-
return sortedInstances;
|
|
47
|
-
}
|
|
48
|
-
catch (error) {
|
|
49
|
-
logger_1.logger.error('❌ Agent discovery failed', { error: error.message });
|
|
50
|
-
throw new AgentDiscoveryError(`Discovery failed: ${error.message}`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
async discoverAgentsByCapability(capabilities) {
|
|
54
|
-
const criteria = {
|
|
55
|
-
capabilities,
|
|
56
|
-
healthStatus: 'healthy'
|
|
57
|
-
};
|
|
58
|
-
const agents = await this.discoverAgents(criteria);
|
|
59
|
-
// Score by capability match
|
|
60
|
-
return agents
|
|
61
|
-
.map(agent => ({
|
|
62
|
-
agent,
|
|
63
|
-
score: this.capabilityMatcher.scoreMatch(agent.capabilities, capabilities)
|
|
64
|
-
}))
|
|
65
|
-
.sort((a, b) => b.score - a.score)
|
|
66
|
-
.map(item => item.agent);
|
|
67
|
-
}
|
|
68
|
-
async discoverAgentsByRegion(regions) {
|
|
69
|
-
const regionMap = new Map();
|
|
70
|
-
for (const region of regions) {
|
|
71
|
-
const criteria = {
|
|
72
|
-
regions: [region],
|
|
73
|
-
healthStatus: 'healthy'
|
|
74
|
-
};
|
|
75
|
-
const agents = await this.discoverAgents(criteria);
|
|
76
|
-
regionMap.set(region, agents);
|
|
77
|
-
}
|
|
78
|
-
return regionMap;
|
|
79
|
-
}
|
|
80
|
-
// ========================================
|
|
81
|
-
// Service Registration
|
|
82
|
-
// ========================================
|
|
83
|
-
async announceService(instance) {
|
|
84
|
-
logger_1.logger.info(`📢 Announcing Claude Code instance: ${instance.id}`, {
|
|
85
|
-
endpoint: instance.endpoint,
|
|
86
|
-
capabilities: instance.capabilities.length
|
|
87
|
-
});
|
|
88
|
-
try {
|
|
89
|
-
const serviceDefinition = {
|
|
90
|
-
id: instance.id,
|
|
91
|
-
name: 'claude-code-agent',
|
|
92
|
-
endpoint: instance.endpoint,
|
|
93
|
-
metadata: {
|
|
94
|
-
...instance.metadata,
|
|
95
|
-
capabilities: instance.capabilities,
|
|
96
|
-
authentication: instance.authentication,
|
|
97
|
-
announcedAt: new Date()
|
|
98
|
-
},
|
|
99
|
-
health: {
|
|
100
|
-
check: `${instance.endpoint}/health`,
|
|
101
|
-
interval: this.discoveryConfig.healthCheck.interval,
|
|
102
|
-
timeout: this.discoveryConfig.healthCheck.timeout,
|
|
103
|
-
retries: 3,
|
|
104
|
-
gracePeriod: 30000
|
|
105
|
-
},
|
|
106
|
-
tags: this.extractTags(instance),
|
|
107
|
-
capabilities: instance.capabilities,
|
|
108
|
-
registeredAt: new Date(),
|
|
109
|
-
lastSeen: new Date()
|
|
110
|
-
};
|
|
111
|
-
await this.registry.register(serviceDefinition);
|
|
112
|
-
// Start health monitoring for this instance
|
|
113
|
-
await this.healthChecker.startMonitoring(serviceDefinition);
|
|
114
|
-
logger_1.logger.info(`✅ Successfully announced service: ${instance.id}`);
|
|
115
|
-
this.emit('service:announced', { instance, serviceDefinition });
|
|
116
|
-
}
|
|
117
|
-
catch (error) {
|
|
118
|
-
logger_1.logger.error(`❌ Failed to announce service: ${instance.id}`, { error: error.message });
|
|
119
|
-
throw new ServiceAnnouncementError(`Announcement failed: ${error.message}`);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
async deannounceService(instanceId) {
|
|
123
|
-
logger_1.logger.info(`📴 Deannouncing service: ${instanceId}`);
|
|
124
|
-
try {
|
|
125
|
-
await this.registry.deregister(instanceId);
|
|
126
|
-
await this.healthChecker.stopMonitoring(instanceId);
|
|
127
|
-
logger_1.logger.info(`✅ Successfully deannounced service: ${instanceId}`);
|
|
128
|
-
this.emit('service:deannounced', { instanceId });
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
logger_1.logger.error(`❌ Failed to deannounce service: ${instanceId}`, { error: error.message });
|
|
132
|
-
throw error;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
// ========================================
|
|
136
|
-
// Continuous Discovery
|
|
137
|
-
// ========================================
|
|
138
|
-
async watchAgents(criteria, callback) {
|
|
139
|
-
logger_1.logger.info('👁️ Starting agent watch', { criteria });
|
|
140
|
-
const watchId = this.generateWatchId();
|
|
141
|
-
// Initial discovery
|
|
142
|
-
const initialAgents = await this.discoverAgents(criteria);
|
|
143
|
-
callback(initialAgents);
|
|
144
|
-
// Set up continuous watching
|
|
145
|
-
const serviceWatchId = await this.registry.watchServices('claude-code-agent', async (event) => {
|
|
146
|
-
logger_1.logger.debug('🔄 Service registry event received', { type: event.type, serviceId: event.service.id });
|
|
147
|
-
// Re-discover agents when services change
|
|
148
|
-
const updatedAgents = await this.discoverAgents(criteria);
|
|
149
|
-
callback(updatedAgents);
|
|
150
|
-
});
|
|
151
|
-
// Store watch mapping for cleanup
|
|
152
|
-
this.storeWatchMapping(watchId, serviceWatchId);
|
|
153
|
-
return watchId;
|
|
154
|
-
}
|
|
155
|
-
async unwatchAgents(watchId) {
|
|
156
|
-
logger_1.logger.info(`🛑 Stopping agent watch: ${watchId}`);
|
|
157
|
-
const serviceWatchId = this.getServiceWatchId(watchId);
|
|
158
|
-
if (serviceWatchId) {
|
|
159
|
-
await this.registry.unwatchServices(serviceWatchId);
|
|
160
|
-
this.cleanupWatchMapping(watchId);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
// ========================================
|
|
164
|
-
// Health Management
|
|
165
|
-
// ========================================
|
|
166
|
-
async filterHealthyAgents(instances) {
|
|
167
|
-
const healthChecks = await Promise.allSettled(instances.map(instance => this.healthChecker.checkHealth(instance)));
|
|
168
|
-
return instances.filter((instance, index) => {
|
|
169
|
-
const result = healthChecks[index];
|
|
170
|
-
if (result.status === 'fulfilled' && result.value.healthy) {
|
|
171
|
-
return true;
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
logger_1.logger.warn(`🩺 Health check failed for agent: ${instance.id}`, {
|
|
175
|
-
reason: result.status === 'rejected' ? result.reason : result.value.reason
|
|
176
|
-
});
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
// ========================================
|
|
182
|
-
// Utility Methods
|
|
183
|
-
// ========================================
|
|
184
|
-
async convertServicesToInstances(services) {
|
|
185
|
-
return services.map(service => ({
|
|
186
|
-
id: service.id,
|
|
187
|
-
endpoint: service.endpoint,
|
|
188
|
-
capabilities: service.capabilities || [],
|
|
189
|
-
status: this.determineInstanceStatus(service),
|
|
190
|
-
metadata: {
|
|
191
|
-
region: service.metadata.region || 'unknown',
|
|
192
|
-
version: service.metadata.version || '1.0.0',
|
|
193
|
-
maxConcurrentTasks: service.metadata.maxConcurrentTasks || 5,
|
|
194
|
-
specializations: service.metadata.specializations || [],
|
|
195
|
-
performanceMetrics: service.metadata.performanceMetrics || this.getDefaultMetrics(),
|
|
196
|
-
tags: service.metadata.tags || {}
|
|
197
|
-
},
|
|
198
|
-
healthcheck: {
|
|
199
|
-
lastSeen: service.lastSeen,
|
|
200
|
-
responseTime: service.metadata.responseTime || 0,
|
|
201
|
-
errorRate: service.metadata.errorRate || 0,
|
|
202
|
-
consecutiveFailures: service.metadata.consecutiveFailures || 0
|
|
203
|
-
},
|
|
204
|
-
authentication: service.metadata.authentication || {}
|
|
205
|
-
}));
|
|
206
|
-
}
|
|
207
|
-
determineInstanceStatus(service) {
|
|
208
|
-
const timeSinceLastSeen = Date.now() - service.lastSeen.getTime();
|
|
209
|
-
if (timeSinceLastSeen > 300000) { // 5 minutes
|
|
210
|
-
return distributed_orchestration_interface_1.InstanceStatus.OFFLINE;
|
|
211
|
-
}
|
|
212
|
-
else if (timeSinceLastSeen > 60000) { // 1 minute
|
|
213
|
-
return distributed_orchestration_interface_1.InstanceStatus.UNREACHABLE;
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
return service.metadata.status || distributed_orchestration_interface_1.InstanceStatus.ACTIVE;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
extractTags(instance) {
|
|
220
|
-
const tags = ['claude-code', 'agent'];
|
|
221
|
-
// Add capability-based tags
|
|
222
|
-
instance.capabilities.forEach(cap => {
|
|
223
|
-
tags.push(`domain:${cap.domain}`);
|
|
224
|
-
tags.push(`proficiency:${cap.proficiencyLevel}`);
|
|
225
|
-
cap.specialization.forEach(spec => tags.push(`specialization:${spec}`));
|
|
226
|
-
});
|
|
227
|
-
// Add metadata tags
|
|
228
|
-
if (instance.metadata.region) {
|
|
229
|
-
tags.push(`region:${instance.metadata.region}`);
|
|
230
|
-
}
|
|
231
|
-
if (instance.metadata.version) {
|
|
232
|
-
tags.push(`version:${instance.metadata.version}`);
|
|
233
|
-
}
|
|
234
|
-
return tags;
|
|
235
|
-
}
|
|
236
|
-
applyFilters(instances, filters) {
|
|
237
|
-
return instances.filter(instance => {
|
|
238
|
-
return filters.every(filter => this.evaluateFilter(instance, filter));
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
evaluateFilter(instance, filter) {
|
|
242
|
-
const value = this.getPropertyValue(instance, filter.property);
|
|
243
|
-
switch (filter.operator) {
|
|
244
|
-
case 'equals':
|
|
245
|
-
return value === filter.value;
|
|
246
|
-
case 'contains':
|
|
247
|
-
return String(value).toLowerCase().includes(String(filter.value).toLowerCase());
|
|
248
|
-
case 'greater_than':
|
|
249
|
-
return Number(value) > Number(filter.value);
|
|
250
|
-
case 'less_than':
|
|
251
|
-
return Number(value) < Number(filter.value);
|
|
252
|
-
default:
|
|
253
|
-
return true;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
getPropertyValue(instance, property) {
|
|
257
|
-
const path = property.split('.');
|
|
258
|
-
let value = instance;
|
|
259
|
-
for (const key of path) {
|
|
260
|
-
value = value?.[key];
|
|
261
|
-
if (value === undefined)
|
|
262
|
-
break;
|
|
263
|
-
}
|
|
264
|
-
return value;
|
|
265
|
-
}
|
|
266
|
-
async sortByRelevance(instances, criteria) {
|
|
267
|
-
const scoredInstances = instances.map(instance => ({
|
|
268
|
-
instance,
|
|
269
|
-
score: this.calculateRelevanceScore(instance, criteria)
|
|
270
|
-
}));
|
|
271
|
-
return scoredInstances
|
|
272
|
-
.sort((a, b) => b.score - a.score)
|
|
273
|
-
.map(item => item.instance);
|
|
274
|
-
}
|
|
275
|
-
calculateRelevanceScore(instance, criteria) {
|
|
276
|
-
let score = 0.5; // Base score
|
|
277
|
-
// Capability match score
|
|
278
|
-
if (criteria.capabilities && criteria.capabilities.length > 0) {
|
|
279
|
-
const capabilityScore = this.capabilityMatcher.scoreMatch(instance.capabilities, criteria.capabilities);
|
|
280
|
-
score += capabilityScore * 0.4;
|
|
281
|
-
}
|
|
282
|
-
// Performance score
|
|
283
|
-
const performanceScore = this.calculatePerformanceScore(instance);
|
|
284
|
-
score += performanceScore * 0.3;
|
|
285
|
-
// Health score
|
|
286
|
-
const healthScore = this.calculateHealthScore(instance);
|
|
287
|
-
score += healthScore * 0.2;
|
|
288
|
-
// Load score
|
|
289
|
-
const loadScore = this.loadMonitor.getLoadScore(instance.id);
|
|
290
|
-
score += loadScore * 0.1;
|
|
291
|
-
return Math.min(Math.max(score, 0), 1);
|
|
292
|
-
}
|
|
293
|
-
calculatePerformanceScore(instance) {
|
|
294
|
-
const metrics = instance.metadata.performanceMetrics;
|
|
295
|
-
const responseTimeScore = Math.max(0, 1 - (metrics.averageResponseTime / 10000));
|
|
296
|
-
const throughputScore = Math.min(1, metrics.throughput / 100);
|
|
297
|
-
const errorRateScore = Math.max(0, 1 - (metrics.errorRate * 10));
|
|
298
|
-
return (responseTimeScore + throughputScore + errorRateScore) / 3;
|
|
299
|
-
}
|
|
300
|
-
calculateHealthScore(instance) {
|
|
301
|
-
const timeSinceLastSeen = Date.now() - instance.healthcheck.lastSeen.getTime();
|
|
302
|
-
const timeScore = Math.max(0, 1 - (timeSinceLastSeen / 300000)); // 5 minute max
|
|
303
|
-
const failureScore = Math.max(0, 1 - (instance.healthcheck.consecutiveFailures * 0.2));
|
|
304
|
-
return (timeScore + failureScore) / 2;
|
|
305
|
-
}
|
|
306
|
-
startPeriodicDiscovery() {
|
|
307
|
-
const interval = this.discoveryConfig.discoveryInterval || 60000; // 1 minute default
|
|
308
|
-
setInterval(async () => {
|
|
309
|
-
try {
|
|
310
|
-
logger_1.logger.debug('🔄 Running periodic discovery sweep');
|
|
311
|
-
// Discover all agents and emit updates
|
|
312
|
-
const agents = await this.discoverAgents();
|
|
313
|
-
this.emit('discovery:sweep', { agents, timestamp: new Date() });
|
|
314
|
-
}
|
|
315
|
-
catch (error) {
|
|
316
|
-
logger_1.logger.warn('⚠️ Periodic discovery sweep failed', { error: error.message });
|
|
317
|
-
}
|
|
318
|
-
}, interval);
|
|
319
|
-
}
|
|
320
|
-
getDefaultMetrics() {
|
|
321
|
-
return {
|
|
322
|
-
averageResponseTime: 1000,
|
|
323
|
-
throughput: 10,
|
|
324
|
-
errorRate: 0.01,
|
|
325
|
-
cpuUtilization: 0.5,
|
|
326
|
-
memoryUtilization: 0.5,
|
|
327
|
-
taskCompletionRate: 0.95
|
|
328
|
-
};
|
|
329
|
-
}
|
|
330
|
-
generateWatchId() {
|
|
331
|
-
return `watch_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
332
|
-
}
|
|
333
|
-
storeWatchMapping(watchId, serviceWatchId) {
|
|
334
|
-
this.watchMappings.set(watchId, serviceWatchId);
|
|
335
|
-
}
|
|
336
|
-
getServiceWatchId(watchId) {
|
|
337
|
-
return this.watchMappings.get(watchId);
|
|
338
|
-
}
|
|
339
|
-
cleanupWatchMapping(watchId) {
|
|
340
|
-
this.watchMappings.delete(watchId);
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
exports.AgentDiscoveryService = AgentDiscoveryService;
|
|
344
|
-
// ========================================
|
|
345
|
-
// MCP Service Discovery
|
|
346
|
-
// ========================================
|
|
347
|
-
class MCPServiceDiscovery extends events_1.EventEmitter {
|
|
348
|
-
constructor() {
|
|
349
|
-
super();
|
|
350
|
-
this.mcpRegistry = new MCPRegistry();
|
|
351
|
-
this.capabilityMatcher = new CapabilityMatcher();
|
|
352
|
-
this.performanceTracker = new MCPPerformanceTracker();
|
|
353
|
-
}
|
|
354
|
-
async discoverMCPServers(requirements) {
|
|
355
|
-
logger_1.logger.info('🔍 Discovering MCP servers', { requirements });
|
|
356
|
-
try {
|
|
357
|
-
// 1. Query registry for available MCP servers
|
|
358
|
-
const availableServers = await this.mcpRegistry.listServers();
|
|
359
|
-
logger_1.logger.info(`📋 Found ${availableServers.length} registered MCP servers`);
|
|
360
|
-
// 2. Filter by capability requirements
|
|
361
|
-
const compatibleServers = await this.capabilityMatcher.filterMCPServers(availableServers, requirements.capabilities);
|
|
362
|
-
logger_1.logger.info(`🔧 ${compatibleServers.length} servers match capability requirements`);
|
|
363
|
-
// 3. Filter by performance requirements
|
|
364
|
-
const performanceFiltered = await this.filterByPerformance(compatibleServers, requirements.performance || []);
|
|
365
|
-
// 4. Score and rank servers
|
|
366
|
-
const rankedServers = this.rankMCPServers(performanceFiltered, requirements);
|
|
367
|
-
logger_1.logger.info(`✅ MCP discovery completed: ${rankedServers.length} servers available`);
|
|
368
|
-
this.emit('mcp:discovered', { servers: rankedServers, requirements });
|
|
369
|
-
return rankedServers;
|
|
370
|
-
}
|
|
371
|
-
catch (error) {
|
|
372
|
-
logger_1.logger.error('❌ MCP discovery failed', { error: error.message });
|
|
373
|
-
throw new MCPDiscoveryError(`MCP discovery failed: ${error.message}`);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
async registerMCPServer(serverInfo) {
|
|
377
|
-
logger_1.logger.info(`📢 Registering MCP server: ${serverInfo.name}`, {
|
|
378
|
-
endpoint: serverInfo.endpoint,
|
|
379
|
-
capabilities: serverInfo.capabilities.length
|
|
380
|
-
});
|
|
381
|
-
try {
|
|
382
|
-
// 1. Validate MCP server capabilities
|
|
383
|
-
const validation = await this.validateMCPServer(serverInfo);
|
|
384
|
-
if (!validation.valid) {
|
|
385
|
-
throw new MCPValidationError(`Invalid MCP server: ${validation.reason}`);
|
|
386
|
-
}
|
|
387
|
-
// 2. Introspect capabilities if not provided
|
|
388
|
-
if (serverInfo.capabilities.length === 0) {
|
|
389
|
-
serverInfo.capabilities = await this.introspectCapabilities(serverInfo);
|
|
390
|
-
}
|
|
391
|
-
// 3. Register with enhanced metadata
|
|
392
|
-
await this.mcpRegistry.register({
|
|
393
|
-
...serverInfo,
|
|
394
|
-
discoveredAt: new Date(),
|
|
395
|
-
lastValidated: new Date()
|
|
396
|
-
});
|
|
397
|
-
// 4. Start performance monitoring
|
|
398
|
-
await this.performanceTracker.startTracking(serverInfo);
|
|
399
|
-
logger_1.logger.info(`✅ Successfully registered MCP server: ${serverInfo.name}`);
|
|
400
|
-
this.emit('mcp:registered', { serverInfo });
|
|
401
|
-
}
|
|
402
|
-
catch (error) {
|
|
403
|
-
logger_1.logger.error(`❌ Failed to register MCP server: ${serverInfo.name}`, { error: error.message });
|
|
404
|
-
throw error;
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
async deregisterMCPServer(serverId) {
|
|
408
|
-
logger_1.logger.info(`📴 Deregistering MCP server: ${serverId}`);
|
|
409
|
-
try {
|
|
410
|
-
await this.mcpRegistry.deregister(serverId);
|
|
411
|
-
await this.performanceTracker.stopTracking(serverId);
|
|
412
|
-
logger_1.logger.info(`✅ Successfully deregistered MCP server: ${serverId}`);
|
|
413
|
-
this.emit('mcp:deregistered', { serverId });
|
|
414
|
-
}
|
|
415
|
-
catch (error) {
|
|
416
|
-
logger_1.logger.error(`❌ Failed to deregister MCP server: ${serverId}`, { error: error.message });
|
|
417
|
-
throw error;
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
async filterByPerformance(servers, requirements) {
|
|
421
|
-
if (requirements.length === 0)
|
|
422
|
-
return servers;
|
|
423
|
-
return servers.filter(server => {
|
|
424
|
-
const performance = this.performanceTracker.getPerformance(server.id);
|
|
425
|
-
return requirements.every(req => this.meetsPerformanceRequirement(performance, req));
|
|
426
|
-
});
|
|
427
|
-
}
|
|
428
|
-
meetsPerformanceRequirement(performance, requirement) {
|
|
429
|
-
if (!performance)
|
|
430
|
-
return false;
|
|
431
|
-
switch (requirement.metric) {
|
|
432
|
-
case 'response_time':
|
|
433
|
-
return performance.averageResponseTime <= requirement.threshold;
|
|
434
|
-
case 'throughput':
|
|
435
|
-
return performance.throughput >= requirement.threshold;
|
|
436
|
-
case 'availability':
|
|
437
|
-
return performance.availability >= requirement.threshold;
|
|
438
|
-
default:
|
|
439
|
-
return true;
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
rankMCPServers(servers, requirements) {
|
|
443
|
-
return servers
|
|
444
|
-
.map(server => ({
|
|
445
|
-
server,
|
|
446
|
-
score: this.calculateMCPScore(server, requirements)
|
|
447
|
-
}))
|
|
448
|
-
.sort((a, b) => b.score - a.score)
|
|
449
|
-
.map(item => item.server);
|
|
450
|
-
}
|
|
451
|
-
calculateMCPScore(server, requirements) {
|
|
452
|
-
let score = 0.5; // Base score
|
|
453
|
-
// Capability match score
|
|
454
|
-
const capabilityScore = this.capabilityMatcher.scoreMCPMatch(server.capabilities, requirements.capabilities);
|
|
455
|
-
score += capabilityScore * 0.6;
|
|
456
|
-
// Performance score
|
|
457
|
-
const performance = this.performanceTracker.getPerformance(server.id);
|
|
458
|
-
if (performance) {
|
|
459
|
-
const performanceScore = this.calculateMCPPerformanceScore(performance);
|
|
460
|
-
score += performanceScore * 0.3;
|
|
461
|
-
}
|
|
462
|
-
// Recency score (prefer recently updated servers)
|
|
463
|
-
const recencyScore = this.calculateRecencyScore(server);
|
|
464
|
-
score += recencyScore * 0.1;
|
|
465
|
-
return Math.min(Math.max(score, 0), 1);
|
|
466
|
-
}
|
|
467
|
-
calculateMCPPerformanceScore(performance) {
|
|
468
|
-
const responseTimeScore = Math.max(0, 1 - (performance.averageResponseTime / 5000)); // 5s max
|
|
469
|
-
const throughputScore = Math.min(1, performance.throughput / 50); // 50 req/s max
|
|
470
|
-
const availabilityScore = performance.availability;
|
|
471
|
-
return (responseTimeScore + throughputScore + availabilityScore) / 3;
|
|
472
|
-
}
|
|
473
|
-
calculateRecencyScore(server) {
|
|
474
|
-
const daysSinceUpdate = (Date.now() - server.lastValidated.getTime()) / (1000 * 60 * 60 * 24);
|
|
475
|
-
return Math.max(0, 1 - (daysSinceUpdate / 30)); // 30 days max
|
|
476
|
-
}
|
|
477
|
-
async validateMCPServer(serverInfo) {
|
|
478
|
-
try {
|
|
479
|
-
// Basic validation checks
|
|
480
|
-
if (!serverInfo.endpoint) {
|
|
481
|
-
return { valid: false, reason: 'Missing endpoint' };
|
|
482
|
-
}
|
|
483
|
-
if (!serverInfo.name) {
|
|
484
|
-
return { valid: false, reason: 'Missing name' };
|
|
485
|
-
}
|
|
486
|
-
// Try to connect and validate
|
|
487
|
-
const client = new MCPClient(serverInfo.endpoint);
|
|
488
|
-
const connectionTest = await client.testConnection();
|
|
489
|
-
if (!connectionTest.success) {
|
|
490
|
-
return { valid: false, reason: `Connection failed: ${connectionTest.error}` };
|
|
491
|
-
}
|
|
492
|
-
return { valid: true };
|
|
493
|
-
}
|
|
494
|
-
catch (error) {
|
|
495
|
-
return { valid: false, reason: `Validation error: ${error.message}` };
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
async introspectCapabilities(serverInfo) {
|
|
499
|
-
logger_1.logger.info(`🔍 Introspecting capabilities for: ${serverInfo.name}`);
|
|
500
|
-
try {
|
|
501
|
-
const client = new MCPClient(serverInfo.endpoint);
|
|
502
|
-
// Get available tools and resources
|
|
503
|
-
const [tools, resources] = await Promise.all([
|
|
504
|
-
client.listTools(),
|
|
505
|
-
client.listResources()
|
|
506
|
-
]);
|
|
507
|
-
const capabilities = [];
|
|
508
|
-
// Convert tools to capabilities
|
|
509
|
-
tools.forEach(tool => {
|
|
510
|
-
capabilities.push({
|
|
511
|
-
type: 'tool',
|
|
512
|
-
name: tool.name,
|
|
513
|
-
description: tool.description || '',
|
|
514
|
-
schema: tool.inputSchema,
|
|
515
|
-
metadata: { tool }
|
|
516
|
-
});
|
|
517
|
-
});
|
|
518
|
-
// Convert resources to capabilities
|
|
519
|
-
resources.forEach(resource => {
|
|
520
|
-
capabilities.push({
|
|
521
|
-
type: 'resource',
|
|
522
|
-
name: resource.name,
|
|
523
|
-
description: resource.description || '',
|
|
524
|
-
metadata: { resource }
|
|
525
|
-
});
|
|
526
|
-
});
|
|
527
|
-
logger_1.logger.info(`✅ Introspected ${capabilities.length} capabilities`);
|
|
528
|
-
return capabilities;
|
|
529
|
-
}
|
|
530
|
-
catch (error) {
|
|
531
|
-
logger_1.logger.warn(`⚠️ Failed to introspect capabilities for ${serverInfo.name}`, { error: error.message });
|
|
532
|
-
return [];
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
exports.MCPServiceDiscovery = MCPServiceDiscovery;
|
|
537
|
-
// ========================================
|
|
538
|
-
// Supporting Classes
|
|
539
|
-
// ========================================
|
|
540
|
-
class InMemoryServiceRegistry {
|
|
541
|
-
constructor() {
|
|
542
|
-
this.services = new Map();
|
|
543
|
-
this.watchers = new Map();
|
|
544
|
-
}
|
|
545
|
-
async register(service) {
|
|
546
|
-
const existing = this.services.get(service.id);
|
|
547
|
-
this.services.set(service.id, service);
|
|
548
|
-
const eventType = existing ? 'updated' : 'registered';
|
|
549
|
-
this.notifyWatchers({
|
|
550
|
-
type: eventType,
|
|
551
|
-
service,
|
|
552
|
-
timestamp: new Date()
|
|
553
|
-
});
|
|
554
|
-
}
|
|
555
|
-
async deregister(serviceId) {
|
|
556
|
-
const service = this.services.get(serviceId);
|
|
557
|
-
if (service) {
|
|
558
|
-
this.services.delete(serviceId);
|
|
559
|
-
this.notifyWatchers({
|
|
560
|
-
type: 'deregistered',
|
|
561
|
-
service,
|
|
562
|
-
timestamp: new Date()
|
|
563
|
-
});
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
async findServices(serviceName, criteria) {
|
|
567
|
-
const services = Array.from(this.services.values())
|
|
568
|
-
.filter(service => service.name === serviceName);
|
|
569
|
-
if (!criteria)
|
|
570
|
-
return services;
|
|
571
|
-
return services.filter(service => {
|
|
572
|
-
// Apply criteria filters
|
|
573
|
-
if (criteria.tags && !criteria.tags.every(tag => service.tags.includes(tag))) {
|
|
574
|
-
return false;
|
|
575
|
-
}
|
|
576
|
-
if (criteria.regions && !criteria.regions.includes(service.metadata.region)) {
|
|
577
|
-
return false;
|
|
578
|
-
}
|
|
579
|
-
if (criteria.healthStatus === 'healthy' && !this.isHealthy(service)) {
|
|
580
|
-
return false;
|
|
581
|
-
}
|
|
582
|
-
return true;
|
|
583
|
-
});
|
|
584
|
-
}
|
|
585
|
-
async watchServices(serviceName, callback) {
|
|
586
|
-
const watchId = `watch_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
587
|
-
this.watchers.set(watchId, { callback, filter: serviceName });
|
|
588
|
-
return watchId;
|
|
589
|
-
}
|
|
590
|
-
async unwatchServices(watchId) {
|
|
591
|
-
this.watchers.delete(watchId);
|
|
592
|
-
}
|
|
593
|
-
notifyWatchers(event) {
|
|
594
|
-
this.watchers.forEach(({ callback, filter }) => {
|
|
595
|
-
if (event.service.name === filter) {
|
|
596
|
-
callback(event);
|
|
597
|
-
}
|
|
598
|
-
});
|
|
599
|
-
}
|
|
600
|
-
isHealthy(service) {
|
|
601
|
-
const timeSinceLastSeen = Date.now() - service.lastSeen.getTime();
|
|
602
|
-
return timeSinceLastSeen < 120000; // 2 minutes
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
class HealthChecker {
|
|
606
|
-
constructor(config) {
|
|
607
|
-
this.config = config;
|
|
608
|
-
this.monitoringIntervals = new Map();
|
|
609
|
-
}
|
|
610
|
-
async checkHealth(instance) {
|
|
611
|
-
try {
|
|
612
|
-
const response = await fetch(`${instance.endpoint}/health`, {
|
|
613
|
-
method: 'GET',
|
|
614
|
-
timeout: this.config.timeout,
|
|
615
|
-
headers: {
|
|
616
|
-
'User-Agent': 'snow-flow-discovery/1.0'
|
|
617
|
-
}
|
|
618
|
-
});
|
|
619
|
-
const healthy = response.ok;
|
|
620
|
-
const responseTime = Date.now(); // Would measure actual response time
|
|
621
|
-
return {
|
|
622
|
-
healthy,
|
|
623
|
-
responseTime,
|
|
624
|
-
details: healthy ? undefined : `HTTP ${response.status}: ${response.statusText}`
|
|
625
|
-
};
|
|
626
|
-
}
|
|
627
|
-
catch (error) {
|
|
628
|
-
return {
|
|
629
|
-
healthy: false,
|
|
630
|
-
responseTime: this.config.timeout,
|
|
631
|
-
details: error.message
|
|
632
|
-
};
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
async startMonitoring(service) {
|
|
636
|
-
const interval = setInterval(async () => {
|
|
637
|
-
// Health monitoring logic would go here
|
|
638
|
-
logger_1.logger.debug(`💓 Health check for service: ${service.id}`);
|
|
639
|
-
}, service.health.interval);
|
|
640
|
-
this.monitoringIntervals.set(service.id, interval);
|
|
641
|
-
}
|
|
642
|
-
async stopMonitoring(serviceId) {
|
|
643
|
-
const interval = this.monitoringIntervals.get(serviceId);
|
|
644
|
-
if (interval) {
|
|
645
|
-
clearInterval(interval);
|
|
646
|
-
this.monitoringIntervals.delete(serviceId);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
}
|
|
650
|
-
class ServiceAnnouncer {
|
|
651
|
-
constructor(config) {
|
|
652
|
-
this.config = config;
|
|
653
|
-
}
|
|
654
|
-
async announce(service) {
|
|
655
|
-
// Implementation would handle service announcement
|
|
656
|
-
// to configured discovery services (Consul, etcd, etc.)
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
class CapabilityMatcher {
|
|
660
|
-
scoreMatch(agentCapabilities, requiredCapabilities) {
|
|
661
|
-
if (requiredCapabilities.length === 0)
|
|
662
|
-
return 1;
|
|
663
|
-
const agentSpecs = agentCapabilities.flatMap(cap => cap.specialization);
|
|
664
|
-
let matches = 0;
|
|
665
|
-
for (const required of requiredCapabilities) {
|
|
666
|
-
const bestMatch = agentSpecs.find(spec => this.calculateSimilarity(required, spec) > 0.7);
|
|
667
|
-
if (bestMatch)
|
|
668
|
-
matches++;
|
|
669
|
-
}
|
|
670
|
-
return matches / requiredCapabilities.length;
|
|
671
|
-
}
|
|
672
|
-
async filterMCPServers(servers, requiredCapabilities) {
|
|
673
|
-
return servers.filter(server => {
|
|
674
|
-
const serverCapabilities = server.capabilities.map(cap => cap.name);
|
|
675
|
-
return requiredCapabilities.every(req => serverCapabilities.some(cap => cap.toLowerCase().includes(req.toLowerCase())));
|
|
676
|
-
});
|
|
677
|
-
}
|
|
678
|
-
scoreMCPMatch(serverCapabilities, requiredCapabilities) {
|
|
679
|
-
if (requiredCapabilities.length === 0)
|
|
680
|
-
return 1;
|
|
681
|
-
const serverNames = serverCapabilities.map(cap => cap.name);
|
|
682
|
-
let matches = 0;
|
|
683
|
-
for (const required of requiredCapabilities) {
|
|
684
|
-
const bestMatch = serverNames.find(name => this.calculateSimilarity(required, name) > 0.7);
|
|
685
|
-
if (bestMatch)
|
|
686
|
-
matches++;
|
|
687
|
-
}
|
|
688
|
-
return matches / requiredCapabilities.length;
|
|
689
|
-
}
|
|
690
|
-
calculateSimilarity(str1, str2) {
|
|
691
|
-
// Simple similarity calculation
|
|
692
|
-
const lower1 = str1.toLowerCase();
|
|
693
|
-
const lower2 = str2.toLowerCase();
|
|
694
|
-
if (lower1 === lower2)
|
|
695
|
-
return 1;
|
|
696
|
-
if (lower1.includes(lower2) || lower2.includes(lower1))
|
|
697
|
-
return 0.8;
|
|
698
|
-
// Could implement more sophisticated similarity algorithms
|
|
699
|
-
return 0;
|
|
700
|
-
}
|
|
701
|
-
}
|
|
702
|
-
class LoadMonitor {
|
|
703
|
-
constructor() {
|
|
704
|
-
this.loadScores = new Map();
|
|
705
|
-
}
|
|
706
|
-
getLoadScore(instanceId) {
|
|
707
|
-
return this.loadScores.get(instanceId) || 0.5;
|
|
708
|
-
}
|
|
709
|
-
updateLoadScore(instanceId, score) {
|
|
710
|
-
this.loadScores.set(instanceId, score);
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
class MCPRegistry {
|
|
714
|
-
constructor() {
|
|
715
|
-
this.servers = new Map();
|
|
716
|
-
}
|
|
717
|
-
async listServers() {
|
|
718
|
-
return Array.from(this.servers.values());
|
|
719
|
-
}
|
|
720
|
-
async register(serverInfo) {
|
|
721
|
-
this.servers.set(serverInfo.id, serverInfo);
|
|
722
|
-
}
|
|
723
|
-
async deregister(serverId) {
|
|
724
|
-
this.servers.delete(serverId);
|
|
725
|
-
}
|
|
726
|
-
async getServer(serverId) {
|
|
727
|
-
return this.servers.get(serverId);
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
class MCPPerformanceTracker {
|
|
731
|
-
constructor() {
|
|
732
|
-
this.performance = new Map();
|
|
733
|
-
}
|
|
734
|
-
async startTracking(serverInfo) {
|
|
735
|
-
this.performance.set(serverInfo.id, {
|
|
736
|
-
averageResponseTime: 1000,
|
|
737
|
-
throughput: 10,
|
|
738
|
-
availability: 0.99
|
|
739
|
-
});
|
|
740
|
-
}
|
|
741
|
-
async stopTracking(serverId) {
|
|
742
|
-
this.performance.delete(serverId);
|
|
743
|
-
}
|
|
744
|
-
getPerformance(serverId) {
|
|
745
|
-
return this.performance.get(serverId);
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
class MCPClient {
|
|
749
|
-
constructor(endpoint) {
|
|
750
|
-
this.endpoint = endpoint;
|
|
751
|
-
}
|
|
752
|
-
async testConnection() {
|
|
753
|
-
try {
|
|
754
|
-
const response = await fetch(`${this.endpoint}/mcp`, {
|
|
755
|
-
method: 'POST',
|
|
756
|
-
headers: { 'Content-Type': 'application/json' },
|
|
757
|
-
body: JSON.stringify({
|
|
758
|
-
jsonrpc: '2.0',
|
|
759
|
-
id: 1,
|
|
760
|
-
method: 'initialize',
|
|
761
|
-
params: { protocolVersion: '2024-11-05', capabilities: {} }
|
|
762
|
-
})
|
|
763
|
-
});
|
|
764
|
-
return { success: response.ok };
|
|
765
|
-
}
|
|
766
|
-
catch (error) {
|
|
767
|
-
return { success: false, error: error.message };
|
|
768
|
-
}
|
|
769
|
-
}
|
|
770
|
-
async listTools() {
|
|
771
|
-
// Implementation would call MCP listTools
|
|
772
|
-
return [];
|
|
773
|
-
}
|
|
774
|
-
async listResources() {
|
|
775
|
-
// Implementation would call MCP listResources
|
|
776
|
-
return [];
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
// ========================================
|
|
780
|
-
// Error Classes
|
|
781
|
-
// ========================================
|
|
782
|
-
class AgentDiscoveryError extends Error {
|
|
783
|
-
constructor(message) {
|
|
784
|
-
super(message);
|
|
785
|
-
this.name = 'AgentDiscoveryError';
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
exports.AgentDiscoveryError = AgentDiscoveryError;
|
|
789
|
-
class ServiceAnnouncementError extends Error {
|
|
790
|
-
constructor(message) {
|
|
791
|
-
super(message);
|
|
792
|
-
this.name = 'ServiceAnnouncementError';
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
class MCPDiscoveryError extends Error {
|
|
796
|
-
constructor(message) {
|
|
797
|
-
super(message);
|
|
798
|
-
this.name = 'MCPDiscoveryError';
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
exports.MCPDiscoveryError = MCPDiscoveryError;
|
|
802
|
-
class MCPValidationError extends Error {
|
|
803
|
-
constructor(message) {
|
|
804
|
-
super(message);
|
|
805
|
-
this.name = 'MCPValidationError';
|
|
806
|
-
}
|
|
807
|
-
}
|
|
808
|
-
//# sourceMappingURL=service-discovery.js.map
|