{"version":3,"sources":["../src/cli/commands/config.ts"],"sourcesContent":["/**\n * `langwatch config <get|set|list>` — explicit persistence + introspection\n * for user-global CLI configuration. Mirrors `gh config`, `doctl auth init`,\n * and `stripe config` patterns. Replaces hand-editing\n * `~/.langwatch/config.json` for the common case (set the endpoint).\n *\n * Today's keys (whitelisted — no arbitrary key/value writes):\n *   - endpoint        → control_plane_url\n *   - gateway-url     → gateway_url\n *\n * Spec: specs/ai-governance/cli-onboarding/login-unified.feature\n */\n\nimport chalk from \"chalk\";\nimport { loadConfig, saveConfig, configPath } from \"@/cli/utils/governance/config\";\nimport { resolveControlPlaneEndpoint } from \"@/cli/utils/governance/resolveEndpoint\";\n\ntype ConfigKey = \"endpoint\" | \"gateway-url\";\n\nconst KEY_LABELS: Record<ConfigKey, string> = {\n  endpoint: \"endpoint\",\n  \"gateway-url\": \"gateway_url\",\n};\n\nconst VALID_KEYS = new Set<ConfigKey>([\"endpoint\", \"gateway-url\"]);\n\nfunction isValidKey(s: string): s is ConfigKey {\n  return VALID_KEYS.has(s as ConfigKey);\n}\n\nfunction validateUrl(url: string): string | null {\n  if (!url || url.trim() === \"\") return \"value cannot be empty\";\n  try {\n    const u = new URL(url);\n    if (u.protocol !== \"http:\" && u.protocol !== \"https:\") {\n      return \"value must be an absolute URL with http(s) scheme\";\n    }\n  } catch {\n    return \"value must be an absolute URL with http(s) scheme\";\n  }\n  return null;\n}\n\nexport const configSetCommand = async (\n  key: string,\n  value: string,\n): Promise<void> => {\n  if (!isValidKey(key)) {\n    console.error(\n      chalk.red(\n        `Error: unknown config key \"${key}\". Supported: ${Array.from(VALID_KEYS).join(\", \")}`,\n      ),\n    );\n    process.exit(1);\n  }\n  const err = validateUrl(value);\n  if (err) {\n    console.error(chalk.red(`Error: ${err}`));\n    process.exit(1);\n  }\n\n  const trimmed = value.replace(/\\/+$/, \"\");\n  const cfg = loadConfig();\n  if (key === \"endpoint\") {\n    cfg.control_plane_url = trimmed;\n  } else if (key === \"gateway-url\") {\n    cfg.gateway_url = trimmed;\n  }\n  saveConfig(cfg);\n\n  console.log(chalk.green(`✓ ${key} = ${trimmed}`));\n  console.log(chalk.gray(`  saved to ${configPath()}`));\n};\n\nexport const configGetCommand = async (key: string): Promise<void> => {\n  if (!isValidKey(key)) {\n    console.error(\n      chalk.red(\n        `Error: unknown config key \"${key}\". Supported: ${Array.from(VALID_KEYS).join(\", \")}`,\n      ),\n    );\n    process.exit(1);\n  }\n  const cfg = loadConfig();\n  if (key === \"endpoint\") {\n    // Use the unified resolver so the printed value matches what every\n    // other command sees (env > config > default).\n    const resolved = resolveControlPlaneEndpoint({ cfg });\n    process.stdout.write(`${resolved.url}\\n`);\n  } else if (key === \"gateway-url\") {\n    process.stdout.write(`${cfg.gateway_url}\\n`);\n  }\n};\n\nexport const configListCommand = async (): Promise<void> => {\n  const cfg = loadConfig();\n  const endpoint = resolveControlPlaneEndpoint({ cfg });\n\n  const sourceLabel: Record<typeof endpoint.source, string> = {\n    flag: \"(--endpoint flag)\",\n    env: \"(LANGWATCH_ENDPOINT env)\",\n    config: \"(persisted config)\",\n    default: \"(built-in default)\",\n  };\n\n  console.log(`endpoint    = ${endpoint.url}  ${chalk.gray(sourceLabel[endpoint.source])}`);\n  console.log(`gateway-url = ${cfg.gateway_url}`);\n  console.log();\n  console.log(chalk.gray(`config file: ${configPath()}`));\n  // Intentional: never print access_token, refresh_token, or VK secret.\n  // Use `langwatch whoami` for session introspection (which also avoids\n  // printing secrets).\n  if (cfg.access_token) {\n    console.log(chalk.gray(\"device session: present (use `langwatch whoami` to inspect)\"));\n  }\n};\n"],"mappings":";;;;;;;;;;;;AAaA,OAAO,WAAW;AAWlB,IAAM,aAAa,oBAAI,IAAe,CAAC,YAAY,aAAa,CAAC;AAEjE,SAAS,WAAW,GAA2B;AAC7C,SAAO,WAAW,IAAI,CAAc;AACtC;AAEA,SAAS,YAAY,KAA4B;AAC/C,MAAI,CAAC,OAAO,IAAI,KAAK,MAAM,GAAI,QAAO;AACtC,MAAI;AACF,UAAM,IAAI,IAAI,IAAI,GAAG;AACrB,QAAI,EAAE,aAAa,WAAW,EAAE,aAAa,UAAU;AACrD,aAAO;AAAA,IACT;AAAA,EACF,SAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,IAAM,mBAAmB,OAC9B,KACA,UACkB;AAClB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,8BAA8B,GAAG,iBAAiB,MAAM,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC;AAAA,MACrF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,MAAM,YAAY,KAAK;AAC7B,MAAI,KAAK;AACP,YAAQ,MAAM,MAAM,IAAI,UAAU,GAAG,EAAE,CAAC;AACxC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,MAAM,QAAQ,QAAQ,EAAE;AACxC,QAAM,MAAM,WAAW;AACvB,MAAI,QAAQ,YAAY;AACtB,QAAI,oBAAoB;AAAA,EAC1B,WAAW,QAAQ,eAAe;AAChC,QAAI,cAAc;AAAA,EACpB;AACA,aAAW,GAAG;AAEd,UAAQ,IAAI,MAAM,MAAM,UAAK,GAAG,MAAM,OAAO,EAAE,CAAC;AAChD,UAAQ,IAAI,MAAM,KAAK,cAAc,WAAW,CAAC,EAAE,CAAC;AACtD;AAEO,IAAM,mBAAmB,OAAO,QAA+B;AACpE,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,8BAA8B,GAAG,iBAAiB,MAAM,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC;AAAA,MACrF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,MAAM,WAAW;AACvB,MAAI,QAAQ,YAAY;AAGtB,UAAM,WAAW,4BAA4B,EAAE,IAAI,CAAC;AACpD,YAAQ,OAAO,MAAM,GAAG,SAAS,GAAG;AAAA,CAAI;AAAA,EAC1C,WAAW,QAAQ,eAAe;AAChC,YAAQ,OAAO,MAAM,GAAG,IAAI,WAAW;AAAA,CAAI;AAAA,EAC7C;AACF;AAEO,IAAM,oBAAoB,YAA2B;AAC1D,QAAM,MAAM,WAAW;AACvB,QAAM,WAAW,4BAA4B,EAAE,IAAI,CAAC;AAEpD,QAAM,cAAsD;AAAA,IAC1D,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAEA,UAAQ,IAAI,iBAAiB,SAAS,GAAG,KAAK,MAAM,KAAK,YAAY,SAAS,MAAM,CAAC,CAAC,EAAE;AACxF,UAAQ,IAAI,iBAAiB,IAAI,WAAW,EAAE;AAC9C,UAAQ,IAAI;AACZ,UAAQ,IAAI,MAAM,KAAK,gBAAgB,WAAW,CAAC,EAAE,CAAC;AAItD,MAAI,IAAI,cAAc;AACpB,YAAQ,IAAI,MAAM,KAAK,6DAA6D,CAAC;AAAA,EACvF;AACF;","names":[]}