collabSupport/commands/callTest.js
jmcqueen 1eaabbcee1 Add /voicereport store digest and harden Webex CDR feed handling.
Groups cdr_feed legs by Correlation ID for call-level summaries, fixes report-column field parsing and Docker proxy routing, and adds /calltest post-call Twilio and CDR enrichment.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 13:43:11 -04:00

93 lines
2.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// commands/callTest.js
// /calltest — Twilio voice path testing (store AA entry or direct dial).
import {
getConfigurationMessage,
getSessionForStatus,
isCallTestConfigured,
startDialTest,
startStoreTest,
} from '../services/callTest/callTestService.js';
import { parseCallTestArgs } from '../services/callTest/parseArgs.js';
import { renderCallTestResultMarkdown, renderCallTestEnrichmentStatusMarkdown } from '../services/renderers/callTestRenderer.js';
import { extractRequester } from '../utils/requester.js';
import { logger } from '../utils/logger.js';
function usageMarkdown() {
return (
'**Usage:** `/calltest <store|store subcommand|dial subcommand>`\n\n' +
'**Store path** (auto-attendant → DTMF → 60s test):\n' +
'• `/calltest 782` or `/calltest store 782`\n' +
'• `/calltest store 782 +12125550100` — override main number\n\n' +
'**Direct dial** (answer → 60s test, no AA/DTMF):\n' +
'• `/calltest dial +12125550100`\n' +
'• `/calltest +12125550100` — shorthand when arg looks like a phone number\n\n' +
'**Status:**\n' +
'• `/calltest status <testId>`\n\n' +
'Each test places a **real outbound call** from the configured Twilio number. ' +
'Results post to this room when the call completes (~23 min).'
);
}
export async function handleCallTest(bot, trigger) {
logger('calltest', 'Handler entered');
const args = trigger.args || [];
const query = trigger.query || {};
const parsed = parseCallTestArgs(
args.length
? args
: [
query.mode,
query.store || query.storeNum,
query.dial || query.number,
query.testId,
].filter(Boolean),
);
if (parsed.kind === 'usage') {
await bot.say('markdown', usageMarkdown());
return;
}
if (!isCallTestConfigured()) {
await bot.say('markdown', getConfigurationMessage() || 'Call test is not available.');
return;
}
const roomId = trigger.roomId || bot?.room?.id || null;
const requester = extractRequester(trigger);
try {
if (parsed.kind === 'status') {
const session = getSessionForStatus(parsed.testId);
if (!session) {
await bot.say('markdown', `No in-memory session for testId \`${parsed.testId}\` (expired or unknown).`);
return;
}
await bot.say('markdown', renderCallTestResultMarkdown(session) + renderCallTestEnrichmentStatusMarkdown(session));
return;
}
if (parsed.kind === 'store') {
await startStoreTest({
storeNum: parsed.storeNum,
dialOverride: parsed.dialOverride,
roomId,
requester,
});
return;
}
if (parsed.kind === 'dial') {
await startDialTest({
dialNumber: parsed.dial,
roomId,
requester,
});
}
} catch (err) {
logger('calltest', `Handler error: ${err.message}`, 'error');
await bot.say('markdown', `❌ **Call test failed**\n\n${err.message}`);
}
}