@chanl/cli 2.0.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/agents.test.js +574 -0
- package/dist/__tests__/agents.test.js.map +1 -0
- package/dist/__tests__/auth.test.d.ts +2 -0
- package/dist/__tests__/auth.test.js +87 -0
- package/dist/__tests__/auth.test.js.map +1 -0
- package/dist/__tests__/calls.test.d.ts +2 -0
- package/dist/__tests__/calls.test.js +115 -0
- package/dist/__tests__/calls.test.js.map +1 -0
- package/dist/__tests__/chat.test.d.ts +2 -0
- package/dist/__tests__/chat.test.js +357 -0
- package/dist/__tests__/chat.test.js.map +1 -0
- package/dist/__tests__/cli-base.test.d.ts +2 -0
- package/dist/__tests__/cli-base.test.js +87 -0
- package/dist/__tests__/cli-base.test.js.map +1 -0
- package/dist/__tests__/cli-missing.test.d.ts +2 -0
- package/dist/__tests__/cli-missing.test.js +546 -0
- package/dist/__tests__/cli-missing.test.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +234 -0
- package/dist/__tests__/helpers.js +314 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/mcp.test.d.ts +2 -0
- package/dist/__tests__/mcp.test.js +470 -0
- package/dist/__tests__/mcp.test.js.map +1 -0
- package/dist/__tests__/prompts.test.d.ts +2 -0
- package/dist/__tests__/prompts.test.js +227 -0
- package/dist/__tests__/prompts.test.js.map +1 -0
- package/dist/__tests__/scenarios.test.d.ts +2 -0
- package/dist/__tests__/scenarios.test.js +270 -0
- package/dist/__tests__/scenarios.test.js.map +1 -0
- package/dist/__tests__/tools.test.d.ts +2 -0
- package/dist/__tests__/tools.test.js +331 -0
- package/dist/__tests__/tools.test.js.map +1 -0
- package/dist/__tests__/toolsets.test.d.ts +2 -0
- package/dist/__tests__/toolsets.test.js +196 -0
- package/dist/__tests__/toolsets.test.js.map +1 -0
- package/dist/__tests__/workspaces.test.d.ts +2 -0
- package/dist/__tests__/workspaces.test.js +155 -0
- package/dist/__tests__/workspaces.test.js.map +1 -0
- package/dist/commands/agents.js +103 -13
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/chat.js +2 -2
- package/dist/commands/chat.js.map +1 -1
- package/dist/commands/config.js +24 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/memory.js +137 -4
- 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/prompts.js +148 -1
- package/dist/commands/prompts.js.map +1 -1
- package/dist/commands/scenarios.js +2 -2
- package/dist/commands/scenarios.js.map +1 -1
- package/dist/commands/scorecards.js +3 -3
- package/dist/commands/scorecards.js.map +1 -1
- package/dist/commands/tools.js +5 -5
- package/dist/commands/tools.js.map +1 -1
- package/dist/utils/config-store.d.ts +8 -0
- package/dist/utils/config-store.js +18 -1
- package/dist/utils/config-store.js.map +1 -1
- package/dist/utils/sdk-factory.js +15 -3
- package/dist/utils/sdk-factory.js.map +1 -1
- package/package.json +4 -4
- package/dist/__tests__/cli.test.js +0 -2313
- package/dist/__tests__/cli.test.js.map +0 -1
- /package/dist/__tests__/{cli.test.d.ts → agents.test.d.ts} +0 -0
|
@@ -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 GlobalSearchMemoryInput,\n MemoryStats,\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 .option('--min-confidence <number>', 'Minimum extraction confidence (0-1)')\n .option('--created-after <iso>', 'Only memories created at/after this ISO-8601 timestamp')\n .option('--created-before <iso>', 'Only memories created at/before this ISO-8601 timestamp')\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 \"recent\" --created-after 2026-05-01T00:00:00Z\n $ chanl memory search --entity-type customer --entity-id cust_123 --query \"test\" --json`\n )\n .action(handleMemorySearch);\n\n // memory search-global\n memory\n .command('search-global')\n .description('Search ALL memories in the workspace (no entity scope)')\n .option('--query <text>', 'Search query text (required)')\n .option('--entity-type <type>', 'Optional: narrow to an entity type')\n .option('--agent-id <id>', 'Optional agent scope filter')\n .option('--source <source>', 'Filter by source: conversation, manual, extraction')\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-global --query \"billing preferences\"\n $ chanl memory search-global --query \"VIP\" --entity-type customer --limit 10\n $ chanl memory search-global --query \"test\" --json`\n )\n .action(handleMemorySearchGlobal);\n\n // memory stats\n memory\n .command('stats')\n .description('Aggregate memory statistics (totals, by type/source, top-accessed)')\n .option('--entity-type <type>', 'Optionally scope stats to an entity type')\n .option('--entity-id <id>', 'Optionally scope stats to an entity ID')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl memory stats # Workspace-wide\n $ chanl memory stats --entity-type customer --entity-id cust_123\n $ chanl memory stats --json`\n )\n .action(handleMemoryStats);\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 minConfidence?: string;\n createdAfter?: string;\n createdBefore?: 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 if (options.minConfidence) {\n input.minConfidence = parseFloat(options.minConfidence);\n }\n\n if (options.createdAfter) {\n input.createdAfter = options.createdAfter;\n }\n\n if (options.createdBefore) {\n input.createdBefore = options.createdBefore;\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 * Handle memory search-global command\n */\nasync function handleMemorySearchGlobal(options: {\n query?: string;\n entityType?: string;\n agentId?: string;\n source?: string;\n limit?: string;\n minScore?: string;\n}): Promise<void> {\n if (!options.query) {\n printError('Missing required option', 'Provide --query');\n printInfo(\"Run 'chanl memory search-global --help' for usage\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n const input: GlobalSearchMemoryInput = { query: options.query };\n if (options.entityType) input.entityType = options.entityType as MemoryEntityType;\n if (options.agentId) input.agentId = options.agentId;\n if (options.source) input.source = options.source as MemorySource;\n if (options.limit) input.limit = parseInt(options.limit, 10);\n if (options.minScore) input.minScore = parseFloat(options.minScore);\n\n const spinner = ora('Searching all memories...').start();\n\n try {\n const response = await sdk.memory.searchGlobal(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 * Handle memory stats command\n */\nasync function handleMemoryStats(options: {\n entityType?: string;\n entityId?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Aggregating memory stats...').start();\n\n try {\n const response = await sdk.memory.stats({\n entityType: options.entityType as MemoryEntityType | undefined,\n entityId: options.entityId,\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch memory stats', response.message);\n process.exitCode = 1;\n return;\n }\n\n const stats: MemoryStats = response.data;\n\n if (isJsonOutput()) {\n printJson(stats);\n return;\n }\n\n printBlank();\n printLabel('Total', String(stats.total));\n printLabel('Active', chalk.green(String(stats.active)));\n printLabel('Inactive', String(stats.inactive));\n printLabel('Expired', stats.expired > 0 ? chalk.yellow(String(stats.expired)) : '0');\n printLabel('Avg confidence', stats.avgConfidence.toFixed(3));\n\n printBlank();\n printInfo('By type:');\n printSimpleTable(\n ['Entity Type', 'Count'],\n Object.entries(stats.byType).map(([k, v]) => [k, String(v)])\n );\n\n printBlank();\n printInfo('By source:');\n printSimpleTable(\n ['Source', 'Count'],\n Object.entries(stats.bySource).map(([k, v]) => [k, String(v)])\n );\n\n if (stats.topAccessed.length > 0) {\n printBlank();\n printInfo('Top accessed:');\n printSimpleTable(\n ['ID', 'Access Count', 'Content'],\n stats.topAccessed.map((t) => [truncate(t.id, 12), String(t.accessCount), truncate(t.content, 50)])\n );\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch memory stats');\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":"AAAA,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AACxB,OAAO,SAAS;AAChB,OAAO,WAAW;AAYlB,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAKA,SAAS,sBAA+B;AAC7C,QAAM,SAAS,IAAI,QAAQ,QAAQ,EAAE,YAAY,qBAAqB;AAGtE,SACG,QAAQ,MAAM,EACd,YAAY,qCAAqC,EACjD,OAAO,wBAAwB,+DAA+D,EAC9F,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,mBAAmB,oBAAoB,EAC9C,OAAO,qBAAqB,oDAAoD,EAChF,OAAO,wBAAwB,gCAAgC,IAAI,EACnE,OAAO,uBAAuB,4BAA4B,GAAG,EAC7D;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,EACC,OAAO,gBAAgB;AAG1B,SACG,QAAQ,UAAU,EAClB,YAAY,kCAAkC,EAC9C;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,eAAe;AAGzB,SACG,QAAQ,QAAQ,EAChB,YAAY,qBAAqB,EACjC,OAAO,wBAAwB,qDAAqD,EACpF,OAAO,oBAAoB,WAAW,EACtC,OAAO,oBAAoB,qBAAqB,EAChD,OAAO,mBAAmB,sBAAsB,EAChD,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,mBAAmB,yBAAyB,EACnD,OAAO,qBAAqB,oEAAoE,EAChG;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,aAAa,EACrB,YAAY,2BAA2B,EACvC,OAAO,oBAAoB,sBAAsB,EACjD,OAAO,gBAAgB,8CAA8C,EACrE,OAAO,cAAc,6CAA6C,EAClE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,aAAa,EACrB,YAAY,6BAA6B,EACzC,OAAO,aAAa,0BAA0B,EAC9C;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,QAAQ,EAChB,YAAY,2CAA2C,EACvD,OAAO,wBAAwB,gEAAgE,EAC/F,OAAO,oBAAoB,sBAAsB,EACjD,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,wBAAwB,+BAA+B,EAC9D,OAAO,6BAA6B,qCAAqC,EACzE,OAAO,yBAAyB,wDAAwD,EACxF,OAAO,0BAA0B,yDAAyD,EAC1F;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,eAAe,EACvB,YAAY,wDAAwD,EACpE,OAAO,kBAAkB,8BAA8B,EACvD,OAAO,wBAAwB,oCAAoC,EACnE,OAAO,mBAAmB,6BAA6B,EACvD,OAAO,qBAAqB,oDAAoD,EAChF,OAAO,wBAAwB,iBAAiB,EAChD,OAAO,wBAAwB,+BAA+B,EAC9D;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,wBAAwB;AAGlC,SACG,QAAQ,OAAO,EACf,YAAY,oEAAoE,EAChF,OAAO,wBAAwB,0CAA0C,EACzE,OAAO,oBAAoB,wCAAwC,EACnE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,iBAAiB;AAE3B,SAAO;AACT;AASA,SAAS,SAAS,KAAa,QAAwB;AACrD,MAAI,IAAI,UAAU,OAAQ,QAAO;AACjC,SAAO,IAAI,UAAU,GAAG,SAAS,CAAC,IAAI;AACxC;AASA,eAAe,iBAAiB,SAOd;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,sBAAsB,EAAE,MAAM;AAElD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,KAAK;AAAA,MACrC,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,MACjB,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,4BAA4B,SAAS,OAAO;AACvD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,UAAU,OAAO,WAAW,IAAI,SAAS;AAEjD,QAAI,aAAa,GAAG;AAClB,gBAAU,EAAE,UAAU,OAAO,WAAW,CAAC;AACzC;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,gBAAU,mBAAmB;AAC7B;AAAA,IACF;AAEA,eAAW;AACX;AAAA,MACE,CAAC,MAAM,eAAe,aAAa,WAAW,UAAU,UAAU,SAAS;AAAA,MAC3E,SAAS,IAAI,CAAC,MAAc;AAAA,QAC1B,SAAS,EAAE,IAAI,EAAE;AAAA,QACjB,EAAE;AAAA,QACF,EAAE;AAAA,QACF,SAAS,EAAE,SAAS,EAAE;AAAA,QACtB,EAAE,UAAU,UAAU;AAAA,QACtB,EAAE,WAAW,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI;AAAA,QAChD,WAAW,EAAE,SAAS;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,eAAW;AACX,QAAI,YAAY;AACd,gBAAU,UAAU,KAAK,mBAAmB,WAAW,IAAI,OAAO,WAAW,UAAU,GAAG;AAAA,IAC5F,OAAO;AACL,gBAAU,UAAU,KAAK,WAAW;AAAA,IACtC;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,KAAK,0BAA0B;AACvC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,gBAAgB,IAA2B;AACxD,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,oBAAoB,EAAE,MAAM;AAEhD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,IAAI,EAAE;AAExC,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,0BAA0B,SAAS,OAAO;AACrD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AAExB,QAAI,aAAa,GAAG;AAClB,gBAAU,MAAM;AAChB;AAAA,IACF;AAEA,eAAW;AACX,uBAAmB,MAAM;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,KAAK,wBAAwB;AACrC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,mBAAmB,SAQhB;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,MAAI;AAEJ,MAAI,QAAQ,MAAM;AAEhB,QAAI;AACF,YAAM,UAAU,MAAM,SAAS,QAAQ,MAAM,OAAO;AACpD,cAAQ,KAAK,MAAM,OAAO;AAAA,IAC5B,SAAS,OAAO;AACd,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,iBAAW,uBAAuB,OAAO;AACzC,cAAQ,WAAW;AACnB;AAAA,IACF;AAAA,EACF,OAAO;AAEL,QAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,YAAY,CAAC,QAAQ,SAAS;AAChE;AAAA,QACE;AAAA,QACA;AAAA,MACF;AACA,gBAAU,4CAA4C;AACtD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,YAAQ;AAAA,MACN,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB,SAAS,QAAQ;AAAA,IACnB;AAEA,QAAI,QAAQ,SAAS;AACnB,YAAM,UAAU,QAAQ;AAAA,IAC1B;AAEA,QAAI,QAAQ,QAAQ;AAClB,YAAM,WAAW,EAAE,GAAG,MAAM,UAAU,QAAQ,QAAQ,OAAuB;AAAA,IAC/E;AAEA,QAAI,QAAQ,KAAK;AACf,YAAM,MAAM,SAAS,QAAQ,KAAK,EAAE;AACpC,UAAI,MAAM,GAAG,KAAK,OAAO,GAAG;AAC1B,mBAAW,qBAAqB,0CAA0C;AAC1E,gBAAQ,WAAW;AACnB;AAAA,MACF;AACA,YAAM,aAAa;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,oBAAoB,EAAE,MAAM;AAEhD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,OAAO,KAAK;AAE9C,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,2BAA2B,SAAS,OAAO;AACtD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AAExB,QAAI,aAAa,GAAG;AAClB,gBAAU,EAAE,SAAS,MAAM,OAAO,CAAC;AACnC;AAAA,IACF;AAEA,iBAAa,mBAAmB,OAAO,EAAE,EAAE;AAAA,EAC7C,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,mBACb,IACA,SAKe;AACf,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,QAA2B,CAAC;AAElC,MAAI,QAAQ,SAAS;AACnB,UAAM,UAAU,QAAQ;AAAA,EAC1B;AAEA,MAAI,QAAQ,YAAY;AACtB,UAAM,WAAW;AAAA,EACnB;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW;AAAA,EACnB;AAEA,MAAI,CAAC,QAAQ,WAAW,CAAC,QAAQ,cAAc,CAAC,QAAQ,UAAU;AAChE,eAAW,wBAAwB,gDAAgD;AACnF,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,oBAAoB,EAAE,MAAM;AAEhD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,OAAO,IAAI,KAAK;AAElD,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,2BAA2B,SAAS,OAAO;AACtD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AAExB,QAAI,aAAa,GAAG;AAClB,gBAAU,EAAE,SAAS,MAAM,OAAO,CAAC;AACnC;AAAA,IACF;AAEA,iBAAa,mBAAmB,OAAO,EAAE,EAAE;AAAA,EAC7C,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,mBAAmB,IAAY,SAA2C;AACvF,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAGV,MAAI,CAAC,QAAQ,KAAK;AAChB,QAAI;AACF,YAAM,YAAY,MAAM,QAAQ;AAAA,QAC9B,SAAS,2CAA2C,EAAE;AAAA,QACtD,SAAS;AAAA,MACX,CAAC;AAED,UAAI,CAAC,WAAW;AACd,kBAAU,oBAAoB;AAC9B;AAAA,MACF;AAAA,IACF,QAAQ;AAEN,iBAAW;AACX,gBAAU,oBAAoB;AAC9B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,oBAAoB,EAAE,MAAM;AAEhD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,OAAO,EAAE;AAE3C,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,SAAS;AACrB,iBAAW,2BAA2B,SAAS,OAAO;AACtD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,EAAE,SAAS,MAAM,SAAS,MAAM,GAAG,CAAC;AAC9C;AAAA,IACF;AAEA,iBAAa,mBAAmB,EAAE,EAAE;AAAA,EACtC,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,mBAAmB,SAUhB;AAChB,MAAI,CAAC,QAAQ,cAAc,CAAC,QAAQ,YAAY,CAAC,QAAQ,OAAO;AAC9D,eAAW,4BAA4B,iDAAiD;AACxF,cAAU,4CAA4C;AACtD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,QAA2B;AAAA,IAC/B,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,OAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,QAAQ,SAAS;AACnB,UAAM,UAAU,QAAQ;AAAA,EAC1B;AAEA,MAAI,QAAQ,OAAO;AACjB,UAAM,QAAQ,SAAS,QAAQ,OAAO,EAAE;AAAA,EAC1C;AAEA,MAAI,QAAQ,UAAU;AACpB,UAAM,WAAW,WAAW,QAAQ,QAAQ;AAAA,EAC9C;AAEA,MAAI,QAAQ,eAAe;AACzB,UAAM,gBAAgB,WAAW,QAAQ,aAAa;AAAA,EACxD;AAEA,MAAI,QAAQ,cAAc;AACxB,UAAM,eAAe,QAAQ;AAAA,EAC/B;AAEA,MAAI,QAAQ,eAAe;AACzB,UAAM,gBAAgB,QAAQ;AAAA,EAChC;AAEA,QAAM,UAAU,IAAI,uBAAuB,EAAE,MAAM;AAEnD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,OAAO,KAAK;AAE9C,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,6BAA6B,SAAS,OAAO;AACxD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,IAAI,SAAS;AAE9B,QAAI,aAAa,GAAG;AAClB,gBAAU,EAAE,SAAS,CAAC;AACtB;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,gBAAU,4BAA4B;AACtC;AAAA,IACF;AAEA,eAAW;AACX;AAAA,MACE,CAAC,MAAM,SAAS,WAAW,eAAe,WAAW;AAAA,MACrD,SAAS,IAAI,CAAC,MAA0B;AAAA,QACtC,SAAS,EAAE,IAAI,EAAE;AAAA,SAChB,EAAE,SAAS,GAAG,QAAQ,CAAC;AAAA,QACxB,SAAS,EAAE,SAAS,EAAE;AAAA,QACtB,EAAE;AAAA,QACF,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,eAAW;AACX,cAAU,SAAS,SAAS,MAAM,oBAAoB;AAAA,EACxD,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,yBAAyB,SAOtB;AAChB,MAAI,CAAC,QAAQ,OAAO;AAClB,eAAW,2BAA2B,iBAAiB;AACvD,cAAU,mDAAmD;AAC7D,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,QAAiC,EAAE,OAAO,QAAQ,MAAM;AAC9D,MAAI,QAAQ,WAAY,OAAM,aAAa,QAAQ;AACnD,MAAI,QAAQ,QAAS,OAAM,UAAU,QAAQ;AAC7C,MAAI,QAAQ,OAAQ,OAAM,SAAS,QAAQ;AAC3C,MAAI,QAAQ,MAAO,OAAM,QAAQ,SAAS,QAAQ,OAAO,EAAE;AAC3D,MAAI,QAAQ,SAAU,OAAM,WAAW,WAAW,QAAQ,QAAQ;AAElE,QAAM,UAAU,IAAI,2BAA2B,EAAE,MAAM;AAEvD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,aAAa,KAAK;AAEpD,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,6BAA6B,SAAS,OAAO;AACxD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,SAAS,IAAI,SAAS;AAE9B,QAAI,aAAa,GAAG;AAClB,gBAAU,EAAE,SAAS,CAAC;AACtB;AAAA,IACF;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,gBAAU,4BAA4B;AACtC;AAAA,IACF;AAEA,eAAW;AACX;AAAA,MACE,CAAC,MAAM,SAAS,WAAW,eAAe,WAAW;AAAA,MACrD,SAAS,IAAI,CAAC,MAA0B;AAAA,QACtC,SAAS,EAAE,IAAI,EAAE;AAAA,SAChB,EAAE,SAAS,GAAG,QAAQ,CAAC;AAAA,QACxB,SAAS,EAAE,SAAS,EAAE;AAAA,QACtB,EAAE;AAAA,QACF,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAEA,eAAW;AACX,cAAU,SAAS,SAAS,MAAM,oBAAoB;AAAA,EACxD,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,kBAAkB,SAGf;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,6BAA6B,EAAE,MAAM;AAEzD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,MAAM;AAAA,MACtC,YAAY,QAAQ;AAAA,MACpB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,gCAAgC,SAAS,OAAO;AAC3D,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,QAAqB,SAAS;AAEpC,QAAI,aAAa,GAAG;AAClB,gBAAU,KAAK;AACf;AAAA,IACF;AAEA,eAAW;AACX,eAAW,SAAS,OAAO,MAAM,KAAK,CAAC;AACvC,eAAW,UAAU,MAAM,MAAM,OAAO,MAAM,MAAM,CAAC,CAAC;AACtD,eAAW,YAAY,OAAO,MAAM,QAAQ,CAAC;AAC7C,eAAW,WAAW,MAAM,UAAU,IAAI,MAAM,OAAO,OAAO,MAAM,OAAO,CAAC,IAAI,GAAG;AACnF,eAAW,kBAAkB,MAAM,cAAc,QAAQ,CAAC,CAAC;AAE3D,eAAW;AACX,cAAU,UAAU;AACpB;AAAA,MACE,CAAC,eAAe,OAAO;AAAA,MACvB,OAAO,QAAQ,MAAM,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IAC7D;AAEA,eAAW;AACX,cAAU,YAAY;AACtB;AAAA,MACE,CAAC,UAAU,OAAO;AAAA,MAClB,OAAO,QAAQ,MAAM,QAAQ,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAAA,IAC/D;AAEA,QAAI,MAAM,YAAY,SAAS,GAAG;AAChC,iBAAW;AACX,gBAAU,eAAe;AACzB;AAAA,QACE,CAAC,MAAM,gBAAgB,SAAS;AAAA,QAChC,MAAM,YAAY,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;AAAA,MACnG;AAAA,IACF;AACA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,8BAA8B;AAC3C,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AASA,SAAS,mBAAmB,QAAsB;AAChD,aAAW,MAAM,OAAO,EAAE;AAC1B,aAAW,eAAe,OAAO,UAAU;AAC3C,aAAW,aAAa,OAAO,QAAQ;AAEvC,aAAW;AACX,YAAU,UAAU;AACpB,UAAQ,IAAI,MAAM,KAAK,OAAO,OAAO,CAAC;AAEtC,MAAI,OAAO,SAAS;AAClB,eAAW;AACX,eAAW,YAAY,OAAO,OAAO;AAAA,EACvC;AAEA,aAAW;AACX,aAAW,UAAU,OAAO,WAAW,MAAM,MAAM,KAAK,IAAI,MAAM,IAAI,IAAI,CAAC;AAE3E,MAAI,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AAC9D,eAAW;AACX,cAAU,WAAW;AACrB,YAAQ,IAAI,MAAM,KAAK,KAAK,UAAU,OAAO,UAAU,MAAM,CAAC,CAAC,CAAC;AAAA,EAClE;AAEA,MAAI,OAAO,WAAW;AACpB,eAAW,WAAW,WAAW,OAAO,SAAS,CAAC;AAAA,EACpD;AAEA,aAAW;AACX,aAAW,WAAW,WAAW,OAAO,SAAS,CAAC;AAClD,MAAI,OAAO,WAAW;AACpB,eAAW,WAAW,WAAW,OAAO,SAAS,CAAC;AAAA,EACpD;AACA,aAAW;AACb;","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":[]}
|
package/dist/commands/prompts.js
CHANGED
|
@@ -73,6 +73,12 @@ Examples:
|
|
|
73
73
|
$ chanl prompts delete abc123
|
|
74
74
|
$ chanl prompts delete abc123 --yes # Skip confirmation`
|
|
75
75
|
).action(handlePromptsDelete);
|
|
76
|
+
prompts.command("versions").description("Prompt version operations").addCommand(
|
|
77
|
+
new Command("list").argument("<id>", "Prompt ID").description("List version history for a prompt").action(handlePromptsVersionsList)
|
|
78
|
+
);
|
|
79
|
+
prompts.command("revert <id>").description("Revert a prompt to a previous version").requiredOption("--to-version <number>", "Version number to revert to").action(handlePromptsRevert);
|
|
80
|
+
prompts.command("resolve <id>").description("Resolve template variables in prompt content").option("-f, --file <path>", 'JSON file with { "variables": { ... } }').action(handlePromptsResolve);
|
|
81
|
+
prompts.command("apply <id>").description("Apply a prompt to an agent").requiredOption("-a, --agent <agentId>", "Agent ID").option("--sync", "Sync agent to external platform after apply").action(handlePromptsApply);
|
|
76
82
|
return prompts;
|
|
77
83
|
}
|
|
78
84
|
function formatStatus(status) {
|
|
@@ -105,7 +111,8 @@ async function handlePromptsList(options) {
|
|
|
105
111
|
process.exitCode = 1;
|
|
106
112
|
return;
|
|
107
113
|
}
|
|
108
|
-
const
|
|
114
|
+
const data = response.data;
|
|
115
|
+
const prompts = Array.isArray(data) ? data : data?.prompts ?? [];
|
|
109
116
|
if (isJsonOutput()) {
|
|
110
117
|
printJson(prompts);
|
|
111
118
|
return;
|
|
@@ -289,6 +296,146 @@ async function handlePromptsDelete(id, options) {
|
|
|
289
296
|
process.exitCode = 1;
|
|
290
297
|
}
|
|
291
298
|
}
|
|
299
|
+
async function handlePromptsVersionsList(id) {
|
|
300
|
+
const sdk = createSdk();
|
|
301
|
+
if (!sdk) return;
|
|
302
|
+
const spinner = ora("Fetching versions...").start();
|
|
303
|
+
try {
|
|
304
|
+
const response = await sdk.prompts.getVersions(id);
|
|
305
|
+
spinner.stop();
|
|
306
|
+
if (!response.success || !response.data) {
|
|
307
|
+
printError("Failed to fetch versions", response.message);
|
|
308
|
+
process.exitCode = 1;
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const versions = Array.isArray(response.data) ? response.data : [];
|
|
312
|
+
if (isJsonOutput()) {
|
|
313
|
+
printJson(versions);
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (versions.length === 0) {
|
|
317
|
+
printInfo("No versions found");
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
printBlank();
|
|
321
|
+
printSimpleTable(
|
|
322
|
+
["Version", "Name", "Active", "Created"],
|
|
323
|
+
versions.map((v) => [
|
|
324
|
+
String(v.version ?? "-"),
|
|
325
|
+
(v.versionName || "-").slice(0, 30),
|
|
326
|
+
v.isActive ? chalk.green("yes") : chalk.gray("no"),
|
|
327
|
+
formatDate(v.createdAt)
|
|
328
|
+
])
|
|
329
|
+
);
|
|
330
|
+
} catch (error) {
|
|
331
|
+
spinner.fail("Failed to fetch versions");
|
|
332
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
333
|
+
printError("Error", message);
|
|
334
|
+
process.exitCode = 1;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
async function handlePromptsRevert(id, options) {
|
|
338
|
+
const sdk = createSdk();
|
|
339
|
+
if (!sdk) return;
|
|
340
|
+
const version = parseInt(options.toVersion, 10);
|
|
341
|
+
if (Number.isNaN(version)) {
|
|
342
|
+
printError("Invalid version", "Version must be a number");
|
|
343
|
+
process.exitCode = 1;
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const spinner = ora("Reverting prompt...").start();
|
|
347
|
+
try {
|
|
348
|
+
const response = await sdk.prompts.revert(id, { version });
|
|
349
|
+
spinner.stop();
|
|
350
|
+
if (!response.success || !response.data) {
|
|
351
|
+
printError("Failed to revert prompt", response.message);
|
|
352
|
+
process.exitCode = 1;
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
if (isJsonOutput()) {
|
|
356
|
+
printJson(response.data);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
printSuccess(`Prompt reverted to version ${version}`);
|
|
360
|
+
printLabel("ID", response.data.id);
|
|
361
|
+
printLabel("Current version", String(response.data.version ?? version));
|
|
362
|
+
} catch (error) {
|
|
363
|
+
spinner.fail("Failed to revert prompt");
|
|
364
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
365
|
+
printError("Error", message);
|
|
366
|
+
process.exitCode = 1;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
async function handlePromptsResolve(id, options) {
|
|
370
|
+
const sdk = createSdk();
|
|
371
|
+
if (!sdk) return;
|
|
372
|
+
let variables;
|
|
373
|
+
if (options.file) {
|
|
374
|
+
try {
|
|
375
|
+
const content = readFileSync(options.file, "utf-8");
|
|
376
|
+
const parsed = JSON.parse(content);
|
|
377
|
+
variables = parsed.variables ?? parsed;
|
|
378
|
+
} catch (error) {
|
|
379
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
380
|
+
printError("Failed to read file", message);
|
|
381
|
+
process.exitCode = 1;
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
const spinner = ora("Resolving variables...").start();
|
|
386
|
+
try {
|
|
387
|
+
const response = await sdk.prompts.resolve(id, variables ? { variables } : void 0);
|
|
388
|
+
spinner.stop();
|
|
389
|
+
if (!response.success || !response.data) {
|
|
390
|
+
printError("Failed to resolve prompt", response.message);
|
|
391
|
+
process.exitCode = 1;
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
if (isJsonOutput()) {
|
|
395
|
+
printJson(response.data);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
printBlank();
|
|
399
|
+
console.log(chalk.bold("Resolved content:"));
|
|
400
|
+
console.log(response.data.content);
|
|
401
|
+
if (response.data.unresolvedVariables?.length) {
|
|
402
|
+
printBlank();
|
|
403
|
+
printInfo(`Unresolved: ${response.data.unresolvedVariables.join(", ")}`);
|
|
404
|
+
}
|
|
405
|
+
} catch (error) {
|
|
406
|
+
spinner.fail("Failed to resolve prompt");
|
|
407
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
408
|
+
printError("Error", message);
|
|
409
|
+
process.exitCode = 1;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
async function handlePromptsApply(id, options) {
|
|
413
|
+
const sdk = createSdk();
|
|
414
|
+
if (!sdk) return;
|
|
415
|
+
const spinner = ora("Applying prompt to agent...").start();
|
|
416
|
+
try {
|
|
417
|
+
const response = await sdk.prompts.apply(id, {
|
|
418
|
+
agentId: options.agent,
|
|
419
|
+
syncToPlatform: options.sync
|
|
420
|
+
});
|
|
421
|
+
spinner.stop();
|
|
422
|
+
if (!response.success) {
|
|
423
|
+
printError("Failed to apply prompt", response.message);
|
|
424
|
+
process.exitCode = 1;
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (isJsonOutput()) {
|
|
428
|
+
printJson(response.data ?? { success: true });
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
printSuccess(`Prompt applied to agent ${options.agent}`);
|
|
432
|
+
} catch (error) {
|
|
433
|
+
spinner.fail("Failed to apply prompt");
|
|
434
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
435
|
+
printError("Error", message);
|
|
436
|
+
process.exitCode = 1;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
292
439
|
export {
|
|
293
440
|
createPromptsCommand
|
|
294
441
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/prompts.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printError,\n printSuccess,\n printInfo,\n printBlank,\n printSimpleTable,\n printLabel,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\n\n/**\n * Create the prompts command group\n */\nexport function createPromptsCommand(): Command {\n const prompts = new Command('prompts')\n .description('Manage prompt templates')\n .addHelpText(\n 'after',\n `\nWhat are Prompts?\n Prompts are reusable templates for AI agent instructions. They support\n variables, versioning, and categories for organizing across use cases.\n\nQuick Start:\n $ chanl prompts list # List all prompts\n $ chanl prompts get <id> # View prompt details\n $ chanl prompts create -f prompt.json # Create from JSON file\n $ chanl prompts update <id> -f data.json # Update a prompt\n $ chanl prompts delete <id> # Delete a prompt`\n );\n\n // prompts list\n prompts\n .command('list')\n .description('List all prompts')\n .option('-c, --category <category>', 'Filter by category (support, sales, onboarding, general)')\n .option('-s, --status <status>', 'Filter by status (active, draft, archived)')\n .option('--search <query>', 'Search by name or content')\n .option('-l, --limit <number>', 'Number of items per page', '20')\n .option('--page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts list # List all prompts\n $ chanl prompts list --category support # Filter by category\n $ chanl prompts list --status active # Only active prompts\n $ chanl prompts list --json # Output as JSON`\n )\n .action(handlePromptsList);\n\n // prompts get <id>\n prompts\n .command('get <id>')\n .description('Get prompt details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts get abc123 # Get prompt details\n $ chanl prompts get abc123 --json # Output as JSON`\n )\n .action(handlePromptsGet);\n\n // prompts create\n prompts\n .command('create')\n .description('Create a new prompt')\n .option('-f, --file <path>', 'Path to JSON file with prompt data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts create -f prompt.json # Create from file\n\nJSON file format:\n {\n \"name\": \"Support Greeting\",\n \"content\": \"Hello! How can I help you today?\",\n \"category\": \"support\",\n \"status\": \"active\",\n \"tags\": [\"greeting\", \"support\"]\n }`\n )\n .action(handlePromptsCreate);\n\n // prompts update <id>\n prompts\n .command('update <id>')\n .description('Update an existing prompt')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts update abc123 -f updates.json`\n )\n .action(handlePromptsUpdate);\n\n // prompts delete <id>\n prompts\n .command('delete <id>')\n .description('Delete a prompt')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts delete abc123\n $ chanl prompts delete abc123 --yes # Skip confirmation`\n )\n .action(handlePromptsDelete);\n\n return prompts;\n}\n\n/**\n * Format prompt status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'draft':\n return chalk.yellow('draft');\n case 'archived':\n return chalk.gray('archived');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Handle prompts list command\n */\nasync function handlePromptsList(options: {\n category?: string;\n status?: string;\n search?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompts...').start();\n\n try {\n const response = await sdk.prompts.list({\n category: options.category as any,\n status: options.status as any,\n search: options.search,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch prompts', response.message);\n process.exitCode = 1;\n return;\n }\n\n const prompts = Array.isArray(response.data) ? response.data : [];\n\n if (isJsonOutput()) {\n printJson(prompts);\n return;\n }\n\n if (prompts.length === 0) {\n printInfo('No prompts found');\n printInfo(\"Use 'chanl prompts create -f prompt.json' to create a prompt\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Category', 'Status', 'Version', 'Updated'],\n prompts.map((p: any) => [\n p.id.slice(-12),\n (p.name || 'Untitled').slice(0, 30),\n p.category || '-',\n formatStatus(p.status),\n String(p.version || '-'),\n formatDate(p.updatedAt || p.createdAt),\n ])\n );\n\n printBlank();\n printInfo(`Total: ${prompts.length} prompts`);\n } catch (error) {\n spinner.fail('Failed to fetch prompts');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts get command\n */\nasync function handlePromptsGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompt...').start();\n\n try {\n const response = await sdk.prompts.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n const prompt = response.data;\n\n if (isJsonOutput()) {\n printJson(prompt);\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Prompt Details:'));\n printLabel('ID', prompt.id);\n printLabel('Name', prompt.name);\n if (prompt.description) printLabel('Description', prompt.description);\n if (prompt.category) printLabel('Category', prompt.category);\n printLabel('Status', formatStatus(prompt.status));\n if (prompt.version) printLabel('Version', prompt.version.toString());\n if (prompt.tags && prompt.tags.length > 0) {\n printLabel('Tags', prompt.tags.join(', '));\n }\n if (prompt.createdAt) printLabel('Created', formatDate(prompt.createdAt));\n if (prompt.updatedAt) printLabel('Updated', formatDate(prompt.updatedAt));\n\n if (prompt.content) {\n printBlank();\n console.log(chalk.bold('Content:'));\n console.log(chalk.dim(prompt.content.slice(0, 500) + (prompt.content.length > 500 ? '...' : '')));\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts create command\n */\nasync function handlePromptsCreate(options: {\n file?: string;\n}): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify prompt data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let promptData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n promptData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Creating prompt...').start();\n\n try {\n const response = await sdk.prompts.create(promptData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt created: ${prompt.name}`);\n printLabel('ID', prompt.id);\n if (prompt.category) printLabel('Category', prompt.category);\n } catch (error) {\n spinner.fail('Failed to create prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts update command\n */\nasync function handlePromptsUpdate(\n id: string,\n options: { file?: string }\n): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify update data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let updateData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n updateData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Updating prompt...').start();\n\n try {\n const response = await sdk.prompts.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt updated: ${prompt.name}`);\n } catch (error) {\n spinner.fail('Failed to update prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts delete command\n */\nasync function handlePromptsDelete(\n id: string,\n options: { yes?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n if (!options.yes) {\n printInfo(`About to delete prompt: ${id}`);\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n }\n\n const spinner = ora('Deleting prompt...').start();\n\n try {\n const response = await sdk.prompts.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson({ success: true, deleted: id });\n return;\n }\n\n printSuccess(`Prompt deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/prompts.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printError,\n printSuccess,\n printInfo,\n printBlank,\n printSimpleTable,\n printLabel,\n isJsonOutput,\n printJson,\n formatDate,\n} from '../utils/output.js';\n\n/**\n * Create the prompts command group\n */\nexport function createPromptsCommand(): Command {\n const prompts = new Command('prompts')\n .description('Manage prompt templates')\n .addHelpText(\n 'after',\n `\nWhat are Prompts?\n Prompts are reusable templates for AI agent instructions. They support\n variables, versioning, and categories for organizing across use cases.\n\nQuick Start:\n $ chanl prompts list # List all prompts\n $ chanl prompts get <id> # View prompt details\n $ chanl prompts create -f prompt.json # Create from JSON file\n $ chanl prompts update <id> -f data.json # Update a prompt\n $ chanl prompts delete <id> # Delete a prompt`\n );\n\n // prompts list\n prompts\n .command('list')\n .description('List all prompts')\n .option('-c, --category <category>', 'Filter by category (support, sales, onboarding, general)')\n .option('-s, --status <status>', 'Filter by status (active, draft, archived)')\n .option('--search <query>', 'Search by name or content')\n .option('-l, --limit <number>', 'Number of items per page', '20')\n .option('--page <number>', 'Page number', '1')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts list # List all prompts\n $ chanl prompts list --category support # Filter by category\n $ chanl prompts list --status active # Only active prompts\n $ chanl prompts list --json # Output as JSON`\n )\n .action(handlePromptsList);\n\n // prompts get <id>\n prompts\n .command('get <id>')\n .description('Get prompt details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts get abc123 # Get prompt details\n $ chanl prompts get abc123 --json # Output as JSON`\n )\n .action(handlePromptsGet);\n\n // prompts create\n prompts\n .command('create')\n .description('Create a new prompt')\n .option('-f, --file <path>', 'Path to JSON file with prompt data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts create -f prompt.json # Create from file\n\nJSON file format:\n {\n \"name\": \"Support Greeting\",\n \"content\": \"Hello! How can I help you today?\",\n \"category\": \"support\",\n \"status\": \"active\",\n \"tags\": [\"greeting\", \"support\"]\n }`\n )\n .action(handlePromptsCreate);\n\n // prompts update <id>\n prompts\n .command('update <id>')\n .description('Update an existing prompt')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts update abc123 -f updates.json`\n )\n .action(handlePromptsUpdate);\n\n // prompts delete <id>\n prompts\n .command('delete <id>')\n .description('Delete a prompt')\n .option('-y, --yes', 'Skip confirmation prompt')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl prompts delete abc123\n $ chanl prompts delete abc123 --yes # Skip confirmation`\n )\n .action(handlePromptsDelete);\n\n // prompts versions list <id>\n prompts\n .command('versions')\n .description('Prompt version operations')\n .addCommand(\n new Command('list')\n .argument('<id>', 'Prompt ID')\n .description('List version history for a prompt')\n .action(handlePromptsVersionsList)\n );\n\n // prompts revert <id>\n prompts\n .command('revert <id>')\n .description('Revert a prompt to a previous version')\n .requiredOption('--to-version <number>', 'Version number to revert to')\n .action(handlePromptsRevert);\n\n // prompts resolve <id>\n prompts\n .command('resolve <id>')\n .description('Resolve template variables in prompt content')\n .option('-f, --file <path>', 'JSON file with { \"variables\": { ... } }')\n .action(handlePromptsResolve);\n\n // prompts apply <id>\n prompts\n .command('apply <id>')\n .description('Apply a prompt to an agent')\n .requiredOption('-a, --agent <agentId>', 'Agent ID')\n .option('--sync', 'Sync agent to external platform after apply')\n .action(handlePromptsApply);\n\n return prompts;\n}\n\n/**\n * Format prompt status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'draft':\n return chalk.yellow('draft');\n case 'archived':\n return chalk.gray('archived');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Handle prompts list command\n */\nasync function handlePromptsList(options: {\n category?: string;\n status?: string;\n search?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompts...').start();\n\n try {\n const response = await sdk.prompts.list({\n category: options.category as any,\n status: options.status as any,\n search: options.search,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch prompts', response.message);\n process.exitCode = 1;\n return;\n }\n\n const data = response.data as { prompts?: unknown[] } | unknown[] | undefined;\n const prompts = Array.isArray(data) ? data : (data?.prompts ?? []);\n\n if (isJsonOutput()) {\n printJson(prompts);\n return;\n }\n\n if (prompts.length === 0) {\n printInfo('No prompts found');\n printInfo(\"Use 'chanl prompts create -f prompt.json' to create a prompt\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Category', 'Status', 'Version', 'Updated'],\n prompts.map((p: any) => [\n p.id.slice(-12),\n (p.name || 'Untitled').slice(0, 30),\n p.category || '-',\n formatStatus(p.status),\n String(p.version || '-'),\n formatDate(p.updatedAt || p.createdAt),\n ])\n );\n\n printBlank();\n printInfo(`Total: ${prompts.length} prompts`);\n } catch (error) {\n spinner.fail('Failed to fetch prompts');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts get command\n */\nasync function handlePromptsGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching prompt...').start();\n\n try {\n const response = await sdk.prompts.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n const prompt = response.data;\n\n if (isJsonOutput()) {\n printJson(prompt);\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Prompt Details:'));\n printLabel('ID', prompt.id);\n printLabel('Name', prompt.name);\n if (prompt.description) printLabel('Description', prompt.description);\n if (prompt.category) printLabel('Category', prompt.category);\n printLabel('Status', formatStatus(prompt.status));\n if (prompt.version) printLabel('Version', prompt.version.toString());\n if (prompt.tags && prompt.tags.length > 0) {\n printLabel('Tags', prompt.tags.join(', '));\n }\n if (prompt.createdAt) printLabel('Created', formatDate(prompt.createdAt));\n if (prompt.updatedAt) printLabel('Updated', formatDate(prompt.updatedAt));\n\n if (prompt.content) {\n printBlank();\n console.log(chalk.bold('Content:'));\n console.log(chalk.dim(prompt.content.slice(0, 500) + (prompt.content.length > 500 ? '...' : '')));\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts create command\n */\nasync function handlePromptsCreate(options: {\n file?: string;\n}): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify prompt data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let promptData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n promptData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Creating prompt...').start();\n\n try {\n const response = await sdk.prompts.create(promptData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt created: ${prompt.name}`);\n printLabel('ID', prompt.id);\n if (prompt.category) printLabel('Category', prompt.category);\n } catch (error) {\n spinner.fail('Failed to create prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts update command\n */\nasync function handlePromptsUpdate(\n id: string,\n options: { file?: string }\n): Promise<void> {\n if (!options.file) {\n printError('Missing required option', \"Use '-f <file>' to specify update data\");\n process.exitCode = 1;\n return;\n }\n\n const sdk = createSdk();\n if (!sdk) return;\n\n // Read and parse the file\n let updateData: any;\n try {\n const content = readFileSync(options.file, 'utf-8');\n updateData = JSON.parse(content);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Updating prompt...').start();\n\n try {\n const response = await sdk.prompts.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const prompt = response.data;\n printSuccess(`Prompt updated: ${prompt.name}`);\n } catch (error) {\n spinner.fail('Failed to update prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle prompts delete command\n */\nasync function handlePromptsDelete(\n id: string,\n options: { yes?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n if (!options.yes) {\n printInfo(`About to delete prompt: ${id}`);\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n }\n\n const spinner = ora('Deleting prompt...').start();\n\n try {\n const response = await sdk.prompts.delete(id);\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson({ success: true, deleted: id });\n return;\n }\n\n printSuccess(`Prompt deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsVersionsList(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching versions...').start();\n\n try {\n const response = await sdk.prompts.getVersions(id);\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch versions', response.message);\n process.exitCode = 1;\n return;\n }\n\n const versions = Array.isArray(response.data) ? response.data : [];\n\n if (isJsonOutput()) {\n printJson(versions);\n return;\n }\n\n if (versions.length === 0) {\n printInfo('No versions found');\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Version', 'Name', 'Active', 'Created'],\n versions.map((v: { version?: number; versionName?: string; isActive?: boolean; createdAt?: string }) => [\n String(v.version ?? '-'),\n (v.versionName || '-').slice(0, 30),\n v.isActive ? chalk.green('yes') : chalk.gray('no'),\n formatDate(v.createdAt),\n ])\n );\n } catch (error) {\n spinner.fail('Failed to fetch versions');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsRevert(\n id: string,\n options: { toVersion: string }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const version = parseInt(options.toVersion, 10);\n if (Number.isNaN(version)) {\n printError('Invalid version', 'Version must be a number');\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora('Reverting prompt...').start();\n\n try {\n const response = await sdk.prompts.revert(id, { version });\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to revert prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printSuccess(`Prompt reverted to version ${version}`);\n printLabel('ID', response.data.id);\n printLabel('Current version', String(response.data.version ?? version));\n } catch (error) {\n spinner.fail('Failed to revert prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsResolve(\n id: string,\n options: { file?: string }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n let variables: Record<string, string> | undefined;\n if (options.file) {\n try {\n const content = readFileSync(options.file, 'utf-8');\n const parsed = JSON.parse(content);\n variables = parsed.variables ?? parsed;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Failed to read file', message);\n process.exitCode = 1;\n return;\n }\n }\n\n const spinner = ora('Resolving variables...').start();\n\n try {\n const response = await sdk.prompts.resolve(id, variables ? { variables } : undefined);\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to resolve prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n console.log(chalk.bold('Resolved content:'));\n console.log(response.data.content);\n if (response.data.unresolvedVariables?.length) {\n printBlank();\n printInfo(`Unresolved: ${response.data.unresolvedVariables.join(', ')}`);\n }\n } catch (error) {\n spinner.fail('Failed to resolve prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\nasync function handlePromptsApply(\n id: string,\n options: { agent: string; sync?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Applying prompt to agent...').start();\n\n try {\n const response = await sdk.prompts.apply(id, {\n agentId: options.agent,\n syncToPlatform: options.sync,\n });\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to apply prompt', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data ?? { success: true });\n return;\n }\n\n printSuccess(`Prompt applied to agent ${options.agent}`);\n } catch (error) {\n spinner.fail('Failed to apply prompt');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -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) {
|