agent-switchboard 0.1.0 → 0.1.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 +8 -9
- package/dist/agents/adapter.d.ts +3 -3
- package/dist/agents/claude-code.d.ts +1 -1
- package/dist/agents/claude-code.js +2 -2
- package/dist/agents/claude-code.js.map +1 -1
- package/dist/agents/claude-desktop.d.ts +1 -1
- package/dist/agents/claude-desktop.js +2 -2
- package/dist/agents/claude-desktop.js.map +1 -1
- package/dist/agents/codex.d.ts +3 -3
- package/dist/agents/codex.js +6 -11
- package/dist/agents/codex.js.map +1 -1
- package/dist/agents/cursor.d.ts +1 -1
- package/dist/agents/cursor.js +2 -2
- package/dist/agents/cursor.js.map +1 -1
- package/dist/agents/gemini.d.ts +1 -1
- package/dist/agents/gemini.js +2 -2
- package/dist/agents/gemini.js.map +1 -1
- package/dist/agents/json-utils.js +3 -1
- package/dist/agents/json-utils.js.map +1 -1
- package/dist/agents/opencode.d.ts +13 -0
- package/dist/agents/opencode.js +80 -0
- package/dist/agents/opencode.js.map +1 -0
- package/dist/agents/registry.js +2 -0
- package/dist/agents/registry.js.map +1 -1
- package/dist/config/mcp-config.d.ts +4 -4
- package/dist/config/mcp-config.js +33 -12
- package/dist/config/mcp-config.js.map +1 -1
- package/dist/config/paths.d.ts +1 -1
- package/dist/config/paths.js +1 -1
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schemas.d.ts +16 -8
- package/dist/config/schemas.js +2 -1
- package/dist/config/schemas.js.map +1 -1
- package/dist/index.js +9 -7
- package/dist/index.js.map +1 -1
- package/dist/ui/mcp-ui.js +3 -2
- package/dist/ui/mcp-ui.js.map +1 -1
- package/package.json +10 -3
- package/dist/config/abs-config.d.ts +0 -21
- package/dist/config/abs-config.js +0 -67
- package/dist/config/abs-config.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
# Agent Switchboard
|
|
1
|
+
# Agent Switchboard
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Manage MCP servers in one place and apply them to local agents (Codex, Claude Code/Desktop, Gemini) and opencode.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
|
-
Requirements: Node.js >= 16
|
|
8
|
-
|
|
9
7
|
Global install:
|
|
10
8
|
|
|
11
9
|
```bash
|
|
@@ -43,11 +41,12 @@ agents = ["codex", "cursor"]
|
|
|
43
41
|
```
|
|
44
42
|
|
|
45
43
|
Supported agent IDs:
|
|
46
|
-
- `codex` — Codex CLI
|
|
47
|
-
- `cursor` — Cursor IDE
|
|
48
|
-
- `claude-code` — Claude Code CLI
|
|
49
|
-
- `claude-desktop` — Claude Desktop app
|
|
50
|
-
- `gemini` — Gemini CLI
|
|
44
|
+
- `codex` — Codex CLI
|
|
45
|
+
- `cursor` — Cursor IDE
|
|
46
|
+
- `claude-code` — Claude Code CLI
|
|
47
|
+
- `claude-desktop` — Claude Desktop app
|
|
48
|
+
- `gemini` — Gemini CLI
|
|
49
|
+
- `opencode` — opencode global config
|
|
51
50
|
|
|
52
51
|
Run `agent-switchboard mcp` again after updating the list.
|
|
53
52
|
|
package/dist/agents/adapter.d.ts
CHANGED
|
@@ -23,10 +23,10 @@ export interface AgentAdapter {
|
|
|
23
23
|
/**
|
|
24
24
|
* Applies MCP config to the agent's config file
|
|
25
25
|
* - Merges with existing config (preserves unknown fields)
|
|
26
|
-
* - The '
|
|
27
|
-
* @param config - MCP servers to apply (without '
|
|
26
|
+
* - The 'enabled' field is excluded from the input
|
|
27
|
+
* @param config - MCP servers to apply (without 'enabled')
|
|
28
28
|
*/
|
|
29
29
|
applyConfig(config: {
|
|
30
|
-
mcpServers: Record<string, Omit<McpServer, "
|
|
30
|
+
mcpServers: Record<string, Omit<McpServer, "enabled">>;
|
|
31
31
|
}): void;
|
|
32
32
|
}
|
|
@@ -12,6 +12,6 @@ export declare class ClaudeCodeAgent implements AgentAdapter {
|
|
|
12
12
|
readonly id: "claude-code";
|
|
13
13
|
configPath(): string;
|
|
14
14
|
applyConfig(config: {
|
|
15
|
-
mcpServers: Record<string, Omit<McpServer, "
|
|
15
|
+
mcpServers: Record<string, Omit<McpServer, "enabled">>;
|
|
16
16
|
}): void;
|
|
17
17
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import { loadJsonFile, saveJsonFile,
|
|
7
|
+
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from "./json-utils.js";
|
|
8
8
|
/**
|
|
9
9
|
* Claude Code agent adapter
|
|
10
10
|
* Config location: ~/.claude.json
|
|
@@ -12,7 +12,7 @@ import { loadJsonFile, saveJsonFile, mergeMcpIntoAgent } from "./json-utils.js";
|
|
|
12
12
|
export class ClaudeCodeAgent {
|
|
13
13
|
id = "claude-code";
|
|
14
14
|
configPath() {
|
|
15
|
-
const base =
|
|
15
|
+
const base = process.env.ASB_AGENTS_HOME && process.env.ASB_AGENTS_HOME.trim().length > 0
|
|
16
16
|
? process.env.ASB_AGENTS_HOME
|
|
17
17
|
: os.homedir();
|
|
18
18
|
return path.join(base, ".claude.json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAI7B,OAAO,EAEN,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,MAAM,OAAO,eAAe;IAClB,EAAE,GAAG,aAAsB,CAAC;IAErC,UAAU;QACT,MAAM,IAAI,GACT,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC3E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,eAA0B;YACzC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,MAAkE;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;CACD"}
|
|
@@ -18,6 +18,6 @@ export declare class ClaudeDesktopAgent implements AgentAdapter {
|
|
|
18
18
|
readonly id: "claude-desktop";
|
|
19
19
|
configPath(): string;
|
|
20
20
|
applyConfig(config: {
|
|
21
|
-
mcpServers: Record<string, Omit<McpServer, "
|
|
21
|
+
mcpServers: Record<string, Omit<McpServer, "enabled">>;
|
|
22
22
|
}): void;
|
|
23
23
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import { loadJsonFile, saveJsonFile,
|
|
7
|
+
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from "./json-utils.js";
|
|
8
8
|
/**
|
|
9
9
|
* Claude Desktop config file structure
|
|
10
10
|
*/
|
|
@@ -20,7 +20,7 @@ export class ClaudeDesktopAgent {
|
|
|
20
20
|
id = "claude-desktop";
|
|
21
21
|
configPath() {
|
|
22
22
|
const platform = os.platform();
|
|
23
|
-
const home =
|
|
23
|
+
const home = process.env.ASB_AGENTS_HOME && process.env.ASB_AGENTS_HOME.trim().length > 0
|
|
24
24
|
? process.env.ASB_AGENTS_HOME
|
|
25
25
|
: os.homedir();
|
|
26
26
|
switch (platform) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/agents/claude-desktop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/agents/claude-desktop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAEN,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;;;;GAMG;AACH,MAAM,OAAO,kBAAkB;IACrB,EAAE,GAAG,gBAAyB,CAAC;IAExC,UAAU;QACT,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GACT,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC3E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,eAA0B;YACzC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QAEjB,QAAQ,QAAQ,EAAE,CAAC;YAClB,KAAK,QAAQ,EAAE,QAAQ;gBACtB,OAAO,IAAI,CAAC,IAAI,CACf,IAAI,EACJ,SAAS,EACT,qBAAqB,EACrB,QAAQ,EACR,4BAA4B,CAC5B,CAAC;YACH,KAAK,OAAO,EAAE,UAAU;gBACvB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;YACtF,KAAK,OAAO,EAAE,QAAQ;gBACrB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,4BAA4B,CAAC,CAAC;YAC3E;gBACC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,EAAE,CAAC,CAAC;QACvD,CAAC;IACF,CAAC;IAED,WAAW,CAAC,MAAkE;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;CACD"}
|
package/dist/agents/codex.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export declare class CodexAgent implements AgentAdapter {
|
|
|
12
12
|
readonly id: "codex";
|
|
13
13
|
configPath(): string;
|
|
14
14
|
applyConfig(config: {
|
|
15
|
-
mcpServers: Record<string, Omit<McpServer, "
|
|
15
|
+
mcpServers: Record<string, Omit<McpServer, "enabled">>;
|
|
16
16
|
}): void;
|
|
17
17
|
private _loadConfig;
|
|
18
18
|
private _saveConfig;
|
|
@@ -21,7 +21,7 @@ export declare class CodexAgent implements AgentAdapter {
|
|
|
21
21
|
* Merge MCP server config into TOML content
|
|
22
22
|
* Preserves unrelated top-level tables/keys; rewrites mcp_servers in canonical form
|
|
23
23
|
*/
|
|
24
|
-
export declare function mergeConfig(content: string, mcpServers: Record<string, Omit<McpServer, "
|
|
24
|
+
export declare function mergeConfig(content: string, mcpServers: Record<string, Omit<McpServer, "enabled">>): string;
|
|
25
25
|
/**
|
|
26
26
|
* Minimal shape for a Codex MCP server entry used by the renderer
|
|
27
27
|
*/
|
|
@@ -39,4 +39,4 @@ export type McpServerLike = Record<string, unknown> & {
|
|
|
39
39
|
* Key order per server: command, args, url, type, env_file, env.* (alpha), unknown (alpha)
|
|
40
40
|
* Exactly one blank line between server tables; final newline added by caller
|
|
41
41
|
*/
|
|
42
|
-
export declare function buildNestedToml(mcpServers: Record<string, Omit<McpServerLike, "
|
|
42
|
+
export declare function buildNestedToml(mcpServers: Record<string, Omit<McpServerLike, "enabled">>): string;
|
package/dist/agents/codex.js
CHANGED
|
@@ -13,7 +13,7 @@ import { parse as parseToml, stringify as tomlStringify } from "@iarna/toml";
|
|
|
13
13
|
export class CodexAgent {
|
|
14
14
|
id = "codex";
|
|
15
15
|
configPath() {
|
|
16
|
-
const base =
|
|
16
|
+
const base = process.env.ASB_AGENTS_HOME && process.env.ASB_AGENTS_HOME.trim().length > 0
|
|
17
17
|
? process.env.ASB_AGENTS_HOME
|
|
18
18
|
: os.homedir();
|
|
19
19
|
return path.join(base, ".codex", "config.toml");
|
|
@@ -75,7 +75,7 @@ export function mergeConfig(content, mcpServers) {
|
|
|
75
75
|
parts.push(otherToml.trimEnd());
|
|
76
76
|
if (mcpToml.trim().length > 0)
|
|
77
77
|
parts.push(mcpToml.trimEnd());
|
|
78
|
-
return parts.join("\n\n")
|
|
78
|
+
return `${parts.join("\n\n")}\n`;
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
81
|
* Build canonical TOML: one table per server [mcp_servers.<name>]
|
|
@@ -90,13 +90,7 @@ export function buildNestedToml(mcpServers) {
|
|
|
90
90
|
const name = serverNames[idx];
|
|
91
91
|
const server = (mcpServers[name] ?? {});
|
|
92
92
|
lines.push(`[mcp_servers.${name}]`);
|
|
93
|
-
const KNOWN_ORDER = [
|
|
94
|
-
"command",
|
|
95
|
-
"args",
|
|
96
|
-
"url",
|
|
97
|
-
"type",
|
|
98
|
-
"env_file",
|
|
99
|
-
];
|
|
93
|
+
const KNOWN_ORDER = ["command", "args", "url", "type", "env_file"];
|
|
100
94
|
const emit = (k, v) => {
|
|
101
95
|
if (v === undefined || v === null)
|
|
102
96
|
return;
|
|
@@ -106,8 +100,9 @@ export function buildNestedToml(mcpServers) {
|
|
|
106
100
|
if (!isPrim(v) && !isPrimArr(v))
|
|
107
101
|
return;
|
|
108
102
|
// @iarna/toml value formatting for RHS
|
|
109
|
-
|
|
110
|
-
|
|
103
|
+
const rhs = tomlStringify.value
|
|
104
|
+
? tomlStringify.value(v)
|
|
105
|
+
: JSON.stringify(v);
|
|
111
106
|
lines.push(`${k} = ${rhs}`);
|
|
112
107
|
};
|
|
113
108
|
// Known keys
|
package/dist/agents/codex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAI7E;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,EAAE,GAAG,OAAgB,CAAC;IAE/B,UAAU;QACT,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/cursor.d.ts
CHANGED
|
@@ -15,6 +15,6 @@ export declare class CursorAgent implements AgentAdapter {
|
|
|
15
15
|
readonly id: "cursor";
|
|
16
16
|
configPath(): string;
|
|
17
17
|
applyConfig(config: {
|
|
18
|
-
mcpServers: Record<string, Omit<McpServer, "
|
|
18
|
+
mcpServers: Record<string, Omit<McpServer, "enabled">>;
|
|
19
19
|
}): void;
|
|
20
20
|
}
|
package/dist/agents/cursor.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import { loadJsonFile, saveJsonFile,
|
|
7
|
+
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from "./json-utils.js";
|
|
8
8
|
/**
|
|
9
9
|
* Cursor config file structure
|
|
10
10
|
*/
|
|
@@ -16,7 +16,7 @@ import { loadJsonFile, saveJsonFile, mergeMcpIntoAgent } from "./json-utils.js";
|
|
|
16
16
|
export class CursorAgent {
|
|
17
17
|
id = "cursor";
|
|
18
18
|
configPath() {
|
|
19
|
-
const base =
|
|
19
|
+
const base = process.env.ASB_AGENTS_HOME && process.env.ASB_AGENTS_HOME.trim().length > 0
|
|
20
20
|
? process.env.ASB_AGENTS_HOME
|
|
21
21
|
: os.homedir();
|
|
22
22
|
return path.join(base, ".cursor", "mcp.json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../src/agents/cursor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAEN,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,EAAE,GAAG,QAAiB,CAAC;IAEhC,UAAU;QACT,MAAM,IAAI,GACT,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC3E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,eAA0B;YACzC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,WAAW,CAAC,MAAkE;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;CACD"}
|
package/dist/agents/gemini.d.ts
CHANGED
|
@@ -15,6 +15,6 @@ export declare class GeminiAgent implements AgentAdapter {
|
|
|
15
15
|
readonly id: "gemini";
|
|
16
16
|
configPath(): string;
|
|
17
17
|
applyConfig(config: {
|
|
18
|
-
mcpServers: Record<string, Omit<McpServer, "
|
|
18
|
+
mcpServers: Record<string, Omit<McpServer, "enabled">>;
|
|
19
19
|
}): void;
|
|
20
20
|
}
|
package/dist/agents/gemini.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import os from "node:os";
|
|
6
6
|
import path from "node:path";
|
|
7
|
-
import { loadJsonFile, saveJsonFile,
|
|
7
|
+
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from "./json-utils.js";
|
|
8
8
|
/**
|
|
9
9
|
* Gemini CLI config file structure
|
|
10
10
|
*/
|
|
@@ -16,7 +16,7 @@ import { loadJsonFile, saveJsonFile, mergeMcpIntoAgent } from "./json-utils.js";
|
|
|
16
16
|
export class GeminiAgent {
|
|
17
17
|
id = "gemini";
|
|
18
18
|
configPath() {
|
|
19
|
-
const base =
|
|
19
|
+
const base = process.env.ASB_AGENTS_HOME && process.env.ASB_AGENTS_HOME.trim().length > 0
|
|
20
20
|
? process.env.ASB_AGENTS_HOME
|
|
21
21
|
: os.homedir();
|
|
22
22
|
return path.join(base, ".gemini", "settings.json");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agents/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agents/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAEN,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACZ,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;GAGG;AACH,MAAM,OAAO,WAAW;IACd,EAAE,GAAG,QAAiB,CAAC;IAEhC,UAAU;QACT,MAAM,IAAI,GACT,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC3E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,eAA0B;YACzC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACpD,CAAC;IAED,WAAW,CAAC,MAAkE;QAC7E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;CACD"}
|
|
@@ -16,7 +16,9 @@ export function mergeMcpIntoAgent(agentConfig, mcpServers) {
|
|
|
16
16
|
if (Object.keys(mcpServers).length === 0)
|
|
17
17
|
return agentConfig;
|
|
18
18
|
const merged = { ...agentConfig };
|
|
19
|
-
|
|
19
|
+
if (!merged.mcpServers)
|
|
20
|
+
merged.mcpServers = {};
|
|
21
|
+
const target = merged.mcpServers;
|
|
20
22
|
for (const [name, server] of Object.entries(mcpServers)) {
|
|
21
23
|
const existing = target[name] ?? {};
|
|
22
24
|
target[name] = { ...existing, ...server };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../src/agents/json-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,MAAM,UAAU,YAAY,CAAmB,QAAgB,EAAE,QAAW;
|
|
1
|
+
{"version":3,"file":"json-utils.js","sourceRoot":"","sources":["../../src/agents/json-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AAIzB,MAAM,UAAU,YAAY,CAAmB,QAAgB,EAAE,QAAW;IAC3E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,IAAY;IAC1D,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAChC,WAA4B,EAC5B,UAAkC;IAElC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IAE7D,MAAM,MAAM,GAAoB,EAAE,GAAG,WAAW,EAAE,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,MAAM,CAAC,UAAU,GAAG,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC;IAEjC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAI,MAAM,CAAC,IAAI,CAA6B,IAAI,EAAE,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opencode agent adapter
|
|
3
|
+
* Synchronizes MCP servers into ~/.config/opencode/opencode.json
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from "../config/schemas.js";
|
|
6
|
+
import type { AgentAdapter } from "./adapter.js";
|
|
7
|
+
export declare class OpencodeAgent implements AgentAdapter {
|
|
8
|
+
readonly id: "opencode";
|
|
9
|
+
configPath(): string;
|
|
10
|
+
applyConfig(config: {
|
|
11
|
+
mcpServers: Record<string, Omit<McpServer, "enabled">>;
|
|
12
|
+
}): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opencode agent adapter
|
|
3
|
+
* Synchronizes MCP servers into ~/.config/opencode/opencode.json
|
|
4
|
+
*/
|
|
5
|
+
import fs from "node:fs";
|
|
6
|
+
import os from "node:os";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
export class OpencodeAgent {
|
|
9
|
+
id = "opencode";
|
|
10
|
+
configPath() {
|
|
11
|
+
const home = process.env.ASB_AGENTS_HOME && process.env.ASB_AGENTS_HOME.trim().length > 0
|
|
12
|
+
? process.env.ASB_AGENTS_HOME
|
|
13
|
+
: os.homedir();
|
|
14
|
+
if (process.platform === "win32") {
|
|
15
|
+
return path.join(home, "AppData", "Roaming", "opencode", "opencode.json");
|
|
16
|
+
}
|
|
17
|
+
return path.join(home, ".config", "opencode", "opencode.json");
|
|
18
|
+
}
|
|
19
|
+
applyConfig(config) {
|
|
20
|
+
const filePath = this.configPath();
|
|
21
|
+
// Load existing
|
|
22
|
+
let current = {};
|
|
23
|
+
if (fs.existsSync(filePath)) {
|
|
24
|
+
try {
|
|
25
|
+
const raw = fs.readFileSync(filePath, "utf-8");
|
|
26
|
+
current = JSON.parse(raw);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// If unreadable, start fresh but do not throw to avoid blocking apply on one agent
|
|
30
|
+
current = {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const out = { ...current };
|
|
34
|
+
const mcpOut = { ...(current.mcp ?? {}) };
|
|
35
|
+
for (const [name, server] of Object.entries(config.mcpServers)) {
|
|
36
|
+
const prev = { ...(mcpOut[name] ?? {}) };
|
|
37
|
+
// Map stdio/local vs http/remote
|
|
38
|
+
const isRemote = server.type === "http" || typeof server.url === "string";
|
|
39
|
+
const next = { ...prev };
|
|
40
|
+
if (isRemote) {
|
|
41
|
+
next.type = "remote";
|
|
42
|
+
if (typeof server.url === "string")
|
|
43
|
+
next.url = server.url;
|
|
44
|
+
// Preserve headers if present in source
|
|
45
|
+
if (server.headers && typeof server.headers === "object") {
|
|
46
|
+
next.headers = server.headers;
|
|
47
|
+
}
|
|
48
|
+
// command/args/env are not applicable to remote; drop stale keys if present
|
|
49
|
+
delete next.command;
|
|
50
|
+
delete next.environment;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
next.type = "local";
|
|
54
|
+
const cmd = server.command;
|
|
55
|
+
const args = Array.isArray(server.args) ? server.args : [];
|
|
56
|
+
if (typeof cmd === "string" && cmd.length > 0) {
|
|
57
|
+
next.command = [cmd, ...args];
|
|
58
|
+
}
|
|
59
|
+
// environment from env
|
|
60
|
+
if (server.env && typeof server.env === "object") {
|
|
61
|
+
next.environment = server.env;
|
|
62
|
+
}
|
|
63
|
+
// Drop remote-only keys
|
|
64
|
+
delete next.url;
|
|
65
|
+
delete next.headers;
|
|
66
|
+
}
|
|
67
|
+
// Entries written by ASB are always enabled (we only apply enabled ones)
|
|
68
|
+
next.enabled = true;
|
|
69
|
+
mcpOut[name] = next;
|
|
70
|
+
}
|
|
71
|
+
out.mcp = mcpOut;
|
|
72
|
+
// Ensure dir exists
|
|
73
|
+
const dir = path.dirname(filePath);
|
|
74
|
+
if (!fs.existsSync(dir))
|
|
75
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
76
|
+
const json = `${JSON.stringify(out, null, 2)}\n`;
|
|
77
|
+
fs.writeFileSync(filePath, json, "utf-8");
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAQ7B,MAAM,OAAO,aAAa;IAChB,EAAE,GAAG,UAAmB,CAAC;IAElC,UAAU;QACT,MAAM,IAAI,GACT,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC3E,CAAC,CAAE,OAAO,CAAC,GAAG,CAAC,eAA0B;YACzC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QAEjB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,WAAW,CAAC,MAAkE;QAC7E,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAEnC,gBAAgB;QAChB,IAAI,OAAO,GAAmB,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACJ,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAmB,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACR,mFAAmF;gBACnF,OAAO,GAAG,EAAE,CAAC;YACd,CAAC;QACF,CAAC;QAED,MAAM,GAAG,GAAmB,EAAE,GAAG,OAAO,EAAE,CAAC;QAC3C,MAAM,MAAM,GAA4C,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;QAEnF,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAEzC,iCAAiC;YACjC,MAAM,QAAQ,GAAI,MAAc,CAAC,IAAI,KAAK,MAAM,IAAI,OAAQ,MAAc,CAAC,GAAG,KAAK,QAAQ,CAAC;YAC5F,MAAM,IAAI,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;YAElD,IAAI,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACrB,IAAI,OAAQ,MAAc,CAAC,GAAG,KAAK,QAAQ;oBAAE,IAAI,CAAC,GAAG,GAAI,MAAc,CAAC,GAAG,CAAC;gBAC5E,wCAAwC;gBACxC,IAAK,MAAc,CAAC,OAAO,IAAI,OAAQ,MAAc,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAC5E,IAAI,CAAC,OAAO,GAAI,MAAc,CAAC,OAAO,CAAC;gBACxC,CAAC;gBACD,4EAA4E;gBAC5E,OAAO,IAAI,CAAC,OAAO,CAAC;gBACpB,OAAQ,IAAY,CAAC,WAAW,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;gBACpB,MAAM,GAAG,GAAI,MAAc,CAAC,OAA6B,CAAC;gBAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAE,MAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAG,MAAc,CAAC,IAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5F,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/C,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;gBAC/B,CAAC;gBACD,uBAAuB;gBACvB,IAAK,MAAc,CAAC,GAAG,IAAI,OAAQ,MAAc,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;oBACpE,IAAI,CAAC,WAAW,GAAI,MAAc,CAAC,GAAG,CAAC;gBACxC,CAAC;gBACD,wBAAwB;gBACxB,OAAO,IAAI,CAAC,GAAG,CAAC;gBAChB,OAAO,IAAI,CAAC,OAAO,CAAC;YACrB,CAAC;YAED,yEAAyE;YACzE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YAEpB,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,GAAG,CAAC,GAAG,GAAG,MAAM,CAAC;QAEjB,oBAAoB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhE,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QACjD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;CACD"}
|
package/dist/agents/registry.js
CHANGED
|
@@ -7,6 +7,7 @@ import { ClaudeDesktopAgent } from "./claude-desktop.js";
|
|
|
7
7
|
import { CodexAgent } from "./codex.js";
|
|
8
8
|
import { CursorAgent } from "./cursor.js";
|
|
9
9
|
import { GeminiAgent } from "./gemini.js";
|
|
10
|
+
import { OpencodeAgent } from "./opencode.js";
|
|
10
11
|
/**
|
|
11
12
|
* Registry of all available agent adapters
|
|
12
13
|
* Add new adapters here when implemented
|
|
@@ -17,6 +18,7 @@ const agents = [
|
|
|
17
18
|
new CodexAgent(),
|
|
18
19
|
new CursorAgent(),
|
|
19
20
|
new GeminiAgent(),
|
|
21
|
+
new OpencodeAgent(),
|
|
20
22
|
];
|
|
21
23
|
/**
|
|
22
24
|
* Get an agent adapter by its ID
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/agents/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;GAGG;AACH,MAAM,MAAM,GAAmB;IAC9B,IAAI,eAAe,EAAE;IACrB,IAAI,kBAAkB,EAAE;IACxB,IAAI,UAAU,EAAE;IAChB,IAAI,WAAW,EAAE;IACjB,IAAI,WAAW,EAAE;IACjB,IAAI,aAAa,EAAE;CACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACd,sBAAsB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,uBAAuB,iBAAiB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/F,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAChC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,OAAqB;IAClD,8BAA8B;IAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,SAAS,OAAO,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -7,7 +7,7 @@ import { type McpConfig } from "./schemas.js";
|
|
|
7
7
|
* Loads the MCP configuration from ~/.agent-switchboard/mcp.json
|
|
8
8
|
* Parses JSONC (JSON with comments) format
|
|
9
9
|
* Returns default empty config if file doesn't exist
|
|
10
|
-
* Auto-adds missing
|
|
10
|
+
* Auto-adds missing enabled flags and saves the file
|
|
11
11
|
*
|
|
12
12
|
* @returns {McpConfig} Parsed and validated MCP configuration
|
|
13
13
|
* @throws {Error} If file exists but contains invalid JSON or fails schema validation
|
|
@@ -23,9 +23,9 @@ export declare function loadMcpConfig(): McpConfig;
|
|
|
23
23
|
*/
|
|
24
24
|
export declare function saveMcpConfig(config: McpConfig): void;
|
|
25
25
|
/**
|
|
26
|
-
* Updates
|
|
26
|
+
* Updates enabled flags for MCP servers based on selection
|
|
27
27
|
* Preserves comments and unknown fields
|
|
28
28
|
*
|
|
29
|
-
* @param {string[]} enabledServerNames - Array of server names to
|
|
29
|
+
* @param {string[]} enabledServerNames - Array of server names to set enabled=true
|
|
30
30
|
*/
|
|
31
|
-
export declare function
|
|
31
|
+
export declare function updateEnabledFlags(enabledServerNames: string[]): void;
|
|
@@ -10,7 +10,7 @@ import { mcpConfigSchema } from "./schemas.js";
|
|
|
10
10
|
* Loads the MCP configuration from ~/.agent-switchboard/mcp.json
|
|
11
11
|
* Parses JSONC (JSON with comments) format
|
|
12
12
|
* Returns default empty config if file doesn't exist
|
|
13
|
-
* Auto-adds missing
|
|
13
|
+
* Auto-adds missing enabled flags and saves the file
|
|
14
14
|
*
|
|
15
15
|
* @returns {McpConfig} Parsed and validated MCP configuration
|
|
16
16
|
* @throws {Error} If file exists but contains invalid JSON or fails schema validation
|
|
@@ -26,16 +26,30 @@ export function loadMcpConfig() {
|
|
|
26
26
|
const content = fs.readFileSync(configPath, "utf-8");
|
|
27
27
|
// Parse JSONC (preserves comments in the parser's internal state)
|
|
28
28
|
const parsed = parse(content);
|
|
29
|
-
// Validate against Zod schema (adds default
|
|
29
|
+
// Validate against Zod schema (adds default enabled: true if missing)
|
|
30
30
|
const validated = mcpConfigSchema.parse(parsed);
|
|
31
|
-
//
|
|
31
|
+
// Ensure defaults: enabled flag and type inference
|
|
32
32
|
let needsSave = false;
|
|
33
33
|
if (parsed.mcpServers) {
|
|
34
|
-
for (const [
|
|
35
|
-
|
|
34
|
+
for (const [name, server] of Object.entries(parsed.mcpServers)) {
|
|
35
|
+
const target = validated.mcpServers[name] ?? {};
|
|
36
|
+
// enabled default
|
|
37
|
+
if (typeof server?.enabled === "undefined") {
|
|
38
|
+
target.enabled = true;
|
|
36
39
|
needsSave = true;
|
|
37
|
-
break;
|
|
38
40
|
}
|
|
41
|
+
// type inference: url -> http; else if command -> stdio; url wins if both present
|
|
42
|
+
if (typeof server?.type === "undefined") {
|
|
43
|
+
if (typeof server?.url === "string" && server.url.length > 0) {
|
|
44
|
+
target.type = "http";
|
|
45
|
+
needsSave = true;
|
|
46
|
+
}
|
|
47
|
+
else if (typeof server?.command === "string" && server.command.length > 0) {
|
|
48
|
+
target.type = "stdio";
|
|
49
|
+
needsSave = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
validated.mcpServers[name] = { ...target };
|
|
39
53
|
}
|
|
40
54
|
}
|
|
41
55
|
// Save back if defaults were added
|
|
@@ -65,12 +79,19 @@ export function saveMcpConfig(config) {
|
|
|
65
79
|
try {
|
|
66
80
|
// Validate config against schema before saving
|
|
67
81
|
const validated = mcpConfigSchema.parse(config);
|
|
82
|
+
// Sanitize legacy fields: explicitly drop old 'enable' if present while preserving other unknown keys
|
|
83
|
+
const out = { mcpServers: {} };
|
|
84
|
+
for (const [name, server] of Object.entries(validated.mcpServers)) {
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
const { enable: _legacyEnable, ...rest } = server;
|
|
87
|
+
out.mcpServers[name] = rest;
|
|
88
|
+
}
|
|
68
89
|
// Ensure directory exists
|
|
69
90
|
if (!fs.existsSync(configDir)) {
|
|
70
91
|
fs.mkdirSync(configDir, { recursive: true });
|
|
71
92
|
}
|
|
72
93
|
// Pretty print with 4 spaces; do not preserve comments; ensure trailing newline
|
|
73
|
-
const json = JSON.stringify(
|
|
94
|
+
const json = `${JSON.stringify(out, null, 4)}\n`;
|
|
74
95
|
fs.writeFileSync(configPath, json, "utf-8");
|
|
75
96
|
}
|
|
76
97
|
catch (error) {
|
|
@@ -81,17 +102,17 @@ export function saveMcpConfig(config) {
|
|
|
81
102
|
}
|
|
82
103
|
}
|
|
83
104
|
/**
|
|
84
|
-
* Updates
|
|
105
|
+
* Updates enabled flags for MCP servers based on selection
|
|
85
106
|
* Preserves comments and unknown fields
|
|
86
107
|
*
|
|
87
|
-
* @param {string[]} enabledServerNames - Array of server names to
|
|
108
|
+
* @param {string[]} enabledServerNames - Array of server names to set enabled=true
|
|
88
109
|
*/
|
|
89
|
-
export function
|
|
110
|
+
export function updateEnabledFlags(enabledServerNames) {
|
|
90
111
|
const config = loadMcpConfig();
|
|
91
112
|
const enabledSet = new Set(enabledServerNames);
|
|
92
|
-
// Update
|
|
113
|
+
// Update enabled flag for each server
|
|
93
114
|
for (const [name, server] of Object.entries(config.mcpServers)) {
|
|
94
|
-
server.
|
|
115
|
+
server.enabled = enabledSet.has(name);
|
|
95
116
|
}
|
|
96
117
|
saveMcpConfig(config);
|
|
97
118
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/config/mcp-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAkB,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa;IAC5B,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,8CAA8C;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,CAAC;QACJ,oBAAoB;QACpB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAErD,kEAAkE;QAClE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE9B,
|
|
1
|
+
{"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/config/mcp-config.ts"],"names":[],"mappings":"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"}
|
package/dist/config/paths.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
export declare function getConfigDir(): string;
|
|
15
15
|
/**
|
|
16
16
|
* Returns the absolute path to the MCP config file (mcp.json)
|
|
17
|
-
* This file stores all MCP server configurations with
|
|
17
|
+
* This file stores all MCP server configurations with enabled flags
|
|
18
18
|
*
|
|
19
19
|
* @returns {string} Absolute path to ~/.agent-switchboard/mcp.json
|
|
20
20
|
*/
|
package/dist/config/paths.js
CHANGED
|
@@ -24,7 +24,7 @@ export function getConfigDir() {
|
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* Returns the absolute path to the MCP config file (mcp.json)
|
|
27
|
-
* This file stores all MCP server configurations with
|
|
27
|
+
* This file stores all MCP server configurations with enabled flags
|
|
28
28
|
*
|
|
29
29
|
* @returns {string} Absolute path to ~/.agent-switchboard/mcp.json
|
|
30
30
|
*/
|
package/dist/config/paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY;
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY;IAC3B,wBAAwB;IACxB,2GAA2G;IAC3G,2DAA2D;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC7C,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,CAAC;AACtD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB;IACvC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC"}
|
package/dist/config/schemas.d.ts
CHANGED
|
@@ -12,19 +12,22 @@ export declare const mcpServerSchema: z.ZodObject<{
|
|
|
12
12
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
13
13
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
14
14
|
url: z.ZodOptional<z.ZodString>;
|
|
15
|
-
|
|
15
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
16
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
16
17
|
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
17
18
|
command: z.ZodOptional<z.ZodString>;
|
|
18
19
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
19
20
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
20
21
|
url: z.ZodOptional<z.ZodString>;
|
|
21
|
-
|
|
22
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
23
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
22
24
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
23
25
|
command: z.ZodOptional<z.ZodString>;
|
|
24
26
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
25
27
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
26
28
|
url: z.ZodOptional<z.ZodString>;
|
|
27
|
-
|
|
29
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
30
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
28
31
|
}, z.ZodTypeAny, "passthrough">>;
|
|
29
32
|
/**
|
|
30
33
|
* Schema for MCP configuration file (~/.agent-switchboard/mcp.json)
|
|
@@ -35,19 +38,22 @@ export declare const mcpConfigSchema: z.ZodObject<{
|
|
|
35
38
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
36
39
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
37
40
|
url: z.ZodOptional<z.ZodString>;
|
|
38
|
-
|
|
41
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
42
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
39
43
|
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
40
44
|
command: z.ZodOptional<z.ZodString>;
|
|
41
45
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
42
46
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
43
47
|
url: z.ZodOptional<z.ZodString>;
|
|
44
|
-
|
|
48
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
49
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
45
50
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
46
51
|
command: z.ZodOptional<z.ZodString>;
|
|
47
52
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
48
53
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
49
54
|
url: z.ZodOptional<z.ZodString>;
|
|
50
|
-
|
|
55
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
56
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
51
57
|
}, z.ZodTypeAny, "passthrough">>>>;
|
|
52
58
|
}, "strip", z.ZodTypeAny, {
|
|
53
59
|
mcpServers: Record<string, z.objectOutputType<{
|
|
@@ -55,7 +61,8 @@ export declare const mcpConfigSchema: z.ZodObject<{
|
|
|
55
61
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
56
62
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
57
63
|
url: z.ZodOptional<z.ZodString>;
|
|
58
|
-
|
|
64
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
65
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
59
66
|
}, z.ZodTypeAny, "passthrough">>;
|
|
60
67
|
}, {
|
|
61
68
|
mcpServers?: Record<string, z.objectInputType<{
|
|
@@ -63,7 +70,8 @@ export declare const mcpConfigSchema: z.ZodObject<{
|
|
|
63
70
|
args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
64
71
|
env: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
65
72
|
url: z.ZodOptional<z.ZodString>;
|
|
66
|
-
|
|
73
|
+
type: z.ZodOptional<z.ZodEnum<["stdio", "http"]>>;
|
|
74
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
67
75
|
}, z.ZodTypeAny, "passthrough">> | undefined;
|
|
68
76
|
}>;
|
|
69
77
|
/**
|
package/dist/config/schemas.js
CHANGED
|
@@ -13,7 +13,8 @@ export const mcpServerSchema = z
|
|
|
13
13
|
args: z.array(z.string()).optional(),
|
|
14
14
|
env: z.record(z.string()).optional(),
|
|
15
15
|
url: z.string().url().optional(),
|
|
16
|
-
|
|
16
|
+
type: z.enum(["stdio", "http"]).optional(),
|
|
17
|
+
enabled: z.boolean().default(true),
|
|
17
18
|
})
|
|
18
19
|
.passthrough(); // Allow unknown fields
|
|
19
20
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC9B,MAAM,CAAC;IACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC9B,MAAM,CAAC;IACP,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAClC,CAAC;KACD,WAAW,EAAE,CAAC,CAAC,uBAAuB;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7D,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACvC,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import chalk from "chalk";
|
|
|
7
7
|
import { Command } from "commander";
|
|
8
8
|
import ora from "ora";
|
|
9
9
|
import { getAgentById } from "./agents/registry.js";
|
|
10
|
-
import { loadMcpConfig,
|
|
10
|
+
import { loadMcpConfig, updateEnabledFlags } from "./config/mcp-config.js";
|
|
11
11
|
import { loadSwitchboardConfig } from "./config/switchboard-config.js";
|
|
12
12
|
import { showMcpServerUI } from "./ui/mcp-ui.js";
|
|
13
13
|
const program = new Command();
|
|
@@ -23,9 +23,9 @@ program
|
|
|
23
23
|
console.log(chalk.yellow("\n⚠ No servers selected. Exiting without changes."));
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
|
-
// Step 2: Update
|
|
26
|
+
// Step 2: Update enabled flags in mcp.json
|
|
27
27
|
const spinner = ora("Updating MCP configuration...").start();
|
|
28
|
-
|
|
28
|
+
updateEnabledFlags(selectedServers);
|
|
29
29
|
spinner.succeed(chalk.green("✓ Updated ~/.agent-switchboard/mcp.json"));
|
|
30
30
|
// Step 3: Apply to registered agents
|
|
31
31
|
await applyToAgents();
|
|
@@ -56,12 +56,14 @@ async function applyToAgents() {
|
|
|
56
56
|
console.log(chalk.dim(' agents = ["claude-code", "cursor"]'));
|
|
57
57
|
return;
|
|
58
58
|
}
|
|
59
|
-
// Filter enabled servers and remove '
|
|
59
|
+
// Filter enabled servers and remove 'enabled' field
|
|
60
60
|
const enabledServers = Object.fromEntries(Object.entries(mcpConfig.mcpServers)
|
|
61
|
-
|
|
61
|
+
// biome-ignore lint/suspicious/noExplicitAny: McpServer passthrough schema allows additional fields
|
|
62
|
+
.filter(([_, server]) => server.enabled === true)
|
|
62
63
|
.map(([name, server]) => {
|
|
63
|
-
// Remove '
|
|
64
|
-
|
|
64
|
+
// Remove 'enabled' field before applying to agents
|
|
65
|
+
// biome-ignore lint/suspicious/noExplicitAny: McpServer passthrough schema allows additional fields
|
|
66
|
+
const { enabled: _enabled, ...rest } = server;
|
|
65
67
|
return [name, rest];
|
|
66
68
|
}));
|
|
67
69
|
const configToApply = { mcpServers: enabledServers };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/mcp-ui.js
CHANGED
|
@@ -15,7 +15,8 @@ export function createMcpServerItems() {
|
|
|
15
15
|
const items = [];
|
|
16
16
|
// Create items for all servers
|
|
17
17
|
for (const [name, server] of Object.entries(config.mcpServers)) {
|
|
18
|
-
|
|
18
|
+
// biome-ignore lint/suspicious/noExplicitAny: McpServer passthrough schema allows additional fields
|
|
19
|
+
const isEnabled = server.enabled === true;
|
|
19
20
|
const icon = isEnabled ? chalk.green("✓") : chalk.red("✗");
|
|
20
21
|
const status = isEnabled ? chalk.gray("(enabled)") : chalk.gray("(disabled)");
|
|
21
22
|
items.push({
|
|
@@ -46,7 +47,7 @@ export async function showMcpServerUI() {
|
|
|
46
47
|
"command": "npx",
|
|
47
48
|
"args": ["-y", "package"],
|
|
48
49
|
"env": {},
|
|
49
|
-
"
|
|
50
|
+
"enabled": true
|
|
50
51
|
}
|
|
51
52
|
}
|
|
52
53
|
}`));
|
package/dist/ui/mcp-ui.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-ui.js","sourceRoot":"","sources":["../../src/ui/mcp-ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IACnC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,+BAA+B;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"mcp-ui.js","sourceRoot":"","sources":["../../src/ui/mcp-ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IACnC,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,+BAA+B;IAC/B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAChE,oGAAoG;QACpG,MAAM,SAAS,GAAI,MAAc,CAAC,OAAO,KAAK,IAAI,CAAC;QACnD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9E,KAAK,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,MAAM,EAAE;YACjC,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,SAAS;SAClB,CAAC,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACpC,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IAErC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yDAAyD,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,GAAG,CACV,KAAK,CAAC,GAAG,CAAC;;;;;;;;;IAST,CAAC,CACF,CAAC;QACF,OAAO,EAAE,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC;QACtC,OAAO,EAAE,wEAAwE;QACjF,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,EAAE;KACZ,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACxB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-switchboard",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Unified MCP server manager for AI coding agents",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -14,10 +14,17 @@
|
|
|
14
14
|
"lint": "biome check src/",
|
|
15
15
|
"lint:fix": "biome check --write src/",
|
|
16
16
|
"format": "biome format --write src/",
|
|
17
|
-
"test": "tsx tests
|
|
17
|
+
"test": "tsx --test tests/*.test.ts",
|
|
18
18
|
"prepublishOnly": "pnpm run build"
|
|
19
19
|
},
|
|
20
|
-
"keywords": [
|
|
20
|
+
"keywords": [
|
|
21
|
+
"mcp",
|
|
22
|
+
"agent",
|
|
23
|
+
"claude",
|
|
24
|
+
"codex",
|
|
25
|
+
"cursor",
|
|
26
|
+
"cli"
|
|
27
|
+
],
|
|
21
28
|
"author": "",
|
|
22
29
|
"license": "MIT",
|
|
23
30
|
"engines": {
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Switchboard configuration loader and saver (TOML format)
|
|
3
|
-
* Manages the list of agents to apply MCP configs to
|
|
4
|
-
*/
|
|
5
|
-
import { type AbsConfig } from "./schemas.js";
|
|
6
|
-
/**
|
|
7
|
-
* Loads the ABS configuration from ~/.agent-switchboard/config.toml
|
|
8
|
-
* Returns default empty agents list if file doesn't exist
|
|
9
|
-
*
|
|
10
|
-
* @returns {AbsConfig} Parsed and validated ABS configuration
|
|
11
|
-
* @throws {Error} If file exists but contains invalid TOML or fails schema validation
|
|
12
|
-
*/
|
|
13
|
-
export declare function loadAbsConfig(): AbsConfig;
|
|
14
|
-
/**
|
|
15
|
-
* Saves the ABS configuration to ~/.agent-switchboard/config.toml
|
|
16
|
-
* Creates directory and file if they don't exist
|
|
17
|
-
*
|
|
18
|
-
* @param {AbsConfig} config - Configuration to save
|
|
19
|
-
* @throws {Error} If config fails schema validation or write operation fails
|
|
20
|
-
*/
|
|
21
|
-
export declare function saveAbsConfig(config: AbsConfig): void;
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent Switchboard configuration loader and saver (TOML format)
|
|
3
|
-
* Manages the list of agents to apply MCP configs to
|
|
4
|
-
*/
|
|
5
|
-
import fs from "node:fs";
|
|
6
|
-
import { parse, stringify } from "@iarna/toml";
|
|
7
|
-
import { absConfigSchema } from "./schemas.js";
|
|
8
|
-
import { getAbsConfigPath, getConfigDir } from "./paths.js";
|
|
9
|
-
/**
|
|
10
|
-
* Loads the ABS configuration from ~/.agent-switchboard/config.toml
|
|
11
|
-
* Returns default empty agents list if file doesn't exist
|
|
12
|
-
*
|
|
13
|
-
* @returns {AbsConfig} Parsed and validated ABS configuration
|
|
14
|
-
* @throws {Error} If file exists but contains invalid TOML or fails schema validation
|
|
15
|
-
*/
|
|
16
|
-
export function loadAbsConfig() {
|
|
17
|
-
const configPath = getAbsConfigPath();
|
|
18
|
-
// Return default config if file doesn't exist
|
|
19
|
-
if (!fs.existsSync(configPath)) {
|
|
20
|
-
return { agents: [] };
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
// Read file content
|
|
24
|
-
const content = fs.readFileSync(configPath, "utf-8");
|
|
25
|
-
// Parse TOML
|
|
26
|
-
const parsed = parse(content);
|
|
27
|
-
// Validate against Zod schema
|
|
28
|
-
const validated = absConfigSchema.parse(parsed);
|
|
29
|
-
return validated;
|
|
30
|
-
}
|
|
31
|
-
catch (error) {
|
|
32
|
-
if (error instanceof Error) {
|
|
33
|
-
throw new Error(`Failed to load ABS config from ${configPath}: ${error.message}`);
|
|
34
|
-
}
|
|
35
|
-
throw error;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Saves the ABS configuration to ~/.agent-switchboard/config.toml
|
|
40
|
-
* Creates directory and file if they don't exist
|
|
41
|
-
*
|
|
42
|
-
* @param {AbsConfig} config - Configuration to save
|
|
43
|
-
* @throws {Error} If config fails schema validation or write operation fails
|
|
44
|
-
*/
|
|
45
|
-
export function saveAbsConfig(config) {
|
|
46
|
-
const configPath = getAbsConfigPath();
|
|
47
|
-
const configDir = getConfigDir();
|
|
48
|
-
try {
|
|
49
|
-
// Validate config against schema before saving
|
|
50
|
-
const validated = absConfigSchema.parse(config);
|
|
51
|
-
// Ensure directory exists
|
|
52
|
-
if (!fs.existsSync(configDir)) {
|
|
53
|
-
fs.mkdirSync(configDir, { recursive: true });
|
|
54
|
-
}
|
|
55
|
-
// Stringify to TOML format
|
|
56
|
-
const content = stringify(validated);
|
|
57
|
-
// Write to file
|
|
58
|
-
fs.writeFileSync(configPath, content, "utf-8");
|
|
59
|
-
}
|
|
60
|
-
catch (error) {
|
|
61
|
-
if (error instanceof Error) {
|
|
62
|
-
throw new Error(`Failed to save ABS config to ${configPath}: ${error.message}`);
|
|
63
|
-
}
|
|
64
|
-
throw error;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=abs-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"abs-config.js","sourceRoot":"","sources":["../../src/config/abs-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAkB,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;GAMG;AACH,MAAM,UAAU,aAAa;IAC5B,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IAEtC,8CAA8C;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,CAAC;QACJ,oBAAoB;QACpB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAErD,aAAa;QACb,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAE9B,8BAA8B;QAC9B,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEhD,OAAO,SAAS,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC9C,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC;QACJ,+CAA+C;QAC/C,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAEhD,0BAA0B;QAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QAErC,gBAAgB;QAChB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC"}
|