@absolutejs/voice 0.0.22-beta.336 → 0.0.22-beta.337

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.
@@ -3935,7 +3935,7 @@ var bestProviderByRole = (providers) => {
3935
3935
  }
3936
3936
  return [...best.values()].sort((left, right) => String(left.role ?? left.id).localeCompare(String(right.role ?? right.id)));
3937
3937
  };
3938
- var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
3938
+ var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role && !(provider.label ?? provider.id).toLowerCase().startsWith(provider.role.toLowerCase()) ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
3939
3939
  var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
3940
3940
  const issues = [];
3941
3941
  const requiredStatus = input.requireStatus ?? "pass";
@@ -4054,6 +4054,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
4054
4054
  const bestProvider = providers.find((provider) => provider.status === "pass") ?? providers[0];
4055
4055
  const bestProviders = bestProviderByRole(providers).filter((provider) => provider.status === "pass");
4056
4056
  const currentProvider = options.currentProviderId ? providers.find((provider) => provider.id === options.currentProviderId) : undefined;
4057
+ const hasSingleProviderRole = new Set(bestProviders.map((provider) => provider.role ?? provider.id)).size <= 1;
4057
4058
  const bestComparableProvider = currentProvider?.role ? bestProviders.find((provider) => provider.role === currentProvider.role) : bestProvider;
4058
4059
  const providerSwitchRecommended = shouldSwitchProvider(currentProvider, bestComparableProvider, options);
4059
4060
  const recommendations = [];
@@ -4063,9 +4064,9 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
4063
4064
  }
4064
4065
  recommendations.push({
4065
4066
  evidence: {
4066
- bestProviderId: bestComparableProvider?.id ?? bestProvider?.id,
4067
+ bestProviderId: currentProvider || hasSingleProviderRole ? bestComparableProvider?.id ?? bestProvider?.id : undefined,
4067
4068
  bestProviderMix: formatProviderMix(bestProviders),
4068
- bestProviderP95Ms: bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms,
4069
+ bestProviderP95Ms: currentProvider || hasSingleProviderRole ? bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms : undefined,
4069
4070
  budgetMs: budgets.maxProviderP95Ms,
4070
4071
  currentProviderId: currentProvider?.id ?? options.currentProviderId,
4071
4072
  currentProviderP95Ms: currentProvider?.p95Ms,
@@ -4075,7 +4076,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
4075
4076
  nextMove: providers.length > 0 ? providerSwitchRecommended ? `Route latency-sensitive ${currentProvider?.role ?? "provider"} traffic to ${bestComparableProvider?.label ?? bestComparableProvider?.id} for this call profile and keep the current path as fallback.` : bestProviders.length > 0 ? `Use the fastest proven provider mix for this call profile: ${formatProviderMix(bestProviders)}.` : "Collect provider-specific sustained samples before making provider-specific routing decisions." : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep the current provider route for latency-sensitive turns and keep collecting sustained proof." : "Route latency-sensitive turns to a faster provider profile or tighten fallback/circuit-breaker budgets before promotion.",
4076
4077
  providerId: providerSwitchRecommended ? bestComparableProvider?.id : bestProviders.length === 1 ? bestProviders[0]?.id : undefined,
4077
4078
  recommendation: providers.length > 0 ? providerSwitchRecommended ? `Switch latency-sensitive ${currentProvider?.role ?? "provider"} routing to ${bestComparableProvider?.label ?? bestComparableProvider?.id}` : bestProviders.length > 0 ? "Prefer the fastest proven provider mix for this call profile" : "Collect provider-specific latency samples" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep current provider path" : "Change provider routing for latency-sensitive traffic",
4078
- role: bestComparableProvider?.role,
4079
+ role: currentProvider || hasSingleProviderRole ? bestComparableProvider?.role : undefined,
4079
4080
  status: providers.length > 0 ? providerSwitchRecommended ? "warn" : bestProviders.length > 0 ? "pass" : bestProvider?.status ?? "fail" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "pass" : maxProviderP95Ms === undefined ? "fail" : "warn",
4080
4081
  surface: "provider-path"
4081
4082
  });
package/dist/index.js CHANGED
@@ -14652,7 +14652,7 @@ var bestProviderByRole = (providers) => {
14652
14652
  }
14653
14653
  return [...best.values()].sort((left, right) => String(left.role ?? left.id).localeCompare(String(right.role ?? right.id)));
14654
14654
  };
14655
- var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
14655
+ var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role && !(provider.label ?? provider.id).toLowerCase().startsWith(provider.role.toLowerCase()) ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
14656
14656
  var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
14657
14657
  const issues = [];
14658
14658
  const requiredStatus = input.requireStatus ?? "pass";
@@ -14771,6 +14771,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
14771
14771
  const bestProvider = providers.find((provider) => provider.status === "pass") ?? providers[0];
14772
14772
  const bestProviders = bestProviderByRole(providers).filter((provider) => provider.status === "pass");
14773
14773
  const currentProvider = options.currentProviderId ? providers.find((provider) => provider.id === options.currentProviderId) : undefined;
14774
+ const hasSingleProviderRole = new Set(bestProviders.map((provider) => provider.role ?? provider.id)).size <= 1;
14774
14775
  const bestComparableProvider = currentProvider?.role ? bestProviders.find((provider) => provider.role === currentProvider.role) : bestProvider;
14775
14776
  const providerSwitchRecommended = shouldSwitchProvider(currentProvider, bestComparableProvider, options);
14776
14777
  const recommendations = [];
@@ -14780,9 +14781,9 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
14780
14781
  }
14781
14782
  recommendations.push({
14782
14783
  evidence: {
14783
- bestProviderId: bestComparableProvider?.id ?? bestProvider?.id,
14784
+ bestProviderId: currentProvider || hasSingleProviderRole ? bestComparableProvider?.id ?? bestProvider?.id : undefined,
14784
14785
  bestProviderMix: formatProviderMix(bestProviders),
14785
- bestProviderP95Ms: bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms,
14786
+ bestProviderP95Ms: currentProvider || hasSingleProviderRole ? bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms : undefined,
14786
14787
  budgetMs: budgets.maxProviderP95Ms,
14787
14788
  currentProviderId: currentProvider?.id ?? options.currentProviderId,
14788
14789
  currentProviderP95Ms: currentProvider?.p95Ms,
@@ -14792,7 +14793,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
14792
14793
  nextMove: providers.length > 0 ? providerSwitchRecommended ? `Route latency-sensitive ${currentProvider?.role ?? "provider"} traffic to ${bestComparableProvider?.label ?? bestComparableProvider?.id} for this call profile and keep the current path as fallback.` : bestProviders.length > 0 ? `Use the fastest proven provider mix for this call profile: ${formatProviderMix(bestProviders)}.` : "Collect provider-specific sustained samples before making provider-specific routing decisions." : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep the current provider route for latency-sensitive turns and keep collecting sustained proof." : "Route latency-sensitive turns to a faster provider profile or tighten fallback/circuit-breaker budgets before promotion.",
14793
14794
  providerId: providerSwitchRecommended ? bestComparableProvider?.id : bestProviders.length === 1 ? bestProviders[0]?.id : undefined,
14794
14795
  recommendation: providers.length > 0 ? providerSwitchRecommended ? `Switch latency-sensitive ${currentProvider?.role ?? "provider"} routing to ${bestComparableProvider?.label ?? bestComparableProvider?.id}` : bestProviders.length > 0 ? "Prefer the fastest proven provider mix for this call profile" : "Collect provider-specific latency samples" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep current provider path" : "Change provider routing for latency-sensitive traffic",
14795
- role: bestComparableProvider?.role,
14796
+ role: currentProvider || hasSingleProviderRole ? bestComparableProvider?.role : undefined,
14796
14797
  status: providers.length > 0 ? providerSwitchRecommended ? "warn" : bestProviders.length > 0 ? "pass" : bestProvider?.status ?? "fail" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "pass" : maxProviderP95Ms === undefined ? "fail" : "warn",
14797
14798
  surface: "provider-path"
14798
14799
  });
@@ -1683,7 +1683,7 @@ var bestProviderByRole = (providers) => {
1683
1683
  }
1684
1684
  return [...best.values()].sort((left, right) => String(left.role ?? left.id).localeCompare(String(right.role ?? right.id)));
1685
1685
  };
1686
- var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
1686
+ var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role && !(provider.label ?? provider.id).toLowerCase().startsWith(provider.role.toLowerCase()) ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
1687
1687
  var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
1688
1688
  const issues = [];
1689
1689
  const requiredStatus = input.requireStatus ?? "pass";
@@ -1802,6 +1802,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
1802
1802
  const bestProvider = providers.find((provider) => provider.status === "pass") ?? providers[0];
1803
1803
  const bestProviders = bestProviderByRole(providers).filter((provider) => provider.status === "pass");
1804
1804
  const currentProvider = options.currentProviderId ? providers.find((provider) => provider.id === options.currentProviderId) : undefined;
1805
+ const hasSingleProviderRole = new Set(bestProviders.map((provider) => provider.role ?? provider.id)).size <= 1;
1805
1806
  const bestComparableProvider = currentProvider?.role ? bestProviders.find((provider) => provider.role === currentProvider.role) : bestProvider;
1806
1807
  const providerSwitchRecommended = shouldSwitchProvider(currentProvider, bestComparableProvider, options);
1807
1808
  const recommendations = [];
@@ -1811,9 +1812,9 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
1811
1812
  }
1812
1813
  recommendations.push({
1813
1814
  evidence: {
1814
- bestProviderId: bestComparableProvider?.id ?? bestProvider?.id,
1815
+ bestProviderId: currentProvider || hasSingleProviderRole ? bestComparableProvider?.id ?? bestProvider?.id : undefined,
1815
1816
  bestProviderMix: formatProviderMix(bestProviders),
1816
- bestProviderP95Ms: bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms,
1817
+ bestProviderP95Ms: currentProvider || hasSingleProviderRole ? bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms : undefined,
1817
1818
  budgetMs: budgets.maxProviderP95Ms,
1818
1819
  currentProviderId: currentProvider?.id ?? options.currentProviderId,
1819
1820
  currentProviderP95Ms: currentProvider?.p95Ms,
@@ -1823,7 +1824,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
1823
1824
  nextMove: providers.length > 0 ? providerSwitchRecommended ? `Route latency-sensitive ${currentProvider?.role ?? "provider"} traffic to ${bestComparableProvider?.label ?? bestComparableProvider?.id} for this call profile and keep the current path as fallback.` : bestProviders.length > 0 ? `Use the fastest proven provider mix for this call profile: ${formatProviderMix(bestProviders)}.` : "Collect provider-specific sustained samples before making provider-specific routing decisions." : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep the current provider route for latency-sensitive turns and keep collecting sustained proof." : "Route latency-sensitive turns to a faster provider profile or tighten fallback/circuit-breaker budgets before promotion.",
1824
1825
  providerId: providerSwitchRecommended ? bestComparableProvider?.id : bestProviders.length === 1 ? bestProviders[0]?.id : undefined,
1825
1826
  recommendation: providers.length > 0 ? providerSwitchRecommended ? `Switch latency-sensitive ${currentProvider?.role ?? "provider"} routing to ${bestComparableProvider?.label ?? bestComparableProvider?.id}` : bestProviders.length > 0 ? "Prefer the fastest proven provider mix for this call profile" : "Collect provider-specific latency samples" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep current provider path" : "Change provider routing for latency-sensitive traffic",
1826
- role: bestComparableProvider?.role,
1827
+ role: currentProvider || hasSingleProviderRole ? bestComparableProvider?.role : undefined,
1827
1828
  status: providers.length > 0 ? providerSwitchRecommended ? "warn" : bestProviders.length > 0 ? "pass" : bestProvider?.status ?? "fail" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "pass" : maxProviderP95Ms === undefined ? "fail" : "warn",
1828
1829
  surface: "provider-path"
1829
1830
  });
package/dist/vue/index.js CHANGED
@@ -1604,7 +1604,7 @@ var bestProviderByRole = (providers) => {
1604
1604
  }
1605
1605
  return [...best.values()].sort((left, right) => String(left.role ?? left.id).localeCompare(String(right.role ?? right.id)));
1606
1606
  };
1607
- var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
1607
+ var formatProviderMix = (providers) => providers.length === 0 ? "n/a" : providers.map((provider) => provider.role && !(provider.label ?? provider.id).toLowerCase().startsWith(provider.role.toLowerCase()) ? `${provider.role.toUpperCase()} ${provider.label ?? provider.id}` : provider.label ?? provider.id).join(", ");
1608
1608
  var evaluateVoiceProofTrendEvidence = (report, input = {}) => {
1609
1609
  const issues = [];
1610
1610
  const requiredStatus = input.requireStatus ?? "pass";
@@ -1723,6 +1723,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
1723
1723
  const bestProvider = providers.find((provider) => provider.status === "pass") ?? providers[0];
1724
1724
  const bestProviders = bestProviderByRole(providers).filter((provider) => provider.status === "pass");
1725
1725
  const currentProvider = options.currentProviderId ? providers.find((provider) => provider.id === options.currentProviderId) : undefined;
1726
+ const hasSingleProviderRole = new Set(bestProviders.map((provider) => provider.role ?? provider.id)).size <= 1;
1726
1727
  const bestComparableProvider = currentProvider?.role ? bestProviders.find((provider) => provider.role === currentProvider.role) : bestProvider;
1727
1728
  const providerSwitchRecommended = shouldSwitchProvider(currentProvider, bestComparableProvider, options);
1728
1729
  const recommendations = [];
@@ -1732,9 +1733,9 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
1732
1733
  }
1733
1734
  recommendations.push({
1734
1735
  evidence: {
1735
- bestProviderId: bestComparableProvider?.id ?? bestProvider?.id,
1736
+ bestProviderId: currentProvider || hasSingleProviderRole ? bestComparableProvider?.id ?? bestProvider?.id : undefined,
1736
1737
  bestProviderMix: formatProviderMix(bestProviders),
1737
- bestProviderP95Ms: bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms,
1738
+ bestProviderP95Ms: currentProvider || hasSingleProviderRole ? bestComparableProvider?.p95Ms ?? bestProvider?.p95Ms : undefined,
1738
1739
  budgetMs: budgets.maxProviderP95Ms,
1739
1740
  currentProviderId: currentProvider?.id ?? options.currentProviderId,
1740
1741
  currentProviderP95Ms: currentProvider?.p95Ms,
@@ -1744,7 +1745,7 @@ var buildVoiceProofTrendRecommendationReport = (report, options = {}) => {
1744
1745
  nextMove: providers.length > 0 ? providerSwitchRecommended ? `Route latency-sensitive ${currentProvider?.role ?? "provider"} traffic to ${bestComparableProvider?.label ?? bestComparableProvider?.id} for this call profile and keep the current path as fallback.` : bestProviders.length > 0 ? `Use the fastest proven provider mix for this call profile: ${formatProviderMix(bestProviders)}.` : "Collect provider-specific sustained samples before making provider-specific routing decisions." : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep the current provider route for latency-sensitive turns and keep collecting sustained proof." : "Route latency-sensitive turns to a faster provider profile or tighten fallback/circuit-breaker budgets before promotion.",
1745
1746
  providerId: providerSwitchRecommended ? bestComparableProvider?.id : bestProviders.length === 1 ? bestProviders[0]?.id : undefined,
1746
1747
  recommendation: providers.length > 0 ? providerSwitchRecommended ? `Switch latency-sensitive ${currentProvider?.role ?? "provider"} routing to ${bestComparableProvider?.label ?? bestComparableProvider?.id}` : bestProviders.length > 0 ? "Prefer the fastest proven provider mix for this call profile" : "Collect provider-specific latency samples" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "Keep current provider path" : "Change provider routing for latency-sensitive traffic",
1747
- role: bestComparableProvider?.role,
1748
+ role: currentProvider || hasSingleProviderRole ? bestComparableProvider?.role : undefined,
1748
1749
  status: providers.length > 0 ? providerSwitchRecommended ? "warn" : bestProviders.length > 0 ? "pass" : bestProvider?.status ?? "fail" : withinBudget(maxProviderP95Ms, budgets.maxProviderP95Ms) ? "pass" : maxProviderP95Ms === undefined ? "fail" : "warn",
1749
1750
  surface: "provider-path"
1750
1751
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.336",
3
+ "version": "0.0.22-beta.337",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",