@chanl/cli 2.0.4 → 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.
Files changed (78) hide show
  1. package/dist/__tests__/agents.test.js +574 -0
  2. package/dist/__tests__/agents.test.js.map +1 -0
  3. package/dist/__tests__/auth.test.d.ts +2 -0
  4. package/dist/__tests__/auth.test.js +87 -0
  5. package/dist/__tests__/auth.test.js.map +1 -0
  6. package/dist/__tests__/calls.test.d.ts +2 -0
  7. package/dist/__tests__/calls.test.js +115 -0
  8. package/dist/__tests__/calls.test.js.map +1 -0
  9. package/dist/__tests__/chat.test.d.ts +2 -0
  10. package/dist/__tests__/chat.test.js +357 -0
  11. package/dist/__tests__/chat.test.js.map +1 -0
  12. package/dist/__tests__/cli-base.test.d.ts +2 -0
  13. package/dist/__tests__/cli-base.test.js +87 -0
  14. package/dist/__tests__/cli-base.test.js.map +1 -0
  15. package/dist/__tests__/cli-missing.test.d.ts +2 -0
  16. package/dist/__tests__/cli-missing.test.js +546 -0
  17. package/dist/__tests__/cli-missing.test.js.map +1 -0
  18. package/dist/__tests__/cli-p0-scenarios.test.d.ts +2 -0
  19. package/dist/__tests__/cli-p0-scenarios.test.js +123 -0
  20. package/dist/__tests__/cli-p0-scenarios.test.js.map +1 -0
  21. package/dist/__tests__/helpers.d.ts +234 -0
  22. package/dist/__tests__/helpers.js +314 -0
  23. package/dist/__tests__/helpers.js.map +1 -0
  24. package/dist/__tests__/mcp.test.d.ts +2 -0
  25. package/dist/__tests__/mcp.test.js +470 -0
  26. package/dist/__tests__/mcp.test.js.map +1 -0
  27. package/dist/__tests__/prompts.test.d.ts +2 -0
  28. package/dist/__tests__/prompts.test.js +227 -0
  29. package/dist/__tests__/prompts.test.js.map +1 -0
  30. package/dist/__tests__/scenarios.test.d.ts +2 -0
  31. package/dist/__tests__/scenarios.test.js +270 -0
  32. package/dist/__tests__/scenarios.test.js.map +1 -0
  33. package/dist/__tests__/tools.test.d.ts +2 -0
  34. package/dist/__tests__/tools.test.js +331 -0
  35. package/dist/__tests__/tools.test.js.map +1 -0
  36. package/dist/__tests__/toolsets.test.d.ts +2 -0
  37. package/dist/__tests__/toolsets.test.js +196 -0
  38. package/dist/__tests__/toolsets.test.js.map +1 -0
  39. package/dist/__tests__/workspaces.test.d.ts +2 -0
  40. package/dist/__tests__/workspaces.test.js +155 -0
  41. package/dist/__tests__/workspaces.test.js.map +1 -0
  42. package/dist/cli.js +8 -0
  43. package/dist/cli.js.map +1 -1
  44. package/dist/commands/agents.js +194 -6
  45. package/dist/commands/agents.js.map +1 -1
  46. package/dist/commands/chat.js +2 -2
  47. package/dist/commands/chat.js.map +1 -1
  48. package/dist/commands/config.js +24 -2
  49. package/dist/commands/config.js.map +1 -1
  50. package/dist/commands/customers.d.ts +8 -0
  51. package/dist/commands/customers.js +289 -0
  52. package/dist/commands/customers.js.map +1 -0
  53. package/dist/commands/index.d.ts +3 -0
  54. package/dist/commands/index.js +7 -0
  55. package/dist/commands/index.js.map +1 -1
  56. package/dist/commands/memory.js +134 -1
  57. package/dist/commands/memory.js.map +1 -1
  58. package/dist/commands/messaging.d.ts +12 -0
  59. package/dist/commands/messaging.js +208 -0
  60. package/dist/commands/messaging.js.map +1 -0
  61. package/dist/commands/prompts.js +148 -1
  62. package/dist/commands/prompts.js.map +1 -1
  63. package/dist/commands/scenarios.js +121 -0
  64. package/dist/commands/scenarios.js.map +1 -1
  65. package/dist/commands/scorecards.js +3 -3
  66. package/dist/commands/scorecards.js.map +1 -1
  67. package/dist/commands/whatsapp.d.ts +8 -0
  68. package/dist/commands/whatsapp.js +332 -0
  69. package/dist/commands/whatsapp.js.map +1 -0
  70. package/dist/utils/config-store.d.ts +8 -0
  71. package/dist/utils/config-store.js +18 -1
  72. package/dist/utils/config-store.js.map +1 -1
  73. package/dist/utils/sdk-factory.js +15 -3
  74. package/dist/utils/sdk-factory.js.map +1 -1
  75. package/package.json +4 -4
  76. package/dist/__tests__/cli.test.js +0 -2308
  77. package/dist/__tests__/cli.test.js.map +0 -1
  78. /package/dist/__tests__/{cli.test.d.ts → agents.test.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commands/prompts.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printError,\n printSuccess,\n printInfo,\n printBlank,\n printSimpleTable,\n printLabel,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\n\n/**\n * Create the prompts command group\n */\nexport function createPromptsCommand(): Command {\n const prompts = new Command('prompts')\n .description('Manage prompt templates')\n .addHelpText(\n 'after',\n `\nWhat are Prompts?\n Prompts are reusable templates for AI agent instructions. They support\n variables, versioning, and categories for organizing across use cases.\n\nQuick Start:\n $ chanl prompts list # List all prompts\n $ chanl prompts get <id> # View prompt details\n $ chanl prompts create -f prompt.json # Create from JSON file\n $ chanl prompts update <id> -f data.json # Update a prompt\n $ chanl prompts delete <id> # Delete a prompt`\n );\n\n // prompts list\n prompts\n .command('list')\n .description('List all prompts')\n .option('-c, --category <category>', 'Filter by category (support, sales, onboarding, general)')\n .option('-s, --status <status>', 'Filter by status (active, draft, archived)')\n .option('--search <query>', 'Search by name or content')\n .option('-l, --limit <number>', 'Number of items per page', '20')\n .option('--page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts list # List all prompts\n $ chanl prompts list --category support # Filter by category\n $ chanl prompts list --status active # Only active prompts\n $ chanl prompts list --json # Output as JSON`\n )\n .action(handlePromptsList);\n\n // prompts get <id>\n prompts\n .command('get <id>')\n .description('Get prompt details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts get abc123 # Get prompt details\n $ chanl prompts get abc123 --json # Output as JSON`\n )\n .action(handlePromptsGet);\n\n // prompts create\n prompts\n .command('create')\n .description('Create a new prompt')\n .option('-f, --file <path>', 'Path to JSON file with prompt data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts create -f prompt.json # Create from file\n\nJSON file format:\n {\n \"name\": \"Support Greeting\",\n \"content\": \"Hello! How can I help you today?\",\n \"category\": \"support\",\n \"status\": \"active\",\n \"tags\": [\"greeting\", \"support\"]\n }`\n )\n .action(handlePromptsCreate);\n\n // prompts update <id>\n prompts\n .command('update <id>')\n .description('Update an existing prompt')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts update abc123 -f updates.json`\n )\n .action(handlePromptsUpdate);\n\n // prompts delete <id>\n prompts\n .command('delete <id>')\n .description('Delete a prompt')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts delete abc123\n $ chanl prompts delete abc123 --yes # Skip confirmation`\n )\n .action(handlePromptsDelete);\n\n return prompts;\n}\n\n/**\n * Format prompt status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'draft':\n return chalk.yellow('draft');\n case 'archived':\n return chalk.gray('archived');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Handle prompts list command\n */\nasync function handlePromptsList(options: {\n category?: string;\n status?: string;\n search?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompts...').start();\n\n try {\n const response = await sdk.prompts.list({\n category: options.category as any,\n status: options.status as any,\n search: options.search,\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 prompts', response.message);\n process.exitCode = 1;\n return;\n }\n\n const prompts = Array.isArray(response.data) ? response.data : [];\n\n if (isJsonOutput()) {\n printJson(prompts);\n return;\n }\n\n if (prompts.length === 0) {\n printInfo('No prompts found');\n printInfo(\"Use 'chanl prompts create -f prompt.json' to create a prompt\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Category', 'Status', 'Version', 'Updated'],\n prompts.map((p: any) => [\n p.id.slice(-12),\n (p.name || 'Untitled').slice(0, 30),\n p.category || '-',\n formatStatus(p.status),\n String(p.version || '-'),\n formatDate(p.updatedAt || p.createdAt),\n ])\n );\n\n printBlank();\n printInfo(`Total: ${prompts.length} prompts`);\n } catch (error) {\n spinner.fail('Failed to fetch prompts');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts get command\n */\nasync function handlePromptsGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompt...').start();\n\n try {\n const response = await sdk.prompts.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n const prompt = response.data;\n\n if (isJsonOutput()) {\n printJson(prompt);\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Prompt Details:'));\n printLabel('ID', prompt.id);\n printLabel('Name', prompt.name);\n if (prompt.description) printLabel('Description', prompt.description);\n if (prompt.category) printLabel('Category', prompt.category);\n printLabel('Status', formatStatus(prompt.status));\n if (prompt.version) printLabel('Version', prompt.version.toString());\n if (prompt.tags && prompt.tags.length > 0) {\n printLabel('Tags', prompt.tags.join(', '));\n }\n if (prompt.createdAt) printLabel('Created', formatDate(prompt.createdAt));\n if (prompt.updatedAt) printLabel('Updated', formatDate(prompt.updatedAt));\n\n if (prompt.content) {\n printBlank();\n console.log(chalk.bold('Content:'));\n console.log(chalk.dim(prompt.content.slice(0, 500) + (prompt.content.length > 500 ? '...' : '')));\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts create command\n */\nasync function handlePromptsCreate(options: {\n file?: string;\n}): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify prompt data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let promptData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n promptData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Creating prompt...').start();\n\n try {\n const response = await sdk.prompts.create(promptData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt created: ${prompt.name}`);\n printLabel('ID', prompt.id);\n if (prompt.category) printLabel('Category', prompt.category);\n } catch (error) {\n spinner.fail('Failed to create prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts update command\n */\nasync function handlePromptsUpdate(\n id: string,\n options: { file?: string }\n): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify update data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let updateData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n updateData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Updating prompt...').start();\n\n try {\n const response = await sdk.prompts.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt updated: ${prompt.name}`);\n } catch (error) {\n spinner.fail('Failed to update prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts delete command\n */\nasync function handlePromptsDelete(\n id: string,\n options: { yes?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n if (!options.yes) {\n printInfo(`About to delete prompt: ${id}`);\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n }\n\n const spinner = ora('Deleting prompt...').start();\n\n try {\n const response = await sdk.prompts.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson({ success: true, deleted: id });\n return;\n }\n\n printSuccess(`Prompt deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/commands/prompts.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printError,\n printSuccess,\n printInfo,\n printBlank,\n printSimpleTable,\n printLabel,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\n\n/**\n * Create the prompts command group\n */\nexport function createPromptsCommand(): Command {\n const prompts = new Command('prompts')\n .description('Manage prompt templates')\n .addHelpText(\n 'after',\n `\nWhat are Prompts?\n Prompts are reusable templates for AI agent instructions. They support\n variables, versioning, and categories for organizing across use cases.\n\nQuick Start:\n $ chanl prompts list # List all prompts\n $ chanl prompts get <id> # View prompt details\n $ chanl prompts create -f prompt.json # Create from JSON file\n $ chanl prompts update <id> -f data.json # Update a prompt\n $ chanl prompts delete <id> # Delete a prompt`\n );\n\n // prompts list\n prompts\n .command('list')\n .description('List all prompts')\n .option('-c, --category <category>', 'Filter by category (support, sales, onboarding, general)')\n .option('-s, --status <status>', 'Filter by status (active, draft, archived)')\n .option('--search <query>', 'Search by name or content')\n .option('-l, --limit <number>', 'Number of items per page', '20')\n .option('--page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts list # List all prompts\n $ chanl prompts list --category support # Filter by category\n $ chanl prompts list --status active # Only active prompts\n $ chanl prompts list --json # Output as JSON`\n )\n .action(handlePromptsList);\n\n // prompts get <id>\n prompts\n .command('get <id>')\n .description('Get prompt details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts get abc123 # Get prompt details\n $ chanl prompts get abc123 --json # Output as JSON`\n )\n .action(handlePromptsGet);\n\n // prompts create\n prompts\n .command('create')\n .description('Create a new prompt')\n .option('-f, --file <path>', 'Path to JSON file with prompt data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts create -f prompt.json # Create from file\n\nJSON file format:\n {\n \"name\": \"Support Greeting\",\n \"content\": \"Hello! How can I help you today?\",\n \"category\": \"support\",\n \"status\": \"active\",\n \"tags\": [\"greeting\", \"support\"]\n }`\n )\n .action(handlePromptsCreate);\n\n // prompts update <id>\n prompts\n .command('update <id>')\n .description('Update an existing prompt')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts update abc123 -f updates.json`\n )\n .action(handlePromptsUpdate);\n\n // prompts delete <id>\n prompts\n .command('delete <id>')\n .description('Delete a prompt')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts delete abc123\n $ chanl prompts delete abc123 --yes # Skip confirmation`\n )\n .action(handlePromptsDelete);\n\n // prompts versions list <id>\n prompts\n .command('versions')\n .description('Prompt version operations')\n .addCommand(\n new Command('list')\n .argument('<id>', 'Prompt ID')\n .description('List version history for a prompt')\n .action(handlePromptsVersionsList)\n );\n\n // prompts revert <id>\n prompts\n .command('revert <id>')\n .description('Revert a prompt to a previous version')\n .requiredOption('--to-version <number>', 'Version number to revert to')\n .action(handlePromptsRevert);\n\n // prompts resolve <id>\n prompts\n .command('resolve <id>')\n .description('Resolve template variables in prompt content')\n .option('-f, --file <path>', 'JSON file with { \"variables\": { ... } }')\n .action(handlePromptsResolve);\n\n // prompts apply <id>\n prompts\n .command('apply <id>')\n .description('Apply a prompt to an agent')\n .requiredOption('-a, --agent <agentId>', 'Agent ID')\n .option('--sync', 'Sync agent to external platform after apply')\n .action(handlePromptsApply);\n\n return prompts;\n}\n\n/**\n * Format prompt status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'draft':\n return chalk.yellow('draft');\n case 'archived':\n return chalk.gray('archived');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Handle prompts list command\n */\nasync function handlePromptsList(options: {\n category?: string;\n status?: string;\n search?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompts...').start();\n\n try {\n const response = await sdk.prompts.list({\n category: options.category as any,\n status: options.status as any,\n search: options.search,\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 prompts', response.message);\n process.exitCode = 1;\n return;\n }\n\n const data = response.data as { prompts?: unknown[] } | unknown[] | undefined;\n const prompts = Array.isArray(data) ? data : (data?.prompts ?? []);\n\n if (isJsonOutput()) {\n printJson(prompts);\n return;\n }\n\n if (prompts.length === 0) {\n printInfo('No prompts found');\n printInfo(\"Use 'chanl prompts create -f prompt.json' to create a prompt\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Category', 'Status', 'Version', 'Updated'],\n prompts.map((p: any) => [\n p.id.slice(-12),\n (p.name || 'Untitled').slice(0, 30),\n p.category || '-',\n formatStatus(p.status),\n String(p.version || '-'),\n formatDate(p.updatedAt || p.createdAt),\n ])\n );\n\n printBlank();\n printInfo(`Total: ${prompts.length} prompts`);\n } catch (error) {\n spinner.fail('Failed to fetch prompts');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts get command\n */\nasync function handlePromptsGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompt...').start();\n\n try {\n const response = await sdk.prompts.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n const prompt = response.data;\n\n if (isJsonOutput()) {\n printJson(prompt);\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Prompt Details:'));\n printLabel('ID', prompt.id);\n printLabel('Name', prompt.name);\n if (prompt.description) printLabel('Description', prompt.description);\n if (prompt.category) printLabel('Category', prompt.category);\n printLabel('Status', formatStatus(prompt.status));\n if (prompt.version) printLabel('Version', prompt.version.toString());\n if (prompt.tags && prompt.tags.length > 0) {\n printLabel('Tags', prompt.tags.join(', '));\n }\n if (prompt.createdAt) printLabel('Created', formatDate(prompt.createdAt));\n if (prompt.updatedAt) printLabel('Updated', formatDate(prompt.updatedAt));\n\n if (prompt.content) {\n printBlank();\n console.log(chalk.bold('Content:'));\n console.log(chalk.dim(prompt.content.slice(0, 500) + (prompt.content.length > 500 ? '...' : '')));\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts create command\n */\nasync function handlePromptsCreate(options: {\n file?: string;\n}): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify prompt data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let promptData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n promptData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Creating prompt...').start();\n\n try {\n const response = await sdk.prompts.create(promptData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt created: ${prompt.name}`);\n printLabel('ID', prompt.id);\n if (prompt.category) printLabel('Category', prompt.category);\n } catch (error) {\n spinner.fail('Failed to create prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts update command\n */\nasync function handlePromptsUpdate(\n id: string,\n options: { file?: string }\n): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify update data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let updateData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n updateData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Updating prompt...').start();\n\n try {\n const response = await sdk.prompts.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt updated: ${prompt.name}`);\n } catch (error) {\n spinner.fail('Failed to update prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts delete command\n */\nasync function handlePromptsDelete(\n id: string,\n options: { yes?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n if (!options.yes) {\n printInfo(`About to delete prompt: ${id}`);\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n }\n\n const spinner = ora('Deleting prompt...').start();\n\n try {\n const response = await sdk.prompts.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson({ success: true, deleted: id });\n return;\n }\n\n printSuccess(`Prompt deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsVersionsList(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching versions...').start();\n\n try {\n const response = await sdk.prompts.getVersions(id);\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch versions', response.message);\n process.exitCode = 1;\n return;\n }\n\n const versions = Array.isArray(response.data) ? response.data : [];\n\n if (isJsonOutput()) {\n printJson(versions);\n return;\n }\n\n if (versions.length === 0) {\n printInfo('No versions found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Version', 'Name', 'Active', 'Created'],\n versions.map((v: { version?: number; versionName?: string; isActive?: boolean; createdAt?: string }) => [\n String(v.version ?? '-'),\n (v.versionName || '-').slice(0, 30),\n v.isActive ? chalk.green('yes') : chalk.gray('no'),\n formatDate(v.createdAt),\n ])\n );\n } catch (error) {\n spinner.fail('Failed to fetch versions');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsRevert(\n id: string,\n options: { toVersion: string }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const version = parseInt(options.toVersion, 10);\n if (Number.isNaN(version)) {\n printError('Invalid version', 'Version must be a number');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Reverting prompt...').start();\n\n try {\n const response = await sdk.prompts.revert(id, { version });\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to revert prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printSuccess(`Prompt reverted to version ${version}`);\n printLabel('ID', response.data.id);\n printLabel('Current version', String(response.data.version ?? version));\n } catch (error) {\n spinner.fail('Failed to revert prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsResolve(\n id: string,\n options: { file?: string }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n let variables: Record<string, string> | undefined;\n if (options.file) {\n try {\n const content = readFileSync(options.file, 'utf-8');\n const parsed = JSON.parse(content);\n variables = parsed.variables ?? parsed;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n }\n\n const spinner = ora('Resolving variables...').start();\n\n try {\n const response = await sdk.prompts.resolve(id, variables ? { variables } : undefined);\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to resolve prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Resolved content:'));\n console.log(response.data.content);\n if (response.data.unresolvedVariables?.length) {\n printBlank();\n printInfo(`Unresolved: ${response.data.unresolvedVariables.join(', ')}`);\n }\n } catch (error) {\n spinner.fail('Failed to resolve prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsApply(\n id: string,\n options: { agent: string; sync?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Applying prompt to agent...').start();\n\n try {\n const response = await sdk.prompts.apply(id, {\n agentId: options.agent,\n syncToPlatform: options.sync,\n });\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to apply prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data ?? { success: true });\n return;\n }\n\n printSuccess(`Prompt applied to agent ${options.agent}`);\n } catch (error) {\n spinner.fail('Failed to apply prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":[]}
@@ -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":"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","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":[]}
@@ -97,12 +97,12 @@ Examples:
97
97
  $ chanl scorecards delete abc123 # Delete with confirmation
98
98
  $ chanl scorecards delete abc123 --yes # Delete without confirmation`
99
99
  ).action(handleScorecardsDelete);
100
- scorecards.command("evaluate <callId>").description("Evaluate a call with a scorecard").requiredOption("-s, --scorecard <id>", "Scorecard ID to use").option("--force", "Force re-evaluation even if already done").addHelpText(
100
+ scorecards.command("evaluate <callId>").description("Evaluate an interaction with a scorecard").requiredOption("-s, --scorecard <id>", "Scorecard ID to use").option("--async", "Process evaluation asynchronously via queue").addHelpText(
101
101
  "after",
102
102
  `
103
103
  Examples:
104
104
  $ chanl scorecards evaluate call123 -s scorecard456
105
- $ chanl scorecards evaluate call123 -s scorecard456 --force`
105
+ $ chanl scorecards evaluate call123 -s scorecard456 --async`
106
106
  ).action(handleScorecardsEvaluate);
107
107
  scorecards.command("results <callId>").description("View evaluation results for a call").option("-s, --scorecard <id>", "Filter by scorecard ID").addHelpText(
108
108
  "after",
@@ -390,7 +390,7 @@ async function handleScorecardsEvaluate(callId, options) {
390
390
  try {
391
391
  const response = await sdk.scorecard.evaluate(callId, {
392
392
  scorecardId: options.scorecard,
393
- force: options.force
393
+ async: options.async
394
394
  });
395
395
  spinner.stop();
396
396
  if (!response.success || !response.data) {