{"version":3,"file":"config-BFi5yBMm.mjs","names":[],"sources":["../src/config/index.ts"],"sourcesContent":["import { readFile, writeFile, mkdir } from 'node:fs/promises'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { DEFAULT_CONFIG, parseInvestigatorConfig, type InvestigatorConfig } from './schema.js'\nimport { graphMcpEndpointEnvOverride } from './mcp-endpoint.js'\n\n// Config path derived from HOME at call time so tests can override HOME.\nfunction configPath(): string {\n  return path.join(os.homedir(), '.chain-insights', 'config.json')\n}\n\nlet _cached: InvestigatorConfig | null = null\n\nfunction applyRuntimeEnvOverrides(config: InvestigatorConfig): InvestigatorConfig {\n  let graphMcpEndpoint: string | undefined\n  try {\n    graphMcpEndpoint = graphMcpEndpointEnvOverride()\n  } catch (err) {\n    throw new Error(`Invalid configuration in environment: ${(err as Error).message}`)\n  }\n  return graphMcpEndpoint\n    ? parseInvestigatorConfig({ ...config, graphMcpEndpoint })\n    : config\n}\n\nasync function loadStoredConfig(): Promise<InvestigatorConfig> {\n  const cfgPath = configPath()\n  let raw: string\n  try {\n    raw = await readFile(cfgPath, 'utf8')\n  } catch (err) {\n    if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n      return DEFAULT_CONFIG\n    }\n    throw new Error(`Unable to read config ${cfgPath}: ${(err as Error).message}`)\n  }\n\n  let parsedJson: unknown\n  try {\n    parsedJson = JSON.parse(raw) as unknown\n  } catch (err) {\n    throw new Error(`Invalid JSON in ${cfgPath}: ${(err as Error).message}`)\n  }\n\n  try {\n    return parseInvestigatorConfig(parsedJson)\n  } catch (err) {\n    throw new Error(`Invalid configuration in ${cfgPath}: ${(err as Error).message}`)\n  }\n}\n\nexport async function loadConfig(): Promise<InvestigatorConfig> {\n  if (_cached) return _cached\n  _cached = applyRuntimeEnvOverrides(await loadStoredConfig())\n  return _cached\n}\n\nexport async function saveConfig(updates: Partial<InvestigatorConfig>): Promise<void> {\n  const current = await loadStoredConfig()\n  let next: InvestigatorConfig\n  try {\n    next = parseInvestigatorConfig({ ...current, ...updates })\n  } catch (err) {\n    throw new Error(`Invalid configuration update: ${(err as Error).message}`)\n  }\n  const p = configPath()\n  await mkdir(path.dirname(p), { recursive: true })\n  await writeFile(p, JSON.stringify(next, null, 2) + '\\n', { mode: 0o600 })\n  _cached = applyRuntimeEnvOverrides(next)\n}\n\nexport async function resetConfigCache(): Promise<void> {\n  _cached = null\n}\n"],"mappings":";;;;;;;;;;;;AAOA,SAAS,aAAqB;CAC5B,OAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,mBAAmB,aAAa;AACjE;AAEA,IAAI,UAAqC;AAEzC,SAAS,yBAAyB,QAAgD;CAChF,IAAI;CACJ,IAAI;EACF,mBAAmB,4BAA4B;CACjD,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,yCAA0C,IAAc,SAAS;CACnF;CACA,OAAO,mBACH,wBAAwB;EAAE,GAAG;EAAQ;CAAiB,CAAC,IACvD;AACN;AAEA,eAAe,mBAAgD;CAC7D,MAAM,UAAU,WAAW;CAC3B,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,SAAS,SAAS,MAAM;CACtC,SAAS,KAAK;EACZ,IAAK,IAA8B,SAAS,UAC1C,OAAO;EAET,MAAM,IAAI,MAAM,yBAAyB,QAAQ,IAAK,IAAc,SAAS;CAC/E;CAEA,IAAI;CACJ,IAAI;EACF,aAAa,KAAK,MAAM,GAAG;CAC7B,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,mBAAmB,QAAQ,IAAK,IAAc,SAAS;CACzE;CAEA,IAAI;EACF,OAAO,wBAAwB,UAAU;CAC3C,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,4BAA4B,QAAQ,IAAK,IAAc,SAAS;CAClF;AACF;AAEA,eAAsB,aAA0C;CAC9D,IAAI,SAAS,OAAO;CACpB,UAAU,yBAAyB,MAAM,iBAAiB,CAAC;CAC3D,OAAO;AACT;AAEA,eAAsB,WAAW,SAAqD;CACpF,MAAM,UAAU,MAAM,iBAAiB;CACvC,IAAI;CACJ,IAAI;EACF,OAAO,wBAAwB;GAAE,GAAG;GAAS,GAAG;EAAQ,CAAC;CAC3D,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,iCAAkC,IAAc,SAAS;CAC3E;CACA,MAAM,IAAI,WAAW;CACrB,MAAM,MAAM,KAAK,QAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;CAChD,MAAM,UAAU,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;CACxE,UAAU,yBAAyB,IAAI;AACzC;AAEA,eAAsB,mBAAkC;CACtD,UAAU;AACZ"}