@chanl-ai/cli 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/bin/chanl.js +10 -0
  2. package/dist/__tests__/cli.test.d.ts +2 -0
  3. package/dist/__tests__/cli.test.js +2313 -0
  4. package/dist/__tests__/cli.test.js.map +1 -0
  5. package/dist/cli.d.ts +12 -0
  6. package/dist/cli.js +72 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/agents.d.ts +8 -0
  9. package/dist/commands/agents.js +671 -0
  10. package/dist/commands/agents.js.map +1 -0
  11. package/dist/commands/auth.d.ts +16 -0
  12. package/dist/commands/auth.js +294 -0
  13. package/dist/commands/auth.js.map +1 -0
  14. package/dist/commands/call.d.ts +8 -0
  15. package/dist/commands/call.js +166 -0
  16. package/dist/commands/call.js.map +1 -0
  17. package/dist/commands/calls.d.ts +8 -0
  18. package/dist/commands/calls.js +719 -0
  19. package/dist/commands/calls.js.map +1 -0
  20. package/dist/commands/chat.d.ts +8 -0
  21. package/dist/commands/chat.js +203 -0
  22. package/dist/commands/chat.js.map +1 -0
  23. package/dist/commands/config.d.ts +8 -0
  24. package/dist/commands/config.js +231 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/health.d.ts +8 -0
  27. package/dist/commands/health.js +55 -0
  28. package/dist/commands/health.js.map +1 -0
  29. package/dist/commands/index.d.ts +18 -0
  30. package/dist/commands/index.js +39 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/knowledge.d.ts +8 -0
  33. package/dist/commands/knowledge.js +539 -0
  34. package/dist/commands/knowledge.js.map +1 -0
  35. package/dist/commands/mcp.d.ts +8 -0
  36. package/dist/commands/mcp.js +589 -0
  37. package/dist/commands/mcp.js.map +1 -0
  38. package/dist/commands/memory.d.ts +8 -0
  39. package/dist/commands/memory.js +408 -0
  40. package/dist/commands/memory.js.map +1 -0
  41. package/dist/commands/personas.d.ts +8 -0
  42. package/dist/commands/personas.js +356 -0
  43. package/dist/commands/personas.js.map +1 -0
  44. package/dist/commands/prompts.d.ts +8 -0
  45. package/dist/commands/prompts.js +295 -0
  46. package/dist/commands/prompts.js.map +1 -0
  47. package/dist/commands/scenarios.d.ts +8 -0
  48. package/dist/commands/scenarios.js +591 -0
  49. package/dist/commands/scenarios.js.map +1 -0
  50. package/dist/commands/scorecards.d.ts +8 -0
  51. package/dist/commands/scorecards.js +570 -0
  52. package/dist/commands/scorecards.js.map +1 -0
  53. package/dist/commands/tools.d.ts +8 -0
  54. package/dist/commands/tools.js +632 -0
  55. package/dist/commands/tools.js.map +1 -0
  56. package/dist/commands/toolsets.d.ts +8 -0
  57. package/dist/commands/toolsets.js +464 -0
  58. package/dist/commands/toolsets.js.map +1 -0
  59. package/dist/commands/workspaces.d.ts +8 -0
  60. package/dist/commands/workspaces.js +170 -0
  61. package/dist/commands/workspaces.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.js +6 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/utils/config-store.d.ts +117 -0
  66. package/dist/utils/config-store.js +191 -0
  67. package/dist/utils/config-store.js.map +1 -0
  68. package/dist/utils/interactive.d.ts +41 -0
  69. package/dist/utils/interactive.js +83 -0
  70. package/dist/utils/interactive.js.map +1 -0
  71. package/dist/utils/output.d.ts +100 -0
  72. package/dist/utils/output.js +221 -0
  73. package/dist/utils/output.js.map +1 -0
  74. package/dist/utils/sdk-factory.d.ts +15 -0
  75. package/dist/utils/sdk-factory.js +34 -0
  76. package/dist/utils/sdk-factory.js.map +1 -0
  77. package/package.json +67 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/call.ts"],"sourcesContent":["import { Command } from 'commander';\nimport ora from 'ora';\nimport chalk from 'chalk';\nimport type { ChanlSDK } from '@chanl-ai/sdk';\nimport { createSdk } from '../utils/sdk-factory.js';\nimport {\n printError,\n printInfo,\n printBlank,\n printLabel,\n isJsonOutput,\n printJson,\n} from '../utils/output.js';\nimport {\n formatElapsed,\n printSegment,\n displayScorecard,\n} from '../utils/interactive.js';\n\n/**\n * Create the call command (singular — for initiating outbound calls)\n */\nexport function createCallCommand(): Command {\n const call = new Command('call')\n .description('Make an outbound phone call with an AI agent')\n .argument('<phone>', 'Phone number to call (E.164 format, e.g., +15551234567)')\n .requiredOption('-a, --agent <agentId>', 'Agent ID to handle the call')\n .option('-p, --phone-number <id>', 'Source phone number ID (from your workspace)')\n .option('-n, --customer-name <name>', 'Customer name')\n .option('-s, --scorecard <id>', 'Scorecard ID to evaluate the call')\n .option('--no-watch', 'Start the call and exit immediately (no live monitoring)')\n .option('-w, --workspace <id>', 'Workspace ID override')\n .addHelpText(\n 'after',\n `\nWhat is Call?\n Make an outbound phone call from your AI agent to a real phone number.\n By default, enters interactive mode showing a live transcript as the\n call progresses, with a scorecard summary when the call ends.\n\nModes:\n Interactive (default): Live transcript + scorecard when call ends.\n Press Ctrl+C to stop monitoring (call continues).\n\n No-watch: Start the call and exit. Use 'chanl calls get <id>'\n to check status later.\n\nExamples:\n $ chanl call +15551234567 --agent ag_abc123\n $ chanl call +15551234567 --agent ag_abc --phone-number pn_xyz\n $ chanl call +15551234567 --agent ag_abc --no-watch\n $ chanl call +15551234567 --agent ag_abc --scorecard sc_123\n $ chanl call +15551234567 --agent ag_abc --json`\n )\n .action(handleCall);\n\n return call;\n}\n\n/**\n * Handle the call command\n */\nasync function handleCall(\n phone: string,\n options: {\n agent: string;\n phoneNumber?: string;\n customerName?: string;\n scorecard?: string;\n watch?: boolean;\n workspace?: string;\n },\n): Promise<void> {\n const sdk = createSdk();\n if (!sdk) return;\n\n // Validate E.164 format\n if (!phone.match(/^\\+[1-9]\\d{1,14}$/)) {\n printError('Invalid phone number', `\"${phone}\" is not in E.164 format (e.g., +15551234567)`);\n process.exitCode = 1;\n return;\n }\n\n const spinner = ora(`Calling ${phone}...`).start();\n\n try {\n const response = await sdk.calls.initiate({\n agentId: options.agent,\n phone,\n phoneNumberId: options.phoneNumber,\n customerName: options.customerName,\n scorecardId: options.scorecard,\n });\n\n if (!response.success || !response.data) {\n spinner.fail('Failed to initiate call');\n printError('Error', response.message || 'Could not start the call');\n process.exitCode = 1;\n return;\n }\n\n const callData = response.data;\n const callId = callData.id;\n\n spinner.succeed(`Call started: ${callId}`);\n\n if (isJsonOutput()) {\n printJson(callData);\n return;\n }\n\n printBlank();\n printLabel('Call ID', callId);\n printLabel('Status', callData.status || 'queued');\n printLabel('Phone', phone);\n printLabel('Agent', options.agent);\n\n // No-watch mode: just print and exit\n if (options.watch === false) {\n printBlank();\n printInfo(`Monitor with: chanl calls get ${callId}`);\n printInfo(`View transcript: chanl calls transcript ${callId}`);\n printBlank();\n return;\n }\n\n // Interactive watch mode\n printBlank();\n await watchCall(sdk, callId);\n } catch (error) {\n spinner.fail('Failed to start call');\n const message = error instanceof Error ? error.message : 'Unknown error';\n printError('Error', message);\n process.exitCode = 1;\n }\n}\n\n/**\n * Watch a call with live transcript and post-call scorecard\n * Uses SDK LiveCall for event-driven monitoring\n */\nasync function watchCall(\n sdk: ChanlSDK,\n callId: string,\n): Promise<void> {\n const startTime = new Date();\n let spinner = ora({\n text: `${chalk.red('LIVE')} — ${formatElapsed(startTime)} | Waiting for call to connect...`,\n spinner: 'dots',\n }).start();\n\n const live = sdk.calls.watch(callId);\n\n // Handle Ctrl+C gracefully\n const handleSigint = (): void => {\n live.stop();\n spinner.stop();\n printBlank();\n printInfo(`Stopped monitoring. Call continues in background.`);\n printInfo(`Check status: chanl calls get ${callId}`);\n printInfo(`View transcript: chanl calls transcript ${callId}`);\n printBlank();\n process.exit(0);\n };\n process.on('SIGINT', handleSigint);\n\n let headerPrinted = false;\n let scorecardReceived = false;\n let callEnded = false;\n\n live.on('status', (status) => {\n spinner.text = `${chalk.red('LIVE')} — ${formatElapsed(startTime)} | Status: ${status}`;\n });\n\n live.on('transcript', (seg) => {\n if (!headerPrinted) {\n spinner.stop();\n headerPrinted = true;\n } else {\n spinner.stop();\n }\n printSegment(seg);\n spinner.start();\n });\n\n live.on('ended', (summary) => {\n callEnded = true;\n spinner.stop();\n const statusIcon = summary.status === 'ended' || summary.status === 'completed'\n ? chalk.green('✓')\n : chalk.red('✗');\n console.log(`${statusIcon} Call ${summary.status} — ${formatElapsed(startTime)}`);\n printBlank();\n spinner = ora('Checking for scorecard...').start();\n });\n\n live.on('scorecard', (results) => {\n scorecardReceived = true;\n spinner.stop();\n displayScorecard(results);\n });\n\n live.on('timeout', () => {\n spinner.warn('Stopped monitoring (timeout after 5 minutes)');\n printInfo(`Check status: chanl calls get ${callId}`);\n printBlank();\n });\n\n try {\n await live.completed;\n } finally {\n process.removeListener('SIGINT', handleSigint);\n }\n\n // Post-completion output\n if (callEnded) {\n if (!scorecardReceived) {\n spinner.stop();\n printInfo('No scorecard results (analysis may still be processing)');\n printInfo(`Check later: chanl calls analysis ${callId}`);\n }\n printBlank();\n printInfo(`Full transcript: chanl calls transcript ${callId}`);\n printInfo(`Call details: chanl calls get ${callId}`);\n printBlank();\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,8 @@
1
+ import { Command } from 'commander';
2
+
3
+ /**
4
+ * Create the calls command group
5
+ */
6
+ declare function createCallsCommand(): Command;
7
+
8
+ export { createCallsCommand };