mcpsmgr 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +51 -44
- package/dist/index.js.map +1 -1
- package/openspec/specs/openclaw-adapter/spec.md +9 -9
- package/package.json +1 -1
- package/src/adapters/__tests__/openclaw.test.ts +111 -42
- package/src/adapters/openclaw.ts +59 -48
package/dist/index.js
CHANGED
|
@@ -1225,56 +1225,63 @@ var GLOBAL_CONFIG_PATH2 = join7(
|
|
|
1225
1225
|
".openclaw",
|
|
1226
1226
|
"openclaw.json"
|
|
1227
1227
|
);
|
|
1228
|
+
function getMcpServers(data) {
|
|
1229
|
+
const plugins = data["plugins"];
|
|
1230
|
+
const entries = plugins?.["entries"];
|
|
1231
|
+
const acpx = entries?.["acpx"];
|
|
1232
|
+
return acpx?.["mcpServers"] ?? {};
|
|
1233
|
+
}
|
|
1234
|
+
function setMcpServers(data, servers) {
|
|
1235
|
+
const plugins = data["plugins"] ?? {};
|
|
1236
|
+
const entries = plugins["entries"] ?? {};
|
|
1237
|
+
const acpx = entries["acpx"] ?? {};
|
|
1238
|
+
return {
|
|
1239
|
+
...data,
|
|
1240
|
+
plugins: {
|
|
1241
|
+
...plugins,
|
|
1242
|
+
entries: {
|
|
1243
|
+
...entries,
|
|
1244
|
+
acpx: {
|
|
1245
|
+
...acpx,
|
|
1246
|
+
enabled: true,
|
|
1247
|
+
mcpServers: servers
|
|
1248
|
+
}
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
};
|
|
1252
|
+
}
|
|
1228
1253
|
function toAgentFormat6(config) {
|
|
1229
1254
|
if (config.transport === "stdio") {
|
|
1230
1255
|
const { resolvedArgs, remainingEnv } = resolveEnvInArgs(
|
|
1231
1256
|
config.args,
|
|
1232
1257
|
config.env
|
|
1233
1258
|
);
|
|
1234
|
-
const
|
|
1235
|
-
if (envArgs.length > 0) {
|
|
1236
|
-
return {
|
|
1237
|
-
command: "env",
|
|
1238
|
-
args: [...envArgs, config.command, ...resolvedArgs]
|
|
1239
|
-
};
|
|
1240
|
-
}
|
|
1241
|
-
return {
|
|
1259
|
+
const result = {
|
|
1242
1260
|
command: config.command,
|
|
1243
1261
|
args: resolvedArgs
|
|
1244
1262
|
};
|
|
1263
|
+
if (Object.keys(remainingEnv).length > 0) {
|
|
1264
|
+
result["env"] = { ...remainingEnv };
|
|
1265
|
+
}
|
|
1266
|
+
return result;
|
|
1267
|
+
}
|
|
1268
|
+
const args = ["-y", "mcp-remote@latest", config.url];
|
|
1269
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
1270
|
+
args.push("--header", `${key}: ${value}`);
|
|
1245
1271
|
}
|
|
1246
1272
|
return {
|
|
1247
|
-
|
|
1248
|
-
|
|
1273
|
+
command: "npx",
|
|
1274
|
+
args
|
|
1249
1275
|
};
|
|
1250
1276
|
}
|
|
1251
1277
|
function fromAgentFormat6(_name, raw) {
|
|
1252
|
-
if (raw["command"]) {
|
|
1253
|
-
|
|
1254
|
-
const rawArgs = raw["args"] ?? [];
|
|
1255
|
-
const legacyEnv = raw["env"];
|
|
1256
|
-
if (legacyEnv && Object.keys(legacyEnv).length > 0) {
|
|
1257
|
-
return { transport: "stdio", command, args: rawArgs, env: legacyEnv };
|
|
1258
|
-
}
|
|
1259
|
-
if (command === "env") {
|
|
1260
|
-
const { env, commandIndex } = parseEnvArgs(rawArgs);
|
|
1261
|
-
return {
|
|
1262
|
-
transport: "stdio",
|
|
1263
|
-
command: rawArgs[commandIndex] ?? "",
|
|
1264
|
-
args: rawArgs.slice(commandIndex + 1),
|
|
1265
|
-
env
|
|
1266
|
-
};
|
|
1267
|
-
}
|
|
1268
|
-
return { transport: "stdio", command, args: rawArgs, env: {} };
|
|
1269
|
-
}
|
|
1270
|
-
if (raw["url"]) {
|
|
1271
|
-
return {
|
|
1272
|
-
transport: "http",
|
|
1273
|
-
url: raw["url"],
|
|
1274
|
-
headers: raw["headers"] ?? {}
|
|
1275
|
-
};
|
|
1278
|
+
if (!raw["command"]) {
|
|
1279
|
+
return void 0;
|
|
1276
1280
|
}
|
|
1277
|
-
|
|
1281
|
+
const command = raw["command"];
|
|
1282
|
+
const rawArgs = raw["args"] ?? [];
|
|
1283
|
+
const env = raw["env"] ?? {};
|
|
1284
|
+
return { transport: "stdio", command, args: rawArgs, env };
|
|
1278
1285
|
}
|
|
1279
1286
|
var openclawAdapter = {
|
|
1280
1287
|
id: "openclaw",
|
|
@@ -1285,31 +1292,31 @@ var openclawAdapter = {
|
|
|
1285
1292
|
fromAgentFormat: fromAgentFormat6,
|
|
1286
1293
|
async read() {
|
|
1287
1294
|
const data = await readJson5File(GLOBAL_CONFIG_PATH2);
|
|
1288
|
-
return data
|
|
1295
|
+
return getMcpServers(data);
|
|
1289
1296
|
},
|
|
1290
1297
|
async write(_projectDir, serverName, config) {
|
|
1291
1298
|
const data = await readJson5File(GLOBAL_CONFIG_PATH2);
|
|
1292
|
-
const servers = data
|
|
1299
|
+
const servers = getMcpServers(data);
|
|
1293
1300
|
if (serverName in servers) {
|
|
1294
1301
|
throw new Error(
|
|
1295
1302
|
`Conflict: "${serverName}" already exists in OpenClaw config`
|
|
1296
1303
|
);
|
|
1297
1304
|
}
|
|
1298
|
-
const updated = {
|
|
1299
|
-
...
|
|
1300
|
-
|
|
1301
|
-
};
|
|
1305
|
+
const updated = setMcpServers(data, {
|
|
1306
|
+
...servers,
|
|
1307
|
+
[serverName]: toAgentFormat6(config)
|
|
1308
|
+
});
|
|
1302
1309
|
await writeJson5File(GLOBAL_CONFIG_PATH2, updated);
|
|
1303
1310
|
},
|
|
1304
1311
|
async remove(_projectDir, serverName) {
|
|
1305
1312
|
const data = await readJson5File(GLOBAL_CONFIG_PATH2);
|
|
1306
|
-
const servers = data
|
|
1313
|
+
const servers = getMcpServers(data);
|
|
1307
1314
|
const { [serverName]: _, ...rest } = servers;
|
|
1308
|
-
await writeJson5File(GLOBAL_CONFIG_PATH2,
|
|
1315
|
+
await writeJson5File(GLOBAL_CONFIG_PATH2, setMcpServers(data, rest));
|
|
1309
1316
|
},
|
|
1310
1317
|
async has(_projectDir, serverName) {
|
|
1311
1318
|
const data = await readJson5File(GLOBAL_CONFIG_PATH2);
|
|
1312
|
-
const servers = data
|
|
1319
|
+
const servers = getMcpServers(data);
|
|
1313
1320
|
return serverName in servers;
|
|
1314
1321
|
}
|
|
1315
1322
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/utils/config.ts","../src/utils/paths.ts","../src/commands/setup.ts","../src/utils/prompt.ts","../src/commands/server-add.ts","../src/utils/server-store.ts","../src/services/web-reader.ts","../src/services/system-prompt.ts","../src/services/glm-client.ts","../src/commands/server-remove.ts","../src/commands/server-list.ts","../src/commands/init.ts","../src/adapters/index.ts","../src/adapters/claude-code.ts","../src/adapters/json-file.ts","../src/adapters/env-args.ts","../src/adapters/codex.ts","../src/adapters/gemini-cli.ts","../src/adapters/opencode.ts","../src/adapters/antigravity.ts","../src/adapters/openclaw.ts","../src/adapters/json5-file.ts","../src/utils/resolve-config.ts","../src/commands/add.ts","../src/commands/remove.ts","../src/commands/sync.ts","../src/commands/list.ts"],"sourcesContent":["import { program } from \"commander\";\nimport { configExists } from \"./utils/config.js\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { serverAddCommand } from \"./commands/server-add.js\";\nimport { serverRemoveCommand } from \"./commands/server-remove.js\";\nimport { serverListCommand } from \"./commands/server-list.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { removeCommand } from \"./commands/remove.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { listCommand } from \"./commands/list.js\";\n\nfunction requireSetup(): void {\n if (!configExists()) {\n console.error(\n 'mcpsmgr is not configured. Run \"mcpsmgr setup\" first.',\n );\n process.exit(1);\n }\n}\n\nprogram\n .name(\"mcpsmgr\")\n .description(\"Unified MCP server manager for multiple coding agents\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"setup\")\n .description(\"Initialize mcpsmgr configuration\")\n .action(setupCommand);\n\nconst server = program\n .command(\"server\")\n .description(\"Manage MCP server definitions in central repository\");\n\nserver\n .command(\"add [source]\")\n .description(\"Add an MCP server (URL or GitHub owner/repo)\")\n .action((source?: string) => {\n requireSetup();\n return serverAddCommand(source);\n });\n\nserver\n .command(\"remove <name>\")\n .description(\"Remove an MCP server from central repository\")\n .action((name: string) => {\n requireSetup();\n return serverRemoveCommand(name);\n });\n\nserver\n .command(\"list\")\n .description(\"List all servers in central repository\")\n .action(() => {\n requireSetup();\n return serverListCommand();\n });\n\nprogram\n .command(\"init\")\n .description(\"Initialize MCP servers for current project\")\n .action(() => {\n requireSetup();\n return initCommand();\n });\n\nprogram\n .command(\"add <server-name>\")\n .description(\"Add a server from central repository to current project\")\n .action((serverName: string) => {\n requireSetup();\n return addCommand(serverName);\n });\n\nprogram\n .command(\"remove <server-name>\")\n .description(\"Remove a server from current project agent configs\")\n .action((serverName: string) => {\n requireSetup();\n return removeCommand(serverName);\n });\n\nprogram\n .command(\"sync\")\n .description(\"Sync central repository changes to project agent configs\")\n .action(() => {\n requireSetup();\n return syncCommand();\n });\n\nprogram\n .command(\"list\")\n .description(\"List MCP servers across all agent configs in current project\")\n .action(() => {\n requireSetup();\n return listCommand();\n });\n\nprogram.parse();\n","import { readFile, writeFile, mkdir, chmod } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { GlobalConfig } from \"../types.js\";\nimport { paths } from \"./paths.js\";\n\nexport async function readGlobalConfig(): Promise<GlobalConfig> {\n const raw = await readFile(paths.configFile, \"utf-8\");\n return JSON.parse(raw) as GlobalConfig;\n}\n\nexport async function writeGlobalConfig(config: GlobalConfig): Promise<void> {\n if (!existsSync(paths.baseDir)) {\n await mkdir(paths.baseDir, { recursive: true });\n await chmod(paths.baseDir, 0o700);\n }\n await writeFile(paths.configFile, JSON.stringify(config, null, 2), \"utf-8\");\n await chmod(paths.configFile, 0o600);\n}\n\nexport function configExists(): boolean {\n return existsSync(paths.configFile);\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst BASE_DIR = join(homedir(), \".mcps-manager\");\n\nexport const paths = {\n baseDir: BASE_DIR,\n serversDir: join(BASE_DIR, \"servers\"),\n configFile: join(BASE_DIR, \"config.json\"),\n serverFile: (name: string): string => join(BASE_DIR, \"servers\", `${name}.json`),\n} as const;\n","import { mkdir, chmod } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { input, select, confirm } from \"@inquirer/prompts\";\nimport type { GlobalConfig } from \"../types.js\";\nimport { paths } from \"../utils/paths.js\";\nimport { writeGlobalConfig, configExists } from \"../utils/config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\n\nconst GLM_ENDPOINTS = [\n {\n name: \"Coding Plan (GLM-5)\",\n value: \"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions\",\n },\n {\n name: \"General (GLM-5)\",\n value: \"https://open.bigmodel.cn/api/paas/v4/chat/completions\",\n },\n] as const;\n\nexport async function setupCommand(): Promise<void> {\n try {\n await setupCommandInner();\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function setupCommandInner(): Promise<void> {\n if (configExists()) {\n const overwrite = await confirm({\n message: \"Configuration already exists. Overwrite?\",\n });\n if (!overwrite) {\n console.log(\"Setup cancelled.\");\n return;\n }\n }\n\n if (!existsSync(paths.baseDir)) {\n await mkdir(paths.baseDir, { recursive: true });\n await chmod(paths.baseDir, 0o700);\n }\n if (!existsSync(paths.serversDir)) {\n await mkdir(paths.serversDir, { recursive: true });\n }\n\n const glmApiKey = await input({\n message: \"Enter GLM5 API Key:\",\n validate: (v) => (v.trim().length > 0 ? true : \"API key is required\"),\n });\n\n const glmEndpoint = await select({\n message: \"Select GLM5 endpoint:\",\n choices: GLM_ENDPOINTS.map((e) => ({ name: e.name, value: e.value })),\n });\n\n const config: GlobalConfig = {\n glm: {\n apiKey: glmApiKey.trim(),\n endpoint: glmEndpoint,\n },\n webReader: {\n apiKey: glmApiKey.trim(),\n url: \"https://open.bigmodel.cn/api/mcp/web_reader/mcp\",\n },\n };\n\n await writeGlobalConfig(config);\n console.log(\"Setup complete. Configuration saved to ~/.mcps-manager/config.json\");\n}\n","export function isUserCancellation(error: unknown): boolean {\n return error instanceof Error && error.name === \"ExitPromptError\";\n}\n","import { confirm, input, password } from \"@inquirer/prompts\";\nimport type { DefaultConfig, ServerDefinition, StdioConfig } from \"../types.js\";\nimport { readGlobalConfig } from \"../utils/config.js\";\nimport {\n serverExists,\n writeServerDefinition,\n} from \"../utils/server-store.js\";\nimport {\n isValidInput,\n buildUserMessage,\n analyzeWithGlm,\n type AnalysisResult,\n} from \"../services/glm-client.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\n\nexport async function serverAddCommand(source?: string): Promise<void> {\n try {\n await serverAddCommandInner(source);\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function serverAddCommandInner(source?: string): Promise<void> {\n const urlInput =\n source ??\n (await input({\n message: \"Enter MCP server URL or GitHub owner/repo (leave empty for manual):\",\n }));\n\n if (urlInput.trim() === \"\") {\n await manualAddFlow();\n return;\n }\n\n const validation = isValidInput(urlInput.trim());\n if (!validation.valid) {\n console.error(`Error: ${validation.reason}`);\n process.exitCode = 1;\n return;\n }\n\n const config = await readGlobalConfig();\n\n console.log(\"Analyzing documentation with GLM5...\");\n let analysis: AnalysisResult;\n try {\n const userMessage = buildUserMessage(urlInput.trim());\n analysis = await analyzeWithGlm(config, userMessage);\n } catch (error) {\n console.error(\n `GLM5 analysis failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n const fallback = await confirm({\n message: \"Would you like to configure manually instead?\",\n });\n if (fallback) {\n await manualAddFlow();\n }\n return;\n }\n\n displayAnalysisResult(analysis, urlInput.trim());\n\n const trust = await confirm({\n message: \"Trust this analysis result?\",\n });\n\n if (!trust) {\n const manual = await confirm({\n message: \"Configure manually instead?\",\n });\n if (manual) {\n await manualAddFlow();\n }\n return;\n }\n\n if (serverExists(analysis.name)) {\n console.error(\n `Error: Server \"${analysis.name}\" already exists. Run \"mcpsmgr server remove ${analysis.name}\" first.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const env: Record<string, string> = {};\n for (const varName of analysis.requiredEnvVars) {\n const value = await password({\n message: `Enter value for ${varName} (stored locally, never sent to servers):`,\n mask: \"*\",\n });\n env[varName] = value;\n }\n\n const defaultConfig: DefaultConfig =\n analysis.default.transport === \"stdio\"\n ? {\n transport: \"stdio\",\n command: analysis.default.command ?? \"\",\n args: [...(analysis.default.args ?? [])],\n env: { ...(analysis.default.env ?? {}), ...env },\n }\n : {\n transport: \"http\",\n url: analysis.default.url ?? \"\",\n headers: { ...(analysis.default.headers ?? {}) },\n };\n\n const definition: ServerDefinition = {\n name: analysis.name,\n source: urlInput.trim(),\n default: defaultConfig,\n overrides: analysis.overrides as ServerDefinition[\"overrides\"],\n };\n\n await writeServerDefinition(definition);\n console.log(`Server \"${analysis.name}\" saved to central repository.`);\n}\n\nfunction displayAnalysisResult(result: AnalysisResult, source: string): void {\n console.log(\"\\n--- Analysis Result ---\");\n console.log(`Name: ${result.name}`);\n console.log(`Source: ${source}`);\n console.log(`Transport: ${result.default.transport}`);\n if (result.default.transport === \"stdio\") {\n console.log(`Command: ${result.default.command}`);\n console.log(`Args: ${JSON.stringify(result.default.args)}`);\n } else {\n console.log(`URL: ${result.default.url}`);\n }\n if (Object.keys(result.overrides).length > 0) {\n console.log(\"Agent overrides:\");\n for (const [agent, override] of Object.entries(result.overrides)) {\n console.log(` ${agent}: ${JSON.stringify(override)}`);\n }\n }\n if (result.requiredEnvVars.length > 0) {\n console.log(\n `Required env vars: ${result.requiredEnvVars.join(\", \")}`,\n );\n }\n console.log(\"---\\n\");\n}\n\nasync function manualAddFlow(): Promise<void> {\n const name = await input({\n message: \"Server name (kebab-case):\",\n validate: (v) =>\n /^[a-z][a-z0-9-]*$/.test(v.trim()) ? true : \"Must be kebab-case\",\n });\n\n if (serverExists(name.trim())) {\n console.error(\n `Error: Server \"${name.trim()}\" already exists. Run \"mcpsmgr server remove ${name.trim()}\" first.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const source = await input({\n message: \"Source URL (optional):\",\n });\n\n const command = await input({\n message: \"Command (e.g., npx):\",\n validate: (v) => (v.trim().length > 0 ? true : \"Command is required\"),\n });\n\n const argsStr = await input({\n message: \"Args (comma-separated, e.g., -y,@scope/package):\",\n });\n const args = argsStr\n .trim()\n .split(\",\")\n .map((a) => a.trim())\n .filter((a) => a.length > 0);\n\n const envPairs: Record<string, string> = {};\n let addMore = true;\n while (addMore) {\n const envName = await input({\n message: \"Env var name (leave empty to finish):\",\n });\n if (envName.trim() === \"\") break;\n const envValue = await password({\n message: `Value for ${envName.trim()} (stored locally, never sent to servers):`,\n mask: \"*\",\n });\n envPairs[envName.trim()] = envValue;\n addMore = true;\n }\n\n const config: StdioConfig = {\n transport: \"stdio\",\n command: command.trim(),\n args,\n env: envPairs,\n };\n\n const definition: ServerDefinition = {\n name: name.trim(),\n source: source.trim(),\n default: config,\n overrides: {},\n };\n\n await writeServerDefinition(definition);\n console.log(`Server \"${name.trim()}\" saved to central repository.`);\n}\n","import { readFile, writeFile, readdir, unlink, mkdir, chmod } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { ServerDefinition } from \"../types.js\";\nimport { paths } from \"./paths.js\";\n\nexport async function readServerDefinition(\n name: string,\n): Promise<ServerDefinition | undefined> {\n const filePath = paths.serverFile(name);\n if (!existsSync(filePath)) {\n return undefined;\n }\n const raw = await readFile(filePath, \"utf-8\");\n return JSON.parse(raw) as ServerDefinition;\n}\n\nexport async function writeServerDefinition(\n definition: ServerDefinition,\n): Promise<void> {\n if (!existsSync(paths.serversDir)) {\n await mkdir(paths.serversDir, { recursive: true });\n }\n const filePath = paths.serverFile(definition.name);\n await writeFile(filePath, JSON.stringify(definition, null, 2), \"utf-8\");\n await chmod(filePath, 0o600);\n}\n\nexport async function removeServerDefinition(name: string): Promise<boolean> {\n const filePath = paths.serverFile(name);\n if (!existsSync(filePath)) {\n return false;\n }\n await unlink(filePath);\n return true;\n}\n\nexport async function listServerDefinitions(): Promise<ServerDefinition[]> {\n if (!existsSync(paths.serversDir)) {\n return [];\n }\n const files = await readdir(paths.serversDir);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n const results: ServerDefinition[] = [];\n for (const file of jsonFiles) {\n const raw = await readFile(\n paths.serverFile(file.replace(\".json\", \"\")),\n \"utf-8\",\n );\n results.push(JSON.parse(raw) as ServerDefinition);\n }\n return results;\n}\n\nexport function serverExists(name: string): boolean {\n return existsSync(paths.serverFile(name));\n}\n","import type { GlobalConfig } from \"../types.js\";\n\ninterface McpResponse {\n readonly jsonrpc: string;\n readonly id: number;\n readonly result?: {\n readonly content?: readonly { readonly type: string; readonly text: string }[];\n readonly isError?: boolean;\n };\n readonly error?: { readonly code: number; readonly message: string };\n}\n\nfunction parseSseResponse(raw: string): McpResponse {\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"data:\")) {\n return JSON.parse(line.slice(5)) as McpResponse;\n }\n }\n return JSON.parse(raw) as McpResponse;\n}\n\nasync function mcpInitialize(\n endpoint: string,\n apiKey: string,\n): Promise<string> {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2025-03-26\",\n capabilities: {},\n clientInfo: { name: \"mcpsmgr\", version: \"0.1.0\" },\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `MCP initialize failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const sessionId = response.headers.get(\"mcp-session-id\");\n if (!sessionId) {\n throw new Error(\"MCP server did not return session ID\");\n }\n\n return sessionId;\n}\n\nasync function mcpToolCall(\n endpoint: string,\n apiKey: string,\n sessionId: string,\n toolName: string,\n args: Record<string, unknown>,\n): Promise<string> {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n Authorization: `Bearer ${apiKey}`,\n \"Mcp-Session-Id\": sessionId,\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 2,\n method: \"tools/call\",\n params: { name: toolName, arguments: args },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `MCP tools/call failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const raw = await response.text();\n const parsed = parseSseResponse(raw);\n\n if (parsed.error) {\n throw new Error(`MCP error: ${parsed.error.message}`);\n }\n\n const contents = parsed.result?.content ?? [];\n const full = contents.map((c) => c.text).join(\"\\n\");\n const MAX_CONTENT_LENGTH = 30000;\n if (full.length > MAX_CONTENT_LENGTH) {\n return full.slice(0, MAX_CONTENT_LENGTH) + \"\\n\\n[Content truncated]\";\n }\n return full;\n}\n\nlet cachedSessionId: string | undefined;\n\nexport async function fetchWebContent(\n config: GlobalConfig,\n url: string,\n): Promise<string> {\n const endpoint = config.webReader.url;\n const apiKey = config.webReader.apiKey;\n\n if (!cachedSessionId) {\n cachedSessionId = await mcpInitialize(endpoint, apiKey);\n }\n\n try {\n return await mcpToolCall(endpoint, apiKey, cachedSessionId, \"webReader\", {\n url,\n timeout: 20,\n });\n } catch {\n cachedSessionId = await mcpInitialize(endpoint, apiKey);\n return await mcpToolCall(endpoint, apiKey, cachedSessionId, \"webReader\", {\n url,\n timeout: 20,\n });\n }\n}\n","export const ANALYSIS_SYSTEM_PROMPT = `You are an MCP (Model Context Protocol) server configuration analyst. Your task is to analyze documentation for an MCP server and extract configuration details for 5 different coding agents.\n\nThe 5 agents and their configuration differences:\n\n1. **Claude Code** (.mcp.json)\n - Format: { \"type\": \"stdio\"|\"http\", \"command\": \"...\", \"args\": [...] }\n - HTTP: { \"type\": \"http\", \"url\": \"...\", \"headers\": {...} }\n - IMPORTANT: Do NOT use \"env\" field. Environment variables will be handled separately.\n\n2. **Codex** (.codex/config.toml)\n - TOML format: command = \"...\", args = [...]\n - Same key names as Claude Code but in TOML\n - IMPORTANT: Do NOT use \"env\" field.\n\n3. **Gemini CLI** (.gemini/settings.json)\n - Format: { \"command\": \"...\", \"args\": [...] }\n - No \"type\" field needed\n - IMPORTANT: Do NOT use \"env\" field.\n\n4. **OpenCode** (opencode.json)\n - Format: { \"type\": \"local\"|\"remote\", \"command\": [\"cmd\", \"arg1\", ...] }\n - command is an ARRAY including the command itself\n - type is \"local\" for stdio, \"remote\" for http\n - IMPORTANT: Do NOT use \"environment\" field.\n\n5. **Antigravity** (~/.gemini/antigravity/mcp_config.json)\n - Format: { \"command\": \"...\", \"args\": [...] }\n - HTTP: { \"serverUrl\": \"...\", \"headers\": {...} } (note: \"serverUrl\" not \"url\")\n - IMPORTANT: Do NOT use \"env\" field.\n\nYou have access to a webReader tool to fetch web page content. Use it to read the documentation URL provided.\n\nAfter analyzing the documentation, return a JSON object with this exact structure:\n\\`\\`\\`json\n{\n \"name\": \"server-name\",\n \"default\": {\n \"transport\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@scope/package\"],\n },\n \"overrides\": {\n \"opencode\": {\n \"transport\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@scope/package\"],\n \"env\": {}\n }\n },\n \"requiredEnvVars\": [\"API_KEY\"]\n}\n\\`\\`\\`\n\nRules:\n- \"name\" should be a kebab-case identifier for the server\n- \"default\" should be the most common configuration (usually works for Claude Code, Codex, Gemini CLI)\n- Only add \"overrides\" for agents that need DIFFERENT configuration from the default\n- OpenCode usually needs an override because its command format differs (array vs string+args)\n- \"requiredEnvVars\" lists environment variable names the user needs to provide values for\n- Transport is either \"stdio\" or \"http\"\n- Return ONLY the JSON object, no markdown fences, no explanation`;\n","import type { GlobalConfig } from \"../types.js\";\nimport { fetchWebContent } from \"./web-reader.js\";\nimport { ANALYSIS_SYSTEM_PROMPT } from \"./system-prompt.js\";\n\ninterface GlmMessage {\n readonly role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n readonly content: string | null;\n readonly tool_calls?: readonly GlmToolCall[];\n readonly tool_call_id?: string;\n}\n\ninterface GlmToolCall {\n readonly id: string;\n readonly type: \"function\";\n readonly function: {\n readonly name: string;\n readonly arguments: string;\n };\n}\n\ninterface GlmResponse {\n readonly choices: readonly {\n readonly message: GlmMessage;\n readonly finish_reason: string;\n }[];\n}\n\nconst WEB_READER_TOOL = {\n type: \"function\" as const,\n function: {\n name: \"webReader\",\n description: \"Fetch and read the content of a web page given its URL\",\n parameters: {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"The URL of the web page to read\",\n },\n },\n required: [\"url\"],\n },\n },\n};\n\nexport interface AnalysisResult {\n readonly name: string;\n readonly default: {\n readonly transport: \"stdio\" | \"http\";\n readonly command?: string;\n readonly args?: readonly string[];\n readonly env?: Readonly<Record<string, string>>;\n readonly url?: string;\n readonly headers?: Readonly<Record<string, string>>;\n };\n readonly overrides: Readonly<Record<string, unknown>>;\n readonly requiredEnvVars: readonly string[];\n}\n\nasync function callGlm(\n config: GlobalConfig,\n messages: GlmMessage[],\n): Promise<GlmResponse> {\n const response = await fetch(config.glm.endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.glm.apiKey}`,\n },\n body: JSON.stringify({\n model: \"glm-5\",\n messages,\n tools: [WEB_READER_TOOL],\n tool_choice: \"auto\",\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `GLM5 API request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return (await response.json()) as GlmResponse;\n}\n\nexport async function analyzeWithGlm(\n config: GlobalConfig,\n userMessage: string,\n): Promise<AnalysisResult> {\n const messages: GlmMessage[] = [\n { role: \"system\", content: ANALYSIS_SYSTEM_PROMPT },\n { role: \"user\", content: userMessage },\n ];\n\n const MAX_ROUNDS = 10;\n for (let round = 0; round < MAX_ROUNDS; round++) {\n const response = await callGlm(config, messages);\n const choice = response.choices.at(0);\n if (!choice) {\n throw new Error(\"GLM5 returned empty response\");\n }\n\n const assistantMessage = choice.message;\n messages.push({\n role: \"assistant\",\n content: assistantMessage.content,\n tool_calls: assistantMessage.tool_calls,\n });\n\n if (\n !assistantMessage.tool_calls ||\n assistantMessage.tool_calls.length === 0\n ) {\n return parseAnalysisResult(assistantMessage.content ?? \"\");\n }\n\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.function.name === \"webReader\") {\n const args = JSON.parse(toolCall.function.arguments) as {\n url: string;\n };\n let toolResult: string;\n try {\n toolResult = await fetchWebContent(config, args.url);\n } catch (error) {\n toolResult = `Error fetching URL: ${error instanceof Error ? error.message : String(error)}`;\n }\n messages.push({\n role: \"tool\",\n content: toolResult,\n tool_call_id: toolCall.id,\n });\n }\n }\n }\n\n throw new Error(\"GLM5 analysis exceeded maximum rounds\");\n}\n\nfunction parseAnalysisResult(content: string): AnalysisResult {\n const cleaned = content\n .replace(/```json\\s*/g, \"\")\n .replace(/```\\s*/g, \"\")\n .trim();\n\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(`Cannot extract JSON from GLM5 response: ${cleaned.slice(0, 200)}`);\n }\n\n const result = JSON.parse(jsonMatch[0]) as AnalysisResult;\n if (!result.name || !result.default) {\n throw new Error(\"Invalid analysis result: missing name or default config\");\n }\n\n return result;\n}\n\nexport function buildUserMessage(input: string): string {\n if (isGitHubRepo(input)) {\n const url = `https://github.com/${input}`;\n return `Please analyze the MCP server at ${url}. Start by reading the README at ${url}/blob/main/README.md`;\n }\n return `Please analyze the MCP server documentation at: ${input}`;\n}\n\nexport function isGitHubRepo(input: string): boolean {\n if (input.startsWith(\"http\") || input.startsWith(\"@\")) {\n return false;\n }\n const parts = input.split(\"/\");\n return parts.length === 2 && parts.every((p) => p.length > 0);\n}\n\nexport function isValidInput(\n input: string,\n): { valid: true } | { valid: false; reason: string } {\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n return { valid: true };\n }\n if (isGitHubRepo(input)) {\n return { valid: true };\n }\n return {\n valid: false,\n reason:\n 'Invalid input format. Provide a URL (https://...) or GitHub owner/repo (e.g., \"anthropics/mcp-brave-search\")',\n };\n}\n","import { removeServerDefinition, serverExists } from \"../utils/server-store.js\";\n\nexport async function serverRemoveCommand(name: string): Promise<void> {\n if (!serverExists(name)) {\n console.error(`Error: Server \"${name}\" does not exist in central repository.`);\n process.exitCode = 1;\n return;\n }\n\n await removeServerDefinition(name);\n console.log(`Server \"${name}\" removed from central repository.`);\n}\n","import { listServerDefinitions } from \"../utils/server-store.js\";\n\nexport async function serverListCommand(): Promise<void> {\n const servers = await listServerDefinitions();\n\n if (servers.length === 0) {\n console.log(\"No servers in central repository. Use \\\"mcpsmgr server add\\\" to add one.\");\n return;\n }\n\n console.log(\"\\nCentral Repository Servers:\\n\");\n for (const server of servers) {\n const overrideCount = Object.keys(server.overrides).length;\n const overrideInfo =\n overrideCount > 0 ? ` (${overrideCount} overrides)` : \"\";\n console.log(\n ` ${server.name} [${server.default.transport}]${overrideInfo}`,\n );\n if (server.source) {\n console.log(` source: ${server.source}`);\n }\n }\n console.log();\n}\n","import { checkbox, confirm } from \"@inquirer/prompts\";\nimport { allAdapters, detectAgents } from \"../adapters/index.js\";\nimport { listServerDefinitions } from \"../utils/server-store.js\";\nimport { resolveConfig } from \"../utils/resolve-config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\nexport async function initCommand(): Promise<void> {\n try {\n await initCommandInner();\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function initCommandInner(): Promise<void> {\n const projectDir = process.cwd();\n\n const servers = await listServerDefinitions();\n if (servers.length === 0) {\n console.log(\n \"Central repository is empty. Use \\\"mcpsmgr server add\\\" to add servers first.\",\n );\n return;\n }\n\n const detected = detectAgents(projectDir);\n const detectedIds = new Set(detected.map((a) => a.id));\n\n const selectedAgents = await checkbox<AgentAdapter>({\n message: \"Select agents to configure:\",\n choices: allAdapters.map((adapter) => ({\n name: `${adapter.name}${detectedIds.has(adapter.id) ? \" (detected)\" : \"\"}${adapter.isGlobal ? \" [global]\" : \"\"}`,\n value: adapter,\n checked: detectedIds.has(adapter.id) && !adapter.isGlobal,\n })),\n });\n\n if (selectedAgents.length === 0) {\n console.log(\"No agents selected.\");\n return;\n }\n\n const agentServerMap = new Map<string, Set<string>>();\n const detectedServers = new Set<string>();\n for (const agent of selectedAgents) {\n try {\n const existing = await agent.read(projectDir);\n const names = new Set(Object.keys(existing));\n agentServerMap.set(agent.id, names);\n for (const name of names) {\n detectedServers.add(name);\n }\n } catch {\n // silent fallback per design decision\n }\n }\n\n const selectedServers = await checkbox({\n message: \"Select servers to deploy:\",\n choices: servers.map((s) => ({\n name: `${s.name}${detectedServers.has(s.name) ? \" (detected)\" : \"\"} [${s.default.transport}]`,\n value: s,\n checked: detectedServers.has(s.name),\n })),\n });\n\n const selectedServerNames = new Set(selectedServers.map((s) => s.name));\n\n const removals = new Map<string, AgentAdapter[]>();\n for (const serverName of detectedServers) {\n if (!selectedServerNames.has(serverName)) {\n const agents = selectedAgents.filter((a) => {\n const agentServers = agentServerMap.get(a.id);\n return agentServers?.has(serverName);\n });\n if (agents.length > 0) {\n removals.set(serverName, agents);\n }\n }\n }\n\n if (selectedServers.length === 0 && removals.size === 0) {\n console.log(\"No servers selected.\");\n return;\n }\n\n console.log(\"\\nPlan:\");\n for (const agent of selectedAgents) {\n console.log(` ${agent.name}:`);\n for (const server of selectedServers) {\n console.log(` + ${server.name}`);\n }\n for (const [serverName, agents] of removals) {\n if (agents.some((a) => a.id === agent.id)) {\n console.log(` - ${serverName}`);\n }\n }\n }\n\n const proceed = await confirm({ message: \"Proceed?\" });\n if (!proceed) {\n console.log(\"Cancelled.\");\n return;\n }\n\n for (const agent of selectedAgents) {\n for (const server of selectedServers) {\n try {\n const config = resolveConfig(server, agent);\n await agent.write(projectDir, server.name, config);\n console.log(` + ${server.name} -> ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${server.name} -> ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n for (const [serverName, agents] of removals) {\n for (const agent of agents) {\n try {\n await agent.remove(projectDir, serverName);\n console.log(` - ${serverName} <- ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${serverName} <- ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n console.log(\"\\nDone.\");\n}\n","import { existsSync } from \"node:fs\";\nimport type { AgentAdapter, AgentId } from \"../types.js\";\nimport { claudeCodeAdapter } from \"./claude-code.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { geminiCliAdapter } from \"./gemini-cli.js\";\nimport { opencodeAdapter } from \"./opencode.js\";\nimport { antigravityAdapter } from \"./antigravity.js\";\nimport { openclawAdapter } from \"./openclaw.js\";\n\nexport const allAdapters: readonly AgentAdapter[] = [\n claudeCodeAdapter,\n codexAdapter,\n geminiCliAdapter,\n opencodeAdapter,\n antigravityAdapter,\n openclawAdapter,\n];\n\nexport function getAdapter(id: AgentId): AgentAdapter {\n const adapter = allAdapters.find((a) => a.id === id);\n if (!adapter) {\n throw new Error(`Unknown agent: ${id}`);\n }\n return adapter;\n}\n\nexport function detectAgents(projectDir: string): AgentAdapter[] {\n return allAdapters.filter((adapter) => {\n if (adapter.isGlobal) {\n return existsSync(adapter.configPath(projectDir));\n }\n return existsSync(adapter.configPath(projectDir));\n });\n}\n","import { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n type: \"stdio\",\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n type: \"stdio\",\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n type: \"http\",\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n const type = raw[\"type\"] as string | undefined;\n if (type === \"stdio\") {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (type === \"http\") {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: \"claude-code\",\n name: \"Claude Code\",\n configPath: (projectDir) => join(projectDir, \".mcp.json\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n return (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Claude Code config`,\n );\n }\n const updated = {\n ...data,\n mcpServers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(filePath, { ...data, mcpServers: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport async function readJsonFile(\n filePath: string,\n): Promise<Record<string, unknown>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const raw = await readFile(filePath, \"utf-8\");\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nexport async function writeJsonFile(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n","const ENV_VAR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*=/;\n\nexport function buildEnvArgs(\n env: Readonly<Record<string, string>>,\n): string[] {\n return Object.entries(env).map(([key, value]) => `${key}=${value}`);\n}\n\nexport function parseEnvArgs(args: readonly string[]): {\n readonly env: Record<string, string>;\n readonly commandIndex: number;\n} {\n const env: Record<string, string> = {};\n for (let i = 0; i < args.length; i++) {\n if (ENV_VAR_PATTERN.test(args[i])) {\n const eqIndex = args[i].indexOf(\"=\");\n env[args[i].slice(0, eqIndex)] = args[i].slice(eqIndex + 1);\n } else {\n return { env, commandIndex: i };\n }\n }\n return { env, commandIndex: args.length };\n}\n\nexport function resolveEnvInArgs(\n args: readonly string[],\n env: Readonly<Record<string, string>>,\n): {\n readonly resolvedArgs: string[];\n readonly remainingEnv: Record<string, string>;\n} {\n const substitutedKeys = new Set<string>();\n const resolvedArgs = args.map((arg) =>\n arg.replace(/\\$\\{([^}]+)\\}/g, (match, varName: string) => {\n if (varName in env) {\n substitutedKeys.add(varName);\n return env[varName];\n }\n return match;\n }),\n );\n\n const remainingEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n if (!substitutedKeys.has(key)) {\n remainingEnv[key] = value;\n }\n }\n\n return { resolvedArgs, remainingEnv };\n}\n","import { join } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (raw[\"command\"]) {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (raw[\"url\"]) {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nasync function readTomlFile(\n filePath: string,\n): Promise<{ raw: string; parsed: Record<string, unknown> }> {\n if (!existsSync(filePath)) {\n return { raw: \"\", parsed: {} };\n }\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = parseToml(raw) as Record<string, unknown>;\n return { raw, parsed };\n}\n\nasync function writeTomlFile(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(filePath, stringifyToml(data) + \"\\n\", \"utf-8\");\n}\n\nexport const codexAdapter: AgentAdapter = {\n id: \"codex\",\n name: \"Codex\",\n configPath: (projectDir) => join(projectDir, \".codex\", \"config.toml\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n return (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n const servers = (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Codex config`,\n );\n }\n const updated = {\n ...parsed,\n mcp_servers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeTomlFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n const servers = (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeTomlFile(filePath, { ...parsed, mcp_servers: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n const servers = (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (raw[\"command\"]) {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (raw[\"url\"]) {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const geminiCliAdapter: AgentAdapter = {\n id: \"gemini-cli\",\n name: \"Gemini CLI\",\n configPath: (projectDir) => join(projectDir, \".gemini\", \"settings.json\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n return (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Gemini CLI config`,\n );\n }\n const updated = {\n ...data,\n mcpServers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(filePath, { ...data, mcpServers: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n type: \"local\",\n command: [\"env\", ...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n type: \"local\",\n command: [config.command, ...resolvedArgs],\n };\n }\n return {\n type: \"remote\",\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n const type = raw[\"type\"] as string | undefined;\n if (type === \"local\") {\n const commandArr = raw[\"command\"] as string[];\n const legacyEnv = raw[\"environment\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n const [command = \"\", ...args] = commandArr;\n return { transport: \"stdio\", command, args, env: legacyEnv };\n }\n\n if (commandArr[0] === \"env\") {\n const { env, commandIndex } = parseEnvArgs(commandArr.slice(1));\n const actualIndex = commandIndex + 1;\n return {\n transport: \"stdio\",\n command: commandArr[actualIndex] ?? \"\",\n args: commandArr.slice(actualIndex + 1),\n env,\n };\n }\n\n const [command = \"\", ...args] = commandArr;\n return { transport: \"stdio\", command, args, env: {} };\n }\n if (type === \"remote\") {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const opencodeAdapter: AgentAdapter = {\n id: \"opencode\",\n name: \"OpenCode\",\n configPath: (projectDir) => join(projectDir, \"opencode.json\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n return (data[\"mcp\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcp\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in OpenCode config`,\n );\n }\n const updated = {\n ...data,\n mcp: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcp\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(filePath, { ...data, mcp: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcp\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nconst GLOBAL_CONFIG_PATH = join(\n homedir(),\n \".gemini\",\n \"antigravity\",\n \"mcp_config.json\",\n);\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n serverUrl: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (raw[\"command\"]) {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (raw[\"serverUrl\"]) {\n return {\n transport: \"http\",\n url: raw[\"serverUrl\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const antigravityAdapter: AgentAdapter = {\n id: \"antigravity\",\n name: \"Antigravity\",\n configPath: () => GLOBAL_CONFIG_PATH,\n isGlobal: true,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read() {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n return (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(_projectDir, serverName, config) {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Antigravity config`,\n );\n }\n const updated = {\n ...data,\n mcpServers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(GLOBAL_CONFIG_PATH, updated);\n },\n\n async remove(_projectDir, serverName) {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(GLOBAL_CONFIG_PATH, { ...data, mcpServers: rest });\n },\n\n async has(_projectDir, serverName) {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJson5File, writeJson5File } from \"./json5-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nconst GLOBAL_CONFIG_PATH = join(\n homedir(),\n \".openclaw\",\n \"openclaw.json\",\n);\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (raw[\"command\"]) {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (raw[\"url\"]) {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const openclawAdapter: AgentAdapter = {\n id: \"openclaw\",\n name: \"OpenClaw\",\n configPath: () => GLOBAL_CONFIG_PATH,\n isGlobal: true,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read() {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n return (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(_projectDir, serverName, config) {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in OpenClaw config`,\n );\n }\n const updated = {\n ...data,\n mcpServers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJson5File(GLOBAL_CONFIG_PATH, updated);\n },\n\n async remove(_projectDir, serverName) {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJson5File(GLOBAL_CONFIG_PATH, { ...data, mcpServers: rest });\n },\n\n async has(_projectDir, serverName) {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport JSON5 from \"json5\";\n\nexport async function readJson5File(\n filePath: string,\n): Promise<Record<string, unknown>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const raw = await readFile(filePath, \"utf-8\");\n return JSON5.parse(raw) as Record<string, unknown>;\n}\n\nexport async function writeJson5File(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n","import type { AgentAdapter, DefaultConfig, ServerDefinition } from \"../types.js\";\n\nexport function resolveConfig(\n definition: ServerDefinition,\n adapter: AgentAdapter,\n): DefaultConfig {\n const override = definition.overrides[adapter.id];\n if (override) {\n const base = definition.default;\n return { ...base, ...override } as DefaultConfig;\n }\n return definition.default;\n}\n","import { checkbox } from \"@inquirer/prompts\";\nimport { detectAgents } from \"../adapters/index.js\";\nimport { readServerDefinition, serverExists } from \"../utils/server-store.js\";\nimport { resolveConfig } from \"../utils/resolve-config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\nexport async function addCommand(serverName: string): Promise<void> {\n try {\n await addCommandInner(serverName);\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function addCommandInner(serverName: string): Promise<void> {\n const projectDir = process.cwd();\n\n if (!serverExists(serverName)) {\n console.error(\n `Error: Server \"${serverName}\" not found in central repository.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const definition = await readServerDefinition(serverName);\n if (!definition) {\n console.error(`Error: Failed to read server definition for \"${serverName}\".`);\n process.exitCode = 1;\n return;\n }\n\n const detected = detectAgents(projectDir);\n if (detected.length === 0) {\n console.log(\n \"No agent config files detected in this project. Use \\\"mcpsmgr init\\\" first.\",\n );\n return;\n }\n\n const selectedAgents = await checkbox<AgentAdapter>({\n message: `Select agents to add \"${serverName}\" to:`,\n choices: detected.map((adapter) => ({\n name: `${adapter.name}${adapter.isGlobal ? \" [global]\" : \"\"}`,\n value: adapter,\n checked: !adapter.isGlobal,\n })),\n });\n\n if (selectedAgents.length === 0) {\n console.log(\"No agents selected.\");\n return;\n }\n\n for (const agent of selectedAgents) {\n try {\n const config = resolveConfig(definition, agent);\n await agent.write(projectDir, serverName, config);\n console.log(` + ${serverName} -> ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${serverName} -> ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import { checkbox } from \"@inquirer/prompts\";\nimport { allAdapters } from \"../adapters/index.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\nexport async function removeCommand(serverName: string): Promise<void> {\n try {\n await removeCommandInner(serverName);\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function removeCommandInner(serverName: string): Promise<void> {\n const projectDir = process.cwd();\n\n const agentsWithServer: AgentAdapter[] = [];\n for (const adapter of allAdapters) {\n try {\n const has = await adapter.has(projectDir, serverName);\n if (has) {\n agentsWithServer.push(adapter);\n }\n } catch {\n // config file doesn't exist, skip\n }\n }\n\n if (agentsWithServer.length === 0) {\n console.log(\n `Server \"${serverName}\" not found in any agent configuration.`,\n );\n return;\n }\n\n const selectedAgents = await checkbox<AgentAdapter>({\n message: `Remove \"${serverName}\" from which agents?`,\n choices: agentsWithServer.map((adapter) => ({\n name: `${adapter.name}${adapter.isGlobal ? \" [global]\" : \"\"}`,\n value: adapter,\n checked: !adapter.isGlobal,\n })),\n });\n\n if (selectedAgents.length === 0) {\n console.log(\"No agents selected.\");\n return;\n }\n\n for (const agent of selectedAgents) {\n try {\n await agent.remove(projectDir, serverName);\n console.log(` - ${serverName} <- ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${serverName} <- ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import { confirm } from \"@inquirer/prompts\";\nimport { allAdapters } from \"../adapters/index.js\";\nimport { listServerDefinitions } from \"../utils/server-store.js\";\nimport { resolveConfig } from \"../utils/resolve-config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\n\nexport async function syncCommand(): Promise<void> {\n try {\n await syncCommandInner();\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function syncCommandInner(): Promise<void> {\n const projectDir = process.cwd();\n\n const definitions = await listServerDefinitions();\n if (definitions.length === 0) {\n console.log(\"Central repository is empty. Nothing to sync.\");\n return;\n }\n\n const changes: Array<{\n agentName: string;\n serverName: string;\n action: \"update\" | \"skip\";\n reason?: string;\n }> = [];\n\n for (const adapter of allAdapters) {\n let servers: Record<string, unknown>;\n try {\n servers = await adapter.read(projectDir);\n } catch {\n continue;\n }\n\n for (const definition of definitions) {\n if (!(definition.name in servers)) {\n continue;\n }\n\n const currentRaw = servers[definition.name] as Record<string, unknown>;\n const desired = resolveConfig(definition, adapter);\n const desiredRaw = adapter.toAgentFormat(desired);\n\n if (JSON.stringify(currentRaw) !== JSON.stringify(desiredRaw)) {\n changes.push({\n agentName: adapter.name,\n serverName: definition.name,\n action: \"update\",\n });\n }\n }\n }\n\n if (changes.length === 0) {\n console.log(\"All agent configurations are up to date.\");\n return;\n }\n\n console.log(\"\\nSync preview:\");\n for (const change of changes) {\n console.log(` ~ ${change.serverName} -> ${change.agentName}`);\n }\n\n const proceed = await confirm({ message: \"Apply changes?\" });\n if (!proceed) {\n console.log(\"Cancelled.\");\n return;\n }\n\n for (const adapter of allAdapters) {\n for (const definition of definitions) {\n const relevant = changes.find(\n (c) =>\n c.agentName === adapter.name &&\n c.serverName === definition.name,\n );\n if (!relevant) continue;\n\n try {\n await adapter.remove(projectDir, definition.name);\n const config = resolveConfig(definition, adapter);\n await adapter.write(projectDir, definition.name, config);\n console.log(` ~ ${definition.name} -> ${adapter.name} (updated)`);\n } catch (error) {\n console.warn(\n ` ! ${definition.name} -> ${adapter.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n console.log(\"\\nSync complete.\");\n}\n","import { allAdapters } from \"../adapters/index.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\ninterface ServerEntry {\n transport: string;\n}\n\nexport async function listCommand(): Promise<void> {\n const projectDir = process.cwd();\n\n const matrix: Record<string, Record<string, ServerEntry>> = {};\n const activeAdapters: AgentAdapter[] = [];\n\n for (const adapter of allAdapters) {\n let servers: Record<string, unknown>;\n try {\n servers = await adapter.read(projectDir);\n } catch {\n continue;\n }\n\n if (Object.keys(servers).length === 0) continue;\n\n activeAdapters.push(adapter);\n for (const [name, raw] of Object.entries(servers)) {\n if (!matrix[name]) {\n matrix[name] = {};\n }\n const config = adapter.fromAgentFormat(\n name,\n raw as Record<string, unknown>,\n );\n matrix[name][adapter.id] = {\n transport: config?.transport ?? \"?\",\n };\n }\n }\n\n if (Object.keys(matrix).length === 0) {\n console.log(\n \"No MCP servers found in any agent configuration. Use \\\"mcpsmgr init\\\" to get started.\",\n );\n return;\n }\n\n const serverNames = Object.keys(matrix).sort();\n const agentIds = activeAdapters.map((a) => a.id);\n const agentNames = activeAdapters.map((a) => a.name);\n\n const colWidths = [\n Math.max(6, ...serverNames.map((n) => n.length)),\n ...agentNames.map((n) => Math.max(n.length, 5)),\n ];\n\n const header = [\n \"Server\".padEnd(colWidths.at(0) ?? 6),\n ...agentNames.map((n, i) => n.padEnd(colWidths.at(i + 1) ?? 5)),\n ].join(\" \");\n\n const separator = colWidths.map((w) => \"-\".repeat(w)).join(\" \");\n\n console.log(`\\n${header}`);\n console.log(separator);\n\n for (const name of serverNames) {\n const cells = [\n name.padEnd(colWidths.at(0) ?? 6),\n ...agentIds.map((id, i) => {\n const entry = matrix[name][id];\n const val = entry ? entry.transport : \"-\";\n return val.padEnd(colWidths.at(i + 1) ?? 5);\n }),\n ];\n console.log(cells.join(\" \"));\n }\n console.log();\n}\n"],"mappings":";;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,UAAU,WAAW,OAAO,aAAa;AAClD,SAAS,kBAAkB;;;ACD3B,SAAS,eAAe;AACxB,SAAS,YAAY;AAErB,IAAM,WAAW,KAAK,QAAQ,GAAG,eAAe;AAEzC,IAAM,QAAQ;AAAA,EACnB,SAAS;AAAA,EACT,YAAY,KAAK,UAAU,SAAS;AAAA,EACpC,YAAY,KAAK,UAAU,aAAa;AAAA,EACxC,YAAY,CAAC,SAAyB,KAAK,UAAU,WAAW,GAAG,IAAI,OAAO;AAChF;;;ADLA,eAAsB,mBAA0C;AAC9D,QAAM,MAAM,MAAM,SAAS,MAAM,YAAY,OAAO;AACpD,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,eAAsB,kBAAkB,QAAqC;AAC3E,MAAI,CAAC,WAAW,MAAM,OAAO,GAAG;AAC9B,UAAM,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAM,MAAM,MAAM,SAAS,GAAK;AAAA,EAClC;AACA,QAAM,UAAU,MAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAC1E,QAAM,MAAM,MAAM,YAAY,GAAK;AACrC;AAEO,SAAS,eAAwB;AACtC,SAAO,WAAW,MAAM,UAAU;AACpC;;;AErBA,SAAS,SAAAA,QAAO,SAAAC,cAAa;AAC7B,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,OAAO,QAAQ,eAAe;;;ACFhC,SAAS,mBAAmB,OAAyB;AAC1D,SAAO,iBAAiB,SAAS,MAAM,SAAS;AAClD;;;ADMA,IAAM,gBAAgB;AAAA,EACpB;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;AAEA,eAAsB,eAA8B;AAClD,MAAI;AACF,UAAM,kBAAkB;AAAA,EAC1B,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,EAAG;AAC/B,UAAM;AAAA,EACR;AACF;AAEA,eAAe,oBAAmC;AAChD,MAAI,aAAa,GAAG;AAClB,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,WAAW;AACd,cAAQ,IAAI,kBAAkB;AAC9B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAACC,YAAW,MAAM,OAAO,GAAG;AAC9B,UAAMC,OAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC9C,UAAMC,OAAM,MAAM,SAAS,GAAK;AAAA,EAClC;AACA,MAAI,CAACF,YAAW,MAAM,UAAU,GAAG;AACjC,UAAMC,OAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EACnD;AAEA,QAAM,YAAY,MAAM,MAAM;AAAA,IAC5B,SAAS;AAAA,IACT,UAAU,CAAC,MAAO,EAAE,KAAK,EAAE,SAAS,IAAI,OAAO;AAAA,EACjD,CAAC;AAED,QAAM,cAAc,MAAM,OAAO;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS,cAAc,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE;AAAA,EACtE,CAAC;AAED,QAAM,SAAuB;AAAA,IAC3B,KAAK;AAAA,MACH,QAAQ,UAAU,KAAK;AAAA,MACvB,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,QAAQ,UAAU,KAAK;AAAA,MACvB,KAAK;AAAA,IACP;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC9B,UAAQ,IAAI,oEAAoE;AAClF;;;AEtEA,SAAS,WAAAE,UAAS,SAAAC,QAAO,gBAAgB;;;ACAzC,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAS,QAAQ,SAAAC,QAAO,SAAAC,cAAa;AACnE,SAAS,cAAAC,mBAAkB;AAI3B,eAAsB,qBACpB,MACuC;AACvC,QAAM,WAAW,MAAM,WAAW,IAAI;AACtC,MAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,MAAM,MAAMC,UAAS,UAAU,OAAO;AAC5C,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,eAAsB,sBACpB,YACe;AACf,MAAI,CAACD,YAAW,MAAM,UAAU,GAAG;AACjC,UAAME,OAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EACnD;AACA,QAAM,WAAW,MAAM,WAAW,WAAW,IAAI;AACjD,QAAMC,WAAU,UAAU,KAAK,UAAU,YAAY,MAAM,CAAC,GAAG,OAAO;AACtE,QAAMC,OAAM,UAAU,GAAK;AAC7B;AAEA,eAAsB,uBAAuB,MAAgC;AAC3E,QAAM,WAAW,MAAM,WAAW,IAAI;AACtC,MAAI,CAACJ,YAAW,QAAQ,GAAG;AACzB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,QAAQ;AACrB,SAAO;AACT;AAEA,eAAsB,wBAAqD;AACzE,MAAI,CAACA,YAAW,MAAM,UAAU,GAAG;AACjC,WAAO,CAAC;AAAA,EACV;AACA,QAAM,QAAQ,MAAM,QAAQ,MAAM,UAAU;AAC5C,QAAM,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC;AACzD,QAAM,UAA8B,CAAC;AACrC,aAAW,QAAQ,WAAW;AAC5B,UAAM,MAAM,MAAMC;AAAA,MAChB,MAAM,WAAW,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,MAC1C;AAAA,IACF;AACA,YAAQ,KAAK,KAAK,MAAM,GAAG,CAAqB;AAAA,EAClD;AACA,SAAO;AACT;AAEO,SAAS,aAAa,MAAuB;AAClD,SAAOD,YAAW,MAAM,WAAW,IAAI,CAAC;AAC1C;;;AC3CA,SAAS,iBAAiB,KAA0B;AAClD,QAAM,QAAQ,IAAI,MAAM,IAAI;AAC5B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,aAAO,KAAK,MAAM,KAAK,MAAM,CAAC,CAAC;AAAA,IACjC;AAAA,EACF;AACA,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,eAAe,cACb,UACA,QACiB;AACjB,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,eAAe,UAAU,MAAM;AAAA,IACjC;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ;AAAA,QACN,iBAAiB;AAAA,QACjB,cAAc,CAAC;AAAA,QACf,YAAY,EAAE,MAAM,WAAW,SAAS,QAAQ;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,QAAQ,IAAI,gBAAgB;AACvD,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AAEA,SAAO;AACT;AAEA,eAAe,YACb,UACA,QACA,WACA,UACA,MACiB;AACjB,QAAM,WAAW,MAAM,MAAM,UAAU;AAAA,IACrC,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,eAAe,UAAU,MAAM;AAAA,MAC/B,kBAAkB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,SAAS;AAAA,MACT,IAAI;AAAA,MACJ,QAAQ;AAAA,MACR,QAAQ,EAAE,MAAM,UAAU,WAAW,KAAK;AAAA,IAC5C,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAClE;AAAA,EACF;AAEA,QAAM,MAAM,MAAM,SAAS,KAAK;AAChC,QAAM,SAAS,iBAAiB,GAAG;AAEnC,MAAI,OAAO,OAAO;AAChB,UAAM,IAAI,MAAM,cAAc,OAAO,MAAM,OAAO,EAAE;AAAA,EACtD;AAEA,QAAM,WAAW,OAAO,QAAQ,WAAW,CAAC;AAC5C,QAAM,OAAO,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAClD,QAAM,qBAAqB;AAC3B,MAAI,KAAK,SAAS,oBAAoB;AACpC,WAAO,KAAK,MAAM,GAAG,kBAAkB,IAAI;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,IAAI;AAEJ,eAAsB,gBACpB,QACA,KACiB;AACjB,QAAM,WAAW,OAAO,UAAU;AAClC,QAAM,SAAS,OAAO,UAAU;AAEhC,MAAI,CAAC,iBAAiB;AACpB,sBAAkB,MAAM,cAAc,UAAU,MAAM;AAAA,EACxD;AAEA,MAAI;AACF,WAAO,MAAM,YAAY,UAAU,QAAQ,iBAAiB,aAAa;AAAA,MACvE;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH,QAAQ;AACN,sBAAkB,MAAM,cAAc,UAAU,MAAM;AACtD,WAAO,MAAM,YAAY,UAAU,QAAQ,iBAAiB,aAAa;AAAA,MACvE;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;;;ACjIO,IAAM,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC2BtC,IAAM,kBAAkB;AAAA,EACtB,MAAM;AAAA,EACN,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,KAAK;AAAA,UACH,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,KAAK;AAAA,IAClB;AAAA,EACF;AACF;AAgBA,eAAe,QACb,QACA,UACsB;AACtB,QAAM,WAAW,MAAM,MAAM,OAAO,IAAI,UAAU;AAAA,IAChD,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,eAAe,UAAU,OAAO,IAAI,MAAM;AAAA,IAC5C;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO;AAAA,MACP;AAAA,MACA,OAAO,CAAC,eAAe;AAAA,MACvB,aAAa;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,4BAA4B,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IACpE;AAAA,EACF;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;AAEA,eAAsB,eACpB,QACA,aACyB;AACzB,QAAM,WAAyB;AAAA,IAC7B,EAAE,MAAM,UAAU,SAAS,uBAAuB;AAAA,IAClD,EAAE,MAAM,QAAQ,SAAS,YAAY;AAAA,EACvC;AAEA,QAAM,aAAa;AACnB,WAAS,QAAQ,GAAG,QAAQ,YAAY,SAAS;AAC/C,UAAM,WAAW,MAAM,QAAQ,QAAQ,QAAQ;AAC/C,UAAM,SAAS,SAAS,QAAQ,GAAG,CAAC;AACpC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AAEA,UAAM,mBAAmB,OAAO;AAChC,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,iBAAiB;AAAA,MAC1B,YAAY,iBAAiB;AAAA,IAC/B,CAAC;AAED,QACE,CAAC,iBAAiB,cAClB,iBAAiB,WAAW,WAAW,GACvC;AACA,aAAO,oBAAoB,iBAAiB,WAAW,EAAE;AAAA,IAC3D;AAEA,eAAW,YAAY,iBAAiB,YAAY;AAClD,UAAI,SAAS,SAAS,SAAS,aAAa;AAC1C,cAAM,OAAO,KAAK,MAAM,SAAS,SAAS,SAAS;AAGnD,YAAI;AACJ,YAAI;AACF,uBAAa,MAAM,gBAAgB,QAAQ,KAAK,GAAG;AAAA,QACrD,SAAS,OAAO;AACd,uBAAa,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5F;AACA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,cAAc,SAAS;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,uCAAuC;AACzD;AAEA,SAAS,oBAAoB,SAAiC;AAC5D,QAAM,UAAU,QACb,QAAQ,eAAe,EAAE,EACzB,QAAQ,WAAW,EAAE,EACrB,KAAK;AAER,QAAM,YAAY,QAAQ,MAAM,aAAa;AAC7C,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,2CAA2C,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACpF;AAEA,QAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AACtC,MAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,SAAS;AACnC,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiBK,QAAuB;AACtD,MAAI,aAAaA,MAAK,GAAG;AACvB,UAAM,MAAM,sBAAsBA,MAAK;AACvC,WAAO,oCAAoC,GAAG,oCAAoC,GAAG;AAAA,EACvF;AACA,SAAO,mDAAmDA,MAAK;AACjE;AAEO,SAAS,aAAaA,QAAwB;AACnD,MAAIA,OAAM,WAAW,MAAM,KAAKA,OAAM,WAAW,GAAG,GAAG;AACrD,WAAO;AAAA,EACT;AACA,QAAM,QAAQA,OAAM,MAAM,GAAG;AAC7B,SAAO,MAAM,WAAW,KAAK,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;AAC9D;AAEO,SAAS,aACdA,QACoD;AACpD,MAAIA,OAAM,WAAW,SAAS,KAAKA,OAAM,WAAW,UAAU,GAAG;AAC/D,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AACA,MAAI,aAAaA,MAAK,GAAG;AACvB,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AACA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QACE;AAAA,EACJ;AACF;;;AJ9KA,eAAsB,iBAAiB,QAAgC;AACrE,MAAI;AACF,UAAM,sBAAsB,MAAM;AAAA,EACpC,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,EAAG;AAC/B,UAAM;AAAA,EACR;AACF;AAEA,eAAe,sBAAsB,QAAgC;AACnE,QAAM,WACJ,UACC,MAAMC,OAAM;AAAA,IACX,SAAS;AAAA,EACX,CAAC;AAEH,MAAI,SAAS,KAAK,MAAM,IAAI;AAC1B,UAAM,cAAc;AACpB;AAAA,EACF;AAEA,QAAM,aAAa,aAAa,SAAS,KAAK,CAAC;AAC/C,MAAI,CAAC,WAAW,OAAO;AACrB,YAAQ,MAAM,UAAU,WAAW,MAAM,EAAE;AAC3C,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,iBAAiB;AAEtC,UAAQ,IAAI,sCAAsC;AAClD,MAAI;AACJ,MAAI;AACF,UAAM,cAAc,iBAAiB,SAAS,KAAK,CAAC;AACpD,eAAW,MAAM,eAAe,QAAQ,WAAW;AAAA,EACrD,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,yBAAyB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACjF;AACA,UAAM,WAAW,MAAMC,SAAQ;AAAA,MAC7B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,UAAU;AACZ,YAAM,cAAc;AAAA,IACtB;AACA;AAAA,EACF;AAEA,wBAAsB,UAAU,SAAS,KAAK,CAAC;AAE/C,QAAM,QAAQ,MAAMA,SAAQ;AAAA,IAC1B,SAAS;AAAA,EACX,CAAC;AAED,MAAI,CAAC,OAAO;AACV,UAAM,SAAS,MAAMA,SAAQ;AAAA,MAC3B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,QAAQ;AACV,YAAM,cAAc;AAAA,IACtB;AACA;AAAA,EACF;AAEA,MAAI,aAAa,SAAS,IAAI,GAAG;AAC/B,YAAQ;AAAA,MACN,kBAAkB,SAAS,IAAI,gDAAgD,SAAS,IAAI;AAAA,IAC9F;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,MAA8B,CAAC;AACrC,aAAW,WAAW,SAAS,iBAAiB;AAC9C,UAAM,QAAQ,MAAM,SAAS;AAAA,MAC3B,SAAS,mBAAmB,OAAO;AAAA,MACnC,MAAM;AAAA,IACR,CAAC;AACD,QAAI,OAAO,IAAI;AAAA,EACjB;AAEA,QAAM,gBACJ,SAAS,QAAQ,cAAc,UAC3B;AAAA,IACE,WAAW;AAAA,IACX,SAAS,SAAS,QAAQ,WAAW;AAAA,IACrC,MAAM,CAAC,GAAI,SAAS,QAAQ,QAAQ,CAAC,CAAE;AAAA,IACvC,KAAK,EAAE,GAAI,SAAS,QAAQ,OAAO,CAAC,GAAI,GAAG,IAAI;AAAA,EACjD,IACA;AAAA,IACE,WAAW;AAAA,IACX,KAAK,SAAS,QAAQ,OAAO;AAAA,IAC7B,SAAS,EAAE,GAAI,SAAS,QAAQ,WAAW,CAAC,EAAG;AAAA,EACjD;AAEN,QAAM,aAA+B;AAAA,IACnC,MAAM,SAAS;AAAA,IACf,QAAQ,SAAS,KAAK;AAAA,IACtB,SAAS;AAAA,IACT,WAAW,SAAS;AAAA,EACtB;AAEA,QAAM,sBAAsB,UAAU;AACtC,UAAQ,IAAI,WAAW,SAAS,IAAI,gCAAgC;AACtE;AAEA,SAAS,sBAAsB,QAAwB,QAAsB;AAC3E,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,IAAI,SAAS,OAAO,IAAI,EAAE;AAClC,UAAQ,IAAI,WAAW,MAAM,EAAE;AAC/B,UAAQ,IAAI,cAAc,OAAO,QAAQ,SAAS,EAAE;AACpD,MAAI,OAAO,QAAQ,cAAc,SAAS;AACxC,YAAQ,IAAI,YAAY,OAAO,QAAQ,OAAO,EAAE;AAChD,YAAQ,IAAI,SAAS,KAAK,UAAU,OAAO,QAAQ,IAAI,CAAC,EAAE;AAAA,EAC5D,OAAO;AACL,YAAQ,IAAI,QAAQ,OAAO,QAAQ,GAAG,EAAE;AAAA,EAC1C;AACA,MAAI,OAAO,KAAK,OAAO,SAAS,EAAE,SAAS,GAAG;AAC5C,YAAQ,IAAI,kBAAkB;AAC9B,eAAW,CAAC,OAAO,QAAQ,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAChE,cAAQ,IAAI,KAAK,KAAK,KAAK,KAAK,UAAU,QAAQ,CAAC,EAAE;AAAA,IACvD;AAAA,EACF;AACA,MAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,YAAQ;AAAA,MACN,sBAAsB,OAAO,gBAAgB,KAAK,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AACA,UAAQ,IAAI,OAAO;AACrB;AAEA,eAAe,gBAA+B;AAC5C,QAAM,OAAO,MAAMD,OAAM;AAAA,IACvB,SAAS;AAAA,IACT,UAAU,CAAC,MACT,oBAAoB,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO;AAAA,EAChD,CAAC;AAED,MAAI,aAAa,KAAK,KAAK,CAAC,GAAG;AAC7B,YAAQ;AAAA,MACN,kBAAkB,KAAK,KAAK,CAAC,gDAAgD,KAAK,KAAK,CAAC;AAAA,IAC1F;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,SAAS,MAAMA,OAAM;AAAA,IACzB,SAAS;AAAA,EACX,CAAC;AAED,QAAM,UAAU,MAAMA,OAAM;AAAA,IAC1B,SAAS;AAAA,IACT,UAAU,CAAC,MAAO,EAAE,KAAK,EAAE,SAAS,IAAI,OAAO;AAAA,EACjD,CAAC;AAED,QAAM,UAAU,MAAMA,OAAM;AAAA,IAC1B,SAAS;AAAA,EACX,CAAC;AACD,QAAM,OAAO,QACV,KAAK,EACL,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAE7B,QAAM,WAAmC,CAAC;AAC1C,MAAI,UAAU;AACd,SAAO,SAAS;AACd,UAAM,UAAU,MAAMA,OAAM;AAAA,MAC1B,SAAS;AAAA,IACX,CAAC;AACD,QAAI,QAAQ,KAAK,MAAM,GAAI;AAC3B,UAAM,WAAW,MAAM,SAAS;AAAA,MAC9B,SAAS,aAAa,QAAQ,KAAK,CAAC;AAAA,MACpC,MAAM;AAAA,IACR,CAAC;AACD,aAAS,QAAQ,KAAK,CAAC,IAAI;AAC3B,cAAU;AAAA,EACZ;AAEA,QAAM,SAAsB;AAAA,IAC1B,WAAW;AAAA,IACX,SAAS,QAAQ,KAAK;AAAA,IACtB;AAAA,IACA,KAAK;AAAA,EACP;AAEA,QAAM,aAA+B;AAAA,IACnC,MAAM,KAAK,KAAK;AAAA,IAChB,QAAQ,OAAO,KAAK;AAAA,IACpB,SAAS;AAAA,IACT,WAAW,CAAC;AAAA,EACd;AAEA,QAAM,sBAAsB,UAAU;AACtC,UAAQ,IAAI,WAAW,KAAK,KAAK,CAAC,gCAAgC;AACpE;;;AKhNA,eAAsB,oBAAoB,MAA6B;AACrE,MAAI,CAAC,aAAa,IAAI,GAAG;AACvB,YAAQ,MAAM,kBAAkB,IAAI,yCAAyC;AAC7E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,uBAAuB,IAAI;AACjC,UAAQ,IAAI,WAAW,IAAI,oCAAoC;AACjE;;;ACTA,eAAsB,oBAAmC;AACvD,QAAM,UAAU,MAAM,sBAAsB;AAE5C,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,wEAA0E;AACtF;AAAA,EACF;AAEA,UAAQ,IAAI,iCAAiC;AAC7C,aAAWE,WAAU,SAAS;AAC5B,UAAM,gBAAgB,OAAO,KAAKA,QAAO,SAAS,EAAE;AACpD,UAAM,eACJ,gBAAgB,IAAI,KAAK,aAAa,gBAAgB;AACxD,YAAQ;AAAA,MACN,KAAKA,QAAO,IAAI,KAAKA,QAAO,QAAQ,SAAS,IAAI,YAAY;AAAA,IAC/D;AACA,QAAIA,QAAO,QAAQ;AACjB,cAAQ,IAAI,eAAeA,QAAO,MAAM,EAAE;AAAA,IAC5C;AAAA,EACF;AACA,UAAQ,IAAI;AACd;;;ACvBA,SAAS,UAAU,WAAAC,gBAAe;;;ACAlC,SAAS,cAAAC,mBAAkB;;;ACA3B,SAAS,QAAAC,aAAY;;;ACArB,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,cAAa;AAC3C,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,eAAe;AAExB,eAAsB,aACpB,UACkC;AAClC,MAAI,CAACA,YAAW,QAAQ,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAM,MAAMH,UAAS,UAAU,OAAO;AAC5C,SAAO,KAAK,MAAM,GAAG;AACvB;AAEA,eAAsB,cACpB,UACA,MACe;AACf,QAAM,MAAM,QAAQ,QAAQ;AAC5B,MAAI,CAACG,YAAW,GAAG,GAAG;AACpB,UAAMD,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACtC;AACA,QAAMD,WAAU,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AACzE;;;ACvBA,IAAM,kBAAkB;AAEjB,SAAS,aACd,KACU;AACV,SAAO,OAAO,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACpE;AAEO,SAAS,aAAa,MAG3B;AACA,QAAM,MAA8B,CAAC;AACrC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,gBAAgB,KAAK,KAAK,CAAC,CAAC,GAAG;AACjC,YAAM,UAAU,KAAK,CAAC,EAAE,QAAQ,GAAG;AACnC,UAAI,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,MAAM,UAAU,CAAC;AAAA,IAC5D,OAAO;AACL,aAAO,EAAE,KAAK,cAAc,EAAE;AAAA,IAChC;AAAA,EACF;AACA,SAAO,EAAE,KAAK,cAAc,KAAK,OAAO;AAC1C;AAEO,SAAS,iBACd,MACA,KAIA;AACA,QAAM,kBAAkB,oBAAI,IAAY;AACxC,QAAM,eAAe,KAAK;AAAA,IAAI,CAAC,QAC7B,IAAI,QAAQ,kBAAkB,CAAC,OAAO,YAAoB;AACxD,UAAI,WAAW,KAAK;AAClB,wBAAgB,IAAI,OAAO;AAC3B,eAAO,IAAI,OAAO;AAAA,MACpB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,eAAuC,CAAC;AAC9C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,CAAC,gBAAgB,IAAI,GAAG,GAAG;AAC7B,mBAAa,GAAG,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,EAAE,cAAc,aAAa;AACtC;;;AF7CA,SAAS,cAAc,QAAgD;AACrE,MAAI,OAAO,cAAc,SAAS;AAChC,UAAM,EAAE,cAAc,aAAa,IAAI;AAAA,MACrC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,CAAC,GAAG,SAAS,OAAO,SAAS,GAAG,YAAY;AAAA,MACpD;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,OAAO;AAAA,IACZ,SAAS,EAAE,GAAG,OAAO,QAAQ;AAAA,EAC/B;AACF;AAEA,SAAS,gBACP,OACA,KAC2B;AAC3B,QAAM,OAAO,IAAI,MAAM;AACvB,MAAI,SAAS,SAAS;AACpB,UAAM,UAAU,IAAI,SAAS;AAC7B,UAAM,UAAW,IAAI,MAAM,KAAkB,CAAC;AAC9C,UAAM,YAAY,IAAI,KAAK;AAE3B,QAAI,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AAClD,aAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,UAAU;AAAA,IACtE;AAEA,QAAI,YAAY,OAAO;AACrB,YAAM,EAAE,KAAK,aAAa,IAAI,aAAa,OAAO;AAClD,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,QAAQ,YAAY,KAAK;AAAA,QAClC,MAAM,QAAQ,MAAM,eAAe,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,EAC/D;AACA,MAAI,SAAS,QAAQ;AACnB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,KAAK,IAAI,KAAK;AAAA,MACd,SAAU,IAAI,SAAS,KAAgC,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,oBAAkC;AAAA,EAC7C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,eAAeG,MAAK,YAAY,WAAW;AAAA,EACxD,UAAU;AAAA,EAEV;AAAA,EACA;AAAA,EAEA,MAAM,KAAK,YAAY;AACrB,UAAM,WAAWA,MAAK,YAAY,WAAW;AAC7C,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,WAAQ,KAAK,YAAY,KAAiC,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,MAAM,YAAY,YAAY,QAAQ;AAC1C,UAAM,WAAWA,MAAK,YAAY,WAAW;AAC7C,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI;AAAA,QACR,cAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,YAAY,EAAE,GAAG,SAAS,CAAC,UAAU,GAAG,cAAc,MAAM,EAAE;AAAA,IAChE;AACA,UAAM,cAAc,UAAU,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,YAAY,YAAY;AACnC,UAAM,WAAWA,MAAK,YAAY,WAAW;AAC7C,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,UAAM,EAAE,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI;AACrC,UAAM,cAAc,UAAU,EAAE,GAAG,MAAM,YAAY,KAAK,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,IAAI,YAAY,YAAY;AAChC,UAAM,WAAWA,MAAK,YAAY,WAAW;AAC7C,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,WAAO,cAAc;AAAA,EACvB;AACF;;;AGjHA,SAAS,QAAAC,aAAY;AACrB,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,cAAa;AAC3C,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAAS,WAAW,aAAa,qBAAqB;AAI/D,SAASC,eAAc,QAAgD;AACrE,MAAI,OAAO,cAAc,SAAS;AAChC,UAAM,EAAE,cAAc,aAAa,IAAI;AAAA,MACrC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC,GAAG,SAAS,OAAO,SAAS,GAAG,YAAY;AAAA,MACpD;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,SAAS,EAAE,GAAG,OAAO,QAAQ;AAAA,EAC/B;AACF;AAEA,SAASC,iBACP,OACA,KAC2B;AAC3B,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,UAAU,IAAI,SAAS;AAC7B,UAAM,UAAW,IAAI,MAAM,KAAkB,CAAC;AAC9C,UAAM,YAAY,IAAI,KAAK;AAE3B,QAAI,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AAClD,aAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,UAAU;AAAA,IACtE;AAEA,QAAI,YAAY,OAAO;AACrB,YAAM,EAAE,KAAK,aAAa,IAAI,aAAa,OAAO;AAClD,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,QAAQ,YAAY,KAAK;AAAA,QAClC,MAAM,QAAQ,MAAM,eAAe,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,EAC/D;AACA,MAAI,IAAI,KAAK,GAAG;AACd,WAAO;AAAA,MACL,WAAW;AAAA,MACX,KAAK,IAAI,KAAK;AAAA,MACd,SAAU,IAAI,SAAS,KAAgC,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,aACb,UAC2D;AAC3D,MAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,WAAO,EAAE,KAAK,IAAI,QAAQ,CAAC,EAAE;AAAA,EAC/B;AACA,QAAM,MAAM,MAAMC,UAAS,UAAU,OAAO;AAC5C,QAAM,SAAS,UAAU,GAAG;AAC5B,SAAO,EAAE,KAAK,OAAO;AACvB;AAEA,eAAe,cACb,UACA,MACe;AACf,QAAM,MAAMC,SAAQ,QAAQ;AAC5B,MAAI,CAACF,YAAW,GAAG,GAAG;AACpB,UAAMG,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACtC;AACA,QAAMC,WAAU,UAAU,cAAc,IAAI,IAAI,MAAM,OAAO;AAC/D;AAEO,IAAM,eAA6B;AAAA,EACxC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,eAAeC,MAAK,YAAY,UAAU,aAAa;AAAA,EACpE,UAAU;AAAA,EAEV,eAAAP;AAAA,EACA,iBAAAC;AAAA,EAEA,MAAM,KAAK,YAAY;AACrB,UAAM,WAAWM,MAAK,YAAY,UAAU,aAAa;AACzD,UAAM,EAAE,OAAO,IAAI,MAAM,aAAa,QAAQ;AAC9C,WAAQ,OAAO,aAAa,KAAiC,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,MAAM,YAAY,YAAY,QAAQ;AAC1C,UAAM,WAAWA,MAAK,YAAY,UAAU,aAAa;AACzD,UAAM,EAAE,OAAO,IAAI,MAAM,aAAa,QAAQ;AAC9C,UAAM,UAAW,OAAO,aAAa,KAAiC,CAAC;AACvE,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI;AAAA,QACR,cAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,aAAa,EAAE,GAAG,SAAS,CAAC,UAAU,GAAGP,eAAc,MAAM,EAAE;AAAA,IACjE;AACA,UAAM,cAAc,UAAU,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,YAAY,YAAY;AACnC,UAAM,WAAWO,MAAK,YAAY,UAAU,aAAa;AACzD,UAAM,EAAE,OAAO,IAAI,MAAM,aAAa,QAAQ;AAC9C,UAAM,UAAW,OAAO,aAAa,KAAiC,CAAC;AACvE,UAAM,EAAE,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI;AACrC,UAAM,cAAc,UAAU,EAAE,GAAG,QAAQ,aAAa,KAAK,CAAC;AAAA,EAChE;AAAA,EAEA,MAAM,IAAI,YAAY,YAAY;AAChC,UAAM,WAAWA,MAAK,YAAY,UAAU,aAAa;AACzD,UAAM,EAAE,OAAO,IAAI,MAAM,aAAa,QAAQ;AAC9C,UAAM,UAAW,OAAO,aAAa,KAAiC,CAAC;AACvE,WAAO,cAAc;AAAA,EACvB;AACF;;;ACtIA,SAAS,QAAAC,aAAY;AAKrB,SAASC,eAAc,QAAgD;AACrE,MAAI,OAAO,cAAc,SAAS;AAChC,UAAM,EAAE,cAAc,aAAa,IAAI;AAAA,MACrC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC,GAAG,SAAS,OAAO,SAAS,GAAG,YAAY;AAAA,MACpD;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,SAAS,EAAE,GAAG,OAAO,QAAQ;AAAA,EAC/B;AACF;AAEA,SAASC,iBACP,OACA,KAC2B;AAC3B,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,UAAU,IAAI,SAAS;AAC7B,UAAM,UAAW,IAAI,MAAM,KAAkB,CAAC;AAC9C,UAAM,YAAY,IAAI,KAAK;AAE3B,QAAI,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AAClD,aAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,UAAU;AAAA,IACtE;AAEA,QAAI,YAAY,OAAO;AACrB,YAAM,EAAE,KAAK,aAAa,IAAI,aAAa,OAAO;AAClD,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,QAAQ,YAAY,KAAK;AAAA,QAClC,MAAM,QAAQ,MAAM,eAAe,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,EAC/D;AACA,MAAI,IAAI,KAAK,GAAG;AACd,WAAO;AAAA,MACL,WAAW;AAAA,MACX,KAAK,IAAI,KAAK;AAAA,MACd,SAAU,IAAI,SAAS,KAAgC,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,mBAAiC;AAAA,EAC5C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,eAAeC,MAAK,YAAY,WAAW,eAAe;AAAA,EACvE,UAAU;AAAA,EAEV,eAAAF;AAAA,EACA,iBAAAC;AAAA,EAEA,MAAM,KAAK,YAAY;AACrB,UAAM,WAAWC,MAAK,YAAY,WAAW,eAAe;AAC5D,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,WAAQ,KAAK,YAAY,KAAiC,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,MAAM,YAAY,YAAY,QAAQ;AAC1C,UAAM,WAAWA,MAAK,YAAY,WAAW,eAAe;AAC5D,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI;AAAA,QACR,cAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,YAAY,EAAE,GAAG,SAAS,CAAC,UAAU,GAAGF,eAAc,MAAM,EAAE;AAAA,IAChE;AACA,UAAM,cAAc,UAAU,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,YAAY,YAAY;AACnC,UAAM,WAAWE,MAAK,YAAY,WAAW,eAAe;AAC5D,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,UAAM,EAAE,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI;AACrC,UAAM,cAAc,UAAU,EAAE,GAAG,MAAM,YAAY,KAAK,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,IAAI,YAAY,YAAY;AAChC,UAAM,WAAWA,MAAK,YAAY,WAAW,eAAe;AAC5D,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,WAAO,cAAc;AAAA,EACvB;AACF;;;AC7GA,SAAS,QAAAC,aAAY;AAKrB,SAASC,eAAc,QAAgD;AACrE,MAAI,OAAO,cAAc,SAAS;AAChC,UAAM,EAAE,cAAc,aAAa,IAAI;AAAA,MACrC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,CAAC,OAAO,GAAG,SAAS,OAAO,SAAS,GAAG,YAAY;AAAA,MAC9D;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,CAAC,OAAO,SAAS,GAAG,YAAY;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK,OAAO;AAAA,IACZ,SAAS,EAAE,GAAG,OAAO,QAAQ;AAAA,EAC/B;AACF;AAEA,SAASC,iBACP,OACA,KAC2B;AAC3B,QAAM,OAAO,IAAI,MAAM;AACvB,MAAI,SAAS,SAAS;AACpB,UAAM,aAAa,IAAI,SAAS;AAChC,UAAM,YAAY,IAAI,aAAa;AAEnC,QAAI,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AAClD,YAAM,CAACC,WAAU,IAAI,GAAGC,KAAI,IAAI;AAChC,aAAO,EAAE,WAAW,SAAS,SAAAD,UAAS,MAAAC,OAAM,KAAK,UAAU;AAAA,IAC7D;AAEA,QAAI,WAAW,CAAC,MAAM,OAAO;AAC3B,YAAM,EAAE,KAAK,aAAa,IAAI,aAAa,WAAW,MAAM,CAAC,CAAC;AAC9D,YAAM,cAAc,eAAe;AACnC,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,WAAW,WAAW,KAAK;AAAA,QACpC,MAAM,WAAW,MAAM,cAAc,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,CAAC,UAAU,IAAI,GAAG,IAAI,IAAI;AAChC,WAAO,EAAE,WAAW,SAAS,SAAS,MAAM,KAAK,CAAC,EAAE;AAAA,EACtD;AACA,MAAI,SAAS,UAAU;AACrB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,KAAK,IAAI,KAAK;AAAA,MACd,SAAU,IAAI,SAAS,KAAgC,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,kBAAgC;AAAA,EAC3C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,eAAeC,MAAK,YAAY,eAAe;AAAA,EAC5D,UAAU;AAAA,EAEV,eAAAJ;AAAA,EACA,iBAAAC;AAAA,EAEA,MAAM,KAAK,YAAY;AACrB,UAAM,WAAWG,MAAK,YAAY,eAAe;AACjD,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,WAAQ,KAAK,KAAK,KAAiC,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,MAAM,YAAY,YAAY,QAAQ;AAC1C,UAAM,WAAWA,MAAK,YAAY,eAAe;AACjD,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,KAAK,KAAiC,CAAC;AAC7D,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI;AAAA,QACR,cAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,KAAK,EAAE,GAAG,SAAS,CAAC,UAAU,GAAGJ,eAAc,MAAM,EAAE;AAAA,IACzD;AACA,UAAM,cAAc,UAAU,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,YAAY,YAAY;AACnC,UAAM,WAAWI,MAAK,YAAY,eAAe;AACjD,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,KAAK,KAAiC,CAAC;AAC7D,UAAM,EAAE,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI;AACrC,UAAM,cAAc,UAAU,EAAE,GAAG,MAAM,KAAK,KAAK,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,IAAI,YAAY,YAAY;AAChC,UAAM,WAAWA,MAAK,YAAY,eAAe;AACjD,UAAM,OAAO,MAAM,aAAa,QAAQ;AACxC,UAAM,UAAW,KAAK,KAAK,KAAiC,CAAC;AAC7D,WAAO,cAAc;AAAA,EACvB;AACF;;;ACjHA,SAAS,WAAAC,gBAAe;AACxB,SAAS,QAAAC,aAAY;AAKrB,IAAM,qBAAqBC;AAAA,EACzBC,SAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAASC,eAAc,QAAgD;AACrE,MAAI,OAAO,cAAc,SAAS;AAChC,UAAM,EAAE,cAAc,aAAa,IAAI;AAAA,MACrC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC,GAAG,SAAS,OAAO,SAAS,GAAG,YAAY;AAAA,MACpD;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,SAAS,EAAE,GAAG,OAAO,QAAQ;AAAA,EAC/B;AACF;AAEA,SAASC,iBACP,OACA,KAC2B;AAC3B,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,UAAU,IAAI,SAAS;AAC7B,UAAM,UAAW,IAAI,MAAM,KAAkB,CAAC;AAC9C,UAAM,YAAY,IAAI,KAAK;AAE3B,QAAI,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AAClD,aAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,UAAU;AAAA,IACtE;AAEA,QAAI,YAAY,OAAO;AACrB,YAAM,EAAE,KAAK,aAAa,IAAI,aAAa,OAAO;AAClD,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,QAAQ,YAAY,KAAK;AAAA,QAClC,MAAM,QAAQ,MAAM,eAAe,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,EAC/D;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,WAAO;AAAA,MACL,WAAW;AAAA,MACX,KAAK,IAAI,WAAW;AAAA,MACpB,SAAU,IAAI,SAAS,KAAgC,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,qBAAmC;AAAA,EAC9C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,MAAM;AAAA,EAClB,UAAU;AAAA,EAEV,eAAAD;AAAA,EACA,iBAAAC;AAAA,EAEA,MAAM,OAAO;AACX,UAAM,OAAO,MAAM,aAAa,kBAAkB;AAClD,WAAQ,KAAK,YAAY,KAAiC,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,MAAM,aAAa,YAAY,QAAQ;AAC3C,UAAM,OAAO,MAAM,aAAa,kBAAkB;AAClD,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI;AAAA,QACR,cAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,YAAY,EAAE,GAAG,SAAS,CAAC,UAAU,GAAGD,eAAc,MAAM,EAAE;AAAA,IAChE;AACA,UAAM,cAAc,oBAAoB,OAAO;AAAA,EACjD;AAAA,EAEA,MAAM,OAAO,aAAa,YAAY;AACpC,UAAM,OAAO,MAAM,aAAa,kBAAkB;AAClD,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,UAAM,EAAE,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI;AACrC,UAAM,cAAc,oBAAoB,EAAE,GAAG,MAAM,YAAY,KAAK,CAAC;AAAA,EACvE;AAAA,EAEA,MAAM,IAAI,aAAa,YAAY;AACjC,UAAM,OAAO,MAAM,aAAa,kBAAkB;AAClD,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,WAAO,cAAc;AAAA,EACvB;AACF;;;ACjHA,SAAS,WAAAE,gBAAe;AACxB,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,cAAa;AAC3C,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,OAAO,WAAW;AAElB,eAAsB,cACpB,UACkC;AAClC,MAAI,CAACD,YAAW,QAAQ,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAM,MAAMH,UAAS,UAAU,OAAO;AAC5C,SAAO,MAAM,MAAM,GAAG;AACxB;AAEA,eAAsB,eACpB,UACA,MACe;AACf,QAAM,MAAMI,SAAQ,QAAQ;AAC5B,MAAI,CAACD,YAAW,GAAG,GAAG;AACpB,UAAMD,OAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACtC;AACA,QAAMD,WAAU,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AACzE;;;ADlBA,IAAMI,sBAAqBC;AAAA,EACzBC,SAAQ;AAAA,EACR;AAAA,EACA;AACF;AAEA,SAASC,eAAc,QAAgD;AACrE,MAAI,OAAO,cAAc,SAAS;AAChC,UAAM,EAAE,cAAc,aAAa,IAAI;AAAA,MACrC,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AACA,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM,CAAC,GAAG,SAAS,OAAO,SAAS,GAAG,YAAY;AAAA,MACpD;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AACA,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,SAAS,EAAE,GAAG,OAAO,QAAQ;AAAA,EAC/B;AACF;AAEA,SAASC,iBACP,OACA,KAC2B;AAC3B,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,UAAU,IAAI,SAAS;AAC7B,UAAM,UAAW,IAAI,MAAM,KAAkB,CAAC;AAC9C,UAAM,YAAY,IAAI,KAAK;AAE3B,QAAI,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AAClD,aAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,UAAU;AAAA,IACtE;AAEA,QAAI,YAAY,OAAO;AACrB,YAAM,EAAE,KAAK,aAAa,IAAI,aAAa,OAAO;AAClD,aAAO;AAAA,QACL,WAAW;AAAA,QACX,SAAS,QAAQ,YAAY,KAAK;AAAA,QAClC,MAAM,QAAQ,MAAM,eAAe,CAAC;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,SAAS,SAAS,MAAM,SAAS,KAAK,CAAC,EAAE;AAAA,EAC/D;AACA,MAAI,IAAI,KAAK,GAAG;AACd,WAAO;AAAA,MACL,WAAW;AAAA,MACX,KAAK,IAAI,KAAK;AAAA,MACd,SAAU,IAAI,SAAS,KAAgC,CAAC;AAAA,IAC1D;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,kBAAgC;AAAA,EAC3C,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,MAAMJ;AAAA,EAClB,UAAU;AAAA,EAEV,eAAAG;AAAA,EACA,iBAAAC;AAAA,EAEA,MAAM,OAAO;AACX,UAAM,OAAO,MAAM,cAAcJ,mBAAkB;AACnD,WAAQ,KAAK,YAAY,KAAiC,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,MAAM,aAAa,YAAY,QAAQ;AAC3C,UAAM,OAAO,MAAM,cAAcA,mBAAkB;AACnD,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,QAAI,cAAc,SAAS;AACzB,YAAM,IAAI;AAAA,QACR,cAAc,UAAU;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,UAAU;AAAA,MACd,GAAG;AAAA,MACH,YAAY,EAAE,GAAG,SAAS,CAAC,UAAU,GAAGG,eAAc,MAAM,EAAE;AAAA,IAChE;AACA,UAAM,eAAeH,qBAAoB,OAAO;AAAA,EAClD;AAAA,EAEA,MAAM,OAAO,aAAa,YAAY;AACpC,UAAM,OAAO,MAAM,cAAcA,mBAAkB;AACnD,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,UAAM,EAAE,CAAC,UAAU,GAAG,GAAG,GAAG,KAAK,IAAI;AACrC,UAAM,eAAeA,qBAAoB,EAAE,GAAG,MAAM,YAAY,KAAK,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,IAAI,aAAa,YAAY;AACjC,UAAM,OAAO,MAAM,cAAcA,mBAAkB;AACnD,UAAM,UAAW,KAAK,YAAY,KAAiC,CAAC;AACpE,WAAO,cAAc;AAAA,EACvB;AACF;;;ARvGO,IAAM,cAAuC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUO,SAAS,aAAa,YAAoC;AAC/D,SAAO,YAAY,OAAO,CAAC,YAAY;AACrC,QAAI,QAAQ,UAAU;AACpB,aAAOK,YAAW,QAAQ,WAAW,UAAU,CAAC;AAAA,IAClD;AACA,WAAOA,YAAW,QAAQ,WAAW,UAAU,CAAC;AAAA,EAClD,CAAC;AACH;;;AU/BO,SAAS,cACd,YACA,SACe;AACf,QAAM,WAAW,WAAW,UAAU,QAAQ,EAAE;AAChD,MAAI,UAAU;AACZ,UAAM,OAAO,WAAW;AACxB,WAAO,EAAE,GAAG,MAAM,GAAG,SAAS;AAAA,EAChC;AACA,SAAO,WAAW;AACpB;;;AXLA,eAAsB,cAA6B;AACjD,MAAI;AACF,UAAM,iBAAiB;AAAA,EACzB,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,EAAG;AAC/B,UAAM;AAAA,EACR;AACF;AAEA,eAAe,mBAAkC;AAC/C,QAAM,aAAa,QAAQ,IAAI;AAE/B,QAAM,UAAU,MAAM,sBAAsB;AAC5C,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ;AAAA,MACN;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,WAAW,aAAa,UAAU;AACxC,QAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAErD,QAAM,iBAAiB,MAAM,SAAuB;AAAA,IAClD,SAAS;AAAA,IACT,SAAS,YAAY,IAAI,CAAC,aAAa;AAAA,MACrC,MAAM,GAAG,QAAQ,IAAI,GAAG,YAAY,IAAI,QAAQ,EAAE,IAAI,gBAAgB,EAAE,GAAG,QAAQ,WAAW,cAAc,EAAE;AAAA,MAC9G,OAAO;AAAA,MACP,SAAS,YAAY,IAAI,QAAQ,EAAE,KAAK,CAAC,QAAQ;AAAA,IACnD,EAAE;AAAA,EACJ,CAAC;AAED,MAAI,eAAe,WAAW,GAAG;AAC/B,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,QAAM,iBAAiB,oBAAI,IAAyB;AACpD,QAAM,kBAAkB,oBAAI,IAAY;AACxC,aAAW,SAAS,gBAAgB;AAClC,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK,UAAU;AAC5C,YAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,QAAQ,CAAC;AAC3C,qBAAe,IAAI,MAAM,IAAI,KAAK;AAClC,iBAAW,QAAQ,OAAO;AACxB,wBAAgB,IAAI,IAAI;AAAA,MAC1B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM,SAAS;AAAA,IACrC,SAAS;AAAA,IACT,SAAS,QAAQ,IAAI,CAAC,OAAO;AAAA,MAC3B,MAAM,GAAG,EAAE,IAAI,GAAG,gBAAgB,IAAI,EAAE,IAAI,IAAI,gBAAgB,EAAE,KAAK,EAAE,QAAQ,SAAS;AAAA,MAC1F,OAAO;AAAA,MACP,SAAS,gBAAgB,IAAI,EAAE,IAAI;AAAA,IACrC,EAAE;AAAA,EACJ,CAAC;AAED,QAAM,sBAAsB,IAAI,IAAI,gBAAgB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAEtE,QAAM,WAAW,oBAAI,IAA4B;AACjD,aAAW,cAAc,iBAAiB;AACxC,QAAI,CAAC,oBAAoB,IAAI,UAAU,GAAG;AACxC,YAAM,SAAS,eAAe,OAAO,CAAC,MAAM;AAC1C,cAAM,eAAe,eAAe,IAAI,EAAE,EAAE;AAC5C,eAAO,cAAc,IAAI,UAAU;AAAA,MACrC,CAAC;AACD,UAAI,OAAO,SAAS,GAAG;AACrB,iBAAS,IAAI,YAAY,MAAM;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAgB,WAAW,KAAK,SAAS,SAAS,GAAG;AACvD,YAAQ,IAAI,sBAAsB;AAClC;AAAA,EACF;AAEA,UAAQ,IAAI,SAAS;AACrB,aAAW,SAAS,gBAAgB;AAClC,YAAQ,IAAI,KAAK,MAAM,IAAI,GAAG;AAC9B,eAAWC,WAAU,iBAAiB;AACpC,cAAQ,IAAI,SAASA,QAAO,IAAI,EAAE;AAAA,IACpC;AACA,eAAW,CAAC,YAAY,MAAM,KAAK,UAAU;AAC3C,UAAI,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,MAAM,EAAE,GAAG;AACzC,gBAAQ,IAAI,SAAS,UAAU,EAAE;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,MAAMC,SAAQ,EAAE,SAAS,WAAW,CAAC;AACrD,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,YAAY;AACxB;AAAA,EACF;AAEA,aAAW,SAAS,gBAAgB;AAClC,eAAWD,WAAU,iBAAiB;AACpC,UAAI;AACF,cAAM,SAAS,cAAcA,SAAQ,KAAK;AAC1C,cAAM,MAAM,MAAM,YAAYA,QAAO,MAAM,MAAM;AACjD,gBAAQ,IAAI,OAAOA,QAAO,IAAI,OAAO,MAAM,IAAI,EAAE;AAAA,MACnD,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,OAAOA,QAAO,IAAI,OAAO,MAAM,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAChG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,CAAC,YAAY,MAAM,KAAK,UAAU;AAC3C,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,cAAM,MAAM,OAAO,YAAY,UAAU;AACzC,gBAAQ,IAAI,OAAO,UAAU,OAAO,MAAM,IAAI,EAAE;AAAA,MAClD,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,OAAO,UAAU,OAAO,MAAM,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC/F;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,SAAS;AACvB;;;AYvIA,SAAS,YAAAE,iBAAgB;AAOzB,eAAsB,WAAW,YAAmC;AAClE,MAAI;AACF,UAAM,gBAAgB,UAAU;AAAA,EAClC,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,EAAG;AAC/B,UAAM;AAAA,EACR;AACF;AAEA,eAAe,gBAAgB,YAAmC;AAChE,QAAM,aAAa,QAAQ,IAAI;AAE/B,MAAI,CAAC,aAAa,UAAU,GAAG;AAC7B,YAAQ;AAAA,MACN,kBAAkB,UAAU;AAAA,IAC9B;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,qBAAqB,UAAU;AACxD,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,gDAAgD,UAAU,IAAI;AAC5E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,WAAW,aAAa,UAAU;AACxC,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ;AAAA,MACN;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAMC,UAAuB;AAAA,IAClD,SAAS,yBAAyB,UAAU;AAAA,IAC5C,SAAS,SAAS,IAAI,CAAC,aAAa;AAAA,MAClC,MAAM,GAAG,QAAQ,IAAI,GAAG,QAAQ,WAAW,cAAc,EAAE;AAAA,MAC3D,OAAO;AAAA,MACP,SAAS,CAAC,QAAQ;AAAA,IACpB,EAAE;AAAA,EACJ,CAAC;AAED,MAAI,eAAe,WAAW,GAAG;AAC/B,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,aAAW,SAAS,gBAAgB;AAClC,QAAI;AACF,YAAM,SAAS,cAAc,YAAY,KAAK;AAC9C,YAAM,MAAM,MAAM,YAAY,YAAY,MAAM;AAChD,cAAQ,IAAI,OAAO,UAAU,OAAO,MAAM,IAAI,EAAE;AAAA,IAClD,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO,UAAU,OAAO,MAAM,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AACF;;;ACnEA,SAAS,YAAAC,iBAAgB;AAKzB,eAAsB,cAAc,YAAmC;AACrE,MAAI;AACF,UAAM,mBAAmB,UAAU;AAAA,EACrC,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,EAAG;AAC/B,UAAM;AAAA,EACR;AACF;AAEA,eAAe,mBAAmB,YAAmC;AACnE,QAAM,aAAa,QAAQ,IAAI;AAE/B,QAAM,mBAAmC,CAAC;AAC1C,aAAW,WAAW,aAAa;AACjC,QAAI;AACF,YAAM,MAAM,MAAM,QAAQ,IAAI,YAAY,UAAU;AACpD,UAAI,KAAK;AACP,yBAAiB,KAAK,OAAO;AAAA,MAC/B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,iBAAiB,WAAW,GAAG;AACjC,YAAQ;AAAA,MACN,WAAW,UAAU;AAAA,IACvB;AACA;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAMC,UAAuB;AAAA,IAClD,SAAS,WAAW,UAAU;AAAA,IAC9B,SAAS,iBAAiB,IAAI,CAAC,aAAa;AAAA,MAC1C,MAAM,GAAG,QAAQ,IAAI,GAAG,QAAQ,WAAW,cAAc,EAAE;AAAA,MAC3D,OAAO;AAAA,MACP,SAAS,CAAC,QAAQ;AAAA,IACpB,EAAE;AAAA,EACJ,CAAC;AAED,MAAI,eAAe,WAAW,GAAG;AAC/B,YAAQ,IAAI,qBAAqB;AACjC;AAAA,EACF;AAEA,aAAW,SAAS,gBAAgB;AAClC,QAAI;AACF,YAAM,MAAM,OAAO,YAAY,UAAU;AACzC,cAAQ,IAAI,OAAO,UAAU,OAAO,MAAM,IAAI,EAAE;AAAA,IAClD,SAAS,OAAO;AACd,cAAQ;AAAA,QACN,OAAO,UAAU,OAAO,MAAM,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAC/F;AAAA,IACF;AAAA,EACF;AACF;;;AC5DA,SAAS,WAAAC,gBAAe;AAMxB,eAAsB,cAA6B;AACjD,MAAI;AACF,UAAM,iBAAiB;AAAA,EACzB,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,EAAG;AAC/B,UAAM;AAAA,EACR;AACF;AAEA,eAAe,mBAAkC;AAC/C,QAAM,aAAa,QAAQ,IAAI;AAE/B,QAAM,cAAc,MAAM,sBAAsB;AAChD,MAAI,YAAY,WAAW,GAAG;AAC5B,YAAQ,IAAI,+CAA+C;AAC3D;AAAA,EACF;AAEA,QAAM,UAKD,CAAC;AAEN,aAAW,WAAW,aAAa;AACjC,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,KAAK,UAAU;AAAA,IACzC,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,cAAc,aAAa;AACpC,UAAI,EAAE,WAAW,QAAQ,UAAU;AACjC;AAAA,MACF;AAEA,YAAM,aAAa,QAAQ,WAAW,IAAI;AAC1C,YAAM,UAAU,cAAc,YAAY,OAAO;AACjD,YAAM,aAAa,QAAQ,cAAc,OAAO;AAEhD,UAAI,KAAK,UAAU,UAAU,MAAM,KAAK,UAAU,UAAU,GAAG;AAC7D,gBAAQ,KAAK;AAAA,UACX,WAAW,QAAQ;AAAA,UACnB,YAAY,WAAW;AAAA,UACvB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,0CAA0C;AACtD;AAAA,EACF;AAEA,UAAQ,IAAI,iBAAiB;AAC7B,aAAW,UAAU,SAAS;AAC5B,YAAQ,IAAI,OAAO,OAAO,UAAU,OAAO,OAAO,SAAS,EAAE;AAAA,EAC/D;AAEA,QAAM,UAAU,MAAMC,SAAQ,EAAE,SAAS,iBAAiB,CAAC;AAC3D,MAAI,CAAC,SAAS;AACZ,YAAQ,IAAI,YAAY;AACxB;AAAA,EACF;AAEA,aAAW,WAAW,aAAa;AACjC,eAAW,cAAc,aAAa;AACpC,YAAM,WAAW,QAAQ;AAAA,QACvB,CAAC,MACC,EAAE,cAAc,QAAQ,QACxB,EAAE,eAAe,WAAW;AAAA,MAChC;AACA,UAAI,CAAC,SAAU;AAEf,UAAI;AACF,cAAM,QAAQ,OAAO,YAAY,WAAW,IAAI;AAChD,cAAM,SAAS,cAAc,YAAY,OAAO;AAChD,cAAM,QAAQ,MAAM,YAAY,WAAW,MAAM,MAAM;AACvD,gBAAQ,IAAI,OAAO,WAAW,IAAI,OAAO,QAAQ,IAAI,YAAY;AAAA,MACnE,SAAS,OAAO;AACd,gBAAQ;AAAA,UACN,OAAO,WAAW,IAAI,OAAO,QAAQ,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACtG;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI,kBAAkB;AAChC;;;AC1FA,eAAsB,cAA6B;AACjD,QAAM,aAAa,QAAQ,IAAI;AAE/B,QAAM,SAAsD,CAAC;AAC7D,QAAM,iBAAiC,CAAC;AAExC,aAAW,WAAW,aAAa;AACjC,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,KAAK,UAAU;AAAA,IACzC,QAAQ;AACN;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,OAAO,EAAE,WAAW,EAAG;AAEvC,mBAAe,KAAK,OAAO;AAC3B,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,OAAO,GAAG;AACjD,UAAI,CAAC,OAAO,IAAI,GAAG;AACjB,eAAO,IAAI,IAAI,CAAC;AAAA,MAClB;AACA,YAAM,SAAS,QAAQ;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AACA,aAAO,IAAI,EAAE,QAAQ,EAAE,IAAI;AAAA,QACzB,WAAW,QAAQ,aAAa;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AACpC,YAAQ;AAAA,MACN;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,KAAK,MAAM,EAAE,KAAK;AAC7C,QAAM,WAAW,eAAe,IAAI,CAAC,MAAM,EAAE,EAAE;AAC/C,QAAM,aAAa,eAAe,IAAI,CAAC,MAAM,EAAE,IAAI;AAEnD,QAAM,YAAY;AAAA,IAChB,KAAK,IAAI,GAAG,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,IAC/C,GAAG,WAAW,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,EAChD;AAEA,QAAM,SAAS;AAAA,IACb,SAAS,OAAO,UAAU,GAAG,CAAC,KAAK,CAAC;AAAA,IACpC,GAAG,WAAW,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;AAAA,EAChE,EAAE,KAAK,IAAI;AAEX,QAAM,YAAY,UAAU,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAE/D,UAAQ,IAAI;AAAA,EAAK,MAAM,EAAE;AACzB,UAAQ,IAAI,SAAS;AAErB,aAAW,QAAQ,aAAa;AAC9B,UAAM,QAAQ;AAAA,MACZ,KAAK,OAAO,UAAU,GAAG,CAAC,KAAK,CAAC;AAAA,MAChC,GAAG,SAAS,IAAI,CAAC,IAAI,MAAM;AACzB,cAAM,QAAQ,OAAO,IAAI,EAAE,EAAE;AAC7B,cAAM,MAAM,QAAQ,MAAM,YAAY;AACtC,eAAO,IAAI,OAAO,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;AAAA,MAC5C,CAAC;AAAA,IACH;AACA,YAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAAA,EAC9B;AACA,UAAQ,IAAI;AACd;;;A3BhEA,SAAS,eAAqB;AAC5B,MAAI,CAAC,aAAa,GAAG;AACnB,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,QACG,KAAK,SAAS,EACd,YAAY,uDAAuD,EACnE,QAAQ,OAAO;AAElB,QACG,QAAQ,OAAO,EACf,YAAY,kCAAkC,EAC9C,OAAO,YAAY;AAEtB,IAAM,SAAS,QACZ,QAAQ,QAAQ,EAChB,YAAY,qDAAqD;AAEpE,OACG,QAAQ,cAAc,EACtB,YAAY,8CAA8C,EAC1D,OAAO,CAAC,WAAoB;AAC3B,eAAa;AACb,SAAO,iBAAiB,MAAM;AAChC,CAAC;AAEH,OACG,QAAQ,eAAe,EACvB,YAAY,8CAA8C,EAC1D,OAAO,CAAC,SAAiB;AACxB,eAAa;AACb,SAAO,oBAAoB,IAAI;AACjC,CAAC;AAEH,OACG,QAAQ,MAAM,EACd,YAAY,wCAAwC,EACpD,OAAO,MAAM;AACZ,eAAa;AACb,SAAO,kBAAkB;AAC3B,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,4CAA4C,EACxD,OAAO,MAAM;AACZ,eAAa;AACb,SAAO,YAAY;AACrB,CAAC;AAEH,QACG,QAAQ,mBAAmB,EAC3B,YAAY,yDAAyD,EACrE,OAAO,CAAC,eAAuB;AAC9B,eAAa;AACb,SAAO,WAAW,UAAU;AAC9B,CAAC;AAEH,QACG,QAAQ,sBAAsB,EAC9B,YAAY,oDAAoD,EAChE,OAAO,CAAC,eAAuB;AAC9B,eAAa;AACb,SAAO,cAAc,UAAU;AACjC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,0DAA0D,EACtE,OAAO,MAAM;AACZ,eAAa;AACb,SAAO,YAAY;AACrB,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,8DAA8D,EAC1E,OAAO,MAAM;AACZ,eAAa;AACb,SAAO,YAAY;AACrB,CAAC;AAEH,QAAQ,MAAM;","names":["mkdir","chmod","existsSync","existsSync","mkdir","chmod","confirm","input","readFile","writeFile","mkdir","chmod","existsSync","existsSync","readFile","mkdir","writeFile","chmod","input","input","confirm","server","confirm","existsSync","join","readFile","writeFile","mkdir","existsSync","join","join","readFile","writeFile","mkdir","existsSync","dirname","toAgentFormat","fromAgentFormat","existsSync","readFile","dirname","mkdir","writeFile","join","join","toAgentFormat","fromAgentFormat","join","join","toAgentFormat","fromAgentFormat","command","args","join","homedir","join","join","homedir","toAgentFormat","fromAgentFormat","homedir","join","readFile","writeFile","mkdir","existsSync","dirname","GLOBAL_CONFIG_PATH","join","homedir","toAgentFormat","fromAgentFormat","existsSync","server","confirm","checkbox","checkbox","checkbox","checkbox","confirm","confirm"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/utils/config.ts","../src/utils/paths.ts","../src/commands/setup.ts","../src/utils/prompt.ts","../src/commands/server-add.ts","../src/utils/server-store.ts","../src/services/web-reader.ts","../src/services/system-prompt.ts","../src/services/glm-client.ts","../src/commands/server-remove.ts","../src/commands/server-list.ts","../src/commands/init.ts","../src/adapters/index.ts","../src/adapters/claude-code.ts","../src/adapters/json-file.ts","../src/adapters/env-args.ts","../src/adapters/codex.ts","../src/adapters/gemini-cli.ts","../src/adapters/opencode.ts","../src/adapters/antigravity.ts","../src/adapters/openclaw.ts","../src/adapters/json5-file.ts","../src/utils/resolve-config.ts","../src/commands/add.ts","../src/commands/remove.ts","../src/commands/sync.ts","../src/commands/list.ts"],"sourcesContent":["import { program } from \"commander\";\nimport { configExists } from \"./utils/config.js\";\nimport { setupCommand } from \"./commands/setup.js\";\nimport { serverAddCommand } from \"./commands/server-add.js\";\nimport { serverRemoveCommand } from \"./commands/server-remove.js\";\nimport { serverListCommand } from \"./commands/server-list.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { removeCommand } from \"./commands/remove.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { listCommand } from \"./commands/list.js\";\n\nfunction requireSetup(): void {\n if (!configExists()) {\n console.error(\n 'mcpsmgr is not configured. Run \"mcpsmgr setup\" first.',\n );\n process.exit(1);\n }\n}\n\nprogram\n .name(\"mcpsmgr\")\n .description(\"Unified MCP server manager for multiple coding agents\")\n .version(\"0.1.0\");\n\nprogram\n .command(\"setup\")\n .description(\"Initialize mcpsmgr configuration\")\n .action(setupCommand);\n\nconst server = program\n .command(\"server\")\n .description(\"Manage MCP server definitions in central repository\");\n\nserver\n .command(\"add [source]\")\n .description(\"Add an MCP server (URL or GitHub owner/repo)\")\n .action((source?: string) => {\n requireSetup();\n return serverAddCommand(source);\n });\n\nserver\n .command(\"remove <name>\")\n .description(\"Remove an MCP server from central repository\")\n .action((name: string) => {\n requireSetup();\n return serverRemoveCommand(name);\n });\n\nserver\n .command(\"list\")\n .description(\"List all servers in central repository\")\n .action(() => {\n requireSetup();\n return serverListCommand();\n });\n\nprogram\n .command(\"init\")\n .description(\"Initialize MCP servers for current project\")\n .action(() => {\n requireSetup();\n return initCommand();\n });\n\nprogram\n .command(\"add <server-name>\")\n .description(\"Add a server from central repository to current project\")\n .action((serverName: string) => {\n requireSetup();\n return addCommand(serverName);\n });\n\nprogram\n .command(\"remove <server-name>\")\n .description(\"Remove a server from current project agent configs\")\n .action((serverName: string) => {\n requireSetup();\n return removeCommand(serverName);\n });\n\nprogram\n .command(\"sync\")\n .description(\"Sync central repository changes to project agent configs\")\n .action(() => {\n requireSetup();\n return syncCommand();\n });\n\nprogram\n .command(\"list\")\n .description(\"List MCP servers across all agent configs in current project\")\n .action(() => {\n requireSetup();\n return listCommand();\n });\n\nprogram.parse();\n","import { readFile, writeFile, mkdir, chmod } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { GlobalConfig } from \"../types.js\";\nimport { paths } from \"./paths.js\";\n\nexport async function readGlobalConfig(): Promise<GlobalConfig> {\n const raw = await readFile(paths.configFile, \"utf-8\");\n return JSON.parse(raw) as GlobalConfig;\n}\n\nexport async function writeGlobalConfig(config: GlobalConfig): Promise<void> {\n if (!existsSync(paths.baseDir)) {\n await mkdir(paths.baseDir, { recursive: true });\n await chmod(paths.baseDir, 0o700);\n }\n await writeFile(paths.configFile, JSON.stringify(config, null, 2), \"utf-8\");\n await chmod(paths.configFile, 0o600);\n}\n\nexport function configExists(): boolean {\n return existsSync(paths.configFile);\n}\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst BASE_DIR = join(homedir(), \".mcps-manager\");\n\nexport const paths = {\n baseDir: BASE_DIR,\n serversDir: join(BASE_DIR, \"servers\"),\n configFile: join(BASE_DIR, \"config.json\"),\n serverFile: (name: string): string => join(BASE_DIR, \"servers\", `${name}.json`),\n} as const;\n","import { mkdir, chmod } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { input, select, confirm } from \"@inquirer/prompts\";\nimport type { GlobalConfig } from \"../types.js\";\nimport { paths } from \"../utils/paths.js\";\nimport { writeGlobalConfig, configExists } from \"../utils/config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\n\nconst GLM_ENDPOINTS = [\n {\n name: \"Coding Plan (GLM-5)\",\n value: \"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions\",\n },\n {\n name: \"General (GLM-5)\",\n value: \"https://open.bigmodel.cn/api/paas/v4/chat/completions\",\n },\n] as const;\n\nexport async function setupCommand(): Promise<void> {\n try {\n await setupCommandInner();\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function setupCommandInner(): Promise<void> {\n if (configExists()) {\n const overwrite = await confirm({\n message: \"Configuration already exists. Overwrite?\",\n });\n if (!overwrite) {\n console.log(\"Setup cancelled.\");\n return;\n }\n }\n\n if (!existsSync(paths.baseDir)) {\n await mkdir(paths.baseDir, { recursive: true });\n await chmod(paths.baseDir, 0o700);\n }\n if (!existsSync(paths.serversDir)) {\n await mkdir(paths.serversDir, { recursive: true });\n }\n\n const glmApiKey = await input({\n message: \"Enter GLM5 API Key:\",\n validate: (v) => (v.trim().length > 0 ? true : \"API key is required\"),\n });\n\n const glmEndpoint = await select({\n message: \"Select GLM5 endpoint:\",\n choices: GLM_ENDPOINTS.map((e) => ({ name: e.name, value: e.value })),\n });\n\n const config: GlobalConfig = {\n glm: {\n apiKey: glmApiKey.trim(),\n endpoint: glmEndpoint,\n },\n webReader: {\n apiKey: glmApiKey.trim(),\n url: \"https://open.bigmodel.cn/api/mcp/web_reader/mcp\",\n },\n };\n\n await writeGlobalConfig(config);\n console.log(\"Setup complete. Configuration saved to ~/.mcps-manager/config.json\");\n}\n","export function isUserCancellation(error: unknown): boolean {\n return error instanceof Error && error.name === \"ExitPromptError\";\n}\n","import { confirm, input, password } from \"@inquirer/prompts\";\nimport type { DefaultConfig, ServerDefinition, StdioConfig } from \"../types.js\";\nimport { readGlobalConfig } from \"../utils/config.js\";\nimport {\n serverExists,\n writeServerDefinition,\n} from \"../utils/server-store.js\";\nimport {\n isValidInput,\n buildUserMessage,\n analyzeWithGlm,\n type AnalysisResult,\n} from \"../services/glm-client.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\n\nexport async function serverAddCommand(source?: string): Promise<void> {\n try {\n await serverAddCommandInner(source);\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function serverAddCommandInner(source?: string): Promise<void> {\n const urlInput =\n source ??\n (await input({\n message: \"Enter MCP server URL or GitHub owner/repo (leave empty for manual):\",\n }));\n\n if (urlInput.trim() === \"\") {\n await manualAddFlow();\n return;\n }\n\n const validation = isValidInput(urlInput.trim());\n if (!validation.valid) {\n console.error(`Error: ${validation.reason}`);\n process.exitCode = 1;\n return;\n }\n\n const config = await readGlobalConfig();\n\n console.log(\"Analyzing documentation with GLM5...\");\n let analysis: AnalysisResult;\n try {\n const userMessage = buildUserMessage(urlInput.trim());\n analysis = await analyzeWithGlm(config, userMessage);\n } catch (error) {\n console.error(\n `GLM5 analysis failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n const fallback = await confirm({\n message: \"Would you like to configure manually instead?\",\n });\n if (fallback) {\n await manualAddFlow();\n }\n return;\n }\n\n displayAnalysisResult(analysis, urlInput.trim());\n\n const trust = await confirm({\n message: \"Trust this analysis result?\",\n });\n\n if (!trust) {\n const manual = await confirm({\n message: \"Configure manually instead?\",\n });\n if (manual) {\n await manualAddFlow();\n }\n return;\n }\n\n if (serverExists(analysis.name)) {\n console.error(\n `Error: Server \"${analysis.name}\" already exists. Run \"mcpsmgr server remove ${analysis.name}\" first.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const env: Record<string, string> = {};\n for (const varName of analysis.requiredEnvVars) {\n const value = await password({\n message: `Enter value for ${varName} (stored locally, never sent to servers):`,\n mask: \"*\",\n });\n env[varName] = value;\n }\n\n const defaultConfig: DefaultConfig =\n analysis.default.transport === \"stdio\"\n ? {\n transport: \"stdio\",\n command: analysis.default.command ?? \"\",\n args: [...(analysis.default.args ?? [])],\n env: { ...(analysis.default.env ?? {}), ...env },\n }\n : {\n transport: \"http\",\n url: analysis.default.url ?? \"\",\n headers: { ...(analysis.default.headers ?? {}) },\n };\n\n const definition: ServerDefinition = {\n name: analysis.name,\n source: urlInput.trim(),\n default: defaultConfig,\n overrides: analysis.overrides as ServerDefinition[\"overrides\"],\n };\n\n await writeServerDefinition(definition);\n console.log(`Server \"${analysis.name}\" saved to central repository.`);\n}\n\nfunction displayAnalysisResult(result: AnalysisResult, source: string): void {\n console.log(\"\\n--- Analysis Result ---\");\n console.log(`Name: ${result.name}`);\n console.log(`Source: ${source}`);\n console.log(`Transport: ${result.default.transport}`);\n if (result.default.transport === \"stdio\") {\n console.log(`Command: ${result.default.command}`);\n console.log(`Args: ${JSON.stringify(result.default.args)}`);\n } else {\n console.log(`URL: ${result.default.url}`);\n }\n if (Object.keys(result.overrides).length > 0) {\n console.log(\"Agent overrides:\");\n for (const [agent, override] of Object.entries(result.overrides)) {\n console.log(` ${agent}: ${JSON.stringify(override)}`);\n }\n }\n if (result.requiredEnvVars.length > 0) {\n console.log(\n `Required env vars: ${result.requiredEnvVars.join(\", \")}`,\n );\n }\n console.log(\"---\\n\");\n}\n\nasync function manualAddFlow(): Promise<void> {\n const name = await input({\n message: \"Server name (kebab-case):\",\n validate: (v) =>\n /^[a-z][a-z0-9-]*$/.test(v.trim()) ? true : \"Must be kebab-case\",\n });\n\n if (serverExists(name.trim())) {\n console.error(\n `Error: Server \"${name.trim()}\" already exists. Run \"mcpsmgr server remove ${name.trim()}\" first.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const source = await input({\n message: \"Source URL (optional):\",\n });\n\n const command = await input({\n message: \"Command (e.g., npx):\",\n validate: (v) => (v.trim().length > 0 ? true : \"Command is required\"),\n });\n\n const argsStr = await input({\n message: \"Args (comma-separated, e.g., -y,@scope/package):\",\n });\n const args = argsStr\n .trim()\n .split(\",\")\n .map((a) => a.trim())\n .filter((a) => a.length > 0);\n\n const envPairs: Record<string, string> = {};\n let addMore = true;\n while (addMore) {\n const envName = await input({\n message: \"Env var name (leave empty to finish):\",\n });\n if (envName.trim() === \"\") break;\n const envValue = await password({\n message: `Value for ${envName.trim()} (stored locally, never sent to servers):`,\n mask: \"*\",\n });\n envPairs[envName.trim()] = envValue;\n addMore = true;\n }\n\n const config: StdioConfig = {\n transport: \"stdio\",\n command: command.trim(),\n args,\n env: envPairs,\n };\n\n const definition: ServerDefinition = {\n name: name.trim(),\n source: source.trim(),\n default: config,\n overrides: {},\n };\n\n await writeServerDefinition(definition);\n console.log(`Server \"${name.trim()}\" saved to central repository.`);\n}\n","import { readFile, writeFile, readdir, unlink, mkdir, chmod } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { ServerDefinition } from \"../types.js\";\nimport { paths } from \"./paths.js\";\n\nexport async function readServerDefinition(\n name: string,\n): Promise<ServerDefinition | undefined> {\n const filePath = paths.serverFile(name);\n if (!existsSync(filePath)) {\n return undefined;\n }\n const raw = await readFile(filePath, \"utf-8\");\n return JSON.parse(raw) as ServerDefinition;\n}\n\nexport async function writeServerDefinition(\n definition: ServerDefinition,\n): Promise<void> {\n if (!existsSync(paths.serversDir)) {\n await mkdir(paths.serversDir, { recursive: true });\n }\n const filePath = paths.serverFile(definition.name);\n await writeFile(filePath, JSON.stringify(definition, null, 2), \"utf-8\");\n await chmod(filePath, 0o600);\n}\n\nexport async function removeServerDefinition(name: string): Promise<boolean> {\n const filePath = paths.serverFile(name);\n if (!existsSync(filePath)) {\n return false;\n }\n await unlink(filePath);\n return true;\n}\n\nexport async function listServerDefinitions(): Promise<ServerDefinition[]> {\n if (!existsSync(paths.serversDir)) {\n return [];\n }\n const files = await readdir(paths.serversDir);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\"));\n const results: ServerDefinition[] = [];\n for (const file of jsonFiles) {\n const raw = await readFile(\n paths.serverFile(file.replace(\".json\", \"\")),\n \"utf-8\",\n );\n results.push(JSON.parse(raw) as ServerDefinition);\n }\n return results;\n}\n\nexport function serverExists(name: string): boolean {\n return existsSync(paths.serverFile(name));\n}\n","import type { GlobalConfig } from \"../types.js\";\n\ninterface McpResponse {\n readonly jsonrpc: string;\n readonly id: number;\n readonly result?: {\n readonly content?: readonly { readonly type: string; readonly text: string }[];\n readonly isError?: boolean;\n };\n readonly error?: { readonly code: number; readonly message: string };\n}\n\nfunction parseSseResponse(raw: string): McpResponse {\n const lines = raw.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"data:\")) {\n return JSON.parse(line.slice(5)) as McpResponse;\n }\n }\n return JSON.parse(raw) as McpResponse;\n}\n\nasync function mcpInitialize(\n endpoint: string,\n apiKey: string,\n): Promise<string> {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 1,\n method: \"initialize\",\n params: {\n protocolVersion: \"2025-03-26\",\n capabilities: {},\n clientInfo: { name: \"mcpsmgr\", version: \"0.1.0\" },\n },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `MCP initialize failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const sessionId = response.headers.get(\"mcp-session-id\");\n if (!sessionId) {\n throw new Error(\"MCP server did not return session ID\");\n }\n\n return sessionId;\n}\n\nasync function mcpToolCall(\n endpoint: string,\n apiKey: string,\n sessionId: string,\n toolName: string,\n args: Record<string, unknown>,\n): Promise<string> {\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json, text/event-stream\",\n Authorization: `Bearer ${apiKey}`,\n \"Mcp-Session-Id\": sessionId,\n },\n body: JSON.stringify({\n jsonrpc: \"2.0\",\n id: 2,\n method: \"tools/call\",\n params: { name: toolName, arguments: args },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `MCP tools/call failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const raw = await response.text();\n const parsed = parseSseResponse(raw);\n\n if (parsed.error) {\n throw new Error(`MCP error: ${parsed.error.message}`);\n }\n\n const contents = parsed.result?.content ?? [];\n const full = contents.map((c) => c.text).join(\"\\n\");\n const MAX_CONTENT_LENGTH = 30000;\n if (full.length > MAX_CONTENT_LENGTH) {\n return full.slice(0, MAX_CONTENT_LENGTH) + \"\\n\\n[Content truncated]\";\n }\n return full;\n}\n\nlet cachedSessionId: string | undefined;\n\nexport async function fetchWebContent(\n config: GlobalConfig,\n url: string,\n): Promise<string> {\n const endpoint = config.webReader.url;\n const apiKey = config.webReader.apiKey;\n\n if (!cachedSessionId) {\n cachedSessionId = await mcpInitialize(endpoint, apiKey);\n }\n\n try {\n return await mcpToolCall(endpoint, apiKey, cachedSessionId, \"webReader\", {\n url,\n timeout: 20,\n });\n } catch {\n cachedSessionId = await mcpInitialize(endpoint, apiKey);\n return await mcpToolCall(endpoint, apiKey, cachedSessionId, \"webReader\", {\n url,\n timeout: 20,\n });\n }\n}\n","export const ANALYSIS_SYSTEM_PROMPT = `You are an MCP (Model Context Protocol) server configuration analyst. Your task is to analyze documentation for an MCP server and extract configuration details for 5 different coding agents.\n\nThe 5 agents and their configuration differences:\n\n1. **Claude Code** (.mcp.json)\n - Format: { \"type\": \"stdio\"|\"http\", \"command\": \"...\", \"args\": [...] }\n - HTTP: { \"type\": \"http\", \"url\": \"...\", \"headers\": {...} }\n - IMPORTANT: Do NOT use \"env\" field. Environment variables will be handled separately.\n\n2. **Codex** (.codex/config.toml)\n - TOML format: command = \"...\", args = [...]\n - Same key names as Claude Code but in TOML\n - IMPORTANT: Do NOT use \"env\" field.\n\n3. **Gemini CLI** (.gemini/settings.json)\n - Format: { \"command\": \"...\", \"args\": [...] }\n - No \"type\" field needed\n - IMPORTANT: Do NOT use \"env\" field.\n\n4. **OpenCode** (opencode.json)\n - Format: { \"type\": \"local\"|\"remote\", \"command\": [\"cmd\", \"arg1\", ...] }\n - command is an ARRAY including the command itself\n - type is \"local\" for stdio, \"remote\" for http\n - IMPORTANT: Do NOT use \"environment\" field.\n\n5. **Antigravity** (~/.gemini/antigravity/mcp_config.json)\n - Format: { \"command\": \"...\", \"args\": [...] }\n - HTTP: { \"serverUrl\": \"...\", \"headers\": {...} } (note: \"serverUrl\" not \"url\")\n - IMPORTANT: Do NOT use \"env\" field.\n\nYou have access to a webReader tool to fetch web page content. Use it to read the documentation URL provided.\n\nAfter analyzing the documentation, return a JSON object with this exact structure:\n\\`\\`\\`json\n{\n \"name\": \"server-name\",\n \"default\": {\n \"transport\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@scope/package\"],\n },\n \"overrides\": {\n \"opencode\": {\n \"transport\": \"stdio\",\n \"command\": \"npx\",\n \"args\": [\"-y\", \"@scope/package\"],\n \"env\": {}\n }\n },\n \"requiredEnvVars\": [\"API_KEY\"]\n}\n\\`\\`\\`\n\nRules:\n- \"name\" should be a kebab-case identifier for the server\n- \"default\" should be the most common configuration (usually works for Claude Code, Codex, Gemini CLI)\n- Only add \"overrides\" for agents that need DIFFERENT configuration from the default\n- OpenCode usually needs an override because its command format differs (array vs string+args)\n- \"requiredEnvVars\" lists environment variable names the user needs to provide values for\n- Transport is either \"stdio\" or \"http\"\n- Return ONLY the JSON object, no markdown fences, no explanation`;\n","import type { GlobalConfig } from \"../types.js\";\nimport { fetchWebContent } from \"./web-reader.js\";\nimport { ANALYSIS_SYSTEM_PROMPT } from \"./system-prompt.js\";\n\ninterface GlmMessage {\n readonly role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n readonly content: string | null;\n readonly tool_calls?: readonly GlmToolCall[];\n readonly tool_call_id?: string;\n}\n\ninterface GlmToolCall {\n readonly id: string;\n readonly type: \"function\";\n readonly function: {\n readonly name: string;\n readonly arguments: string;\n };\n}\n\ninterface GlmResponse {\n readonly choices: readonly {\n readonly message: GlmMessage;\n readonly finish_reason: string;\n }[];\n}\n\nconst WEB_READER_TOOL = {\n type: \"function\" as const,\n function: {\n name: \"webReader\",\n description: \"Fetch and read the content of a web page given its URL\",\n parameters: {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"The URL of the web page to read\",\n },\n },\n required: [\"url\"],\n },\n },\n};\n\nexport interface AnalysisResult {\n readonly name: string;\n readonly default: {\n readonly transport: \"stdio\" | \"http\";\n readonly command?: string;\n readonly args?: readonly string[];\n readonly env?: Readonly<Record<string, string>>;\n readonly url?: string;\n readonly headers?: Readonly<Record<string, string>>;\n };\n readonly overrides: Readonly<Record<string, unknown>>;\n readonly requiredEnvVars: readonly string[];\n}\n\nasync function callGlm(\n config: GlobalConfig,\n messages: GlmMessage[],\n): Promise<GlmResponse> {\n const response = await fetch(config.glm.endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.glm.apiKey}`,\n },\n body: JSON.stringify({\n model: \"glm-5\",\n messages,\n tools: [WEB_READER_TOOL],\n tool_choice: \"auto\",\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `GLM5 API request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return (await response.json()) as GlmResponse;\n}\n\nexport async function analyzeWithGlm(\n config: GlobalConfig,\n userMessage: string,\n): Promise<AnalysisResult> {\n const messages: GlmMessage[] = [\n { role: \"system\", content: ANALYSIS_SYSTEM_PROMPT },\n { role: \"user\", content: userMessage },\n ];\n\n const MAX_ROUNDS = 10;\n for (let round = 0; round < MAX_ROUNDS; round++) {\n const response = await callGlm(config, messages);\n const choice = response.choices.at(0);\n if (!choice) {\n throw new Error(\"GLM5 returned empty response\");\n }\n\n const assistantMessage = choice.message;\n messages.push({\n role: \"assistant\",\n content: assistantMessage.content,\n tool_calls: assistantMessage.tool_calls,\n });\n\n if (\n !assistantMessage.tool_calls ||\n assistantMessage.tool_calls.length === 0\n ) {\n return parseAnalysisResult(assistantMessage.content ?? \"\");\n }\n\n for (const toolCall of assistantMessage.tool_calls) {\n if (toolCall.function.name === \"webReader\") {\n const args = JSON.parse(toolCall.function.arguments) as {\n url: string;\n };\n let toolResult: string;\n try {\n toolResult = await fetchWebContent(config, args.url);\n } catch (error) {\n toolResult = `Error fetching URL: ${error instanceof Error ? error.message : String(error)}`;\n }\n messages.push({\n role: \"tool\",\n content: toolResult,\n tool_call_id: toolCall.id,\n });\n }\n }\n }\n\n throw new Error(\"GLM5 analysis exceeded maximum rounds\");\n}\n\nfunction parseAnalysisResult(content: string): AnalysisResult {\n const cleaned = content\n .replace(/```json\\s*/g, \"\")\n .replace(/```\\s*/g, \"\")\n .trim();\n\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n throw new Error(`Cannot extract JSON from GLM5 response: ${cleaned.slice(0, 200)}`);\n }\n\n const result = JSON.parse(jsonMatch[0]) as AnalysisResult;\n if (!result.name || !result.default) {\n throw new Error(\"Invalid analysis result: missing name or default config\");\n }\n\n return result;\n}\n\nexport function buildUserMessage(input: string): string {\n if (isGitHubRepo(input)) {\n const url = `https://github.com/${input}`;\n return `Please analyze the MCP server at ${url}. Start by reading the README at ${url}/blob/main/README.md`;\n }\n return `Please analyze the MCP server documentation at: ${input}`;\n}\n\nexport function isGitHubRepo(input: string): boolean {\n if (input.startsWith(\"http\") || input.startsWith(\"@\")) {\n return false;\n }\n const parts = input.split(\"/\");\n return parts.length === 2 && parts.every((p) => p.length > 0);\n}\n\nexport function isValidInput(\n input: string,\n): { valid: true } | { valid: false; reason: string } {\n if (input.startsWith(\"http://\") || input.startsWith(\"https://\")) {\n return { valid: true };\n }\n if (isGitHubRepo(input)) {\n return { valid: true };\n }\n return {\n valid: false,\n reason:\n 'Invalid input format. Provide a URL (https://...) or GitHub owner/repo (e.g., \"anthropics/mcp-brave-search\")',\n };\n}\n","import { removeServerDefinition, serverExists } from \"../utils/server-store.js\";\n\nexport async function serverRemoveCommand(name: string): Promise<void> {\n if (!serverExists(name)) {\n console.error(`Error: Server \"${name}\" does not exist in central repository.`);\n process.exitCode = 1;\n return;\n }\n\n await removeServerDefinition(name);\n console.log(`Server \"${name}\" removed from central repository.`);\n}\n","import { listServerDefinitions } from \"../utils/server-store.js\";\n\nexport async function serverListCommand(): Promise<void> {\n const servers = await listServerDefinitions();\n\n if (servers.length === 0) {\n console.log(\"No servers in central repository. Use \\\"mcpsmgr server add\\\" to add one.\");\n return;\n }\n\n console.log(\"\\nCentral Repository Servers:\\n\");\n for (const server of servers) {\n const overrideCount = Object.keys(server.overrides).length;\n const overrideInfo =\n overrideCount > 0 ? ` (${overrideCount} overrides)` : \"\";\n console.log(\n ` ${server.name} [${server.default.transport}]${overrideInfo}`,\n );\n if (server.source) {\n console.log(` source: ${server.source}`);\n }\n }\n console.log();\n}\n","import { checkbox, confirm } from \"@inquirer/prompts\";\nimport { allAdapters, detectAgents } from \"../adapters/index.js\";\nimport { listServerDefinitions } from \"../utils/server-store.js\";\nimport { resolveConfig } from \"../utils/resolve-config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\nexport async function initCommand(): Promise<void> {\n try {\n await initCommandInner();\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function initCommandInner(): Promise<void> {\n const projectDir = process.cwd();\n\n const servers = await listServerDefinitions();\n if (servers.length === 0) {\n console.log(\n \"Central repository is empty. Use \\\"mcpsmgr server add\\\" to add servers first.\",\n );\n return;\n }\n\n const detected = detectAgents(projectDir);\n const detectedIds = new Set(detected.map((a) => a.id));\n\n const selectedAgents = await checkbox<AgentAdapter>({\n message: \"Select agents to configure:\",\n choices: allAdapters.map((adapter) => ({\n name: `${adapter.name}${detectedIds.has(adapter.id) ? \" (detected)\" : \"\"}${adapter.isGlobal ? \" [global]\" : \"\"}`,\n value: adapter,\n checked: detectedIds.has(adapter.id) && !adapter.isGlobal,\n })),\n });\n\n if (selectedAgents.length === 0) {\n console.log(\"No agents selected.\");\n return;\n }\n\n const agentServerMap = new Map<string, Set<string>>();\n const detectedServers = new Set<string>();\n for (const agent of selectedAgents) {\n try {\n const existing = await agent.read(projectDir);\n const names = new Set(Object.keys(existing));\n agentServerMap.set(agent.id, names);\n for (const name of names) {\n detectedServers.add(name);\n }\n } catch {\n // silent fallback per design decision\n }\n }\n\n const selectedServers = await checkbox({\n message: \"Select servers to deploy:\",\n choices: servers.map((s) => ({\n name: `${s.name}${detectedServers.has(s.name) ? \" (detected)\" : \"\"} [${s.default.transport}]`,\n value: s,\n checked: detectedServers.has(s.name),\n })),\n });\n\n const selectedServerNames = new Set(selectedServers.map((s) => s.name));\n\n const removals = new Map<string, AgentAdapter[]>();\n for (const serverName of detectedServers) {\n if (!selectedServerNames.has(serverName)) {\n const agents = selectedAgents.filter((a) => {\n const agentServers = agentServerMap.get(a.id);\n return agentServers?.has(serverName);\n });\n if (agents.length > 0) {\n removals.set(serverName, agents);\n }\n }\n }\n\n if (selectedServers.length === 0 && removals.size === 0) {\n console.log(\"No servers selected.\");\n return;\n }\n\n console.log(\"\\nPlan:\");\n for (const agent of selectedAgents) {\n console.log(` ${agent.name}:`);\n for (const server of selectedServers) {\n console.log(` + ${server.name}`);\n }\n for (const [serverName, agents] of removals) {\n if (agents.some((a) => a.id === agent.id)) {\n console.log(` - ${serverName}`);\n }\n }\n }\n\n const proceed = await confirm({ message: \"Proceed?\" });\n if (!proceed) {\n console.log(\"Cancelled.\");\n return;\n }\n\n for (const agent of selectedAgents) {\n for (const server of selectedServers) {\n try {\n const config = resolveConfig(server, agent);\n await agent.write(projectDir, server.name, config);\n console.log(` + ${server.name} -> ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${server.name} -> ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n for (const [serverName, agents] of removals) {\n for (const agent of agents) {\n try {\n await agent.remove(projectDir, serverName);\n console.log(` - ${serverName} <- ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${serverName} <- ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n console.log(\"\\nDone.\");\n}\n","import { existsSync } from \"node:fs\";\nimport type { AgentAdapter, AgentId } from \"../types.js\";\nimport { claudeCodeAdapter } from \"./claude-code.js\";\nimport { codexAdapter } from \"./codex.js\";\nimport { geminiCliAdapter } from \"./gemini-cli.js\";\nimport { opencodeAdapter } from \"./opencode.js\";\nimport { antigravityAdapter } from \"./antigravity.js\";\nimport { openclawAdapter } from \"./openclaw.js\";\n\nexport const allAdapters: readonly AgentAdapter[] = [\n claudeCodeAdapter,\n codexAdapter,\n geminiCliAdapter,\n opencodeAdapter,\n antigravityAdapter,\n openclawAdapter,\n];\n\nexport function getAdapter(id: AgentId): AgentAdapter {\n const adapter = allAdapters.find((a) => a.id === id);\n if (!adapter) {\n throw new Error(`Unknown agent: ${id}`);\n }\n return adapter;\n}\n\nexport function detectAgents(projectDir: string): AgentAdapter[] {\n return allAdapters.filter((adapter) => {\n if (adapter.isGlobal) {\n return existsSync(adapter.configPath(projectDir));\n }\n return existsSync(adapter.configPath(projectDir));\n });\n}\n","import { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n type: \"stdio\",\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n type: \"stdio\",\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n type: \"http\",\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n const type = raw[\"type\"] as string | undefined;\n if (type === \"stdio\") {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (type === \"http\") {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const claudeCodeAdapter: AgentAdapter = {\n id: \"claude-code\",\n name: \"Claude Code\",\n configPath: (projectDir) => join(projectDir, \".mcp.json\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n return (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Claude Code config`,\n );\n }\n const updated = {\n ...data,\n mcpServers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(filePath, { ...data, mcpServers: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \".mcp.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\n\nexport async function readJsonFile(\n filePath: string,\n): Promise<Record<string, unknown>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const raw = await readFile(filePath, \"utf-8\");\n return JSON.parse(raw) as Record<string, unknown>;\n}\n\nexport async function writeJsonFile(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n","const ENV_VAR_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*=/;\n\nexport function buildEnvArgs(\n env: Readonly<Record<string, string>>,\n): string[] {\n return Object.entries(env).map(([key, value]) => `${key}=${value}`);\n}\n\nexport function parseEnvArgs(args: readonly string[]): {\n readonly env: Record<string, string>;\n readonly commandIndex: number;\n} {\n const env: Record<string, string> = {};\n for (let i = 0; i < args.length; i++) {\n if (ENV_VAR_PATTERN.test(args[i])) {\n const eqIndex = args[i].indexOf(\"=\");\n env[args[i].slice(0, eqIndex)] = args[i].slice(eqIndex + 1);\n } else {\n return { env, commandIndex: i };\n }\n }\n return { env, commandIndex: args.length };\n}\n\nexport function resolveEnvInArgs(\n args: readonly string[],\n env: Readonly<Record<string, string>>,\n): {\n readonly resolvedArgs: string[];\n readonly remainingEnv: Record<string, string>;\n} {\n const substitutedKeys = new Set<string>();\n const resolvedArgs = args.map((arg) =>\n arg.replace(/\\$\\{([^}]+)\\}/g, (match, varName: string) => {\n if (varName in env) {\n substitutedKeys.add(varName);\n return env[varName];\n }\n return match;\n }),\n );\n\n const remainingEnv: Record<string, string> = {};\n for (const [key, value] of Object.entries(env)) {\n if (!substitutedKeys.has(key)) {\n remainingEnv[key] = value;\n }\n }\n\n return { resolvedArgs, remainingEnv };\n}\n","import { join } from \"node:path\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (raw[\"command\"]) {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (raw[\"url\"]) {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nasync function readTomlFile(\n filePath: string,\n): Promise<{ raw: string; parsed: Record<string, unknown> }> {\n if (!existsSync(filePath)) {\n return { raw: \"\", parsed: {} };\n }\n const raw = await readFile(filePath, \"utf-8\");\n const parsed = parseToml(raw) as Record<string, unknown>;\n return { raw, parsed };\n}\n\nasync function writeTomlFile(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(filePath, stringifyToml(data) + \"\\n\", \"utf-8\");\n}\n\nexport const codexAdapter: AgentAdapter = {\n id: \"codex\",\n name: \"Codex\",\n configPath: (projectDir) => join(projectDir, \".codex\", \"config.toml\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n return (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n const servers = (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Codex config`,\n );\n }\n const updated = {\n ...parsed,\n mcp_servers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeTomlFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n const servers = (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeTomlFile(filePath, { ...parsed, mcp_servers: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \".codex\", \"config.toml\");\n const { parsed } = await readTomlFile(filePath);\n const servers = (parsed[\"mcp_servers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (raw[\"command\"]) {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (raw[\"url\"]) {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const geminiCliAdapter: AgentAdapter = {\n id: \"gemini-cli\",\n name: \"Gemini CLI\",\n configPath: (projectDir) => join(projectDir, \".gemini\", \"settings.json\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n return (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Gemini CLI config`,\n );\n }\n const updated = {\n ...data,\n mcpServers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(filePath, { ...data, mcpServers: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \".gemini\", \"settings.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n type: \"local\",\n command: [\"env\", ...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n type: \"local\",\n command: [config.command, ...resolvedArgs],\n };\n }\n return {\n type: \"remote\",\n url: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n const type = raw[\"type\"] as string | undefined;\n if (type === \"local\") {\n const commandArr = raw[\"command\"] as string[];\n const legacyEnv = raw[\"environment\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n const [command = \"\", ...args] = commandArr;\n return { transport: \"stdio\", command, args, env: legacyEnv };\n }\n\n if (commandArr[0] === \"env\") {\n const { env, commandIndex } = parseEnvArgs(commandArr.slice(1));\n const actualIndex = commandIndex + 1;\n return {\n transport: \"stdio\",\n command: commandArr[actualIndex] ?? \"\",\n args: commandArr.slice(actualIndex + 1),\n env,\n };\n }\n\n const [command = \"\", ...args] = commandArr;\n return { transport: \"stdio\", command, args, env: {} };\n }\n if (type === \"remote\") {\n return {\n transport: \"http\",\n url: raw[\"url\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const opencodeAdapter: AgentAdapter = {\n id: \"opencode\",\n name: \"OpenCode\",\n configPath: (projectDir) => join(projectDir, \"opencode.json\"),\n isGlobal: false,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read(projectDir) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n return (data[\"mcp\"] as Record<string, unknown>) ?? {};\n },\n\n async write(projectDir, serverName, config) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcp\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in OpenCode config`,\n );\n }\n const updated = {\n ...data,\n mcp: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(filePath, updated);\n },\n\n async remove(projectDir, serverName) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcp\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(filePath, { ...data, mcp: rest });\n },\n\n async has(projectDir, serverName) {\n const filePath = join(projectDir, \"opencode.json\");\n const data = await readJsonFile(filePath);\n const servers = (data[\"mcp\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJsonFile, writeJsonFile } from \"./json-file.js\";\nimport { buildEnvArgs, parseEnvArgs, resolveEnvInArgs } from \"./env-args.js\";\n\nconst GLOBAL_CONFIG_PATH = join(\n homedir(),\n \".gemini\",\n \"antigravity\",\n \"mcp_config.json\",\n);\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const envArgs = buildEnvArgs(remainingEnv);\n if (envArgs.length > 0) {\n return {\n command: \"env\",\n args: [...envArgs, config.command, ...resolvedArgs],\n };\n }\n return {\n command: config.command,\n args: resolvedArgs,\n };\n }\n return {\n serverUrl: config.url,\n headers: { ...config.headers },\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (raw[\"command\"]) {\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const legacyEnv = raw[\"env\"] as Record<string, string> | undefined;\n\n if (legacyEnv && Object.keys(legacyEnv).length > 0) {\n return { transport: \"stdio\", command, args: rawArgs, env: legacyEnv };\n }\n\n if (command === \"env\") {\n const { env, commandIndex } = parseEnvArgs(rawArgs);\n return {\n transport: \"stdio\",\n command: rawArgs[commandIndex] ?? \"\",\n args: rawArgs.slice(commandIndex + 1),\n env,\n };\n }\n\n return { transport: \"stdio\", command, args: rawArgs, env: {} };\n }\n if (raw[\"serverUrl\"]) {\n return {\n transport: \"http\",\n url: raw[\"serverUrl\"] as string,\n headers: (raw[\"headers\"] as Record<string, string>) ?? {},\n };\n }\n return undefined;\n}\n\nexport const antigravityAdapter: AgentAdapter = {\n id: \"antigravity\",\n name: \"Antigravity\",\n configPath: () => GLOBAL_CONFIG_PATH,\n isGlobal: true,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read() {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n return (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n },\n\n async write(_projectDir, serverName, config) {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in Antigravity config`,\n );\n }\n const updated = {\n ...data,\n mcpServers: { ...servers, [serverName]: toAgentFormat(config) },\n };\n await writeJsonFile(GLOBAL_CONFIG_PATH, updated);\n },\n\n async remove(_projectDir, serverName) {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n const { [serverName]: _, ...rest } = servers;\n await writeJsonFile(GLOBAL_CONFIG_PATH, { ...data, mcpServers: rest });\n },\n\n async has(_projectDir, serverName) {\n const data = await readJsonFile(GLOBAL_CONFIG_PATH);\n const servers = (data[\"mcpServers\"] as Record<string, unknown>) ?? {};\n return serverName in servers;\n },\n};\n","import { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentAdapter, DefaultConfig } from \"../types.js\";\nimport { readJson5File, writeJson5File } from \"./json5-file.js\";\nimport { resolveEnvInArgs } from \"./env-args.js\";\n\nconst GLOBAL_CONFIG_PATH = join(\n homedir(),\n \".openclaw\",\n \"openclaw.json\",\n);\n\nfunction getMcpServers(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const plugins = data[\"plugins\"] as Record<string, unknown> | undefined;\n const entries = plugins?.[\"entries\"] as Record<string, unknown> | undefined;\n const acpx = entries?.[\"acpx\"] as Record<string, unknown> | undefined;\n return (acpx?.[\"mcpServers\"] as Record<string, unknown>) ?? {};\n}\n\nfunction setMcpServers(\n data: Record<string, unknown>,\n servers: Record<string, unknown>,\n): Record<string, unknown> {\n const plugins = (data[\"plugins\"] as Record<string, unknown>) ?? {};\n const entries = (plugins[\"entries\"] as Record<string, unknown>) ?? {};\n const acpx = (entries[\"acpx\"] as Record<string, unknown>) ?? {};\n return {\n ...data,\n plugins: {\n ...plugins,\n entries: {\n ...entries,\n acpx: {\n ...acpx,\n enabled: true,\n mcpServers: servers,\n },\n },\n },\n };\n}\n\nfunction toAgentFormat(config: DefaultConfig): Record<string, unknown> {\n if (config.transport === \"stdio\") {\n const { resolvedArgs, remainingEnv } = resolveEnvInArgs(\n config.args,\n config.env,\n );\n const result: Record<string, unknown> = {\n command: config.command,\n args: resolvedArgs,\n };\n if (Object.keys(remainingEnv).length > 0) {\n result[\"env\"] = { ...remainingEnv };\n }\n return result;\n }\n const args = [\"-y\", \"mcp-remote@latest\", config.url];\n for (const [key, value] of Object.entries(config.headers)) {\n args.push(\"--header\", `${key}: ${value}`);\n }\n return {\n command: \"npx\",\n args,\n };\n}\n\nfunction fromAgentFormat(\n _name: string,\n raw: Record<string, unknown>,\n): DefaultConfig | undefined {\n if (!raw[\"command\"]) {\n return undefined;\n }\n const command = raw[\"command\"] as string;\n const rawArgs = (raw[\"args\"] as string[]) ?? [];\n const env = (raw[\"env\"] as Record<string, string>) ?? {};\n return { transport: \"stdio\", command, args: rawArgs, env };\n}\n\nexport const openclawAdapter: AgentAdapter = {\n id: \"openclaw\",\n name: \"OpenClaw\",\n configPath: () => GLOBAL_CONFIG_PATH,\n isGlobal: true,\n\n toAgentFormat,\n fromAgentFormat,\n\n async read() {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n return getMcpServers(data);\n },\n\n async write(_projectDir, serverName, config) {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n const servers = getMcpServers(data);\n if (serverName in servers) {\n throw new Error(\n `Conflict: \"${serverName}\" already exists in OpenClaw config`,\n );\n }\n const updated = setMcpServers(data, {\n ...servers,\n [serverName]: toAgentFormat(config),\n });\n await writeJson5File(GLOBAL_CONFIG_PATH, updated);\n },\n\n async remove(_projectDir, serverName) {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n const servers = getMcpServers(data);\n const { [serverName]: _, ...rest } = servers;\n await writeJson5File(GLOBAL_CONFIG_PATH, setMcpServers(data, rest));\n },\n\n async has(_projectDir, serverName) {\n const data = await readJson5File(GLOBAL_CONFIG_PATH);\n const servers = getMcpServers(data);\n return serverName in servers;\n },\n};\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport JSON5 from \"json5\";\n\nexport async function readJson5File(\n filePath: string,\n): Promise<Record<string, unknown>> {\n if (!existsSync(filePath)) {\n return {};\n }\n const raw = await readFile(filePath, \"utf-8\");\n return JSON5.parse(raw) as Record<string, unknown>;\n}\n\nexport async function writeJson5File(\n filePath: string,\n data: Record<string, unknown>,\n): Promise<void> {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n","import type { AgentAdapter, DefaultConfig, ServerDefinition } from \"../types.js\";\n\nexport function resolveConfig(\n definition: ServerDefinition,\n adapter: AgentAdapter,\n): DefaultConfig {\n const override = definition.overrides[adapter.id];\n if (override) {\n const base = definition.default;\n return { ...base, ...override } as DefaultConfig;\n }\n return definition.default;\n}\n","import { checkbox } from \"@inquirer/prompts\";\nimport { detectAgents } from \"../adapters/index.js\";\nimport { readServerDefinition, serverExists } from \"../utils/server-store.js\";\nimport { resolveConfig } from \"../utils/resolve-config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\nexport async function addCommand(serverName: string): Promise<void> {\n try {\n await addCommandInner(serverName);\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function addCommandInner(serverName: string): Promise<void> {\n const projectDir = process.cwd();\n\n if (!serverExists(serverName)) {\n console.error(\n `Error: Server \"${serverName}\" not found in central repository.`,\n );\n process.exitCode = 1;\n return;\n }\n\n const definition = await readServerDefinition(serverName);\n if (!definition) {\n console.error(`Error: Failed to read server definition for \"${serverName}\".`);\n process.exitCode = 1;\n return;\n }\n\n const detected = detectAgents(projectDir);\n if (detected.length === 0) {\n console.log(\n \"No agent config files detected in this project. Use \\\"mcpsmgr init\\\" first.\",\n );\n return;\n }\n\n const selectedAgents = await checkbox<AgentAdapter>({\n message: `Select agents to add \"${serverName}\" to:`,\n choices: detected.map((adapter) => ({\n name: `${adapter.name}${adapter.isGlobal ? \" [global]\" : \"\"}`,\n value: adapter,\n checked: !adapter.isGlobal,\n })),\n });\n\n if (selectedAgents.length === 0) {\n console.log(\"No agents selected.\");\n return;\n }\n\n for (const agent of selectedAgents) {\n try {\n const config = resolveConfig(definition, agent);\n await agent.write(projectDir, serverName, config);\n console.log(` + ${serverName} -> ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${serverName} -> ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import { checkbox } from \"@inquirer/prompts\";\nimport { allAdapters } from \"../adapters/index.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\nexport async function removeCommand(serverName: string): Promise<void> {\n try {\n await removeCommandInner(serverName);\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function removeCommandInner(serverName: string): Promise<void> {\n const projectDir = process.cwd();\n\n const agentsWithServer: AgentAdapter[] = [];\n for (const adapter of allAdapters) {\n try {\n const has = await adapter.has(projectDir, serverName);\n if (has) {\n agentsWithServer.push(adapter);\n }\n } catch {\n // config file doesn't exist, skip\n }\n }\n\n if (agentsWithServer.length === 0) {\n console.log(\n `Server \"${serverName}\" not found in any agent configuration.`,\n );\n return;\n }\n\n const selectedAgents = await checkbox<AgentAdapter>({\n message: `Remove \"${serverName}\" from which agents?`,\n choices: agentsWithServer.map((adapter) => ({\n name: `${adapter.name}${adapter.isGlobal ? \" [global]\" : \"\"}`,\n value: adapter,\n checked: !adapter.isGlobal,\n })),\n });\n\n if (selectedAgents.length === 0) {\n console.log(\"No agents selected.\");\n return;\n }\n\n for (const agent of selectedAgents) {\n try {\n await agent.remove(projectDir, serverName);\n console.log(` - ${serverName} <- ${agent.name}`);\n } catch (error) {\n console.warn(\n ` ! ${serverName} <- ${agent.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","import { confirm } from \"@inquirer/prompts\";\nimport { allAdapters } from \"../adapters/index.js\";\nimport { listServerDefinitions } from \"../utils/server-store.js\";\nimport { resolveConfig } from \"../utils/resolve-config.js\";\nimport { isUserCancellation } from \"../utils/prompt.js\";\n\nexport async function syncCommand(): Promise<void> {\n try {\n await syncCommandInner();\n } catch (error) {\n if (isUserCancellation(error)) return;\n throw error;\n }\n}\n\nasync function syncCommandInner(): Promise<void> {\n const projectDir = process.cwd();\n\n const definitions = await listServerDefinitions();\n if (definitions.length === 0) {\n console.log(\"Central repository is empty. Nothing to sync.\");\n return;\n }\n\n const changes: Array<{\n agentName: string;\n serverName: string;\n action: \"update\" | \"skip\";\n reason?: string;\n }> = [];\n\n for (const adapter of allAdapters) {\n let servers: Record<string, unknown>;\n try {\n servers = await adapter.read(projectDir);\n } catch {\n continue;\n }\n\n for (const definition of definitions) {\n if (!(definition.name in servers)) {\n continue;\n }\n\n const currentRaw = servers[definition.name] as Record<string, unknown>;\n const desired = resolveConfig(definition, adapter);\n const desiredRaw = adapter.toAgentFormat(desired);\n\n if (JSON.stringify(currentRaw) !== JSON.stringify(desiredRaw)) {\n changes.push({\n agentName: adapter.name,\n serverName: definition.name,\n action: \"update\",\n });\n }\n }\n }\n\n if (changes.length === 0) {\n console.log(\"All agent configurations are up to date.\");\n return;\n }\n\n console.log(\"\\nSync preview:\");\n for (const change of changes) {\n console.log(` ~ ${change.serverName} -> ${change.agentName}`);\n }\n\n const proceed = await confirm({ message: \"Apply changes?\" });\n if (!proceed) {\n console.log(\"Cancelled.\");\n return;\n }\n\n for (const adapter of allAdapters) {\n for (const definition of definitions) {\n const relevant = changes.find(\n (c) =>\n c.agentName === adapter.name &&\n c.serverName === definition.name,\n );\n if (!relevant) continue;\n\n try {\n await adapter.remove(projectDir, definition.name);\n const config = resolveConfig(definition, adapter);\n await adapter.write(projectDir, definition.name, config);\n console.log(` ~ ${definition.name} -> ${adapter.name} (updated)`);\n } catch (error) {\n console.warn(\n ` ! ${definition.name} -> ${adapter.name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n console.log(\"\\nSync complete.\");\n}\n","import { allAdapters } from \"../adapters/index.js\";\nimport type { AgentAdapter } from \"../types.js\";\n\ninterface ServerEntry {\n transport: string;\n}\n\nexport async function listCommand(): Promise<void> {\n const projectDir = process.cwd();\n\n const matrix: Record<string, Record<string, ServerEntry>> = {};\n const activeAdapters: AgentAdapter[] = [];\n\n for (const adapter of allAdapters) {\n let servers: Record<string, unknown>;\n try {\n servers = await adapter.read(projectDir);\n } catch {\n continue;\n }\n\n if (Object.keys(servers).length === 0) continue;\n\n activeAdapters.push(adapter);\n for (const [name, raw] of Object.entries(servers)) {\n if (!matrix[name]) {\n matrix[name] = {};\n }\n const config = adapter.fromAgentFormat(\n name,\n raw as Record<string, unknown>,\n );\n matrix[name][adapter.id] = {\n transport: config?.transport ?? \"?\",\n };\n }\n }\n\n if (Object.keys(matrix).length === 0) {\n console.log(\n \"No MCP servers found in any agent configuration. Use \\\"mcpsmgr init\\\" to get started.\",\n );\n return;\n }\n\n const serverNames = Object.keys(matrix).sort();\n const agentIds = activeAdapters.map((a) => a.id);\n const agentNames = activeAdapters.map((a) => a.name);\n\n const colWidths = [\n Math.max(6, ...serverNames.map((n) => n.length)),\n ...agentNames.map((n) => Math.max(n.length, 5)),\n ];\n\n const header = [\n \"Server\".padEnd(colWidths.at(0) ?? 6),\n ...agentNames.map((n, i) => n.padEnd(colWidths.at(i + 1) ?? 5)),\n ].join(\" \");\n\n const separator = colWidths.map((w) => \"-\".repeat(w)).join(\" \");\n\n console.log(`\\n${header}`);\n console.log(separator);\n\n for (const name of serverNames) {\n const cells = [\n name.padEnd(colWidths.at(0) ?? 6),\n ...agentIds.map((id, i) => {\n const entry = matrix[name][id];\n const val = entry ? entry.transport : \"-\";\n return val.padEnd(colWidths.at(i + 1) ?? 5);\n }),\n ];\n console.log(cells.join(\" \"));\n }\n console.log();\n}\n"],"mappings":"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","names":["mkdir","chmod","existsSync","existsSync","mkdir","chmod","confirm","input","readFile","writeFile","mkdir","chmod","existsSync","existsSync","readFile","mkdir","writeFile","chmod","input","input","confirm","server","confirm","existsSync","join","readFile","writeFile","mkdir","existsSync","join","join","readFile","writeFile","mkdir","existsSync","dirname","toAgentFormat","fromAgentFormat","existsSync","readFile","dirname","mkdir","writeFile","join","join","toAgentFormat","fromAgentFormat","join","join","toAgentFormat","fromAgentFormat","command","args","join","homedir","join","join","homedir","toAgentFormat","fromAgentFormat","homedir","join","readFile","writeFile","mkdir","existsSync","dirname","GLOBAL_CONFIG_PATH","join","homedir","toAgentFormat","fromAgentFormat","existsSync","server","confirm","checkbox","checkbox","checkbox","checkbox","confirm","confirm"]}
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
|
|
7
7
|
### Requirement: OpenClaw Adapter
|
|
8
8
|
|
|
9
|
-
系统 SHALL 提供 OpenClaw 的配置适配器, 操作 `~/.openclaw/openclaw.json` (全局文件, JSON5 格式).
|
|
9
|
+
系统 SHALL 提供 OpenClaw 的配置适配器, 操作 `~/.openclaw/openclaw.json` (全局文件, JSON5 格式). MCP 服务配置 SHALL 位于 `plugins.entries.acpx.mcpServers` 路径下, 而非顶层 `mcpServers`.
|
|
10
10
|
|
|
11
11
|
#### Scenario: 读取已有配置
|
|
12
12
|
|
|
13
|
-
- **WHEN** `~/.openclaw/openclaw.json` 存在且包含 `mcpServers` 字段
|
|
14
|
-
- **THEN** adapter 使用 JSON5 解析文件, 提取 `mcpServers` 下所有 MCP 服务条目
|
|
13
|
+
- **WHEN** `~/.openclaw/openclaw.json` 存在且包含 `plugins.entries.acpx.mcpServers` 字段
|
|
14
|
+
- **THEN** adapter 使用 JSON5 解析文件, 提取 `plugins.entries.acpx.mcpServers` 下所有 MCP 服务条目
|
|
15
15
|
|
|
16
16
|
#### Scenario: 读取包含注释的配置
|
|
17
17
|
|
|
@@ -25,28 +25,28 @@
|
|
|
25
25
|
|
|
26
26
|
#### Scenario: 写入新 stdio 服务
|
|
27
27
|
|
|
28
|
-
- **WHEN** 向 OpenClaw 添加一个 stdio 类型的 MCP
|
|
29
|
-
- **THEN** adapter 读取 `~/.openclaw/openclaw.json` (不存在则创建 `~/.openclaw/` 目录和文件), 在 `mcpServers` 下添加服务条目,
|
|
28
|
+
- **WHEN** 向 OpenClaw 添加一个 stdio 类型的 MCP 服务
|
|
29
|
+
- **THEN** adapter 读取 `~/.openclaw/openclaw.json` (不存在则创建 `~/.openclaw/` 目录和文件), 在 `plugins.entries.acpx.mcpServers` 下添加服务条目, 使用原生 `command/args/env` 格式, 解析 `${VAR}` 引用后剩余的 env vars 直接放入 `env` 字段, 同时确保 `plugins.entries.acpx.enabled` 为 `true`, 保留文件中已有的其他字段和服务条目
|
|
30
30
|
|
|
31
31
|
#### Scenario: 写入新 http 服务
|
|
32
32
|
|
|
33
33
|
- **WHEN** 向 OpenClaw 添加一个 http 类型的 MCP 服务
|
|
34
|
-
- **THEN** adapter
|
|
34
|
+
- **THEN** adapter SHALL 将 http 服务转换为 mcp-remote 本地命令代理格式: `{ "command": "npx", "args": ["-y", "mcp-remote@latest", "<url>", "--header", "<Key>: <Value>", ...] }`, 因为 OpenClaw 的 acpx 插件不支持直接写 url/headers
|
|
35
35
|
|
|
36
36
|
#### Scenario: 同名冲突
|
|
37
37
|
|
|
38
|
-
- **WHEN** `~/.openclaw/openclaw.json` 中 `mcpServers` 下已存在同名服务
|
|
38
|
+
- **WHEN** `~/.openclaw/openclaw.json` 中 `plugins.entries.acpx.mcpServers` 下已存在同名服务
|
|
39
39
|
- **THEN** adapter 抛出冲突错误, 不修改文件
|
|
40
40
|
|
|
41
41
|
#### Scenario: 移除服务
|
|
42
42
|
|
|
43
43
|
- **WHEN** 从 OpenClaw 配置中移除一个 MCP 服务
|
|
44
|
-
- **THEN** adapter 从 `mcpServers` 中删除该条目, 保留其他所有条目和字段
|
|
44
|
+
- **THEN** adapter 从 `plugins.entries.acpx.mcpServers` 中删除该条目, 保留其他所有条目和字段
|
|
45
45
|
|
|
46
46
|
#### Scenario: 检查服务是否存在
|
|
47
47
|
|
|
48
48
|
- **WHEN** 查询 OpenClaw 配置中某服务是否存在
|
|
49
|
-
- **THEN** adapter 返回该服务名是否在 `mcpServers` 中
|
|
49
|
+
- **THEN** adapter 返回该服务名是否在 `plugins.entries.acpx.mcpServers` 中
|
|
50
50
|
|
|
51
51
|
### Requirement: JSON5 文件读写
|
|
52
52
|
|
package/package.json
CHANGED
|
@@ -42,31 +42,59 @@ async function loadAdapter(): Promise<AgentAdapter> {
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
describe("OpenClaw Adapter", () => {
|
|
45
|
-
it("writes and reads stdio config", async () => {
|
|
45
|
+
it("writes and reads stdio config with env field", async () => {
|
|
46
46
|
const adapter = await loadAdapter();
|
|
47
47
|
await adapter.write(tmpDir, "brave-search", stdioConfig);
|
|
48
48
|
const servers = await adapter.read(tmpDir);
|
|
49
49
|
expect(servers["brave-search"]).toEqual({
|
|
50
|
-
command: "
|
|
51
|
-
args: [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
50
|
+
command: "npx",
|
|
51
|
+
args: ["-y", "@anthropic/mcp-brave-search"],
|
|
52
|
+
env: { BRAVE_API_KEY: "test-key" },
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("writes stdio config without env when env is empty", async () => {
|
|
57
|
+
const adapter = await loadAdapter();
|
|
58
|
+
const noEnvConfig: StdioConfig = {
|
|
59
|
+
transport: "stdio",
|
|
60
|
+
command: "npx",
|
|
61
|
+
args: ["-y", "pkg"],
|
|
62
|
+
env: {},
|
|
63
|
+
};
|
|
64
|
+
await adapter.write(tmpDir, "test", noEnvConfig);
|
|
65
|
+
const servers = await adapter.read(tmpDir);
|
|
66
|
+
expect(servers["test"]).toEqual({
|
|
67
|
+
command: "npx",
|
|
68
|
+
args: ["-y", "pkg"],
|
|
57
69
|
});
|
|
58
70
|
});
|
|
59
71
|
|
|
60
|
-
it("writes
|
|
72
|
+
it("writes http config as mcp-remote wrapper", async () => {
|
|
61
73
|
const adapter = await loadAdapter();
|
|
62
74
|
await adapter.write(tmpDir, "my-mcp", httpConfig);
|
|
63
75
|
const servers = await adapter.read(tmpDir);
|
|
64
76
|
expect(servers["my-mcp"]).toEqual({
|
|
65
|
-
|
|
66
|
-
|
|
77
|
+
command: "npx",
|
|
78
|
+
args: [
|
|
79
|
+
"-y",
|
|
80
|
+
"mcp-remote@latest",
|
|
81
|
+
"https://example.com/mcp",
|
|
82
|
+
"--header",
|
|
83
|
+
"Authorization: Bearer test-token",
|
|
84
|
+
],
|
|
67
85
|
});
|
|
68
86
|
});
|
|
69
87
|
|
|
88
|
+
it("stores config under plugins.entries.acpx.mcpServers", async () => {
|
|
89
|
+
const adapter = await loadAdapter();
|
|
90
|
+
await adapter.write(tmpDir, "brave-search", stdioConfig);
|
|
91
|
+
const raw = JSON.parse(await readFile(configPath, "utf-8"));
|
|
92
|
+
expect(raw["plugins"]["entries"]["acpx"]["enabled"]).toBe(true);
|
|
93
|
+
expect(
|
|
94
|
+
raw["plugins"]["entries"]["acpx"]["mcpServers"]["brave-search"],
|
|
95
|
+
).toBeTruthy();
|
|
96
|
+
});
|
|
97
|
+
|
|
70
98
|
it("throws on conflict", async () => {
|
|
71
99
|
const adapter = await loadAdapter();
|
|
72
100
|
await adapter.write(tmpDir, "brave-search", stdioConfig);
|
|
@@ -91,19 +119,34 @@ describe("OpenClaw Adapter", () => {
|
|
|
91
119
|
expect(Object.keys(servers)).toEqual(["first", "second"]);
|
|
92
120
|
});
|
|
93
121
|
|
|
94
|
-
it("preserves
|
|
122
|
+
it("preserves other fields in config", async () => {
|
|
95
123
|
const adapter = await loadAdapter();
|
|
96
124
|
const dir = join(tmpDir, ".openclaw");
|
|
97
125
|
await mkdir(dir, { recursive: true });
|
|
98
126
|
await writeFile(
|
|
99
127
|
configPath,
|
|
100
|
-
JSON.stringify(
|
|
128
|
+
JSON.stringify(
|
|
129
|
+
{
|
|
130
|
+
theme: "dark",
|
|
131
|
+
plugins: {
|
|
132
|
+
entries: {
|
|
133
|
+
acpx: { enabled: true, mcpServers: {} },
|
|
134
|
+
other: { enabled: false },
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
null,
|
|
139
|
+
2,
|
|
140
|
+
) + "\n",
|
|
101
141
|
"utf-8",
|
|
102
142
|
);
|
|
103
143
|
await adapter.write(tmpDir, "brave-search", stdioConfig);
|
|
104
144
|
const raw = JSON.parse(await readFile(configPath, "utf-8"));
|
|
105
145
|
expect(raw["theme"]).toBe("dark");
|
|
106
|
-
expect(raw["
|
|
146
|
+
expect(raw["plugins"]["entries"]["other"]["enabled"]).toBe(false);
|
|
147
|
+
expect(
|
|
148
|
+
raw["plugins"]["entries"]["acpx"]["mcpServers"]["brave-search"],
|
|
149
|
+
).toBeTruthy();
|
|
107
150
|
});
|
|
108
151
|
|
|
109
152
|
it("reads JSON5 config with comments and trailing commas", async () => {
|
|
@@ -113,11 +156,18 @@ describe("OpenClaw Adapter", () => {
|
|
|
113
156
|
await writeFile(
|
|
114
157
|
configPath,
|
|
115
158
|
`{
|
|
116
|
-
//
|
|
117
|
-
"
|
|
118
|
-
"
|
|
119
|
-
"
|
|
120
|
-
|
|
159
|
+
// OpenClaw config
|
|
160
|
+
"plugins": {
|
|
161
|
+
"entries": {
|
|
162
|
+
"acpx": {
|
|
163
|
+
"enabled": true,
|
|
164
|
+
"mcpServers": {
|
|
165
|
+
"test-server": {
|
|
166
|
+
"command": "npx",
|
|
167
|
+
"args": ["-y", "test-pkg"],
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
},
|
|
121
171
|
},
|
|
122
172
|
},
|
|
123
173
|
}`,
|
|
@@ -140,16 +190,19 @@ describe("OpenClaw Adapter", () => {
|
|
|
140
190
|
const adapter = await loadAdapter();
|
|
141
191
|
await adapter.write(tmpDir, "brave-search", stdioConfig);
|
|
142
192
|
const raw = JSON.parse(await readFile(configPath, "utf-8"));
|
|
143
|
-
expect(
|
|
193
|
+
expect(
|
|
194
|
+
raw["plugins"]["entries"]["acpx"]["mcpServers"]["brave-search"],
|
|
195
|
+
).toBeTruthy();
|
|
144
196
|
});
|
|
145
197
|
});
|
|
146
198
|
|
|
147
199
|
describe("OpenClaw Adapter format conversion", () => {
|
|
148
|
-
it("converts from env
|
|
200
|
+
it("converts from native env field format", async () => {
|
|
149
201
|
const adapter = await loadAdapter();
|
|
150
202
|
const result = adapter.fromAgentFormat("test", {
|
|
151
|
-
command: "
|
|
152
|
-
args: ["
|
|
203
|
+
command: "npx",
|
|
204
|
+
args: ["-y", "pkg"],
|
|
205
|
+
env: { KEY: "val" },
|
|
153
206
|
});
|
|
154
207
|
expect(result).toEqual({
|
|
155
208
|
transport: "stdio",
|
|
@@ -159,31 +212,17 @@ describe("OpenClaw Adapter format conversion", () => {
|
|
|
159
212
|
});
|
|
160
213
|
});
|
|
161
214
|
|
|
162
|
-
it("converts from
|
|
215
|
+
it("converts from format without env", async () => {
|
|
163
216
|
const adapter = await loadAdapter();
|
|
164
217
|
const result = adapter.fromAgentFormat("test", {
|
|
165
218
|
command: "npx",
|
|
166
219
|
args: ["-y", "pkg"],
|
|
167
|
-
env: { KEY: "val" },
|
|
168
220
|
});
|
|
169
221
|
expect(result).toEqual({
|
|
170
222
|
transport: "stdio",
|
|
171
223
|
command: "npx",
|
|
172
224
|
args: ["-y", "pkg"],
|
|
173
|
-
env: {
|
|
174
|
-
});
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
it("converts from http format with url field", async () => {
|
|
178
|
-
const adapter = await loadAdapter();
|
|
179
|
-
const result = adapter.fromAgentFormat("test", {
|
|
180
|
-
url: "https://example.com",
|
|
181
|
-
headers: { Auth: "token" },
|
|
182
|
-
});
|
|
183
|
-
expect(result).toEqual({
|
|
184
|
-
transport: "http",
|
|
185
|
-
url: "https://example.com",
|
|
186
|
-
headers: { Auth: "token" },
|
|
225
|
+
env: {},
|
|
187
226
|
});
|
|
188
227
|
});
|
|
189
228
|
|
|
@@ -193,6 +232,16 @@ describe("OpenClaw Adapter format conversion", () => {
|
|
|
193
232
|
expect(result).toBeUndefined();
|
|
194
233
|
});
|
|
195
234
|
|
|
235
|
+
it("converts stdio config to agent format with env", async () => {
|
|
236
|
+
const adapter = await loadAdapter();
|
|
237
|
+
const result = adapter.toAgentFormat(stdioConfig);
|
|
238
|
+
expect(result).toEqual({
|
|
239
|
+
command: "npx",
|
|
240
|
+
args: ["-y", "@anthropic/mcp-brave-search"],
|
|
241
|
+
env: { BRAVE_API_KEY: "test-key" },
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
|
|
196
245
|
it("converts stdio config to agent format without env", async () => {
|
|
197
246
|
const adapter = await loadAdapter();
|
|
198
247
|
const result = adapter.toAgentFormat({
|
|
@@ -207,12 +256,32 @@ describe("OpenClaw Adapter format conversion", () => {
|
|
|
207
256
|
});
|
|
208
257
|
});
|
|
209
258
|
|
|
210
|
-
it("converts http config to
|
|
259
|
+
it("converts http config to mcp-remote wrapper", async () => {
|
|
211
260
|
const adapter = await loadAdapter();
|
|
212
261
|
const result = adapter.toAgentFormat(httpConfig);
|
|
213
262
|
expect(result).toEqual({
|
|
214
|
-
|
|
215
|
-
|
|
263
|
+
command: "npx",
|
|
264
|
+
args: [
|
|
265
|
+
"-y",
|
|
266
|
+
"mcp-remote@latest",
|
|
267
|
+
"https://example.com/mcp",
|
|
268
|
+
"--header",
|
|
269
|
+
"Authorization: Bearer test-token",
|
|
270
|
+
],
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it("resolves ${VAR} references in args", async () => {
|
|
275
|
+
const adapter = await loadAdapter();
|
|
276
|
+
const result = adapter.toAgentFormat({
|
|
277
|
+
transport: "stdio",
|
|
278
|
+
command: "npx",
|
|
279
|
+
args: ["-y", "mcp-remote", "--header", "Authorization: Bearer ${API_KEY}"],
|
|
280
|
+
env: { API_KEY: "sk-123" },
|
|
281
|
+
});
|
|
282
|
+
expect(result).toEqual({
|
|
283
|
+
command: "npx",
|
|
284
|
+
args: ["-y", "mcp-remote", "--header", "Authorization: Bearer sk-123"],
|
|
216
285
|
});
|
|
217
286
|
});
|
|
218
287
|
});
|
package/src/adapters/openclaw.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { homedir } from "node:os";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import type { AgentAdapter, DefaultConfig } from "../types.js";
|
|
4
4
|
import { readJson5File, writeJson5File } from "./json5-file.js";
|
|
5
|
-
import {
|
|
5
|
+
import { resolveEnvInArgs } from "./env-args.js";
|
|
6
6
|
|
|
7
7
|
const GLOBAL_CONFIG_PATH = join(
|
|
8
8
|
homedir(),
|
|
@@ -10,27 +10,60 @@ const GLOBAL_CONFIG_PATH = join(
|
|
|
10
10
|
"openclaw.json",
|
|
11
11
|
);
|
|
12
12
|
|
|
13
|
+
function getMcpServers(
|
|
14
|
+
data: Record<string, unknown>,
|
|
15
|
+
): Record<string, unknown> {
|
|
16
|
+
const plugins = data["plugins"] as Record<string, unknown> | undefined;
|
|
17
|
+
const entries = plugins?.["entries"] as Record<string, unknown> | undefined;
|
|
18
|
+
const acpx = entries?.["acpx"] as Record<string, unknown> | undefined;
|
|
19
|
+
return (acpx?.["mcpServers"] as Record<string, unknown>) ?? {};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function setMcpServers(
|
|
23
|
+
data: Record<string, unknown>,
|
|
24
|
+
servers: Record<string, unknown>,
|
|
25
|
+
): Record<string, unknown> {
|
|
26
|
+
const plugins = (data["plugins"] as Record<string, unknown>) ?? {};
|
|
27
|
+
const entries = (plugins["entries"] as Record<string, unknown>) ?? {};
|
|
28
|
+
const acpx = (entries["acpx"] as Record<string, unknown>) ?? {};
|
|
29
|
+
return {
|
|
30
|
+
...data,
|
|
31
|
+
plugins: {
|
|
32
|
+
...plugins,
|
|
33
|
+
entries: {
|
|
34
|
+
...entries,
|
|
35
|
+
acpx: {
|
|
36
|
+
...acpx,
|
|
37
|
+
enabled: true,
|
|
38
|
+
mcpServers: servers,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
13
45
|
function toAgentFormat(config: DefaultConfig): Record<string, unknown> {
|
|
14
46
|
if (config.transport === "stdio") {
|
|
15
47
|
const { resolvedArgs, remainingEnv } = resolveEnvInArgs(
|
|
16
48
|
config.args,
|
|
17
49
|
config.env,
|
|
18
50
|
);
|
|
19
|
-
const
|
|
20
|
-
if (envArgs.length > 0) {
|
|
21
|
-
return {
|
|
22
|
-
command: "env",
|
|
23
|
-
args: [...envArgs, config.command, ...resolvedArgs],
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
51
|
+
const result: Record<string, unknown> = {
|
|
27
52
|
command: config.command,
|
|
28
53
|
args: resolvedArgs,
|
|
29
54
|
};
|
|
55
|
+
if (Object.keys(remainingEnv).length > 0) {
|
|
56
|
+
result["env"] = { ...remainingEnv };
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
const args = ["-y", "mcp-remote@latest", config.url];
|
|
61
|
+
for (const [key, value] of Object.entries(config.headers)) {
|
|
62
|
+
args.push("--header", `${key}: ${value}`);
|
|
30
63
|
}
|
|
31
64
|
return {
|
|
32
|
-
|
|
33
|
-
|
|
65
|
+
command: "npx",
|
|
66
|
+
args,
|
|
34
67
|
};
|
|
35
68
|
}
|
|
36
69
|
|
|
@@ -38,35 +71,13 @@ function fromAgentFormat(
|
|
|
38
71
|
_name: string,
|
|
39
72
|
raw: Record<string, unknown>,
|
|
40
73
|
): DefaultConfig | undefined {
|
|
41
|
-
if (raw["command"]) {
|
|
42
|
-
|
|
43
|
-
const rawArgs = (raw["args"] as string[]) ?? [];
|
|
44
|
-
const legacyEnv = raw["env"] as Record<string, string> | undefined;
|
|
45
|
-
|
|
46
|
-
if (legacyEnv && Object.keys(legacyEnv).length > 0) {
|
|
47
|
-
return { transport: "stdio", command, args: rawArgs, env: legacyEnv };
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (command === "env") {
|
|
51
|
-
const { env, commandIndex } = parseEnvArgs(rawArgs);
|
|
52
|
-
return {
|
|
53
|
-
transport: "stdio",
|
|
54
|
-
command: rawArgs[commandIndex] ?? "",
|
|
55
|
-
args: rawArgs.slice(commandIndex + 1),
|
|
56
|
-
env,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return { transport: "stdio", command, args: rawArgs, env: {} };
|
|
61
|
-
}
|
|
62
|
-
if (raw["url"]) {
|
|
63
|
-
return {
|
|
64
|
-
transport: "http",
|
|
65
|
-
url: raw["url"] as string,
|
|
66
|
-
headers: (raw["headers"] as Record<string, string>) ?? {},
|
|
67
|
-
};
|
|
74
|
+
if (!raw["command"]) {
|
|
75
|
+
return undefined;
|
|
68
76
|
}
|
|
69
|
-
|
|
77
|
+
const command = raw["command"] as string;
|
|
78
|
+
const rawArgs = (raw["args"] as string[]) ?? [];
|
|
79
|
+
const env = (raw["env"] as Record<string, string>) ?? {};
|
|
80
|
+
return { transport: "stdio", command, args: rawArgs, env };
|
|
70
81
|
}
|
|
71
82
|
|
|
72
83
|
export const openclawAdapter: AgentAdapter = {
|
|
@@ -80,34 +91,34 @@ export const openclawAdapter: AgentAdapter = {
|
|
|
80
91
|
|
|
81
92
|
async read() {
|
|
82
93
|
const data = await readJson5File(GLOBAL_CONFIG_PATH);
|
|
83
|
-
return (data
|
|
94
|
+
return getMcpServers(data);
|
|
84
95
|
},
|
|
85
96
|
|
|
86
97
|
async write(_projectDir, serverName, config) {
|
|
87
98
|
const data = await readJson5File(GLOBAL_CONFIG_PATH);
|
|
88
|
-
const servers = (data
|
|
99
|
+
const servers = getMcpServers(data);
|
|
89
100
|
if (serverName in servers) {
|
|
90
101
|
throw new Error(
|
|
91
102
|
`Conflict: "${serverName}" already exists in OpenClaw config`,
|
|
92
103
|
);
|
|
93
104
|
}
|
|
94
|
-
const updated = {
|
|
95
|
-
...
|
|
96
|
-
|
|
97
|
-
};
|
|
105
|
+
const updated = setMcpServers(data, {
|
|
106
|
+
...servers,
|
|
107
|
+
[serverName]: toAgentFormat(config),
|
|
108
|
+
});
|
|
98
109
|
await writeJson5File(GLOBAL_CONFIG_PATH, updated);
|
|
99
110
|
},
|
|
100
111
|
|
|
101
112
|
async remove(_projectDir, serverName) {
|
|
102
113
|
const data = await readJson5File(GLOBAL_CONFIG_PATH);
|
|
103
|
-
const servers = (data
|
|
114
|
+
const servers = getMcpServers(data);
|
|
104
115
|
const { [serverName]: _, ...rest } = servers;
|
|
105
|
-
await writeJson5File(GLOBAL_CONFIG_PATH,
|
|
116
|
+
await writeJson5File(GLOBAL_CONFIG_PATH, setMcpServers(data, rest));
|
|
106
117
|
},
|
|
107
118
|
|
|
108
119
|
async has(_projectDir, serverName) {
|
|
109
120
|
const data = await readJson5File(GLOBAL_CONFIG_PATH);
|
|
110
|
-
const servers = (data
|
|
121
|
+
const servers = getMcpServers(data);
|
|
111
122
|
return serverName in servers;
|
|
112
123
|
},
|
|
113
124
|
};
|