{"version":3,"sources":["../src/cli/commands/init-shell.ts"],"sourcesContent":["import { loadConfig, isLoggedIn } from \"@/cli/utils/governance/config\";\nimport { envForTool } from \"@/cli/utils/governance/wrapper\";\n\nconst TOOLS = [\"claude\", \"codex\", \"cursor\", \"gemini\"] as const;\n\n/**\n * `langwatch init-shell <shell>` — print an eval-able snippet so\n * any shell session auto-exports the gateway env vars for every\n * wrapped tool (claude, codex, cursor, gemini). The always-on\n * alternative to the `langwatch claude` exec wrapper:\n *\n *   eval \"$(langwatch init-shell zsh)\"\n *\n * Supported shells: zsh, bash, fish, cmd, powershell. Defaults to\n * zsh.\n *\n * The bare `langwatch init` is reserved by the existing prompt-\n * project init flow; this is namespaced as `init-shell` to avoid\n * a regression on the existing CLI surface.\n */\nexport const initShellCommand = async (\n  shell?: string,\n): Promise<void> => {\n  const cfg = loadConfig();\n  if (!isLoggedIn(cfg)) {\n    process.stdout.write(\"# not logged in — run `langwatch login --device` first\\n\");\n    process.exit(1);\n  }\n\n  // Union the env vars across all wrapped tools, dedup keys.\n  const seen = new Set<string>();\n  const entries: Array<[string, string]> = [];\n  for (const tool of TOOLS) {\n    for (const [k, v] of Object.entries(envForTool(cfg, tool).vars)) {\n      if (seen.has(k)) continue;\n      seen.add(k);\n      entries.push([k, v]);\n    }\n  }\n\n  const target = (shell ?? \"zsh\").toLowerCase();\n  switch (target) {\n    case \"fish\":\n      for (const [k, v] of entries) {\n        process.stdout.write(`set -gx ${k} ${quoteFish(v)}\\n`);\n      }\n      break;\n    case \"cmd\":\n      for (const [k, v] of entries) {\n        // cmd has no robust escape; quote and strip CR/LF defensively.\n        // Without quoting, values containing &, |, <, >, ^ would be\n        // parsed as cmd metacharacters — a legitimate URL query string\n        // (e.g. gateway_url with `?org=acme&env=prod`) would be split.\n        const sanitized = v.replace(/[\\r\\n]/g, \"\").replace(/\"/g, '\"\"');\n        process.stdout.write(`set \"${k}=${sanitized}\"\\n`);\n      }\n      break;\n    case \"powershell\":\n    case \"pwsh\":\n      for (const [k, v] of entries) {\n        process.stdout.write(`$env:${k} = '${v.replace(/'/g, \"''\")}'\\n`);\n      }\n      break;\n    default: {\n      // bash / zsh / sh\n      for (const [k, v] of entries) {\n        process.stdout.write(`export ${k}=${quotePosix(v)}\\n`);\n      }\n    }\n  }\n};\n\nfunction quotePosix(s: string): string {\n  if (!/[ \\t\\n'\"$\\\\]/.test(s)) return s;\n  return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n\nfunction quoteFish(s: string): string {\n  if (!/[ \\t\\n'\"$\\\\]/.test(s)) return s;\n  return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n}\n"],"mappings":";;;;;;;;;;;;;;AAGA,IAAM,QAAQ,CAAC,UAAU,SAAS,UAAU,QAAQ;AAiB7C,IAAM,mBAAmB,OAC9B,UACkB;AAClB,QAAM,MAAM,WAAW;AACvB,MAAI,CAAC,WAAW,GAAG,GAAG;AACpB,YAAQ,OAAO,MAAM,+DAA0D;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,UAAmC,CAAC;AAC1C,aAAW,QAAQ,OAAO;AACxB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,WAAW,KAAK,IAAI,EAAE,IAAI,GAAG;AAC/D,UAAI,KAAK,IAAI,CAAC,EAAG;AACjB,WAAK,IAAI,CAAC;AACV,cAAQ,KAAK,CAAC,GAAG,CAAC,CAAC;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,UAAU,wBAAS,OAAO,YAAY;AAC5C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,iBAAW,CAAC,GAAG,CAAC,KAAK,SAAS;AAC5B,gBAAQ,OAAO,MAAM,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC;AAAA,CAAI;AAAA,MACvD;AACA;AAAA,IACF,KAAK;AACH,iBAAW,CAAC,GAAG,CAAC,KAAK,SAAS;AAK5B,cAAM,YAAY,EAAE,QAAQ,WAAW,EAAE,EAAE,QAAQ,MAAM,IAAI;AAC7D,gBAAQ,OAAO,MAAM,QAAQ,CAAC,IAAI,SAAS;AAAA,CAAK;AAAA,MAClD;AACA;AAAA,IACF,KAAK;AAAA,IACL,KAAK;AACH,iBAAW,CAAC,GAAG,CAAC,KAAK,SAAS;AAC5B,gBAAQ,OAAO,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,MAAM,IAAI,CAAC;AAAA,CAAK;AAAA,MACjE;AACA;AAAA,IACF,SAAS;AAEP,iBAAW,CAAC,GAAG,CAAC,KAAK,SAAS;AAC5B,gBAAQ,OAAO,MAAM,UAAU,CAAC,IAAI,WAAW,CAAC,CAAC;AAAA,CAAI;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,WAAW,GAAmB;AACrC,MAAI,CAAC,eAAe,KAAK,CAAC,EAAG,QAAO;AACpC,SAAO,MAAM,EAAE,QAAQ,MAAM,OAAO,IAAI;AAC1C;AAEA,SAAS,UAAU,GAAmB;AACpC,MAAI,CAAC,eAAe,KAAK,CAAC,EAAG,QAAO;AACpC,SAAO,MAAM,EAAE,QAAQ,MAAM,OAAO,IAAI;AAC1C;","names":[]}