@juspay/neurolink 6.0.0 → 6.2.0
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/CHANGELOG.md +14 -3
- package/dist/cli/commands/config.d.ts +13 -13
- package/dist/cli/index.js +3 -9
- package/dist/core/analytics.d.ts +11 -1
- package/dist/core/analytics.js +2 -2
- package/dist/core/base-provider.js +4 -18
- package/dist/core/dynamic-models.d.ts +8 -8
- package/dist/core/factory.js +3 -11
- package/dist/index.d.ts +2 -4
- package/dist/index.js +2 -11
- package/dist/lib/core/analytics.d.ts +11 -1
- package/dist/lib/core/analytics.js +2 -2
- package/dist/lib/core/base-provider.js +4 -18
- package/dist/lib/core/dynamic-models.d.ts +8 -8
- package/dist/lib/core/factory.js +3 -11
- package/dist/lib/index.d.ts +2 -4
- package/dist/lib/index.js +2 -11
- package/dist/lib/mcp/factory.d.ts +1 -1
- package/dist/lib/mcp/index.d.ts +7 -19
- package/dist/lib/mcp/index.js +15 -56
- package/dist/lib/neurolink.d.ts +1 -9
- package/dist/lib/neurolink.js +21 -70
- package/dist/lib/providers/amazon-bedrock.js +5 -16
- package/dist/lib/providers/anthropic-baseprovider.js +3 -21
- package/dist/lib/providers/anthropic.js +4 -7
- package/dist/lib/providers/azure-openai.js +4 -2
- package/dist/lib/providers/google-vertex.js +5 -9
- package/dist/lib/providers/huggingFace.js +5 -10
- package/dist/lib/providers/mistral.js +5 -8
- package/dist/lib/providers/openAI.js +4 -7
- package/dist/lib/utils/providerConfig.d.ts +117 -0
- package/dist/lib/utils/providerConfig.js +353 -0
- package/dist/lib/utils/providerUtils.d.ts +2 -1
- package/dist/lib/utils/providerUtils.js +53 -36
- package/dist/lib/utils/timeout.d.ts +72 -1
- package/dist/lib/utils/timeout.js +203 -2
- package/dist/mcp/factory.d.ts +1 -1
- package/dist/mcp/index.d.ts +7 -19
- package/dist/mcp/index.js +15 -56
- package/dist/neurolink.d.ts +1 -9
- package/dist/neurolink.js +21 -70
- package/dist/providers/amazon-bedrock.js +5 -16
- package/dist/providers/anthropic-baseprovider.js +3 -21
- package/dist/providers/anthropic.js +4 -7
- package/dist/providers/azure-openai.js +4 -2
- package/dist/providers/google-vertex.js +5 -9
- package/dist/providers/huggingFace.js +5 -10
- package/dist/providers/mistral.js +5 -8
- package/dist/providers/openAI.js +4 -7
- package/dist/utils/providerConfig.d.ts +117 -0
- package/dist/utils/providerConfig.js +353 -0
- package/dist/utils/providerUtils.d.ts +2 -1
- package/dist/utils/providerUtils.js +53 -36
- package/dist/utils/timeout.d.ts +72 -1
- package/dist/utils/timeout.js +203 -2
- package/package.json +2 -1
- package/dist/chat/client-utils.d.ts +0 -95
- package/dist/chat/client-utils.js +0 -315
- package/dist/chat/index.d.ts +0 -24
- package/dist/chat/index.js +0 -33
- package/dist/chat/session-storage.d.ts +0 -77
- package/dist/chat/session-storage.js +0 -233
- package/dist/chat/session.d.ts +0 -96
- package/dist/chat/session.js +0 -257
- package/dist/chat/sse-handler.d.ts +0 -49
- package/dist/chat/sse-handler.js +0 -259
- package/dist/chat/types.d.ts +0 -74
- package/dist/chat/types.js +0 -5
- package/dist/chat/websocket-chat-handler.d.ts +0 -37
- package/dist/chat/websocket-chat-handler.js +0 -262
- package/dist/cli/commands/mcp.d.ts +0 -20
- package/dist/cli/commands/mcp.js +0 -1272
- package/dist/core/defaults.d.ts +0 -19
- package/dist/core/defaults.js +0 -29
- package/dist/core/evaluation-config.d.ts +0 -29
- package/dist/core/evaluation-config.js +0 -144
- package/dist/factories/compatibility-factory.d.ts +0 -35
- package/dist/factories/compatibility-factory.js +0 -71
- package/dist/factories/provider-generate-factory.d.ts +0 -20
- package/dist/factories/provider-generate-factory.js +0 -93
- package/dist/lib/chat/client-utils.d.ts +0 -95
- package/dist/lib/chat/client-utils.js +0 -315
- package/dist/lib/chat/index.d.ts +0 -24
- package/dist/lib/chat/index.js +0 -33
- package/dist/lib/chat/session-storage.d.ts +0 -77
- package/dist/lib/chat/session-storage.js +0 -233
- package/dist/lib/chat/session.d.ts +0 -96
- package/dist/lib/chat/session.js +0 -257
- package/dist/lib/chat/sse-handler.d.ts +0 -49
- package/dist/lib/chat/sse-handler.js +0 -259
- package/dist/lib/chat/types.d.ts +0 -74
- package/dist/lib/chat/types.js +0 -5
- package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
- package/dist/lib/chat/websocket-chat-handler.js +0 -262
- package/dist/lib/core/defaults.d.ts +0 -19
- package/dist/lib/core/defaults.js +0 -29
- package/dist/lib/core/evaluation-config.d.ts +0 -29
- package/dist/lib/core/evaluation-config.js +0 -144
- package/dist/lib/factories/compatibility-factory.d.ts +0 -35
- package/dist/lib/factories/compatibility-factory.js +0 -71
- package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
- package/dist/lib/factories/provider-generate-factory.js +0 -93
- package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
- package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
- package/dist/lib/mcp/auto-discovery.d.ts +0 -62
- package/dist/lib/mcp/auto-discovery.js +0 -149
- package/dist/lib/mcp/client.d.ts +0 -68
- package/dist/lib/mcp/client.js +0 -248
- package/dist/lib/mcp/config.d.ts +0 -31
- package/dist/lib/mcp/config.js +0 -99
- package/dist/lib/mcp/context-manager.d.ts +0 -171
- package/dist/lib/mcp/context-manager.js +0 -362
- package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
- package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
- package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
- package/dist/lib/mcp/core/plugin-manager.js +0 -110
- package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
- package/dist/lib/mcp/demo/plugin-demo.js +0 -118
- package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
- package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
- package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
- package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
- package/dist/lib/mcp/ecosystem.d.ts +0 -75
- package/dist/lib/mcp/ecosystem.js +0 -161
- package/dist/lib/mcp/error-manager.d.ts +0 -254
- package/dist/lib/mcp/error-manager.js +0 -501
- package/dist/lib/mcp/error-recovery.d.ts +0 -159
- package/dist/lib/mcp/error-recovery.js +0 -405
- package/dist/lib/mcp/external-client.d.ts +0 -88
- package/dist/lib/mcp/external-client.js +0 -331
- package/dist/lib/mcp/external-manager.d.ts +0 -112
- package/dist/lib/mcp/external-manager.js +0 -308
- package/dist/lib/mcp/function-calling.d.ts +0 -65
- package/dist/lib/mcp/function-calling.js +0 -642
- package/dist/lib/mcp/health-monitor.d.ts +0 -257
- package/dist/lib/mcp/health-monitor.js +0 -630
- package/dist/lib/mcp/initialize-tools.d.ts +0 -29
- package/dist/lib/mcp/initialize-tools.js +0 -261
- package/dist/lib/mcp/initialize.d.ts +0 -18
- package/dist/lib/mcp/initialize.js +0 -62
- package/dist/lib/mcp/manager.d.ts +0 -68
- package/dist/lib/mcp/manager.js +0 -176
- package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
- package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
- package/dist/lib/mcp/orchestrator.d.ts +0 -302
- package/dist/lib/mcp/orchestrator.js +0 -703
- package/dist/lib/mcp/plugin-manager.d.ts +0 -98
- package/dist/lib/mcp/plugin-manager.js +0 -296
- package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
- package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
- package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
- package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
- package/dist/lib/mcp/security-manager.d.ts +0 -87
- package/dist/lib/mcp/security-manager.js +0 -344
- package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
- package/dist/lib/mcp/semaphore-manager.js +0 -329
- package/dist/lib/mcp/session-manager.d.ts +0 -187
- package/dist/lib/mcp/session-manager.js +0 -400
- package/dist/lib/mcp/session-persistence.d.ts +0 -93
- package/dist/lib/mcp/session-persistence.js +0 -301
- package/dist/lib/mcp/tool-integration.d.ts +0 -58
- package/dist/lib/mcp/tool-integration.js +0 -203
- package/dist/lib/mcp/transport-manager.d.ts +0 -154
- package/dist/lib/mcp/transport-manager.js +0 -334
- package/dist/lib/mcp/unified-mcp.d.ts +0 -133
- package/dist/lib/mcp/unified-mcp.js +0 -251
- package/dist/lib/mcp/unified-registry.d.ts +0 -165
- package/dist/lib/mcp/unified-registry.js +0 -538
- package/dist/lib/providers/analytics-helper.d.ts +0 -38
- package/dist/lib/providers/analytics-helper.js +0 -216
- package/dist/lib/providers/function-calling-provider.d.ts +0 -142
- package/dist/lib/providers/function-calling-provider.js +0 -630
- package/dist/lib/providers/mcp-provider.d.ts +0 -75
- package/dist/lib/providers/mcp-provider.js +0 -283
- package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
- package/dist/lib/providers/timeout-wrapper.js +0 -100
- package/dist/lib/sdk/tool-extension.d.ts +0 -181
- package/dist/lib/sdk/tool-extension.js +0 -284
- package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
- package/dist/lib/services/streaming/streaming-manager.js +0 -245
- package/dist/lib/services/types.d.ts +0 -156
- package/dist/lib/services/types.js +0 -2
- package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
- package/dist/lib/services/websocket/websocket-server.js +0 -305
- package/dist/lib/utils/provider-validation.d.ts +0 -36
- package/dist/lib/utils/provider-validation.js +0 -625
- package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
- package/dist/lib/utils/providerUtils-fixed.js +0 -94
- package/dist/lib/utils/streaming-utils.d.ts +0 -79
- package/dist/lib/utils/streaming-utils.js +0 -198
- package/dist/lib/utils/timeout-manager.d.ts +0 -75
- package/dist/lib/utils/timeout-manager.js +0 -244
- package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
- package/dist/mcp/adapters/plugin-bridge.js +0 -89
- package/dist/mcp/auto-discovery.d.ts +0 -62
- package/dist/mcp/auto-discovery.js +0 -149
- package/dist/mcp/client.d.ts +0 -68
- package/dist/mcp/client.js +0 -248
- package/dist/mcp/config.d.ts +0 -31
- package/dist/mcp/config.js +0 -99
- package/dist/mcp/context-manager.d.ts +0 -171
- package/dist/mcp/context-manager.js +0 -362
- package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
- package/dist/mcp/contracts/mcp-contract.js +0 -58
- package/dist/mcp/core/plugin-manager.d.ts +0 -46
- package/dist/mcp/core/plugin-manager.js +0 -110
- package/dist/mcp/demo/plugin-demo.d.ts +0 -20
- package/dist/mcp/demo/plugin-demo.js +0 -118
- package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
- package/dist/mcp/dynamic-chain-executor.js +0 -489
- package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
- package/dist/mcp/dynamic-orchestrator.js +0 -351
- package/dist/mcp/ecosystem.d.ts +0 -75
- package/dist/mcp/ecosystem.js +0 -162
- package/dist/mcp/error-manager.d.ts +0 -254
- package/dist/mcp/error-manager.js +0 -501
- package/dist/mcp/error-recovery.d.ts +0 -159
- package/dist/mcp/error-recovery.js +0 -405
- package/dist/mcp/external-client.d.ts +0 -88
- package/dist/mcp/external-client.js +0 -331
- package/dist/mcp/external-manager.d.ts +0 -112
- package/dist/mcp/external-manager.js +0 -308
- package/dist/mcp/function-calling.d.ts +0 -65
- package/dist/mcp/function-calling.js +0 -642
- package/dist/mcp/health-monitor.d.ts +0 -257
- package/dist/mcp/health-monitor.js +0 -630
- package/dist/mcp/initialize-tools.d.ts +0 -29
- package/dist/mcp/initialize-tools.js +0 -262
- package/dist/mcp/initialize.d.ts +0 -18
- package/dist/mcp/initialize.js +0 -62
- package/dist/mcp/manager.d.ts +0 -68
- package/dist/mcp/manager.js +0 -176
- package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
- package/dist/mcp/neurolink-mcp-client.js +0 -462
- package/dist/mcp/orchestrator.d.ts +0 -302
- package/dist/mcp/orchestrator.js +0 -703
- package/dist/mcp/plugin-manager.d.ts +0 -98
- package/dist/mcp/plugin-manager.js +0 -297
- package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
- package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
- package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
- package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
- package/dist/mcp/plugins/filesystem-mcp.js +0 -54
- package/dist/mcp/security-manager.d.ts +0 -87
- package/dist/mcp/security-manager.js +0 -344
- package/dist/mcp/semaphore-manager.d.ts +0 -137
- package/dist/mcp/semaphore-manager.js +0 -329
- package/dist/mcp/session-manager.d.ts +0 -187
- package/dist/mcp/session-manager.js +0 -400
- package/dist/mcp/session-persistence.d.ts +0 -93
- package/dist/mcp/session-persistence.js +0 -302
- package/dist/mcp/tool-integration.d.ts +0 -58
- package/dist/mcp/tool-integration.js +0 -203
- package/dist/mcp/transport-manager.d.ts +0 -154
- package/dist/mcp/transport-manager.js +0 -335
- package/dist/mcp/unified-mcp.d.ts +0 -133
- package/dist/mcp/unified-mcp.js +0 -251
- package/dist/mcp/unified-registry.d.ts +0 -165
- package/dist/mcp/unified-registry.js +0 -539
- package/dist/providers/analytics-helper.d.ts +0 -38
- package/dist/providers/analytics-helper.js +0 -216
- package/dist/providers/function-calling-provider.d.ts +0 -142
- package/dist/providers/function-calling-provider.js +0 -630
- package/dist/providers/mcp-provider.d.ts +0 -75
- package/dist/providers/mcp-provider.js +0 -283
- package/dist/providers/timeout-wrapper.d.ts +0 -40
- package/dist/providers/timeout-wrapper.js +0 -100
- package/dist/sdk/tool-extension.d.ts +0 -181
- package/dist/sdk/tool-extension.js +0 -284
- package/dist/services/streaming/streaming-manager.d.ts +0 -29
- package/dist/services/streaming/streaming-manager.js +0 -245
- package/dist/services/types.d.ts +0 -156
- package/dist/services/types.js +0 -2
- package/dist/services/websocket/websocket-server.d.ts +0 -34
- package/dist/services/websocket/websocket-server.js +0 -306
- package/dist/utils/provider-validation.d.ts +0 -36
- package/dist/utils/provider-validation.js +0 -625
- package/dist/utils/providerUtils-fixed.d.ts +0 -8
- package/dist/utils/providerUtils-fixed.js +0 -94
- package/dist/utils/streaming-utils.d.ts +0 -79
- package/dist/utils/streaming-utils.js +0 -198
- package/dist/utils/timeout-manager.d.ts +0 -75
- package/dist/utils/timeout-manager.js +0 -244
|
@@ -1,539 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unified MCP Registry - Combines Multiple Registration Sources
|
|
3
|
-
*/
|
|
4
|
-
import { MCPRegistry } from "./registry.js";
|
|
5
|
-
import { discoverMCPServers, autoRegisterMCPServers, } from "./auto-discovery.js";
|
|
6
|
-
import { unifiedRegistryLogger } from "./logging.js";
|
|
7
|
-
import { MCPToolRegistry, defaultToolRegistry, } from "./tool-registry.js";
|
|
8
|
-
import { TransportManager, TransportConfigSchema, } from "./transport-manager.js";
|
|
9
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
10
|
-
import { ErrorManager } from "./error-manager.js";
|
|
11
|
-
import * as fs from "fs";
|
|
12
|
-
import * as path from "path";
|
|
13
|
-
/**
|
|
14
|
-
* Unified registry combining multiple sources
|
|
15
|
-
*/
|
|
16
|
-
export class UnifiedMCPRegistry extends MCPToolRegistry {
|
|
17
|
-
errorManager;
|
|
18
|
-
autoDiscoveryEnabled = true;
|
|
19
|
-
autoDiscoveredServers = [];
|
|
20
|
-
manualServers = new Map();
|
|
21
|
-
availableServers = new Set();
|
|
22
|
-
transportManager;
|
|
23
|
-
activeConnections = new Map();
|
|
24
|
-
constructor(errorManager = new ErrorManager()) {
|
|
25
|
-
super();
|
|
26
|
-
this.errorManager = errorManager;
|
|
27
|
-
this.transportManager = new TransportManager(this.errorManager);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Initialize with auto-discovery and manual config
|
|
31
|
-
*/
|
|
32
|
-
async initialize(options = {}) {
|
|
33
|
-
unifiedRegistryLogger.info("Initializing unified MCP registry...");
|
|
34
|
-
// Import ProviderRegistry to check options
|
|
35
|
-
const { ProviderRegistry } = await import("../factories/provider-registry.js");
|
|
36
|
-
const registryOptions = ProviderRegistry.getOptions();
|
|
37
|
-
// Only load manual config if explicitly enabled (CLI mode)
|
|
38
|
-
if (registryOptions.enableManualMCP) {
|
|
39
|
-
unifiedRegistryLogger.info("Manual MCP config enabled - loading .mcp-config.json");
|
|
40
|
-
await this.loadManualConfig();
|
|
41
|
-
await this.connectManualServers();
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
unifiedRegistryLogger.debug("Manual MCP config disabled - skipping .mcp-config.json");
|
|
45
|
-
}
|
|
46
|
-
if (this.autoDiscoveryEnabled) {
|
|
47
|
-
const result = await autoRegisterMCPServers(options);
|
|
48
|
-
unifiedRegistryLogger.info(`Auto-discovery complete: ${result.registered} registered, ${result.failed} failed`);
|
|
49
|
-
// Register discovered plugins
|
|
50
|
-
for (const plugin of result.plugins) {
|
|
51
|
-
this.register(plugin);
|
|
52
|
-
this.autoDiscoveredServers.push(plugin);
|
|
53
|
-
this.availableServers.add(plugin.metadata.name);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Load servers from .mcp-config.json
|
|
59
|
-
*/
|
|
60
|
-
async loadManualConfig() {
|
|
61
|
-
const configPath = path.join(process.cwd(), ".mcp-config.json");
|
|
62
|
-
try {
|
|
63
|
-
await fs.promises.access(configPath, fs.constants.F_OK);
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
unifiedRegistryLogger.debug("No .mcp-config.json found");
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
try {
|
|
70
|
-
const configContent = await fs.promises.readFile(configPath, "utf-8");
|
|
71
|
-
const config = JSON.parse(configContent);
|
|
72
|
-
if (!config.mcpServers) {
|
|
73
|
-
unifiedRegistryLogger.debug("No mcpServers section in config");
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
unifiedRegistryLogger.info(`Loading ${Object.keys(config.mcpServers).length} servers from .mcp-config.json`);
|
|
77
|
-
for (const [serverId, serverConfig] of Object.entries(config.mcpServers)) {
|
|
78
|
-
try {
|
|
79
|
-
// Convert server config to DiscoveredMCP format
|
|
80
|
-
const discoveredMcp = {
|
|
81
|
-
metadata: {
|
|
82
|
-
name: serverId,
|
|
83
|
-
version: "1.0.0",
|
|
84
|
-
main: "index.js",
|
|
85
|
-
engine: { neurolink: ">=4.0.0" },
|
|
86
|
-
description: `MCP server: ${serverId}`,
|
|
87
|
-
permissions: ["filesystem", "network"],
|
|
88
|
-
},
|
|
89
|
-
entryPath: serverConfig.command || "npx",
|
|
90
|
-
source: "project",
|
|
91
|
-
constructor: undefined,
|
|
92
|
-
};
|
|
93
|
-
// Register the server
|
|
94
|
-
this.register(discoveredMcp);
|
|
95
|
-
this.manualServers.set(serverId, serverConfig);
|
|
96
|
-
this.availableServers.add(serverId);
|
|
97
|
-
unifiedRegistryLogger.debug(`Registered manual server: ${serverId}`);
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
unifiedRegistryLogger.error(`Failed to register server ${serverId}:`, error instanceof Error ? error.message : String(error));
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
unifiedRegistryLogger.info(`Manual config loaded: ${this.manualServers.size} servers registered`);
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
unifiedRegistryLogger.error("Failed to load manual config:", error instanceof Error ? error.message : String(error));
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Connect to manually configured servers
|
|
111
|
-
*/
|
|
112
|
-
async connectManualServers() {
|
|
113
|
-
for (const [serverId, serverConfig] of this.manualServers.entries()) {
|
|
114
|
-
try {
|
|
115
|
-
unifiedRegistryLogger.info(`Connecting to manual server: ${serverId}`);
|
|
116
|
-
// Use addExternalServer method which properly establishes connections
|
|
117
|
-
await this.addExternalServer(serverId, {
|
|
118
|
-
type: "stdio",
|
|
119
|
-
command: serverConfig.command || "npx",
|
|
120
|
-
args: serverConfig.args || [],
|
|
121
|
-
env: serverConfig.env,
|
|
122
|
-
});
|
|
123
|
-
unifiedRegistryLogger.info(`Successfully connected manual server: ${serverId}`);
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
unifiedRegistryLogger.error(`Failed to connect manual server ${serverId}:`, error instanceof Error ? error.message : String(error));
|
|
127
|
-
// Remove from available servers if connection fails
|
|
128
|
-
this.availableServers.delete(serverId);
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Enable or disable auto-discovery
|
|
134
|
-
*/
|
|
135
|
-
setAutoDiscovery(enabled) {
|
|
136
|
-
this.autoDiscoveryEnabled = enabled;
|
|
137
|
-
unifiedRegistryLogger.info(`Auto-discovery ${enabled ? "enabled" : "disabled"}`);
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Refresh discovery
|
|
141
|
-
*/
|
|
142
|
-
async refresh(options = {}) {
|
|
143
|
-
this.clear();
|
|
144
|
-
this.autoDiscoveredServers = [];
|
|
145
|
-
this.availableServers.clear();
|
|
146
|
-
await this.initialize(options);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Get total server count
|
|
150
|
-
*/
|
|
151
|
-
getTotalServerCount() {
|
|
152
|
-
return this.list().length + this.manualServers.size;
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Get available server count
|
|
156
|
-
*/
|
|
157
|
-
getAvailableServerCount() {
|
|
158
|
-
return this.availableServers.size;
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Get auto-discovered servers
|
|
162
|
-
*/
|
|
163
|
-
getAutoDiscoveredServers() {
|
|
164
|
-
return this.autoDiscoveredServers;
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Get manual servers
|
|
168
|
-
*/
|
|
169
|
-
getManualServers() {
|
|
170
|
-
return this.manualServers;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* List all tools from all registered plugins
|
|
174
|
-
*/
|
|
175
|
-
async listAllTools() {
|
|
176
|
-
const allTools = [];
|
|
177
|
-
try {
|
|
178
|
-
// FIXED: Get built-in tools from defaultToolRegistry where they are actually registered
|
|
179
|
-
const builtInTools = await defaultToolRegistry.listTools();
|
|
180
|
-
allTools.push(...builtInTools.map((tool) => ({
|
|
181
|
-
...tool,
|
|
182
|
-
id: tool.name,
|
|
183
|
-
serverId: tool.serverId || "built-in",
|
|
184
|
-
source: "built-in",
|
|
185
|
-
isExternal: false,
|
|
186
|
-
})));
|
|
187
|
-
unifiedRegistryLogger.debug(`Found ${builtInTools.length} built-in tools from defaultToolRegistry`);
|
|
188
|
-
}
|
|
189
|
-
catch (error) {
|
|
190
|
-
unifiedRegistryLogger.warn("Failed to get built-in tools:", error);
|
|
191
|
-
}
|
|
192
|
-
// FIXED: Get tools from external servers with proper error handling
|
|
193
|
-
// Use the internal plugin registry for accurate server listing
|
|
194
|
-
const plugins = Array.from(this.plugins.values());
|
|
195
|
-
const externalToolPromises = [];
|
|
196
|
-
for (const plugin of plugins) {
|
|
197
|
-
if (plugin.metadata?.name &&
|
|
198
|
-
this.availableServers.has(plugin.metadata.name)) {
|
|
199
|
-
const connection = this.activeConnections.get(plugin.metadata.name);
|
|
200
|
-
if (connection) {
|
|
201
|
-
externalToolPromises.push(connection
|
|
202
|
-
.listTools()
|
|
203
|
-
.then((response) => {
|
|
204
|
-
const serverTools = response.tools || [];
|
|
205
|
-
allTools.push(...serverTools.map((tool) => ({
|
|
206
|
-
name: tool.name,
|
|
207
|
-
description: tool.description,
|
|
208
|
-
inputSchema: tool.inputSchema,
|
|
209
|
-
serverId: plugin.metadata.name,
|
|
210
|
-
id: `${plugin.metadata.name}.${tool.name}`,
|
|
211
|
-
source: "external",
|
|
212
|
-
isExternal: true,
|
|
213
|
-
})));
|
|
214
|
-
unifiedRegistryLogger.debug(`Found ${serverTools.length} tools from ${plugin.metadata.name}`);
|
|
215
|
-
})
|
|
216
|
-
.catch((error) => {
|
|
217
|
-
unifiedRegistryLogger.warn(`Failed to get tools from ${plugin.metadata.name}:`, error);
|
|
218
|
-
}));
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
await Promise.all(externalToolPromises);
|
|
223
|
-
unifiedRegistryLogger.info(`Total tools available: ${allTools.length}`);
|
|
224
|
-
return allTools;
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Execute a tool through the registry with fallback to direct MCP execution
|
|
228
|
-
*/
|
|
229
|
-
async executeTool(toolName, args, context) {
|
|
230
|
-
unifiedRegistryLogger.info(`Executing tool: ${toolName}`);
|
|
231
|
-
// STEP 1: Try built-in tools first from defaultToolRegistry
|
|
232
|
-
try {
|
|
233
|
-
const result = await defaultToolRegistry.executeTool(toolName, args, context);
|
|
234
|
-
unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via defaultToolRegistry`);
|
|
235
|
-
return result;
|
|
236
|
-
}
|
|
237
|
-
catch (builtInError) {
|
|
238
|
-
unifiedRegistryLogger.debug(`Built-in tool execution failed: ${builtInError.message}`);
|
|
239
|
-
}
|
|
240
|
-
// STEP 2: Try external MCP servers
|
|
241
|
-
try {
|
|
242
|
-
const result = await this.executeToolViaMCPServer(toolName, args, context);
|
|
243
|
-
unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via external MCP server`);
|
|
244
|
-
return result;
|
|
245
|
-
}
|
|
246
|
-
catch (externalError) {
|
|
247
|
-
unifiedRegistryLogger.debug(`External MCP execution failed: ${externalError.message}`);
|
|
248
|
-
}
|
|
249
|
-
// STEP 3: Comprehensive error with available tools
|
|
250
|
-
const availableTools = await this.listAllTools();
|
|
251
|
-
const toolNames = availableTools.map((t) => t.name).join(", ");
|
|
252
|
-
const builtInTools = availableTools
|
|
253
|
-
.filter((t) => !t.isExternal)
|
|
254
|
-
.map((t) => t.name)
|
|
255
|
-
.join(", ");
|
|
256
|
-
const externalTools = availableTools
|
|
257
|
-
.filter((t) => t.isExternal)
|
|
258
|
-
.map((t) => `${t.serverId}.${t.name}`)
|
|
259
|
-
.join(", ");
|
|
260
|
-
const errorMessage = [
|
|
261
|
-
`Tool '${toolName}' not found in any registry.`,
|
|
262
|
-
`Available built-in tools: ${builtInTools || "none"}`,
|
|
263
|
-
`Available external tools: ${externalTools || "none"}`,
|
|
264
|
-
`Connected servers: ${Array.from(this.availableServers).join(", ") || "none"}`,
|
|
265
|
-
].join("\n");
|
|
266
|
-
throw new Error(errorMessage);
|
|
267
|
-
}
|
|
268
|
-
/**
|
|
269
|
-
* Execute tool via direct MCP server connection (fallback)
|
|
270
|
-
*/
|
|
271
|
-
async executeToolViaMCPServer(toolName, args, context) {
|
|
272
|
-
const configPath = path.join(process.cwd(), ".mcp-config.json");
|
|
273
|
-
if (!fs.existsSync(configPath)) {
|
|
274
|
-
throw new Error(`Tool '${toolName}' not found and no .mcp-config.json for fallback`);
|
|
275
|
-
}
|
|
276
|
-
const configContent = fs.readFileSync(configPath, "utf-8");
|
|
277
|
-
const config = JSON.parse(configContent);
|
|
278
|
-
if (!config.mcpServers) {
|
|
279
|
-
throw new Error(`Tool '${toolName}' not found and no servers configured`);
|
|
280
|
-
}
|
|
281
|
-
// Try each configured server
|
|
282
|
-
const errors = [];
|
|
283
|
-
for (const [serverId, serverConfig] of Object.entries(config.mcpServers)) {
|
|
284
|
-
try {
|
|
285
|
-
unifiedRegistryLogger.debug(`Trying tool ${toolName} on server ${serverId}`);
|
|
286
|
-
// Import the executeMCPTool function
|
|
287
|
-
const { executeMCPTool } = await import("../../cli/commands/mcp.js");
|
|
288
|
-
const typedServerConfig = serverConfig;
|
|
289
|
-
const mcpServerConfig = {
|
|
290
|
-
name: serverId,
|
|
291
|
-
command: (typeof typedServerConfig.command === "string"
|
|
292
|
-
? typedServerConfig.command
|
|
293
|
-
: "npx"),
|
|
294
|
-
args: (Array.isArray(typedServerConfig.args)
|
|
295
|
-
? typedServerConfig.args
|
|
296
|
-
: []),
|
|
297
|
-
env: (typeof typedServerConfig.env === "object" &&
|
|
298
|
-
typedServerConfig.env
|
|
299
|
-
? typedServerConfig.env
|
|
300
|
-
: {}),
|
|
301
|
-
cwd: typeof typedServerConfig.cwd === "string"
|
|
302
|
-
? typedServerConfig.cwd
|
|
303
|
-
: undefined,
|
|
304
|
-
transport: typedServerConfig.transport || "stdio",
|
|
305
|
-
};
|
|
306
|
-
const result = await executeMCPTool(mcpServerConfig, toolName, this.toJsonValue(args || {}));
|
|
307
|
-
// Convert to ToolResult format
|
|
308
|
-
const toolResult = {
|
|
309
|
-
success: true,
|
|
310
|
-
data: result,
|
|
311
|
-
metadata: { toolName, serverId, sessionId: context?.sessionId },
|
|
312
|
-
};
|
|
313
|
-
unifiedRegistryLogger.info(`Tool ${toolName} executed successfully via server ${serverId}`);
|
|
314
|
-
return toolResult;
|
|
315
|
-
}
|
|
316
|
-
catch (serverError) {
|
|
317
|
-
const errorMsg = serverError instanceof Error
|
|
318
|
-
? serverError.message
|
|
319
|
-
: String(serverError);
|
|
320
|
-
errors.push(`${serverId}: ${errorMsg}`);
|
|
321
|
-
unifiedRegistryLogger.debug(`Tool ${toolName} failed on server ${serverId}: ${errorMsg}`);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
throw new Error(`Tool '${toolName}' not found on any configured MCP server. Errors: ${errors.join("; ")}`);
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Lazily activate a server by ID
|
|
328
|
-
*/
|
|
329
|
-
async lazyActivateServer(serverId) {
|
|
330
|
-
unifiedRegistryLogger.info(`Lazy activating server: ${serverId}`);
|
|
331
|
-
// Check if already activated
|
|
332
|
-
if (this.availableServers.has(serverId)) {
|
|
333
|
-
return true;
|
|
334
|
-
}
|
|
335
|
-
// Try to find and activate
|
|
336
|
-
const plugin = this.get(serverId);
|
|
337
|
-
if (plugin) {
|
|
338
|
-
try {
|
|
339
|
-
// Mark as available (initialization happens elsewhere)
|
|
340
|
-
this.availableServers.add(serverId);
|
|
341
|
-
return true;
|
|
342
|
-
}
|
|
343
|
-
catch (error) {
|
|
344
|
-
unifiedRegistryLogger.error(`Failed to activate server ${serverId}:`, error);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
return false;
|
|
348
|
-
}
|
|
349
|
-
/**
|
|
350
|
-
* Register a manual server
|
|
351
|
-
*/
|
|
352
|
-
registerManualServer(id, server) {
|
|
353
|
-
this.manualServers.set(id, server);
|
|
354
|
-
this.availableServers.add(id);
|
|
355
|
-
}
|
|
356
|
-
/**
|
|
357
|
-
* Get registry statistics (override parent method)
|
|
358
|
-
*/
|
|
359
|
-
getStats() {
|
|
360
|
-
// Return full stats interface as expected by MCPOrchestrator
|
|
361
|
-
return super.getStats();
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Get detailed registry statistics
|
|
365
|
-
*/
|
|
366
|
-
async getDetailedStats() {
|
|
367
|
-
const plugins = this.list();
|
|
368
|
-
const bySource = {};
|
|
369
|
-
const byType = {};
|
|
370
|
-
for (const plugin of plugins) {
|
|
371
|
-
const source = plugin.source ||
|
|
372
|
-
"unknown";
|
|
373
|
-
bySource[source] = (bySource[source] || 0) + 1;
|
|
374
|
-
// Extract type from name or metadata
|
|
375
|
-
const type = plugin.metadata.name.split("/")[1]?.split("-")[0] || "unknown";
|
|
376
|
-
byType[type] = (byType[type] || 0) + 1;
|
|
377
|
-
}
|
|
378
|
-
return {
|
|
379
|
-
total: plugins.length,
|
|
380
|
-
bySource,
|
|
381
|
-
byType,
|
|
382
|
-
manual: { servers: this.manualServers.size },
|
|
383
|
-
auto: { servers: this.autoDiscoveredServers.length },
|
|
384
|
-
tools: 0, // Will be populated when tools are registered
|
|
385
|
-
};
|
|
386
|
-
}
|
|
387
|
-
/**
|
|
388
|
-
* Add external MCP server programmatically
|
|
389
|
-
*
|
|
390
|
-
* @param serverId - Unique server identifier
|
|
391
|
-
* @param config - Server configuration (stdio, sse, or http)
|
|
392
|
-
*/
|
|
393
|
-
async addExternalServer(serverId, config) {
|
|
394
|
-
unifiedRegistryLogger.info(`Adding external server: ${serverId} (${config.type})`);
|
|
395
|
-
// Create server metadata
|
|
396
|
-
const serverMeta = {
|
|
397
|
-
metadata: {
|
|
398
|
-
name: serverId,
|
|
399
|
-
version: "1.0.0",
|
|
400
|
-
main: "index.js",
|
|
401
|
-
engine: { neurolink: ">=4.0.0" },
|
|
402
|
-
description: `External ${config.type} server: ${serverId}`,
|
|
403
|
-
permissions: ["network", "filesystem"],
|
|
404
|
-
},
|
|
405
|
-
entryPath: "",
|
|
406
|
-
source: "installed",
|
|
407
|
-
constructor: undefined,
|
|
408
|
-
};
|
|
409
|
-
// Register in internal registry
|
|
410
|
-
this.register(serverMeta);
|
|
411
|
-
this.manualServers.set(serverId, {
|
|
412
|
-
...config,
|
|
413
|
-
name: serverId,
|
|
414
|
-
command: config.command || "npx",
|
|
415
|
-
});
|
|
416
|
-
this.availableServers.add(serverId);
|
|
417
|
-
// Establish actual connection to make server immediately reachable
|
|
418
|
-
try {
|
|
419
|
-
// Validate config for stdio transport (most common case)
|
|
420
|
-
if (config.type === "stdio" && !config.command) {
|
|
421
|
-
throw new Error("Command is required for stdio transport");
|
|
422
|
-
}
|
|
423
|
-
// Create transport with proper type validation
|
|
424
|
-
// Validate config shape before creating transport
|
|
425
|
-
const validatedConfig = TransportConfigSchema.parse(config);
|
|
426
|
-
const transport = await this.transportManager.createTransport(validatedConfig);
|
|
427
|
-
const client = new Client({
|
|
428
|
-
name: "neurolink-client",
|
|
429
|
-
version: "4.1.0",
|
|
430
|
-
}, {
|
|
431
|
-
capabilities: {
|
|
432
|
-
tools: {},
|
|
433
|
-
logging: {},
|
|
434
|
-
},
|
|
435
|
-
});
|
|
436
|
-
// Connect the client
|
|
437
|
-
await client.connect(transport);
|
|
438
|
-
this.activeConnections.set(serverId, client);
|
|
439
|
-
unifiedRegistryLogger.info(`Successfully connected to external server: ${serverId}`);
|
|
440
|
-
unifiedRegistryLogger.info(`Successfully added external server: ${serverId}`);
|
|
441
|
-
}
|
|
442
|
-
catch (error) {
|
|
443
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
444
|
-
unifiedRegistryLogger.warn(`Failed to establish connection to ${serverId}: ${errorMessage}. Server registered but not connected.`);
|
|
445
|
-
unifiedRegistryLogger.info(`Successfully registered external server: ${serverId} but connection failed.`);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* Get active connection for a server
|
|
450
|
-
*/
|
|
451
|
-
getConnection(serverId) {
|
|
452
|
-
return this.activeConnections.get(serverId);
|
|
453
|
-
}
|
|
454
|
-
/**
|
|
455
|
-
* Check if server is actively connected
|
|
456
|
-
*/
|
|
457
|
-
isConnected(serverId) {
|
|
458
|
-
return this.activeConnections.has(serverId);
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* Clear all registries and active connections (synchronous, preserves base API contract)
|
|
462
|
-
*/
|
|
463
|
-
/**
|
|
464
|
-
* Clear registries without closing connections (internal use)
|
|
465
|
-
*/
|
|
466
|
-
clearRegistriesOnly() {
|
|
467
|
-
super.clear();
|
|
468
|
-
this.autoDiscoveredServers = [];
|
|
469
|
-
this.manualServers.clear();
|
|
470
|
-
this.availableServers.clear();
|
|
471
|
-
}
|
|
472
|
-
/**
|
|
473
|
-
* Clear all registries and initiate async connection cleanup
|
|
474
|
-
*/
|
|
475
|
-
clear() {
|
|
476
|
-
// Close all active connections before clearing registries to prevent resource leaks
|
|
477
|
-
const closePromises = [];
|
|
478
|
-
for (const [serverId, client] of this.activeConnections) {
|
|
479
|
-
closePromises.push(client.close().catch((error) => {
|
|
480
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
481
|
-
unifiedRegistryLogger.warn(`Failed to close connection for ${serverId}: ${errorMessage}`);
|
|
482
|
-
}));
|
|
483
|
-
}
|
|
484
|
-
// Handle async cleanup without blocking synchronous clear()
|
|
485
|
-
Promise.allSettled(closePromises).then(() => {
|
|
486
|
-
this.activeConnections.clear();
|
|
487
|
-
});
|
|
488
|
-
// Clear registries after initiating connection cleanup
|
|
489
|
-
this.clearRegistriesOnly();
|
|
490
|
-
}
|
|
491
|
-
/**
|
|
492
|
-
* Clear all registries and close active connections asynchronously
|
|
493
|
-
*/
|
|
494
|
-
async clearAsync() {
|
|
495
|
-
// Close all active connections first
|
|
496
|
-
for (const [serverId, client] of this.activeConnections) {
|
|
497
|
-
try {
|
|
498
|
-
await client.close();
|
|
499
|
-
}
|
|
500
|
-
catch (error) {
|
|
501
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
502
|
-
unifiedRegistryLogger.warn(`Failed to close connection for ${serverId}: ${errorMessage}`);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
this.activeConnections.clear();
|
|
506
|
-
// Clear registries without attempting to close connections again
|
|
507
|
-
this.clearRegistriesOnly();
|
|
508
|
-
}
|
|
509
|
-
/**
|
|
510
|
-
* Convert unknown arguments to JsonValue for CLI compatibility
|
|
511
|
-
* Attempts to serialize complex types to JSON-safe format
|
|
512
|
-
*/
|
|
513
|
-
toJsonValue(args) {
|
|
514
|
-
try {
|
|
515
|
-
// First try to use it directly if it's already a JsonValue
|
|
516
|
-
if (args === null ||
|
|
517
|
-
typeof args === "string" ||
|
|
518
|
-
typeof args === "number" ||
|
|
519
|
-
typeof args === "boolean") {
|
|
520
|
-
return args;
|
|
521
|
-
}
|
|
522
|
-
// For objects and arrays, try JSON round-trip to ensure serialization
|
|
523
|
-
if (typeof args === "object") {
|
|
524
|
-
return JSON.parse(JSON.stringify(args));
|
|
525
|
-
}
|
|
526
|
-
// For other types, convert to string
|
|
527
|
-
return String(args);
|
|
528
|
-
}
|
|
529
|
-
catch (error) {
|
|
530
|
-
// If serialization fails, return empty object as fallback
|
|
531
|
-
unifiedRegistryLogger.warn("Failed to convert args to JsonValue, using empty object:", error);
|
|
532
|
-
return {};
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
/**
|
|
537
|
-
* Default unified registry instance
|
|
538
|
-
*/
|
|
539
|
-
export const unifiedRegistry = new UnifiedMCPRegistry();
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enhanced Analytics Helper for All Providers
|
|
3
|
-
* Ensures consistent analytics data format across providers
|
|
4
|
-
* Integrates with Universal Evaluation System
|
|
5
|
-
*/
|
|
6
|
-
import type { UnknownRecord } from "../types/common.js";
|
|
7
|
-
import type { AnalyticsData as CoreAnalyticsData } from "../core/types.js";
|
|
8
|
-
export interface AnalyticsData extends CoreAnalyticsData {
|
|
9
|
-
evaluation?: {
|
|
10
|
-
relevanceScore: number;
|
|
11
|
-
accuracyScore: number;
|
|
12
|
-
completenessScore: number;
|
|
13
|
-
overall: number;
|
|
14
|
-
evaluationProvider?: string;
|
|
15
|
-
evaluationTime?: number;
|
|
16
|
-
evaluationAttempt?: number;
|
|
17
|
-
};
|
|
18
|
-
costDetails?: UnknownRecord;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Create standardized analytics data from provider response
|
|
22
|
-
*/
|
|
23
|
-
export declare function createAnalytics(provider: string, model: string, result: unknown, responseTime: number, context?: Record<string, unknown>): AnalyticsData;
|
|
24
|
-
/**
|
|
25
|
-
* Create enhanced analytics data with accurate cost calculations (async version)
|
|
26
|
-
*/
|
|
27
|
-
export declare function createEnhancedAnalytics(provider: string, model: string, result: unknown, responseTime: number, context?: Record<string, unknown>): Promise<AnalyticsData>;
|
|
28
|
-
/**
|
|
29
|
-
* Calculate enhanced cost details using provider configurations
|
|
30
|
-
*/
|
|
31
|
-
export declare function calculateEnhancedCost(provider: string, inputTokens: number, outputTokens: number): Promise<{
|
|
32
|
-
costDetails: UnknownRecord;
|
|
33
|
-
estimatedCost: number;
|
|
34
|
-
}>;
|
|
35
|
-
/**
|
|
36
|
-
* Enhance analytics with evaluation data
|
|
37
|
-
*/
|
|
38
|
-
export declare function enhanceAnalyticsWithEvaluation(analytics: AnalyticsData, evaluationResult: UnknownRecord): AnalyticsData;
|