@absolutejs/voice 0.0.22-beta.257 → 0.0.22-beta.258

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.
@@ -190,6 +190,26 @@ export type VoiceCampaignReadinessProofReport = {
190
190
  windowBlocked: VoiceCampaignTickResult;
191
191
  };
192
192
  };
193
+ export type VoiceCampaignReadinessAssertionInput = {
194
+ maxFailedChecks?: number;
195
+ minAcceptedImports?: number;
196
+ minRejectedImports?: number;
197
+ minTotalImports?: number;
198
+ requiredBlockedReasons?: VoiceCampaignTickResult['blocked'][number]['reason'][];
199
+ requiredChecks?: string[];
200
+ requireOk?: boolean;
201
+ };
202
+ export type VoiceCampaignReadinessAssertionReport = {
203
+ acceptedImports: number;
204
+ blockedReasons: VoiceCampaignTickResult['blocked'][number]['reason'][];
205
+ failed: number;
206
+ issues: string[];
207
+ ok: boolean;
208
+ passed: number;
209
+ rejectedImports: number;
210
+ total: number;
211
+ totalImports: number;
212
+ };
193
213
  export type VoiceCampaignSummary = {
194
214
  attempts: {
195
215
  failed: number;
@@ -381,6 +401,8 @@ export declare const applyVoiceCampaignTelephonyOutcome: <TResult = unknown>(inp
381
401
  export declare const createVoiceCampaignTelephonyOutcomeHandler: <TResult = unknown>(options: VoiceCampaignTelephonyOutcomeOptions<TResult>) => (input: VoiceTelephonyWebhookDecision<TResult>) => Promise<VoiceCampaignTelephonyOutcomeResult>;
382
402
  export declare const runVoiceCampaignProof: (options?: VoiceCampaignProofOptions) => Promise<VoiceCampaignProofReport>;
383
403
  export declare const runVoiceCampaignReadinessProof: (options?: VoiceCampaignReadinessProofOptions) => Promise<VoiceCampaignReadinessProofReport>;
404
+ export declare const evaluateVoiceCampaignReadinessEvidence: (report: VoiceCampaignReadinessProofReport, input?: VoiceCampaignReadinessAssertionInput) => VoiceCampaignReadinessAssertionReport;
405
+ export declare const assertVoiceCampaignReadinessEvidence: (report: VoiceCampaignReadinessProofReport, input?: VoiceCampaignReadinessAssertionInput) => VoiceCampaignReadinessAssertionReport;
384
406
  export declare const renderVoiceCampaignsHTML: (records: VoiceCampaignRecord[], options?: Pick<VoiceCampaignRoutesOptions, "operationsRecordHref" | "title">) => string;
385
407
  export declare const renderVoiceCampaignObservabilityHTML: (report: VoiceCampaignObservabilityReport, options?: {
386
408
  title?: string;
@@ -82,9 +82,30 @@ export type VoiceCampaignDialerProofOptions = {
82
82
  runPath?: string;
83
83
  store?: VoiceCampaignStore;
84
84
  };
85
+ export type VoiceCampaignDialerProofAssertionInput = {
86
+ maxFailedProviders?: number;
87
+ minCarrierRequests?: number;
88
+ minProviders?: number;
89
+ minSuccessfulOutcomes?: number;
90
+ requiredProviders?: VoiceCampaignDialerProofProvider[];
91
+ requireDryRun?: boolean;
92
+ requireOk?: boolean;
93
+ };
94
+ export type VoiceCampaignDialerProofAssertionReport = {
95
+ carrierRequests: number;
96
+ failedProviders: number;
97
+ issues: string[];
98
+ mode: VoiceCampaignDialerProofReport['mode'];
99
+ ok: boolean;
100
+ providers: VoiceCampaignDialerProofProvider[];
101
+ successfulOutcomes: number;
102
+ totalProviders: number;
103
+ };
85
104
  export declare const createVoiceTwilioCampaignDialer: (options: VoiceTwilioCampaignDialerOptions) => VoiceCampaignDialer;
86
105
  export declare const createVoiceTelnyxCampaignDialer: (options: VoiceTelnyxCampaignDialerOptions) => VoiceCampaignDialer;
87
106
  export declare const createVoicePlivoCampaignDialer: (options: VoicePlivoCampaignDialerOptions) => VoiceCampaignDialer;
88
107
  export declare const getVoiceCampaignDialerProofStatus: (options?: Pick<VoiceCampaignDialerProofOptions, "providers" | "runPath">) => VoiceCampaignDialerProofStatus;
89
108
  export declare const runVoiceCampaignDialerProof: (options?: VoiceCampaignDialerProofOptions) => Promise<VoiceCampaignDialerProofReport>;
109
+ export declare const evaluateVoiceCampaignDialerProofEvidence: (report: VoiceCampaignDialerProofReport, input?: VoiceCampaignDialerProofAssertionInput) => VoiceCampaignDialerProofAssertionReport;
110
+ export declare const assertVoiceCampaignDialerProofEvidence: (report: VoiceCampaignDialerProofReport, input?: VoiceCampaignDialerProofAssertionInput) => VoiceCampaignDialerProofAssertionReport;
90
111
  export {};
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { voice } from './plugin';
2
- export { applyVoiceCampaignTelephonyOutcome, buildVoiceCampaignObservabilityReport, createVoiceCampaignTelephonyOutcomeHandler, createVoiceCampaign, createVoiceCampaignRoutes, createVoiceCampaignWorker, createVoiceCampaignWorkerLoop, createVoiceMemoryCampaignStore, importVoiceCampaignRecipients, renderVoiceCampaignObservabilityHTML, renderVoiceCampaignsHTML, runVoiceCampaignProof, runVoiceCampaignReadinessProof, summarizeVoiceCampaigns } from './campaign';
3
- export { createVoicePlivoCampaignDialer, createVoiceTelnyxCampaignDialer, createVoiceTwilioCampaignDialer, getVoiceCampaignDialerProofStatus, runVoiceCampaignDialerProof } from './campaignDialers';
2
+ export { applyVoiceCampaignTelephonyOutcome, assertVoiceCampaignReadinessEvidence, buildVoiceCampaignObservabilityReport, createVoiceCampaignTelephonyOutcomeHandler, createVoiceCampaign, createVoiceCampaignRoutes, createVoiceCampaignWorker, createVoiceCampaignWorkerLoop, createVoiceMemoryCampaignStore, evaluateVoiceCampaignReadinessEvidence, importVoiceCampaignRecipients, renderVoiceCampaignObservabilityHTML, renderVoiceCampaignsHTML, runVoiceCampaignProof, runVoiceCampaignReadinessProof, summarizeVoiceCampaigns } from './campaign';
3
+ export { assertVoiceCampaignDialerProofEvidence, createVoicePlivoCampaignDialer, createVoiceTelnyxCampaignDialer, createVoiceTwilioCampaignDialer, evaluateVoiceCampaignDialerProofEvidence, getVoiceCampaignDialerProofStatus, runVoiceCampaignDialerProof } from './campaignDialers';
4
4
  export { createVoiceAssistant, createVoiceExperiment, summarizeVoiceAssistantRuns } from './assistant';
5
5
  export { createVoiceAssistantHealthHTMLHandler, createVoiceAssistantHealthJSONHandler, createVoiceAssistantHealthRoutes, renderVoiceAssistantHealthHTML, summarizeVoiceAssistantHealth } from './assistantHealth';
6
6
  export { createVoiceAuditEvent, createVoiceAuditLogger, createVoiceMemoryAuditEventStore, filterVoiceAuditEvents, recordVoiceAuditEvent, recordVoiceHandoffAuditEvent, recordVoiceOperatorAuditEvent, recordVoiceProviderAuditEvent, recordVoiceRetentionAuditEvent, recordVoiceToolAuditEvent } from './audit';
@@ -92,8 +92,8 @@ export { conditionAudioChunk, resolveAudioConditioningConfig } from './audioCond
92
92
  export { resolveVoiceRuntimePreset } from './presets';
93
93
  export { resolveTurnDetectionConfig, TURN_PROFILE_DEFAULTS } from './turnProfiles';
94
94
  export { createVoiceCallReviewFromLiveTelephonyReport, createVoiceCallReviewRecorder, renderVoiceCallReviewHTML, renderVoiceCallReviewMarkdown } from './testing/review';
95
- export type { VoiceCampaign, VoiceCampaignAttempt, VoiceCampaignAttemptResultInput, VoiceCampaignAttemptStatus, VoiceCampaignCreateInput, VoiceCampaignDialer, VoiceCampaignDialerInput, VoiceCampaignDialerResult, VoiceCampaignProofOptions, VoiceCampaignProofReport, VoiceCampaignReadinessCheck, VoiceCampaignReadinessProofOptions, VoiceCampaignReadinessProofReport, VoiceCampaignRecipient, VoiceCampaignRecipientImportIssue, VoiceCampaignRecipientImportIssueCode, VoiceCampaignRecipientImportOptions, VoiceCampaignRecipientImportResult, VoiceCampaignRecipientImportRow, VoiceCampaignRecipientInput, VoiceCampaignRecipientStatus, VoiceCampaignRecord, VoiceCampaignRoutesOptions, VoiceCampaignRuntime, VoiceCampaignRuntimeOptions, VoiceCampaignRateLimit, VoiceCampaignRetryPolicy, VoiceCampaignSchedule, VoiceCampaignStatus, VoiceCampaignStore, VoiceCampaignSummary, VoiceCampaignTimeWindow, VoiceCampaignTickResult } from './campaign';
96
- export type { VoiceCampaignDialerProofCarrierRequest, VoiceCampaignDialerProofOptions, VoiceCampaignDialerProofProvider, VoiceCampaignDialerProofProviderResult, VoiceCampaignDialerProofReport, VoiceCampaignDialerProofStatus, VoicePlivoCampaignDialerOptions, VoiceTelnyxCampaignDialerOptions, VoiceTwilioCampaignDialerOptions } from './campaignDialers';
95
+ export type { VoiceCampaign, VoiceCampaignAttempt, VoiceCampaignAttemptResultInput, VoiceCampaignAttemptStatus, VoiceCampaignCreateInput, VoiceCampaignDialer, VoiceCampaignDialerInput, VoiceCampaignDialerResult, VoiceCampaignProofOptions, VoiceCampaignProofReport, VoiceCampaignReadinessAssertionInput, VoiceCampaignReadinessAssertionReport, VoiceCampaignReadinessCheck, VoiceCampaignReadinessProofOptions, VoiceCampaignReadinessProofReport, VoiceCampaignRecipient, VoiceCampaignRecipientImportIssue, VoiceCampaignRecipientImportIssueCode, VoiceCampaignRecipientImportOptions, VoiceCampaignRecipientImportResult, VoiceCampaignRecipientImportRow, VoiceCampaignRecipientInput, VoiceCampaignRecipientStatus, VoiceCampaignRecord, VoiceCampaignRoutesOptions, VoiceCampaignRuntime, VoiceCampaignRuntimeOptions, VoiceCampaignRateLimit, VoiceCampaignRetryPolicy, VoiceCampaignSchedule, VoiceCampaignStatus, VoiceCampaignStore, VoiceCampaignSummary, VoiceCampaignTimeWindow, VoiceCampaignTickResult } from './campaign';
96
+ export type { VoiceCampaignDialerProofAssertionInput, VoiceCampaignDialerProofAssertionReport, VoiceCampaignDialerProofCarrierRequest, VoiceCampaignDialerProofOptions, VoiceCampaignDialerProofProvider, VoiceCampaignDialerProofProviderResult, VoiceCampaignDialerProofReport, VoiceCampaignDialerProofStatus, VoicePlivoCampaignDialerOptions, VoiceTelnyxCampaignDialerOptions, VoiceTwilioCampaignDialerOptions } from './campaignDialers';
97
97
  export type { VoiceBargeInReport, VoiceBargeInRoutesOptions } from './bargeInRoutes';
98
98
  export type { VoiceAssistant, VoiceAssistantArtifactPlan, VoiceAssistantExperiment, VoiceAssistantExperimentOptions, VoiceAssistantGuardrailInput, VoiceAssistantGuardrails, VoiceAssistantMemoryLifecycle, VoiceAssistantMemoryLifecycleInput, VoiceAssistantOptions, VoiceAssistantOutputGuardrailInput, VoiceAssistantPreset, VoiceAssistantRunsSummary, VoiceAssistantRunSummary, VoiceAssistantVariant } from './assistant';
99
99
  export type { VoiceAssistantHealthFailure, VoiceAssistantHealthHTMLHandlerOptions, VoiceAssistantHealthRoutesOptions, VoiceAssistantHealthSummary, VoiceAssistantHealthSummaryOptions } from './assistantHealth';
package/dist/index.js CHANGED
@@ -6661,6 +6661,60 @@ recipient-no-consent,Barbara,+15550001004,no,delta`,
6661
6661
  }
6662
6662
  };
6663
6663
  };
6664
+ var evaluateVoiceCampaignReadinessEvidence = (report, input = {}) => {
6665
+ const issues = [];
6666
+ const maxFailedChecks = input.maxFailedChecks ?? 0;
6667
+ const requireOk = input.requireOk ?? true;
6668
+ const failed = report.checks.filter((check) => check.status === "fail").length;
6669
+ const passed = report.checks.length - failed;
6670
+ const checkNames = new Set(report.checks.map((check) => check.name));
6671
+ const blockedReasons = [
6672
+ ...new Set(Object.values(report.ticks).flatMap((tick) => tick.blocked.map((block) => block.reason)))
6673
+ ].sort();
6674
+ if (requireOk && !report.ok) {
6675
+ issues.push("Expected campaign readiness proof to pass.");
6676
+ }
6677
+ if (failed > maxFailedChecks) {
6678
+ issues.push(`Expected at most ${String(maxFailedChecks)} failing campaign readiness check(s), found ${String(failed)}.`);
6679
+ }
6680
+ if (input.minTotalImports !== undefined && report.import.total < input.minTotalImports) {
6681
+ issues.push(`Expected at least ${String(input.minTotalImports)} campaign import row(s), found ${String(report.import.total)}.`);
6682
+ }
6683
+ if (input.minAcceptedImports !== undefined && report.import.accepted.length < input.minAcceptedImports) {
6684
+ issues.push(`Expected at least ${String(input.minAcceptedImports)} accepted campaign import(s), found ${String(report.import.accepted.length)}.`);
6685
+ }
6686
+ if (input.minRejectedImports !== undefined && report.import.rejected.length < input.minRejectedImports) {
6687
+ issues.push(`Expected at least ${String(input.minRejectedImports)} rejected campaign import(s), found ${String(report.import.rejected.length)}.`);
6688
+ }
6689
+ for (const check of input.requiredChecks ?? []) {
6690
+ if (!checkNames.has(check)) {
6691
+ issues.push(`Missing campaign readiness check: ${check}.`);
6692
+ }
6693
+ }
6694
+ for (const reason of input.requiredBlockedReasons ?? []) {
6695
+ if (!blockedReasons.includes(reason)) {
6696
+ issues.push(`Missing campaign readiness blocked reason: ${reason}.`);
6697
+ }
6698
+ }
6699
+ return {
6700
+ acceptedImports: report.import.accepted.length,
6701
+ blockedReasons,
6702
+ failed,
6703
+ issues,
6704
+ ok: issues.length === 0,
6705
+ passed,
6706
+ rejectedImports: report.import.rejected.length,
6707
+ total: report.checks.length,
6708
+ totalImports: report.import.total
6709
+ };
6710
+ };
6711
+ var assertVoiceCampaignReadinessEvidence = (report, input = {}) => {
6712
+ const assertion = evaluateVoiceCampaignReadinessEvidence(report, input);
6713
+ if (!assertion.ok) {
6714
+ throw new Error(`Voice campaign readiness evidence assertion failed: ${assertion.issues.join(" ")}`);
6715
+ }
6716
+ return assertion;
6717
+ };
6664
6718
  var escapeHtml3 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
6665
6719
  var getString = (value) => typeof value === "string" && value.length > 0 ? value : undefined;
6666
6720
  var campaignAttemptSessionId = (attempt) => getString(attempt.metadata?.sessionId) ?? getString(attempt.metadata?.voiceSessionId) ?? getString(attempt.metadata?.callSessionId);
@@ -7094,6 +7148,56 @@ var runVoiceCampaignDialerProof = async (options = {}) => {
7094
7148
  providers: results
7095
7149
  };
7096
7150
  };
7151
+ var evaluateVoiceCampaignDialerProofEvidence = (report, input = {}) => {
7152
+ const issues = [];
7153
+ const maxFailedProviders = input.maxFailedProviders ?? 0;
7154
+ const requireOk = input.requireOk ?? true;
7155
+ const requireDryRun = input.requireDryRun ?? true;
7156
+ const providers = report.providers.map((provider) => provider.provider).sort();
7157
+ const carrierRequests = report.providers.reduce((total, provider) => total + provider.carrierRequests.length, 0);
7158
+ const successfulOutcomes = report.providers.reduce((total, provider) => total + provider.outcomes.filter((outcome) => outcome.applied).length, 0);
7159
+ const failedProviders = report.providers.filter((provider) => provider.carrierRequests.length === 0 || provider.outcomes.some((outcome) => !outcome.applied)).length;
7160
+ if (requireOk && !report.ok) {
7161
+ issues.push("Expected campaign dialer proof to pass.");
7162
+ }
7163
+ if (requireDryRun && report.mode !== "dry-run") {
7164
+ issues.push(`Expected campaign dialer proof mode dry-run, found ${report.mode}.`);
7165
+ }
7166
+ if (failedProviders > maxFailedProviders) {
7167
+ issues.push(`Expected at most ${String(maxFailedProviders)} failing campaign dialer provider(s), found ${String(failedProviders)}.`);
7168
+ }
7169
+ if (input.minProviders !== undefined && report.providers.length < input.minProviders) {
7170
+ issues.push(`Expected at least ${String(input.minProviders)} campaign dialer provider(s), found ${String(report.providers.length)}.`);
7171
+ }
7172
+ if (input.minCarrierRequests !== undefined && carrierRequests < input.minCarrierRequests) {
7173
+ issues.push(`Expected at least ${String(input.minCarrierRequests)} campaign dialer carrier request(s), found ${String(carrierRequests)}.`);
7174
+ }
7175
+ if (input.minSuccessfulOutcomes !== undefined && successfulOutcomes < input.minSuccessfulOutcomes) {
7176
+ issues.push(`Expected at least ${String(input.minSuccessfulOutcomes)} applied campaign dialer outcome(s), found ${String(successfulOutcomes)}.`);
7177
+ }
7178
+ for (const provider of input.requiredProviders ?? []) {
7179
+ if (!providers.includes(provider)) {
7180
+ issues.push(`Missing campaign dialer provider: ${provider}.`);
7181
+ }
7182
+ }
7183
+ return {
7184
+ carrierRequests,
7185
+ failedProviders,
7186
+ issues,
7187
+ mode: report.mode,
7188
+ ok: issues.length === 0,
7189
+ providers,
7190
+ successfulOutcomes,
7191
+ totalProviders: report.providers.length
7192
+ };
7193
+ };
7194
+ var assertVoiceCampaignDialerProofEvidence = (report, input = {}) => {
7195
+ const assertion = evaluateVoiceCampaignDialerProofEvidence(report, input);
7196
+ if (!assertion.ok) {
7197
+ throw new Error(`Voice campaign dialer proof evidence assertion failed: ${assertion.issues.join(" ")}`);
7198
+ }
7199
+ return assertion;
7200
+ };
7097
7201
  // src/audit.ts
7098
7202
  var includes = (filter, value) => {
7099
7203
  if (!filter) {
@@ -30922,6 +31026,8 @@ export {
30922
31026
  evaluateVoiceObservabilityExportReplayEvidence,
30923
31027
  evaluateVoiceObservabilityExportDeliveryEvidence,
30924
31028
  evaluateVoiceGuardrailPolicy,
31029
+ evaluateVoiceCampaignReadinessEvidence,
31030
+ evaluateVoiceCampaignDialerProofEvidence,
30925
31031
  evaluateVoiceAgentSquadContractEvidence,
30926
31032
  encodeTwilioMulawBase64,
30927
31033
  deliverVoiceTraceEventsToSinks,
@@ -31251,6 +31357,8 @@ export {
31251
31357
  assertVoiceObservabilityExportRecord,
31252
31358
  assertVoiceObservabilityExportDeliveryEvidence,
31253
31359
  assertVoiceLatencySLOGate,
31360
+ assertVoiceCampaignReadinessEvidence,
31361
+ assertVoiceCampaignDialerProofEvidence,
31254
31362
  assertVoiceAgentSquadContractEvidence,
31255
31363
  assertVoiceAgentSquadContract,
31256
31364
  applyVoiceTelephonyOutcome,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.257",
3
+ "version": "0.0.22-beta.258",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",