@akms/mcp 0.3.1 → 0.4.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/lib/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/_defs/version.ts","../src/_defs/index.ts","../src/modules/launcher/arguments.ts","../src/modules/registration/config-file.ts","../src/modules/registration/types.ts","../src/modules/registration/runtime.ts","../src/modules/prompt-errors.ts","../src/modules/launcher/prompter.ts","../src/modules/registration/comparison.ts","../src/modules/registration/startup-check.ts","../src/modules/registration/catalog.ts","../src/modules/registration/registry.ts","../src/modules/registration/migration-menu.ts","../src/modules/registration/runtime-menu.ts","../src/modules/registration/display.ts","../src/modules/registration/menu.ts","../src/modules/registration/paths.ts","../src/modules/registration/targets/config-file.ts","../src/modules/registration/targets/json-file.ts","../src/modules/registration/targets/claude-code.ts","../src/modules/registration/targets/toml-lines.ts","../src/modules/registration/targets/toml-validation.ts","../src/modules/registration/targets/toml-subset.ts","../src/modules/registration/targets/codex.ts","../src/modules/registration/targets/index.ts","../src/modules/launcher/menu.ts","../src/modules/launcher/npm.ts","../src/cli.ts"],"names":["path","CLIENT_LABELS","os","parse","fs","row","normalize","stripVTControlCharacters","execFile","name","replacement","actual","current","results","removing","choice","readExisting","updateConfigFile","randomUUID","record","result","spawn"],"mappings":"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","file":"cli.js","sourcesContent":["declare const __PACKAGE_VERSION__: string | undefined;\n\n/** package.json's version, injected by tsup and vitest. \"development\" when run from source through tsx. */\nexport const PACKAGE_VERSION: string = typeof __PACKAGE_VERSION__ === \"string\" ? __PACKAGE_VERSION__ : \"development\";\n","export const MCP_PACKAGES = {\n db: { label: \"Database\", command: \"akms-mcp-db\", setupCommand: \"config\" },\n ssh: { label: \"SSH\", command: \"akms-mcp-ssh\", setupCommand: \"config\" },\n wsl: { label: \"WSL\", command: \"akms-mcp-wsl\", setupCommand: \"config\" },\n s3: { label: \"S3\", command: \"akms-mcp-s3\", setupCommand: \"config\" },\n} as const;\n\nexport const CLIENT_LABELS = {\n \"claude-code\": \"Claude Code\",\n codex: \"Codex\",\n \"claude-desktop\": \"Claude Desktop\",\n cursor: \"Cursor\",\n} as const;\n\nexport { PACKAGE_VERSION } from \"./version\";\n","import { CLIENT_LABELS, MCP_PACKAGES } from \"../../_defs\";\nimport type { CliArguments, ClientId, McpId } from \"../../_types\";\n\nexport function parseArguments(argv: string[]): CliArguments {\n const parsed: CliArguments = { showHelp: false, showVersion: false };\n let commandSeen = false;\n\n for(let index = 0; index < argv.length; index += 1) {\n const argument = argv[index];\n if(argument === \"--help\" || argument === \"-h\") {\n parsed.showHelp = true;\n continue;\n }\n if(argument === \"--version\" || argument === \"-v\") {\n parsed.showVersion = true;\n continue;\n }\n if(argument === \"--target\" || argument.startsWith(\"--target=\") == true) {\n let target = argument.slice(\"--target=\".length);\n if(argument === \"--target\") {\n index += 1;\n target = argv[index];\n }\n if(target == null || Object.hasOwn(CLIENT_LABELS, target) == false) {\n throw new Error(\"--target needs one of: claude-code, codex, claude-desktop, cursor\");\n }\n parsed.targetId = target as ClientId;\n continue;\n }\n if((argument === \"setup\" || argument === \"config\") && commandSeen == false && parsed.mcpId == null) {\n commandSeen = true;\n continue;\n }\n if((argument === \"register\" || argument === \"sync\") && !commandSeen && !parsed.mcpId) {\n commandSeen = true;\n parsed.managementMode = argument;\n continue;\n }\n if(Object.hasOwn(MCP_PACKAGES, argument) == true && parsed.mcpId == null && !parsed.managementMode) {\n parsed.mcpId = argument as McpId;\n continue;\n }\n throw new Error(`Unknown argument: ${argument}. Run akms-mcp --help for usage.`);\n }\n\n return parsed;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nfunction readExisting(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, \"utf8\");\n }\n catch(error) {\n if((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\n/** Build a complete replacement beside the config, then commit it with one rename. */\nexport function updateConfigFile(filePath: string, update: (text: string) => string, options: { mode?: number; beforeCommit?: (before: string | null) => void } = {}): void {\n let destination = filePath;\n let symbolicLink = false;\n try {\n symbolicLink = fs.lstatSync(filePath).isSymbolicLink();\n }\n catch(error) {\n if((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n // A dangling symlink is an error; never replace the link with a new regular file.\n if(symbolicLink) {\n destination = fs.realpathSync(filePath);\n }\n const before = readExisting(destination);\n const updated = update(before ?? \"\");\n if(before === updated) return;\n if(before != null) {\n fs.accessSync(destination, fs.constants.W_OK);\n }\n fs.mkdirSync(path.dirname(destination), { recursive: true });\n const temporary = path.join(path.dirname(destination), `.${path.basename(destination)}.${randomUUID()}.tmp`);\n const mode = options.mode ?? (before == null ? 0o600 : fs.statSync(destination).mode & 0o777);\n let descriptor: number | undefined;\n let ownsTemporary = false;\n try {\n descriptor = fs.openSync(temporary, \"wx\", mode);\n ownsTemporary = true;\n fs.writeFileSync(descriptor, updated, \"utf8\");\n fs.fsyncSync(descriptor);\n fs.closeSync(descriptor);\n descriptor = undefined;\n if(readExisting(destination) !== before) {\n throw new Error(\"The config changed while saving; reload it and try again.\");\n }\n options.beforeCommit?.(before);\n if(readExisting(destination) !== before) throw new Error(\"The config changed while saving; reload it and try again.\");\n fs.renameSync(temporary, destination);\n ownsTemporary = false;\n }\n finally {\n try {\n if(descriptor != null) {\n fs.closeSync(descriptor);\n }\n }\n finally {\n if(ownsTemporary) {\n fs.unlinkSync(temporary);\n }\n }\n }\n}\n","/** Shared by the AKMS MCP menu and every kind's config screen in @akms/mcp. */\nexport type ClientId = \"claude-code\" | \"codex\" | \"claude-desktop\" | \"cursor\";\nexport type ConfigTargetId = ClientId | \"registered\";\nexport type McpKind = \"db\" | \"ssh\" | \"wsl\" | \"s3\";\nexport interface McpServerEntry { command: string; args: string[]; env: Record<string, string> }\nexport interface ConfigWriteResult { status: \"written\" | \"unavailable\"; detail: string }\nexport interface ConfigTarget {\n id: ClientId | \"registered\";\n label: string;\n location: string;\n detected: boolean;\n readEntries(): Record<string, McpServerEntry>;\n hasEntry?(name: string): boolean;\n prepareEntry?(name: string, entry: McpServerEntry, oldName?: string): McpServerEntry;\n writeEntry(name: string, entry: McpServerEntry, options?: { replace?: boolean }): ConfigWriteResult;\n removeEntry(name: string): ConfigWriteResult;\n renameEntry?(oldName: string, name: string, entry: McpServerEntry): ConfigWriteResult;\n}\nexport const CLIENT_LABELS: Record<ClientId, string> = {\n \"claude-code\": \"Claude Code\", codex: \"Codex\", \"claude-desktop\": \"Claude Desktop\", cursor: \"Cursor\",\n};\nexport const KINDS: McpKind[] = [\"db\", \"ssh\", \"wsl\", \"s3\"];\nexport const KIND_LABELS: Record<McpKind, string> = { db: \"Database\", ssh: \"SSH\", wsl: \"WSL\", s3: \"S3\" };\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { execFile } from \"node:child_process\";\nimport { promisify, stripVTControlCharacters } from \"node:util\";\nimport { KINDS } from \"./types\";\nimport type { McpKind, McpServerEntry } from \"./types\";\n\nexport interface LaunchCommand { command: string; args: string[] }\nexport interface GlobalRuntime extends LaunchCommand { version: string; linked: boolean }\n/** A separate per-kind package left in the runtime directory by 0.3.x or earlier. */\nexport interface LegacyRuntime { kind: McpKind; packageName: string; version: string; linked: boolean }\n\n/** One package carries the menu and every kind's server since 0.4.0. */\nexport const PACKAGE_NAME = \"@akms/mcp\";\n/** The separate per-kind packages of 0.3.x and earlier; their entries are still recognized so they can be migrated. */\nexport const legacyPackageName = (kind: McpKind) => `@akms/mcp-${kind}`;\nconst binary = (command: string) => command.replace(/\\\\/g, \"/\").split(\"/\").pop()!.toLowerCase();\nconst posixPath = (value: string | undefined) => value?.replace(/\\\\/g, \"/\") ?? \"\";\nconst isNode = (command: string) => /^(node|nodejs)(\\.exe)?$/.test(binary(command));\nconst isCurrentScript = (script: string | undefined, kind: McpKind) => posixPath(script).endsWith(`/node_modules/@akms/mcp/lib/${kind}.js`);\nconst isLegacyScript = (script: string | undefined, kind: McpKind) => posixPath(script).endsWith(`/node_modules/@akms/mcp-${kind}/lib/cli.js`);\nconst isLegacyPackageArgument = (argument: string, kind: McpKind) => new RegExp(`^@akms/mcp-${kind}(?:@[^\\\\s]+)?$`).test(argument);\n\nexport function runtimePrefix(): string {\n return path.join(process.env.AKMS_MCP_HOME ? path.resolve(process.env.AKMS_MCP_HOME) : path.join(os.homedir(), \".akms\", \"mcp\"), \"runtime\");\n}\n\nexport function runtimeRoot(prefix = runtimePrefix(), platform = process.platform): string {\n return path.join(prefix, ...(platform === \"win32\" ? [] : [\"lib\"]), \"node_modules\");\n}\n\nexport const runtimeInstallCommand = () => `npm install --global --prefix \"${runtimePrefix()}\" ${PACKAGE_NAME}@latest`;\n\n/** Called only from Runtime's \"Check for updates\", never during menu/server startup. */\nexport async function latestRuntimeVersion(timeoutMs = 6000): Promise<string | null> {\n try {\n const { stdout } = await promisify(execFile)(process.execPath, [npmCli(), \"view\", `${PACKAGE_NAME}@latest`, \"version\", \"--json\", \"--prefer-online\", \"--fetch-retries=0\", \"--fetch-timeout=4000\"], {\n windowsHide: true, timeout: timeoutMs, maxBuffer: 65_536,\n });\n const version: unknown = JSON.parse(stdout);\n return typeof version === \"string\" && /^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$/.test(version) ? version : null;\n } catch { return null; }\n}\n\n/** Semver precedence, ignoring build metadata; unknown versions are not auto-updated. */\nexport function runtimeIsOlder(installed: string, current: string): boolean {\n const parse = (value: string) => /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/.exec(value);\n const left = parse(installed), right = parse(current);\n if(!left || !right) return false;\n for(let index = 1; index <= 3; index++) {\n if(BigInt(left[index]) !== BigInt(right[index])) return BigInt(left[index]) < BigInt(right[index]);\n }\n if(!left[4] || !right[4]) return Boolean(left[4] && !right[4]);\n const a = left[4].split(\".\"), b = right[4].split(\".\");\n for(let index = 0; index < Math.max(a.length, b.length); index++) {\n if(a[index] === b[index]) continue;\n if(a[index] === undefined || b[index] === undefined) return a[index] === undefined;\n const numericA = /^\\d+$/.test(a[index]), numericB = /^\\d+$/.test(b[index]);\n if(numericA && numericB) return BigInt(a[index]) < BigInt(b[index]);\n if(numericA !== numericB) return numericA;\n return a[index] < b[index];\n }\n return false;\n}\n\n/** Recognizes saved direct paths even when an installation has since been moved/deleted. */\nexport function launchKind(entry: McpServerEntry): McpKind | null {\n for(const kind of KINDS) {\n if(new RegExp(`^akms-mcp-${kind}(?:\\\\.cmd|\\\\.exe)?$`).test(binary(entry.command))\n || entry.args.some((arg) => isLegacyPackageArgument(arg, kind))) return kind;\n if(isNode(entry.command) && (isCurrentScript(entry.args[0], kind) || isLegacyScript(entry.args[0], kind))) return kind;\n }\n return null;\n}\n\n/** Extra flags, shell commands and custom wrappers need individual review. */\nexport function standardLaunch(entry: McpServerEntry, kind: McpKind): boolean {\n if(launchKind(entry) !== kind) return false;\n const command = binary(entry.command);\n if(isNode(entry.command)) return entry.args.length === 1 && (isCurrentScript(entry.args[0], kind) || isLegacyScript(entry.args[0], kind));\n if(new RegExp(`^akms-mcp-${kind}(?:\\\\.cmd|\\\\.exe)?$`).test(command)) return entry.args.length === 0;\n let args = entry.args;\n if(command === \"cmd\" || command === \"cmd.exe\") {\n if(args[0]?.toLowerCase() !== \"/c\" || !/^npx(?:\\.cmd)?$/i.test(args[1] ?? \"\")) return false;\n args = args.slice(2);\n } else if(!/^npx(?:\\.cmd)?$/.test(command)) return false;\n return args.length === 2 && [\"-y\", \"--yes\"].includes(args[0]) && isLegacyPackageArgument(args[1], kind);\n}\n\nexport function catalogLaunch(entry: McpServerEntry, kind = launchKind(entry)): boolean {\n return !!kind && entry.args.length === 2 && entry.args[1] === \"--catalog\"\n && standardLaunch({ ...entry, args: entry.args.slice(0, 1) }, kind);\n}\n\n/** A standard launch of a separate per-kind package (npx or its runtime path) — what the 0.4 migration repoints. */\nexport function legacyLaunch(entry: McpServerEntry, kind = launchKind(entry)): boolean {\n if(!kind) return false;\n const launch = catalogLaunch(entry, kind) ? { ...entry, args: entry.args.slice(0, 1) } : entry;\n if(!standardLaunch(launch, kind)) return false;\n if(isNode(launch.command)) return isLegacyScript(launch.args[0], kind);\n return launch.args.some((arg) => isLegacyPackageArgument(arg, kind));\n}\n\nexport function npmCli(): string {\n const candidates = [\n path.join(path.dirname(process.execPath), \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\"),\n path.join(path.dirname(process.execPath), \"..\", \"lib\", \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\"),\n ];\n if(process.env.npm_execpath && /^(npm|npx)-cli\\.js$/.test(path.basename(process.env.npm_execpath))) {\n candidates.unshift(path.join(path.dirname(process.env.npm_execpath), \"npm-cli.js\"));\n }\n for(const folder of (process.env.PATH ?? \"\").split(path.delimiter).filter(Boolean)) {\n candidates.push(process.platform === \"win32\" ? path.join(folder, \"node_modules\", \"npm\", \"bin\", \"npm-cli.js\") : path.join(folder, \"npm\"));\n }\n for(const file of candidates) {\n try {\n const resolved = fs.realpathSync(file);\n if(resolved.endsWith(\".js\") && fs.statSync(resolved).isFile()) return resolved;\n } catch { /* Try the next installation; a version-manager shim is not a JS CLI. */ }\n }\n throw new Error(\"npm was not found. Install Node.js with npm, then reopen configuration.\");\n}\n\nexport function findGlobalRuntime(kind: McpKind, root?: string): GlobalRuntime | null {\n try {\n const directory = path.join(root ?? runtimeRoot(), \"@akms\", \"mcp\");\n const metadata = JSON.parse(fs.readFileSync(path.join(directory, \"package.json\"), \"utf8\"));\n // Kinds have no bin of their own: a 0.3.x package in the same prefix still owns akms-mcp-<kind>.\n const script = path.join(directory, \"lib\", `${kind}.js`);\n if(metadata.name !== PACKAGE_NAME || typeof metadata.version !== \"string\" || !fs.statSync(script).isFile()) return null;\n // Preserve the Node alias and package link; the runtime prefix is independent of Node versions.\n return { command: process.execPath, args: [script], version: metadata.version, linked: fs.lstatSync(directory).isSymbolicLink() };\n } catch { return null; }\n}\n\n/** Per-kind packages still present in the runtime directory. */\nexport function findLegacyRuntimes(root?: string): LegacyRuntime[] {\n const found: LegacyRuntime[] = [];\n for(const kind of KINDS) {\n try {\n const directory = path.join(root ?? runtimeRoot(), \"@akms\", `mcp-${kind}`);\n const metadata = JSON.parse(fs.readFileSync(path.join(directory, \"package.json\"), \"utf8\"));\n if(metadata.name !== legacyPackageName(kind)) continue;\n found.push({ kind, packageName: legacyPackageName(kind), version: typeof metadata.version === \"string\" ? metadata.version : \"unknown\", linked: fs.lstatSync(directory).isSymbolicLink() });\n } catch { /* Not installed. */ }\n }\n return found;\n}\n\nasync function runNpm(argumentsList: string[], failure: string, retry: string): Promise<void> {\n const cancellation = new AbortController();\n const cancel = () => cancellation.abort();\n process.on(\"SIGINT\", cancel);\n process.on(\"SIGTERM\", cancel);\n try {\n await promisify(execFile)(process.execPath, [npmCli(), ...argumentsList], {\n windowsHide: true, timeout: 180000, maxBuffer: 1024 * 1024, signal: cancellation.signal, cwd: os.homedir(),\n });\n } catch(error) {\n if(cancellation.signal.aborted) throw new Error(\"AKMS runtime installation cancelled.\");\n const stderr = (error as { stderr?: unknown }).stderr;\n const detail = stripVTControlCharacters(typeof stderr === \"string\" ? stderr : error instanceof Error ? error.message : \"\")\n .replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f]/g, \"\").trim().split(/\\r?\\n/).slice(-6).map((line) => line.slice(0, 500)).join(\"\\n\");\n throw new Error(`${failure} Run ${retry} in your terminal and retry.${detail ? `\\n\\n${detail}` : \"\"}`);\n } finally {\n process.off(\"SIGINT\", cancel);\n process.off(\"SIGTERM\", cancel);\n }\n}\n\n/** Management-only. No npm process is started by a configured MCP server. */\nexport async function installGlobalRuntime(): Promise<void> {\n await runNpm([\"install\", \"--global\", \"--prefix\", runtimePrefix(), \"--prefer-online\", \"--no-fund\", \"--no-audit\", `${PACKAGE_NAME}@latest`],\n \"AKMS runtime installation failed.\", runtimeInstallCommand());\n}\n\n/** Removes per-kind packages; a linked one loses only its link, never the checkout it points to. */\nexport async function removeLegacyRuntimes(kinds: McpKind[]): Promise<void> {\n if(!kinds.length) return;\n const names = kinds.map(legacyPackageName);\n await runNpm([\"uninstall\", \"--global\", \"--prefix\", runtimePrefix(), \"--no-fund\", \"--no-audit\", ...names],\n \"Removing the old packages failed.\", `npm uninstall --global --prefix \"${runtimePrefix()}\" ${names.join(\" \")}`);\n}\n\n/** Forms use an installed runtime; the bare command is only a not-yet-installed draft. */\nexport function launchCommand(kind: McpKind): LaunchCommand {\n const runtime = findGlobalRuntime(kind);\n return runtime ? { command: runtime.command, args: [...runtime.args] } : { command: `akms-mcp-${kind}`, args: [] };\n}\n","/**\n * Input ended before a prompt was answered — Ctrl+D, Ctrl+C, or a piped script running out.\n * The menus treat it as leaving, not as a failure.\n *\n * One class for every prompter: the shared registration screens catch it with `instanceof`\n * whichever prompter (the launcher's or a kind's `config`) raised it.\n */\nexport class PromptClosedError extends Error {\n constructor() {\n super(\"input closed before the prompt was answered\");\n this.name = \"PromptClosedError\";\n }\n}\n\n/**\n * The user pressed Esc: leave this prompt without answering and go back one level. Every\n * prompt throws it, so a caller that opened a sub-screen (a field editor, a confirmation)\n * returns to where it was with nothing changed. Off a TTY a line of just `ESC` means the same.\n */\nexport class PromptBackError extends Error {\n constructor() {\n super(\"prompt left with esc\");\n this.name = \"PromptBackError\";\n }\n}\n","// Selection and rendering adapted from @akms/mcp-ssh and @akms/mcp-wsl.\nimport type { Readable, Writable } from \"node:stream\";\nimport { PromptBackError, PromptClosedError } from \"../prompt-errors\";\n\nexport { PromptBackError, PromptClosedError };\n\nexport interface SelectChoice<T extends string> {\n value: T;\n label: string;\n /** Dimmed text after the label. */\n hint?: string;\n /** A short status after the hint, drawn in its tone's color (\"Update available 0.4.1\"). */\n notice?: string;\n noticeTone?: \"success\" | \"warning\" | \"error\";\n /** What a line-mode answer may type besides the number and the label; defaults to `value`. */\n key?: string;\n}\n\n/** A non-selectable divider between groups of choices. */\nexport interface SelectSeparator {\n separator: true;\n}\n\nexport type SelectItem<T extends string> = SelectChoice<T> | SelectSeparator;\n\nexport interface SelectOptions<T extends string> {\n /** Where the cursor starts, and what Enter picks on an empty line-mode answer. */\n defaultValue?: T;\n /** Returned on Esc instead of throwing `PromptBackError` — for a menu that has a \"back\" row of its own. */\n cancelValue?: T;\n}\n\n/** The subset of `tty.ReadStream` the key-driven prompts need; absent on pipes and in tests. */\ninterface TtyInput {\n isTTY?: boolean;\n setRawMode?: (mode: boolean) => unknown;\n}\n\n/** The subset of `tty.WriteStream` the renderer reads. */\ninterface TtyOutput {\n isTTY?: boolean;\n columns?: number;\n}\n\nconst ESC = \"\\u001b\";\nconst KEY_UP = [`${ESC}[A`, `${ESC}OA`];\nconst KEY_DOWN = [`${ESC}[B`, `${ESC}OB`];\nconst KEY_HOME = [`${ESC}[H`, `${ESC}OH`, `${ESC}[1~`, \"\\u0001\"];\nconst KEY_END = [`${ESC}[F`, `${ESC}OF`, `${ESC}[4~`, \"\\u0005\"];\nconst KEY_ENTER = [\"\\r\", \"\\n\"];\nconst KEY_CTRL_C = \"\\u0003\";\nconst KEY_CTRL_D = \"\\u0004\";\n\n/** Splits a raw-mode chunk into keys: one character, or one whole escape sequence. */\nfunction splitKeys(chunk: string): string[] {\n const keys: string[] = [];\n let index = 0;\n\n while (index < chunk.length) {\n const isSequence = chunk[index] === ESC && (chunk[index + 1] === \"[\" || chunk[index + 1] === \"O\");\n if (isSequence == true) {\n let end = index + 2;\n while (end < chunk.length && /[0-9;]/.test(chunk[end]) == true) {\n end += 1;\n }\n keys.push(chunk.slice(index, end + 1));\n index = end + 1;\n continue;\n }\n\n const codePoint = chunk.codePointAt(index) ?? 0;\n const character = String.fromCodePoint(codePoint);\n keys.push(character);\n index += character.length;\n }\n\n return keys;\n}\n\n/** Terminal columns a code point occupies — two for CJK, Hangul and the wide emoji blocks. */\nfunction charWidth(codePoint: number): number {\n if (codePoint < 0x1100) {\n return 1;\n }\n\n const isWide = codePoint <= 0x115f\n || codePoint === 0x2329\n || codePoint === 0x232a\n || (codePoint >= 0x2e80 && codePoint <= 0xa4cf && codePoint !== 0x303f)\n || (codePoint >= 0xac00 && codePoint <= 0xd7a3)\n || (codePoint >= 0xf900 && codePoint <= 0xfaff)\n || (codePoint >= 0xfe30 && codePoint <= 0xfe4f)\n || (codePoint >= 0xff00 && codePoint <= 0xff60)\n || (codePoint >= 0xffe0 && codePoint <= 0xffe6)\n || (codePoint >= 0x1f300 && codePoint <= 0x1f64f)\n || (codePoint >= 0x1f900 && codePoint <= 0x1f9ff)\n || (codePoint >= 0x20000 && codePoint <= 0x3fffd);\n\n if (isWide == true) {\n return 2;\n }\n\n return 1;\n}\n\nexport function displayWidth(text: string): number {\n let width = 0;\n for (const character of text) {\n width += charWidth(character.codePointAt(0) ?? 0);\n }\n\n return width;\n}\n\n/** Pads with spaces to `width` terminal columns, counting wide characters as two. */\nfunction padToWidth(text: string, width: number): string {\n const missing = width - displayWidth(text);\n if (missing <= 0) {\n return text;\n }\n\n return `${text}${\" \".repeat(missing)}`;\n}\n\n/**\n * Label column width per item, measured within its group — the run of choices between\n * separators. One width for the whole list would push the hints of short action labels\n * (\"Quit\") out to wherever the longest host row ends.\n */\nfunction groupLabelWidths<T extends string>(items: SelectItem<T>[]): number[] {\n const widths = items.map(() => 0);\n let groupStart = 0;\n\n for (let index = 0; index <= items.length; index += 1) {\n const atBoundary = index === items.length || \"value\" in items[index] == false;\n if (atBoundary == false) {\n continue;\n }\n\n let groupWidth = 0;\n for (let member = groupStart; member < index; member += 1) {\n const item = items[member] as SelectChoice<T>;\n groupWidth = Math.max(groupWidth, displayWidth(item.label));\n }\n for (let member = groupStart; member < index; member += 1) {\n widths[member] = groupWidth;\n }\n\n groupStart = index + 1;\n }\n\n return widths;\n}\n\n/**\n * Legacy Windows consoles render `❯` / `✔` as boxes; Windows Terminal, the VS Code\n * terminal and every non-Windows terminal draw them. Same rule inquirer's `figures` uses.\n */\nfunction supportsUnicode(): boolean {\n if (process.platform !== \"win32\") {\n return true;\n }\n\n return process.env.WT_SESSION != null\n || process.env.TERM_PROGRAM === \"vscode\"\n || process.env.TERMINAL_EMULATOR === \"JetBrains-JediTerm\"\n || process.env.ConEmuTask != null;\n}\n\ninterface Style {\n accent(text: string): string;\n success(text: string): string;\n warning(text: string): string;\n error(text: string): string;\n dim(text: string): string;\n bold(text: string): string;\n}\n\nfunction createStyle(enabled: boolean): Style {\n const paint = (open: number, close: number) => {\n return (text: string): string => {\n if (enabled == false || text === \"\") {\n return text;\n }\n return `${ESC}[${open}m${text}${ESC}[${close}m`;\n };\n };\n\n return {\n accent: paint(36, 39),\n success: paint(32, 39),\n warning: paint(33, 39),\n error: paint(31, 39),\n dim: paint(2, 22),\n bold: paint(1, 22),\n };\n}\n\n/** One piece of a rendered line: plain text and the style it is drawn with. */\ninterface LinePart {\n text: string;\n paint?: (text: string) => string;\n}\n\nexport class Prompter {\n private lineBuffer = \"\";\n private readonly pendingLines: string[] = [];\n private lineWaiter: ((line: string | null) => void) | null = null;\n private inputEnded = false;\n private readonly onInputData = (chunk: string): void => {\n this.onData(chunk);\n };\n private readonly onInputEnd = (): void => {\n this.inputEnded = true;\n if(this.lineWaiter != null) {\n const waiter = this.lineWaiter;\n this.lineWaiter = null;\n waiter(null);\n }\n if(this.keyHandler != null) {\n this.keyHandler(KEY_CTRL_D);\n }\n };\n\n /** Set while a key-driven prompt owns the input. */\n private keyHandler: ((key: string) => void) | null = null;\n\n private readonly interactive: boolean;\n private readonly style: Style;\n private readonly symbols: { question: string; pointer: string; tick: string; rule: string };\n\n constructor(private readonly input: Readable, private readonly output: Writable, initialInput = \"\") {\n const ttyInput = input as TtyInput;\n const ttyOutput = output as TtyOutput;\n this.interactive = ttyInput.isTTY == true && ttyInput.setRawMode != null && ttyOutput.isTTY == true;\n this.style = createStyle(this.interactive == true && process.env.NO_COLOR == null);\n\n if (supportsUnicode() == true) {\n this.symbols = { question: \"?\", pointer: \"❯\", tick: \"✔\", rule: \"─\" };\n }\n else {\n this.symbols = { question: \"?\", pointer: \">\", tick: \"√\", rule: \"-\" };\n }\n\n this.inputEnded = input.readableEnded;\n input.setEncoding(\"utf8\");\n input.on(\"data\", this.onInputData);\n input.on(\"end\", this.onInputEnd);\n if(initialInput) this.onData(initialInput);\n }\n\n /** Stops reading so the process can exit once the command is done. */\n close(): void {\n if (this.interactive == true) {\n (this.input as TtyInput).setRawMode?.(false);\n this.output.write(`${ESC}[?25h`);\n }\n this.input.pause();\n this.input.off(\"data\", this.onInputData);\n this.input.off(\"end\", this.onInputEnd);\n }\n\n takePendingInput(): string {\n const text = this.pendingLines.map((line) => line + \"\\n\").join(\"\") + this.lineBuffer;\n this.pendingLines.length = 0;\n this.lineBuffer = \"\";\n return text;\n }\n\n get paint(): Style { return this.style; }\n\n /** Available content columns, leaving room for the terminal cursor. */\n get width(): number { return this.columns() - 1; }\n\n /** Start a fresh terminal page without erasing scrollback or emitting ANSI to pipes. */\n clearScreen(): void {\n if(this.interactive) this.output.write(`${ESC}[2J${ESC}[H`);\n }\n\n /** Keep results visible before navigating; Esc acknowledges them like Enter. */\n async acknowledge(): Promise<void> {\n try { await this.pause(); }\n catch(error) { if(!(error instanceof PromptBackError)) throw error; }\n }\n\n async pause(): Promise<void> {\n if(this.interactive) await this.readText(\"Press Enter to continue \");\n }\n\n write(text: string): void { this.output.write(text); }\n\n async askRequired(question: string, defaultValue?: string): Promise<string> {\n for(;;) {\n const answer = (await this.readText(`${question}${defaultValue ? ` (${defaultValue})` : \"\"}: `)).trim() || defaultValue;\n if(answer) return answer;\n this.write(\" A value is required.\\n\");\n }\n }\n\n async askYesNo(question: string, defaultValue: boolean): Promise<boolean> {\n for(;;) {\n const answer = (await this.readText(`${question} (${defaultValue ? \"Y/n\" : \"y/N\"}): `)).trim().toLowerCase();\n if(!answer) return defaultValue;\n if(answer === \"y\" || answer === \"yes\") return true;\n if(answer === \"n\" || answer === \"no\") return false;\n this.write(\" Enter y or n.\\n\");\n }\n }\n\n private async readText(prompt: string): Promise<string> {\n this.input.resume();\n this.output.write(prompt);\n if(!this.interactive) {\n const line = await this.readLine();\n if(line == null) throw new PromptClosedError();\n if(line === \"ESC\" || line === ESC) throw new PromptBackError();\n return line;\n }\n if(this.inputEnded) throw new PromptClosedError();\n (this.input as TtyInput).setRawMode?.(true);\n this.output.write(`${ESC}[?25h`);\n return new Promise((resolve, reject) => {\n let text = \"\";\n const finish = (error?: Error) => {\n this.keyHandler = null;\n (this.input as TtyInput).setRawMode?.(false);\n this.output.write(\"\\n\");\n if(error) reject(error); else resolve(text);\n };\n this.keyHandler = (key) => {\n if(key === KEY_CTRL_C || key === KEY_CTRL_D) return finish(new PromptClosedError());\n if(key === ESC) return finish(new PromptBackError());\n if(key === \"\\r\" || key === \"\\n\") return finish();\n if(key === \"\\b\" || key === \"\\u007f\") text = Array.from(text).slice(0, -1).join(\"\");\n else if(key === \"\\u0015\") text = \"\";\n else if(!/[\\x00-\\x1f\\x7f]/.test(key)) text += key;\n this.output.write(`\\r${ESC}[K${prompt}${text}`);\n };\n });\n }\n\n /**\n * Picks one of `items`. On a TTY: ↑/↓ move, 1–9 jump, Enter picks, Esc goes back. Off a\n * TTY: a numbered list, answered by number, key or label.\n *\n * @throws {PromptBackError} On Esc without a `cancelValue`.\n * @throws {PromptClosedError} On Ctrl+C or when the input closes.\n */\n async select<T extends string>(question: string, items: SelectItem<T>[], options?: SelectOptions<T>): Promise<T> {\n const choices = items.filter((item): item is SelectChoice<T> => \"value\" in item);\n if (choices.length === 0) {\n throw new Error(\"select needs at least one choice\");\n }\n\n let startIndex = items.findIndex((item) => \"value\" in item && item.value === options?.defaultValue);\n if (startIndex < 0) {\n startIndex = items.findIndex((item) => \"value\" in item);\n }\n\n this.input.resume();\n let picked: T | null;\n if (this.interactive == true) {\n picked = await this.selectWithKeys(question, items, startIndex);\n }\n else {\n picked = await this.selectWithLines(question, items, startIndex);\n }\n\n if (picked != null) {\n return picked;\n }\n\n if (options?.cancelValue != null) {\n return options.cancelValue;\n }\n\n throw new PromptBackError();\n }\n\n private readLine(): Promise<string | null> {\n const queued = this.pendingLines.shift();\n if (queued != null) {\n return Promise.resolve(queued);\n }\n\n if (this.inputEnded == true) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n this.lineWaiter = resolve;\n });\n }\n\n private onData(chunk: string): void {\n if (this.keyHandler != null) {\n for (const key of splitKeys(chunk)) {\n // A key that finishes the prompt hands the rest of the chunk to whatever\n // reads next; there is no next reader yet, so it is dropped, as a TTY would.\n if (this.keyHandler == null) {\n break;\n }\n this.keyHandler(key);\n }\n return;\n }\n\n this.lineBuffer += chunk;\n\n let newlineIndex = this.lineBuffer.indexOf(\"\\n\");\n while (newlineIndex >= 0) {\n const line = this.lineBuffer.slice(0, newlineIndex).replace(/\\r$/, \"\");\n this.lineBuffer = this.lineBuffer.slice(newlineIndex + 1);\n\n if (this.lineWaiter != null) {\n const waiter = this.lineWaiter;\n this.lineWaiter = null;\n waiter(line);\n }\n else {\n this.pendingLines.push(line);\n }\n\n newlineIndex = this.lineBuffer.indexOf(\"\\n\");\n }\n }\n\n private async selectWithLines<T extends string>(question: string, items: SelectItem<T>[], startIndex: number): Promise<T | null> {\n const choices = items.filter((item): item is SelectChoice<T> => \"value\" in item);\n const labelWidths = groupLabelWidths(items);\n\n this.output.write(`${this.symbols.question} ${question}\\n`);\n\n let number = 0;\n for (let index = 0; index < items.length; index += 1) {\n const item = items[index];\n if (\"value\" in item == false) {\n this.output.write(\"\\n\");\n continue;\n }\n\n number += 1;\n let line = ` ${String(number).padStart(2)}) ${padToWidth(item.label, labelWidths[index])}`;\n if (item.hint != null && item.hint !== \"\") {\n line += ` ${item.hint}`;\n }\n if (item.notice != null && item.notice !== \"\") {\n line += ` ${item.notice}`;\n }\n this.output.write(`${line.trimEnd()}\\n`);\n }\n\n const defaultChoice = items[startIndex] as SelectChoice<T>;\n const defaultNumber = choices.indexOf(defaultChoice) + 1;\n\n for (;;) {\n this.output.write(`Choice (${defaultNumber}): `);\n\n const line = await this.readLine();\n if (line == null) {\n throw new PromptClosedError();\n }\n\n if (line === ESC) {\n return null;\n }\n\n const answer = line.trim();\n if (answer === \"\") {\n return defaultChoice.value;\n }\n\n const index = Number(answer);\n if (Number.isInteger(index) == true && index >= 1 && index <= choices.length) {\n return choices[index - 1].value;\n }\n\n const lowered = answer.toLowerCase();\n const matched = choices.find((choice) => {\n const key = choice.key ?? choice.value;\n return key.toLowerCase() === lowered || choice.label.toLowerCase() === lowered;\n });\n if (matched != null) {\n return matched.value;\n }\n\n this.output.write(` Pick a number from 1 to ${choices.length}.\\n`);\n }\n }\n\n // ── TTY rendering ──────────────────────────────────────────────────────\n\n private columns(): number {\n const columns = (this.output as TtyOutput).columns;\n if (columns == null || columns < 20) {\n return 80;\n }\n\n return columns;\n }\n\n /** Joins styled parts, cutting the text (not the styles) once `width` columns are used. */\n private fitLine(parts: LinePart[], width: number): string {\n let used = 0;\n let line = \"\";\n\n for (const part of parts) {\n let text = \"\";\n for (const character of part.text) {\n const characterWidth = charWidth(character.codePointAt(0) ?? 0);\n if (used + characterWidth > width) {\n break;\n }\n used += characterWidth;\n text += character;\n }\n\n if (part.paint != null) {\n line += part.paint(text);\n }\n else {\n line += text;\n }\n\n if (used >= width) {\n break;\n }\n }\n\n return line;\n }\n\n /** The one-line record an answered prompt leaves behind on a TTY. */\n private writeAnswered(question: string, answer: string): void {\n if (this.interactive == false) {\n return;\n }\n\n this.output.write(`${this.style.success(this.symbols.tick)} ${question} ${this.style.dim(\"·\")} ${this.style.accent(answer)}\\n`);\n }\n\n /** @returns The picked value, or null on Esc. */\n private selectWithKeys<T extends string>(question: string, items: SelectItem<T>[], startIndex: number): Promise<T | null> {\n const ttyInput = this.input as TtyInput;\n const selectableIndexes = items.flatMap((item, index) => {\n if (\"value\" in item) {\n return [index];\n }\n return [];\n });\n const labelWidths = groupLabelWidths(items);\n const ruleWidth = Math.min(Math.max(...labelWidths), 24);\n\n let active = startIndex;\n let renderedLines = 0;\n\n const draw = (lines: string[]): void => {\n let text = \"\";\n if (renderedLines > 1) {\n text += `${ESC}[${renderedLines - 1}A`;\n }\n text += `\\r${ESC}[J${lines.join(\"\\n\")}`;\n this.output.write(text);\n renderedLines = lines.length;\n };\n\n const buildLines = (): string[] => {\n const width = this.columns() - 1;\n const lines = [\n this.fitLine([\n { text: this.symbols.question, paint: this.style.accent },\n { text: \" \" },\n { text: question, paint: this.style.bold },\n ], width),\n ];\n\n for (let index = 0; index < items.length; index += 1) {\n const item = items[index];\n if (\"value\" in item == false) {\n lines.push(this.fitLine([{ text: ` ${this.symbols.rule.repeat(ruleWidth)}`, paint: this.style.dim }], width));\n continue;\n }\n\n const isActive = index === active;\n const parts: LinePart[] = [];\n if (isActive == true) {\n parts.push({ text: `${this.symbols.pointer} `, paint: this.style.accent });\n parts.push({ text: padToWidth(item.label, labelWidths[index]), paint: this.style.accent });\n }\n else {\n parts.push({ text: \" \" });\n parts.push({ text: padToWidth(item.label, labelWidths[index]) });\n }\n\n if (item.hint != null && item.hint !== \"\") {\n parts.push({ text: ` ${item.hint}`, paint: this.style.dim });\n }\n if (item.notice != null && item.notice !== \"\") {\n parts.push({ text: ` ${item.notice}`, paint: this.style[item.noticeTone ?? \"warning\"] });\n }\n\n lines.push(this.fitLine(parts, width));\n }\n\n lines.push(this.fitLine([{ text: \"↑↓ move · enter select · esc back\", paint: this.style.dim }], width));\n\n return lines;\n };\n\n const move = (step: number): void => {\n const position = selectableIndexes.indexOf(active);\n const next = (position + step + selectableIndexes.length) % selectableIndexes.length;\n active = selectableIndexes[next];\n };\n\n return new Promise<T | null>((resolve, reject) => {\n const finish = (): void => {\n this.keyHandler = null;\n ttyInput.setRawMode?.(false);\n draw([]);\n this.output.write(`${ESC}[?25h`);\n };\n\n this.keyHandler = (key: string) => {\n if (key === KEY_CTRL_C || key === KEY_CTRL_D) {\n finish();\n reject(new PromptClosedError());\n return;\n }\n\n if (KEY_ENTER.includes(key) == true) {\n const picked = items[active] as SelectChoice<T>;\n finish();\n this.writeAnswered(question, picked.label);\n resolve(picked.value);\n return;\n }\n\n if (key === ESC) {\n finish();\n resolve(null);\n return;\n }\n\n if (KEY_UP.includes(key) == true) {\n move(-1);\n }\n else if (KEY_DOWN.includes(key) == true) {\n move(1);\n }\n else if (KEY_HOME.includes(key) == true) {\n active = selectableIndexes[0];\n }\n else if (KEY_END.includes(key) == true) {\n active = selectableIndexes[selectableIndexes.length - 1];\n }\n else if (/^[1-9]$/.test(key) == true && Number(key) <= selectableIndexes.length) {\n active = selectableIndexes[Number(key) - 1];\n }\n else {\n return;\n }\n\n draw(buildLines());\n };\n\n ttyInput.setRawMode?.(true);\n this.output.write(`${ESC}[?25l`);\n draw(buildLines());\n });\n }\n}\n","import { differingFields } from \"./registry\";\nimport { displayWidth } from \"./prompter\";\nimport type { RegistrationPrompter } from \"./prompter\";\nimport type { McpServerEntry } from \"./types\";\n\nexport const visibleField = /^(DB_DRIVER|DB_HOST|DB_PORT|DB_NAME|DB_USER|DB_SSL|DB_DESCRIPTION|SSH_HOST|SSH_PORT|SSH_USER|SSH_DESCRIPTION|WSL_DISTRO|WSL_USER|WSL_DESCRIPTION|S3_BACKEND|S3_BUCKET|S3_REGION|S3_PREFIX|S3_AUTH|S3_DESCRIPTION)$/;\nexport const plainText = (value: string) => value.replace(/[\\x00-\\x1f\\x7f]/g, \" \");\n\nexport function descriptionOnly(entries: McpServerEntry[]): boolean {\n const fields = differingFields(entries);\n return fields.length > 0 && fields.every((field) => /^env\\.(DB|SSH|WSL|S3)_DESCRIPTION$/.test(field));\n}\n\nconst fieldName = (field: string): string => {\n const key = field.replace(/^env\\./, \"\");\n if(/^(DB|SSH|WSL|S3)_DESCRIPTION$/.test(key)) return \"Description\";\n const names: Record<string, string> = { command: \"Launch command\", args: \"Launch arguments\", DB_HOST: \"Host\", SSH_HOST: \"Host\", DB_PORT: \"Port\", SSH_PORT: \"Port\", DB_NAME: \"Database\", DB_USER: \"User\", SSH_USER: \"User\", WSL_USER: \"User\", WSL_DISTRO: \"Linux distribution\", S3_BUCKET: \"Bucket\", S3_REGION: \"Region\", S3_PREFIX: \"Key prefix\" };\n return Object.hasOwn(names, key) ? names[key] : plainText(key);\n};\n\n/** Wrap complete values, including Korean text, without clipping the differing suffix. */\nexport function writeWrapped(prompter: RegistrationPrompter, text: string, indent = \"\", changed?: [number, number], style?: (text: string) => string): void {\n const characters = Array.from(plainText(text));\n let line = indent;\n let width = displayWidth(indent);\n let segment = \"\";\n let highlighted = false;\n const flush = () => { line += highlighted ? prompter.paint.accent(prompter.paint.bold(segment)) : style ? style(segment) : segment; segment = \"\"; };\n for(let index = 0; index < characters.length; index++) {\n const character = characters[index];\n const size = displayWidth(character);\n if(width + size > prompter.width) {\n flush(); prompter.write(line + \"\\n\"); line = indent; width = displayWidth(indent);\n }\n const highlight = !!changed && index >= changed[0] && index < changed[1];\n if(highlight !== highlighted) { flush(); highlighted = highlight; }\n segment += character;\n width += size;\n }\n flush();\n prompter.write(line + \"\\n\");\n}\n\n/** Mark only the changed middle; compare masked values, never secrets. */\nfunction changedRange(values: string[], index: number): [number, number] | undefined {\n if(values.length !== 2 || values[0] === values[1]) return undefined;\n const current = Array.from(values[index]);\n const other = Array.from(values[1 - index]);\n let start = 0, end = current.length, otherEnd = other.length;\n while(start < end && start < otherEnd && current[start] === other[start]) start++;\n while(end > start && otherEnd > start && current[end - 1] === other[otherEnd - 1]) { end--; otherEnd--; }\n return [start, end];\n}\n\nexport function compareEntries(prompter: RegistrationPrompter, versions: { label: string; entry: McpServerEntry }[]): void {\n const entries = versions.map((version) => version.entry);\n const fields = differingFields(entries);\n if(descriptionOnly(entries)) prompter.write(`${prompter.paint.warning(\"Description differs.\")} ${prompter.paint.dim(\"Connection settings match.\")}\\n`);\n else prompter.write(`${prompter.paint.accent(String(fields.length))} ${prompter.paint.warning(\"setting(s) differ.\")}\\n`);\n const values = fields.map((field) => {\n const key = field.replace(/^env\\./, \"\");\n return versions.map(({ entry }) => field.startsWith(\"env.\") && visibleField.test(key)\n ? (Object.hasOwn(entry.env, key) ? plainText(entry.env[key]) || \"(empty)\" : \"(not set)\")\n : \"(hidden)\");\n });\n if(versions.length === 2 && prompter.width >= 90) {\n const width = Math.floor((prompter.width - 3) / 2);\n const wrap = (value: string, changed?: [number, number]) => {\n const lines: { text: string; width: number }[] = [{ text: \"\", width: 0 }];\n for(const [index, character] of Array.from(value).entries()) {\n const size = displayWidth(character);\n if(lines[lines.length - 1].width + size > width) lines.push({ text: \"\", width: 0 });\n const line = lines[lines.length - 1];\n line.text += prompter.paint.accent(changed && index >= changed[0] && index < changed[1] ? prompter.paint.bold(character) : character);\n line.width += size;\n }\n return lines;\n };\n const row = (left: ReturnType<typeof wrap>, right: ReturnType<typeof wrap>) => {\n for(let line = 0; line < Math.max(left.length, right.length); line++) {\n prompter.write(`${left[line]?.text ?? \"\"}${\" \".repeat(width - (left[line]?.width ?? 0))} | ${right[line]?.text ?? \"\"}\\n`);\n }\n };\n prompter.write(\"\\n\");\n row(wrap(`[1] ${plainText(versions[0].label)}`), wrap(`[2] ${plainText(versions[1].label)}`));\n for(let field = 0; field < fields.length; field++) {\n prompter.write(`\\n${prompter.paint.dim(fieldName(fields[field]))}\\n`);\n row(wrap(values[field][0], changedRange(values[field], 0)), wrap(values[field][1], changedRange(values[field], 1)));\n }\n if(values.some(row => row.includes(\"(hidden)\"))) prompter.write(prompter.paint.dim(\"\\nSecret values are hidden.\\n\"));\n prompter.write(\"\\n\");\n return;\n }\n for(let index = 0; index < versions.length; index++) {\n prompter.write(\"\\n\");\n writeWrapped(prompter, `[${index + 1}] ${versions[index].label}`, \"\", undefined, prompter.paint.bold);\n for(let field = 0; field < fields.length; field++) {\n writeWrapped(prompter, fieldName(fields[field]), \" \", undefined, prompter.paint.dim);\n writeWrapped(prompter, values[field][index], \" \", changedRange(values[field], index), prompter.paint.accent);\n }\n }\n if(values.some((row) => row.includes(\"(hidden)\"))) prompter.write(prompter.paint.dim(\"\\nSecret values are hidden.\\n\"));\n prompter.write(\"\\n\");\n}\n","import { spawn, execFile } from \"node:child_process\";\nimport path from \"node:path\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport { visibleField, writeWrapped } from \"./comparison\";\nimport type { RegistrationPrompter } from \"./prompter\";\nimport type { McpServerEntry } from \"./types\";\nimport { launchKind, standardLaunch } from \"./runtime\";\n\nexport interface StartupResult {\n ok: boolean;\n server?: string;\n version?: string;\n tools?: number;\n toolNames?: string[];\n exitCode: number | null;\n detail?: string;\n stderr: string[];\n}\n\nfunction visibleRuntimePath(entry: McpServerEntry): string | undefined {\n const kind = launchKind(entry);\n return kind && standardLaunch({ ...entry, args: entry.args.slice(0, 1) }, kind)\n && (entry.args.length === 1 || entry.args.length === 2 && entry.args[1] === \"--catalog\") ? entry.args[0] : undefined;\n}\n\n/** Match the preview's allowlist: all other env values and launch arguments are private. */\nexport function redactStartupText(text: string, entry: McpServerEntry): string {\n const normalize = (value: string) => stripVTControlCharacters(value).replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f]/g, \"\");\n const direct = visibleRuntimePath(entry);\n const privateValues = [...Object.entries(entry.env).filter(([key]) => !visibleField.test(key)).map(([, value]) => value), ...entry.args.slice(direct ? 1 : 0)];\n const secrets = new Set<string>();\n for(const value of privateValues) {\n if(!value) continue;\n secrets.add(value);\n const values = [value];\n if(value.includes(\"=\")) values.push(value.slice(value.indexOf(\"=\") + 1));\n for(const candidate of values) {\n secrets.add(candidate);\n try {\n const url = new URL(candidate);\n if(url.password) { secrets.add(url.password); secrets.add(decodeURIComponent(url.password)); }\n } catch { /* Not a URL. */ }\n }\n }\n for(const value of [...secrets]) {\n if(!value) continue;\n secrets.add(JSON.stringify(value).slice(1, -1));\n secrets.add(encodeURIComponent(value));\n }\n for(const value of [...secrets]) secrets.add(normalize(value));\n let result = normalize(text);\n for(const value of [...secrets].filter(Boolean).sort((a, b) => b.length - a.length)) result = result.split(value).join(\"(hidden)\");\n return result;\n}\n\n/** A bounded stdio handshake only: no tools/call, shell interpolation or SDK dependency. */\nexport async function checkStartup(entry: McpServerEntry, timeoutMs = 10_000): Promise<StartupResult> {\n return new Promise((resolve) => {\n const inherited = process.platform === \"win32\"\n ? [\"APPDATA\", \"LOCALAPPDATA\", \"HOMEDRIVE\", \"HOMEPATH\", \"PATH\", \"SYSTEMROOT\", \"SYSTEMDRIVE\", \"TEMP\", \"TMP\", \"USERPROFILE\", \"PROGRAMFILES\"]\n : [\"HOME\", \"LOGNAME\", \"PATH\", \"SHELL\", \"TERM\", \"USER\", \"TMPDIR\"];\n const env = Object.fromEntries(inherited.filter(key => process.env[key] !== undefined).map(key => [key, process.env[key]!]));\n let stderr = \"\", stderrOmitted = false, output = \"\", bytes = 0, done = false, closing = false, detail: string | undefined;\n let server: string | undefined, version: string | undefined, tools = 0, expected = 1, pages = 0;\n const toolNames: string[] = [];\n let timer: ReturnType<typeof setTimeout> | undefined, killTimer: ReturnType<typeof setTimeout> | undefined, endTimer: ReturnType<typeof setTimeout> | undefined;\n let child: ReturnType<typeof spawn>;\n const result = (code: number | null, signal?: string | null) => {\n if(done) return;\n done = true;\n clearTimeout(timer); clearTimeout(killTimer); clearTimeout(endTimer);\n const clean = (value: string) => redactStartupText(value, entry);\n const ok = !detail && closing && code === 0;\n const runtime = visibleRuntimePath(entry);\n const failure = detail ?? (code !== 0 ? `Exited ${code ?? signal ?? \"without an exit code\"}.` : \"Startup check did not finish.\");\n resolve({ ok, server: server && clean(server).slice(0, 200), version: version && clean(version).slice(0, 100), tools, toolNames: toolNames.map(clean),\n exitCode: code, detail: ok ? undefined : clean(`${failure}${runtime ? ` Runtime: ${runtime}` : \"\"}`).slice(0, 2000),\n stderr: clean(stderr).trim().split(/\\r?\\n/).filter(Boolean).slice(-6).map(line => line.slice(0, 500)) });\n };\n const stop = (reason?: string) => {\n if(closing || done) return;\n closing = true; detail = reason;\n clearTimeout(timer);\n child.stdin?.end();\n killTimer = setTimeout(() => {\n if(process.platform === \"win32\" && child.pid) {\n execFile(path.join(process.env.SYSTEMROOT ?? \"C:\\\\Windows\", \"System32\", \"taskkill.exe\"), [\"/PID\", String(child.pid), \"/T\", \"/F\"], { windowsHide: true, timeout: 4000 }, () => {});\n } else if(child.pid) {\n try { process.kill(-child.pid, \"SIGKILL\"); } catch { child.kill(\"SIGKILL\"); }\n }\n endTimer = setTimeout(() => { child.kill(\"SIGKILL\"); child.stdout?.destroy(); child.stderr?.destroy(); child.unref(); result(null); }, 4500);\n }, 500);\n };\n try {\n child = spawn(entry.command, entry.args, { env: { ...env, ...entry.env }, shell: false, windowsHide: true, detached: process.platform !== \"win32\", stdio: \"pipe\" });\n } catch(error) { detail = error instanceof Error ? error.message : \"Unable to start process.\"; result(null); return; }\n timer = setTimeout(() => stop(`Timed out after ${timeoutMs} ms.`), timeoutMs);\n const send = (message: unknown) => child.stdin?.write(JSON.stringify(message) + \"\\n\");\n child.on(\"error\", (error: NodeJS.ErrnoException) => { detail = `Unable to start ${entry.command} (${error.code ?? \"error\"}).`; closing = true; result(null); });\n child.on(\"close\", (code, signal) => { if(!closing) detail ??= \"Process exited before initialize and tools/list completed.\"; result(code, signal); });\n child.stdin?.on(\"error\", () => { if(!closing) stop(\"Server closed its input before the startup check completed.\"); });\n child.stderr?.setEncoding(\"utf8\");\n child.stderr?.on(\"data\", (chunk: string) => {\n if(stderrOmitted) return;\n stderr += chunk;\n // Do not truncate inside an unredacted secret. Excessive diagnostics fail closed.\n if(stderr.length > 65_536) { stderrOmitted = true; stderr = \"[stderr exceeded the diagnostic limit; output omitted]\"; stop(\"Too much stderr output.\"); }\n });\n child.stdout?.setEncoding(\"utf8\");\n child.stdout?.on(\"data\", (chunk: string) => {\n if(closing || done) return;\n bytes += Buffer.byteLength(chunk);\n if(bytes > 2 * 1024 * 1024) { stop(\"MCP response exceeded the startup check limit.\"); return; }\n output += chunk;\n let newline: number;\n while(!closing && (newline = output.indexOf(\"\\n\")) >= 0) {\n const line = output.slice(0, newline); output = output.slice(newline + 1);\n try {\n const message = JSON.parse(line);\n if(message?.jsonrpc !== \"2.0\") throw new Error();\n if(message.method) {\n if(message.id !== undefined) send(message.method === \"ping\" ? { jsonrpc: \"2.0\", id: message.id, result: {} } : { jsonrpc: \"2.0\", id: message.id, error: { code: -32601, message: \"Not supported by startup check\" } });\n continue;\n }\n if(message.id !== expected) continue;\n if(message.error) { stop(`MCP request failed: ${typeof message.error.message === \"string\" ? message.error.message : \"server error\"}`); break; }\n if(expected === 1) {\n if(typeof message.result?.protocolVersion !== \"string\"\n || typeof message.result?.serverInfo?.name !== \"string\" || typeof message.result?.serverInfo?.version !== \"string\") throw new Error();\n server = message.result.serverInfo.name; version = message.result.serverInfo.version;\n send({ jsonrpc: \"2.0\", method: \"notifications/initialized\" });\n send({ jsonrpc: \"2.0\", id: ++expected, method: \"tools/list\", params: {} });\n } else {\n if(!Array.isArray(message.result?.tools) || !message.result.tools.every((tool: { name?: unknown }) => typeof tool?.name === \"string\")) throw new Error();\n tools += message.result.tools.length;\n toolNames.push(...message.result.tools.map((tool: { name: string }) => tool.name));\n if(message.result.nextCursor !== undefined) {\n if(typeof message.result.nextCursor !== \"string\" || ++pages > 100) throw new Error();\n send({ jsonrpc: \"2.0\", id: ++expected, method: \"tools/list\", params: { cursor: message.result.nextCursor } });\n } else stop();\n }\n } catch { stop(\"Invalid MCP response on stdout.\"); }\n }\n });\n child.once(\"spawn\", () => send({ jsonrpc: \"2.0\", id: 1, method: \"initialize\", params: { protocolVersion: \"2025-06-18\", capabilities: {}, clientInfo: { name: \"akms-startup-check\", version: \"1.0.0\" } } }));\n });\n}\n\nexport async function checkConnections(prompter: RegistrationPrompter, entries: { name: string; entry: McpServerEntry; prefixes?: string[]; maskEntries?: McpServerEntry[] }[], check = checkStartup): Promise<void> {\n if(!entries.length) return;\n prompter.write(\"\\nStartup check (initialize and tools/list only)\\n\");\n const checked = new Map<string, StartupResult>();\n let failed = false;\n for(const { name, entry, prefixes, maskEntries } of entries) {\n const key = JSON.stringify([entry.command, entry.args, Object.entries(entry.env).sort(([a], [b]) => a.localeCompare(b))]);\n let result = checked.get(key);\n if(!result) {\n try { result = await check(entry); }\n catch { result = { ok: false, exitCode: null, detail: \"Unable to complete the startup check.\", stderr: [] }; }\n checked.set(key, result);\n }\n const listedNames = result.toolNames ?? [];\n // A connection name can itself contain \"__\". Assign tools to the longest\n // known prefix so prod__archive cannot hide a missing prod connection.\n const longestFirst = [...prefixes ?? []].sort((a, b) => b.length - a.length);\n const covered = new Set(listedNames.map(tool => longestFirst.find(prefix => tool.startsWith(prefix))));\n const missing = prefixes?.filter(prefix => !covered.has(prefix)) ?? [];\n if(result.ok && missing.length) result = { ...result, ok: false, detail: `Missing connection tools: ${missing.map(prefix => prefix.slice(0, -2)).join(\", \")}. Review catalog status before reconnecting.` };\n const safe = (value: string) => [entry, ...maskEntries ?? []].reduce((text, source) => redactStartupText(text, source), value);\n writeWrapped(prompter, safe(result.ok ? `OK ${name}: ${result.server}@${result.version}, ${result.tools} tools` : `FAILED ${name}: exit ${result.exitCode ?? \"unavailable\"}. ${result.detail ?? \"Server failed to start.\"}`), \"\", undefined, result.ok ? prompter.paint.success : prompter.paint.error);\n if(!result.ok) {\n failed = true;\n for(const line of result.stderr) writeWrapped(prompter, safe(line), \" \", undefined, prompter.paint.dim);\n }\n }\n if(failed) prompter.write(\"Settings remain saved. Fix failed startup checks before restarting or reconnecting your AI clients.\\n\");\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport type { McpKind } from \"./types\";\n\nexport interface CatalogConnection { name: string; env: Record<string, string> }\nexport const LONGEST_TOOL_NAME_LENGTH: Record<McpKind, number> = { db: 13, ssh: 17, wsl: 17, s3: 11 };\nexport const sessionToolName = (connection: string, tool: string): string => `${connection}__${tool}`;\nexport const maxConnectionNameLength = (kind: McpKind): number => 64 - `mcp__akms_${kind}__`.length - 2 - LONGEST_TOOL_NAME_LENGTH[kind];\nexport const defaultCatalogPath = (): string => path.join(process.env.AKMS_MCP_HOME ? path.resolve(process.env.AKMS_MCP_HOME) : path.join(os.homedir(), \".akms\", \"mcp\"), \"registry.json\");\nconst record = (value: unknown): value is Record<string, unknown> => value !== null && typeof value === \"object\" && !Array.isArray(value);\n\n/** Server-only reader: no writes, locks, management imports, or secret diagnostics. */\nexport function readCatalog(kind: McpKind, file?: string): { file: string; connections: CatalogConnection[]; problems: string[]; rejected?: { name: string; reason: string }[] } {\n const result: ReturnType<typeof readCatalog> = { file: file ?? \"\", connections: [], problems: [] };\n const reject = (name: string, reason: string) => { result.problems.push(reason); (result.rejected ??= []).push({ name, reason }); };\n try {\n result.file = file ?? defaultCatalogPath();\n let catalog: unknown;\n try { catalog = JSON.parse(fs.readFileSync(result.file, \"utf8\")); }\n catch(error) {\n result.problems.push((error as NodeJS.ErrnoException).code === \"ENOENT\" ? \"Catalog file is missing.\" : \"Cannot read catalog JSON. Check the file and its permissions.\");\n return result;\n }\n if(!record(catalog) || ![1, 2].includes(catalog.version as number) || !record(catalog.connections)) {\n result.problems.push(\"Unsupported or invalid catalog format. Expected version 1 or 2.\");\n return result;\n }\n for(const [name, connection] of Object.entries(catalog.connections)) {\n if(!record(connection)) { result.problems.push(\"An invalid catalog connection was skipped.\"); continue; }\n if(connection.kind !== kind || connection.entry === null) continue;\n if(!record(connection.entry) || !record(connection.entry.env) || !Object.values(connection.entry.env).every(value => typeof value === \"string\")) {\n reject(name, \"A connection with invalid environment settings was skipped.\"); continue;\n }\n if(!name || name.length > maxConnectionNameLength(kind) || !/^[A-Za-z0-9_-]+$/.test(name)) {\n reject(name, `A connection with an invalid name was skipped. Use 1-${maxConnectionNameLength(kind)} ASCII letters, digits, underscores or hyphens.`); continue;\n }\n result.connections.push({ name, env: { ...connection.entry.env } as Record<string, string> });\n }\n } catch { result.problems.push(\"Cannot read catalog settings.\"); }\n return result;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { updateConfigFile } from \"./config-file\";\nimport { CLIENT_LABELS, KINDS } from \"./types\";\nimport { findGlobalRuntime, findLegacyRuntimes, installGlobalRuntime, latestRuntimeVersion, launchKind, legacyLaunch, removeLegacyRuntimes, runtimeInstallCommand, standardLaunch, catalogLaunch } from \"./runtime\";\nimport type { GlobalRuntime, LegacyRuntime } from \"./runtime\";\nimport { checkConnections, checkStartup } from \"./startup-check\";\nimport type { RegistrationPrompter } from \"./prompter\";\nimport { defaultCatalogPath, maxConnectionNameLength } from \"./catalog\";\nimport type { ClientId, ConfigTarget, ConfigWriteResult, McpKind, McpServerEntry } from \"./types\";\n\ninterface Connection {\n kind: McpKind;\n entry: McpServerEntry | null;\n /** Hashes of the last applied owned fields, never extra client-specific options. */\n applied: Partial<Record<ClientId, string>>;\n replacement?: string;\n}\nexport interface RegistryState {\n version: 1 | 2;\n /** Only new catalogs opt in; older v2 catalogs keep their per-kind choices. */\n defaultMode?: \"catalog\" | \"individual\";\n clients: ClientId[];\n connections: Record<string, Connection>;\n sessions?: Partial<Record<McpKind, { mode: \"catalog\" | \"individual\"; entry: McpServerEntry; applied: Partial<Record<ClientId, string>> }>>;\n}\nexport const sessionName = (kind: McpKind): string => `akms_${kind}`;\nexport interface SessionPlan {\n kind: McpKind;\n mode: \"catalog\" | \"individual\";\n expected: string;\n entry: McpServerEntry;\n names: string[];\n custom: string[];\n changes: { client: ClientId; add: string[]; remove: string[]; review: string[] }[];\n}\nexport interface MigrationPlan {\n expected: string;\n steps: { id: string; label: string }[];\n kinds: { kind: McpKind; status: \"convert\" | \"catalog\" | \"pending-runtime\" | \"empty\" | \"blocked\"; names: string[]; session?: SessionPlan; changes?: SessionPlan[\"changes\"]; detail?: string }[];\n /** Saved entries still starting a separate per-kind package; ready when @akms/mcp is installed. */\n launches: { kind: McpKind; names: string[]; ready: boolean }[];\n}\n/** Names whose saved launch starts a separate per-kind package: the session entry first, then connections. */\nfunction legacyLaunches(state: RegistryState): { kind: McpKind; names: string[] }[] {\n return KINDS.map(kind => ({ kind, names: [\n ...(state.sessions?.[kind] && legacyLaunch(state.sessions[kind]!.entry, kind) ? [sessionName(kind)] : []),\n ...Object.entries(state.connections).filter(([, item]) => item.kind === kind && item.entry && legacyLaunch(item.entry, kind)).map(([name]) => name),\n ] })).filter(item => item.names.length);\n}\n// Keep steps ordered as new registry formats are introduced.\nconst MIGRATION_STEPS = [\n { id: \"v1_to_v2\", label: \"Upgrade registry version 1 to version 2\", needed: (state: RegistryState) => state.version === 1 },\n { id: \"catalog_default\", label: \"Make one entry per kind the default\", needed: (state: RegistryState) => state.defaultMode === undefined },\n // Every kind is grouped: one akms_<kind> entry per AI service. Per-connection entries are a 0.2 layout to convert, not a choice.\n { id: \"group_all\", label: \"Group every kind's connections into one akms_<kind> entry\", needed: (state: RegistryState) => state.version === 2\n && (state.defaultMode === \"individual\" || Object.values(state.sessions ?? {}).some(session => session?.mode === \"individual\")) },\n { id: \"single_package\", label: \"Start servers from @akms/mcp instead of the separate per-kind packages\", needed: (state: RegistryState) => legacyLaunches(state).length > 0 },\n];\nexport interface SyncResult {\n client: ClientId;\n name: string;\n status: \"synced\" | \"removed\" | \"pending\" | \"conflict\" | \"error\";\n detail: string;\n kind?: McpKind;\n /** Logical connections represented by this service entry, including a bundle. */\n connections?: string[];\n waitingFor?: \"runtime\" | \"session\" | \"connections\" | \"rename\";\n}\nexport interface ImportCandidate { client: ClientId; name: string; kind: McpKind; entry: McpServerEntry }\nexport interface RegistrationPlan {\n imports: ImportCandidate[];\n conflicts: string[];\n errors: string[];\n}\n\nconst own = (value: object, key: string) => Object.hasOwn(value, key);\nconst record = (value: unknown): value is Record<string, unknown> => value != null && typeof value === \"object\" && !Array.isArray(value);\nconst validEntry = (value: unknown): value is McpServerEntry => record(value)\n && typeof value.command === \"string\" && Array.isArray(value.args) && value.args.every((arg) => typeof arg === \"string\")\n && record(value.env) && Object.values(value.env).every((item) => typeof item === \"string\");\n\nexport class RegistryError extends Error {}\n\nexport function entryHash(entry: McpServerEntry): string {\n return createHash(\"sha256\").update(JSON.stringify([entry.command, entry.args, Object.entries(entry.env).sort(([a], [b]) => a.localeCompare(b))])).digest(\"hex\");\n}\n\n/** Field names only: command arguments and environment values may contain secrets. */\nexport function differingFields(entries: McpServerEntry[]): string[] {\n if(entries.length < 2) return [];\n const fields: string[] = [];\n if(new Set(entries.map((entry) => entry.command)).size > 1) fields.push(\"command\");\n if(new Set(entries.map((entry) => JSON.stringify(entry.args))).size > 1) fields.push(\"args\");\n for(const key of new Set(entries.flatMap((entry) => Object.keys(entry.env)))) {\n if(new Set(entries.map((entry) => own(entry.env, key) ? entry.env[key] : undefined)).size > 1) fields.push(`env.${key}`);\n }\n return fields;\n}\n\nexport function describeDifferences(entries: McpServerEntry[]): string {\n const fields = differingFields(entries);\n if(fields.length && fields.every((field) => /^env\\.(DB|SSH|WSL|S3)_DESCRIPTION$/.test(field))) return \"Only the description differs; connection settings match.\";\n return `Different fields: ${fields.map((field) => field.replace(/^env\\./, \"\").replace(/[\\x00-\\x1f\\x7f]/g, \" \")).join(\", \")}.`;\n}\n\nexport function entryKind(entry: McpServerEntry): McpKind | null {\n return launchKind(entry);\n}\n\nexport function defaultRegistryPath(): string {\n return defaultCatalogPath();\n}\n\n/** One local catalog, created by any standalone package. The launcher is never invoked. */\nexport class Registry {\n readonly file: string;\n private observedText: string | null | undefined;\n private backupCaptured = false;\n constructor(readonly targets: ConfigTarget[], file = defaultRegistryPath(), readonly runtimeOptions: {\n find?: (kind: McpKind) => GlobalRuntime | null;\n install?: () => Promise<void>;\n check?: typeof checkStartup;\n latest?: () => Promise<string | null>;\n legacy?: () => LegacyRuntime[];\n removeLegacy?: (kinds: McpKind[]) => Promise<void>;\n } = {}) { this.file = file; }\n\n globalRuntime(kind: McpKind): GlobalRuntime | null { return (this.runtimeOptions.find ?? findGlobalRuntime)(kind); }\n\n /** The installed @akms/mcp, whichever kind is asked: one package carries them all. */\n installedRuntime(): GlobalRuntime | null { return this.globalRuntime(\"db\"); }\n\n latestRuntime(): Promise<string | null> { return (this.runtimeOptions.latest ?? latestRuntimeVersion)(); }\n\n /**\n * Per-kind packages left in the runtime directory, with the services or catalog entries\n * that still start them. A service that cannot be read counts as using every one of them.\n */\n legacyRuntimes(): { runtime: LegacyRuntime; usedBy: string[] }[] {\n const state = this.read();\n return (this.runtimeOptions.legacy ?? findLegacyRuntimes)().map(runtime => {\n const usedBy = legacyLaunches(state).filter(item => item.kind === runtime.kind).flatMap(item => item.names.map(name => `AKMS catalog: ${name}`));\n for(const target of this.targets) {\n try {\n for(const [name, entry] of Object.entries(target.readEntries())) {\n // Only a direct path runs the installed package; npx keeps its own copy.\n const launch = catalogLaunch(entry, runtime.kind) ? { ...entry, args: entry.args.slice(0, 1) } : entry;\n if(legacyLaunch(launch, runtime.kind) && /^(node|nodejs)(\\.exe)?$/i.test(path.basename(launch.command))) usedBy.push(`${target.label}: ${name}`);\n }\n } catch { usedBy.push(`${target.label}: cannot be read`); }\n }\n return { runtime, usedBy };\n });\n }\n\n /** Removes only packages nothing uses at the moment of removal. */\n async removeLegacyRuntimes(kinds: McpKind[]): Promise<void> {\n const inUse = this.legacyRuntimes().filter(item => kinds.includes(item.runtime.kind) && item.usedBy.length);\n if(inUse.length) throw new RegistryError(`Still in use: ${inUse.map(item => item.runtime.packageName).join(\", \")}. Run Migrate registry and Sync first.`);\n await (this.runtimeOptions.removeLegacy ?? removeLegacyRuntimes)(kinds);\n }\n\n isSessionMode(kind: McpKind, state = this.read()): boolean { return state.version === 2 && (state.sessions?.[kind]?.mode ?? state.defaultMode) === \"catalog\"; }\n\n needsMigration(state = this.read()): boolean { return MIGRATION_STEPS.some(step => step.needed(state)); }\n\n planMigration(): MigrationPlan {\n const state = this.read();\n const steps = MIGRATION_STEPS.filter(step => step.needed(state)).map(({ id, label }) => ({ id, label }));\n const launches = legacyLaunches(state).map(item => ({ ...item, ready: this.globalRuntime(item.kind) != null }));\n // Each kind is reviewed only while a step changes how its connections are listed.\n const layoutChanges = steps.some(step => step.id === \"v1_to_v2\" || step.id === \"catalog_default\" || step.id === \"group_all\");\n const kinds: MigrationPlan[\"kinds\"] = layoutChanges ? KINDS.map(kind => {\n const names = Object.entries(state.connections).filter(([, item]) => item.kind === kind && item.entry).map(([name]) => name);\n if(this.isSessionMode(kind, state)) return { kind, names, status: \"catalog\" };\n if(!names.length) return { kind, names, status: \"empty\" };\n try {\n for(const name of names) this.validateName(kind, name);\n if(!this.globalRuntime(kind)) {\n const changes = state.clients.map(client => {\n const remove = names.filter(name => state.connections[name].applied[client]);\n const review: string[] = [];\n try {\n const target = this.targets.find(item => item.id === client);\n if(!target) throw new Error();\n const entries = target.readEntries();\n if(target.hasEntry?.(sessionName(kind)) ?? own(entries, sessionName(kind))) review.push(sessionName(kind));\n for(const name of remove) if((target.hasEntry?.(name) ?? own(entries, name)) && (!entries[name] || entryHash(entries[name]) !== state.connections[name].applied[client])) review.push(name);\n } catch { review.push(\"Cannot inspect this service; Sync will retry.\"); }\n return { client, add: [sessionName(kind)], remove, review };\n });\n return { kind, names, status: \"pending-runtime\", changes, detail: \"Install from Runtime, then run Sync. Existing entries stay until the session is verified.\" };\n }\n return { kind, names, status: \"convert\", session: this.sessionPlan(kind, \"catalog\", state) };\n } catch(error) { return { kind, names, status: \"blocked\", detail: error instanceof RegistryError ? error.message : \"Cannot preview this kind. Check its runtime and catalog settings.\" }; }\n }) : [];\n return { expected: JSON.stringify(state), steps, kinds, launches };\n }\n\n applyMigration(plan: MigrationPlan): SyncResult[] {\n if(!plan.steps.length) return this.locked(() => {\n if(JSON.stringify(this.read()) !== plan.expected) throw new RegistryError(\"The catalog changed since review. Reopen Migrate registry.\");\n return [];\n });\n return this.change(state => {\n if(JSON.stringify(state) !== plan.expected) throw new RegistryError(\"The catalog changed since review. Reopen Migrate registry.\");\n if(plan.kinds.some(item => item.status === \"blocked\")) throw new RegistryError(\"Resolve blocked kinds before migrating the registry.\");\n for(const item of plan.kinds) {\n if(item.status === \"pending-runtime\" && this.globalRuntime(item.kind)) throw new RegistryError(\"Runtime availability changed since review. Reopen Migrate registry.\");\n if(item.session) this.applySessionState(state, item.session, false);\n }\n for(const step of plan.steps) {\n if(step.id === \"v1_to_v2\") { state.version = 2; state.sessions ??= {}; }\n else if(step.id === \"catalog_default\") state.defaultMode = \"catalog\";\n else if(step.id === \"group_all\") {\n // Converted kinds are already grouped above; a kind waiting for the runtime or without\n // connections drops its per-connection choice and follows the grouped default.\n state.defaultMode = \"catalog\";\n for(const kind of KINDS) if(state.sessions?.[kind]?.mode === \"individual\") delete state.sessions[kind];\n }\n else if(step.id === \"single_package\") {\n // Kinds without the runtime keep their entries; the step stays offered until it is installed.\n for(const item of plan.launches) {\n const runtime = this.globalRuntime(item.kind);\n if((runtime != null) !== item.ready) throw new RegistryError(\"Runtime availability changed since review. Reopen Migrate registry.\");\n if(!runtime) continue;\n const session = state.sessions?.[item.kind];\n if(session && legacyLaunch(session.entry, item.kind)) session.entry = this.sessionEntry(item.kind);\n for(const connection of Object.values(state.connections)) {\n if(connection.kind === item.kind && connection.entry && legacyLaunch(connection.entry, item.kind)) {\n connection.entry = { ...connection.entry, command: runtime.command, args: [...runtime.args] };\n }\n }\n }\n }\n else throw new RegistryError(\"Unknown registry migration step. Reopen Migrate registry.\");\n }\n }, [...new Set([\n ...plan.kinds.filter(item => item.status === \"convert\" || item.status === \"pending-runtime\").map(item => item.kind),\n ...plan.launches.filter(item => item.ready).map(item => item.kind),\n ])]);\n }\n\n kindForName(name: string, state = this.read()): McpKind | undefined {\n return own(state.connections, name) ? state.connections[name].kind : KINDS.find(kind => sessionName(kind) === name && (state.sessions?.[kind] || this.isSessionMode(kind, state)));\n }\n\n private validateName(kind: McpKind, name: string): void {\n if(!/^[A-Za-z0-9_-]+$/.test(name) || name.length > maxConnectionNameLength(kind)) throw new RegistryError(`Connection names must use 1-${maxConnectionNameLength(kind)} ASCII letters, digits, underscores or hyphens for ${kind.toUpperCase()}. Rename this connection before saving.`);\n if(KINDS.some(value => sessionName(value) === name)) throw new RegistryError(\"Names akms_db, akms_ssh, akms_wsl and akms_s3 are reserved for session servers. Choose another name.\");\n }\n\n sessionEntry(kind: McpKind): McpServerEntry {\n if(path.basename(this.file) !== \"registry.json\") throw new RegistryError(\"Session mode requires a catalog named registry.json in the AKMS catalog directory.\");\n const runtime = this.requireRuntime(kind);\n const env: Record<string, string> = {};\n if(process.env.AKMS_MCP_HOME || path.resolve(this.file) !== path.resolve(defaultCatalogPath())) env.AKMS_MCP_HOME = path.dirname(path.resolve(this.file));\n return { command: runtime.command, args: [...runtime.args, \"--catalog\"], env };\n }\n\n planSession(kind: McpKind, mode: \"catalog\" | \"individual\"): SessionPlan {\n return this.sessionPlan(kind, mode, this.read());\n }\n\n private sessionPlan(kind: McpKind, mode: \"catalog\" | \"individual\", state: RegistryState): SessionPlan {\n const names = Object.entries(state.connections).filter(([, item]) => item.kind === kind && item.entry).map(([name]) => name);\n for(const name of names) this.validateName(kind, name);\n if(own(state.connections, sessionName(kind))) throw new RegistryError(\"Rename the connection using the reserved session server name before switching modes.\");\n const entry = mode === \"catalog\" ? this.sessionEntry(kind) : state.sessions?.[kind]?.entry\n ?? (this.isSessionMode(kind, state) && this.globalRuntime(kind) ? this.sessionEntry(kind) : undefined);\n if(!entry) throw new RegistryError(\"This kind has no session server to switch back from.\");\n const changes = state.clients.map(client => {\n const target = this.targets.find(item => item.id === client);\n const add = mode === \"catalog\" ? (names.length ? [sessionName(kind)] : []) : names;\n const remove = mode === \"catalog\" ? Object.keys(state.connections).filter(name => state.connections[name].kind === kind && state.connections[name].applied[client]) : [sessionName(kind)];\n const review: string[] = [];\n try {\n if(!target) throw new Error();\n const actual = target.readEntries();\n for(const name of [...new Set([...add, ...remove])]) {\n const prior = name === sessionName(kind) ? state.sessions?.[kind]?.applied[client] : state.connections[name]?.applied[client];\n const wanted = mode === \"catalog\" && name === sessionName(kind) ? entry : mode === \"individual\" ? state.connections[name]?.entry : null;\n if((target.hasEntry?.(name) ?? own(actual, name)) && (!actual[name] || entryHash(actual[name]) !== prior && (!wanted || entryHash(actual[name]) !== entryHash(wanted)))) review.push(name);\n }\n } catch { review.push(\"Cannot inspect this service; Sync will retry.\"); }\n return { client, add, remove, review };\n });\n return { kind, mode, entry, expected: JSON.stringify(state), names, changes, custom: names.filter(name => !standardLaunch(state.connections[name].entry!, kind)) };\n }\n\n applySession(plan: SessionPlan): SyncResult[] {\n return this.change(state => this.applySessionState(state, plan));\n }\n\n private applySessionState(state: RegistryState, plan: SessionPlan, checkSnapshot = true): void {\n if(checkSnapshot && JSON.stringify(state) !== plan.expected) throw new RegistryError(\"The catalog changed since review. Reopen Runtime before switching modes.\");\n if(plan.mode === \"catalog\" && entryHash(this.sessionEntry(plan.kind)) !== entryHash(plan.entry)) throw new RegistryError(\"The runtime changed since review. Reopen Runtime before switching modes.\");\n state.version = 2; state.sessions ??= {};\n state.sessions[plan.kind] = { mode: plan.mode, entry: plan.entry, applied: state.sessions[plan.kind]?.applied ?? {} };\n }\n\n async checkSaved(prompter: RegistrationPrompter, names: string[]): Promise<void> {\n const state = this.read();\n const entries: { name: string; entry: McpServerEntry; prefixes?: string[]; maskEntries?: McpServerEntry[] }[] = [];\n const sessions = new Set<McpKind>();\n for(const name of new Set(names)) {\n const connection = state.connections[name];\n if(!connection?.entry) continue;\n if(this.isSessionMode(connection.kind, state)) sessions.add(connection.kind);\n else entries.push({ name, entry: connection.entry });\n }\n for(const kind of sessions) {\n const entry = state.sessions?.[kind]?.entry;\n if(!entry) { prompter.write(`Startup check pending for ${sessionName(kind)}: install its runtime from Runtime, then run Sync.\\n`); continue; }\n entries.push({ name: sessionName(kind), entry,\n prefixes: Object.entries(state.connections).filter(([, item]) => item.kind === kind && item.entry).map(([name]) => `${name}__`),\n maskEntries: Object.values(state.connections).filter(item => item.kind === kind && item.entry).map(item => item.entry!) });\n }\n await checkConnections(prompter, entries, this.runtimeOptions.check);\n }\n\n /** Installs or updates @akms/mcp, which carries every kind; returns the given kind's launch. */\n async installRuntime(kind: McpKind = \"db\"): Promise<GlobalRuntime> {\n if(this.installedRuntime()?.linked) throw new RegistryError(\"This is a linked development installation. Build or update its source checkout instead.\");\n await (this.runtimeOptions.install ?? installGlobalRuntime)();\n return this.requireRuntime(kind);\n }\n\n private requireRuntime(kind: McpKind): GlobalRuntime {\n const runtime = this.globalRuntime(kind);\n if(!runtime) throw new RegistryError(`Install the AKMS runtime first: ${runtimeInstallCommand()}. Then reopen Runtime.`);\n return runtime;\n }\n\n read(): RegistryState {\n let text: string;\n try { text = fs.readFileSync(this.file, \"utf8\"); this.observedText = text; }\n catch(error) {\n if((error as NodeJS.ErrnoException).code === \"ENOENT\") { this.observedText = null; return { version: 2, defaultMode: \"catalog\", clients: [], connections: {}, sessions: {} }; }\n throw new RegistryError(\"Cannot read the AKMS registry. Check its permissions.\");\n }\n let value: unknown;\n try { value = JSON.parse(text); } catch { throw new RegistryError(\"Invalid AKMS registry JSON; the file was not changed.\"); }\n if(!record(value) || ![1, 2].includes(value.version as number)) throw new RegistryError(\"Unsupported AKMS registry version; update this MCP package before changing it.\");\n if(!Array.isArray(value.clients) || !value.clients.every((id) => typeof id === \"string\" && own(CLIENT_LABELS, id))\n || new Set(value.clients).size !== value.clients.length || !record(value.connections)) throw new RegistryError(\"Invalid AKMS registry; the file was not changed.\");\n for(const [name, connection] of Object.entries(value.connections)) {\n if(!name.trim() || !record(connection) || !KINDS.includes(connection.kind as McpKind)\n || !(connection.entry === null || validEntry(connection.entry)) || !record(connection.applied)\n || Object.entries(connection.applied).some(([id, hash]) => !own(CLIENT_LABELS, id) || typeof hash !== \"string\" || !/^[a-f0-9]{64}$/.test(hash))\n || (connection.replacement != null && typeof connection.replacement !== \"string\")) throw new RegistryError(\"Invalid AKMS registry entry; the file was not changed.\");\n }\n if(value.version === 2) {\n if(!record(value.sessions) || value.defaultMode !== undefined && ![\"catalog\", \"individual\"].includes(value.defaultMode as string)) throw new RegistryError(\"Invalid session server state; the file was not changed.\");\n for(const [kind, session] of Object.entries(value.sessions)) {\n if(!KINDS.includes(kind as McpKind) || !record(session) || ![\"catalog\", \"individual\"].includes(session.mode as string)\n || !validEntry(session.entry) || !catalogLaunch(session.entry, kind as McpKind) || Object.keys(session.entry.env).some(key => key !== \"AKMS_MCP_HOME\") || !record(session.applied)\n || Object.entries(session.applied).some(([id, hash]) => !own(CLIENT_LABELS, id) || typeof hash !== \"string\" || !/^[a-f0-9]{64}$/.test(hash))) throw new RegistryError(\"Invalid session server state; the file was not changed.\");\n if(own(value.connections, sessionName(kind as McpKind))) throw new RegistryError(\"A connection uses a reserved session server name; the file was not changed.\");\n }\n } else if(value.sessions !== undefined || value.defaultMode !== undefined) throw new RegistryError(\"Session server state requires registry version 2; the file was not changed.\");\n return value as unknown as RegistryState;\n }\n\n private save(state: RegistryState): void {\n const after = JSON.stringify(state, null, 2) + \"\\n\";\n updateConfigFile(this.file, (before) => {\n if(this.observedText !== undefined && before !== (this.observedText ?? \"\")) throw new RegistryError(\"The AKMS catalog changed outside this command. Reload it and retry Sync.\");\n return after;\n }, { beforeCommit: before => {\n if(before !== null && !this.backupCaptured) {\n updateConfigFile(path.join(path.dirname(this.file), \"registry.previous.json\"), () => before, { mode: fs.statSync(this.file).mode & 0o777 });\n this.backupCaptured = true;\n }\n } });\n this.observedText = after;\n }\n\n /** Serializes standalone editors across packages, including their config-file writes. */\n private locked<T>(action: () => T): T {\n fs.mkdirSync(path.dirname(this.file), { recursive: true, mode: 0o700 });\n const lock = this.file + \".lock\";\n let descriptor: number;\n try { descriptor = fs.openSync(lock, \"wx\", 0o600); }\n catch(error) {\n if((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n // A killed CLI cannot release its lock. Only reclaim a lock whose PID is gone.\n let abandoned = false;\n try {\n const pid = Number(fs.readFileSync(lock, \"utf8\"));\n if(Number.isSafeInteger(pid) && pid > 0) {\n try { process.kill(pid, 0); } catch(probe) { abandoned = (probe as NodeJS.ErrnoException).code === \"ESRCH\"; }\n }\n } catch { /* Another editor may still be creating it. */ }\n if(!abandoned) throw new RegistryError(\"Another AKMS configuration command is running. Finish it and retry.\");\n fs.unlinkSync(lock);\n descriptor = fs.openSync(lock, \"wx\", 0o600);\n }\n this.backupCaptured = false;\n try { fs.writeFileSync(descriptor, String(process.pid)); return action(); }\n finally { this.backupCaptured = false; fs.closeSync(descriptor); fs.unlinkSync(lock); }\n }\n\n private change(action: (state: RegistryState) => void, kinds?: McpKind[]): SyncResult[] {\n return this.locked(() => {\n const state = this.read();\n action(state);\n // A new kind inherits the new catalog's default only when its runtime\n // is available. Imported legacy entries stay intact while it is missing.\n for(const kind of KINDS) {\n if(this.isSessionMode(kind, state) && !state.sessions?.[kind]\n && Object.values(state.connections).some(item => item.kind === kind && item.entry) && this.globalRuntime(kind)) {\n state.sessions ??= {};\n state.sessions[kind] = { mode: \"catalog\", entry: this.sessionEntry(kind), applied: {} };\n }\n }\n // Persist desired state before touching any client: failures remain retryable.\n this.save(state);\n return this.reconcile(state, true, kinds);\n });\n }\n\n register(clients: ClientId[], expected?: ClientId[], imports: ImportCandidate[] = []): SyncResult[] {\n if(clients.some((id) => !own(CLIENT_LABELS, id))) throw new RegistryError(\"Unknown AI service.\");\n return this.change((state) => {\n if(expected && JSON.stringify(state.clients) !== JSON.stringify(expected)) throw new RegistryError(\"Registration changed in another command. Reopen Register before applying.\");\n const grouped = new Map<string, ImportCandidate[]>();\n for(const candidate of imports) grouped.set(candidate.name, [...grouped.get(candidate.name) ?? [], candidate]);\n for(const [name, candidates] of grouped) {\n if(own(state.connections, name)) throw new RegistryError(\"The shared catalog changed since review. Reopen Register or Import before applying.\");\n const chosen = candidates[0];\n this.validateName(chosen.kind, name);\n const applied: Partial<Record<ClientId, string>> = {};\n for(const candidate of candidates) {\n if(!clients.includes(candidate.client) || candidate.kind !== chosen.kind || entryKind(candidate.entry) !== chosen.kind\n || entryHash(candidate.entry) !== entryHash(chosen.entry)) throw new RegistryError(\"Different existing settings need an explicit choice before import.\");\n const actual = this.targets.find((target) => target.id === candidate.client)?.readEntries()[name];\n if(!actual || entryHash(actual) !== entryHash(candidate.entry)) throw new RegistryError(\"Existing settings changed since review. Reopen Register or Import before applying.\");\n applied[candidate.client] = entryHash(actual);\n }\n Object.defineProperty(state.connections, name, { value: { kind: chosen.kind, entry: chosen.entry, applied }, enumerable: true, configurable: true, writable: true });\n }\n state.clients = [...new Set(clients)];\n });\n }\n\n /** Discover without writing. Only unambiguous, previously unmanaged names are batched. */\n planRegistration(clients: ClientId[], kind?: McpKind): RegistrationPlan {\n const state = this.read();\n const { entries, errors } = this.candidates(kind, clients);\n const groups = new Map<string, ImportCandidate[]>();\n for(const entry of entries) groups.set(entry.name, [...groups.get(entry.name) ?? [], entry]);\n const imports: ImportCandidate[] = [];\n const conflicts: string[] = [];\n for(const [name, candidates] of groups) {\n if(own(state.connections, name)) continue; // Never resurrect a pending deletion.\n try { this.validateName(candidates[0].kind, name); } catch { conflicts.push(name); continue; }\n if(new Set(candidates.map((candidate) => entryHash(candidate.entry))).size === 1) imports.push(...candidates);\n else conflicts.push(name);\n }\n return { imports, conflicts, errors };\n }\n\n write(kind: McpKind, name: string, entry: McpServerEntry, oldName?: string, expected?: string | null): SyncResult[] {\n this.validateName(kind, name);\n if(!validEntry(entry) || entryKind(entry) !== kind || catalogLaunch(entry)) throw new RegistryError(\"Invalid connection name or MCP entry.\");\n return this.change((state) => {\n if(!state.clients.length) throw new RegistryError(\"Register at least one AI service before saving a connection.\");\n const observedName = oldName ?? name;\n const observed = own(state.connections, observedName) ? state.connections[observedName].entry : null;\n if(expected !== undefined && (observed ? entryHash(observed) : null) !== expected) throw new RegistryError(\"This connection changed while the form was open. Reload it before saving.\");\n const previous = own(state.connections, name) ? state.connections[name] : undefined;\n if(previous && previous.kind !== kind) throw new RegistryError(`The name ${name} is already used by another MCP. Choose another name.`);\n if(oldName && oldName !== name && previous) throw new RegistryError(`The name ${name} already exists. Choose another name.`);\n if(oldName && oldName !== name) {\n const old = own(state.connections, oldName) ? state.connections[oldName] : undefined;\n if(!old || old.kind !== kind || !old.entry) throw new RegistryError(\"The connection changed; reload before renaming it.\");\n old.entry = null;\n old.replacement = name;\n }\n Object.defineProperty(state.connections, name, { value: { kind, entry, applied: previous?.applied ?? {} }, enumerable: true, configurable: true, writable: true });\n });\n }\n\n remove(kind: McpKind, name: string, expected?: string | null): SyncResult[] {\n return this.change((state) => {\n const observed = own(state.connections, name) ? state.connections[name].entry : null;\n if(expected !== undefined && (observed ? entryHash(observed) : null) !== expected) throw new RegistryError(\"This connection changed since it was displayed. Reload it before removing it.\");\n if(!own(state.connections, name)) return;\n if(state.connections[name].kind !== kind) throw new RegistryError(\"This connection belongs to another MCP.\");\n state.connections[name].entry = null;\n });\n }\n\n sync(): SyncResult[] { return this.change(() => {}); }\n inspect(): SyncResult[] { return this.reconcile(this.read(), false); }\n\n formatResults(results: SyncResult[], prefix = \"\", paint?: ResultPaint, reviewHint?: string): string {\n return formatResults(results, prefix, { paint, reviewHint,\n connectionCount: Object.values(this.read().connections).filter(item => item.entry).length });\n }\n\n private reconcile(state: RegistryState, apply: boolean, kinds?: McpKind[]): SyncResult[] {\n const results: SyncResult[] = [];\n // New names must be installed before old names can be removed on that client.\n const active = (kind: McpKind) => Object.entries(state.connections).filter(([, item]) => item.kind === kind && item.entry);\n for(const kind of kinds ?? KINDS) if(this.isSessionMode(kind, state) && active(kind).length && !state.sessions?.[kind]) {\n for(const client of state.clients) results.push({ client, name: sessionName(kind), kind,\n connections: active(kind).map(([name]) => name), status: \"pending\", waitingFor: \"runtime\",\n detail: \"Install it from Runtime, then run Sync. Your existing entries keep working.\" });\n }\n const work = [\n ...Object.entries(state.connections).filter(([, connection]) => !kinds || kinds.includes(connection.kind)).map(([name, connection]) => ({ name, connection, bundle: false })),\n ...(kinds ?? KINDS).flatMap(kind => state.sessions?.[kind] ? [{ name: sessionName(kind), bundle: true, connection: { kind, entry: state.sessions[kind]!.entry, applied: state.sessions[kind]!.applied } as Connection }] : []),\n ];\n const wanted = (item: typeof work[number]) => item.bundle ? (this.isSessionMode(item.connection.kind, state) && active(item.connection.kind).length ? item.connection.entry : null)\n : this.isSessionMode(item.connection.kind, state) ? null : item.connection.entry;\n // Install the replacement representation first, then remove the old one.\n work.sort((a, b) => (wanted(a) ? 0 : a.bundle ? 2 : 1) - (wanted(b) ? 0 : b.bundle ? 2 : 1));\n for(const item of work) {\n const { name, connection, bundle } = item;\n const clients = new Set([...state.clients, ...Object.keys(connection.applied) as ClientId[]]);\n for(const client of clients) {\n const desired = state.clients.includes(client) ? wanted(item) : null;\n const previous = connection.applied[client];\n if(!desired && !previous) continue;\n const target = this.targets.find((candidate) => candidate.id === client);\n const report = (status: SyncResult[\"status\"], detail: string, waitingFor?: SyncResult[\"waitingFor\"]) => results.push({ client, name, status, detail,\n kind: connection.kind, connections: bundle ? active(connection.kind).map(([name]) => name) : [name], ...(waitingFor ? { waitingFor } : {}) });\n if(!target) { report(\"error\", \"Service adapter unavailable; use a newer package to retry.\"); continue; }\n try {\n const entries = target.readEntries();\n const actual = own(entries, name) ? entries[name] : undefined;\n const exists = target.hasEntry?.(name) ?? actual != null;\n const hash = actual ? entryHash(actual) : undefined;\n if(desired && hash === entryHash(desired)) {\n if(apply) connection.applied[client] = hash;\n report(\"synced\", \"Up to date\");\n }\n else if(!desired && !exists) {\n if(apply) delete connection.applied[client];\n report(\"removed\", \"Removed\");\n }\n else if(exists && (!actual || !previous || hash !== previous)) {\n report(\"conflict\", actual && desired ? describeDifferences([desired, actual])\n : actual ? \"Changed outside AKMS; review before removing this entry.\"\n : \"This name is used by another server type; choose another name.\");\n }\n else {\n if(!desired && state.clients.includes(client)) {\n if(!bundle && this.isSessionMode(connection.kind, state) && active(connection.kind).length) {\n const session = state.sessions?.[connection.kind];\n const replacement = entries[sessionName(connection.kind)];\n if(!session || !replacement || entryHash(replacement) !== entryHash(session.entry) || session.applied[client] !== entryHash(session.entry)) {\n report(\"pending\", \"Connection entry kept until the session server is applied.\", \"session\"); continue;\n }\n }\n if(bundle && !this.isSessionMode(connection.kind, state) && active(connection.kind).some(([connectionName, value]) => !entries[connectionName] || entryHash(entries[connectionName]) !== entryHash(value.entry!))) {\n report(\"pending\", \"Session entry kept until all connection entries are applied.\", \"connections\"); continue;\n }\n }\n let replacement = connection.replacement && state.connections[connection.replacement];\n const visited = new Set<string>();\n while(replacement && !replacement.entry && replacement.replacement && !visited.has(replacement.replacement)) {\n visited.add(replacement.replacement);\n replacement = state.connections[replacement.replacement];\n }\n if(!desired && state.clients.includes(client) && !this.isSessionMode(connection.kind, state) && replacement && replacement.entry\n && replacement.applied[client] !== entryHash(replacement.entry)) {\n report(\"pending\", \"Old name kept until the new name is applied.\", \"rename\");\n continue;\n }\n if(!apply) { report(\"pending\", desired ? \"Needs applying\" : \"Needs removal\"); continue; }\n const result = desired ? target.writeEntry(name, desired) : target.removeEntry(name);\n if(result.status !== \"written\") { report(\"error\", \"Could not write this service's settings. Check its CLI, syntax and permissions.\"); continue; }\n // Read back, so success means the requested entry really reached disk.\n const after = target.readEntries()[name];\n if(desired ? !after || entryHash(after) !== entryHash(desired) : (target.hasEntry?.(name) ?? after != null)) {\n report(\"error\", \"Settings could not be verified; retry Sync.\"); continue;\n }\n if(desired) connection.applied[client] = entryHash(desired); else delete connection.applied[client];\n report(desired ? \"synced\" : \"removed\", desired ? \"Applied\" : \"Removed\");\n }\n } catch { report(\"error\", \"Cannot read or update settings. Check the configuration syntax, CLI and file permissions.\"); }\n if(apply) this.save(state);\n }\n if(apply && !bundle && !connection.entry && Object.keys(connection.applied).length === 0) delete state.connections[name];\n }\n if(apply) this.save(state);\n return results;\n }\n\n candidates(kind?: McpKind, clients = this.read().clients): { entries: ImportCandidate[]; errors: string[] } {\n const entries: ImportCandidate[] = [];\n const errors: string[] = [];\n for(const client of clients) {\n const target = this.targets.find((item) => item.id === client);\n try {\n if(!target) throw new RegistryError();\n for(const [name, entry] of Object.entries(target.readEntries())) {\n const found = entryKind(entry);\n if(found && !catalogLaunch(entry) && (!kind || found === kind)) entries.push({ client, name, kind: found, entry });\n }\n } catch { errors.push(`${CLIENT_LABELS[client]}: cannot inspect existing entries.`); }\n }\n return { entries, errors };\n }\n\n importEntry(name: string, chosen: ImportCandidate, reviewed: ImportCandidate[]): SyncResult[] {\n this.validateName(chosen.kind, name);\n if(catalogLaunch(chosen.entry)) throw new RegistryError(\"Session server entries are not individual connections.\");\n return this.change((state) => {\n if(!name.trim()) throw new RegistryError(\"A connection name is required.\");\n const previous = own(state.connections, name) ? state.connections[name] : undefined;\n if(name !== chosen.name && previous) throw new RegistryError(\"That shared name already exists. Choose a new name to keep both connections.\");\n if(previous && previous.kind !== chosen.kind) throw new RegistryError(\"This name belongs to another MCP. Choose another name.\");\n const applied = { ...previous?.applied };\n for(const candidate of reviewed) {\n const target = this.targets.find((item) => item.id === candidate.client);\n const actual = target?.readEntries()[candidate.name];\n if(!actual || entryHash(actual) !== entryHash(candidate.entry)) throw new RegistryError(\"Settings changed since review; import again.\");\n if(candidate.name === name && candidate.kind === chosen.kind) applied[candidate.client] = entryHash(actual);\n }\n Object.defineProperty(state.connections, name, { value: { kind: chosen.kind, entry: chosen.entry, applied }, enumerable: true, configurable: true, writable: true });\n });\n }\n\n resolve(client: ClientId, name: string, expected: McpServerEntry, useClient: boolean): SyncResult[] {\n return this.change((state) => {\n const sessionKind = KINDS.find(kind => sessionName(kind) === name && state.sessions?.[kind]);\n if(sessionKind) {\n const actual = this.targets.find(item => item.id === client)?.readEntries()[name];\n if(!actual || entryHash(actual) !== entryHash(expected)) throw new RegistryError(\"Settings changed since review; run Sync again.\");\n if(useClient || entryKind(actual) !== sessionKind) throw new RegistryError(\"Session launches can only be restored from AKMS. Keep external settings or rename the conflicting entry manually.\");\n state.sessions![sessionKind]!.applied[client] = entryHash(actual);\n return;\n }\n const connection = own(state.connections, name) ? state.connections[name] : undefined;\n const target = this.targets.find((item) => item.id === client);\n const actual = target?.readEntries()[name];\n if(!connection || !actual || entryHash(actual) !== entryHash(expected)) throw new RegistryError(\"Settings changed since review; run Sync again.\");\n if(entryKind(actual) !== connection.kind) throw new RegistryError(\"This entry runs a different server. Rename it manually before retrying.\");\n connection.applied[client] = entryHash(actual);\n if(useClient) {\n if(!state.clients.includes(client)) throw new RegistryError(\"Register this service before importing its changes.\");\n this.validateName(connection.kind, name);\n if(catalogLaunch(actual)) throw new RegistryError(\"A session server cannot be imported as an individual connection.\");\n connection.entry = actual;\n delete connection.replacement;\n }\n });\n }\n\n target(kind: McpKind): ConfigTarget {\n const registry = this;\n let snapshot: Record<string, McpServerEntry> | undefined;\n const expected = (name: string) => snapshot ? (own(snapshot, name) ? entryHash(snapshot[name]) : null) : undefined;\n const saved = (results: SyncResult[]): ConfigWriteResult => ({ status: \"written\", detail: registry.formatResults(results, \"Saved in the shared AKMS catalog.\") });\n const prepare = (name: string, entry: McpServerEntry, oldName?: string): McpServerEntry => {\n if(!registry.read().clients.length) throw new RegistryError(\"Register at least one AI service before saving a connection.\");\n const prior = snapshot && own(snapshot, oldName ?? name) ? snapshot[oldName ?? name] : undefined;\n if(prior && !standardLaunch(prior, kind)) return { ...entry, command: prior.command, args: [...prior.args] };\n const runtime = registry.requireRuntime(kind);\n return { ...entry, command: runtime.command, args: [...runtime.args] };\n };\n return {\n id: \"registered\", detected: true,\n get label() { const clients = registry.read().clients; return clients.length ? clients.map((id) => CLIENT_LABELS[id]).join(\" · \") : \"No services registered\"; },\n location: this.file,\n readEntries: () => {\n const entries = Object.fromEntries(Object.entries(registry.read().connections).filter(([, value]) => value.kind === kind && value.entry).map(([name, value]) => [name, value.entry!]));\n snapshot = structuredClone(entries);\n return entries;\n },\n hasEntry: (name) => own(registry.read().connections, name),\n prepareEntry: prepare,\n writeEntry: (name, entry) => saved(registry.write(kind, name, prepare(name, entry), undefined, expected(name))),\n renameEntry: (oldName, name, entry) => saved(registry.write(kind, name, prepare(name, entry, oldName), oldName, expected(oldName))),\n removeEntry: (name) => saved(registry.remove(kind, name, expected(name))),\n };\n }\n}\n\ntype ResultPaint = Pick<RegistrationPrompter[\"paint\"], \"success\" | \"warning\" | \"error\" | \"dim\" | \"bold\"> & Partial<Pick<RegistrationPrompter[\"paint\"], \"accent\">>;\n\nexport function formatResults(results: SyncResult[], prefix = \"\", options: { connectionCount?: number; paint?: ResultPaint; reviewHint?: string } = {}): string {\n const plain = (text: string) => text;\n const paint = options.paint ?? { success: plain, warning: plain, error: plain, dim: plain, bold: plain };\n const accent = options.paint?.accent ?? paint.bold;\n const safe = (text: string) => text.replace(/[\\x00-\\x1f\\x7f]/g, \" \");\n const lines = prefix ? [paint.bold(prefix)] : [];\n const total = options.connectionCount ?? new Set(results.flatMap(item => item.connections ?? [item.name])).size;\n lines.push(`${paint.dim(\" Connections: \")}${accent(String(total))}`);\n const updated = results.filter((item) => item.status === \"synced\" && item.detail === \"Applied\").length;\n const unchanged = results.filter((item) => item.status === \"synced\" && item.detail !== \"Applied\").length;\n const removed = results.filter((item) => item.status === \"removed\").length;\n const failed = results.filter(item => item.status === \"error\");\n const count = (value: number, label: string, tone: \"success\" | \"error\" | \"dim\") => value ? `${accent(String(value))} ${paint[tone](label)}` : paint.dim(`0 ${label}`);\n lines.push(`${paint.dim(\" Service entries: \")}${count(updated, \"updated\", \"success\")} ${paint.dim(\"·\")} ${count(unchanged, \"already up to date\", \"dim\")}${removed ? ` ${paint.dim(\"·\")} ${count(removed, \"removed\", \"success\")}` : \"\"} ${paint.dim(\"·\")} ${count(failed.length, \"failed\", \"error\")}`);\n if(!results.length) lines.push(paint.dim(\" No shared connections need applying.\"));\n if(results.length && results.every(item => item.status === \"synced\" || item.status === \"removed\")) lines.push(`${paint.success(\" OK:\")} ${paint.dim(\"all service entries are up to date.\")}`);\n const waiting = results.filter(item => item.status === \"pending\");\n for(const kind of KINDS) {\n const runtime = waiting.filter(item => item.kind === kind && item.waitingFor === \"runtime\");\n const kept = waiting.filter(item => item.kind === kind && item.waitingFor === \"session\");\n if(!runtime.length && !kept.length) continue;\n lines.push(runtime.length ? `\\n${paint.warning(\"Waiting for runtime\")} - ${accent(kind.toUpperCase())}` : `\\n${paint.warning(\"Waiting for\")} ${accent(sessionName(kind))}`);\n if(runtime.length) lines.push(paint.dim(\" Install it from Runtime, then run Sync. Your existing entries keep working.\"));\n else lines.push(paint.dim(\" Resolve this session entry in Sync. Existing connection entries stay until it is ready.\"));\n const retained = new Map<string, { clients: ClientId[]; names: string[] }>();\n for(const client of new Set(kept.map(item => item.client))) {\n const names = [...new Set(kept.filter(item => item.client === client).map(item => item.name))];\n const key = JSON.stringify([...names].sort());\n const group = retained.get(key);\n if(group) group.clients.push(client);\n else retained.set(key, { clients: [client], names });\n }\n for(const group of retained.values()) {\n const clients = group.clients.map(client => CLIENT_LABELS[client]).join(\" · \");\n lines.push(`${paint.dim(\" Kept in \")}${paint.bold(clients)}${paint.dim(` until ${sessionName(kind)} is applied: `)}${accent(group.names.map(safe).join(\", \"))}`);\n }\n }\n for(const [heading, rows, color] of [\n [\"Needs review (existing settings kept)\", results.filter(item => item.status === \"conflict\"), paint.warning],\n [\"Waiting for Sync\", waiting.filter(item => !item.waitingFor || ![\"runtime\", \"session\"].includes(item.waitingFor)), paint.warning],\n [\"Could not finish\", failed, paint.error],\n ] as const) {\n if(!rows.length) continue;\n lines.push(`\\n${color(`${heading}:`)}`);\n for(const name of new Set(rows.map((item) => item.name))) {\n lines.push(` ${accent(safe(name))}`);\n for(const row of rows.filter((item) => item.name === name)) lines.push(` ${row.status === \"error\" ? paint.error(\"FAILED \") : \"\"}${paint.dim(`${CLIENT_LABELS[row.client]}: `)}${safe(row.detail)}`);\n }\n }\n if(results.some(item => item.status === \"conflict\")) lines.push(paint.dim(`\\n${options.reviewHint ?? \"Next: open Sync to compare settings and choose which version to use.\"}`));\n if(failed.length) lines.push(`${paint.dim(\"\\nNext: \")}${paint.error(\"fix the errors above\")}${paint.dim(\", then run \")}${accent(\"Sync\")}${paint.dim(\" again.\")}`);\n return lines.join(\"\\n\");\n}\n","import { Registry, sessionName } from \"./registry\";\nimport type { MigrationPlan } from \"./registry\";\nimport { CLIENT_LABELS, KIND_LABELS } from \"./types\";\nimport type { McpKind } from \"./types\";\nimport { PACKAGE_NAME, legacyPackageName } from \"./runtime\";\nimport { plainText } from \"./comparison\";\nimport { PromptBackError, PromptClosedError, type RegistrationPrompter } from \"./prompter\";\n\n/**\n * Whether Migrate registry would change anything now. It waits while @akms/mcp is missing for a\n * step that only repoints launches, and is blocked by a connection the catalog cannot convert.\n */\nexport function migrationStatus(registry: Registry): { status: \"none\" | \"ready\" | \"waiting\" | \"blocked\"; detail?: string } {\n if(!registry.needsMigration()) return { status: \"none\" };\n const plan = registry.planMigration();\n const blocked = plan.kinds.find(item => item.status === \"blocked\");\n if(blocked) return { status: \"blocked\", detail: blocked.detail };\n if(plan.steps.some(step => step.id !== \"single_package\") || plan.launches.some(item => item.ready)) return { status: \"ready\" };\n return { status: \"waiting\", detail: `Install ${PACKAGE_NAME} first.` };\n}\n\n/** What Migrate changes, as from → to pairs: the registry format and the package servers start from. */\nexport function migrationVersions(registry: Registry, plan = registry.planMigration()): { label: string; from: string; to: string }[] {\n const pairs: { label: string; from: string; to: string }[] = [];\n if(plan.steps.some(step => step.id === \"v1_to_v2\")) pairs.push({ label: \"Registry\", from: \"v1\", to: \"v2\" });\n const ready = plan.launches.filter(item => item.ready);\n if(ready.length) {\n // \"@akms/mcp-db 0.3.2\" for each per-kind package still in the runtime directory.\n const installed = new Map<McpKind, string>(registry.legacyRuntimes().map(item => [item.runtime.kind, `${item.runtime.packageName} ${item.runtime.version}`]));\n const from = [...new Set(ready.map(item => installed.get(item.kind) ?? legacyPackageName(item.kind)))].join(\", \");\n pairs.push({ label: \"Servers\", from, to: `${PACKAGE_NAME} ${registry.installedRuntime()?.version ?? \"\"}`.trim() });\n }\n return pairs;\n}\n\nfunction writePlan(prompter: RegistrationPrompter, registry: Registry, plan: MigrationPlan): void {\n const paint = prompter.paint;\n prompter.clearScreen();\n prompter.write(`${paint.bold(\"Migrate registry\")}\\n`);\n // Old in yellow, new in green: what this migration moves from and to.\n for(const pair of migrationVersions(registry, plan)) {\n prompter.write(` ${paint.dim(pair.label.padEnd(10))}${paint.warning(plainText(pair.from))} ${paint.dim(\"→\")} ${paint.bold(paint.success(plainText(pair.to)))}\\n`);\n }\n plan.steps.forEach((step, index) => prompter.write(` ${paint.accent(`${index + 1}.`)} ${step.label}\\n`));\n if(plan.kinds.length) prompter.write(paint.dim(\" Every kind is listed as one akms_<kind> entry in each AI service; connection settings stay in the catalog.\\n\"));\n prompter.write(\"\\n\");\n for(const item of plan.launches) {\n const names = item.names.length > 3 ? `${item.names.length} entries` : item.names.map(plainText).join(\", \");\n prompter.write(` ${paint.dim(KIND_LABELS[item.kind].padEnd(10))}${names} ${paint.dim(\"→\")} ${paint.accent(`${PACKAGE_NAME}/lib/${item.kind}.js`)}${item.ready ? \"\" : paint.warning(\" after installing it\")}\\n`);\n }\n for(const item of plan.kinds) {\n const target = sessionName(item.kind);\n const action = item.status === \"catalog\" ? `already ${target}`\n : item.status === \"empty\" ? `no connections · new ones use ${target}` : item.status === \"blocked\" ? paint.error(\"blocked\")\n : `${item.names.length} entries → ${target}${item.status === \"pending-runtime\" ? paint.warning(\" after Runtime + Sync\") : \"\"}`;\n prompter.write(` ${paint.dim(KIND_LABELS[item.kind].padEnd(10))}${action}\\n`);\n if(item.detail) prompter.write(` ${\" \".repeat(10)}${paint.dim(plainText(item.detail))}\\n`);\n for(const change of item.session?.changes ?? item.changes ?? []) {\n const remove = change.remove.length > 3 ? `${change.remove.length} entries` : change.remove.join(\", \") || \"nothing\";\n prompter.write(` ${\" \".repeat(10)}${paint.dim(CLIENT_LABELS[change.client].padEnd(15))}${paint.accent(change.add.join(\", \") || \"nothing\")} ${paint.dim(\"· then remove\")} ${plainText(remove)}\\n`);\n if(change.review.length) prompter.write(` ${\" \".repeat(25)}${paint.warning(`kept for Sync review: ${change.review.map(plainText).join(\", \")}`)}\\n`);\n }\n if(item.session?.custom.length) prompter.write(` ${\" \".repeat(10)}${paint.dim(`custom commands are not started; their settings still load in the grouped entry: ${item.session.custom.map(plainText).join(\", \")}`)}\\n`);\n }\n prompter.write(paint.dim(\"\\nServer entries hold no passwords; they stay in the catalog. The previous catalog is kept as registry.previous.json.\\n\"));\n}\n\n/** Review all registry format steps before any saved settings are changed. */\nexport async function migrationMenu(prompter: RegistrationPrompter, registry: Registry): Promise<void> {\n try {\n const paint = prompter.paint;\n let plan = registry.planMigration();\n if(!plan.steps.length) {\n prompter.clearScreen();\n prompter.write(`${paint.bold(\"Migrate registry\")}\\n${paint.success(\"Up to date\")} ${paint.dim(\"· the registry is already in the current format\")}\\n`);\n await prompter.acknowledge();\n return;\n }\n writePlan(prompter, registry, plan);\n if(plan.launches.some(item => !item.ready) && !registry.installedRuntime()?.linked) {\n prompter.write(paint.warning(`! ${PACKAGE_NAME} is not installed in the runtime directory yet.\\n`));\n if(await prompter.askYesNo(`Install ${PACKAGE_NAME} now?`, true)) {\n prompter.write(`Installing ${PACKAGE_NAME}@latest...\\n`);\n try { await registry.installRuntime(); }\n catch(error) { prompter.write(`${paint.error(\"Failed\")} ${plainText(error instanceof Error ? error.message : \"Installation failed.\")}\\n`); await prompter.acknowledge(); }\n plan = registry.planMigration();\n writePlan(prompter, registry, plan);\n }\n }\n if(plan.kinds.some(item => item.status === \"blocked\")) { prompter.write(paint.warning(\"! Resolve blocked kinds before migrating. No migration was applied.\\n\")); await prompter.acknowledge(); return; }\n if(plan.steps.every(step => step.id === \"single_package\") && plan.launches.every(item => !item.ready)) {\n prompter.write(`Nothing can be migrated until ${PACKAGE_NAME} is installed. Install it from Runtime, then reopen Migrate registry.\\n`);\n await prompter.acknowledge();\n return;\n }\n if(!await prompter.askYesNo(\"Migrate the registry and apply these changes?\", false)) return;\n const results = registry.applyMigration(plan);\n prompter.clearScreen();\n prompter.write(`${registry.formatResults(results, \"Registry migration saved.\", prompter.paint)}\\n`);\n const state = registry.read();\n const launchKinds = plan.launches.filter(item => item.ready).map(item => item.kind);\n await registry.checkSaved(prompter, [...new Set([\n ...plan.kinds.flatMap(item => item.names),\n ...Object.entries(state.connections).filter(([, item]) => item.entry && launchKinds.includes(item.kind)).map(([name]) => name),\n ])]);\n if(plan.launches.some(item => !item.ready)) prompter.write(paint.warning(`! Entries waiting for ${PACKAGE_NAME} keep their old launch. Install it from Runtime, then reopen Migrate registry.\\n`));\n prompter.write(\"Reconnect affected clients to load the new launch commands. Fix startup failures first.\\n\");\n await prompter.acknowledge();\n } catch(error) {\n if(error instanceof PromptClosedError) throw error;\n if(error instanceof PromptBackError) return;\n prompter.write(`${error instanceof Error ? plainText(error.message) : \"Could not migrate the registry.\"}\\n`);\n await prompter.acknowledge();\n }\n}\n","import { PACKAGE_VERSION } from \"../../_defs\";\nimport { Registry, entryHash, sessionName } from \"./registry\";\nimport type { SyncResult } from \"./registry\";\nimport { CLIENT_LABELS, KIND_LABELS, KINDS } from \"./types\";\nimport type { McpKind } from \"./types\";\nimport { PACKAGE_NAME, runtimeIsOlder, runtimePrefix } from \"./runtime\";\nimport { plainText, writeWrapped } from \"./comparison\";\nimport { redactStartupText } from \"./startup-check\";\nimport { migrationMenu, migrationStatus, migrationVersions } from \"./migration-menu\";\nimport { PromptBackError, PromptClosedError, type RegistrationPrompter, type SelectItem } from \"./prompter\";\n\nexport async function prepareRuntime(prompter: RegistrationPrompter, registry: Registry, kind: McpKind, version = PACKAGE_VERSION): Promise<boolean> {\n const installed = registry.globalRuntime(kind);\n if(installed) {\n if(installed.linked || !runtimeIsOlder(installed.version, version)) return true;\n prompter.clearScreen();\n writeWrapped(prompter, `Installed runtime: ${installed.version}. This setup: ${version}.`);\n if(!await prompter.askYesNo(\"Update the AKMS runtime to the latest release before continuing?\", true)) return true;\n }\n prompter.clearScreen();\n writeWrapped(prompter, `Installing ${PACKAGE_NAME}@latest in ${runtimePrefix()}...`);\n prompter.write(\"Installation runs during setup. Saved connections will start Node directly.\\n\");\n try {\n await registry.installRuntime(kind);\n prompter.clearScreen();\n return true;\n } catch(error) {\n prompter.write(`${error instanceof Error ? error.message : \"AKMS runtime installation failed.\"}\\n`);\n // A failed npm update may have removed files; only continue with a runtime\n // that is still discoverable, never with a stale pre-install snapshot.\n const available = installed ? registry.globalRuntime(kind) : null;\n if(available) writeWrapped(prompter, `Continuing with installed runtime ${available.version}. You can retry the update from Runtime.`);\n await prompter.acknowledge();\n return Boolean(available);\n }\n}\n\n/** The newest version known to be ahead of the installed one: this setup's own, or npm's latest once checked. */\nfunction updateTarget(installed: string, latest: string | null | undefined): string | null {\n let target: string | null = null;\n for(const candidate of [PACKAGE_VERSION, latest]) {\n if(typeof candidate !== \"string\" || !runtimeIsOlder(installed, candidate)) continue;\n if(target == null || runtimeIsOlder(target, candidate)) target = candidate;\n }\n return target;\n}\n\n/** Notice for the menu row that opens Runtime — read from disk only, so the menu opens at once. */\nexport function runtimeNotice(registry: Registry): { hint: string; notice?: string } {\n const installed = registry.installedRuntime();\n if(!installed) return { hint: PACKAGE_NAME, notice: \"Not installed\" };\n const notices: string[] = [];\n const migration = migrationStatus(registry).status;\n if(migration === \"ready\") notices.push(\"Registry update available\");\n else if(migration === \"blocked\") notices.push(\"Registry update blocked\");\n const target = installed.linked ? null : updateTarget(installed.version, undefined);\n if(target) notices.push(`Update available ${target}`);\n const hint = `${PACKAGE_NAME} ${installed.version}${installed.linked ? \" · development link\" : \"\"}`;\n return notices.length ? { hint, notice: notices.join(\" · \") } : { hint };\n}\n\nfunction connectionNames(registry: Registry, kind?: McpKind): string[] {\n return Object.entries(registry.read().connections).filter(([, item]) => item.entry && (!kind || item.kind === kind)).map(([name]) => name);\n}\n\n/** Kinds whose akms_<kind> entry no longer starts the installed runtime, e.g. after Node or the runtime folder moved. */\nfunction outdatedKinds(registry: Registry): McpKind[] {\n return KINDS.filter(kind => {\n if(!registry.isSessionMode(kind) || !registry.globalRuntime(kind)) return false;\n const saved = registry.read().sessions?.[kind]?.entry;\n try { return saved != null && entryHash(saved) !== entryHash(registry.sessionEntry(kind)); }\n catch { return false; }\n });\n}\n\nasync function installOrUpdate(prompter: RegistrationPrompter, registry: Registry): Promise<void> {\n const paint = prompter.paint;\n prompter.clearScreen();\n prompter.write(`Installing ${paint.accent(`${PACKAGE_NAME}@latest`)} into ${plainText(runtimePrefix())}...\\n`);\n try {\n const runtime = await registry.installRuntime();\n prompter.write(`${paint.success(\"Installed\")} ${PACKAGE_NAME} ${paint.accent(runtime.version)}.\\n`);\n const names = connectionNames(registry);\n if(names.length) await registry.checkSaved(prompter, names);\n prompter.write(\"Reconnect or restart your AI clients to load it.\\n\");\n if(migrationStatus(registry).status === \"ready\") prompter.write(paint.warning(\"! Registry update available. Choose Migrate registry below.\\n\"));\n } catch(error) {\n let detail = error instanceof Error ? error.message : \"Installation failed.\";\n for(const item of Object.values(registry.read().connections)) if(item.entry) detail = redactStartupText(detail, item.entry);\n prompter.write(`${paint.error(\"Failed\")} ${plainText(detail)}\\n`);\n if(/\\b(?:EBUSY|EPERM|EACCES)\\b/i.test(detail)) prompter.write(\"Close your AI clients, then retry. A running server may have locked its files.\\n\");\n }\n await prompter.acknowledge();\n}\n\n/** Install, update and clean up @akms/mcp. How connections are listed in AI services is one level down. */\nexport async function runtimeMenu(prompter: RegistrationPrompter, registry: Registry): Promise<void> {\n // undefined: not checked in this visit; null: npm could not be reached\n let latest: string | null | undefined;\n for(;;) {\n try {\n prompter.clearScreen();\n const paint = prompter.paint;\n const installed = registry.installedRuntime();\n const target = installed && !installed.linked ? updateTarget(installed.version, latest) : null;\n\n // (1) Where the runtime stands: the package, its folder, and any 0.3.x packages beside it\n const legacy = registry.legacyRuntimes();\n const removable = legacy.filter(item => !item.usedBy.length);\n const inUse = legacy.filter(item => item.usedBy.length);\n const migration = migrationStatus(registry);\n // \"@akms/mcp-db, @akms/mcp-ssh 0.3.2\": names sharing a version are listed once with it.\n const packages = (list: typeof legacy) => [...new Set(list.map(item => item.runtime.version))]\n .map(version => `${list.filter(item => item.runtime.version === version).map(item => item.runtime.packageName).join(\", \")} ${version}`).join(\"; \");\n const row = (label: string, value: string) => prompter.write(` ${paint.dim(label.padEnd(10))}${value}\\n`);\n prompter.write(`${paint.bold(\"Runtime\")} ${PACKAGE_NAME} ${installed ? paint.accent(installed.version) : paint.warning(\"not installed\")}${installed?.linked ? paint.dim(\" development link\") : \"\"}\\n`);\n row(\"Location\", plainText(runtimePrefix()));\n if(inUse.length) row(\"In use\", `${paint.warning(packages(inUse))} ${paint.dim(\"· old packages\")}`);\n if(removable.length) row(\"Unused\", `${packages(removable)} ${paint.dim(\"· old packages\")}`);\n if(latest === null) prompter.write(paint.warning(\"! Could not reach npm to check for updates.\\n\"));\n else if(latest !== undefined && installed && !target) prompter.write(`${paint.success(\"Up to date\")} ${paint.dim(`· latest ${latest}`)}\\n`);\n\n // (2) While an upgrade from the per-kind packages is unfinished: what is done and what comes next\n const upgrading = legacy.length > 0 || migration.status !== \"none\";\n let next: \"install\" | \"migrate\" | \"remove\" | null = null;\n if(upgrading) {\n const plan = migration.status === \"none\" ? null : registry.planMigration();\n const sessions = (plan?.launches ?? []).flatMap(item => item.names.filter(name => /^akms_/.test(name)));\n const pairs = migration.status === \"ready\" ? migrationVersions(registry, plan ?? undefined) : [];\n const moves = pairs.map(pair => pair.label === \"Registry\" ? `registry ${pair.from} → ${pair.to}` : `${pair.from} → ${pair.to}`).join(\" · \");\n const steps = [\n { id: \"install\" as const, label: `Install ${PACKAGE_NAME}`, done: installed != null, blocked: false,\n detail: installed ? installed.version : \"one package for every kind\" },\n { id: \"migrate\" as const, label: \"Migrate registry\", done: migration.status === \"none\", blocked: migration.status === \"blocked\",\n detail: migration.status === \"none\" ? \"\" : migration.status === \"blocked\" ? plainText(migration.detail ?? \"\")\n : moves || (sessions.length ? `moves ${sessions.join(\", \")} to ${PACKAGE_NAME}` : \"one akms_<kind> entry per kind\") },\n { id: \"remove\" as const, label: \"Remove old packages\", done: legacy.length === 0, blocked: false,\n detail: inUse.length && migration.status === \"none\" ? \"run Sync first: an AI service still starts them\" : \"then restart your AI clients\" },\n ];\n prompter.write(`\\n${paint.bold(\"Upgrade steps\")}\\n`);\n for(const [index, step] of steps.entries()) {\n let state = paint.dim(\"later \");\n if(step.done) state = paint.success(\"done \");\n else if(step.blocked) state = paint.error(\"blocked\");\n else if(next == null) { state = paint.warning(\"next \"); next = step.id; }\n const label = step.done ? paint.dim(step.label.padEnd(22)) : step.id === next ? paint.bold(step.label.padEnd(22)) : step.label.padEnd(22);\n prompter.write(` ${paint.dim(`${index + 1}`)} ${label}${state} ${step.id === next ? step.detail : paint.dim(step.detail)}\\n`);\n }\n }\n prompter.write(\"\\n\");\n\n // (3) Only what can be done now; the next upgrade step starts under the cursor\n const items: SelectItem<string>[] = [];\n if(!installed) items.push({ value: \"install\", key: \"install\", label: `Install ${PACKAGE_NAME}`, hint: upgrading ? \"step 1\" : \"one package for every kind\" });\n else if(target) items.push({ value: \"update\", key: \"update\", label: `Update to ${target}`, hint: `installed ${installed.version}` });\n else if(!installed.linked) items.push({ value: \"check\", key: \"check\", label: \"Check for updates\", hint: \"asks npm for the latest release\" });\n if(migration.status === \"ready\") {\n // \"step 2 · @akms/mcp-db 0.3.2 →\" dimmed, then the destination in green.\n const pairs = migrationVersions(registry).map(pair => pair.label === \"Registry\" ? { from: `registry ${pair.from}`, to: pair.to } : pair);\n const last = pairs.at(-1);\n items.push({ value: \"migrate\", key: \"migrate\", label: \"Migrate registry\",\n hint: last ? [\"step 2\", ...pairs.slice(0, -1).map(pair => `${pair.from} → ${pair.to}`), `${last.from} →`].join(\" · \") : \"step 2 · one akms_<kind> entry per kind\",\n ...(last ? { notice: last.to, noticeTone: \"success\" as const } : {}) });\n }\n // An old launch is the migration's job while it is pending; only after it does this row appear.\n const outdated = migration.status === \"none\" ? outdatedKinds(registry) : [];\n if(outdated.length) items.push({ value: \"relaunch\", key: \"relaunch\", label: \"Update launch commands\", hint: outdated.map(sessionName).join(\", \"), notice: \"out of date\" });\n if(removable.length) {\n items.push({ value: \"remove\", key: \"remove\", label: inUse.length ? \"Remove unused packages\" : \"Remove old packages\",\n hint: `${inUse.length ? \"\" : \"step 3 · \"}${removable.map(item => item.runtime.packageName).join(\", \")}` });\n }\n items.push({ value: \"back\", key: \"b\", label: \"Back\" });\n const defaultValue = next === \"migrate\" && migration.status === \"ready\" ? \"migrate\" : next === \"remove\" && removable.length && !inUse.length ? \"remove\" : undefined;\n const picked = await prompter.select(\"Runtime\", items, { cancelValue: \"back\", ...(defaultValue ? { defaultValue } : {}) });\n\n if(picked === \"back\") return;\n if(picked === \"migrate\") { await migrationMenu(prompter, registry); continue; }\n if(picked === \"install\" || picked === \"update\") { await installOrUpdate(prompter, registry); latest = undefined; continue; }\n if(picked === \"check\") {\n prompter.write(`Checking the latest ${PACKAGE_NAME} release...\\n`);\n latest = await registry.latestRuntime();\n continue;\n }\n if(picked === \"relaunch\") { await updateLaunchCommands(prompter, registry, outdated); continue; }\n if(picked === \"remove\") {\n prompter.clearScreen();\n prompter.write(`${paint.bold(\"Remove old packages\")}\\n`);\n for(const item of removable) prompter.write(` ${item.runtime.packageName} ${paint.dim(`${item.runtime.version}${item.runtime.linked ? \" · development link (the checkout stays)\" : \"\"}`)}\\n`);\n prompter.write(paint.dim(\"No AI service starts them any more; every kind now runs from @akms/mcp.\\n\"));\n if(!await prompter.askYesNo(\"Remove these packages?\", false)) continue;\n await registry.removeLegacyRuntimes(removable.map(item => item.runtime.kind));\n prompter.write(`${paint.success(\"Removed\")} ${removable.map(item => item.runtime.packageName).join(\", \")}.\\n`);\n await prompter.acknowledge();\n }\n } catch(error) {\n if(error instanceof PromptClosedError) throw error;\n if(error instanceof PromptBackError) continue;\n prompter.write(`${error instanceof Error ? plainText(error.message) : \"Could not configure the AKMS runtime.\"}\\n`);\n await prompter.acknowledge();\n }\n }\n}\n\n/** Point each out-of-date akms_<kind> entry at the installed runtime; connection settings stay in the catalog. */\nasync function updateLaunchCommands(prompter: RegistrationPrompter, registry: Registry, kinds: McpKind[]): Promise<void> {\n const paint = prompter.paint;\n prompter.clearScreen();\n prompter.write(`${paint.bold(\"Update launch commands\")}\\n`);\n for(const kind of kinds) prompter.write(` ${paint.dim(sessionName(kind).padEnd(10))}${paint.accent(plainText(registry.sessionEntry(kind).args[0]))} --catalog\\n`);\n prompter.write(paint.dim(\"Only the command that starts each entry changes; connection settings stay in the catalog.\\n\"));\n if(!await prompter.askYesNo(\"Update these entries?\", true)) return;\n const results: SyncResult[] = [];\n for(const kind of kinds) results.push(...registry.applySession(registry.planSession(kind, \"catalog\")));\n prompter.clearScreen();\n prompter.write(`${registry.formatResults(results, \"Launch commands saved.\", prompter.paint)}\\n`);\n const connections = registry.read().connections;\n await registry.checkSaved(prompter, connectionNames(registry).filter(name => kinds.includes(connections[name].kind)));\n prompter.write(\"Restart or reconnect your AI clients to use them.\\n\");\n await prompter.acknowledge();\n}\n","import { stripVTControlCharacters } from \"node:util\";\nimport type { RegistrationPrompter } from \"./prompter\";\n\ntype Screen = Pick<RegistrationPrompter, \"write\" | \"paint\">;\nexport type ScreenTone = \"accent\" | \"success\" | \"warning\" | \"error\" | \"dim\";\n\n/** Plain configuration values cannot supply terminal controls or extra screen rows. */\nexport const screenText = (value: string): string => stripVTControlCharacters(value).replace(/[\\x00-\\x1f\\x7f]/g, \" \");\nexport const countLabel = (count: number, noun: string, plural = `${noun}s`): string => `${count} ${count === 1 ? noun : plural}`;\n\nexport function writeHeading(screen: Screen, title: string): void {\n screen.write(`${screen.paint.bold(screenText(title))}\\n`);\n}\n\nexport function writeField(screen: Screen, label: string, value: string, note = \"\", tone: ScreenTone = \"accent\"): void {\n const paint = screen.paint;\n const key = screenText(label);\n const padded = key.padEnd(Math.max(13, key.length + 2));\n screen.write(` ${paint.dim(padded)}${paint[tone](screenText(value))}${note ? ` ${paint.dim(screenText(note))}` : \"\"}\\n`);\n}\n\nexport function writeHint(screen: Screen, text: string): void {\n screen.write(`${screen.paint.dim(screenText(text))}\\n`);\n}\n\nexport function writeWarning(screen: Screen, text: string): void {\n screen.write(`${screen.paint.warning(`! ${screenText(text)}`)}\\n`);\n}\n\nexport function writeOutcome(screen: Screen, status: string, detail: string, tone: \"success\" | \"warning\" | \"error\"): void {\n screen.write(`${screen.paint[tone](screenText(status))}\\n`);\n // Shared writers return a complete results screen; preserve its rows rather than\n // flattening it into one long, dimmed explanation.\n if(detail.includes(\"\\n\")) screen.write(`${detail}\\n`);\n else writeField(screen, \"Location\", detail);\n}\n\nexport function writeFormHelp(screen: Screen, clearAnswer: string): void {\n writeHint(screen, \"Select a setting to edit.\");\n writeField(screen, \"Text\", `Enter keeps · ${clearAnswer} clears`);\n writeField(screen, \"Back\", \"Esc\");\n screen.write(\"\\n\");\n}\n","import { Registry, entryHash, entryKind, describeDifferences, sessionName } from \"./registry\";\nimport { compareEntries, descriptionOnly, visibleField } from \"./comparison\";\nimport { prepareRuntime } from \"./runtime-menu\";\nimport { standardLaunch } from \"./runtime\";\nimport type { ImportCandidate, SyncResult } from \"./registry\";\nimport { CLIENT_LABELS, KINDS, KIND_LABELS } from \"./types\";\nimport { countLabel, screenText, writeField, writeHeading, writeHint, writeWarning } from \"./display\";\nimport type { ClientId, ConfigTarget, McpKind, McpServerEntry } from \"./types\";\nimport { PromptBackError, PromptClosedError, type RegistrationPrompter } from \"./prompter\";\nimport type { SelectItem } from \"./prompter\";\n\nfunction pendingImports(registry: Registry, kind?: McpKind): { names: string[]; differing: number } {\n const state = registry.read();\n const entries = registry.candidates(kind).entries.filter(candidate => !Object.hasOwn(state.connections, candidate.name));\n const names = [...new Set(entries.map(candidate => candidate.name))];\n return { names, differing: names.filter(name => new Set(entries.filter(item => item.name === name).map(item => entryHash(item.entry))).size > 1).length };\n}\n\nexport type ManagementMode = \"config\" | \"register\" | \"sync\";\n\nfunction preview(prompter: RegistrationPrompter, entry: McpServerEntry | null): void {\n if(!entry) { writeField(prompter, \"Action\", \"Remove from service\", \"\", \"warning\"); return; }\n // Arguments may also contain credentials in imported commands. Only env keys and\n // familiar non-secret endpoint fields are shown in a registration/conflict preview.\n for(const [key, value] of Object.entries(entry.env)) writeField(prompter, key, visibleField.test(key) ? value : \"(hidden)\", \"\", visibleField.test(key) ? \"accent\" : \"dim\");\n}\n\n/** Status lines and the Add guard of each kind's config screen; shared settings live in the AKMS MCP menu. */\nexport class ManagedSession {\n readonly registry: Registry;\n readonly target: ConfigTarget;\n constructor(readonly options: { kind: McpKind; targets: ConfigTarget[]; registryPath?: string; mode?: ManagementMode; targetId?: string; version?: string; runtimeOptions?: Registry[\"runtimeOptions\"] }) {\n this.registry = new Registry(options.targets, options.registryPath, options.runtimeOptions);\n this.target = this.registry.target(options.kind);\n }\n\n async initialize(prompter: RegistrationPrompter): Promise<boolean> {\n const { mode = \"config\", targetId } = this.options;\n if(targetId && !this.registry.targets.some((item) => item.id === targetId)) throw new Error(\"Unknown AI service. Use claude-code, codex, claude-desktop or cursor.\");\n if(mode === \"sync\") { await syncMenu(prompter, this.registry); return false; }\n if(mode === \"register\") {\n await registrationMenu(prompter, this.registry, targetId as ClientId | undefined);\n return false;\n }\n this.registry.read();\n return true;\n }\n\n /**\n * A kind's screen lists only its connections; Register, Sync, Runtime and Migrate live in the\n * AKMS MCP menu, so each status line names that menu.\n */\n writeStatus(prompter: RegistrationPrompter): void {\n const state = this.registry.read();\n const warnings: string[] = [];\n if(!process.env.AKMS_MCP_MENU) writeField(prompter, \"Setup\", \"npx -y @akms/mcp@latest\", \"Register · Sync · Runtime\");\n if(this.registry.needsMigration(state)) warnings.push(\"Registry update available. Open Runtime in the AKMS MCP menu to migrate.\");\n writeField(prompter, \"Services\", state.clients.map((id) => CLIENT_LABELS[id]).join(\" · \") || \"none\", \"\", state.clients.length ? \"accent\" : \"warning\");\n if(!state.clients.length) warnings.push(\"No AI services registered. Choose Register in the AKMS MCP menu before adding a connection.\");\n if(this.registry.isSessionMode(this.options.kind, state)) writeField(prompter, \"Server\", sessionName(this.options.kind), \"reconnect clients after changing connections\");\n const attention = new Set(this.registry.inspect().filter((item) => this.registry.kindForName(item.name, state) === this.options.kind\n && ![\"synced\", \"removed\"].includes(item.status)).flatMap(item => item.connections ?? [item.name])).size;\n if(attention) warnings.push(`Needs attention: ${countLabel(attention, \"connection\")}. Open Sync in the AKMS MCP menu.`);\n const pending = pendingImports(this.registry, this.options.kind).names.length;\n if(pending) warnings.push(`Import available: ${countLabel(pending, \"connection\")}. Open Sync in the AKMS MCP menu.`);\n if(warnings.length) writeWarning(prompter, warnings.join(\" \"));\n }\n\n decorate(items: SelectItem<string>[]): void {\n const results = this.registry.inspect();\n for(const item of items) {\n if(\"separator\" in item) continue;\n const separator = item.value.indexOf(\":\");\n if(separator < 0) continue;\n const name = item.value.slice(separator + 1);\n const rows = results.filter((row) => row.name === name || this.registry.isSessionMode(this.options.kind) && row.name === sessionName(this.options.kind));\n const count = rows.filter((row) => row.status === \"synced\").length;\n const total = this.registry.read().clients.length;\n const attention = rows.some((row) => ![\"synced\", \"removed\"].includes(row.status));\n item.hint = [item.hint, total ? `${attention ? \"Needs attention\" : \"Applied\"} ${count}/${total}` : \"Register to apply\"].filter(Boolean).join(\" · \");\n }\n }\n\n async prepareRuntime(prompter: RegistrationPrompter, existing?: McpServerEntry): Promise<boolean> {\n if(existing && !standardLaunch(existing, this.options.kind)) return true;\n return prepareRuntime(prompter, this.registry, this.options.kind, this.options.version);\n }\n\n async checkSaved(prompter: RegistrationPrompter, name: string, before?: McpServerEntry): Promise<void> {\n const saved = this.registry.read().connections[name]?.entry;\n if(saved && (!before || entryHash(saved) !== entryHash(before))) await this.registry.checkSaved(prompter, [name]);\n }\n\n async handle(action: string, prompter: RegistrationPrompter): Promise<boolean> {\n if(action !== \"add\") return false;\n if(!this.registry.read().clients.length) {\n writeWarning(prompter, \"Register an AI service first: choose Register in the AKMS MCP menu, select at least one service, then Apply registration.\");\n await prompter.acknowledge();\n return true;\n }\n return !await this.prepareRuntime(prompter);\n }\n}\n\nexport async function registrationMenu(prompter: RegistrationPrompter, registry: Registry, initialClient?: ClientId): Promise<boolean> {\n const initial = registry.read();\n const selected = new Set(initial.clients);\n if(initialClient) selected.add(initialClient);\n const discovered = registry.candidates(undefined, registry.targets.filter((target) => target.id !== \"registered\").map((target) => target.id as ClientId));\n let cursor = initialClient ?? registry.targets[0]?.id;\n let privacyNoticeShown = false;\n for(;;) {\n try {\n prompter.clearScreen();\n writeHeading(prompter, \"Register · AI services\");\n writeHint(prompter, \"Toggle services, then Apply. Matching connections are imported; differences stay for review.\");\n if(discovered.errors.length) writeWarning(prompter, discovered.errors.join(\" \"));\n const picked = await prompter.select<string>(\"Register\", [\n ...registry.targets.filter((target) => target.id !== \"registered\").map((target) => ({\n value: target.id, label: `[${selected.has(target.id as ClientId) ? \"x\" : \" \"}] ${target.label}`,\n hint: `${initial.clients.includes(target.id as ClientId) ? \"Registered\" : \"Not registered\"} · ${discovered.entries.filter((entry) => entry.client === target.id).length} existing AKMS · ${target.detected ? \"Found\" : \"Not detected\"} · ${target.location}`,\n })),\n { separator: true }, { value: \"apply\", key: \"a\", label: \"Apply registration\" },\n { value: \"back\", key: \"q\", label: \"Back\" },\n ], { defaultValue: cursor, cancelValue: \"back\" });\n if(picked === \"back\") return false;\n if(picked !== \"apply\") {\n const client = picked as ClientId;\n if(selected.has(client)) selected.delete(client); else selected.add(client);\n cursor = client;\n continue;\n }\n const removed = initial.clients.filter((id) => !selected.has(id));\n const current = registry.read();\n const plan = registry.planRegistration([...selected]);\n const importNames = [...new Set(plan.imports.map((entry) => entry.name))];\n const connections = new Map(Object.entries(current.connections).filter(([, item]) => item.entry).map(([name, item]) => [name, item.kind]));\n for(const item of plan.imports) connections.set(item.name, item.kind);\n const kinds = KINDS.filter(kind => [...connections.values()].includes(kind));\n const sessions = kinds.filter(kind => registry.isSessionMode(kind, current)).map(sessionName);\n const individuals = [...connections].filter(([, kind]) => !registry.isSessionMode(kind, current)).map(([name]) => name);\n const imported = new Set(plan.imports.map(item => `${item.client}:${item.name}:${entryHash(item.entry)}`));\n const retiring = discovered.entries.filter(item => selected.has(item.client) && connections.has(item.name) && registry.isSessionMode(item.kind, current));\n const owned = (item: ImportCandidate) => imported.has(`${item.client}:${item.name}:${entryHash(item.entry)}`)\n || (Object.hasOwn(current.connections, item.name) && current.connections[item.name].applied[item.client] === entryHash(item.entry));\n const replaces = [...new Set(retiring.filter(owned).map(item => item.name))];\n const kept = [...new Set([...plan.conflicts, ...retiring.filter(item => !owned(item)).map(item => item.name)])];\n prompter.clearScreen();\n writeHeading(prompter, \"Review registration\");\n writeField(prompter, \"Services\", [...selected].map((id) => CLIENT_LABELS[id]).join(\" · \") || \"none\");\n writeField(prompter, \"Connections\", String(connections.size), kinds.length ? `(${kinds.map(kind => `${KIND_LABELS[kind]} ${[...connections.values()].filter(value => value === kind).length}`).join(\" · \")})` : \"\");\n writeField(prompter, \"Entries\", [...sessions, ...(individuals.length ? [`${individuals.length} individual entries`] : [])].join(\" · \") || \"none\", \"in each service\");\n if(replaces.length) writeField(prompter, \"Replaces\", `${replaces.length} individual entries`, `with ${sessions.join(\" · \")}`);\n if(importNames.length) writeField(prompter, \"Import\", countLabel(importNames.length, \"matching connection\"));\n if(kept.length) writeField(prompter, \"Kept\", `${kept.length} need a version choice`, kept.join(\", \"), \"warning\");\n if(plan.errors.length) writeField(prompter, \"Unavailable\", countLabel(plan.errors.length, \"service\"), plan.errors.join(\" \"), \"error\");\n if(initial.defaultMode === \"catalog\") {\n if(plan.imports.some(item => !registry.globalRuntime(item.kind))) writeField(prompter, \"Runtime\", \"Waiting\", \"install from Runtime, then Sync; existing entries stay\", \"warning\");\n if(plan.imports.some(item => !standardLaunch(item.entry, item.kind))) writeHint(prompter, \"Custom commands are not started; the grouped entry loads their saved settings.\");\n }\n if(removed.length) writeField(prompter, \"Unregister\", removed.map((id) => CLIENT_LABELS[id]).join(\" · \"), \"remove managed entries; keep the catalog\");\n if(!privacyNoticeShown) {\n writeWarning(prompter, `Plaintext passwords: ${registry.file} + registry.previous.json. Do not share, sync or commit.`);\n privacyNoticeShown = true;\n }\n if(!await prompter.askYesNo(\"Apply this registration?\", removed.length === 0)) continue;\n const results = registry.register([...selected], initial.clients, plan.imports);\n prompter.clearScreen();\n writeHeading(prompter, \"Registration saved.\");\n writeField(prompter, \"Services\", [...selected].map((id) => CLIENT_LABELS[id]).join(\" · \") || \"none\");\n prompter.write(`${registry.formatResults(results, \"\", prompter.paint)}\\n`);\n if(importNames.length) writeField(prompter, \"Imported\", countLabel(importNames.length, \"connection\"), \"saved in the shared catalog\", \"success\");\n try {\n const conflicts = new Set(results.filter((result) => result.status === \"conflict\").map((result) => result.name));\n if(conflicts.size && await prompter.askYesNo(`Compare settings for ${conflicts.size} connection(s) now?`, true)) await syncMenu(prompter, registry);\n const current = registry.read();\n const remaining = registry.candidates().entries.filter((candidate) => !Object.hasOwn(current.connections, candidate.name));\n const names = [...new Set(remaining.map((candidate) => candidate.name))];\n if(names.length) {\n writeField(prompter, \"Not imported\", countLabel(names.length, \"connection\"), \"choose a version\", \"warning\");\n for(const name of names) {\n const copies = remaining.filter((candidate) => candidate.name === name);\n writeField(prompter, name, copies.map((copy) => CLIENT_LABELS[copy.client]).join(\" · \"));\n if(new Set(copies.map((copy) => entryHash(copy.entry))).size > 1) writeHint(prompter, ` ${describeDifferences(copies.map((copy) => copy.entry))}`);\n }\n writeHint(prompter, \"Existing settings stay. Compare now or open Import existing connections later.\");\n if(await prompter.askYesNo(\"Compare existing settings and choose which to share?\", true)) await importMenu(prompter, registry);\n }\n if(!conflicts.size && !names.length) await prompter.acknowledge();\n } catch(error) {\n // Registration already succeeded. Esc skips the optional review instead\n // of reopening an obsolete registration draft.\n if(!(error instanceof PromptBackError)) throw error;\n }\n return true;\n } catch(error) {\n if(error instanceof PromptClosedError) throw error;\n if(error instanceof PromptBackError) continue;\n writeWarning(prompter, error instanceof Error ? error.message : \"Registration could not be saved.\");\n await prompter.acknowledge();\n }\n }\n}\n\nexport async function importMenu(prompter: RegistrationPrompter, registry: Registry, kind?: McpKind): Promise<void> {\n for(;;) {\n prompter.clearScreen();\n writeHeading(prompter, \"Import existing connections\");\n const { entries, errors } = registry.candidates(kind);\n for(const error of errors) writeWarning(prompter, error);\n const state = registry.read();\n const matching = registry.planRegistration(state.clients, kind);\n const matchingNames = [...new Set(matching.imports.map((entry) => entry.name))];\n const names = [...new Set(entries.filter((candidate) => {\n const current = Object.hasOwn(state.connections, candidate.name) ? state.connections[candidate.name] : undefined;\n return !current?.entry || current.applied[candidate.client] !== entryHash(candidate.entry) || entryHash(current.entry) !== entryHash(candidate.entry);\n }).map((entry) => entry.name))];\n if(!names.length) { writeHint(prompter, \"No existing connections need importing.\"); await prompter.acknowledge(); return; }\n writeField(prompter, \"Available\", countLabel(names.length, \"connection\"), `${matchingNames.length} matching`);\n const picked = await prompter.select(\"Import existing connections\", [\n ...names.map((name) => ({ value: `entry:${name}`, key: name, label: name, hint: [...new Set(entries.filter((entry) => entry.name === name).map((entry) => CLIENT_LABELS[entry.client]))].join(\" · \") })),\n ...(matchingNames.length ? [{ value: \"matching\", key: \"all\", label: \"Import all matching connections\", hint: `${matchingNames.length} connections; differing versions stay unchanged` }] : []),\n { value: \"back\", key: \"b\", label: \"Back\" },\n ], { cancelValue: \"back\" });\n if(picked === \"back\") return;\n try {\n prompter.clearScreen();\n if(picked === \"matching\") {\n writeHeading(prompter, \"Review import\");\n writeField(prompter, \"Connections\", String(matchingNames.length), matchingNames.join(\", \"));\n writeField(prompter, \"Services\", state.clients.map(client => CLIENT_LABELS[client]).join(\" · \") || \"none\");\n if(await prompter.askYesNo(\"Import matching connections and apply them?\", true)) {\n const results = registry.register(state.clients, state.clients, matching.imports);\n prompter.clearScreen();\n prompter.write(`${registry.formatResults(results, \"Import complete\", prompter.paint)}\\n`);\n await prompter.acknowledge();\n }\n continue;\n }\n const name = picked.slice(6);\n const candidates = entries.filter((entry) => entry.name === name);\n let chosen: ImportCandidate = candidates[0];\n if(new Set(candidates.map((candidate) => entryHash(candidate.entry))).size > 1) {\n writeHeading(prompter, `Compare ${name}`);\n writeField(prompter, \"Services\", state.clients.map(client => CLIENT_LABELS[client]).join(\" · \") || \"none\");\n compareEntries(prompter, candidates.map((candidate) => ({ label: CLIENT_LABELS[candidate.client], entry: candidate.entry })));\n const choice = await prompter.select(\"Use settings from\", [\n ...candidates.map((candidate, index) => ({ value: String(index), label: `Use ${index + 1}: ${CLIENT_LABELS[candidate.client]}` })),\n { value: \"back\", label: \"Back\" },\n ], { cancelValue: \"back\" });\n if(choice === \"back\") continue;\n chosen = candidates[Number(choice)];\n }\n writeField(prompter, \"Connection\", name);\n writeField(prompter, \"Version\", CLIENT_LABELS[chosen.client]);\n preview(prompter, chosen.entry);\n const destination = await prompter.askRequired(\"Shared connection name (change it to keep both)\", name);\n writeField(prompter, \"Apply to\", state.clients.map(client => CLIENT_LABELS[client]).join(\" · \") || \"none\");\n if(!await prompter.askYesNo(`Import ${destination} and apply it?`, true)) continue;\n const results = registry.importEntry(destination, chosen, candidates);\n prompter.clearScreen();\n prompter.write(`\\n${registry.formatResults(results, \"Import complete\", prompter.paint)}\\n`);\n if(destination !== name) writeField(prompter, \"Kept\", name, \"original entries retain this name\", \"warning\");\n await prompter.acknowledge();\n } catch(error) {\n if(error instanceof PromptClosedError) throw error;\n if(error instanceof PromptBackError) continue;\n writeWarning(prompter, error instanceof Error ? error.message : \"Import failed.\");\n await prompter.acknowledge();\n }\n }\n}\n\nexport async function syncMenu(prompter: RegistrationPrompter, registry: Registry): Promise<void> {\n let pendingResults: SyncResult[] | undefined;\n for(;;) {\n prompter.clearScreen();\n const results = pendingResults ?? registry.sync();\n pendingResults = undefined;\n prompter.write(`\\n${registry.formatResults(results, \"Sync results\", prompter.paint, \"Next: choose an item below to compare settings and pick a version.\")}\\n`);\n const imports = pendingImports(registry);\n if(imports.names.length) writeField(prompter, \"Not imported\", countLabel(imports.names.length, \"connection\"), `${imports.differing === imports.names.length ? \"different settings · \" : \"\"}choose Import existing connections`, \"warning\");\n const conflicts = results.filter((result) => result.status === \"conflict\");\n if(!conflicts.length && !imports.names.length) { await prompter.acknowledge(); return; }\n const picked = await prompter.select(\"Review differences\", [\n ...conflicts.map((item, index) => ({ value: String(index), label: `${CLIENT_LABELS[item.client]} · ${item.name}` })),\n ...(imports.names.length ? [{ value: \"import\", key: \"import\", label: \"Import existing connections\", hint: `${imports.names.length} connection(s) to review` }] : []),\n { value: \"back\", key: \"b\", label: \"Later — keep existing settings\" },\n ], { cancelValue: \"back\" });\n if(picked === \"back\") return;\n try {\n if(picked === \"import\") { await importMenu(prompter, registry); continue; }\n prompter.clearScreen();\n const conflict = conflicts[Number(picked)];\n const state = registry.read();\n const sessionKind = Object.keys(state.sessions ?? {}).find(kind => sessionName(kind as McpKind) === conflict.name) as McpKind | undefined;\n if(sessionKind) {\n const session = state.sessions![sessionKind]!;\n const actual = registry.targets.find(target => target.id === conflict.client)?.readEntries()[conflict.name];\n if(!actual || entryKind(actual) !== sessionKind) {\n writeWarning(prompter, \"This name belongs to another server. Rename its external entry; existing settings stay.\");\n await prompter.acknowledge(); continue;\n }\n const removing = !registry.isSessionMode(sessionKind, state) || !state.clients.includes(conflict.client)\n || !Object.values(state.connections).some(item => item.kind === sessionKind && item.entry);\n writeHeading(prompter, \"Review session launch\");\n writeField(prompter, \"Server\", conflict.name);\n writeField(prompter, \"Service\", CLIENT_LABELS[conflict.client]);\n compareEntries(prompter, [{ label: \"AKMS session launch\", entry: session.entry }, { label: \"External settings\", entry: actual }]);\n const choice = await prompter.select(\"Resolve session launch\", [\n { value: \"apply\", label: removing ? \"Remove the old session entry\" : \"Restore the AKMS session launch\" },\n { value: \"back\", key: \"b\", label: \"Keep external settings for now\" },\n ], { cancelValue: \"back\" });\n if(choice === \"apply\" && await prompter.askYesNo(removing ? \"Remove this session entry?\" : \"Replace these external launch settings?\", false)) pendingResults = registry.resolve(conflict.client, conflict.name, actual, false);\n continue;\n }\n const connection = state.connections[conflict.name];\n if(!connection) throw new Error(\"This connection changed. Reopen Sync to review its current settings.\");\n const actual = registry.targets.find((target) => target.id === conflict.client)?.readEntries()[conflict.name];\n if(!actual || entryKind(actual) !== connection.kind) {\n writeWarning(prompter, \"This name belongs to another server. Rename that entry or the shared connection.\");\n await prompter.acknowledge();\n continue;\n }\n const client = CLIENT_LABELS[conflict.client];\n const registered = state.clients.includes(conflict.client);\n const sessionMode = registry.isSessionMode(connection.kind, state);\n const removing = !connection.entry || !registered;\n const retiring = sessionMode && !removing;\n const subject = connection.entry && descriptionOnly([connection.entry, actual]) ? \"description\" : \"settings\";\n writeHeading(prompter, `Sync / ${conflict.name}`);\n writeField(prompter, \"Services\", state.clients.map((id) => CLIENT_LABELS[id]).join(\" · \") || \"none\");\n prompter.write(\"\\n\");\n if(!removing && connection.entry) {\n if(retiring) {\n writeField(prompter, \"Server\", sessionName(connection.kind));\n writeField(prompter, \"Kept in\", client, \"old entry stays until this server is ready\", \"warning\");\n }\n compareEntries(prompter, [{ label: \"Saved in AKMS\", entry: connection.entry }, { label: `Currently in ${client}`, entry: actual }]);\n } else {\n writeField(prompter, \"Action\", !registered ? `${client} unregistered` : \"Remove connection\", \"\", \"warning\");\n writeHint(prompter, `Settings changed in ${client}; choose what to keep.`);\n writeHeading(prompter, `Currently in ${client}`); preview(prompter, actual);\n prompter.write(\"\\n\");\n }\n const choices: SelectItem<string>[] = [\n { value: \"shared\", label: removing ? `Remove from ${client}` : retiring ? \"Use 1: keep AKMS settings\" : `Use 1: AKMS -> ${client}`, hint: removing ? \"finish the pending removal\" : retiring ? `use version 1 in ${sessionName(connection.kind)}` : `replace its ${subject} with version 1` },\n ...(registered ? [{ value: \"client\", label: removing ? `Restore from ${client}` : `Use 2: ${client} -> all ${state.clients.length} services`, hint: retiring ? `save version 2 in AKMS for ${sessionName(connection.kind)}` : \"save in AKMS and sync registered services\" }] : []),\n { value: \"back\", key: \"b\", label: \"Back without changes\" },\n ];\n const choice = await prompter.select(removing ? (registered ? \"Remove or restore this connection?\" : `Remove this connection from ${client}?`) : `Which ${subject} should be used?`, choices, { cancelValue: \"back\" });\n if(choice === \"back\") continue;\n prompter.write(\"\\n\");\n if(choice === \"client\") {\n writeField(prompter, \"Save version\", client, \"in AKMS\");\n writeField(prompter, \"Apply to\", state.clients.map((id) => CLIENT_LABELS[id]).join(\" · \"));\n } else writeField(prompter, removing ? \"Remove\" : \"Keep version\", removing ? `${conflict.name} in ${client}` : \"AKMS\", removing ? \"\" : retiring ? `for ${sessionName(connection.kind)}` : `apply ${subject} to ${client}`);\n if(retiring) writeHint(prompter, `The old ${client} entry stays until ${sessionName(connection.kind)} is ready.`);\n const confirmation = choice === \"client\" ? `Save in AKMS and sync ${state.clients.length} services?`\n : removing ? `Remove from ${client}?` : retiring ? \"Keep version 1 and finish Sync?\" : `Update ${client} with version 1?`;\n if(await prompter.askYesNo(confirmation, false)) {\n pendingResults = registry.resolve(conflict.client, conflict.name, actual, choice === \"client\");\n }\n } catch(error) {\n if(error instanceof PromptClosedError) throw error;\n if(error instanceof PromptBackError) continue;\n prompter.write(`${prompter.paint.error(\"Failed\")} ${screenText(error instanceof Error ? error.message : \"Could not resolve the difference.\")}\\n`);\n await prompter.acknowledge();\n }\n }\n}\n","import fs from \"node:fs\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\n/**\r\n * Absolute path of an executable on `PATH`, or null. On Windows only `PATHEXT` suffixes are\r\n * tried — npm drops an extensionless POSIX shell script next to every `.cmd` shim, and that\r\n * file exists but cannot be launched.\r\n */\r\nexport function findExecutable(name: string): string | null {\r\n const searchPath = process.env.PATH ?? \"\";\r\n const directories = searchPath.split(path.delimiter).filter((directory) => directory !== \"\");\r\n\r\n let suffixes = [\"\"];\r\n if (process.platform === \"win32\") {\r\n const pathExt = process.env.PATHEXT ?? \".COM;.EXE;.BAT;.CMD\";\r\n suffixes = pathExt.split(\";\").filter((suffix) => suffix !== \"\");\r\n }\r\n\r\n for (const directory of directories) {\r\n for (const suffix of suffixes) {\r\n const candidate = path.join(directory, `${name}${suffix}`);\r\n if (fs.existsSync(candidate) == true && fs.statSync(candidate).isFile() == true) {\r\n return candidate;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\nfunction readExisting(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, \"utf8\");\n }\n catch(error) {\n if((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n throw error;\n }\n}\n\n/** Build a complete replacement beside the config, then commit it with one rename. */\nexport function updateConfigFile(filePath: string, update: (text: string) => string): void {\n let destination = filePath;\n let symbolicLink = false;\n try {\n symbolicLink = fs.lstatSync(filePath).isSymbolicLink();\n }\n catch(error) {\n if((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n // A dangling symlink is an error; never replace the link with a new regular file.\n if(symbolicLink) {\n destination = fs.realpathSync(filePath);\n }\n const before = readExisting(destination);\n const updated = update(before ?? \"\");\n if(before != null) {\n fs.accessSync(destination, fs.constants.W_OK);\n }\n fs.mkdirSync(path.dirname(destination), { recursive: true });\n const temporary = path.join(path.dirname(destination), `.${path.basename(destination)}.${randomUUID()}.tmp`);\n const mode = before == null ? 0o600 : fs.statSync(destination).mode & 0o777;\n let descriptor: number | undefined;\n let ownsTemporary = false;\n try {\n descriptor = fs.openSync(temporary, \"wx\", mode);\n ownsTemporary = true;\n fs.writeFileSync(descriptor, updated, \"utf8\");\n fs.fsyncSync(descriptor);\n fs.closeSync(descriptor);\n descriptor = undefined;\n if(readExisting(destination) !== before) {\n throw new Error(\"The config changed while saving; reload it and try again.\");\n }\n fs.renameSync(temporary, destination);\n ownsTemporary = false;\n }\n finally {\n try {\n if(descriptor != null) {\n fs.closeSync(descriptor);\n }\n }\n finally {\n if(ownsTemporary) {\n fs.unlinkSync(temporary);\n }\n }\n }\n}\n","import fs from \"node:fs\";\nimport { updateConfigFile } from \"./config-file\";\n\nimport type { ConfigTarget, ConfigTargetId, McpServerEntry } from \"../types\";\n\n/** Shape-checks one `mcpServers` value; anything without a string `command` is not an entry. */\nexport function toMcpServerEntry(value: unknown): McpServerEntry | null {\n if(typeof value !== \"object\" || value == null) {\n return null;\n }\n\n const record = value as Record<string, unknown>;\n if(typeof record.command !== \"string\") {\n return null;\n }\n\n let args: string[] = [];\n if(Array.isArray(record.args) == true) {\n args = (record.args as unknown[]).filter((item): item is string => typeof item === \"string\");\n }\n\n const env: Record<string, string> = Object.create(null);\n if(typeof record.env === \"object\" && record.env != null) {\n for(const [key, item] of Object.entries(record.env as Record<string, unknown>)) {\n if(typeof item === \"string\") {\n env[key] = item;\n }\n }\n }\n\n return { command: record.command, args: args, env: env };\n}\n\n/**\n * Reads the `mcpServers` map out of a parsed JSON document.\n *\n * @throws {Error} If the document is not an object.\n */\nexport function readRawMcpServersJson(document: unknown): Record<string, unknown> {\n if(typeof document !== \"object\" || document == null || Array.isArray(document)) {\n throw new Error(\"the config file is not a JSON object\");\n }\n const servers = (document as Record<string, unknown>).mcpServers;\n if(servers === undefined) {\n return {};\n }\n if(typeof servers !== \"object\" || servers == null || Array.isArray(servers)) {\n throw new Error(\"mcpServers is not a JSON object\");\n }\n return servers as Record<string, unknown>;\n}\n\n/** Reads supported stdio entries; raw names are checked separately before copying. */\nexport function readMcpServersJson(document: unknown): Record<string, McpServerEntry> {\n const entries: Record<string, McpServerEntry> = Object.create(null);\n for(const [name, value] of Object.entries(readRawMcpServersJson(document))) {\n const entry = toMcpServerEntry(value);\n if(entry != null) {\n entries[name] = entry;\n }\n }\n return entries;\n}\n\n/**\n * Parses a `mcpServers` JSON file, or returns an empty document when it does not exist.\n *\n * @throws {Error} If the file exists but is not valid JSON — it is never written over.\n */\nfunction readDocument(filePath: string, contents?: string): Record<string, unknown> {\n if(contents == null && fs.existsSync(filePath) == false) {\n return {};\n }\n\n const text = contents ?? fs.readFileSync(filePath, \"utf8\");\n if(text.trim() === \"\") {\n return {};\n }\n\n let document: unknown;\n try {\n document = JSON.parse(text);\n }\n catch(ex) {\n let detail = String(ex);\n if(ex instanceof Error) {\n detail = ex.message;\n }\n throw new Error(`${filePath} is not valid JSON: ${detail}`);\n }\n\n if(typeof document !== \"object\" || document == null || Array.isArray(document) == true) {\n throw new Error(`${filePath} is not a JSON object`);\n }\n\n return document as Record<string, unknown>;\n}\n\n/**\n * A client whose config is a plain JSON file with a `mcpServers` map and nothing that\n * fights over it — Claude Desktop, Cursor. Written as read → set one key → write, so\n * every other key in the file survives untouched.\n */\nexport function createJsonFileTarget(options: {\n id: ConfigTargetId;\n label: string;\n filePath: string;\n}): ConfigTarget {\n const { id, label, filePath } = options;\n\n return {\n id: id,\n label: label,\n location: filePath,\n detected: fs.existsSync(filePath),\n\n readEntries(): Record<string, McpServerEntry> {\n const document = readDocument(filePath);\n return readMcpServersJson(document);\n },\n\n hasEntry(name: string): boolean {\n return Object.hasOwn(readRawMcpServersJson(readDocument(filePath)), name);\n },\n\n writeEntry(name: string, entry: McpServerEntry) {\n updateConfigFile(filePath, (contents) => {\n const document = readDocument(filePath, contents);\n const servers = Object.assign(Object.create(null), readRawMcpServersJson(document));\n servers[name] = entry;\n document.mcpServers = servers;\n return JSON.stringify(document, null, 4) + \"\\n\";\n });\n\n return { status: \"written\" as const, detail: filePath };\n },\n\n removeEntry(name: string) {\n updateConfigFile(filePath, (contents) => {\n const document = readDocument(filePath, contents);\n const servers = readRawMcpServersJson(document);\n delete servers[name];\n return JSON.stringify(document, null, 4) + \"\\n\";\n });\n return { status: \"written\" as const, detail: filePath };\n },\n };\n}\n","import { spawnSync } from \"node:child_process\";\r\nimport type { SpawnSyncReturns } from \"node:child_process\";\r\nimport fs from \"node:fs\";\r\nimport os from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\nimport { findExecutable } from \"../paths\";\r\nimport type { ConfigTarget, ConfigWriteResult, McpServerEntry } from \"../types\";\r\n\r\nimport { readMcpServersJson, readRawMcpServersJson } from \"./json-file\";\r\n\r\n/** The user-scope file; `mcpServers` at its top level is what `claude mcp … -s user` edits. */\r\nconst CLAUDE_CODE_CONFIG_PATH = path.join(os.homedir(), \".claude.json\");\r\n\r\n/** Characters `cmd.exe` treats specially; each gets a `^` so it reaches the program literally. */\r\nconst CMD_META_CHARACTER_PATTERN = /([()\\][%!^\"`<>&|;, *?])/g;\r\n\r\n/** The `claude mcp add-json` payload: the entry plus the transport it leaves implicit. */\r\nexport function toClaudeAddJsonPayload(entry: McpServerEntry): string {\r\n return JSON.stringify({ type: \"stdio\", command: entry.command, args: entry.args, env: entry.env });\r\n}\r\n\r\n/** The command line `add-json` is driven with — also what the print view hands the user to paste. */\r\nexport function formatClaudeAddCommand(name: string, entry: McpServerEntry): string {\r\n const payload = toClaudeAddJsonPayload(entry);\r\n return `claude mcp add-json ${name} '${payload}' -s user`;\r\n}\r\n\r\n/**\r\n * Quotes one argument for a `.cmd` shim: MSVCRT rules first (what the `node.exe` behind the\r\n * shim parses), then a `^` before every `cmd.exe` metacharacter — twice, because an npm shim\r\n * hands the line to `cmd.exe` once more. The same scheme cross-spawn uses.\r\n */\r\nfunction escapeCmdArgument(argument: string): string {\r\n let escaped = argument.replace(/(\\\\*)\"/g, \"$1$1\\\\\\\"\");\r\n escaped = escaped.replace(/(\\\\*)$/, \"$1$1\");\r\n escaped = `\"${escaped}\"`;\r\n escaped = escaped.replace(CMD_META_CHARACTER_PATTERN, \"^$1\");\r\n escaped = escaped.replace(CMD_META_CHARACTER_PATTERN, \"^$1\");\r\n return escaped;\r\n}\r\n\r\n/**\r\n * Runs a CLI and waits for it. A native executable is spawned directly; a `.cmd` / `.bat`\r\n * shim (npm's install on Windows) cannot be, so it goes through `cmd.exe` with every\r\n * argument escaped — the JSON payload is full of quotes that would otherwise be eaten.\r\n */\r\nexport function runCliCommand(executable: string, args: string[]): SpawnSyncReturns<string> {\r\n const isBatchShim = /\\.(cmd|bat)$/i.test(executable) == true;\r\n if(process.platform !== \"win32\" || isBatchShim == false) {\r\n const result = spawnSync(executable, args, { encoding: \"utf8\", windowsHide: true });\r\n return result;\r\n }\r\n\r\n const commandLine = [executable.replace(CMD_META_CHARACTER_PATTERN, \"^$1\"), ...args.map(escapeCmdArgument)].join(\" \");\r\n const result = spawnSync(process.env.ComSpec ?? \"cmd.exe\", [\"/d\", \"/s\", \"/c\", `\"${commandLine}\"`], {\r\n encoding: \"utf8\",\r\n windowsHide: true,\r\n windowsVerbatimArguments: true,\r\n });\r\n return result;\r\n}\r\n\r\nfunction runClaude(executable: string, args: string[]): ConfigWriteResult {\r\n const result = runCliCommand(executable, args);\r\n\r\n if(result.error != null) {\r\n return { status: \"unavailable\", detail: `could not run claude: ${result.error.message}` };\r\n }\r\n\r\n if(result.status !== 0) {\r\n let output = (result.stderr ?? \"\").trim();\r\n if(output === \"\") {\r\n output = (result.stdout ?? \"\").trim();\r\n }\r\n return { status: \"unavailable\", detail: `claude exited with ${result.status}: ${output}` };\r\n }\r\n\r\n return { status: \"written\", detail: CLAUDE_CODE_CONFIG_PATH };\r\n}\r\n\r\nfunction readRawClaudeEntries(): Record<string, unknown> {\r\n if(fs.existsSync(CLAUDE_CODE_CONFIG_PATH) == false) {\r\n return {};\r\n }\r\n\r\n const text = fs.readFileSync(CLAUDE_CODE_CONFIG_PATH, \"utf8\");\r\n let document: unknown;\r\n try {\r\n document = JSON.parse(text);\r\n }\r\n catch(ex) {\r\n let detail = String(ex);\r\n if(ex instanceof Error) {\r\n detail = ex.message;\r\n }\r\n throw new Error(`${CLAUDE_CODE_CONFIG_PATH} is not valid JSON: ${detail}`);\r\n }\r\n\r\n return readRawMcpServersJson(document);\r\n}\r\n\r\n/**\r\n * Claude Code, user scope. Read straight from `~/.claude.json`; written through the\r\n * `claude mcp` CLI, because that file is Claude Code's own state — large, rewritten by\r\n * the running process — and `mcpServers` is one key among many.\r\n */\r\nexport function createClaudeCodeTarget(): ConfigTarget {\r\n const executable = findExecutable(\"claude\");\r\n\r\n return {\r\n id: \"claude-code\",\r\n label: \"Claude Code (user scope)\",\r\n location: CLAUDE_CODE_CONFIG_PATH,\r\n detected: executable != null || fs.existsSync(CLAUDE_CODE_CONFIG_PATH) == true,\r\n\r\n readEntries(): Record<string, McpServerEntry> {\r\n return readMcpServersJson({ mcpServers: readRawClaudeEntries() });\r\n },\r\n\r\n hasEntry(name: string): boolean {\r\n return Object.hasOwn(readRawClaudeEntries(), name);\r\n },\r\n\r\n writeEntry(name: string, entry: McpServerEntry): ConfigWriteResult {\r\n if(executable == null) {\r\n return {\r\n status: \"unavailable\",\r\n detail: \"the claude CLI is not on PATH — install it, or use Print to get a command to run yourself\",\r\n };\r\n }\r\n\r\n // `add-json` refuses a name that exists, so an edit is remove-then-add. If the add\r\n // then fails, the old entry goes back rather than leaving the host unregistered.\r\n const previousEntries = readRawClaudeEntries();\r\n const hadPrevious = Object.hasOwn(previousEntries, name);\r\n const previous = previousEntries[name];\r\n if(hadPrevious) {\r\n const removed = runClaude(executable, [\"mcp\", \"remove\", name, \"-s\", \"user\"]);\r\n if(removed.status === \"unavailable\") {\r\n return removed;\r\n }\r\n }\r\n\r\n const added = runClaude(executable, [\"mcp\", \"add-json\", name, toClaudeAddJsonPayload(entry), \"-s\", \"user\"]);\r\n if(added.status === \"unavailable\" && hadPrevious) {\r\n const restored = runClaude(executable, [\"mcp\", \"add-json\", name, JSON.stringify(previous), \"-s\", \"user\"]);\r\n const recovery = restored.status === \"written\"\r\n ? \"the previous entry was restored\"\r\n : `could not restore the previous entry: ${restored.detail}`;\r\n return { status: \"unavailable\", detail: `${added.detail}\\n ${recovery}` };\r\n }\r\n\r\n return added;\r\n },\r\n\r\n removeEntry(name: string): ConfigWriteResult {\r\n if(executable == null) {\r\n return {\r\n status: \"unavailable\",\r\n detail: `the claude CLI is not on PATH — run this yourself:\\n claude mcp remove ${name} -s user`,\r\n };\r\n }\r\n\r\n return runClaude(executable, [\"mcp\", \"remove\", name, \"-s\", \"user\"]);\r\n },\r\n };\r\n}\r\n","/** Track strings and arrays while locating editable TOML statements, after syntax validation. */\nexport interface TomlLineState {\n quote: string | null;\n multiline: boolean;\n depth: number;\n}\n\nexport function lineState(): TomlLineState {\n return { quote: null, multiline: false, depth: 0 };\n}\n\nexport function scanTomlLine(line: string, state: TomlLineState): void {\n for(let index = 0; index < line.length; index += 1) {\n const character = line[index];\n if(state.quote != null) {\n if(character === \"\\\\\" && state.quote === '\"') {\n index += 1;\n }\n else if(character === state.quote) {\n if(!state.multiline) {\n state.quote = null;\n }\n else if(line.slice(index, index + 3) === state.quote.repeat(3)) {\n // Four/five quotes end a multiline string with one/two literal quotes.\n while(line[index + 1] === character) {\n index += 1;\n }\n state.quote = null;\n state.multiline = false;\n }\n }\n continue;\n }\n if(character === \"#\") {\n break;\n }\n if(character === '\"' || character === \"'\") {\n state.quote = character;\n state.multiline = line.slice(index, index + 3) === character.repeat(3);\n if(state.multiline) {\n index += 2;\n }\n }\n else if(character === \"[\" || character === \"{\") {\n state.depth += 1;\n }\n else if(character === \"]\" || character === \"}\") {\n state.depth -= 1;\n }\n }\n}\n","import { isDeepStrictEqual } from \"node:util\";\nimport { parse, TomlError } from \"smol-toml\";\nimport type { McpServerEntry } from \"../types\";\nimport { readMcpServersJson } from \"./json-file\";\n\ntype Document = Record<string, unknown>;\n\nfunction isTable(value: unknown): value is Document {\n return value != null && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Date);\n}\n\n/** Parse the whole document; error messages must not echo credential-bearing source lines. */\nexport function parseConfigToml(text: string): Document {\n let document: Document;\n try {\n document = parse(text, { integersAsBigInt: true });\n }\n catch(error) {\n const location = error instanceof TomlError ? ` at line ${error.line}, column ${error.column}` : \"\";\n throw new Error(`Invalid TOML${location}; fix the config before changing it.`);\n }\n if(Object.hasOwn(document, \"mcp_servers\") && !isTable(document.mcp_servers)) {\n throw new Error(\"mcp_servers must be a TOML table.\");\n }\n return document;\n}\n\nexport function readTomlEntries(text: string): Record<string, McpServerEntry> {\n return readMcpServersJson({ mcpServers: parseConfigToml(text).mcp_servers ?? {} });\n}\n\nexport function hasTomlEntry(text: string, name: string): boolean {\n return Object.hasOwn(parseConfigToml(text).mcp_servers ?? {}, name);\n}\n\nfunction normalize(document: Document): void {\n const servers = document.mcp_servers as Document | undefined;\n if(servers == null) {\n return;\n }\n for(const server of Object.values(servers)) {\n if(isTable(server) && isTable(server.env) && Object.keys(server.env).length === 0) {\n delete server.env;\n }\n }\n if(Object.keys(servers).length === 0) {\n delete document.mcp_servers;\n }\n}\n\n/** Refuse edits that change anything except the requested server's owned fields. */\nexport function verifyTomlEdit(before: string, after: string, name: string, entry: McpServerEntry | null): string {\n const expected = parseConfigToml(before);\n const servers = (expected.mcp_servers ?? Object.create(null)) as Document;\n if(entry == null) {\n delete servers[name];\n }\n else {\n const previous = Object.hasOwn(servers, name) && isTable(servers[name]) ? servers[name] as Document : {};\n Object.defineProperty(servers, name, {\n value: Object.assign(Object.create(null), previous, { command: entry.command, args: [...entry.args], env: Object.assign(Object.create(null), entry.env) }),\n configurable: true, enumerable: true, writable: true,\n });\n }\n expected.mcp_servers = servers;\n\n let actual: Document;\n try {\n actual = parseConfigToml(after);\n }\n catch {\n throw new Error(\"Cannot safely edit this TOML layout. Use [mcp_servers.<name>] tables; nothing was written.\");\n }\n normalize(expected);\n normalize(actual);\n if(!isDeepStrictEqual(expected, actual)) {\n throw new Error(\"Cannot safely edit this TOML layout without changing other settings; nothing was written.\");\n }\n return after;\n}\n","import { lineState, scanTomlLine } from \"./toml-lines\";\nimport type { McpServerEntry } from \"../types\";\nimport { hasTomlEntry, parseConfigToml, readTomlEntries, verifyTomlEdit } from \"./toml-validation\";\n\n/**\n * The slice of TOML Codex's `[mcp_servers.*]` tables use: string / string-array / inline\n * table values, plus `[mcp_servers.<name>.env]` sub-tables. The file is handled as a list of\n * sections (a header line and the lines under it); only the sections of the server being\n * written are rebuilt, and unrelated text is preserved. A complete TOML parser validates\n * input and output and verifies that no unrelated setting changed.\n */\n\nconst BARE_KEY_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst ANY_HEADER_PATTERN = /^\\s*\\[/;\nconst SERVER_HEADER_PATTERN = /^\\s*\\[\\s*(?:mcp_servers|\"mcp_servers\"|'mcp_servers')\\s*\\.\\s*([A-Za-z0-9_-]+|\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*')\\s*((?:\\.[^\\]]*)?)\\]\\s*(?:#.*)?$/;\nconst KEY_VALUE_PATTERN = /^\\s*([A-Za-z0-9_-]+|\"(?:[^\"\\\\]|\\\\.)*\"|'[^']*')\\s*=\\s*(.*)$/;\n\n/** Keys of the server table this package owns; any other key in it is the user's and is kept. */\nconst OWNED_TABLE_KEYS = [\"command\", \"args\", \"env\"];\n\ninterface TomlSection {\n /** Null for the lines before the first header. */\n header: string | null;\n /** Set when the header is `[mcp_servers.<name>…]`. */\n serverName: string | null;\n /** What follows the server name: \"\" for the server table, \"env\" for its env table. */\n subPath: string;\n body: string[];\n}\n\ninterface TomlStatement {\n key: string;\n /** Line range inside the section body, end exclusive. */\n start: number;\n end: number;\n}\n\nfunction unquoteKey(rawKey: string): string {\n if(rawKey.startsWith(\"\\\"\") || rawKey.startsWith(\"'\")) {\n return parseConfigToml(`value = ${rawKey}`).value as string;\n }\n return rawKey;\n}\n\n/**\n * Key/value statements of one section body, a multi-line value spanning its lines. Also\n * what tells a `[` that opens a header apart from one inside a multi-line array.\n */\nfunction readStatements(body: string[]): TomlStatement[] {\n const statements: TomlStatement[] = [];\n\n let index = 0;\n while(index < body.length) {\n const match = KEY_VALUE_PATTERN.exec(body[index]);\n if(match == null) {\n index += 1;\n continue;\n }\n\n const start = index;\n const state = lineState();\n scanTomlLine(match[2], state);\n index += 1;\n while((state.quote != null || state.depth > 0) && index < body.length) {\n scanTomlLine(body[index], state);\n index += 1;\n }\n statements.push({ key: unquoteKey(match[1]), start: start, end: index });\n }\n\n return statements;\n}\n\nfunction splitSections(lines: string[]): TomlSection[] {\n const sections: TomlSection[] = [{ header: null, serverName: null, subPath: \"\", body: [] }];\n const state = lineState();\n\n for(const line of lines) {\n const current = sections[sections.length - 1];\n\n if(state.quote != null || state.depth > 0) {\n current.body.push(line);\n scanTomlLine(line, state);\n continue;\n }\n\n if(ANY_HEADER_PATTERN.test(line) == true) {\n const serverMatch = SERVER_HEADER_PATTERN.exec(line);\n let serverName: string | null = null;\n let subPath = \"\";\n if(serverMatch != null) {\n serverName = unquoteKey(serverMatch[1]);\n subPath = serverMatch[2].replace(/^\\./, \"\").replace(/\\s+/g, \"\");\n }\n\n sections.push({ header: line, serverName: serverName, subPath: subPath, body: [] });\n continue;\n }\n\n current.body.push(line);\n\n scanTomlLine(line, state);\n }\n\n return sections;\n}\n\n/** Includes HTTP servers and subtables even when no command can be parsed. */\nexport function hasMcpServerToml(text: string, name: string): boolean {\n return hasTomlEntry(text, name);\n}\n\n/**\n * Every `[mcp_servers.<name>]` table with a string `command`. A value this subset does not\n * read is skipped, not fatal — the file may hold servers this package never wrote.\n */\nexport function parseMcpServersToml(text: string): Record<string, McpServerEntry> {\n return readTomlEntries(text);\n}\n\nfunction quoteTomlString(value: string): string {\n const escaped = value\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, \"\\\\\\\"\")\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\")\n .replace(/[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f]/g, (character) => `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`);\n\n return `\"${escaped}\"`;\n}\n\nfunction formatTomlKey(key: string): string {\n if(BARE_KEY_PATTERN.test(key) == true) {\n return key;\n }\n\n return quoteTomlString(key);\n}\n\nfunction renderOwnedLines(entry: McpServerEntry): string[] {\n return [\n `command = ${quoteTomlString(entry.command)}`,\n `args = [${entry.args.map((argument) => quoteTomlString(argument)).join(\", \")}]`,\n ];\n}\n\nfunction renderEnvLines(entry: McpServerEntry): string[] {\n return Object.entries(entry.env).map(([key, value]) => `${formatTomlKey(key)} = ${quoteTomlString(value)}`);\n}\n\n/**\n * Renders one server as a table plus an `env` sub-table — one variable per line, so the\n * entry reads like a connection form, the same way the JSON clients' `env` block does.\n */\nexport function renderMcpServerTable(name: string, entry: McpServerEntry): string {\n const tableKey = formatTomlKey(name);\n const lines = [`[mcp_servers.${tableKey}]`, ...renderOwnedLines(entry)];\n\n const envLines = renderEnvLines(entry);\n if(envLines.length > 0) {\n lines.push(\"\");\n lines.push(`[mcp_servers.${tableKey}.env]`);\n lines.push(...envLines);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\nfunction isBlank(line: string): boolean {\n return line.trim() === \"\";\n}\n\nfunction joinSections(sections: TomlSection[], eol: string): string {\n const lines: string[] = [];\n for(const section of sections) {\n if(section.header != null) {\n lines.push(section.header);\n }\n lines.push(...section.body);\n }\n\n return lines.join(eol);\n}\n\n/**\n * Writes `entry` as the `[mcp_servers.<name>]` server, or removes the server when `entry`\n * is null.\n *\n * Replacing keeps what the user added by hand: keys of the server table other than\n * `command` / `args` / `env` (a `startup_timeout_sec`, say) and sub-tables other than\n * `env` stay where they are. Only `command`, `args` and the env table are rebuilt.\n */\nexport function writeMcpServerToml(text: string, name: string, entry: McpServerEntry | null): string {\n parseConfigToml(text);\n const updated = editMcpServerToml(text, name, entry);\n return verifyTomlEdit(text, updated, name, entry);\n}\n\nfunction editMcpServerToml(text: string, name: string, entry: McpServerEntry | null): string {\n let eol = \"\\n\";\n if(text.includes(\"\\r\\n\") == true) {\n eol = \"\\r\\n\";\n }\n\n const sections = splitSections(text.split(/\\r?\\n/));\n const isOwn = (section: TomlSection): boolean => section.serverName === name;\n\n if(entry == null) {\n const kept = sections.filter((section) => isOwn(section) == false);\n const removedText = joinSections(kept, eol);\n return removedText;\n }\n\n const tableKey = formatTomlKey(name);\n const envLines = renderEnvLines(entry);\n const tableIndex = sections.findIndex((section) => isOwn(section) == true && section.subPath === \"\");\n\n // (1) No table yet — append a fresh block after one blank line.\n if(tableIndex < 0) {\n const withoutStrayEnv = sections.filter((section) => (isOwn(section) == true && section.subPath === \"env\") == false);\n let prefix = joinSections(withoutStrayEnv, eol);\n\n if(prefix.trim() === \"\") {\n prefix = \"\";\n }\n else {\n prefix = prefix.replace(/(\\r?\\n)*$/, \"\");\n prefix = `${prefix}${eol}${eol}`;\n }\n\n const block = renderMcpServerTable(name, entry).replace(/\\n/g, eol);\n return `${prefix}${block}`;\n }\n\n // (2) Rebuild the table body: owned keys first, then the user's own lines as they were.\n const table = sections[tableIndex];\n const ownedLineIndexes = new Set<number>();\n for(const statement of readStatements(table.body)) {\n if(OWNED_TABLE_KEYS.includes(statement.key) == true) {\n for(let index = statement.start; index < statement.end; index += 1) {\n ownedLineIndexes.add(index);\n }\n }\n }\n\n const userLines = table.body.filter((_line, index) => ownedLineIndexes.has(index) == false);\n\n // The blank lines closing the table are the gap before the next header; they move to\n // the end of whichever section now comes last.\n let trailingBlankCount = 0;\n while(trailingBlankCount < userLines.length && isBlank(userLines[userLines.length - 1 - trailingBlankCount]) == true) {\n trailingBlankCount += 1;\n }\n const trailingBlanks = userLines.slice(userLines.length - trailingBlankCount);\n const userContent = userLines.slice(0, userLines.length - trailingBlankCount);\n\n const rebuilt: TomlSection[] = [];\n for(let index = 0; index < sections.length; index += 1) {\n const section = sections[index];\n\n if(isOwn(section) == true && section.subPath === \"env\") {\n continue;\n }\n\n if(index !== tableIndex) {\n rebuilt.push(section);\n continue;\n }\n\n if(envLines.length === 0) {\n rebuilt.push({ ...section, body: [...renderOwnedLines(entry), ...userContent, ...trailingBlanks] });\n continue;\n }\n\n rebuilt.push({ ...section, body: [...renderOwnedLines(entry), ...userContent, \"\"] });\n rebuilt.push({\n header: `[mcp_servers.${tableKey}.env]`,\n serverName: name,\n subPath: \"env\",\n body: [...envLines, ...trailingBlanks],\n });\n }\n\n const rebuiltText = joinSections(rebuilt, eol);\n return rebuiltText;\n}\n","import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { findExecutable } from \"../paths\";\nimport type { ConfigTarget, ConfigWriteResult, McpServerEntry } from \"../types\";\n\nimport { updateConfigFile } from \"./config-file\";\nimport { hasMcpServerToml, parseMcpServersToml, writeMcpServerToml } from \"./toml-subset\";\n\n\n\n/**\n * Codex CLI. Its config is TOML, edited here by rewriting just the `[mcp_servers.<name>]`\n * span of the text — the rest of the file, Codex's model and approval settings included,\n * is never re-serialized.\n */\nexport function createCodexTarget(): ConfigTarget {\n const CODEX_CONFIG_PATH = path.join(process.env.CODEX_HOME ? path.resolve(process.env.CODEX_HOME) : path.join(os.homedir(), \".codex\"), \"config.toml\");\n function readText(): string {\n if(fs.existsSync(CODEX_CONFIG_PATH) == false) {\n return \"\";\n }\n\n return fs.readFileSync(CODEX_CONFIG_PATH, \"utf8\");\n }\n\n return {\n id: \"codex\",\n label: \"Codex CLI\",\n location: CODEX_CONFIG_PATH,\n detected: findExecutable(\"codex\") != null || fs.existsSync(CODEX_CONFIG_PATH) == true,\n\n readEntries(): Record<string, McpServerEntry> {\n const text = readText();\n return parseMcpServersToml(text);\n },\n\n hasEntry(name: string): boolean {\n return hasMcpServerToml(readText(), name);\n },\n\n writeEntry(name: string, entry: McpServerEntry, options?: { replace?: boolean }): ConfigWriteResult {\n updateConfigFile(CODEX_CONFIG_PATH, (original) => {\n let text = original;\n if(options?.replace) {\n text = writeMcpServerToml(text, name, null);\n }\n return writeMcpServerToml(text, name, entry);\n });\n return { status: \"written\", detail: CODEX_CONFIG_PATH };\n },\n\n removeEntry(name: string): ConfigWriteResult {\n updateConfigFile(CODEX_CONFIG_PATH, (text) => writeMcpServerToml(text, name, null));\n return { status: \"written\", detail: CODEX_CONFIG_PATH };\n },\n };\n}\n","import os from \"node:os\";\r\nimport path from \"node:path\";\r\n\r\nimport type { ConfigTarget } from \"../types\";\r\n\r\nimport { createClaudeCodeTarget } from \"./claude-code\";\r\nimport { createCodexTarget } from \"./codex\";\r\nimport { createJsonFileTarget } from \"./json-file\";\r\n\r\nexport { formatClaudeAddCommand } from \"./claude-code\";\r\nexport { renderMcpServerTable } from \"./toml-subset\";\r\n\r\nfunction claudeDesktopConfigPath(): string {\r\n if(process.platform === \"win32\") {\r\n const appData = process.env.APPDATA ?? path.join(os.homedir(), \"AppData\", \"Roaming\");\r\n return path.join(appData, \"Claude\", \"claude_desktop_config.json\");\r\n }\r\n\r\n if(process.platform === \"darwin\") {\r\n return path.join(os.homedir(), \"Library\", \"Application Support\", \"Claude\", \"claude_desktop_config.json\");\r\n }\r\n\r\n return path.join(os.homedir(), \".config\", \"Claude\", \"claude_desktop_config.json\");\r\n}\r\n\r\n/** Every supported client, detected ones first so the first entry is the sensible default. */\r\nexport function listConfigTargets(): ConfigTarget[] {\r\n const targets: ConfigTarget[] = [\r\n createClaudeCodeTarget(),\r\n createCodexTarget(),\r\n createJsonFileTarget({ id: \"claude-desktop\", label: \"Claude Desktop\", filePath: claudeDesktopConfigPath() }),\r\n createJsonFileTarget({ id: \"cursor\", label: \"Cursor\", filePath: path.join(os.homedir(), \".cursor\", \"mcp.json\") }),\r\n ];\r\n\r\n const detected = targets.filter((target) => target.detected == true);\r\n const others = targets.filter((target) => target.detected == false);\r\n return [...detected, ...others];\r\n}\r\n","import { runtimeMenu, runtimeNotice } from \"../registration/runtime-menu\";\nimport type { Readable, Writable } from \"node:stream\";\nimport type { ClientId, LaunchOptions, McpId } from \"../../_types\";\nimport { Prompter, PromptBackError, PromptClosedError } from \"./prompter\";\nimport { Registry } from \"../registration/registry\";\nimport { registrationMenu, syncMenu } from \"../registration/menu\";\nimport { listConfigTargets } from \"../registration/targets\";\nimport { CLIENT_LABELS } from \"../registration/types\";\nimport type { ConfigTarget } from \"../registration/types\";\n\nexport interface MenuOptions {\n input: Readable;\n output: Writable;\n targetId?: ClientId;\n registryPath?: string;\n targets?: ConfigTarget[];\n runtimeOptions?: Registry[\"runtimeOptions\"];\n launch: (options: LaunchOptions) => Promise<number>;\n}\n\nexport async function runRegistrationCommand(options: Omit<MenuOptions, \"launch\"> & { mode: \"register\" | \"sync\" }): Promise<number> {\n const prompter = new Prompter(options.input, options.output);\n const registry = new Registry(options.targets ?? listConfigTargets(), options.registryPath, options.runtimeOptions);\n try {\n if(options.mode === \"register\") await registrationMenu(prompter, registry, options.targetId);\n else await syncMenu(prompter, registry);\n return 0;\n } catch(error) {\n if(error instanceof PromptClosedError || error instanceof PromptBackError) return 0;\n throw error;\n } finally { prompter.close(); }\n}\n\nexport async function runMenu(options: MenuOptions): Promise<number> {\n const registry = new Registry(options.targets ?? listConfigTargets(), options.registryPath, options.runtimeOptions);\n let defaultValue: McpId | \"quit\" = \"db\";\n let failure: string | undefined;\n for(;;) {\n const prompter = new Prompter(options.input, options.output);\n let selected: McpId | \"quit\" = \"quit\";\n try {\n if(failure) {\n prompter.write(`\\n${failure}\\n\\n`);\n await prompter.acknowledge();\n failure = undefined;\n }\n for(;;) {\n prompter.clearScreen();\n const state = registry.read();\n const clients = state.clients;\n // Migrate registry lives in Runtime; its row there appears only when it can be applied.\n const runtime = runtimeNotice(registry);\n const picked: McpId | \"register\" | \"sync\" | \"runtime\" | \"quit\" = await prompter.select<McpId | \"register\" | \"sync\" | \"runtime\" | \"quit\">(\"AKMS MCP · Connection setup\", [\n { value: \"db\", label: \"Database\", hint: \"PostgreSQL connections\" },\n { value: \"ssh\", label: \"SSH\", hint: \"Remote hosts\" },\n { value: \"wsl\", label: \"WSL\", hint: \"Local Linux distros · Windows\" },\n { value: \"s3\", label: \"S3\", hint: \"AWS S3 and S3-compatible buckets\" },\n { separator: true },\n { value: \"register\", label: \"Register\", hint: clients.length ? clients.map((id) => CLIENT_LABELS[id]).join(\" · \") : \"Choose AI services once\" },\n { value: \"sync\", label: \"Sync\", hint: \"Review and retry shared settings\" },\n { value: \"runtime\", label: \"Runtime\", hint: runtime.hint, notice: runtime.notice },\n { value: \"quit\", label: \"Quit\" },\n ], { defaultValue, cancelValue: \"quit\" });\n if(picked !== \"register\" && picked !== \"sync\" && picked !== \"runtime\") { selected = picked; break; }\n try {\n if(picked === \"register\") await registrationMenu(prompter, registry, options.targetId);\n else if(picked === \"runtime\") await runtimeMenu(prompter, registry);\n else await syncMenu(prompter, registry);\n } catch(error) {\n if(error instanceof PromptClosedError) throw error;\n if(!(error instanceof PromptBackError)) {\n options.output.write(`\\n${error instanceof Error ? error.message : \"Could not update settings.\"}\\n`);\n await prompter.acknowledge();\n }\n }\n }\n } catch(error) {\n if(error instanceof PromptClosedError) return 0;\n throw error;\n } finally { prompter.close(); }\n if(selected === \"quit\") return 0;\n defaultValue = selected;\n try {\n const code = await options.launch({ mcpId: selected, targetId: options.targetId, pendingInput: prompter.takePendingInput() });\n if(code === 130) return 0;\n if(code !== 0) failure = `Setup exited with code ${code}.`;\n } catch(error) { failure = String(error); }\n }\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { Readable, Writable } from \"node:stream\";\nimport { MCP_PACKAGES, PACKAGE_VERSION } from \"../../_defs\";\nimport type { LaunchOptions, McpId } from \"../../_types\";\nimport { PACKAGE_NAME, findGlobalRuntime, installGlobalRuntime } from \"../registration/runtime\";\nimport type { LaunchCommand } from \"../registration/runtime\";\nimport { Prompter, PromptBackError, PromptClosedError } from \"./prompter\";\n\nexport interface LaunchDependencies {\n findRuntime?: typeof findGlobalRuntime;\n installRuntime?: typeof installGlobalRuntime;\n bundledEntry?: typeof bundledEntry;\n runChild?: (command: string, argumentsList: string[], pendingInput?: string) => Promise<number>;\n input?: Readable;\n output?: Writable;\n}\n\n/** This launcher's own copy of a kind's entry: lib/<kind>.js in the same @akms/mcp package. */\nexport function bundledEntry(kind: McpId): LaunchCommand {\n let directory = dirname(fileURLToPath(import.meta.url));\n for(;;) {\n const manifest = join(directory, \"package.json\");\n if(existsSync(manifest) == true && JSON.parse(readFileSync(manifest, \"utf8\")).name === PACKAGE_NAME) {\n return { command: process.execPath, args: [join(directory, \"lib\", `${kind}.js`)] };\n }\n const parent = dirname(directory);\n if(parent === directory) {\n throw new Error(\"The AKMS MCP package could not be located; setup was not started.\");\n }\n directory = parent;\n }\n}\n\nexport async function launchMcp(options: LaunchOptions, dependencies: LaunchDependencies = {}): Promise<number> {\n const selected = MCP_PACKAGES[options.mcpId];\n if(options.mcpId === \"wsl\" && process.platform !== \"win32\") {\n throw new Error(\"WSL setup must run from Windows.\");\n }\n\n const findRuntime = dependencies.findRuntime ?? findGlobalRuntime;\n const output = dependencies.output ?? process.stdout;\n let runtime = findRuntime(options.mcpId);\n let pendingInput = options.pendingInput;\n if(!runtime) {\n const prompter = new Prompter(dependencies.input ?? process.stdin, output, pendingInput);\n try {\n prompter.write(`\\n${PACKAGE_NAME} is not installed in the AKMS runtime directory.\\n`);\n if(!await prompter.askYesNo(\"Install the AKMS runtime before opening setup?\", true)) return 0;\n try {\n prompter.write(`Installing ${PACKAGE_NAME}...\\n`);\n await (dependencies.installRuntime ?? installGlobalRuntime)();\n runtime = findRuntime(options.mcpId);\n if(!runtime) throw new Error(\"Installation completed but the AKMS runtime could not be found.\");\n } catch(error) {\n if(error instanceof Error && error.message === \"AKMS runtime installation cancelled.\") return 130;\n prompter.write(`${error instanceof Error ? error.message : \"AKMS runtime installation failed.\"}\\n`);\n // Setup still works without the runtime; saved connections wait for it in Sync.\n if(!await prompter.askYesNo(\"Open setup from this launcher instead?\", false)) return 1;\n }\n } catch(error) {\n if(error instanceof PromptClosedError || error instanceof PromptBackError) return 0;\n throw error;\n } finally {\n prompter.close();\n pendingInput = prompter.takePendingInput();\n }\n }\n const launch = runtime ?? (dependencies.bundledEntry ?? bundledEntry)(options.mcpId);\n const argumentsList = [...launch.args, selected.setupCommand];\n if(options.targetId) argumentsList.push(\"--target\", options.targetId);\n if(runtime) output.write(`Opening ${selected.label} setup · ${PACKAGE_NAME} ${runtime.version}${runtime.linked ? \" (linked development checkout)\" : \"\"}\\n\\n`);\n else output.write(`Opening ${selected.label} setup · ${PACKAGE_NAME} ${PACKAGE_VERSION} from this launcher\\n\\n`);\n return (dependencies.runChild ?? runChild)(launch.command, argumentsList, pendingInput);\n}\n\nasync function runChild(command: string, argumentsList: string[], pendingInput?: string): Promise<number> {\n return new Promise<number>((resolve, reject) => {\n const interactiveInput = process.stdin.isTTY === true;\n let inputMode: \"inherit\" | \"pipe\" = \"pipe\";\n if(interactiveInput == true) {\n inputMode = \"inherit\";\n }\n // AKMS_MCP_MENU: the kind's screen was opened from this menu, so it need not say where the menu is.\n const child = spawn(command, argumentsList, {\n stdio: [inputMode, \"inherit\", \"inherit\"],\n windowsHide: true,\n env: { ...process.env, AKMS_MCP_MENU: \"1\" },\n });\n const interrupt = (): void => {\n child.kill(\"SIGINT\");\n };\n const terminate = (): void => {\n child.kill(\"SIGTERM\");\n };\n process.on(\"SIGINT\", interrupt);\n process.on(\"SIGTERM\", terminate);\n\n if(child.stdin != null) {\n child.stdin.on(\"error\", (error: NodeJS.ErrnoException) => {\n if(error.code !== \"EPIPE\" && error.code !== \"ERR_STREAM_DESTROYED\") {\n reject(error);\n }\n });\n if(pendingInput != null) {\n child.stdin.write(pendingInput);\n }\n process.stdin.pipe(child.stdin);\n }\n const cleanup = (): void => {\n process.off(\"SIGINT\", interrupt);\n process.off(\"SIGTERM\", terminate);\n if(child.stdin != null) {\n process.stdin.unpipe(child.stdin);\n process.stdin.pause();\n }\n };\n child.once(\"error\", (error) => {\n cleanup();\n reject(error);\n });\n child.once(\"close\", (code, signal) => {\n cleanup();\n if(signal != null) {\n resolve(130);\n return;\n }\n resolve(code ?? 1);\n });\n });\n}\n","#!/usr/bin/env node\nimport { parseArguments } from \"./modules/launcher/arguments\";\nimport { runMenu, runRegistrationCommand } from \"./modules/launcher/menu\";\nimport { launchMcp } from \"./modules/launcher/npm\";\nimport { PACKAGE_VERSION } from \"./_defs\";\n\nconst HELP_TEXT = [\n \"AKMS MCP — connection setup for Database, SSH, WSL and S3\",\n \"\",\n \"Usage:\",\n \" akms-mcp Open the setup menu\",\n \" akms-mcp [setup|config] Open the same menu\",\n \" akms-mcp [setup|config] <mcp> Open db, ssh, wsl or s3 setup directly\",\n \" akms-mcp register Register AI services for all AKMS connections\",\n \" akms-mcp sync Review differences and retry pending changes\",\n \"\",\n \"Options:\",\n \" --target <client> claude-code | codex | claude-desktop | cursor\",\n \" -h, --help Print this help\",\n \" -v, --version Print the launcher version\",\n \"\",\n \"Opens the installed runtime's setup. Missing runtimes can be installed with confirmation.\",\n \"Node.js 22+ and npm are required. WSL setup runs on Windows.\",\n \"Catalog: ~/.akms/mcp/registry.json (or $AKMS_MCP_HOME/registry.json) stores settings and passwords in plaintext.\",\n].join(\"\\n\");\n\nasync function main(): Promise<void> {\n const argumentsList = parseArguments(process.argv.slice(2));\n if(argumentsList.showHelp == true) {\n process.stdout.write(`${HELP_TEXT}\\n`);\n return;\n }\n if(argumentsList.showVersion == true) {\n process.stdout.write(`${PACKAGE_VERSION}\\n`);\n return;\n }\n if(argumentsList.mcpId != null) {\n process.exitCode = await launchMcp({ mcpId: argumentsList.mcpId, targetId: argumentsList.targetId });\n return;\n }\n if(argumentsList.managementMode) {\n process.exitCode = await runRegistrationCommand({ input: process.stdin, output: process.stdout, mode: argumentsList.managementMode, targetId: argumentsList.targetId });\n return;\n }\n process.exitCode = await runMenu({\n input: process.stdin,\n output: process.stdout,\n targetId: argumentsList.targetId,\n launch: launchMcp,\n });\n}\n\nmain().catch((error: unknown) => {\n process.stderr.write(`akms-mcp: ${String(error)}\\n`);\n process.exitCode = 1;\n});\n"]}