{"version":3,"sources":["../src/cli/commands/simulation-runs/get.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 { buildAuthHeaders } from \"@/internal/api/auth\";\n\nimport { resolveControlPlaneUrl } from \"@/cli/utils/governance/resolveEndpoint\";\n/**\n * Flattens Anthropic-style content (string OR array of {type:text|tool_use|tool_result|thinking})\n * into a readable single-line string. Thinking blocks are dropped; tool_use shows the tool name;\n * tool_result inlines the result text. Falls back to JSON.stringify for unknown shapes.\n */\nfunction renderContent(raw: unknown): string {\n  if (typeof raw === \"string\") {\n    // Try one round of JSON parse so single Anthropic blocks (`{\"type\":\"thinking\",...}`)\n    // and array-stringified content render as readable text instead of raw JSON.\n    const trimmed = raw.trim();\n    if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n      try {\n        return renderContent(JSON.parse(trimmed));\n      } catch {\n        return raw;\n      }\n    }\n    return raw;\n  }\n  if (Array.isArray(raw)) {\n    return raw.map(renderContent).filter(Boolean).join(\"\\n\");\n  }\n  if (raw && typeof raw === \"object\") {\n    const obj = raw as Record<string, unknown>;\n    switch (obj.type) {\n      case \"thinking\":\n        return \"\"; // drop reasoning blobs\n      case \"text\":\n        return typeof obj.text === \"string\" ? obj.text : \"\";\n      case \"tool_use\": {\n        const name = typeof obj.name === \"string\" ? obj.name : \"?\";\n        return chalk.yellow(`[tool ${name}]`);\n      }\n      case \"tool_result\": {\n        const inner = renderContent(obj.content);\n        return inner ? chalk.gray(`[result] `) + inner : \"\";\n      }\n      default:\n        try { return JSON.stringify(obj); } catch { return \"\"; }\n    }\n  }\n  if (raw === null || raw === undefined) return \"\";\n  if (typeof raw === \"string\") return raw;\n  if (typeof raw === \"number\" || typeof raw === \"boolean\") return String(raw);\n  return \"\";\n}\n\nexport const getSimulationRunCommand = async (\n  runId: string,\n  options?: { format?: string; full?: boolean },\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 run \"${runId}\"...`).start();\n\n  try {\n    const response = await fetch(\n      `${endpoint}/api/simulation-runs/${encodeURIComponent(runId)}`,\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 run: ${message}`);\n      process.exit(1);\n    }\n\n    const run = await response.json() as {\n      scenarioRunId: string;\n      scenarioId: string;\n      batchRunId: string;\n      name: string | null;\n      description: string | null;\n      status: string;\n      results: {\n        verdict?: string | null;\n        reasoning?: string | null;\n        metCriteria?: string[];\n        unmetCriteria?: string[];\n        error?: string | null;\n      } | null;\n      messages: Array<{ role: string; content: string }>;\n      timestamp: number;\n      updatedAt: number;\n      durationInMs: number;\n      totalCost?: number;\n    };\n\n    spinner.succeed(`Found simulation run \"${run.name ?? run.scenarioRunId}\"`);\n\n    if (options?.format === \"json\") {\n      console.log(JSON.stringify(run, null, 2));\n      return;\n    }\n\n    const statusColor = run.status === \"SUCCESS\" ? chalk.green\n      : run.status === \"FAILED\" ? chalk.red\n      : run.status === \"ERROR\" ? chalk.red\n      : chalk.yellow;\n\n    console.log();\n    console.log(chalk.bold(\"  Simulation Run Details:\"));\n    console.log(`    ${chalk.gray(\"Run ID:\")}      ${chalk.green(run.scenarioRunId)}`);\n    console.log(`    ${chalk.gray(\"Scenario ID:\")} ${run.scenarioId}`);\n    console.log(`    ${chalk.gray(\"Batch ID:\")}    ${run.batchRunId}`);\n    console.log(`    ${chalk.gray(\"Name:\")}        ${run.name ?? chalk.gray(\"—\")}`);\n    console.log(`    ${chalk.gray(\"Status:\")}      ${statusColor(run.status)}`);\n    console.log(`    ${chalk.gray(\"Duration:\")}    ${run.durationInMs > 0 ? `${(run.durationInMs / 1000).toFixed(1)}s` : \"—\"}`);\n    if (run.totalCost) {\n      console.log(`    ${chalk.gray(\"Cost:\")}        $${run.totalCost.toFixed(4)}`);\n    }\n    console.log(`    ${chalk.gray(\"Started:\")}     ${new Date(run.timestamp).toLocaleString()}`);\n\n    if (run.results) {\n      console.log();\n      console.log(chalk.bold(\"  Results:\"));\n      if (run.results.verdict) {\n        const verdictColor = run.results.verdict === \"passed\" ? chalk.green : chalk.red;\n        console.log(`    ${chalk.gray(\"Verdict:\")}    ${verdictColor(run.results.verdict)}`);\n      }\n      if (run.results.reasoning) {\n        console.log(`    ${chalk.gray(\"Reasoning:\")}  ${run.results.reasoning}`);\n      }\n      if (run.results.metCriteria && run.results.metCriteria.length > 0) {\n        console.log(`    ${chalk.gray(\"Met:\")}        ${chalk.green(run.results.metCriteria.join(\", \"))}`);\n      }\n      if (run.results.unmetCriteria && run.results.unmetCriteria.length > 0) {\n        console.log(`    ${chalk.gray(\"Unmet:\")}      ${chalk.red(run.results.unmetCriteria.join(\", \"))}`);\n      }\n      if (run.results.error) {\n        console.log(`    ${chalk.gray(\"Error:\")}      ${chalk.red(run.results.error)}`);\n      }\n    }\n\n    if (run.messages && run.messages.length > 0) {\n      console.log();\n      console.log(chalk.bold(\"  Conversation:\"));\n      const truncate = !options?.full;\n      for (const msg of run.messages) {\n        const roleColor = msg.role === \"user\" ? chalk.blue\n          : msg.role === \"assistant\" ? chalk.green\n          : chalk.gray;\n        let content = renderContent(msg.content);\n        if (!content) continue;\n        if (truncate && content.length > 400) {\n          content = content.slice(0, 400) + chalk.gray(\"… (--full to see all)\");\n        }\n        console.log(`    ${roleColor(`[${msg.role}]`)} ${content}`);\n      }\n    }\n\n    console.log();\n  } catch (error) {\n    failSpinner({ spinner, error, action: \"fetch simulation run\" });\n    process.exit(1);\n  }\n};\n"],"mappings":"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","names":[]}