bland-cli 0.1.2

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 (127) hide show
  1. package/README.md +516 -0
  2. package/dist/commands/agent.d.ts +3 -0
  3. package/dist/commands/agent.d.ts.map +1 -0
  4. package/dist/commands/agent.js +144 -0
  5. package/dist/commands/agent.js.map +1 -0
  6. package/dist/commands/alarm.d.ts +3 -0
  7. package/dist/commands/alarm.d.ts.map +1 -0
  8. package/dist/commands/alarm.js +93 -0
  9. package/dist/commands/alarm.js.map +1 -0
  10. package/dist/commands/audio.d.ts +3 -0
  11. package/dist/commands/audio.d.ts.map +1 -0
  12. package/dist/commands/audio.js +77 -0
  13. package/dist/commands/audio.js.map +1 -0
  14. package/dist/commands/auth.d.ts +3 -0
  15. package/dist/commands/auth.d.ts.map +1 -0
  16. package/dist/commands/auth.js +199 -0
  17. package/dist/commands/auth.js.map +1 -0
  18. package/dist/commands/batch.d.ts +3 -0
  19. package/dist/commands/batch.d.ts.map +1 -0
  20. package/dist/commands/batch.js +96 -0
  21. package/dist/commands/batch.js.map +1 -0
  22. package/dist/commands/call.d.ts +3 -0
  23. package/dist/commands/call.d.ts.map +1 -0
  24. package/dist/commands/call.js +348 -0
  25. package/dist/commands/call.js.map +1 -0
  26. package/dist/commands/eval.d.ts +3 -0
  27. package/dist/commands/eval.d.ts.map +1 -0
  28. package/dist/commands/eval.js +67 -0
  29. package/dist/commands/eval.js.map +1 -0
  30. package/dist/commands/guard.d.ts +3 -0
  31. package/dist/commands/guard.d.ts.map +1 -0
  32. package/dist/commands/guard.js +100 -0
  33. package/dist/commands/guard.js.map +1 -0
  34. package/dist/commands/knowledge.d.ts +3 -0
  35. package/dist/commands/knowledge.d.ts.map +1 -0
  36. package/dist/commands/knowledge.js +137 -0
  37. package/dist/commands/knowledge.js.map +1 -0
  38. package/dist/commands/listen.d.ts +3 -0
  39. package/dist/commands/listen.d.ts.map +1 -0
  40. package/dist/commands/listen.js +98 -0
  41. package/dist/commands/listen.js.map +1 -0
  42. package/dist/commands/mcp.d.ts +3 -0
  43. package/dist/commands/mcp.d.ts.map +1 -0
  44. package/dist/commands/mcp.js +22 -0
  45. package/dist/commands/mcp.js.map +1 -0
  46. package/dist/commands/number.d.ts +3 -0
  47. package/dist/commands/number.d.ts.map +1 -0
  48. package/dist/commands/number.js +225 -0
  49. package/dist/commands/number.js.map +1 -0
  50. package/dist/commands/pathway.d.ts +3 -0
  51. package/dist/commands/pathway.d.ts.map +1 -0
  52. package/dist/commands/pathway.js +1003 -0
  53. package/dist/commands/pathway.js.map +1 -0
  54. package/dist/commands/persona.d.ts +3 -0
  55. package/dist/commands/persona.d.ts.map +1 -0
  56. package/dist/commands/persona.js +236 -0
  57. package/dist/commands/persona.js.map +1 -0
  58. package/dist/commands/release.d.ts +3 -0
  59. package/dist/commands/release.d.ts.map +1 -0
  60. package/dist/commands/release.js +68 -0
  61. package/dist/commands/release.js.map +1 -0
  62. package/dist/commands/secret.d.ts +3 -0
  63. package/dist/commands/secret.d.ts.map +1 -0
  64. package/dist/commands/secret.js +62 -0
  65. package/dist/commands/secret.js.map +1 -0
  66. package/dist/commands/sip.d.ts +3 -0
  67. package/dist/commands/sip.d.ts.map +1 -0
  68. package/dist/commands/sip.js +45 -0
  69. package/dist/commands/sip.js.map +1 -0
  70. package/dist/commands/sms.d.ts +3 -0
  71. package/dist/commands/sms.d.ts.map +1 -0
  72. package/dist/commands/sms.js +84 -0
  73. package/dist/commands/sms.js.map +1 -0
  74. package/dist/commands/tool.d.ts +3 -0
  75. package/dist/commands/tool.d.ts.map +1 -0
  76. package/dist/commands/tool.js +201 -0
  77. package/dist/commands/tool.js.map +1 -0
  78. package/dist/commands/voice.d.ts +3 -0
  79. package/dist/commands/voice.d.ts.map +1 -0
  80. package/dist/commands/voice.js +93 -0
  81. package/dist/commands/voice.js.map +1 -0
  82. package/dist/commands/widget.d.ts +3 -0
  83. package/dist/commands/widget.d.ts.map +1 -0
  84. package/dist/commands/widget.js +78 -0
  85. package/dist/commands/widget.js.map +1 -0
  86. package/dist/index.d.ts +3 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +52 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/lib/api.d.ts +23 -0
  91. package/dist/lib/api.d.ts.map +1 -0
  92. package/dist/lib/api.js +105 -0
  93. package/dist/lib/api.js.map +1 -0
  94. package/dist/lib/config.d.ts +16 -0
  95. package/dist/lib/config.d.ts.map +1 -0
  96. package/dist/lib/config.js +117 -0
  97. package/dist/lib/config.js.map +1 -0
  98. package/dist/lib/errors.d.ts +15 -0
  99. package/dist/lib/errors.d.ts.map +1 -0
  100. package/dist/lib/errors.js +43 -0
  101. package/dist/lib/errors.js.map +1 -0
  102. package/dist/lib/output.d.ts +30 -0
  103. package/dist/lib/output.d.ts.map +1 -0
  104. package/dist/lib/output.js +131 -0
  105. package/dist/lib/output.js.map +1 -0
  106. package/dist/lib/pathway-file.d.ts +33 -0
  107. package/dist/lib/pathway-file.d.ts.map +1 -0
  108. package/dist/lib/pathway-file.js +271 -0
  109. package/dist/lib/pathway-file.js.map +1 -0
  110. package/dist/mcp/server.d.ts +2 -0
  111. package/dist/mcp/server.d.ts.map +1 -0
  112. package/dist/mcp/server.js +375 -0
  113. package/dist/mcp/server.js.map +1 -0
  114. package/dist/types/api.d.ts +302 -0
  115. package/dist/types/api.d.ts.map +1 -0
  116. package/dist/types/api.js +2 -0
  117. package/dist/types/api.js.map +1 -0
  118. package/dist/types/config.d.ts +14 -0
  119. package/dist/types/config.d.ts.map +1 -0
  120. package/dist/types/config.js +2 -0
  121. package/dist/types/config.js.map +1 -0
  122. package/dist/types/pathway.d.ts +55 -0
  123. package/dist/types/pathway.d.ts.map +1 -0
  124. package/dist/types/pathway.js +2 -0
  125. package/dist/types/pathway.js.map +1 -0
  126. package/package.json +51 -0
  127. package/templates/pathway.yaml +30 -0
@@ -0,0 +1,93 @@
1
+ import { select, input, confirm } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { api, extractArray } from "../lib/api.js";
5
+ import * as output from "../lib/output.js";
6
+ import { handleError } from "../lib/errors.js";
7
+ export function registerAlarmCommand(program) {
8
+ const alarm = program.command("alarm").description("Manage monitoring alarms");
9
+ alarm.command("list")
10
+ .description("List alarms")
11
+ .option("--json", "Output as JSON")
12
+ .action(async (opts) => {
13
+ try {
14
+ const spinner = ora("Fetching...").start();
15
+ const raw = await api.get("/v1/alarms");
16
+ spinner.stop();
17
+ const alarms = extractArray(raw);
18
+ if (opts.json) {
19
+ output.json(alarms);
20
+ return;
21
+ }
22
+ output.table(alarms.map((a) => ({
23
+ ...a,
24
+ enabled_display: a.enabled ? chalk.green("enabled") : chalk.dim("disabled"),
25
+ })), [
26
+ { key: "id", header: "ID", width: 38 },
27
+ { key: "metric_type", header: "Metric", width: 15 },
28
+ { key: "threshold", header: "Threshold", width: 10 },
29
+ { key: "enabled_display", header: "Status", width: 10 },
30
+ ]);
31
+ }
32
+ catch (err) {
33
+ handleError(err);
34
+ }
35
+ });
36
+ alarm.command("create")
37
+ .description("Create an alarm")
38
+ .option("--metric <type>", "Metric: latency, api_errors, call_length")
39
+ .option("--threshold <n>", "Threshold value")
40
+ .option("--webhook <url>", "Webhook URL for notifications")
41
+ .option("--email <addr>", "Email for notifications")
42
+ .option("--sms <number>", "SMS number for notifications")
43
+ .option("--json", "Output as JSON")
44
+ .action(async (opts) => {
45
+ try {
46
+ const body = {};
47
+ body.metric_type = opts.metric || await select({
48
+ message: "Metric to monitor:",
49
+ choices: [
50
+ { name: "Latency", value: "latency" },
51
+ { name: "API Errors", value: "api_errors" },
52
+ { name: "Call Length", value: "call_length" },
53
+ ],
54
+ });
55
+ const threshold = opts.threshold || await input({
56
+ message: "Threshold (0.5=sensitive, 1.0=normal, 2.0=relaxed):",
57
+ default: "1.0",
58
+ });
59
+ body.threshold = parseFloat(threshold);
60
+ if (opts.webhook)
61
+ body.webhook_config = { url: opts.webhook };
62
+ if (opts.email)
63
+ body.email_addresses = [opts.email];
64
+ if (opts.sms)
65
+ body.sms_numbers = [opts.sms];
66
+ const spinner = ora("Creating alarm...").start();
67
+ const result = await api.post("/v1/alarms", body);
68
+ spinner.succeed(`Alarm created ${chalk.dim(`(${result.id})`)}`);
69
+ if (opts.json)
70
+ output.json(result);
71
+ }
72
+ catch (err) {
73
+ handleError(err);
74
+ }
75
+ });
76
+ alarm.command("delete")
77
+ .description("Delete an alarm")
78
+ .argument("<id>", "Alarm ID")
79
+ .action(async (id) => {
80
+ try {
81
+ const proceed = await confirm({ message: `Delete alarm ${id}?` });
82
+ if (!proceed)
83
+ return;
84
+ const spinner = ora("Deleting...").start();
85
+ await api.delete(`/v1/alarms/${id}`);
86
+ spinner.succeed("Alarm deleted.");
87
+ }
88
+ catch (err) {
89
+ handleError(err);
90
+ }
91
+ });
92
+ }
93
+ //# sourceMappingURL=alarm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alarm.js","sourceRoot":"","sources":["../../src/commands/alarm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerAudioCommand(program: Command): void;
3
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/commands/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE3D"}
@@ -0,0 +1,77 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import * as fs from "fs";
4
+ import { request } from "../lib/api.js";
5
+ import * as output from "../lib/output.js";
6
+ import { handleError } from "../lib/errors.js";
7
+ export function registerAudioCommand(program) {
8
+ const audio = program.command("audio").description("Generate and analyze audio");
9
+ audio.command("generate")
10
+ .description("Generate TTS audio from text")
11
+ .argument("<text>", "Text to convert to speech")
12
+ .option("--voice <voice>", "Voice to use", "nat")
13
+ .option("-o, --output <file>", "Output file path")
14
+ .option("--json", "Output as JSON")
15
+ .action(async (text, opts) => {
16
+ try {
17
+ const spinner = ora("Generating audio...").start();
18
+ const result = await request("/v1/speak", {
19
+ method: "POST",
20
+ body: { text, voice: opts.voice },
21
+ });
22
+ spinner.stop();
23
+ const audioUrl = result.url || result.audio_url;
24
+ if (opts.json) {
25
+ output.json(result);
26
+ return;
27
+ }
28
+ if (opts.output && audioUrl) {
29
+ const response = await fetch(audioUrl);
30
+ const buffer = Buffer.from(await response.arrayBuffer());
31
+ fs.writeFileSync(opts.output, buffer);
32
+ output.success(`Audio saved to ${opts.output}`);
33
+ }
34
+ else if (audioUrl) {
35
+ output.success("Audio generated.");
36
+ console.log(` ${audioUrl}`);
37
+ }
38
+ else {
39
+ output.success("Audio generated.");
40
+ }
41
+ }
42
+ catch (err) {
43
+ handleError(err);
44
+ }
45
+ });
46
+ audio.command("analyze")
47
+ .description("Analyze an audio file")
48
+ .argument("<file>", "Audio file path")
49
+ .option("--transcribe", "Include transcription")
50
+ .option("--json", "Output as JSON")
51
+ .action(async (file, opts) => {
52
+ try {
53
+ if (!fs.existsSync(file)) {
54
+ console.error(chalk.red(`File not found: ${file}`));
55
+ process.exit(1);
56
+ }
57
+ const spinner = ora("Analyzing audio...").start();
58
+ const result = await request("/v1/audio/analyze", {
59
+ method: "POST",
60
+ body: {
61
+ file_path: file,
62
+ transcribe: opts.transcribe,
63
+ },
64
+ });
65
+ spinner.stop();
66
+ if (opts.json) {
67
+ output.json(result);
68
+ return;
69
+ }
70
+ output.json(result);
71
+ }
72
+ catch (err) {
73
+ handleError(err);
74
+ }
75
+ });
76
+ }
77
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../../src/commands/audio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerAuthCommand(program: Command): void;
3
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6N1D"}
@@ -0,0 +1,199 @@
1
+ import { input, select, confirm } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { api } from "../lib/api.js";
5
+ import { saveApiKey, getProfiles, getCurrentProfileName, switchProfile, deleteProfile, clearAuth, isAuthenticated, } from "../lib/config.js";
6
+ import * as output from "../lib/output.js";
7
+ import { handleError } from "../lib/errors.js";
8
+ export function registerAuthCommand(program) {
9
+ const auth = program
10
+ .command("auth")
11
+ .description("Manage authentication and API keys");
12
+ // ── bland auth login ──
13
+ auth
14
+ .command("login")
15
+ .description("Authenticate with Bland AI")
16
+ .option("-k, --key <key>", "API key (skip interactive prompt)")
17
+ .option("-p, --profile <name>", "Profile name", "default")
18
+ .option("--base-url <url>", "Custom API base URL")
19
+ .action(async (opts) => {
20
+ try {
21
+ let apiKey = opts.key;
22
+ if (!apiKey) {
23
+ console.log();
24
+ console.log(chalk.bold("Authenticate with Bland AI"));
25
+ console.log(chalk.dim("Get your API key from https://app.bland.ai/dashboard/settings"));
26
+ console.log();
27
+ apiKey = await input({
28
+ message: "Enter your API key:",
29
+ validate: (val) => val.trim().length > 0 || "API key is required",
30
+ });
31
+ }
32
+ const spinner = ora("Verifying API key...").start();
33
+ // Save temporarily to test
34
+ saveApiKey(apiKey.trim(), opts.profile, opts.baseUrl);
35
+ try {
36
+ const account = await api.get("/v1/me");
37
+ spinner.succeed("Authenticated successfully");
38
+ console.log();
39
+ output.detail([
40
+ ["Profile", opts.profile],
41
+ ["Status", account.status],
42
+ ["Balance", `$${account.billing.current_balance.toFixed(2)}`],
43
+ ["Total Calls", account.total_calls],
44
+ ]);
45
+ }
46
+ catch (err) {
47
+ spinner.fail("Invalid API key");
48
+ clearAuth();
49
+ throw err;
50
+ }
51
+ }
52
+ catch (err) {
53
+ handleError(err);
54
+ }
55
+ });
56
+ // ── bland auth logout ──
57
+ auth
58
+ .command("logout")
59
+ .description("Clear stored credentials")
60
+ .option("-p, --profile <name>", "Specific profile to remove")
61
+ .option("-a, --all", "Remove all profiles")
62
+ .action(async (opts) => {
63
+ try {
64
+ if (opts.all) {
65
+ const yes = await confirm({
66
+ message: "Remove all stored credentials?",
67
+ });
68
+ if (yes) {
69
+ clearAuth();
70
+ output.success("All credentials removed.");
71
+ }
72
+ }
73
+ else if (opts.profile) {
74
+ deleteProfile(opts.profile);
75
+ output.success(`Profile "${opts.profile}" removed.`);
76
+ }
77
+ else {
78
+ const current = getCurrentProfileName();
79
+ deleteProfile(current);
80
+ output.success(`Profile "${current}" removed.`);
81
+ }
82
+ }
83
+ catch (err) {
84
+ handleError(err);
85
+ }
86
+ });
87
+ // ── bland auth whoami ──
88
+ auth
89
+ .command("whoami")
90
+ .description("Show current account info")
91
+ .option("--json", "Output as JSON")
92
+ .action(async (opts) => {
93
+ try {
94
+ if (!isAuthenticated()) {
95
+ console.log(chalk.yellow("Not authenticated. Run `bland auth login` to get started."));
96
+ return;
97
+ }
98
+ const spinner = ora("Fetching account info...").start();
99
+ const account = await api.get("/v1/me");
100
+ spinner.stop();
101
+ if (opts.json) {
102
+ output.json({
103
+ profile: getCurrentProfileName(),
104
+ ...account,
105
+ });
106
+ return;
107
+ }
108
+ console.log();
109
+ output.detail([
110
+ ["Profile", getCurrentProfileName()],
111
+ ["Status", account.status],
112
+ ["Balance", `$${account.billing.current_balance.toFixed(2)}`],
113
+ [
114
+ "Auto-Refill",
115
+ account.billing.refill_to
116
+ ? `$${account.billing.refill_to}`
117
+ : "disabled",
118
+ ],
119
+ ["Total Calls", account.total_calls],
120
+ ]);
121
+ }
122
+ catch (err) {
123
+ handleError(err);
124
+ }
125
+ });
126
+ // ── bland auth switch ──
127
+ auth
128
+ .command("switch")
129
+ .description("Switch between stored profiles")
130
+ .argument("[profile]", "Profile name to switch to")
131
+ .action(async (profileArg) => {
132
+ try {
133
+ const profiles = getProfiles();
134
+ const profileNames = Object.keys(profiles);
135
+ if (profileNames.length === 0) {
136
+ console.log(chalk.yellow("No profiles found. Run `bland auth login` to create one."));
137
+ return;
138
+ }
139
+ let target = profileArg;
140
+ if (!target) {
141
+ const current = getCurrentProfileName();
142
+ target = await select({
143
+ message: "Select profile:",
144
+ choices: profileNames.map((name) => ({
145
+ name: name === current ? `${name} ${chalk.dim("(current)")}` : name,
146
+ value: name,
147
+ })),
148
+ });
149
+ }
150
+ switchProfile(target);
151
+ output.success(`Switched to profile "${target}"`);
152
+ // Show account info for the switched profile
153
+ const spinner = ora("Verifying...").start();
154
+ try {
155
+ const account = await api.get("/v1/me");
156
+ spinner.stop();
157
+ output.detail([
158
+ ["Status", account.status],
159
+ ["Balance", `$${account.billing.current_balance.toFixed(2)}`],
160
+ ]);
161
+ }
162
+ catch {
163
+ spinner.warn("Could not verify profile. The API key may be invalid.");
164
+ }
165
+ }
166
+ catch (err) {
167
+ handleError(err);
168
+ }
169
+ });
170
+ // ── bland auth profiles ──
171
+ auth
172
+ .command("profiles")
173
+ .description("List all stored profiles")
174
+ .action(() => {
175
+ try {
176
+ const profiles = getProfiles();
177
+ const current = getCurrentProfileName();
178
+ const names = Object.keys(profiles);
179
+ if (names.length === 0) {
180
+ console.log(chalk.dim(" No profiles. Run `bland auth login` to create one."));
181
+ return;
182
+ }
183
+ console.log();
184
+ for (const name of names) {
185
+ const isCurrent = name === current;
186
+ const prefix = isCurrent ? chalk.green("▸") : " ";
187
+ const label = isCurrent ? chalk.bold(name) : name;
188
+ const url = chalk.dim(profiles[name].base_url);
189
+ const key = chalk.dim(profiles[name].api_key.slice(0, 8) + "...");
190
+ console.log(` ${prefix} ${label} ${key} ${url}`);
191
+ }
192
+ console.log();
193
+ }
194
+ catch (err) {
195
+ handleError(err);
196
+ }
197
+ });
198
+ }
199
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerBatchCommand(program: Command): void;
3
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/commands/batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE3D"}
@@ -0,0 +1,96 @@
1
+ import { confirm } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import * as fs from "fs";
5
+ import { api } from "../lib/api.js";
6
+ import * as output from "../lib/output.js";
7
+ import { handleError } from "../lib/errors.js";
8
+ export function registerBatchCommand(program) {
9
+ const batch = program
10
+ .command("batch")
11
+ .description("Manage batch call campaigns");
12
+ batch.command("create")
13
+ .description("Create a batch campaign")
14
+ .option("--file <path>", "Contacts CSV file")
15
+ .option("--pathway <id>", "Pathway ID")
16
+ .option("--from <number>", "From number")
17
+ .option("--task <prompt>", "Agent prompt")
18
+ .option("--voice <voice>", "Voice")
19
+ .option("--max-concurrent <n>", "Max concurrent calls")
20
+ .option("--json", "Output as JSON")
21
+ .action(async (opts) => {
22
+ try {
23
+ const body = {};
24
+ const globalConfig = {};
25
+ const callObjects = [];
26
+ if (opts.file) {
27
+ const content = fs.readFileSync(opts.file, "utf-8");
28
+ const lines = content.split("\n").filter(Boolean);
29
+ // Simple CSV: each line is a phone number (or first column)
30
+ for (const line of lines.slice(1)) {
31
+ const parts = line.split(",");
32
+ const phone = parts[0].trim().replace(/"/g, "");
33
+ if (phone)
34
+ callObjects.push({ phone_number: phone });
35
+ }
36
+ }
37
+ if (opts.pathway)
38
+ globalConfig.pathway_id = opts.pathway;
39
+ if (opts.from)
40
+ globalConfig.from = opts.from;
41
+ if (opts.task)
42
+ globalConfig.task = opts.task;
43
+ if (opts.voice)
44
+ globalConfig.voice = opts.voice;
45
+ if (opts.maxConcurrent)
46
+ body.max_concurrent = parseInt(opts.maxConcurrent, 10);
47
+ body.call_objects = callObjects;
48
+ if (Object.keys(globalConfig).length > 0)
49
+ body.global = globalConfig;
50
+ const spinner = ora("Creating batch...").start();
51
+ const result = await api.post("/v2/batches/create", body);
52
+ spinner.succeed(`Batch created ${chalk.dim(`(${result.batch_id})`)} — ${result.total_calls || callObjects.length} calls queued`);
53
+ if (opts.json)
54
+ output.json(result);
55
+ }
56
+ catch (err) {
57
+ handleError(err);
58
+ }
59
+ });
60
+ batch.command("get")
61
+ .description("Get batch details")
62
+ .argument("<id>", "Batch ID")
63
+ .option("--json", "Output as JSON")
64
+ .action(async (id, opts) => {
65
+ try {
66
+ const spinner = ora("Fetching batch...").start();
67
+ const result = await api.get(`/v2/batches/${id}`);
68
+ spinner.stop();
69
+ if (opts.json) {
70
+ output.json(result);
71
+ return;
72
+ }
73
+ output.json(result);
74
+ }
75
+ catch (err) {
76
+ handleError(err);
77
+ }
78
+ });
79
+ batch.command("stop")
80
+ .description("Stop a running batch")
81
+ .argument("<id>", "Batch ID")
82
+ .action(async (id) => {
83
+ try {
84
+ const proceed = await confirm({ message: `Stop batch ${id}?` });
85
+ if (!proceed)
86
+ return;
87
+ const spinner = ora("Stopping batch...").start();
88
+ await api.post(`/v2/batches/${id}/stop`, {});
89
+ spinner.succeed("Batch stopped.");
90
+ }
91
+ catch (err) {
92
+ handleError(err);
93
+ }
94
+ });
95
+ }
96
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/commands/batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerCallCommand(program: Command): void;
3
+ //# sourceMappingURL=call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call.d.ts","sourceRoot":"","sources":["../../src/commands/call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyV1D"}