{"version":3,"file":"rpc-command.mjs","names":[],"sources":["../../../src/commands/rpc-command.ts"],"sourcesContent":["/**\n * RPC commands — view and configure RPC providers.\n *\n * /rpc — Show current RPC provider configuration and health per chain.\n */\n\nimport { getRpcManager } from '../services/rpc-provider.js';\n\nconst CHAIN_NAMES: Record<number, string> = {\n  8453: 'Base',\n  1: 'Ethereum',\n  42161: 'Arbitrum',\n  10: 'Optimism',\n  137: 'Polygon',\n};\n\nexport const rpcCommand = {\n  name: 'rpc',\n  description: 'Show RPC provider configuration, health, and active endpoints per chain',\n  acceptsArgs: false,\n  requireAuth: false,\n  handler: async () => {\n    const rpc = getRpcManager();\n    const chains = rpc.getSupportedChains();\n    const sections: string[] = [];\n\n    for (const chainId of chains) {\n      const name = CHAIN_NAMES[chainId] ?? `Chain ${chainId}`;\n      const providers = rpc.getProviders(chainId);\n      const health = rpc.getHealthReport(chainId);\n\n      if (providers.length === 0) {\n        sections.push(`**${name}** (${chainId}): No available providers`);\n        continue;\n      }\n\n      const top = providers[0]!;\n      const topUrl = rpc.buildUrl(top);\n      // Redact API keys / tokens from display\n      const displayUrl = topUrl.replace(/[?&/][a-zA-Z0-9_\\-]{20,}/g, '/***');\n\n      const healthyCount = health.filter(h => h.available).length;\n      const circuitOpen = health.filter(h => h.circuitOpen).length;\n\n      let line = `**${name}** (${chainId}): ${top.name}`;\n      line += `\\n  URL: \\`${displayUrl}\\``;\n      line += `\\n  Providers: ${healthyCount}/${health.length} healthy`;\n      if (circuitOpen > 0) {\n        line += ` | ${circuitOpen} circuit-broken`;\n      }\n      if (providers.length > 1) {\n        const fallbacks = providers.slice(1).map(p => p.name).join(', ');\n        line += `\\n  Fallback: ${fallbacks}`;\n      }\n\n      sections.push(line);\n    }\n\n    // Show custom/QuickNode env var status\n    const envHints: string[] = [];\n    if (process.env.RPC_URL) envHints.push('`RPC_URL` set (custom global)');\n    if (process.env.QUICKNODE_ENDPOINT) envHints.push('`QUICKNODE_ENDPOINT` set');\n    for (const [id, envName] of Object.entries({\n      8453: 'RPC_URL_BASE', 1: 'RPC_URL_ETH', 42161: 'RPC_URL_ARB',\n      10: 'RPC_URL_OP', 137: 'RPC_URL_POLYGON',\n    })) {\n      if (process.env[envName]) {\n        const chain = CHAIN_NAMES[Number(id)] ?? id;\n        envHints.push(`\\`${envName}\\` set (${chain})`);\n      }\n    }\n    for (const [id, envName] of Object.entries({\n      8453: 'QUICKNODE_ENDPOINT_BASE', 1: 'QUICKNODE_ENDPOINT_ETH',\n      42161: 'QUICKNODE_ENDPOINT_ARB', 10: 'QUICKNODE_ENDPOINT_OP',\n      137: 'QUICKNODE_ENDPOINT_POLYGON',\n    })) {\n      if (process.env[envName]) {\n        const chain = CHAIN_NAMES[Number(id)] ?? id;\n        envHints.push(`\\`${envName}\\` set (${chain})`);\n      }\n    }\n    if (process.env.ALCHEMY_API_KEY) envHints.push('`ALCHEMY_API_KEY` set');\n\n    const mev = rpc.isMevProtectionEnabled() ? 'ON' : 'OFF';\n\n    let text = `**RPC Configuration**\\n\\n${sections.join('\\n\\n')}`;\n    text += `\\n\\nMEV protection: ${mev}`;\n    if (envHints.length > 0) {\n      text += `\\n\\n**Configured env vars:**\\n${envHints.map(h => `  ${h}`).join('\\n')}`;\n    }\n    text += '\\n\\nSet `RPC_URL_BASE`, `QUICKNODE_ENDPOINT`, or `ALCHEMY_API_KEY` env vars to configure providers.';\n\n    return { text };\n  },\n};\n"],"mappings":";;;;;;;AAQA,MAAM,cAAsC;CAC1C,MAAM;CACN,GAAG;CACH,OAAO;CACP,IAAI;CACJ,KAAK;CACN;AAED,MAAa,aAAa;CACxB,MAAM;CACN,aAAa;CACb,aAAa;CACb,aAAa;CACb,SAAS,YAAY;EACnB,MAAM,MAAM,eAAe;EAC3B,MAAM,SAAS,IAAI,oBAAoB;EACvC,MAAM,WAAqB,EAAE;AAE7B,OAAK,MAAM,WAAW,QAAQ;GAC5B,MAAM,OAAO,YAAY,YAAY,SAAS;GAC9C,MAAM,YAAY,IAAI,aAAa,QAAQ;GAC3C,MAAM,SAAS,IAAI,gBAAgB,QAAQ;AAE3C,OAAI,UAAU,WAAW,GAAG;AAC1B,aAAS,KAAK,KAAK,KAAK,MAAM,QAAQ,2BAA2B;AACjE;;GAGF,MAAM,MAAM,UAAU;GAGtB,MAAM,aAFS,IAAI,SAAS,IAAI,CAEN,QAAQ,6BAA6B,OAAO;GAEtE,MAAM,eAAe,OAAO,QAAO,MAAK,EAAE,UAAU,CAAC;GACrD,MAAM,cAAc,OAAO,QAAO,MAAK,EAAE,YAAY,CAAC;GAEtD,IAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,KAAK,IAAI;AAC5C,WAAQ,cAAc,WAAW;AACjC,WAAQ,kBAAkB,aAAa,GAAG,OAAO,OAAO;AACxD,OAAI,cAAc,EAChB,SAAQ,MAAM,YAAY;AAE5B,OAAI,UAAU,SAAS,GAAG;IACxB,MAAM,YAAY,UAAU,MAAM,EAAE,CAAC,KAAI,MAAK,EAAE,KAAK,CAAC,KAAK,KAAK;AAChE,YAAQ,iBAAiB;;AAG3B,YAAS,KAAK,KAAK;;EAIrB,MAAM,WAAqB,EAAE;AAC7B,MAAI,QAAQ,IAAI,QAAS,UAAS,KAAK,gCAAgC;AACvE,MAAI,QAAQ,IAAI,mBAAoB,UAAS,KAAK,2BAA2B;AAC7E,OAAK,MAAM,CAAC,IAAI,YAAY,OAAO,QAAQ;GACzC,MAAM;GAAgB,GAAG;GAAe,OAAO;GAC/C,IAAI;GAAc,KAAK;GACxB,CAAC,CACA,KAAI,QAAQ,IAAI,UAAU;GACxB,MAAM,QAAQ,YAAY,OAAO,GAAG,KAAK;AACzC,YAAS,KAAK,KAAK,QAAQ,UAAU,MAAM,GAAG;;AAGlD,OAAK,MAAM,CAAC,IAAI,YAAY,OAAO,QAAQ;GACzC,MAAM;GAA2B,GAAG;GACpC,OAAO;GAA0B,IAAI;GACrC,KAAK;GACN,CAAC,CACA,KAAI,QAAQ,IAAI,UAAU;GACxB,MAAM,QAAQ,YAAY,OAAO,GAAG,KAAK;AACzC,YAAS,KAAK,KAAK,QAAQ,UAAU,MAAM,GAAG;;AAGlD,MAAI,QAAQ,IAAI,gBAAiB,UAAS,KAAK,wBAAwB;EAEvE,MAAM,MAAM,IAAI,wBAAwB,GAAG,OAAO;EAElD,IAAI,OAAO,4BAA4B,SAAS,KAAK,OAAO;AAC5D,UAAQ,uBAAuB;AAC/B,MAAI,SAAS,SAAS,EACpB,SAAQ,iCAAiC,SAAS,KAAI,MAAK,KAAK,IAAI,CAAC,KAAK,KAAK;AAEjF,UAAQ;AAER,SAAO,EAAE,MAAM;;CAElB"}