@absolutejs/voice 0.0.22-beta.115 → 0.0.22-beta.116
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/dist/campaignDialers.d.ts +39 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +168 -9
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { applyVoiceCampaignTelephonyOutcome, VoiceCampaignDialer, VoiceCampaignDialerInput, type VoiceCampaignRecord, type VoiceCampaignStore, type VoiceCampaignTickResult } from './campaign';
|
|
2
2
|
type VoiceCampaignDialerFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
3
3
|
type VoiceCampaignDialerMetadataInput = VoiceCampaignDialerInput & {
|
|
4
4
|
provider: 'plivo' | 'telnyx' | 'twilio';
|
|
@@ -46,7 +46,45 @@ export type VoicePlivoCampaignDialerOptions = {
|
|
|
46
46
|
from: string;
|
|
47
47
|
metadata?: VoiceCampaignDialerMetadata;
|
|
48
48
|
};
|
|
49
|
+
export type VoiceCampaignDialerProofProvider = 'plivo' | 'telnyx' | 'twilio';
|
|
50
|
+
export type VoiceCampaignDialerProofCarrierRequest = {
|
|
51
|
+
body: unknown;
|
|
52
|
+
method: string;
|
|
53
|
+
provider: VoiceCampaignDialerProofProvider;
|
|
54
|
+
url: string;
|
|
55
|
+
};
|
|
56
|
+
export type VoiceCampaignDialerProofProviderResult = {
|
|
57
|
+
campaignId: string;
|
|
58
|
+
carrierRequests: VoiceCampaignDialerProofCarrierRequest[];
|
|
59
|
+
final?: VoiceCampaignRecord;
|
|
60
|
+
outcomes: Awaited<ReturnType<typeof applyVoiceCampaignTelephonyOutcome>>[];
|
|
61
|
+
provider: VoiceCampaignDialerProofProvider;
|
|
62
|
+
tick: VoiceCampaignTickResult;
|
|
63
|
+
};
|
|
64
|
+
export type VoiceCampaignDialerProofReport = {
|
|
65
|
+
generatedAt: number;
|
|
66
|
+
mode: 'dry-run';
|
|
67
|
+
ok: boolean;
|
|
68
|
+
providers: VoiceCampaignDialerProofProviderResult[];
|
|
69
|
+
};
|
|
70
|
+
export type VoiceCampaignDialerProofStatus = {
|
|
71
|
+
generatedAt: number;
|
|
72
|
+
mode: 'dry-run';
|
|
73
|
+
ok: boolean;
|
|
74
|
+
providers: VoiceCampaignDialerProofProvider[];
|
|
75
|
+
runPath?: string;
|
|
76
|
+
safe: true;
|
|
77
|
+
};
|
|
78
|
+
export type VoiceCampaignDialerProofOptions = {
|
|
79
|
+
baseUrl?: string;
|
|
80
|
+
from?: string;
|
|
81
|
+
providers?: VoiceCampaignDialerProofProvider[];
|
|
82
|
+
runPath?: string;
|
|
83
|
+
store?: VoiceCampaignStore;
|
|
84
|
+
};
|
|
49
85
|
export declare const createVoiceTwilioCampaignDialer: (options: VoiceTwilioCampaignDialerOptions) => VoiceCampaignDialer;
|
|
50
86
|
export declare const createVoiceTelnyxCampaignDialer: (options: VoiceTelnyxCampaignDialerOptions) => VoiceCampaignDialer;
|
|
51
87
|
export declare const createVoicePlivoCampaignDialer: (options: VoicePlivoCampaignDialerOptions) => VoiceCampaignDialer;
|
|
88
|
+
export declare const getVoiceCampaignDialerProofStatus: (options?: Pick<VoiceCampaignDialerProofOptions, "providers" | "runPath">) => VoiceCampaignDialerProofStatus;
|
|
89
|
+
export declare const runVoiceCampaignDialerProof: (options?: VoiceCampaignDialerProofOptions) => Promise<VoiceCampaignDialerProofReport>;
|
|
52
90
|
export {};
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { voice } from './plugin';
|
|
2
2
|
export { createVoiceAppKit, createVoiceAppKitRoutes, summarizeVoiceAppKitStatus } from './appKit';
|
|
3
3
|
export { applyVoiceCampaignTelephonyOutcome, buildVoiceCampaignObservabilityReport, createVoiceCampaignTelephonyOutcomeHandler, createVoiceCampaign, createVoiceCampaignRoutes, createVoiceCampaignWorker, createVoiceCampaignWorkerLoop, createVoiceMemoryCampaignStore, renderVoiceCampaignObservabilityHTML, renderVoiceCampaignsHTML, runVoiceCampaignProof, summarizeVoiceCampaigns } from './campaign';
|
|
4
|
-
export { createVoicePlivoCampaignDialer, createVoiceTelnyxCampaignDialer, createVoiceTwilioCampaignDialer } from './campaignDialers';
|
|
4
|
+
export { createVoicePlivoCampaignDialer, createVoiceTelnyxCampaignDialer, createVoiceTwilioCampaignDialer, getVoiceCampaignDialerProofStatus, runVoiceCampaignDialerProof } from './campaignDialers';
|
|
5
5
|
export { createVoiceAssistant, createVoiceExperiment, summarizeVoiceAssistantRuns } from './assistant';
|
|
6
6
|
export { createVoiceAssistantHealthHTMLHandler, createVoiceAssistantHealthJSONHandler, createVoiceAssistantHealthRoutes, renderVoiceAssistantHealthHTML, summarizeVoiceAssistantHealth } from './assistantHealth';
|
|
7
7
|
export { createVoiceBargeInRoutes, renderVoiceBargeInHTML, summarizeVoiceBargeIn } from './bargeInRoutes';
|
|
@@ -56,6 +56,7 @@ export { resolveTurnDetectionConfig, TURN_PROFILE_DEFAULTS } from './turnProfile
|
|
|
56
56
|
export { createVoiceCallReviewFromLiveTelephonyReport, createVoiceCallReviewRecorder, renderVoiceCallReviewHTML, renderVoiceCallReviewMarkdown } from './testing/review';
|
|
57
57
|
export type { VoiceAppKitLink, VoiceAppKitRoutes, VoiceAppKitRoutesOptions, VoiceAppKitStatus, VoiceAppKitStatusOptions, VoiceAppKitStatusReport, VoiceAppKitSurface } from './appKit';
|
|
58
58
|
export type { VoiceCampaign, VoiceCampaignAttempt, VoiceCampaignAttemptResultInput, VoiceCampaignAttemptStatus, VoiceCampaignCreateInput, VoiceCampaignDialer, VoiceCampaignDialerInput, VoiceCampaignDialerResult, VoiceCampaignProofOptions, VoiceCampaignProofReport, VoiceCampaignRecipient, VoiceCampaignRecipientInput, VoiceCampaignRecipientStatus, VoiceCampaignRecord, VoiceCampaignRoutesOptions, VoiceCampaignRuntime, VoiceCampaignRuntimeOptions, VoiceCampaignStatus, VoiceCampaignStore, VoiceCampaignSummary, VoiceCampaignTickResult } from './campaign';
|
|
59
|
+
export type { VoiceCampaignDialerProofCarrierRequest, VoiceCampaignDialerProofOptions, VoiceCampaignDialerProofProvider, VoiceCampaignDialerProofProviderResult, VoiceCampaignDialerProofReport, VoiceCampaignDialerProofStatus, VoicePlivoCampaignDialerOptions, VoiceTelnyxCampaignDialerOptions, VoiceTwilioCampaignDialerOptions } from './campaignDialers';
|
|
59
60
|
export type { VoiceBargeInReport, VoiceBargeInRoutesOptions } from './bargeInRoutes';
|
|
60
61
|
export type { VoiceAssistant, VoiceAssistantArtifactPlan, VoiceAssistantExperiment, VoiceAssistantExperimentOptions, VoiceAssistantGuardrailInput, VoiceAssistantGuardrails, VoiceAssistantMemoryLifecycle, VoiceAssistantMemoryLifecycleInput, VoiceAssistantOptions, VoiceAssistantOutputGuardrailInput, VoiceAssistantPreset, VoiceAssistantRunsSummary, VoiceAssistantRunSummary, VoiceAssistantVariant } from './assistant';
|
|
61
62
|
export type { VoiceAssistantHealthFailure, VoiceAssistantHealthHTMLHandlerOptions, VoiceAssistantHealthRoutesOptions, VoiceAssistantHealthSummary, VoiceAssistantHealthSummaryOptions } from './assistantHealth';
|
package/dist/index.js
CHANGED
|
@@ -11451,6 +11451,163 @@ var createVoicePlivoCampaignDialer = (options) => async (input) => {
|
|
|
11451
11451
|
status: "running"
|
|
11452
11452
|
};
|
|
11453
11453
|
};
|
|
11454
|
+
var campaignDialerProofProviders = [
|
|
11455
|
+
"twilio",
|
|
11456
|
+
"telnyx",
|
|
11457
|
+
"plivo"
|
|
11458
|
+
];
|
|
11459
|
+
var joinUrlPath = (origin, path) => `${origin.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
|
|
11460
|
+
var serializeProofRequestBody = (body) => {
|
|
11461
|
+
if (body instanceof URLSearchParams) {
|
|
11462
|
+
return Object.fromEntries(body.entries());
|
|
11463
|
+
}
|
|
11464
|
+
if (typeof body === "string") {
|
|
11465
|
+
try {
|
|
11466
|
+
return JSON.parse(body);
|
|
11467
|
+
} catch {
|
|
11468
|
+
return body;
|
|
11469
|
+
}
|
|
11470
|
+
}
|
|
11471
|
+
return body ? String(body) : undefined;
|
|
11472
|
+
};
|
|
11473
|
+
var createProofFetch = (provider, requests) => {
|
|
11474
|
+
let sequence = 0;
|
|
11475
|
+
return async (url, init) => {
|
|
11476
|
+
sequence += 1;
|
|
11477
|
+
requests.push({
|
|
11478
|
+
body: serializeProofRequestBody(init?.body),
|
|
11479
|
+
method: init?.method ?? "GET",
|
|
11480
|
+
provider,
|
|
11481
|
+
url: String(url)
|
|
11482
|
+
});
|
|
11483
|
+
const externalCallId = `dry-run-${provider}-${sequence}`;
|
|
11484
|
+
const payload = provider === "twilio" ? { sid: externalCallId } : provider === "telnyx" ? { data: { call_control_id: externalCallId } } : { request_uuid: externalCallId };
|
|
11485
|
+
return Response.json(payload);
|
|
11486
|
+
};
|
|
11487
|
+
};
|
|
11488
|
+
var createProofDialer = (input) => {
|
|
11489
|
+
const fetch2 = createProofFetch(input.provider, input.requests);
|
|
11490
|
+
if (input.provider === "twilio") {
|
|
11491
|
+
return createVoiceTwilioCampaignDialer({
|
|
11492
|
+
accountSid: "AC_dry_run",
|
|
11493
|
+
answerUrl: joinUrlPath(input.baseUrl, "/api/twilio/voice"),
|
|
11494
|
+
apiBaseUrl: "https://twilio.dry-run.absolutejs.local",
|
|
11495
|
+
authToken: "dry-run-token",
|
|
11496
|
+
fetch: fetch2,
|
|
11497
|
+
from: input.from,
|
|
11498
|
+
statusCallbackEvents: ["answered", "completed"],
|
|
11499
|
+
statusCallbackUrl: joinUrlPath(input.baseUrl, "/api/telephony-webhook")
|
|
11500
|
+
});
|
|
11501
|
+
}
|
|
11502
|
+
if (input.provider === "telnyx") {
|
|
11503
|
+
return createVoiceTelnyxCampaignDialer({
|
|
11504
|
+
apiBaseUrl: "https://telnyx.dry-run.absolutejs.local",
|
|
11505
|
+
apiKey: "dry-run-token",
|
|
11506
|
+
connectionId: "dry-run-connection",
|
|
11507
|
+
fetch: fetch2,
|
|
11508
|
+
from: input.from,
|
|
11509
|
+
webhookUrl: joinUrlPath(input.baseUrl, "/api/telnyx/webhook")
|
|
11510
|
+
});
|
|
11511
|
+
}
|
|
11512
|
+
return createVoicePlivoCampaignDialer({
|
|
11513
|
+
answerUrl: joinUrlPath(input.baseUrl, "/api/plivo/voice"),
|
|
11514
|
+
apiBaseUrl: "https://plivo.dry-run.absolutejs.local",
|
|
11515
|
+
authId: "dry-run-auth-id",
|
|
11516
|
+
authToken: "dry-run-token",
|
|
11517
|
+
callbackUrl: joinUrlPath(input.baseUrl, "/api/plivo/webhook"),
|
|
11518
|
+
fetch: fetch2,
|
|
11519
|
+
from: input.from
|
|
11520
|
+
});
|
|
11521
|
+
};
|
|
11522
|
+
var runCampaignDialerProofForProvider = async (input) => {
|
|
11523
|
+
const carrierRequests = [];
|
|
11524
|
+
const runtime = createVoiceCampaign({
|
|
11525
|
+
dialer: createProofDialer({
|
|
11526
|
+
baseUrl: input.baseUrl,
|
|
11527
|
+
from: input.from,
|
|
11528
|
+
provider: input.provider,
|
|
11529
|
+
requests: carrierRequests
|
|
11530
|
+
}),
|
|
11531
|
+
store: input.store
|
|
11532
|
+
});
|
|
11533
|
+
const proof = await runVoiceCampaignProof({
|
|
11534
|
+
campaign: {
|
|
11535
|
+
description: "Dry-run carrier dialer proof with campaign metadata and webhook outcome resolution.",
|
|
11536
|
+
id: `campaign-dialer-proof-${input.provider}-${crypto.randomUUID()}`,
|
|
11537
|
+
metadata: {
|
|
11538
|
+
mode: "dry-run",
|
|
11539
|
+
provider: input.provider
|
|
11540
|
+
},
|
|
11541
|
+
name: `AbsoluteJS Voice ${input.provider} Campaign Dialer Proof`
|
|
11542
|
+
},
|
|
11543
|
+
completeAttempts: false,
|
|
11544
|
+
recipients: [
|
|
11545
|
+
{
|
|
11546
|
+
id: `dialer-proof-${input.provider}-recipient`,
|
|
11547
|
+
metadata: {
|
|
11548
|
+
provider: input.provider,
|
|
11549
|
+
source: "campaign-dialer-proof"
|
|
11550
|
+
},
|
|
11551
|
+
name: `${input.provider} dry-run recipient`,
|
|
11552
|
+
phone: "+15550001001"
|
|
11553
|
+
}
|
|
11554
|
+
],
|
|
11555
|
+
runtime
|
|
11556
|
+
});
|
|
11557
|
+
const outcomes = await Promise.all(proof.tick.started.map((attempt) => applyVoiceCampaignTelephonyOutcome({
|
|
11558
|
+
decision: {
|
|
11559
|
+
action: "complete",
|
|
11560
|
+
confidence: "high",
|
|
11561
|
+
disposition: "completed",
|
|
11562
|
+
source: "status"
|
|
11563
|
+
},
|
|
11564
|
+
event: {
|
|
11565
|
+
metadata: {
|
|
11566
|
+
attemptId: attempt.id,
|
|
11567
|
+
campaignId: attempt.campaignId,
|
|
11568
|
+
externalCallId: attempt.externalCallId,
|
|
11569
|
+
voiceCampaignAttemptId: attempt.id,
|
|
11570
|
+
voiceCampaignId: attempt.campaignId
|
|
11571
|
+
},
|
|
11572
|
+
provider: input.provider,
|
|
11573
|
+
status: "completed"
|
|
11574
|
+
}
|
|
11575
|
+
}, {
|
|
11576
|
+
runtime
|
|
11577
|
+
})));
|
|
11578
|
+
return {
|
|
11579
|
+
campaignId: proof.campaign.campaign.id,
|
|
11580
|
+
carrierRequests,
|
|
11581
|
+
final: await runtime.get(proof.campaign.campaign.id),
|
|
11582
|
+
outcomes,
|
|
11583
|
+
provider: input.provider,
|
|
11584
|
+
tick: proof.tick
|
|
11585
|
+
};
|
|
11586
|
+
};
|
|
11587
|
+
var getVoiceCampaignDialerProofStatus = (options = {}) => ({
|
|
11588
|
+
generatedAt: Date.now(),
|
|
11589
|
+
mode: "dry-run",
|
|
11590
|
+
ok: true,
|
|
11591
|
+
providers: options.providers ?? campaignDialerProofProviders,
|
|
11592
|
+
runPath: options.runPath,
|
|
11593
|
+
safe: true
|
|
11594
|
+
});
|
|
11595
|
+
var runVoiceCampaignDialerProof = async (options = {}) => {
|
|
11596
|
+
const providers = options.providers ?? campaignDialerProofProviders;
|
|
11597
|
+
const store = options.store ?? createVoiceMemoryCampaignStore();
|
|
11598
|
+
const results = await Promise.all(providers.map((provider) => runCampaignDialerProofForProvider({
|
|
11599
|
+
baseUrl: options.baseUrl ?? "http://localhost",
|
|
11600
|
+
from: options.from ?? "+15550009999",
|
|
11601
|
+
provider,
|
|
11602
|
+
store
|
|
11603
|
+
})));
|
|
11604
|
+
return {
|
|
11605
|
+
generatedAt: Date.now(),
|
|
11606
|
+
mode: "dry-run",
|
|
11607
|
+
ok: results.every((result) => result.carrierRequests.length > 0 && result.outcomes.every((outcome) => outcome.applied)),
|
|
11608
|
+
providers: results
|
|
11609
|
+
};
|
|
11610
|
+
};
|
|
11454
11611
|
// src/simulationSuite.ts
|
|
11455
11612
|
import { Elysia as Elysia20 } from "elysia";
|
|
11456
11613
|
|
|
@@ -13533,7 +13690,7 @@ var resolveTwilioStreamParameters = async (parameters, input) => {
|
|
|
13533
13690
|
}
|
|
13534
13691
|
return parameters;
|
|
13535
13692
|
};
|
|
13536
|
-
var
|
|
13693
|
+
var joinUrlPath2 = (origin, path) => `${origin.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
|
|
13537
13694
|
var escapeHtml25 = (value) => value.replaceAll("&", "&").replaceAll('"', """).replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">");
|
|
13538
13695
|
var getWebhookVerificationUrl = (webhook, input) => {
|
|
13539
13696
|
if (!webhook?.verificationUrl) {
|
|
@@ -13547,8 +13704,8 @@ var getWebhookVerificationUrl = (webhook, input) => {
|
|
|
13547
13704
|
var buildTwilioVoiceSetupStatus = async (options, input) => {
|
|
13548
13705
|
const origin = resolveRequestOrigin(input.request);
|
|
13549
13706
|
const stream = await resolveTwilioStreamUrl(options, input);
|
|
13550
|
-
const twiml =
|
|
13551
|
-
const webhook =
|
|
13707
|
+
const twiml = joinUrlPath2(origin, input.twimlPath);
|
|
13708
|
+
const webhook = joinUrlPath2(origin, input.webhookPath);
|
|
13552
13709
|
const verificationUrl = getWebhookVerificationUrl(options.webhook, input);
|
|
13553
13710
|
const missing = Object.entries(options.setup?.requiredEnv ?? {}).filter((entry) => !entry[1]).map(([name]) => name);
|
|
13554
13711
|
const signingConfigured = Boolean(options.webhook?.signingSecret || options.webhook?.verify);
|
|
@@ -14215,7 +14372,7 @@ var createTwilioVoiceRoutes = (options) => {
|
|
|
14215
14372
|
// src/telephony/plivo.ts
|
|
14216
14373
|
var escapeXml3 = (value) => value.replaceAll("&", "&").replaceAll('"', """).replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">");
|
|
14217
14374
|
var escapeHtml26 = (value) => value.replaceAll("&", "&").replaceAll('"', """).replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">");
|
|
14218
|
-
var
|
|
14375
|
+
var joinUrlPath3 = (origin, path) => `${origin.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
|
|
14219
14376
|
var resolveRequestOrigin2 = (request) => {
|
|
14220
14377
|
const url = new URL(request.url);
|
|
14221
14378
|
const forwardedHost = request.headers.get("x-forwarded-host");
|
|
@@ -14436,8 +14593,8 @@ var verifyVoicePlivoWebhookSignature = async (input) => {
|
|
|
14436
14593
|
var buildPlivoVoiceSetupStatus = async (options, input) => {
|
|
14437
14594
|
const origin = resolveRequestOrigin2(input.request);
|
|
14438
14595
|
const stream = await resolvePlivoStreamUrl(options, input);
|
|
14439
|
-
const answer =
|
|
14440
|
-
const webhook =
|
|
14596
|
+
const answer = joinUrlPath3(origin, input.answerPath);
|
|
14597
|
+
const webhook = joinUrlPath3(origin, input.webhookPath);
|
|
14441
14598
|
const missing = Object.entries(options.setup?.requiredEnv ?? {}).filter((entry) => !entry[1]).map(([name]) => name);
|
|
14442
14599
|
const signingConfigured = Boolean(options.webhook?.authToken || options.webhook?.verify);
|
|
14443
14600
|
const warnings = [
|
|
@@ -14688,7 +14845,7 @@ import { Buffer as Buffer6 } from "buffer";
|
|
|
14688
14845
|
import { Elysia as Elysia27 } from "elysia";
|
|
14689
14846
|
var escapeXml4 = (value) => value.replaceAll("&", "&").replaceAll('"', """).replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">");
|
|
14690
14847
|
var escapeHtml27 = (value) => value.replaceAll("&", "&").replaceAll('"', """).replaceAll("'", "'").replaceAll("<", "<").replaceAll(">", ">");
|
|
14691
|
-
var
|
|
14848
|
+
var joinUrlPath4 = (origin, path) => `${origin.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
|
|
14692
14849
|
var resolveRequestOrigin3 = (request) => {
|
|
14693
14850
|
const url = new URL(request.url);
|
|
14694
14851
|
const forwardedHost = request.headers.get("x-forwarded-host");
|
|
@@ -14860,8 +15017,8 @@ var verifyVoiceTelnyxWebhookSignature = async (input) => {
|
|
|
14860
15017
|
var buildTelnyxVoiceSetupStatus = async (options, input) => {
|
|
14861
15018
|
const origin = resolveRequestOrigin3(input.request);
|
|
14862
15019
|
const stream = await resolveTelnyxStreamUrl(options, input);
|
|
14863
|
-
const texml =
|
|
14864
|
-
const webhook =
|
|
15020
|
+
const texml = joinUrlPath4(origin, input.texmlPath);
|
|
15021
|
+
const webhook = joinUrlPath4(origin, input.webhookPath);
|
|
14865
15022
|
const missing = Object.entries(options.setup?.requiredEnv ?? {}).filter((entry) => !entry[1]).map(([name]) => name);
|
|
14866
15023
|
const signingConfigured = Boolean(options.webhook?.publicKey || options.webhook?.verify);
|
|
14867
15024
|
const warnings = [
|
|
@@ -19460,6 +19617,7 @@ export {
|
|
|
19460
19617
|
runVoiceScenarioEvals,
|
|
19461
19618
|
runVoiceOutcomeContractSuite,
|
|
19462
19619
|
runVoiceCampaignProof,
|
|
19620
|
+
runVoiceCampaignDialerProof,
|
|
19463
19621
|
resolveVoiceTraceRedactionOptions,
|
|
19464
19622
|
resolveVoiceTelephonyOutcome,
|
|
19465
19623
|
resolveVoiceSTTRoutingStrategy,
|
|
@@ -19519,6 +19677,7 @@ export {
|
|
|
19519
19677
|
isVoiceOpsTaskOverdue,
|
|
19520
19678
|
heartbeatVoiceOpsTask,
|
|
19521
19679
|
hasVoiceOpsTaskSLABreach,
|
|
19680
|
+
getVoiceCampaignDialerProofStatus,
|
|
19522
19681
|
filterVoiceTraceEvents,
|
|
19523
19682
|
failVoiceOpsTask,
|
|
19524
19683
|
exportVoiceTrace,
|