@chanl/cli 2.0.3 โ 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/cli.test.js +31 -36
- package/dist/__tests__/cli.test.js.map +1 -1
- package/dist/commands/agents.js +7 -7
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/mcp.js +1 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/memory.js +3 -3
- package/dist/commands/memory.js.map +1 -1
- package/dist/commands/personas.js +3 -3
- package/dist/commands/personas.js.map +1 -1
- package/dist/commands/scenarios.js +2 -2
- package/dist/commands/scenarios.js.map +1 -1
- package/dist/commands/tools.js +5 -5
- package/dist/commands/tools.js.map +1 -1
- package/package.json +1 -1
package/dist/commands/agents.js
CHANGED
|
@@ -274,7 +274,7 @@ async function handleAgentsGet(id) {
|
|
|
274
274
|
printJson(response.data);
|
|
275
275
|
return;
|
|
276
276
|
}
|
|
277
|
-
const
|
|
277
|
+
const agent = response.data;
|
|
278
278
|
printBlank();
|
|
279
279
|
console.log(chalk.bold("Agent Details:"));
|
|
280
280
|
console.log(` ID: ${agent.id}`);
|
|
@@ -330,7 +330,7 @@ async function handleAgentsCreate(options) {
|
|
|
330
330
|
printJson(response.data);
|
|
331
331
|
return;
|
|
332
332
|
}
|
|
333
|
-
const
|
|
333
|
+
const agent = response.data;
|
|
334
334
|
printSuccess(`Agent created: ${agent.name}`);
|
|
335
335
|
printLabel("ID", agent.id);
|
|
336
336
|
printLabel("Platform", agent.provider || "custom");
|
|
@@ -375,7 +375,7 @@ async function handleAgentsUpdate(id, options) {
|
|
|
375
375
|
printJson(response.data);
|
|
376
376
|
return;
|
|
377
377
|
}
|
|
378
|
-
const
|
|
378
|
+
const agent = response.data;
|
|
379
379
|
printSuccess(`Agent updated: ${agent.name}`);
|
|
380
380
|
if (options.syncToVapi) {
|
|
381
381
|
printInfo("Changes synced to VAPI");
|
|
@@ -445,7 +445,7 @@ async function handleAgentsSync(platform, options) {
|
|
|
445
445
|
printJson(response.data);
|
|
446
446
|
return;
|
|
447
447
|
}
|
|
448
|
-
const result = response.data
|
|
448
|
+
const result = response.data;
|
|
449
449
|
printBlank();
|
|
450
450
|
console.log(chalk.bold("Sync Results:"));
|
|
451
451
|
console.log(` Processed: ${result.processed}`);
|
|
@@ -490,7 +490,7 @@ async function handleAgentsSyncAll(options) {
|
|
|
490
490
|
printJson(response.data);
|
|
491
491
|
return;
|
|
492
492
|
}
|
|
493
|
-
const result = response.data
|
|
493
|
+
const result = response.data;
|
|
494
494
|
printSuccess(result.message || "Sync completed");
|
|
495
495
|
console.log(` Processed: ${result.processed}`);
|
|
496
496
|
console.log(` Created: ${chalk.green(result.created.toString())}`);
|
|
@@ -522,7 +522,7 @@ async function handleAgentsImport(options) {
|
|
|
522
522
|
process.exitCode = 1;
|
|
523
523
|
return;
|
|
524
524
|
}
|
|
525
|
-
const agent = response.data
|
|
525
|
+
const agent = response.data;
|
|
526
526
|
if (isJsonOutput()) {
|
|
527
527
|
printJson(response.data);
|
|
528
528
|
return;
|
|
@@ -637,7 +637,7 @@ async function handleAgentsStats() {
|
|
|
637
637
|
printJson(response.data);
|
|
638
638
|
return;
|
|
639
639
|
}
|
|
640
|
-
const
|
|
640
|
+
const stats = response.data;
|
|
641
641
|
printBlank();
|
|
642
642
|
console.log(chalk.bold("Agent Statistics:"));
|
|
643
643
|
console.log(chalk.dim("\u2500".repeat(40)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/agents.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport type { Agent, CreateAgentData, SyncAgentsResult } 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 agents command group\n */\nexport function createAgentsCommand(): Command {\n const agents = new Command('agents')\n .description('Manage AI agents (VAPI, ElevenLabs, custom)')\n .addHelpText(\n 'after',\n `\nWhat are Agents?\n Agents are AI-powered voice assistants from various platforms (VAPI, ElevenLabs)\n or custom implementations. They can be tested with scenarios and analyzed with\n scorecards.\n\nQuick Start:\n $ chanl agents list # List all agents\n $ chanl agents get <id> # View agent details\n $ chanl agents sync vapi # Sync from VAPI\n $ chanl agents create --template vapi # Generate VAPI template\n $ chanl agents stats # View statistics\n\nWorkflow:\n 1. Sync agents from your platform (vapi, elevenlabs)\n 2. Or create custom agents with 'create -f agent.json'\n 3. Test agents with 'chanl scenarios run <id> --agent <agentId>'\n 4. Analyze results with 'chanl calls analysis <id>'`\n );\n\n // agents list\n agents\n .command('list')\n .description('List all agents')\n .option('-p, --platform <platform>', 'Filter by platform (vapi, elevenlabs, custom)')\n .option('-s, --status <status>', 'Filter by status (active, inactive)')\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 agents list # List all agents\n $ chanl agents list --platform vapi # Filter by platform\n $ chanl agents list --status active # Only active agents\n $ chanl agents list --json # Output as JSON`\n )\n .action(handleAgentsList);\n\n // agents get <id>\n agents\n .command('get <id>')\n .description('Get agent details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents get abc123 # Get agent details\n $ chanl agents get abc123 --json # Output as JSON`\n )\n .action(handleAgentsGet);\n\n // agents create\n agents\n .command('create')\n .description('Create a new agent')\n .option('-f, --file <path>', 'Path to JSON file with agent data')\n .option('--template [platform]', 'Output a template JSON (vapi, elevenlabs, custom)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents create --template vapi > agent.json # VAPI template\n $ chanl agents create --template custom > agent.json # Custom template\n $ chanl agents create -f agent.json # Create from file\n\nTemplates include platform-specific configurations and examples.`\n )\n .action(handleAgentsCreate);\n\n // agents update <id>\n agents\n .command('update <id>')\n .description('Update an existing agent')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .option('--sync-to-vapi', 'Sync changes back to VAPI platform')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents update abc123 -f updates.json\n $ chanl agents update abc123 -f updates.json --sync-to-vapi`\n )\n .action(handleAgentsUpdate);\n\n // agents delete <id>\n agents\n .command('delete <id>')\n .description('Delete an agent')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--delete-from-integration', 'Also delete from platform (VAPI, etc.)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents delete abc123\n $ chanl agents delete abc123 --delete-from-integration`\n )\n .action(handleAgentsDelete);\n\n // agents sync <platform>\n agents\n .command('sync <platform>')\n .description('Sync agents from a platform (vapi, bland, twilio)')\n .option('-f, --force', 'Force update existing agents')\n .option('--clean', 'Delete all existing agents for this platform before sync')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents sync vapi # Sync from VAPI\n $ chanl agents sync vapi --force # Force update all\n $ chanl agents sync vapi --clean # Clean sync (delete first)`\n )\n .action(handleAgentsSync);\n\n // agents sync-all\n agents\n .command('sync-all')\n .description('Sync agents from all configured platforms')\n .option('-f, --force', 'Force update existing agents')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents sync-all # Sync from all platforms\n $ chanl agents sync-all --force # Force update all`\n )\n .action(handleAgentsSyncAll);\n\n // agents import\n agents\n .command('import')\n .description('Import a specific agent from a third-party platform')\n .requiredOption('--from <platform>', 'Source platform (vapi, retell, bland)')\n .requiredOption('--agent-id <id>', 'External agent ID on the source platform')\n .option('-n, --name <name>', 'Override the agent name')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents import --from vapi --agent-id asst_abc123\n $ chanl agents import --from retell --agent-id ret_xyz --name \"My Agent\"\n $ chanl agents import --from vapi --agent-id asst_abc --json`\n )\n .action(handleAgentsImport);\n\n // agents publish\n agents\n .command('publish <agent-id>')\n .description('Publish an agent to a third-party platform')\n .requiredOption('--to <platform>', 'Target platform (vapi, retell, bland)')\n .option('--target <ext-id>', 'External agent ID to update (omit to create new)')\n .option('--with-mcp', 'Include MCP URL for tool access')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents publish agent_123 --to vapi\n $ chanl agents publish agent_123 --to vapi --with-mcp\n $ chanl agents publish agent_123 --to vapi --target ext_456\n $ chanl agents publish agent_123 --to vapi --json`\n )\n .action(handleAgentsPublish);\n\n // agents push-mcp\n agents\n .command('push-mcp <agent-id>')\n .description('Push MCP URL to a third-party agent for tool access')\n .requiredOption('--to <platform>', 'Target platform (vapi, retell, bland)')\n .option('--target <ext-id>', 'External agent ID (omit to use default)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents push-mcp agent_123 --to vapi\n $ chanl agents push-mcp agent_123 --to vapi --target ext_456\n $ chanl agents push-mcp agent_123 --to vapi --json`\n )\n .action(handleAgentsPushMcp);\n\n // agents stats\n agents\n .command('stats')\n .description('View agent statistics')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents stats # View statistics\n $ chanl agents stats --json # Output as JSON`\n )\n .action(handleAgentsStats);\n\n return agents;\n}\n\n/**\n * Format agent status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'inactive':\n return chalk.gray('inactive');\n case 'error':\n return chalk.red('error');\n case 'training':\n return chalk.cyan('training');\n case 'maintenance':\n return chalk.yellow('maintenance');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Format platform with color\n */\nfunction formatPlatform(platform?: string): string {\n switch (platform) {\n case 'vapi':\n return chalk.blue('vapi');\n case 'elevenlabs':\n return chalk.magenta('elevenlabs');\n case 'custom':\n return chalk.cyan('custom');\n default:\n return chalk.gray(platform || 'unknown');\n }\n}\n\n/**\n * Get agent template for a platform\n */\nfunction getAgentTemplate(platform: string = 'custom'): CreateAgentData {\n const baseTemplate: CreateAgentData = {\n platform: 'custom',\n name: 'My Custom Agent',\n type: 'Voice Assistant',\n status: 'inactive',\n useCase: 'support',\n description: 'A custom AI agent for customer support',\n configuration: {\n prompt: 'You are a helpful customer support agent. Be friendly and professional.',\n model: 'gpt-4o',\n },\n autoAnalysisEnabled: true,\n simulationMode: 'text',\n };\n\n if (platform === 'vapi') {\n return {\n ...baseTemplate,\n platform: 'vapi',\n platformAgentId: 'YOUR_VAPI_ASSISTANT_ID',\n name: 'VAPI Support Agent',\n description: 'VAPI-powered customer support agent',\n phoneNumbers: ['+1234567890'],\n testPhoneNumber: '+1234567890',\n configuration: {\n prompt: 'You are a helpful customer support agent.',\n model: 'gpt-4o',\n voice: 'YOUR_VOICE_ID',\n transcriber: 'deepgram',\n vapi: {\n firstMessage: 'Hello! How can I help you today?',\n webhookUrl: 'https://your-domain.com/webhooks/vapi',\n },\n },\n defaultSimulationChannel: 'websocket',\n simulationMode: 'websocket',\n };\n }\n\n if (platform === 'elevenlabs') {\n return {\n ...baseTemplate,\n platform: 'elevenlabs',\n platformAgentId: 'YOUR_ELEVENLABS_AGENT_ID',\n name: 'ElevenLabs Voice Agent',\n type: 'Text-to-Speech',\n description: 'ElevenLabs-powered voice agent',\n configuration: {\n prompt: 'You are a helpful assistant.',\n voice: 'YOUR_ELEVENLABS_VOICE_ID',\n elevenlabs: {},\n },\n };\n }\n\n return baseTemplate;\n}\n\n/**\n * Handle agents list command\n */\nasync function handleAgentsList(options: {\n platform?: string;\n status?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching agents...').start();\n\n try {\n const response = await sdk.agents.list({\n provider: options.platform,\n status: options.status,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch agents', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { agents, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (agents.length === 0) {\n printInfo('No agents found');\n printInfo(\"Use 'chanl agents sync vapi' to import from VAPI\");\n printInfo(\"Or 'chanl agents create --template' to create a custom agent\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Platform', 'Status', 'Created'],\n agents.map((a: Agent) => [\n a.id.slice(-12),\n a.name.slice(0, 25),\n formatPlatform(a.provider),\n formatStatus(a.status),\n formatDate(a.createdAt),\n ])\n );\n\n printBlank();\n if (pagination) {\n printInfo(`Total: ${pagination.total} agents (Page ${pagination.page} of ${pagination.totalPages})`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch agents');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents get command\n */\nasync function handleAgentsGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching agent...').start();\n\n try {\n const response = await sdk.agents.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch agent', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const { agent } = response.data;\n printBlank();\n console.log(chalk.bold('Agent Details:'));\n console.log(` ID: ${agent.id}`);\n console.log(` Name: ${agent.name}`);\n console.log(` Platform: ${formatPlatform(agent.provider)}`);\n console.log(` Status: ${formatStatus(agent.status)}`);\n if (agent.providerId) console.log(` Platform ID: ${agent.providerId}`);\n if (agent.description) console.log(` Description: ${agent.description}`);\n console.log(` Created: ${formatDate(agent.createdAt)}`);\n console.log(` Updated: ${formatDate(agent.updatedAt)}`);\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents create command\n */\nasync function handleAgentsCreate(options: {\n file?: string;\n template?: string | boolean;\n}): Promise<void> {\n // Handle template output\n if (options.template !== undefined) {\n const platform = typeof options.template === 'string' ? options.template : 'custom';\n const template = getAgentTemplate(platform);\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 agent data or '--template [platform]' 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 agentData: CreateAgentData;\n try {\n const content = readFileSync(options.file, 'utf-8');\n agentData = 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 agent...').start();\n\n try {\n const response = await sdk.agents.create(agentData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create agent', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const { agent } = response.data;\n printSuccess(`Agent created: ${agent.name}`);\n printLabel('ID', agent.id);\n printLabel('Platform', agent.provider || 'custom');\n } catch (error) {\n spinner.fail('Failed to create agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents update command\n */\nasync function handleAgentsUpdate(\n id: string,\n options: { file?: string; syncToVapi?: boolean }\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<CreateAgentData> & { syncToVapi?: boolean };\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 // Add syncToVapi flag if specified\n if (options.syncToVapi) {\n updateData.syncToVapi = true;\n }\n\n const spinner = ora('Updating agent...').start();\n\n try {\n const response = await sdk.agents.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update agent', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const { agent } = response.data;\n printSuccess(`Agent updated: ${agent.name}`);\n if (options.syncToVapi) {\n printInfo('Changes synced to VAPI');\n }\n } catch (error) {\n spinner.fail('Failed to update agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents delete command\n */\nasync function handleAgentsDelete(\n id: string,\n options: { yes?: boolean; deleteFromIntegration?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n if (!options.yes) {\n printInfo(`About to delete agent: ${id}`);\n if (options.deleteFromIntegration) {\n printInfo('This will also delete the agent from the integration platform');\n }\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n }\n\n const spinner = ora('Deleting agent...').start();\n\n try {\n const response = await sdk.agents.delete(id, {\n deleteFromIntegration: options.deleteFromIntegration,\n });\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete agent', 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(`Agent deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents sync command\n */\nasync function handleAgentsSync(\n platform: string,\n options: { force?: boolean; clean?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const validPlatforms = ['vapi', 'bland', 'twilio'];\n if (!validPlatforms.includes(platform)) {\n printError('Invalid platform', `Valid platforms: ${validPlatforms.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora(`Syncing agents from ${platform}...`).start();\n\n try {\n const response = await sdk.agents.sync(platform as 'vapi' | 'bland' | 'twilio', {\n forceUpdate: options.force,\n cleanBeforeSync: options.clean,\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to sync agents', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const result = response.data.result as SyncAgentsResult;\n printBlank();\n console.log(chalk.bold('Sync Results:'));\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${chalk.green(result.created.toString())}`);\n console.log(` Updated: ${chalk.cyan(result.updated.toString())}`);\n if (result.errors > 0) {\n console.log(` Errors: ${chalk.red(result.errors.toString())}`);\n }\n\n if (result.details && result.details.length > 0) {\n console.log(chalk.bold('\\nDetails:'));\n for (const detail of result.details.slice(0, 10)) {\n const statusColor =\n detail.status === 'created'\n ? chalk.green\n : detail.status === 'updated'\n ? chalk.cyan\n : detail.status === 'error'\n ? chalk.red\n : chalk.gray;\n console.log(` ${detail.name.slice(0, 30)}: ${statusColor(detail.status)}`);\n }\n if (result.details.length > 10) {\n printInfo(`... and ${result.details.length - 10} more`);\n }\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to sync agents');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents sync-all command\n */\nasync function handleAgentsSyncAll(options: { force?: boolean }): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Syncing agents from all platforms...').start();\n\n try {\n const response = await sdk.agents.syncAll({\n forceUpdate: options.force,\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to sync agents', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const result = response.data.result as SyncAgentsResult;\n printSuccess(result.message || 'Sync completed');\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${chalk.green(result.created.toString())}`);\n console.log(` Updated: ${chalk.cyan(result.updated.toString())}`);\n if (result.errors > 0) {\n console.log(` Errors: ${chalk.red(result.errors.toString())}`);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to sync agents');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents stats command\n */\nasync function handleAgentsImport(options: {\n from: string;\n agentId: string;\n name?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Importing agent from ${options.from}...`).start();\n\n try {\n const response = await sdk.agents.importFromPlatform({\n platform: options.from,\n externalAgentId: options.agentId,\n ...(options.name ? { name: options.name } : {}),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Import failed', response.message || 'Could not import agent');\n process.exitCode = 1;\n return;\n }\n\n const agent = response.data.agent || response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n printSuccess(`Agent imported from ${options.from}`);\n printBlank();\n printLabel('Name', agent.name);\n printLabel('Chanl ID', agent.id);\n printLabel('Platform', (agent as any).platform || options.from);\n printLabel('External ID', (agent as any).platformAgentId || options.agentId);\n printLabel('Status', agent.status || 'active');\n if (agent.deployments?.length) {\n const dep = agent.deployments[0]!;\n printLabel('Deployment', `${dep.orchestrator} โ ${dep.externalId} (${dep.status})`);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Import failed');\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', errorMessage);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents publish command\n */\nasync function handleAgentsPublish(\n agentId: string,\n options: {\n to: string;\n target?: string;\n withMcp?: boolean;\n },\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Publishing agent to ${options.to}...`).start();\n\n try {\n const response = await sdk.agents.publish(agentId, {\n platform: options.to,\n ...(options.target ? { targetExternalId: options.target } : {}),\n ...(options.withMcp ? { includeMcp: true } : {}),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Publish failed', response.message || 'Could not publish agent');\n process.exitCode = 1;\n return;\n }\n\n const result = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n printSuccess(`Agent ${result.action} on ${result.platform}`);\n printBlank();\n printLabel('Action', result.action);\n printLabel('Platform', result.platform);\n printLabel('External ID', result.externalId);\n printLabel('Status', result.status);\n if (result.mcpUrl) {\n printLabel('MCP URL', result.mcpUrl);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Publish failed');\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', errorMessage);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents push-mcp command\n */\nasync function handleAgentsPushMcp(\n agentId: string,\n options: {\n to: string;\n target?: string;\n },\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Pushing MCP URL to ${options.to}...`).start();\n\n try {\n const response = await sdk.agents.pushMcp(agentId, {\n platform: options.to,\n ...(options.target ? { targetExternalId: options.target } : {}),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Push MCP failed', response.message || 'Could not push MCP URL');\n process.exitCode = 1;\n return;\n }\n\n const result = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n printSuccess(`MCP URL pushed to ${result.platform}`);\n printBlank();\n printLabel('MCP URL', result.mcpUrl);\n printLabel('Platform', result.platform);\n printLabel('External ID', result.externalId);\n printLabel('Status', result.status);\n printBlank();\n } catch (error) {\n spinner.fail('Push MCP failed');\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', errorMessage);\n process.exitCode = 1;\n }\n}\n\nasync function handleAgentsStats(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching statistics...').start();\n\n try {\n const response = await sdk.agents.getStats();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch statistics', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const { stats } = response.data;\n printBlank();\n console.log(chalk.bold('Agent Statistics:'));\n console.log(chalk.dim('โ'.repeat(40)));\n console.log(` Total Agents: ${stats.totalAgents}`);\n console.log(` Average Score: ${stats.avgScore !== null ? `${stats.avgScore.toFixed(1)}%` : '-'}`);\n console.log(` Tool Failures: ${stats.toolFailures}`);\n console.log(` Top Provider: ${stats.topProvider || '-'}`);\n\n if (stats.byPlatform && Object.keys(stats.byPlatform).length > 0) {\n console.log(chalk.bold('\\n By Platform:'));\n for (const [platform, count] of Object.entries(stats.byPlatform)) {\n console.log(` ${formatPlatform(platform)}: ${count}`);\n }\n }\n\n if (stats.byStatus && Object.keys(stats.byStatus).length > 0) {\n console.log(chalk.bold('\\n By Status:'));\n for (const [status, count] of Object.entries(stats.byStatus)) {\n console.log(` ${formatStatus(status)}: ${count}`);\n }\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch statistics');\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/agents.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport { readFileSync } from 'fs';\nimport type { Agent, CreateAgentData, SyncAgentsResult } 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 agents command group\n */\nexport function createAgentsCommand(): Command {\n const agents = new Command('agents')\n .description('Manage AI agents (VAPI, ElevenLabs, custom)')\n .addHelpText(\n 'after',\n `\nWhat are Agents?\n Agents are AI-powered voice assistants from various platforms (VAPI, ElevenLabs)\n or custom implementations. They can be tested with scenarios and analyzed with\n scorecards.\n\nQuick Start:\n $ chanl agents list # List all agents\n $ chanl agents get <id> # View agent details\n $ chanl agents sync vapi # Sync from VAPI\n $ chanl agents create --template vapi # Generate VAPI template\n $ chanl agents stats # View statistics\n\nWorkflow:\n 1. Sync agents from your platform (vapi, elevenlabs)\n 2. Or create custom agents with 'create -f agent.json'\n 3. Test agents with 'chanl scenarios run <id> --agent <agentId>'\n 4. Analyze results with 'chanl calls analysis <id>'`\n );\n\n // agents list\n agents\n .command('list')\n .description('List all agents')\n .option('-p, --platform <platform>', 'Filter by platform (vapi, elevenlabs, custom)')\n .option('-s, --status <status>', 'Filter by status (active, inactive)')\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 agents list # List all agents\n $ chanl agents list --platform vapi # Filter by platform\n $ chanl agents list --status active # Only active agents\n $ chanl agents list --json # Output as JSON`\n )\n .action(handleAgentsList);\n\n // agents get <id>\n agents\n .command('get <id>')\n .description('Get agent details')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents get abc123 # Get agent details\n $ chanl agents get abc123 --json # Output as JSON`\n )\n .action(handleAgentsGet);\n\n // agents create\n agents\n .command('create')\n .description('Create a new agent')\n .option('-f, --file <path>', 'Path to JSON file with agent data')\n .option('--template [platform]', 'Output a template JSON (vapi, elevenlabs, custom)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents create --template vapi > agent.json # VAPI template\n $ chanl agents create --template custom > agent.json # Custom template\n $ chanl agents create -f agent.json # Create from file\n\nTemplates include platform-specific configurations and examples.`\n )\n .action(handleAgentsCreate);\n\n // agents update <id>\n agents\n .command('update <id>')\n .description('Update an existing agent')\n .option('-f, --file <path>', 'Path to JSON file with update data')\n .option('--sync-to-vapi', 'Sync changes back to VAPI platform')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents update abc123 -f updates.json\n $ chanl agents update abc123 -f updates.json --sync-to-vapi`\n )\n .action(handleAgentsUpdate);\n\n // agents delete <id>\n agents\n .command('delete <id>')\n .description('Delete an agent')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--delete-from-integration', 'Also delete from platform (VAPI, etc.)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents delete abc123\n $ chanl agents delete abc123 --delete-from-integration`\n )\n .action(handleAgentsDelete);\n\n // agents sync <platform>\n agents\n .command('sync <platform>')\n .description('Sync agents from a platform (vapi, bland, twilio)')\n .option('-f, --force', 'Force update existing agents')\n .option('--clean', 'Delete all existing agents for this platform before sync')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents sync vapi # Sync from VAPI\n $ chanl agents sync vapi --force # Force update all\n $ chanl agents sync vapi --clean # Clean sync (delete first)`\n )\n .action(handleAgentsSync);\n\n // agents sync-all\n agents\n .command('sync-all')\n .description('Sync agents from all configured platforms')\n .option('-f, --force', 'Force update existing agents')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents sync-all # Sync from all platforms\n $ chanl agents sync-all --force # Force update all`\n )\n .action(handleAgentsSyncAll);\n\n // agents import\n agents\n .command('import')\n .description('Import a specific agent from a third-party platform')\n .requiredOption('--from <platform>', 'Source platform (vapi, retell, bland)')\n .requiredOption('--agent-id <id>', 'External agent ID on the source platform')\n .option('-n, --name <name>', 'Override the agent name')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents import --from vapi --agent-id asst_abc123\n $ chanl agents import --from retell --agent-id ret_xyz --name \"My Agent\"\n $ chanl agents import --from vapi --agent-id asst_abc --json`\n )\n .action(handleAgentsImport);\n\n // agents publish\n agents\n .command('publish <agent-id>')\n .description('Publish an agent to a third-party platform')\n .requiredOption('--to <platform>', 'Target platform (vapi, retell, bland)')\n .option('--target <ext-id>', 'External agent ID to update (omit to create new)')\n .option('--with-mcp', 'Include MCP URL for tool access')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents publish agent_123 --to vapi\n $ chanl agents publish agent_123 --to vapi --with-mcp\n $ chanl agents publish agent_123 --to vapi --target ext_456\n $ chanl agents publish agent_123 --to vapi --json`\n )\n .action(handleAgentsPublish);\n\n // agents push-mcp\n agents\n .command('push-mcp <agent-id>')\n .description('Push MCP URL to a third-party agent for tool access')\n .requiredOption('--to <platform>', 'Target platform (vapi, retell, bland)')\n .option('--target <ext-id>', 'External agent ID (omit to use default)')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents push-mcp agent_123 --to vapi\n $ chanl agents push-mcp agent_123 --to vapi --target ext_456\n $ chanl agents push-mcp agent_123 --to vapi --json`\n )\n .action(handleAgentsPushMcp);\n\n // agents stats\n agents\n .command('stats')\n .description('View agent statistics')\n .addHelpText(\n 'after',\n `\nExamples:\n $ chanl agents stats # View statistics\n $ chanl agents stats --json # Output as JSON`\n )\n .action(handleAgentsStats);\n\n return agents;\n}\n\n/**\n * Format agent status with color\n */\nfunction formatStatus(status?: string): string {\n switch (status) {\n case 'active':\n return chalk.green('active');\n case 'inactive':\n return chalk.gray('inactive');\n case 'error':\n return chalk.red('error');\n case 'training':\n return chalk.cyan('training');\n case 'maintenance':\n return chalk.yellow('maintenance');\n default:\n return chalk.gray(status || 'unknown');\n }\n}\n\n/**\n * Format platform with color\n */\nfunction formatPlatform(platform?: string): string {\n switch (platform) {\n case 'vapi':\n return chalk.blue('vapi');\n case 'elevenlabs':\n return chalk.magenta('elevenlabs');\n case 'custom':\n return chalk.cyan('custom');\n default:\n return chalk.gray(platform || 'unknown');\n }\n}\n\n/**\n * Get agent template for a platform\n */\nfunction getAgentTemplate(platform: string = 'custom'): CreateAgentData {\n const baseTemplate: CreateAgentData = {\n platform: 'custom',\n name: 'My Custom Agent',\n type: 'Voice Assistant',\n status: 'inactive',\n useCase: 'support',\n description: 'A custom AI agent for customer support',\n configuration: {\n prompt: 'You are a helpful customer support agent. Be friendly and professional.',\n model: 'gpt-4o',\n },\n autoAnalysisEnabled: true,\n simulationMode: 'text',\n };\n\n if (platform === 'vapi') {\n return {\n ...baseTemplate,\n platform: 'vapi',\n platformAgentId: 'YOUR_VAPI_ASSISTANT_ID',\n name: 'VAPI Support Agent',\n description: 'VAPI-powered customer support agent',\n phoneNumbers: ['+1234567890'],\n testPhoneNumber: '+1234567890',\n configuration: {\n prompt: 'You are a helpful customer support agent.',\n model: 'gpt-4o',\n voice: 'YOUR_VOICE_ID',\n transcriber: 'deepgram',\n vapi: {\n firstMessage: 'Hello! How can I help you today?',\n webhookUrl: 'https://your-domain.com/webhooks/vapi',\n },\n },\n defaultSimulationChannel: 'websocket',\n simulationMode: 'websocket',\n };\n }\n\n if (platform === 'elevenlabs') {\n return {\n ...baseTemplate,\n platform: 'elevenlabs',\n platformAgentId: 'YOUR_ELEVENLABS_AGENT_ID',\n name: 'ElevenLabs Voice Agent',\n type: 'Text-to-Speech',\n description: 'ElevenLabs-powered voice agent',\n configuration: {\n prompt: 'You are a helpful assistant.',\n voice: 'YOUR_ELEVENLABS_VOICE_ID',\n elevenlabs: {},\n },\n };\n }\n\n return baseTemplate;\n}\n\n/**\n * Handle agents list command\n */\nasync function handleAgentsList(options: {\n platform?: string;\n status?: string;\n limit: string;\n page: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching agents...').start();\n\n try {\n const response = await sdk.agents.list({\n provider: options.platform,\n status: options.status,\n limit: parseInt(options.limit, 10),\n page: parseInt(options.page, 10),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch agents', response.message);\n process.exitCode = 1;\n return;\n }\n\n const { agents, pagination } = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n if (agents.length === 0) {\n printInfo('No agents found');\n printInfo(\"Use 'chanl agents sync vapi' to import from VAPI\");\n printInfo(\"Or 'chanl agents create --template' to create a custom agent\");\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['ID', 'Name', 'Platform', 'Status', 'Created'],\n agents.map((a: Agent) => [\n a.id.slice(-12),\n a.name.slice(0, 25),\n formatPlatform(a.provider),\n formatStatus(a.status),\n formatDate(a.createdAt),\n ])\n );\n\n printBlank();\n if (pagination) {\n printInfo(`Total: ${pagination.total} agents (Page ${pagination.page} of ${pagination.totalPages})`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch agents');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents get command\n */\nasync function handleAgentsGet(id: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching agent...').start();\n\n try {\n const response = await sdk.agents.get(id);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch agent', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const agent = response.data;\n printBlank();\n console.log(chalk.bold('Agent Details:'));\n console.log(` ID: ${agent.id}`);\n console.log(` Name: ${agent.name}`);\n console.log(` Platform: ${formatPlatform(agent.provider)}`);\n console.log(` Status: ${formatStatus(agent.status)}`);\n if (agent.providerId) console.log(` Platform ID: ${agent.providerId}`);\n if (agent.description) console.log(` Description: ${agent.description}`);\n console.log(` Created: ${formatDate(agent.createdAt)}`);\n console.log(` Updated: ${formatDate(agent.updatedAt)}`);\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents create command\n */\nasync function handleAgentsCreate(options: {\n file?: string;\n template?: string | boolean;\n}): Promise<void> {\n // Handle template output\n if (options.template !== undefined) {\n const platform = typeof options.template === 'string' ? options.template : 'custom';\n const template = getAgentTemplate(platform);\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 agent data or '--template [platform]' 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 agentData: CreateAgentData;\n try {\n const content = readFileSync(options.file, 'utf-8');\n agentData = 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 agent...').start();\n\n try {\n const response = await sdk.agents.create(agentData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to create agent', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const agent = response.data;\n printSuccess(`Agent created: ${agent.name}`);\n printLabel('ID', agent.id);\n printLabel('Platform', agent.provider || 'custom');\n } catch (error) {\n spinner.fail('Failed to create agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents update command\n */\nasync function handleAgentsUpdate(\n id: string,\n options: { file?: string; syncToVapi?: boolean }\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<CreateAgentData> & { syncToVapi?: boolean };\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 // Add syncToVapi flag if specified\n if (options.syncToVapi) {\n updateData.syncToVapi = true;\n }\n\n const spinner = ora('Updating agent...').start();\n\n try {\n const response = await sdk.agents.update(id, updateData);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to update agent', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const agent = response.data;\n printSuccess(`Agent updated: ${agent.name}`);\n if (options.syncToVapi) {\n printInfo('Changes synced to VAPI');\n }\n } catch (error) {\n spinner.fail('Failed to update agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents delete command\n */\nasync function handleAgentsDelete(\n id: string,\n options: { yes?: boolean; deleteFromIntegration?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n if (!options.yes) {\n printInfo(`About to delete agent: ${id}`);\n if (options.deleteFromIntegration) {\n printInfo('This will also delete the agent from the integration platform');\n }\n printInfo(\"Use '--yes' flag to skip this confirmation\");\n }\n\n const spinner = ora('Deleting agent...').start();\n\n try {\n const response = await sdk.agents.delete(id, {\n deleteFromIntegration: options.deleteFromIntegration,\n });\n\n spinner.stop();\n\n if (!response.success) {\n printError('Failed to delete agent', 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(`Agent deleted: ${id}`);\n } catch (error) {\n spinner.fail('Failed to delete agent');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents sync command\n */\nasync function handleAgentsSync(\n platform: string,\n options: { force?: boolean; clean?: boolean }\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const validPlatforms = ['vapi', 'bland', 'twilio'];\n if (!validPlatforms.includes(platform)) {\n printError('Invalid platform', `Valid platforms: ${validPlatforms.join(', ')}`);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora(`Syncing agents from ${platform}...`).start();\n\n try {\n const response = await sdk.agents.sync(platform as 'vapi' | 'bland' | 'twilio', {\n forceUpdate: options.force,\n cleanBeforeSync: options.clean,\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to sync agents', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const result = response.data as SyncAgentsResult;\n printBlank();\n console.log(chalk.bold('Sync Results:'));\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${chalk.green(result.created.toString())}`);\n console.log(` Updated: ${chalk.cyan(result.updated.toString())}`);\n if (result.errors > 0) {\n console.log(` Errors: ${chalk.red(result.errors.toString())}`);\n }\n\n if (result.details && result.details.length > 0) {\n console.log(chalk.bold('\\nDetails:'));\n for (const detail of result.details.slice(0, 10)) {\n const statusColor =\n detail.status === 'created'\n ? chalk.green\n : detail.status === 'updated'\n ? chalk.cyan\n : detail.status === 'error'\n ? chalk.red\n : chalk.gray;\n console.log(` ${detail.name.slice(0, 30)}: ${statusColor(detail.status)}`);\n }\n if (result.details.length > 10) {\n printInfo(`... and ${result.details.length - 10} more`);\n }\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to sync agents');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents sync-all command\n */\nasync function handleAgentsSyncAll(options: { force?: boolean }): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Syncing agents from all platforms...').start();\n\n try {\n const response = await sdk.agents.syncAll({\n forceUpdate: options.force,\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to sync agents', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const result = response.data as SyncAgentsResult;\n printSuccess(result.message || 'Sync completed');\n console.log(` Processed: ${result.processed}`);\n console.log(` Created: ${chalk.green(result.created.toString())}`);\n console.log(` Updated: ${chalk.cyan(result.updated.toString())}`);\n if (result.errors > 0) {\n console.log(` Errors: ${chalk.red(result.errors.toString())}`);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to sync agents');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents stats command\n */\nasync function handleAgentsImport(options: {\n from: string;\n agentId: string;\n name?: string;\n}): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Importing agent from ${options.from}...`).start();\n\n try {\n const response = await sdk.agents.importFromPlatform({\n platform: options.from,\n externalAgentId: options.agentId,\n ...(options.name ? { name: options.name } : {}),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Import failed', response.message || 'Could not import agent');\n process.exitCode = 1;\n return;\n }\n\n const agent = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n printSuccess(`Agent imported from ${options.from}`);\n printBlank();\n printLabel('Name', agent.name);\n printLabel('Chanl ID', agent.id);\n printLabel('Platform', (agent as any).platform || options.from);\n printLabel('External ID', (agent as any).platformAgentId || options.agentId);\n printLabel('Status', agent.status || 'active');\n if (agent.deployments?.length) {\n const dep = agent.deployments[0]!;\n printLabel('Deployment', `${dep.orchestrator} โ ${dep.externalId} (${dep.status})`);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Import failed');\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', errorMessage);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents publish command\n */\nasync function handleAgentsPublish(\n agentId: string,\n options: {\n to: string;\n target?: string;\n withMcp?: boolean;\n },\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Publishing agent to ${options.to}...`).start();\n\n try {\n const response = await sdk.agents.publish(agentId, {\n platform: options.to,\n ...(options.target ? { targetExternalId: options.target } : {}),\n ...(options.withMcp ? { includeMcp: true } : {}),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Publish failed', response.message || 'Could not publish agent');\n process.exitCode = 1;\n return;\n }\n\n const result = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n printSuccess(`Agent ${result.action} on ${result.platform}`);\n printBlank();\n printLabel('Action', result.action);\n printLabel('Platform', result.platform);\n printLabel('External ID', result.externalId);\n printLabel('Status', result.status);\n if (result.mcpUrl) {\n printLabel('MCP URL', result.mcpUrl);\n }\n printBlank();\n } catch (error) {\n spinner.fail('Publish failed');\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', errorMessage);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle agents push-mcp command\n */\nasync function handleAgentsPushMcp(\n agentId: string,\n options: {\n to: string;\n target?: string;\n },\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Pushing MCP URL to ${options.to}...`).start();\n\n try {\n const response = await sdk.agents.pushMcp(agentId, {\n platform: options.to,\n ...(options.target ? { targetExternalId: options.target } : {}),\n });\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Push MCP failed', response.message || 'Could not push MCP URL');\n process.exitCode = 1;\n return;\n }\n\n const result = response.data;\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n printBlank();\n printSuccess(`MCP URL pushed to ${result.platform}`);\n printBlank();\n printLabel('MCP URL', result.mcpUrl);\n printLabel('Platform', result.platform);\n printLabel('External ID', result.externalId);\n printLabel('Status', result.status);\n printBlank();\n } catch (error) {\n spinner.fail('Push MCP failed');\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', errorMessage);\n process.exitCode = 1;\n }\n}\n\nasync function handleAgentsStats(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching statistics...').start();\n\n try {\n const response = await sdk.agents.getStats();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch statistics', response.message);\n process.exitCode = 1;\n return;\n }\n\n if (isJsonOutput()) {\n printJson(response.data);\n return;\n }\n\n const stats = response.data;\n printBlank();\n console.log(chalk.bold('Agent Statistics:'));\n console.log(chalk.dim('โ'.repeat(40)));\n console.log(` Total Agents: ${stats.totalAgents}`);\n console.log(` Average Score: ${stats.avgScore !== null ? `${stats.avgScore.toFixed(1)}%` : '-'}`);\n console.log(` Tool Failures: ${stats.toolFailures}`);\n console.log(` Top Provider: ${stats.topProvider || '-'}`);\n\n if (stats.byPlatform && Object.keys(stats.byPlatform).length > 0) {\n console.log(chalk.bold('\\n By Platform:'));\n for (const [platform, count] of Object.entries(stats.byPlatform)) {\n console.log(` ${formatPlatform(platform)}: ${count}`);\n }\n }\n\n if (stats.byStatus && Object.keys(stats.byStatus).length > 0) {\n console.log(chalk.bold('\\n By Status:'));\n for (const [status, count] of Object.entries(stats.byStatus)) {\n console.log(` ${formatStatus(status)}: ${count}`);\n }\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch statistics');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n"],"mappings":"AAAA,SAAS,eAAe;AACxB,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAE7B,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,EAChC,YAAY,6CAA6C,EACzD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBF;AAGF,SACG,QAAQ,MAAM,EACd,YAAY,iBAAiB,EAC7B,OAAO,6BAA6B,+CAA+C,EACnF,OAAO,yBAAyB,qCAAqC,EACrE,OAAO,wBAAwB,4BAA4B,IAAI,EAC/D,OAAO,mBAAmB,eAAe,GAAG,EAC5C;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,OAAO,gBAAgB;AAG1B,SACG,QAAQ,UAAU,EAClB,YAAY,mBAAmB,EAC/B;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,eAAe;AAGzB,SACG,QAAQ,QAAQ,EAChB,YAAY,oBAAoB,EAChC,OAAO,qBAAqB,mCAAmC,EAC/D,OAAO,yBAAyB,mDAAmD,EACnF;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,aAAa,EACrB,YAAY,0BAA0B,EACtC,OAAO,qBAAqB,oCAAoC,EAChE,OAAO,kBAAkB,oCAAoC,EAC7D;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,aAAa,EACrB,YAAY,iBAAiB,EAC7B,OAAO,aAAa,0BAA0B,EAC9C,OAAO,6BAA6B,wCAAwC,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,iBAAiB,EACzB,YAAY,mDAAmD,EAC/D,OAAO,eAAe,8BAA8B,EACpD,OAAO,WAAW,0DAA0D,EAC5E;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,gBAAgB;AAG1B,SACG,QAAQ,UAAU,EAClB,YAAY,2CAA2C,EACvD,OAAO,eAAe,8BAA8B,EACpD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,mBAAmB;AAG7B,SACG,QAAQ,QAAQ,EAChB,YAAY,qDAAqD,EACjE,eAAe,qBAAqB,uCAAuC,EAC3E,eAAe,mBAAmB,0CAA0C,EAC5E,OAAO,qBAAqB,yBAAyB,EACrD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,kBAAkB;AAG5B,SACG,QAAQ,oBAAoB,EAC5B,YAAY,4CAA4C,EACxD,eAAe,mBAAmB,uCAAuC,EACzE,OAAO,qBAAqB,kDAAkD,EAC9E,OAAO,cAAc,iCAAiC,EACtD;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMF,EACC,OAAO,mBAAmB;AAG7B,SACG,QAAQ,qBAAqB,EAC7B,YAAY,qDAAqD,EACjE,eAAe,mBAAmB,uCAAuC,EACzE,OAAO,qBAAqB,yCAAyC,EACrE;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,mBAAmB;AAG7B,SACG,QAAQ,OAAO,EACf,YAAY,uBAAuB,EACnC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,EAIF,EACC,OAAO,iBAAiB;AAE3B,SAAO;AACT;AAKA,SAAS,aAAa,QAAyB;AAC7C,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,MAAM,MAAM,QAAQ;AAAA,IAC7B,KAAK;AACH,aAAO,MAAM,KAAK,UAAU;AAAA,IAC9B,KAAK;AACH,aAAO,MAAM,IAAI,OAAO;AAAA,IAC1B,KAAK;AACH,aAAO,MAAM,KAAK,UAAU;AAAA,IAC9B,KAAK;AACH,aAAO,MAAM,OAAO,aAAa;AAAA,IACnC;AACE,aAAO,MAAM,KAAK,UAAU,SAAS;AAAA,EACzC;AACF;AAKA,SAAS,eAAe,UAA2B;AACjD,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,MAAM,KAAK,MAAM;AAAA,IAC1B,KAAK;AACH,aAAO,MAAM,QAAQ,YAAY;AAAA,IACnC,KAAK;AACH,aAAO,MAAM,KAAK,QAAQ;AAAA,IAC5B;AACE,aAAO,MAAM,KAAK,YAAY,SAAS;AAAA,EAC3C;AACF;AAKA,SAAS,iBAAiB,WAAmB,UAA2B;AACtE,QAAM,eAAgC;AAAA,IACpC,UAAU;AAAA,IACV,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,IACb,eAAe;AAAA,MACb,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,EAClB;AAEA,MAAI,aAAa,QAAQ;AACvB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,aAAa;AAAA,MACb,cAAc,CAAC,aAAa;AAAA,MAC5B,iBAAiB;AAAA,MACjB,eAAe;AAAA,QACb,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,cAAc;AAAA,UACd,YAAY;AAAA,QACd;AAAA,MACF;AAAA,MACA,0BAA0B;AAAA,MAC1B,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,aAAa,cAAc;AAC7B,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,MACV,iBAAiB;AAAA,MACjB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa;AAAA,MACb,eAAe;AAAA,QACb,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,YAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAe,iBAAiB,SAKd;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,oBAAoB,EAAE,MAAM;AAEhD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,KAAK;AAAA,MACrC,UAAU,QAAQ;AAAA,MAClB,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,0BAA0B,SAAS,OAAO;AACrD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,EAAE,QAAQ,WAAW,IAAI,SAAS;AAExC,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,gBAAU,iBAAiB;AAC3B,gBAAU,kDAAkD;AAC5D,gBAAU,8DAA8D;AACxE;AAAA,IACF;AAEA,eAAW;AACX;AAAA,MACE,CAAC,MAAM,QAAQ,YAAY,UAAU,SAAS;AAAA,MAC9C,OAAO,IAAI,CAAC,MAAa;AAAA,QACvB,EAAE,GAAG,MAAM,GAAG;AAAA,QACd,EAAE,KAAK,MAAM,GAAG,EAAE;AAAA,QAClB,eAAe,EAAE,QAAQ;AAAA,QACzB,aAAa,EAAE,MAAM;AAAA,QACrB,WAAW,EAAE,SAAS;AAAA,MACxB,CAAC;AAAA,IACH;AAEA,eAAW;AACX,QAAI,YAAY;AACd,gBAAU,UAAU,WAAW,KAAK,iBAAiB,WAAW,IAAI,OAAO,WAAW,UAAU,GAAG;AAAA,IACrG;AAAA,EACF,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,gBAAgB,IAA2B;AACxD,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,mBAAmB,EAAE,MAAM;AAE/C,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,IAAI,EAAE;AAExC,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,yBAAyB,SAAS,OAAO;AACpD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS;AACvB,eAAW;AACX,YAAQ,IAAI,MAAM,KAAK,gBAAgB,CAAC;AACxC,YAAQ,IAAI,mBAAmB,MAAM,EAAE,EAAE;AACzC,YAAQ,IAAI,mBAAmB,MAAM,IAAI,EAAE;AAC3C,YAAQ,IAAI,mBAAmB,eAAe,MAAM,QAAQ,CAAC,EAAE;AAC/D,YAAQ,IAAI,mBAAmB,aAAa,MAAM,MAAM,CAAC,EAAE;AAC3D,QAAI,MAAM,WAAY,SAAQ,IAAI,mBAAmB,MAAM,UAAU,EAAE;AACvE,QAAI,MAAM,YAAa,SAAQ,IAAI,mBAAmB,MAAM,WAAW,EAAE;AACzE,YAAQ,IAAI,mBAAmB,WAAW,MAAM,SAAS,CAAC,EAAE;AAC5D,YAAQ,IAAI,mBAAmB,WAAW,MAAM,SAAS,CAAC,EAAE;AAC5D,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,uBAAuB;AACpC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,mBAAmB,SAGhB;AAEhB,MAAI,QAAQ,aAAa,QAAW;AAClC,UAAM,WAAW,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;AAC3E,UAAM,WAAW,iBAAiB,QAAQ;AAC1C,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C;AAAA,EACF;AAGA,MAAI,CAAC,QAAQ,MAAM;AACjB,eAAW,2BAA2B,oFAAoF;AAC1H,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAGV,MAAI;AACJ,MAAI;AACF,UAAM,UAAU,aAAa,QAAQ,MAAM,OAAO;AAClD,gBAAY,KAAK,MAAM,OAAO;AAAA,EAChC,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,uBAAuB,OAAO;AACzC,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,mBAAmB,EAAE,MAAM;AAE/C,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,OAAO,SAAS;AAElD,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,0BAA0B,SAAS,OAAO;AACrD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS;AACvB,iBAAa,kBAAkB,MAAM,IAAI,EAAE;AAC3C,eAAW,MAAM,MAAM,EAAE;AACzB,eAAW,YAAY,MAAM,YAAY,QAAQ;AAAA,EACnD,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,mBACb,IACA,SACe;AACf,MAAI,CAAC,QAAQ,MAAM;AACjB,eAAW,2BAA2B,wCAAwC;AAC9E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAGV,MAAI;AACJ,MAAI;AACF,UAAM,UAAU,aAAa,QAAQ,MAAM,OAAO;AAClD,iBAAa,KAAK,MAAM,OAAO;AAAA,EACjC,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,uBAAuB,OAAO;AACzC,YAAQ,WAAW;AACnB;AAAA,EACF;AAGA,MAAI,QAAQ,YAAY;AACtB,eAAW,aAAa;AAAA,EAC1B;AAEA,QAAM,UAAU,IAAI,mBAAmB,EAAE,MAAM;AAE/C,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,OAAO,IAAI,UAAU;AAEvD,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,0BAA0B,SAAS,OAAO;AACrD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS;AACvB,iBAAa,kBAAkB,MAAM,IAAI,EAAE;AAC3C,QAAI,QAAQ,YAAY;AACtB,gBAAU,wBAAwB;AAAA,IACpC;AAAA,EACF,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,mBACb,IACA,SACe;AACf,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,MAAI,CAAC,QAAQ,KAAK;AAChB,cAAU,0BAA0B,EAAE,EAAE;AACxC,QAAI,QAAQ,uBAAuB;AACjC,gBAAU,+DAA+D;AAAA,IAC3E;AACA,cAAU,4CAA4C;AAAA,EACxD;AAEA,QAAM,UAAU,IAAI,mBAAmB,EAAE,MAAM;AAE/C,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,OAAO,IAAI;AAAA,MAC3C,uBAAuB,QAAQ;AAAA,IACjC,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,SAAS;AACrB,iBAAW,0BAA0B,SAAS,OAAO;AACrD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,EAAE,SAAS,MAAM,SAAS,GAAG,CAAC;AACxC;AAAA,IACF;AAEA,iBAAa,kBAAkB,EAAE,EAAE;AAAA,EACrC,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,iBACb,UACA,SACe;AACf,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,iBAAiB,CAAC,QAAQ,SAAS,QAAQ;AACjD,MAAI,CAAC,eAAe,SAAS,QAAQ,GAAG;AACtC,eAAW,oBAAoB,oBAAoB,eAAe,KAAK,IAAI,CAAC,EAAE;AAC9E,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,uBAAuB,QAAQ,KAAK,EAAE,MAAM;AAEhE,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,KAAK,UAAyC;AAAA,MAC9E,aAAa,QAAQ;AAAA,MACrB,iBAAiB,QAAQ;AAAA,IAC3B,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,yBAAyB,SAAS,OAAO;AACpD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AACxB,eAAW;AACX,YAAQ,IAAI,MAAM,KAAK,eAAe,CAAC;AACvC,YAAQ,IAAI,gBAAgB,OAAO,SAAS,EAAE;AAC9C,YAAQ,IAAI,gBAAgB,MAAM,MAAM,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE;AACpE,YAAQ,IAAI,gBAAgB,MAAM,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE;AACnE,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,IAAI,gBAAgB,MAAM,IAAI,OAAO,OAAO,SAAS,CAAC,CAAC,EAAE;AAAA,IACnE;AAEA,QAAI,OAAO,WAAW,OAAO,QAAQ,SAAS,GAAG;AAC/C,cAAQ,IAAI,MAAM,KAAK,YAAY,CAAC;AACpC,iBAAW,UAAU,OAAO,QAAQ,MAAM,GAAG,EAAE,GAAG;AAChD,cAAM,cACJ,OAAO,WAAW,YACd,MAAM,QACN,OAAO,WAAW,YAChB,MAAM,OACN,OAAO,WAAW,UAChB,MAAM,MACN,MAAM;AAChB,gBAAQ,IAAI,KAAK,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,YAAY,OAAO,MAAM,CAAC,EAAE;AAAA,MAC5E;AACA,UAAI,OAAO,QAAQ,SAAS,IAAI;AAC9B,kBAAU,WAAW,OAAO,QAAQ,SAAS,EAAE,OAAO;AAAA,MACxD;AAAA,IACF;AAEA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,uBAAuB;AACpC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,oBAAoB,SAA6C;AAC9E,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,sCAAsC,EAAE,MAAM;AAElE,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,QAAQ;AAAA,MACxC,aAAa,QAAQ;AAAA,IACvB,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,yBAAyB,SAAS,OAAO;AACpD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AACxB,iBAAa,OAAO,WAAW,gBAAgB;AAC/C,YAAQ,IAAI,gBAAgB,OAAO,SAAS,EAAE;AAC9C,YAAQ,IAAI,gBAAgB,MAAM,MAAM,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE;AACpE,YAAQ,IAAI,gBAAgB,MAAM,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE;AACnE,QAAI,OAAO,SAAS,GAAG;AACrB,cAAQ,IAAI,gBAAgB,MAAM,IAAI,OAAO,OAAO,SAAS,CAAC,CAAC,EAAE;AAAA,IACnE;AACA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,uBAAuB;AACpC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,mBAAmB,SAIhB;AAChB,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,wBAAwB,QAAQ,IAAI,KAAK,EAAE,MAAM;AAErE,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,mBAAmB;AAAA,MACnD,UAAU,QAAQ;AAAA,MAClB,iBAAiB,QAAQ;AAAA,MACzB,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC/C,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,iBAAiB,SAAS,WAAW,wBAAwB;AACxE,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS;AAEvB,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,eAAW;AACX,iBAAa,uBAAuB,QAAQ,IAAI,EAAE;AAClD,eAAW;AACX,eAAW,QAAQ,MAAM,IAAI;AAC7B,eAAW,YAAY,MAAM,EAAE;AAC/B,eAAW,YAAa,MAAc,YAAY,QAAQ,IAAI;AAC9D,eAAW,eAAgB,MAAc,mBAAmB,QAAQ,OAAO;AAC3E,eAAW,UAAU,MAAM,UAAU,QAAQ;AAC7C,QAAI,MAAM,aAAa,QAAQ;AAC7B,YAAM,MAAM,MAAM,YAAY,CAAC;AAC/B,iBAAW,cAAc,GAAG,IAAI,YAAY,WAAM,IAAI,UAAU,KAAK,IAAI,MAAM,GAAG;AAAA,IACpF;AACA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,eAAe;AAC5B,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,eAAW,SAAS,YAAY;AAChC,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,oBACb,SACA,SAKe;AACf,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,uBAAuB,QAAQ,EAAE,KAAK,EAAE,MAAM;AAElE,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,QAAQ,SAAS;AAAA,MACjD,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,SAAS,EAAE,kBAAkB,QAAQ,OAAO,IAAI,CAAC;AAAA,MAC7D,GAAI,QAAQ,UAAU,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,IAChD,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,kBAAkB,SAAS,WAAW,yBAAyB;AAC1E,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AAExB,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,eAAW;AACX,iBAAa,SAAS,OAAO,MAAM,OAAO,OAAO,QAAQ,EAAE;AAC3D,eAAW;AACX,eAAW,UAAU,OAAO,MAAM;AAClC,eAAW,YAAY,OAAO,QAAQ;AACtC,eAAW,eAAe,OAAO,UAAU;AAC3C,eAAW,UAAU,OAAO,MAAM;AAClC,QAAI,OAAO,QAAQ;AACjB,iBAAW,WAAW,OAAO,MAAM;AAAA,IACrC;AACA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,gBAAgB;AAC7B,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,eAAW,SAAS,YAAY;AAChC,YAAQ,WAAW;AAAA,EACrB;AACF;AAKA,eAAe,oBACb,SACA,SAIe;AACf,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,sBAAsB,QAAQ,EAAE,KAAK,EAAE,MAAM;AAEjE,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,QAAQ,SAAS;AAAA,MACjD,UAAU,QAAQ;AAAA,MAClB,GAAI,QAAQ,SAAS,EAAE,kBAAkB,QAAQ,OAAO,IAAI,CAAC;AAAA,IAC/D,CAAC;AAED,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,mBAAmB,SAAS,WAAW,wBAAwB;AAC1E,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,SAAS,SAAS;AAExB,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,eAAW;AACX,iBAAa,qBAAqB,OAAO,QAAQ,EAAE;AACnD,eAAW;AACX,eAAW,WAAW,OAAO,MAAM;AACnC,eAAW,YAAY,OAAO,QAAQ;AACtC,eAAW,eAAe,OAAO,UAAU;AAC3C,eAAW,UAAU,OAAO,MAAM;AAClC,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,iBAAiB;AAC9B,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU;AAC9D,eAAW,SAAS,YAAY;AAChC,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,eAAe,oBAAmC;AAChD,QAAM,MAAM,UAAU;AACtB,MAAI,CAAC,IAAK;AAEV,QAAM,UAAU,IAAI,wBAAwB,EAAE,MAAM;AAEpD,MAAI;AACF,UAAM,WAAW,MAAM,IAAI,OAAO,SAAS;AAE3C,YAAQ,KAAK;AAEb,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,MAAM;AACvC,iBAAW,8BAA8B,SAAS,OAAO;AACzD,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,QAAI,aAAa,GAAG;AAClB,gBAAU,SAAS,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,QAAQ,SAAS;AACvB,eAAW;AACX,YAAQ,IAAI,MAAM,KAAK,mBAAmB,CAAC;AAC3C,YAAQ,IAAI,MAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,sBAAsB,MAAM,WAAW,EAAE;AACrD,YAAQ,IAAI,sBAAsB,MAAM,aAAa,OAAO,GAAG,MAAM,SAAS,QAAQ,CAAC,CAAC,MAAM,GAAG,EAAE;AACnG,YAAQ,IAAI,sBAAsB,MAAM,YAAY,EAAE;AACtD,YAAQ,IAAI,sBAAsB,MAAM,eAAe,GAAG,EAAE;AAE5D,QAAI,MAAM,cAAc,OAAO,KAAK,MAAM,UAAU,EAAE,SAAS,GAAG;AAChE,cAAQ,IAAI,MAAM,KAAK,kBAAkB,CAAC;AAC1C,iBAAW,CAAC,UAAU,KAAK,KAAK,OAAO,QAAQ,MAAM,UAAU,GAAG;AAChE,gBAAQ,IAAI,OAAO,eAAe,QAAQ,CAAC,KAAK,KAAK,EAAE;AAAA,MACzD;AAAA,IACF;AAEA,QAAI,MAAM,YAAY,OAAO,KAAK,MAAM,QAAQ,EAAE,SAAS,GAAG;AAC5D,cAAQ,IAAI,MAAM,KAAK,gBAAgB,CAAC;AACxC,iBAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AAC5D,gBAAQ,IAAI,OAAO,aAAa,MAAM,CAAC,KAAK,KAAK,EAAE;AAAA,MACrD;AAAA,IACF;AAEA,eAAW;AAAA,EACb,SAAS,OAAO;AACd,YAAQ,KAAK,4BAA4B;AACzC,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,eAAW,SAAS,OAAO;AAC3B,YAAQ,WAAW;AAAA,EACrB;AACF;","names":[]}
|
package/dist/commands/mcp.js
CHANGED
package/dist/commands/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/mcp.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport type { McpConfigResponse, McpStatusResponse, McpTool, McpToolCallResult } from '@chanl/sdk';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { configStore } from '../utils/config-store.js';\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} from '../utils/output.js';\n\n/**\n * Create the MCP command group\n */\nexport function createMcpCommand(): Command {\n const mcp = new Command('mcp')\n .description('MCP server configuration and status')\n .addHelpText(\n 'after',\n `\nWhat is MCP?\n Model Context Protocol (MCP) lets AI agents (Claude, Cursor, etc.) use your\n Chanl tools, knowledge base, and prompts. The MCP server bridges your workspace\n with AI clients.\n\nQuick Start:\n $ chanl mcp # Check server status\n $ chanl mcp test # Run protocol test\n $ chanl mcp config # Get config for your AI client\n\nConnecting AI Clients:\n 1. Run 'chanl mcp config --format claude' to get Claude Desktop config\n 2. Add the JSON to Claude Desktop's settings\n 3. Your Chanl tools will appear in Claude!`\n )\n .action(handleMcpDefault); // Default action when no subcommand\n\n // mcp info\n mcp\n .command('info')\n .description('Show MCP server URL, status, and resource counts')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp info # Show server details\n $ chanl mcp info --json # Output as JSON`\n )\n .action(handleMcpInfo);\n\n // mcp status\n mcp\n .command('status')\n .description('Health check the MCP server')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp status # Quick health check`\n )\n .action(handleMcpStatus);\n\n // mcp test\n mcp\n .command('test')\n .description('Run MCP protocol test with real MCP client')\n .addHelpText(\n 'after',\n `\nTests the full MCP protocol handshake:\n 1. Connect to MCP server\n 2. List available tools\n 3. List resources (knowledge base)\n 4. List prompts\n\nExample:\n $ chanl mcp test # Run all protocol tests\n $ chanl mcp test --json # Output results as JSON`\n )\n .action(handleMcpTest);\n\n // mcp config\n mcp\n .command('config')\n .description('Output MCP configuration for AI clients')\n .option('-f, --format <format>', 'Format: claude, cursor, generic', 'generic')\n .addHelpText(\n 'after',\n `\nGenerates configuration JSON for connecting AI clients to your MCP server.\n\nSupported formats:\n claude - Claude Desktop (claude_desktop_config.json)\n cursor - Cursor IDE settings\n generic - Generic MCP client format\n\nExamples:\n $ chanl mcp config # Generic format\n $ chanl mcp config --format claude # Claude Desktop format\n $ chanl mcp config --format cursor # Cursor IDE format\n $ chanl mcp config --format claude > config.json # Save to file\n\nSetup Claude Desktop:\n 1. Run: chanl mcp config --format claude\n 2. Copy the JSON output\n 3. Paste into ~/Library/Application Support/Claude/claude_desktop_config.json`\n )\n .action(handleMcpConfig);\n\n // mcp tools <agent-id>\n mcp\n .command('tools <agent-id>')\n .description('List MCP tools available for an agent')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp tools agent_123 # List tools for agent\n $ chanl mcp tools agent_123 --json # Output as JSON`\n )\n .action(handleMcpTools);\n\n // mcp call <agent-id> <tool-name> [args]\n mcp\n .command('call <agent-id> <tool-name> [args]')\n .description('Call an MCP tool by name')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp call agent_123 get_weather '{\"city\":\"London\"}'\n $ chanl mcp call agent_123 ping\n $ chanl mcp call agent_123 get_weather '{\"city\":\"London\"}' --json`\n )\n .action(handleMcpCall);\n\n // mcp inspect <agent-id> <tool-name>\n mcp\n .command('inspect <agent-id> <tool-name>')\n .description('Show schema and details for a specific MCP tool')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp inspect agent_123 get_weather\n $ chanl mcp inspect agent_123 get_weather --json`\n )\n .action(handleMcpInspect);\n\n // mcp install\n mcp\n .command('install')\n .description('Generate MCP config snippet for editors (Cursor, VSCode, Claude)')\n .option('-f, --format <format>', 'Format: claude, cursor, vscode, generic', 'generic')\n .addHelpText(\n 'after',\n `\nGenerates a ready-to-use MCP configuration using your stored API key and workspace.\nNo server call needed โ works offline.\n\nSupported formats:\n claude - Claude Desktop / Claude Code\n cursor - Cursor IDE\n vscode - Visual Studio Code\n generic - Generic MCP client (default)\n\nExamples:\n $ chanl mcp install # Generic format\n $ chanl mcp install --format claude # Claude Desktop format\n $ chanl mcp install --format cursor # Cursor IDE format\n $ chanl mcp install --format vscode # VSCode format\n $ chanl mcp install --format claude > mcp.json # Save to file`\n )\n .action(handleMcpInstall);\n\n return mcp;\n}\n\n/**\n * Handle mcp info command\n */\nasync function handleMcpInfo(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching MCP configuration...').start();\n\n try {\n const response = await sdk.mcp.getConfig();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch MCP configuration', response.message);\n process.exitCode = 1;\n return;\n }\n\n const config: McpConfigResponse = response.data;\n\n if (isJsonOutput()) {\n printJson(config);\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Property', 'Value'],\n [\n ['Server URL', config.serverUrl],\n ['Environment', config.environment],\n ['Status', config.status === 'active' ? chalk.green('active') : chalk.red('disabled')],\n ['Tools', config.toolCount.toString()],\n ['Resources', config.resourceCount.toString()],\n ['Prompts', config.promptCount.toString()],\n ...(config.toolsetName ? [['Toolset', config.toolsetName]] : []),\n ]\n );\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch MCP configuration');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp status command\n */\nasync function handleMcpStatus(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Checking MCP server health...').start();\n\n try {\n const response = await sdk.mcp.getStatus();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to check MCP status', response.message);\n process.exitCode = 1;\n return;\n }\n\n const status: McpStatusResponse = response.data;\n\n if (isJsonOutput()) {\n printJson(status);\n return;\n }\n\n printBlank();\n if (status.healthy) {\n printSuccess('MCP server is healthy');\n printLabel('Message', status.message);\n if (status.responseTimeMs) {\n printLabel('Response Time', status.responseTimeMs + 'ms');\n }\n } else {\n printError('MCP server is unhealthy', status.message);\n if (status.error) {\n printLabel('Error', status.error);\n }\n process.exitCode = 1;\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to check MCP status');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp config command\n */\nasync function handleMcpConfig(options: { format: string }): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching MCP configuration...').start();\n\n try {\n const response = await sdk.mcp.getConfig();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch MCP configuration', response.message);\n process.exitCode = 1;\n return;\n }\n\n const config: McpConfigResponse = response.data;\n const format = options.format.toLowerCase();\n\n let output: unknown;\n\n switch (format) {\n case 'claude':\n output = config.agentConfigs.claude;\n break;\n case 'cursor':\n output = config.agentConfigs.cursor;\n break;\n case 'generic':\n default:\n output = config.agentConfigs.generic;\n break;\n }\n\n // Always output JSON for config command (it's meant to be piped/copied)\n printJson(output);\n\n if (!isJsonOutput()) {\n printBlank();\n printInfo(`Configuration for ${format} format. Copy and paste into your ${format === 'claude' ? 'Claude Desktop' : format === 'cursor' ? 'Cursor IDE' : 'MCP client'} configuration.`);\n printInfo(`Replace \\${CHANL_MCP_API_KEY} with your actual MCP API key.`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch MCP configuration');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle bare 'chanl mcp' command (default)\n * Shows combined info + status\n */\nasync function handleMcpDefault(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Checking MCP server...').start();\n\n try {\n // Fetch config and status in parallel\n const [configResponse, statusResponse] = await Promise.all([\n sdk.mcp.getConfig(),\n sdk.mcp.getStatus(),\n ]);\n\n spinner.stop();\n\n if (!configResponse.success || !configResponse.data) {\n printError('Failed to fetch MCP configuration', configResponse.message);\n process.exitCode = 1;\n return;\n }\n\n const config: McpConfigResponse = configResponse.data;\n const status: McpStatusResponse | undefined = statusResponse.data;\n\n if (isJsonOutput()) {\n printJson({ config, status });\n return;\n }\n\n // Format status indicator\n const statusIcon = status?.healthy ? chalk.green('โ') : chalk.red('โ');\n const statusText = status?.healthy ? 'Connected' : 'Unhealthy';\n const latency = status?.responseTimeMs ? ` (${status.responseTimeMs}ms)` : '';\n\n printBlank();\n console.log(chalk.bold('MCP Server'));\n console.log(chalk.dim('โ'.repeat(40)));\n printLabel('Server URL', config.serverUrl ?? 'Not configured');\n printLabel('Status', `${statusIcon} ${statusText}${latency}`);\n printLabel('Tools', `${config.toolCount ?? 0} enabled`);\n printLabel('Resources', (config.resourceCount ?? 0).toString());\n printLabel('Prompts', (config.promptCount ?? 0).toString());\n console.log(chalk.dim('โ'.repeat(40)));\n printBlank();\n\n if (!status?.healthy) {\n printInfo(\"Run 'chanl mcp test' for detailed diagnostics\");\n process.exitCode = 1;\n }\n } catch (error) {\n spinner.fail('Failed to check MCP server');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp tools command\n * Lists MCP tools available for an agent\n */\nasync function handleMcpTools(agentId: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching MCP tools...').start();\n\n try {\n const response = await sdk.mcp.listTools(agentId);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch MCP tools', response.message);\n process.exitCode = 1;\n return;\n }\n\n const tools: McpTool[] = response.data.tools;\n\n if (isJsonOutput()) {\n printJson({ tools });\n return;\n }\n\n if (tools.length === 0) {\n printBlank();\n printInfo('No MCP tools available for this agent');\n printBlank();\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Name', 'Description'],\n tools.map((t) => [\n t.name,\n t.description || chalk.dim('No description'),\n ])\n );\n printBlank();\n printInfo(`Total: ${tools.length} tool${tools.length === 1 ? '' : 's'}`);\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch MCP tools');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp call command\n * Calls an MCP tool by name with optional JSON arguments\n */\nasync function handleMcpCall(agentId: string, toolName: string, argsJson?: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // Parse args if provided\n let args: Record<string, unknown> | undefined;\n if (argsJson) {\n try {\n args = JSON.parse(argsJson) as Record<string, unknown>;\n } catch {\n printError('Invalid JSON arguments', `Could not parse: ${argsJson}`);\n process.exitCode = 1;\n return;\n }\n }\n\n const spinner = ora(`Calling tool '${toolName}'...`).start();\n\n try {\n const response = await sdk.mcp.callTool(agentId, toolName, args);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to call tool', response.message);\n process.exitCode = 1;\n return;\n }\n\n const result: McpToolCallResult = response.data;\n\n if (isJsonOutput()) {\n printJson(result);\n return;\n }\n\n // Check if tool returned an error\n if (result.isError) {\n for (const item of result.content) {\n if (item.text) {\n printError('Tool returned an error', item.text);\n }\n }\n process.exitCode = 1;\n return;\n }\n\n // Display result content\n printBlank();\n for (const item of result.content) {\n if (item.text) {\n console.log(item.text);\n } else {\n // Non-text content: display as JSON\n printJson(item);\n }\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to call tool');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp inspect command\n * Shows schema and details for a specific MCP tool\n */\nasync function handleMcpInspect(agentId: string, toolName: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Fetching tool '${toolName}'...`).start();\n\n try {\n const response = await sdk.mcp.getTool(agentId, toolName);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch tool details', response.message);\n process.exitCode = 1;\n return;\n }\n\n const tool: McpTool = response.data.tool;\n\n if (isJsonOutput()) {\n printJson(tool);\n return;\n }\n\n printBlank();\n console.log(chalk.bold(tool.name));\n console.log(chalk.dim('โ'.repeat(40)));\n if (tool.description) {\n printLabel('Description', tool.description);\n }\n printBlank();\n\n // Display input schema\n console.log(chalk.bold('Input Schema'));\n console.log(chalk.dim('โ'.repeat(40)));\n\n const schema = tool.inputSchema;\n const properties = schema['properties'] as Record<string, Record<string, unknown>> | undefined;\n const required = (schema['required'] as string[]) || [];\n\n if (properties) {\n const rows: string[][] = [];\n for (const [name, prop] of Object.entries(properties)) {\n const isRequired = required.includes(name);\n const typeStr = String(prop['type'] || 'any');\n const desc = String(prop['description'] || '');\n const reqStr = isRequired ? chalk.red('*') : ' ';\n rows.push([`${reqStr} ${name}`, typeStr, desc]);\n }\n printSimpleTable(['Parameter', 'Type', 'Description'], rows);\n } else {\n printInfo('No parameters defined');\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch tool details');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp install command\n * Generates MCP config snippets for various editors, using stored API key\n */\nasync function handleMcpInstall(options: { format: string }): Promise<void> {\n const apiKey = configStore.getApiKey();\n if (!apiKey) {\n printError('Not authenticated', \"Run 'chanl login' to authenticate first\");\n process.exitCode = 1;\n return;\n }\n\n const baseUrl = configStore.getBaseUrl() || 'https://api.chanl.ai';\n // Derive MCP server URL from base URL\n // Production: https://api.chanl.ai -> workspace.chanl.app/mcp (generic)\n // For install, use the base URL with /mcp path\n const mcpUrl = baseUrl.replace(/\\/$/, '') + '/mcp';\n\n const format = options.format.toLowerCase();\n\n const serverConfig = {\n url: mcpUrl,\n headers: { 'X-API-Key': apiKey },\n transport: 'streamable-http' as const,\n };\n\n let output: unknown;\n\n switch (format) {\n case 'claude':\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n case 'cursor':\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n case 'vscode':\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n case 'generic':\n default:\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n }\n\n // Always output JSON (config is meant to be copied)\n printJson(output);\n\n if (!isJsonOutput()) {\n printBlank();\n const targetName =\n format === 'claude' ? 'Claude Desktop / Claude Code' :\n format === 'cursor' ? 'Cursor IDE' :\n format === 'vscode' ? 'Visual Studio Code' :\n 'your MCP client';\n printInfo(`Copy the JSON above into your ${targetName} configuration.`);\n printBlank();\n }\n}\n\n/**\n * Handle mcp test command\n * Runs real MCP protocol test using @modelcontextprotocol/sdk\n */\nasync function handleMcpTest(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // First get the MCP config to know the server URL\n const spinner = ora('Fetching MCP configuration...').start();\n\n let config: McpConfigResponse;\n try {\n const configResponse = await sdk.mcp.getConfig();\n if (!configResponse.success || !configResponse.data) {\n spinner.fail('Failed to fetch MCP configuration');\n printError('Error', configResponse.message || 'Unknown error');\n process.exitCode = 1;\n return;\n }\n config = configResponse.data;\n } catch (error) {\n spinner.fail('Failed to fetch MCP configuration');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n return;\n }\n\n spinner.text = 'Running MCP protocol test...';\n\n // Get API key for MCP authentication\n // Use MCP_API_KEY env var if set (for local dev), otherwise fall back to stored key\n const apiKey = process.env.MCP_API_KEY || configStore.getApiKey();\n if (!apiKey) {\n spinner.fail('No API key available');\n printError('Error', 'API key required for MCP test. Set MCP_API_KEY env var for local dev.');\n process.exitCode = 1;\n return;\n }\n\n const results: { test: string; passed: boolean; detail: string }[] = [];\n\n try {\n // Create MCP client with Streamable HTTP transport\n const transport = new StreamableHTTPClientTransport(new URL(config.serverUrl), {\n requestInit: {\n headers: { 'X-API-Key': apiKey },\n },\n });\n\n const client = new Client(\n { name: 'chanl-cli', version: '1.0.0' },\n { capabilities: {} }\n );\n\n // Test 1: Connect\n spinner.text = 'Connecting to MCP server...';\n const connectStart = Date.now();\n await client.connect(transport);\n const connectTime = Date.now() - connectStart;\n results.push({ test: 'Connection', passed: true, detail: `${connectTime}ms` });\n\n // Test 2: List tools\n spinner.text = 'Testing tools/list...';\n try {\n const tools = await client.listTools();\n results.push({ test: 'tools/list', passed: true, detail: `${tools.tools.length} tools` });\n } catch (err) {\n results.push({ test: 'tools/list', passed: false, detail: err instanceof Error ? err.message : 'Failed' });\n }\n\n // Test 3: List resources\n spinner.text = 'Testing resources/list...';\n try {\n const resources = await client.listResources();\n results.push({ test: 'resources/list', passed: true, detail: `${resources.resources.length} resources` });\n } catch (err) {\n // Resources may not be available (no knowledge base)\n results.push({ test: 'resources/list', passed: true, detail: 'N/A (no knowledge base)' });\n }\n\n // Test 4: List prompts\n spinner.text = 'Testing prompts/list...';\n try {\n const prompts = await client.listPrompts();\n results.push({ test: 'prompts/list', passed: true, detail: `${prompts.prompts.length} prompts` });\n } catch (err) {\n results.push({ test: 'prompts/list', passed: true, detail: 'N/A' });\n }\n\n await client.close();\n spinner.stop();\n\n // Output results\n if (isJsonOutput()) {\n printJson({ serverUrl: config.serverUrl, results });\n return;\n }\n\n printBlank();\n console.log(chalk.bold('๐งช MCP Protocol Test'));\n console.log(chalk.dim('โ'.repeat(50)));\n printLabel('Server', config.serverUrl);\n console.log(chalk.dim('โ'.repeat(50)));\n\n let allPassed = true;\n for (const result of results) {\n const icon = result.passed ? chalk.green('โ') : chalk.red('โ');\n console.log(`${icon} ${result.test}: ${result.detail}`);\n if (!result.passed) allPassed = false;\n }\n\n console.log(chalk.dim('โ'.repeat(50)));\n\n if (allPassed) {\n printSuccess('All tests passed');\n } else {\n printError('Some tests failed', 'Check the results above');\n process.exitCode = 1;\n }\n printBlank();\n } catch (error) {\n spinner.fail('MCP protocol test failed');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Connection failed', message);\n printInfo('Make sure the MCP server is running and accessible');\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/mcp.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport type { McpConfigResponse, McpStatusResponse, McpTool, McpToolCallResult } from '@chanl/sdk';\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { configStore } from '../utils/config-store.js';\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} from '../utils/output.js';\n\n/**\n * Create the MCP command group\n */\nexport function createMcpCommand(): Command {\n const mcp = new Command('mcp')\n .description('MCP server configuration and status')\n .addHelpText(\n 'after',\n `\nWhat is MCP?\n Model Context Protocol (MCP) lets AI agents (Claude, Cursor, etc.) use your\n Chanl tools, knowledge base, and prompts. The MCP server bridges your workspace\n with AI clients.\n\nQuick Start:\n $ chanl mcp # Check server status\n $ chanl mcp test # Run protocol test\n $ chanl mcp config # Get config for your AI client\n\nConnecting AI Clients:\n 1. Run 'chanl mcp config --format claude' to get Claude Desktop config\n 2. Add the JSON to Claude Desktop's settings\n 3. Your Chanl tools will appear in Claude!`\n )\n .action(handleMcpDefault); // Default action when no subcommand\n\n // mcp info\n mcp\n .command('info')\n .description('Show MCP server URL, status, and resource counts')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp info # Show server details\n $ chanl mcp info --json # Output as JSON`\n )\n .action(handleMcpInfo);\n\n // mcp status\n mcp\n .command('status')\n .description('Health check the MCP server')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp status # Quick health check`\n )\n .action(handleMcpStatus);\n\n // mcp test\n mcp\n .command('test')\n .description('Run MCP protocol test with real MCP client')\n .addHelpText(\n 'after',\n `\nTests the full MCP protocol handshake:\n 1. Connect to MCP server\n 2. List available tools\n 3. List resources (knowledge base)\n 4. List prompts\n\nExample:\n $ chanl mcp test # Run all protocol tests\n $ chanl mcp test --json # Output results as JSON`\n )\n .action(handleMcpTest);\n\n // mcp config\n mcp\n .command('config')\n .description('Output MCP configuration for AI clients')\n .option('-f, --format <format>', 'Format: claude, cursor, generic', 'generic')\n .addHelpText(\n 'after',\n `\nGenerates configuration JSON for connecting AI clients to your MCP server.\n\nSupported formats:\n claude - Claude Desktop (claude_desktop_config.json)\n cursor - Cursor IDE settings\n generic - Generic MCP client format\n\nExamples:\n $ chanl mcp config # Generic format\n $ chanl mcp config --format claude # Claude Desktop format\n $ chanl mcp config --format cursor # Cursor IDE format\n $ chanl mcp config --format claude > config.json # Save to file\n\nSetup Claude Desktop:\n 1. Run: chanl mcp config --format claude\n 2. Copy the JSON output\n 3. Paste into ~/Library/Application Support/Claude/claude_desktop_config.json`\n )\n .action(handleMcpConfig);\n\n // mcp tools <agent-id>\n mcp\n .command('tools <agent-id>')\n .description('List MCP tools available for an agent')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp tools agent_123 # List tools for agent\n $ chanl mcp tools agent_123 --json # Output as JSON`\n )\n .action(handleMcpTools);\n\n // mcp call <agent-id> <tool-name> [args]\n mcp\n .command('call <agent-id> <tool-name> [args]')\n .description('Call an MCP tool by name')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp call agent_123 get_weather '{\"city\":\"London\"}'\n $ chanl mcp call agent_123 ping\n $ chanl mcp call agent_123 get_weather '{\"city\":\"London\"}' --json`\n )\n .action(handleMcpCall);\n\n // mcp inspect <agent-id> <tool-name>\n mcp\n .command('inspect <agent-id> <tool-name>')\n .description('Show schema and details for a specific MCP tool')\n .addHelpText(\n 'after',\n `\nExample:\n $ chanl mcp inspect agent_123 get_weather\n $ chanl mcp inspect agent_123 get_weather --json`\n )\n .action(handleMcpInspect);\n\n // mcp install\n mcp\n .command('install')\n .description('Generate MCP config snippet for editors (Cursor, VSCode, Claude)')\n .option('-f, --format <format>', 'Format: claude, cursor, vscode, generic', 'generic')\n .addHelpText(\n 'after',\n `\nGenerates a ready-to-use MCP configuration using your stored API key and workspace.\nNo server call needed โ works offline.\n\nSupported formats:\n claude - Claude Desktop / Claude Code\n cursor - Cursor IDE\n vscode - Visual Studio Code\n generic - Generic MCP client (default)\n\nExamples:\n $ chanl mcp install # Generic format\n $ chanl mcp install --format claude # Claude Desktop format\n $ chanl mcp install --format cursor # Cursor IDE format\n $ chanl mcp install --format vscode # VSCode format\n $ chanl mcp install --format claude > mcp.json # Save to file`\n )\n .action(handleMcpInstall);\n\n return mcp;\n}\n\n/**\n * Handle mcp info command\n */\nasync function handleMcpInfo(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching MCP configuration...').start();\n\n try {\n const response = await sdk.mcp.getConfig();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch MCP configuration', response.message);\n process.exitCode = 1;\n return;\n }\n\n const config: McpConfigResponse = response.data;\n\n if (isJsonOutput()) {\n printJson(config);\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Property', 'Value'],\n [\n ['Server URL', config.serverUrl],\n ['Environment', config.environment],\n ['Status', config.status === 'active' ? chalk.green('active') : chalk.red('disabled')],\n ['Tools', config.toolCount.toString()],\n ['Resources', config.resourceCount.toString()],\n ['Prompts', config.promptCount.toString()],\n ...(config.toolsetName ? [['Toolset', config.toolsetName]] : []),\n ]\n );\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch MCP configuration');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp status command\n */\nasync function handleMcpStatus(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Checking MCP server health...').start();\n\n try {\n const response = await sdk.mcp.getStatus();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to check MCP status', response.message);\n process.exitCode = 1;\n return;\n }\n\n const status: McpStatusResponse = response.data;\n\n if (isJsonOutput()) {\n printJson(status);\n return;\n }\n\n printBlank();\n if (status.healthy) {\n printSuccess('MCP server is healthy');\n printLabel('Message', status.message);\n if (status.responseTimeMs) {\n printLabel('Response Time', status.responseTimeMs + 'ms');\n }\n } else {\n printError('MCP server is unhealthy', status.message);\n if (status.error) {\n printLabel('Error', status.error);\n }\n process.exitCode = 1;\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to check MCP status');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp config command\n */\nasync function handleMcpConfig(options: { format: string }): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching MCP configuration...').start();\n\n try {\n const response = await sdk.mcp.getConfig();\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch MCP configuration', response.message);\n process.exitCode = 1;\n return;\n }\n\n const config: McpConfigResponse = response.data;\n const format = options.format.toLowerCase();\n\n let output: unknown;\n\n switch (format) {\n case 'claude':\n output = config.agentConfigs.claude;\n break;\n case 'cursor':\n output = config.agentConfigs.cursor;\n break;\n case 'generic':\n default:\n output = config.agentConfigs.generic;\n break;\n }\n\n // Always output JSON for config command (it's meant to be piped/copied)\n printJson(output);\n\n if (!isJsonOutput()) {\n printBlank();\n printInfo(`Configuration for ${format} format. Copy and paste into your ${format === 'claude' ? 'Claude Desktop' : format === 'cursor' ? 'Cursor IDE' : 'MCP client'} configuration.`);\n printInfo(`Replace \\${CHANL_MCP_API_KEY} with your actual MCP API key.`);\n }\n } catch (error) {\n spinner.fail('Failed to fetch MCP configuration');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle bare 'chanl mcp' command (default)\n * Shows combined info + status\n */\nasync function handleMcpDefault(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Checking MCP server...').start();\n\n try {\n // Fetch config and status in parallel\n const [configResponse, statusResponse] = await Promise.all([\n sdk.mcp.getConfig(),\n sdk.mcp.getStatus(),\n ]);\n\n spinner.stop();\n\n if (!configResponse.success || !configResponse.data) {\n printError('Failed to fetch MCP configuration', configResponse.message);\n process.exitCode = 1;\n return;\n }\n\n const config: McpConfigResponse = configResponse.data;\n const status: McpStatusResponse | undefined = statusResponse.data;\n\n if (isJsonOutput()) {\n printJson({ config, status });\n return;\n }\n\n // Format status indicator\n const statusIcon = status?.healthy ? chalk.green('โ') : chalk.red('โ');\n const statusText = status?.healthy ? 'Connected' : 'Unhealthy';\n const latency = status?.responseTimeMs ? ` (${status.responseTimeMs}ms)` : '';\n\n printBlank();\n console.log(chalk.bold('MCP Server'));\n console.log(chalk.dim('โ'.repeat(40)));\n printLabel('Server URL', config.serverUrl ?? 'Not configured');\n printLabel('Status', `${statusIcon} ${statusText}${latency}`);\n printLabel('Tools', `${config.toolCount ?? 0} enabled`);\n printLabel('Resources', (config.resourceCount ?? 0).toString());\n printLabel('Prompts', (config.promptCount ?? 0).toString());\n console.log(chalk.dim('โ'.repeat(40)));\n printBlank();\n\n if (!status?.healthy) {\n printInfo(\"Run 'chanl mcp test' for detailed diagnostics\");\n process.exitCode = 1;\n }\n } catch (error) {\n spinner.fail('Failed to check MCP server');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp tools command\n * Lists MCP tools available for an agent\n */\nasync function handleMcpTools(agentId: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora('Fetching MCP tools...').start();\n\n try {\n const response = await sdk.mcp.listTools(agentId);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch MCP tools', response.message);\n process.exitCode = 1;\n return;\n }\n\n const tools: McpTool[] = response.data.tools;\n\n if (isJsonOutput()) {\n printJson({ tools });\n return;\n }\n\n if (tools.length === 0) {\n printBlank();\n printInfo('No MCP tools available for this agent');\n printBlank();\n return;\n }\n\n printBlank();\n printSimpleTable(\n ['Name', 'Description'],\n tools.map((t) => [\n t.name,\n t.description || chalk.dim('No description'),\n ])\n );\n printBlank();\n printInfo(`Total: ${tools.length} tool${tools.length === 1 ? '' : 's'}`);\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch MCP tools');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp call command\n * Calls an MCP tool by name with optional JSON arguments\n */\nasync function handleMcpCall(agentId: string, toolName: string, argsJson?: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // Parse args if provided\n let args: Record<string, unknown> | undefined;\n if (argsJson) {\n try {\n args = JSON.parse(argsJson) as Record<string, unknown>;\n } catch {\n printError('Invalid JSON arguments', `Could not parse: ${argsJson}`);\n process.exitCode = 1;\n return;\n }\n }\n\n const spinner = ora(`Calling tool '${toolName}'...`).start();\n\n try {\n const response = await sdk.mcp.callTool(agentId, toolName, args);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to call tool', response.message);\n process.exitCode = 1;\n return;\n }\n\n const result: McpToolCallResult = response.data;\n\n if (isJsonOutput()) {\n printJson(result);\n return;\n }\n\n // Check if tool returned an error\n if (result.isError) {\n for (const item of result.content) {\n if (item.text) {\n printError('Tool returned an error', item.text);\n }\n }\n process.exitCode = 1;\n return;\n }\n\n // Display result content\n printBlank();\n for (const item of result.content) {\n if (item.text) {\n console.log(item.text);\n } else {\n // Non-text content: display as JSON\n printJson(item);\n }\n }\n printBlank();\n } catch (error) {\n spinner.fail('Failed to call tool');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp inspect command\n * Shows schema and details for a specific MCP tool\n */\nasync function handleMcpInspect(agentId: string, toolName: string): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n const spinner = ora(`Fetching tool '${toolName}'...`).start();\n\n try {\n const response = await sdk.mcp.getTool(agentId, toolName);\n\n spinner.stop();\n\n if (!response.success || !response.data) {\n printError('Failed to fetch tool details', response.message);\n process.exitCode = 1;\n return;\n }\n\n const tool: McpTool = response.data as McpTool;\n\n if (isJsonOutput()) {\n printJson(tool);\n return;\n }\n\n printBlank();\n console.log(chalk.bold(tool.name));\n console.log(chalk.dim('โ'.repeat(40)));\n if (tool.description) {\n printLabel('Description', tool.description);\n }\n printBlank();\n\n // Display input schema\n console.log(chalk.bold('Input Schema'));\n console.log(chalk.dim('โ'.repeat(40)));\n\n const schema = tool.inputSchema;\n const properties = schema['properties'] as Record<string, Record<string, unknown>> | undefined;\n const required = (schema['required'] as string[]) || [];\n\n if (properties) {\n const rows: string[][] = [];\n for (const [name, prop] of Object.entries(properties)) {\n const isRequired = required.includes(name);\n const typeStr = String(prop['type'] || 'any');\n const desc = String(prop['description'] || '');\n const reqStr = isRequired ? chalk.red('*') : ' ';\n rows.push([`${reqStr} ${name}`, typeStr, desc]);\n }\n printSimpleTable(['Parameter', 'Type', 'Description'], rows);\n } else {\n printInfo('No parameters defined');\n }\n\n printBlank();\n } catch (error) {\n spinner.fail('Failed to fetch tool details');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Handle mcp install command\n * Generates MCP config snippets for various editors, using stored API key\n */\nasync function handleMcpInstall(options: { format: string }): Promise<void> {\n const apiKey = configStore.getApiKey();\n if (!apiKey) {\n printError('Not authenticated', \"Run 'chanl login' to authenticate first\");\n process.exitCode = 1;\n return;\n }\n\n const baseUrl = configStore.getBaseUrl() || 'https://api.chanl.ai';\n // Derive MCP server URL from base URL\n // Production: https://api.chanl.ai -> workspace.chanl.app/mcp (generic)\n // For install, use the base URL with /mcp path\n const mcpUrl = baseUrl.replace(/\\/$/, '') + '/mcp';\n\n const format = options.format.toLowerCase();\n\n const serverConfig = {\n url: mcpUrl,\n headers: { 'X-API-Key': apiKey },\n transport: 'streamable-http' as const,\n };\n\n let output: unknown;\n\n switch (format) {\n case 'claude':\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n case 'cursor':\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n case 'vscode':\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n case 'generic':\n default:\n output = {\n mcpServers: {\n chanl: serverConfig,\n },\n };\n break;\n }\n\n // Always output JSON (config is meant to be copied)\n printJson(output);\n\n if (!isJsonOutput()) {\n printBlank();\n const targetName =\n format === 'claude' ? 'Claude Desktop / Claude Code' :\n format === 'cursor' ? 'Cursor IDE' :\n format === 'vscode' ? 'Visual Studio Code' :\n 'your MCP client';\n printInfo(`Copy the JSON above into your ${targetName} configuration.`);\n printBlank();\n }\n}\n\n/**\n * Handle mcp test command\n * Runs real MCP protocol test using @modelcontextprotocol/sdk\n */\nasync function handleMcpTest(): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // First get the MCP config to know the server URL\n const spinner = ora('Fetching MCP configuration...').start();\n\n let config: McpConfigResponse;\n try {\n const configResponse = await sdk.mcp.getConfig();\n if (!configResponse.success || !configResponse.data) {\n spinner.fail('Failed to fetch MCP configuration');\n printError('Error', configResponse.message || 'Unknown error');\n process.exitCode = 1;\n return;\n }\n config = configResponse.data;\n } catch (error) {\n spinner.fail('Failed to fetch MCP configuration');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n return;\n }\n\n spinner.text = 'Running MCP protocol test...';\n\n // Get API key for MCP authentication\n // Use MCP_API_KEY env var if set (for local dev), otherwise fall back to stored key\n const apiKey = process.env.MCP_API_KEY || configStore.getApiKey();\n if (!apiKey) {\n spinner.fail('No API key available');\n printError('Error', 'API key required for MCP test. Set MCP_API_KEY env var for local dev.');\n process.exitCode = 1;\n return;\n }\n\n const results: { test: string; passed: boolean; detail: string }[] = [];\n\n try {\n // Create MCP client with Streamable HTTP transport\n const transport = new StreamableHTTPClientTransport(new URL(config.serverUrl), {\n requestInit: {\n headers: { 'X-API-Key': apiKey },\n },\n });\n\n const client = new Client(\n { name: 'chanl-cli', version: '1.0.0' },\n { capabilities: {} }\n );\n\n // Test 1: Connect\n spinner.text = 'Connecting to MCP server...';\n const connectStart = Date.now();\n await client.connect(transport);\n const connectTime = Date.now() - connectStart;\n results.push({ test: 'Connection', passed: true, detail: `${connectTime}ms` });\n\n // Test 2: List tools\n spinner.text = 'Testing tools/list...';\n try {\n const tools = await client.listTools();\n results.push({ test: 'tools/list', passed: true, detail: `${tools.tools.length} tools` });\n } catch (err) {\n results.push({ test: 'tools/list', passed: false, detail: err instanceof Error ? err.message : 'Failed' });\n }\n\n // Test 3: List resources\n spinner.text = 'Testing resources/list...';\n try {\n const resources = await client.listResources();\n results.push({ test: 'resources/list', passed: true, detail: `${resources.resources.length} resources` });\n } catch (err) {\n // Resources may not be available (no knowledge base)\n results.push({ test: 'resources/list', passed: true, detail: 'N/A (no knowledge base)' });\n }\n\n // Test 4: List prompts\n spinner.text = 'Testing prompts/list...';\n try {\n const prompts = await client.listPrompts();\n results.push({ test: 'prompts/list', passed: true, detail: `${prompts.prompts.length} prompts` });\n } catch (err) {\n results.push({ test: 'prompts/list', passed: true, detail: 'N/A' });\n }\n\n await client.close();\n spinner.stop();\n\n // Output results\n if (isJsonOutput()) {\n printJson({ serverUrl: config.serverUrl, results });\n return;\n }\n\n printBlank();\n console.log(chalk.bold('๐งช MCP Protocol Test'));\n console.log(chalk.dim('โ'.repeat(50)));\n printLabel('Server', config.serverUrl);\n console.log(chalk.dim('โ'.repeat(50)));\n\n let allPassed = true;\n for (const result of results) {\n const icon = result.passed ? chalk.green('โ') : chalk.red('โ');\n console.log(`${icon} ${result.test}: ${result.detail}`);\n if (!result.passed) allPassed = false;\n }\n\n console.log(chalk.dim('โ'.repeat(50)));\n\n if (allPassed) {\n printSuccess('All tests passed');\n } else {\n printError('Some tests failed', 'Check the results above');\n process.exitCode = 1;\n }\n printBlank();\n } catch (error) {\n spinner.fail('MCP protocol test failed');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Connection failed', message);\n printInfo('Make sure the MCP server is running and accessible');\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/commands/memory.js
CHANGED
|
@@ -152,7 +152,7 @@ async function handleMemoryGet(id) {
|
|
|
152
152
|
process.exitCode = 1;
|
|
153
153
|
return;
|
|
154
154
|
}
|
|
155
|
-
const
|
|
155
|
+
const memory = response.data;
|
|
156
156
|
if (isJsonOutput()) {
|
|
157
157
|
printJson(memory);
|
|
158
158
|
return;
|
|
@@ -220,7 +220,7 @@ async function handleMemoryCreate(options) {
|
|
|
220
220
|
process.exitCode = 1;
|
|
221
221
|
return;
|
|
222
222
|
}
|
|
223
|
-
const
|
|
223
|
+
const memory = response.data;
|
|
224
224
|
if (isJsonOutput()) {
|
|
225
225
|
printJson({ success: true, memory });
|
|
226
226
|
return;
|
|
@@ -260,7 +260,7 @@ async function handleMemoryUpdate(id, options) {
|
|
|
260
260
|
process.exitCode = 1;
|
|
261
261
|
return;
|
|
262
262
|
}
|
|
263
|
-
const
|
|
263
|
+
const memory = response.data;
|
|
264
264
|
if (isJsonOutput()) {
|
|
265
265
|
printJson({ success: true, memory });
|
|
266
266
|
return;
|