@solidnumber/cli 2.13.1 → 2.15.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.
- package/README.md +8 -0
- package/dist/commands/blog.js +141 -0
- package/dist/commands/blog.js.map +1 -1
- package/dist/commands/call.d.ts +13 -0
- package/dist/commands/call.d.ts.map +1 -0
- package/dist/commands/call.js +111 -0
- package/dist/commands/call.js.map +1 -0
- package/dist/commands/init.d.ts +26 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +173 -38
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/insights.js +57 -0
- package/dist/commands/insights.js.map +1 -1
- package/dist/commands/voice.js +144 -0
- package/dist/commands/voice.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/platform-docs/llms.txt +19 -17
package/dist/commands/init.js
CHANGED
|
@@ -44,7 +44,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
44
44
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
45
|
};
|
|
46
46
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
-
exports.initCommand = void 0;
|
|
47
|
+
exports.initCommand = exports.STARTER_VERSION = void 0;
|
|
48
|
+
exports.renderStarterClaudeMd = renderStarterClaudeMd;
|
|
49
|
+
exports.renderSolidConfig = renderSolidConfig;
|
|
50
|
+
exports.buildStarterFiles = buildStarterFiles;
|
|
48
51
|
const commander_1 = require("commander");
|
|
49
52
|
const chalk_1 = __importDefault(require("chalk"));
|
|
50
53
|
const fs = __importStar(require("fs"));
|
|
@@ -292,10 +295,129 @@ Manage all your Solid# client companies from one place.
|
|
|
292
295
|
},
|
|
293
296
|
},
|
|
294
297
|
};
|
|
298
|
+
// ---------------------------------------------------------------------------
|
|
299
|
+
// Starter-kit layer — the tenant stamp + operating rules + connector wiring
|
|
300
|
+
// that turn a bare template into a project bound to ONE business (company_id).
|
|
301
|
+
// Kept as pure builders so the real output is unit-tested, not simulated.
|
|
302
|
+
// ---------------------------------------------------------------------------
|
|
303
|
+
/** Bumped when the scaffold's shape changes; recorded in .solid/config.json. */
|
|
304
|
+
exports.STARTER_VERSION = '1.0.0';
|
|
305
|
+
const DEFAULT_API_URL = 'https://api.solidnumber.com';
|
|
306
|
+
const DEFAULT_CONNECTOR_URL = 'https://api.solidnumber.com/mcp/connector';
|
|
307
|
+
/**
|
|
308
|
+
* The operating-rules CLAUDE.md — the sleeper feature. Every local AI session
|
|
309
|
+
* that opens this project inherits the SAME discipline the Solid# connector runs
|
|
310
|
+
* by (`_OPERATING_RULES` in solid-backend), so client work grounds and persists
|
|
311
|
+
* instead of hallucinating and evaporating. Keep these five in parity with the
|
|
312
|
+
* backend contract.
|
|
313
|
+
*/
|
|
314
|
+
function renderStarterClaudeMd(ctx) {
|
|
315
|
+
const cid = ctx.companyId != null ? String(ctx.companyId) : '<set in .solid/config.json>';
|
|
316
|
+
return `# ${ctx.name}
|
|
317
|
+
|
|
318
|
+
This project was scaffolded by Solid# for **company_id ${cid}** and is bound to that one
|
|
319
|
+
business. It builds ON Solid# infrastructure — the same CRM, brand, knowledge base, pages,
|
|
320
|
+
and AI the company already runs — reached through the Solid# connector.
|
|
321
|
+
|
|
322
|
+
> Your source lives in YOUR git. Solid#'s platform is never handed to you. The only Solid#
|
|
323
|
+
> credential in this project is a scoped token in \`.env\` that can touch company_id ${cid}
|
|
324
|
+
> and nothing else. It is gitignored — never commit it.
|
|
325
|
+
|
|
326
|
+
## Operating rules — how to work in this project
|
|
327
|
+
|
|
328
|
+
You are an AI building for a real business. Nothing you make here is throwaway. Follow these
|
|
329
|
+
five rules; they are the same rules the Solid# connector runs by.
|
|
330
|
+
|
|
331
|
+
1. **Ground, don't guess.** Write only facts that come from a Solid# tool result (company
|
|
332
|
+
profile, brand truth, knowledge base). Never invent a partner, payment processor,
|
|
333
|
+
certification, price, award, or year in business. If it isn't in a tool result, say you
|
|
334
|
+
don't have it and ask the owner.
|
|
335
|
+
|
|
336
|
+
2. **Persist everything — nothing is session-ephemeral.** Every design, brand decision, page,
|
|
337
|
+
and durable fact must be WRITTEN BACK to company_id ${cid} through the connector
|
|
338
|
+
(\`set_brand_truth\`, \`set_capability\`, \`edit_page_content\`, \`add_memory\`, …). Generating a
|
|
339
|
+
preview is NOT persisting: if you generate and don't commit, the work evaporates and the
|
|
340
|
+
business is left exactly as un-changed as before.
|
|
341
|
+
|
|
342
|
+
3. **Preview → confirm → written.** Solid# write tools preview by default; call again with
|
|
343
|
+
\`confirm=true\` to commit. Money and irreversible actions also need the owner to type the
|
|
344
|
+
approval phrase. Every write is auditable and reversible (\`list_changes\` / \`approve_change\`
|
|
345
|
+
/ \`rollback_change\`).
|
|
346
|
+
|
|
347
|
+
4. **Close the grounding gaps first.** If the company's brand/positioning is unconfigured, do
|
|
348
|
+
NOT write public copy yet — ask the owner the grounding questions and persist each answer
|
|
349
|
+
with \`set_brand_truth\` / \`set_capability\`.
|
|
350
|
+
|
|
351
|
+
5. **Leave a handoff.** Open every Solid# session with \`start_here\` (it orients you to this
|
|
352
|
+
business) and close it with \`end_session\` (it persists what you did and what's next), so
|
|
353
|
+
the next session — and the owner — continue from where you stopped instead of starting cold.
|
|
354
|
+
|
|
355
|
+
## The connector
|
|
356
|
+
|
|
357
|
+
- Connector URL: ${ctx.connectorUrl}
|
|
358
|
+
- Bound company_id: ${cid}
|
|
359
|
+
- Config: \`.solid/config.json\`
|
|
360
|
+
|
|
361
|
+
**Call \`start_here\` before you build. Call \`end_session\` when you finish.**
|
|
362
|
+
|
|
363
|
+
## Deploy
|
|
364
|
+
|
|
365
|
+
Your build deploys back to THIS company's own slot (keyed by company_id ${cid}) — never to a
|
|
366
|
+
shared or wrong place:
|
|
367
|
+
|
|
368
|
+
\`\`\`bash
|
|
369
|
+
solid deploy
|
|
370
|
+
\`\`\`
|
|
371
|
+
|
|
372
|
+
## Resources
|
|
373
|
+
- CLI: \`npm i -g @solidnumber/cli\`
|
|
374
|
+
- Docs: https://solidnumber.com/docs
|
|
375
|
+
- App type: ${ctx.typeLabel}
|
|
376
|
+
`;
|
|
377
|
+
}
|
|
378
|
+
/** The tenant stamp — who this project is, so every tool call is scoped right. */
|
|
379
|
+
function renderSolidConfig(ctx) {
|
|
380
|
+
return JSON.stringify({
|
|
381
|
+
companyId: ctx.companyId,
|
|
382
|
+
connectorUrl: ctx.connectorUrl,
|
|
383
|
+
apiUrl: ctx.apiUrl,
|
|
384
|
+
appType: ctx.type,
|
|
385
|
+
starterVersion: exports.STARTER_VERSION,
|
|
386
|
+
createdWith: '@solidnumber/cli',
|
|
387
|
+
}, null, 2) + '\n';
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Build EVERY file the starter lands on the client's drive — template files plus
|
|
391
|
+
* the starter-kit layer (CLAUDE.md operating rules, .solid/config.json tenant
|
|
392
|
+
* stamp, token-safe .gitignore, tenant-stamped .env.example). Pure → testable.
|
|
393
|
+
*/
|
|
394
|
+
function buildStarterFiles(ctx) {
|
|
395
|
+
const appType = APP_TYPES[ctx.type];
|
|
396
|
+
const files = {};
|
|
397
|
+
// 1. Template files, {{name}}-rendered.
|
|
398
|
+
for (const [filename, content] of Object.entries(appType.files)) {
|
|
399
|
+
files[filename] = content.replace(/\{\{name\}\}/g, ctx.name);
|
|
400
|
+
}
|
|
401
|
+
// 2. Tenant stamp — the scoped token slot + bound company_id. Never a real secret.
|
|
402
|
+
const cidEnv = ctx.companyId != null ? String(ctx.companyId) : '';
|
|
403
|
+
files['.env.example'] =
|
|
404
|
+
`# Scoped Solid# token — can touch company_id ${cidEnv || '<yours>'} ONLY.\n` +
|
|
405
|
+
`# Get one: solid auth token create -n "${ctx.name}"\n` +
|
|
406
|
+
`# Copy this file to .env and fill it in. NEVER commit .env.\n` +
|
|
407
|
+
`SOLID_TOKEN=\n` +
|
|
408
|
+
`SOLID_COMPANY_ID=${cidEnv}\n`;
|
|
409
|
+
// 3. Config, CLAUDE.md, .gitignore (token-safe).
|
|
410
|
+
files['.solid/config.json'] = renderSolidConfig(ctx);
|
|
411
|
+
files['CLAUDE.md'] = renderStarterClaudeMd(ctx);
|
|
412
|
+
files['.gitignore'] = ['node_modules/', 'dist/', '.env', '.env.local', '.solid/token', '*.log', ''].join('\n');
|
|
413
|
+
return files;
|
|
414
|
+
}
|
|
295
415
|
exports.initCommand = new commander_1.Command('init')
|
|
296
|
-
.description('Scaffold a LOCAL
|
|
416
|
+
.description('Scaffold a LOCAL starter project bound to one Solid# company (tenant-stamped, operating-rules + connector wired). Does NOT create a company; use `solid company create` or `solid demo create` for that.')
|
|
297
417
|
.argument('<name>', 'Project name')
|
|
298
418
|
.option('-t, --type <type>', 'App type (basic, marketplace, saas, agency-dashboard)', 'basic')
|
|
419
|
+
.option('-c, --company <id>', 'Bind the project to this Solid# company_id (tenant stamp)')
|
|
420
|
+
.option('--no-git', 'Skip initializing a local git repo for the project')
|
|
299
421
|
.option('--list', 'List available app types')
|
|
300
422
|
.action(async (name, options) => {
|
|
301
423
|
if (options.list) {
|
|
@@ -324,54 +446,67 @@ exports.initCommand = new commander_1.Command('init')
|
|
|
324
446
|
}
|
|
325
447
|
const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
|
|
326
448
|
const spinner = ora(`Scaffolding ${appType.name}...`).start();
|
|
449
|
+
// Resolve the tenant stamp: --company > stored config > env > unset.
|
|
450
|
+
const rawCompany = options.company
|
|
451
|
+
?? config_1.config.companyId
|
|
452
|
+
?? process.env.SOLID_COMPANY_ID;
|
|
453
|
+
const hasCompany = rawCompany != null && String(rawCompany).trim() !== '';
|
|
454
|
+
const companyId = hasCompany ? parseInt(String(rawCompany), 10) : null;
|
|
455
|
+
if (hasCompany && Number.isNaN(companyId)) {
|
|
456
|
+
console.error(chalk_1.default.red(`Invalid --company id: ${rawCompany}`));
|
|
457
|
+
process.exit(1);
|
|
458
|
+
}
|
|
459
|
+
const ctx = {
|
|
460
|
+
name,
|
|
461
|
+
type: options.type,
|
|
462
|
+
typeLabel: appType.name,
|
|
463
|
+
companyId,
|
|
464
|
+
apiUrl: config_1.config.apiUrl || DEFAULT_API_URL,
|
|
465
|
+
connectorUrl: DEFAULT_CONNECTOR_URL,
|
|
466
|
+
};
|
|
327
467
|
fs.mkdirSync(projectDir, { recursive: true });
|
|
328
|
-
|
|
468
|
+
const files = buildStarterFiles(ctx);
|
|
469
|
+
for (const [filename, content] of Object.entries(files)) {
|
|
329
470
|
const filePath = path.join(projectDir, filename);
|
|
330
|
-
|
|
331
|
-
fs.writeFileSync(filePath,
|
|
471
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true }); // nested .solid/
|
|
472
|
+
fs.writeFileSync(filePath, content);
|
|
473
|
+
}
|
|
474
|
+
// The client's OWN git — their source, their repo, never ours. --no-git opts out.
|
|
475
|
+
let gitInitialized = false;
|
|
476
|
+
if (options.git !== false) {
|
|
477
|
+
try {
|
|
478
|
+
const { execFileSync } = await Promise.resolve().then(() => __importStar(require('node:child_process')));
|
|
479
|
+
const gopts = { cwd: projectDir, stdio: 'ignore' };
|
|
480
|
+
execFileSync('git', ['init', '-q'], gopts);
|
|
481
|
+
execFileSync('git', ['add', '-A'], gopts);
|
|
482
|
+
execFileSync('git', ['commit', '-q', '-m',
|
|
483
|
+
`chore: scaffold ${name} (Solid# starter${companyId != null ? `, company ${companyId}` : ''})`], gopts);
|
|
484
|
+
gitInitialized = true;
|
|
485
|
+
}
|
|
486
|
+
catch {
|
|
487
|
+
// git absent, or commit blocked (no identity) — non-fatal.
|
|
488
|
+
}
|
|
332
489
|
}
|
|
333
|
-
// Copy .gitignore
|
|
334
|
-
fs.writeFileSync(path.join(projectDir, '.gitignore'), 'node_modules/\n.env\ndist/\n');
|
|
335
|
-
// Generate CLAUDE.md for AI context
|
|
336
|
-
const claudeMd = `# ${name}
|
|
337
|
-
|
|
338
|
-
Built on [Solid#](https://solidnumber.com) infrastructure.
|
|
339
|
-
|
|
340
|
-
## Architecture
|
|
341
|
-
- Backend: Solid# API (${config_1.config.apiUrl || 'https://api.solidnumber.com'})
|
|
342
|
-
- SDK: @solidnumber/sdk
|
|
343
|
-
- Type: ${appType.name}
|
|
344
|
-
|
|
345
|
-
## API Key
|
|
346
|
-
Set \`SOLID_API_KEY\` in \`.env\`. Create one with:
|
|
347
|
-
\`\`\`bash
|
|
348
|
-
solid auth token create -n "${name}" -s "crm:read,pages:read,kb:read,agents:read"
|
|
349
|
-
\`\`\`
|
|
350
|
-
|
|
351
|
-
## Solid# Resources
|
|
352
|
-
- API Docs: https://solidnumber.com/docs/api
|
|
353
|
-
- SDK Docs: https://solidnumber.com/docs/sdks
|
|
354
|
-
- CLI: npm i -g @solidnumber/cli
|
|
355
|
-
`;
|
|
356
|
-
fs.writeFileSync(path.join(projectDir, 'CLAUDE.md'), claudeMd);
|
|
357
490
|
spinner.succeed(chalk_1.default.green(`${appType.name} scaffolded`));
|
|
358
491
|
console.log('');
|
|
359
|
-
console.log(` ${chalk_1.default.bold('Project:')}
|
|
360
|
-
console.log(` ${chalk_1.default.bold('Type:')}
|
|
361
|
-
console.log(` ${chalk_1.default.bold('
|
|
492
|
+
console.log(` ${chalk_1.default.bold('Project:')} ${name}`);
|
|
493
|
+
console.log(` ${chalk_1.default.bold('Type:')} ${appType.name}`);
|
|
494
|
+
console.log(` ${chalk_1.default.bold('Company:')} ${companyId != null ? companyId : chalk_1.default.yellow('unset — add it to .solid/config.json')}`);
|
|
495
|
+
console.log(` ${chalk_1.default.bold('Path:')} ${projectDir}`);
|
|
362
496
|
console.log('');
|
|
363
|
-
const
|
|
364
|
-
for (const f of files) {
|
|
497
|
+
for (const f of Object.keys(files).sort()) {
|
|
365
498
|
console.log(chalk_1.default.dim(` ${f}`));
|
|
366
499
|
}
|
|
367
|
-
console.log(
|
|
368
|
-
console.log(
|
|
500
|
+
console.log('');
|
|
501
|
+
console.log(gitInitialized
|
|
502
|
+
? chalk_1.default.dim(' ✓ git initialized — your source, your git (Solid# is never in it)')
|
|
503
|
+
: chalk_1.default.dim(' (no git repo — run `git init` yourself, or drop --no-git)'));
|
|
369
504
|
console.log('');
|
|
370
505
|
console.log(chalk_1.default.bold(' Next steps:'));
|
|
371
506
|
console.log(` ${chalk_1.default.cyan(`cd ${name}`)}`);
|
|
372
507
|
console.log(` ${chalk_1.default.cyan('npm install')}`);
|
|
373
|
-
console.log(` ${chalk_1.default.cyan('cp .env.example .env')} ${chalk_1.default.dim('← add your
|
|
374
|
-
console.log(` ${chalk_1.default.
|
|
508
|
+
console.log(` ${chalk_1.default.cyan('cp .env.example .env')} ${chalk_1.default.dim('← add your scoped token')}`);
|
|
509
|
+
console.log(` ${chalk_1.default.dim('Open in Claude Code — CLAUDE.md carries the operating rules; call start_here first.')}`);
|
|
375
510
|
console.log('');
|
|
376
511
|
});
|
|
377
512
|
const command_kit_1 = require("../lib/command-kit");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -139,8 +139,65 @@ exports.insightsCommand
|
|
|
139
139
|
successText: `Insight ${id} rejected`,
|
|
140
140
|
});
|
|
141
141
|
});
|
|
142
|
+
// ── Communications master report (Insights suite) ───────────────────
|
|
143
|
+
// The SAME payload the web Insights Overview renders and the
|
|
144
|
+
// insights.master_summary verb returns — one aggregation layer.
|
|
145
|
+
exports.insightsCommand
|
|
146
|
+
.command('report')
|
|
147
|
+
.description('Master communications report — sentiment, evaluation, needs-attention')
|
|
148
|
+
.option('-d, --days <n>', 'Window in days (1-90)', '7')
|
|
149
|
+
.option('--json', 'Output as JSON')
|
|
150
|
+
.action(async (options) => {
|
|
151
|
+
const chalk = (await Promise.resolve().then(() => __importStar(require('chalk')))).default;
|
|
152
|
+
const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
|
|
153
|
+
const spinner = ora('Building the master report...').start();
|
|
154
|
+
try {
|
|
155
|
+
const res = await api_client_1.apiClient.get('/api/v1/communications/insights/summary', {
|
|
156
|
+
params: { days: options.days },
|
|
157
|
+
});
|
|
158
|
+
const d = res.data;
|
|
159
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
160
|
+
spinner.stop();
|
|
161
|
+
console.log(JSON.stringify(d, null, 2));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const s = d.sentiment || {};
|
|
165
|
+
const all = s.all_communications || {};
|
|
166
|
+
const e = d.evaluation || {};
|
|
167
|
+
spinner.succeed(chalk.green(`Last ${d.period_days} days — ${all.total || 0} communications, overall ${s.overall || 'neutral'}`));
|
|
168
|
+
console.log(` Mood: ${chalk.green(`${all.positive || 0} positive`)} · ${chalk.dim(`${all.neutral || 0} neutral`)} · ${chalk.red(`${all.negative || 0} negative`)}` +
|
|
169
|
+
(all.unscored ? chalk.dim(` · ${all.unscored} unscored`) : ''));
|
|
170
|
+
const ch = s.channels || {};
|
|
171
|
+
const chan = (k, label) => (ch[k]?.total ? `${label} ${ch[k].total}` : null);
|
|
172
|
+
const parts = [chan('voice', 'calls'), chan('sms', 'texts'), chan('email', 'emails'), chan('chat', 'chats')].filter(Boolean);
|
|
173
|
+
if (parts.length)
|
|
174
|
+
console.log(chalk.dim(` Channels: ${parts.join(' · ')}`));
|
|
175
|
+
if (e.calls_scored) {
|
|
176
|
+
console.log(chalk.dim(` Calls: avg quality ${e.avg_quality}/100 · resolution ${Math.round((e.resolution_rate || 0) * 100)}% · escalation ${Math.round((e.escalation_rate || 0) * 100)}%`));
|
|
177
|
+
}
|
|
178
|
+
const attention = d.needs_attention || [];
|
|
179
|
+
if (attention.length) {
|
|
180
|
+
console.log(chalk.red(` Needs attention (${attention.length}):`));
|
|
181
|
+
for (const a of attention.slice(0, 5)) {
|
|
182
|
+
console.log(` ${chalk.yellow(a.channel)} ${a.summary || 'negative communication'} ${chalk.dim(a.line || '')}`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
console.log(chalk.dim(' Nothing negative needs attention.'));
|
|
187
|
+
}
|
|
188
|
+
const reply = e.needs_reply || [];
|
|
189
|
+
if (reply.length)
|
|
190
|
+
console.log(chalk.red(` Unanswered negatives: ${reply.length} — reply first.`));
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
spinner.fail('Failed to build the report');
|
|
194
|
+
console.error(error instanceof Error ? error.message : String(error));
|
|
195
|
+
process.exitCode = 1;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
142
198
|
const command_kit_2 = require("../lib/command-kit");
|
|
143
199
|
(0, command_kit_2.appendExamples)(exports.insightsCommand, [
|
|
200
|
+
{ cmd: 'solid insights report', why: 'How are my customer communications doing?' },
|
|
144
201
|
{ cmd: 'solid insights list', why: 'AI-generated insights from conversations' },
|
|
145
202
|
{ cmd: 'solid insights stats', why: 'Insight volume + top themes' },
|
|
146
203
|
{ cmd: 'solid insights approve <id>', why: 'Send insight → KB' },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../src/commands/insights.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/voice.js
CHANGED
|
@@ -219,6 +219,150 @@ numbersCmd
|
|
|
219
219
|
fail(spinner, 'Failed to remove phone number', error);
|
|
220
220
|
}
|
|
221
221
|
});
|
|
222
|
+
// ── Lines (Telephony Platform: shared human+AI lines) ───────────────
|
|
223
|
+
const ROUTING_LABELS = {
|
|
224
|
+
ring: 'Ring me — my phone first, AI backs up',
|
|
225
|
+
ask: 'Ask me — I decide per call',
|
|
226
|
+
ai: 'All to AI — the agent answers',
|
|
227
|
+
off: 'Off — the AI never touches this line',
|
|
228
|
+
};
|
|
229
|
+
const linesCmd = exports.voiceCommand
|
|
230
|
+
.command('lines')
|
|
231
|
+
.description('My phone lines — owner, routing mode, agent')
|
|
232
|
+
.option('--company', 'Every company line (admins; default: lines you may see)')
|
|
233
|
+
.option('--json', 'Output as JSON')
|
|
234
|
+
.action(async (options) => {
|
|
235
|
+
requireAuth();
|
|
236
|
+
const spinner = (0, ora_1.default)('Loading lines...').start();
|
|
237
|
+
try {
|
|
238
|
+
const scope = options.company ? 'company' : 'mine';
|
|
239
|
+
const response = await api_client_1.apiClient.get('/api/v1/phone/numbers', { params: { scope } });
|
|
240
|
+
const lines = Array.isArray(response.data) ? response.data : response.data?.items || [];
|
|
241
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
242
|
+
spinner.stop();
|
|
243
|
+
console.log(JSON.stringify(response.data, null, 2));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
spinner.succeed(chalk_1.default.green(`${lines.length} line${lines.length === 1 ? '' : 's'}`));
|
|
247
|
+
console.log('');
|
|
248
|
+
for (const l of lines) {
|
|
249
|
+
const owner = l.owner_type === 'user' ? chalk_1.default.blue(`personal · ${l.user_name || 'unassigned'}`)
|
|
250
|
+
: l.owner_type === 'agent' ? chalk_1.default.magenta(`agent · ${l.agent_name || '—'}`)
|
|
251
|
+
: chalk_1.default.dim('company');
|
|
252
|
+
const mode = l.routing_mode ? chalk_1.default.cyan(l.routing_mode) : chalk_1.default.dim('—');
|
|
253
|
+
const def = l.is_default ? chalk_1.default.yellow(' ★default') : '';
|
|
254
|
+
console.log(` ${chalk_1.default.bold(l.phone_number)}${def} — ${owner}`);
|
|
255
|
+
console.log(chalk_1.default.dim(` ID: ${l.id} routing: `) + mode + (l.agent_name && l.owner_type !== 'agent' ? chalk_1.default.dim(` AI: ${l.agent_name}`) : ''));
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
fail(spinner, 'Failed to load lines', error);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
linesCmd
|
|
263
|
+
.command('routing <line_id> <mode>')
|
|
264
|
+
.description('Set who fields a line: ring | ask | ai | off')
|
|
265
|
+
.action(async (lineId, mode) => {
|
|
266
|
+
requireAuth();
|
|
267
|
+
if (!ROUTING_LABELS[mode]) {
|
|
268
|
+
console.error(chalk_1.default.red(` mode must be one of: ${Object.keys(ROUTING_LABELS).join(' | ')}`));
|
|
269
|
+
process.exitCode = 1;
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
const spinner = (0, ora_1.default)(`Setting routing on line ${lineId}...`).start();
|
|
273
|
+
try {
|
|
274
|
+
await api_client_1.apiClient.patch(`/api/v1/phone/settings/${lineId}`, { routing_mode: mode });
|
|
275
|
+
spinner.succeed(chalk_1.default.green(`Line ${lineId} → ${ROUTING_LABELS[mode]}`));
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
fail(spinner, 'Failed to set routing mode', error);
|
|
279
|
+
}
|
|
280
|
+
});
|
|
281
|
+
linesCmd
|
|
282
|
+
.command('context')
|
|
283
|
+
.description('My default line + today\'s counts (one call)')
|
|
284
|
+
.option('--json', 'Output as JSON')
|
|
285
|
+
.action(async (options) => {
|
|
286
|
+
requireAuth();
|
|
287
|
+
const spinner = (0, ora_1.default)('Loading my line...').start();
|
|
288
|
+
try {
|
|
289
|
+
const response = await api_client_1.apiClient.get('/api/v1/phone/me/context');
|
|
290
|
+
const d = response.data;
|
|
291
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
292
|
+
spinner.stop();
|
|
293
|
+
console.log(JSON.stringify(d, null, 2));
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
spinner.succeed(chalk_1.default.green('My line'));
|
|
297
|
+
const line = d.default_line;
|
|
298
|
+
if (!line) {
|
|
299
|
+
console.log(chalk_1.default.dim(' No line visible to you yet.'));
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
console.log(` ${chalk_1.default.bold(line.phone_number)} — ${chalk_1.default.cyan(line.routing_mode || 'ai')}${line.agent_name ? chalk_1.default.dim(` AI: ${line.agent_name}`) : ''}`);
|
|
303
|
+
const t = d.today || {};
|
|
304
|
+
console.log(chalk_1.default.dim(` Today: ${t.calls || 0} calls · AI ${t.ai_handled || 0} · human ${t.human_handled || 0} · missed ${t.missed || 0}`));
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
fail(spinner, 'Failed to load line context', error);
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
exports.voiceCommand
|
|
311
|
+
.command('spend')
|
|
312
|
+
.description('Usage & spend per line/user/agent (customer charges)')
|
|
313
|
+
.option('-m, --months <n>', 'Trailing months incl. current', '1')
|
|
314
|
+
.option('--json', 'Output as JSON')
|
|
315
|
+
.action(async (options) => {
|
|
316
|
+
requireAuth();
|
|
317
|
+
const spinner = (0, ora_1.default)('Loading spend...').start();
|
|
318
|
+
try {
|
|
319
|
+
const response = await api_client_1.apiClient.get('/api/v1/phone/billing/by-owner', { params: { months: options.months } });
|
|
320
|
+
const d = response.data;
|
|
321
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
322
|
+
spinner.stop();
|
|
323
|
+
console.log(JSON.stringify(d, null, 2));
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
const t = d.totals || {};
|
|
327
|
+
spinner.succeed(chalk_1.default.green(`Last ${d.months} month${d.months === 1 ? '' : 's'}: $${((t.charge_cents || 0) / 100).toFixed(2)}`));
|
|
328
|
+
console.log(chalk_1.default.dim(` ${t.calls || 0} calls · ${t.minutes || 0} min · ${t.sms || 0} texts · ${Math.round((t.transcription_seconds || 0) / 60)} min transcribed`));
|
|
329
|
+
for (const row of (d.lines || [])) {
|
|
330
|
+
const who = row.user_name ? chalk_1.default.blue(row.user_name) : row.agent_name ? chalk_1.default.magenta(row.agent_name) : chalk_1.default.dim('company');
|
|
331
|
+
console.log(` ${chalk_1.default.bold(row.phone_number || '(company)')} ${chalk_1.default.dim(row.period)} — ${who} — $${((row.charge_cents || 0) / 100).toFixed(2)} ${chalk_1.default.dim(`(${row.calls} calls, ${row.minutes} min, ${row.sms} sms)`)}`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
fail(spinner, 'Failed to load spend', error);
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
exports.voiceCommand
|
|
339
|
+
.command('pricing')
|
|
340
|
+
.description('Phone pricing — rentals, plans, transcription')
|
|
341
|
+
.option('--json', 'Output as JSON')
|
|
342
|
+
.action(async (options) => {
|
|
343
|
+
requireAuth();
|
|
344
|
+
const spinner = (0, ora_1.default)('Loading pricing...').start();
|
|
345
|
+
try {
|
|
346
|
+
const response = await api_client_1.apiClient.get('/api/v1/phone/pricing');
|
|
347
|
+
const d = response.data;
|
|
348
|
+
if ((0, json_output_1.isJsonOutput)(options)) {
|
|
349
|
+
spinner.stop();
|
|
350
|
+
console.log(JSON.stringify(d, null, 2));
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
spinner.succeed(chalk_1.default.green('Phone pricing'));
|
|
354
|
+
console.log(` Local number: ${chalk_1.default.bold(d.rental?.local?.display || '—')} Toll-free: ${chalk_1.default.bold(d.rental?.toll_free?.display || '—')}`);
|
|
355
|
+
for (const p of (d.plans || [])) {
|
|
356
|
+
console.log(chalk_1.default.dim(` ${p.name}: $${(p.price_cents / 100).toFixed(0)}/mo — ${p.minutes_included} min included`));
|
|
357
|
+
}
|
|
358
|
+
if (d.transcription?.price_cents_per_minute) {
|
|
359
|
+
console.log(chalk_1.default.dim(` Call transcription: ${d.transcription.price_cents_per_minute}¢/min`));
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch (error) {
|
|
363
|
+
fail(spinner, 'Failed to load pricing', error);
|
|
364
|
+
}
|
|
365
|
+
});
|
|
222
366
|
// ── Voicemail ────────────────────────────────────────────────────────
|
|
223
367
|
const voicemailCmd = exports.voiceCommand
|
|
224
368
|
.command('voicemail')
|