@darkiceinteractive/mcp-conductor 1.1.0 → 3.0.0-beta.1
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/README.md +35 -5
- package/dist/bin/cli.d.ts +20 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +260 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bridge/http-server.d.ts +65 -1
- package/dist/bridge/http-server.d.ts.map +1 -1
- package/dist/bridge/http-server.js +192 -7
- package/dist/bridge/http-server.js.map +1 -1
- package/dist/bridge/index.d.ts +1 -0
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +1 -0
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/pool.d.ts +95 -0
- package/dist/bridge/pool.d.ts.map +1 -0
- package/dist/bridge/pool.js +384 -0
- package/dist/bridge/pool.js.map +1 -0
- package/dist/bridge/session-registry.d.ts +64 -0
- package/dist/bridge/session-registry.d.ts.map +1 -0
- package/dist/bridge/session-registry.js +124 -0
- package/dist/bridge/session-registry.js.map +1 -0
- package/dist/cache/cache.d.ts +43 -0
- package/dist/cache/cache.d.ts.map +1 -0
- package/dist/cache/cache.js +167 -0
- package/dist/cache/cache.js.map +1 -0
- package/dist/cache/delta.d.ts +32 -0
- package/dist/cache/delta.d.ts.map +1 -0
- package/dist/cache/delta.js +131 -0
- package/dist/cache/delta.js.map +1 -0
- package/dist/cache/disk.d.ts +65 -0
- package/dist/cache/disk.d.ts.map +1 -0
- package/dist/cache/disk.js +238 -0
- package/dist/cache/disk.js.map +1 -0
- package/dist/cache/index.d.ts +53 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +12 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/key.d.ts +44 -0
- package/dist/cache/key.d.ts.map +1 -0
- package/dist/cache/key.js +83 -0
- package/dist/cache/key.js.map +1 -0
- package/dist/cache/lru.d.ts +57 -0
- package/dist/cache/lru.d.ts.map +1 -0
- package/dist/cache/lru.js +112 -0
- package/dist/cache/lru.js.map +1 -0
- package/dist/cache/policy.d.ts +34 -0
- package/dist/cache/policy.d.ts.map +1 -0
- package/dist/cache/policy.js +95 -0
- package/dist/cache/policy.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +33 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +135 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export-servers.d.ts +22 -0
- package/dist/cli/commands/export-servers.d.ts.map +1 -0
- package/dist/cli/commands/export-servers.js +45 -0
- package/dist/cli/commands/export-servers.js.map +1 -0
- package/dist/cli/commands/import-servers.d.ts +57 -0
- package/dist/cli/commands/import-servers.d.ts.map +1 -0
- package/dist/cli/commands/import-servers.js +137 -0
- package/dist/cli/commands/import-servers.js.map +1 -0
- package/dist/cli/commands/routing.d.ts +34 -0
- package/dist/cli/commands/routing.d.ts.map +1 -0
- package/dist/cli/commands/routing.js +60 -0
- package/dist/cli/commands/routing.js.map +1 -0
- package/dist/cli/commands/test-server.d.ts +34 -0
- package/dist/cli/commands/test-server.d.ts.map +1 -0
- package/dist/cli/commands/test-server.js +86 -0
- package/dist/cli/commands/test-server.js.map +1 -0
- package/dist/cli/daemon.d.ts +60 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +244 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/replay.d.ts +16 -0
- package/dist/cli/replay.d.ts.map +1 -0
- package/dist/cli/replay.js +89 -0
- package/dist/cli/replay.js.map +1 -0
- package/dist/cli/wizard/setup.d.ts +12 -0
- package/dist/cli/wizard/setup.d.ts.map +1 -0
- package/dist/cli/wizard/setup.js +71 -0
- package/dist/cli/wizard/setup.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +14 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +34 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/daemon/client.d.ts +97 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +279 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/discovery.d.ts +50 -0
- package/dist/daemon/discovery.d.ts.map +1 -0
- package/dist/daemon/discovery.js +104 -0
- package/dist/daemon/discovery.js.map +1 -0
- package/dist/daemon/index.d.ts +16 -0
- package/dist/daemon/index.d.ts.map +1 -0
- package/dist/daemon/index.js +11 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/sandbox-api.d.ts +45 -0
- package/dist/daemon/sandbox-api.d.ts.map +1 -0
- package/dist/daemon/sandbox-api.js +74 -0
- package/dist/daemon/sandbox-api.js.map +1 -0
- package/dist/daemon/server.d.ts +65 -0
- package/dist/daemon/server.d.ts.map +1 -0
- package/dist/daemon/server.js +351 -0
- package/dist/daemon/server.js.map +1 -0
- package/dist/daemon/shared-kv.d.ts +81 -0
- package/dist/daemon/shared-kv.d.ts.map +1 -0
- package/dist/daemon/shared-kv.js +215 -0
- package/dist/daemon/shared-kv.js.map +1 -0
- package/dist/daemon/shared-lock.d.ts +71 -0
- package/dist/daemon/shared-lock.d.ts.map +1 -0
- package/dist/daemon/shared-lock.js +119 -0
- package/dist/daemon/shared-lock.js.map +1 -0
- package/dist/hub/mcp-hub.d.ts +23 -0
- package/dist/hub/mcp-hub.d.ts.map +1 -1
- package/dist/hub/mcp-hub.js +34 -1
- package/dist/hub/mcp-hub.js.map +1 -1
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -1
- package/dist/observability/anomaly.d.ts +67 -0
- package/dist/observability/anomaly.d.ts.map +1 -0
- package/dist/observability/anomaly.js +141 -0
- package/dist/observability/anomaly.js.map +1 -0
- package/dist/observability/cost-predictor.d.ts +49 -0
- package/dist/observability/cost-predictor.d.ts.map +1 -0
- package/dist/observability/cost-predictor.js +145 -0
- package/dist/observability/cost-predictor.js.map +1 -0
- package/dist/observability/hot-path.d.ts +49 -0
- package/dist/observability/hot-path.d.ts.map +1 -0
- package/dist/observability/hot-path.js +125 -0
- package/dist/observability/hot-path.js.map +1 -0
- package/dist/observability/index.d.ts +10 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +10 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/replay.d.ts +104 -0
- package/dist/observability/replay.d.ts.map +1 -0
- package/dist/observability/replay.js +239 -0
- package/dist/observability/replay.js.map +1 -0
- package/dist/registry/built-in-recommendations.d.ts +54 -0
- package/dist/registry/built-in-recommendations.d.ts.map +1 -0
- package/dist/registry/built-in-recommendations.js +65 -0
- package/dist/registry/built-in-recommendations.js.map +1 -0
- package/dist/registry/events.d.ts +26 -0
- package/dist/registry/events.d.ts.map +1 -0
- package/dist/registry/events.js +22 -0
- package/dist/registry/events.js.map +1 -0
- package/dist/registry/index.d.ts +159 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/registry.d.ts +87 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +294 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/snapshot.d.ts +42 -0
- package/dist/registry/snapshot.d.ts.map +1 -0
- package/dist/registry/snapshot.js +71 -0
- package/dist/registry/snapshot.js.map +1 -0
- package/dist/registry/typegen.d.ts +48 -0
- package/dist/registry/typegen.d.ts.map +1 -0
- package/dist/registry/typegen.js +200 -0
- package/dist/registry/typegen.js.map +1 -0
- package/dist/registry/validator.d.ts +23 -0
- package/dist/registry/validator.d.ts.map +1 -0
- package/dist/registry/validator.js +50 -0
- package/dist/registry/validator.js.map +1 -0
- package/dist/reliability/breaker.d.ts +57 -0
- package/dist/reliability/breaker.d.ts.map +1 -0
- package/dist/reliability/breaker.js +130 -0
- package/dist/reliability/breaker.js.map +1 -0
- package/dist/reliability/errors.d.ts +78 -0
- package/dist/reliability/errors.d.ts.map +1 -0
- package/dist/reliability/errors.js +160 -0
- package/dist/reliability/errors.js.map +1 -0
- package/dist/reliability/gateway.d.ts +88 -0
- package/dist/reliability/gateway.d.ts.map +1 -0
- package/dist/reliability/gateway.js +180 -0
- package/dist/reliability/gateway.js.map +1 -0
- package/dist/reliability/index.d.ts +20 -0
- package/dist/reliability/index.d.ts.map +1 -0
- package/dist/reliability/index.js +16 -0
- package/dist/reliability/index.js.map +1 -0
- package/dist/reliability/profile.d.ts +49 -0
- package/dist/reliability/profile.d.ts.map +1 -0
- package/dist/reliability/profile.js +58 -0
- package/dist/reliability/profile.js.map +1 -0
- package/dist/reliability/retry.d.ts +39 -0
- package/dist/reliability/retry.d.ts.map +1 -0
- package/dist/reliability/retry.js +51 -0
- package/dist/reliability/retry.js.map +1 -0
- package/dist/reliability/timeout.d.ts +34 -0
- package/dist/reliability/timeout.d.ts.map +1 -0
- package/dist/reliability/timeout.js +53 -0
- package/dist/reliability/timeout.js.map +1 -0
- package/dist/runtime/executor.d.ts +12 -0
- package/dist/runtime/executor.d.ts.map +1 -1
- package/dist/runtime/executor.js +148 -16
- package/dist/runtime/executor.js.map +1 -1
- package/dist/runtime/findtool/embed.d.ts +28 -0
- package/dist/runtime/findtool/embed.d.ts.map +1 -0
- package/dist/runtime/findtool/embed.js +85 -0
- package/dist/runtime/findtool/embed.js.map +1 -0
- package/dist/runtime/findtool/index.d.ts +52 -0
- package/dist/runtime/findtool/index.d.ts.map +1 -0
- package/dist/runtime/findtool/index.js +78 -0
- package/dist/runtime/findtool/index.js.map +1 -0
- package/dist/runtime/findtool/vector-index.d.ts +53 -0
- package/dist/runtime/findtool/vector-index.d.ts.map +1 -0
- package/dist/runtime/findtool/vector-index.js +71 -0
- package/dist/runtime/findtool/vector-index.js.map +1 -0
- package/dist/runtime/helpers/budget.d.ts +27 -0
- package/dist/runtime/helpers/budget.d.ts.map +1 -0
- package/dist/runtime/helpers/budget.js +103 -0
- package/dist/runtime/helpers/budget.js.map +1 -0
- package/dist/runtime/helpers/compact.d.ts +32 -0
- package/dist/runtime/helpers/compact.d.ts.map +1 -0
- package/dist/runtime/helpers/compact.js +93 -0
- package/dist/runtime/helpers/compact.js.map +1 -0
- package/dist/runtime/helpers/delta.d.ts +45 -0
- package/dist/runtime/helpers/delta.d.ts.map +1 -0
- package/dist/runtime/helpers/delta.js +116 -0
- package/dist/runtime/helpers/delta.js.map +1 -0
- package/dist/runtime/helpers/index.d.ts +16 -0
- package/dist/runtime/helpers/index.d.ts.map +1 -0
- package/dist/runtime/helpers/index.js +13 -0
- package/dist/runtime/helpers/index.js.map +1 -0
- package/dist/runtime/helpers/summarize.d.ts +24 -0
- package/dist/runtime/helpers/summarize.d.ts.map +1 -0
- package/dist/runtime/helpers/summarize.js +124 -0
- package/dist/runtime/helpers/summarize.js.map +1 -0
- package/dist/runtime/helpers/worker-preload.d.ts +25 -0
- package/dist/runtime/helpers/worker-preload.d.ts.map +1 -0
- package/dist/runtime/helpers/worker-preload.js +223 -0
- package/dist/runtime/helpers/worker-preload.js.map +1 -0
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/pool/index.d.ts +11 -0
- package/dist/runtime/pool/index.d.ts.map +1 -0
- package/dist/runtime/pool/index.js +8 -0
- package/dist/runtime/pool/index.js.map +1 -0
- package/dist/runtime/pool/recycle.d.ts +44 -0
- package/dist/runtime/pool/recycle.d.ts.map +1 -0
- package/dist/runtime/pool/recycle.js +50 -0
- package/dist/runtime/pool/recycle.js.map +1 -0
- package/dist/runtime/pool/worker-pool.d.ts +77 -0
- package/dist/runtime/pool/worker-pool.d.ts.map +1 -0
- package/dist/runtime/pool/worker-pool.js +216 -0
- package/dist/runtime/pool/worker-pool.js.map +1 -0
- package/dist/runtime/pool/worker.d.ts +80 -0
- package/dist/runtime/pool/worker.d.ts.map +1 -0
- package/dist/runtime/pool/worker.js +324 -0
- package/dist/runtime/pool/worker.js.map +1 -0
- package/dist/server/mcp-server.d.ts +6 -0
- package/dist/server/mcp-server.d.ts.map +1 -1
- package/dist/server/mcp-server.js +610 -45
- package/dist/server/mcp-server.js.map +1 -1
- package/dist/server/passthrough-registrar.d.ts +73 -0
- package/dist/server/passthrough-registrar.d.ts.map +1 -0
- package/dist/server/passthrough-registrar.js +110 -0
- package/dist/server/passthrough-registrar.js.map +1 -0
- package/dist/skills/skills-engine.d.ts +9 -1
- package/dist/skills/skills-engine.d.ts.map +1 -1
- package/dist/skills/skills-engine.js +20 -3
- package/dist/skills/skills-engine.js.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +5 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/orphan-watch.d.ts +34 -0
- package/dist/utils/orphan-watch.d.ts.map +1 -0
- package/dist/utils/orphan-watch.js +54 -0
- package/dist/utils/orphan-watch.js.map +1 -0
- package/dist/utils/redact.d.ts +15 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +48 -0
- package/dist/utils/redact.js.map +1 -0
- package/dist/utils/tokenize.d.ts +55 -0
- package/dist/utils/tokenize.d.ts.map +1 -0
- package/dist/utils/tokenize.js +205 -0
- package/dist/utils/tokenize.js.map +1 -0
- package/dist/version.d.ts +3 -3
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +3 -3
- package/dist/version.js.map +1 -1
- package/package.json +13 -3
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doctor command: actionable health report across all configured servers.
|
|
3
|
+
* @module cli/commands/doctor
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { getDefaultConductorConfigPath, loadConductorConfig } from '../../config/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Check if a command is available on PATH or as an absolute path.
|
|
9
|
+
*/
|
|
10
|
+
function isCommandAvailable(command) {
|
|
11
|
+
if (existsSync(command))
|
|
12
|
+
return true;
|
|
13
|
+
// For npx/node/python/etc — check via which-like lookup using PATH
|
|
14
|
+
// We do a simple check: if it contains a path separator it must exist as file.
|
|
15
|
+
if (command.includes('/') || command.includes('\\')) {
|
|
16
|
+
return existsSync(command);
|
|
17
|
+
}
|
|
18
|
+
// Otherwise assume available (we don't shell out here — tests would fail)
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Run a health check on all configured MCP servers.
|
|
23
|
+
* Non-connecting — just inspects config structure.
|
|
24
|
+
*/
|
|
25
|
+
export function runDoctor() {
|
|
26
|
+
const conductorConfigPath = getDefaultConductorConfigPath();
|
|
27
|
+
const conductorConfigFound = existsSync(conductorConfigPath);
|
|
28
|
+
const globalIssues = [];
|
|
29
|
+
if (!conductorConfigFound) {
|
|
30
|
+
return {
|
|
31
|
+
conductorConfigFound: false,
|
|
32
|
+
conductorConfigPath,
|
|
33
|
+
serverCount: 0,
|
|
34
|
+
healthyCount: 0,
|
|
35
|
+
warnCount: 0,
|
|
36
|
+
errorCount: 0,
|
|
37
|
+
servers: [],
|
|
38
|
+
globalIssues: [
|
|
39
|
+
`Conductor config not found at ${conductorConfigPath}`,
|
|
40
|
+
'Run `mcp-conductor-cli setup` or `mcp-conductor-cli import` to create it.',
|
|
41
|
+
],
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const config = loadConductorConfig();
|
|
45
|
+
if (!config) {
|
|
46
|
+
return {
|
|
47
|
+
conductorConfigFound: true,
|
|
48
|
+
conductorConfigPath,
|
|
49
|
+
serverCount: 0,
|
|
50
|
+
healthyCount: 0,
|
|
51
|
+
warnCount: 0,
|
|
52
|
+
errorCount: 0,
|
|
53
|
+
servers: [],
|
|
54
|
+
globalIssues: ['Conductor config found but could not be parsed — check JSON syntax.'],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const servers = [];
|
|
58
|
+
for (const [name, def] of Object.entries(config.servers)) {
|
|
59
|
+
const issues = [];
|
|
60
|
+
const suggestions = [];
|
|
61
|
+
if (!def.command) {
|
|
62
|
+
issues.push('Missing `command` field');
|
|
63
|
+
suggestions.push('Add a `command` field to this server entry in ~/.mcp-conductor.json');
|
|
64
|
+
}
|
|
65
|
+
const cmdAvail = def.command ? isCommandAvailable(def.command) : false;
|
|
66
|
+
if (def.command && !cmdAvail) {
|
|
67
|
+
issues.push(`Command not found on PATH: ${def.command}`);
|
|
68
|
+
suggestions.push(`Ensure \`${def.command}\` is installed and available on PATH`);
|
|
69
|
+
}
|
|
70
|
+
// Check for env vars with placeholder values
|
|
71
|
+
for (const [k, v] of Object.entries(def.env ?? {})) {
|
|
72
|
+
if (v === 'YOUR_TOKEN_HERE' || v === '<YOUR_API_KEY>' || v === '') {
|
|
73
|
+
issues.push(`Env var ${k} appears unset or placeholder`);
|
|
74
|
+
suggestions.push(`Set a real value for ${k} in the server env config`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const status = issues.length === 0 ? 'ok' :
|
|
78
|
+
issues.some((i) => i.includes('Missing') || i.includes('not found')) ? 'error' : 'warn';
|
|
79
|
+
servers.push({
|
|
80
|
+
name,
|
|
81
|
+
command: def.command ?? '',
|
|
82
|
+
args: def.args ?? [],
|
|
83
|
+
commandFound: cmdAvail,
|
|
84
|
+
status,
|
|
85
|
+
issues,
|
|
86
|
+
suggestions,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const healthyCount = servers.filter((s) => s.status === 'ok').length;
|
|
90
|
+
const warnCount = servers.filter((s) => s.status === 'warn').length;
|
|
91
|
+
const errorCount = servers.filter((s) => s.status === 'error').length;
|
|
92
|
+
return {
|
|
93
|
+
conductorConfigFound: true,
|
|
94
|
+
conductorConfigPath,
|
|
95
|
+
serverCount: servers.length,
|
|
96
|
+
healthyCount,
|
|
97
|
+
warnCount,
|
|
98
|
+
errorCount,
|
|
99
|
+
servers,
|
|
100
|
+
globalIssues,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Format doctor results as human-readable text.
|
|
105
|
+
*/
|
|
106
|
+
export function formatDoctorResults(result) {
|
|
107
|
+
const lines = [];
|
|
108
|
+
if (!result.conductorConfigFound) {
|
|
109
|
+
lines.push('CONDUCTOR CONFIG: NOT FOUND');
|
|
110
|
+
for (const issue of result.globalIssues) {
|
|
111
|
+
lines.push(` ! ${issue}`);
|
|
112
|
+
}
|
|
113
|
+
return lines.join('\n');
|
|
114
|
+
}
|
|
115
|
+
lines.push(`CONDUCTOR CONFIG: ${result.conductorConfigPath}`);
|
|
116
|
+
lines.push(`SERVERS: ${result.serverCount} total — ${result.healthyCount} ok, ${result.warnCount} warn, ${result.errorCount} error\n`);
|
|
117
|
+
for (const server of result.servers) {
|
|
118
|
+
const icon = server.status === 'ok' ? 'OK' : server.status === 'warn' ? 'WARN' : 'ERROR';
|
|
119
|
+
lines.push(`[${icon}] ${server.name} (${server.command}${server.args.length ? ' ' + server.args.join(' ') : ''})`);
|
|
120
|
+
for (const issue of server.issues) {
|
|
121
|
+
lines.push(` Issue: ${issue}`);
|
|
122
|
+
}
|
|
123
|
+
for (const suggestion of server.suggestions) {
|
|
124
|
+
lines.push(` Fix: ${suggestion}`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (result.globalIssues.length > 0) {
|
|
128
|
+
lines.push('\nGlobal issues:');
|
|
129
|
+
for (const issue of result.globalIssues) {
|
|
130
|
+
lines.push(` ! ${issue}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return lines.join('\n');
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* export-servers command: generate mcpServers JSON pointing at mcp-conductor stdio.
|
|
3
|
+
* @module cli/commands/export-servers
|
|
4
|
+
*/
|
|
5
|
+
export interface ExportOptions {
|
|
6
|
+
/** Output format: 'claude-desktop' | 'claude-code' | 'raw' */
|
|
7
|
+
format?: 'claude-desktop' | 'claude-code' | 'raw';
|
|
8
|
+
/** Path to conductor binary (defaults to npx @darkiceinteractive/mcp-conductor) */
|
|
9
|
+
conductorPath?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ExportResult {
|
|
12
|
+
json: string;
|
|
13
|
+
format: string;
|
|
14
|
+
serverCount: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generate a mcpServers block that points Claude back at mcp-conductor stdio.
|
|
18
|
+
* This is the rollback path: if someone wants to undo the import, they paste
|
|
19
|
+
* this JSON back into their Claude config.
|
|
20
|
+
*/
|
|
21
|
+
export declare function exportToClaude(options?: ExportOptions): ExportResult;
|
|
22
|
+
//# sourceMappingURL=export-servers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-servers.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/export-servers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,aAAa;IAC5B,8DAA8D;IAC9D,MAAM,CAAC,EAAE,gBAAgB,GAAG,aAAa,GAAG,KAAK,CAAC;IAClD,mFAAmF;IACnF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,CAkCxE"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* export-servers command: generate mcpServers JSON pointing at mcp-conductor stdio.
|
|
3
|
+
* @module cli/commands/export-servers
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { loadConductorConfig, getDefaultConductorConfigPath } from '../../config/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate a mcpServers block that points Claude back at mcp-conductor stdio.
|
|
9
|
+
* This is the rollback path: if someone wants to undo the import, they paste
|
|
10
|
+
* this JSON back into their Claude config.
|
|
11
|
+
*/
|
|
12
|
+
export function exportToClaude(options = {}) {
|
|
13
|
+
const conductorPath = getDefaultConductorConfigPath();
|
|
14
|
+
const hasConfig = existsSync(conductorPath);
|
|
15
|
+
const config = hasConfig ? loadConductorConfig() : null;
|
|
16
|
+
const serverCount = config ? Object.keys(config.servers).length : 0;
|
|
17
|
+
const format = options.format ?? 'claude-desktop';
|
|
18
|
+
const command = options.conductorPath ?? 'npx';
|
|
19
|
+
const args = options.conductorPath
|
|
20
|
+
? []
|
|
21
|
+
: ['-y', '@darkiceinteractive/mcp-conductor'];
|
|
22
|
+
const mcpServersBlock = {
|
|
23
|
+
mcpServers: {
|
|
24
|
+
'mcp-conductor': {
|
|
25
|
+
command,
|
|
26
|
+
args,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
let json;
|
|
31
|
+
if (format === 'claude-code') {
|
|
32
|
+
// Claude Code uses a flat mcpServers object in settings.json
|
|
33
|
+
json = JSON.stringify({ mcpServers: mcpServersBlock.mcpServers }, null, 2);
|
|
34
|
+
}
|
|
35
|
+
else if (format === 'raw') {
|
|
36
|
+
// Just the inner mcpServers value
|
|
37
|
+
json = JSON.stringify(mcpServersBlock.mcpServers, null, 2);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// claude-desktop format: full wrapper object
|
|
41
|
+
json = JSON.stringify(mcpServersBlock, null, 2);
|
|
42
|
+
}
|
|
43
|
+
return { json, format, serverCount };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=export-servers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export-servers.js","sourceRoot":"","sources":["../../../src/cli/commands/export-servers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAe3F;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,UAAyB,EAAE;IACxD,MAAM,aAAa,GAAG,6BAA6B,EAAE,CAAC;IACtD,MAAM,SAAS,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa;QAChC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,CAAC,IAAI,EAAE,mCAAmC,CAAC,CAAC;IAEhD,MAAM,eAAe,GAAG;QACtB,UAAU,EAAE;YACV,eAAe,EAAE;gBACf,OAAO;gBACP,IAAI;aACL;SACF;KACF,CAAC;IAEF,IAAI,IAAY,CAAC;IACjB,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;QAC7B,6DAA6D;QAC7D,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;SAAM,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAC5B,kCAAkC;QAClC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,6CAA6C;QAC7C,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import-servers command: read Claude config files, show diff, copy to ~/.mcp-conductor.json
|
|
3
|
+
* @module cli/commands/import-servers
|
|
4
|
+
*/
|
|
5
|
+
export interface ImportOptions {
|
|
6
|
+
/** Paths to search for Claude config (defaults to standard paths) */
|
|
7
|
+
configPaths?: string[];
|
|
8
|
+
/** Skip interactive confirmation — import immediately */
|
|
9
|
+
yes?: boolean;
|
|
10
|
+
/** Remove imported servers from source configs after import */
|
|
11
|
+
removeOriginals?: boolean;
|
|
12
|
+
/** Dry-run: show diff but don't write anything */
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ServerEntry {
|
|
16
|
+
name: string;
|
|
17
|
+
command: string;
|
|
18
|
+
args?: string[];
|
|
19
|
+
env?: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
export interface ImportResult {
|
|
22
|
+
imported: ServerEntry[];
|
|
23
|
+
skipped: string[];
|
|
24
|
+
sourcePath: string;
|
|
25
|
+
conductorPath: string;
|
|
26
|
+
backupPaths: string[];
|
|
27
|
+
removedFromSource: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Find all Claude config files that contain mcpServers.
|
|
31
|
+
*/
|
|
32
|
+
export declare function findClaudeConfigsWithServers(configPaths?: string[]): Array<{
|
|
33
|
+
path: string;
|
|
34
|
+
servers: Record<string, {
|
|
35
|
+
command: string;
|
|
36
|
+
args?: string[];
|
|
37
|
+
env?: Record<string, string>;
|
|
38
|
+
}>;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Write a .bak file alongside the original.
|
|
42
|
+
*/
|
|
43
|
+
export declare function writeBackup(filePath: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Strip named servers from a Claude config file.
|
|
46
|
+
*/
|
|
47
|
+
export declare function stripServersFromConfig(filePath: string, serverNames: string[]): void;
|
|
48
|
+
/**
|
|
49
|
+
* Perform the import: merge servers from Claude configs into conductor config.
|
|
50
|
+
* Non-interactive (no prompts) — callers handle confirmation.
|
|
51
|
+
*/
|
|
52
|
+
export declare function importServers(options?: ImportOptions): ImportResult[];
|
|
53
|
+
/**
|
|
54
|
+
* Format import results as human-readable text (for CLI output).
|
|
55
|
+
*/
|
|
56
|
+
export declare function formatImportResults(results: ImportResult[], dryRun?: boolean): string;
|
|
57
|
+
//# sourceMappingURL=import-servers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-servers.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/import-servers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,WAAW,aAAa;IAC5B,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,yDAAyD;IACzD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmBzL;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAIpD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CASpF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,YAAY,EAAE,CA8CzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,MAAM,UAAQ,GAAG,MAAM,CAuCnF"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* import-servers command: read Claude config files, show diff, copy to ~/.mcp-conductor.json
|
|
3
|
+
* @module cli/commands/import-servers
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync, writeFileSync, copyFileSync } from 'node:fs';
|
|
6
|
+
import { safeJsonParse } from '../../utils/index.js';
|
|
7
|
+
import { getClaudeConfigPaths, getDefaultConductorConfigPath, loadConductorConfig, saveConductorConfig, } from '../../config/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Find all Claude config files that contain mcpServers.
|
|
10
|
+
*/
|
|
11
|
+
export function findClaudeConfigsWithServers(configPaths) {
|
|
12
|
+
const paths = configPaths ?? getClaudeConfigPaths();
|
|
13
|
+
const found = [];
|
|
14
|
+
for (const p of paths) {
|
|
15
|
+
if (!existsSync(p))
|
|
16
|
+
continue;
|
|
17
|
+
try {
|
|
18
|
+
const content = readFileSync(p, 'utf-8');
|
|
19
|
+
const cfg = safeJsonParse(content, {});
|
|
20
|
+
const servers = cfg.mcpServers ?? {};
|
|
21
|
+
if (Object.keys(servers).length > 0) {
|
|
22
|
+
found.push({ path: p, servers });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// skip unreadable
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return found;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Write a .bak file alongside the original.
|
|
33
|
+
*/
|
|
34
|
+
export function writeBackup(filePath) {
|
|
35
|
+
const backupPath = `${filePath}.bak`;
|
|
36
|
+
copyFileSync(filePath, backupPath);
|
|
37
|
+
return backupPath;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Strip named servers from a Claude config file.
|
|
41
|
+
*/
|
|
42
|
+
export function stripServersFromConfig(filePath, serverNames) {
|
|
43
|
+
if (!existsSync(filePath))
|
|
44
|
+
return;
|
|
45
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
46
|
+
const cfg = safeJsonParse(content, {});
|
|
47
|
+
if (!cfg.mcpServers)
|
|
48
|
+
return;
|
|
49
|
+
for (const name of serverNames) {
|
|
50
|
+
delete cfg.mcpServers[name];
|
|
51
|
+
}
|
|
52
|
+
writeFileSync(filePath, JSON.stringify(cfg, null, 2), 'utf-8');
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Perform the import: merge servers from Claude configs into conductor config.
|
|
56
|
+
* Non-interactive (no prompts) — callers handle confirmation.
|
|
57
|
+
*/
|
|
58
|
+
export function importServers(options = {}) {
|
|
59
|
+
const sources = findClaudeConfigsWithServers(options.configPaths);
|
|
60
|
+
const conductorPath = getDefaultConductorConfigPath();
|
|
61
|
+
const results = [];
|
|
62
|
+
for (const source of sources) {
|
|
63
|
+
let conductorConfig = loadConductorConfig() ?? { exclusive: false, servers: {} };
|
|
64
|
+
const imported = [];
|
|
65
|
+
const skipped = [];
|
|
66
|
+
const backupPaths = [];
|
|
67
|
+
for (const [name, def] of Object.entries(source.servers)) {
|
|
68
|
+
if (conductorConfig.servers[name]) {
|
|
69
|
+
skipped.push(name);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
conductorConfig.servers[name] = {
|
|
73
|
+
command: def.command,
|
|
74
|
+
args: def.args ?? [],
|
|
75
|
+
env: def.env ?? {},
|
|
76
|
+
};
|
|
77
|
+
imported.push({ name, command: def.command, args: def.args, env: def.env });
|
|
78
|
+
}
|
|
79
|
+
if (!options.dryRun && imported.length > 0) {
|
|
80
|
+
// Write .bak before touching source
|
|
81
|
+
backupPaths.push(writeBackup(source.path));
|
|
82
|
+
saveConductorConfig(conductorConfig, conductorPath);
|
|
83
|
+
if (options.removeOriginals) {
|
|
84
|
+
stripServersFromConfig(source.path, imported.map((s) => s.name));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
results.push({
|
|
88
|
+
imported,
|
|
89
|
+
skipped,
|
|
90
|
+
sourcePath: source.path,
|
|
91
|
+
conductorPath,
|
|
92
|
+
backupPaths,
|
|
93
|
+
removedFromSource: !options.dryRun && !!options.removeOriginals && imported.length > 0,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return results;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Format import results as human-readable text (for CLI output).
|
|
100
|
+
*/
|
|
101
|
+
export function formatImportResults(results, dryRun = false) {
|
|
102
|
+
if (results.length === 0) {
|
|
103
|
+
return 'No Claude config files with MCP servers found.';
|
|
104
|
+
}
|
|
105
|
+
const lines = [];
|
|
106
|
+
let totalImported = 0;
|
|
107
|
+
let totalSkipped = 0;
|
|
108
|
+
for (const r of results) {
|
|
109
|
+
lines.push(`\nSource: ${r.sourcePath}`);
|
|
110
|
+
if (r.imported.length > 0) {
|
|
111
|
+
lines.push(` ${dryRun ? 'Would import' : 'Imported'} (${r.imported.length}):`);
|
|
112
|
+
for (const s of r.imported) {
|
|
113
|
+
lines.push(` + ${s.name} [${s.command}${s.args?.length ? ' ' + s.args.join(' ') : ''}]`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (r.skipped.length > 0) {
|
|
117
|
+
lines.push(` Skipped (already in conductor) (${r.skipped.length}):`);
|
|
118
|
+
for (const s of r.skipped) {
|
|
119
|
+
lines.push(` ~ ${s}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!dryRun && r.backupPaths.length > 0) {
|
|
123
|
+
lines.push(` Backup written: ${r.backupPaths.join(', ')}`);
|
|
124
|
+
}
|
|
125
|
+
if (!dryRun && r.removedFromSource) {
|
|
126
|
+
lines.push(` Removed ${r.imported.length} server(s) from source config.`);
|
|
127
|
+
}
|
|
128
|
+
totalImported += r.imported.length;
|
|
129
|
+
totalSkipped += r.skipped.length;
|
|
130
|
+
}
|
|
131
|
+
lines.push(`\nTotal: ${totalImported} imported, ${totalSkipped} skipped.`);
|
|
132
|
+
if (!dryRun && totalImported > 0) {
|
|
133
|
+
lines.push(`Config written to: ${results[0]?.conductorPath ?? getDefaultConductorConfigPath()}`);
|
|
134
|
+
}
|
|
135
|
+
return lines.join('\n');
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=import-servers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-servers.js","sourceRoot":"","sources":["../../../src/cli/commands/import-servers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* routing command: heuristic per-tool routing recommendation.
|
|
3
|
+
* @module cli/commands/routing
|
|
4
|
+
*/
|
|
5
|
+
export interface RoutingRecommendation {
|
|
6
|
+
serverName: string;
|
|
7
|
+
recommendation: 'passthrough' | 'execute_code';
|
|
8
|
+
reason: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RoutingResult {
|
|
11
|
+
recommendations: RoutingRecommendation[];
|
|
12
|
+
applied: boolean;
|
|
13
|
+
configPath?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Heuristic: servers whose names or typical tool shapes suggest small payloads
|
|
17
|
+
* should be marked passthrough. This is the X1 heuristic adapted for the CLI.
|
|
18
|
+
*
|
|
19
|
+
* Rule: if the server name matches known lightweight patterns (search, calendar,
|
|
20
|
+
* weather, echo, ping) → passthrough. Otherwise → execute_code.
|
|
21
|
+
*
|
|
22
|
+
* A more sophisticated version would sample live tool responses — this is the
|
|
23
|
+
* static heuristic that can be applied without connecting.
|
|
24
|
+
*/
|
|
25
|
+
export declare function recommendRouting(serverName: string): RoutingRecommendation;
|
|
26
|
+
/**
|
|
27
|
+
* Generate routing recommendations for one or all configured servers.
|
|
28
|
+
* Optionally write the recommendations back to the conductor config.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getRoutingRecommendations(options: {
|
|
31
|
+
serverName?: string;
|
|
32
|
+
apply?: boolean;
|
|
33
|
+
}): RoutingResult;
|
|
34
|
+
//# sourceMappingURL=routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/routing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,aAAa,GAAG,cAAc,CAAC;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,eAAe,EAAE,qBAAqB,EAAE,CAAC;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,CAgB1E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,aAAa,CA4BhB"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* routing command: heuristic per-tool routing recommendation.
|
|
3
|
+
* @module cli/commands/routing
|
|
4
|
+
*/
|
|
5
|
+
import { loadConductorConfig, saveConductorConfig, getDefaultConductorConfigPath } from '../../config/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Heuristic: servers whose names or typical tool shapes suggest small payloads
|
|
8
|
+
* should be marked passthrough. This is the X1 heuristic adapted for the CLI.
|
|
9
|
+
*
|
|
10
|
+
* Rule: if the server name matches known lightweight patterns (search, calendar,
|
|
11
|
+
* weather, echo, ping) → passthrough. Otherwise → execute_code.
|
|
12
|
+
*
|
|
13
|
+
* A more sophisticated version would sample live tool responses — this is the
|
|
14
|
+
* static heuristic that can be applied without connecting.
|
|
15
|
+
*/
|
|
16
|
+
export function recommendRouting(serverName) {
|
|
17
|
+
const lower = serverName.toLowerCase();
|
|
18
|
+
const passthroughPatterns = [
|
|
19
|
+
/search/, /calendar/, /weather/, /echo/, /ping/, /todo/, /remind/,
|
|
20
|
+
/notes?$/, /contacts?$/, /email$/, /mail$/, /slack$/, /discord$/,
|
|
21
|
+
];
|
|
22
|
+
const isPassthrough = passthroughPatterns.some((p) => p.test(lower));
|
|
23
|
+
return {
|
|
24
|
+
serverName,
|
|
25
|
+
recommendation: isPassthrough ? 'passthrough' : 'execute_code',
|
|
26
|
+
reason: isPassthrough
|
|
27
|
+
? 'Name matches lightweight-payload pattern (responses typically <1KB)'
|
|
28
|
+
: 'Name does not match passthrough patterns; execute_code is safer default',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate routing recommendations for one or all configured servers.
|
|
33
|
+
* Optionally write the recommendations back to the conductor config.
|
|
34
|
+
*/
|
|
35
|
+
export function getRoutingRecommendations(options) {
|
|
36
|
+
const config = loadConductorConfig();
|
|
37
|
+
if (!config) {
|
|
38
|
+
return { recommendations: [], applied: false };
|
|
39
|
+
}
|
|
40
|
+
const serverNames = options.serverName
|
|
41
|
+
? [options.serverName]
|
|
42
|
+
: Object.keys(config.servers);
|
|
43
|
+
const recommendations = serverNames
|
|
44
|
+
.filter((n) => config.servers[n] !== undefined)
|
|
45
|
+
.map(recommendRouting);
|
|
46
|
+
if (options.apply && recommendations.length > 0) {
|
|
47
|
+
// Store routing hint in server env as __routing (lightweight annotation).
|
|
48
|
+
for (const rec of recommendations) {
|
|
49
|
+
const server = config.servers[rec.serverName];
|
|
50
|
+
if (server) {
|
|
51
|
+
server.env = { ...(server.env ?? {}), __routing: rec.recommendation };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const configPath = getDefaultConductorConfigPath();
|
|
55
|
+
saveConductorConfig(config, configPath);
|
|
56
|
+
return { recommendations, applied: true, configPath };
|
|
57
|
+
}
|
|
58
|
+
return { recommendations, applied: false };
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../../../src/cli/commands/routing.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAchH;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,mBAAmB,GAAG;QAC1B,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;QACjE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU;KACjE,CAAC;IAEF,MAAM,aAAa,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAErE,OAAO;QACL,UAAU;QACV,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,cAAc;QAC9D,MAAM,EAAE,aAAa;YACnB,CAAC,CAAC,qEAAqE;YACvE,CAAC,CAAC,yEAAyE;KAC9E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAGzC;IACC,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU;QACpC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;QACtB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEhC,MAAM,eAAe,GAAG,WAAW;SAChC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;SAC9C,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAEzB,IAAI,OAAO,CAAC,KAAK,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,0EAA0E;QAC1E,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAC9C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,cAAc,EAAE,CAAC;YACxE,CAAC;QACH,CAAC;QACD,MAAM,UAAU,GAAG,6BAA6B,EAAE,CAAC;QACnD,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACxC,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACxD,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* test-server command: transient connect, list tools, latency probe.
|
|
3
|
+
* @module cli/commands/test-server
|
|
4
|
+
*/
|
|
5
|
+
export interface TestServerOptions {
|
|
6
|
+
/** Server name (looks up in conductor config) */
|
|
7
|
+
name?: string;
|
|
8
|
+
/** Directly specify command (bypasses config lookup) */
|
|
9
|
+
command?: string;
|
|
10
|
+
/** Command args */
|
|
11
|
+
args?: string[];
|
|
12
|
+
/** Environment variables */
|
|
13
|
+
env?: Record<string, string>;
|
|
14
|
+
/** Connection timeout ms */
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface TestServerResult {
|
|
18
|
+
success: boolean;
|
|
19
|
+
serverName: string;
|
|
20
|
+
connected: boolean;
|
|
21
|
+
toolCount: number;
|
|
22
|
+
tools: Array<{
|
|
23
|
+
name: string;
|
|
24
|
+
description: string;
|
|
25
|
+
}>;
|
|
26
|
+
latencyMs: number;
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Transiently connect to an MCP server, list its tools and measure latency.
|
|
31
|
+
* The connection is always closed afterwards — no persistent registration.
|
|
32
|
+
*/
|
|
33
|
+
export declare function testServer(options: TestServerOptions): Promise<TestServerResult>;
|
|
34
|
+
//# sourceMappingURL=test-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-server.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA4EtF"}
|