@chanl/cli 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/cli-p0-scenarios.test.d.ts +2 -0
- package/dist/__tests__/cli-p0-scenarios.test.js +123 -0
- package/dist/__tests__/cli-p0-scenarios.test.js.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.js +98 -0
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/customers.d.ts +8 -0
- package/dist/commands/customers.js +289 -0
- package/dist/commands/customers.js.map +1 -0
- package/dist/commands/index.d.ts +3 -0
- package/dist/commands/index.js +7 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/messaging.d.ts +12 -0
- package/dist/commands/messaging.js +208 -0
- package/dist/commands/messaging.js.map +1 -0
- package/dist/commands/scenarios.js +121 -0
- package/dist/commands/scenarios.js.map +1 -1
- package/dist/commands/whatsapp.d.ts +8 -0
- package/dist/commands/whatsapp.js +332 -0
- package/dist/commands/whatsapp.js.map +1 -0
- package/package.json +1 -1
|
@@ -105,6 +105,10 @@ Exit Codes:
|
|
|
105
105
|
0 All scenarios passed (score >= min-score)
|
|
106
106
|
1 One or more scenarios failed`
|
|
107
107
|
).action(handleScenariosRunAll);
|
|
108
|
+
scenarios.command("cancel <executionId>").description("Cancel a running or queued execution").action(handleScenariosCancel);
|
|
109
|
+
scenarios.command("retry <executionId>").description("Retry a failed or cancelled execution").action(handleScenariosRetry);
|
|
110
|
+
scenarios.command("cross-product <scenarioId>").description("Run all agent \xD7 persona combinations for a scenario").option("-a, --agent <agentId>", "Filter to one agent").option("--persona <personaId>", "Filter to one persona").option("-m, --mode <mode>", "Simulation mode: text, phone", "text").option("-p, --phone <number>", "Phone number for phone mode").action(handleScenariosCrossProduct);
|
|
111
|
+
scenarios.command("batch").description("Execute multiple scenarios in one batch").requiredOption("-a, --agent <agentId>", "Agent ID").requiredOption("-s, --scenarios <ids>", "Comma-separated scenario IDs").option("-m, --mode <mode>", "Simulation mode: text, phone", "text").option("-p, --phone <number>", "Phone number for phone mode").action(handleScenariosBatch);
|
|
108
112
|
return scenarios;
|
|
109
113
|
}
|
|
110
114
|
async function handleScenariosList(options) {
|
|
@@ -585,6 +589,123 @@ async function handleScenariosRunAll(options) {
|
|
|
585
589
|
process.exitCode = 1;
|
|
586
590
|
}
|
|
587
591
|
}
|
|
592
|
+
async function handleScenariosCancel(executionId) {
|
|
593
|
+
const sdk = createSdk();
|
|
594
|
+
if (!sdk) return;
|
|
595
|
+
const spinner = ora(`Cancelling execution ${executionId}...`).start();
|
|
596
|
+
try {
|
|
597
|
+
const response = await sdk.scenarios.cancelExecution(executionId);
|
|
598
|
+
spinner.stop();
|
|
599
|
+
if (!response.success) {
|
|
600
|
+
printError("Cancel failed", response.message);
|
|
601
|
+
process.exitCode = 1;
|
|
602
|
+
return;
|
|
603
|
+
}
|
|
604
|
+
if (isJsonOutput()) {
|
|
605
|
+
printJson({ executionId, status: "cancelled" });
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
printInfo(`Cancelled execution ${executionId}`);
|
|
609
|
+
} catch (error) {
|
|
610
|
+
spinner.fail("Cancel failed");
|
|
611
|
+
printError("Error", error instanceof Error ? error.message : "Unknown error");
|
|
612
|
+
process.exitCode = 1;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
async function handleScenariosRetry(executionId) {
|
|
616
|
+
const sdk = createSdk();
|
|
617
|
+
if (!sdk) return;
|
|
618
|
+
const spinner = ora(`Retrying execution ${executionId}...`).start();
|
|
619
|
+
try {
|
|
620
|
+
const response = await sdk.scenarios.retryExecution(executionId);
|
|
621
|
+
spinner.stop();
|
|
622
|
+
if (!response.success || !response.data) {
|
|
623
|
+
printError("Retry failed", response.message);
|
|
624
|
+
process.exitCode = 1;
|
|
625
|
+
return;
|
|
626
|
+
}
|
|
627
|
+
const execution = response.data;
|
|
628
|
+
const newId = execution.executionId || execution.id;
|
|
629
|
+
if (isJsonOutput()) {
|
|
630
|
+
printJson(execution);
|
|
631
|
+
return;
|
|
632
|
+
}
|
|
633
|
+
printInfo(`Retry started: ${newId}`);
|
|
634
|
+
printLabel("Status", execution.status);
|
|
635
|
+
} catch (error) {
|
|
636
|
+
spinner.fail("Retry failed");
|
|
637
|
+
printError("Error", error instanceof Error ? error.message : "Unknown error");
|
|
638
|
+
process.exitCode = 1;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
async function handleScenariosCrossProduct(scenarioId, options) {
|
|
642
|
+
const sdk = createSdk();
|
|
643
|
+
if (!sdk) return;
|
|
644
|
+
const spinner = ora("Starting cross-product executions...").start();
|
|
645
|
+
try {
|
|
646
|
+
const result = await sdk.scenarios.runCrossProduct(scenarioId, {
|
|
647
|
+
agentId: options.agent,
|
|
648
|
+
personaId: options.persona,
|
|
649
|
+
mode: options.mode,
|
|
650
|
+
phoneNumber: options.phone
|
|
651
|
+
});
|
|
652
|
+
spinner.stop();
|
|
653
|
+
if (isJsonOutput()) {
|
|
654
|
+
printJson(result);
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
printBlank();
|
|
658
|
+
console.log(chalk.bold(`Cross-product: ${result.scenarioName}`));
|
|
659
|
+
console.log(` Combos started: ${result.totalCombos}`);
|
|
660
|
+
for (const exec of result.executions) {
|
|
661
|
+
console.log(` ${exec.executionId} agent=${exec.agentId || "-"} persona=${exec.personaId}`);
|
|
662
|
+
}
|
|
663
|
+
printBlank();
|
|
664
|
+
} catch (error) {
|
|
665
|
+
spinner.fail("Cross-product run failed");
|
|
666
|
+
printError("Error", error instanceof Error ? error.message : "Unknown error");
|
|
667
|
+
process.exitCode = 1;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
async function handleScenariosBatch(options) {
|
|
671
|
+
const sdk = createSdk();
|
|
672
|
+
if (!sdk) return;
|
|
673
|
+
const scenarioIds = options.scenarios.split(",").map((s) => s.trim()).filter(Boolean);
|
|
674
|
+
if (scenarioIds.length === 0) {
|
|
675
|
+
printError("No scenario IDs provided", "Use --scenarios id1,id2");
|
|
676
|
+
process.exitCode = 1;
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
const spinner = ora(`Starting batch (${scenarioIds.length} scenarios)...`).start();
|
|
680
|
+
try {
|
|
681
|
+
const response = await sdk.scenarios.executeBatch({
|
|
682
|
+
agentId: options.agent,
|
|
683
|
+
scenarioIds,
|
|
684
|
+
mode: options.mode,
|
|
685
|
+
phoneNumber: options.phone
|
|
686
|
+
});
|
|
687
|
+
spinner.stop();
|
|
688
|
+
if (!response.success || !response.data) {
|
|
689
|
+
printError("Batch failed", response.message);
|
|
690
|
+
process.exitCode = 1;
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
const batch = response.data;
|
|
694
|
+
if (isJsonOutput()) {
|
|
695
|
+
printJson(batch);
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
printBlank();
|
|
699
|
+
console.log(chalk.bold(`Batch ${batch.batchId}`));
|
|
700
|
+
console.log(` Status: ${batch.status}`);
|
|
701
|
+
console.log(` Progress: ${batch.progress.completed}/${batch.progress.total}`);
|
|
702
|
+
printBlank();
|
|
703
|
+
} catch (error) {
|
|
704
|
+
spinner.fail("Batch failed");
|
|
705
|
+
printError("Error", error instanceof Error ? error.message : "Unknown error");
|
|
706
|
+
process.exitCode = 1;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
588
709
|
export {
|
|
589
710
|
createScenariosCommand
|
|
590
711
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/scenarios.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport type { ChanlSDK, ScenarioExecution, ToolCall, BatchResult } from '@chanl/sdk';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printError,\n printInfo,\n printBlank,\n printSimpleTable,\n printLabel,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\nimport {\n formatElapsed,\n printSegment,\n displayScorecard,\n} from '../utils/interactive.js';\n\n/**\n * Create the scenarios command group\n */\nexport function createScenariosCommand(): Command {\n const scenarios = new Command('scenarios')\n .description('Manage and run test scenarios')\n .addHelpText(\n 'after',\n `\nWhat are Scenarios?\n Scenarios are test cases that run against your AI agents. Each scenario\n defines a conversation flow, expected responses, and scoring criteria.\n\nQuick Start:\n $ chanl scenarios list # See all scenarios\n $ chanl scenarios run <id> # Execute a scenario\n $ chanl scenarios run <id> --watch # Execute and watch progress\n $ chanl scenarios history <id> # View past runs\n\nExecution Workflow:\n 1. List scenarios to find the one you want to test\n 2. Run the scenario (optionally with --watch)\n 3. Check execution status with 'executions' or 'execution <id>'\n 4. Review history with 'history <scenarioId>'`\n );\n\n // scenarios list\n scenarios\n .command('list')\n .description('List all scenarios')\n .option('-s, --status <status>', 'Filter by status (draft, active, paused, completed, archived)')\n .option('-c, --category <category>', 'Filter by category')\n .option('-l, --limit <number>', 'Number of items per page', '20')\n .option('-p, --page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios list # List all scenarios\n $ chanl scenarios list --status active # Only active scenarios\n $ chanl scenarios list --category sales # Filter by category\n $ chanl scenarios list --json # Output as JSON`\n )\n .action(handleScenariosList);\n\n // scenarios get <id>\n scenarios\n .command('get <id>')\n .description('Get a scenario by ID')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios get abc123 # Get scenario details\n $ chanl scenarios get abc123 --json # Output as JSON`\n )\n .action(handleScenariosGet);\n\n // scenarios run <id>\n scenarios\n .command('run <id>')\n .description('Execute a scenario')\n .option('-a, --agent <agentId>', 'Specific agent to run against')\n .option('-m, --mode <mode>', 'Simulation mode: text, websocket, phone', 'websocket')\n .option('-p, --phone <number>', 'Phone number for phone mode (E.164 format)')\n .option('-w, --watch', 'Watch execution progress until completion')\n .option('--dry-run', 'Validate without actually executing')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios run abc123 # Run with defaults\n $ chanl scenarios run abc123 --watch # Run and watch progress\n $ chanl scenarios run abc123 --agent agent_xyz # Run against specific agent\n $ chanl scenarios run abc123 --mode phone --phone +14155551234\n $ chanl scenarios run abc123 --dry-run # Validate only\n\nSimulation Modes:\n text Free, instant text-based testing\n websocket Real WebSocket testing (requires provider API key)\n phone Real phone call (requires provider + phone number)`\n )\n .action(handleScenariosRun);\n\n // scenarios executions\n scenarios\n .command('executions')\n .description('List scenario executions')\n .option('-s, --scenario <scenarioId>', 'Filter by scenario ID')\n .option('--status <status>', 'Filter by status (queued, running, completed, failed, timeout, cancelled)')\n .option('-l, --limit <number>', 'Number of items', '10')\n .option('-p, --page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios executions # List recent executions\n $ chanl scenarios executions --scenario abc123 # For specific scenario\n $ chanl scenarios executions --status completed # Only completed\n $ chanl scenarios executions --json # Output as JSON`\n )\n .action(handleScenariosExecutions);\n\n // scenarios execution <executionId>\n scenarios\n .command('execution <executionId>')\n .description('Get execution details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios execution exec_abc123 # Get execution details\n $ chanl scenarios execution exec_abc123 --json`\n )\n .action(handleScenariosExecution);\n\n // scenarios history <scenarioId>\n scenarios\n .command('history <scenarioId>')\n .description('Get simulation history for a scenario')\n .option('-l, --limit <number>', 'Number of simulations to show', '10')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios history abc123 # Last 10 runs\n $ chanl scenarios history abc123 --limit 5 # Last 5 runs\n $ chanl scenarios history abc123 --json # Output as JSON`\n )\n .action(handleScenariosHistory);\n\n // scenarios run-all\n scenarios\n .command('run-all')\n .description('Run all scenarios for an agent and show aggregate results')\n .requiredOption('-a, --agent <agentId>', 'Agent ID to run scenarios against')\n .option('--min-score <score>', 'Minimum passing score (0-100)', '0')\n .option('--parallel <count>', 'Max concurrent executions', '3')\n .option('-m, --mode <mode>', 'Simulation mode: text, phone', 'text')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios run-all --agent agent_abc # Run all with defaults\n $ chanl scenarios run-all --agent agent_abc --min-score 80 # Fail if any score < 80\n $ chanl scenarios run-all --agent agent_abc --parallel 5 # Run 5 at a time\n $ chanl scenarios run-all --agent agent_abc --json # Output as JSON\n\nExit Codes:\n 0 All scenarios passed (score >= min-score)\n 1 One or more scenarios failed`\n )\n .action(handleScenariosRunAll);\n\n return scenarios;\n}\n\n/**\n * Handle scenarios list command\n */\nasync function handleScenariosList(options: {\n status?: string;\n category?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching scenarios...').start();\n\n try {\n const response = await sdk.scenarios.list({\n status: options.status,\n category: options.category,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch scenarios', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { scenarios, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (scenarios.length === 0) {\n printInfo('No scenarios found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Name', 'Status', 'Category', 'Difficulty', 'Created'],\n scenarios.map((s) => [\n s.name,\n formatStatus(s.status),\n s.category || '-',\n s.difficulty || '-',\n formatDate(s.createdAt),\n ])\n );\n\n printBlank();\n printInfo(`Total: ${pagination.total} scenarios (Page ${pagination.page} of ${pagination.totalPages})`);\n } catch (error) {\n spinner.fail('Failed to fetch scenarios');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios get command\n */\nasync function handleScenariosGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching scenario...').start();\n\n try {\n const response = await sdk.scenarios.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch scenario', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const scenario = response.data;\n printBlank();\n console.log(chalk.bold('Scenario Details:'));\n console.log(` Name: ${scenario.name}`);\n console.log(` ID: ${scenario.id}`);\n console.log(` Status: ${formatStatus(scenario.status)}`);\n console.log(` Category: ${scenario.category || '-'}`);\n console.log(` Difficulty: ${scenario.difficulty || '-'}`);\n console.log(` Created: ${formatDate(scenario.createdAt)}`);\n if (scenario.description) {\n console.log(` Description: ${scenario.description}`);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch scenario');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Format status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'paused':\n return chalk.yellow('paused');\n case 'completed':\n return chalk.blue('completed');\n case 'archived':\n return chalk.gray('archived');\n case 'draft':\n default:\n return chalk.gray(status || 'draft');\n }\n}\n\n/**\n * Format execution status with color\n */\nfunction formatExecutionStatus(status?: string): string {\n switch (status) {\n case 'completed':\n return chalk.green('completed');\n case 'running':\n return chalk.cyan('running');\n case 'queued':\n return chalk.blue('queued');\n case 'failed':\n return chalk.red('failed');\n case 'timeout':\n return chalk.yellow('timeout');\n case 'cancelled':\n return chalk.gray('cancelled');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Format score with color\n */\nfunction formatScore(score?: number): string {\n if (score === undefined || score === null) return '-';\n if (score >= 80) return chalk.green(`${score}%`);\n if (score >= 60) return chalk.yellow(`${score}%`);\n return chalk.red(`${score}%`);\n}\n\n/**\n * Format duration in seconds\n */\nfunction formatDuration(seconds?: number): string {\n if (!seconds) return '-';\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}m ${secs.toFixed(0)}s`;\n}\n\n/**\n * Handle scenarios run command\n */\nasync function handleScenariosRun(\n id: string,\n options: {\n agent?: string;\n mode?: string;\n phone?: string;\n watch?: boolean;\n dryRun?: boolean;\n }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Starting scenario execution...').start();\n\n try {\n const response = await sdk.scenarios.run(id, {\n agentId: options.agent,\n simulationMode: options.mode as 'text' | 'websocket' | 'phone',\n phoneNumber: options.phone,\n dryRun: options.dryRun,\n });\n\n if (!response.success || !response.data) {\n spinner.fail('Failed to start execution');\n printError('Error', response.message || 'Unknown error');\n process.exitCode = 1;\n return;\n }\n\n const { execution, executionId } = response.data;\n const execId = executionId || execution?.id || execution?.executionId;\n\n if (options.dryRun) {\n spinner.succeed('Dry run validation passed');\n printInfo('Scenario is valid and ready to execute');\n return;\n }\n\n spinner.succeed(`Execution started: ${execId}`);\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (!options.watch) {\n printBlank();\n printLabel('Execution ID', execId || 'N/A');\n printLabel('Status', formatExecutionStatus(execution?.status));\n printInfo(`Run 'chanl scenarios execution ${execId}' to check status`);\n printBlank();\n return;\n }\n\n // Watch mode - poll until complete\n await watchExecution(sdk, execId!, options.mode === 'phone');\n } catch (error) {\n spinner.fail('Failed to execute scenario');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Watch execution until completion\n * Uses SDK LiveExecution for event-driven monitoring\n */\nasync function watchExecution(\n sdk: ChanlSDK,\n executionId: string,\n isPhoneMode = false,\n): Promise<void> {\n const startTime = new Date();\n let spinner = ora(\n isPhoneMode\n ? `${chalk.red('LIVE')} — ${formatElapsed(startTime)} | Watching voice execution...`\n : 'Watching execution...'\n ).start();\n\n const live = sdk.scenarios.watchExecution(executionId);\n let finalExecution: ScenarioExecution | undefined;\n let scorecardReceived = false;\n\n live.on('status', (status) => {\n if (isPhoneMode) {\n spinner.text = `${chalk.red('LIVE')} — ${formatElapsed(startTime)} | Status: ${status}`;\n } else {\n spinner.text = `Status: ${status}`;\n }\n });\n\n live.on('step', (step) => {\n if (!isPhoneMode) {\n spinner.stop();\n const stepStatus = step.status === 'completed' ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${stepStatus} Step ${step.stepId}: ${step.response?.slice(0, 80) || '-'}`);\n if (step.toolCalls.length > 0) {\n for (const tc of step.toolCalls) {\n const tcIcon = tc.status === 'success' ? chalk.green('✓') : chalk.red('✗');\n const dur = tc.durationMs ? chalk.dim(` (${tc.durationMs}ms)`) : '';\n console.log(` ${tcIcon} ${chalk.yellow(tc.name)}${dur}`);\n }\n }\n spinner.start();\n }\n });\n\n live.on('transcript', (seg) => {\n spinner.stop();\n printSegment(seg);\n spinner.start();\n });\n\n live.on('completed', (execution) => {\n finalExecution = execution;\n const status = execution.status;\n\n if (status === 'completed') {\n spinner.succeed(\n isPhoneMode\n ? `Execution complete — ${formatElapsed(startTime)}`\n : 'Execution completed'\n );\n } else if (status === 'failed') {\n spinner.fail(\n isPhoneMode\n ? `Execution failed — ${formatElapsed(startTime)}`\n : 'Execution failed'\n );\n } else {\n spinner.warn(`Execution ${status}`);\n }\n\n printBlank();\n printExecutionDetails(execution);\n\n // Start scorecard spinner for phone mode\n if (isPhoneMode && execution.callDetails?.callId) {\n spinner = ora('Checking for scorecard...').start();\n }\n });\n\n live.on('scorecard', (results) => {\n scorecardReceived = true;\n spinner.stop();\n displayScorecard(results);\n printBlank();\n });\n\n live.on('timeout', () => {\n spinner.warn('Timeout waiting for execution to complete');\n printInfo(`Run 'chanl scenarios execution ${executionId}' to check status`);\n });\n\n live.on('error', (err) => {\n spinner.fail('Error while watching');\n printError('Error', err.message);\n process.exitCode = 1;\n });\n\n await live.completed;\n\n // Post-completion: if phone mode and no scorecard arrived, clean up spinner\n if (finalExecution && isPhoneMode && finalExecution.callDetails?.callId && !scorecardReceived) {\n spinner.stop();\n }\n}\n\n/**\n * Print execution details\n */\nfunction printExecutionDetails(execution: ScenarioExecution): void {\n console.log(chalk.bold('Execution Results:'));\n console.log(` Execution ID: ${execution.id || execution.executionId}`);\n console.log(` Scenario ID: ${execution.scenarioId}`);\n console.log(` Status: ${formatExecutionStatus(execution.status)}`);\n console.log(` Score: ${formatScore(execution.overallScore)}`);\n console.log(` Duration: ${formatDuration(execution.duration)}`);\n\n if (execution.metrics) {\n console.log(chalk.bold('\\n Metrics:'));\n if (execution.metrics.responseTime !== undefined) {\n console.log(` Response Time: ${execution.metrics.responseTime.toFixed(0)}ms`);\n }\n if (execution.metrics.accuracy !== undefined) {\n console.log(` Accuracy: ${formatScore(execution.metrics.accuracy)}`);\n }\n if (execution.metrics.completion !== undefined) {\n console.log(` Completion: ${formatScore(execution.metrics.completion)}`);\n }\n }\n\n if (execution.callDetails?.callId) {\n console.log(chalk.bold('\\n Call Details:'));\n console.log(` Call ID: ${execution.callDetails.callId}`);\n if (execution.callDetails.phoneNumber) {\n console.log(` Phone: ${execution.callDetails.phoneNumber}`);\n }\n }\n\n // Show tool calls from step results\n const allToolCalls = (execution.stepResults ?? []).flatMap((s) => s.toolCalls ?? []);\n if (allToolCalls.length > 0) {\n console.log(chalk.bold('\\n Tool Calls:'));\n printScenarioToolCalls(allToolCalls);\n }\n\n if (execution.errorMessages && execution.errorMessages.length > 0) {\n console.log(chalk.bold('\\n Errors:'));\n execution.errorMessages.forEach((msg) => {\n console.log(chalk.red(` - ${msg}`));\n });\n }\n\n printBlank();\n}\n\n/**\n * Print tool calls from scenario execution\n */\nfunction printScenarioToolCalls(toolCalls: ToolCall[]): void {\n for (const tc of toolCalls) {\n const statusIcon =\n tc.status === 'success'\n ? chalk.green('✓')\n : tc.status === 'error'\n ? chalk.red('✗')\n : tc.status === 'timeout'\n ? chalk.yellow('⏱')\n : chalk.dim('…');\n const duration = tc.durationMs ? chalk.dim(` (${tc.durationMs}ms)`) : '';\n const params = Object.keys(tc.parameters).length\n ? chalk.dim(` ${JSON.stringify(tc.parameters)}`)\n : '';\n\n console.log(` ${statusIcon} ${chalk.yellow(tc.name)}${params}${duration}`);\n\n if (tc.status === 'error' && tc.error) {\n console.log(` ${chalk.red(tc.error.message)}`);\n }\n }\n}\n\n/**\n * Handle scenarios executions command\n */\nasync function handleScenariosExecutions(options: {\n scenario?: string;\n status?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching executions...').start();\n\n try {\n const response = await sdk.scenarios.getExecutions({\n scenarioId: options.scenario,\n status: options.status,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch executions', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { executions, total } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (executions.length === 0) {\n printInfo('No executions found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Execution ID', 'Scenario', 'Status', 'Score', 'Duration', 'Started'],\n executions.map((e) => [\n (e.id || e.executionId || '').slice(-12),\n e.scenarioId?.slice(-8) || '-',\n formatExecutionStatus(e.status),\n formatScore(e.overallScore),\n formatDuration(e.duration),\n e.startTime ? formatDate(e.startTime) : '-',\n ])\n );\n\n printBlank();\n printInfo(`Total: ${total} executions`);\n } catch (error) {\n spinner.fail('Failed to fetch executions');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios execution command\n */\nasync function handleScenariosExecution(executionId: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching execution...').start();\n\n try {\n const response = await sdk.scenarios.getExecution(executionId);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch execution', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const execution = response.data;\n printBlank();\n printExecutionDetails(execution);\n } catch (error) {\n spinner.fail('Failed to fetch execution');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios history command\n */\nasync function handleScenariosHistory(\n scenarioId: string,\n options: { limit: string }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching simulation history...').start();\n\n try {\n const response = await sdk.scenarios.getSimulations(\n scenarioId,\n parseInt(options.limit, 10)\n );\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch history', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { simulations } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (simulations.length === 0) {\n printInfo('No simulation history found for this scenario');\n return;\n }\n\n printBlank();\n console.log(chalk.bold(`Simulation History for ${scenarioId}`));\n console.log(chalk.dim('─'.repeat(60)));\n\n printSimpleTable(\n ['#', 'Status', 'Score', 'Duration', 'Started'],\n simulations.map((s, i) => [\n (i + 1).toString(),\n formatExecutionStatus(s.status),\n formatScore(s.overallScore),\n formatDuration(s.duration),\n s.startTime ? formatDate(s.startTime) : '-',\n ])\n );\n\n printBlank();\n printInfo(`Showing last ${simulations.length} simulations`);\n } catch (error) {\n spinner.fail('Failed to fetch history');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios run-all command\n */\nasync function handleScenariosRunAll(options: {\n agent: string;\n minScore: string;\n parallel: string;\n mode?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const minScore = parseInt(options.minScore, 10);\n const parallel = parseInt(options.parallel, 10);\n\n const spinner = ora(`Running all scenarios for agent ${options.agent}...`).start();\n\n try {\n const result: BatchResult = await sdk.scenarios.runAll({\n agentId: options.agent,\n minScore,\n parallel,\n mode: options.mode as 'text' | 'phone' | undefined,\n });\n\n spinner.stop();\n\n if (isJsonOutput()) {\n printJson(result);\n if (!result.allPassed) {\n process.exitCode = 1;\n }\n return;\n }\n\n if (result.totalScenarios === 0) {\n printInfo('No active scenarios found for this agent');\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Batch Scenario Results'));\n console.log(chalk.dim('─'.repeat(60)));\n\n // Per-scenario results\n printSimpleTable(\n ['Scenario', 'Status', 'Score', 'Duration', 'Tools', 'Result'],\n result.results.map((r) => [\n r.scenarioName,\n formatExecutionStatus(r.status),\n formatScore(r.score),\n formatDuration(r.duration),\n r.toolCallCount.toString(),\n r.passed ? chalk.green('PASS') : chalk.red('FAIL'),\n ])\n );\n\n // Summary\n printBlank();\n console.log(chalk.bold('Summary'));\n console.log(` Total: ${result.totalScenarios}`);\n console.log(` Passed: ${chalk.green(result.passed.toString())}`);\n console.log(` Failed: ${result.failed > 0 ? chalk.red(result.failed.toString()) : '0'}`);\n console.log(` Average Score: ${formatScore(result.averageScore)}`);\n console.log(` Min Score: ${result.minScore}`);\n\n printBlank();\n if (result.allPassed) {\n console.log(chalk.green(`All ${result.totalScenarios} scenarios passed`));\n } else {\n console.log(chalk.red(`${result.failed} of ${result.totalScenarios} scenarios failed`));\n process.exitCode = 1;\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to run scenarios');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n"],"mappings":"AAAA,SAAS,eAAe;AACxB,OAAO,SAAS;AAChB,OAAO,WAAW;AAElB,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKA,SAAS,yBAAkC;AAChD,QAAM,YAAY,IAAI,QAAQ,WAAW,EACtC,YAAY,+BAA+B,EAC3C;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBF;AAGF,YACG,QAAQ,MAAM,EACd,YAAY,oBAAoB,EAChC,OAAO,yBAAyB,+DAA+D,EAC/F,OAAO,6BAA6B,oBAAoB,EACxD,OAAO,wBAAwB,4BAA4B,IAAI,EAC/D,OAAO,uBAAuB,eAAe,GAAG,EAChD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,OAAO,mBAAmB;AAG7B,YACG,QAAQ,UAAU,EAClB,YAAY,sBAAsB,EAClC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,kBAAkB;AAG5B,YACG,QAAQ,UAAU,EAClB,YAAY,oBAAoB,EAChC,OAAO,yBAAyB,+BAA+B,EAC/D,OAAO,qBAAqB,2CAA2C,WAAW,EAClF,OAAO,wBAAwB,4CAA4C,EAC3E,OAAO,eAAe,2CAA2C,EACjE,OAAO,aAAa,qCAAqC,EACzD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYF,EACC,OAAO,kBAAkB;AAG5B,YACG,QAAQ,YAAY,EACpB,YAAY,0BAA0B,EACtC,OAAO,+BAA+B,uBAAuB,EAC7D,OAAO,qBAAqB,2EAA2E,EACvG,OAAO,wBAAwB,mBAAmB,IAAI,EACtD,OAAO,uBAAuB,eAAe,GAAG,EAChD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,OAAO,yBAAyB;AAGnC,YACG,QAAQ,yBAAyB,EACjC,YAAY,uBAAuB,EACnC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,wBAAwB;AAGlC,YACG,QAAQ,sBAAsB,EAC9B,YAAY,uCAAuC,EACnD,OAAO,wBAAwB,iCAAiC,IAAI,EACpE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,sBAAsB;AAGhC,YACG,QAAQ,SAAS,EACjB,YAAY,2DAA2D,EACvE,eAAe,yBAAyB,mCAAmC,EAC3E,OAAO,uBAAuB,iCAAiC,GAAG,EAClE,OAAO,sBAAsB,6BAA6B,GAAG,EAC7D,OAAO,qBAAqB,gCAAgC,MAAM,EAClE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,EACC,OAAO,qBAAqB;AAE/B,SAAO;AACT;AAKA,eAAe,oBAAoB,SAKjB;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,uBAAuB,EAAE,MAAM;AAEnD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,UAAU,KAAK;AAAA,MACxC,QAAQ,QAAQ;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,MACjC,MAAM,SAAS,QAAQ,MAAM,EAAE;AAAA,IACjC,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,6BAA6B,SAAS,OAAO;AACxD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,WAAW,WAAW,IAAI,SAAS;AAE3C,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,gBAAU,oBAAoB;AAC9B;AAAA,IACF;AAEA,eAAW;AACX;AAAA,MACE,CAAC,QAAQ,UAAU,YAAY,cAAc,SAAS;AAAA,MACtD,UAAU,IAAI,CAAC,MAAM;AAAA,QACnB,EAAE;AAAA,QACF,aAAa,EAAE,MAAM;AAAA,QACrB,EAAE,YAAY;AAAA,QACd,EAAE,cAAc;AAAA,QAChB,WAAW,EAAE,SAAS;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,eAAW;AACX,cAAU,UAAU,WAAW,KAAK,oBAAoB,WAAW,IAAI,OAAO,WAAW,UAAU,GAAG;AAAA,EACxG,SAAS,OAAO;AACd,YAAQ,KAAK,2BAA2B;AACxC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,mBAAmB,IAA2B;AAC3D,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,sBAAsB,EAAE,MAAM;AAElD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,UAAU,IAAI,EAAE;AAE3C,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,4BAA4B,SAAS,OAAO;AACvD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,WAAW,SAAS;AAC1B,eAAW;AACX,YAAQ,IAAI,MAAM,KAAK,mBAAmB,CAAC;AAC3C,YAAQ,IAAI,kBAAkB,SAAS,IAAI,EAAE;AAC7C,YAAQ,IAAI,kBAAkB,SAAS,EAAE,EAAE;AAC3C,YAAQ,IAAI,kBAAkB,aAAa,SAAS,MAAM,CAAC,EAAE;AAC7D,YAAQ,IAAI,kBAAkB,SAAS,YAAY,GAAG,EAAE;AACxD,YAAQ,IAAI,kBAAkB,SAAS,cAAc,GAAG,EAAE;AAC1D,YAAQ,IAAI,kBAAkB,WAAW,SAAS,SAAS,CAAC,EAAE;AAC9D,QAAI,SAAS,aAAa;AACxB,cAAQ,IAAI,kBAAkB,SAAS,WAAW,EAAE;AAAA,IACtD;AACA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,0BAA0B;AACvC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,SAAS,aAAa,QAAyB;AAC7C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM,MAAM,QAAQ;AAAA,IAC7B,KAAK;AACH,aAAO,MAAM,OAAO,QAAQ;AAAA,IAC9B,KAAK;AACH,aAAO,MAAM,KAAK,WAAW;AAAA,IAC/B,KAAK;AACH,aAAO,MAAM,KAAK,UAAU;AAAA,IAC9B,KAAK;AAAA,IACL;AACE,aAAO,MAAM,KAAK,UAAU,OAAO;AAAA,EACvC;AACF;AAKA,SAAS,sBAAsB,QAAyB;AACtD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM,MAAM,WAAW;AAAA,IAChC,KAAK;AACH,aAAO,MAAM,KAAK,SAAS;AAAA,IAC7B,KAAK;AACH,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B,KAAK;AACH,aAAO,MAAM,IAAI,QAAQ;AAAA,IAC3B,KAAK;AACH,aAAO,MAAM,OAAO,SAAS;AAAA,IAC/B,KAAK;AACH,aAAO,MAAM,KAAK,WAAW;AAAA,IAC/B;AACE,aAAO,MAAM,KAAK,UAAU,SAAS;AAAA,EACzC;AACF;AAKA,SAAS,YAAY,OAAwB;AAC3C,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,SAAS,GAAI,QAAO,MAAM,MAAM,GAAG,KAAK,GAAG;AAC/C,MAAI,SAAS,GAAI,QAAO,MAAM,OAAO,GAAG,KAAK,GAAG;AAChD,SAAO,MAAM,IAAI,GAAG,KAAK,GAAG;AAC9B;AAKA,SAAS,eAAe,SAA0B;AAChD,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,UAAU,GAAI,QAAO,GAAG,QAAQ,QAAQ,CAAC,CAAC;AAC9C,QAAM,OAAO,KAAK,MAAM,UAAU,EAAE;AACpC,QAAM,OAAO,UAAU;AACvB,SAAO,GAAG,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC;AACpC;AAKA,eAAe,mBACb,IACA,SAOe;AACf,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,gCAAgC,EAAE,MAAM;AAE5D,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,UAAU,IAAI,IAAI;AAAA,MAC3C,SAAS,QAAQ;AAAA,MACjB,gBAAgB,QAAQ;AAAA,MACxB,aAAa,QAAQ;AAAA,MACrB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,cAAQ,KAAK,2BAA2B;AACxC,iBAAW,SAAS,SAAS,WAAW,eAAe;AACvD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,WAAW,YAAY,IAAI,SAAS;AAC5C,UAAM,SAAS,eAAe,WAAW,MAAM,WAAW;AAE1D,QAAI,QAAQ,QAAQ;AAClB,cAAQ,QAAQ,2BAA2B;AAC3C,gBAAU,wCAAwC;AAClD;AAAA,IACF;AAEA,YAAQ,QAAQ,sBAAsB,MAAM,EAAE;AAE9C,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,OAAO;AAClB,iBAAW;AACX,iBAAW,gBAAgB,UAAU,KAAK;AAC1C,iBAAW,UAAU,sBAAsB,WAAW,MAAM,CAAC;AAC7D,gBAAU,kCAAkC,MAAM,mBAAmB;AACrE,iBAAW;AACX;AAAA,IACF;AAGA,UAAM,eAAe,KAAK,QAAS,QAAQ,SAAS,OAAO;AAAA,EAC7D,SAAS,OAAO;AACd,YAAQ,KAAK,4BAA4B;AACzC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAMA,eAAe,eACb,KACA,aACA,cAAc,OACC;AACf,QAAM,YAAY,oBAAI,KAAK;AAC3B,MAAI,UAAU;AAAA,IACZ,cACI,GAAG,MAAM,IAAI,MAAM,CAAC,WAAM,cAAc,SAAS,CAAC,mCAClD;AAAA,EACN,EAAE,MAAM;AAER,QAAM,OAAO,IAAI,UAAU,eAAe,WAAW;AACrD,MAAI;AACJ,MAAI,oBAAoB;AAExB,OAAK,GAAG,UAAU,CAAC,WAAW;AAC5B,QAAI,aAAa;AACf,cAAQ,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,WAAM,cAAc,SAAS,CAAC,cAAc,MAAM;AAAA,IACvF,OAAO;AACL,cAAQ,OAAO,WAAW,MAAM;AAAA,IAClC;AAAA,EACF,CAAC;AAED,OAAK,GAAG,QAAQ,CAAC,SAAS;AACxB,QAAI,CAAC,aAAa;AAChB,cAAQ,KAAK;AACb,YAAM,aAAa,KAAK,WAAW,cAAc,MAAM,MAAM,QAAG,IAAI,MAAM,IAAI,QAAG;AACjF,cAAQ,IAAI,KAAK,UAAU,SAAS,KAAK,MAAM,KAAK,KAAK,UAAU,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE;AACxF,UAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,mBAAW,MAAM,KAAK,WAAW;AAC/B,gBAAM,SAAS,GAAG,WAAW,YAAY,MAAM,MAAM,QAAG,IAAI,MAAM,IAAI,QAAG;AACzE,gBAAM,MAAM,GAAG,aAAa,MAAM,IAAI,KAAK,GAAG,UAAU,KAAK,IAAI;AACjE,kBAAQ,IAAI,SAAS,MAAM,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,GAAG,EAAE;AAAA,QAC9D;AAAA,MACF;AACA,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF,CAAC;AAED,OAAK,GAAG,cAAc,CAAC,QAAQ;AAC7B,YAAQ,KAAK;AACb,iBAAa,GAAG;AAChB,YAAQ,MAAM;AAAA,EAChB,CAAC;AAED,OAAK,GAAG,aAAa,CAAC,cAAc;AAClC,qBAAiB;AACjB,UAAM,SAAS,UAAU;AAEzB,QAAI,WAAW,aAAa;AAC1B,cAAQ;AAAA,QACN,cACI,6BAAwB,cAAc,SAAS,CAAC,KAChD;AAAA,MACN;AAAA,IACF,WAAW,WAAW,UAAU;AAC9B,cAAQ;AAAA,QACN,cACI,2BAAsB,cAAc,SAAS,CAAC,KAC9C;AAAA,MACN;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,aAAa,MAAM,EAAE;AAAA,IACpC;AAEA,eAAW;AACX,0BAAsB,SAAS;AAG/B,QAAI,eAAe,UAAU,aAAa,QAAQ;AAChD,gBAAU,IAAI,2BAA2B,EAAE,MAAM;AAAA,IACnD;AAAA,EACF,CAAC;AAED,OAAK,GAAG,aAAa,CAAC,YAAY;AAChC,wBAAoB;AACpB,YAAQ,KAAK;AACb,qBAAiB,OAAO;AACxB,eAAW;AAAA,EACb,CAAC;AAED,OAAK,GAAG,WAAW,MAAM;AACvB,YAAQ,KAAK,2CAA2C;AACxD,cAAU,kCAAkC,WAAW,mBAAmB;AAAA,EAC5E,CAAC;AAED,OAAK,GAAG,SAAS,CAAC,QAAQ;AACxB,YAAQ,KAAK,sBAAsB;AACnC,eAAW,SAAS,IAAI,OAAO;AAC/B,YAAQ,WAAW;AAAA,EACrB,CAAC;AAED,QAAM,KAAK;AAGX,MAAI,kBAAkB,eAAe,eAAe,aAAa,UAAU,CAAC,mBAAmB;AAC7F,YAAQ,KAAK;AAAA,EACf;AACF;AAKA,SAAS,sBAAsB,WAAoC;AACjE,UAAQ,IAAI,MAAM,KAAK,oBAAoB,CAAC;AAC5C,UAAQ,IAAI,oBAAoB,UAAU,MAAM,UAAU,WAAW,EAAE;AACvE,UAAQ,IAAI,oBAAoB,UAAU,UAAU,EAAE;AACtD,UAAQ,IAAI,oBAAoB,sBAAsB,UAAU,MAAM,CAAC,EAAE;AACzE,UAAQ,IAAI,oBAAoB,YAAY,UAAU,YAAY,CAAC,EAAE;AACrE,UAAQ,IAAI,oBAAoB,eAAe,UAAU,QAAQ,CAAC,EAAE;AAEpE,MAAI,UAAU,SAAS;AACrB,YAAQ,IAAI,MAAM,KAAK,cAAc,CAAC;AACtC,QAAI,UAAU,QAAQ,iBAAiB,QAAW;AAChD,cAAQ,IAAI,sBAAsB,UAAU,QAAQ,aAAa,QAAQ,CAAC,CAAC,IAAI;AAAA,IACjF;AACA,QAAI,UAAU,QAAQ,aAAa,QAAW;AAC5C,cAAQ,IAAI,sBAAsB,YAAY,UAAU,QAAQ,QAAQ,CAAC,EAAE;AAAA,IAC7E;AACA,QAAI,UAAU,QAAQ,eAAe,QAAW;AAC9C,cAAQ,IAAI,sBAAsB,YAAY,UAAU,QAAQ,UAAU,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF;AAEA,MAAI,UAAU,aAAa,QAAQ;AACjC,YAAQ,IAAI,MAAM,KAAK,mBAAmB,CAAC;AAC3C,YAAQ,IAAI,sBAAsB,UAAU,YAAY,MAAM,EAAE;AAChE,QAAI,UAAU,YAAY,aAAa;AACrC,cAAQ,IAAI,sBAAsB,UAAU,YAAY,WAAW,EAAE;AAAA,IACvE;AAAA,EACF;AAGA,QAAM,gBAAgB,UAAU,eAAe,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACnF,MAAI,aAAa,SAAS,GAAG;AAC3B,YAAQ,IAAI,MAAM,KAAK,iBAAiB,CAAC;AACzC,2BAAuB,YAAY;AAAA,EACrC;AAEA,MAAI,UAAU,iBAAiB,UAAU,cAAc,SAAS,GAAG;AACjE,YAAQ,IAAI,MAAM,KAAK,aAAa,CAAC;AACrC,cAAU,cAAc,QAAQ,CAAC,QAAQ;AACvC,cAAQ,IAAI,MAAM,IAAI,SAAS,GAAG,EAAE,CAAC;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,aAAW;AACb;AAKA,SAAS,uBAAuB,WAA6B;AAC3D,aAAW,MAAM,WAAW;AAC1B,UAAM,aACJ,GAAG,WAAW,YACV,MAAM,MAAM,QAAG,IACf,GAAG,WAAW,UACZ,MAAM,IAAI,QAAG,IACb,GAAG,WAAW,YACZ,MAAM,OAAO,QAAG,IAChB,MAAM,IAAI,QAAG;AACvB,UAAM,WAAW,GAAG,aAAa,MAAM,IAAI,KAAK,GAAG,UAAU,KAAK,IAAI;AACtE,UAAM,SAAS,OAAO,KAAK,GAAG,UAAU,EAAE,SACtC,MAAM,IAAI,IAAI,KAAK,UAAU,GAAG,UAAU,CAAC,EAAE,IAC7C;AAEJ,YAAQ,IAAI,OAAO,UAAU,IAAI,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,MAAM,GAAG,QAAQ,EAAE;AAE5E,QAAI,GAAG,WAAW,WAAW,GAAG,OAAO;AACrC,cAAQ,IAAI,SAAS,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE;AAAA,IACpD;AAAA,EACF;AACF;AAKA,eAAe,0BAA0B,SAKvB;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,wBAAwB,EAAE,MAAM;AAEpD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,UAAU,cAAc;AAAA,MACjD,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ;AAAA,MAChB,OAAO,SAAS,QAAQ,OAAO,EAAE;AAAA,MACjC,MAAM,SAAS,QAAQ,MAAM,EAAE;AAAA,IACjC,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,8BAA8B,SAAS,OAAO;AACzD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,YAAY,MAAM,IAAI,SAAS;AAEvC,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,QAAI,WAAW,WAAW,GAAG;AAC3B,gBAAU,qBAAqB;AAC/B;AAAA,IACF;AAEA,eAAW;AACX;AAAA,MACE,CAAC,gBAAgB,YAAY,UAAU,SAAS,YAAY,SAAS;AAAA,MACrE,WAAW,IAAI,CAAC,MAAM;AAAA,SACnB,EAAE,MAAM,EAAE,eAAe,IAAI,MAAM,GAAG;AAAA,QACvC,EAAE,YAAY,MAAM,EAAE,KAAK;AAAA,QAC3B,sBAAsB,EAAE,MAAM;AAAA,QAC9B,YAAY,EAAE,YAAY;AAAA,QAC1B,eAAe,EAAE,QAAQ;AAAA,QACzB,EAAE,YAAY,WAAW,EAAE,SAAS,IAAI;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,eAAW;AACX,cAAU,UAAU,KAAK,aAAa;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ,KAAK,4BAA4B;AACzC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,yBAAyB,aAAoC;AAC1E,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,uBAAuB,EAAE,MAAM;AAEnD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,UAAU,aAAa,WAAW;AAE7D,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,6BAA6B,SAAS,OAAO;AACxD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,YAAY,SAAS;AAC3B,eAAW;AACX,0BAAsB,SAAS;AAAA,EACjC,SAAS,OAAO;AACd,YAAQ,KAAK,2BAA2B;AACxC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,uBACb,YACA,SACe;AACf,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,gCAAgC,EAAE,MAAM;AAE5D,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,UAAU;AAAA,MACnC;AAAA,MACA,SAAS,QAAQ,OAAO,EAAE;AAAA,IAC5B;AAEA,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,2BAA2B,SAAS,OAAO;AACtD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,YAAY,IAAI,SAAS;AAEjC,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,QAAI,YAAY,WAAW,GAAG;AAC5B,gBAAU,+CAA+C;AACzD;AAAA,IACF;AAEA,eAAW;AACX,YAAQ,IAAI,MAAM,KAAK,0BAA0B,UAAU,EAAE,CAAC;AAC9D,YAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAErC;AAAA,MACE,CAAC,KAAK,UAAU,SAAS,YAAY,SAAS;AAAA,MAC9C,YAAY,IAAI,CAAC,GAAG,MAAM;AAAA,SACvB,IAAI,GAAG,SAAS;AAAA,QACjB,sBAAsB,EAAE,MAAM;AAAA,QAC9B,YAAY,EAAE,YAAY;AAAA,QAC1B,eAAe,EAAE,QAAQ;AAAA,QACzB,EAAE,YAAY,WAAW,EAAE,SAAS,IAAI;AAAA,MAC1C,CAAC;AAAA,IACH;AAEA,eAAW;AACX,cAAU,gBAAgB,YAAY,MAAM,cAAc;AAAA,EAC5D,SAAS,OAAO;AACd,YAAQ,KAAK,yBAAyB;AACtC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,sBAAsB,SAKnB;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,WAAW,SAAS,QAAQ,UAAU,EAAE;AAC9C,QAAM,WAAW,SAAS,QAAQ,UAAU,EAAE;AAE9C,QAAM,UAAU,IAAI,mCAAmC,QAAQ,KAAK,KAAK,EAAE,MAAM;AAEjF,MAAI;AACF,UAAM,SAAsB,MAAM,IAAI,UAAU,OAAO;AAAA,MACrD,SAAS,QAAQ;AAAA,MACjB;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,IAChB,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,aAAa,GAAG;AAClB,gBAAU,MAAM;AAChB,UAAI,CAAC,OAAO,WAAW;AACrB,gBAAQ,WAAW;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,OAAO,mBAAmB,GAAG;AAC/B,gBAAU,0CAA0C;AACpD;AAAA,IACF;AAEA,eAAW;AACX,YAAQ,IAAI,MAAM,KAAK,wBAAwB,CAAC;AAChD,YAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AAGrC;AAAA,MACE,CAAC,YAAY,UAAU,SAAS,YAAY,SAAS,QAAQ;AAAA,MAC7D,OAAO,QAAQ,IAAI,CAAC,MAAM;AAAA,QACxB,EAAE;AAAA,QACF,sBAAsB,EAAE,MAAM;AAAA,QAC9B,YAAY,EAAE,KAAK;AAAA,QACnB,eAAe,EAAE,QAAQ;AAAA,QACzB,EAAE,cAAc,SAAS;AAAA,QACzB,EAAE,SAAS,MAAM,MAAM,MAAM,IAAI,MAAM,IAAI,MAAM;AAAA,MACnD,CAAC;AAAA,IACH;AAGA,eAAW;AACX,YAAQ,IAAI,MAAM,KAAK,SAAS,CAAC;AACjC,YAAQ,IAAI,oBAAoB,OAAO,cAAc,EAAE;AACvD,YAAQ,IAAI,oBAAoB,MAAM,MAAM,OAAO,OAAO,SAAS,CAAC,CAAC,EAAE;AACvE,YAAQ,IAAI,oBAAoB,OAAO,SAAS,IAAI,MAAM,IAAI,OAAO,OAAO,SAAS,CAAC,IAAI,GAAG,EAAE;AAC/F,YAAQ,IAAI,oBAAoB,YAAY,OAAO,YAAY,CAAC,EAAE;AAClE,YAAQ,IAAI,oBAAoB,OAAO,QAAQ,EAAE;AAEjD,eAAW;AACX,QAAI,OAAO,WAAW;AACpB,cAAQ,IAAI,MAAM,MAAM,OAAO,OAAO,cAAc,mBAAmB,CAAC;AAAA,IAC1E,OAAO;AACL,cAAQ,IAAI,MAAM,IAAI,GAAG,OAAO,MAAM,OAAO,OAAO,cAAc,mBAAmB,CAAC;AACtF,cAAQ,WAAW;AAAA,IACrB;AACA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,yBAAyB;AACtC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/scenarios.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport type { ChanlSDK, ScenarioExecution, ToolCall, BatchResult } from '@chanl/sdk';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printError,\n printInfo,\n printBlank,\n printSimpleTable,\n printLabel,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\nimport {\n formatElapsed,\n printSegment,\n displayScorecard,\n} from '../utils/interactive.js';\n\n/**\n * Create the scenarios command group\n */\nexport function createScenariosCommand(): Command {\n const scenarios = new Command('scenarios')\n .description('Manage and run test scenarios')\n .addHelpText(\n 'after',\n `\nWhat are Scenarios?\n Scenarios are test cases that run against your AI agents. Each scenario\n defines a conversation flow, expected responses, and scoring criteria.\n\nQuick Start:\n $ chanl scenarios list # See all scenarios\n $ chanl scenarios run <id> # Execute a scenario\n $ chanl scenarios run <id> --watch # Execute and watch progress\n $ chanl scenarios history <id> # View past runs\n\nExecution Workflow:\n 1. List scenarios to find the one you want to test\n 2. Run the scenario (optionally with --watch)\n 3. Check execution status with 'executions' or 'execution <id>'\n 4. Review history with 'history <scenarioId>'`\n );\n\n // scenarios list\n scenarios\n .command('list')\n .description('List all scenarios')\n .option('-s, --status <status>', 'Filter by status (draft, active, paused, completed, archived)')\n .option('-c, --category <category>', 'Filter by category')\n .option('-l, --limit <number>', 'Number of items per page', '20')\n .option('-p, --page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios list # List all scenarios\n $ chanl scenarios list --status active # Only active scenarios\n $ chanl scenarios list --category sales # Filter by category\n $ chanl scenarios list --json # Output as JSON`\n )\n .action(handleScenariosList);\n\n // scenarios get <id>\n scenarios\n .command('get <id>')\n .description('Get a scenario by ID')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios get abc123 # Get scenario details\n $ chanl scenarios get abc123 --json # Output as JSON`\n )\n .action(handleScenariosGet);\n\n // scenarios run <id>\n scenarios\n .command('run <id>')\n .description('Execute a scenario')\n .option('-a, --agent <agentId>', 'Specific agent to run against')\n .option('-m, --mode <mode>', 'Simulation mode: text, websocket, phone', 'websocket')\n .option('-p, --phone <number>', 'Phone number for phone mode (E.164 format)')\n .option('-w, --watch', 'Watch execution progress until completion')\n .option('--dry-run', 'Validate without actually executing')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios run abc123 # Run with defaults\n $ chanl scenarios run abc123 --watch # Run and watch progress\n $ chanl scenarios run abc123 --agent agent_xyz # Run against specific agent\n $ chanl scenarios run abc123 --mode phone --phone +14155551234\n $ chanl scenarios run abc123 --dry-run # Validate only\n\nSimulation Modes:\n text Free, instant text-based testing\n websocket Real WebSocket testing (requires provider API key)\n phone Real phone call (requires provider + phone number)`\n )\n .action(handleScenariosRun);\n\n // scenarios executions\n scenarios\n .command('executions')\n .description('List scenario executions')\n .option('-s, --scenario <scenarioId>', 'Filter by scenario ID')\n .option('--status <status>', 'Filter by status (queued, running, completed, failed, timeout, cancelled)')\n .option('-l, --limit <number>', 'Number of items', '10')\n .option('-p, --page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios executions # List recent executions\n $ chanl scenarios executions --scenario abc123 # For specific scenario\n $ chanl scenarios executions --status completed # Only completed\n $ chanl scenarios executions --json # Output as JSON`\n )\n .action(handleScenariosExecutions);\n\n // scenarios execution <executionId>\n scenarios\n .command('execution <executionId>')\n .description('Get execution details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios execution exec_abc123 # Get execution details\n $ chanl scenarios execution exec_abc123 --json`\n )\n .action(handleScenariosExecution);\n\n // scenarios history <scenarioId>\n scenarios\n .command('history <scenarioId>')\n .description('Get simulation history for a scenario')\n .option('-l, --limit <number>', 'Number of simulations to show', '10')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios history abc123 # Last 10 runs\n $ chanl scenarios history abc123 --limit 5 # Last 5 runs\n $ chanl scenarios history abc123 --json # Output as JSON`\n )\n .action(handleScenariosHistory);\n\n // scenarios run-all\n scenarios\n .command('run-all')\n .description('Run all scenarios for an agent and show aggregate results')\n .requiredOption('-a, --agent <agentId>', 'Agent ID to run scenarios against')\n .option('--min-score <score>', 'Minimum passing score (0-100)', '0')\n .option('--parallel <count>', 'Max concurrent executions', '3')\n .option('-m, --mode <mode>', 'Simulation mode: text, phone', 'text')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl scenarios run-all --agent agent_abc # Run all with defaults\n $ chanl scenarios run-all --agent agent_abc --min-score 80 # Fail if any score < 80\n $ chanl scenarios run-all --agent agent_abc --parallel 5 # Run 5 at a time\n $ chanl scenarios run-all --agent agent_abc --json # Output as JSON\n\nExit Codes:\n 0 All scenarios passed (score >= min-score)\n 1 One or more scenarios failed`\n )\n .action(handleScenariosRunAll);\n\n // scenarios cancel\n scenarios\n .command('cancel <executionId>')\n .description('Cancel a running or queued execution')\n .action(handleScenariosCancel);\n\n // scenarios retry\n scenarios\n .command('retry <executionId>')\n .description('Retry a failed or cancelled execution')\n .action(handleScenariosRetry);\n\n // scenarios cross-product\n scenarios\n .command('cross-product <scenarioId>')\n .description('Run all agent × persona combinations for a scenario')\n .option('-a, --agent <agentId>', 'Filter to one agent')\n .option('--persona <personaId>', 'Filter to one persona')\n .option('-m, --mode <mode>', 'Simulation mode: text, phone', 'text')\n .option('-p, --phone <number>', 'Phone number for phone mode')\n .action(handleScenariosCrossProduct);\n\n // scenarios batch\n scenarios\n .command('batch')\n .description('Execute multiple scenarios in one batch')\n .requiredOption('-a, --agent <agentId>', 'Agent ID')\n .requiredOption('-s, --scenarios <ids>', 'Comma-separated scenario IDs')\n .option('-m, --mode <mode>', 'Simulation mode: text, phone', 'text')\n .option('-p, --phone <number>', 'Phone number for phone mode')\n .action(handleScenariosBatch);\n\n return scenarios;\n}\n\n/**\n * Handle scenarios list command\n */\nasync function handleScenariosList(options: {\n status?: string;\n category?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching scenarios...').start();\n\n try {\n const response = await sdk.scenarios.list({\n status: options.status,\n category: options.category,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch scenarios', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { scenarios, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (scenarios.length === 0) {\n printInfo('No scenarios found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Name', 'Status', 'Category', 'Difficulty', 'Created'],\n scenarios.map((s) => [\n s.name,\n formatStatus(s.status),\n s.category || '-',\n s.difficulty || '-',\n formatDate(s.createdAt),\n ])\n );\n\n printBlank();\n printInfo(`Total: ${pagination.total} scenarios (Page ${pagination.page} of ${pagination.totalPages})`);\n } catch (error) {\n spinner.fail('Failed to fetch scenarios');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios get command\n */\nasync function handleScenariosGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching scenario...').start();\n\n try {\n const response = await sdk.scenarios.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch scenario', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const scenario = response.data;\n printBlank();\n console.log(chalk.bold('Scenario Details:'));\n console.log(` Name: ${scenario.name}`);\n console.log(` ID: ${scenario.id}`);\n console.log(` Status: ${formatStatus(scenario.status)}`);\n console.log(` Category: ${scenario.category || '-'}`);\n console.log(` Difficulty: ${scenario.difficulty || '-'}`);\n console.log(` Created: ${formatDate(scenario.createdAt)}`);\n if (scenario.description) {\n console.log(` Description: ${scenario.description}`);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch scenario');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Format status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'paused':\n return chalk.yellow('paused');\n case 'completed':\n return chalk.blue('completed');\n case 'archived':\n return chalk.gray('archived');\n case 'draft':\n default:\n return chalk.gray(status || 'draft');\n }\n}\n\n/**\n * Format execution status with color\n */\nfunction formatExecutionStatus(status?: string): string {\n switch (status) {\n case 'completed':\n return chalk.green('completed');\n case 'running':\n return chalk.cyan('running');\n case 'queued':\n return chalk.blue('queued');\n case 'failed':\n return chalk.red('failed');\n case 'timeout':\n return chalk.yellow('timeout');\n case 'cancelled':\n return chalk.gray('cancelled');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Format score with color\n */\nfunction formatScore(score?: number): string {\n if (score === undefined || score === null) return '-';\n if (score >= 80) return chalk.green(`${score}%`);\n if (score >= 60) return chalk.yellow(`${score}%`);\n return chalk.red(`${score}%`);\n}\n\n/**\n * Format duration in seconds\n */\nfunction formatDuration(seconds?: number): string {\n if (!seconds) return '-';\n if (seconds < 60) return `${seconds.toFixed(1)}s`;\n const mins = Math.floor(seconds / 60);\n const secs = seconds % 60;\n return `${mins}m ${secs.toFixed(0)}s`;\n}\n\n/**\n * Handle scenarios run command\n */\nasync function handleScenariosRun(\n id: string,\n options: {\n agent?: string;\n mode?: string;\n phone?: string;\n watch?: boolean;\n dryRun?: boolean;\n }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Starting scenario execution...').start();\n\n try {\n const response = await sdk.scenarios.run(id, {\n agentId: options.agent,\n simulationMode: options.mode as 'text' | 'websocket' | 'phone',\n phoneNumber: options.phone,\n dryRun: options.dryRun,\n });\n\n if (!response.success || !response.data) {\n spinner.fail('Failed to start execution');\n printError('Error', response.message || 'Unknown error');\n process.exitCode = 1;\n return;\n }\n\n const { execution, executionId } = response.data;\n const execId = executionId || execution?.id || execution?.executionId;\n\n if (options.dryRun) {\n spinner.succeed('Dry run validation passed');\n printInfo('Scenario is valid and ready to execute');\n return;\n }\n\n spinner.succeed(`Execution started: ${execId}`);\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (!options.watch) {\n printBlank();\n printLabel('Execution ID', execId || 'N/A');\n printLabel('Status', formatExecutionStatus(execution?.status));\n printInfo(`Run 'chanl scenarios execution ${execId}' to check status`);\n printBlank();\n return;\n }\n\n // Watch mode - poll until complete\n await watchExecution(sdk, execId!, options.mode === 'phone');\n } catch (error) {\n spinner.fail('Failed to execute scenario');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Watch execution until completion\n * Uses SDK LiveExecution for event-driven monitoring\n */\nasync function watchExecution(\n sdk: ChanlSDK,\n executionId: string,\n isPhoneMode = false,\n): Promise<void> {\n const startTime = new Date();\n let spinner = ora(\n isPhoneMode\n ? `${chalk.red('LIVE')} — ${formatElapsed(startTime)} | Watching voice execution...`\n : 'Watching execution...'\n ).start();\n\n const live = sdk.scenarios.watchExecution(executionId);\n let finalExecution: ScenarioExecution | undefined;\n let scorecardReceived = false;\n\n live.on('status', (status) => {\n if (isPhoneMode) {\n spinner.text = `${chalk.red('LIVE')} — ${formatElapsed(startTime)} | Status: ${status}`;\n } else {\n spinner.text = `Status: ${status}`;\n }\n });\n\n live.on('step', (step) => {\n if (!isPhoneMode) {\n spinner.stop();\n const stepStatus = step.status === 'completed' ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${stepStatus} Step ${step.stepId}: ${step.response?.slice(0, 80) || '-'}`);\n if (step.toolCalls.length > 0) {\n for (const tc of step.toolCalls) {\n const tcIcon = tc.status === 'success' ? chalk.green('✓') : chalk.red('✗');\n const dur = tc.durationMs ? chalk.dim(` (${tc.durationMs}ms)`) : '';\n console.log(` ${tcIcon} ${chalk.yellow(tc.name)}${dur}`);\n }\n }\n spinner.start();\n }\n });\n\n live.on('transcript', (seg) => {\n spinner.stop();\n printSegment(seg);\n spinner.start();\n });\n\n live.on('completed', (execution) => {\n finalExecution = execution;\n const status = execution.status;\n\n if (status === 'completed') {\n spinner.succeed(\n isPhoneMode\n ? `Execution complete — ${formatElapsed(startTime)}`\n : 'Execution completed'\n );\n } else if (status === 'failed') {\n spinner.fail(\n isPhoneMode\n ? `Execution failed — ${formatElapsed(startTime)}`\n : 'Execution failed'\n );\n } else {\n spinner.warn(`Execution ${status}`);\n }\n\n printBlank();\n printExecutionDetails(execution);\n\n // Start scorecard spinner for phone mode\n if (isPhoneMode && execution.callDetails?.callId) {\n spinner = ora('Checking for scorecard...').start();\n }\n });\n\n live.on('scorecard', (results) => {\n scorecardReceived = true;\n spinner.stop();\n displayScorecard(results);\n printBlank();\n });\n\n live.on('timeout', () => {\n spinner.warn('Timeout waiting for execution to complete');\n printInfo(`Run 'chanl scenarios execution ${executionId}' to check status`);\n });\n\n live.on('error', (err) => {\n spinner.fail('Error while watching');\n printError('Error', err.message);\n process.exitCode = 1;\n });\n\n await live.completed;\n\n // Post-completion: if phone mode and no scorecard arrived, clean up spinner\n if (finalExecution && isPhoneMode && finalExecution.callDetails?.callId && !scorecardReceived) {\n spinner.stop();\n }\n}\n\n/**\n * Print execution details\n */\nfunction printExecutionDetails(execution: ScenarioExecution): void {\n console.log(chalk.bold('Execution Results:'));\n console.log(` Execution ID: ${execution.id || execution.executionId}`);\n console.log(` Scenario ID: ${execution.scenarioId}`);\n console.log(` Status: ${formatExecutionStatus(execution.status)}`);\n console.log(` Score: ${formatScore(execution.overallScore)}`);\n console.log(` Duration: ${formatDuration(execution.duration)}`);\n\n if (execution.metrics) {\n console.log(chalk.bold('\\n Metrics:'));\n if (execution.metrics.responseTime !== undefined) {\n console.log(` Response Time: ${execution.metrics.responseTime.toFixed(0)}ms`);\n }\n if (execution.metrics.accuracy !== undefined) {\n console.log(` Accuracy: ${formatScore(execution.metrics.accuracy)}`);\n }\n if (execution.metrics.completion !== undefined) {\n console.log(` Completion: ${formatScore(execution.metrics.completion)}`);\n }\n }\n\n if (execution.callDetails?.callId) {\n console.log(chalk.bold('\\n Call Details:'));\n console.log(` Call ID: ${execution.callDetails.callId}`);\n if (execution.callDetails.phoneNumber) {\n console.log(` Phone: ${execution.callDetails.phoneNumber}`);\n }\n }\n\n // Show tool calls from step results\n const allToolCalls = (execution.stepResults ?? []).flatMap((s) => s.toolCalls ?? []);\n if (allToolCalls.length > 0) {\n console.log(chalk.bold('\\n Tool Calls:'));\n printScenarioToolCalls(allToolCalls);\n }\n\n if (execution.errorMessages && execution.errorMessages.length > 0) {\n console.log(chalk.bold('\\n Errors:'));\n execution.errorMessages.forEach((msg) => {\n console.log(chalk.red(` - ${msg}`));\n });\n }\n\n printBlank();\n}\n\n/**\n * Print tool calls from scenario execution\n */\nfunction printScenarioToolCalls(toolCalls: ToolCall[]): void {\n for (const tc of toolCalls) {\n const statusIcon =\n tc.status === 'success'\n ? chalk.green('✓')\n : tc.status === 'error'\n ? chalk.red('✗')\n : tc.status === 'timeout'\n ? chalk.yellow('⏱')\n : chalk.dim('…');\n const duration = tc.durationMs ? chalk.dim(` (${tc.durationMs}ms)`) : '';\n const params = Object.keys(tc.parameters).length\n ? chalk.dim(` ${JSON.stringify(tc.parameters)}`)\n : '';\n\n console.log(` ${statusIcon} ${chalk.yellow(tc.name)}${params}${duration}`);\n\n if (tc.status === 'error' && tc.error) {\n console.log(` ${chalk.red(tc.error.message)}`);\n }\n }\n}\n\n/**\n * Handle scenarios executions command\n */\nasync function handleScenariosExecutions(options: {\n scenario?: string;\n status?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching executions...').start();\n\n try {\n const response = await sdk.scenarios.getExecutions({\n scenarioId: options.scenario,\n status: options.status,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch executions', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { executions, total } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (executions.length === 0) {\n printInfo('No executions found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Execution ID', 'Scenario', 'Status', 'Score', 'Duration', 'Started'],\n executions.map((e) => [\n (e.id || e.executionId || '').slice(-12),\n e.scenarioId?.slice(-8) || '-',\n formatExecutionStatus(e.status),\n formatScore(e.overallScore),\n formatDuration(e.duration),\n e.startTime ? formatDate(e.startTime) : '-',\n ])\n );\n\n printBlank();\n printInfo(`Total: ${total} executions`);\n } catch (error) {\n spinner.fail('Failed to fetch executions');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios execution command\n */\nasync function handleScenariosExecution(executionId: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching execution...').start();\n\n try {\n const response = await sdk.scenarios.getExecution(executionId);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch execution', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const execution = response.data;\n printBlank();\n printExecutionDetails(execution);\n } catch (error) {\n spinner.fail('Failed to fetch execution');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios history command\n */\nasync function handleScenariosHistory(\n scenarioId: string,\n options: { limit: string }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching simulation history...').start();\n\n try {\n const response = await sdk.scenarios.getSimulations(\n scenarioId,\n parseInt(options.limit, 10)\n );\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch history', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { simulations } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (simulations.length === 0) {\n printInfo('No simulation history found for this scenario');\n return;\n }\n\n printBlank();\n console.log(chalk.bold(`Simulation History for ${scenarioId}`));\n console.log(chalk.dim('─'.repeat(60)));\n\n printSimpleTable(\n ['#', 'Status', 'Score', 'Duration', 'Started'],\n simulations.map((s, i) => [\n (i + 1).toString(),\n formatExecutionStatus(s.status),\n formatScore(s.overallScore),\n formatDuration(s.duration),\n s.startTime ? formatDate(s.startTime) : '-',\n ])\n );\n\n printBlank();\n printInfo(`Showing last ${simulations.length} simulations`);\n } catch (error) {\n spinner.fail('Failed to fetch history');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle scenarios run-all command\n */\nasync function handleScenariosRunAll(options: {\n agent: string;\n minScore: string;\n parallel: string;\n mode?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const minScore = parseInt(options.minScore, 10);\n const parallel = parseInt(options.parallel, 10);\n\n const spinner = ora(`Running all scenarios for agent ${options.agent}...`).start();\n\n try {\n const result: BatchResult = await sdk.scenarios.runAll({\n agentId: options.agent,\n minScore,\n parallel,\n mode: options.mode as 'text' | 'phone' | undefined,\n });\n\n spinner.stop();\n\n if (isJsonOutput()) {\n printJson(result);\n if (!result.allPassed) {\n process.exitCode = 1;\n }\n return;\n }\n\n if (result.totalScenarios === 0) {\n printInfo('No active scenarios found for this agent');\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Batch Scenario Results'));\n console.log(chalk.dim('─'.repeat(60)));\n\n // Per-scenario results\n printSimpleTable(\n ['Scenario', 'Status', 'Score', 'Duration', 'Tools', 'Result'],\n result.results.map((r) => [\n r.scenarioName,\n formatExecutionStatus(r.status),\n formatScore(r.score),\n formatDuration(r.duration),\n r.toolCallCount.toString(),\n r.passed ? chalk.green('PASS') : chalk.red('FAIL'),\n ])\n );\n\n // Summary\n printBlank();\n console.log(chalk.bold('Summary'));\n console.log(` Total: ${result.totalScenarios}`);\n console.log(` Passed: ${chalk.green(result.passed.toString())}`);\n console.log(` Failed: ${result.failed > 0 ? chalk.red(result.failed.toString()) : '0'}`);\n console.log(` Average Score: ${formatScore(result.averageScore)}`);\n console.log(` Min Score: ${result.minScore}`);\n\n printBlank();\n if (result.allPassed) {\n console.log(chalk.green(`All ${result.totalScenarios} scenarios passed`));\n } else {\n console.log(chalk.red(`${result.failed} of ${result.totalScenarios} scenarios failed`));\n process.exitCode = 1;\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to run scenarios');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handleScenariosCancel(executionId: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Cancelling execution ${executionId}...`).start();\n try {\n const response = await sdk.scenarios.cancelExecution(executionId);\n spinner.stop();\n if (!response.success) {\n printError('Cancel failed', response.message);\n process.exitCode = 1;\n return;\n }\n if (isJsonOutput()) {\n printJson({ executionId, status: 'cancelled' });\n return;\n }\n printInfo(`Cancelled execution ${executionId}`);\n } catch (error) {\n spinner.fail('Cancel failed');\n printError('Error', error instanceof Error ? error.message : 'Unknown error');\n process.exitCode = 1;\n }\n}\n\nasync function handleScenariosRetry(executionId: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Retrying execution ${executionId}...`).start();\n try {\n const response = await sdk.scenarios.retryExecution(executionId);\n spinner.stop();\n if (!response.success || !response.data) {\n printError('Retry failed', response.message);\n process.exitCode = 1;\n return;\n }\n const execution = response.data;\n const newId = execution.executionId || execution.id;\n if (isJsonOutput()) {\n printJson(execution);\n return;\n }\n printInfo(`Retry started: ${newId}`);\n printLabel('Status', execution.status);\n } catch (error) {\n spinner.fail('Retry failed');\n printError('Error', error instanceof Error ? error.message : 'Unknown error');\n process.exitCode = 1;\n }\n}\n\nasync function handleScenariosCrossProduct(\n scenarioId: string,\n options: {\n agent?: string;\n persona?: string;\n mode?: string;\n phone?: string;\n },\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Starting cross-product executions...').start();\n try {\n const result = await sdk.scenarios.runCrossProduct(scenarioId, {\n agentId: options.agent,\n personaId: options.persona,\n mode: options.mode as 'text' | 'phone' | undefined,\n phoneNumber: options.phone,\n });\n spinner.stop();\n\n if (isJsonOutput()) {\n printJson(result);\n return;\n }\n\n printBlank();\n console.log(chalk.bold(`Cross-product: ${result.scenarioName}`));\n console.log(` Combos started: ${result.totalCombos}`);\n for (const exec of result.executions) {\n console.log(` ${exec.executionId} agent=${exec.agentId || '-'} persona=${exec.personaId}`);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Cross-product run failed');\n printError('Error', error instanceof Error ? error.message : 'Unknown error');\n process.exitCode = 1;\n }\n}\n\nasync function handleScenariosBatch(options: {\n agent: string;\n scenarios: string;\n mode?: string;\n phone?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const scenarioIds = options.scenarios.split(',').map((s) => s.trim()).filter(Boolean);\n if (scenarioIds.length === 0) {\n printError('No scenario IDs provided', 'Use --scenarios id1,id2');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora(`Starting batch (${scenarioIds.length} scenarios)...`).start();\n try {\n const response = await sdk.scenarios.executeBatch({\n agentId: options.agent,\n scenarioIds,\n mode: options.mode as 'text' | 'phone' | undefined,\n phoneNumber: options.phone,\n });\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Batch failed', response.message);\n process.exitCode = 1;\n return;\n }\n\n const batch = response.data;\n if (isJsonOutput()) {\n printJson(batch);\n return;\n }\n\n printBlank();\n console.log(chalk.bold(`Batch ${batch.batchId}`));\n console.log(` Status: ${batch.status}`);\n console.log(` Progress: ${batch.progress.completed}/${batch.progress.total}`);\n printBlank();\n } catch (error) {\n spinner.fail('Batch failed');\n printError('Error', error instanceof Error ? error.message : 'Unknown error');\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":[]}
|