@inkbox/cli 0.2.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.
@@ -0,0 +1,315 @@
1
+ import { createClient, getGlobalOpts } from "../client.js";
2
+ import { output } from "../output.js";
3
+ import { withErrorHandler } from "../errors.js";
4
+ import { parseTotpUri } from "@inkbox/sdk";
5
+ export function registerIdentityCommands(program) {
6
+ const identity = program
7
+ .command("identity")
8
+ .description("Manage agent identities");
9
+ identity
10
+ .command("list")
11
+ .description("List all identities")
12
+ .action(withErrorHandler(async function () {
13
+ const opts = getGlobalOpts(this);
14
+ const inkbox = createClient(opts);
15
+ const identities = await inkbox.listIdentities();
16
+ output(identities, {
17
+ json: !!opts.json,
18
+ columns: ["agentHandle", "id", "status", "createdAt"],
19
+ });
20
+ }));
21
+ identity
22
+ .command("get <handle>")
23
+ .description("Get identity details")
24
+ .action(withErrorHandler(async function (handle) {
25
+ const opts = getGlobalOpts(this);
26
+ const inkbox = createClient(opts);
27
+ const id = await inkbox.getIdentity(handle);
28
+ output({
29
+ agentHandle: id.agentHandle,
30
+ id: id.id,
31
+ status: id.status,
32
+ mailbox: id.mailbox?.emailAddress ?? null,
33
+ phoneNumber: id.phoneNumber?.number ?? null,
34
+ }, { json: !!opts.json });
35
+ }));
36
+ identity
37
+ .command("create <handle>")
38
+ .description("Create a new identity")
39
+ .action(withErrorHandler(async function (handle) {
40
+ const opts = getGlobalOpts(this);
41
+ const inkbox = createClient(opts);
42
+ const id = await inkbox.createIdentity(handle);
43
+ output({
44
+ agentHandle: id.agentHandle,
45
+ id: id.id,
46
+ status: id.status,
47
+ }, { json: !!opts.json });
48
+ }));
49
+ identity
50
+ .command("delete <handle>")
51
+ .description("Delete an identity")
52
+ .action(withErrorHandler(async function (handle) {
53
+ const opts = getGlobalOpts(this);
54
+ const inkbox = createClient(opts);
55
+ const id = await inkbox.getIdentity(handle);
56
+ await id.delete();
57
+ console.log(`Deleted identity '${handle}'.`);
58
+ }));
59
+ identity
60
+ .command("update <handle>")
61
+ .description("Update an identity")
62
+ .option("--new-handle <name>", "New handle")
63
+ .option("--status <status>", "New status (active, paused)")
64
+ .action(withErrorHandler(async function (handle, cmdOpts) {
65
+ const opts = getGlobalOpts(this);
66
+ const inkbox = createClient(opts);
67
+ const id = await inkbox.getIdentity(handle);
68
+ await id.update({
69
+ newHandle: cmdOpts.newHandle,
70
+ status: cmdOpts.status,
71
+ });
72
+ console.log(`Updated identity '${handle}'.`);
73
+ }));
74
+ identity
75
+ .command("refresh <handle>")
76
+ .description("Re-fetch identity from API")
77
+ .action(withErrorHandler(async function (handle) {
78
+ const opts = getGlobalOpts(this);
79
+ const inkbox = createClient(opts);
80
+ const id = await inkbox.getIdentity(handle);
81
+ await id.refresh();
82
+ output({
83
+ agentHandle: id.agentHandle,
84
+ id: id.id,
85
+ status: id.status,
86
+ mailbox: id.mailbox?.emailAddress ?? null,
87
+ phoneNumber: id.phoneNumber?.number ?? null,
88
+ }, { json: !!opts.json });
89
+ }));
90
+ identity
91
+ .command("create-secret <handle>")
92
+ .description("Create a secret scoped to an identity (requires vault key)")
93
+ .requiredOption("--name <name>", "Secret display name")
94
+ .requiredOption("--type <type>", "Secret type: login, api_key, ssh_key, key_pair, other")
95
+ .option("--description <desc>", "Optional description")
96
+ .option("--username <user>", "Username (for login type)")
97
+ .option("--password <pass>", "Password (for login type)")
98
+ .option("--email <email>", "Email (for login type)")
99
+ .option("--url <url>", "URL (for login type)")
100
+ .option("--totp-uri <uri>", "otpauth:// TOTP URI (for login type)")
101
+ .option("--key <key>", "API key value (for api_key type)")
102
+ .option("--access-key <key>", "Access key (for key_pair type)")
103
+ .option("--secret-key <key>", "Secret key (for key_pair type)")
104
+ .option("--endpoint <url>", "Endpoint URL (for api_key and key_pair types)")
105
+ .option("--private-key <key>", "Private key (for ssh_key type)")
106
+ .option("--public-key <key>", "Public key (for ssh_key type)")
107
+ .option("--fingerprint <fp>", "Key fingerprint (for ssh_key type)")
108
+ .option("--passphrase <pass>", "Key passphrase (for ssh_key type)")
109
+ .option("--data <json>", "JSON payload (for other type)")
110
+ .option("--notes <text>", "Optional notes")
111
+ .action(withErrorHandler(async function (handle, cmdOpts) {
112
+ const opts = getGlobalOpts(this);
113
+ const vaultKey = opts.vaultKey ?? process.env.INKBOX_VAULT_KEY;
114
+ if (!vaultKey) {
115
+ console.error("Error: Vault key required. Set INKBOX_VAULT_KEY or pass --vault-key.");
116
+ process.exit(1);
117
+ }
118
+ const inkbox = createClient(opts);
119
+ await inkbox.ready();
120
+ const id = await inkbox.getIdentity(handle);
121
+ let payload;
122
+ switch (cmdOpts.type) {
123
+ case "login":
124
+ if (!cmdOpts.password) {
125
+ console.error("Error: --password is required for login secrets.");
126
+ process.exit(1);
127
+ }
128
+ payload = {
129
+ password: cmdOpts.password,
130
+ username: cmdOpts.username,
131
+ email: cmdOpts.email,
132
+ url: cmdOpts.url,
133
+ notes: cmdOpts.notes,
134
+ ...(cmdOpts.totpUri
135
+ ? { totp: parseTotpUri(cmdOpts.totpUri) }
136
+ : {}),
137
+ };
138
+ break;
139
+ case "api_key":
140
+ if (!cmdOpts.key) {
141
+ console.error("Error: --key is required for api_key secrets.");
142
+ process.exit(1);
143
+ }
144
+ payload = {
145
+ apiKey: cmdOpts.key,
146
+ endpoint: cmdOpts.endpoint,
147
+ notes: cmdOpts.notes,
148
+ };
149
+ break;
150
+ case "key_pair":
151
+ if (!cmdOpts.accessKey || !cmdOpts.secretKey) {
152
+ console.error("Error: --access-key and --secret-key are required for key_pair secrets.");
153
+ process.exit(1);
154
+ }
155
+ payload = {
156
+ accessKey: cmdOpts.accessKey,
157
+ secretKey: cmdOpts.secretKey,
158
+ endpoint: cmdOpts.endpoint,
159
+ notes: cmdOpts.notes,
160
+ };
161
+ break;
162
+ case "ssh_key":
163
+ if (!cmdOpts.privateKey) {
164
+ console.error("Error: --private-key is required for ssh_key secrets.");
165
+ process.exit(1);
166
+ }
167
+ payload = {
168
+ privateKey: cmdOpts.privateKey,
169
+ publicKey: cmdOpts.publicKey,
170
+ fingerprint: cmdOpts.fingerprint,
171
+ passphrase: cmdOpts.passphrase,
172
+ notes: cmdOpts.notes,
173
+ };
174
+ break;
175
+ case "other":
176
+ if (!cmdOpts.data) {
177
+ console.error("Error: --data (JSON string) is required for other secrets.");
178
+ process.exit(1);
179
+ }
180
+ payload = {
181
+ data: cmdOpts.data,
182
+ notes: cmdOpts.notes,
183
+ };
184
+ break;
185
+ default:
186
+ console.error(`Error: Unknown secret type '${cmdOpts.type}'. Use: login, api_key, ssh_key, key_pair, other.`);
187
+ process.exit(1);
188
+ }
189
+ const secret = await id.createSecret({
190
+ name: cmdOpts.name,
191
+ description: cmdOpts.description,
192
+ payload,
193
+ });
194
+ output({
195
+ id: secret.id,
196
+ name: secret.name,
197
+ secretType: secret.secretType,
198
+ status: secret.status,
199
+ }, { json: !!opts.json });
200
+ }));
201
+ identity
202
+ .command("get-secret <handle> <secret-id>")
203
+ .description("Get and decrypt a secret for an identity (requires vault key)")
204
+ .action(withErrorHandler(async function (handle, secretId) {
205
+ const opts = getGlobalOpts(this);
206
+ const vaultKey = opts.vaultKey ?? process.env.INKBOX_VAULT_KEY;
207
+ if (!vaultKey) {
208
+ console.error("Error: Vault key required. Set INKBOX_VAULT_KEY or pass --vault-key.");
209
+ process.exit(1);
210
+ }
211
+ const inkbox = createClient(opts);
212
+ await inkbox.ready();
213
+ const id = await inkbox.getIdentity(handle);
214
+ const secret = await id.getSecret(secretId);
215
+ output({
216
+ id: secret.id,
217
+ name: secret.name,
218
+ secretType: secret.secretType,
219
+ status: secret.status,
220
+ createdAt: secret.createdAt,
221
+ payload: secret.payload,
222
+ }, { json: !!opts.json });
223
+ }));
224
+ identity
225
+ .command("delete-secret <handle> <secret-id>")
226
+ .description("Delete a secret for an identity (requires vault key)")
227
+ .action(withErrorHandler(async function (handle, secretId) {
228
+ const opts = getGlobalOpts(this);
229
+ const vaultKey = opts.vaultKey ?? process.env.INKBOX_VAULT_KEY;
230
+ if (!vaultKey) {
231
+ console.error("Error: Vault key required. Set INKBOX_VAULT_KEY or pass --vault-key.");
232
+ process.exit(1);
233
+ }
234
+ const inkbox = createClient(opts);
235
+ await inkbox.ready();
236
+ const id = await inkbox.getIdentity(handle);
237
+ await id.deleteSecret(secretId);
238
+ console.log(`Deleted secret '${secretId}'.`);
239
+ }));
240
+ identity
241
+ .command("revoke-access <handle> <secret-id>")
242
+ .description("Revoke an identity's access to a secret")
243
+ .action(withErrorHandler(async function (handle, secretId) {
244
+ const opts = getGlobalOpts(this);
245
+ const inkbox = createClient(opts);
246
+ const id = await inkbox.getIdentity(handle);
247
+ await id.revokeCredentialAccess(secretId);
248
+ console.log(`Revoked access to secret '${secretId}' for identity '${handle}'.`);
249
+ }));
250
+ identity
251
+ .command("set-totp <handle> <secret-id>")
252
+ .description("Add TOTP to a login secret (requires vault key)")
253
+ .requiredOption("--uri <otpauth-uri>", "otpauth:// TOTP URI")
254
+ .action(withErrorHandler(async function (handle, secretId, cmdOpts) {
255
+ const opts = getGlobalOpts(this);
256
+ const vaultKey = opts.vaultKey ?? process.env.INKBOX_VAULT_KEY;
257
+ if (!vaultKey) {
258
+ console.error("Error: Vault key required. Set INKBOX_VAULT_KEY or pass --vault-key.");
259
+ process.exit(1);
260
+ }
261
+ const inkbox = createClient(opts);
262
+ await inkbox.ready();
263
+ const id = await inkbox.getIdentity(handle);
264
+ const secret = await id.setTotp(secretId, cmdOpts.uri);
265
+ output({
266
+ id: secret.id,
267
+ name: secret.name,
268
+ secretType: secret.secretType,
269
+ status: secret.status,
270
+ }, { json: !!opts.json });
271
+ }));
272
+ identity
273
+ .command("remove-totp <handle> <secret-id>")
274
+ .description("Remove TOTP from a login secret (requires vault key)")
275
+ .action(withErrorHandler(async function (handle, secretId) {
276
+ const opts = getGlobalOpts(this);
277
+ const vaultKey = opts.vaultKey ?? process.env.INKBOX_VAULT_KEY;
278
+ if (!vaultKey) {
279
+ console.error("Error: Vault key required. Set INKBOX_VAULT_KEY or pass --vault-key.");
280
+ process.exit(1);
281
+ }
282
+ const inkbox = createClient(opts);
283
+ await inkbox.ready();
284
+ const id = await inkbox.getIdentity(handle);
285
+ const secret = await id.removeTotp(secretId);
286
+ output({
287
+ id: secret.id,
288
+ name: secret.name,
289
+ secretType: secret.secretType,
290
+ status: secret.status,
291
+ }, { json: !!opts.json });
292
+ }));
293
+ identity
294
+ .command("totp-code <handle> <secret-id>")
295
+ .description("Generate a TOTP code (requires vault key)")
296
+ .action(withErrorHandler(async function (handle, secretId) {
297
+ const opts = getGlobalOpts(this);
298
+ const vaultKey = opts.vaultKey ?? process.env.INKBOX_VAULT_KEY;
299
+ if (!vaultKey) {
300
+ console.error("Error: Vault key required. Set INKBOX_VAULT_KEY or pass --vault-key.");
301
+ process.exit(1);
302
+ }
303
+ const inkbox = createClient(opts);
304
+ await inkbox.ready();
305
+ const id = await inkbox.getIdentity(handle);
306
+ const totp = await id.getTotpCode(secretId);
307
+ output({
308
+ code: totp.code,
309
+ periodStart: totp.periodStart,
310
+ periodEnd: totp.periodEnd,
311
+ secondsRemaining: totp.secondsRemaining,
312
+ }, { json: !!opts.json });
313
+ }));
314
+ }
315
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../src/commands/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { createClient, getGlobalOpts } from "../client.js";
2
+ import { output } from "../output.js";
3
+ import { withErrorHandler } from "../errors.js";
4
+ export function registerMailboxCommands(program) {
5
+ const mailbox = program
6
+ .command("mailbox")
7
+ .description("Org-level mailbox operations");
8
+ mailbox
9
+ .command("list")
10
+ .description("List all mailboxes")
11
+ .action(withErrorHandler(async function () {
12
+ const opts = getGlobalOpts(this);
13
+ const inkbox = createClient(opts);
14
+ const mailboxes = await inkbox.mailboxes.list();
15
+ output(mailboxes, {
16
+ json: !!opts.json,
17
+ columns: [
18
+ "emailAddress",
19
+ "id",
20
+ "displayName",
21
+ "status",
22
+ "createdAt",
23
+ ],
24
+ });
25
+ }));
26
+ mailbox
27
+ .command("create")
28
+ .description("Create a new mailbox")
29
+ .requiredOption("--handle <handle>", "Agent handle to create mailbox for")
30
+ .option("--display-name <name>", "Display name for the mailbox")
31
+ .action(withErrorHandler(async function (cmdOpts) {
32
+ const opts = getGlobalOpts(this);
33
+ const inkbox = createClient(opts);
34
+ const mb = await inkbox.mailboxes.create({
35
+ agentHandle: cmdOpts.handle,
36
+ displayName: cmdOpts.displayName,
37
+ });
38
+ output({
39
+ emailAddress: mb.emailAddress,
40
+ id: mb.id,
41
+ displayName: mb.displayName,
42
+ status: mb.status,
43
+ }, { json: !!opts.json });
44
+ }));
45
+ mailbox
46
+ .command("get <email-address>")
47
+ .description("Get mailbox details")
48
+ .action(withErrorHandler(async function (emailAddress) {
49
+ const opts = getGlobalOpts(this);
50
+ const inkbox = createClient(opts);
51
+ const mb = await inkbox.mailboxes.get(emailAddress);
52
+ output({
53
+ emailAddress: mb.emailAddress,
54
+ id: mb.id,
55
+ displayName: mb.displayName,
56
+ webhookUrl: mb.webhookUrl ?? null,
57
+ status: mb.status,
58
+ createdAt: mb.createdAt,
59
+ }, { json: !!opts.json });
60
+ }));
61
+ mailbox
62
+ .command("update <email-address>")
63
+ .description("Update a mailbox")
64
+ .option("--display-name <name>", "New display name")
65
+ .option("--webhook-url <url>", 'Webhook URL (pass "" to clear)')
66
+ .action(withErrorHandler(async function (emailAddress, cmdOpts) {
67
+ const opts = getGlobalOpts(this);
68
+ const inkbox = createClient(opts);
69
+ const mb = await inkbox.mailboxes.update(emailAddress, {
70
+ displayName: cmdOpts.displayName,
71
+ webhookUrl: cmdOpts.webhookUrl === "" ? null : cmdOpts.webhookUrl,
72
+ });
73
+ output({
74
+ emailAddress: mb.emailAddress,
75
+ id: mb.id,
76
+ displayName: mb.displayName,
77
+ webhookUrl: mb.webhookUrl ?? null,
78
+ status: mb.status,
79
+ }, { json: !!opts.json });
80
+ }));
81
+ mailbox
82
+ .command("delete <email-address>")
83
+ .description("Delete a mailbox")
84
+ .action(withErrorHandler(async function (emailAddress) {
85
+ const opts = getGlobalOpts(this);
86
+ const inkbox = createClient(opts);
87
+ await inkbox.mailboxes.delete(emailAddress);
88
+ console.log(`Deleted mailbox '${emailAddress}'.`);
89
+ }));
90
+ }
91
+ //# sourceMappingURL=mailbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../src/commands/mailbox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { createClient, getGlobalOpts } from "../client.js";
2
+ import { output } from "../output.js";
3
+ import { withErrorHandler } from "../errors.js";
4
+ export function registerNumberCommands(program) {
5
+ const number = program
6
+ .command("number")
7
+ .description("Org-level phone number operations");
8
+ number
9
+ .command("list")
10
+ .description("List all phone numbers")
11
+ .action(withErrorHandler(async function () {
12
+ const opts = getGlobalOpts(this);
13
+ const inkbox = createClient(opts);
14
+ const numbers = await inkbox.phoneNumbers.list();
15
+ output(numbers, {
16
+ json: !!opts.json,
17
+ columns: ["number", "id", "type", "status", "createdAt"],
18
+ });
19
+ }));
20
+ number
21
+ .command("provision")
22
+ .description("Provision a new phone number")
23
+ .requiredOption("--handle <handle>", "Agent handle to provision for")
24
+ .option("--type <type>", "Number type: toll_free or local", "toll_free")
25
+ .option("--state <state>", "US state abbreviation (for local numbers)")
26
+ .action(withErrorHandler(async function (cmdOpts) {
27
+ const opts = getGlobalOpts(this);
28
+ const inkbox = createClient(opts);
29
+ const num = await inkbox.phoneNumbers.provision({
30
+ agentHandle: cmdOpts.handle,
31
+ type: cmdOpts.type,
32
+ state: cmdOpts.state,
33
+ });
34
+ output({
35
+ number: num.number,
36
+ id: num.id,
37
+ type: num.type,
38
+ status: num.status,
39
+ }, { json: !!opts.json });
40
+ }));
41
+ number
42
+ .command("get <id>")
43
+ .description("Get phone number details")
44
+ .action(withErrorHandler(async function (id) {
45
+ const opts = getGlobalOpts(this);
46
+ const inkbox = createClient(opts);
47
+ const num = await inkbox.phoneNumbers.get(id);
48
+ output({
49
+ number: num.number,
50
+ id: num.id,
51
+ type: num.type,
52
+ status: num.status,
53
+ incomingCallAction: num.incomingCallAction ?? null,
54
+ clientWebsocketUrl: num.clientWebsocketUrl ?? null,
55
+ incomingCallWebhookUrl: num.incomingCallWebhookUrl ?? null,
56
+ createdAt: num.createdAt,
57
+ }, { json: !!opts.json });
58
+ }));
59
+ number
60
+ .command("update <id>")
61
+ .description("Update phone number configuration")
62
+ .option("--incoming-call-action <action>", "Incoming call action: auto_accept, auto_reject, or webhook")
63
+ .option("--client-websocket-url <url>", "Client WebSocket URL for audio bridging")
64
+ .option("--incoming-call-webhook-url <url>", "Webhook URL for incoming calls")
65
+ .action(withErrorHandler(async function (id, cmdOpts) {
66
+ const opts = getGlobalOpts(this);
67
+ const inkbox = createClient(opts);
68
+ const num = await inkbox.phoneNumbers.update(id, {
69
+ incomingCallAction: cmdOpts.incomingCallAction,
70
+ clientWebsocketUrl: cmdOpts.clientWebsocketUrl,
71
+ incomingCallWebhookUrl: cmdOpts.incomingCallWebhookUrl,
72
+ });
73
+ output({
74
+ number: num.number,
75
+ id: num.id,
76
+ type: num.type,
77
+ status: num.status,
78
+ incomingCallAction: num.incomingCallAction ?? null,
79
+ clientWebsocketUrl: num.clientWebsocketUrl ?? null,
80
+ incomingCallWebhookUrl: num.incomingCallWebhookUrl ?? null,
81
+ }, { json: !!opts.json });
82
+ }));
83
+ number
84
+ .command("release <id>")
85
+ .description("Release a phone number")
86
+ .action(withErrorHandler(async function (id) {
87
+ const opts = getGlobalOpts(this);
88
+ const inkbox = createClient(opts);
89
+ await inkbox.phoneNumbers.release(id);
90
+ console.log(`Released phone number '${id}'.`);
91
+ }));
92
+ }
93
+ //# sourceMappingURL=number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"number.js","sourceRoot":"","sources":["../../src/commands/number.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import { createClient, getGlobalOpts } from "../client.js";
2
+ import { output } from "../output.js";
3
+ import { withErrorHandler } from "../errors.js";
4
+ export function registerPhoneCommands(program) {
5
+ const phone = program
6
+ .command("phone")
7
+ .description("Phone operations (identity-scoped)");
8
+ phone
9
+ .command("call")
10
+ .description("Place an outbound call")
11
+ .requiredOption("-i, --identity <handle>", "Agent identity handle")
12
+ .requiredOption("--to <number>", "E.164 destination number")
13
+ .option("--ws-url <url>", "WebSocket URL (wss://) for audio bridging")
14
+ .action(withErrorHandler(async function (cmdOpts) {
15
+ const opts = getGlobalOpts(this);
16
+ const inkbox = createClient(opts);
17
+ const identity = await inkbox.getIdentity(cmdOpts.identity);
18
+ const call = await identity.placeCall({
19
+ toNumber: cmdOpts.to,
20
+ clientWebsocketUrl: cmdOpts.wsUrl,
21
+ });
22
+ output({
23
+ id: call.id,
24
+ from: call.localPhoneNumber,
25
+ to: call.remotePhoneNumber,
26
+ status: call.status,
27
+ callsRemaining: call.rateLimit.callsRemaining,
28
+ }, { json: !!opts.json });
29
+ }));
30
+ phone
31
+ .command("calls")
32
+ .description("List calls")
33
+ .requiredOption("-i, --identity <handle>", "Agent identity handle")
34
+ .option("--limit <n>", "Max results", "50")
35
+ .option("--offset <n>", "Pagination offset", "0")
36
+ .action(withErrorHandler(async function (cmdOpts) {
37
+ const opts = getGlobalOpts(this);
38
+ const inkbox = createClient(opts);
39
+ const identity = await inkbox.getIdentity(cmdOpts.identity);
40
+ const calls = await identity.listCalls({
41
+ limit: parseInt(cmdOpts.limit, 10),
42
+ offset: parseInt(cmdOpts.offset, 10),
43
+ });
44
+ output(calls, {
45
+ json: !!opts.json,
46
+ columns: [
47
+ "id",
48
+ "direction",
49
+ "remotePhoneNumber",
50
+ "status",
51
+ "createdAt",
52
+ ],
53
+ });
54
+ }));
55
+ phone
56
+ .command("transcripts <call-id>")
57
+ .description("Get call transcripts")
58
+ .requiredOption("-i, --identity <handle>", "Agent identity handle")
59
+ .action(withErrorHandler(async function (callId, cmdOpts) {
60
+ const opts = getGlobalOpts(this);
61
+ const inkbox = createClient(opts);
62
+ const identity = await inkbox.getIdentity(cmdOpts.identity);
63
+ const transcripts = await identity.listTranscripts(callId);
64
+ output(transcripts, {
65
+ json: !!opts.json,
66
+ columns: ["seq", "party", "text", "createdAt"],
67
+ });
68
+ }));
69
+ phone
70
+ .command("search-transcripts")
71
+ .description("Search call transcripts")
72
+ .requiredOption("-i, --identity <handle>", "Agent identity handle")
73
+ .requiredOption("-q, --query <query>", "Search query")
74
+ .option("--party <party>", "Filter by speaker: local or remote")
75
+ .option("--limit <n>", "Max results", "50")
76
+ .action(withErrorHandler(async function (cmdOpts) {
77
+ const opts = getGlobalOpts(this);
78
+ const inkbox = createClient(opts);
79
+ const identity = await inkbox.getIdentity(cmdOpts.identity);
80
+ if (!identity.phoneNumber) {
81
+ console.error(`Identity '${cmdOpts.identity}' has no phone number assigned.`);
82
+ process.exit(1);
83
+ }
84
+ const transcripts = await inkbox.phoneNumbers.searchTranscripts(identity.phoneNumber.id, {
85
+ q: cmdOpts.query,
86
+ party: cmdOpts.party,
87
+ limit: parseInt(cmdOpts.limit, 10),
88
+ });
89
+ output(transcripts, {
90
+ json: !!opts.json,
91
+ columns: ["id", "callId", "seq", "party", "text", "createdAt"],
92
+ });
93
+ }));
94
+ }
95
+ //# sourceMappingURL=phone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phone.js","sourceRoot":"","sources":["../../src/commands/phone.ts"],"names":[],"mappings":"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"}