nia-wizard 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bin.js
CHANGED
|
@@ -2435,12 +2435,17 @@ async function runWizard(options) {
|
|
|
2435
2435
|
const outroMessage = `
|
|
2436
2436
|
${chalk3.green("\u2713 Nia MCP Server installed!")}
|
|
2437
2437
|
|
|
2438
|
-
${chalk3.cyan("
|
|
2439
|
-
|
|
2440
|
-
|
|
2441
|
-
3. Or: ${chalk3.yellow('"Search the Chromium codebase for layout engine"')}
|
|
2438
|
+
${chalk3.cyan("Get started:")}
|
|
2439
|
+
\u2022 Browse pre-indexed sources: ${chalk3.cyan("https://app.trynia.ai/explore")}
|
|
2440
|
+
\u2022 Or index your own repos, docs, and papers
|
|
2442
2441
|
|
|
2443
|
-
${chalk3.
|
|
2442
|
+
${chalk3.cyan("Try in your coding agent:")}
|
|
2443
|
+
${chalk3.yellow('"List my indexed sources"')}
|
|
2444
|
+
${chalk3.yellow('"Search vercel/ai-sdk for streaming"')}
|
|
2445
|
+
${chalk3.yellow('"Run deep research on MCP protocols"')}
|
|
2446
|
+
|
|
2447
|
+
${chalk3.dim("Using as API?")} ${chalk3.cyan("https://docs.trynia.ai/api-guide")}
|
|
2448
|
+
${chalk3.dim("Follow us:")} ${chalk3.cyan("https://x.com/nozomioai")}
|
|
2444
2449
|
`;
|
|
2445
2450
|
clack_default.outro(outroMessage);
|
|
2446
2451
|
} else {
|
|
@@ -2530,4 +2535,4 @@ export {
|
|
|
2530
2535
|
runMCPAdd,
|
|
2531
2536
|
runMCPRemove
|
|
2532
2537
|
};
|
|
2533
|
-
//# sourceMappingURL=chunk-
|
|
2538
|
+
//# sourceMappingURL=chunk-Y3PXW4WX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/debug.ts","../src/utils/device-flow.ts","../src/steps/add-mcp-server-to-clients/MCPClient.ts","../src/steps/add-mcp-server-to-clients/defaults.ts","../src/utils/clack.ts","../src/utils/clack-utils.ts","../src/steps/add-mcp-server-to-clients/clients/cursor.ts","../src/steps/add-mcp-server-to-clients/clients/claude-desktop.ts","../src/steps/add-mcp-server-to-clients/clients/claude-code.ts","../src/steps/add-mcp-server-to-clients/clients/vscode.ts","../src/steps/add-mcp-server-to-clients/clients/windsurf.ts","../src/steps/add-mcp-server-to-clients/clients/zed.ts","../src/steps/add-mcp-server-to-clients/clients/cline.ts","../src/steps/add-mcp-server-to-clients/clients/codex.ts","../src/steps/add-mcp-server-to-clients/clients/continue.ts","../src/steps/add-mcp-server-to-clients/clients/jetbrains.ts","../src/steps/add-mcp-server-to-clients/clients/antigravity.ts","../src/steps/add-mcp-server-to-clients/clients/trae.ts","../src/steps/add-mcp-server-to-clients/clients/roo-code.ts","../src/steps/add-mcp-server-to-clients/clients/kilo-code.ts","../src/steps/add-mcp-server-to-clients/clients/gemini-cli.ts","../src/steps/add-mcp-server-to-clients/clients/opencode.ts","../src/steps/add-mcp-server-to-clients/clients/qodo-gen.ts","../src/steps/add-mcp-server-to-clients/clients/qwen-coder.ts","../src/steps/add-mcp-server-to-clients/clients/visual-studio.ts","../src/steps/add-mcp-server-to-clients/clients/crush.ts","../src/steps/add-mcp-server-to-clients/clients/copilot.ts","../src/steps/add-mcp-server-to-clients/clients/augment.ts","../src/steps/add-mcp-server-to-clients/clients/kiro.ts","../src/steps/add-mcp-server-to-clients/clients/lm-studio.ts","../src/steps/add-mcp-server-to-clients/clients/bolt-ai.ts","../src/steps/add-mcp-server-to-clients/clients/perplexity.ts","../src/steps/add-mcp-server-to-clients/clients/warp.ts","../src/steps/add-mcp-server-to-clients/clients/amazon-q.ts","../src/steps/add-mcp-server-to-clients/clients/factory.ts","../src/steps/add-mcp-server-to-clients/clients/amp.ts","../src/steps/add-mcp-server-to-clients/clients/vibe.ts","../src/steps/add-mcp-server-to-clients/index.ts","../src/run.ts","../src/utils/dependencies.ts","../src/mcp.ts"],"sourcesContent":["let debugEnabled = false;\n\nexport function enableDebug(): void {\n debugEnabled = true;\n}\n\nexport function debug(...args: unknown[]): void {\n if (debugEnabled) {\n console.log('[DEBUG]', ...args);\n }\n}\n","/**\n * Device Authorization Flow for CLI onboarding\n * \n * This implements a device authorization flow similar to OAuth Device Flow,\n * allowing the CLI to obtain API keys through browser-based authentication.\n * \n * Flow:\n * 1. CLI calls /public/mcp-device/start to get session + user code\n * 2. CLI opens browser to verification URL\n * 3. User signs in and authorizes in browser\n * 4. CLI exchanges session for API key via /public/mcp-device/exchange\n */\n\nimport { debug } from './debug.js';\n\n// Backend API URL\nconst BACKEND_URL = process.env.NIA_BACKEND_URL || 'https://apigcp.trynia.ai';\n// App URL for browser - if set locally, override backend's verification_url\nconst APP_URL = process.env.NIA_APP_URL || '';\n\n// Session expiry (matches backend: 15 minutes)\nconst SESSION_TTL_MS = 15 * 60 * 1000;\n\nexport interface DeviceSession {\n authorization_session_id: string;\n user_code: string;\n verification_url: string;\n expires_at: string;\n}\n\nexport interface DeviceFlowError {\n type: 'network' | 'expired' | 'not_ready' | 'consumed' | 'invalid' | 'unknown';\n message: string;\n detail?: string;\n}\n\n/**\n * Start a new device authorization session\n */\nexport async function startDeviceSession(): Promise<DeviceSession> {\n debug('Starting device session...');\n \n const response = await fetch(`${BACKEND_URL}/public/mcp-device/start`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n debug(`Failed to start device session: ${response.status} - ${errorText}`);\n \n if (response.status === 429) {\n throw createError('network', 'Too many requests. Please wait a moment and try again.');\n }\n \n throw createError('network', `Failed to connect to Nia servers: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n authorization_session_id: string;\n user_code: string;\n verification_url: string;\n expires_at: string;\n };\n debug(`Device session started: code=${data.user_code}`);\n \n // Construct the verification URL to use /cli-onboarding for full experience\n // (org creation, GitHub connect, etc.) instead of /cli-auth which skips it\n let verificationUrl: string;\n if (APP_URL) {\n // Local dev - use local app URL\n verificationUrl = `${APP_URL}/cli-onboarding?code=${data.user_code}`;\n debug(`Using local APP_URL for verification: ${verificationUrl}`);\n } else {\n // Production - override backend's /cli-auth with /cli-onboarding\n verificationUrl = data.verification_url.replace('/cli-auth?', '/cli-onboarding?');\n debug(`Using cli-onboarding URL: ${verificationUrl}`);\n }\n \n return {\n authorization_session_id: data.authorization_session_id,\n user_code: data.user_code,\n verification_url: verificationUrl,\n expires_at: data.expires_at,\n };\n}\n\n/**\n * Exchange a device session for an API key\n * \n * This should be called after the user has completed authorization in the browser.\n * Returns the API key on success, or throws a DeviceFlowError.\n */\nexport async function exchangeForApiKey(\n session: DeviceSession,\n): Promise<string> {\n debug('Exchanging device session for API key...');\n \n // Check if session has expired locally first\n const expiresAt = new Date(session.expires_at).getTime();\n if (Date.now() > expiresAt) {\n throw createError('expired', 'Session has expired. Please run the setup again.');\n }\n \n const response = await fetch(`${BACKEND_URL}/public/mcp-device/exchange`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n authorization_session_id: session.authorization_session_id,\n user_code: session.user_code,\n }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({ detail: 'Unknown error' }))) as { detail?: string };\n const detail = errorData.detail || `HTTP ${response.status}`;\n debug(`Exchange failed: ${response.status} - ${detail}`);\n \n // Map HTTP status to error type\n switch (response.status) {\n case 400:\n // Check if it's a \"not ready\" error\n if (detail.includes('not yet authorized') || detail.includes('pending')) {\n throw createError('not_ready', 'Session not yet authorized. Complete the setup in your browser first.', detail);\n }\n if (detail.includes('complete the setup') || detail.includes('authorized')) {\n throw createError('not_ready', 'Please complete the setup in your browser first (sign in, etc.).', detail);\n }\n throw createError('invalid', detail);\n \n case 404:\n throw createError('invalid', 'Invalid session or code. Please run the setup again.');\n \n case 409:\n throw createError('consumed', 'This session has already been used. Please run the setup again.');\n \n case 410:\n throw createError('expired', 'Session has expired. Please run the setup again.');\n \n default:\n throw createError('unknown', `Failed to get API key: ${detail}`);\n }\n }\n\n const data = (await response.json()) as { api_key?: string };\n \n if (!data.api_key) {\n throw createError('unknown', 'Server did not return an API key');\n }\n \n debug('Successfully obtained API key');\n return data.api_key;\n}\n\n/**\n * Check if a session is still valid (not expired)\n */\nexport function isSessionValid(session: DeviceSession): boolean {\n const expiresAt = new Date(session.expires_at).getTime();\n // Add a small buffer (30 seconds) to account for network latency\n return Date.now() < expiresAt - 30000;\n}\n\n/**\n * Get the remaining time until session expires (in seconds)\n */\nexport function getSessionTimeRemaining(session: DeviceSession): number {\n const expiresAt = new Date(session.expires_at).getTime();\n const remaining = Math.max(0, expiresAt - Date.now());\n return Math.floor(remaining / 1000);\n}\n\n/**\n * Format the user code for display (e.g., \"ABCD-EFGH\")\n */\nexport function formatUserCode(code: string): string {\n return code.toUpperCase();\n}\n\n/**\n * Create a typed error object\n */\nfunction createError(\n type: DeviceFlowError['type'],\n message: string,\n detail?: string,\n): DeviceFlowError {\n return { type, message, detail };\n}\n\n/**\n * Check if an error is a DeviceFlowError\n */\nexport function isDeviceFlowError(error: unknown): error is DeviceFlowError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'type' in error &&\n 'message' in error\n );\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as jsonc from 'jsonc-parser';\nimport { getDefaultServerConfig } from './defaults.js';\nimport type { MCPServerConfig, MCPClientResult } from '../../utils/types.js';\nimport { debug } from '../../utils/debug.js';\n\nexport const SERVER_NAME = 'nia';\n\nexport abstract class MCPClient {\n abstract name: string;\n abstract getConfigPath(): Promise<string>;\n abstract getServerPropertyName(): string;\n abstract isClientSupported(): Promise<boolean>;\n\n /**\n * Check if server is already installed\n */\n async isServerInstalled(): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return false;\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, unknown>;\n const serverProp = this.getServerPropertyName();\n\n return (\n serverProp in config &&\n typeof config[serverProp] === 'object' &&\n config[serverProp] !== null &&\n SERVER_NAME in (config[serverProp] as Record<string, unknown>)\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Get the server config for this client\n */\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n return getDefaultServerConfig(apiKey, mode);\n }\n\n /**\n * Add the MCP server to this client\n */\n async addServer(\n apiKey: string,\n mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n try {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n // Ensure directory exists\n await fs.promises.mkdir(configDir, { recursive: true });\n\n const serverProp = this.getServerPropertyName();\n let configContent = '';\n let existingConfig: Record<string, unknown> = {};\n\n // Read existing config if it exists\n if (fs.existsSync(configPath)) {\n configContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = (jsonc.parse(configContent) as Record<string, unknown>) || {};\n }\n\n // Get the new server config\n const newServerConfig = this.getServerConfig(apiKey, mode);\n\n // Use JSONC to safely modify the config (preserves comments)\n const edits = jsonc.modify(\n configContent,\n [serverProp, SERVER_NAME],\n newServerConfig,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n debug(`Wrote config to ${configPath}`);\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n debug(`Failed to add server: ${message}`);\n return { success: false, error: message };\n }\n }\n\n /**\n * Remove the MCP server from this client\n */\n async removeServer(): Promise<MCPClientResult> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false, error: 'Config file not found' };\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const serverProp = this.getServerPropertyName();\n\n // Remove the server entry\n const edits = jsonc.modify(\n configContent,\n [serverProp, SERVER_NAME],\n undefined,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n debug(`Removed server from ${configPath}`);\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n}\n","import { z } from 'zod';\n\n// Remote MCP endpoint - use env vars for local dev, prod as default\nexport const REMOTE_MCP_URL = process.env.NIA_REMOTE_MCP_URL || 'https://apigcp.trynia.ai/mcp';\nexport const NIA_API_URL = process.env.NIA_API_URL || 'https://apigcp.trynia.ai/';\n\nexport const DefaultMCPClientConfig = z\n .object({\n mcpServers: z.record(\n z.string(),\n z.union([\n z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\n/**\n * Build MCP URL with optional parameters\n */\nexport function buildMCPUrl(local?: boolean): string {\n if (local) {\n return 'http://localhost:8787/mcp';\n }\n return REMOTE_MCP_URL;\n}\n\n/**\n * Get server config for remote HTTP mode\n */\nexport function getRemoteServerConfig(apiKey: string) {\n return {\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n}\n\n/**\n * Get server config for local stdio mode\n */\nexport function getLocalServerConfig(apiKey: string) {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n}\n\n/**\n * Get the default server config based on mode\n */\nexport function getDefaultServerConfig(\n apiKey: string,\n mode: 'local' | 'remote',\n) {\n if (mode === 'remote') {\n return getRemoteServerConfig(apiKey);\n }\n return getLocalServerConfig(apiKey);\n}\n","import * as clack from '@clack/prompts';\n\nexport default clack;\n\nexport function isCancel(value: unknown): value is symbol {\n return clack.isCancel(value);\n}\n","import clack, { isCancel } from './clack.js';\nimport chalk from 'chalk';\nimport open from 'open';\nimport {\n startDeviceSession,\n exchangeForApiKey,\n formatUserCode,\n isSessionValid,\n getSessionTimeRemaining,\n isDeviceFlowError,\n type DeviceSession,\n} from './device-flow.js';\nimport { debug } from './debug.js';\n\n// Use env var for local dev, prod as default\nconst NIA_APP_URL = process.env.NIA_APP_URL || 'https://app.trynia.ai';\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n const result = await input;\n\n if (isCancel(result)) {\n clack.cancel('Setup cancelled.');\n process.exit(0);\n }\n\n return result as Exclude<T, symbol>;\n}\n\nexport async function abort(message?: string, code = 1): Promise<never> {\n clack.outro(message ?? 'Setup cancelled.');\n process.exit(code);\n}\n\nexport function printWelcome(): void {\n console.log('');\n clack.intro(chalk.bgCyan.black(' Nia MCP Wizard '));\n clack.note(\n 'This wizard will install the Nia MCP server to your coding agents.\\nGet external docs, code search, and research tools in your IDE.',\n );\n}\n\n/**\n * Get API key from user - either passed as arg, via device flow, or manual entry\n */\nexport async function getApiKey(providedKey?: string): Promise<string> {\n // If key provided and valid, use it\n if (providedKey && providedKey.startsWith('nk_')) {\n clack.log.success('Using provided API key');\n return providedKey;\n }\n\n // Invalid key format\n if (providedKey && !providedKey.startsWith('nk_')) {\n clack.log.warn(`Invalid API key format. Keys should start with 'nk_'`);\n }\n\n // No key - offer device flow or manual entry\n clack.log.info('You need a Nia API key to continue.');\n\n const authMethod = await abortIfCancelled(\n clack.select({\n message: 'How would you like to authenticate?',\n options: [\n {\n value: 'browser' as const,\n label: 'Sign in with browser',\n hint: 'Recommended. Opens browser for quick sign-in.',\n },\n {\n value: 'manual' as const,\n label: 'Enter API key manually',\n hint: 'If you already have an API key.',\n },\n ],\n initialValue: 'browser' as const,\n }),\n );\n\n if (authMethod === 'browser') {\n return await runDeviceFlow();\n } else {\n return await promptForManualApiKey();\n }\n}\n\n/**\n * Run the device authorization flow\n */\nasync function runDeviceFlow(): Promise<string> {\n const spinner = clack.spinner();\n \n // Step 1: Start device session\n spinner.start('Connecting to Nia...');\n \n let session: DeviceSession;\n try {\n session = await startDeviceSession();\n spinner.stop('Connected!');\n } catch (error) {\n spinner.stop('Failed to connect');\n \n if (isDeviceFlowError(error)) {\n clack.log.error(error.message);\n } else {\n clack.log.error('Failed to connect to Nia servers. Check your internet connection.');\n debug(`Device flow error: ${error}`);\n }\n \n // Fall back to manual entry\n clack.log.info('Falling back to manual API key entry.');\n return await promptForManualApiKey();\n }\n\n // Step 2: Display the code and open browser\n const formattedCode = formatUserCode(session.user_code);\n const timeRemaining = getSessionTimeRemaining(session);\n \n console.log('');\n clack.note(\n `${chalk.bold('Your authorization code:')}\\n\\n` +\n ` ${chalk.bold.green(formattedCode)}\\n\\n` +\n chalk.dim(`Code expires in ${Math.floor(timeRemaining / 60)} minutes`),\n 'Browser Authorization'\n );\n \n // Open browser\n clack.log.info(`Opening ${chalk.cyan(session.verification_url)}...`);\n \n try {\n await open(session.verification_url);\n } catch {\n clack.log.warn('Could not open browser automatically.');\n }\n \n console.log('');\n clack.log.message(\n chalk.dim('If the browser didn\\'t open, go to:\\n') +\n ` ${chalk.cyan(session.verification_url)}`\n );\n \n // Step 3: Show instructions\n console.log('');\n clack.log.step(chalk.yellow('Complete these steps in your browser:'));\n console.log(' 1. Sign in or create an account');\n console.log(' 2. The CLI will be authorized automatically');\n console.log('');\n\n // Step 4: Wait for user and exchange\n return await waitForAuthorizationAndExchange(session);\n}\n\n/**\n * Wait for user to complete browser auth, then exchange for API key\n */\nasync function waitForAuthorizationAndExchange(session: DeviceSession): Promise<string> {\n // Loop until successful exchange or user cancels\n while (true) {\n // Check session validity\n if (!isSessionValid(session)) {\n clack.log.error('Session has expired. Please start over.');\n return abort('Session expired', 1);\n }\n\n // Prompt user to continue\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: 'Press Enter once you\\'ve signed in (or N to enter key manually)',\n initialValue: true,\n }),\n );\n\n if (!shouldContinue) {\n // User chose manual entry\n return await promptForManualApiKey();\n }\n\n // Try to exchange\n const spinner = clack.spinner();\n spinner.start('Checking authorization...');\n\n try {\n const apiKey = await exchangeForApiKey(session);\n spinner.stop(chalk.green('✓ Authorized!'));\n \n clack.log.success('API key obtained successfully!');\n return apiKey;\n } catch (error) {\n spinner.stop('Not ready yet');\n \n if (isDeviceFlowError(error)) {\n switch (error.type) {\n case 'not_ready':\n clack.log.warn('Browser authorization not complete yet.');\n console.log('');\n clack.log.message(\n chalk.dim('Make sure you have:\\n') +\n ' • Signed in to your Nia account\\n' +\n ' • Completed any setup steps in the browser'\n );\n console.log('');\n // Continue loop - let user try again\n break;\n \n case 'expired':\n clack.log.error('Session has expired.');\n clack.log.info('Please run the wizard again to start a new session.');\n return abort('Session expired', 1);\n \n case 'consumed':\n clack.log.error('This session was already used.');\n clack.log.info('Please run the wizard again to start a new session.');\n return abort('Session already used', 1);\n \n case 'invalid':\n clack.log.error(error.message);\n clack.log.info('Please run the wizard again to start a new session.');\n return abort('Invalid session', 1);\n \n default:\n clack.log.error(error.message);\n clack.log.info('Falling back to manual API key entry.');\n return await promptForManualApiKey();\n }\n } else {\n clack.log.error('An unexpected error occurred.');\n debug(`Exchange error: ${error}`);\n clack.log.info('Falling back to manual API key entry.');\n return await promptForManualApiKey();\n }\n }\n }\n}\n\n/**\n * Prompt user to manually enter their API key\n */\nasync function promptForManualApiKey(): Promise<string> {\n const shouldOpen = await abortIfCancelled(\n clack.confirm({\n message: `Open ${chalk.cyan(NIA_APP_URL)} to get your API key?`,\n initialValue: true,\n }),\n );\n\n if (shouldOpen) {\n clack.log.info(`Opening ${chalk.cyan(NIA_APP_URL)}...`);\n try {\n await open(NIA_APP_URL);\n } catch {\n clack.log.warn('Could not open browser. Please go to the URL manually.');\n }\n } else {\n clack.log.info(`Get your API key at: ${chalk.cyan(NIA_APP_URL)}`);\n }\n\n const apiKey = await abortIfCancelled(\n clack.text({\n message: 'Paste your API key (nk_...):',\n placeholder: 'nk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n validate: (value) => {\n if (!value) return 'API key is required';\n if (!value.startsWith('nk_')) return \"API key should start with 'nk_'\";\n if (value.length < 10) return 'API key is too short';\n return undefined;\n },\n }),\n );\n\n return apiKey;\n}\n\n/**\n * Ask user to select installation mode\n */\nexport async function askInstallMode(\n defaultLocal = true,\n): Promise<'local' | 'remote'> {\n const mode = await abortIfCancelled(\n clack.select({\n message: 'Select installation mode:',\n options: [\n {\n value: 'local' as const,\n label: 'Local',\n hint: 'Requires pipx to be installed',\n },\n {\n value: 'remote' as const,\n label: 'Remote',\n },\n ],\n initialValue: defaultLocal ? 'local' : 'remote',\n }),\n );\n\n return mode;\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { getRemoteServerConfig } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class CursorMCPClient extends MCPClient {\n name = 'Cursor';\n\n async isClientSupported(): Promise<boolean> {\n // Cursor is available on macOS and Windows\n const platform = process.platform;\n if (platform !== 'darwin' && platform !== 'win32') {\n return false;\n }\n\n // Check if Cursor config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n // Check if parent .cursor directory exists (indicates Cursor is/was installed)\n return fs.existsSync(path.dirname(configDir)) || fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.cursor', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n /**\n * Cursor supports native HTTP transport, so we use URL-based config for remote\n */\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return getRemoteServerConfig(apiKey);\n }\n // Local mode uses stdio\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: 'https://apigcp.trynia.ai/',\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ClaudeDesktopMCPClient extends MCPClient {\n name = 'Claude Desktop';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n if (platform !== 'darwin' && platform !== 'win32') {\n return false;\n }\n\n // Check if Claude Desktop config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(\n os.homedir(),\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n if (platform === 'win32') {\n return path.join(\n process.env.APPDATA || '',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n throw new Error(`Unsupported platform: ${platform}`);\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n /**\n * Claude Desktop only supports stdio (local) mode\n */\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // Claude Desktop doesn't support remote HTTP, always use local\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: 'https://apigcp.trynia.ai/',\n },\n };\n }\n\n /**\n * Claude Desktop only supports local mode\n */\n supportsRemote(): boolean {\n return false;\n }\n}\n","import { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class ClaudeCodeMCPClient extends MCPClient {\n name = 'Claude Code';\n private claudeBinaryPath: string | null = null;\n\n async isClientSupported(): Promise<boolean> {\n try {\n const binary = this.findClaudeBinary();\n if (!binary) {\n debug('Claude Code CLI not found');\n return false;\n }\n\n execSync(`${binary} --version`, { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n }\n\n private findClaudeBinary(): string | null {\n if (this.claudeBinaryPath) {\n return this.claudeBinaryPath;\n }\n\n const possiblePaths = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const claudePath of possiblePaths) {\n if (fs.existsSync(claudePath)) {\n debug(`Found claude binary at: ${claudePath}`);\n this.claudeBinaryPath = claudePath;\n return claudePath;\n }\n }\n\n // Try PATH as fallback\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n this.claudeBinaryPath = 'claude';\n return 'claude';\n } catch {\n return null;\n }\n }\n\n async getConfigPath(): Promise<string> {\n // Claude Code uses CLI, not a config file\n throw new Error('Claude Code uses CLI for configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const binary = this.findClaudeBinary();\n if (!binary) return false;\n\n const output = execSync(`${binary} mcp list`, { stdio: 'pipe' });\n return output.toString().includes(SERVER_NAME);\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n const binary = this.findClaudeBinary();\n if (!binary) {\n return { success: false, error: 'Claude Code CLI not found' };\n }\n\n try {\n let command: string;\n\n if (mode === 'remote') {\n // Remote HTTP mode\n command = `${binary} mcp add --transport http ${SERVER_NAME} ${REMOTE_MCP_URL} --header \"Authorization: Bearer ${apiKey}\" -s user`;\n } else {\n // Local stdio mode\n command = `${binary} mcp add ${SERVER_NAME} -e \"NIA_API_KEY=${apiKey}\" -e \"NIA_API_URL=${NIA_API_URL}\" -s user -- pipx run --no-cache nia-mcp-server`;\n }\n\n debug(`Running: ${command}`);\n execSync(command, { stdio: 'pipe' });\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n const binary = this.findClaudeBinary();\n if (!binary) {\n return { success: false, error: 'Claude Code CLI not found' };\n }\n\n try {\n const command = `${binary} mcp remove --scope user ${SERVER_NAME}`;\n debug(`Running: ${command}`);\n execSync(command, { stdio: 'pipe' });\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class VSCodeMCPClient extends MCPClient {\n name = 'VS Code';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n // VS Code is available on all platforms\n if (platform !== 'darwin' && platform !== 'win32' && platform !== 'linux') {\n return false;\n }\n\n // Check if VS Code config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(\n os.homedir(),\n 'Library',\n 'Application Support',\n 'Code',\n 'User',\n 'mcp.json',\n );\n }\n\n if (platform === 'win32') {\n return path.join(\n process.env.APPDATA || '',\n 'Code',\n 'User',\n 'mcp.json',\n );\n }\n\n // Linux\n return path.join(os.homedir(), '.config', 'Code', 'User', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'servers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class WindsurfMCPClient extends MCPClient {\n name = 'Windsurf';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n if (platform !== 'darwin' && platform !== 'win32' && platform !== 'linux') {\n return false;\n }\n\n // Check if Windsurf config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json');\n }\n\n if (platform === 'win32') {\n return path.join(\n process.env.APPDATA || '',\n 'Codeium',\n 'windsurf',\n 'mcp_config.json',\n );\n }\n\n // Linux\n return path.join(os.homedir(), '.config', 'windsurf', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n serverUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ZedMCPClient extends MCPClient {\n name = 'Zed';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n // Zed is available on macOS and Linux\n if (platform !== 'darwin' && platform !== 'linux') {\n return false;\n }\n\n // Check if Zed config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(os.homedir(), '.config', 'zed', 'settings.json');\n }\n\n // Linux\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return path.join(xdgConfigHome, 'zed', 'settings.json');\n }\n return path.join(os.homedir(), '.config', 'zed', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'context_servers';\n }\n\n /**\n * Zed only supports local stdio mode\n */\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n source: 'custom',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ClineMCPClient extends MCPClient {\n name = 'Cline';\n\n async isClientSupported(): Promise<boolean> {\n // Cline is a VS Code extension, check for its config directory\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.cline', 'mcp_settings.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n const baseConfig = {\n alwaysAllow: [\n 'index',\n 'search',\n 'manage_resource',\n 'nia_web_search',\n 'nia_deep_research_agent',\n ],\n disabled: false,\n };\n\n if (mode === 'remote') {\n return {\n ...baseConfig,\n type: 'streamableHttp',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n\n return {\n ...baseConfig,\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import { execSync, spawnSync } from 'child_process';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class CodexMCPClient extends MCPClient {\n name = 'Codex CLI';\n\n async isClientSupported(): Promise<boolean> {\n try {\n execSync('codex --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async getConfigPath(): Promise<string> {\n throw new Error('Codex CLI uses command-line configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const result = spawnSync('codex', ['mcp', 'list', '--json'], {\n encoding: 'utf-8',\n });\n\n if (result.error || result.status !== 0) {\n return false;\n }\n\n const stdout = result.stdout?.trim();\n if (!stdout) return false;\n\n const servers = JSON.parse(stdout) as Array<{ name: string }>;\n return servers.some((server) => server.name === SERVER_NAME);\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n _mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n // Codex only supports local mode\n const args = [\n 'mcp',\n 'add',\n SERVER_NAME,\n '--env',\n `NIA_API_KEY=${apiKey}`,\n '--env',\n `NIA_API_URL=${NIA_API_URL}`,\n '--',\n 'pipx',\n 'run',\n '--no-cache',\n 'nia-mcp-server',\n ];\n\n debug(`Running: codex ${args.join(' ')}`);\n const result = spawnSync('codex', args, { stdio: 'ignore' });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to add server to Codex CLI' };\n }\n\n return { success: true };\n }\n\n async removeServer(): Promise<MCPClientResult> {\n const result = spawnSync('codex', ['mcp', 'remove', SERVER_NAME], {\n stdio: 'ignore',\n });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to remove server from Codex CLI' };\n }\n\n return { success: true };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ContinueMCPClient extends MCPClient {\n name = 'Continue.dev';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n if (platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.continue', 'config.json');\n }\n return path.join(os.homedir(), '.continue', 'config.json');\n }\n\n getServerPropertyName(): string {\n return 'experimental';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n modelContextProtocolServer: {\n transport: {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n },\n },\n };\n }\n return {\n modelContextProtocolServer: {\n transport: {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n },\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class JetBrainsMCPClient extends MCPClient {\n name = 'JetBrains';\n\n async isClientSupported(): Promise<boolean> {\n // Check for common JetBrains config directories\n const homeDir = os.homedir();\n const possibleDirs = [\n path.join(homeDir, '.config', 'JetBrains'),\n path.join(homeDir, 'Library', 'Application Support', 'JetBrains'),\n ];\n return possibleDirs.some(dir => fs.existsSync(dir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.jetbrains', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // JetBrains only supports local\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class AntigravityMCPClient extends MCPClient {\n name = 'Google Antigravity';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.gemini', 'antigravity', 'mcp_config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n serverUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class TraeMCPClient extends MCPClient {\n name = 'Trae';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'darwin') {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Trae', 'User', 'mcp.json');\n }\n return path.join(os.homedir(), '.config', 'trae', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class RooCodeMCPClient extends MCPClient {\n name = 'Roo Code';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.roo-code', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'streamable-http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class KiloCodeMCPClient extends MCPClient {\n name = 'Kilo Code';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.kilocode', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'streamable-http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n alwaysAllow: [],\n disabled: false,\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n alwaysAllow: [],\n disabled: false,\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class GeminiCLIMCPClient extends MCPClient {\n name = 'Gemini CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.gemini', 'settings.json');\n }\n return path.join(os.homedir(), '.gemini', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n httpUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: 'application/json, text/event-stream',\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class OpencodeMCPClient extends MCPClient {\n name = 'Opencode';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.opencode', 'config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcp';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'remote',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n enabled: true,\n };\n }\n return {\n type: 'local',\n command: ['pipx', 'run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n enabled: true,\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class QodoGenMCPClient extends MCPClient {\n name = 'Qodo Gen';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.qodo', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class QwenCoderMCPClient extends MCPClient {\n name = 'Qwen Coder';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.qwen', 'settings.json');\n }\n return path.join(os.homedir(), '.qwen', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n httpUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: 'application/json, text/event-stream',\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class VisualStudioMCPClient extends MCPClient {\n name = 'Visual Studio 2022';\n\n async isClientSupported(): Promise<boolean> {\n // Visual Studio is Windows only\n if (process.platform !== 'win32') {\n return false;\n }\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.vs', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'servers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class CrushMCPClient extends MCPClient {\n name = 'Crush';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.crush', 'config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcp';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nconst COPILOT_TOOLS = ['index', 'search', 'manage_resource', 'nia_web_search', 'nia_deep_research_agent'];\n\nexport class CopilotCLIMCPClient extends MCPClient {\n name = 'Copilot CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.copilot', 'mcp-config.json');\n }\n return path.join(os.homedir(), '.copilot', 'mcp-config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n tools: COPILOT_TOOLS,\n };\n }\n return {\n type: 'local',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n tools: COPILOT_TOOLS,\n };\n }\n}\n\nexport class CopilotAgentMCPClient extends MCPClient {\n name = 'Copilot Coding Agent';\n\n async isClientSupported(): Promise<boolean> {\n // Check if .github directory exists (repo-level config)\n return fs.existsSync('.github');\n }\n\n async getConfigPath(): Promise<string> {\n return path.join('.github', 'copilot-mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n tools: COPILOT_TOOLS,\n };\n }\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n tools: COPILOT_TOOLS,\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class AugmentMCPClient extends MCPClient {\n name = 'Augment Code';\n\n async isClientSupported(): Promise<boolean> {\n // Augment is a VS Code extension, harder to detect\n return false; // User needs to configure manually\n }\n\n async getConfigPath(): Promise<string> {\n // Augment uses VS Code settings\n return path.join(os.homedir(), '.vscode', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'augment.advanced';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // Augment only supports local\n return {\n mcpServers: [\n {\n name: 'nia',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n },\n ],\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class KiroMCPClient extends MCPClient {\n name = 'Kiro';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.kiro', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n disabled: false,\n autoApprove: [],\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class LMStudioMCPClient extends MCPClient {\n name = 'LM Studio';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.lmstudio', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class BoltAIMCPClient extends MCPClient {\n name = 'BoltAI';\n\n async isClientSupported(): Promise<boolean> {\n if (process.platform !== 'darwin') {\n return false;\n }\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), 'Library', 'Application Support', 'BoltAI', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class PerplexityMCPClient extends MCPClient {\n name = 'Perplexity Desktop';\n\n async isClientSupported(): Promise<boolean> {\n if (process.platform !== 'darwin') {\n return false;\n }\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Perplexity', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // Perplexity has a different config format\n return {\n args: ['run', '--no-cache', 'nia-mcp-server'],\n command: 'pipx',\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class WarpMCPClient extends MCPClient {\n name = 'Warp';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.warp', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n working_directory: null,\n start_on_launch: true,\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class AmazonQMCPClient extends MCPClient {\n name = 'Amazon Q Developer CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.aws', 'amazonq', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import { execSync, spawnSync } from 'child_process';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class FactoryMCPClient extends MCPClient {\n name = 'Factory';\n\n async isClientSupported(): Promise<boolean> {\n try {\n execSync('droid --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async getConfigPath(): Promise<string> {\n throw new Error('Factory uses CLI configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const result = spawnSync('droid', ['mcp', 'list'], {\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n return result.stdout?.includes(SERVER_NAME) || false;\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n try {\n let args: string[];\n\n if (mode === 'remote') {\n args = [\n 'mcp', 'add', SERVER_NAME,\n REMOTE_MCP_URL,\n '--type', 'http',\n '--header', `Authorization: Bearer ${apiKey}`,\n ];\n } else {\n args = [\n 'mcp', 'add', SERVER_NAME,\n 'pipx run --no-cache nia-mcp-server',\n '--env', `NIA_API_KEY=${apiKey}`,\n '--env', `NIA_API_URL=${NIA_API_URL}`,\n ];\n }\n\n debug(`Running: droid ${args.join(' ')}`);\n const result = spawnSync('droid', args, { stdio: 'pipe' });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to add server to Factory' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n try {\n const result = spawnSync('droid', ['mcp', 'remove', SERVER_NAME], {\n stdio: 'pipe',\n });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to remove server from Factory' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n}\n","import { execSync, spawnSync } from 'child_process';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class AmpMCPClient extends MCPClient {\n name = 'Amp';\n\n async isClientSupported(): Promise<boolean> {\n try {\n execSync('amp --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async getConfigPath(): Promise<string> {\n throw new Error('Amp uses CLI configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const result = spawnSync('amp', ['mcp', 'list'], {\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n return result.stdout?.includes(SERVER_NAME) || false;\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n _mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n // Amp only supports remote\n try {\n const args = [\n 'mcp', 'add', SERVER_NAME,\n '--header', `Authorization=Bearer ${apiKey}`,\n REMOTE_MCP_URL,\n ];\n\n debug(`Running: amp ${args.join(' ')}`);\n const result = spawnSync('amp', args, { stdio: 'pipe' });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to add server to Amp' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n try {\n const result = spawnSync('amp', ['mcp', 'remove', SERVER_NAME], {\n stdio: 'pipe',\n });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to remove server from Amp' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n supportsLocal(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class VibeMCPClient extends MCPClient {\n name = 'Mistral Vibe CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n return fs.existsSync(configPath);\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.vibe', 'config.toml');\n }\n return path.join(os.homedir(), '.vibe', 'config.toml');\n }\n\n getServerPropertyName(): string {\n return 'mcp_servers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n if (!fs.existsSync(configPath)) {\n return false;\n }\n const content = await fs.promises.readFile(configPath, 'utf8');\n return content.includes('name = \"nia\"');\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n _mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n // Vibe only supports remote and uses TOML\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false, error: 'Vibe config not found' };\n }\n\n let content = await fs.promises.readFile(configPath, 'utf8');\n\n // Check if already configured\n if (content.includes('name = \"nia\"')) {\n debug('Nia already configured in Vibe');\n return { success: true };\n }\n\n // Remove empty mcp_servers array if present\n content = content.replace(/^mcp_servers = \\[\\]\\s*$/m, '');\n\n // Append Nia config\n const niaConfig = `\n[[mcp_servers]]\nname = \"${SERVER_NAME}\"\ntransport = \"streamable-http\"\nurl = \"${REMOTE_MCP_URL}\"\n\n[mcp_servers.headers]\nAuthorization = \"Bearer ${apiKey}\"\n`;\n\n content = content.trimEnd() + '\\n' + niaConfig;\n\n await fs.promises.writeFile(configPath, content, 'utf8');\n debug(`Wrote Vibe config to ${configPath}`);\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false, error: 'Vibe config not found' };\n }\n\n let content = await fs.promises.readFile(configPath, 'utf8');\n\n // Remove the Nia server block (TOML format)\n // This is a simple approach - may need refinement for complex configs\n const niaBlockRegex = /\\[\\[mcp_servers\\]\\]\\s*name\\s*=\\s*\"nia\"[\\s\\S]*?(?=\\[\\[|\\[(?!\\[)|$)/g;\n content = content.replace(niaBlockRegex, '');\n\n await fs.promises.writeFile(configPath, content.trimEnd() + '\\n', 'utf8');\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n supportsLocal(): boolean {\n return false;\n }\n}\n","import clack from '../../utils/clack.js';\nimport chalk from 'chalk';\nimport { abortIfCancelled } from '../../utils/clack-utils.js';\nimport { MCPClient } from './MCPClient.js';\nimport {\n // Core clients\n CursorMCPClient,\n ClaudeDesktopMCPClient,\n ClaudeCodeMCPClient,\n VSCodeMCPClient,\n WindsurfMCPClient,\n ZedMCPClient,\n ClineMCPClient,\n CodexMCPClient,\n // Additional clients\n ContinueMCPClient,\n JetBrainsMCPClient,\n AntigravityMCPClient,\n TraeMCPClient,\n RooCodeMCPClient,\n KiloCodeMCPClient,\n GeminiCLIMCPClient,\n OpencodeMCPClient,\n QodoGenMCPClient,\n QwenCoderMCPClient,\n VisualStudioMCPClient,\n CrushMCPClient,\n CopilotCLIMCPClient,\n CopilotAgentMCPClient,\n AugmentMCPClient,\n KiroMCPClient,\n LMStudioMCPClient,\n BoltAIMCPClient,\n PerplexityMCPClient,\n WarpMCPClient,\n AmazonQMCPClient,\n FactoryMCPClient,\n AmpMCPClient,\n VibeMCPClient,\n} from './clients/index.js';\nimport { debug } from '../../utils/debug.js';\n\nexport { MCPClient } from './MCPClient.js';\nexport * from './defaults.js';\n\n/**\n * Get all MCP clients that are supported on this system\n */\nexport async function getSupportedClients(): Promise<MCPClient[]> {\n const allClients: MCPClient[] = [\n // Core / popular clients first\n new CursorMCPClient(),\n new ClaudeCodeMCPClient(),\n new ClaudeDesktopMCPClient(),\n new VSCodeMCPClient(),\n new WindsurfMCPClient(),\n new ClineMCPClient(),\n new ContinueMCPClient(),\n new ZedMCPClient(),\n new JetBrainsMCPClient(),\n // Additional clients\n new AntigravityMCPClient(),\n new TraeMCPClient(),\n new RooCodeMCPClient(),\n new KiloCodeMCPClient(),\n new GeminiCLIMCPClient(),\n new OpencodeMCPClient(),\n new QodoGenMCPClient(),\n new QwenCoderMCPClient(),\n new VisualStudioMCPClient(),\n new CrushMCPClient(),\n new CopilotCLIMCPClient(),\n new CopilotAgentMCPClient(),\n new AugmentMCPClient(),\n new KiroMCPClient(),\n new LMStudioMCPClient(),\n new BoltAIMCPClient(),\n new PerplexityMCPClient(),\n new WarpMCPClient(),\n new AmazonQMCPClient(),\n new CodexMCPClient(),\n new FactoryMCPClient(),\n new AmpMCPClient(),\n new VibeMCPClient(),\n ];\n\n const supportedClients: MCPClient[] = [];\n\n debug('Checking for supported MCP clients...');\n for (const client of allClients) {\n const isSupported = await client.isClientSupported();\n debug(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);\n if (isSupported) {\n supportedClients.push(client);\n }\n }\n debug(\n `Found ${supportedClients.length} supported client(s): ${supportedClients\n .map((c) => c.name)\n .join(', ')}`,\n );\n\n return supportedClients;\n}\n\nexport interface AddMCPServerOptions {\n apiKey: string;\n mode: 'local' | 'remote';\n /** Skip prompts and install to all detected clients */\n ci?: boolean;\n}\n\n/**\n * Main step: Add MCP server to all supported clients\n */\nexport async function addMCPServerToClientsStep(\n options: AddMCPServerOptions,\n): Promise<string[]> {\n const { apiKey, mode, ci = false } = options;\n\n // Get supported clients\n const supportedClients = await getSupportedClients();\n\n if (supportedClients.length === 0) {\n clack.log.warn('No supported coding agents detected on this system.');\n clack.log.info(\n 'Supported agents: Cursor, Claude Code, Claude Desktop, VS Code, Windsurf, Cline, Continue, Zed, JetBrains, Antigravity, Trae, Roo Code, Kilo Code, Gemini CLI, Opencode, Qodo Gen, Qwen Coder, Visual Studio, Crush, Copilot CLI, Copilot Agent, Augment, Kiro, LM Studio, BoltAI, Perplexity, Warp, Amazon Q, Codex, Factory, Amp, Vibe',\n );\n return [];\n }\n\n // In CI mode, auto-select all clients\n let selectedClients: MCPClient[];\n\n if (ci) {\n selectedClients = supportedClients;\n clack.log.info(\n `Auto-selecting ${selectedClients.length} client(s): ${selectedClients.map((c) => c.name).join(', ')}`,\n );\n } else {\n // Let user select which clients to install to\n const selectedNames = await abortIfCancelled(\n clack.multiselect({\n message: 'Select which coding agents to install Nia to:',\n options: supportedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: supportedClients.map((client) => client.name),\n required: true,\n }),\n );\n\n selectedClients = supportedClients.filter((client) =>\n selectedNames.includes(client.name),\n );\n }\n\n if (selectedClients.length === 0) {\n clack.log.info('No clients selected.');\n return [];\n }\n\n // Check for existing installations\n const installedClients: MCPClient[] = [];\n for (const client of selectedClients) {\n if (await client.isServerInstalled()) {\n installedClients.push(client);\n }\n }\n\n // Handle reinstall\n if (installedClients.length > 0 && !ci) {\n clack.log.warn(\n `Nia is already configured for:\\n ${installedClients.map((c) => `• ${c.name}`).join('\\n ')}`,\n );\n\n const reinstall = await abortIfCancelled(\n clack.confirm({\n message: 'Reinstall to update configuration?',\n initialValue: true,\n }),\n );\n\n if (!reinstall) {\n // Remove already-installed clients from the list\n selectedClients = selectedClients.filter(\n (c) => !installedClients.includes(c),\n );\n\n if (selectedClients.length === 0) {\n clack.log.info('Nothing to install.');\n return [];\n }\n }\n }\n\n // Install to selected clients\n const spinner = clack.spinner();\n spinner.start('Installing Nia MCP server...');\n\n const successfulClients: string[] = [];\n const failedClients: { name: string; error: string }[] = [];\n\n for (const client of selectedClients) {\n const result = await client.addServer(apiKey, mode);\n\n if (result.success) {\n successfulClients.push(client.name);\n } else {\n failedClients.push({ name: client.name, error: result.error || 'Unknown error' });\n }\n }\n\n spinner.stop('Installation complete.');\n\n // Report results\n if (successfulClients.length > 0) {\n clack.log.success(\n `Installed Nia to:\\n ${successfulClients.map((n) => `• ${n}`).join('\\n ')}`,\n );\n }\n\n if (failedClients.length > 0) {\n clack.log.warn(\n `Failed to install to:\\n ${failedClients.map((f) => `• ${f.name}: ${f.error}`).join('\\n ')}`,\n );\n }\n\n return successfulClients;\n}\n\n/**\n * Remove MCP server from clients\n */\nexport async function removeMCPServerFromClientsStep(): Promise<string[]> {\n // Get clients where Nia is installed\n const supportedClients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of supportedClients) {\n if (await client.isServerInstalled()) {\n installedClients.push(client);\n }\n }\n\n if (installedClients.length === 0) {\n clack.log.info('Nia is not installed in any detected coding agents.');\n return [];\n }\n\n // Let user select which to remove from\n const selectedNames = await abortIfCancelled(\n clack.multiselect({\n message: 'Select which coding agents to remove Nia from:',\n options: installedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: installedClients.map((client) => client.name),\n required: true,\n }),\n );\n\n const selectedClients = installedClients.filter((client) =>\n selectedNames.includes(client.name),\n );\n\n if (selectedClients.length === 0) {\n return [];\n }\n\n // Remove from selected clients\n const spinner = clack.spinner();\n spinner.start('Removing Nia MCP server...');\n\n const removedClients: string[] = [];\n\n for (const client of selectedClients) {\n const result = await client.removeServer();\n if (result.success) {\n removedClients.push(client.name);\n }\n }\n\n spinner.stop('Removal complete.');\n\n if (removedClients.length > 0) {\n clack.log.success(\n `Removed Nia from:\\n ${removedClients.map((n) => `• ${n}`).join('\\n ')}`,\n );\n }\n\n return removedClients;\n}\n","import chalk from 'chalk';\nimport clack from './utils/clack.js';\nimport { printWelcome, getApiKey, askInstallMode } from './utils/clack-utils.js';\nimport { addMCPServerToClientsStep } from './steps/add-mcp-server-to-clients/index.js';\nimport { enableDebug } from './utils/debug.js';\nimport { ensureLocalDependencies, dependenciesReady } from './utils/dependencies.js';\nimport type { WizardOptions } from './utils/types.js';\n\n/**\n * Main wizard entry point\n */\nexport async function runWizard(options: WizardOptions): Promise<void> {\n if (options.debug) {\n enableDebug();\n }\n\n printWelcome();\n\n // Step 1: Get API key\n const apiKey = await getApiKey(options.apiKey);\n\n // Step 2: Select install mode\n let mode: 'local' | 'remote';\n if (options.local !== undefined) {\n mode = options.local ? 'local' : 'remote';\n clack.log.info(`Using ${mode} mode`);\n } else if (options.ci) {\n mode = 'local';\n clack.log.info('Using local mode (CI default)');\n } else {\n mode = await askInstallMode(true);\n }\n\n // Step 3: If local mode, ensure dependencies are installed\n if (mode === 'local') {\n if (!dependenciesReady()) {\n console.log('');\n const depsOk = await ensureLocalDependencies();\n if (!depsOk) {\n // Dependencies failed, offer to switch to remote\n clack.log.warn('Local mode requires additional dependencies.');\n const switchToRemote = await clack.confirm({\n message: 'Switch to remote mode instead?',\n initialValue: true,\n });\n \n if (switchToRemote) {\n mode = 'remote';\n clack.log.info('Switched to remote mode');\n } else {\n clack.outro(chalk.yellow('Please install dependencies and try again.'));\n process.exit(1);\n }\n }\n console.log('');\n } else {\n clack.log.success('Dependencies ready');\n }\n }\n\n // Step 4: Install to clients\n const installedClients = await addMCPServerToClientsStep({\n apiKey,\n mode,\n ci: options.ci,\n });\n\n // Outro\n if (installedClients.length > 0) {\n const outroMessage = `\n${chalk.green('✓ Nia MCP Server installed!')}\n\n${chalk.cyan('Next steps:')}\n 1. Restart your coding agent(s) to load Nia\n 2. Try asking: ${chalk.yellow('\"Index the React documentation\"')}\n 3. Or: ${chalk.yellow('\"Search the Chromium codebase for layout engine\"')}\n\n${chalk.dim('Learn more: https://docs.trynia.ai')}\n`;\n clack.outro(outroMessage);\n } else {\n clack.outro(chalk.dim('No changes made.'));\n }\n}\n","/**\n * Dependency management for local mode installation\n * Handles checking and installing pipx, Homebrew, etc.\n */\n\nimport { execSync, spawnSync } from 'child_process';\nimport os from 'os';\nimport clack from './clack.js';\nimport { abortIfCancelled } from './clack-utils.js';\nimport { debug } from './debug.js';\nimport chalk from 'chalk';\n\nconst isMacOS = process.platform === 'darwin';\nconst isWindows = process.platform === 'win32';\n\n/**\n * Check if a command exists in PATH\n */\nfunction commandExists(cmd: string): boolean {\n try {\n const result = spawnSync(isWindows ? 'where' : 'which', [cmd], {\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Run a shell command and return success/failure\n */\nfunction runCommand(cmd: string, options?: { silent?: boolean }): boolean {\n try {\n debug(`Running: ${cmd}`);\n execSync(cmd, {\n stdio: options?.silent ? 'pipe' : 'inherit',\n encoding: 'utf-8',\n });\n return true;\n } catch (error) {\n debug(`Command failed: ${cmd}`, error);\n return false;\n }\n}\n\n/**\n * Check if Homebrew is installed (macOS only)\n */\nexport function checkHomebrew(): boolean {\n if (!isMacOS) return true; // Not needed on other platforms\n \n // Check common locations\n if (commandExists('brew')) return true;\n \n // Check Apple Silicon location\n try {\n execSync('test -f /opt/homebrew/bin/brew', { stdio: 'pipe' });\n return true;\n } catch {}\n \n // Check Intel Mac location\n try {\n execSync('test -f /usr/local/bin/brew', { stdio: 'pipe' });\n return true;\n } catch {}\n \n return false;\n}\n\n/**\n * Install Homebrew (macOS only)\n */\nexport async function installHomebrew(): Promise<boolean> {\n if (!isMacOS) return true;\n \n clack.log.info('Homebrew is required for local mode on macOS.');\n \n const shouldInstall = await abortIfCancelled(\n clack.confirm({\n message: 'Install Homebrew? (This may take a few minutes)',\n initialValue: true,\n }),\n );\n \n if (!shouldInstall) {\n clack.log.warn('Homebrew is required for local mode. Switching to remote mode or install manually.');\n return false;\n }\n \n const spinner = clack.spinner();\n spinner.start('Installing Homebrew...');\n \n try {\n // Run Homebrew installer\n execSync(\n '/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"',\n { stdio: 'inherit' }\n );\n \n // Add to PATH for Apple Silicon\n if (process.arch === 'arm64') {\n try {\n execSync('eval \"$(/opt/homebrew/bin/brew shellenv)\"', { stdio: 'pipe' });\n } catch {}\n }\n \n spinner.stop('Homebrew installed!');\n return true;\n } catch (error) {\n spinner.stop('Failed to install Homebrew');\n clack.log.error('Homebrew installation failed. Please install manually: https://brew.sh');\n return false;\n }\n}\n\n/**\n * Check if pipx is installed\n */\nexport function checkPipx(): boolean {\n return commandExists('pipx');\n}\n\n/**\n * Check if Python 3 is installed\n */\nexport function checkPython(): boolean {\n return commandExists('python3') || commandExists('python');\n}\n\n/**\n * Install pipx\n */\nexport async function installPipx(): Promise<boolean> {\n clack.log.info('pipx is required for local mode (manages Python packages safely).');\n \n const shouldInstall = await abortIfCancelled(\n clack.confirm({\n message: 'Install pipx?',\n initialValue: true,\n }),\n );\n \n if (!shouldInstall) {\n clack.log.warn('pipx is required for local mode.');\n return false;\n }\n \n const spinner = clack.spinner();\n spinner.start('Installing pipx...');\n \n try {\n if (isMacOS) {\n // Try Homebrew first (preferred on macOS)\n if (checkHomebrew()) {\n if (runCommand('brew install pipx', { silent: true })) {\n runCommand('pipx ensurepath', { silent: true });\n spinner.stop('pipx installed via Homebrew!');\n return true;\n }\n }\n }\n \n // Fallback to pip\n if (checkPython()) {\n const pythonCmd = commandExists('python3') ? 'python3' : 'python';\n if (runCommand(`${pythonCmd} -m pip install --user pipx`, { silent: true })) {\n runCommand(`${pythonCmd} -m pipx ensurepath`, { silent: true });\n spinner.stop('pipx installed via pip!');\n return true;\n }\n }\n \n spinner.stop('Failed to install pipx');\n clack.log.error('Could not install pipx automatically.');\n clack.log.info('Please install manually: https://pipx.pypa.io/stable/installation/');\n return false;\n } catch (error) {\n spinner.stop('Failed to install pipx');\n debug('pipx installation error:', error);\n return false;\n }\n}\n\n/**\n * Ensure all dependencies for local mode are installed\n * Returns true if all dependencies are ready, false otherwise\n */\nexport async function ensureLocalDependencies(): Promise<boolean> {\n clack.log.step('Checking dependencies for local mode...');\n \n // Check Homebrew (macOS only)\n if (isMacOS) {\n if (!checkHomebrew()) {\n clack.log.warn('Homebrew not found');\n const installed = await installHomebrew();\n if (!installed) return false;\n } else {\n clack.log.success('Homebrew found');\n }\n }\n \n // Check Python\n if (!checkPython()) {\n clack.log.warn('Python 3 not found');\n \n if (isMacOS && checkHomebrew()) {\n const shouldInstall = await abortIfCancelled(\n clack.confirm({\n message: 'Install Python 3 via Homebrew?',\n initialValue: true,\n }),\n );\n \n if (shouldInstall) {\n const spinner = clack.spinner();\n spinner.start('Installing Python 3...');\n if (runCommand('brew install python3', { silent: true })) {\n spinner.stop('Python 3 installed!');\n } else {\n spinner.stop('Failed to install Python 3');\n return false;\n }\n } else {\n return false;\n }\n } else {\n clack.log.error('Python 3 is required. Please install from https://python.org');\n return false;\n }\n } else {\n clack.log.success('Python found');\n }\n \n // Check pipx\n if (!checkPipx()) {\n clack.log.warn('pipx not found');\n const installed = await installPipx();\n if (!installed) return false;\n } else {\n clack.log.success('pipx found');\n }\n \n // Verify nia-mcp-server can be run\n clack.log.step('Installing/upgrading nia-mcp-server...');\n const spinner = clack.spinner();\n spinner.start('Setting up nia-mcp-server...');\n \n try {\n // Check if already installed\n const listResult = spawnSync('pipx', ['list'], { encoding: 'utf-8', stdio: 'pipe' });\n const isInstalled = listResult.stdout?.includes('nia-mcp-server');\n \n if (isInstalled) {\n // Upgrade existing installation\n runCommand('pipx upgrade nia-mcp-server', { silent: true });\n spinner.stop('nia-mcp-server upgraded!');\n } else {\n // Fresh install\n if (runCommand('pipx install nia-mcp-server', { silent: true })) {\n spinner.stop('nia-mcp-server installed!');\n } else {\n spinner.stop('Failed to install nia-mcp-server');\n clack.log.warn('Could not pre-install nia-mcp-server. It will be installed on first run.');\n }\n }\n } catch {\n spinner.stop('nia-mcp-server will be installed on first run');\n }\n \n console.log('');\n clack.log.success(chalk.green('All dependencies ready!'));\n return true;\n}\n\n/**\n * Check if dependencies are already satisfied (quick check)\n */\nexport function dependenciesReady(): boolean {\n if (isMacOS && !checkHomebrew()) return false;\n if (!checkPython()) return false;\n if (!checkPipx()) return false;\n return true;\n}\n","import chalk from 'chalk';\nimport clack from './utils/clack.js';\nimport {\n addMCPServerToClientsStep,\n removeMCPServerFromClientsStep,\n} from './steps/add-mcp-server-to-clients/index.js';\nimport { getApiKey, askInstallMode } from './utils/clack-utils.js';\nimport { enableDebug } from './utils/debug.js';\nimport { ensureLocalDependencies, dependenciesReady } from './utils/dependencies.js';\n\nexport interface MCPAddOptions {\n apiKey?: string;\n local?: boolean;\n debug?: boolean;\n ci?: boolean;\n}\n\n/**\n * Add Nia MCP server to coding agents\n */\nexport async function runMCPAdd(options: MCPAddOptions): Promise<void> {\n if (options.debug) {\n enableDebug();\n }\n\n clack.intro(chalk.bgCyan.black(' Nia MCP Server '));\n\n // Get API key\n const apiKey = await getApiKey(options.apiKey);\n\n // Get install mode\n let mode: 'local' | 'remote';\n if (options.local !== undefined) {\n mode = options.local ? 'local' : 'remote';\n clack.log.info(`Using ${mode} mode`);\n } else if (options.ci) {\n mode = 'local'; // Default to local in CI\n clack.log.info('Using local mode (CI default)');\n } else {\n mode = await askInstallMode(true);\n }\n\n // If local mode, ensure dependencies are installed\n if (mode === 'local') {\n if (!dependenciesReady()) {\n console.log('');\n const depsOk = await ensureLocalDependencies();\n if (!depsOk) {\n // Dependencies failed, offer to switch to remote\n clack.log.warn('Local mode requires additional dependencies.');\n const switchToRemote = await clack.confirm({\n message: 'Switch to remote mode instead?',\n initialValue: true,\n });\n \n if (switchToRemote) {\n mode = 'remote';\n clack.log.info('Switched to remote mode');\n } else {\n clack.outro(chalk.yellow('Please install dependencies and try again.'));\n process.exit(1);\n }\n }\n console.log('');\n } else {\n clack.log.success('Dependencies ready');\n }\n }\n\n // Run installation\n const installedClients = await addMCPServerToClientsStep({\n apiKey,\n mode,\n ci: options.ci,\n });\n\n if (installedClients.length > 0) {\n clack.log.message(\n chalk.dim('You may need to restart your coding agents to load Nia.'),\n );\n }\n\n clack.outro(chalk.green('Done!'));\n}\n\n/**\n * Remove Nia MCP server from coding agents\n */\nexport async function runMCPRemove(options: { debug?: boolean } = {}): Promise<void> {\n if (options.debug) {\n enableDebug();\n }\n\n clack.intro(chalk.bgRed.white(' Remove Nia MCP Server '));\n\n const removedClients = await removeMCPServerFromClientsStep();\n\n if (removedClients.length > 0) {\n clack.log.message(\n chalk.dim('You may need to restart your coding agents for changes to take effect.'),\n );\n }\n\n clack.outro(chalk.green('Done!'));\n}\n"],"mappings":"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","names":["isCancel","isCancel","path","fs","path","os","fs","fs","os","path","path","os","fs","path","os","fs","path","os","fs","path","os","fs","execSync","execSync","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","execSync","spawnSync","execSync","spawnSync","execSync","spawnSync","execSync","spawnSync","path","os","fs","chalk","execSync","spawnSync","chalk","spawnSync","execSync","spinner","chalk","chalk","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/debug.ts","../src/utils/device-flow.ts","../src/steps/add-mcp-server-to-clients/MCPClient.ts","../src/steps/add-mcp-server-to-clients/defaults.ts","../src/utils/clack.ts","../src/utils/clack-utils.ts","../src/steps/add-mcp-server-to-clients/clients/cursor.ts","../src/steps/add-mcp-server-to-clients/clients/claude-desktop.ts","../src/steps/add-mcp-server-to-clients/clients/claude-code.ts","../src/steps/add-mcp-server-to-clients/clients/vscode.ts","../src/steps/add-mcp-server-to-clients/clients/windsurf.ts","../src/steps/add-mcp-server-to-clients/clients/zed.ts","../src/steps/add-mcp-server-to-clients/clients/cline.ts","../src/steps/add-mcp-server-to-clients/clients/codex.ts","../src/steps/add-mcp-server-to-clients/clients/continue.ts","../src/steps/add-mcp-server-to-clients/clients/jetbrains.ts","../src/steps/add-mcp-server-to-clients/clients/antigravity.ts","../src/steps/add-mcp-server-to-clients/clients/trae.ts","../src/steps/add-mcp-server-to-clients/clients/roo-code.ts","../src/steps/add-mcp-server-to-clients/clients/kilo-code.ts","../src/steps/add-mcp-server-to-clients/clients/gemini-cli.ts","../src/steps/add-mcp-server-to-clients/clients/opencode.ts","../src/steps/add-mcp-server-to-clients/clients/qodo-gen.ts","../src/steps/add-mcp-server-to-clients/clients/qwen-coder.ts","../src/steps/add-mcp-server-to-clients/clients/visual-studio.ts","../src/steps/add-mcp-server-to-clients/clients/crush.ts","../src/steps/add-mcp-server-to-clients/clients/copilot.ts","../src/steps/add-mcp-server-to-clients/clients/augment.ts","../src/steps/add-mcp-server-to-clients/clients/kiro.ts","../src/steps/add-mcp-server-to-clients/clients/lm-studio.ts","../src/steps/add-mcp-server-to-clients/clients/bolt-ai.ts","../src/steps/add-mcp-server-to-clients/clients/perplexity.ts","../src/steps/add-mcp-server-to-clients/clients/warp.ts","../src/steps/add-mcp-server-to-clients/clients/amazon-q.ts","../src/steps/add-mcp-server-to-clients/clients/factory.ts","../src/steps/add-mcp-server-to-clients/clients/amp.ts","../src/steps/add-mcp-server-to-clients/clients/vibe.ts","../src/steps/add-mcp-server-to-clients/index.ts","../src/run.ts","../src/utils/dependencies.ts","../src/mcp.ts"],"sourcesContent":["let debugEnabled = false;\n\nexport function enableDebug(): void {\n debugEnabled = true;\n}\n\nexport function debug(...args: unknown[]): void {\n if (debugEnabled) {\n console.log('[DEBUG]', ...args);\n }\n}\n","/**\n * Device Authorization Flow for CLI onboarding\n * \n * This implements a device authorization flow similar to OAuth Device Flow,\n * allowing the CLI to obtain API keys through browser-based authentication.\n * \n * Flow:\n * 1. CLI calls /public/mcp-device/start to get session + user code\n * 2. CLI opens browser to verification URL\n * 3. User signs in and authorizes in browser\n * 4. CLI exchanges session for API key via /public/mcp-device/exchange\n */\n\nimport { debug } from './debug.js';\n\n// Backend API URL\nconst BACKEND_URL = process.env.NIA_BACKEND_URL || 'https://apigcp.trynia.ai';\n// App URL for browser - if set locally, override backend's verification_url\nconst APP_URL = process.env.NIA_APP_URL || '';\n\n// Session expiry (matches backend: 15 minutes)\nconst SESSION_TTL_MS = 15 * 60 * 1000;\n\nexport interface DeviceSession {\n authorization_session_id: string;\n user_code: string;\n verification_url: string;\n expires_at: string;\n}\n\nexport interface DeviceFlowError {\n type: 'network' | 'expired' | 'not_ready' | 'consumed' | 'invalid' | 'unknown';\n message: string;\n detail?: string;\n}\n\n/**\n * Start a new device authorization session\n */\nexport async function startDeviceSession(): Promise<DeviceSession> {\n debug('Starting device session...');\n \n const response = await fetch(`${BACKEND_URL}/public/mcp-device/start`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n debug(`Failed to start device session: ${response.status} - ${errorText}`);\n \n if (response.status === 429) {\n throw createError('network', 'Too many requests. Please wait a moment and try again.');\n }\n \n throw createError('network', `Failed to connect to Nia servers: ${response.status}`);\n }\n\n const data = (await response.json()) as {\n authorization_session_id: string;\n user_code: string;\n verification_url: string;\n expires_at: string;\n };\n debug(`Device session started: code=${data.user_code}`);\n \n // Construct the verification URL to use /cli-onboarding for full experience\n // (org creation, GitHub connect, etc.) instead of /cli-auth which skips it\n let verificationUrl: string;\n if (APP_URL) {\n // Local dev - use local app URL\n verificationUrl = `${APP_URL}/cli-onboarding?code=${data.user_code}`;\n debug(`Using local APP_URL for verification: ${verificationUrl}`);\n } else {\n // Production - override backend's /cli-auth with /cli-onboarding\n verificationUrl = data.verification_url.replace('/cli-auth?', '/cli-onboarding?');\n debug(`Using cli-onboarding URL: ${verificationUrl}`);\n }\n \n return {\n authorization_session_id: data.authorization_session_id,\n user_code: data.user_code,\n verification_url: verificationUrl,\n expires_at: data.expires_at,\n };\n}\n\n/**\n * Exchange a device session for an API key\n * \n * This should be called after the user has completed authorization in the browser.\n * Returns the API key on success, or throws a DeviceFlowError.\n */\nexport async function exchangeForApiKey(\n session: DeviceSession,\n): Promise<string> {\n debug('Exchanging device session for API key...');\n \n // Check if session has expired locally first\n const expiresAt = new Date(session.expires_at).getTime();\n if (Date.now() > expiresAt) {\n throw createError('expired', 'Session has expired. Please run the setup again.');\n }\n \n const response = await fetch(`${BACKEND_URL}/public/mcp-device/exchange`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n authorization_session_id: session.authorization_session_id,\n user_code: session.user_code,\n }),\n });\n\n if (!response.ok) {\n const errorData = (await response.json().catch(() => ({ detail: 'Unknown error' }))) as { detail?: string };\n const detail = errorData.detail || `HTTP ${response.status}`;\n debug(`Exchange failed: ${response.status} - ${detail}`);\n \n // Map HTTP status to error type\n switch (response.status) {\n case 400:\n // Check if it's a \"not ready\" error\n if (detail.includes('not yet authorized') || detail.includes('pending')) {\n throw createError('not_ready', 'Session not yet authorized. Complete the setup in your browser first.', detail);\n }\n if (detail.includes('complete the setup') || detail.includes('authorized')) {\n throw createError('not_ready', 'Please complete the setup in your browser first (sign in, etc.).', detail);\n }\n throw createError('invalid', detail);\n \n case 404:\n throw createError('invalid', 'Invalid session or code. Please run the setup again.');\n \n case 409:\n throw createError('consumed', 'This session has already been used. Please run the setup again.');\n \n case 410:\n throw createError('expired', 'Session has expired. Please run the setup again.');\n \n default:\n throw createError('unknown', `Failed to get API key: ${detail}`);\n }\n }\n\n const data = (await response.json()) as { api_key?: string };\n \n if (!data.api_key) {\n throw createError('unknown', 'Server did not return an API key');\n }\n \n debug('Successfully obtained API key');\n return data.api_key;\n}\n\n/**\n * Check if a session is still valid (not expired)\n */\nexport function isSessionValid(session: DeviceSession): boolean {\n const expiresAt = new Date(session.expires_at).getTime();\n // Add a small buffer (30 seconds) to account for network latency\n return Date.now() < expiresAt - 30000;\n}\n\n/**\n * Get the remaining time until session expires (in seconds)\n */\nexport function getSessionTimeRemaining(session: DeviceSession): number {\n const expiresAt = new Date(session.expires_at).getTime();\n const remaining = Math.max(0, expiresAt - Date.now());\n return Math.floor(remaining / 1000);\n}\n\n/**\n * Format the user code for display (e.g., \"ABCD-EFGH\")\n */\nexport function formatUserCode(code: string): string {\n return code.toUpperCase();\n}\n\n/**\n * Create a typed error object\n */\nfunction createError(\n type: DeviceFlowError['type'],\n message: string,\n detail?: string,\n): DeviceFlowError {\n return { type, message, detail };\n}\n\n/**\n * Check if an error is a DeviceFlowError\n */\nexport function isDeviceFlowError(error: unknown): error is DeviceFlowError {\n return (\n typeof error === 'object' &&\n error !== null &&\n 'type' in error &&\n 'message' in error\n );\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport * as jsonc from 'jsonc-parser';\nimport { getDefaultServerConfig } from './defaults.js';\nimport type { MCPServerConfig, MCPClientResult } from '../../utils/types.js';\nimport { debug } from '../../utils/debug.js';\n\nexport const SERVER_NAME = 'nia';\n\nexport abstract class MCPClient {\n abstract name: string;\n abstract getConfigPath(): Promise<string>;\n abstract getServerPropertyName(): string;\n abstract isClientSupported(): Promise<boolean>;\n\n /**\n * Check if server is already installed\n */\n async isServerInstalled(): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return false;\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const config = jsonc.parse(configContent) as Record<string, unknown>;\n const serverProp = this.getServerPropertyName();\n\n return (\n serverProp in config &&\n typeof config[serverProp] === 'object' &&\n config[serverProp] !== null &&\n SERVER_NAME in (config[serverProp] as Record<string, unknown>)\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Get the server config for this client\n */\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n return getDefaultServerConfig(apiKey, mode);\n }\n\n /**\n * Add the MCP server to this client\n */\n async addServer(\n apiKey: string,\n mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n try {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n // Ensure directory exists\n await fs.promises.mkdir(configDir, { recursive: true });\n\n const serverProp = this.getServerPropertyName();\n let configContent = '';\n let existingConfig: Record<string, unknown> = {};\n\n // Read existing config if it exists\n if (fs.existsSync(configPath)) {\n configContent = await fs.promises.readFile(configPath, 'utf8');\n existingConfig = (jsonc.parse(configContent) as Record<string, unknown>) || {};\n }\n\n // Get the new server config\n const newServerConfig = this.getServerConfig(apiKey, mode);\n\n // Use JSONC to safely modify the config (preserves comments)\n const edits = jsonc.modify(\n configContent,\n [serverProp, SERVER_NAME],\n newServerConfig,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n debug(`Wrote config to ${configPath}`);\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n debug(`Failed to add server: ${message}`);\n return { success: false, error: message };\n }\n }\n\n /**\n * Remove the MCP server from this client\n */\n async removeServer(): Promise<MCPClientResult> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false, error: 'Config file not found' };\n }\n\n const configContent = await fs.promises.readFile(configPath, 'utf8');\n const serverProp = this.getServerPropertyName();\n\n // Remove the server entry\n const edits = jsonc.modify(\n configContent,\n [serverProp, SERVER_NAME],\n undefined,\n {\n formattingOptions: {\n tabSize: 2,\n insertSpaces: true,\n },\n },\n );\n\n const modifiedContent = jsonc.applyEdits(configContent, edits);\n await fs.promises.writeFile(configPath, modifiedContent, 'utf8');\n\n debug(`Removed server from ${configPath}`);\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n}\n","import { z } from 'zod';\n\n// Remote MCP endpoint - use env vars for local dev, prod as default\nexport const REMOTE_MCP_URL = process.env.NIA_REMOTE_MCP_URL || 'https://apigcp.trynia.ai/mcp';\nexport const NIA_API_URL = process.env.NIA_API_URL || 'https://apigcp.trynia.ai/';\n\nexport const DefaultMCPClientConfig = z\n .object({\n mcpServers: z.record(\n z.string(),\n z.union([\n z.object({\n command: z.string().optional(),\n args: z.array(z.string()).optional(),\n env: z.record(z.string(), z.string()).optional(),\n }),\n z.object({\n url: z.string(),\n headers: z.record(z.string(), z.string()).optional(),\n }),\n ]),\n ),\n })\n .passthrough();\n\n/**\n * Build MCP URL with optional parameters\n */\nexport function buildMCPUrl(local?: boolean): string {\n if (local) {\n return 'http://localhost:8787/mcp';\n }\n return REMOTE_MCP_URL;\n}\n\n/**\n * Get server config for remote HTTP mode\n */\nexport function getRemoteServerConfig(apiKey: string) {\n return {\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n}\n\n/**\n * Get server config for local stdio mode\n */\nexport function getLocalServerConfig(apiKey: string) {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n}\n\n/**\n * Get the default server config based on mode\n */\nexport function getDefaultServerConfig(\n apiKey: string,\n mode: 'local' | 'remote',\n) {\n if (mode === 'remote') {\n return getRemoteServerConfig(apiKey);\n }\n return getLocalServerConfig(apiKey);\n}\n","import * as clack from '@clack/prompts';\n\nexport default clack;\n\nexport function isCancel(value: unknown): value is symbol {\n return clack.isCancel(value);\n}\n","import clack, { isCancel } from './clack.js';\nimport chalk from 'chalk';\nimport open from 'open';\nimport {\n startDeviceSession,\n exchangeForApiKey,\n formatUserCode,\n isSessionValid,\n getSessionTimeRemaining,\n isDeviceFlowError,\n type DeviceSession,\n} from './device-flow.js';\nimport { debug } from './debug.js';\n\n// Use env var for local dev, prod as default\nconst NIA_APP_URL = process.env.NIA_APP_URL || 'https://app.trynia.ai';\n\nexport async function abortIfCancelled<T>(\n input: T | Promise<T>,\n): Promise<Exclude<T, symbol>> {\n const result = await input;\n\n if (isCancel(result)) {\n clack.cancel('Setup cancelled.');\n process.exit(0);\n }\n\n return result as Exclude<T, symbol>;\n}\n\nexport async function abort(message?: string, code = 1): Promise<never> {\n clack.outro(message ?? 'Setup cancelled.');\n process.exit(code);\n}\n\nexport function printWelcome(): void {\n console.log('');\n clack.intro(chalk.bgCyan.black(' Nia MCP Wizard '));\n clack.note(\n 'This wizard will install the Nia MCP server to your coding agents.\\nGet external docs, code search, and research tools in your IDE.',\n );\n}\n\n/**\n * Get API key from user - either passed as arg, via device flow, or manual entry\n */\nexport async function getApiKey(providedKey?: string): Promise<string> {\n // If key provided and valid, use it\n if (providedKey && providedKey.startsWith('nk_')) {\n clack.log.success('Using provided API key');\n return providedKey;\n }\n\n // Invalid key format\n if (providedKey && !providedKey.startsWith('nk_')) {\n clack.log.warn(`Invalid API key format. Keys should start with 'nk_'`);\n }\n\n // No key - offer device flow or manual entry\n clack.log.info('You need a Nia API key to continue.');\n\n const authMethod = await abortIfCancelled(\n clack.select({\n message: 'How would you like to authenticate?',\n options: [\n {\n value: 'browser' as const,\n label: 'Sign in with browser',\n hint: 'Recommended. Opens browser for quick sign-in.',\n },\n {\n value: 'manual' as const,\n label: 'Enter API key manually',\n hint: 'If you already have an API key.',\n },\n ],\n initialValue: 'browser' as const,\n }),\n );\n\n if (authMethod === 'browser') {\n return await runDeviceFlow();\n } else {\n return await promptForManualApiKey();\n }\n}\n\n/**\n * Run the device authorization flow\n */\nasync function runDeviceFlow(): Promise<string> {\n const spinner = clack.spinner();\n \n // Step 1: Start device session\n spinner.start('Connecting to Nia...');\n \n let session: DeviceSession;\n try {\n session = await startDeviceSession();\n spinner.stop('Connected!');\n } catch (error) {\n spinner.stop('Failed to connect');\n \n if (isDeviceFlowError(error)) {\n clack.log.error(error.message);\n } else {\n clack.log.error('Failed to connect to Nia servers. Check your internet connection.');\n debug(`Device flow error: ${error}`);\n }\n \n // Fall back to manual entry\n clack.log.info('Falling back to manual API key entry.');\n return await promptForManualApiKey();\n }\n\n // Step 2: Display the code and open browser\n const formattedCode = formatUserCode(session.user_code);\n const timeRemaining = getSessionTimeRemaining(session);\n \n console.log('');\n clack.note(\n `${chalk.bold('Your authorization code:')}\\n\\n` +\n ` ${chalk.bold.green(formattedCode)}\\n\\n` +\n chalk.dim(`Code expires in ${Math.floor(timeRemaining / 60)} minutes`),\n 'Browser Authorization'\n );\n \n // Open browser\n clack.log.info(`Opening ${chalk.cyan(session.verification_url)}...`);\n \n try {\n await open(session.verification_url);\n } catch {\n clack.log.warn('Could not open browser automatically.');\n }\n \n console.log('');\n clack.log.message(\n chalk.dim('If the browser didn\\'t open, go to:\\n') +\n ` ${chalk.cyan(session.verification_url)}`\n );\n \n // Step 3: Show instructions\n console.log('');\n clack.log.step(chalk.yellow('Complete these steps in your browser:'));\n console.log(' 1. Sign in or create an account');\n console.log(' 2. The CLI will be authorized automatically');\n console.log('');\n\n // Step 4: Wait for user and exchange\n return await waitForAuthorizationAndExchange(session);\n}\n\n/**\n * Wait for user to complete browser auth, then exchange for API key\n */\nasync function waitForAuthorizationAndExchange(session: DeviceSession): Promise<string> {\n // Loop until successful exchange or user cancels\n while (true) {\n // Check session validity\n if (!isSessionValid(session)) {\n clack.log.error('Session has expired. Please start over.');\n return abort('Session expired', 1);\n }\n\n // Prompt user to continue\n const shouldContinue = await abortIfCancelled(\n clack.confirm({\n message: 'Press Enter once you\\'ve signed in (or N to enter key manually)',\n initialValue: true,\n }),\n );\n\n if (!shouldContinue) {\n // User chose manual entry\n return await promptForManualApiKey();\n }\n\n // Try to exchange\n const spinner = clack.spinner();\n spinner.start('Checking authorization...');\n\n try {\n const apiKey = await exchangeForApiKey(session);\n spinner.stop(chalk.green('✓ Authorized!'));\n \n clack.log.success('API key obtained successfully!');\n return apiKey;\n } catch (error) {\n spinner.stop('Not ready yet');\n \n if (isDeviceFlowError(error)) {\n switch (error.type) {\n case 'not_ready':\n clack.log.warn('Browser authorization not complete yet.');\n console.log('');\n clack.log.message(\n chalk.dim('Make sure you have:\\n') +\n ' • Signed in to your Nia account\\n' +\n ' • Completed any setup steps in the browser'\n );\n console.log('');\n // Continue loop - let user try again\n break;\n \n case 'expired':\n clack.log.error('Session has expired.');\n clack.log.info('Please run the wizard again to start a new session.');\n return abort('Session expired', 1);\n \n case 'consumed':\n clack.log.error('This session was already used.');\n clack.log.info('Please run the wizard again to start a new session.');\n return abort('Session already used', 1);\n \n case 'invalid':\n clack.log.error(error.message);\n clack.log.info('Please run the wizard again to start a new session.');\n return abort('Invalid session', 1);\n \n default:\n clack.log.error(error.message);\n clack.log.info('Falling back to manual API key entry.');\n return await promptForManualApiKey();\n }\n } else {\n clack.log.error('An unexpected error occurred.');\n debug(`Exchange error: ${error}`);\n clack.log.info('Falling back to manual API key entry.');\n return await promptForManualApiKey();\n }\n }\n }\n}\n\n/**\n * Prompt user to manually enter their API key\n */\nasync function promptForManualApiKey(): Promise<string> {\n const shouldOpen = await abortIfCancelled(\n clack.confirm({\n message: `Open ${chalk.cyan(NIA_APP_URL)} to get your API key?`,\n initialValue: true,\n }),\n );\n\n if (shouldOpen) {\n clack.log.info(`Opening ${chalk.cyan(NIA_APP_URL)}...`);\n try {\n await open(NIA_APP_URL);\n } catch {\n clack.log.warn('Could not open browser. Please go to the URL manually.');\n }\n } else {\n clack.log.info(`Get your API key at: ${chalk.cyan(NIA_APP_URL)}`);\n }\n\n const apiKey = await abortIfCancelled(\n clack.text({\n message: 'Paste your API key (nk_...):',\n placeholder: 'nk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',\n validate: (value) => {\n if (!value) return 'API key is required';\n if (!value.startsWith('nk_')) return \"API key should start with 'nk_'\";\n if (value.length < 10) return 'API key is too short';\n return undefined;\n },\n }),\n );\n\n return apiKey;\n}\n\n/**\n * Ask user to select installation mode\n */\nexport async function askInstallMode(\n defaultLocal = true,\n): Promise<'local' | 'remote'> {\n const mode = await abortIfCancelled(\n clack.select({\n message: 'Select installation mode:',\n options: [\n {\n value: 'local' as const,\n label: 'Local',\n hint: 'Requires pipx to be installed',\n },\n {\n value: 'remote' as const,\n label: 'Remote',\n },\n ],\n initialValue: defaultLocal ? 'local' : 'remote',\n }),\n );\n\n return mode;\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { getRemoteServerConfig } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class CursorMCPClient extends MCPClient {\n name = 'Cursor';\n\n async isClientSupported(): Promise<boolean> {\n // Cursor is available on macOS and Windows\n const platform = process.platform;\n if (platform !== 'darwin' && platform !== 'win32') {\n return false;\n }\n\n // Check if Cursor config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n // Check if parent .cursor directory exists (indicates Cursor is/was installed)\n return fs.existsSync(path.dirname(configDir)) || fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.cursor', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n /**\n * Cursor supports native HTTP transport, so we use URL-based config for remote\n */\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return getRemoteServerConfig(apiKey);\n }\n // Local mode uses stdio\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: 'https://apigcp.trynia.ai/',\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ClaudeDesktopMCPClient extends MCPClient {\n name = 'Claude Desktop';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n if (platform !== 'darwin' && platform !== 'win32') {\n return false;\n }\n\n // Check if Claude Desktop config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(\n os.homedir(),\n 'Library',\n 'Application Support',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n if (platform === 'win32') {\n return path.join(\n process.env.APPDATA || '',\n 'Claude',\n 'claude_desktop_config.json',\n );\n }\n\n throw new Error(`Unsupported platform: ${platform}`);\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n /**\n * Claude Desktop only supports stdio (local) mode\n */\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // Claude Desktop doesn't support remote HTTP, always use local\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: 'https://apigcp.trynia.ai/',\n },\n };\n }\n\n /**\n * Claude Desktop only supports local mode\n */\n supportsRemote(): boolean {\n return false;\n }\n}\n","import { execSync } from 'child_process';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class ClaudeCodeMCPClient extends MCPClient {\n name = 'Claude Code';\n private claudeBinaryPath: string | null = null;\n\n async isClientSupported(): Promise<boolean> {\n try {\n const binary = this.findClaudeBinary();\n if (!binary) {\n debug('Claude Code CLI not found');\n return false;\n }\n\n execSync(`${binary} --version`, { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n }\n\n private findClaudeBinary(): string | null {\n if (this.claudeBinaryPath) {\n return this.claudeBinaryPath;\n }\n\n const possiblePaths = [\n path.join(os.homedir(), '.claude', 'local', 'claude'),\n '/usr/local/bin/claude',\n '/opt/homebrew/bin/claude',\n ];\n\n for (const claudePath of possiblePaths) {\n if (fs.existsSync(claudePath)) {\n debug(`Found claude binary at: ${claudePath}`);\n this.claudeBinaryPath = claudePath;\n return claudePath;\n }\n }\n\n // Try PATH as fallback\n try {\n execSync('command -v claude', { stdio: 'pipe' });\n this.claudeBinaryPath = 'claude';\n return 'claude';\n } catch {\n return null;\n }\n }\n\n async getConfigPath(): Promise<string> {\n // Claude Code uses CLI, not a config file\n throw new Error('Claude Code uses CLI for configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const binary = this.findClaudeBinary();\n if (!binary) return false;\n\n const output = execSync(`${binary} mcp list`, { stdio: 'pipe' });\n return output.toString().includes(SERVER_NAME);\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n const binary = this.findClaudeBinary();\n if (!binary) {\n return { success: false, error: 'Claude Code CLI not found' };\n }\n\n try {\n let command: string;\n\n if (mode === 'remote') {\n // Remote HTTP mode\n command = `${binary} mcp add --transport http ${SERVER_NAME} ${REMOTE_MCP_URL} --header \"Authorization: Bearer ${apiKey}\" -s user`;\n } else {\n // Local stdio mode\n command = `${binary} mcp add ${SERVER_NAME} -e \"NIA_API_KEY=${apiKey}\" -e \"NIA_API_URL=${NIA_API_URL}\" -s user -- pipx run --no-cache nia-mcp-server`;\n }\n\n debug(`Running: ${command}`);\n execSync(command, { stdio: 'pipe' });\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n const binary = this.findClaudeBinary();\n if (!binary) {\n return { success: false, error: 'Claude Code CLI not found' };\n }\n\n try {\n const command = `${binary} mcp remove --scope user ${SERVER_NAME}`;\n debug(`Running: ${command}`);\n execSync(command, { stdio: 'pipe' });\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class VSCodeMCPClient extends MCPClient {\n name = 'VS Code';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n // VS Code is available on all platforms\n if (platform !== 'darwin' && platform !== 'win32' && platform !== 'linux') {\n return false;\n }\n\n // Check if VS Code config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(\n os.homedir(),\n 'Library',\n 'Application Support',\n 'Code',\n 'User',\n 'mcp.json',\n );\n }\n\n if (platform === 'win32') {\n return path.join(\n process.env.APPDATA || '',\n 'Code',\n 'User',\n 'mcp.json',\n );\n }\n\n // Linux\n return path.join(os.homedir(), '.config', 'Code', 'User', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'servers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class WindsurfMCPClient extends MCPClient {\n name = 'Windsurf';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n if (platform !== 'darwin' && platform !== 'win32' && platform !== 'linux') {\n return false;\n }\n\n // Check if Windsurf config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(os.homedir(), '.codeium', 'windsurf', 'mcp_config.json');\n }\n\n if (platform === 'win32') {\n return path.join(\n process.env.APPDATA || '',\n 'Codeium',\n 'windsurf',\n 'mcp_config.json',\n );\n }\n\n // Linux\n return path.join(os.homedir(), '.config', 'windsurf', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n serverUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ZedMCPClient extends MCPClient {\n name = 'Zed';\n\n async isClientSupported(): Promise<boolean> {\n const platform = process.platform;\n // Zed is available on macOS and Linux\n if (platform !== 'darwin' && platform !== 'linux') {\n return false;\n }\n\n // Check if Zed config directory exists\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return path.join(os.homedir(), '.config', 'zed', 'settings.json');\n }\n\n // Linux\n const xdgConfigHome = process.env.XDG_CONFIG_HOME;\n if (xdgConfigHome) {\n return path.join(xdgConfigHome, 'zed', 'settings.json');\n }\n return path.join(os.homedir(), '.config', 'zed', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'context_servers';\n }\n\n /**\n * Zed only supports local stdio mode\n */\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n source: 'custom',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ClineMCPClient extends MCPClient {\n name = 'Cline';\n\n async isClientSupported(): Promise<boolean> {\n // Cline is a VS Code extension, check for its config directory\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.cline', 'mcp_settings.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n const baseConfig = {\n alwaysAllow: [\n 'index',\n 'search',\n 'manage_resource',\n 'nia_web_search',\n 'nia_deep_research_agent',\n ],\n disabled: false,\n };\n\n if (mode === 'remote') {\n return {\n ...baseConfig,\n type: 'streamableHttp',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n\n return {\n ...baseConfig,\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import { execSync, spawnSync } from 'child_process';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class CodexMCPClient extends MCPClient {\n name = 'Codex CLI';\n\n async isClientSupported(): Promise<boolean> {\n try {\n execSync('codex --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async getConfigPath(): Promise<string> {\n throw new Error('Codex CLI uses command-line configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const result = spawnSync('codex', ['mcp', 'list', '--json'], {\n encoding: 'utf-8',\n });\n\n if (result.error || result.status !== 0) {\n return false;\n }\n\n const stdout = result.stdout?.trim();\n if (!stdout) return false;\n\n const servers = JSON.parse(stdout) as Array<{ name: string }>;\n return servers.some((server) => server.name === SERVER_NAME);\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n _mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n // Codex only supports local mode\n const args = [\n 'mcp',\n 'add',\n SERVER_NAME,\n '--env',\n `NIA_API_KEY=${apiKey}`,\n '--env',\n `NIA_API_URL=${NIA_API_URL}`,\n '--',\n 'pipx',\n 'run',\n '--no-cache',\n 'nia-mcp-server',\n ];\n\n debug(`Running: codex ${args.join(' ')}`);\n const result = spawnSync('codex', args, { stdio: 'ignore' });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to add server to Codex CLI' };\n }\n\n return { success: true };\n }\n\n async removeServer(): Promise<MCPClientResult> {\n const result = spawnSync('codex', ['mcp', 'remove', SERVER_NAME], {\n stdio: 'ignore',\n });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to remove server from Codex CLI' };\n }\n\n return { success: true };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class ContinueMCPClient extends MCPClient {\n name = 'Continue.dev';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir);\n }\n\n async getConfigPath(): Promise<string> {\n const platform = process.platform;\n if (platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.continue', 'config.json');\n }\n return path.join(os.homedir(), '.continue', 'config.json');\n }\n\n getServerPropertyName(): string {\n return 'experimental';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n modelContextProtocolServer: {\n transport: {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n },\n },\n };\n }\n return {\n modelContextProtocolServer: {\n transport: {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n },\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class JetBrainsMCPClient extends MCPClient {\n name = 'JetBrains';\n\n async isClientSupported(): Promise<boolean> {\n // Check for common JetBrains config directories\n const homeDir = os.homedir();\n const possibleDirs = [\n path.join(homeDir, '.config', 'JetBrains'),\n path.join(homeDir, 'Library', 'Application Support', 'JetBrains'),\n ];\n return possibleDirs.some(dir => fs.existsSync(dir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.jetbrains', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // JetBrains only supports local\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class AntigravityMCPClient extends MCPClient {\n name = 'Google Antigravity';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.gemini', 'antigravity', 'mcp_config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n serverUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class TraeMCPClient extends MCPClient {\n name = 'Trae';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'darwin') {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Trae', 'User', 'mcp.json');\n }\n return path.join(os.homedir(), '.config', 'trae', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class RooCodeMCPClient extends MCPClient {\n name = 'Roo Code';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.roo-code', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'streamable-http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class KiloCodeMCPClient extends MCPClient {\n name = 'Kilo Code';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.kilocode', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'streamable-http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n alwaysAllow: [],\n disabled: false,\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n alwaysAllow: [],\n disabled: false,\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class GeminiCLIMCPClient extends MCPClient {\n name = 'Gemini CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.gemini', 'settings.json');\n }\n return path.join(os.homedir(), '.gemini', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n httpUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: 'application/json, text/event-stream',\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class OpencodeMCPClient extends MCPClient {\n name = 'Opencode';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.opencode', 'config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcp';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'remote',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n enabled: true,\n };\n }\n return {\n type: 'local',\n command: ['pipx', 'run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n enabled: true,\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class QodoGenMCPClient extends MCPClient {\n name = 'Qodo Gen';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.qodo', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class QwenCoderMCPClient extends MCPClient {\n name = 'Qwen Coder';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.qwen', 'settings.json');\n }\n return path.join(os.homedir(), '.qwen', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n httpUrl: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n Accept: 'application/json, text/event-stream',\n },\n };\n }\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class VisualStudioMCPClient extends MCPClient {\n name = 'Visual Studio 2022';\n\n async isClientSupported(): Promise<boolean> {\n // Visual Studio is Windows only\n if (process.platform !== 'win32') {\n return false;\n }\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.vs', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'servers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class CrushMCPClient extends MCPClient {\n name = 'Crush';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.crush', 'config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcp';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n };\n }\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nconst COPILOT_TOOLS = ['index', 'search', 'manage_resource', 'nia_web_search', 'nia_deep_research_agent'];\n\nexport class CopilotCLIMCPClient extends MCPClient {\n name = 'Copilot CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.copilot', 'mcp-config.json');\n }\n return path.join(os.homedir(), '.copilot', 'mcp-config.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n tools: COPILOT_TOOLS,\n };\n }\n return {\n type: 'local',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n tools: COPILOT_TOOLS,\n };\n }\n}\n\nexport class CopilotAgentMCPClient extends MCPClient {\n name = 'Copilot Coding Agent';\n\n async isClientSupported(): Promise<boolean> {\n // Check if .github directory exists (repo-level config)\n return fs.existsSync('.github');\n }\n\n async getConfigPath(): Promise<string> {\n return path.join('.github', 'copilot-mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, mode: 'local' | 'remote'): MCPServerConfig {\n if (mode === 'remote') {\n return {\n type: 'http',\n url: REMOTE_MCP_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n },\n tools: COPILOT_TOOLS,\n };\n }\n return {\n type: 'stdio',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n tools: COPILOT_TOOLS,\n };\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class AugmentMCPClient extends MCPClient {\n name = 'Augment Code';\n\n async isClientSupported(): Promise<boolean> {\n // Augment is a VS Code extension, harder to detect\n return false; // User needs to configure manually\n }\n\n async getConfigPath(): Promise<string> {\n // Augment uses VS Code settings\n return path.join(os.homedir(), '.vscode', 'settings.json');\n }\n\n getServerPropertyName(): string {\n return 'augment.advanced';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // Augment only supports local\n return {\n mcpServers: [\n {\n name: 'nia',\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n },\n ],\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class KiroMCPClient extends MCPClient {\n name = 'Kiro';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.kiro', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n disabled: false,\n autoApprove: [],\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class LMStudioMCPClient extends MCPClient {\n name = 'LM Studio';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.lmstudio', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class BoltAIMCPClient extends MCPClient {\n name = 'BoltAI';\n\n async isClientSupported(): Promise<boolean> {\n if (process.platform !== 'darwin') {\n return false;\n }\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), 'Library', 'Application Support', 'BoltAI', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class PerplexityMCPClient extends MCPClient {\n name = 'Perplexity Desktop';\n\n async isClientSupported(): Promise<boolean> {\n if (process.platform !== 'darwin') {\n return false;\n }\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), 'Library', 'Application Support', 'Perplexity', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n // Perplexity has a different config format\n return {\n args: ['run', '--no-cache', 'nia-mcp-server'],\n command: 'pipx',\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class WarpMCPClient extends MCPClient {\n name = 'Warp';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.warp', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n working_directory: null,\n start_on_launch: true,\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient } from '../MCPClient.js';\nimport { NIA_API_URL } from '../defaults.js';\nimport type { MCPServerConfig } from '../../../utils/types.js';\n\nexport class AmazonQMCPClient extends MCPClient {\n name = 'Amazon Q Developer CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n const configDir = path.dirname(configPath);\n return fs.existsSync(configDir) || fs.existsSync(path.dirname(configDir));\n }\n\n async getConfigPath(): Promise<string> {\n return path.join(os.homedir(), '.aws', 'amazonq', 'mcp.json');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n getServerConfig(apiKey: string, _mode: 'local' | 'remote'): MCPServerConfig {\n return {\n command: 'pipx',\n args: ['run', '--no-cache', 'nia-mcp-server'],\n env: {\n NIA_API_KEY: apiKey,\n NIA_API_URL: NIA_API_URL,\n },\n };\n }\n\n supportsRemote(): boolean {\n return false;\n }\n}\n","import { execSync, spawnSync } from 'child_process';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL, NIA_API_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class FactoryMCPClient extends MCPClient {\n name = 'Factory';\n\n async isClientSupported(): Promise<boolean> {\n try {\n execSync('droid --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async getConfigPath(): Promise<string> {\n throw new Error('Factory uses CLI configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const result = spawnSync('droid', ['mcp', 'list'], {\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n return result.stdout?.includes(SERVER_NAME) || false;\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n try {\n let args: string[];\n\n if (mode === 'remote') {\n args = [\n 'mcp', 'add', SERVER_NAME,\n REMOTE_MCP_URL,\n '--type', 'http',\n '--header', `Authorization: Bearer ${apiKey}`,\n ];\n } else {\n args = [\n 'mcp', 'add', SERVER_NAME,\n 'pipx run --no-cache nia-mcp-server',\n '--env', `NIA_API_KEY=${apiKey}`,\n '--env', `NIA_API_URL=${NIA_API_URL}`,\n ];\n }\n\n debug(`Running: droid ${args.join(' ')}`);\n const result = spawnSync('droid', args, { stdio: 'pipe' });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to add server to Factory' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n try {\n const result = spawnSync('droid', ['mcp', 'remove', SERVER_NAME], {\n stdio: 'pipe',\n });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to remove server from Factory' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n}\n","import { execSync, spawnSync } from 'child_process';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class AmpMCPClient extends MCPClient {\n name = 'Amp';\n\n async isClientSupported(): Promise<boolean> {\n try {\n execSync('amp --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async getConfigPath(): Promise<string> {\n throw new Error('Amp uses CLI configuration');\n }\n\n getServerPropertyName(): string {\n return 'mcpServers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const result = spawnSync('amp', ['mcp', 'list'], {\n encoding: 'utf-8',\n stdio: 'pipe',\n });\n return result.stdout?.includes(SERVER_NAME) || false;\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n _mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n // Amp only supports remote\n try {\n const args = [\n 'mcp', 'add', SERVER_NAME,\n '--header', `Authorization=Bearer ${apiKey}`,\n REMOTE_MCP_URL,\n ];\n\n debug(`Running: amp ${args.join(' ')}`);\n const result = spawnSync('amp', args, { stdio: 'pipe' });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to add server to Amp' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n try {\n const result = spawnSync('amp', ['mcp', 'remove', SERVER_NAME], {\n stdio: 'pipe',\n });\n\n if (result.error || result.status !== 0) {\n return { success: false, error: 'Failed to remove server from Amp' };\n }\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n supportsLocal(): boolean {\n return false;\n }\n}\n","import * as path from 'path';\nimport * as os from 'os';\nimport * as fs from 'fs';\nimport { MCPClient, SERVER_NAME } from '../MCPClient.js';\nimport { REMOTE_MCP_URL } from '../defaults.js';\nimport type { MCPClientResult } from '../../../utils/types.js';\nimport { debug } from '../../../utils/debug.js';\n\nexport class VibeMCPClient extends MCPClient {\n name = 'Mistral Vibe CLI';\n\n async isClientSupported(): Promise<boolean> {\n const configPath = await this.getConfigPath();\n return fs.existsSync(configPath);\n }\n\n async getConfigPath(): Promise<string> {\n if (process.platform === 'win32') {\n return path.join(process.env.USERPROFILE || '', '.vibe', 'config.toml');\n }\n return path.join(os.homedir(), '.vibe', 'config.toml');\n }\n\n getServerPropertyName(): string {\n return 'mcp_servers';\n }\n\n async isServerInstalled(): Promise<boolean> {\n try {\n const configPath = await this.getConfigPath();\n if (!fs.existsSync(configPath)) {\n return false;\n }\n const content = await fs.promises.readFile(configPath, 'utf8');\n return content.includes('name = \"nia\"');\n } catch {\n return false;\n }\n }\n\n async addServer(\n apiKey: string,\n _mode: 'local' | 'remote',\n ): Promise<MCPClientResult> {\n // Vibe only supports remote and uses TOML\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false, error: 'Vibe config not found' };\n }\n\n let content = await fs.promises.readFile(configPath, 'utf8');\n\n // Check if already configured\n if (content.includes('name = \"nia\"')) {\n debug('Nia already configured in Vibe');\n return { success: true };\n }\n\n // Remove empty mcp_servers array if present\n content = content.replace(/^mcp_servers = \\[\\]\\s*$/m, '');\n\n // Append Nia config\n const niaConfig = `\n[[mcp_servers]]\nname = \"${SERVER_NAME}\"\ntransport = \"streamable-http\"\nurl = \"${REMOTE_MCP_URL}\"\n\n[mcp_servers.headers]\nAuthorization = \"Bearer ${apiKey}\"\n`;\n\n content = content.trimEnd() + '\\n' + niaConfig;\n\n await fs.promises.writeFile(configPath, content, 'utf8');\n debug(`Wrote Vibe config to ${configPath}`);\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n async removeServer(): Promise<MCPClientResult> {\n try {\n const configPath = await this.getConfigPath();\n\n if (!fs.existsSync(configPath)) {\n return { success: false, error: 'Vibe config not found' };\n }\n\n let content = await fs.promises.readFile(configPath, 'utf8');\n\n // Remove the Nia server block (TOML format)\n // This is a simple approach - may need refinement for complex configs\n const niaBlockRegex = /\\[\\[mcp_servers\\]\\]\\s*name\\s*=\\s*\"nia\"[\\s\\S]*?(?=\\[\\[|\\[(?!\\[)|$)/g;\n content = content.replace(niaBlockRegex, '');\n\n await fs.promises.writeFile(configPath, content.trimEnd() + '\\n', 'utf8');\n\n return { success: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: message };\n }\n }\n\n supportsLocal(): boolean {\n return false;\n }\n}\n","import clack from '../../utils/clack.js';\nimport chalk from 'chalk';\nimport { abortIfCancelled } from '../../utils/clack-utils.js';\nimport { MCPClient } from './MCPClient.js';\nimport {\n // Core clients\n CursorMCPClient,\n ClaudeDesktopMCPClient,\n ClaudeCodeMCPClient,\n VSCodeMCPClient,\n WindsurfMCPClient,\n ZedMCPClient,\n ClineMCPClient,\n CodexMCPClient,\n // Additional clients\n ContinueMCPClient,\n JetBrainsMCPClient,\n AntigravityMCPClient,\n TraeMCPClient,\n RooCodeMCPClient,\n KiloCodeMCPClient,\n GeminiCLIMCPClient,\n OpencodeMCPClient,\n QodoGenMCPClient,\n QwenCoderMCPClient,\n VisualStudioMCPClient,\n CrushMCPClient,\n CopilotCLIMCPClient,\n CopilotAgentMCPClient,\n AugmentMCPClient,\n KiroMCPClient,\n LMStudioMCPClient,\n BoltAIMCPClient,\n PerplexityMCPClient,\n WarpMCPClient,\n AmazonQMCPClient,\n FactoryMCPClient,\n AmpMCPClient,\n VibeMCPClient,\n} from './clients/index.js';\nimport { debug } from '../../utils/debug.js';\n\nexport { MCPClient } from './MCPClient.js';\nexport * from './defaults.js';\n\n/**\n * Get all MCP clients that are supported on this system\n */\nexport async function getSupportedClients(): Promise<MCPClient[]> {\n const allClients: MCPClient[] = [\n // Core / popular clients first\n new CursorMCPClient(),\n new ClaudeCodeMCPClient(),\n new ClaudeDesktopMCPClient(),\n new VSCodeMCPClient(),\n new WindsurfMCPClient(),\n new ClineMCPClient(),\n new ContinueMCPClient(),\n new ZedMCPClient(),\n new JetBrainsMCPClient(),\n // Additional clients\n new AntigravityMCPClient(),\n new TraeMCPClient(),\n new RooCodeMCPClient(),\n new KiloCodeMCPClient(),\n new GeminiCLIMCPClient(),\n new OpencodeMCPClient(),\n new QodoGenMCPClient(),\n new QwenCoderMCPClient(),\n new VisualStudioMCPClient(),\n new CrushMCPClient(),\n new CopilotCLIMCPClient(),\n new CopilotAgentMCPClient(),\n new AugmentMCPClient(),\n new KiroMCPClient(),\n new LMStudioMCPClient(),\n new BoltAIMCPClient(),\n new PerplexityMCPClient(),\n new WarpMCPClient(),\n new AmazonQMCPClient(),\n new CodexMCPClient(),\n new FactoryMCPClient(),\n new AmpMCPClient(),\n new VibeMCPClient(),\n ];\n\n const supportedClients: MCPClient[] = [];\n\n debug('Checking for supported MCP clients...');\n for (const client of allClients) {\n const isSupported = await client.isClientSupported();\n debug(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);\n if (isSupported) {\n supportedClients.push(client);\n }\n }\n debug(\n `Found ${supportedClients.length} supported client(s): ${supportedClients\n .map((c) => c.name)\n .join(', ')}`,\n );\n\n return supportedClients;\n}\n\nexport interface AddMCPServerOptions {\n apiKey: string;\n mode: 'local' | 'remote';\n /** Skip prompts and install to all detected clients */\n ci?: boolean;\n}\n\n/**\n * Main step: Add MCP server to all supported clients\n */\nexport async function addMCPServerToClientsStep(\n options: AddMCPServerOptions,\n): Promise<string[]> {\n const { apiKey, mode, ci = false } = options;\n\n // Get supported clients\n const supportedClients = await getSupportedClients();\n\n if (supportedClients.length === 0) {\n clack.log.warn('No supported coding agents detected on this system.');\n clack.log.info(\n 'Supported agents: Cursor, Claude Code, Claude Desktop, VS Code, Windsurf, Cline, Continue, Zed, JetBrains, Antigravity, Trae, Roo Code, Kilo Code, Gemini CLI, Opencode, Qodo Gen, Qwen Coder, Visual Studio, Crush, Copilot CLI, Copilot Agent, Augment, Kiro, LM Studio, BoltAI, Perplexity, Warp, Amazon Q, Codex, Factory, Amp, Vibe',\n );\n return [];\n }\n\n // In CI mode, auto-select all clients\n let selectedClients: MCPClient[];\n\n if (ci) {\n selectedClients = supportedClients;\n clack.log.info(\n `Auto-selecting ${selectedClients.length} client(s): ${selectedClients.map((c) => c.name).join(', ')}`,\n );\n } else {\n // Let user select which clients to install to\n const selectedNames = await abortIfCancelled(\n clack.multiselect({\n message: 'Select which coding agents to install Nia to:',\n options: supportedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: supportedClients.map((client) => client.name),\n required: true,\n }),\n );\n\n selectedClients = supportedClients.filter((client) =>\n selectedNames.includes(client.name),\n );\n }\n\n if (selectedClients.length === 0) {\n clack.log.info('No clients selected.');\n return [];\n }\n\n // Check for existing installations\n const installedClients: MCPClient[] = [];\n for (const client of selectedClients) {\n if (await client.isServerInstalled()) {\n installedClients.push(client);\n }\n }\n\n // Handle reinstall\n if (installedClients.length > 0 && !ci) {\n clack.log.warn(\n `Nia is already configured for:\\n ${installedClients.map((c) => `• ${c.name}`).join('\\n ')}`,\n );\n\n const reinstall = await abortIfCancelled(\n clack.confirm({\n message: 'Reinstall to update configuration?',\n initialValue: true,\n }),\n );\n\n if (!reinstall) {\n // Remove already-installed clients from the list\n selectedClients = selectedClients.filter(\n (c) => !installedClients.includes(c),\n );\n\n if (selectedClients.length === 0) {\n clack.log.info('Nothing to install.');\n return [];\n }\n }\n }\n\n // Install to selected clients\n const spinner = clack.spinner();\n spinner.start('Installing Nia MCP server...');\n\n const successfulClients: string[] = [];\n const failedClients: { name: string; error: string }[] = [];\n\n for (const client of selectedClients) {\n const result = await client.addServer(apiKey, mode);\n\n if (result.success) {\n successfulClients.push(client.name);\n } else {\n failedClients.push({ name: client.name, error: result.error || 'Unknown error' });\n }\n }\n\n spinner.stop('Installation complete.');\n\n // Report results\n if (successfulClients.length > 0) {\n clack.log.success(\n `Installed Nia to:\\n ${successfulClients.map((n) => `• ${n}`).join('\\n ')}`,\n );\n }\n\n if (failedClients.length > 0) {\n clack.log.warn(\n `Failed to install to:\\n ${failedClients.map((f) => `• ${f.name}: ${f.error}`).join('\\n ')}`,\n );\n }\n\n return successfulClients;\n}\n\n/**\n * Remove MCP server from clients\n */\nexport async function removeMCPServerFromClientsStep(): Promise<string[]> {\n // Get clients where Nia is installed\n const supportedClients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of supportedClients) {\n if (await client.isServerInstalled()) {\n installedClients.push(client);\n }\n }\n\n if (installedClients.length === 0) {\n clack.log.info('Nia is not installed in any detected coding agents.');\n return [];\n }\n\n // Let user select which to remove from\n const selectedNames = await abortIfCancelled(\n clack.multiselect({\n message: 'Select which coding agents to remove Nia from:',\n options: installedClients.map((client) => ({\n value: client.name,\n label: client.name,\n })),\n initialValues: installedClients.map((client) => client.name),\n required: true,\n }),\n );\n\n const selectedClients = installedClients.filter((client) =>\n selectedNames.includes(client.name),\n );\n\n if (selectedClients.length === 0) {\n return [];\n }\n\n // Remove from selected clients\n const spinner = clack.spinner();\n spinner.start('Removing Nia MCP server...');\n\n const removedClients: string[] = [];\n\n for (const client of selectedClients) {\n const result = await client.removeServer();\n if (result.success) {\n removedClients.push(client.name);\n }\n }\n\n spinner.stop('Removal complete.');\n\n if (removedClients.length > 0) {\n clack.log.success(\n `Removed Nia from:\\n ${removedClients.map((n) => `• ${n}`).join('\\n ')}`,\n );\n }\n\n return removedClients;\n}\n","import chalk from 'chalk';\nimport clack from './utils/clack.js';\nimport { printWelcome, getApiKey, askInstallMode } from './utils/clack-utils.js';\nimport { addMCPServerToClientsStep } from './steps/add-mcp-server-to-clients/index.js';\nimport { enableDebug } from './utils/debug.js';\nimport { ensureLocalDependencies, dependenciesReady } from './utils/dependencies.js';\nimport type { WizardOptions } from './utils/types.js';\n\n/**\n * Main wizard entry point\n */\nexport async function runWizard(options: WizardOptions): Promise<void> {\n if (options.debug) {\n enableDebug();\n }\n\n printWelcome();\n\n // Step 1: Get API key\n const apiKey = await getApiKey(options.apiKey);\n\n // Step 2: Select install mode\n let mode: 'local' | 'remote';\n if (options.local !== undefined) {\n mode = options.local ? 'local' : 'remote';\n clack.log.info(`Using ${mode} mode`);\n } else if (options.ci) {\n mode = 'local';\n clack.log.info('Using local mode (CI default)');\n } else {\n mode = await askInstallMode(true);\n }\n\n // Step 3: If local mode, ensure dependencies are installed\n if (mode === 'local') {\n if (!dependenciesReady()) {\n console.log('');\n const depsOk = await ensureLocalDependencies();\n if (!depsOk) {\n // Dependencies failed, offer to switch to remote\n clack.log.warn('Local mode requires additional dependencies.');\n const switchToRemote = await clack.confirm({\n message: 'Switch to remote mode instead?',\n initialValue: true,\n });\n \n if (switchToRemote) {\n mode = 'remote';\n clack.log.info('Switched to remote mode');\n } else {\n clack.outro(chalk.yellow('Please install dependencies and try again.'));\n process.exit(1);\n }\n }\n console.log('');\n } else {\n clack.log.success('Dependencies ready');\n }\n }\n\n // Step 4: Install to clients\n const installedClients = await addMCPServerToClientsStep({\n apiKey,\n mode,\n ci: options.ci,\n });\n\n // Outro\n if (installedClients.length > 0) {\n const outroMessage = `\n${chalk.green('✓ Nia MCP Server installed!')}\n\n${chalk.cyan('Get started:')}\n • Browse pre-indexed sources: ${chalk.cyan('https://app.trynia.ai/explore')}\n • Or index your own repos, docs, and papers\n\n${chalk.cyan('Try in your coding agent:')}\n ${chalk.yellow('\"List my indexed sources\"')}\n ${chalk.yellow('\"Search vercel/ai-sdk for streaming\"')}\n ${chalk.yellow('\"Run deep research on MCP protocols\"')}\n\n${chalk.dim('Using as API?')} ${chalk.cyan('https://docs.trynia.ai/api-guide')}\n${chalk.dim('Follow us:')} ${chalk.cyan('https://x.com/nozomioai')}\n`;\n clack.outro(outroMessage);\n } else {\n clack.outro(chalk.dim('No changes made.'));\n }\n}\n","/**\n * Dependency management for local mode installation\n * Handles checking and installing pipx, Homebrew, etc.\n */\n\nimport { execSync, spawnSync } from 'child_process';\nimport os from 'os';\nimport clack from './clack.js';\nimport { abortIfCancelled } from './clack-utils.js';\nimport { debug } from './debug.js';\nimport chalk from 'chalk';\n\nconst isMacOS = process.platform === 'darwin';\nconst isWindows = process.platform === 'win32';\n\n/**\n * Check if a command exists in PATH\n */\nfunction commandExists(cmd: string): boolean {\n try {\n const result = spawnSync(isWindows ? 'where' : 'which', [cmd], {\n stdio: 'pipe',\n encoding: 'utf-8',\n });\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Run a shell command and return success/failure\n */\nfunction runCommand(cmd: string, options?: { silent?: boolean }): boolean {\n try {\n debug(`Running: ${cmd}`);\n execSync(cmd, {\n stdio: options?.silent ? 'pipe' : 'inherit',\n encoding: 'utf-8',\n });\n return true;\n } catch (error) {\n debug(`Command failed: ${cmd}`, error);\n return false;\n }\n}\n\n/**\n * Check if Homebrew is installed (macOS only)\n */\nexport function checkHomebrew(): boolean {\n if (!isMacOS) return true; // Not needed on other platforms\n \n // Check common locations\n if (commandExists('brew')) return true;\n \n // Check Apple Silicon location\n try {\n execSync('test -f /opt/homebrew/bin/brew', { stdio: 'pipe' });\n return true;\n } catch {}\n \n // Check Intel Mac location\n try {\n execSync('test -f /usr/local/bin/brew', { stdio: 'pipe' });\n return true;\n } catch {}\n \n return false;\n}\n\n/**\n * Install Homebrew (macOS only)\n */\nexport async function installHomebrew(): Promise<boolean> {\n if (!isMacOS) return true;\n \n clack.log.info('Homebrew is required for local mode on macOS.');\n \n const shouldInstall = await abortIfCancelled(\n clack.confirm({\n message: 'Install Homebrew? (This may take a few minutes)',\n initialValue: true,\n }),\n );\n \n if (!shouldInstall) {\n clack.log.warn('Homebrew is required for local mode. Switching to remote mode or install manually.');\n return false;\n }\n \n const spinner = clack.spinner();\n spinner.start('Installing Homebrew...');\n \n try {\n // Run Homebrew installer\n execSync(\n '/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"',\n { stdio: 'inherit' }\n );\n \n // Add to PATH for Apple Silicon\n if (process.arch === 'arm64') {\n try {\n execSync('eval \"$(/opt/homebrew/bin/brew shellenv)\"', { stdio: 'pipe' });\n } catch {}\n }\n \n spinner.stop('Homebrew installed!');\n return true;\n } catch (error) {\n spinner.stop('Failed to install Homebrew');\n clack.log.error('Homebrew installation failed. Please install manually: https://brew.sh');\n return false;\n }\n}\n\n/**\n * Check if pipx is installed\n */\nexport function checkPipx(): boolean {\n return commandExists('pipx');\n}\n\n/**\n * Check if Python 3 is installed\n */\nexport function checkPython(): boolean {\n return commandExists('python3') || commandExists('python');\n}\n\n/**\n * Install pipx\n */\nexport async function installPipx(): Promise<boolean> {\n clack.log.info('pipx is required for local mode (manages Python packages safely).');\n \n const shouldInstall = await abortIfCancelled(\n clack.confirm({\n message: 'Install pipx?',\n initialValue: true,\n }),\n );\n \n if (!shouldInstall) {\n clack.log.warn('pipx is required for local mode.');\n return false;\n }\n \n const spinner = clack.spinner();\n spinner.start('Installing pipx...');\n \n try {\n if (isMacOS) {\n // Try Homebrew first (preferred on macOS)\n if (checkHomebrew()) {\n if (runCommand('brew install pipx', { silent: true })) {\n runCommand('pipx ensurepath', { silent: true });\n spinner.stop('pipx installed via Homebrew!');\n return true;\n }\n }\n }\n \n // Fallback to pip\n if (checkPython()) {\n const pythonCmd = commandExists('python3') ? 'python3' : 'python';\n if (runCommand(`${pythonCmd} -m pip install --user pipx`, { silent: true })) {\n runCommand(`${pythonCmd} -m pipx ensurepath`, { silent: true });\n spinner.stop('pipx installed via pip!');\n return true;\n }\n }\n \n spinner.stop('Failed to install pipx');\n clack.log.error('Could not install pipx automatically.');\n clack.log.info('Please install manually: https://pipx.pypa.io/stable/installation/');\n return false;\n } catch (error) {\n spinner.stop('Failed to install pipx');\n debug('pipx installation error:', error);\n return false;\n }\n}\n\n/**\n * Ensure all dependencies for local mode are installed\n * Returns true if all dependencies are ready, false otherwise\n */\nexport async function ensureLocalDependencies(): Promise<boolean> {\n clack.log.step('Checking dependencies for local mode...');\n \n // Check Homebrew (macOS only)\n if (isMacOS) {\n if (!checkHomebrew()) {\n clack.log.warn('Homebrew not found');\n const installed = await installHomebrew();\n if (!installed) return false;\n } else {\n clack.log.success('Homebrew found');\n }\n }\n \n // Check Python\n if (!checkPython()) {\n clack.log.warn('Python 3 not found');\n \n if (isMacOS && checkHomebrew()) {\n const shouldInstall = await abortIfCancelled(\n clack.confirm({\n message: 'Install Python 3 via Homebrew?',\n initialValue: true,\n }),\n );\n \n if (shouldInstall) {\n const spinner = clack.spinner();\n spinner.start('Installing Python 3...');\n if (runCommand('brew install python3', { silent: true })) {\n spinner.stop('Python 3 installed!');\n } else {\n spinner.stop('Failed to install Python 3');\n return false;\n }\n } else {\n return false;\n }\n } else {\n clack.log.error('Python 3 is required. Please install from https://python.org');\n return false;\n }\n } else {\n clack.log.success('Python found');\n }\n \n // Check pipx\n if (!checkPipx()) {\n clack.log.warn('pipx not found');\n const installed = await installPipx();\n if (!installed) return false;\n } else {\n clack.log.success('pipx found');\n }\n \n // Verify nia-mcp-server can be run\n clack.log.step('Installing/upgrading nia-mcp-server...');\n const spinner = clack.spinner();\n spinner.start('Setting up nia-mcp-server...');\n \n try {\n // Check if already installed\n const listResult = spawnSync('pipx', ['list'], { encoding: 'utf-8', stdio: 'pipe' });\n const isInstalled = listResult.stdout?.includes('nia-mcp-server');\n \n if (isInstalled) {\n // Upgrade existing installation\n runCommand('pipx upgrade nia-mcp-server', { silent: true });\n spinner.stop('nia-mcp-server upgraded!');\n } else {\n // Fresh install\n if (runCommand('pipx install nia-mcp-server', { silent: true })) {\n spinner.stop('nia-mcp-server installed!');\n } else {\n spinner.stop('Failed to install nia-mcp-server');\n clack.log.warn('Could not pre-install nia-mcp-server. It will be installed on first run.');\n }\n }\n } catch {\n spinner.stop('nia-mcp-server will be installed on first run');\n }\n \n console.log('');\n clack.log.success(chalk.green('All dependencies ready!'));\n return true;\n}\n\n/**\n * Check if dependencies are already satisfied (quick check)\n */\nexport function dependenciesReady(): boolean {\n if (isMacOS && !checkHomebrew()) return false;\n if (!checkPython()) return false;\n if (!checkPipx()) return false;\n return true;\n}\n","import chalk from 'chalk';\nimport clack from './utils/clack.js';\nimport {\n addMCPServerToClientsStep,\n removeMCPServerFromClientsStep,\n} from './steps/add-mcp-server-to-clients/index.js';\nimport { getApiKey, askInstallMode } from './utils/clack-utils.js';\nimport { enableDebug } from './utils/debug.js';\nimport { ensureLocalDependencies, dependenciesReady } from './utils/dependencies.js';\n\nexport interface MCPAddOptions {\n apiKey?: string;\n local?: boolean;\n debug?: boolean;\n ci?: boolean;\n}\n\n/**\n * Add Nia MCP server to coding agents\n */\nexport async function runMCPAdd(options: MCPAddOptions): Promise<void> {\n if (options.debug) {\n enableDebug();\n }\n\n clack.intro(chalk.bgCyan.black(' Nia MCP Server '));\n\n // Get API key\n const apiKey = await getApiKey(options.apiKey);\n\n // Get install mode\n let mode: 'local' | 'remote';\n if (options.local !== undefined) {\n mode = options.local ? 'local' : 'remote';\n clack.log.info(`Using ${mode} mode`);\n } else if (options.ci) {\n mode = 'local'; // Default to local in CI\n clack.log.info('Using local mode (CI default)');\n } else {\n mode = await askInstallMode(true);\n }\n\n // If local mode, ensure dependencies are installed\n if (mode === 'local') {\n if (!dependenciesReady()) {\n console.log('');\n const depsOk = await ensureLocalDependencies();\n if (!depsOk) {\n // Dependencies failed, offer to switch to remote\n clack.log.warn('Local mode requires additional dependencies.');\n const switchToRemote = await clack.confirm({\n message: 'Switch to remote mode instead?',\n initialValue: true,\n });\n \n if (switchToRemote) {\n mode = 'remote';\n clack.log.info('Switched to remote mode');\n } else {\n clack.outro(chalk.yellow('Please install dependencies and try again.'));\n process.exit(1);\n }\n }\n console.log('');\n } else {\n clack.log.success('Dependencies ready');\n }\n }\n\n // Run installation\n const installedClients = await addMCPServerToClientsStep({\n apiKey,\n mode,\n ci: options.ci,\n });\n\n if (installedClients.length > 0) {\n clack.log.message(\n chalk.dim('You may need to restart your coding agents to load Nia.'),\n );\n }\n\n clack.outro(chalk.green('Done!'));\n}\n\n/**\n * Remove Nia MCP server from coding agents\n */\nexport async function runMCPRemove(options: { debug?: boolean } = {}): Promise<void> {\n if (options.debug) {\n enableDebug();\n }\n\n clack.intro(chalk.bgRed.white(' Remove Nia MCP Server '));\n\n const removedClients = await removeMCPServerFromClientsStep();\n\n if (removedClients.length > 0) {\n clack.log.message(\n chalk.dim('You may need to restart your coding agents for changes to take effect.'),\n );\n }\n\n clack.outro(chalk.green('Done!'));\n}\n"],"mappings":"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","names":["isCancel","isCancel","path","fs","path","os","fs","fs","os","path","path","os","fs","path","os","fs","path","os","fs","path","os","fs","execSync","execSync","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","path","os","fs","execSync","spawnSync","execSync","spawnSync","execSync","spawnSync","execSync","spawnSync","path","os","fs","chalk","execSync","spawnSync","chalk","spawnSync","execSync","spinner","chalk","chalk","chalk"]}
|
package/dist/index.js
CHANGED