@indemn/cli 1.6.0 → 1.7.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.
- package/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +9 -4
- package/.github/workflows/ci.yml +10 -0
- package/.github/workflows/publish.yml +2 -2
- package/.mcp.json +1 -4
- package/CONTRIBUTING.md +3 -1
- package/README.md +69 -176
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +226 -18
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/analytics.d.ts +3 -0
- package/dist/cli/analytics.d.ts.map +1 -0
- package/dist/cli/analytics.js +133 -0
- package/dist/cli/analytics.js.map +1 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +62 -17
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/billing.d.ts +3 -0
- package/dist/cli/billing.d.ts.map +1 -0
- package/dist/cli/billing.js +23 -0
- package/dist/cli/billing.js.map +1 -0
- package/dist/cli/campaigns.d.ts +3 -0
- package/dist/cli/campaigns.d.ts.map +1 -0
- package/dist/cli/campaigns.js +34 -0
- package/dist/cli/campaigns.js.map +1 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +69 -102
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +71 -27
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/conversations.d.ts +3 -0
- package/dist/cli/conversations.d.ts.map +1 -0
- package/dist/cli/conversations.js +129 -0
- package/dist/cli/conversations.js.map +1 -0
- package/dist/cli/distribution.d.ts +3 -0
- package/dist/cli/distribution.d.ts.map +1 -0
- package/dist/cli/distribution.js +122 -0
- package/dist/cli/distribution.js.map +1 -0
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +315 -71
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/functions.d.ts.map +1 -1
- package/dist/cli/functions.js +109 -38
- package/dist/cli/functions.js.map +1 -1
- package/dist/cli/index.js +63 -54
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +27 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +152 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/kb.d.ts.map +1 -1
- package/dist/cli/kb.js +141 -15
- package/dist/cli/kb.js.map +1 -1
- package/dist/cli/link.d.ts +21 -0
- package/dist/cli/link.d.ts.map +1 -0
- package/dist/cli/link.js +112 -0
- package/dist/cli/link.js.map +1 -0
- package/dist/cli/org.d.ts.map +1 -1
- package/dist/cli/org.js +79 -67
- package/dist/cli/org.js.map +1 -1
- package/dist/cli/platform.d.ts +3 -0
- package/dist/cli/platform.d.ts.map +1 -0
- package/dist/cli/platform.js +133 -0
- package/dist/cli/platform.js.map +1 -0
- package/dist/cli/tickets.d.ts +3 -0
- package/dist/cli/tickets.d.ts.map +1 -0
- package/dist/cli/tickets.js +125 -0
- package/dist/cli/tickets.js.map +1 -0
- package/dist/cli/utils/output.d.ts +15 -9
- package/dist/cli/utils/output.d.ts.map +1 -1
- package/dist/cli/utils/output.js +53 -46
- package/dist/cli/utils/output.js.map +1 -1
- package/dist/cli/voice.d.ts +3 -0
- package/dist/cli/voice.d.ts.map +1 -0
- package/dist/cli/voice.js +206 -0
- package/dist/cli/voice.js.map +1 -0
- package/dist/core/diff.d.ts +16 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +57 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/org-resolver.d.ts +37 -0
- package/dist/core/org-resolver.d.ts.map +1 -0
- package/dist/core/org-resolver.js +73 -0
- package/dist/core/org-resolver.js.map +1 -0
- package/dist/core/runtime.d.ts +36 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +62 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/scope.d.ts +33 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +37 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/mcp/registry.d.ts +67 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +195 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +87 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-meta.d.ts +21 -0
- package/dist/mcp/tool-meta.d.ts.map +1 -0
- package/dist/mcp/tool-meta.js +203 -0
- package/dist/mcp/tool-meta.js.map +1 -0
- package/dist/mcp/tools.d.ts +2 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1462 -215
- package/dist/mcp/tools.js.map +1 -1
- package/dist/sdk/agent-bundle.d.ts +99 -0
- package/dist/sdk/agent-bundle.d.ts.map +1 -0
- package/dist/sdk/agent-bundle.js +211 -0
- package/dist/sdk/agent-bundle.js.map +1 -0
- package/dist/sdk/agents.d.ts +54 -1
- package/dist/sdk/agents.d.ts.map +1 -1
- package/dist/sdk/agents.js +59 -5
- package/dist/sdk/agents.js.map +1 -1
- package/dist/sdk/analytics.d.ts +158 -0
- package/dist/sdk/analytics.d.ts.map +1 -0
- package/dist/sdk/analytics.js +185 -0
- package/dist/sdk/analytics.js.map +1 -0
- package/dist/sdk/auth.d.ts +34 -12
- package/dist/sdk/auth.d.ts.map +1 -1
- package/dist/sdk/auth.js +62 -79
- package/dist/sdk/auth.js.map +1 -1
- package/dist/sdk/billing.d.ts +25 -0
- package/dist/sdk/billing.d.ts.map +1 -0
- package/dist/sdk/billing.js +61 -0
- package/dist/sdk/billing.js.map +1 -0
- package/dist/sdk/campaigns.d.ts +35 -0
- package/dist/sdk/campaigns.d.ts.map +1 -0
- package/dist/sdk/campaigns.js +59 -0
- package/dist/sdk/campaigns.js.map +1 -0
- package/dist/sdk/chat.d.ts +25 -2
- package/dist/sdk/chat.d.ts.map +1 -1
- package/dist/sdk/chat.js +37 -10
- package/dist/sdk/chat.js.map +1 -1
- package/dist/sdk/client.d.ts +93 -5
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +362 -100
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/config-change.d.ts +74 -0
- package/dist/sdk/config-change.d.ts.map +1 -0
- package/dist/sdk/config-change.js +117 -0
- package/dist/sdk/config-change.js.map +1 -0
- package/dist/sdk/config.d.ts.map +1 -1
- package/dist/sdk/config.js +2 -1
- package/dist/sdk/config.js.map +1 -1
- package/dist/sdk/conversations.d.ts +101 -0
- package/dist/sdk/conversations.d.ts.map +1 -0
- package/dist/sdk/conversations.js +155 -0
- package/dist/sdk/conversations.js.map +1 -0
- package/dist/sdk/credentials.d.ts +25 -0
- package/dist/sdk/credentials.d.ts.map +1 -0
- package/dist/sdk/credentials.js +44 -0
- package/dist/sdk/credentials.js.map +1 -0
- package/dist/sdk/distribution.d.ts +94 -0
- package/dist/sdk/distribution.d.ts.map +1 -0
- package/dist/sdk/distribution.js +100 -0
- package/dist/sdk/distribution.js.map +1 -0
- package/dist/sdk/eval.d.ts +81 -0
- package/dist/sdk/eval.d.ts.map +1 -1
- package/dist/sdk/eval.js +117 -0
- package/dist/sdk/eval.js.map +1 -1
- package/dist/sdk/functions.d.ts +14 -1
- package/dist/sdk/functions.d.ts.map +1 -1
- package/dist/sdk/functions.js +48 -5
- package/dist/sdk/functions.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -0
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +2 -0
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/jarvis-chat.d.ts +28 -0
- package/dist/sdk/jarvis-chat.d.ts.map +1 -0
- package/dist/sdk/jarvis-chat.js +117 -0
- package/dist/sdk/jarvis-chat.js.map +1 -0
- package/dist/sdk/kb.d.ts +69 -1
- package/dist/sdk/kb.d.ts.map +1 -1
- package/dist/sdk/kb.js +111 -24
- package/dist/sdk/kb.js.map +1 -1
- package/dist/sdk/orgs.d.ts +13 -0
- package/dist/sdk/orgs.d.ts.map +1 -0
- package/dist/sdk/orgs.js +59 -0
- package/dist/sdk/orgs.js.map +1 -0
- package/dist/sdk/platform.d.ts +62 -0
- package/dist/sdk/platform.d.ts.map +1 -0
- package/dist/sdk/platform.js +95 -0
- package/dist/sdk/platform.js.map +1 -0
- package/dist/sdk/session.d.ts +25 -0
- package/dist/sdk/session.d.ts.map +1 -0
- package/dist/sdk/session.js +69 -0
- package/dist/sdk/session.js.map +1 -0
- package/dist/sdk/skills.d.ts +46 -0
- package/dist/sdk/skills.d.ts.map +1 -0
- package/dist/sdk/skills.js +203 -0
- package/dist/sdk/skills.js.map +1 -0
- package/dist/sdk/test-chat.d.ts +52 -0
- package/dist/sdk/test-chat.d.ts.map +1 -0
- package/dist/sdk/test-chat.js +134 -0
- package/dist/sdk/test-chat.js.map +1 -0
- package/dist/sdk/tickets.d.ts +98 -0
- package/dist/sdk/tickets.d.ts.map +1 -0
- package/dist/sdk/tickets.js +91 -0
- package/dist/sdk/tickets.js.map +1 -0
- package/dist/sdk/types.d.ts +91 -6
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/voice.d.ts +147 -0
- package/dist/sdk/voice.d.ts.map +1 -0
- package/dist/sdk/voice.js +236 -0
- package/dist/sdk/voice.js.map +1 -0
- package/package.json +21 -4
- package/scripts/check-skills.mjs +25 -0
- package/skills/agent-builder/SKILL.md +89 -252
- package/skills/evaluations/SKILL.md +23 -234
- package/skills/evaluations/references/analysis.md +95 -0
- package/skills/evaluations/references/cli-reference.md +28 -0
- package/skills/evaluations/references/json-formats.md +100 -0
- package/src/cli/agents.ts +202 -22
- package/src/cli/analytics.ts +138 -0
- package/src/cli/auth.ts +56 -18
- package/src/cli/billing.ts +25 -0
- package/src/cli/campaigns.ts +33 -0
- package/src/cli/chat.ts +66 -115
- package/src/cli/config.ts +65 -31
- package/src/cli/conversations.ts +133 -0
- package/src/cli/distribution.ts +116 -0
- package/src/cli/eval.ts +254 -70
- package/src/cli/functions.ts +105 -39
- package/src/cli/index.ts +58 -55
- package/src/cli/init.ts +154 -0
- package/src/cli/kb.ts +120 -17
- package/src/cli/link.ts +117 -0
- package/src/cli/org.ts +81 -75
- package/src/cli/platform.ts +128 -0
- package/src/cli/tickets.ts +130 -0
- package/src/cli/utils/output.ts +51 -42
- package/src/cli/voice.ts +204 -0
- package/src/core/diff.ts +52 -0
- package/src/core/org-resolver.ts +113 -0
- package/src/core/runtime.ts +73 -0
- package/src/core/scope.ts +64 -0
- package/src/mcp/registry.ts +236 -0
- package/src/mcp/server.ts +84 -2
- package/src/mcp/tool-meta.ts +241 -0
- package/src/mcp/tools.ts +1529 -265
- package/src/sdk/agent-bundle.ts +245 -0
- package/src/sdk/agents.ts +74 -5
- package/src/sdk/analytics.ts +220 -0
- package/src/sdk/auth.ts +89 -109
- package/src/sdk/billing.ts +59 -0
- package/src/sdk/campaigns.ts +60 -0
- package/src/sdk/chat.ts +44 -10
- package/src/sdk/client.ts +373 -102
- package/src/sdk/config-change.ts +148 -0
- package/src/sdk/config.ts +2 -1
- package/src/sdk/conversations.ts +199 -0
- package/src/sdk/credentials.ts +53 -0
- package/src/sdk/distribution.ts +132 -0
- package/src/sdk/eval.ts +140 -0
- package/src/sdk/functions.ts +52 -6
- package/src/sdk/index.ts +2 -0
- package/src/sdk/jarvis-chat.ts +112 -0
- package/src/sdk/kb.ts +116 -29
- package/src/sdk/orgs.ts +62 -0
- package/src/sdk/platform.ts +115 -0
- package/src/sdk/session.ts +90 -0
- package/src/sdk/skills.ts +188 -0
- package/src/sdk/test-chat.ts +151 -0
- package/src/sdk/tickets.ts +120 -0
- package/src/sdk/types.ts +88 -6
- package/src/sdk/voice.ts +262 -0
- package/test/cli/entry.test.ts +34 -0
- package/test/cli/init.test.ts +66 -0
- package/test/cli/link.test.ts +57 -0
- package/test/core/org-resolver.test.ts +92 -0
- package/test/core/runtime.test.ts +30 -0
- package/test/core/scope.test.ts +93 -0
- package/test/harness.test.ts +24 -0
- package/test/helpers/config-home.ts +22 -0
- package/test/helpers/fake-middleware.ts +56 -0
- package/test/helpers/fetch-recorder.ts +75 -0
- package/test/helpers/jwt.ts +9 -0
- package/test/helpers/mcp-pair.ts +38 -0
- package/test/mcp/__snapshots__/tools-snapshot.test.ts.snap +145 -0
- package/test/mcp/askers.test.ts +60 -0
- package/test/mcp/elicit-timeout.test.ts +29 -0
- package/test/mcp/registry.test.ts +169 -0
- package/test/mcp/shaping.test.ts +41 -0
- package/test/mcp/tools-snapshot.test.ts +42 -0
- package/test/sdk/agents.test.ts +232 -0
- package/test/sdk/analytics.test.ts +89 -0
- package/test/sdk/auth.test.ts +70 -0
- package/test/sdk/billing.test.ts +47 -0
- package/test/sdk/campaigns.test.ts +43 -0
- package/test/sdk/client.test.ts +80 -0
- package/test/sdk/config-change.test.ts +142 -0
- package/test/sdk/conversations.test.ts +80 -0
- package/test/sdk/credentials.test.ts +33 -0
- package/test/sdk/distribution.test.ts +55 -0
- package/test/sdk/eval.test.ts +155 -0
- package/test/sdk/kb-upload.test.ts +50 -0
- package/test/sdk/kb.test.ts +95 -0
- package/test/sdk/orgs.test.ts +48 -0
- package/test/sdk/platform.test.ts +89 -0
- package/test/sdk/renewal.test.ts +115 -0
- package/test/sdk/session.test.ts +60 -0
- package/test/sdk/skills.test.ts +235 -0
- package/test/sdk/test-chat.test.ts +112 -0
- package/test/sdk/tickets.test.ts +42 -0
- package/test/sdk/voice.test.ts +147 -0
- package/vitest.config.ts +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.d.ts","sourceRoot":"","sources":["../../src/cli/tickets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkH7D"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { IndemnClient } from '../sdk/client.js';
|
|
3
|
+
import { TicketsSDK } from '../sdk/tickets.js';
|
|
4
|
+
import { confirmOrExit } from './link.js';
|
|
5
|
+
import { formatTable, printError, printJson, printSuccess } from './utils/output.js';
|
|
6
|
+
function run(fn) {
|
|
7
|
+
return fn().catch((err) => {
|
|
8
|
+
printError(err);
|
|
9
|
+
process.exit(1);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
const sdk = () => new TicketsSDK(new IndemnClient());
|
|
13
|
+
export function registerTicketCommands(program) {
|
|
14
|
+
const tickets = program.command('tickets').description('Support tickets (the org must have tickets turned on)');
|
|
15
|
+
tickets.command('list')
|
|
16
|
+
.option('--status <list>', 'not_started, in_progress, completed (comma-separated)')
|
|
17
|
+
.option('--assignee <user-id>', 'Assigned to this member')
|
|
18
|
+
.option('--search <text>', 'Search title, description and reference')
|
|
19
|
+
.option('--limit <n>', 'At most this many', '50')
|
|
20
|
+
.option('--json', 'Output as JSON')
|
|
21
|
+
.action((options) => run(async () => {
|
|
22
|
+
const rows = await sdk().list({ status: options.status?.split(','), assignee: options.assignee, search: options.search, limit: Number(options.limit) });
|
|
23
|
+
if (options.json) {
|
|
24
|
+
printJson(rows);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
console.log(formatTable(['ID', 'Ref', 'Title', 'Status', 'Priority'], rows.map((t) => [t._id, String(t.ticket_ref ?? ''), String(t.title ?? '').slice(0, 50), String(t.status ?? ''), String(t.priority ?? '')])));
|
|
28
|
+
}));
|
|
29
|
+
tickets.command('get').argument('<ticket-id>').action((id) => run(async () => printJson(await sdk().get(id))));
|
|
30
|
+
tickets.command('create')
|
|
31
|
+
.requiredOption('--title <text>', 'Title')
|
|
32
|
+
.option('--description <text>', 'Description')
|
|
33
|
+
.option('--priority <p>', 'urgent, high, normal or low')
|
|
34
|
+
.option('--assign <user-id>', 'Assign to this member')
|
|
35
|
+
.option('--conversation <request-id>', 'Attach a conversation')
|
|
36
|
+
.option('--force', 'Create even if similar tickets exist (skips the duplicate check)')
|
|
37
|
+
.action((options) => run(async () => {
|
|
38
|
+
const res = await sdk().create({
|
|
39
|
+
title: options.title, description: options.description, priority: options.priority,
|
|
40
|
+
...(options.assign ? { assignee: { type: 'user', target: options.assign } } : {}),
|
|
41
|
+
...(options.conversation ? { conversations: [{ request_id: options.conversation }] } : {}),
|
|
42
|
+
}, { force: options.force });
|
|
43
|
+
if (!res.saved) {
|
|
44
|
+
console.log(chalk.yellow(res.message));
|
|
45
|
+
for (const t of res.similar)
|
|
46
|
+
console.log(` ${t._id} ${t.title ?? ''}`);
|
|
47
|
+
process.exit(2);
|
|
48
|
+
}
|
|
49
|
+
printSuccess(`Ticket created: ${res.ticket._id}`);
|
|
50
|
+
}));
|
|
51
|
+
tickets.command('update')
|
|
52
|
+
.argument('<ticket-id>')
|
|
53
|
+
.option('--title <text>').option('--description <text>').option('--notes <text>')
|
|
54
|
+
.option('--status <status>', 'not_started or in_progress (use `resolve` to close)')
|
|
55
|
+
.option('--priority <p>', 'urgent, high, normal or low')
|
|
56
|
+
.action((id, options) => run(async () => {
|
|
57
|
+
const changes = {};
|
|
58
|
+
for (const k of ['title', 'description', 'notes', 'status', 'priority'])
|
|
59
|
+
if (options[k] !== undefined)
|
|
60
|
+
changes[k] = options[k];
|
|
61
|
+
printJson(await sdk().update(id, changes));
|
|
62
|
+
}));
|
|
63
|
+
tickets.command('assign')
|
|
64
|
+
.argument('<ticket-id>')
|
|
65
|
+
.argument('[user-id]', 'Member to assign; omit with --unassign')
|
|
66
|
+
.option('--unassign', 'Remove the assignee')
|
|
67
|
+
.action((id, userId, options) => run(async () => {
|
|
68
|
+
printJson(await sdk().assign(id, options.unassign || !userId ? null : { type: 'user', target: userId }));
|
|
69
|
+
}));
|
|
70
|
+
tickets.command('resolve')
|
|
71
|
+
.argument('<ticket-id>')
|
|
72
|
+
.option('--note <text>', 'Closing note')
|
|
73
|
+
.description('Close a ticket')
|
|
74
|
+
.action((id, options) => run(async () => { printJson(await sdk().resolve(id, options.note)); }));
|
|
75
|
+
tickets.command('link')
|
|
76
|
+
.argument('<ticket-id>')
|
|
77
|
+
.argument('<related-ticket-id>')
|
|
78
|
+
.action((id, related) => run(async () => { printJson(await sdk().link(id, related)); }));
|
|
79
|
+
tickets.command('archive')
|
|
80
|
+
.argument('<ticket-id>')
|
|
81
|
+
.option('--yes', 'Do not ask for confirmation')
|
|
82
|
+
.action((id, options) => run(async () => {
|
|
83
|
+
await confirmOrExit(`Archive ticket ${id}?`, Boolean(options.yes));
|
|
84
|
+
await sdk().archive(id);
|
|
85
|
+
printSuccess(`Ticket ${id} archived.`);
|
|
86
|
+
}));
|
|
87
|
+
const rules = tickets.command('rules').description('Rules that let agents open tickets from conversations');
|
|
88
|
+
rules.command('list').option('--agent <id>', 'Rules enabled for this agent').action((options) => run(async () => printJson(await sdk().listRules({ agentId: options.agent }))));
|
|
89
|
+
rules.command('create')
|
|
90
|
+
.requiredOption('--prompt <text>', 'When should a ticket be created?')
|
|
91
|
+
.option('--name <name>', 'Rule name (max 75 characters)')
|
|
92
|
+
.option('--agents <ids>', 'Only these agents (comma-separated); default all agents')
|
|
93
|
+
.option('--assign <user-id>', 'Assign created tickets to this member')
|
|
94
|
+
.option('--disabled', 'Create switched off')
|
|
95
|
+
.option('--force', 'Skip the overlap check')
|
|
96
|
+
.action((options) => run(async () => {
|
|
97
|
+
const res = await sdk().saveRule({
|
|
98
|
+
name: options.name, prompt: options.prompt, enabled: !options.disabled,
|
|
99
|
+
scope: options.agents ? { kind: 'specific', agents: options.agents.split(',') } : { kind: 'all_agents', agents: [] },
|
|
100
|
+
...(options.assign ? { assignment: { type: 'user', target: options.assign } } : {}),
|
|
101
|
+
}, { force: options.force });
|
|
102
|
+
if (!res.saved) {
|
|
103
|
+
console.log(chalk.yellow('The rule overlaps existing ones; nothing was saved. Use --force to save anyway.'));
|
|
104
|
+
printJson({ caveats: res.caveats, suggested_name: res.suggested_name });
|
|
105
|
+
process.exit(2);
|
|
106
|
+
}
|
|
107
|
+
printJson(res.rule);
|
|
108
|
+
}));
|
|
109
|
+
rules.command('update')
|
|
110
|
+
.argument('<rule-id>')
|
|
111
|
+
.option('--name <name>').option('--prompt <text>')
|
|
112
|
+
.option('--enable').option('--disable')
|
|
113
|
+
.action((id, options) => run(async () => {
|
|
114
|
+
printJson((await sdk().saveRule({ ruleId: id, name: options.name, prompt: options.prompt, enabled: options.enable ? true : options.disable ? false : undefined })).rule);
|
|
115
|
+
}));
|
|
116
|
+
rules.command('delete')
|
|
117
|
+
.argument('<rule-id>')
|
|
118
|
+
.option('--yes', 'Do not ask for confirmation')
|
|
119
|
+
.action((id, options) => run(async () => {
|
|
120
|
+
await confirmOrExit(`Delete ticket rule ${id}? Agents stop opening tickets for it.`, Boolean(options.yes));
|
|
121
|
+
await sdk().deleteRule(id);
|
|
122
|
+
printSuccess(`Rule ${id} deleted.`);
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=tickets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickets.js","sourceRoot":"","sources":["../../src/cli/tickets.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,23 @@
|
|
|
1
|
+
import type { OrgChoice } from '../../core/org-resolver.js';
|
|
1
2
|
export declare function formatTable(headers: string[], rows: string[][]): string;
|
|
2
3
|
export declare function printJson(data: unknown): void;
|
|
4
|
+
/**
|
|
5
|
+
* Print an error. A CliError that carries its own exit code (2: a choice is
|
|
6
|
+
* needed, 3: log in again) ends the process with that code here, so every
|
|
7
|
+
* command gets the right code without handling it itself.
|
|
8
|
+
*/
|
|
3
9
|
export declare function printError(error: unknown): void;
|
|
4
10
|
export declare function printSuccess(message: string): void;
|
|
5
11
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* without --json suppression). Rendered red for prod to reinforce blast-radius
|
|
10
|
-
* awareness. Silent if not logged in or if the caller opts out.
|
|
11
|
-
*
|
|
12
|
-
* Self-heals when org_name is missing from config (e.g., after upgrading from
|
|
13
|
-
* a pre-1.4 install) by fetching /organization/:id once and caching.
|
|
12
|
+
* Print the org banner once, when a command's org is decided:
|
|
13
|
+
* [Voice Demos · 69a40cd9…6807 · dev · linked]. It goes to stderr so stdout
|
|
14
|
+
* stays clean for pipes, and is red on production.
|
|
14
15
|
*/
|
|
15
|
-
export declare function
|
|
16
|
+
export declare function installBanner(): void;
|
|
17
|
+
/** Read one line from the terminal, writing the question to stderr so stdout stays clean. */
|
|
18
|
+
export declare function askLine(question: string): Promise<string>;
|
|
19
|
+
/** Terminal version of "which org?": a numbered list; answer with the number or the id. */
|
|
20
|
+
export declare function askOrgInTerminal(choices: OrgChoice[]): Promise<string | undefined>;
|
|
21
|
+
export declare function askMfaInTerminal(): Promise<string>;
|
|
16
22
|
export declare function confirm(message: string): Promise<boolean>;
|
|
17
23
|
//# sourceMappingURL=output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAG5D,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CASvE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAU/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAWpC;AAED,6FAA6F;AAC7F,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQzD;AAED,2FAA2F;AAC3F,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAOxF;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAGxD;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY/D"}
|
package/dist/cli/utils/output.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import Table from 'cli-table3';
|
|
2
2
|
import chalk from 'chalk';
|
|
3
3
|
import * as readline from 'readline';
|
|
4
|
-
import {
|
|
4
|
+
import { onOrgResolved } from '../../core/scope.js';
|
|
5
|
+
import { CliError, EXIT, NeedsInputError } from '../../core/runtime.js';
|
|
5
6
|
export function formatTable(headers, rows) {
|
|
6
7
|
const table = new Table({
|
|
7
8
|
head: headers.map((h) => chalk.cyan(h)),
|
|
@@ -15,60 +16,66 @@ export function formatTable(headers, rows) {
|
|
|
15
16
|
export function printJson(data) {
|
|
16
17
|
console.log(JSON.stringify(data, null, 2));
|
|
17
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Print an error. A CliError that carries its own exit code (2: a choice is
|
|
21
|
+
* needed, 3: log in again) ends the process with that code here, so every
|
|
22
|
+
* command gets the right code without handling it itself.
|
|
23
|
+
*/
|
|
18
24
|
export function printError(error) {
|
|
19
25
|
const message = error instanceof Error ? error.message : String(error);
|
|
20
26
|
console.error(chalk.red(`Error: ${message}`));
|
|
27
|
+
if (error instanceof NeedsInputError && error.choices.length) {
|
|
28
|
+
for (const c of error.choices)
|
|
29
|
+
console.error(` ${c.id} ${c.label}`);
|
|
30
|
+
}
|
|
31
|
+
if (error instanceof CliError && error.exitCode !== EXIT.ERROR) {
|
|
32
|
+
process.exit(error.exitCode);
|
|
33
|
+
}
|
|
21
34
|
}
|
|
22
35
|
export function printSuccess(message) {
|
|
23
36
|
console.log(chalk.green(message));
|
|
24
37
|
}
|
|
25
38
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* without --json suppression). Rendered red for prod to reinforce blast-radius
|
|
30
|
-
* awareness. Silent if not logged in or if the caller opts out.
|
|
31
|
-
*
|
|
32
|
-
* Self-heals when org_name is missing from config (e.g., after upgrading from
|
|
33
|
-
* a pre-1.4 install) by fetching /organization/:id once and caching.
|
|
39
|
+
* Print the org banner once, when a command's org is decided:
|
|
40
|
+
* [Voice Demos · 69a40cd9…6807 · dev · linked]. It goes to stderr so stdout
|
|
41
|
+
* stays clean for pipes, and is red on production.
|
|
34
42
|
*/
|
|
35
|
-
export
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
process.stderr.write(colored + '\n');
|
|
43
|
+
export function installBanner() {
|
|
44
|
+
onOrgResolved((org) => {
|
|
45
|
+
if (process.env.INDEMN_NO_BANNER === '1')
|
|
46
|
+
return;
|
|
47
|
+
const shortId = org.id.length > 12 ? `${org.id.slice(0, 8)}…${org.id.slice(-4)}` : org.id;
|
|
48
|
+
const how = { flag: '--org', env: 'INDEMN_ORG_ID', link: 'linked folder', single: 'only org', asked: 'chosen' }[org.source];
|
|
49
|
+
const text = `[${org.name ?? '(unnamed org)'} · ${shortId} · ${org.environment} · ${how}]`;
|
|
50
|
+
const colored = org.environment === 'production' ? chalk.red.bold(text) : chalk.yellow.dim(text);
|
|
51
|
+
// The org is often decided while a spinner is drawing on this line: clear it first.
|
|
52
|
+
const clear = process.stderr.isTTY ? '\r\x1b[2K' : '';
|
|
53
|
+
process.stderr.write(clear + colored + '\n');
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Read one line from the terminal, writing the question to stderr so stdout stays clean. */
|
|
57
|
+
export function askLine(question) {
|
|
58
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
59
|
+
return new Promise((resolve) => {
|
|
60
|
+
rl.question(question, (answer) => {
|
|
61
|
+
rl.close();
|
|
62
|
+
resolve(answer.trim());
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Terminal version of "which org?": a numbered list; answer with the number or the id. */
|
|
67
|
+
export async function askOrgInTerminal(choices) {
|
|
68
|
+
process.stderr.write(chalk.bold('You belong to several organizations. Which one?\n'));
|
|
69
|
+
choices.forEach((c, i) => process.stderr.write(` ${i + 1}) ${c.name ?? c.id} ${chalk.dim(c.id)}\n`));
|
|
70
|
+
const answer = await askLine('Number or id: ');
|
|
71
|
+
const index = Number.parseInt(answer, 10);
|
|
72
|
+
if (String(index) === answer && index >= 1 && index <= choices.length)
|
|
73
|
+
return choices[index - 1].id;
|
|
74
|
+
return choices.find((c) => c.id === answer)?.id;
|
|
75
|
+
}
|
|
76
|
+
export async function askMfaInTerminal() {
|
|
77
|
+
process.stderr.write(chalk.yellow('Your session needs renewing and your account uses MFA. A code was emailed to you.\n'));
|
|
78
|
+
return askLine('MFA code: ');
|
|
72
79
|
}
|
|
73
80
|
export async function confirm(message) {
|
|
74
81
|
const rl = readline.createInterface({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/cli/voice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2L5D"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { writeFileSync } from 'node:fs';
|
|
3
|
+
import { IndemnClient } from '../sdk/client.js';
|
|
4
|
+
import { VoiceSDK, toE164 } from '../sdk/voice.js';
|
|
5
|
+
import { CliError, EXIT } from '../core/runtime.js';
|
|
6
|
+
import { confirmOrExit } from './link.js';
|
|
7
|
+
import { formatTable, printError, printJson, printSuccess } from './utils/output.js';
|
|
8
|
+
function run(fn) {
|
|
9
|
+
return fn().catch((err) => {
|
|
10
|
+
printError(err);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function registerVoiceCommands(program) {
|
|
15
|
+
const voices = program.command('voices').description('Text-to-speech voices an agent can use');
|
|
16
|
+
voices.command('list')
|
|
17
|
+
.option('--provider <name>', 'cartesia (default) or elevenlabs', 'cartesia')
|
|
18
|
+
.option('--language <code>', 'For example en')
|
|
19
|
+
.option('--gender <gender>', 'masculine, feminine or gender_neutral')
|
|
20
|
+
.option('--search <text>', 'Name search (ElevenLabs needs 3+ characters)')
|
|
21
|
+
.option('--limit <n>', 'At most this many', '50')
|
|
22
|
+
.option('--json', 'Output as JSON')
|
|
23
|
+
.description('List voices; copy the id, name, gender, language and country into `agents voice set`')
|
|
24
|
+
.action((options) => run(async () => {
|
|
25
|
+
const res = await new VoiceSDK(new IndemnClient()).listVoices({ provider: options.provider, language: options.language, gender: options.gender, q: options.search, limit: Number(options.limit) });
|
|
26
|
+
if (options.json) {
|
|
27
|
+
printJson(res);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const rows = (res.data ?? []);
|
|
31
|
+
console.log(formatTable(['ID', 'Name', 'Gender', 'Language', 'Country'], rows.map((v) => [String(v.id), String(v.name ?? ''), String(v.gender ?? ''), String(v.language ?? ''), String(v.countryCode ?? '')])));
|
|
32
|
+
if (res.has_more)
|
|
33
|
+
console.log(chalk.dim('More voices exist; narrow with --language, --gender or --search.'));
|
|
34
|
+
}));
|
|
35
|
+
voices.command('filters')
|
|
36
|
+
.argument('<provider>', 'cartesia or elevenlabs')
|
|
37
|
+
.description('Languages, genders and accents a provider offers')
|
|
38
|
+
.action((provider) => run(async () => printJson(await new VoiceSDK(new IndemnClient()).voiceFilters(provider))));
|
|
39
|
+
voices.command('play')
|
|
40
|
+
.argument('<voice-id>', 'Voice ID')
|
|
41
|
+
.option('--text <text>', 'What to say')
|
|
42
|
+
.option('--speed <n>', 'Speaking speed')
|
|
43
|
+
.requiredOption('-o, --output <file>', 'Audio file to write')
|
|
44
|
+
.description('Save a speech sample of a voice')
|
|
45
|
+
.action((voiceId, options) => run(async () => {
|
|
46
|
+
const audio = await new VoiceSDK(new IndemnClient()).playVoice(voiceId, options.text, options.speed ? Number(options.speed) : undefined);
|
|
47
|
+
writeFileSync(options.output, audio.data);
|
|
48
|
+
printSuccess(`Wrote ${options.output} (${audio.contentType}, ${audio.data.length} bytes).`);
|
|
49
|
+
}));
|
|
50
|
+
program.command('voice-models')
|
|
51
|
+
.description('Speech providers and models')
|
|
52
|
+
.command('list')
|
|
53
|
+
.requiredOption('--kind <kind>', 'stt (speech to text) or tts (text to speech)')
|
|
54
|
+
.action((options) => run(async () => {
|
|
55
|
+
if (!['stt', 'tts'].includes(options.kind))
|
|
56
|
+
throw new CliError('--kind must be stt or tts.', EXIT.NEEDS_INPUT);
|
|
57
|
+
printJson(await new VoiceSDK(new IndemnClient()).voiceModels(options.kind));
|
|
58
|
+
}));
|
|
59
|
+
const agents = program.commands.find((c) => c.name() === 'agents');
|
|
60
|
+
if (!agents)
|
|
61
|
+
throw new Error('agents command group must be registered before voice commands');
|
|
62
|
+
const voice = agents.command('voice').description('Voice settings of an agent (they live on its phone number)');
|
|
63
|
+
voice.command('get')
|
|
64
|
+
.argument('<agent-id>', 'Agent ID')
|
|
65
|
+
.action((agentId) => run(async () => printJson(await new VoiceSDK(new IndemnClient()).getAgentVoice(agentId))));
|
|
66
|
+
voice.command('set')
|
|
67
|
+
.argument('<agent-id>', 'Agent ID')
|
|
68
|
+
.requiredOption('--voice-id <id>', 'Voice ID from `voices list`')
|
|
69
|
+
.requiredOption('--name <name>', 'Voice name')
|
|
70
|
+
.requiredOption('--gender <gender>', 'Voice gender')
|
|
71
|
+
.requiredOption('--language <code>', 'Language, for example en')
|
|
72
|
+
.requiredOption('--country <code>', 'Country code, for example US')
|
|
73
|
+
.option('--provider <name>', 'cartesia or elevenlabs', 'cartesia')
|
|
74
|
+
.option('--model <model>', 'TTS model')
|
|
75
|
+
.option('--speed <n>', 'Speaking speed')
|
|
76
|
+
.option('--yes', 'Do not ask for confirmation')
|
|
77
|
+
.description('Change the voice of an agent')
|
|
78
|
+
.action((agentId, options) => run(async () => {
|
|
79
|
+
const sdk = new VoiceSDK(new IndemnClient());
|
|
80
|
+
const current = await sdk.getAgentVoice(agentId);
|
|
81
|
+
await confirmOrExit(`Change the voice of agent ${agentId} from ${current.tts?.name ?? current.tts?.voice_id ?? '(default)'} to ${options.name}? Callers hear it on the next call.`, Boolean(options.yes));
|
|
82
|
+
await sdk.setAgentVoice(agentId, {
|
|
83
|
+
provider: options.provider, voice_id: options.voiceId, name: options.name, gender: options.gender, language: options.language,
|
|
84
|
+
countryCode: options.country, ...(options.model ? { model: options.model } : {}), ...(options.speed ? { settings: { speed: Number(options.speed) } } : {}),
|
|
85
|
+
});
|
|
86
|
+
printSuccess(`Voice of ${agentId} is now ${options.name}.`);
|
|
87
|
+
}));
|
|
88
|
+
voice.command('transcriber')
|
|
89
|
+
.argument('<agent-id>', 'Agent ID')
|
|
90
|
+
.requiredOption('--provider <name>', 'Speech-to-text provider (see `voice-models list --kind stt`)')
|
|
91
|
+
.requiredOption('--model <model>', 'Speech-to-text model')
|
|
92
|
+
.requiredOption('--language <code>', 'Language, for example en')
|
|
93
|
+
.option('--keyterms <list>', 'Words to listen for, comma-separated (up to 50)')
|
|
94
|
+
.option('--yes', 'Do not ask for confirmation')
|
|
95
|
+
.description('Change how the agent hears callers (speech-to-text)')
|
|
96
|
+
.action((agentId, options) => run(async () => {
|
|
97
|
+
const sdk = new VoiceSDK(new IndemnClient());
|
|
98
|
+
await confirmOrExit(`Change the transcriber of agent ${agentId} to ${options.provider}/${options.model} (${options.language})? It applies from the next call.`, Boolean(options.yes));
|
|
99
|
+
await sdk.setAgentTranscriber(agentId, { provider: options.provider, model: options.model, language: options.language, keyterms: options.keyterms ? String(options.keyterms).split(',') : undefined });
|
|
100
|
+
printSuccess(`Transcriber of ${agentId} is now ${options.provider}/${options.model}.`);
|
|
101
|
+
}));
|
|
102
|
+
voice.command('play')
|
|
103
|
+
.argument('<agent-id>', 'Agent ID')
|
|
104
|
+
.option('--text <text>', 'What to say')
|
|
105
|
+
.requiredOption('-o, --output <file>', 'Audio file to write')
|
|
106
|
+
.description('Save a speech sample in the agent\'s current voice')
|
|
107
|
+
.action((agentId, options) => run(async () => {
|
|
108
|
+
const sdk = new VoiceSDK(new IndemnClient());
|
|
109
|
+
const tts = (await sdk.getAgentVoice(agentId)).tts;
|
|
110
|
+
if (!tts?.voice_id)
|
|
111
|
+
throw new CliError(`Agent ${agentId} has no text-to-speech voice set.`);
|
|
112
|
+
const audio = await sdk.playVoice(tts.voice_id, options.text, undefined, { provider: tts.provider, name: tts.name, language: tts.language });
|
|
113
|
+
writeFileSync(options.output, audio.data);
|
|
114
|
+
printSuccess(`Wrote ${options.output}.`);
|
|
115
|
+
}));
|
|
116
|
+
const numbers = agents.command('numbers').description('Phone numbers of an agent');
|
|
117
|
+
numbers.command('list')
|
|
118
|
+
.argument('[agent-id]', 'Agent ID (omit to list every number the org owns)')
|
|
119
|
+
.option('--json', 'Output as JSON')
|
|
120
|
+
.action((agentId, options) => run(async () => {
|
|
121
|
+
const sdk = new VoiceSDK(new IndemnClient());
|
|
122
|
+
const rows = agentId ? await sdk.agentNumbers(agentId) : await sdk.orgNumbers();
|
|
123
|
+
if (options.json) {
|
|
124
|
+
printJson(rows);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
console.log(formatTable(['Number', 'Name', 'Attached'], rows.map((n) => [String(n.phoneNumber ?? ''), String(n.friendlyName ?? ''), agentId ? 'yes' : n.is_active ? 'yes' : 'no'])));
|
|
128
|
+
}));
|
|
129
|
+
numbers.command('attach')
|
|
130
|
+
.argument('<agent-id>', 'Agent ID')
|
|
131
|
+
.argument('<phone-number>', 'A number the org already owns (see `agents numbers list`)')
|
|
132
|
+
.option('--yes', 'Do not ask for confirmation')
|
|
133
|
+
.description('Attach an owned number; never buys one. Its voice settings reset to the defaults')
|
|
134
|
+
.action((agentId, phone, options) => run(async () => {
|
|
135
|
+
await confirmOrExit(`Attach ${phone} to agent ${agentId}? Calls to it reach this agent, and its voice settings reset to the defaults.`, Boolean(options.yes));
|
|
136
|
+
await new VoiceSDK(new IndemnClient()).attachNumber(agentId, phone);
|
|
137
|
+
printSuccess(`${phone} is attached to ${agentId}.`);
|
|
138
|
+
}));
|
|
139
|
+
numbers.command('search')
|
|
140
|
+
.option('--area-code <code>', 'Three-digit area code, for example 331')
|
|
141
|
+
.option('--contains <digits>', 'Only numbers containing these digits')
|
|
142
|
+
.option('--country <code>', 'US, CA, GB or AU', 'US')
|
|
143
|
+
.option('--toll-free', 'Toll-free numbers instead of local ones')
|
|
144
|
+
.option('--limit <n>', 'How many to show (default 5)', '5')
|
|
145
|
+
.option('--json', 'Output as JSON')
|
|
146
|
+
.description('Numbers available to buy (nothing is bought)')
|
|
147
|
+
.action((options) => run(async () => {
|
|
148
|
+
const rows = await new VoiceSDK(new IndemnClient()).searchNumbers({ areaCode: options.areaCode, contains: options.contains, country: options.country, tollFree: Boolean(options.tollFree), limit: Number(options.limit) });
|
|
149
|
+
if (options.json) {
|
|
150
|
+
printJson(rows);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!rows.length) {
|
|
154
|
+
console.log('No numbers available for that search.');
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
console.log(formatTable(['Number', 'E.164', 'Location', 'Voice / SMS'], rows.map((r) => [
|
|
158
|
+
String(r.friendlyName ?? ''), String(r.phoneNumber ?? ''), [r.locality, r.region].filter(Boolean).join(', '),
|
|
159
|
+
`${r.capabilities?.voice ? 'yes' : 'no'} / ${r.capabilities?.SMS ?? r.capabilities?.sms ? 'yes' : 'no'}`,
|
|
160
|
+
])));
|
|
161
|
+
console.log(chalk.dim('Buy one with `indemn agents numbers buy <agent-id> <number>`. Buying costs the org money every month.'));
|
|
162
|
+
}));
|
|
163
|
+
numbers.command('get')
|
|
164
|
+
.argument('<agent-id>', 'Agent ID')
|
|
165
|
+
.description('The agent\'s phone number: location, type and voice settings')
|
|
166
|
+
.action((agentId) => run(async () => printJson(await new VoiceSDK(new IndemnClient()).numberDetails(agentId))));
|
|
167
|
+
numbers.command('buy')
|
|
168
|
+
.argument('<agent-id>', 'Voice agent to attach the number to')
|
|
169
|
+
.argument('<number>', 'A number from `agents numbers search`')
|
|
170
|
+
.option('--country <code>', 'US, CA, GB or AU', 'US')
|
|
171
|
+
.option('--toll-free', 'The number is toll-free')
|
|
172
|
+
.option('--yes', 'Do not ask for confirmation')
|
|
173
|
+
.option('--confirm-purchase', 'Required with --yes: you agree to buy this number')
|
|
174
|
+
.description('Buy an available number and attach it to a voice agent (costs money every month)')
|
|
175
|
+
.action((agentId, number, options) => run(async () => {
|
|
176
|
+
const phone = toE164(number, String(options.country).toUpperCase());
|
|
177
|
+
if (options.yes && !options.confirmPurchase)
|
|
178
|
+
throw new CliError('Buying a number costs money: pass --confirm-purchase with --yes, or run without --yes to be asked.', EXIT.NEEDS_INPUT);
|
|
179
|
+
await confirmOrExit(`Buy ${phone} and attach it to agent ${agentId}? The org pays for it every month, and it cannot be undone from the CLI.`, Boolean(options.yes));
|
|
180
|
+
const res = await new VoiceSDK(new IndemnClient()).buyNumber(agentId, number, { country: options.country, tollFree: Boolean(options.tollFree) });
|
|
181
|
+
printSuccess(`Bought ${res.name ?? res.phone_number}${res.locality ? ` (${res.locality}, ${res.region})` : ''} and attached it to ${res.agent}. Its voice settings are the defaults.`);
|
|
182
|
+
}));
|
|
183
|
+
numbers.command('detach')
|
|
184
|
+
.argument('<agent-id>', 'Agent ID')
|
|
185
|
+
.argument('<phone-number>', 'Number to detach (the org keeps owning it)')
|
|
186
|
+
.option('--yes', 'Do not ask for confirmation')
|
|
187
|
+
.action((agentId, phone, options) => run(async () => {
|
|
188
|
+
await confirmOrExit(`Detach ${phone} from agent ${agentId}? Calls to it stop reaching the agent.`, Boolean(options.yes));
|
|
189
|
+
await new VoiceSDK(new IndemnClient()).detachNumber(agentId, phone);
|
|
190
|
+
printSuccess(`${phone} detached.`);
|
|
191
|
+
}));
|
|
192
|
+
agents.command('voice-preview')
|
|
193
|
+
.argument('<agent-id>', 'Agent ID')
|
|
194
|
+
.option('--json', 'Output as JSON')
|
|
195
|
+
.description('A browser link for a test voice call with the agent (marked as test, valid 1 hour)')
|
|
196
|
+
.action((agentId, options) => run(async () => {
|
|
197
|
+
const res = await new VoiceSDK(new IndemnClient()).voicePreview(agentId);
|
|
198
|
+
if (options.json) {
|
|
199
|
+
printJson(res);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
console.log(res.join_url);
|
|
203
|
+
console.log(chalk.dim(`Test call room ${res.room_name}. The link carries a token valid for 1 hour; do not share it.`));
|
|
204
|
+
}));
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=voice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice.js","sourceRoot":"","sources":["../../src/cli/voice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface DiffLine {
|
|
2
|
+
op: ' ' | '+' | '-';
|
|
3
|
+
text: string;
|
|
4
|
+
}
|
|
5
|
+
/** Line diff by longest common subsequence. Very large inputs fall back to "all removed, all added". */
|
|
6
|
+
export declare function lineDiff(before: string, after: string): DiffLine[];
|
|
7
|
+
export declare function diffStats(diff: DiffLine[]): {
|
|
8
|
+
added: number;
|
|
9
|
+
removed: number;
|
|
10
|
+
};
|
|
11
|
+
/** Changed lines with `context` unchanged lines around them, as unified-style text. */
|
|
12
|
+
export declare function formatDiff(diff: DiffLine[], opts?: {
|
|
13
|
+
context?: number;
|
|
14
|
+
maxLines?: number;
|
|
15
|
+
}): string;
|
|
16
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/core/diff.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wGAAwG;AACxG,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,EAAE,CAuBlE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAE9E;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAevG"}
|