{"version":3,"file":"mcp-endpoint-DbWtLcba.mjs","names":[],"sources":["../src/config/mcp-endpoint.ts"],"sourcesContent":["import { isIP } from 'node:net'\n\nconst LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1', '[::1]'])\n\nexport const LOCAL_GRAPH_MCP_ENDPOINT = 'http://127.0.0.1:8012/mcp'\n\nfunction isLoopbackHost(hostname: string): boolean {\n  const normalized = hostname.toLowerCase().replace(/^\\[(.*)\\]$/, '$1')\n  if (LOOPBACK_HOSTS.has(normalized)) return true\n  if (isIP(normalized) !== 4) return false\n  return normalized.split('.')[0] === '127'\n}\n\nfunction isKubernetesServiceHost(hostname: string): boolean {\n  return hostname.toLowerCase().endsWith('.svc.cluster.local')\n}\n\nexport function graphMcpEndpointEnvOverride(): string | undefined {\n  const envEndpoint = process.env.CHAIN_INSIGHTS_GRAPH_MCP_ENDPOINT?.trim()\n    || process.env.GRAPH_MCP_ENDPOINT?.trim()\n  return envEndpoint ? validateMcpEndpoint(envEndpoint, 'graphMcpEndpoint') : undefined\n}\n\nexport function validateMcpEndpoint(value: string, key: string): string {\n  const trimmed = value.trim()\n  if (!trimmed) {\n    throw new Error(`${key} must be a non-empty absolute URL.`)\n  }\n\n  let parsed: URL\n  try {\n    parsed = new URL(trimmed)\n  } catch {\n    throw new Error(\n      `${key} must be an absolute URL (example: https://mcp.example.com/mcp or http://127.0.0.1:8012/mcp).`,\n    )\n  }\n\n  if (parsed.username || parsed.password) {\n    throw new Error(`${key} must not include URL credentials.`)\n  }\n  if (parsed.search || parsed.hash) {\n    throw new Error(`${key} must not include query parameters or URL fragments.`)\n  }\n  if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {\n    throw new Error(`${key} must use either https:// or http://.`)\n  }\n  if (parsed.protocol === 'http:' && !isLoopbackHost(parsed.hostname) && !isKubernetesServiceHost(parsed.hostname)) {\n    throw new Error(\n      `${key} must use https:// for remote hosts. http:// is allowed only for localhost, loopback addresses, or Kubernetes *.svc.cluster.local service DNS.`,\n    )\n  }\n\n  return trimmed\n}\n"],"mappings":";;AAEA,MAAM,iCAAiB,IAAI,IAAI;CAAC;CAAa;CAAa;CAAO;AAAO,CAAC;AAEzE,MAAa,2BAA2B;AAExC,SAAS,eAAe,UAA2B;CACjD,MAAM,aAAa,SAAS,YAAY,CAAC,CAAC,QAAQ,cAAc,IAAI;CACpE,IAAI,eAAe,IAAI,UAAU,GAAG,OAAO;CAC3C,IAAI,KAAK,UAAU,MAAM,GAAG,OAAO;CACnC,OAAO,WAAW,MAAM,GAAG,CAAC,CAAC,OAAO;AACtC;AAEA,SAAS,wBAAwB,UAA2B;CAC1D,OAAO,SAAS,YAAY,CAAC,CAAC,SAAS,oBAAoB;AAC7D;AAEA,SAAgB,8BAAkD;CAChE,MAAM,cAAc,QAAQ,IAAI,mCAAmC,KAAK,KACnE,QAAQ,IAAI,oBAAoB,KAAK;CAC1C,OAAO,cAAc,oBAAoB,aAAa,kBAAkB,IAAI,KAAA;AAC9E;AAEA,SAAgB,oBAAoB,OAAe,KAAqB;CACtE,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,GAAG,IAAI,mCAAmC;CAG5D,IAAI;CACJ,IAAI;EACF,SAAS,IAAI,IAAI,OAAO;CAC1B,QAAQ;EACN,MAAM,IAAI,MACR,GAAG,IAAI,8FACT;CACF;CAEA,IAAI,OAAO,YAAY,OAAO,UAC5B,MAAM,IAAI,MAAM,GAAG,IAAI,mCAAmC;CAE5D,IAAI,OAAO,UAAU,OAAO,MAC1B,MAAM,IAAI,MAAM,GAAG,IAAI,qDAAqD;CAE9E,IAAI,OAAO,aAAa,YAAY,OAAO,aAAa,SACtD,MAAM,IAAI,MAAM,GAAG,IAAI,sCAAsC;CAE/D,IAAI,OAAO,aAAa,WAAW,CAAC,eAAe,OAAO,QAAQ,KAAK,CAAC,wBAAwB,OAAO,QAAQ,GAC7G,MAAM,IAAI,MACR,GAAG,IAAI,+IACT;CAGF,OAAO;AACT"}