@tronsfey/ucli 0.5.3 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -779,8 +779,8 @@ function resolve(mod, name) {
779
779
  throw new Error(`Cannot resolve export "${name}" from module`);
780
780
  }
781
781
  async function getMcp2cli() {
782
- const clientMod = await import("./client-Y6NONDCI.js");
783
- const runnerMod = await import("./runner-ROLDMGH3.js");
782
+ const clientMod = await import("./client-BXBJLLS5.js");
783
+ const runnerMod = await import("./runner-5RDUAS4J.js");
784
784
  return {
785
785
  createMcpClient: resolve(clientMod, "createMcpClient"),
786
786
  getTools: resolve(runnerMod, "getTools"),
@@ -796,7 +796,7 @@ async function closeClient(client) {
796
796
  }
797
797
  function buildMcpConfig(entry) {
798
798
  const base = { type: entry.transport };
799
- if (entry.transport === "http") {
799
+ if (entry.transport === "http" || entry.transport === "sse") {
800
800
  base.url = entry.serverUrl;
801
801
  } else {
802
802
  base.command = entry.command;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/lib/config-encryption.ts","../src/lib/server-client.ts","../src/lib/exit-codes.ts","../src/lib/output.ts","../src/commands/configure.ts","../src/lib/cache.ts","../src/lib/yaml.ts","../src/commands/listoas.ts","../src/commands/listmcp.ts","../src/lib/oas-runner.ts","../src/commands/oas.ts","../src/lib/mcp-runner.ts","../src/commands/mcp.ts","../src/commands/refresh.ts","../src/commands/help-cmd.ts","../src/lib/errors.ts","../src/commands/doctor.ts","../src/commands/completions.ts","../src/commands/introspect.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { createRequire } from 'node:module'\nimport { registerConfigure } from './commands/configure.js'\nimport { registerListOas } from './commands/listoas.js'\nimport { registerListMcp } from './commands/listmcp.js'\nimport { registerOas } from './commands/oas.js'\nimport { registerMcp } from './commands/mcp.js'\nimport { registerRefresh } from './commands/refresh.js'\nimport { registerHelp } from './commands/help-cmd.js'\nimport { registerDoctor } from './commands/doctor.js'\nimport { registerCompletions } from './commands/completions.js'\nimport { registerIntrospect } from './commands/introspect.js'\nimport { setDebugMode } from './lib/errors.js'\nimport { setOutputMode, type OutputMode } from './lib/output.js'\n\nconst require = createRequire(import.meta.url)\nconst pkg = require('../package.json') as { version: string; description: string }\n\nconst program = new Command()\n\nprogram\n .name('ucli')\n .description(pkg.description)\n .version(pkg.version, '-v, --version')\n .option('--debug', 'Enable verbose debug logging')\n .option('--output <mode>', 'Output mode: text | json (json wraps every result in a structured envelope for agent consumption)', 'text')\n .addHelpCommand(false) // we provide our own help command\n .hook('preAction', (_thisCommand, actionCommand) => {\n // Walk up to root to find the --debug and --output flags\n let cmd = actionCommand\n while (cmd) {\n const opts = cmd.opts() as Record<string, unknown>\n if (opts.debug) {\n setDebugMode(true)\n }\n if (opts.output && typeof opts.output === 'string') {\n const mode = opts.output.toLowerCase() as OutputMode\n if (mode === 'json' || mode === 'text') {\n setOutputMode(mode)\n }\n }\n cmd = cmd.parent as Command\n }\n })\n\nregisterConfigure(program)\nregisterListOas(program)\nregisterListMcp(program)\nregisterOas(program)\nregisterMcp(program)\nregisterRefresh(program)\nregisterDoctor(program)\nregisterCompletions(program)\nregisterIntrospect(program)\nregisterHelp(program)\n\nprogram.parse(process.argv)\n","import Conf from 'conf'\nimport { homedir } from 'node:os'\nimport { join, dirname } from 'node:path'\nimport { chmodSync, mkdirSync } from 'node:fs'\nimport { encryptValue, decryptValue, isEncrypted } from './lib/config-encryption.js'\n\nexport interface CLIConfig {\n serverUrl: string\n token: string\n}\n\nconst conf = new Conf<CLIConfig>({\n projectName: 'ucli',\n schema: {\n serverUrl: { type: 'string' },\n token: { type: 'string' },\n },\n})\n\nexport const cacheDir = join(homedir(), '.cache', 'ucli')\n\n/** Ensure the config file and its directory have restrictive permissions. */\nfunction hardenConfigPermissions(): void {\n try {\n const configPath = conf.path\n const configDir = dirname(configPath)\n mkdirSync(configDir, { recursive: true, mode: 0o700 })\n chmodSync(configDir, 0o700)\n chmodSync(configPath, 0o600)\n } catch {\n // Permission enforcement may fail on some platforms (e.g., Windows)\n console.warn('Warning: Could not enforce restrictive file permissions on config. Token is encrypted but file permissions may be permissive.')\n }\n}\n\nexport function getConfig(): CLIConfig {\n const serverUrl = conf.get('serverUrl')\n const rawToken = conf.get('token')\n\n if (!serverUrl || !rawToken) {\n console.error('ucli is not configured. Run: ucli configure --server <url> --token <jwt>')\n process.exit(1)\n }\n\n const token = decryptValue(rawToken)\n\n // Auto-migrate: re-encrypt legacy plaintext tokens on read\n if (!isEncrypted(rawToken)) {\n conf.set('token', encryptValue(token))\n hardenConfigPermissions()\n }\n\n return { serverUrl, token }\n}\n\nexport function saveConfig(cfg: CLIConfig): void {\n conf.set('serverUrl', cfg.serverUrl)\n conf.set('token', encryptValue(cfg.token))\n hardenConfigPermissions()\n}\n\nexport function isConfigured(): boolean {\n return Boolean(conf.get('serverUrl') && conf.get('token'))\n}\n","/**\n * Config value encryption utilities.\n *\n * Encrypts sensitive config values (e.g., JWT tokens) at rest using AES-256-GCM\n * with a machine-specific derived key. This ensures credentials are never stored\n * in plaintext on disk.\n *\n * Key derivation: PBKDF2(username + hostname, random-salt, 100k iterations, SHA-512)\n * Format: \"enc:v1:<base64(salt + iv + authTag + ciphertext)>\"\n */\nimport {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n pbkdf2Sync,\n} from 'node:crypto'\nimport { hostname, userInfo } from 'node:os'\n\nconst ENC_PREFIX = 'enc:v1:'\nconst ALGORITHM = 'aes-256-gcm'\nconst SALT_LEN = 32\nconst IV_LEN = 12\nconst TAG_LEN = 16\nconst PBKDF2_ITERATIONS = 100_000\n\n/** Derive a 256-bit key from machine-specific identity + per-value random salt. */\nfunction deriveKey(salt: Buffer): Buffer {\n let user = 'default'\n try {\n user = userInfo().username\n } catch {\n // userInfo() may throw on some platforms (e.g., certain containers)\n }\n const material = `ucli:${user}@${hostname()}`\n return pbkdf2Sync(material, salt, PBKDF2_ITERATIONS, 32, 'sha512')\n}\n\n/** Encrypt a plaintext string. Returns prefixed ciphertext string. */\nexport function encryptValue(plaintext: string): string {\n const salt = randomBytes(SALT_LEN)\n const key = deriveKey(salt)\n const iv = randomBytes(IV_LEN)\n const cipher = createCipheriv(ALGORITHM, key, iv)\n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()])\n const tag = cipher.getAuthTag()\n const packed = Buffer.concat([salt, iv, tag, encrypted])\n return ENC_PREFIX + packed.toString('base64')\n}\n\n/**\n * Decrypt a stored value. If the value has the encryption prefix, it is\n * decrypted; otherwise it is returned as-is for backward compatibility\n * with legacy plaintext configs.\n */\nexport function decryptValue(stored: string): string {\n if (!stored.startsWith(ENC_PREFIX)) {\n return stored\n }\n const packed = Buffer.from(stored.slice(ENC_PREFIX.length), 'base64')\n const salt = packed.subarray(0, SALT_LEN)\n const iv = packed.subarray(SALT_LEN, SALT_LEN + IV_LEN)\n const tag = packed.subarray(SALT_LEN + IV_LEN, SALT_LEN + IV_LEN + TAG_LEN)\n const encrypted = packed.subarray(SALT_LEN + IV_LEN + TAG_LEN)\n const key = deriveKey(salt)\n const decipher = createDecipheriv(ALGORITHM, key, iv)\n decipher.setAuthTag(tag)\n return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString('utf8')\n}\n\n/** Check whether a stored value is encrypted (has the encryption prefix). */\nexport function isEncrypted(value: string): boolean {\n return value.startsWith(ENC_PREFIX)\n}\n","/**\n * HTTP client for the ucli-server API.\n * Attaches group JWT and handles common error cases.\n */\nimport axios, { type AxiosInstance } from 'axios'\nimport type { CLIConfig } from '../config.js'\n\nexport interface OASEntryPublic {\n id: string\n name: string\n description: string\n remoteUrl: string\n baseEndpoint: string | null\n authType: 'bearer' | 'api_key' | 'basic' | 'oauth2_cc' | 'none'\n authConfig: Record<string, unknown>\n cacheTtl: number\n}\n\nexport type McpAuthConfig =\n | { type: 'none' }\n | { type: 'http_headers'; headers: Record<string, string> }\n | { type: 'env'; env: Record<string, string> }\n\nexport interface McpEntryPublic {\n id: string\n groupId: string\n name: string\n description: string\n transport: 'http' | 'stdio'\n serverUrl: string | null\n command: string | null\n authConfig: McpAuthConfig\n enabled: boolean\n}\n\nexport class ServerClient {\n private http: AxiosInstance\n\n constructor(cfg: CLIConfig) {\n this.http = axios.create({\n baseURL: cfg.serverUrl.replace(/\\/$/, ''),\n headers: {\n Authorization: `Bearer ${cfg.token}`,\n 'Content-Type': 'application/json',\n },\n timeout: 15_000,\n })\n\n this.http.interceptors.response.use(\n (r) => r,\n (err: unknown) => {\n if (axios.isAxiosError(err)) {\n const status = err.response?.status\n const message = (err.response?.data as { message?: string })?.message ?? err.message\n\n if (status === 401) {\n console.error('Authentication failed. Run: ucli configure --server <url> --token <jwt>')\n process.exit(1)\n }\n\n throw new Error(`Server error ${status ?? 'unknown'}: ${message}`)\n }\n throw err\n },\n )\n }\n\n async listOAS(): Promise<OASEntryPublic[]> {\n const { data } = await this.http.get<OASEntryPublic[]>('/api/v1/oas')\n return data\n }\n\n async getOAS(name: string): Promise<OASEntryPublic> {\n const { data } = await this.http.get<OASEntryPublic>(`/api/v1/oas/${encodeURIComponent(name)}`)\n return data\n }\n\n async listMCP(): Promise<McpEntryPublic[]> {\n const { data } = await this.http.get<McpEntryPublic[]>('/api/v1/mcp')\n return data\n }\n\n async getMCP(name: string): Promise<McpEntryPublic> {\n const { data } = await this.http.get<McpEntryPublic>(`/api/v1/mcp/${encodeURIComponent(name)}`)\n return data\n }\n}\n","/**\n * Structured exit codes for automation and scripting.\n *\n * Convention:\n * 0 — success\n * 1 — general / unknown error\n * 2 — usage / argument error\n * 3 — configuration error (missing or invalid config)\n * 4 — authentication error (invalid / expired token)\n * 5 — connectivity error (server unreachable)\n * 6 — not-found error (service / resource doesn't exist)\n * 7 — server error (5xx from upstream)\n */\n\nexport const ExitCode = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n USAGE_ERROR: 2,\n CONFIG_ERROR: 3,\n AUTH_ERROR: 4,\n CONNECTIVITY_ERROR: 5,\n NOT_FOUND: 6,\n SERVER_ERROR: 7,\n} as const\n\nexport type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode]\n","/**\n * Structured output module for AI agent consumption.\n *\n * When `--output json` is active globally, every command emits a single\n * JSON envelope to stdout so that agents can reliably parse both success\n * and error results without scraping human-readable text.\n *\n * Envelope shapes:\n * Success → { \"success\": true, \"data\": <any> }\n * Error → { \"success\": false, \"error\": { \"code\": <number>, \"message\": <string>, \"hint\"?: <string> } }\n */\n\nexport type OutputMode = 'text' | 'json'\n\nlet currentMode: OutputMode = 'text'\n\n/** Set the global output mode. Called once from index.ts preAction hook. */\nexport function setOutputMode(mode: OutputMode): void {\n currentMode = mode\n}\n\n/** Get the current output mode. */\nexport function getOutputMode(): OutputMode {\n return currentMode\n}\n\n/** Returns true when structured JSON output is active. */\nexport function isJsonOutput(): boolean {\n return currentMode === 'json'\n}\n\n/**\n * Emit a successful result.\n *\n * In JSON mode the data is wrapped in `{ success: true, data }`.\n * In text mode this is a no-op — the caller is responsible for\n * printing human-readable output itself.\n */\nexport function outputSuccess(data: unknown): void {\n if (currentMode === 'json') {\n console.log(JSON.stringify({ success: true, data }, null, 2))\n }\n}\n\n/**\n * Emit a structured error and exit.\n *\n * In JSON mode the error is wrapped in `{ success: false, error: { code, message, hint? } }`.\n * In text mode falls through to the existing `formatError` path.\n */\nexport function outputError(\n code: number,\n message: string,\n hint?: string,\n): never {\n if (currentMode === 'json') {\n const envelope: Record<string, unknown> = {\n success: false,\n error: { code, message, ...(hint ? { hint } : {}) },\n }\n console.log(JSON.stringify(envelope, null, 2))\n process.exit(code)\n }\n\n // Text mode — re-use existing stderr formatting\n console.error(`\\n✖ Error: ${message}`)\n if (hint) console.error(` Hint: ${hint}`)\n process.exit(code)\n}\n","import type { Command } from 'commander'\nimport { saveConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\nexport function registerConfigure(program: Command): void {\n program\n .command('configure')\n .description('Configure the OAS Gateway server URL and authentication token')\n .requiredOption('--server <url>', 'OAS Gateway server URL (e.g. https://oas.example.com)')\n .requiredOption('--token <jwt>', 'Group JWT token issued by the server admin')\n .action(async (opts: { server: string; token: string }) => {\n const serverUrl = opts.server.replace(/\\/$/, '')\n const token = opts.token\n\n // Validate connectivity before saving\n if (!isJsonOutput()) {\n console.log(`Connecting to ${serverUrl}...`)\n }\n const client = new ServerClient({ serverUrl, token })\n\n try {\n await client.listOAS()\n saveConfig({ serverUrl, token })\n\n if (isJsonOutput()) {\n outputSuccess({ serverUrl, configured: true })\n return\n }\n\n console.log('✓ Configuration saved successfully.')\n console.log(` Server: ${serverUrl}`)\n console.log(` Token: ${token.slice(0, 20)}...`)\n } catch (err) {\n outputError(ExitCode.CONNECTIVITY_ERROR,\n `Connection failed: ${(err as Error).message}`,\n 'Check the server URL and token')\n }\n })\n}\n","/**\n * Local file cache for OAS entries.\n * Stored at ~/.cache/oas-cli/<name>.json with TTL metadata.\n *\n * Security: authConfig credential values are stripped before writing.\n * Only { type } is persisted — full secrets are never written to disk.\n */\nimport { readFile, writeFile, mkdir, unlink, chmod } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { cacheDir } from '../config.js'\nimport type { OASEntryPublic } from './server-client.js'\n\ninterface CacheFile {\n entries: OASEntryPublic[]\n fetchedAt: number // ms timestamp\n ttlSec: number // cache duration\n}\n\nconst LIST_CACHE_FILE = join(cacheDir, 'oas-list.json')\n\nasync function ensureCacheDir(): Promise<void> {\n await mkdir(cacheDir, { recursive: true, mode: 0o700 })\n}\n\n/** Strip credential secrets from authConfig — only persist { type }. */\nfunction redactEntries(entries: OASEntryPublic[]): OASEntryPublic[] {\n return entries.map((e) => ({\n ...e,\n authConfig: { type: (e.authConfig as Record<string, unknown>)['type'] ?? e.authType },\n }))\n}\n\nexport async function readOASListCache(): Promise<OASEntryPublic[] | null> {\n try {\n const raw = await readFile(LIST_CACHE_FILE, 'utf8')\n const cached: CacheFile = JSON.parse(raw)\n const age = (Date.now() - cached.fetchedAt) / 1000\n if (cached.ttlSec === 0 || age > cached.ttlSec) return null // expired\n return cached.entries\n } catch {\n return null // not found or parse error\n }\n}\n\nexport async function writeOASListCache(entries: OASEntryPublic[], ttlSec: number): Promise<void> {\n await ensureCacheDir()\n const cached: CacheFile = { entries: redactEntries(entries), fetchedAt: Date.now(), ttlSec }\n await writeFile(LIST_CACHE_FILE, JSON.stringify(cached, null, 2), { encoding: 'utf8', mode: 0o600 })\n await chmod(LIST_CACHE_FILE, 0o600)\n}\n\nexport async function clearOASListCache(): Promise<void> {\n try {\n await unlink(LIST_CACHE_FILE)\n } catch {\n // ignore if not found\n }\n}\n\nexport async function clearOASCache(name: string): Promise<void> {\n try {\n const raw = await readFile(LIST_CACHE_FILE, 'utf8')\n const cached: CacheFile = JSON.parse(raw)\n const entries = Array.isArray(cached.entries) ? cached.entries.filter((e) => e.name !== name) : []\n if (entries.length === 0) {\n await clearOASListCache()\n return\n }\n const next: CacheFile = {\n entries,\n fetchedAt: cached.fetchedAt ?? Date.now(),\n ttlSec: cached.ttlSec ?? 0,\n }\n await writeFile(LIST_CACHE_FILE, JSON.stringify(next, null, 2), { encoding: 'utf8', mode: 0o600 })\n } catch {\n await clearOASListCache()\n }\n}\n","/**\n * YAML output format support.\n *\n * A lightweight YAML serialiser that covers the data shapes produced by\n * ucli commands (plain objects, arrays, strings, numbers, booleans, null).\n * No external dependencies — we don't need a full YAML parser, only output.\n */\n\n/** Convert a JSON-serialisable value to a YAML string. */\nexport function toYaml(value: unknown, indent = 0): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n\n if (typeof value === 'number') {\n return String(value)\n }\n\n if (typeof value === 'string') {\n // Use quotes if the string contains special YAML characters\n if (needsQuoting(value)) {\n return JSON.stringify(value)\n }\n return value\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]'\n const prefix = ' '.repeat(indent)\n return value\n .map((item) => {\n const serialised = toYaml(item, indent + 2)\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n // Object items: put the first key on the same line as the dash\n const firstNewline = serialised.indexOf('\\n')\n if (firstNewline === -1) {\n return `${prefix}- ${serialised.trimStart()}`\n }\n const firstLine = serialised.slice(0, firstNewline)\n const rest = serialised.slice(firstNewline + 1)\n return `${prefix}- ${firstLine.trimStart()}\\n${rest}`\n }\n return `${prefix}- ${serialised}`\n })\n .join('\\n')\n }\n\n if (typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n if (entries.length === 0) return '{}'\n const prefix = ' '.repeat(indent)\n return entries\n .map(([key, val]) => {\n if (val === null || val === undefined) {\n return `${prefix}${key}: null`\n }\n if (typeof val === 'object') {\n const nested = toYaml(val, indent + 2)\n return `${prefix}${key}:\\n${nested}`\n }\n return `${prefix}${key}: ${toYaml(val, indent)}`\n })\n .join('\\n')\n }\n\n return String(value)\n}\n\nfunction needsQuoting(s: string): boolean {\n if (s === '') return true\n if (s === 'true' || s === 'false' || s === 'null') return true\n if (/^\\d/.test(s)) return true\n if (/[:{}\\[\\],&*#?|<>=!%@`'\"\\\\\\n\\r\\t]/.test(s)) return true\n if (s.startsWith(' ') || s.endsWith(' ')) return true\n return false\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { readOASListCache, writeOASListCache } from '../lib/cache.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { isJsonOutput, outputSuccess } from '../lib/output.js'\n\nexport function registerListOas(program: Command): void {\n program\n .command('listoas')\n .description('List all OAS services available in the current group')\n .option('--refresh', 'Bypass local cache and fetch fresh from server')\n .option('--format <fmt>', 'Output format: table | json | yaml', 'table')\n .action(async (opts: { refresh?: boolean; format?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n const useCache = !opts.refresh\n let entries = useCache ? await readOASListCache() : null\n\n if (!entries) {\n entries = await client.listOAS()\n if (entries.length > 0) {\n const maxTtl = Math.min(...entries.map((e) => e.cacheTtl))\n await writeOASListCache(entries, maxTtl)\n }\n }\n\n // Strip authConfig secrets — only expose { type }\n const safe = entries.map(({ authConfig, ...rest }) => ({\n ...rest,\n authConfig: { type: (authConfig as Record<string, unknown>)['type'] ?? rest.authType },\n }))\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n const format = (opts.format ?? 'table').toLowerCase()\n\n if (entries.length === 0) {\n console.log('No services registered in this group.')\n return\n }\n\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n const nameWidth = Math.max(10, ...entries.map((e) => e.name.length))\n console.log(`\\n${'SERVICE'.padEnd(nameWidth)} AUTH DESCRIPTION`)\n console.log(`${'-'.repeat(nameWidth)} -------- ${'-'.repeat(40)}`)\n for (const e of entries) {\n const auth = e.authType.padEnd(8)\n const desc = e.description.length > 60 ? e.description.slice(0, 57) + '...' : e.description\n console.log(`${e.name.padEnd(nameWidth)} ${auth} ${desc}`)\n }\n console.log()\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { isJsonOutput, outputSuccess } from '../lib/output.js'\n\nexport function registerListMcp(program: Command): void {\n program\n .command('listmcp')\n .description('List all MCP servers available in the current group')\n .option('--format <fmt>', 'Output format: table | json | yaml', 'table')\n .action(async (opts: { format?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n const entries = await client.listMCP()\n\n // Strip authConfig secrets — only expose { type }\n const safe = entries.map(({ authConfig, ...rest }) => ({\n ...rest,\n authConfig: { type: authConfig.type },\n }))\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n if (entries.length === 0) {\n console.log('No MCP servers registered in this group.')\n return\n }\n\n const format = (opts.format ?? 'table').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n const nameWidth = Math.max(10, ...entries.map(e => e.name.length))\n console.log(`\\n${'SERVER'.padEnd(nameWidth)} TRANSPORT DESCRIPTION`)\n console.log(`${'-'.repeat(nameWidth)} --------- ${'-'.repeat(40)}`)\n for (const e of entries) {\n const desc = e.description.length > 60 ? e.description.slice(0, 57) + '...' : e.description\n console.log(`${e.name.padEnd(nameWidth)} ${e.transport.padEnd(9)} ${desc}`)\n }\n console.log()\n })\n}\n","/**\n * Bridge between oas-cli and @tronsfey/openapi2cli run mode.\n *\n * Spawns openapi2cli as a child process, injecting auth config\n * as environment variables (never exposed to the agent's shell).\n */\nimport { spawn } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport { join, dirname } from 'node:path'\nimport type { OASEntryPublic } from './server-client.js'\n\nconst require = createRequire(import.meta.url)\n\nfunction resolveOpenapi2CliBin(): string {\n try {\n const pkgPath = require.resolve('@tronsfey/openapi2cli/package.json')\n const pkgDir = dirname(pkgPath)\n // @tronsfey/openapi2cli exposes its binary; find it\n const pkg = require('@tronsfey/openapi2cli/package.json') as { bin?: Record<string, string> }\n const binEntry = pkg.bin?.['openapi2cli'] ?? 'bin/openapi2cli.js'\n return join(pkgDir, binEntry)\n } catch {\n throw new Error(\n '@tronsfey/openapi2cli is not installed. Run: pnpm add @tronsfey/openapi2cli in packages/cli',\n )\n }\n}\n\nexport interface RunOptions {\n entry: OASEntryPublic\n /** Operation command args (e.g. ['listPets', '--limit', '10']) */\n operationArgs: string[]\n format?: 'json' | 'table' | 'yaml'\n query?: string\n /** Agent-friendly mode: wrap all output in structured JSON envelopes */\n machine?: boolean\n /** Preview the HTTP request without executing it (implies --machine) */\n dryRun?: boolean\n}\n\n/**\n * Build auth environment variables for injection into child process.\n * The calling shell (and thus the AI agent) never sees these values.\n */\nfunction buildAuthEnv(entry: OASEntryPublic): Record<string, string> {\n const cfg = entry.authConfig\n const prefix = entry.name.toUpperCase().replace(/[^A-Z0-9]/g, '_')\n\n switch (cfg['type']) {\n case 'bearer':\n return { [`${prefix}_TOKEN`]: cfg['token'] as string }\n\n case 'api_key':\n return { [`${prefix}_API_KEY`]: cfg['key'] as string }\n\n case 'basic':\n return { [`${prefix}_CREDENTIALS`]: `${cfg['username']}:${cfg['password']}` }\n\n case 'oauth2_cc':\n return {\n [`${prefix}_CLIENT_ID`]: cfg['clientId'] as string,\n [`${prefix}_CLIENT_SECRET`]: cfg['clientSecret'] as string,\n [`${prefix}_SCOPES`]: (cfg['scopes'] as string[]).join(' '),\n }\n\n default:\n return {}\n }\n}\n\n/**\n * Environment variable allowlist for subprocess execution.\n * Only these variables (when present in the parent) are forwarded to the\n * child process. This prevents leakage of secrets such as cloud credentials,\n * encryption keys, or database passwords that may be in the parent env.\n */\nconst SAFE_ENV_KEYS: readonly string[] = [\n // System essentials\n 'PATH', 'HOME', 'USER', 'LOGNAME', 'SHELL', 'TMPDIR', 'TMP', 'TEMP',\n // Terminal / display\n 'TERM', 'COLORTERM', 'NO_COLOR', 'FORCE_COLOR', 'LANG', 'LC_ALL',\n 'LC_CTYPE', 'LC_MESSAGES', 'LC_COLLATE',\n // Node.js\n 'NODE_ENV', 'NODE_PATH', 'NODE_OPTIONS', 'NODE_EXTRA_CA_CERTS',\n // Network proxy (required for tools behind corporate proxies)\n 'HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY',\n 'http_proxy', 'https_proxy', 'no_proxy',\n // OS-specific\n 'SYSTEMROOT', 'COMSPEC', 'APPDATA', 'LOCALAPPDATA', 'PROGRAMFILES',\n 'XDG_RUNTIME_DIR', 'XDG_CONFIG_HOME', 'XDG_CACHE_HOME', 'XDG_DATA_HOME',\n]\n\nfunction buildSafeEnv(authEnv: Record<string, string>): Record<string, string> {\n const safe: Record<string, string> = {}\n for (const key of SAFE_ENV_KEYS) {\n if (process.env[key] !== undefined) {\n safe[key] = process.env[key]!\n }\n }\n return { ...safe, ...authEnv }\n}\n\nexport async function runOperation(opts: RunOptions): Promise<void> {\n const bin = resolveOpenapi2CliBin()\n const { entry, operationArgs, format, query, machine, dryRun } = opts\n\n const args = [\n 'run',\n '--oas', entry.remoteUrl,\n '--cache-ttl', String(entry.cacheTtl),\n ...(entry.baseEndpoint ? ['--endpoint', entry.baseEndpoint] : []),\n ...(machine ? ['--machine'] : []),\n ...(dryRun ? ['--dry-run'] : []),\n ...(format ? ['--format', format] : []),\n ...(query ? ['--query', query] : []),\n ...operationArgs,\n ]\n\n const authEnv = buildAuthEnv(entry)\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(process.execPath, [bin, ...args], {\n stdio: 'inherit',\n env: buildSafeEnv(authEnv),\n })\n\n child.on('close', (code) => {\n if (code === 0) resolve()\n else reject(new Error(`openapi2cli exited with code ${code}`))\n })\n child.on('error', reject)\n })\n}\n\n/**\n * Get list of available operations for a service by running `--help`.\n * Returns the raw help text from openapi2cli.\n */\nexport async function getServiceHelp(entry: OASEntryPublic): Promise<string> {\n const bin = resolveOpenapi2CliBin()\n const args = [\n 'run',\n '--oas', entry.remoteUrl,\n '--cache-ttl', String(entry.cacheTtl),\n '--help',\n ]\n\n return new Promise<string>((resolve, reject) => {\n let output = ''\n const child = spawn(process.execPath, [bin, ...args], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n child.stdout?.on('data', (d: Buffer) => { output += d.toString() })\n child.stderr?.on('data', (d: Buffer) => { output += d.toString() })\n child.on('close', () => resolve(output))\n child.on('error', reject)\n })\n}\n\n/**\n * Get help for a specific operation by running `<operationId> --help`.\n * Returns the raw help text including parameter details.\n */\nexport async function getOperationHelp(entry: OASEntryPublic, operationId: string): Promise<string> {\n const bin = resolveOpenapi2CliBin()\n const args = [\n 'run',\n '--oas', entry.remoteUrl,\n '--cache-ttl', String(entry.cacheTtl),\n ...(entry.baseEndpoint ? ['--endpoint', entry.baseEndpoint] : []),\n operationId,\n '--help',\n ]\n\n return new Promise<string>((resolve, reject) => {\n let output = ''\n const child = spawn(process.execPath, [bin, ...args], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n child.stdout?.on('data', (d: Buffer) => { output += d.toString() })\n child.stderr?.on('data', (d: Buffer) => { output += d.toString() })\n child.on('close', () => resolve(output))\n child.on('error', reject)\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { getServiceHelp, getOperationHelp, runOperation } from '../lib/oas-runner.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\nconst VALID_OAS_ACTIONS = ['info', 'listapi', 'apiinfo', 'invokeapi'] as const\n\nexport function registerOas(program: Command): void {\n program\n .command('oas <name> <action> [args...]')\n .description(\n 'Interact with an OAS service: info | listapi | apiinfo <api> | invokeapi <api> --data <json>',\n )\n .option('--format <fmt>', 'Output format: json | table | yaml', 'json')\n .option('--data <json>', 'Request body (JSON string or @filename, for invokeapi)')\n .option('--params <json>', 'Operation parameters as JSON (for invokeapi)')\n .option('--query <jmespath>', 'Filter response with JMESPath expression')\n .option('--machine', 'Agent-friendly mode: structured JSON envelope output')\n .option('--dry-run', 'Preview the HTTP request without executing (implies --machine)')\n .allowUnknownOption(true)\n .action(async (\n name: string,\n action: string,\n args: string[],\n opts: { format?: string; data?: string; params?: string; query?: string; machine?: boolean; dryRun?: boolean },\n ) => {\n if (!(VALID_OAS_ACTIONS as readonly string[]).includes(action)) {\n outputError(ExitCode.USAGE_ERROR,\n `Unknown action: ${action}`,\n `Valid actions: ${VALID_OAS_ACTIONS.join(', ')}\\nUsage:\\n ucli oas <service> info\\n ucli oas <service> listapi\\n ucli oas <service> apiinfo <api>\\n ucli oas <service> invokeapi <api> --data <json>`)\n }\n\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n let entry\n try {\n entry = await client.getOAS(name)\n } catch {\n outputError(ExitCode.NOT_FOUND, `Service not found: ${name}`,\n 'Run: ucli listoas to see available services')\n }\n\n switch (action) {\n case 'info': {\n const { authConfig, ...rest } = entry\n const safe = {\n ...rest,\n authConfig: { type: (authConfig as Record<string, unknown>)['type'] ?? rest.authType },\n }\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n console.log(`\\nService: ${entry.name}`)\n console.log(`Description: ${entry.description || '(none)'}`)\n console.log(`OAS URL: ${entry.remoteUrl}`)\n if (entry.baseEndpoint) console.log(`Base endpoint: ${entry.baseEndpoint}`)\n console.log(`Auth type: ${entry.authType}`)\n console.log(`Cache TTL: ${entry.cacheTtl}s`)\n break\n }\n\n case 'listapi': {\n const help = await getServiceHelp(entry)\n const { authConfig, ...rest } = entry\n const safe = {\n ...rest,\n authConfig: { type: (authConfig as Record<string, unknown>)['type'] ?? rest.authType },\n operationsHelp: help,\n }\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n console.log(`\\nService: ${entry.name}`)\n console.log(`Description: ${entry.description || '(none)'}`)\n console.log('\\nAvailable operations:')\n console.log('─'.repeat(60))\n console.log(help)\n break\n }\n\n case 'apiinfo': {\n const apiName = args[0]\n if (!apiName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing API operation name.',\n 'Usage: ucli oas <service> apiinfo <api>')\n }\n\n const help = await getOperationHelp(entry, apiName)\n\n if (isJsonOutput()) {\n outputSuccess({ operation: apiName, service: name, help })\n return\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify({ operation: apiName, service: name, help }, null, 2))\n return\n }\n\n console.log(`\\nOperation: ${apiName} (service: ${name})`)\n console.log('─'.repeat(60))\n console.log(help)\n break\n }\n\n case 'invokeapi': {\n const apiName = args[0]\n if (!apiName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing API operation name.',\n 'Usage: ucli oas <service> invokeapi <api> --data <json>')\n }\n\n const operationArgs: string[] = [apiName]\n const extraArgs = args.slice(1)\n operationArgs.push(...extraArgs)\n\n if (opts.params) {\n let parsed: unknown\n try {\n parsed = JSON.parse(opts.params)\n } catch {\n outputError(ExitCode.USAGE_ERROR,\n 'Invalid --params JSON.',\n 'Example: --params \\'{\"petId\": 1}\\'')\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n if (v === undefined || v === null) continue\n const strVal = typeof v === 'object' ? JSON.stringify(v) : String(v)\n operationArgs.push(`--${k}`, strVal)\n }\n }\n }\n\n if (opts.data) {\n operationArgs.push('--data', opts.data)\n }\n\n const format = opts.format as 'json' | 'table' | 'yaml' | undefined\n const query = opts.query as string | undefined\n const machine = opts.machine ?? false\n const dryRun = opts.dryRun ?? false\n\n try {\n await runOperation({\n entry,\n operationArgs,\n ...(format !== undefined ? { format } : {}),\n ...(query !== undefined ? { query } : {}),\n ...(machine ? { machine } : {}),\n ...(dryRun ? { dryRun } : {}),\n })\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR,\n `Operation failed: ${(err as Error).message}`)\n }\n break\n }\n }\n })\n}\n","/**\n * MCP tool runner using @tronsfey/mcp2cli programmatic API.\n *\n * Auth credentials are injected via McpServerConfig (headers or env) —\n * never passed as CLI arguments (which would be visible in `ps`).\n */\nimport type { McpEntryPublic } from './server-client.js'\n\n/**\n * Resolve a named export from a module that may be CJS-wrapped (exports live\n * under `module.default`) or a plain ESM module (named exports at top level).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction resolve(mod: any, name: string): unknown {\n if (typeof mod[name] === 'function') return mod[name]\n if (mod.default && typeof mod.default[name] === 'function') return mod.default[name]\n throw new Error(`Cannot resolve export \"${name}\" from module`)\n}\n\nasync function getMcp2cli() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const clientMod = await import('@tronsfey/mcp2cli/dist/client/index.js') as any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const runnerMod = await import('@tronsfey/mcp2cli/dist/runner/index.js') as any\n return {\n createMcpClient: resolve(clientMod, 'createMcpClient') as (...args: unknown[]) => Promise<unknown>,\n getTools: resolve(runnerMod, 'getTools') as (...args: unknown[]) => Promise<{ name: string; description?: string; inputSchema?: unknown }[]>,\n runTool: resolve(runnerMod, 'runTool') as (...args: unknown[]) => Promise<void>,\n describeTool: resolve(runnerMod, 'describeTool') as (...args: unknown[]) => void,\n describeToolJson: resolve(runnerMod, 'describeToolJson') as (...args: unknown[]) => void,\n }\n}\n\nasync function closeClient(client: unknown): Promise<void> {\n if (typeof (client as { close?: unknown }).close === 'function') {\n await (client as { close: () => Promise<void> }).close()\n }\n}\n\nfunction buildMcpConfig(entry: McpEntryPublic): Record<string, unknown> {\n const base: Record<string, unknown> = { type: entry.transport }\n if (entry.transport === 'http') {\n base.url = entry.serverUrl\n } else {\n base.command = entry.command\n }\n const auth = entry.authConfig\n if (auth.type === 'http_headers') {\n base.headers = auth.headers\n } else if (auth.type === 'env') {\n base.env = auth.env\n }\n return base\n}\n\nexport async function listMcpTools(entry: McpEntryPublic): Promise<{ name: string; description?: string; inputSchema?: unknown }[]> {\n const { createMcpClient, getTools } = await getMcp2cli()\n const config = buildMcpConfig(entry)\n const client = await createMcpClient(config)\n try {\n const tools = await getTools(client, config, { noCache: true })\n return tools\n } finally {\n await closeClient(client)\n }\n}\n\nexport async function describeMcpTool(\n entry: McpEntryPublic,\n toolName: string,\n opts?: { json?: boolean },\n): Promise<void> {\n const { createMcpClient, getTools, describeTool, describeToolJson } = await getMcp2cli()\n const config = buildMcpConfig(entry)\n const client = await createMcpClient(config)\n try {\n const tools = await getTools(client, config, { noCache: false, cacheTtl: 3600 })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tool = tools.find((t: any) => t.name === toolName)\n if (!tool) throw new Error(`Tool \"${toolName}\" not found on MCP server \"${entry.name}\"`)\n if (opts?.json) {\n describeToolJson(tool)\n } else {\n describeTool(tool)\n }\n } finally {\n await closeClient(client)\n }\n}\n\nexport async function runMcpTool(\n entry: McpEntryPublic,\n toolName: string,\n rawArgs: string[],\n opts?: { json?: boolean; inputJson?: string },\n): Promise<void> {\n const { createMcpClient, getTools, runTool } = await getMcp2cli()\n const config = buildMcpConfig(entry)\n const client = await createMcpClient(config)\n try {\n const tools = await getTools(client, config, { noCache: false, cacheTtl: 3600 })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tool = tools.find((t: any) => t.name === toolName)\n if (!tool) throw new Error(`Tool \"${toolName}\" not found on MCP server \"${entry.name}\"`)\n const normalizedArgs: string[] = []\n for (const arg of rawArgs) {\n if (arg.includes('=') && !arg.startsWith('--')) {\n const idx = arg.indexOf('=')\n const key = arg.slice(0, idx)\n const value = arg.slice(idx + 1)\n normalizedArgs.push(`--${key}`, value)\n } else {\n normalizedArgs.push(arg)\n }\n }\n await runTool(client, tool, normalizedArgs, {\n ...(opts?.json ? { json: true } : {}),\n ...(opts?.inputJson ? { inputJson: opts.inputJson } : {}),\n })\n } finally {\n await closeClient(client)\n }\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { listMcpTools, describeMcpTool, runMcpTool } from '../lib/mcp-runner.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\nconst VALID_MCP_ACTIONS = ['listtool', 'toolinfo', 'invoketool'] as const\n\nexport function registerMcp(program: Command): void {\n program\n .command('mcp <name> <action> [args...]')\n .description(\n 'Interact with a MCP server: listtool | toolinfo <tool> | invoketool <tool> --data <json>',\n )\n .option('--format <fmt>', 'Output format: table | json | yaml', 'table')\n .option('--data <json>', 'Tool arguments as a JSON object (for invoketool)')\n .option('--json', 'Machine-readable JSON output')\n .allowUnknownOption(true)\n .action(async (name: string, action: string, args: string[], opts: { format?: string; data?: string; json?: boolean }) => {\n if (!(VALID_MCP_ACTIONS as readonly string[]).includes(action)) {\n outputError(ExitCode.USAGE_ERROR,\n `Unknown action: ${action}`,\n `Valid actions: ${VALID_MCP_ACTIONS.join(', ')}\\nUsage:\\n ucli mcp <server> listtool\\n ucli mcp <server> toolinfo <tool>\\n ucli mcp <server> invoketool <tool> --data <json>`)\n }\n\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n let entry\n try {\n entry = await client.getMCP(name)\n } catch {\n outputError(ExitCode.NOT_FOUND, `Unknown MCP server: ${name}`,\n 'Run: ucli listmcp to see available servers')\n }\n\n switch (action) {\n case 'listtool': {\n let tools\n try {\n tools = await listMcpTools(entry)\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR, `Failed to fetch tools: ${(err as Error).message}`)\n }\n\n if (isJsonOutput()) {\n outputSuccess(tools)\n return\n }\n\n if (tools.length === 0) {\n console.log(`No tools found on MCP server \"${name}\".`)\n return\n }\n\n const format = (opts.format ?? 'table').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(tools, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(tools))\n return\n }\n\n console.log(`\\nTools on \"${name}\":`)\n console.log('─'.repeat(60))\n for (const t of tools) {\n console.log(` ${t.name}`)\n if (t.description) console.log(` ${t.description}`)\n }\n console.log()\n break\n }\n\n case 'toolinfo': {\n const toolName = args[0]\n if (!toolName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing tool name.',\n 'Usage: ucli mcp <server> toolinfo <tool>')\n }\n\n try {\n await describeMcpTool(entry, toolName, { json: opts.json })\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR, `Failed to describe tool: ${(err as Error).message}`)\n }\n break\n }\n\n case 'invoketool': {\n const toolName = args[0]\n if (!toolName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing tool name.',\n 'Usage: ucli mcp <server> invoketool <tool> --data <json>')\n }\n\n const extraArgs = args.slice(1)\n try {\n await runMcpTool(entry, toolName, extraArgs, {\n json: opts.json,\n inputJson: opts.data,\n })\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR, `Tool execution failed: ${(err as Error).message}`)\n }\n break\n }\n }\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { writeOASListCache, clearOASListCache, clearOASCache } from '../lib/cache.js'\nimport { isJsonOutput, outputSuccess } from '../lib/output.js'\n\nexport function registerRefresh(program: Command): void {\n program\n .command('refresh')\n .description('Force-refresh the local OAS cache from the server')\n .option('--service <name>', 'Refresh only a specific service')\n .action(async (opts: { service?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n if (!isJsonOutput()) {\n console.log('Refreshing OAS list from server...')\n }\n\n if (opts.service) {\n await clearOASCache(opts.service)\n } else {\n await clearOASListCache()\n }\n\n const entries = await client.listOAS()\n if (entries.length > 0) {\n const maxTtl = Math.min(...entries.map((e) => e.cacheTtl))\n await writeOASListCache(entries, maxTtl)\n }\n\n if (isJsonOutput()) {\n outputSuccess({ refreshed: entries.length })\n return\n }\n\n console.log(`✓ Refreshed ${entries.length} service(s).`)\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig, isConfigured } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { readOASListCache, writeOASListCache } from '../lib/cache.js'\nimport { getServiceHelp } from '../lib/oas-runner.js'\nimport { ExitCode } from '../lib/exit-codes.js'\n\nexport function registerHelp(program: Command): void {\n program\n .command('help [service]')\n .description('Show usage guide. Pass a service name for service-specific operations.')\n .action(async (service?: string) => {\n if (!service) {\n printGeneralHelp()\n if (isConfigured()) {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n let entries = await readOASListCache()\n if (!entries) {\n entries = await client.listOAS()\n if (entries.length > 0) {\n const maxTtl = Math.min(...entries.map((e) => e.cacheTtl))\n await writeOASListCache(entries, maxTtl)\n }\n }\n if (entries.length > 0) {\n console.log('\\nAvailable services:')\n for (const e of entries) {\n console.log(` ${e.name.padEnd(20)} ${e.description}`)\n }\n console.log('\\nTip: Run `ucli oas <service> listapi` for service-specific operations.')\n }\n } else {\n console.log('\\nRun `ucli configure --server <url> --token <jwt>` to get started.')\n }\n return\n }\n\n // Service-specific help\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n let entry\n try {\n entry = await client.getOAS(service)\n } catch {\n console.error(`Unknown service: ${service}`)\n console.error('Run `ucli listoas` to see available services.')\n process.exit(ExitCode.NOT_FOUND)\n }\n\n console.log(`\\n=== ${entry.name} ===`)\n console.log(`${entry.description}`)\n console.log(`\\nOAS spec: ${entry.remoteUrl}`)\n console.log('\\nOperations:')\n console.log('─'.repeat(60))\n\n const help = await getServiceHelp(entry)\n console.log(help)\n\n console.log('\\nExamples:')\n console.log(` ucli oas ${entry.name} listapi`)\n console.log(` ucli oas ${entry.name} apiinfo <operation>`)\n console.log(` ucli oas ${entry.name} invokeapi <operation> --data '{\"key\":\"value\"}'`)\n })\n}\n\nfunction printGeneralHelp(): void {\n console.log(`\nucli — OpenAPI & MCP Gateway for AI Agents\n════════════════════════════════════════\n\nSETUP\n ucli configure --server <url> --token <jwt>\n Configure server connection and authentication.\n\nDISCOVERY\n ucli listoas\n List all OAS services available in your group.\n\n ucli listmcp\n List all MCP servers available in your group.\n\n ucli introspect\n Return complete capability manifest in a single call (JSON).\n Ideal for AI agents: includes services, MCP servers, and command reference.\n\n ucli help [service]\n Show this guide, or service-specific operations.\n\nOAS SERVICES\n ucli oas <service> info\n Show detailed service information.\n\n ucli oas <service> listapi\n List all available API operations.\n\n ucli oas <service> apiinfo <api>\n Show detailed input/output parameters for an API operation.\n\n ucli oas <service> invokeapi <api> [options]\n Execute an API operation.\n\n Options:\n --format json|table|yaml Output format (default: json)\n --query <jmespath> Filter response with JMESPath\n --data <json|@file> Request body for POST/PUT/PATCH\n\nMCP SERVERS\n ucli mcp <server> listtool\n List tools available on a MCP server.\n\n ucli mcp <server> toolinfo <tool>\n Show detailed input/output parameters for a tool.\n\n ucli mcp <server> invoketool <tool> --data <json>\n Call a tool on a MCP server.\n\nMAINTENANCE\n ucli refresh\n Force-refresh the local OAS cache from the server.\n\n ucli doctor\n Check configuration, server connectivity, and token validity.\n\nSHELL COMPLETIONS\n eval \"$(ucli completions bash)\"\n eval \"$(ucli completions zsh)\"\n ucli completions fish | source\n\nGLOBAL FLAGS\n --debug Enable verbose debug logging\n --output json Wrap ALL output in structured JSON envelopes\n (for agent/automation consumption)\n -v, --version Show version number\n\nERRORS\n 401 Unauthorized → Run: ucli configure --server <url> --token <jwt>\n 404 Not Found → Check service name: ucli listoas\n 4xx Client Error → Check operation args: ucli oas <service> listapi\n 5xx Server Error → Retry or run: ucli refresh\n\nAI AGENT QUICK START\n 1. ucli introspect # discover everything in one call\n 2. ucli oas <svc> invokeapi <op> # execute OAS operations\n 3. ucli mcp <srv> invoketool <t> # execute MCP tools\n 4. Use --output json globally # get structured { success, data/error } envelopes\n`)\n}\n","/**\n * Consistent error formatting utility.\n *\n * Provides a unified error output with actionable hints so that both\n * humans and AI agents can quickly understand what went wrong and how\n * to fix it.\n *\n * When `--output json` is active, errors are emitted as structured JSON\n * to stdout (via outputError) so that agents can parse them reliably.\n */\nimport { ExitCode, type ExitCodeValue } from './exit-codes.js'\nimport { isJsonOutput, outputError } from './output.js'\n\nlet debugEnabled = false\n\nexport function setDebugMode(enabled: boolean): void {\n debugEnabled = enabled\n}\n\nexport function isDebugMode(): boolean {\n return debugEnabled\n}\n\n/** Log a debug message (only when --debug is active). */\nexport function debug(message: string): void {\n if (debugEnabled) {\n console.error(`[DEBUG] ${message}`)\n }\n}\n\nexport interface FormattedError {\n code: ExitCodeValue\n message: string\n hint?: string\n}\n\nexport const HINT_MAP: Record<number, string> = {\n [ExitCode.CONFIG_ERROR]:\n 'Run: ucli configure --server <url> --token <jwt>',\n [ExitCode.AUTH_ERROR]:\n 'Your token may be expired or revoked. Run: ucli configure --server <url> --token <jwt>',\n [ExitCode.CONNECTIVITY_ERROR]:\n 'Check that the server URL is correct and the server is running. Run: ucli doctor',\n [ExitCode.NOT_FOUND]:\n 'Check the resource name. Run: ucli listoas or ucli listmcp',\n [ExitCode.SERVER_ERROR]:\n 'The server returned an unexpected error. Try again or run: ucli doctor',\n}\n\n/**\n * Print a formatted error to stderr and exit with the given code.\n *\n * When `--output json` is active, emits structured JSON to stdout\n * instead of human-readable text to stderr.\n * When --debug is active, the full stack trace is also printed (text mode only).\n */\nexport function formatError(err: unknown, code?: ExitCodeValue): never {\n const exitCode = code ?? classifyError(err)\n const message = err instanceof Error ? err.message : String(err)\n const hint = HINT_MAP[exitCode]\n\n // In JSON output mode, delegate to the structured envelope emitter\n if (isJsonOutput()) {\n outputError(exitCode, message, hint)\n }\n\n console.error(`\\n✖ Error: ${message}`)\n if (hint) {\n console.error(` Hint: ${hint}`)\n }\n\n if (debugEnabled && err instanceof Error && err.stack) {\n console.error(`\\n${err.stack}`)\n }\n\n process.exit(exitCode)\n}\n\n/** Classify an error into an exit code based on common patterns. */\nexport function classifyError(err: unknown): ExitCodeValue {\n if (!(err instanceof Error)) return ExitCode.GENERAL_ERROR\n\n const msg = err.message.toLowerCase()\n\n if (msg.includes('not configured') || msg.includes('missing')) {\n return ExitCode.CONFIG_ERROR\n }\n if (msg.includes('401') || msg.includes('unauthorized') || msg.includes('authentication')) {\n return ExitCode.AUTH_ERROR\n }\n if (msg.includes('econnrefused') || msg.includes('enotfound') || msg.includes('timeout') || msg.includes('network')) {\n return ExitCode.CONNECTIVITY_ERROR\n }\n if (msg.includes('404') || msg.includes('not found')) {\n return ExitCode.NOT_FOUND\n }\n if (msg.includes('5') && msg.includes('server error')) {\n return ExitCode.SERVER_ERROR\n }\n\n return ExitCode.GENERAL_ERROR\n}\n","/**\n * `ucli doctor` — diagnostic tool for configuration, connectivity, and token validation.\n *\n * Checks:\n * 1. Configuration file exists and is readable\n * 2. Server URL is reachable (GET /api/v1/health)\n * 3. JWT token is accepted (GET /api/v1/oas — expects 200 or empty list)\n */\nimport type { Command } from 'commander'\nimport { isConfigured, getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { debug } from '../lib/errors.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\nimport axios from 'axios'\n\ninterface CheckResult {\n name: string\n ok: boolean\n detail: string\n}\n\nexport function registerDoctor(program: Command): void {\n program\n .command('doctor')\n .description('Check configuration, server connectivity, and token validity')\n .action(async () => {\n const results: CheckResult[] = []\n\n // ── Check 1: Configuration ──────────────────────────────────────\n debug('Checking configuration...')\n if (!isConfigured()) {\n results.push({\n name: 'Configuration',\n ok: false,\n detail: 'Not configured. Run: ucli configure --server <url> --token <jwt>',\n })\n outputError(ExitCode.CONFIG_ERROR,\n 'Not configured',\n 'Run: ucli configure --server <url> --token <jwt>')\n }\n\n let cfg: { serverUrl: string; token: string }\n try {\n cfg = getConfig()\n results.push({\n name: 'Configuration',\n ok: true,\n detail: `Server: ${cfg.serverUrl}`,\n })\n } catch (err) {\n results.push({\n name: 'Configuration',\n ok: false,\n detail: `Failed to read config: ${(err as Error).message}`,\n })\n outputError(ExitCode.CONFIG_ERROR,\n `Failed to read config: ${(err as Error).message}`,\n 'Run: ucli configure --server <url> --token <jwt>')\n }\n\n // ── Check 2: Connectivity (health endpoint, no auth required) ──\n debug(`Checking connectivity to ${cfg.serverUrl}...`)\n try {\n const healthUrl = `${cfg.serverUrl}/api/v1/health`\n const resp = await axios.get(healthUrl, { timeout: 10_000 })\n results.push({\n name: 'Server connectivity',\n ok: resp.status === 200,\n detail: resp.status === 200\n ? `Health endpoint OK (${cfg.serverUrl})`\n : `Unexpected status: ${resp.status}`,\n })\n } catch (err) {\n const msg = axios.isAxiosError(err)\n ? err.code ?? err.message\n : (err as Error).message\n results.push({\n name: 'Server connectivity',\n ok: false,\n detail: `Cannot reach server: ${msg}`,\n })\n }\n\n // ── Check 3: Token validity (authenticated request) ────────────\n debug('Validating JWT token...')\n try {\n const client = new ServerClient(cfg)\n await client.listOAS()\n results.push({\n name: 'Authentication',\n ok: true,\n detail: 'Token accepted by server',\n })\n } catch (err) {\n const msg = (err as Error).message\n results.push({\n name: 'Authentication',\n ok: false,\n detail: `Token rejected: ${msg}`,\n })\n }\n\n const allOk = results.every((r) => r.ok)\n\n if (isJsonOutput()) {\n outputSuccess({\n healthy: allOk,\n checks: results,\n })\n process.exit(allOk ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR)\n }\n\n printResults(results)\n process.exit(allOk ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR)\n })\n}\n\nfunction printResults(results: CheckResult[]): void {\n console.log('\\nucli doctor\\n' + '═'.repeat(40))\n for (const r of results) {\n const icon = r.ok ? '✓' : '✖'\n console.log(` ${icon} ${r.name}: ${r.detail}`)\n }\n console.log()\n}\n","/**\n * `ucli completions` — generate shell completion scripts for bash/zsh/fish.\n *\n * Usage:\n * eval \"$(ucli completions bash)\"\n * eval \"$(ucli completions zsh)\"\n * ucli completions fish | source\n */\nimport type { Command } from 'commander'\nimport { ExitCode } from '../lib/exit-codes.js'\n\nexport function registerCompletions(program: Command): void {\n program\n .command('completions <shell>')\n .description('Generate shell completion script (bash | zsh | fish)')\n .action((shell: string) => {\n const normalized = shell.toLowerCase().trim()\n\n switch (normalized) {\n case 'bash':\n console.log(bashCompletions())\n break\n case 'zsh':\n console.log(zshCompletions())\n break\n case 'fish':\n console.log(fishCompletions())\n break\n default:\n console.error(`Unsupported shell: ${shell}. Supported: bash, zsh, fish`)\n process.exit(ExitCode.USAGE_ERROR)\n }\n })\n}\n\nfunction bashCompletions(): string {\n return `# ucli bash completions — eval \"$(ucli completions bash)\"\n_ucli_completions() {\n local cur prev commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"configure listoas listmcp oas mcp refresh help doctor completions introspect\"\n\n case \"\\${COMP_WORDS[1]}\" in\n oas)\n if [ \"$COMP_CWORD\" -eq 3 ]; then\n COMPREPLY=( $(compgen -W \"info listapi apiinfo invokeapi\" -- \"$cur\") )\n fi\n return 0\n ;;\n mcp)\n if [ \"$COMP_CWORD\" -eq 3 ]; then\n COMPREPLY=( $(compgen -W \"listtool toolinfo invoketool\" -- \"$cur\") )\n fi\n return 0\n ;;\n completions)\n COMPREPLY=( $(compgen -W \"bash zsh fish\" -- \"$cur\") )\n return 0\n ;;\n listoas|listmcp|help)\n # dynamic completions would require server calls; skip for now\n return 0\n ;;\n esac\n\n if [ \"$COMP_CWORD\" -eq 1 ]; then\n COMPREPLY=( $(compgen -W \"$commands\" -- \"$cur\") )\n fi\n\n return 0\n}\ncomplete -F _ucli_completions ucli`\n}\n\nfunction zshCompletions(): string {\n return `# ucli zsh completions — eval \"$(ucli completions zsh)\"\n#compdef ucli\n\n_ucli() {\n local -a commands\n commands=(\n 'configure:Configure server URL and authentication token'\n 'listoas:List all OAS services'\n 'listmcp:List all MCP servers'\n 'oas:Interact with an OAS service'\n 'mcp:Interact with a MCP server'\n 'refresh:Force-refresh the local OAS cache'\n 'help:Show usage guide'\n 'doctor:Check configuration and connectivity'\n 'completions:Generate shell completion script'\n 'introspect:Return complete capability manifest for AI agents'\n )\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '*::arg:->args'\n\n case $state in\n command)\n _describe -t commands 'ucli commands' commands\n ;;\n args)\n case $words[1] in\n oas)\n if (( CURRENT == 3 )); then\n _values 'action' 'info[Show service info]' 'listapi[List API operations]' 'apiinfo[Show API details]' 'invokeapi[Invoke an API]'\n fi\n ;;\n mcp)\n if (( CURRENT == 3 )); then\n _values 'action' 'listtool[List tools]' 'toolinfo[Show tool details]' 'invoketool[Invoke a tool]'\n fi\n ;;\n completions)\n _values 'shell' bash zsh fish\n ;;\n esac\n ;;\n esac\n}\n\n_ucli \"$@\"`\n}\n\nfunction fishCompletions(): string {\n return `# ucli fish completions — ucli completions fish | source\ncomplete -c ucli -e\n\n# Top-level commands\ncomplete -c ucli -n __fish_use_subcommand -a configure -d 'Configure server URL and token'\ncomplete -c ucli -n __fish_use_subcommand -a listoas -d 'List OAS services'\ncomplete -c ucli -n __fish_use_subcommand -a listmcp -d 'List MCP servers'\ncomplete -c ucli -n __fish_use_subcommand -a oas -d 'Interact with an OAS service'\ncomplete -c ucli -n __fish_use_subcommand -a mcp -d 'Interact with a MCP server'\ncomplete -c ucli -n __fish_use_subcommand -a refresh -d 'Refresh local cache'\ncomplete -c ucli -n __fish_use_subcommand -a help -d 'Show usage guide'\ncomplete -c ucli -n __fish_use_subcommand -a doctor -d 'Check config and connectivity'\ncomplete -c ucli -n __fish_use_subcommand -a completions -d 'Generate shell completions'\ncomplete -c ucli -n __fish_use_subcommand -a introspect -d 'Return capability manifest for AI agents'\n\n# oas actions (third argument after server name)\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a info -d 'Show service info'\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a listapi -d 'List API operations'\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a apiinfo -d 'Show API details'\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a invokeapi -d 'Invoke an API'\n\n# mcp actions (third argument after server name)\ncomplete -c ucli -n '__fish_seen_subcommand_from mcp' -a listtool -d 'List tools'\ncomplete -c ucli -n '__fish_seen_subcommand_from mcp' -a toolinfo -d 'Show tool details'\ncomplete -c ucli -n '__fish_seen_subcommand_from mcp' -a invoketool -d 'Invoke a tool'\n\n# completions subcommands\ncomplete -c ucli -n '__fish_seen_subcommand_from completions' -a 'bash zsh fish' -d 'Shell type'`\n}\n","/**\n * `ucli introspect` — unified capability discovery for AI agents.\n *\n * Returns a complete machine-readable manifest of everything the agent\n * can do in a single call: OAS services, MCP servers, and the CLI\n * command reference. This eliminates multiple round-trips that agents\n * would otherwise need (`services list` → `services info` × N →\n * `mcp list` → `mcp tools` × N).\n *\n * Methodology: This follows the \"Observe → Orient → Decide → Act\" (OODA)\n * loop and the ReAct pattern — agents should call `introspect` once at\n * the start of a task to build a mental model before acting.\n */\nimport type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient, type OASEntryPublic, type McpEntryPublic } from '../lib/server-client.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\n/**\n * Shape of the introspection manifest returned by `ucli introspect`.\n */\nexport interface IntrospectManifest {\n version: string\n services: IntrospectService[]\n mcpServers: IntrospectMcpServer[]\n commands: IntrospectCommand[]\n}\n\nexport interface IntrospectService {\n name: string\n description: string\n authType: string\n remoteUrl: string\n baseEndpoint: string | null\n cacheTtl: number\n}\n\nexport interface IntrospectMcpServer {\n name: string\n description: string\n transport: string\n enabled: boolean\n}\n\nexport interface IntrospectCommand {\n name: string\n description: string\n usage: string\n examples: string[]\n}\n\nexport function registerIntrospect(program: Command): void {\n program\n .command('introspect')\n .description('Return a complete capability manifest for AI agent discovery (services, MCP servers, commands)')\n .option('--format <fmt>', 'Output format: json | yaml', 'json')\n .action(async (opts: { format?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n // Fetch OAS services and MCP servers in parallel\n let oasEntries: OASEntryPublic[] = []\n let mcpEntries: McpEntryPublic[] = []\n\n try {\n ;[oasEntries, mcpEntries] = await Promise.all([\n client.listOAS(),\n client.listMCP(),\n ])\n } catch (err) {\n const message = (err as Error).message\n outputError(ExitCode.CONNECTIVITY_ERROR, `Failed to fetch capabilities: ${message}`,\n 'Check server connectivity with: ucli doctor')\n }\n\n const manifest: IntrospectManifest = {\n version: '1',\n services: oasEntries.map(toIntrospectService),\n mcpServers: mcpEntries.map(toIntrospectMcpServer),\n commands: getCommandReference(),\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n\n if (isJsonOutput()) {\n outputSuccess(manifest)\n return\n }\n\n if (format === 'json') {\n console.log(JSON.stringify(manifest, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(manifest))\n return\n }\n\n // Fallback to json\n console.log(JSON.stringify(manifest, null, 2))\n })\n}\n\nfunction toIntrospectService(e: OASEntryPublic): IntrospectService {\n return {\n name: e.name,\n description: e.description,\n authType: e.authType,\n remoteUrl: e.remoteUrl,\n baseEndpoint: e.baseEndpoint,\n cacheTtl: e.cacheTtl,\n }\n}\n\nfunction toIntrospectMcpServer(e: McpEntryPublic): IntrospectMcpServer {\n return {\n name: e.name,\n description: e.description,\n transport: e.transport,\n enabled: e.enabled,\n }\n}\n\n/**\n * Static command reference that agents can use to understand\n * what CLI commands are available and how to use them.\n */\nfunction getCommandReference(): IntrospectCommand[] {\n return [\n {\n name: 'listoas',\n description: 'List all OAS services available in the current group',\n usage: 'ucli listoas [--format json|table|yaml] [--refresh]',\n examples: [\n 'ucli listoas',\n 'ucli listoas --format json',\n 'ucli listoas --refresh',\n ],\n },\n {\n name: 'oas info',\n description: 'Show detailed information for an OAS service',\n usage: 'ucli oas <service> info [--format json|table|yaml]',\n examples: [\n 'ucli oas payments info',\n 'ucli oas payments info --format json',\n ],\n },\n {\n name: 'oas listapi',\n description: 'List all available API operations for an OAS service',\n usage: 'ucli oas <service> listapi [--format json|table|yaml]',\n examples: [\n 'ucli oas payments listapi',\n 'ucli oas payments listapi --format json',\n ],\n },\n {\n name: 'oas apiinfo',\n description: 'Show detailed input/output parameters for a specific API operation',\n usage: 'ucli oas <service> apiinfo <api>',\n examples: [\n 'ucli oas payments apiinfo createCharge',\n 'ucli oas payments apiinfo getTransaction',\n ],\n },\n {\n name: 'oas invokeapi',\n description: 'Execute an API operation on an OAS service',\n usage: 'ucli oas <service> invokeapi <api> [--format json|table|yaml] [--query <jmespath>] [--data <json|@file>] [--params <json>] [--machine] [--dry-run]',\n examples: [\n 'ucli oas payments invokeapi listTransactions',\n 'ucli oas payments invokeapi getTransaction --params \\'{\"transactionId\": \"txn_123\"}\\'',\n 'ucli oas payments invokeapi createCharge --data \\'{\"amount\": 5000, \"currency\": \"USD\"}\\'',\n 'ucli oas inventory invokeapi listProducts --query \"items[?stock > `0`].name\"',\n 'ucli oas payments invokeapi createCharge --dry-run --data \\'{\"amount\": 5000}\\'',\n ],\n },\n {\n name: 'listmcp',\n description: 'List all MCP servers available in the current group',\n usage: 'ucli listmcp [--format json|table|yaml]',\n examples: [\n 'ucli listmcp',\n 'ucli listmcp --format json',\n ],\n },\n {\n name: 'mcp listtool',\n description: 'List tools available on a MCP server',\n usage: 'ucli mcp <server> listtool [--format json|table|yaml]',\n examples: [\n 'ucli mcp weather listtool',\n 'ucli mcp weather listtool --format json',\n ],\n },\n {\n name: 'mcp toolinfo',\n description: 'Show detailed input/output schema for a tool on a MCP server',\n usage: 'ucli mcp <server> toolinfo <tool> [--json]',\n examples: [\n 'ucli mcp weather toolinfo get_forecast',\n 'ucli mcp weather toolinfo get_forecast --json',\n ],\n },\n {\n name: 'mcp invoketool',\n description: 'Call a tool on a MCP server',\n usage: 'ucli mcp <server> invoketool <tool> [--data <json>] [--json]',\n examples: [\n 'ucli mcp weather invoketool get_forecast --data \\'{\"location\": \"New York\"}\\'',\n 'ucli mcp search invoketool web_search --data \\'{\"query\": \"ucli docs\", \"limit\": 5}\\'',\n 'ucli mcp weather invoketool get_forecast --json --data \\'{\"location\": \"New York\"}\\'',\n ],\n },\n {\n name: 'introspect',\n description: 'Return complete capability manifest (this command)',\n usage: 'ucli introspect [--format json|yaml]',\n examples: [\n 'ucli introspect',\n 'ucli introspect --format yaml',\n ],\n },\n {\n name: 'refresh',\n description: 'Force-refresh the local OAS cache from the server',\n usage: 'ucli refresh [--service <name>]',\n examples: [\n 'ucli refresh',\n 'ucli refresh --service payments',\n ],\n },\n {\n name: 'doctor',\n description: 'Check configuration, server connectivity, and token validity',\n usage: 'ucli doctor',\n examples: ['ucli doctor'],\n },\n {\n name: 'configure',\n description: 'Configure the server URL and authentication token',\n usage: 'ucli configure --server <url> --token <jwt>',\n examples: ['ucli configure --server https://oas.example.com --token eyJ...'],\n },\n ]\n}\n"],"mappings":"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","names":["createRequire","program","join","join","program","program","join","dirname","require","pkg","resolve","program","program","program","program","cfg","client","axios","program","program","program","require","createRequire"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/lib/config-encryption.ts","../src/lib/server-client.ts","../src/lib/exit-codes.ts","../src/lib/output.ts","../src/commands/configure.ts","../src/lib/cache.ts","../src/lib/yaml.ts","../src/commands/listoas.ts","../src/commands/listmcp.ts","../src/lib/oas-runner.ts","../src/commands/oas.ts","../src/lib/mcp-runner.ts","../src/commands/mcp.ts","../src/commands/refresh.ts","../src/commands/help-cmd.ts","../src/lib/errors.ts","../src/commands/doctor.ts","../src/commands/completions.ts","../src/commands/introspect.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { createRequire } from 'node:module'\nimport { registerConfigure } from './commands/configure.js'\nimport { registerListOas } from './commands/listoas.js'\nimport { registerListMcp } from './commands/listmcp.js'\nimport { registerOas } from './commands/oas.js'\nimport { registerMcp } from './commands/mcp.js'\nimport { registerRefresh } from './commands/refresh.js'\nimport { registerHelp } from './commands/help-cmd.js'\nimport { registerDoctor } from './commands/doctor.js'\nimport { registerCompletions } from './commands/completions.js'\nimport { registerIntrospect } from './commands/introspect.js'\nimport { setDebugMode } from './lib/errors.js'\nimport { setOutputMode, type OutputMode } from './lib/output.js'\n\nconst require = createRequire(import.meta.url)\nconst pkg = require('../package.json') as { version: string; description: string }\n\nconst program = new Command()\n\nprogram\n .name('ucli')\n .description(pkg.description)\n .version(pkg.version, '-v, --version')\n .option('--debug', 'Enable verbose debug logging')\n .option('--output <mode>', 'Output mode: text | json (json wraps every result in a structured envelope for agent consumption)', 'text')\n .addHelpCommand(false) // we provide our own help command\n .hook('preAction', (_thisCommand, actionCommand) => {\n // Walk up to root to find the --debug and --output flags\n let cmd = actionCommand\n while (cmd) {\n const opts = cmd.opts() as Record<string, unknown>\n if (opts.debug) {\n setDebugMode(true)\n }\n if (opts.output && typeof opts.output === 'string') {\n const mode = opts.output.toLowerCase() as OutputMode\n if (mode === 'json' || mode === 'text') {\n setOutputMode(mode)\n }\n }\n cmd = cmd.parent as Command\n }\n })\n\nregisterConfigure(program)\nregisterListOas(program)\nregisterListMcp(program)\nregisterOas(program)\nregisterMcp(program)\nregisterRefresh(program)\nregisterDoctor(program)\nregisterCompletions(program)\nregisterIntrospect(program)\nregisterHelp(program)\n\nprogram.parse(process.argv)\n","import Conf from 'conf'\nimport { homedir } from 'node:os'\nimport { join, dirname } from 'node:path'\nimport { chmodSync, mkdirSync } from 'node:fs'\nimport { encryptValue, decryptValue, isEncrypted } from './lib/config-encryption.js'\n\nexport interface CLIConfig {\n serverUrl: string\n token: string\n}\n\nconst conf = new Conf<CLIConfig>({\n projectName: 'ucli',\n schema: {\n serverUrl: { type: 'string' },\n token: { type: 'string' },\n },\n})\n\nexport const cacheDir = join(homedir(), '.cache', 'ucli')\n\n/** Ensure the config file and its directory have restrictive permissions. */\nfunction hardenConfigPermissions(): void {\n try {\n const configPath = conf.path\n const configDir = dirname(configPath)\n mkdirSync(configDir, { recursive: true, mode: 0o700 })\n chmodSync(configDir, 0o700)\n chmodSync(configPath, 0o600)\n } catch {\n // Permission enforcement may fail on some platforms (e.g., Windows)\n console.warn('Warning: Could not enforce restrictive file permissions on config. Token is encrypted but file permissions may be permissive.')\n }\n}\n\nexport function getConfig(): CLIConfig {\n const serverUrl = conf.get('serverUrl')\n const rawToken = conf.get('token')\n\n if (!serverUrl || !rawToken) {\n console.error('ucli is not configured. Run: ucli configure --server <url> --token <jwt>')\n process.exit(1)\n }\n\n const token = decryptValue(rawToken)\n\n // Auto-migrate: re-encrypt legacy plaintext tokens on read\n if (!isEncrypted(rawToken)) {\n conf.set('token', encryptValue(token))\n hardenConfigPermissions()\n }\n\n return { serverUrl, token }\n}\n\nexport function saveConfig(cfg: CLIConfig): void {\n conf.set('serverUrl', cfg.serverUrl)\n conf.set('token', encryptValue(cfg.token))\n hardenConfigPermissions()\n}\n\nexport function isConfigured(): boolean {\n return Boolean(conf.get('serverUrl') && conf.get('token'))\n}\n","/**\n * Config value encryption utilities.\n *\n * Encrypts sensitive config values (e.g., JWT tokens) at rest using AES-256-GCM\n * with a machine-specific derived key. This ensures credentials are never stored\n * in plaintext on disk.\n *\n * Key derivation: PBKDF2(username + hostname, random-salt, 100k iterations, SHA-512)\n * Format: \"enc:v1:<base64(salt + iv + authTag + ciphertext)>\"\n */\nimport {\n createCipheriv,\n createDecipheriv,\n randomBytes,\n pbkdf2Sync,\n} from 'node:crypto'\nimport { hostname, userInfo } from 'node:os'\n\nconst ENC_PREFIX = 'enc:v1:'\nconst ALGORITHM = 'aes-256-gcm'\nconst SALT_LEN = 32\nconst IV_LEN = 12\nconst TAG_LEN = 16\nconst PBKDF2_ITERATIONS = 100_000\n\n/** Derive a 256-bit key from machine-specific identity + per-value random salt. */\nfunction deriveKey(salt: Buffer): Buffer {\n let user = 'default'\n try {\n user = userInfo().username\n } catch {\n // userInfo() may throw on some platforms (e.g., certain containers)\n }\n const material = `ucli:${user}@${hostname()}`\n return pbkdf2Sync(material, salt, PBKDF2_ITERATIONS, 32, 'sha512')\n}\n\n/** Encrypt a plaintext string. Returns prefixed ciphertext string. */\nexport function encryptValue(plaintext: string): string {\n const salt = randomBytes(SALT_LEN)\n const key = deriveKey(salt)\n const iv = randomBytes(IV_LEN)\n const cipher = createCipheriv(ALGORITHM, key, iv)\n const encrypted = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()])\n const tag = cipher.getAuthTag()\n const packed = Buffer.concat([salt, iv, tag, encrypted])\n return ENC_PREFIX + packed.toString('base64')\n}\n\n/**\n * Decrypt a stored value. If the value has the encryption prefix, it is\n * decrypted; otherwise it is returned as-is for backward compatibility\n * with legacy plaintext configs.\n */\nexport function decryptValue(stored: string): string {\n if (!stored.startsWith(ENC_PREFIX)) {\n return stored\n }\n const packed = Buffer.from(stored.slice(ENC_PREFIX.length), 'base64')\n const salt = packed.subarray(0, SALT_LEN)\n const iv = packed.subarray(SALT_LEN, SALT_LEN + IV_LEN)\n const tag = packed.subarray(SALT_LEN + IV_LEN, SALT_LEN + IV_LEN + TAG_LEN)\n const encrypted = packed.subarray(SALT_LEN + IV_LEN + TAG_LEN)\n const key = deriveKey(salt)\n const decipher = createDecipheriv(ALGORITHM, key, iv)\n decipher.setAuthTag(tag)\n return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString('utf8')\n}\n\n/** Check whether a stored value is encrypted (has the encryption prefix). */\nexport function isEncrypted(value: string): boolean {\n return value.startsWith(ENC_PREFIX)\n}\n","/**\n * HTTP client for the ucli-server API.\n * Attaches group JWT and handles common error cases.\n */\nimport axios, { type AxiosInstance } from 'axios'\nimport type { CLIConfig } from '../config.js'\n\nexport interface OASEntryPublic {\n id: string\n name: string\n description: string\n remoteUrl: string\n baseEndpoint: string | null\n authType: 'bearer' | 'api_key' | 'basic' | 'oauth2_cc' | 'none'\n authConfig: Record<string, unknown>\n cacheTtl: number\n}\n\nexport type McpAuthConfig =\n | { type: 'none' }\n | { type: 'http_headers'; headers: Record<string, string> }\n | { type: 'env'; env: Record<string, string> }\n\nexport interface McpEntryPublic {\n id: string\n groupId: string\n name: string\n description: string\n transport: 'http' | 'sse' | 'stdio'\n serverUrl: string | null\n command: string | null\n authConfig: McpAuthConfig\n enabled: boolean\n}\n\nexport class ServerClient {\n private http: AxiosInstance\n\n constructor(cfg: CLIConfig) {\n this.http = axios.create({\n baseURL: cfg.serverUrl.replace(/\\/$/, ''),\n headers: {\n Authorization: `Bearer ${cfg.token}`,\n 'Content-Type': 'application/json',\n },\n timeout: 15_000,\n })\n\n this.http.interceptors.response.use(\n (r) => r,\n (err: unknown) => {\n if (axios.isAxiosError(err)) {\n const status = err.response?.status\n const message = (err.response?.data as { message?: string })?.message ?? err.message\n\n if (status === 401) {\n console.error('Authentication failed. Run: ucli configure --server <url> --token <jwt>')\n process.exit(1)\n }\n\n throw new Error(`Server error ${status ?? 'unknown'}: ${message}`)\n }\n throw err\n },\n )\n }\n\n async listOAS(): Promise<OASEntryPublic[]> {\n const { data } = await this.http.get<OASEntryPublic[]>('/api/v1/oas')\n return data\n }\n\n async getOAS(name: string): Promise<OASEntryPublic> {\n const { data } = await this.http.get<OASEntryPublic>(`/api/v1/oas/${encodeURIComponent(name)}`)\n return data\n }\n\n async listMCP(): Promise<McpEntryPublic[]> {\n const { data } = await this.http.get<McpEntryPublic[]>('/api/v1/mcp')\n return data\n }\n\n async getMCP(name: string): Promise<McpEntryPublic> {\n const { data } = await this.http.get<McpEntryPublic>(`/api/v1/mcp/${encodeURIComponent(name)}`)\n return data\n }\n}\n","/**\n * Structured exit codes for automation and scripting.\n *\n * Convention:\n * 0 — success\n * 1 — general / unknown error\n * 2 — usage / argument error\n * 3 — configuration error (missing or invalid config)\n * 4 — authentication error (invalid / expired token)\n * 5 — connectivity error (server unreachable)\n * 6 — not-found error (service / resource doesn't exist)\n * 7 — server error (5xx from upstream)\n */\n\nexport const ExitCode = {\n SUCCESS: 0,\n GENERAL_ERROR: 1,\n USAGE_ERROR: 2,\n CONFIG_ERROR: 3,\n AUTH_ERROR: 4,\n CONNECTIVITY_ERROR: 5,\n NOT_FOUND: 6,\n SERVER_ERROR: 7,\n} as const\n\nexport type ExitCodeValue = (typeof ExitCode)[keyof typeof ExitCode]\n","/**\n * Structured output module for AI agent consumption.\n *\n * When `--output json` is active globally, every command emits a single\n * JSON envelope to stdout so that agents can reliably parse both success\n * and error results without scraping human-readable text.\n *\n * Envelope shapes:\n * Success → { \"success\": true, \"data\": <any> }\n * Error → { \"success\": false, \"error\": { \"code\": <number>, \"message\": <string>, \"hint\"?: <string> } }\n */\n\nexport type OutputMode = 'text' | 'json'\n\nlet currentMode: OutputMode = 'text'\n\n/** Set the global output mode. Called once from index.ts preAction hook. */\nexport function setOutputMode(mode: OutputMode): void {\n currentMode = mode\n}\n\n/** Get the current output mode. */\nexport function getOutputMode(): OutputMode {\n return currentMode\n}\n\n/** Returns true when structured JSON output is active. */\nexport function isJsonOutput(): boolean {\n return currentMode === 'json'\n}\n\n/**\n * Emit a successful result.\n *\n * In JSON mode the data is wrapped in `{ success: true, data }`.\n * In text mode this is a no-op — the caller is responsible for\n * printing human-readable output itself.\n */\nexport function outputSuccess(data: unknown): void {\n if (currentMode === 'json') {\n console.log(JSON.stringify({ success: true, data }, null, 2))\n }\n}\n\n/**\n * Emit a structured error and exit.\n *\n * In JSON mode the error is wrapped in `{ success: false, error: { code, message, hint? } }`.\n * In text mode falls through to the existing `formatError` path.\n */\nexport function outputError(\n code: number,\n message: string,\n hint?: string,\n): never {\n if (currentMode === 'json') {\n const envelope: Record<string, unknown> = {\n success: false,\n error: { code, message, ...(hint ? { hint } : {}) },\n }\n console.log(JSON.stringify(envelope, null, 2))\n process.exit(code)\n }\n\n // Text mode — re-use existing stderr formatting\n console.error(`\\n✖ Error: ${message}`)\n if (hint) console.error(` Hint: ${hint}`)\n process.exit(code)\n}\n","import type { Command } from 'commander'\nimport { saveConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\nexport function registerConfigure(program: Command): void {\n program\n .command('configure')\n .description('Configure the OAS Gateway server URL and authentication token')\n .requiredOption('--server <url>', 'OAS Gateway server URL (e.g. https://oas.example.com)')\n .requiredOption('--token <jwt>', 'Group JWT token issued by the server admin')\n .action(async (opts: { server: string; token: string }) => {\n const serverUrl = opts.server.replace(/\\/$/, '')\n const token = opts.token\n\n // Validate connectivity before saving\n if (!isJsonOutput()) {\n console.log(`Connecting to ${serverUrl}...`)\n }\n const client = new ServerClient({ serverUrl, token })\n\n try {\n await client.listOAS()\n saveConfig({ serverUrl, token })\n\n if (isJsonOutput()) {\n outputSuccess({ serverUrl, configured: true })\n return\n }\n\n console.log('✓ Configuration saved successfully.')\n console.log(` Server: ${serverUrl}`)\n console.log(` Token: ${token.slice(0, 20)}...`)\n } catch (err) {\n outputError(ExitCode.CONNECTIVITY_ERROR,\n `Connection failed: ${(err as Error).message}`,\n 'Check the server URL and token')\n }\n })\n}\n","/**\n * Local file cache for OAS entries.\n * Stored at ~/.cache/oas-cli/<name>.json with TTL metadata.\n *\n * Security: authConfig credential values are stripped before writing.\n * Only { type } is persisted — full secrets are never written to disk.\n */\nimport { readFile, writeFile, mkdir, unlink, chmod } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { cacheDir } from '../config.js'\nimport type { OASEntryPublic } from './server-client.js'\n\ninterface CacheFile {\n entries: OASEntryPublic[]\n fetchedAt: number // ms timestamp\n ttlSec: number // cache duration\n}\n\nconst LIST_CACHE_FILE = join(cacheDir, 'oas-list.json')\n\nasync function ensureCacheDir(): Promise<void> {\n await mkdir(cacheDir, { recursive: true, mode: 0o700 })\n}\n\n/** Strip credential secrets from authConfig — only persist { type }. */\nfunction redactEntries(entries: OASEntryPublic[]): OASEntryPublic[] {\n return entries.map((e) => ({\n ...e,\n authConfig: { type: (e.authConfig as Record<string, unknown>)['type'] ?? e.authType },\n }))\n}\n\nexport async function readOASListCache(): Promise<OASEntryPublic[] | null> {\n try {\n const raw = await readFile(LIST_CACHE_FILE, 'utf8')\n const cached: CacheFile = JSON.parse(raw)\n const age = (Date.now() - cached.fetchedAt) / 1000\n if (cached.ttlSec === 0 || age > cached.ttlSec) return null // expired\n return cached.entries\n } catch {\n return null // not found or parse error\n }\n}\n\nexport async function writeOASListCache(entries: OASEntryPublic[], ttlSec: number): Promise<void> {\n await ensureCacheDir()\n const cached: CacheFile = { entries: redactEntries(entries), fetchedAt: Date.now(), ttlSec }\n await writeFile(LIST_CACHE_FILE, JSON.stringify(cached, null, 2), { encoding: 'utf8', mode: 0o600 })\n await chmod(LIST_CACHE_FILE, 0o600)\n}\n\nexport async function clearOASListCache(): Promise<void> {\n try {\n await unlink(LIST_CACHE_FILE)\n } catch {\n // ignore if not found\n }\n}\n\nexport async function clearOASCache(name: string): Promise<void> {\n try {\n const raw = await readFile(LIST_CACHE_FILE, 'utf8')\n const cached: CacheFile = JSON.parse(raw)\n const entries = Array.isArray(cached.entries) ? cached.entries.filter((e) => e.name !== name) : []\n if (entries.length === 0) {\n await clearOASListCache()\n return\n }\n const next: CacheFile = {\n entries,\n fetchedAt: cached.fetchedAt ?? Date.now(),\n ttlSec: cached.ttlSec ?? 0,\n }\n await writeFile(LIST_CACHE_FILE, JSON.stringify(next, null, 2), { encoding: 'utf8', mode: 0o600 })\n } catch {\n await clearOASListCache()\n }\n}\n","/**\n * YAML output format support.\n *\n * A lightweight YAML serialiser that covers the data shapes produced by\n * ucli commands (plain objects, arrays, strings, numbers, booleans, null).\n * No external dependencies — we don't need a full YAML parser, only output.\n */\n\n/** Convert a JSON-serialisable value to a YAML string. */\nexport function toYaml(value: unknown, indent = 0): string {\n if (value === null || value === undefined) {\n return 'null'\n }\n\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false'\n }\n\n if (typeof value === 'number') {\n return String(value)\n }\n\n if (typeof value === 'string') {\n // Use quotes if the string contains special YAML characters\n if (needsQuoting(value)) {\n return JSON.stringify(value)\n }\n return value\n }\n\n if (Array.isArray(value)) {\n if (value.length === 0) return '[]'\n const prefix = ' '.repeat(indent)\n return value\n .map((item) => {\n const serialised = toYaml(item, indent + 2)\n if (typeof item === 'object' && item !== null && !Array.isArray(item)) {\n // Object items: put the first key on the same line as the dash\n const firstNewline = serialised.indexOf('\\n')\n if (firstNewline === -1) {\n return `${prefix}- ${serialised.trimStart()}`\n }\n const firstLine = serialised.slice(0, firstNewline)\n const rest = serialised.slice(firstNewline + 1)\n return `${prefix}- ${firstLine.trimStart()}\\n${rest}`\n }\n return `${prefix}- ${serialised}`\n })\n .join('\\n')\n }\n\n if (typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n if (entries.length === 0) return '{}'\n const prefix = ' '.repeat(indent)\n return entries\n .map(([key, val]) => {\n if (val === null || val === undefined) {\n return `${prefix}${key}: null`\n }\n if (typeof val === 'object') {\n const nested = toYaml(val, indent + 2)\n return `${prefix}${key}:\\n${nested}`\n }\n return `${prefix}${key}: ${toYaml(val, indent)}`\n })\n .join('\\n')\n }\n\n return String(value)\n}\n\nfunction needsQuoting(s: string): boolean {\n if (s === '') return true\n if (s === 'true' || s === 'false' || s === 'null') return true\n if (/^\\d/.test(s)) return true\n if (/[:{}\\[\\],&*#?|<>=!%@`'\"\\\\\\n\\r\\t]/.test(s)) return true\n if (s.startsWith(' ') || s.endsWith(' ')) return true\n return false\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { readOASListCache, writeOASListCache } from '../lib/cache.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { isJsonOutput, outputSuccess } from '../lib/output.js'\n\nexport function registerListOas(program: Command): void {\n program\n .command('listoas')\n .description('List all OAS services available in the current group')\n .option('--refresh', 'Bypass local cache and fetch fresh from server')\n .option('--format <fmt>', 'Output format: table | json | yaml', 'table')\n .action(async (opts: { refresh?: boolean; format?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n const useCache = !opts.refresh\n let entries = useCache ? await readOASListCache() : null\n\n if (!entries) {\n entries = await client.listOAS()\n if (entries.length > 0) {\n const maxTtl = Math.min(...entries.map((e) => e.cacheTtl))\n await writeOASListCache(entries, maxTtl)\n }\n }\n\n // Strip authConfig secrets — only expose { type }\n const safe = entries.map(({ authConfig, ...rest }) => ({\n ...rest,\n authConfig: { type: (authConfig as Record<string, unknown>)['type'] ?? rest.authType },\n }))\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n const format = (opts.format ?? 'table').toLowerCase()\n\n if (entries.length === 0) {\n console.log('No services registered in this group.')\n return\n }\n\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n const nameWidth = Math.max(10, ...entries.map((e) => e.name.length))\n console.log(`\\n${'SERVICE'.padEnd(nameWidth)} AUTH DESCRIPTION`)\n console.log(`${'-'.repeat(nameWidth)} -------- ${'-'.repeat(40)}`)\n for (const e of entries) {\n const auth = e.authType.padEnd(8)\n const desc = e.description.length > 60 ? e.description.slice(0, 57) + '...' : e.description\n console.log(`${e.name.padEnd(nameWidth)} ${auth} ${desc}`)\n }\n console.log()\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { isJsonOutput, outputSuccess } from '../lib/output.js'\n\nexport function registerListMcp(program: Command): void {\n program\n .command('listmcp')\n .description('List all MCP servers available in the current group')\n .option('--format <fmt>', 'Output format: table | json | yaml', 'table')\n .action(async (opts: { format?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n const entries = await client.listMCP()\n\n // Strip authConfig secrets — only expose { type }\n const safe = entries.map(({ authConfig, ...rest }) => ({\n ...rest,\n authConfig: { type: authConfig.type },\n }))\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n if (entries.length === 0) {\n console.log('No MCP servers registered in this group.')\n return\n }\n\n const format = (opts.format ?? 'table').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n const nameWidth = Math.max(10, ...entries.map(e => e.name.length))\n console.log(`\\n${'SERVER'.padEnd(nameWidth)} TRANSPORT DESCRIPTION`)\n console.log(`${'-'.repeat(nameWidth)} --------- ${'-'.repeat(40)}`)\n for (const e of entries) {\n const desc = e.description.length > 60 ? e.description.slice(0, 57) + '...' : e.description\n console.log(`${e.name.padEnd(nameWidth)} ${e.transport.padEnd(9)} ${desc}`)\n }\n console.log()\n })\n}\n","/**\n * Bridge between oas-cli and @tronsfey/openapi2cli run mode.\n *\n * Spawns openapi2cli as a child process, injecting auth config\n * as environment variables (never exposed to the agent's shell).\n */\nimport { spawn } from 'node:child_process'\nimport { createRequire } from 'node:module'\nimport { join, dirname } from 'node:path'\nimport type { OASEntryPublic } from './server-client.js'\n\nconst require = createRequire(import.meta.url)\n\nfunction resolveOpenapi2CliBin(): string {\n try {\n const pkgPath = require.resolve('@tronsfey/openapi2cli/package.json')\n const pkgDir = dirname(pkgPath)\n // @tronsfey/openapi2cli exposes its binary; find it\n const pkg = require('@tronsfey/openapi2cli/package.json') as { bin?: Record<string, string> }\n const binEntry = pkg.bin?.['openapi2cli'] ?? 'bin/openapi2cli.js'\n return join(pkgDir, binEntry)\n } catch {\n throw new Error(\n '@tronsfey/openapi2cli is not installed. Run: pnpm add @tronsfey/openapi2cli in packages/cli',\n )\n }\n}\n\nexport interface RunOptions {\n entry: OASEntryPublic\n /** Operation command args (e.g. ['listPets', '--limit', '10']) */\n operationArgs: string[]\n format?: 'json' | 'table' | 'yaml'\n query?: string\n /** Agent-friendly mode: wrap all output in structured JSON envelopes */\n machine?: boolean\n /** Preview the HTTP request without executing it (implies --machine) */\n dryRun?: boolean\n}\n\n/**\n * Build auth environment variables for injection into child process.\n * The calling shell (and thus the AI agent) never sees these values.\n */\nfunction buildAuthEnv(entry: OASEntryPublic): Record<string, string> {\n const cfg = entry.authConfig\n const prefix = entry.name.toUpperCase().replace(/[^A-Z0-9]/g, '_')\n\n switch (cfg['type']) {\n case 'bearer':\n return { [`${prefix}_TOKEN`]: cfg['token'] as string }\n\n case 'api_key':\n return { [`${prefix}_API_KEY`]: cfg['key'] as string }\n\n case 'basic':\n return { [`${prefix}_CREDENTIALS`]: `${cfg['username']}:${cfg['password']}` }\n\n case 'oauth2_cc':\n return {\n [`${prefix}_CLIENT_ID`]: cfg['clientId'] as string,\n [`${prefix}_CLIENT_SECRET`]: cfg['clientSecret'] as string,\n [`${prefix}_SCOPES`]: (cfg['scopes'] as string[]).join(' '),\n }\n\n default:\n return {}\n }\n}\n\n/**\n * Environment variable allowlist for subprocess execution.\n * Only these variables (when present in the parent) are forwarded to the\n * child process. This prevents leakage of secrets such as cloud credentials,\n * encryption keys, or database passwords that may be in the parent env.\n */\nconst SAFE_ENV_KEYS: readonly string[] = [\n // System essentials\n 'PATH', 'HOME', 'USER', 'LOGNAME', 'SHELL', 'TMPDIR', 'TMP', 'TEMP',\n // Terminal / display\n 'TERM', 'COLORTERM', 'NO_COLOR', 'FORCE_COLOR', 'LANG', 'LC_ALL',\n 'LC_CTYPE', 'LC_MESSAGES', 'LC_COLLATE',\n // Node.js\n 'NODE_ENV', 'NODE_PATH', 'NODE_OPTIONS', 'NODE_EXTRA_CA_CERTS',\n // Network proxy (required for tools behind corporate proxies)\n 'HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY',\n 'http_proxy', 'https_proxy', 'no_proxy',\n // OS-specific\n 'SYSTEMROOT', 'COMSPEC', 'APPDATA', 'LOCALAPPDATA', 'PROGRAMFILES',\n 'XDG_RUNTIME_DIR', 'XDG_CONFIG_HOME', 'XDG_CACHE_HOME', 'XDG_DATA_HOME',\n]\n\nfunction buildSafeEnv(authEnv: Record<string, string>): Record<string, string> {\n const safe: Record<string, string> = {}\n for (const key of SAFE_ENV_KEYS) {\n if (process.env[key] !== undefined) {\n safe[key] = process.env[key]!\n }\n }\n return { ...safe, ...authEnv }\n}\n\nexport async function runOperation(opts: RunOptions): Promise<void> {\n const bin = resolveOpenapi2CliBin()\n const { entry, operationArgs, format, query, machine, dryRun } = opts\n\n const args = [\n 'run',\n '--oas', entry.remoteUrl,\n '--cache-ttl', String(entry.cacheTtl),\n ...(entry.baseEndpoint ? ['--endpoint', entry.baseEndpoint] : []),\n ...(machine ? ['--machine'] : []),\n ...(dryRun ? ['--dry-run'] : []),\n ...(format ? ['--format', format] : []),\n ...(query ? ['--query', query] : []),\n ...operationArgs,\n ]\n\n const authEnv = buildAuthEnv(entry)\n\n await new Promise<void>((resolve, reject) => {\n const child = spawn(process.execPath, [bin, ...args], {\n stdio: 'inherit',\n env: buildSafeEnv(authEnv),\n })\n\n child.on('close', (code) => {\n if (code === 0) resolve()\n else reject(new Error(`openapi2cli exited with code ${code}`))\n })\n child.on('error', reject)\n })\n}\n\n/**\n * Get list of available operations for a service by running `--help`.\n * Returns the raw help text from openapi2cli.\n */\nexport async function getServiceHelp(entry: OASEntryPublic): Promise<string> {\n const bin = resolveOpenapi2CliBin()\n const args = [\n 'run',\n '--oas', entry.remoteUrl,\n '--cache-ttl', String(entry.cacheTtl),\n '--help',\n ]\n\n return new Promise<string>((resolve, reject) => {\n let output = ''\n const child = spawn(process.execPath, [bin, ...args], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n child.stdout?.on('data', (d: Buffer) => { output += d.toString() })\n child.stderr?.on('data', (d: Buffer) => { output += d.toString() })\n child.on('close', () => resolve(output))\n child.on('error', reject)\n })\n}\n\n/**\n * Get help for a specific operation by running `<operationId> --help`.\n * Returns the raw help text including parameter details.\n */\nexport async function getOperationHelp(entry: OASEntryPublic, operationId: string): Promise<string> {\n const bin = resolveOpenapi2CliBin()\n const args = [\n 'run',\n '--oas', entry.remoteUrl,\n '--cache-ttl', String(entry.cacheTtl),\n ...(entry.baseEndpoint ? ['--endpoint', entry.baseEndpoint] : []),\n operationId,\n '--help',\n ]\n\n return new Promise<string>((resolve, reject) => {\n let output = ''\n const child = spawn(process.execPath, [bin, ...args], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n child.stdout?.on('data', (d: Buffer) => { output += d.toString() })\n child.stderr?.on('data', (d: Buffer) => { output += d.toString() })\n child.on('close', () => resolve(output))\n child.on('error', reject)\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { getServiceHelp, getOperationHelp, runOperation } from '../lib/oas-runner.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\nconst VALID_OAS_ACTIONS = ['info', 'listapi', 'apiinfo', 'invokeapi'] as const\n\nexport function registerOas(program: Command): void {\n program\n .command('oas <name> <action> [args...]')\n .description(\n 'Interact with an OAS service: info | listapi | apiinfo <api> | invokeapi <api> --data <json>',\n )\n .option('--format <fmt>', 'Output format: json | table | yaml', 'json')\n .option('--data <json>', 'Request body (JSON string or @filename, for invokeapi)')\n .option('--params <json>', 'Operation parameters as JSON (for invokeapi)')\n .option('--query <jmespath>', 'Filter response with JMESPath expression')\n .option('--machine', 'Agent-friendly mode: structured JSON envelope output')\n .option('--dry-run', 'Preview the HTTP request without executing (implies --machine)')\n .allowUnknownOption(true)\n .action(async (\n name: string,\n action: string,\n args: string[],\n opts: { format?: string; data?: string; params?: string; query?: string; machine?: boolean; dryRun?: boolean },\n ) => {\n if (!(VALID_OAS_ACTIONS as readonly string[]).includes(action)) {\n outputError(ExitCode.USAGE_ERROR,\n `Unknown action: ${action}`,\n `Valid actions: ${VALID_OAS_ACTIONS.join(', ')}\\nUsage:\\n ucli oas <service> info\\n ucli oas <service> listapi\\n ucli oas <service> apiinfo <api>\\n ucli oas <service> invokeapi <api> --data <json>`)\n }\n\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n let entry\n try {\n entry = await client.getOAS(name)\n } catch {\n outputError(ExitCode.NOT_FOUND, `Service not found: ${name}`,\n 'Run: ucli listoas to see available services')\n }\n\n switch (action) {\n case 'info': {\n const { authConfig, ...rest } = entry\n const safe = {\n ...rest,\n authConfig: { type: (authConfig as Record<string, unknown>)['type'] ?? rest.authType },\n }\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n console.log(`\\nService: ${entry.name}`)\n console.log(`Description: ${entry.description || '(none)'}`)\n console.log(`OAS URL: ${entry.remoteUrl}`)\n if (entry.baseEndpoint) console.log(`Base endpoint: ${entry.baseEndpoint}`)\n console.log(`Auth type: ${entry.authType}`)\n console.log(`Cache TTL: ${entry.cacheTtl}s`)\n break\n }\n\n case 'listapi': {\n const help = await getServiceHelp(entry)\n const { authConfig, ...rest } = entry\n const safe = {\n ...rest,\n authConfig: { type: (authConfig as Record<string, unknown>)['type'] ?? rest.authType },\n operationsHelp: help,\n }\n\n if (isJsonOutput()) {\n outputSuccess(safe)\n return\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(safe, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(safe))\n return\n }\n\n console.log(`\\nService: ${entry.name}`)\n console.log(`Description: ${entry.description || '(none)'}`)\n console.log('\\nAvailable operations:')\n console.log('─'.repeat(60))\n console.log(help)\n break\n }\n\n case 'apiinfo': {\n const apiName = args[0]\n if (!apiName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing API operation name.',\n 'Usage: ucli oas <service> apiinfo <api>')\n }\n\n const help = await getOperationHelp(entry, apiName)\n\n if (isJsonOutput()) {\n outputSuccess({ operation: apiName, service: name, help })\n return\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify({ operation: apiName, service: name, help }, null, 2))\n return\n }\n\n console.log(`\\nOperation: ${apiName} (service: ${name})`)\n console.log('─'.repeat(60))\n console.log(help)\n break\n }\n\n case 'invokeapi': {\n const apiName = args[0]\n if (!apiName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing API operation name.',\n 'Usage: ucli oas <service> invokeapi <api> --data <json>')\n }\n\n const operationArgs: string[] = [apiName]\n const extraArgs = args.slice(1)\n operationArgs.push(...extraArgs)\n\n if (opts.params) {\n let parsed: unknown\n try {\n parsed = JSON.parse(opts.params)\n } catch {\n outputError(ExitCode.USAGE_ERROR,\n 'Invalid --params JSON.',\n 'Example: --params \\'{\"petId\": 1}\\'')\n }\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\n if (v === undefined || v === null) continue\n const strVal = typeof v === 'object' ? JSON.stringify(v) : String(v)\n operationArgs.push(`--${k}`, strVal)\n }\n }\n }\n\n if (opts.data) {\n operationArgs.push('--data', opts.data)\n }\n\n const format = opts.format as 'json' | 'table' | 'yaml' | undefined\n const query = opts.query as string | undefined\n const machine = opts.machine ?? false\n const dryRun = opts.dryRun ?? false\n\n try {\n await runOperation({\n entry,\n operationArgs,\n ...(format !== undefined ? { format } : {}),\n ...(query !== undefined ? { query } : {}),\n ...(machine ? { machine } : {}),\n ...(dryRun ? { dryRun } : {}),\n })\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR,\n `Operation failed: ${(err as Error).message}`)\n }\n break\n }\n }\n })\n}\n","/**\n * MCP tool runner using @tronsfey/mcp2cli programmatic API.\n *\n * Auth credentials are injected via McpServerConfig (headers or env) —\n * never passed as CLI arguments (which would be visible in `ps`).\n */\nimport type { McpEntryPublic } from './server-client.js'\n\n/**\n * Resolve a named export from a module that may be CJS-wrapped (exports live\n * under `module.default`) or a plain ESM module (named exports at top level).\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction resolve(mod: any, name: string): unknown {\n if (typeof mod[name] === 'function') return mod[name]\n if (mod.default && typeof mod.default[name] === 'function') return mod.default[name]\n throw new Error(`Cannot resolve export \"${name}\" from module`)\n}\n\nasync function getMcp2cli() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const clientMod = await import('@tronsfey/mcp2cli/dist/client/index.js') as any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const runnerMod = await import('@tronsfey/mcp2cli/dist/runner/index.js') as any\n return {\n createMcpClient: resolve(clientMod, 'createMcpClient') as (...args: unknown[]) => Promise<unknown>,\n getTools: resolve(runnerMod, 'getTools') as (...args: unknown[]) => Promise<{ name: string; description?: string; inputSchema?: unknown }[]>,\n runTool: resolve(runnerMod, 'runTool') as (...args: unknown[]) => Promise<void>,\n describeTool: resolve(runnerMod, 'describeTool') as (...args: unknown[]) => void,\n describeToolJson: resolve(runnerMod, 'describeToolJson') as (...args: unknown[]) => void,\n }\n}\n\nasync function closeClient(client: unknown): Promise<void> {\n if (typeof (client as { close?: unknown }).close === 'function') {\n await (client as { close: () => Promise<void> }).close()\n }\n}\n\nfunction buildMcpConfig(entry: McpEntryPublic): Record<string, unknown> {\n const base: Record<string, unknown> = { type: entry.transport }\n if (entry.transport === 'http' || entry.transport === 'sse') {\n base.url = entry.serverUrl\n } else {\n base.command = entry.command\n }\n const auth = entry.authConfig\n if (auth.type === 'http_headers') {\n base.headers = auth.headers\n } else if (auth.type === 'env') {\n base.env = auth.env\n }\n return base\n}\n\nexport async function listMcpTools(entry: McpEntryPublic): Promise<{ name: string; description?: string; inputSchema?: unknown }[]> {\n const { createMcpClient, getTools } = await getMcp2cli()\n const config = buildMcpConfig(entry)\n const client = await createMcpClient(config)\n try {\n const tools = await getTools(client, config, { noCache: true })\n return tools\n } finally {\n await closeClient(client)\n }\n}\n\nexport async function describeMcpTool(\n entry: McpEntryPublic,\n toolName: string,\n opts?: { json?: boolean },\n): Promise<void> {\n const { createMcpClient, getTools, describeTool, describeToolJson } = await getMcp2cli()\n const config = buildMcpConfig(entry)\n const client = await createMcpClient(config)\n try {\n const tools = await getTools(client, config, { noCache: false, cacheTtl: 3600 })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tool = tools.find((t: any) => t.name === toolName)\n if (!tool) throw new Error(`Tool \"${toolName}\" not found on MCP server \"${entry.name}\"`)\n if (opts?.json) {\n describeToolJson(tool)\n } else {\n describeTool(tool)\n }\n } finally {\n await closeClient(client)\n }\n}\n\nexport async function runMcpTool(\n entry: McpEntryPublic,\n toolName: string,\n rawArgs: string[],\n opts?: { json?: boolean; inputJson?: string },\n): Promise<void> {\n const { createMcpClient, getTools, runTool } = await getMcp2cli()\n const config = buildMcpConfig(entry)\n const client = await createMcpClient(config)\n try {\n const tools = await getTools(client, config, { noCache: false, cacheTtl: 3600 })\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tool = tools.find((t: any) => t.name === toolName)\n if (!tool) throw new Error(`Tool \"${toolName}\" not found on MCP server \"${entry.name}\"`)\n const normalizedArgs: string[] = []\n for (const arg of rawArgs) {\n if (arg.includes('=') && !arg.startsWith('--')) {\n const idx = arg.indexOf('=')\n const key = arg.slice(0, idx)\n const value = arg.slice(idx + 1)\n normalizedArgs.push(`--${key}`, value)\n } else {\n normalizedArgs.push(arg)\n }\n }\n await runTool(client, tool, normalizedArgs, {\n ...(opts?.json ? { json: true } : {}),\n ...(opts?.inputJson ? { inputJson: opts.inputJson } : {}),\n })\n } finally {\n await closeClient(client)\n }\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { listMcpTools, describeMcpTool, runMcpTool } from '../lib/mcp-runner.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\nconst VALID_MCP_ACTIONS = ['listtool', 'toolinfo', 'invoketool'] as const\n\nexport function registerMcp(program: Command): void {\n program\n .command('mcp <name> <action> [args...]')\n .description(\n 'Interact with a MCP server: listtool | toolinfo <tool> | invoketool <tool> --data <json>',\n )\n .option('--format <fmt>', 'Output format: table | json | yaml', 'table')\n .option('--data <json>', 'Tool arguments as a JSON object (for invoketool)')\n .option('--json', 'Machine-readable JSON output')\n .allowUnknownOption(true)\n .action(async (name: string, action: string, args: string[], opts: { format?: string; data?: string; json?: boolean }) => {\n if (!(VALID_MCP_ACTIONS as readonly string[]).includes(action)) {\n outputError(ExitCode.USAGE_ERROR,\n `Unknown action: ${action}`,\n `Valid actions: ${VALID_MCP_ACTIONS.join(', ')}\\nUsage:\\n ucli mcp <server> listtool\\n ucli mcp <server> toolinfo <tool>\\n ucli mcp <server> invoketool <tool> --data <json>`)\n }\n\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n let entry\n try {\n entry = await client.getMCP(name)\n } catch {\n outputError(ExitCode.NOT_FOUND, `Unknown MCP server: ${name}`,\n 'Run: ucli listmcp to see available servers')\n }\n\n switch (action) {\n case 'listtool': {\n let tools\n try {\n tools = await listMcpTools(entry)\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR, `Failed to fetch tools: ${(err as Error).message}`)\n }\n\n if (isJsonOutput()) {\n outputSuccess(tools)\n return\n }\n\n if (tools.length === 0) {\n console.log(`No tools found on MCP server \"${name}\".`)\n return\n }\n\n const format = (opts.format ?? 'table').toLowerCase()\n if (format === 'json') {\n console.log(JSON.stringify(tools, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(tools))\n return\n }\n\n console.log(`\\nTools on \"${name}\":`)\n console.log('─'.repeat(60))\n for (const t of tools) {\n console.log(` ${t.name}`)\n if (t.description) console.log(` ${t.description}`)\n }\n console.log()\n break\n }\n\n case 'toolinfo': {\n const toolName = args[0]\n if (!toolName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing tool name.',\n 'Usage: ucli mcp <server> toolinfo <tool>')\n }\n\n try {\n await describeMcpTool(entry, toolName, { json: opts.json })\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR, `Failed to describe tool: ${(err as Error).message}`)\n }\n break\n }\n\n case 'invoketool': {\n const toolName = args[0]\n if (!toolName) {\n outputError(ExitCode.USAGE_ERROR,\n 'Missing tool name.',\n 'Usage: ucli mcp <server> invoketool <tool> --data <json>')\n }\n\n const extraArgs = args.slice(1)\n try {\n await runMcpTool(entry, toolName, extraArgs, {\n json: opts.json,\n inputJson: opts.data,\n })\n } catch (err) {\n outputError(ExitCode.GENERAL_ERROR, `Tool execution failed: ${(err as Error).message}`)\n }\n break\n }\n }\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { writeOASListCache, clearOASListCache, clearOASCache } from '../lib/cache.js'\nimport { isJsonOutput, outputSuccess } from '../lib/output.js'\n\nexport function registerRefresh(program: Command): void {\n program\n .command('refresh')\n .description('Force-refresh the local OAS cache from the server')\n .option('--service <name>', 'Refresh only a specific service')\n .action(async (opts: { service?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n if (!isJsonOutput()) {\n console.log('Refreshing OAS list from server...')\n }\n\n if (opts.service) {\n await clearOASCache(opts.service)\n } else {\n await clearOASListCache()\n }\n\n const entries = await client.listOAS()\n if (entries.length > 0) {\n const maxTtl = Math.min(...entries.map((e) => e.cacheTtl))\n await writeOASListCache(entries, maxTtl)\n }\n\n if (isJsonOutput()) {\n outputSuccess({ refreshed: entries.length })\n return\n }\n\n console.log(`✓ Refreshed ${entries.length} service(s).`)\n })\n}\n","import type { Command } from 'commander'\nimport { getConfig, isConfigured } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { readOASListCache, writeOASListCache } from '../lib/cache.js'\nimport { getServiceHelp } from '../lib/oas-runner.js'\nimport { ExitCode } from '../lib/exit-codes.js'\n\nexport function registerHelp(program: Command): void {\n program\n .command('help [service]')\n .description('Show usage guide. Pass a service name for service-specific operations.')\n .action(async (service?: string) => {\n if (!service) {\n printGeneralHelp()\n if (isConfigured()) {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n let entries = await readOASListCache()\n if (!entries) {\n entries = await client.listOAS()\n if (entries.length > 0) {\n const maxTtl = Math.min(...entries.map((e) => e.cacheTtl))\n await writeOASListCache(entries, maxTtl)\n }\n }\n if (entries.length > 0) {\n console.log('\\nAvailable services:')\n for (const e of entries) {\n console.log(` ${e.name.padEnd(20)} ${e.description}`)\n }\n console.log('\\nTip: Run `ucli oas <service> listapi` for service-specific operations.')\n }\n } else {\n console.log('\\nRun `ucli configure --server <url> --token <jwt>` to get started.')\n }\n return\n }\n\n // Service-specific help\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n let entry\n try {\n entry = await client.getOAS(service)\n } catch {\n console.error(`Unknown service: ${service}`)\n console.error('Run `ucli listoas` to see available services.')\n process.exit(ExitCode.NOT_FOUND)\n }\n\n console.log(`\\n=== ${entry.name} ===`)\n console.log(`${entry.description}`)\n console.log(`\\nOAS spec: ${entry.remoteUrl}`)\n console.log('\\nOperations:')\n console.log('─'.repeat(60))\n\n const help = await getServiceHelp(entry)\n console.log(help)\n\n console.log('\\nExamples:')\n console.log(` ucli oas ${entry.name} listapi`)\n console.log(` ucli oas ${entry.name} apiinfo <operation>`)\n console.log(` ucli oas ${entry.name} invokeapi <operation> --data '{\"key\":\"value\"}'`)\n })\n}\n\nfunction printGeneralHelp(): void {\n console.log(`\nucli — OpenAPI & MCP Gateway for AI Agents\n════════════════════════════════════════\n\nSETUP\n ucli configure --server <url> --token <jwt>\n Configure server connection and authentication.\n\nDISCOVERY\n ucli listoas\n List all OAS services available in your group.\n\n ucli listmcp\n List all MCP servers available in your group.\n\n ucli introspect\n Return complete capability manifest in a single call (JSON).\n Ideal for AI agents: includes services, MCP servers, and command reference.\n\n ucli help [service]\n Show this guide, or service-specific operations.\n\nOAS SERVICES\n ucli oas <service> info\n Show detailed service information.\n\n ucli oas <service> listapi\n List all available API operations.\n\n ucli oas <service> apiinfo <api>\n Show detailed input/output parameters for an API operation.\n\n ucli oas <service> invokeapi <api> [options]\n Execute an API operation.\n\n Options:\n --format json|table|yaml Output format (default: json)\n --query <jmespath> Filter response with JMESPath\n --data <json|@file> Request body for POST/PUT/PATCH\n\nMCP SERVERS\n ucli mcp <server> listtool\n List tools available on a MCP server.\n\n ucli mcp <server> toolinfo <tool>\n Show detailed input/output parameters for a tool.\n\n ucli mcp <server> invoketool <tool> --data <json>\n Call a tool on a MCP server.\n\nMAINTENANCE\n ucli refresh\n Force-refresh the local OAS cache from the server.\n\n ucli doctor\n Check configuration, server connectivity, and token validity.\n\nSHELL COMPLETIONS\n eval \"$(ucli completions bash)\"\n eval \"$(ucli completions zsh)\"\n ucli completions fish | source\n\nGLOBAL FLAGS\n --debug Enable verbose debug logging\n --output json Wrap ALL output in structured JSON envelopes\n (for agent/automation consumption)\n -v, --version Show version number\n\nERRORS\n 401 Unauthorized → Run: ucli configure --server <url> --token <jwt>\n 404 Not Found → Check service name: ucli listoas\n 4xx Client Error → Check operation args: ucli oas <service> listapi\n 5xx Server Error → Retry or run: ucli refresh\n\nAI AGENT QUICK START\n 1. ucli introspect # discover everything in one call\n 2. ucli oas <svc> invokeapi <op> # execute OAS operations\n 3. ucli mcp <srv> invoketool <t> # execute MCP tools\n 4. Use --output json globally # get structured { success, data/error } envelopes\n`)\n}\n","/**\n * Consistent error formatting utility.\n *\n * Provides a unified error output with actionable hints so that both\n * humans and AI agents can quickly understand what went wrong and how\n * to fix it.\n *\n * When `--output json` is active, errors are emitted as structured JSON\n * to stdout (via outputError) so that agents can parse them reliably.\n */\nimport { ExitCode, type ExitCodeValue } from './exit-codes.js'\nimport { isJsonOutput, outputError } from './output.js'\n\nlet debugEnabled = false\n\nexport function setDebugMode(enabled: boolean): void {\n debugEnabled = enabled\n}\n\nexport function isDebugMode(): boolean {\n return debugEnabled\n}\n\n/** Log a debug message (only when --debug is active). */\nexport function debug(message: string): void {\n if (debugEnabled) {\n console.error(`[DEBUG] ${message}`)\n }\n}\n\nexport interface FormattedError {\n code: ExitCodeValue\n message: string\n hint?: string\n}\n\nexport const HINT_MAP: Record<number, string> = {\n [ExitCode.CONFIG_ERROR]:\n 'Run: ucli configure --server <url> --token <jwt>',\n [ExitCode.AUTH_ERROR]:\n 'Your token may be expired or revoked. Run: ucli configure --server <url> --token <jwt>',\n [ExitCode.CONNECTIVITY_ERROR]:\n 'Check that the server URL is correct and the server is running. Run: ucli doctor',\n [ExitCode.NOT_FOUND]:\n 'Check the resource name. Run: ucli listoas or ucli listmcp',\n [ExitCode.SERVER_ERROR]:\n 'The server returned an unexpected error. Try again or run: ucli doctor',\n}\n\n/**\n * Print a formatted error to stderr and exit with the given code.\n *\n * When `--output json` is active, emits structured JSON to stdout\n * instead of human-readable text to stderr.\n * When --debug is active, the full stack trace is also printed (text mode only).\n */\nexport function formatError(err: unknown, code?: ExitCodeValue): never {\n const exitCode = code ?? classifyError(err)\n const message = err instanceof Error ? err.message : String(err)\n const hint = HINT_MAP[exitCode]\n\n // In JSON output mode, delegate to the structured envelope emitter\n if (isJsonOutput()) {\n outputError(exitCode, message, hint)\n }\n\n console.error(`\\n✖ Error: ${message}`)\n if (hint) {\n console.error(` Hint: ${hint}`)\n }\n\n if (debugEnabled && err instanceof Error && err.stack) {\n console.error(`\\n${err.stack}`)\n }\n\n process.exit(exitCode)\n}\n\n/** Classify an error into an exit code based on common patterns. */\nexport function classifyError(err: unknown): ExitCodeValue {\n if (!(err instanceof Error)) return ExitCode.GENERAL_ERROR\n\n const msg = err.message.toLowerCase()\n\n if (msg.includes('not configured') || msg.includes('missing')) {\n return ExitCode.CONFIG_ERROR\n }\n if (msg.includes('401') || msg.includes('unauthorized') || msg.includes('authentication')) {\n return ExitCode.AUTH_ERROR\n }\n if (msg.includes('econnrefused') || msg.includes('enotfound') || msg.includes('timeout') || msg.includes('network')) {\n return ExitCode.CONNECTIVITY_ERROR\n }\n if (msg.includes('404') || msg.includes('not found')) {\n return ExitCode.NOT_FOUND\n }\n if (msg.includes('5') && msg.includes('server error')) {\n return ExitCode.SERVER_ERROR\n }\n\n return ExitCode.GENERAL_ERROR\n}\n","/**\n * `ucli doctor` — diagnostic tool for configuration, connectivity, and token validation.\n *\n * Checks:\n * 1. Configuration file exists and is readable\n * 2. Server URL is reachable (GET /api/v1/health)\n * 3. JWT token is accepted (GET /api/v1/oas — expects 200 or empty list)\n */\nimport type { Command } from 'commander'\nimport { isConfigured, getConfig } from '../config.js'\nimport { ServerClient } from '../lib/server-client.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { debug } from '../lib/errors.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\nimport axios from 'axios'\n\ninterface CheckResult {\n name: string\n ok: boolean\n detail: string\n}\n\nexport function registerDoctor(program: Command): void {\n program\n .command('doctor')\n .description('Check configuration, server connectivity, and token validity')\n .action(async () => {\n const results: CheckResult[] = []\n\n // ── Check 1: Configuration ──────────────────────────────────────\n debug('Checking configuration...')\n if (!isConfigured()) {\n results.push({\n name: 'Configuration',\n ok: false,\n detail: 'Not configured. Run: ucli configure --server <url> --token <jwt>',\n })\n outputError(ExitCode.CONFIG_ERROR,\n 'Not configured',\n 'Run: ucli configure --server <url> --token <jwt>')\n }\n\n let cfg: { serverUrl: string; token: string }\n try {\n cfg = getConfig()\n results.push({\n name: 'Configuration',\n ok: true,\n detail: `Server: ${cfg.serverUrl}`,\n })\n } catch (err) {\n results.push({\n name: 'Configuration',\n ok: false,\n detail: `Failed to read config: ${(err as Error).message}`,\n })\n outputError(ExitCode.CONFIG_ERROR,\n `Failed to read config: ${(err as Error).message}`,\n 'Run: ucli configure --server <url> --token <jwt>')\n }\n\n // ── Check 2: Connectivity (health endpoint, no auth required) ──\n debug(`Checking connectivity to ${cfg.serverUrl}...`)\n try {\n const healthUrl = `${cfg.serverUrl}/api/v1/health`\n const resp = await axios.get(healthUrl, { timeout: 10_000 })\n results.push({\n name: 'Server connectivity',\n ok: resp.status === 200,\n detail: resp.status === 200\n ? `Health endpoint OK (${cfg.serverUrl})`\n : `Unexpected status: ${resp.status}`,\n })\n } catch (err) {\n const msg = axios.isAxiosError(err)\n ? err.code ?? err.message\n : (err as Error).message\n results.push({\n name: 'Server connectivity',\n ok: false,\n detail: `Cannot reach server: ${msg}`,\n })\n }\n\n // ── Check 3: Token validity (authenticated request) ────────────\n debug('Validating JWT token...')\n try {\n const client = new ServerClient(cfg)\n await client.listOAS()\n results.push({\n name: 'Authentication',\n ok: true,\n detail: 'Token accepted by server',\n })\n } catch (err) {\n const msg = (err as Error).message\n results.push({\n name: 'Authentication',\n ok: false,\n detail: `Token rejected: ${msg}`,\n })\n }\n\n const allOk = results.every((r) => r.ok)\n\n if (isJsonOutput()) {\n outputSuccess({\n healthy: allOk,\n checks: results,\n })\n process.exit(allOk ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR)\n }\n\n printResults(results)\n process.exit(allOk ? ExitCode.SUCCESS : ExitCode.GENERAL_ERROR)\n })\n}\n\nfunction printResults(results: CheckResult[]): void {\n console.log('\\nucli doctor\\n' + '═'.repeat(40))\n for (const r of results) {\n const icon = r.ok ? '✓' : '✖'\n console.log(` ${icon} ${r.name}: ${r.detail}`)\n }\n console.log()\n}\n","/**\n * `ucli completions` — generate shell completion scripts for bash/zsh/fish.\n *\n * Usage:\n * eval \"$(ucli completions bash)\"\n * eval \"$(ucli completions zsh)\"\n * ucli completions fish | source\n */\nimport type { Command } from 'commander'\nimport { ExitCode } from '../lib/exit-codes.js'\n\nexport function registerCompletions(program: Command): void {\n program\n .command('completions <shell>')\n .description('Generate shell completion script (bash | zsh | fish)')\n .action((shell: string) => {\n const normalized = shell.toLowerCase().trim()\n\n switch (normalized) {\n case 'bash':\n console.log(bashCompletions())\n break\n case 'zsh':\n console.log(zshCompletions())\n break\n case 'fish':\n console.log(fishCompletions())\n break\n default:\n console.error(`Unsupported shell: ${shell}. Supported: bash, zsh, fish`)\n process.exit(ExitCode.USAGE_ERROR)\n }\n })\n}\n\nfunction bashCompletions(): string {\n return `# ucli bash completions — eval \"$(ucli completions bash)\"\n_ucli_completions() {\n local cur prev commands\n COMPREPLY=()\n cur=\"\\${COMP_WORDS[COMP_CWORD]}\"\n prev=\"\\${COMP_WORDS[COMP_CWORD-1]}\"\n commands=\"configure listoas listmcp oas mcp refresh help doctor completions introspect\"\n\n case \"\\${COMP_WORDS[1]}\" in\n oas)\n if [ \"$COMP_CWORD\" -eq 3 ]; then\n COMPREPLY=( $(compgen -W \"info listapi apiinfo invokeapi\" -- \"$cur\") )\n fi\n return 0\n ;;\n mcp)\n if [ \"$COMP_CWORD\" -eq 3 ]; then\n COMPREPLY=( $(compgen -W \"listtool toolinfo invoketool\" -- \"$cur\") )\n fi\n return 0\n ;;\n completions)\n COMPREPLY=( $(compgen -W \"bash zsh fish\" -- \"$cur\") )\n return 0\n ;;\n listoas|listmcp|help)\n # dynamic completions would require server calls; skip for now\n return 0\n ;;\n esac\n\n if [ \"$COMP_CWORD\" -eq 1 ]; then\n COMPREPLY=( $(compgen -W \"$commands\" -- \"$cur\") )\n fi\n\n return 0\n}\ncomplete -F _ucli_completions ucli`\n}\n\nfunction zshCompletions(): string {\n return `# ucli zsh completions — eval \"$(ucli completions zsh)\"\n#compdef ucli\n\n_ucli() {\n local -a commands\n commands=(\n 'configure:Configure server URL and authentication token'\n 'listoas:List all OAS services'\n 'listmcp:List all MCP servers'\n 'oas:Interact with an OAS service'\n 'mcp:Interact with a MCP server'\n 'refresh:Force-refresh the local OAS cache'\n 'help:Show usage guide'\n 'doctor:Check configuration and connectivity'\n 'completions:Generate shell completion script'\n 'introspect:Return complete capability manifest for AI agents'\n )\n\n _arguments -C \\\\\n '1: :->command' \\\\\n '*::arg:->args'\n\n case $state in\n command)\n _describe -t commands 'ucli commands' commands\n ;;\n args)\n case $words[1] in\n oas)\n if (( CURRENT == 3 )); then\n _values 'action' 'info[Show service info]' 'listapi[List API operations]' 'apiinfo[Show API details]' 'invokeapi[Invoke an API]'\n fi\n ;;\n mcp)\n if (( CURRENT == 3 )); then\n _values 'action' 'listtool[List tools]' 'toolinfo[Show tool details]' 'invoketool[Invoke a tool]'\n fi\n ;;\n completions)\n _values 'shell' bash zsh fish\n ;;\n esac\n ;;\n esac\n}\n\n_ucli \"$@\"`\n}\n\nfunction fishCompletions(): string {\n return `# ucli fish completions — ucli completions fish | source\ncomplete -c ucli -e\n\n# Top-level commands\ncomplete -c ucli -n __fish_use_subcommand -a configure -d 'Configure server URL and token'\ncomplete -c ucli -n __fish_use_subcommand -a listoas -d 'List OAS services'\ncomplete -c ucli -n __fish_use_subcommand -a listmcp -d 'List MCP servers'\ncomplete -c ucli -n __fish_use_subcommand -a oas -d 'Interact with an OAS service'\ncomplete -c ucli -n __fish_use_subcommand -a mcp -d 'Interact with a MCP server'\ncomplete -c ucli -n __fish_use_subcommand -a refresh -d 'Refresh local cache'\ncomplete -c ucli -n __fish_use_subcommand -a help -d 'Show usage guide'\ncomplete -c ucli -n __fish_use_subcommand -a doctor -d 'Check config and connectivity'\ncomplete -c ucli -n __fish_use_subcommand -a completions -d 'Generate shell completions'\ncomplete -c ucli -n __fish_use_subcommand -a introspect -d 'Return capability manifest for AI agents'\n\n# oas actions (third argument after server name)\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a info -d 'Show service info'\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a listapi -d 'List API operations'\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a apiinfo -d 'Show API details'\ncomplete -c ucli -n '__fish_seen_subcommand_from oas' -a invokeapi -d 'Invoke an API'\n\n# mcp actions (third argument after server name)\ncomplete -c ucli -n '__fish_seen_subcommand_from mcp' -a listtool -d 'List tools'\ncomplete -c ucli -n '__fish_seen_subcommand_from mcp' -a toolinfo -d 'Show tool details'\ncomplete -c ucli -n '__fish_seen_subcommand_from mcp' -a invoketool -d 'Invoke a tool'\n\n# completions subcommands\ncomplete -c ucli -n '__fish_seen_subcommand_from completions' -a 'bash zsh fish' -d 'Shell type'`\n}\n","/**\n * `ucli introspect` — unified capability discovery for AI agents.\n *\n * Returns a complete machine-readable manifest of everything the agent\n * can do in a single call: OAS services, MCP servers, and the CLI\n * command reference. This eliminates multiple round-trips that agents\n * would otherwise need (`services list` → `services info` × N →\n * `mcp list` → `mcp tools` × N).\n *\n * Methodology: This follows the \"Observe → Orient → Decide → Act\" (OODA)\n * loop and the ReAct pattern — agents should call `introspect` once at\n * the start of a task to build a mental model before acting.\n */\nimport type { Command } from 'commander'\nimport { getConfig } from '../config.js'\nimport { ServerClient, type OASEntryPublic, type McpEntryPublic } from '../lib/server-client.js'\nimport { toYaml } from '../lib/yaml.js'\nimport { ExitCode } from '../lib/exit-codes.js'\nimport { isJsonOutput, outputSuccess, outputError } from '../lib/output.js'\n\n/**\n * Shape of the introspection manifest returned by `ucli introspect`.\n */\nexport interface IntrospectManifest {\n version: string\n services: IntrospectService[]\n mcpServers: IntrospectMcpServer[]\n commands: IntrospectCommand[]\n}\n\nexport interface IntrospectService {\n name: string\n description: string\n authType: string\n remoteUrl: string\n baseEndpoint: string | null\n cacheTtl: number\n}\n\nexport interface IntrospectMcpServer {\n name: string\n description: string\n transport: string\n enabled: boolean\n}\n\nexport interface IntrospectCommand {\n name: string\n description: string\n usage: string\n examples: string[]\n}\n\nexport function registerIntrospect(program: Command): void {\n program\n .command('introspect')\n .description('Return a complete capability manifest for AI agent discovery (services, MCP servers, commands)')\n .option('--format <fmt>', 'Output format: json | yaml', 'json')\n .action(async (opts: { format?: string }) => {\n const cfg = getConfig()\n const client = new ServerClient(cfg)\n\n // Fetch OAS services and MCP servers in parallel\n let oasEntries: OASEntryPublic[] = []\n let mcpEntries: McpEntryPublic[] = []\n\n try {\n ;[oasEntries, mcpEntries] = await Promise.all([\n client.listOAS(),\n client.listMCP(),\n ])\n } catch (err) {\n const message = (err as Error).message\n outputError(ExitCode.CONNECTIVITY_ERROR, `Failed to fetch capabilities: ${message}`,\n 'Check server connectivity with: ucli doctor')\n }\n\n const manifest: IntrospectManifest = {\n version: '1',\n services: oasEntries.map(toIntrospectService),\n mcpServers: mcpEntries.map(toIntrospectMcpServer),\n commands: getCommandReference(),\n }\n\n const format = (opts.format ?? 'json').toLowerCase()\n\n if (isJsonOutput()) {\n outputSuccess(manifest)\n return\n }\n\n if (format === 'json') {\n console.log(JSON.stringify(manifest, null, 2))\n return\n }\n\n if (format === 'yaml') {\n console.log(toYaml(manifest))\n return\n }\n\n // Fallback to json\n console.log(JSON.stringify(manifest, null, 2))\n })\n}\n\nfunction toIntrospectService(e: OASEntryPublic): IntrospectService {\n return {\n name: e.name,\n description: e.description,\n authType: e.authType,\n remoteUrl: e.remoteUrl,\n baseEndpoint: e.baseEndpoint,\n cacheTtl: e.cacheTtl,\n }\n}\n\nfunction toIntrospectMcpServer(e: McpEntryPublic): IntrospectMcpServer {\n return {\n name: e.name,\n description: e.description,\n transport: e.transport,\n enabled: e.enabled,\n }\n}\n\n/**\n * Static command reference that agents can use to understand\n * what CLI commands are available and how to use them.\n */\nfunction getCommandReference(): IntrospectCommand[] {\n return [\n {\n name: 'listoas',\n description: 'List all OAS services available in the current group',\n usage: 'ucli listoas [--format json|table|yaml] [--refresh]',\n examples: [\n 'ucli listoas',\n 'ucli listoas --format json',\n 'ucli listoas --refresh',\n ],\n },\n {\n name: 'oas info',\n description: 'Show detailed information for an OAS service',\n usage: 'ucli oas <service> info [--format json|table|yaml]',\n examples: [\n 'ucli oas payments info',\n 'ucli oas payments info --format json',\n ],\n },\n {\n name: 'oas listapi',\n description: 'List all available API operations for an OAS service',\n usage: 'ucli oas <service> listapi [--format json|table|yaml]',\n examples: [\n 'ucli oas payments listapi',\n 'ucli oas payments listapi --format json',\n ],\n },\n {\n name: 'oas apiinfo',\n description: 'Show detailed input/output parameters for a specific API operation',\n usage: 'ucli oas <service> apiinfo <api>',\n examples: [\n 'ucli oas payments apiinfo createCharge',\n 'ucli oas payments apiinfo getTransaction',\n ],\n },\n {\n name: 'oas invokeapi',\n description: 'Execute an API operation on an OAS service',\n usage: 'ucli oas <service> invokeapi <api> [--format json|table|yaml] [--query <jmespath>] [--data <json|@file>] [--params <json>] [--machine] [--dry-run]',\n examples: [\n 'ucli oas payments invokeapi listTransactions',\n 'ucli oas payments invokeapi getTransaction --params \\'{\"transactionId\": \"txn_123\"}\\'',\n 'ucli oas payments invokeapi createCharge --data \\'{\"amount\": 5000, \"currency\": \"USD\"}\\'',\n 'ucli oas inventory invokeapi listProducts --query \"items[?stock > `0`].name\"',\n 'ucli oas payments invokeapi createCharge --dry-run --data \\'{\"amount\": 5000}\\'',\n ],\n },\n {\n name: 'listmcp',\n description: 'List all MCP servers available in the current group',\n usage: 'ucli listmcp [--format json|table|yaml]',\n examples: [\n 'ucli listmcp',\n 'ucli listmcp --format json',\n ],\n },\n {\n name: 'mcp listtool',\n description: 'List tools available on a MCP server',\n usage: 'ucli mcp <server> listtool [--format json|table|yaml]',\n examples: [\n 'ucli mcp weather listtool',\n 'ucli mcp weather listtool --format json',\n ],\n },\n {\n name: 'mcp toolinfo',\n description: 'Show detailed input/output schema for a tool on a MCP server',\n usage: 'ucli mcp <server> toolinfo <tool> [--json]',\n examples: [\n 'ucli mcp weather toolinfo get_forecast',\n 'ucli mcp weather toolinfo get_forecast --json',\n ],\n },\n {\n name: 'mcp invoketool',\n description: 'Call a tool on a MCP server',\n usage: 'ucli mcp <server> invoketool <tool> [--data <json>] [--json]',\n examples: [\n 'ucli mcp weather invoketool get_forecast --data \\'{\"location\": \"New York\"}\\'',\n 'ucli mcp search invoketool web_search --data \\'{\"query\": \"ucli docs\", \"limit\": 5}\\'',\n 'ucli mcp weather invoketool get_forecast --json --data \\'{\"location\": \"New York\"}\\'',\n ],\n },\n {\n name: 'introspect',\n description: 'Return complete capability manifest (this command)',\n usage: 'ucli introspect [--format json|yaml]',\n examples: [\n 'ucli introspect',\n 'ucli introspect --format yaml',\n ],\n },\n {\n name: 'refresh',\n description: 'Force-refresh the local OAS cache from the server',\n usage: 'ucli refresh [--service <name>]',\n examples: [\n 'ucli refresh',\n 'ucli refresh --service payments',\n ],\n },\n {\n name: 'doctor',\n description: 'Check configuration, server connectivity, and token validity',\n usage: 'ucli doctor',\n examples: ['ucli doctor'],\n },\n {\n name: 'configure',\n description: 'Configure the server URL and authentication token',\n usage: 'ucli configure --server <url> --token <jwt>',\n examples: ['ucli configure --server https://oas.example.com --token eyJ...'],\n },\n ]\n}\n"],"mappings":"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","names":["createRequire","program","join","join","program","program","join","dirname","require","pkg","resolve","program","program","program","program","cfg","client","axios","program","program","program","require","createRequire"]}
@@ -5248,9 +5248,9 @@ var require_lib = __commonJS({
5248
5248
  }
5249
5249
  });
5250
5250
 
5251
- // ../../node_modules/.pnpm/@tronsfey+mcp2cli@1.3.0_zod@4.3.6/node_modules/@tronsfey/mcp2cli/dist/cache.js
5251
+ // ../mcp2cli/dist/cache.js
5252
5252
  var require_cache = __commonJS({
5253
- "../../node_modules/.pnpm/@tronsfey+mcp2cli@1.3.0_zod@4.3.6/node_modules/@tronsfey/mcp2cli/dist/cache.js"(exports) {
5253
+ "../mcp2cli/dist/cache.js"(exports) {
5254
5254
  "use strict";
5255
5255
  var __createBinding = exports && exports.__createBinding || (Object.create ? (function(o, m, k, k2) {
5256
5256
  if (k2 === void 0) k2 = k;
@@ -5302,8 +5302,8 @@ var require_cache = __commonJS({
5302
5302
  }
5303
5303
  function getCacheKey(config) {
5304
5304
  const parts = [];
5305
- if (config.type === "http") {
5306
- parts.push(config.url);
5305
+ if (config.type === "http" || config.type === "sse") {
5306
+ parts.push(config.type + ":" + config.url);
5307
5307
  if (config.headers && Object.keys(config.headers).length > 0) {
5308
5308
  const sorted = Object.keys(config.headers).sort();
5309
5309
  for (const k of sorted) {
@@ -5354,9 +5354,9 @@ var require_cache = __commonJS({
5354
5354
  }
5355
5355
  });
5356
5356
 
5357
- // ../../node_modules/.pnpm/@tronsfey+mcp2cli@1.3.0_zod@4.3.6/node_modules/@tronsfey/mcp2cli/dist/types/index.js
5357
+ // ../mcp2cli/dist/types/index.js
5358
5358
  var require_types = __commonJS({
5359
- "../../node_modules/.pnpm/@tronsfey+mcp2cli@1.3.0_zod@4.3.6/node_modules/@tronsfey/mcp2cli/dist/types/index.js"(exports) {
5359
+ "../mcp2cli/dist/types/index.js"(exports) {
5360
5360
  "use strict";
5361
5361
  Object.defineProperty(exports, "__esModule", { value: true });
5362
5362
  exports.EXIT_TOOL_EXECUTION = exports.EXIT_INVALID_ARGS = exports.EXIT_TOOL_NOT_FOUND = exports.EXIT_CONNECTION = exports.EXIT_GENERAL = exports.EXIT_OK = void 0;
@@ -5369,9 +5369,9 @@ var require_types = __commonJS({
5369
5369
  }
5370
5370
  });
5371
5371
 
5372
- // ../../node_modules/.pnpm/@tronsfey+mcp2cli@1.3.0_zod@4.3.6/node_modules/@tronsfey/mcp2cli/dist/runner/index.js
5372
+ // ../mcp2cli/dist/runner/index.js
5373
5373
  var require_runner = __commonJS({
5374
- "../../node_modules/.pnpm/@tronsfey+mcp2cli@1.3.0_zod@4.3.6/node_modules/@tronsfey/mcp2cli/dist/runner/index.js"(exports) {
5374
+ "../mcp2cli/dist/runner/index.js"(exports) {
5375
5375
  var __importDefault = exports && exports.__importDefault || function(mod) {
5376
5376
  return mod && mod.__esModule ? mod : { "default": mod };
5377
5377
  };
@@ -5740,4 +5740,4 @@ Tool: ${chalk_1.default.cyan(tool.name)}
5740
5740
  }
5741
5741
  });
5742
5742
  export default require_runner();
5743
- //# sourceMappingURL=runner-ROLDMGH3.js.map
5743
+ //# sourceMappingURL=runner-5RDUAS4J.js.map