@chanl/cli 2.0.3 → 2.0.4
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.test.js +31 -36
- package/dist/__tests__/cli.test.js.map +1 -1
- package/dist/commands/agents.js +7 -7
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/memory.js +3 -3
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/personas.js +3 -3
- package/dist/commands/personas.js.map +1 -1
- package/dist/commands/scenarios.js +2 -2
- package/dist/commands/scenarios.js.map +1 -1
- package/dist/commands/tools.js +5 -5
- package/dist/commands/tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/memory.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { confirm } from '@inquirer/prompts';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport type {\n Memory,\n MemorySearchResult,\n CreateMemoryInput,\n UpdateMemoryInput,\n SearchMemoryInput,\n MemoryEntityType,\n MemorySource,\n} from '@chanl/sdk';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printSuccess,\n printError,\n printInfo,\n printLabel,\n printBlank,\n printSimpleTable,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\n\n/**\n * Create the memory command group\n */\nexport function createMemoryCommand(): Command {\n const memory = new Command('memory').description('Manage agent memory');\n\n // memory list\n memory\n .command('list')\n .description('List memories with optional filters')\n .option('--entity-type <type>', 'Filter by entity type: customer, session, agent, conversation')\n .option('--entity-id <id>', 'Filter by entity ID')\n .option('--agent-id <id>', 'Filter by agent ID')\n .option('--source <source>', 'Filter by source: conversation, manual, extraction')\n .option('-l, --limit <number>', 'Items per page (default: 20)', '20')\n .option('-p, --page <number>', 'Page number (default: 1)', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory list # List all memories\n $ chanl memory list --entity-type customer # Filter by entity type\n $ chanl memory list --entity-id cust_123 --limit 10 # Filter by entity ID\n $ chanl memory list --agent-id agent_abc # Filter by agent\n $ chanl memory list --source manual # Filter by source\n $ chanl memory list --json # Output as JSON`\n )\n .action(handleMemoryList);\n\n // memory get <id>\n memory\n .command('get <id>')\n .description('Get detailed info about a memory')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory get 680a1b2c3d4e5f6789012345\n $ chanl memory get 680a1b2c3d4e5f6789012345 --json`\n )\n .action(handleMemoryGet);\n\n // memory create\n memory\n .command('create')\n .description('Create a new memory')\n .option('--entity-type <type>', 'Entity type: customer, session, agent, conversation')\n .option('--entity-id <id>', 'Entity ID')\n .option('--content <text>', 'Memory content text')\n .option('--agent-id <id>', 'Optional agent scope')\n .option('--source <source>', 'Source: conversation, manual, extraction')\n .option('--ttl <seconds>', 'Time-to-live in seconds')\n .option('-f, --file <path>', 'Path to JSON file with memory definition (overrides other options)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory create --entity-type customer --entity-id cust_123 --content \"Prefers email\"\n $ chanl memory create --entity-type customer --entity-id cust_123 --content \"VIP\" --source manual\n $ chanl memory create --entity-type customer --entity-id cust_123 --content \"Note\" --ttl 86400\n $ chanl memory create -f memory.json\n\nRequired (unless using -f):\n --entity-type Entity type\n --entity-id Entity ID\n --content Memory content text\n\nOptional:\n --agent-id Scope to a specific agent\n --source Memory source (sets metadata.source)\n --ttl TTL in seconds\n -f, --file JSON file (overrides all other options)`\n )\n .action(handleMemoryCreate);\n\n // memory update <id>\n memory\n .command('update <id>')\n .description('Update an existing memory')\n .option('--content <text>', 'Updated content text')\n .option('--deactivate', 'Deactivate the memory (sets isActive: false)')\n .option('--activate', 'Reactivate the memory (sets isActive: true)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory update 680a1b2c3d4e5f6789012345 --content \"Updated preference\"\n $ chanl memory update 680a1b2c3d4e5f6789012345 --deactivate\n $ chanl memory update 680a1b2c3d4e5f6789012345 --activate\n $ chanl memory update 680a1b2c3d4e5f6789012345 --content \"New text\" --deactivate`\n )\n .action(handleMemoryUpdate);\n\n // memory delete <id>\n memory\n .command('delete <id>')\n .description('Delete a memory permanently')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory delete 680a1b2c3d4e5f6789012345 # With confirmation\n $ chanl memory delete 680a1b2c3d4e5f6789012345 -y # Skip confirmation`\n )\n .action(handleMemoryDelete);\n\n // memory search\n memory\n .command('search')\n .description('Search memories using semantic similarity')\n .option('--entity-type <type>', 'Entity type (required): customer, session, agent, conversation')\n .option('--entity-id <id>', 'Entity ID (required)')\n .option('--query <text>', 'Search query text (required)')\n .option('--agent-id <id>', 'Optional agent scope filter')\n .option('-l, --limit <number>', 'Maximum results')\n .option('--min-score <number>', 'Minimum relevance score (0-1)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"email preferences\"\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"contact\" --limit 5\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"VIP\" --min-score 0.8\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"test\" --json`\n )\n .action(handleMemorySearch);\n\n return memory;\n}\n\n// ============================================================================\n// Helpers (module-local)\n// ============================================================================\n\n/**\n * Truncate a string to a max length, appending '...' if truncated\n */\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.substring(0, maxLen - 3) + '...';\n}\n\n// ============================================================================\n// Command Handlers\n// ============================================================================\n\n/**\n * Handle memory list command\n */\nasync function handleMemoryList(options: {\n entityType?: string;\n entityId?: string;\n agentId?: string;\n source?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching memories...').start();\n\n try {\n const response = await sdk.memory.list({\n entityType: options.entityType as MemoryEntityType | undefined,\n entityId: options.entityId,\n agentId: options.agentId,\n source: options.source as MemorySource | undefined,\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 memories', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { memories, total, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson({ memories, total, pagination });\n return;\n }\n\n if (memories.length === 0) {\n printInfo('No memories found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Entity Type', 'Entity ID', 'Content', 'Source', 'Active', 'Created'],\n memories.map((m: Memory) => [\n truncate(m.id, 12),\n m.entityType,\n m.entityId,\n truncate(m.content, 50),\n m.metadata?.source || 'unknown',\n m.isActive ? chalk.green('Yes') : chalk.red('No'),\n formatDate(m.createdAt),\n ])\n );\n\n printBlank();\n if (pagination) {\n printInfo(`Total: ${total} memories (Page ${pagination.page} of ${pagination.totalPages})`);\n } else {\n printInfo(`Total: ${total} memories`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch memories');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory get command\n */\nasync function handleMemoryGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching memory...').start();\n\n try {\n const response = await sdk.memory.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { memory } = response.data;\n\n if (isJsonOutput()) {\n printJson(memory);\n return;\n }\n\n printBlank();\n printMemoryDetails(memory);\n } catch (error) {\n spinner.fail('Failed to fetch memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory create command\n */\nasync function handleMemoryCreate(options: {\n entityType?: string;\n entityId?: string;\n content?: string;\n agentId?: string;\n source?: string;\n ttl?: string;\n file?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n let input: CreateMemoryInput;\n\n if (options.file) {\n // Read from JSON file\n try {\n const content = await readFile(options.file, 'utf-8');\n input = 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 } else {\n // Build from individual options\n if (!options.entityType || !options.entityId || !options.content) {\n printError(\n 'Missing required options',\n \"Provide --entity-type, --entity-id, and --content, or use '-f <path>' for JSON file\"\n );\n printInfo(\"Run 'chanl memory create --help' for usage\");\n process.exitCode = 1;\n return;\n }\n\n input = {\n entityType: options.entityType as MemoryEntityType,\n entityId: options.entityId,\n content: options.content,\n };\n\n if (options.agentId) {\n input.agentId = options.agentId;\n }\n\n if (options.source) {\n input.metadata = { ...input.metadata, source: options.source as MemorySource };\n }\n\n if (options.ttl) {\n const ttl = parseInt(options.ttl, 10);\n if (isNaN(ttl) || ttl <= 0) {\n printError('Invalid TTL value', 'TTL must be a positive number of seconds');\n process.exitCode = 1;\n return;\n }\n input.ttlSeconds = ttl;\n }\n }\n\n const spinner = ora('Creating memory...').start();\n\n try {\n const response = await sdk.memory.create(input);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { memory } = response.data;\n\n if (isJsonOutput()) {\n printJson({ success: true, memory });\n return;\n }\n\n printSuccess(`Created memory: ${memory.id}`);\n } catch (error) {\n spinner.fail('Failed to create memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory update command\n */\nasync function handleMemoryUpdate(\n id: string,\n options: {\n content?: string;\n deactivate?: boolean;\n activate?: boolean;\n }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const input: UpdateMemoryInput = {};\n\n if (options.content) {\n input.content = options.content;\n }\n\n if (options.deactivate) {\n input.isActive = false;\n }\n\n if (options.activate) {\n input.isActive = true;\n }\n\n if (!options.content && !options.deactivate && !options.activate) {\n printError('No updates specified', 'Provide --content, --deactivate, or --activate');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Updating memory...').start();\n\n try {\n const response = await sdk.memory.update(id, input);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { memory } = response.data;\n\n if (isJsonOutput()) {\n printJson({ success: true, memory });\n return;\n }\n\n printSuccess(`Updated memory: ${memory.id}`);\n } catch (error) {\n spinner.fail('Failed to update memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory delete command\n */\nasync function handleMemoryDelete(id: string, options: { yes?: boolean }): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // Confirm deletion unless --yes flag is provided\n if (!options.yes) {\n try {\n const confirmed = await confirm({\n message: `Are you sure you want to delete memory '${id}'?`,\n default: false,\n });\n\n if (!confirmed) {\n printInfo('Deletion cancelled');\n return;\n }\n } catch {\n // User cancelled (Ctrl+C)\n printBlank();\n printInfo('Deletion cancelled');\n return;\n }\n }\n\n const spinner = ora('Deleting memory...').start();\n\n try {\n const response = await sdk.memory.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson({ success: true, deleted: true, id });\n return;\n }\n\n printSuccess(`Deleted memory: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory search command\n */\nasync function handleMemorySearch(options: {\n entityType?: string;\n entityId?: string;\n query?: string;\n agentId?: string;\n limit?: string;\n minScore?: string;\n}): Promise<void> {\n if (!options.entityType || !options.entityId || !options.query) {\n printError('Missing required options', 'Provide --entity-type, --entity-id, and --query');\n printInfo(\"Run 'chanl memory search --help' for usage\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n const input: SearchMemoryInput = {\n entityType: options.entityType as MemoryEntityType,\n entityId: options.entityId,\n query: options.query,\n };\n\n if (options.agentId) {\n input.agentId = options.agentId;\n }\n\n if (options.limit) {\n input.limit = parseInt(options.limit, 10);\n }\n\n if (options.minScore) {\n input.minScore = parseFloat(options.minScore);\n }\n\n const spinner = ora('Searching memories...').start();\n\n try {\n const response = await sdk.memory.search(input);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to search memories', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { memories } = response.data;\n\n if (isJsonOutput()) {\n printJson({ memories });\n return;\n }\n\n if (memories.length === 0) {\n printInfo('No matching memories found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Score', 'Content', 'Entity Type', 'Entity ID'],\n memories.map((m: MemorySearchResult) => [\n truncate(m.id, 12),\n (m.score ?? 0).toFixed(2),\n truncate(m.content, 50),\n m.entityType,\n m.entityId,\n ])\n );\n\n printBlank();\n printInfo(`Found ${memories.length} matching memories`);\n } catch (error) {\n spinner.fail('Failed to search memories');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n// ============================================================================\n// Display Helpers\n// ============================================================================\n\n/**\n * Print memory details in formatted output\n */\nfunction printMemoryDetails(memory: Memory): void {\n printLabel('ID', memory.id);\n printLabel('Entity Type', memory.entityType);\n printLabel('Entity ID', memory.entityId);\n\n printBlank();\n printInfo('Content:');\n console.log(chalk.gray(memory.content));\n\n if (memory.agentId) {\n printBlank();\n printLabel('Agent ID', memory.agentId);\n }\n\n printBlank();\n printLabel('Active', memory.isActive ? chalk.green('Yes') : chalk.red('No'));\n\n if (memory.metadata && Object.keys(memory.metadata).length > 0) {\n printBlank();\n printInfo('Metadata:');\n console.log(chalk.gray(JSON.stringify(memory.metadata, null, 2)));\n }\n\n if (memory.expiresAt) {\n printLabel('Expires', formatDate(memory.expiresAt));\n }\n\n printBlank();\n printLabel('Created', formatDate(memory.createdAt));\n if (memory.updatedAt) {\n printLabel('Updated', formatDate(memory.updatedAt));\n }\n printBlank();\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/memory.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { readFile } from 'fs/promises';\nimport { confirm } from '@inquirer/prompts';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport type {\n Memory,\n MemorySearchResult,\n CreateMemoryInput,\n UpdateMemoryInput,\n SearchMemoryInput,\n MemoryEntityType,\n MemorySource,\n} from '@chanl/sdk';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printSuccess,\n printError,\n printInfo,\n printLabel,\n printBlank,\n printSimpleTable,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\n\n/**\n * Create the memory command group\n */\nexport function createMemoryCommand(): Command {\n const memory = new Command('memory').description('Manage agent memory');\n\n // memory list\n memory\n .command('list')\n .description('List memories with optional filters')\n .option('--entity-type <type>', 'Filter by entity type: customer, session, agent, conversation')\n .option('--entity-id <id>', 'Filter by entity ID')\n .option('--agent-id <id>', 'Filter by agent ID')\n .option('--source <source>', 'Filter by source: conversation, manual, extraction')\n .option('-l, --limit <number>', 'Items per page (default: 20)', '20')\n .option('-p, --page <number>', 'Page number (default: 1)', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory list # List all memories\n $ chanl memory list --entity-type customer # Filter by entity type\n $ chanl memory list --entity-id cust_123 --limit 10 # Filter by entity ID\n $ chanl memory list --agent-id agent_abc # Filter by agent\n $ chanl memory list --source manual # Filter by source\n $ chanl memory list --json # Output as JSON`\n )\n .action(handleMemoryList);\n\n // memory get <id>\n memory\n .command('get <id>')\n .description('Get detailed info about a memory')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory get 680a1b2c3d4e5f6789012345\n $ chanl memory get 680a1b2c3d4e5f6789012345 --json`\n )\n .action(handleMemoryGet);\n\n // memory create\n memory\n .command('create')\n .description('Create a new memory')\n .option('--entity-type <type>', 'Entity type: customer, session, agent, conversation')\n .option('--entity-id <id>', 'Entity ID')\n .option('--content <text>', 'Memory content text')\n .option('--agent-id <id>', 'Optional agent scope')\n .option('--source <source>', 'Source: conversation, manual, extraction')\n .option('--ttl <seconds>', 'Time-to-live in seconds')\n .option('-f, --file <path>', 'Path to JSON file with memory definition (overrides other options)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory create --entity-type customer --entity-id cust_123 --content \"Prefers email\"\n $ chanl memory create --entity-type customer --entity-id cust_123 --content \"VIP\" --source manual\n $ chanl memory create --entity-type customer --entity-id cust_123 --content \"Note\" --ttl 86400\n $ chanl memory create -f memory.json\n\nRequired (unless using -f):\n --entity-type Entity type\n --entity-id Entity ID\n --content Memory content text\n\nOptional:\n --agent-id Scope to a specific agent\n --source Memory source (sets metadata.source)\n --ttl TTL in seconds\n -f, --file JSON file (overrides all other options)`\n )\n .action(handleMemoryCreate);\n\n // memory update <id>\n memory\n .command('update <id>')\n .description('Update an existing memory')\n .option('--content <text>', 'Updated content text')\n .option('--deactivate', 'Deactivate the memory (sets isActive: false)')\n .option('--activate', 'Reactivate the memory (sets isActive: true)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory update 680a1b2c3d4e5f6789012345 --content \"Updated preference\"\n $ chanl memory update 680a1b2c3d4e5f6789012345 --deactivate\n $ chanl memory update 680a1b2c3d4e5f6789012345 --activate\n $ chanl memory update 680a1b2c3d4e5f6789012345 --content \"New text\" --deactivate`\n )\n .action(handleMemoryUpdate);\n\n // memory delete <id>\n memory\n .command('delete <id>')\n .description('Delete a memory permanently')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory delete 680a1b2c3d4e5f6789012345 # With confirmation\n $ chanl memory delete 680a1b2c3d4e5f6789012345 -y # Skip confirmation`\n )\n .action(handleMemoryDelete);\n\n // memory search\n memory\n .command('search')\n .description('Search memories using semantic similarity')\n .option('--entity-type <type>', 'Entity type (required): customer, session, agent, conversation')\n .option('--entity-id <id>', 'Entity ID (required)')\n .option('--query <text>', 'Search query text (required)')\n .option('--agent-id <id>', 'Optional agent scope filter')\n .option('-l, --limit <number>', 'Maximum results')\n .option('--min-score <number>', 'Minimum relevance score (0-1)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"email preferences\"\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"contact\" --limit 5\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"VIP\" --min-score 0.8\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"test\" --json`\n )\n .action(handleMemorySearch);\n\n return memory;\n}\n\n// ============================================================================\n// Helpers (module-local)\n// ============================================================================\n\n/**\n * Truncate a string to a max length, appending '...' if truncated\n */\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return str.substring(0, maxLen - 3) + '...';\n}\n\n// ============================================================================\n// Command Handlers\n// ============================================================================\n\n/**\n * Handle memory list command\n */\nasync function handleMemoryList(options: {\n entityType?: string;\n entityId?: string;\n agentId?: string;\n source?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching memories...').start();\n\n try {\n const response = await sdk.memory.list({\n entityType: options.entityType as MemoryEntityType | undefined,\n entityId: options.entityId,\n agentId: options.agentId,\n source: options.source as MemorySource | undefined,\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 memories', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { memories, total, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson({ memories, total, pagination });\n return;\n }\n\n if (memories.length === 0) {\n printInfo('No memories found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Entity Type', 'Entity ID', 'Content', 'Source', 'Active', 'Created'],\n memories.map((m: Memory) => [\n truncate(m.id, 12),\n m.entityType,\n m.entityId,\n truncate(m.content, 50),\n m.metadata?.source || 'unknown',\n m.isActive ? chalk.green('Yes') : chalk.red('No'),\n formatDate(m.createdAt),\n ])\n );\n\n printBlank();\n if (pagination) {\n printInfo(`Total: ${total} memories (Page ${pagination.page} of ${pagination.totalPages})`);\n } else {\n printInfo(`Total: ${total} memories`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch memories');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory get command\n */\nasync function handleMemoryGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching memory...').start();\n\n try {\n const response = await sdk.memory.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n const memory = response.data;\n\n if (isJsonOutput()) {\n printJson(memory);\n return;\n }\n\n printBlank();\n printMemoryDetails(memory);\n } catch (error) {\n spinner.fail('Failed to fetch memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory create command\n */\nasync function handleMemoryCreate(options: {\n entityType?: string;\n entityId?: string;\n content?: string;\n agentId?: string;\n source?: string;\n ttl?: string;\n file?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n let input: CreateMemoryInput;\n\n if (options.file) {\n // Read from JSON file\n try {\n const content = await readFile(options.file, 'utf-8');\n input = 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 } else {\n // Build from individual options\n if (!options.entityType || !options.entityId || !options.content) {\n printError(\n 'Missing required options',\n \"Provide --entity-type, --entity-id, and --content, or use '-f <path>' for JSON file\"\n );\n printInfo(\"Run 'chanl memory create --help' for usage\");\n process.exitCode = 1;\n return;\n }\n\n input = {\n entityType: options.entityType as MemoryEntityType,\n entityId: options.entityId,\n content: options.content,\n };\n\n if (options.agentId) {\n input.agentId = options.agentId;\n }\n\n if (options.source) {\n input.metadata = { ...input.metadata, source: options.source as MemorySource };\n }\n\n if (options.ttl) {\n const ttl = parseInt(options.ttl, 10);\n if (isNaN(ttl) || ttl <= 0) {\n printError('Invalid TTL value', 'TTL must be a positive number of seconds');\n process.exitCode = 1;\n return;\n }\n input.ttlSeconds = ttl;\n }\n }\n\n const spinner = ora('Creating memory...').start();\n\n try {\n const response = await sdk.memory.create(input);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n const memory = response.data;\n\n if (isJsonOutput()) {\n printJson({ success: true, memory });\n return;\n }\n\n printSuccess(`Created memory: ${memory.id}`);\n } catch (error) {\n spinner.fail('Failed to create memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory update command\n */\nasync function handleMemoryUpdate(\n id: string,\n options: {\n content?: string;\n deactivate?: boolean;\n activate?: boolean;\n }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const input: UpdateMemoryInput = {};\n\n if (options.content) {\n input.content = options.content;\n }\n\n if (options.deactivate) {\n input.isActive = false;\n }\n\n if (options.activate) {\n input.isActive = true;\n }\n\n if (!options.content && !options.deactivate && !options.activate) {\n printError('No updates specified', 'Provide --content, --deactivate, or --activate');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Updating memory...').start();\n\n try {\n const response = await sdk.memory.update(id, input);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n const memory = response.data;\n\n if (isJsonOutput()) {\n printJson({ success: true, memory });\n return;\n }\n\n printSuccess(`Updated memory: ${memory.id}`);\n } catch (error) {\n spinner.fail('Failed to update memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory delete command\n */\nasync function handleMemoryDelete(id: string, options: { yes?: boolean }): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // Confirm deletion unless --yes flag is provided\n if (!options.yes) {\n try {\n const confirmed = await confirm({\n message: `Are you sure you want to delete memory '${id}'?`,\n default: false,\n });\n\n if (!confirmed) {\n printInfo('Deletion cancelled');\n return;\n }\n } catch {\n // User cancelled (Ctrl+C)\n printBlank();\n printInfo('Deletion cancelled');\n return;\n }\n }\n\n const spinner = ora('Deleting memory...').start();\n\n try {\n const response = await sdk.memory.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete memory', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson({ success: true, deleted: true, id });\n return;\n }\n\n printSuccess(`Deleted memory: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete memory');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle memory search command\n */\nasync function handleMemorySearch(options: {\n entityType?: string;\n entityId?: string;\n query?: string;\n agentId?: string;\n limit?: string;\n minScore?: string;\n}): Promise<void> {\n if (!options.entityType || !options.entityId || !options.query) {\n printError('Missing required options', 'Provide --entity-type, --entity-id, and --query');\n printInfo(\"Run 'chanl memory search --help' for usage\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n const input: SearchMemoryInput = {\n entityType: options.entityType as MemoryEntityType,\n entityId: options.entityId,\n query: options.query,\n };\n\n if (options.agentId) {\n input.agentId = options.agentId;\n }\n\n if (options.limit) {\n input.limit = parseInt(options.limit, 10);\n }\n\n if (options.minScore) {\n input.minScore = parseFloat(options.minScore);\n }\n\n const spinner = ora('Searching memories...').start();\n\n try {\n const response = await sdk.memory.search(input);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to search memories', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { memories } = response.data;\n\n if (isJsonOutput()) {\n printJson({ memories });\n return;\n }\n\n if (memories.length === 0) {\n printInfo('No matching memories found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Score', 'Content', 'Entity Type', 'Entity ID'],\n memories.map((m: MemorySearchResult) => [\n truncate(m.id, 12),\n (m.score ?? 0).toFixed(2),\n truncate(m.content, 50),\n m.entityType,\n m.entityId,\n ])\n );\n\n printBlank();\n printInfo(`Found ${memories.length} matching memories`);\n } catch (error) {\n spinner.fail('Failed to search memories');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n// ============================================================================\n// Display Helpers\n// ============================================================================\n\n/**\n * Print memory details in formatted output\n */\nfunction printMemoryDetails(memory: Memory): void {\n printLabel('ID', memory.id);\n printLabel('Entity Type', memory.entityType);\n printLabel('Entity ID', memory.entityId);\n\n printBlank();\n printInfo('Content:');\n console.log(chalk.gray(memory.content));\n\n if (memory.agentId) {\n printBlank();\n printLabel('Agent ID', memory.agentId);\n }\n\n printBlank();\n printLabel('Active', memory.isActive ? chalk.green('Yes') : chalk.red('No'));\n\n if (memory.metadata && Object.keys(memory.metadata).length > 0) {\n printBlank();\n printInfo('Metadata:');\n console.log(chalk.gray(JSON.stringify(memory.metadata, null, 2)));\n }\n\n if (memory.expiresAt) {\n printLabel('Expires', formatDate(memory.expiresAt));\n }\n\n printBlank();\n printLabel('Created', formatDate(memory.createdAt));\n if (memory.updatedAt) {\n printLabel('Updated', formatDate(memory.updatedAt));\n }\n printBlank();\n}\n"],"mappings":"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","names":[]}
|
|
@@ -202,7 +202,7 @@ async function handlePersonasGet(id) {
|
|
|
202
202
|
printJson(response.data);
|
|
203
203
|
return;
|
|
204
204
|
}
|
|
205
|
-
const
|
|
205
|
+
const persona = response.data;
|
|
206
206
|
printBlank();
|
|
207
207
|
console.log(chalk.bold("Persona Details:"));
|
|
208
208
|
console.log(` ID: ${persona.id}`);
|
|
@@ -272,7 +272,7 @@ async function handlePersonasCreate(options) {
|
|
|
272
272
|
printJson(response.data);
|
|
273
273
|
return;
|
|
274
274
|
}
|
|
275
|
-
const
|
|
275
|
+
const persona = response.data;
|
|
276
276
|
printSuccess(`Persona created: ${persona.name}`);
|
|
277
277
|
printLabel("ID", persona.id);
|
|
278
278
|
} catch (error) {
|
|
@@ -313,7 +313,7 @@ async function handlePersonasUpdate(id, options) {
|
|
|
313
313
|
printJson(response.data);
|
|
314
314
|
return;
|
|
315
315
|
}
|
|
316
|
-
const
|
|
316
|
+
const persona = response.data;
|
|
317
317
|
printSuccess(`Persona updated: ${persona.name}`);
|
|
318
318
|
} catch (error) {
|
|
319
319
|
spinner.fail("Failed to update persona");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/personas.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport type { Persona, CreatePersonaData } from '@chanl/sdk';\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 personas command group\n */\nexport function createPersonasCommand(): Command {\n const personas = new Command('personas')\n .description('Manage test personas for scenario simulations')\n .addHelpText(\n 'after',\n `\nWhat are Personas?\n Personas represent simulated callers with specific voice, emotion, and\n behavior characteristics. They are used in scenario testing to simulate\n realistic customer interactions.\n\nQuick Start:\n $ chanl personas list # List all personas\n $ chanl personas get <id> # View persona details\n $ chanl personas create --template # Generate template JSON\n $ chanl personas create -f persona.json # Create from file\n $ chanl personas delete <id> # Delete a persona\n\nPersona Characteristics:\n - Voice: gender, accent, speech style, clarity\n - Emotion: friendly, frustrated, calm, stressed, etc.\n - Behavior: interruption patterns, cooperation level\n - Environment: background noise, connection quality`\n );\n\n // personas list\n personas\n .command('list')\n .description('List all personas')\n .option('-l, --language <lang>', 'Filter by language (english, spanish, portuguese)')\n .option('--active', 'Show only active personas')\n .option('--limit <number>', 'Number of items per page', '20')\n .option('-p, --page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas list # List all personas\n $ chanl personas list --language english # Filter by language\n $ chanl personas list --active # Only active personas\n $ chanl personas list --json # Output as JSON`\n )\n .action(handlePersonasList);\n\n // personas get <id>\n personas\n .command('get <id>')\n .description('Get persona details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas get abc123 # Get persona details\n $ chanl personas get abc123 --json # Output as JSON`\n )\n .action(handlePersonasGet);\n\n // personas create\n personas\n .command('create')\n .description('Create a new persona')\n .option('-f, --file <path>', 'Path to JSON file with persona data')\n .option('--template', 'Output a template JSON file to stdout')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas create --template > persona.json # Get template\n $ chanl personas create -f persona.json # Create from file\n\nTemplate contains all required and optional fields with example values.\nEdit the template and use 'create -f' to create your persona.`\n )\n .action(handlePersonasCreate);\n\n // personas update <id>\n personas\n .command('update <id>')\n .description('Update an existing persona')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas update abc123 -f updates.json # Update from file\n\nThe update file should contain only the fields you want to change.`\n )\n .action(handlePersonasUpdate);\n\n // personas delete <id>\n personas\n .command('delete <id>')\n .description('Delete a persona')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas delete abc123 # Delete with confirmation\n $ chanl personas delete abc123 --yes # Delete without confirmation`\n )\n .action(handlePersonasDelete);\n\n return personas;\n}\n\n/**\n * Format emotion with color\n */\nfunction formatEmotion(emotion?: string): string {\n const colors: Record<string, (s: string) => string> = {\n friendly: chalk.green,\n calm: chalk.green,\n polite: chalk.green,\n neutral: chalk.gray,\n curious: chalk.cyan,\n distracted: chalk.yellow,\n concerned: chalk.yellow,\n stressed: chalk.yellow,\n annoyed: chalk.red,\n frustrated: chalk.red,\n irritated: chalk.red,\n };\n const colorFn = colors[emotion || ''] || chalk.gray;\n return colorFn(emotion || 'unknown');\n}\n\n/**\n * Get persona template\n */\nfunction getPersonaTemplate(): CreatePersonaData {\n return {\n name: 'Example Persona',\n gender: 'female',\n emotion: 'friendly',\n language: 'english',\n accent: 'american',\n intentClarity: 'very clear',\n speechStyle: 'normal',\n backgroundNoise: false,\n allowInterruptions: true,\n description: 'A helpful and friendly customer',\n backstory:\n 'Sarah is a regular customer who values good service. She is calling about a recent order.',\n variables: {\n accountNumber: '12345',\n orderNumber: 'ORD-2024-001',\n },\n tags: ['customer-service', 'order-inquiry'],\n behavior: {\n personality: 'cooperative',\n emotionalState: 'calm',\n cooperationLevel: 'high',\n patience: 'moderate',\n communicationStyle: 'direct',\n },\n conversationTraits: {\n allowInterruptions: true,\n interruptionFrequency: 'low',\n asksClarifyingQuestions: true,\n repeatsInformation: false,\n goesOffTopic: false,\n },\n environment: {\n backgroundNoise: false,\n noiseType: 'none',\n connectionQuality: 'excellent',\n },\n };\n}\n\n/**\n * Handle personas list command\n */\nasync function handlePersonasList(options: {\n language?: string;\n active?: boolean;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching personas...').start();\n\n try {\n const response = await sdk.personas.list({\n language: options.language,\n isActive: options.active,\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 personas', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { personas, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (personas.length === 0) {\n printInfo('No personas found');\n printInfo(\"Use 'chanl personas create --template' to create one\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Emotion', 'Language', 'Accent', 'Speech', 'Active'],\n personas.map((p: Persona) => [\n p.id.slice(-12),\n p.name.slice(0, 20),\n formatEmotion(p.emotion),\n p.language || '-',\n p.accent || '-',\n p.speechStyle || '-',\n p.isActive ? chalk.green('yes') : chalk.gray('no'),\n ])\n );\n\n printBlank();\n if (pagination) {\n printInfo(`Total: ${pagination.total} personas (Page ${pagination.page} of ${pagination.totalPages})`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch personas');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas get command\n */\nasync function handlePersonasGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching persona...').start();\n\n try {\n const response = await sdk.personas.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch persona', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const { persona } = response.data;\n printBlank();\n console.log(chalk.bold('Persona Details:'));\n console.log(` ID: ${persona.id}`);\n console.log(` Name: ${persona.name}`);\n console.log(` Gender: ${persona.gender || '-'}`);\n console.log(` Emotion: ${formatEmotion(persona.emotion)}`);\n console.log(` Language: ${persona.language || '-'}`);\n console.log(` Accent: ${persona.accent || '-'}`);\n console.log(` Speech Style: ${persona.speechStyle || '-'}`);\n console.log(` Intent Clarity: ${persona.intentClarity || '-'}`);\n console.log(` Active: ${persona.isActive ? chalk.green('yes') : chalk.gray('no')}`);\n console.log(` Default: ${persona.isDefault ? chalk.cyan('yes') : chalk.gray('no')}`);\n\n if (persona.description) {\n console.log(`\\n Description:`);\n console.log(` ${persona.description}`);\n }\n\n if (persona.backstory) {\n console.log(`\\n Backstory:`);\n console.log(` ${persona.backstory}`);\n }\n\n console.log(`\\n Created: ${formatDate(persona.createdAt)}`);\n console.log(` Updated: ${formatDate(persona.updatedAt)}`);\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch persona');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas create command\n */\nasync function handlePersonasCreate(options: {\n file?: string;\n template?: boolean;\n}): Promise<void> {\n // Handle template output\n if (options.template) {\n const template = getPersonaTemplate();\n console.log(JSON.stringify(template, null, 2));\n return;\n }\n\n // Require file for actual creation\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify persona data or '--template' to get a template\");\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 personaData: CreatePersonaData;\n try {\n const content = readFileSync(options.file, 'utf-8');\n personaData = 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 persona...').start();\n\n try {\n const response = await sdk.personas.create(personaData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create persona', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const { persona } = response.data;\n printSuccess(`Persona created: ${persona.name}`);\n printLabel('ID', persona.id);\n } catch (error) {\n spinner.fail('Failed to create persona');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas update command\n */\nasync function handlePersonasUpdate(\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: Partial<CreatePersonaData>;\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 persona...').start();\n\n try {\n const response = await sdk.personas.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update persona', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const { persona } = response.data;\n printSuccess(`Persona updated: ${persona.name}`);\n } catch (error) {\n spinner.fail('Failed to update persona');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas delete command\n */\nasync function handlePersonasDelete(\n id: string,\n options: { yes?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // Confirm deletion unless --yes flag\n if (!options.yes) {\n printInfo(`About to delete persona: ${id}`);\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n // In a real CLI we'd prompt for confirmation\n // For now, just proceed\n }\n\n const spinner = ora('Deleting persona...').start();\n\n try {\n const response = await sdk.personas.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete persona', 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(`Persona deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete persona');\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/personas.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport type { Persona, CreatePersonaData } from '@chanl/sdk';\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 personas command group\n */\nexport function createPersonasCommand(): Command {\n const personas = new Command('personas')\n .description('Manage test personas for scenario simulations')\n .addHelpText(\n 'after',\n `\nWhat are Personas?\n Personas represent simulated callers with specific voice, emotion, and\n behavior characteristics. They are used in scenario testing to simulate\n realistic customer interactions.\n\nQuick Start:\n $ chanl personas list # List all personas\n $ chanl personas get <id> # View persona details\n $ chanl personas create --template # Generate template JSON\n $ chanl personas create -f persona.json # Create from file\n $ chanl personas delete <id> # Delete a persona\n\nPersona Characteristics:\n - Voice: gender, accent, speech style, clarity\n - Emotion: friendly, frustrated, calm, stressed, etc.\n - Behavior: interruption patterns, cooperation level\n - Environment: background noise, connection quality`\n );\n\n // personas list\n personas\n .command('list')\n .description('List all personas')\n .option('-l, --language <lang>', 'Filter by language (english, spanish, portuguese)')\n .option('--active', 'Show only active personas')\n .option('--limit <number>', 'Number of items per page', '20')\n .option('-p, --page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas list # List all personas\n $ chanl personas list --language english # Filter by language\n $ chanl personas list --active # Only active personas\n $ chanl personas list --json # Output as JSON`\n )\n .action(handlePersonasList);\n\n // personas get <id>\n personas\n .command('get <id>')\n .description('Get persona details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas get abc123 # Get persona details\n $ chanl personas get abc123 --json # Output as JSON`\n )\n .action(handlePersonasGet);\n\n // personas create\n personas\n .command('create')\n .description('Create a new persona')\n .option('-f, --file <path>', 'Path to JSON file with persona data')\n .option('--template', 'Output a template JSON file to stdout')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas create --template > persona.json # Get template\n $ chanl personas create -f persona.json # Create from file\n\nTemplate contains all required and optional fields with example values.\nEdit the template and use 'create -f' to create your persona.`\n )\n .action(handlePersonasCreate);\n\n // personas update <id>\n personas\n .command('update <id>')\n .description('Update an existing persona')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas update abc123 -f updates.json # Update from file\n\nThe update file should contain only the fields you want to change.`\n )\n .action(handlePersonasUpdate);\n\n // personas delete <id>\n personas\n .command('delete <id>')\n .description('Delete a persona')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl personas delete abc123 # Delete with confirmation\n $ chanl personas delete abc123 --yes # Delete without confirmation`\n )\n .action(handlePersonasDelete);\n\n return personas;\n}\n\n/**\n * Format emotion with color\n */\nfunction formatEmotion(emotion?: string): string {\n const colors: Record<string, (s: string) => string> = {\n friendly: chalk.green,\n calm: chalk.green,\n polite: chalk.green,\n neutral: chalk.gray,\n curious: chalk.cyan,\n distracted: chalk.yellow,\n concerned: chalk.yellow,\n stressed: chalk.yellow,\n annoyed: chalk.red,\n frustrated: chalk.red,\n irritated: chalk.red,\n };\n const colorFn = colors[emotion || ''] || chalk.gray;\n return colorFn(emotion || 'unknown');\n}\n\n/**\n * Get persona template\n */\nfunction getPersonaTemplate(): CreatePersonaData {\n return {\n name: 'Example Persona',\n gender: 'female',\n emotion: 'friendly',\n language: 'english',\n accent: 'american',\n intentClarity: 'very clear',\n speechStyle: 'normal',\n backgroundNoise: false,\n allowInterruptions: true,\n description: 'A helpful and friendly customer',\n backstory:\n 'Sarah is a regular customer who values good service. She is calling about a recent order.',\n variables: {\n accountNumber: '12345',\n orderNumber: 'ORD-2024-001',\n },\n tags: ['customer-service', 'order-inquiry'],\n behavior: {\n personality: 'cooperative',\n emotionalState: 'calm',\n cooperationLevel: 'high',\n patience: 'moderate',\n communicationStyle: 'direct',\n },\n conversationTraits: {\n allowInterruptions: true,\n interruptionFrequency: 'low',\n asksClarifyingQuestions: true,\n repeatsInformation: false,\n goesOffTopic: false,\n },\n environment: {\n backgroundNoise: false,\n noiseType: 'none',\n connectionQuality: 'excellent',\n },\n };\n}\n\n/**\n * Handle personas list command\n */\nasync function handlePersonasList(options: {\n language?: string;\n active?: boolean;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching personas...').start();\n\n try {\n const response = await sdk.personas.list({\n language: options.language,\n isActive: options.active,\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 personas', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { personas, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (personas.length === 0) {\n printInfo('No personas found');\n printInfo(\"Use 'chanl personas create --template' to create one\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Emotion', 'Language', 'Accent', 'Speech', 'Active'],\n personas.map((p: Persona) => [\n p.id.slice(-12),\n p.name.slice(0, 20),\n formatEmotion(p.emotion),\n p.language || '-',\n p.accent || '-',\n p.speechStyle || '-',\n p.isActive ? chalk.green('yes') : chalk.gray('no'),\n ])\n );\n\n printBlank();\n if (pagination) {\n printInfo(`Total: ${pagination.total} personas (Page ${pagination.page} of ${pagination.totalPages})`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch personas');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas get command\n */\nasync function handlePersonasGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching persona...').start();\n\n try {\n const response = await sdk.personas.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch persona', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const persona = response.data;\n printBlank();\n console.log(chalk.bold('Persona Details:'));\n console.log(` ID: ${persona.id}`);\n console.log(` Name: ${persona.name}`);\n console.log(` Gender: ${persona.gender || '-'}`);\n console.log(` Emotion: ${formatEmotion(persona.emotion)}`);\n console.log(` Language: ${persona.language || '-'}`);\n console.log(` Accent: ${persona.accent || '-'}`);\n console.log(` Speech Style: ${persona.speechStyle || '-'}`);\n console.log(` Intent Clarity: ${persona.intentClarity || '-'}`);\n console.log(` Active: ${persona.isActive ? chalk.green('yes') : chalk.gray('no')}`);\n console.log(` Default: ${persona.isDefault ? chalk.cyan('yes') : chalk.gray('no')}`);\n\n if (persona.description) {\n console.log(`\\n Description:`);\n console.log(` ${persona.description}`);\n }\n\n if (persona.backstory) {\n console.log(`\\n Backstory:`);\n console.log(` ${persona.backstory}`);\n }\n\n console.log(`\\n Created: ${formatDate(persona.createdAt)}`);\n console.log(` Updated: ${formatDate(persona.updatedAt)}`);\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch persona');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas create command\n */\nasync function handlePersonasCreate(options: {\n file?: string;\n template?: boolean;\n}): Promise<void> {\n // Handle template output\n if (options.template) {\n const template = getPersonaTemplate();\n console.log(JSON.stringify(template, null, 2));\n return;\n }\n\n // Require file for actual creation\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify persona data or '--template' to get a template\");\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 personaData: CreatePersonaData;\n try {\n const content = readFileSync(options.file, 'utf-8');\n personaData = 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 persona...').start();\n\n try {\n const response = await sdk.personas.create(personaData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create persona', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const persona = response.data;\n printSuccess(`Persona created: ${persona.name}`);\n printLabel('ID', persona.id);\n } catch (error) {\n spinner.fail('Failed to create persona');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas update command\n */\nasync function handlePersonasUpdate(\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: Partial<CreatePersonaData>;\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 persona...').start();\n\n try {\n const response = await sdk.personas.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update persona', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const persona = response.data;\n printSuccess(`Persona updated: ${persona.name}`);\n } catch (error) {\n spinner.fail('Failed to update persona');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle personas delete command\n */\nasync function handlePersonasDelete(\n id: string,\n options: { yes?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // Confirm deletion unless --yes flag\n if (!options.yes) {\n printInfo(`About to delete persona: ${id}`);\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n // In a real CLI we'd prompt for confirmation\n // For now, just proceed\n }\n\n const spinner = ora('Deleting persona...').start();\n\n try {\n const response = await sdk.personas.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete persona', 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(`Persona deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete persona');\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":[]}
|
|
@@ -169,7 +169,7 @@ async function handleScenariosGet(id) {
|
|
|
169
169
|
printJson(response.data);
|
|
170
170
|
return;
|
|
171
171
|
}
|
|
172
|
-
const
|
|
172
|
+
const scenario = response.data;
|
|
173
173
|
printBlank();
|
|
174
174
|
console.log(chalk.bold("Scenario Details:"));
|
|
175
175
|
console.log(` Name: ${scenario.name}`);
|
|
@@ -468,7 +468,7 @@ async function handleScenariosExecution(executionId) {
|
|
|
468
468
|
printJson(response.data);
|
|
469
469
|
return;
|
|
470
470
|
}
|
|
471
|
-
const
|
|
471
|
+
const execution = response.data;
|
|
472
472
|
printBlank();
|
|
473
473
|
printExecutionDetails(execution);
|
|
474
474
|
} catch (error) {
|
|
@@ -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,EAAE,SAAS,IAAI,SAAS;AAC9B,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,EAAE,UAAU,IAAI,SAAS;AAC/B,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 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":[]}
|
package/dist/commands/tools.js
CHANGED
|
@@ -209,7 +209,7 @@ async function handleToolsGet(id) {
|
|
|
209
209
|
process.exitCode = 1;
|
|
210
210
|
return;
|
|
211
211
|
}
|
|
212
|
-
const
|
|
212
|
+
const tool = response.data;
|
|
213
213
|
if (isJsonOutput()) {
|
|
214
214
|
printJson(tool);
|
|
215
215
|
return;
|
|
@@ -262,7 +262,7 @@ async function handleToolsCreate(options) {
|
|
|
262
262
|
process.exitCode = 1;
|
|
263
263
|
return;
|
|
264
264
|
}
|
|
265
|
-
const
|
|
265
|
+
const tool = response.data;
|
|
266
266
|
if (isJsonOutput()) {
|
|
267
267
|
printJson({ success: true, tool });
|
|
268
268
|
return;
|
|
@@ -297,7 +297,7 @@ async function handleToolsUpdate(id, options) {
|
|
|
297
297
|
process.exitCode = 1;
|
|
298
298
|
return;
|
|
299
299
|
}
|
|
300
|
-
const
|
|
300
|
+
const tool = response.data;
|
|
301
301
|
if (isJsonOutput()) {
|
|
302
302
|
printJson({ success: true, tool });
|
|
303
303
|
return;
|
|
@@ -474,7 +474,7 @@ async function handleToolsEnable(id) {
|
|
|
474
474
|
process.exitCode = 1;
|
|
475
475
|
return;
|
|
476
476
|
}
|
|
477
|
-
const
|
|
477
|
+
const tool = response.data;
|
|
478
478
|
if (isJsonOutput()) {
|
|
479
479
|
printJson({ success: true, tool });
|
|
480
480
|
return;
|
|
@@ -499,7 +499,7 @@ async function handleToolsDisable(id) {
|
|
|
499
499
|
process.exitCode = 1;
|
|
500
500
|
return;
|
|
501
501
|
}
|
|
502
|
-
const
|
|
502
|
+
const tool = response.data;
|
|
503
503
|
if (isJsonOutput()) {
|
|
504
504
|
printJson({ success: true, tool });
|
|
505
505
|
return;
|