agentdog 1.1.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/LICENSE +22 -0
- package/README.md +244 -0
- package/dist/adapters/adapter-factory.d.ts +21 -0
- package/dist/adapters/adapter-factory.d.ts.map +1 -0
- package/dist/adapters/adapter-factory.js +157 -0
- package/dist/adapters/adapter-factory.js.map +1 -0
- package/dist/adapters/http-sse-adapter.d.ts +49 -0
- package/dist/adapters/http-sse-adapter.d.ts.map +1 -0
- package/dist/adapters/http-sse-adapter.js +485 -0
- package/dist/adapters/http-sse-adapter.js.map +1 -0
- package/dist/adapters/stdio-adapter.d.ts +69 -0
- package/dist/adapters/stdio-adapter.d.ts.map +1 -0
- package/dist/adapters/stdio-adapter.js +664 -0
- package/dist/adapters/stdio-adapter.js.map +1 -0
- package/dist/adapters/streamable-http-adapter.d.ts +38 -0
- package/dist/adapters/streamable-http-adapter.d.ts.map +1 -0
- package/dist/adapters/streamable-http-adapter.js +321 -0
- package/dist/adapters/streamable-http-adapter.js.map +1 -0
- package/dist/ai-gateway/anthropic-errors.d.ts +4 -0
- package/dist/ai-gateway/anthropic-errors.d.ts.map +1 -0
- package/dist/ai-gateway/anthropic-errors.js +17 -0
- package/dist/ai-gateway/anthropic-errors.js.map +1 -0
- package/dist/ai-gateway/auth.d.ts +3 -0
- package/dist/ai-gateway/auth.d.ts.map +1 -0
- package/dist/ai-gateway/auth.js +14 -0
- package/dist/ai-gateway/auth.js.map +1 -0
- package/dist/ai-gateway/auth.test.d.ts +2 -0
- package/dist/ai-gateway/auth.test.d.ts.map +1 -0
- package/dist/ai-gateway/auth.test.js +57 -0
- package/dist/ai-gateway/auth.test.js.map +1 -0
- package/dist/ai-gateway/count-tokens.d.ts +5 -0
- package/dist/ai-gateway/count-tokens.d.ts.map +1 -0
- package/dist/ai-gateway/count-tokens.js +37 -0
- package/dist/ai-gateway/count-tokens.js.map +1 -0
- package/dist/ai-gateway/count-tokens.test.d.ts +2 -0
- package/dist/ai-gateway/count-tokens.test.d.ts.map +1 -0
- package/dist/ai-gateway/count-tokens.test.js +19 -0
- package/dist/ai-gateway/count-tokens.test.js.map +1 -0
- package/dist/ai-gateway/dialects.d.ts +4 -0
- package/dist/ai-gateway/dialects.d.ts.map +1 -0
- package/dist/ai-gateway/dialects.js +15 -0
- package/dist/ai-gateway/dialects.js.map +1 -0
- package/dist/ai-gateway/gateway-server.d.ts +15 -0
- package/dist/ai-gateway/gateway-server.d.ts.map +1 -0
- package/dist/ai-gateway/gateway-server.js +121 -0
- package/dist/ai-gateway/gateway-server.js.map +1 -0
- package/dist/ai-gateway/integration.test.d.ts +2 -0
- package/dist/ai-gateway/integration.test.d.ts.map +1 -0
- package/dist/ai-gateway/integration.test.js +205 -0
- package/dist/ai-gateway/integration.test.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.d.ts +3 -0
- package/dist/ai-gateway/ir/anthropic-in.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.js +121 -0
- package/dist/ai-gateway/ir/anthropic-in.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.test.d.ts +2 -0
- package/dist/ai-gateway/ir/anthropic-in.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-in.test.js +93 -0
- package/dist/ai-gateway/ir/anthropic-in.test.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.d.ts +22 -0
- package/dist/ai-gateway/ir/anthropic-sse.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.js +200 -0
- package/dist/ai-gateway/ir/anthropic-sse.js.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.d.ts +2 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.js +101 -0
- package/dist/ai-gateway/ir/anthropic-sse.test.js.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.d.ts +20 -0
- package/dist/ai-gateway/ir/gemini-out.d.ts.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.js +218 -0
- package/dist/ai-gateway/ir/gemini-out.js.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.test.d.ts +2 -0
- package/dist/ai-gateway/ir/gemini-out.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/gemini-out.test.js +125 -0
- package/dist/ai-gateway/ir/gemini-out.test.js.map +1 -0
- package/dist/ai-gateway/ir/openai-out.d.ts +17 -0
- package/dist/ai-gateway/ir/openai-out.d.ts.map +1 -0
- package/dist/ai-gateway/ir/openai-out.js +226 -0
- package/dist/ai-gateway/ir/openai-out.js.map +1 -0
- package/dist/ai-gateway/ir/openai-out.test.d.ts +2 -0
- package/dist/ai-gateway/ir/openai-out.test.d.ts.map +1 -0
- package/dist/ai-gateway/ir/openai-out.test.js +144 -0
- package/dist/ai-gateway/ir/openai-out.test.js.map +1 -0
- package/dist/ai-gateway/ir/types.d.ts +77 -0
- package/dist/ai-gateway/ir/types.d.ts.map +1 -0
- package/dist/ai-gateway/ir/types.js +4 -0
- package/dist/ai-gateway/ir/types.js.map +1 -0
- package/dist/ai-gateway/ir-channel.d.ts +15 -0
- package/dist/ai-gateway/ir-channel.d.ts.map +1 -0
- package/dist/ai-gateway/ir-channel.js +120 -0
- package/dist/ai-gateway/ir-channel.js.map +1 -0
- package/dist/ai-gateway/model-router.d.ts +11 -0
- package/dist/ai-gateway/model-router.d.ts.map +1 -0
- package/dist/ai-gateway/model-router.js +27 -0
- package/dist/ai-gateway/model-router.js.map +1 -0
- package/dist/ai-gateway/model-router.test.d.ts +2 -0
- package/dist/ai-gateway/model-router.test.d.ts.map +1 -0
- package/dist/ai-gateway/model-router.test.js +43 -0
- package/dist/ai-gateway/model-router.test.js.map +1 -0
- package/dist/ai-gateway/passthrough.d.ts +9 -0
- package/dist/ai-gateway/passthrough.d.ts.map +1 -0
- package/dist/ai-gateway/passthrough.js +81 -0
- package/dist/ai-gateway/passthrough.js.map +1 -0
- package/dist/ai-gateway/passthrough.test.d.ts +2 -0
- package/dist/ai-gateway/passthrough.test.d.ts.map +1 -0
- package/dist/ai-gateway/passthrough.test.js +108 -0
- package/dist/ai-gateway/passthrough.test.js.map +1 -0
- package/dist/ai-gateway/upstream/model-lister.d.ts +13 -0
- package/dist/ai-gateway/upstream/model-lister.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/model-lister.js +61 -0
- package/dist/ai-gateway/upstream/model-lister.js.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.d.ts +20 -0
- package/dist/ai-gateway/upstream/provider-client.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.js +76 -0
- package/dist/ai-gateway/upstream/provider-client.js.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.test.d.ts +2 -0
- package/dist/ai-gateway/upstream/provider-client.test.d.ts.map +1 -0
- package/dist/ai-gateway/upstream/provider-client.test.js +69 -0
- package/dist/ai-gateway/upstream/provider-client.test.js.map +1 -0
- package/dist/cli/cli-main.d.ts +7 -0
- package/dist/cli/cli-main.d.ts.map +1 -0
- package/dist/cli/cli-main.js +116 -0
- package/dist/cli/cli-main.js.map +1 -0
- package/dist/cli/cli-router.d.ts +20 -0
- package/dist/cli/cli-router.d.ts.map +1 -0
- package/dist/cli/cli-router.js +271 -0
- package/dist/cli/cli-router.js.map +1 -0
- package/dist/cli/cli-utils.d.ts +30 -0
- package/dist/cli/cli-utils.d.ts.map +1 -0
- package/dist/cli/cli-utils.js +219 -0
- package/dist/cli/cli-utils.js.map +1 -0
- package/dist/cli/commands/audit-commands.d.ts +30 -0
- package/dist/cli/commands/audit-commands.d.ts.map +1 -0
- package/dist/cli/commands/audit-commands.js +417 -0
- package/dist/cli/commands/audit-commands.js.map +1 -0
- package/dist/cli/commands/autostart-command.d.ts +21 -0
- package/dist/cli/commands/autostart-command.d.ts.map +1 -0
- package/dist/cli/commands/autostart-command.js +243 -0
- package/dist/cli/commands/autostart-command.js.map +1 -0
- package/dist/cli/commands/autostart-command.test.d.ts +2 -0
- package/dist/cli/commands/autostart-command.test.d.ts.map +1 -0
- package/dist/cli/commands/autostart-command.test.js +35 -0
- package/dist/cli/commands/autostart-command.test.js.map +1 -0
- package/dist/cli/commands/config-commands.d.ts +30 -0
- package/dist/cli/commands/config-commands.d.ts.map +1 -0
- package/dist/cli/commands/config-commands.js +1013 -0
- package/dist/cli/commands/config-commands.js.map +1 -0
- package/dist/cli/commands/daemon-commands.d.ts +76 -0
- package/dist/cli/commands/daemon-commands.d.ts.map +1 -0
- package/dist/cli/commands/daemon-commands.js +451 -0
- package/dist/cli/commands/daemon-commands.js.map +1 -0
- package/dist/cli/commands/detect-commands.d.ts +17 -0
- package/dist/cli/commands/detect-commands.d.ts.map +1 -0
- package/dist/cli/commands/detect-commands.js +293 -0
- package/dist/cli/commands/detect-commands.js.map +1 -0
- package/dist/cli/commands/diagnose-commands.d.ts +19 -0
- package/dist/cli/commands/diagnose-commands.d.ts.map +1 -0
- package/dist/cli/commands/diagnose-commands.js +326 -0
- package/dist/cli/commands/diagnose-commands.js.map +1 -0
- package/dist/cli/commands/optimize-commands.d.ts +14 -0
- package/dist/cli/commands/optimize-commands.d.ts.map +1 -0
- package/dist/cli/commands/optimize-commands.js +189 -0
- package/dist/cli/commands/optimize-commands.js.map +1 -0
- package/dist/cli/commands/proxy-command.d.ts +27 -0
- package/dist/cli/commands/proxy-command.d.ts.map +1 -0
- package/dist/cli/commands/proxy-command.js +212 -0
- package/dist/cli/commands/proxy-command.js.map +1 -0
- package/dist/cli/commands/start-command.d.ts +22 -0
- package/dist/cli/commands/start-command.d.ts.map +1 -0
- package/dist/cli/commands/start-command.js +275 -0
- package/dist/cli/commands/start-command.js.map +1 -0
- package/dist/config/config-manager.d.ts +125 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +569 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/config-manager.test.d.ts +2 -0
- package/dist/config/config-manager.test.d.ts.map +1 -0
- package/dist/config/config-manager.test.js +209 -0
- package/dist/config/config-manager.test.js.map +1 -0
- package/dist/core/auto-config-generator.d.ts +55 -0
- package/dist/core/auto-config-generator.d.ts.map +1 -0
- package/dist/core/auto-config-generator.js +278 -0
- package/dist/core/auto-config-generator.js.map +1 -0
- package/dist/core/mcpdog-server.d.ts +49 -0
- package/dist/core/mcpdog-server.d.ts.map +1 -0
- package/dist/core/mcpdog-server.js +552 -0
- package/dist/core/mcpdog-server.js.map +1 -0
- package/dist/core/protocol-detector.d.ts +56 -0
- package/dist/core/protocol-detector.d.ts.map +1 -0
- package/dist/core/protocol-detector.js +365 -0
- package/dist/core/protocol-detector.js.map +1 -0
- package/dist/daemon/daemon-client.d.ts +34 -0
- package/dist/daemon/daemon-client.d.ts.map +1 -0
- package/dist/daemon/daemon-client.js +130 -0
- package/dist/daemon/daemon-client.js.map +1 -0
- package/dist/daemon/daemon-client.test.d.ts +2 -0
- package/dist/daemon/daemon-client.test.d.ts.map +1 -0
- package/dist/daemon/daemon-client.test.js +77 -0
- package/dist/daemon/daemon-client.test.js.map +1 -0
- package/dist/daemon/daemon-info.d.ts +7 -0
- package/dist/daemon/daemon-info.d.ts.map +1 -0
- package/dist/daemon/daemon-info.js +34 -0
- package/dist/daemon/daemon-info.js.map +1 -0
- package/dist/daemon/daemon-info.test.d.ts +2 -0
- package/dist/daemon/daemon-info.test.d.ts.map +1 -0
- package/dist/daemon/daemon-info.test.js +57 -0
- package/dist/daemon/daemon-info.test.js.map +1 -0
- package/dist/daemon/daemon-web-server.ai.test.d.ts +2 -0
- package/dist/daemon/daemon-web-server.ai.test.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.ai.test.js +119 -0
- package/dist/daemon/daemon-web-server.ai.test.js.map +1 -0
- package/dist/daemon/daemon-web-server.d.ts +59 -0
- package/dist/daemon/daemon-web-server.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.js +1236 -0
- package/dist/daemon/daemon-web-server.js.map +1 -0
- package/dist/daemon/daemon-web-server.test.d.ts +2 -0
- package/dist/daemon/daemon-web-server.test.d.ts.map +1 -0
- package/dist/daemon/daemon-web-server.test.js +93 -0
- package/dist/daemon/daemon-web-server.test.js.map +1 -0
- package/dist/daemon/mcpdog-daemon.d.ts +42 -0
- package/dist/daemon/mcpdog-daemon.d.ts.map +1 -0
- package/dist/daemon/mcpdog-daemon.js +302 -0
- package/dist/daemon/mcpdog-daemon.js.map +1 -0
- package/dist/daemon/stdio-proxy.d.ts +17 -0
- package/dist/daemon/stdio-proxy.d.ts.map +1 -0
- package/dist/daemon/stdio-proxy.js +143 -0
- package/dist/daemon/stdio-proxy.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +198 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-analyzer.d.ts +27 -0
- package/dist/intent-analyzer.d.ts.map +1 -0
- package/dist/intent-analyzer.js +140 -0
- package/dist/intent-analyzer.js.map +1 -0
- package/dist/logging/server-log-manager.d.ts +75 -0
- package/dist/logging/server-log-manager.d.ts.map +1 -0
- package/dist/logging/server-log-manager.js +185 -0
- package/dist/logging/server-log-manager.js.map +1 -0
- package/dist/mcp-registry.d.ts +35 -0
- package/dist/mcp-registry.d.ts.map +1 -0
- package/dist/mcp-registry.js +166 -0
- package/dist/mcp-registry.js.map +1 -0
- package/dist/middleware/auth.d.ts +5 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +81 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/mock-tool-database.d.ts +41 -0
- package/dist/mock-tool-database.d.ts.map +1 -0
- package/dist/mock-tool-database.js +461 -0
- package/dist/mock-tool-database.js.map +1 -0
- package/dist/proxy-server-manager.d.ts +11 -0
- package/dist/proxy-server-manager.d.ts.map +1 -0
- package/dist/proxy-server-manager.js +144 -0
- package/dist/proxy-server-manager.js.map +1 -0
- package/dist/router/tool-router.d.ts +61 -0
- package/dist/router/tool-router.d.ts.map +1 -0
- package/dist/router/tool-router.js +539 -0
- package/dist/router/tool-router.js.map +1 -0
- package/dist/router/tool-router.test.d.ts +2 -0
- package/dist/router/tool-router.test.d.ts.map +1 -0
- package/dist/router/tool-router.test.js +113 -0
- package/dist/router/tool-router.test.js.map +1 -0
- package/dist/streamable-http-server.d.ts +27 -0
- package/dist/streamable-http-server.d.ts.map +1 -0
- package/dist/streamable-http-server.js +302 -0
- package/dist/streamable-http-server.js.map +1 -0
- package/dist/tool-finder.d.ts +21 -0
- package/dist/tool-finder.d.ts.map +1 -0
- package/dist/tool-finder.js +86 -0
- package/dist/tool-finder.js.map +1 -0
- package/dist/tool-recommender.d.ts +23 -0
- package/dist/tool-recommender.d.ts.map +1 -0
- package/dist/tool-recommender.js +200 -0
- package/dist/tool-recommender.js.map +1 -0
- package/dist/types/index.d.ts +145 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/server-name-validator.d.ts +47 -0
- package/dist/utils/server-name-validator.d.ts.map +1 -0
- package/dist/utils/server-name-validator.js +156 -0
- package/dist/utils/server-name-validator.js.map +1 -0
- package/dist/web/web-server.d.ts +44 -0
- package/dist/web/web-server.d.ts.map +1 -0
- package/dist/web/web-server.js +500 -0
- package/dist/web/web-server.js.map +1 -0
- package/package.json +68 -0
- package/web/dist/assets/index-DMVhVtNU.css +1 -0
- package/web/dist/assets/index-VMXIgcOH.js +92 -0
- package/web/dist/assets/index-VMXIgcOH.js.map +1 -0
- package/web/dist/index.html +14 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol detection CLI commands
|
|
3
|
+
*/
|
|
4
|
+
import { CLIUtils } from '../cli-utils.js';
|
|
5
|
+
export class DetectCommands {
|
|
6
|
+
configManager;
|
|
7
|
+
constructor(configManager) {
|
|
8
|
+
this.configManager = configManager;
|
|
9
|
+
}
|
|
10
|
+
async execute(args, options) {
|
|
11
|
+
if (options.help) {
|
|
12
|
+
this.showHelp();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (options.all) {
|
|
16
|
+
await this.detectAllServers(options);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
const [target] = args;
|
|
20
|
+
if (!target) {
|
|
21
|
+
CLIUtils.error('Usage: agentdog detect <server-name|endpoint> or agentdog detect --all');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
await this.detectTarget(target, options);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async detectTarget(target, options) {
|
|
28
|
+
try {
|
|
29
|
+
// Determine if it's a server name or endpoint URL
|
|
30
|
+
const existingServer = this.configManager.getServer(target);
|
|
31
|
+
if (existingServer) {
|
|
32
|
+
// Detect existing server
|
|
33
|
+
await this.detectExistingServer(target, options);
|
|
34
|
+
}
|
|
35
|
+
else if (target.startsWith('http://') || target.startsWith('https://')) {
|
|
36
|
+
// Detect new endpoint
|
|
37
|
+
await this.detectNewEndpoint(target, options);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// May be a stdio command
|
|
41
|
+
await this.detectStdioCommand(target, options);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
CLIUtils.error(`Protocol detection failed: ${error.message}`);
|
|
46
|
+
if (CLIUtils.isJsonMode()) {
|
|
47
|
+
CLIUtils.jsonOutput({ success: false, error: error.message });
|
|
48
|
+
}
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async detectExistingServer(serverName, options) {
|
|
53
|
+
const server = this.configManager.getServer(serverName);
|
|
54
|
+
CLIUtils.info(`🔍 Detecting server: ${serverName}`);
|
|
55
|
+
CLIUtils.verbose(`Endpoint: ${server.endpoint || server.command}`);
|
|
56
|
+
const detection = await this.configManager.detectConfigProtocol(server);
|
|
57
|
+
if (CLIUtils.isJsonMode()) {
|
|
58
|
+
CLIUtils.jsonOutput({
|
|
59
|
+
server: serverName,
|
|
60
|
+
current: server.transport,
|
|
61
|
+
detected: detection.detected,
|
|
62
|
+
confidence: detection.confidence,
|
|
63
|
+
recommendations: detection.recommendations
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.log(`\n${CLIUtils.colorize('📊 Detection Results:', 'cyan')}`);
|
|
68
|
+
console.log(`Server: ${CLIUtils.colorize(serverName, 'yellow')}`);
|
|
69
|
+
console.log(`Current Protocol: ${CLIUtils.colorize(server.transport, 'blue')}`);
|
|
70
|
+
console.log(`Detected Protocol: ${CLIUtils.colorize(detection.detected, detection.detected === server.transport ? 'green' : 'yellow')}`);
|
|
71
|
+
console.log(`Confidence: ${this.formatConfidence(detection.confidence)}`);
|
|
72
|
+
if (detection.recommendations.length > 0) {
|
|
73
|
+
console.log(`\n${CLIUtils.colorize('💡 Recommendations:', 'cyan')}`);
|
|
74
|
+
detection.recommendations.forEach((rec) => {
|
|
75
|
+
console.log(` • ${rec}`);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
// If a better protocol is detected, ask whether to update
|
|
79
|
+
if (detection.detected !== server.transport && detection.confidence > 70) {
|
|
80
|
+
const shouldUpdate = options.yes || await CLIUtils.confirm(`Detected better protocol ${detection.detected}, update configuration?`, false);
|
|
81
|
+
if (shouldUpdate) {
|
|
82
|
+
await this.configManager.updateServer(serverName, { transport: detection.detected });
|
|
83
|
+
CLIUtils.success(`✅ Server '${serverName}' protocol updated to ${detection.detected}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async detectNewEndpoint(endpoint, options) {
|
|
88
|
+
CLIUtils.info(`🔍 Detecting new endpoint: ${endpoint}`);
|
|
89
|
+
// Use AutoConfigGenerator directly for endpoint detection
|
|
90
|
+
const { AutoConfigGenerator } = await import('../../core/auto-config-generator.js');
|
|
91
|
+
const generator = new AutoConfigGenerator();
|
|
92
|
+
const suggestion = await generator.generateConfig('temp-detection', endpoint, {
|
|
93
|
+
timeout: options.timeout ? parseInt(options.timeout) : undefined
|
|
94
|
+
});
|
|
95
|
+
if (CLIUtils.isJsonMode()) {
|
|
96
|
+
CLIUtils.jsonOutput({
|
|
97
|
+
endpoint,
|
|
98
|
+
detected: suggestion.config.transport,
|
|
99
|
+
confidence: suggestion.confidence,
|
|
100
|
+
config: suggestion.config,
|
|
101
|
+
alternatives: suggestion.alternatives,
|
|
102
|
+
warnings: suggestion.warnings,
|
|
103
|
+
optimizations: suggestion.optimizations
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
console.log(`\n${CLIUtils.colorize('📊 Detection Results:', 'cyan')}`);
|
|
108
|
+
console.log(`Endpoint: ${CLIUtils.colorize(endpoint, 'yellow')}`);
|
|
109
|
+
console.log(`Recommended Protocol: ${CLIUtils.colorize(suggestion.config.transport, 'green')}`);
|
|
110
|
+
console.log(`Confidence: ${this.formatConfidence(suggestion.confidence)}`);
|
|
111
|
+
if (options.detailed) {
|
|
112
|
+
console.log(`\n${CLIUtils.colorize('🔧 Suggested Configuration:', 'cyan')}`);
|
|
113
|
+
console.log(` Transport Protocol: ${suggestion.config.transport}`);
|
|
114
|
+
console.log(` Timeout: ${suggestion.config.timeout}ms`);
|
|
115
|
+
console.log(` Retry Count: ${suggestion.config.retries}`);
|
|
116
|
+
console.log(` Session Mode: ${suggestion.config.sessionMode || 'Default'}`);
|
|
117
|
+
}
|
|
118
|
+
if (suggestion.alternatives.length > 0) {
|
|
119
|
+
console.log(`\n${CLIUtils.colorize('🔄 Alternatives:', 'cyan')}`);
|
|
120
|
+
suggestion.alternatives.forEach((alt, index) => {
|
|
121
|
+
console.log(` ${index + 1}. ${alt.transport} - ${alt.description}`);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (suggestion.warnings.length > 0) {
|
|
125
|
+
console.log(`\n${CLIUtils.colorize('⚠️ Warnings:', 'yellow')}`);
|
|
126
|
+
suggestion.warnings.forEach(warning => {
|
|
127
|
+
console.log(` • ${warning}`);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
if (suggestion.optimizations.length > 0) {
|
|
131
|
+
console.log(`\n${CLIUtils.colorize('💡 Optimization Suggestions:', 'cyan')}`);
|
|
132
|
+
suggestion.optimizations.forEach(opt => {
|
|
133
|
+
console.log(` • ${opt}`);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// Ask whether to add server
|
|
137
|
+
if (!options['no-add']) {
|
|
138
|
+
const shouldAdd = await CLIUtils.confirm('Add new server based on detection results?', false);
|
|
139
|
+
if (shouldAdd) {
|
|
140
|
+
const { createInterface } = await import('readline');
|
|
141
|
+
const rl = createInterface({
|
|
142
|
+
input: process.stdin,
|
|
143
|
+
output: process.stdout
|
|
144
|
+
});
|
|
145
|
+
const serverName = await new Promise((resolve) => {
|
|
146
|
+
rl.question('Please enter server name: ', resolve);
|
|
147
|
+
});
|
|
148
|
+
rl.close();
|
|
149
|
+
if (serverName.trim()) {
|
|
150
|
+
await this.configManager.addServer(serverName.trim(), suggestion.config);
|
|
151
|
+
CLIUtils.success(`✅ Server '${serverName.trim()}' added successfully`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async detectStdioCommand(command, options) {
|
|
157
|
+
CLIUtils.info(`🔍 Detecting stdio command: ${command}`);
|
|
158
|
+
// For stdio commands, we directly suggest stdio protocol
|
|
159
|
+
const suggestion = {
|
|
160
|
+
protocol: 'stdio',
|
|
161
|
+
confidence: 95,
|
|
162
|
+
reason: 'Command-based MCP server detected',
|
|
163
|
+
features: ['PROCESS_COMMUNICATION', 'DIRECT_EXECUTION']
|
|
164
|
+
};
|
|
165
|
+
if (CLIUtils.isJsonMode()) {
|
|
166
|
+
CLIUtils.jsonOutput({
|
|
167
|
+
command,
|
|
168
|
+
detected: suggestion.protocol,
|
|
169
|
+
confidence: suggestion.confidence,
|
|
170
|
+
reason: suggestion.reason,
|
|
171
|
+
features: suggestion.features
|
|
172
|
+
});
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
console.log(`\n${CLIUtils.colorize('📊 Detection Results:', 'cyan')}`);
|
|
176
|
+
console.log(`Command: ${CLIUtils.colorize(command, 'yellow')}`);
|
|
177
|
+
console.log(`Recommended Protocol: ${CLIUtils.colorize('stdio', 'green')}`);
|
|
178
|
+
console.log(`Confidence: ${this.formatConfidence(suggestion.confidence)}`);
|
|
179
|
+
console.log(`Reason: ${suggestion.reason}`);
|
|
180
|
+
console.log(`\n${CLIUtils.colorize('🔧 Suggested Configuration:', 'cyan')}`);
|
|
181
|
+
console.log(` Transport Protocol: stdio`);
|
|
182
|
+
console.log(` Command: ${command}`);
|
|
183
|
+
console.log(` Timeout: 60000ms (stdio recommends longer)`);
|
|
184
|
+
}
|
|
185
|
+
async detectAllServers(options) {
|
|
186
|
+
const servers = this.configManager.getServers();
|
|
187
|
+
if (Object.keys(servers).length === 0) {
|
|
188
|
+
CLIUtils.info('No servers configured');
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
CLIUtils.info(`🔍 Batch detecting protocols for ${Object.keys(servers).length} servers...`);
|
|
192
|
+
const results = await this.configManager.auditAllServerProtocols();
|
|
193
|
+
if (CLIUtils.isJsonMode()) {
|
|
194
|
+
const jsonResults = Object.entries(results).map(([name, result]) => ({
|
|
195
|
+
server: name,
|
|
196
|
+
...result
|
|
197
|
+
}));
|
|
198
|
+
CLIUtils.jsonOutput(jsonResults);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
console.log(`\n${CLIUtils.colorize('📊 Batch Detection Results:', 'cyan')}\n`);
|
|
202
|
+
const headers = ['Server', 'Current Protocol', 'Detected Protocol', 'Confidence', 'Status', 'Recommendation'];
|
|
203
|
+
const rows = [];
|
|
204
|
+
for (const [serverName, result] of Object.entries(results)) {
|
|
205
|
+
const status = result.needsUpdate ?
|
|
206
|
+
CLIUtils.colorize('Needs Update', 'yellow') :
|
|
207
|
+
CLIUtils.colorize('OK', 'green');
|
|
208
|
+
const mainRecommendation = result.recommendations[0] || 'None';
|
|
209
|
+
rows.push([
|
|
210
|
+
serverName,
|
|
211
|
+
result.current,
|
|
212
|
+
result.detected,
|
|
213
|
+
this.formatConfidence(result.confidence),
|
|
214
|
+
status,
|
|
215
|
+
mainRecommendation.length > 40 ? mainRecommendation.substring(0, 37) + '...' : mainRecommendation
|
|
216
|
+
]);
|
|
217
|
+
}
|
|
218
|
+
CLIUtils.printTable(headers, rows);
|
|
219
|
+
// Statistics
|
|
220
|
+
const needsUpdate = Object.values(results).filter((r) => r.needsUpdate).length;
|
|
221
|
+
const highConfidence = Object.values(results).filter((r) => r.confidence > 80).length;
|
|
222
|
+
console.log(`\n${CLIUtils.colorize('📈 Statistics:', 'cyan')}`);
|
|
223
|
+
console.log(` Total Servers: ${Object.keys(servers).length}`);
|
|
224
|
+
console.log(` Need Update: ${needsUpdate}`);
|
|
225
|
+
console.log(` High Confidence Detection: ${highConfidence}`);
|
|
226
|
+
if (needsUpdate > 0) {
|
|
227
|
+
const shouldUpdate = options.yes || await CLIUtils.confirm(`Found ${needsUpdate} servers that can be optimized, batch update?`, false);
|
|
228
|
+
if (shouldUpdate) {
|
|
229
|
+
let updated = 0;
|
|
230
|
+
for (const [serverName, result] of Object.entries(results)) {
|
|
231
|
+
if (result.needsUpdate) {
|
|
232
|
+
try {
|
|
233
|
+
await this.configManager.updateServer(serverName, {
|
|
234
|
+
transport: result.detected
|
|
235
|
+
});
|
|
236
|
+
updated++;
|
|
237
|
+
CLIUtils.verbose(`✅ Updated server '${serverName}' protocol to ${result.detected}`);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
CLIUtils.warning(`Failed to update server '${serverName}': ${error.message}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
CLIUtils.success(`✅ Successfully updated ${updated} server configurations`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
formatConfidence(confidence) {
|
|
249
|
+
if (confidence >= 90) {
|
|
250
|
+
return CLIUtils.colorize(`${confidence}% (Very High)`, 'green');
|
|
251
|
+
}
|
|
252
|
+
else if (confidence >= 70) {
|
|
253
|
+
return CLIUtils.colorize(`${confidence}% (High)`, 'green');
|
|
254
|
+
}
|
|
255
|
+
else if (confidence >= 50) {
|
|
256
|
+
return CLIUtils.colorize(`${confidence}% (Medium)`, 'yellow');
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
return CLIUtils.colorize(`${confidence}% (Low)`, 'red');
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
showHelp() {
|
|
263
|
+
console.log(`
|
|
264
|
+
${CLIUtils.colorize('agentdog detect', 'cyan')} - 协议检测
|
|
265
|
+
|
|
266
|
+
${CLIUtils.colorize('使用方法:', 'yellow')}
|
|
267
|
+
agentdog detect <server-name|endpoint> [options]
|
|
268
|
+
agentdog detect --all [options]
|
|
269
|
+
|
|
270
|
+
${CLIUtils.colorize('选项:', 'yellow')}
|
|
271
|
+
--all 检测所有配置的服务器
|
|
272
|
+
--timeout <ms> 检测超时时间 (默认: 10000)
|
|
273
|
+
--detailed 显示详细检测信息
|
|
274
|
+
--no-add 不询问是否添加新服务器
|
|
275
|
+
--yes 自动确认所有操作
|
|
276
|
+
|
|
277
|
+
${CLIUtils.colorize('示例:', 'yellow')}
|
|
278
|
+
agentdog detect my-server # 检测现有服务器
|
|
279
|
+
agentdog detect https://api.example.com # 检测新端点
|
|
280
|
+
agentdog detect "node mcp-server.js" # 检测stdio命令
|
|
281
|
+
agentdog detect --all # 检测所有服务器
|
|
282
|
+
agentdog detect --all --yes # 批量检测并自动更新
|
|
283
|
+
agentdog detect new-api --detailed # 详细检测信息
|
|
284
|
+
|
|
285
|
+
${CLIUtils.colorize('输出说明:', 'yellow')}
|
|
286
|
+
置信度 90%+: 极高可信度,强烈建议使用
|
|
287
|
+
置信度 70-89%: 高可信度,建议使用
|
|
288
|
+
置信度 50-69%: 中等可信度,可以尝试
|
|
289
|
+
置信度 <50%: 低可信度,需要手动验证
|
|
290
|
+
`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
//# sourceMappingURL=detect-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect-commands.js","sourceRoot":"","sources":["../../../src/cli/commands/detect-commands.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 诊断和修复CLI命令
|
|
3
|
+
*/
|
|
4
|
+
import { ConfigManager } from '../../config/config-manager.js';
|
|
5
|
+
export declare class DiagnoseCommands {
|
|
6
|
+
private configManager;
|
|
7
|
+
constructor(configManager: ConfigManager);
|
|
8
|
+
execute(args: string[], options: Record<string, any>): Promise<void>;
|
|
9
|
+
private diagnoseServer;
|
|
10
|
+
private diagnoseAllServers;
|
|
11
|
+
private healthCheck;
|
|
12
|
+
private attemptFix;
|
|
13
|
+
private calculateHealthScore;
|
|
14
|
+
private calculateSystemHealth;
|
|
15
|
+
private formatConfidence;
|
|
16
|
+
private formatHealthScore;
|
|
17
|
+
private showHelp;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=diagnose-commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose-commands.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/diagnose-commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAG/D,qBAAa,gBAAgB;IACf,OAAO,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAE1C,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAoB5D,cAAc;YAoEd,kBAAkB;YA0FlB,WAAW;YAuDX,UAAU;IA6CxB,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,QAAQ;CA4BjB"}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 诊断和修复CLI命令
|
|
3
|
+
*/
|
|
4
|
+
import { CLIUtils } from '../cli-utils.js';
|
|
5
|
+
export class DiagnoseCommands {
|
|
6
|
+
configManager;
|
|
7
|
+
constructor(configManager) {
|
|
8
|
+
this.configManager = configManager;
|
|
9
|
+
}
|
|
10
|
+
async execute(args, options) {
|
|
11
|
+
if (options.help) {
|
|
12
|
+
this.showHelp();
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (options['health-check']) {
|
|
16
|
+
await this.healthCheck(options);
|
|
17
|
+
}
|
|
18
|
+
else if (options.all) {
|
|
19
|
+
await this.diagnoseAllServers(options);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const [serverName] = args;
|
|
23
|
+
if (!serverName) {
|
|
24
|
+
CLIUtils.error('使用方法: agentdog diagnose <server-name> 或 agentdog diagnose --all');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
await this.diagnoseServer(serverName, options);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async diagnoseServer(serverName, options) {
|
|
31
|
+
try {
|
|
32
|
+
const server = this.configManager.getServer(serverName);
|
|
33
|
+
if (!server) {
|
|
34
|
+
CLIUtils.error(`服务器 '${serverName}' 不存在`);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
CLIUtils.info(`🔍 诊断服务器: ${serverName}`);
|
|
38
|
+
// 执行基础配置检查
|
|
39
|
+
const configErrors = this.configManager.validateServerConfig(server);
|
|
40
|
+
// 执行协议检测诊断
|
|
41
|
+
const protocolDiagnosis = await this.configManager.detectConfigProtocol(server);
|
|
42
|
+
if (CLIUtils.isJsonMode()) {
|
|
43
|
+
CLIUtils.jsonOutput({
|
|
44
|
+
server: serverName,
|
|
45
|
+
configValid: configErrors.valid,
|
|
46
|
+
configErrors: configErrors.errors,
|
|
47
|
+
protocolDiagnosis,
|
|
48
|
+
needsFix: !configErrors.valid || protocolDiagnosis.confidence < 50
|
|
49
|
+
});
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
console.log(`\n${CLIUtils.colorize('🏥 诊断报告:', 'cyan')} ${serverName}\n`);
|
|
53
|
+
// 配置验证结果
|
|
54
|
+
console.log(`${CLIUtils.colorize('📋 配置检查:', 'yellow')}`);
|
|
55
|
+
if (configErrors.valid) {
|
|
56
|
+
console.log(` ${CLIUtils.colorize('✅ 配置语法正确', 'green')}`);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(` ${CLIUtils.colorize('❌ 发现配置问题:', 'red')}`);
|
|
60
|
+
configErrors.errors.forEach((error) => {
|
|
61
|
+
console.log(` • ${error}`);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// 协议诊断结果
|
|
65
|
+
console.log(`\n${CLIUtils.colorize('🔌 连接诊断:', 'yellow')}`);
|
|
66
|
+
console.log(` 当前协议: ${server.transport}`);
|
|
67
|
+
console.log(` 检测协议: ${protocolDiagnosis.detected}`);
|
|
68
|
+
console.log(` 检测置信度: ${this.formatConfidence(protocolDiagnosis.confidence)}`);
|
|
69
|
+
if (protocolDiagnosis.recommendations.length > 0) {
|
|
70
|
+
console.log(`\n${CLIUtils.colorize('💡 诊断建议:', 'cyan')}`);
|
|
71
|
+
protocolDiagnosis.recommendations.forEach((rec) => {
|
|
72
|
+
console.log(` • ${rec}`);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// 健康状态评估
|
|
76
|
+
const healthScore = this.calculateHealthScore(configErrors.errors, protocolDiagnosis);
|
|
77
|
+
console.log(`\n${CLIUtils.colorize('💗 健康评分:', 'cyan')} ${this.formatHealthScore(healthScore)}`);
|
|
78
|
+
// 自动修复建议
|
|
79
|
+
if (options.fix || (healthScore < 70 && await CLIUtils.confirm('是否尝试自动修复发现的问题?', false))) {
|
|
80
|
+
await this.attemptFix(serverName, server, configErrors.errors, protocolDiagnosis);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
CLIUtils.error(`诊断失败: ${error.message}`);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async diagnoseAllServers(options) {
|
|
89
|
+
const servers = this.configManager.getServers();
|
|
90
|
+
const serverEntries = Object.entries(servers);
|
|
91
|
+
if (serverEntries.length === 0) {
|
|
92
|
+
CLIUtils.info('没有配置任何服务器');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
CLIUtils.info(`🔍 批量诊断 ${serverEntries.length} 个服务器...`);
|
|
96
|
+
const results = [];
|
|
97
|
+
for (let i = 0; i < serverEntries.length; i++) {
|
|
98
|
+
const [serverName, server] = serverEntries[i];
|
|
99
|
+
CLIUtils.showProgress(i + 1, serverEntries.length, `诊断 ${serverName}`);
|
|
100
|
+
try {
|
|
101
|
+
const configErrors = this.configManager.validateServerConfig(server);
|
|
102
|
+
const protocolDiagnosis = await this.configManager.detectConfigProtocol(server);
|
|
103
|
+
const healthScore = this.calculateHealthScore(configErrors.errors, protocolDiagnosis);
|
|
104
|
+
results.push({
|
|
105
|
+
name: serverName,
|
|
106
|
+
configValid: configErrors.valid,
|
|
107
|
+
configErrors: configErrors.errors,
|
|
108
|
+
protocolMatch: protocolDiagnosis.detected === server.transport,
|
|
109
|
+
confidence: protocolDiagnosis.confidence,
|
|
110
|
+
healthScore,
|
|
111
|
+
needsAttention: healthScore < 70
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
results.push({
|
|
116
|
+
name: serverName,
|
|
117
|
+
configValid: false,
|
|
118
|
+
configErrors: [error.message],
|
|
119
|
+
protocolMatch: false,
|
|
120
|
+
confidence: 0,
|
|
121
|
+
healthScore: 0,
|
|
122
|
+
needsAttention: true,
|
|
123
|
+
error: error.message
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (CLIUtils.isJsonMode()) {
|
|
128
|
+
CLIUtils.jsonOutput(results);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
console.log(`\n${CLIUtils.colorize('🏥 批量诊断报告:', 'cyan')}\n`);
|
|
132
|
+
const headers = ['服务器', '配置', '协议匹配', '置信度', '健康分', '状态'];
|
|
133
|
+
const rows = results.map(result => [
|
|
134
|
+
result.name,
|
|
135
|
+
result.configValid ? CLIUtils.colorize('✓', 'green') : CLIUtils.colorize('✗', 'red'),
|
|
136
|
+
result.protocolMatch ? CLIUtils.colorize('✓', 'green') : CLIUtils.colorize('✗', 'yellow'),
|
|
137
|
+
`${result.confidence}%`,
|
|
138
|
+
result.healthScore.toString(),
|
|
139
|
+
result.needsAttention ? CLIUtils.colorize('需关注', 'yellow') : CLIUtils.colorize('健康', 'green')
|
|
140
|
+
]);
|
|
141
|
+
CLIUtils.printTable(headers, rows);
|
|
142
|
+
// 统计信息
|
|
143
|
+
const needsAttention = results.filter(r => r.needsAttention).length;
|
|
144
|
+
const configIssues = results.filter(r => !r.configValid).length;
|
|
145
|
+
const protocolIssues = results.filter(r => !r.protocolMatch && r.confidence > 70).length;
|
|
146
|
+
console.log(`\n${CLIUtils.colorize('📊 诊断统计:', 'cyan')}`);
|
|
147
|
+
console.log(` 总服务器数: ${servers.length}`);
|
|
148
|
+
console.log(` 需要关注: ${needsAttention}`);
|
|
149
|
+
console.log(` 配置问题: ${configIssues}`);
|
|
150
|
+
console.log(` 协议问题: ${protocolIssues}`);
|
|
151
|
+
if (needsAttention > 0) {
|
|
152
|
+
console.log(`\n${CLIUtils.colorize('⚠️ 需要关注的服务器:', 'yellow')}`);
|
|
153
|
+
results.filter(r => r.needsAttention).forEach(result => {
|
|
154
|
+
console.log(` • ${result.name}: 健康分 ${result.healthScore}`);
|
|
155
|
+
if (result.configErrors.length > 0) {
|
|
156
|
+
result.configErrors.forEach((error) => {
|
|
157
|
+
console.log(` - 配置: ${error}`);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async healthCheck(options) {
|
|
164
|
+
CLIUtils.info('🏥 执行系统健康检查...');
|
|
165
|
+
const servers = this.configManager.getServers();
|
|
166
|
+
const config = this.configManager.getConfig();
|
|
167
|
+
// 基础检查
|
|
168
|
+
const serverEntries = Object.entries(servers);
|
|
169
|
+
const checks = {
|
|
170
|
+
configFile: true,
|
|
171
|
+
serversConfigured: serverEntries.length > 0,
|
|
172
|
+
enabledServers: serverEntries.filter(([name, s]) => s.enabled !== false).length,
|
|
173
|
+
webInterface: config.web?.enabled || false,
|
|
174
|
+
loggingConfigured: config.logging?.level !== undefined
|
|
175
|
+
};
|
|
176
|
+
if (CLIUtils.isJsonMode()) {
|
|
177
|
+
CLIUtils.jsonOutput({
|
|
178
|
+
systemHealth: checks,
|
|
179
|
+
serverCount: servers.length,
|
|
180
|
+
enabledCount: checks.enabledServers,
|
|
181
|
+
overallHealth: this.calculateSystemHealth(checks)
|
|
182
|
+
});
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
console.log(`\n${CLIUtils.colorize('💗 系统健康检查:', 'cyan')}\n`);
|
|
186
|
+
console.log(`${CLIUtils.colorize('📋 基础检查:', 'yellow')}`);
|
|
187
|
+
console.log(` 配置文件: ${checks.configFile ? CLIUtils.colorize('✓', 'green') : CLIUtils.colorize('✗', 'red')}`);
|
|
188
|
+
console.log(` 服务器配置: ${checks.serversConfigured ? CLIUtils.colorize('✓', 'green') : CLIUtils.colorize('✗', 'red')} (${servers.length} 个)`);
|
|
189
|
+
console.log(` 启用的服务器: ${checks.enabledServers > 0 ? CLIUtils.colorize('✓', 'green') : CLIUtils.colorize('✗', 'yellow')} (${checks.enabledServers} 个)`);
|
|
190
|
+
console.log(` Web界面: ${checks.webInterface ? CLIUtils.colorize('✓', 'green') : CLIUtils.colorize('✗', 'yellow')}`);
|
|
191
|
+
console.log(` 日志配置: ${checks.loggingConfigured ? CLIUtils.colorize('✓', 'green') : CLIUtils.colorize('✗', 'yellow')}`);
|
|
192
|
+
const systemHealth = this.calculateSystemHealth(checks);
|
|
193
|
+
console.log(`\n${CLIUtils.colorize('💗 系统健康度:', 'cyan')} ${this.formatHealthScore(systemHealth)}`);
|
|
194
|
+
if (systemHealth < 80) {
|
|
195
|
+
console.log(`\n${CLIUtils.colorize('💡 改进建议:', 'cyan')}`);
|
|
196
|
+
if (!checks.serversConfigured) {
|
|
197
|
+
console.log(' • 添加至少一个MCP服务器配置');
|
|
198
|
+
}
|
|
199
|
+
if (checks.enabledServers === 0) {
|
|
200
|
+
console.log(' • 启用至少一个服务器');
|
|
201
|
+
}
|
|
202
|
+
if (!checks.webInterface) {
|
|
203
|
+
console.log(' • 考虑启用Web管理界面');
|
|
204
|
+
}
|
|
205
|
+
if (!checks.loggingConfigured) {
|
|
206
|
+
console.log(' • 配置日志级别以便调试');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async attemptFix(serverName, server, configErrors, protocolDiagnosis) {
|
|
211
|
+
CLIUtils.info(`🔧 尝试自动修复 ${serverName}...`);
|
|
212
|
+
let fixes = 0;
|
|
213
|
+
// 修复协议问题
|
|
214
|
+
if (protocolDiagnosis.detected !== server.transport && protocolDiagnosis.confidence > 70) {
|
|
215
|
+
try {
|
|
216
|
+
await this.configManager.updateServer(serverName, { transport: protocolDiagnosis.detected });
|
|
217
|
+
CLIUtils.success(`✅ 协议已更新为 ${protocolDiagnosis.detected}`);
|
|
218
|
+
fixes++;
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
CLIUtils.warning(`协议修复失败: ${error.message}`);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// 修复配置问题 (简单的默认值修复)
|
|
225
|
+
const updates = {};
|
|
226
|
+
configErrors.forEach(error => {
|
|
227
|
+
if (error.includes('timeout')) {
|
|
228
|
+
updates.timeout = server.transport === 'stdio' ? 60000 : 30000;
|
|
229
|
+
fixes++;
|
|
230
|
+
}
|
|
231
|
+
if (error.includes('retries')) {
|
|
232
|
+
updates.retries = 3;
|
|
233
|
+
fixes++;
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
if (Object.keys(updates).length > 0) {
|
|
237
|
+
try {
|
|
238
|
+
await this.configManager.updateServer(serverName, updates);
|
|
239
|
+
CLIUtils.success(`✅ 配置参数已修复`);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
CLIUtils.warning(`配置修复失败: ${error.message}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (fixes > 0) {
|
|
246
|
+
CLIUtils.success(`🎉 成功修复 ${fixes} 个问题`);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
CLIUtils.warning('没有可自动修复的问题,请手动检查配置');
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
calculateHealthScore(configErrors, protocolDiagnosis) {
|
|
253
|
+
let score = 100;
|
|
254
|
+
// 配置错误扣分
|
|
255
|
+
score -= configErrors.length * 20;
|
|
256
|
+
// 协议不匹配扣分
|
|
257
|
+
if (protocolDiagnosis.detected !== 'unknown' && protocolDiagnosis.confidence > 70) {
|
|
258
|
+
score -= (100 - protocolDiagnosis.confidence) / 2;
|
|
259
|
+
}
|
|
260
|
+
return Math.max(0, Math.round(score));
|
|
261
|
+
}
|
|
262
|
+
calculateSystemHealth(checks) {
|
|
263
|
+
let score = 0;
|
|
264
|
+
let maxScore = 0;
|
|
265
|
+
// 基础检查权重
|
|
266
|
+
const weights = {
|
|
267
|
+
configFile: 20,
|
|
268
|
+
serversConfigured: 30,
|
|
269
|
+
enabledServers: 25,
|
|
270
|
+
webInterface: 15,
|
|
271
|
+
loggingConfigured: 10
|
|
272
|
+
};
|
|
273
|
+
Object.entries(weights).forEach(([key, weight]) => {
|
|
274
|
+
maxScore += weight;
|
|
275
|
+
if (checks[key] === true || (key === 'enabledServers' && checks[key] > 0)) {
|
|
276
|
+
score += weight;
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
return Math.round((score / maxScore) * 100);
|
|
280
|
+
}
|
|
281
|
+
formatConfidence(confidence) {
|
|
282
|
+
if (confidence >= 90)
|
|
283
|
+
return CLIUtils.colorize(`${confidence}%`, 'green');
|
|
284
|
+
if (confidence >= 70)
|
|
285
|
+
return CLIUtils.colorize(`${confidence}%`, 'yellow');
|
|
286
|
+
return CLIUtils.colorize(`${confidence}%`, 'red');
|
|
287
|
+
}
|
|
288
|
+
formatHealthScore(score) {
|
|
289
|
+
if (score >= 90)
|
|
290
|
+
return CLIUtils.colorize(`${score}% (优秀)`, 'green');
|
|
291
|
+
if (score >= 70)
|
|
292
|
+
return CLIUtils.colorize(`${score}% (良好)`, 'green');
|
|
293
|
+
if (score >= 50)
|
|
294
|
+
return CLIUtils.colorize(`${score}% (一般)`, 'yellow');
|
|
295
|
+
return CLIUtils.colorize(`${score}% (需改进)`, 'red');
|
|
296
|
+
}
|
|
297
|
+
showHelp() {
|
|
298
|
+
console.log(`
|
|
299
|
+
${CLIUtils.colorize('agentdog diagnose', 'cyan')} - 诊断和修复
|
|
300
|
+
|
|
301
|
+
${CLIUtils.colorize('使用方法:', 'yellow')}
|
|
302
|
+
agentdog diagnose <server-name> [options]
|
|
303
|
+
agentdog diagnose --all [options]
|
|
304
|
+
agentdog diagnose --health-check
|
|
305
|
+
|
|
306
|
+
${CLIUtils.colorize('选项:', 'yellow')}
|
|
307
|
+
--all 诊断所有服务器
|
|
308
|
+
--fix 自动修复发现的问题
|
|
309
|
+
--health-check 执行系统健康检查
|
|
310
|
+
|
|
311
|
+
${CLIUtils.colorize('诊断内容:', 'yellow')}
|
|
312
|
+
• 配置语法验证
|
|
313
|
+
• 协议兼容性检查
|
|
314
|
+
• 连通性测试
|
|
315
|
+
• 性能分析
|
|
316
|
+
• 健康评分
|
|
317
|
+
|
|
318
|
+
${CLIUtils.colorize('示例:', 'yellow')}
|
|
319
|
+
agentdog diagnose my-server # 诊断单个服务器
|
|
320
|
+
agentdog diagnose my-server --fix # 诊断并自动修复
|
|
321
|
+
agentdog diagnose --all # 诊断所有服务器
|
|
322
|
+
agentdog diagnose --health-check # 系统健康检查
|
|
323
|
+
`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
//# sourceMappingURL=diagnose-commands.js.map
|