{"version":3,"sources":["../src/cli/commands/simulation-runs/list.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { checkApiKey } from \"../../utils/apiKey\";\nimport { formatFetchError } from \"../../utils/formatFetchError\";\nimport { failSpinner } from \"../../utils/spinnerError\";\nimport { formatRelativeTime } from \"../../utils/formatting\";\nimport { buildAuthHeaders } from \"@/internal/api/auth\";\n\nimport { resolveControlPlaneUrl } from \"@/cli/utils/governance/resolveEndpoint\";\nexport const listSimulationRunsCommand = async (options: {\n  scenarioSetId?: string;\n  batchRunId?: string;\n  limit?: string;\n  format?: string;\n  status?: string;\n  name?: string;\n}): Promise<void> => {\n  checkApiKey();\n\n  const apiKey = process.env.LANGWATCH_API_KEY ?? \"\";\n  const endpoint = resolveControlPlaneUrl();\n\n  const spinner = ora(\"Fetching simulation runs...\").start();\n\n  try {\n    const params = new URLSearchParams();\n    if (options.scenarioSetId) params.set(\"scenarioSetId\", options.scenarioSetId);\n    if (options.batchRunId) params.set(\"batchRunId\", options.batchRunId);\n    if (options.limit) params.set(\"limit\", options.limit);\n\n    const response = await fetch(\n      `${endpoint}/api/simulation-runs?${params.toString()}`,\n      {\n        method: \"GET\",\n        headers: buildAuthHeaders({ apiKey }),\n      },\n    );\n\n    if (!response.ok) {\n      const message = await formatFetchError(response);\n      spinner.fail(`Failed to fetch simulation runs: ${message}`);\n      process.exit(1);\n    }\n\n    const result = await response.json() as {\n      runs: Array<{\n        scenarioRunId: string;\n        scenarioId: string;\n        batchRunId: string;\n        name: string | null;\n        status: string;\n        durationInMs: number;\n        totalCost?: number;\n        timestamp?: number;\n        updatedAt?: number;\n        results?: {\n          verdict?: string | null;\n        } | null;\n      }>;\n      hasMore?: boolean;\n    };\n\n    let runs = result.runs;\n\n    // Client-side filters (status / name substring) so users can drill into\n    // a specific failure without paging through everything.\n    if (options.status) {\n      const wanted = options.status.toUpperCase();\n      runs = runs.filter((r) => r.status.toUpperCase() === wanted);\n    }\n    if (options.name) {\n      const needle = options.name.toLowerCase();\n      runs = runs.filter((r) => (r.name ?? \"\").toLowerCase().includes(needle));\n    }\n\n    spinner.succeed(`Found ${runs.length} simulation run${runs.length !== 1 ? \"s\" : \"\"}${result.hasMore ? \" (more available)\" : \"\"}`);\n\n    if (options.format === \"json\") {\n      console.log(JSON.stringify({ ...result, runs }, null, 2));\n      return;\n    }\n\n    if (runs.length === 0) {\n      console.log();\n      console.log(chalk.gray(\"No simulation runs found.\"));\n      console.log(chalk.gray(\"Run a suite to create simulation runs:\"));\n      console.log(chalk.cyan(\"  langwatch suite run <suiteId>\"));\n      return;\n    }\n\n    console.log();\n    for (const run of runs) {\n      const statusColor = run.status === \"SUCCESS\" ? chalk.green\n        : run.status === \"FAILED\" ? chalk.red\n        : run.status === \"ERROR\" ? chalk.red\n        : run.status === \"IN_PROGRESS\" || run.status === \"RUNNING\" ? chalk.yellow\n        : chalk.gray;\n\n      const verdict = run.results?.verdict;\n      const verdictStr = verdict ? ` (${verdict})` : \"\";\n      const duration = run.durationInMs > 0 ? `${(run.durationInMs / 1000).toFixed(1)}s` : \"—\";\n      const cost = run.totalCost ? `$${run.totalCost.toFixed(4)}` : \"\";\n      const when = run.timestamp ? formatRelativeTime(new Date(run.timestamp).toISOString()) : \"—\";\n\n      console.log(`  ${statusColor(\"●\")} ${chalk.cyan(run.name ?? run.scenarioId)} ${statusColor(run.status)}${verdictStr} ${chalk.gray(`· ${when}`)}`);\n      console.log(`    ${chalk.gray(\"Run ID:\")} ${run.scenarioRunId}  ${chalk.gray(\"Duration:\")} ${duration}  ${cost ? chalk.gray(\"Cost:\") + \" \" + cost : \"\"}`);\n      console.log();\n    }\n\n    if (result.hasMore) {\n      console.log(chalk.gray(\"  More runs available. Use --limit to fetch more.\"));\n    }\n\n    console.log(\n      chalk.gray(`Use ${chalk.cyan(\"langwatch simulation-run get <runId>\")} to view full details`),\n    );\n  } catch (error) {\n    failSpinner({ spinner, error, action: \"fetch simulation runs\" });\n    process.exit(1);\n  }\n};\n"],"mappings":"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","names":["_a"]}