@absolutejs/voice 0.0.22-beta.256 → 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';
@@ -28,7 +28,7 @@ export type { VoiceDeliverySinkDescriptor, VoiceDeliverySinkDescriptorInput, Voi
28
28
  export type { VoiceOpsActionAuditRecord, VoiceOpsActionAuditRoutesOptions, VoiceOpsActionHistoryEntry, VoiceOpsActionHistoryReport } from './opsActionAuditRoutes';
29
29
  export type { VoiceDeliveryRuntime, VoiceDeliveryRuntimeAuditConfig, VoiceDeliveryRuntimeConfig, VoiceDeliveryRuntimeFilePresetOptions, VoiceDeliveryRuntimePresetLeaseConfig, VoiceDeliveryRuntimePresetMode, VoiceDeliveryRuntimePresetOptions, VoiceDeliveryRuntimeReport, VoiceDeliveryRuntimeRoutesOptions, VoiceDeliveryRuntimeS3PresetOptions, VoiceDeliveryRuntimeSummary, VoiceDeliveryRuntimeTickResult, VoiceDeliveryRuntimeTraceConfig, VoiceDeliveryRuntimeWebhookPresetOptions } from './deliveryRuntime';
30
30
  export { compareVoiceEvalBaseline, createVoiceFileEvalBaselineStore, createVoiceFileScenarioFixtureStore, createVoiceEvalRoutes, renderVoiceEvalBaselineHTML, renderVoiceEvalHTML, renderVoiceScenarioEvalHTML, renderVoiceScenarioFixtureEvalHTML, runVoiceScenarioEvals, runVoiceScenarioFixtureEvals, runVoiceSessionEvals } from './evalRoutes';
31
- export { createVoiceSimulationSuiteRoutes, renderVoiceSimulationSuiteHTML, runVoiceSimulationSuite } from './simulationSuite';
31
+ export { assertVoiceSimulationSuiteEvidence, createVoiceSimulationSuiteRoutes, evaluateVoiceSimulationSuiteEvidence, renderVoiceSimulationSuiteHTML, runVoiceSimulationSuite } from './simulationSuite';
32
32
  export { createVoiceWorkflowContract, createVoiceWorkflowContractHandler, createVoiceWorkflowContractPreset, createVoiceWorkflowScenario, recordVoiceWorkflowContractTrace, validateVoiceWorkflowRouteResult } from './workflowContract';
33
33
  export { createVoiceSessionListRoutes, createVoiceSessionReplayHTMLHandler, createVoiceSessionReplayJSONHandler, createVoiceSessionReplayRoutes, createVoiceSessionsHTMLHandler, createVoiceSessionsJSONHandler, renderVoiceSessionsHTML, summarizeVoiceProviderFallbackRecovery, summarizeVoiceSessions, summarizeVoiceSessionReplay } from './sessionReplay';
34
34
  export { createVoiceAgent, createVoiceAgentSquad, createVoiceAgentTool } from './agent';
@@ -92,15 +92,15 @@ 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';
100
100
  export type { VoiceAssistantMemoryBinding, VoiceAssistantMemoryHandle, VoiceAssistantMemoryOptions, VoiceAssistantMemoryRecord, VoiceAssistantMemoryStore } from './assistantMemory';
101
101
  export type { VoiceDiagnosticsRoutesOptions } from './diagnosticsRoutes';
102
102
  export type { VoiceEvalBaselineComparison, VoiceEvalBaselineComparisonOptions, VoiceEvalBaselineStore, VoiceEvalBaselineSummary, VoiceEvalLink, VoiceEvalReport, VoiceEvalRoutesOptions, VoiceEvalSessionReport, VoiceEvalStatus, VoiceEvalTrendBucket, VoiceScenarioEvalDefinition, VoiceScenarioEvalReport, VoiceScenarioEvalResult, VoiceScenarioEvalSessionResult, VoiceScenarioFixture, VoiceScenarioFixtureEvalReport, VoiceScenarioFixtureEvalResult, VoiceScenarioFixtureStore } from './evalRoutes';
103
- export type { VoiceSimulationSuiteEvalRoutesOptions, VoiceSimulationSuiteOptions, VoiceSimulationSuiteReport, VoiceSimulationSuiteRoutesOptions, VoiceSimulationSuiteSectionSummary, VoiceSimulationSuiteStatus } from './simulationSuite';
103
+ export type { VoiceSimulationSuiteAssertionInput, VoiceSimulationSuiteAssertionReport, VoiceSimulationSuiteEvalRoutesOptions, VoiceSimulationSuiteOptions, VoiceSimulationSuiteReport, VoiceSimulationSuiteRoutesOptions, VoiceSimulationSuiteSection, VoiceSimulationSuiteSectionSummary, VoiceSimulationSuiteStatus } from './simulationSuite';
104
104
  export type { VoiceWorkflowContract, VoiceWorkflowContractDefinition, VoiceWorkflowContractField, VoiceWorkflowContractFieldMatch, VoiceWorkflowContractPresetName, VoiceWorkflowContractPresetOptions, VoiceWorkflowContractTracePayload, VoiceWorkflowContractValidation, VoiceWorkflowContractValidationIssue, VoiceWorkflowOutcome } from './workflowContract';
105
105
  export type { VoiceSessionListHTMLHandlerOptions, VoiceSessionListItem, VoiceSessionListOptions, VoiceSessionListRoutesOptions, VoiceSessionListStatus, VoiceProviderFallbackRecoverySummary, VoiceSessionReplay, VoiceSessionReplayHTMLHandlerOptions, VoiceSessionReplayOptions, VoiceSessionReplayRoutesOptions, VoiceSessionReplayTurn } from './sessionReplay';
106
106
  export type { AnthropicVoiceAssistantModelOptions, GeminiVoiceAssistantModelOptions, OpenAIVoiceAssistantModelOptions, VoiceProviderRouterEvent, VoiceProviderRouterFallbackMode, VoiceProviderRouterHealthOptions, VoiceProviderRouterOptions, VoiceProviderRouterPolicy, VoiceProviderRouterPolicyPreset, VoiceProviderRouterPolicyWeights, VoiceProviderRouterProviderHealth, VoiceProviderRouterProviderProfile, VoiceProviderRouterStrategy, VoiceJSONAssistantModelHandler, VoiceJSONAssistantModelOptions } from './modelAdapters';
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) {
@@ -15280,6 +15384,61 @@ var runVoiceSimulationSuite = async (options) => {
15280
15384
  total: sections.length
15281
15385
  };
15282
15386
  };
15387
+ var simulationSectionNames = [
15388
+ "fixtures",
15389
+ "outcomes",
15390
+ "scenarios",
15391
+ "sessions",
15392
+ "tools"
15393
+ ];
15394
+ var evaluateVoiceSimulationSuiteEvidence = (report, input = {}) => {
15395
+ const issues = [];
15396
+ const maxFailed = input.maxFailed ?? 0;
15397
+ const maxActions = input.maxActions ?? 0;
15398
+ const sections = simulationSectionNames.filter((section) => report.summary[section] !== undefined);
15399
+ const sectionTotals = Object.fromEntries(sections.map((section) => [section, report.summary[section]?.total ?? 0]));
15400
+ if (report.failed > maxFailed) {
15401
+ issues.push(`Expected at most ${String(maxFailed)} failing simulation section(s), found ${String(report.failed)}.`);
15402
+ }
15403
+ if (report.actions.length > maxActions) {
15404
+ issues.push(`Expected at most ${String(maxActions)} simulation action(s), found ${String(report.actions.length)}.`);
15405
+ }
15406
+ if (input.minSections !== undefined && report.total < input.minSections) {
15407
+ issues.push(`Expected at least ${String(input.minSections)} simulation section(s), found ${String(report.total)}.`);
15408
+ }
15409
+ if (input.minPassed !== undefined && report.passed < input.minPassed) {
15410
+ issues.push(`Expected at least ${String(input.minPassed)} passing simulation section(s), found ${String(report.passed)}.`);
15411
+ }
15412
+ for (const section of input.requiredSections ?? []) {
15413
+ if (!sections.includes(section)) {
15414
+ issues.push(`Missing simulation section: ${section}.`);
15415
+ }
15416
+ }
15417
+ for (const [section, minimum] of Object.entries(input.sectionMinimums ?? {})) {
15418
+ const total = sectionTotals[section] ?? 0;
15419
+ if (total < minimum) {
15420
+ issues.push(`Expected simulation section ${section} to include at least ${String(minimum)} item(s), found ${String(total)}.`);
15421
+ }
15422
+ }
15423
+ return {
15424
+ actions: report.actions.length,
15425
+ failed: report.failed,
15426
+ issues,
15427
+ ok: issues.length === 0,
15428
+ passed: report.passed,
15429
+ sections,
15430
+ sectionTotals,
15431
+ status: report.status,
15432
+ total: report.total
15433
+ };
15434
+ };
15435
+ var assertVoiceSimulationSuiteEvidence = (report, input = {}) => {
15436
+ const assertion = evaluateVoiceSimulationSuiteEvidence(report, input);
15437
+ if (!assertion.ok) {
15438
+ throw new Error(`Voice simulation suite evidence assertion failed: ${assertion.issues.join(" ")}`);
15439
+ }
15440
+ return assertion;
15441
+ };
15283
15442
  var renderSection = (label, summary) => {
15284
15443
  if (!summary) {
15285
15444
  return "";
@@ -30852,6 +31011,7 @@ export {
30852
31011
  evaluateVoiceTrace,
30853
31012
  evaluateVoiceToolContractEvidence,
30854
31013
  evaluateVoiceTelephonyContract,
31014
+ evaluateVoiceSimulationSuiteEvidence,
30855
31015
  evaluateVoiceQuality,
30856
31016
  evaluateVoiceProviderStackGaps,
30857
31017
  evaluateVoiceProviderStackEvidence,
@@ -30866,6 +31026,8 @@ export {
30866
31026
  evaluateVoiceObservabilityExportReplayEvidence,
30867
31027
  evaluateVoiceObservabilityExportDeliveryEvidence,
30868
31028
  evaluateVoiceGuardrailPolicy,
31029
+ evaluateVoiceCampaignReadinessEvidence,
31030
+ evaluateVoiceCampaignDialerProofEvidence,
30869
31031
  evaluateVoiceAgentSquadContractEvidence,
30870
31032
  encodeTwilioMulawBase64,
30871
31033
  deliverVoiceTraceEventsToSinks,
@@ -31179,6 +31341,7 @@ export {
31179
31341
  buildEmptyVoiceProofTrendReport,
31180
31342
  assignVoiceOpsTask,
31181
31343
  assertVoiceToolContractEvidence,
31344
+ assertVoiceSimulationSuiteEvidence,
31182
31345
  assertVoiceProviderStackEvidence,
31183
31346
  assertVoiceProviderSloEvidence,
31184
31347
  assertVoiceProviderRoutingContractEvidence,
@@ -31194,6 +31357,8 @@ export {
31194
31357
  assertVoiceObservabilityExportRecord,
31195
31358
  assertVoiceObservabilityExportDeliveryEvidence,
31196
31359
  assertVoiceLatencySLOGate,
31360
+ assertVoiceCampaignReadinessEvidence,
31361
+ assertVoiceCampaignDialerProofEvidence,
31197
31362
  assertVoiceAgentSquadContractEvidence,
31198
31363
  assertVoiceAgentSquadContract,
31199
31364
  applyVoiceTelephonyOutcome,
@@ -39,6 +39,26 @@ export type VoiceSimulationSuiteSectionSummary = {
39
39
  status: VoiceSimulationSuiteStatus;
40
40
  total: number;
41
41
  };
42
+ export type VoiceSimulationSuiteSection = 'fixtures' | 'outcomes' | 'scenarios' | 'sessions' | 'tools';
43
+ export type VoiceSimulationSuiteAssertionInput = {
44
+ maxActions?: number;
45
+ maxFailed?: number;
46
+ minPassed?: number;
47
+ minSections?: number;
48
+ requiredSections?: VoiceSimulationSuiteSection[];
49
+ sectionMinimums?: Partial<Record<VoiceSimulationSuiteSection, number>>;
50
+ };
51
+ export type VoiceSimulationSuiteAssertionReport = {
52
+ actions: number;
53
+ failed: number;
54
+ issues: string[];
55
+ ok: boolean;
56
+ passed: number;
57
+ sections: VoiceSimulationSuiteSection[];
58
+ sectionTotals: Partial<Record<VoiceSimulationSuiteSection, number>>;
59
+ status: VoiceSimulationSuiteStatus;
60
+ total: number;
61
+ };
42
62
  export type VoiceSimulationSuiteOptions<TSession extends VoiceSessionRecord = VoiceSessionRecord> = {
43
63
  actionLinks?: {
44
64
  fixtures?: string;
@@ -75,6 +95,8 @@ export type VoiceSimulationSuiteRoutesOptions<TSession extends VoiceSessionRecor
75
95
  title?: string;
76
96
  };
77
97
  export declare const runVoiceSimulationSuite: <TSession extends VoiceSessionRecord = VoiceSessionRecord>(options: VoiceSimulationSuiteOptions<TSession>) => Promise<VoiceSimulationSuiteReport>;
98
+ export declare const evaluateVoiceSimulationSuiteEvidence: (report: VoiceSimulationSuiteReport, input?: VoiceSimulationSuiteAssertionInput) => VoiceSimulationSuiteAssertionReport;
99
+ export declare const assertVoiceSimulationSuiteEvidence: (report: VoiceSimulationSuiteReport, input?: VoiceSimulationSuiteAssertionInput) => VoiceSimulationSuiteAssertionReport;
78
100
  export declare const renderVoiceSimulationSuiteHTML: (report: VoiceSimulationSuiteReport, options?: {
79
101
  title?: string;
80
102
  }) => string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.256",
3
+ "version": "0.0.22-beta.258",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",