export type ClientId = 'claude-desktop' | 'claude-code' | 'cursor'; export interface ClientTarget { id: ClientId; label: string; configPath: string; detected: boolean; /** Desktop on macOS needs a login shell to find node. */ useLoginShell: boolean; } export interface ServerEntry { command: string; args: string[]; } export type MergeAction = 'created' | 'added' | 'updated' | 'unchanged'; export interface MergeResult { action: MergeAction; content: string; } export interface ApplyResult { client: ClientTarget; action: MergeAction | 'skipped'; backupPath?: string; error?: string; } export interface SetupOptions { home?: string; platform?: NodeJS.Platform; dryRun?: boolean; yes?: boolean; clients?: ClientId[]; license?: string; installDaemon?: boolean; verify?: boolean; } /** * Resolve the config path for each supported client on this platform. * `detected` means the client's own directory exists — i.e. it has been run * at least once — not that Decibel is already configured. */ export declare function detectClients(opts?: { home?: string; platform?: NodeJS.Platform; }): ClientTarget[]; /** * The MCP server block to write. Desktop on macOS gets the login-shell * wrapper; everything else invokes npx directly. */ export declare function buildServerEntry(client: ClientTarget): ServerEntry; /** * Merge the Decibel server entry into an existing config document. * * Preserves every other top-level key (Claude Desktop keeps a `preferences` * blob next to `mcpServers`) and every other configured MCP server. Returns * `unchanged` when the entry already matches, so re-running is a no-op. * * Throws if `raw` is non-empty and not valid JSON — the caller skips rather * than destroying a file it does not understand. */ export declare function mergeConfig(raw: string | null, entry: ServerEntry): MergeResult; /** * Write the merged config for one client, backing up the original first. * `dryRun` computes the action without touching disk. */ export declare function applyToClient(client: ClientTarget, opts?: { dryRun?: boolean; }): ApplyResult; export interface VerifyResult { ok: boolean; toolCount?: number; serverName?: string; error?: string; } /** * Spawn the server exactly as a client would and run initialize + tools/list. * This is the difference between "we wrote a file" and "it actually works". */ export declare function verifyServer(entry: ServerEntry, timeoutMs?: number): Promise; export declare function parseSetupArgs(args: string[]): SetupOptions; /** * Run the setup wizard. Returns a process exit code. */ export declare function runSetup(argv: string[]): Promise; //# sourceMappingURL=setup.d.ts.map