@absolutejs/voice 0.0.22-beta.265 → 0.0.22-beta.267

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/index.js CHANGED
@@ -17401,6 +17401,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
17401
17401
  const providers = uniqueSorted3(decisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
17402
17402
  const sources = uniqueSorted3(decisions.map((decision) => decision.decision?.source ?? decision.source).filter((source) => typeof source === "string"));
17403
17403
  const applied = decisions.filter((decision) => decision.applied === true).length;
17404
+ const duplicateDecisions = decisions.filter((decision) => decision.duplicate === true);
17405
+ const duplicateProviders = uniqueSorted3(duplicateDecisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
17406
+ const duplicateIdempotencyKeys = new Set(duplicateDecisions.map((decision) => decision.idempotencyKey).filter((key) => typeof key === "string" && key.length > 0)).size;
17407
+ const duplicateCampaignOutcomesApplied = duplicateDecisions.filter((decision) => isRecord(decision.campaignOutcome) && decision.campaignOutcome.applied === true).length;
17408
+ const duplicateOutcomeReasons = uniqueSorted3(duplicateDecisions.map((decision) => isRecord(decision.campaignOutcome) ? decision.campaignOutcome.reason : undefined).filter((reason) => typeof reason === "string"));
17404
17409
  const routeResults = decisions.filter((decision) => isRecord(decision.routeResult)).length;
17405
17410
  const missingSessionIds = decisions.filter((decision) => !decision.sessionId).length;
17406
17411
  if (input.minDecisions !== undefined && decisions.length < input.minDecisions) {
@@ -17409,6 +17414,15 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
17409
17414
  if (input.minApplied !== undefined && applied < input.minApplied) {
17410
17415
  issues.push(`Expected at least ${String(input.minApplied)} applied telephony webhook decision(s), found ${String(applied)}.`);
17411
17416
  }
17417
+ if (input.minDuplicates !== undefined && duplicateDecisions.length < input.minDuplicates) {
17418
+ issues.push(`Expected at least ${String(input.minDuplicates)} duplicate telephony webhook decision(s), found ${String(duplicateDecisions.length)}.`);
17419
+ }
17420
+ if (input.minDuplicateIdempotencyKeys !== undefined && duplicateIdempotencyKeys < input.minDuplicateIdempotencyKeys) {
17421
+ issues.push(`Expected at least ${String(input.minDuplicateIdempotencyKeys)} duplicate telephony webhook idempotency key(s), found ${String(duplicateIdempotencyKeys)}.`);
17422
+ }
17423
+ if (input.maxDuplicateCampaignOutcomesApplied !== undefined && duplicateCampaignOutcomesApplied > input.maxDuplicateCampaignOutcomesApplied) {
17424
+ issues.push(`Expected at most ${String(input.maxDuplicateCampaignOutcomesApplied)} duplicate telephony webhook campaign outcome application(s), found ${String(duplicateCampaignOutcomesApplied)}.`);
17425
+ }
17412
17426
  if (input.maxMissingSessionIds !== undefined && missingSessionIds > input.maxMissingSessionIds) {
17413
17427
  issues.push(`Expected at most ${String(input.maxMissingSessionIds)} telephony webhook decision(s) without sessionId, found ${String(missingSessionIds)}.`);
17414
17428
  }
@@ -17418,6 +17432,9 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
17418
17432
  for (const provider of findMissing3(providers, input.requiredProviders)) {
17419
17433
  issues.push(`Missing telephony webhook provider: ${provider}.`);
17420
17434
  }
17435
+ for (const provider of findMissing3(duplicateProviders, input.requiredDuplicateProviders)) {
17436
+ issues.push(`Missing duplicate telephony webhook provider: ${provider}.`);
17437
+ }
17421
17438
  for (const action of findMissing3(actions, input.requiredActions)) {
17422
17439
  issues.push(`Missing telephony webhook action: ${action}.`);
17423
17440
  }
@@ -17429,6 +17446,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
17429
17446
  applied,
17430
17447
  decisions: decisions.length,
17431
17448
  dispositions,
17449
+ duplicateCampaignOutcomesApplied,
17450
+ duplicateIdempotencyKeys,
17451
+ duplicateOutcomeReasons,
17452
+ duplicateProviders,
17453
+ duplicates: duplicateDecisions.length,
17432
17454
  issues,
17433
17455
  missingSessionIds,
17434
17456
  ok: issues.length === 0,
@@ -74,7 +74,10 @@ export type VoiceTelephonyWebhookNormalizationEvidenceDecision = {
74
74
  source?: VoiceTelephonyOutcomeDecision['source'] | string;
75
75
  };
76
76
  disposition?: VoiceCallDisposition | string;
77
+ duplicate?: boolean;
78
+ campaignOutcome?: unknown;
77
79
  event?: VoiceTelephonyOutcomeProviderEvent;
80
+ idempotencyKey?: string;
78
81
  provider?: VoiceTelephonyWebhookProvider | string;
79
82
  routeResult?: unknown;
80
83
  sessionId?: string;
@@ -85,8 +88,12 @@ export type VoiceTelephonyWebhookNormalizationEvidenceInput = {
85
88
  maxMissingSessionIds?: number;
86
89
  minApplied?: number;
87
90
  minDecisions?: number;
91
+ minDuplicateIdempotencyKeys?: number;
92
+ minDuplicates?: number;
93
+ maxDuplicateCampaignOutcomesApplied?: number;
88
94
  requiredActions?: VoiceTelephonyOutcomeAction[];
89
95
  requiredDispositions?: VoiceCallDisposition[];
96
+ requiredDuplicateProviders?: VoiceTelephonyWebhookProvider[];
90
97
  requiredProviders?: VoiceTelephonyWebhookProvider[];
91
98
  requireRouteResults?: boolean;
92
99
  };
@@ -95,6 +102,11 @@ export type VoiceTelephonyWebhookNormalizationEvidenceReport = {
95
102
  applied: number;
96
103
  decisions: number;
97
104
  dispositions: VoiceCallDisposition[];
105
+ duplicateCampaignOutcomesApplied: number;
106
+ duplicateIdempotencyKeys: number;
107
+ duplicateOutcomeReasons: string[];
108
+ duplicateProviders: VoiceTelephonyWebhookProvider[];
109
+ duplicates: number;
98
110
  issues: string[];
99
111
  missingSessionIds: number;
100
112
  ok: boolean;
@@ -8256,6 +8256,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
8256
8256
  const providers = uniqueSorted(decisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
8257
8257
  const sources = uniqueSorted(decisions.map((decision) => decision.decision?.source ?? decision.source).filter((source) => typeof source === "string"));
8258
8258
  const applied = decisions.filter((decision) => decision.applied === true).length;
8259
+ const duplicateDecisions = decisions.filter((decision) => decision.duplicate === true);
8260
+ const duplicateProviders = uniqueSorted(duplicateDecisions.map((decision) => decision.provider ?? decision.event?.provider).filter(isTelephonyWebhookProvider));
8261
+ const duplicateIdempotencyKeys = new Set(duplicateDecisions.map((decision) => decision.idempotencyKey).filter((key) => typeof key === "string" && key.length > 0)).size;
8262
+ const duplicateCampaignOutcomesApplied = duplicateDecisions.filter((decision) => isRecord(decision.campaignOutcome) && decision.campaignOutcome.applied === true).length;
8263
+ const duplicateOutcomeReasons = uniqueSorted(duplicateDecisions.map((decision) => isRecord(decision.campaignOutcome) ? decision.campaignOutcome.reason : undefined).filter((reason) => typeof reason === "string"));
8259
8264
  const routeResults = decisions.filter((decision) => isRecord(decision.routeResult)).length;
8260
8265
  const missingSessionIds = decisions.filter((decision) => !decision.sessionId).length;
8261
8266
  if (input.minDecisions !== undefined && decisions.length < input.minDecisions) {
@@ -8264,6 +8269,15 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
8264
8269
  if (input.minApplied !== undefined && applied < input.minApplied) {
8265
8270
  issues.push(`Expected at least ${String(input.minApplied)} applied telephony webhook decision(s), found ${String(applied)}.`);
8266
8271
  }
8272
+ if (input.minDuplicates !== undefined && duplicateDecisions.length < input.minDuplicates) {
8273
+ issues.push(`Expected at least ${String(input.minDuplicates)} duplicate telephony webhook decision(s), found ${String(duplicateDecisions.length)}.`);
8274
+ }
8275
+ if (input.minDuplicateIdempotencyKeys !== undefined && duplicateIdempotencyKeys < input.minDuplicateIdempotencyKeys) {
8276
+ issues.push(`Expected at least ${String(input.minDuplicateIdempotencyKeys)} duplicate telephony webhook idempotency key(s), found ${String(duplicateIdempotencyKeys)}.`);
8277
+ }
8278
+ if (input.maxDuplicateCampaignOutcomesApplied !== undefined && duplicateCampaignOutcomesApplied > input.maxDuplicateCampaignOutcomesApplied) {
8279
+ issues.push(`Expected at most ${String(input.maxDuplicateCampaignOutcomesApplied)} duplicate telephony webhook campaign outcome application(s), found ${String(duplicateCampaignOutcomesApplied)}.`);
8280
+ }
8267
8281
  if (input.maxMissingSessionIds !== undefined && missingSessionIds > input.maxMissingSessionIds) {
8268
8282
  issues.push(`Expected at most ${String(input.maxMissingSessionIds)} telephony webhook decision(s) without sessionId, found ${String(missingSessionIds)}.`);
8269
8283
  }
@@ -8273,6 +8287,9 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
8273
8287
  for (const provider of findMissing(providers, input.requiredProviders)) {
8274
8288
  issues.push(`Missing telephony webhook provider: ${provider}.`);
8275
8289
  }
8290
+ for (const provider of findMissing(duplicateProviders, input.requiredDuplicateProviders)) {
8291
+ issues.push(`Missing duplicate telephony webhook provider: ${provider}.`);
8292
+ }
8276
8293
  for (const action of findMissing(actions, input.requiredActions)) {
8277
8294
  issues.push(`Missing telephony webhook action: ${action}.`);
8278
8295
  }
@@ -8284,6 +8301,11 @@ var evaluateVoiceTelephonyWebhookNormalizationEvidence = (input = {}) => {
8284
8301
  applied,
8285
8302
  decisions: decisions.length,
8286
8303
  dispositions,
8304
+ duplicateCampaignOutcomesApplied,
8305
+ duplicateIdempotencyKeys,
8306
+ duplicateOutcomeReasons,
8307
+ duplicateProviders,
8308
+ duplicates: duplicateDecisions.length,
8287
8309
  issues,
8288
8310
  missingSessionIds,
8289
8311
  ok: issues.length === 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.265",
3
+ "version": "0.0.22-beta.267",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",