{"version":3,"sources":["../src/cli/commands/traces/export.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport fs from \"fs\";\nimport { checkApiKey } from \"../../utils/apiKey\";\nimport { formatFetchError } from \"../../utils/formatFetchError\";\nimport { failSpinner } from \"../../utils/spinnerError\";\nimport { buildAuthHeaders } from \"@/internal/api/auth\";\n\nimport { resolveControlPlaneUrl } from \"@/cli/utils/governance/resolveEndpoint\";\nexport const exportTracesCommand = async (options: {\n  startDate?: string;\n  endDate?: string;\n  query?: string;\n  format?: string;\n  output?: string;\n  limit?: string;\n}): Promise<void> => {\n  checkApiKey();\n\n  const apiKey = process.env.LANGWATCH_API_KEY ?? \"\";\n  const endpoint = resolveControlPlaneUrl();\n\n  const format = options.format ?? \"jsonl\";\n  if (format !== \"csv\" && format !== \"jsonl\" && format !== \"json\") {\n    console.error(chalk.red(\"Error: --format must be csv, jsonl, or json\"));\n    process.exit(1);\n  }\n\n  const now = Date.now();\n  const startDate = options.startDate\n    ? new Date(options.startDate).getTime()\n    : now - 7 * 24 * 60 * 60 * 1000; // 7 days ago\n  const endDate = options.endDate\n    ? new Date(options.endDate).getTime()\n    : now;\n\n  const limit = options.limit ? parseInt(options.limit, 10) : 1000;\n  const spinner = ora(`Exporting traces (${format})...`).start();\n\n  try {\n    const response = await fetch(`${endpoint}/api/traces/search`, {\n      method: \"POST\",\n      headers: {\n        \"Content-Type\": \"application/json\",\n        ...buildAuthHeaders({ apiKey }),\n      },\n      body: JSON.stringify({\n        query: options.query,\n        startDate,\n        endDate,\n        pageSize: Math.min(limit, 100),\n        format: \"json\",\n      }),\n    });\n\n    if (!response.ok) {\n      const message = await formatFetchError(response);\n      spinner.fail(`Export failed: ${message}`);\n      process.exit(1);\n    }\n\n    const data = await response.json() as {\n      traces: Array<{\n        trace_id: string;\n        input?: { value: string };\n        output?: { value: string };\n        timestamps?: { started_at?: number };\n        metadata?: Record<string, unknown>;\n        error?: Record<string, unknown>;\n      }>;\n      pagination?: { totalHits?: number };\n    };\n\n    const traces = data.traces;\n    spinner.succeed(`Exported ${traces.length} trace${traces.length !== 1 ? \"s\" : \"\"}${data.pagination?.totalHits ? ` (${data.pagination.totalHits} total)` : \"\"}`);\n\n    let output: string;\n\n    if (format === \"json\") {\n      output = JSON.stringify(traces, null, 2);\n    } else if (format === \"jsonl\") {\n      output = traces.map((t) => JSON.stringify(t)).join(\"\\n\") + \"\\n\";\n    } else {\n      // CSV format\n      const headers = [\"trace_id\", \"input\", \"output\", \"started_at\", \"error\"];\n      const rows = traces.map((t) => [\n        t.trace_id,\n        csvEscape(t.input?.value ?? \"\"),\n        csvEscape(t.output?.value ?? \"\"),\n        t.timestamps?.started_at ? new Date(t.timestamps.started_at).toISOString() : \"\",\n        t.error ? csvEscape(JSON.stringify(t.error)) : \"\",\n      ]);\n      output = [headers.join(\",\"), ...rows.map((r) => r.join(\",\"))].join(\"\\n\") + \"\\n\";\n    }\n\n    if (options.output) {\n      fs.writeFileSync(options.output, output);\n      console.log(chalk.green(`Written to ${options.output}`));\n    } else {\n      process.stdout.write(output);\n    }\n  } catch (error) {\n    failSpinner({ spinner, error, action: \"export traces\" });\n    process.exit(1);\n  }\n};\n\nfunction csvEscape(value: string): string {\n  if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n    return `\"${value.replace(/\"/g, '\"\"')}\"`;\n  }\n  return value;\n}\n"],"mappings":"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","names":["_a","_b","_c"]}