{"version":3,"sources":["../src/cli/commands/suites/run.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport ora from \"ora\";\nimport { SuitesApiService } from \"@/client-sdk/services/suites\";\nimport { checkApiKey } from \"../../utils/apiKey\";\nimport { failSpinner } from \"../../utils/spinnerError\";\nimport { buildAuthHeaders } from \"@/internal/api/auth\";\n\nimport { resolveControlPlaneUrl } from \"@/cli/utils/governance/resolveEndpoint\";\nexport const runSuiteCommand = async (\n  id: string,\n  options: { wait?: boolean; format?: string },\n): Promise<void> => {\n  checkApiKey();\n\n  const service = new SuitesApiService();\n  const spinner = ora(`Scheduling suite run \"${id}\"...`).start();\n\n  try {\n    const result = await service.run(id);\n\n    spinner.succeed(\n      `Suite run scheduled: ${result.jobCount} job${result.jobCount !== 1 ? \"s\" : \"\"} (batch: ${result.batchRunId})`,\n    );\n\n    if (result.skippedArchived.scenarios.length > 0 || result.skippedArchived.targets.length > 0) {\n      console.log();\n      console.log(chalk.yellow(\"  Skipped archived references:\"));\n      if (result.skippedArchived.scenarios.length > 0) {\n        console.log(chalk.yellow(`    Scenarios: ${result.skippedArchived.scenarios.join(\", \")}`));\n      }\n      if (result.skippedArchived.targets.length > 0) {\n        console.log(chalk.yellow(`    Targets: ${result.skippedArchived.targets.join(\", \")}`));\n      }\n    }\n\n    if (options.format === \"json\") {\n      console.log(JSON.stringify(result, null, 2));\n      return;\n    }\n\n    if (!options.wait) {\n      console.log();\n      console.log(`  ${chalk.gray(\"Batch Run ID:\")} ${chalk.green(result.batchRunId)}`);\n      console.log(`  ${chalk.gray(\"Jobs:\")}         ${result.jobCount}`);\n      console.log();\n      console.log(\n        chalk.gray(\n          `View results in the LangWatch dashboard under Simulations.`,\n        ),\n      );\n      console.log(\n        chalk.gray(\n          `Or re-run with ${chalk.cyan(\"--wait\")} to poll for completion.`,\n        ),\n      );\n      return;\n    }\n\n    // Poll for completion\n    console.log();\n    const pollSpinner = ora(\"Waiting for suite run to complete...\").start();\n\n    const apiKey = process.env.LANGWATCH_API_KEY ?? \"\";\n    const endpoint = resolveControlPlaneUrl();\n\n    let completed = false;\n    let lastStatus = \"\";\n    const startTime = Date.now();\n    const TIMEOUT_MS = 10 * 60 * 1000; // 10 minutes\n\n    while (!completed) {\n      if (Date.now() - startTime > TIMEOUT_MS) {\n        pollSpinner.fail(\"Suite run timed out after 10 minutes\");\n        console.log(\n          chalk.yellow(\n            `Check results in the dashboard. Batch ID: ${result.batchRunId}`,\n          ),\n        );\n        process.exit(1);\n      }\n\n      await new Promise((resolve) => setTimeout(resolve, 3000));\n\n      try {\n        // Poll the scenario events endpoint for batch status\n        const statusResponse = await fetch(\n          `${endpoint}/api/scenario-events?batchRunId=${encodeURIComponent(result.batchRunId)}`,\n          {\n            method: \"GET\",\n            headers: buildAuthHeaders({ apiKey }),\n          },\n        );\n\n        if (statusResponse.ok) {\n          const statusData = await statusResponse.json() as {\n            totalCount?: number;\n            completedCount?: number;\n            passedCount?: number;\n            failedCount?: number;\n            status?: string;\n          };\n\n          const total = statusData.totalCount ?? result.jobCount;\n          const completedCount = statusData.completedCount ?? 0;\n          const passed = statusData.passedCount ?? 0;\n          const failed = statusData.failedCount ?? 0;\n\n          const newStatus = `${completedCount}/${total} completed (${passed} passed, ${failed} failed)`;\n          if (newStatus !== lastStatus) {\n            pollSpinner.text = `Running... ${newStatus}`;\n            lastStatus = newStatus;\n          }\n\n          if (completedCount >= total && total > 0) {\n            completed = true;\n            if (failed > 0) {\n              pollSpinner.warn(\n                `Suite run completed: ${passed}/${total} passed, ${chalk.red(`${failed} failed`)}`,\n              );\n            } else {\n              pollSpinner.succeed(\n                `Suite run completed: ${chalk.green(`${passed}/${total} passed`)}`,\n              );\n            }\n          }\n        }\n      } catch {\n        // Polling error — continue waiting\n      }\n    }\n\n    console.log();\n    console.log(`  ${chalk.gray(\"Batch Run ID:\")} ${chalk.green(result.batchRunId)}`);\n    console.log();\n  } catch (error) {\n    failSpinner({ spinner, error, action: \"run suite\" });\n    process.exit(1);\n  }\n};\n"],"mappings":"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","names":[]}