@bland-ai/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/commands/agent.d.ts +3 -0
  2. package/dist/commands/agent.d.ts.map +1 -0
  3. package/dist/commands/agent.js +143 -0
  4. package/dist/commands/agent.js.map +1 -0
  5. package/dist/commands/alarm.d.ts +3 -0
  6. package/dist/commands/alarm.d.ts.map +1 -0
  7. package/dist/commands/alarm.js +92 -0
  8. package/dist/commands/alarm.js.map +1 -0
  9. package/dist/commands/audio.d.ts +3 -0
  10. package/dist/commands/audio.d.ts.map +1 -0
  11. package/dist/commands/audio.js +77 -0
  12. package/dist/commands/audio.js.map +1 -0
  13. package/dist/commands/auth.d.ts +3 -0
  14. package/dist/commands/auth.d.ts.map +1 -0
  15. package/dist/commands/auth.js +199 -0
  16. package/dist/commands/auth.js.map +1 -0
  17. package/dist/commands/batch.d.ts +3 -0
  18. package/dist/commands/batch.d.ts.map +1 -0
  19. package/dist/commands/batch.js +108 -0
  20. package/dist/commands/batch.js.map +1 -0
  21. package/dist/commands/call.d.ts +3 -0
  22. package/dist/commands/call.d.ts.map +1 -0
  23. package/dist/commands/call.js +348 -0
  24. package/dist/commands/call.js.map +1 -0
  25. package/dist/commands/eval.d.ts +3 -0
  26. package/dist/commands/eval.d.ts.map +1 -0
  27. package/dist/commands/eval.js +66 -0
  28. package/dist/commands/eval.js.map +1 -0
  29. package/dist/commands/guard.d.ts +3 -0
  30. package/dist/commands/guard.d.ts.map +1 -0
  31. package/dist/commands/guard.js +100 -0
  32. package/dist/commands/guard.js.map +1 -0
  33. package/dist/commands/knowledge.d.ts +3 -0
  34. package/dist/commands/knowledge.d.ts.map +1 -0
  35. package/dist/commands/knowledge.js +136 -0
  36. package/dist/commands/knowledge.js.map +1 -0
  37. package/dist/commands/listen.d.ts +3 -0
  38. package/dist/commands/listen.d.ts.map +1 -0
  39. package/dist/commands/listen.js +98 -0
  40. package/dist/commands/listen.js.map +1 -0
  41. package/dist/commands/mcp.d.ts +3 -0
  42. package/dist/commands/mcp.d.ts.map +1 -0
  43. package/dist/commands/mcp.js +22 -0
  44. package/dist/commands/mcp.js.map +1 -0
  45. package/dist/commands/number.d.ts +3 -0
  46. package/dist/commands/number.d.ts.map +1 -0
  47. package/dist/commands/number.js +225 -0
  48. package/dist/commands/number.js.map +1 -0
  49. package/dist/commands/pathway.d.ts +3 -0
  50. package/dist/commands/pathway.d.ts.map +1 -0
  51. package/dist/commands/pathway.js +977 -0
  52. package/dist/commands/pathway.js.map +1 -0
  53. package/dist/commands/persona.d.ts +3 -0
  54. package/dist/commands/persona.d.ts.map +1 -0
  55. package/dist/commands/persona.js +234 -0
  56. package/dist/commands/persona.js.map +1 -0
  57. package/dist/commands/release.d.ts +3 -0
  58. package/dist/commands/release.d.ts.map +1 -0
  59. package/dist/commands/release.js +67 -0
  60. package/dist/commands/release.js.map +1 -0
  61. package/dist/commands/secret.d.ts +3 -0
  62. package/dist/commands/secret.d.ts.map +1 -0
  63. package/dist/commands/secret.js +57 -0
  64. package/dist/commands/secret.js.map +1 -0
  65. package/dist/commands/sip.d.ts +3 -0
  66. package/dist/commands/sip.d.ts.map +1 -0
  67. package/dist/commands/sip.js +45 -0
  68. package/dist/commands/sip.js.map +1 -0
  69. package/dist/commands/sms.d.ts +3 -0
  70. package/dist/commands/sms.d.ts.map +1 -0
  71. package/dist/commands/sms.js +83 -0
  72. package/dist/commands/sms.js.map +1 -0
  73. package/dist/commands/tool.d.ts +3 -0
  74. package/dist/commands/tool.d.ts.map +1 -0
  75. package/dist/commands/tool.js +200 -0
  76. package/dist/commands/tool.js.map +1 -0
  77. package/dist/commands/voice.d.ts +3 -0
  78. package/dist/commands/voice.d.ts.map +1 -0
  79. package/dist/commands/voice.js +95 -0
  80. package/dist/commands/voice.js.map +1 -0
  81. package/dist/commands/widget.d.ts +3 -0
  82. package/dist/commands/widget.d.ts.map +1 -0
  83. package/dist/commands/widget.js +77 -0
  84. package/dist/commands/widget.js.map +1 -0
  85. package/dist/index.d.ts +3 -0
  86. package/dist/index.d.ts.map +1 -0
  87. package/dist/index.js +52 -0
  88. package/dist/index.js.map +1 -0
  89. package/dist/lib/api.d.ts +17 -0
  90. package/dist/lib/api.d.ts.map +1 -0
  91. package/dist/lib/api.js +89 -0
  92. package/dist/lib/api.js.map +1 -0
  93. package/dist/lib/config.d.ts +16 -0
  94. package/dist/lib/config.d.ts.map +1 -0
  95. package/dist/lib/config.js +117 -0
  96. package/dist/lib/config.js.map +1 -0
  97. package/dist/lib/errors.d.ts +15 -0
  98. package/dist/lib/errors.d.ts.map +1 -0
  99. package/dist/lib/errors.js +43 -0
  100. package/dist/lib/errors.js.map +1 -0
  101. package/dist/lib/output.d.ts +30 -0
  102. package/dist/lib/output.d.ts.map +1 -0
  103. package/dist/lib/output.js +131 -0
  104. package/dist/lib/output.js.map +1 -0
  105. package/dist/lib/pathway-file.d.ts +31 -0
  106. package/dist/lib/pathway-file.d.ts.map +1 -0
  107. package/dist/lib/pathway-file.js +236 -0
  108. package/dist/lib/pathway-file.js.map +1 -0
  109. package/dist/mcp/server.d.ts +2 -0
  110. package/dist/mcp/server.d.ts.map +1 -0
  111. package/dist/mcp/server.js +375 -0
  112. package/dist/mcp/server.js.map +1 -0
  113. package/dist/types/api.d.ts +302 -0
  114. package/dist/types/api.d.ts.map +1 -0
  115. package/dist/types/api.js +2 -0
  116. package/dist/types/api.js.map +1 -0
  117. package/dist/types/config.d.ts +14 -0
  118. package/dist/types/config.d.ts.map +1 -0
  119. package/dist/types/config.js +2 -0
  120. package/dist/types/config.js.map +1 -0
  121. package/dist/types/pathway.d.ts +55 -0
  122. package/dist/types/pathway.d.ts.map +1 -0
  123. package/dist/types/pathway.js +2 -0
  124. package/dist/types/pathway.js.map +1 -0
  125. package/package.json +51 -0
  126. package/templates/pathway.yaml +30 -0
@@ -0,0 +1,100 @@
1
+ import { select, input, confirm } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { api } from "../lib/api.js";
5
+ import * as output from "../lib/output.js";
6
+ import { handleError } from "../lib/errors.js";
7
+ export function registerGuardCommand(program) {
8
+ const guard = program.command("guard").description("Manage guard rails");
9
+ guard.command("list")
10
+ .description("List guard rails")
11
+ .option("--json", "Output as JSON")
12
+ .action(async (opts) => {
13
+ try {
14
+ const spinner = ora("Fetching...").start();
15
+ const rails = await api.get("/v1/guard_rails");
16
+ spinner.stop();
17
+ if (opts.json) {
18
+ output.json(rails);
19
+ return;
20
+ }
21
+ output.table((rails || []).map((r) => ({
22
+ ...r,
23
+ attachments_count: r.attachments?.length || 0,
24
+ date: output.formatDate(r.created_at),
25
+ })), [
26
+ { key: "id", header: "ID", width: 38 },
27
+ { key: "type", header: "Type", width: 25 },
28
+ { key: "name", header: "Name", width: 20 },
29
+ { key: "attachments_count", header: "Attached", width: 10 },
30
+ ]);
31
+ }
32
+ catch (err) {
33
+ handleError(err);
34
+ }
35
+ });
36
+ guard.command("create")
37
+ .description("Create a guard rail")
38
+ .option("--type <type>", "Type: tcpa:ai_disclosure, tcpa:recording_disclosure, tcpa:opt_out, custom")
39
+ .option("--name <name>", "Name (for custom type)")
40
+ .option("--description <desc>", "Description (for custom type)")
41
+ .option("--prompt <text>", "Detection prompt (for custom type)")
42
+ .option("--attach-to <id>", "Persona/pathway ID to attach to")
43
+ .option("--source-type <type>", "Source type: PERSONA, PATHWAY, INBOUND")
44
+ .option("--action <action>", "Action: end_call, transfer")
45
+ .option("--json", "Output as JSON")
46
+ .action(async (opts) => {
47
+ try {
48
+ let type = opts.type;
49
+ if (!type) {
50
+ type = await select({
51
+ message: "Guard rail type:",
52
+ choices: [
53
+ { name: "TCPA: AI Disclosure", value: "tcpa:ai_disclosure" },
54
+ { name: "TCPA: Recording Disclosure", value: "tcpa:recording_disclosure" },
55
+ { name: "TCPA: Opt Out", value: "tcpa:opt_out" },
56
+ { name: "Custom", value: "custom" },
57
+ ],
58
+ });
59
+ }
60
+ const body = { type };
61
+ if (type === "custom") {
62
+ body.name = opts.name || await input({ message: "Name:" });
63
+ body.description = opts.description || await input({ message: "Description:" });
64
+ body.prompt = opts.prompt || await input({ message: "Detection prompt:" });
65
+ }
66
+ if (opts.attachTo) {
67
+ body.attachments = [{
68
+ source_type: opts.sourceType || "PERSONA",
69
+ source_id: opts.attachTo,
70
+ actions: [opts.action || "end_call"],
71
+ }];
72
+ }
73
+ const spinner = ora("Creating guard rail...").start();
74
+ const result = await api.post("/v1/guard_rails", body);
75
+ spinner.succeed(`Guard rail created ${chalk.dim(`(${result.id})`)}`);
76
+ if (opts.json)
77
+ output.json(result);
78
+ }
79
+ catch (err) {
80
+ handleError(err);
81
+ }
82
+ });
83
+ guard.command("delete")
84
+ .description("Delete a guard rail")
85
+ .argument("<id>", "Guard rail ID")
86
+ .action(async (id) => {
87
+ try {
88
+ const proceed = await confirm({ message: `Delete guard rail ${id}?` });
89
+ if (!proceed)
90
+ return;
91
+ const spinner = ora("Deleting...").start();
92
+ await api.delete(`/v1/guard_rails/${id}`);
93
+ spinner.succeed("Guard rail deleted.");
94
+ }
95
+ catch (err) {
96
+ handleError(err);
97
+ }
98
+ });
99
+ }
100
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/commands/guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerKnowledgeCommand(program: Command): void;
3
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/commands/knowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+G/D"}
@@ -0,0 +1,136 @@
1
+ import { input } 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 registerKnowledgeCommand(program) {
9
+ const kb = program
10
+ .command("knowledge")
11
+ .alias("kb")
12
+ .description("Manage knowledge bases");
13
+ kb.command("list")
14
+ .description("List knowledge bases")
15
+ .option("--json", "Output as JSON")
16
+ .action(async (opts) => {
17
+ try {
18
+ const spinner = ora("Fetching...").start();
19
+ const kbs = await api.get("/v1/knowledge");
20
+ spinner.stop();
21
+ if (opts.json) {
22
+ output.json(kbs);
23
+ return;
24
+ }
25
+ output.table((kbs || []).map((k) => ({
26
+ ...k,
27
+ status_display: k.status === "COMPLETED" ? chalk.green(k.status) :
28
+ k.status === "PROCESSING" ? chalk.yellow(k.status) : chalk.red(k.status),
29
+ date: output.formatDate(k.created_at),
30
+ })), [
31
+ { key: "id", header: "ID", width: 38 },
32
+ { key: "name", header: "Name", width: 25 },
33
+ { key: "type", header: "Type", width: 15 },
34
+ { key: "status_display", header: "Status", width: 12 },
35
+ { key: "date", header: "Created", width: 20 },
36
+ ]);
37
+ }
38
+ catch (err) {
39
+ handleError(err);
40
+ }
41
+ });
42
+ kb.command("create")
43
+ .description("Create a knowledge base")
44
+ .argument("<name>", "Knowledge base name")
45
+ .option("--description <text>", "Description")
46
+ .option("--json", "Output as JSON")
47
+ .action(async (name, opts) => {
48
+ try {
49
+ const spinner = ora("Creating...").start();
50
+ const result = await api.post("/v1/knowledge", {
51
+ name,
52
+ description: opts.description,
53
+ });
54
+ spinner.succeed(`Knowledge base "${name}" created ${chalk.dim(`(${result.id})`)}`);
55
+ if (opts.json)
56
+ output.json(result);
57
+ }
58
+ catch (err) {
59
+ handleError(err);
60
+ }
61
+ });
62
+ kb.command("scrape")
63
+ .description("Scrape URLs into a knowledge base")
64
+ .argument("<name>", "Knowledge base name")
65
+ .option("--urls <urls>", "Comma-separated URLs")
66
+ .option("--file <path>", "File with URLs (one per line)")
67
+ .option("--json", "Output as JSON")
68
+ .action(async (name, opts) => {
69
+ try {
70
+ let urls = [];
71
+ if (opts.urls) {
72
+ urls = opts.urls.split(",").map((u) => u.trim());
73
+ }
74
+ else if (opts.file) {
75
+ const content = fs.readFileSync(opts.file, "utf-8");
76
+ urls = content.split("\n").map((u) => u.trim()).filter(Boolean);
77
+ }
78
+ else {
79
+ const raw = await input({ message: "URLs (comma-separated):" });
80
+ urls = raw.split(",").map((u) => u.trim());
81
+ }
82
+ const spinner = ora(`Scraping ${urls.length} URL(s)...`).start();
83
+ const result = await api.post("/v1/knowledge/learn", {
84
+ type: "web",
85
+ name,
86
+ urls,
87
+ });
88
+ spinner.succeed(`Scraping started ${chalk.dim(`(${result.id})`)}`);
89
+ if (opts.json)
90
+ output.json(result);
91
+ }
92
+ catch (err) {
93
+ handleError(err);
94
+ }
95
+ });
96
+ kb.command("delete")
97
+ .description("Delete a knowledge base")
98
+ .argument("<id>", "Knowledge base ID")
99
+ .action(async (id) => {
100
+ try {
101
+ const spinner = ora("Deleting...").start();
102
+ await api.delete(`/v1/knowledge/${id}`);
103
+ spinner.succeed("Knowledge base deleted.");
104
+ }
105
+ catch (err) {
106
+ handleError(err);
107
+ }
108
+ });
109
+ kb.command("status")
110
+ .description("Check processing status")
111
+ .argument("<id>", "Knowledge base ID")
112
+ .option("--json", "Output as JSON")
113
+ .action(async (id, opts) => {
114
+ try {
115
+ const spinner = ora("Checking...").start();
116
+ const kb_ = await api.get(`/v1/knowledge/${id}`);
117
+ spinner.stop();
118
+ if (opts.json) {
119
+ output.json(kb_);
120
+ return;
121
+ }
122
+ const color = kb_.status === "COMPLETED" ? chalk.green :
123
+ kb_.status === "PROCESSING" ? chalk.yellow : chalk.red;
124
+ output.detail([
125
+ ["ID", kb_.id],
126
+ ["Name", kb_.name],
127
+ ["Status", color(kb_.status)],
128
+ ["Type", kb_.type],
129
+ ]);
130
+ }
131
+ catch (err) {
132
+ handleError(err);
133
+ }
134
+ });
135
+ }
136
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/commands/knowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerListenCommand(program: Command): void;
3
+ //# sourceMappingURL=listen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.d.ts","sourceRoot":"","sources":["../../src/commands/listen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwH5D"}
@@ -0,0 +1,98 @@
1
+ import chalk from "chalk";
2
+ import * as http from "http";
3
+ import { handleError } from "../lib/errors.js";
4
+ export function registerListenCommand(program) {
5
+ program
6
+ .command("listen")
7
+ .description("Forward Bland webhooks to local development server")
8
+ .option("--forward-to <url>", "Local URL to forward webhooks to", "http://localhost:3000/webhook")
9
+ .option("--port <n>", "Port to listen on", "4000")
10
+ .option("--events <types>", "Filter event types (comma-separated)")
11
+ .action(async (opts) => {
12
+ try {
13
+ const port = parseInt(opts.port, 10);
14
+ const forwardTo = opts.forwardTo;
15
+ const eventFilter = opts.events
16
+ ? new Set(opts.events.split(",").map((e) => e.trim()))
17
+ : null;
18
+ console.log();
19
+ console.log(chalk.bold("Bland Webhook Listener"));
20
+ console.log(chalk.dim("─".repeat(40)));
21
+ console.log(` ${chalk.bold("Listening on:")} http://localhost:${port}`);
22
+ console.log(` ${chalk.bold("Forwarding to:")} ${forwardTo}`);
23
+ if (eventFilter) {
24
+ console.log(` ${chalk.bold("Events:")} ${[...eventFilter].join(", ")}`);
25
+ }
26
+ console.log(chalk.dim("─".repeat(40)));
27
+ console.log();
28
+ console.log(chalk.dim(" Set your Bland webhook URL to the public URL of this listener."));
29
+ console.log(chalk.dim(" Use ngrok or similar to expose this port publicly."));
30
+ console.log(chalk.dim(" Press Ctrl+C to stop."));
31
+ console.log();
32
+ const server = http.createServer(async (req, res) => {
33
+ if (req.method !== "POST") {
34
+ res.writeHead(200, { "Content-Type": "text/plain" });
35
+ res.end("Bland webhook listener is running.");
36
+ return;
37
+ }
38
+ let body = "";
39
+ req.on("data", (chunk) => { body += chunk; });
40
+ req.on("end", async () => {
41
+ const ts = new Date().toLocaleTimeString();
42
+ let payload = null;
43
+ try {
44
+ payload = JSON.parse(body);
45
+ }
46
+ catch {
47
+ console.log(`${chalk.dim(`[${ts}]`)} ${chalk.yellow("Received non-JSON payload")}`);
48
+ }
49
+ // Event filtering
50
+ if (eventFilter && payload) {
51
+ const eventType = (payload.event || payload.type || "unknown");
52
+ if (!eventFilter.has(eventType)) {
53
+ res.writeHead(200);
54
+ res.end("filtered");
55
+ return;
56
+ }
57
+ }
58
+ const eventType = payload
59
+ ? (payload.event || payload.type || "webhook")
60
+ : "webhook";
61
+ const callId = payload?.call_id || "";
62
+ console.log(`${chalk.dim(`[${ts}]`)} ${chalk.cyan(eventType)} ${callId ? chalk.dim(`(${callId})`) : ""}`);
63
+ // Forward to local server
64
+ try {
65
+ const forwardUrl = new URL(forwardTo);
66
+ const forwardRes = await fetch(forwardUrl.toString(), {
67
+ method: "POST",
68
+ headers: {
69
+ "Content-Type": "application/json",
70
+ ...Object.fromEntries(Object.entries(req.headers).filter(([k]) => k.startsWith("x-") || k === "user-agent")),
71
+ },
72
+ body,
73
+ });
74
+ const statusColor = forwardRes.status >= 200 && forwardRes.status < 300
75
+ ? chalk.green
76
+ : chalk.red;
77
+ console.log(` ${chalk.dim("→")} ${forwardTo} ${statusColor(`[${forwardRes.status}]`)}`);
78
+ }
79
+ catch (err) {
80
+ console.log(` ${chalk.dim("→")} ${forwardTo} ${chalk.red(`[ERROR: ${err instanceof Error ? err.message : "Connection failed"}]`)}`);
81
+ }
82
+ res.writeHead(200, { "Content-Type": "application/json" });
83
+ res.end(JSON.stringify({ received: true }));
84
+ });
85
+ });
86
+ server.listen(port, () => {
87
+ console.log(chalk.green(` Listening on port ${port}...`));
88
+ console.log();
89
+ });
90
+ // Keep alive
91
+ await new Promise(() => { });
92
+ }
93
+ catch (err) {
94
+ handleError(err);
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=listen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.js","sourceRoot":"","sources":["../../src/commands/listen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerMcpCommand(program: Command): void;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoBzD"}
@@ -0,0 +1,22 @@
1
+ import chalk from "chalk";
2
+ import { handleError } from "../lib/errors.js";
3
+ import { startMcpServer } from "../mcp/server.js";
4
+ export function registerMcpCommand(program) {
5
+ program
6
+ .command("mcp")
7
+ .description("Start MCP server for AI coding tool integration")
8
+ .option("--transport <type>", "Transport: stdio or sse", "stdio")
9
+ .option("--port <n>", "Port for SSE transport", "3100")
10
+ .action(async (opts) => {
11
+ try {
12
+ if (opts.transport === "sse") {
13
+ console.error(chalk.dim(`Starting MCP server on port ${opts.port} (SSE transport)...`));
14
+ }
15
+ await startMcpServer(opts.transport, parseInt(opts.port, 10));
16
+ }
17
+ catch (err) {
18
+ handleError(err);
19
+ }
20
+ });
21
+ }
22
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,UAAU,kBAAkB,CAAC,OAAgB;IACjD,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,oBAAoB,EAAE,yBAAyB,EAAE,OAAO,CAAC;SAChE,MAAM,CAAC,YAAY,EAAE,wBAAwB,EAAE,MAAM,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;gBAC7B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,+BAA+B,IAAI,CAAC,IAAI,qBAAqB,CAC9D,CACF,CAAC;YACJ,CAAC;YACD,MAAM,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerNumberCommand(program: Command): void;
3
+ //# sourceMappingURL=number.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../../src/commands/number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+P5D"}
@@ -0,0 +1,225 @@
1
+ import { select, input, confirm } from "@inquirer/prompts";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { api } from "../lib/api.js";
5
+ import * as output from "../lib/output.js";
6
+ import { handleError } from "../lib/errors.js";
7
+ export function registerNumberCommand(program) {
8
+ const number = program
9
+ .command("number")
10
+ .description("Manage phone numbers");
11
+ // ── bland number list ──
12
+ number
13
+ .command("list")
14
+ .description("List owned phone numbers")
15
+ .option("--json", "Output as JSON")
16
+ .action(async (opts) => {
17
+ try {
18
+ const spinner = ora("Fetching numbers...").start();
19
+ const result = await api.get("/v1/inbound");
20
+ spinner.stop();
21
+ const numbers = result.inbound_numbers || result.phone_numbers || [];
22
+ if (opts.json) {
23
+ output.json(numbers);
24
+ return;
25
+ }
26
+ if (numbers.length === 0) {
27
+ console.log(chalk.dim(" No numbers found. Run `bland number buy` to get one."));
28
+ return;
29
+ }
30
+ output.table(numbers.map((n) => ({
31
+ ...n,
32
+ display_number: output.formatPhone(n.phone_number),
33
+ pathway: n.pathway_id
34
+ ? output.truncate(n.pathway_id, 20)
35
+ : chalk.dim("—"),
36
+ persona: n.persona_id
37
+ ? output.truncate(n.persona_id, 20)
38
+ : chalk.dim("—"),
39
+ })), [
40
+ { key: "display_number", header: "Number", width: 20 },
41
+ { key: "area_code", header: "Area", width: 6 },
42
+ { key: "country_code", header: "CC", width: 4 },
43
+ { key: "pathway", header: "Pathway", width: 22 },
44
+ { key: "persona", header: "Persona", width: 22 },
45
+ ]);
46
+ }
47
+ catch (err) {
48
+ handleError(err);
49
+ }
50
+ });
51
+ // ── bland number buy ──
52
+ number
53
+ .command("buy")
54
+ .description("Purchase a new phone number")
55
+ .option("-a, --area-code <code>", "Preferred area code")
56
+ .option("-c, --country <code>", "Country code", "US")
57
+ .option("-n, --count <n>", "Number of numbers to buy", "1")
58
+ .option("--json", "Output as JSON")
59
+ .action(async (opts) => {
60
+ try {
61
+ let areaCode = opts.areaCode;
62
+ const count = parseInt(opts.count, 10);
63
+ if (!areaCode) {
64
+ areaCode = await input({
65
+ message: "Preferred area code (or leave blank for any):",
66
+ });
67
+ }
68
+ const proceed = await confirm({
69
+ message: `Purchase ${count} phone number(s)${areaCode ? ` with area code ${areaCode}` : ""}?`,
70
+ });
71
+ if (!proceed) {
72
+ console.log(chalk.dim(" Cancelled."));
73
+ return;
74
+ }
75
+ const spinner = ora("Purchasing number(s)...").start();
76
+ const body = {
77
+ country_code: opts.country,
78
+ };
79
+ if (areaCode)
80
+ body.area_code = areaCode;
81
+ const results = [];
82
+ for (let i = 0; i < count; i++) {
83
+ const result = await api.post("/v1/inbound/purchase", body);
84
+ results.push(result);
85
+ }
86
+ spinner.succeed(`Purchased ${results.length} number(s)`);
87
+ if (opts.json) {
88
+ output.json(results);
89
+ return;
90
+ }
91
+ for (const r of results) {
92
+ console.log(` ${chalk.green("✓")} ${output.formatPhone(r.phone_number)}`);
93
+ }
94
+ }
95
+ catch (err) {
96
+ handleError(err);
97
+ }
98
+ });
99
+ // ── bland number release ──
100
+ number
101
+ .command("release")
102
+ .description("Release a phone number")
103
+ .argument("<number>", "Phone number to release")
104
+ .action(async (phoneNumber) => {
105
+ try {
106
+ const proceed = await confirm({
107
+ message: `Release ${output.formatPhone(phoneNumber)}? This cannot be undone.`,
108
+ });
109
+ if (!proceed) {
110
+ console.log(chalk.dim(" Cancelled."));
111
+ return;
112
+ }
113
+ const spinner = ora("Releasing number...").start();
114
+ await api.delete(`/v1/inbound/${encodeURIComponent(phoneNumber)}`);
115
+ spinner.succeed(`Released ${output.formatPhone(phoneNumber)}`);
116
+ }
117
+ catch (err) {
118
+ handleError(err);
119
+ }
120
+ });
121
+ // ── bland number update ──
122
+ number
123
+ .command("update")
124
+ .description("Update phone number configuration")
125
+ .argument("<number>", "Phone number to update")
126
+ .option("--pathway <id>", "Set inbound pathway ID")
127
+ .option("--persona <id>", "Set persona ID")
128
+ .option("--webhook <url>", "Set webhook URL")
129
+ .option("--prompt <text>", "Set inbound prompt")
130
+ .option("--voice <voice>", "Set voice")
131
+ .option("--json", "Output as JSON")
132
+ .action(async (phoneNumber, opts) => {
133
+ try {
134
+ const body = {};
135
+ if (opts.pathway)
136
+ body.pathway_id = opts.pathway;
137
+ if (opts.persona)
138
+ body.persona_id = opts.persona;
139
+ if (opts.webhook)
140
+ body.webhook = opts.webhook;
141
+ if (opts.prompt)
142
+ body.prompt = opts.prompt;
143
+ if (opts.voice)
144
+ body.voice = opts.voice;
145
+ if (Object.keys(body).length === 0) {
146
+ console.log(chalk.yellow(" No options specified. Use --pathway, --persona, --webhook, --prompt, or --voice."));
147
+ return;
148
+ }
149
+ const spinner = ora("Updating number...").start();
150
+ const result = await api.post(`/v1/inbound/${encodeURIComponent(phoneNumber)}`, body);
151
+ spinner.succeed(`Updated ${output.formatPhone(phoneNumber)}`);
152
+ if (opts.json) {
153
+ output.json(result);
154
+ }
155
+ }
156
+ catch (err) {
157
+ handleError(err);
158
+ }
159
+ });
160
+ // ── bland number configure ──
161
+ number
162
+ .command("configure")
163
+ .description("Interactively configure a phone number")
164
+ .argument("<number>", "Phone number to configure")
165
+ .action(async (phoneNumber) => {
166
+ try {
167
+ const action = await select({
168
+ message: `Configure ${output.formatPhone(phoneNumber)}:`,
169
+ choices: [
170
+ {
171
+ name: "Set inbound pathway",
172
+ value: "pathway",
173
+ },
174
+ {
175
+ name: "Set persona",
176
+ value: "persona",
177
+ },
178
+ {
179
+ name: "Set webhook URL",
180
+ value: "webhook",
181
+ },
182
+ {
183
+ name: "Set inbound prompt",
184
+ value: "prompt",
185
+ },
186
+ {
187
+ name: "Set voice",
188
+ value: "voice",
189
+ },
190
+ ],
191
+ });
192
+ const body = {};
193
+ let value;
194
+ switch (action) {
195
+ case "pathway":
196
+ value = await input({ message: "Pathway ID:" });
197
+ body.pathway_id = value;
198
+ break;
199
+ case "persona":
200
+ value = await input({ message: "Persona ID:" });
201
+ body.persona_id = value;
202
+ break;
203
+ case "webhook":
204
+ value = await input({ message: "Webhook URL:" });
205
+ body.webhook = value;
206
+ break;
207
+ case "prompt":
208
+ value = await input({ message: "Inbound prompt:" });
209
+ body.prompt = value;
210
+ break;
211
+ case "voice":
212
+ value = await input({ message: "Voice:" });
213
+ body.voice = value;
214
+ break;
215
+ }
216
+ const spinner = ora("Updating...").start();
217
+ await api.post(`/v1/inbound/${encodeURIComponent(phoneNumber)}`, body);
218
+ spinner.succeed(`Updated ${output.formatPhone(phoneNumber)}`);
219
+ }
220
+ catch (err) {
221
+ handleError(err);
222
+ }
223
+ });
224
+ }
225
+ //# sourceMappingURL=number.js.map