@absolutejs/voice 0.0.22-beta.157 → 0.0.22-beta.159

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.d.ts CHANGED
@@ -44,7 +44,8 @@ export { createVoiceProviderHealthHTMLHandler, createVoiceProviderHealthJSONHand
44
44
  export { createVoiceProviderCapabilityHTMLHandler, createVoiceProviderCapabilityJSONHandler, createVoiceProviderCapabilityRoutes, renderVoiceProviderCapabilityHTML, summarizeVoiceProviderCapabilities } from './providerCapabilities';
45
45
  export { assertVoiceProviderRoutingContract, runVoiceProviderRoutingContract } from './providerRoutingContract';
46
46
  export { createVoicePhoneAgentProductionSmokeHTMLHandler, createVoicePhoneAgentProductionSmokeJSONHandler, createVoicePhoneAgentProductionSmokeRoutes, renderVoicePhoneAgentProductionSmokeHTML, runVoicePhoneAgentProductionSmokeContract } from './phoneAgentProductionSmoke';
47
- export { buildVoiceProductionReadinessReport, createVoiceProductionReadinessRoutes, renderVoiceProductionReadinessHTML } from './productionReadiness';
47
+ export { buildVoiceProductionReadinessGate, buildVoiceProductionReadinessReport, createVoiceProductionReadinessRoutes, renderVoiceProductionReadinessHTML, summarizeVoiceProductionReadinessGate } from './productionReadiness';
48
+ export { createVoiceReadinessProfile } from './readinessProfiles';
48
49
  export { buildVoiceOpsConsoleReport, createVoiceOpsConsoleRoutes, renderVoiceOpsConsoleHTML } from './opsConsoleRoutes';
49
50
  export { summarizeVoiceOpsStatus } from './opsStatus';
50
51
  export { createVoiceOpsStatusRoutes, renderVoiceOpsStatusHTML } from './opsStatusRoutes';
@@ -102,7 +103,8 @@ export type { VoicePhoneAgentCarrier, VoicePhoneAgentCarrierSummary, VoicePhoneA
102
103
  export type { VoicePhoneAgentProductionSmokeIssue, VoicePhoneAgentProductionSmokeHandlerOptions, VoicePhoneAgentProductionSmokeHTMLHandlerOptions, VoicePhoneAgentProductionSmokeOptions, VoicePhoneAgentProductionSmokeReport, VoicePhoneAgentProductionSmokeRoutesOptions, VoicePhoneAgentProductionSmokeRequirement } from './phoneAgentProductionSmoke';
103
104
  export type { VoiceOpsConsoleLink, VoiceOpsConsoleReport, VoiceOpsConsoleRoutesOptions } from './opsConsoleRoutes';
104
105
  export type { VoiceOpsStatus, VoiceOpsStatusLink, VoiceOpsStatusOptions, VoiceOpsStatusReport, VoiceOpsStatusRoutesOptions } from './opsStatus';
105
- export type { VoiceProductionReadinessAction, VoiceProductionReadinessAuditOptions, VoiceProductionReadinessAuditRequirement, VoiceProductionReadinessAuditSummary, VoiceProductionReadinessCheck, VoiceProductionReadinessOpsActionHistoryOptions, VoiceProductionReadinessOpsActionHistorySummary, VoiceProductionReadinessProofSource, VoiceProductionReadinessReport, VoiceProductionReadinessRoutesOptions, VoiceProductionReadinessTraceDeliverySummary, VoiceProductionReadinessAuditDeliveryOptions, VoiceProductionReadinessAuditDeliverySummary, VoiceProductionReadinessTraceDeliveryOptions, VoiceProductionReadinessStatus } from './productionReadiness';
106
+ export type { VoiceProductionReadinessAction, VoiceProductionReadinessAuditOptions, VoiceProductionReadinessAuditRequirement, VoiceProductionReadinessAuditSummary, VoiceProductionReadinessCheck, VoiceProductionReadinessGateIssue, VoiceProductionReadinessGateOptions, VoiceProductionReadinessGateReport, VoiceProductionReadinessOpsActionHistoryOptions, VoiceProductionReadinessOpsActionHistorySummary, VoiceProductionReadinessProofSource, VoiceProductionReadinessReport, VoiceProductionReadinessRoutesOptions, VoiceProductionReadinessTraceDeliverySummary, VoiceProductionReadinessAuditDeliveryOptions, VoiceProductionReadinessAuditDeliverySummary, VoiceProductionReadinessTraceDeliveryOptions, VoiceProductionReadinessStatus } from './productionReadiness';
107
+ export type { VoiceReadinessProfileName, VoiceReadinessProfileOptions, VoiceReadinessProfileRoutesOptions } from './readinessProfiles';
106
108
  export type { VoiceQualityLink, VoiceQualityMetric, VoiceQualityReport, VoiceQualityRoutesOptions, VoiceQualityStatus, VoiceQualityThresholds } from './qualityRoutes';
107
109
  export type { VoiceResilienceIOSimulator, VoiceResilienceLink, VoiceResiliencePageData, VoiceResilienceRoutesOptions, VoiceResilienceSimulationProvider, VoiceRoutingKindSummary, VoiceRoutingDecisionSummary, VoiceRoutingDecisionSummaryOptions, VoiceRoutingEvent, VoiceRoutingEventKind, VoiceRoutingSessionSummary, VoiceRoutingSessionSummaryOptions } from './resilienceRoutes';
108
110
  export type { VoiceIOProviderRouterEvent, VoiceIOProviderRouterOptions, VoiceIOProviderRouterPolicy, VoiceIOProviderRouterPolicyConfig, VoiceSTTProviderRouterOptions, VoiceTTSProviderRouterOptions } from './providerAdapters';
package/dist/index.js CHANGED
@@ -20128,6 +20128,47 @@ var assertVoiceProviderRoutingContract = async (options) => {
20128
20128
  import { Elysia as Elysia33 } from "elysia";
20129
20129
  var escapeHtml35 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
20130
20130
  var rollupStatus2 = (checks) => checks.some((check) => check.status === "fail") ? "fail" : checks.some((check) => check.status === "warn") ? "warn" : "pass";
20131
+ var readinessGateCodes = {
20132
+ "Agent squad contracts": "voice.readiness.agent_squad_contracts",
20133
+ "Audit evidence": "voice.readiness.audit_evidence",
20134
+ "Audit sink delivery": "voice.readiness.audit_sink_delivery",
20135
+ "Barge-in interruption proof": "voice.readiness.barge_in_interruption",
20136
+ "Carrier readiness": "voice.readiness.carrier_readiness",
20137
+ "Delivery runtime": "voice.readiness.delivery_runtime",
20138
+ "Handoff delivery": "voice.readiness.handoff_delivery",
20139
+ "Live latency proof": "voice.readiness.live_latency",
20140
+ "Operator action history": "voice.readiness.operator_action_history",
20141
+ "Phone agent production smoke": "voice.readiness.phone_agent_smoke",
20142
+ "Provider fallback recovery": "voice.readiness.provider_fallback_recovery",
20143
+ "Provider health": "voice.readiness.provider_health",
20144
+ "Provider routing contracts": "voice.readiness.provider_routing_contracts",
20145
+ "Quality gates": "voice.readiness.quality_gates",
20146
+ "Reconnect recovery contracts": "voice.readiness.reconnect_contracts",
20147
+ "Routing evidence": "voice.readiness.routing_evidence",
20148
+ "Session health": "voice.readiness.session_health",
20149
+ "Trace sink delivery": "voice.readiness.trace_sink_delivery"
20150
+ };
20151
+ var readinessGateCodeForCheck = (check) => readinessGateCodes[check.label] ?? `voice.readiness.${check.label.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "")}`;
20152
+ var summarizeVoiceProductionReadinessGate = (report, options = {}) => {
20153
+ const issues = report.checks.filter((check) => check.status !== "pass").map((check) => ({
20154
+ code: readinessGateCodeForCheck(check),
20155
+ detail: check.detail,
20156
+ href: check.href,
20157
+ label: check.label,
20158
+ status: check.status,
20159
+ value: check.value
20160
+ }));
20161
+ const failures = issues.filter((issue) => issue.status === "fail");
20162
+ const warnings = issues.filter((issue) => issue.status === "warn");
20163
+ const ok = failures.length === 0 && (options.failOnWarnings ? warnings.length === 0 : true);
20164
+ return {
20165
+ checkedAt: report.checkedAt,
20166
+ failures,
20167
+ ok,
20168
+ status: ok ? report.status : "fail",
20169
+ warnings
20170
+ };
20171
+ };
20131
20172
  var carrierStatus = (matrix) => matrix.summary.failing > 0 ? "fail" : matrix.summary.warnings > 0 || matrix.summary.ready < matrix.summary.providers ? "warn" : "pass";
20132
20173
  var resolveCarriers = async (options, input) => {
20133
20174
  if (options.carriers === false || options.carriers === undefined) {
@@ -20844,6 +20885,7 @@ var buildVoiceProductionReadinessReport = async (options, input = {}) => {
20844
20885
  }
20845
20886
  };
20846
20887
  };
20888
+ var buildVoiceProductionReadinessGate = async (options, input = {}) => summarizeVoiceProductionReadinessGate(await buildVoiceProductionReadinessReport(options, input), options.gate || undefined);
20847
20889
  var renderVoiceProductionReadinessHTML = (report, options = {}) => {
20848
20890
  const title = options.title ?? "AbsoluteJS Voice Production Readiness";
20849
20891
  const checks = report.checks.map((check, index) => {
@@ -20864,11 +20906,27 @@ var renderVoiceProductionReadinessHTML = (report, options = {}) => {
20864
20906
  };
20865
20907
  var createVoiceProductionReadinessRoutes = (options) => {
20866
20908
  const path = options.path ?? "/api/production-readiness";
20909
+ const gatePath = options.gatePath === undefined ? "/api/production-readiness/gate" : options.gatePath;
20867
20910
  const htmlPath = options.htmlPath ?? "/production-readiness";
20868
20911
  const routes = new Elysia33({
20869
20912
  name: options.name ?? "absolutejs-voice-production-readiness"
20870
20913
  });
20871
20914
  routes.get(path, async ({ query, request }) => buildVoiceProductionReadinessReport(options, { query, request }));
20915
+ if (gatePath !== false) {
20916
+ routes.get(gatePath, async ({ query, request }) => {
20917
+ const gate = await buildVoiceProductionReadinessGate(options, {
20918
+ query,
20919
+ request
20920
+ });
20921
+ return new Response(JSON.stringify(gate), {
20922
+ headers: {
20923
+ "Content-Type": "application/json; charset=utf-8",
20924
+ ...options.headers
20925
+ },
20926
+ status: gate.ok ? 200 : 503
20927
+ });
20928
+ });
20929
+ }
20872
20930
  if (htmlPath !== false) {
20873
20931
  routes.get(htmlPath, async ({ query, request }) => {
20874
20932
  const report = await buildVoiceProductionReadinessReport(options, {
@@ -20886,6 +20944,78 @@ var createVoiceProductionReadinessRoutes = (options) => {
20886
20944
  }
20887
20945
  return routes;
20888
20946
  };
20947
+ // src/readinessProfiles.ts
20948
+ var auditStoreFromOptions = (audit) => {
20949
+ if (!audit) {
20950
+ return;
20951
+ }
20952
+ return "list" in audit ? audit : audit.store;
20953
+ };
20954
+ var withDefined = (options) => Object.fromEntries(Object.entries(options).filter(([, value]) => value !== undefined));
20955
+ var mergeLinks = (defaults, links) => ({
20956
+ ...defaults,
20957
+ ...links
20958
+ });
20959
+ var createVoiceReadinessProfile = (profile, options = {}) => {
20960
+ if (profile === "meeting-recorder") {
20961
+ return withDefined({
20962
+ bargeInReports: options.bargeInReports,
20963
+ gate: options.gate,
20964
+ links: mergeLinks({
20965
+ bargeIn: "/barge-in",
20966
+ liveLatency: "/live-latency",
20967
+ providerRoutingContracts: "/resilience",
20968
+ quality: "/quality",
20969
+ reconnectContracts: "/voice/reconnect-contract",
20970
+ resilience: "/resilience",
20971
+ sessions: "/sessions"
20972
+ }, options.links),
20973
+ proofSources: options.proofSources,
20974
+ providerRoutingContracts: options.providerRoutingContracts,
20975
+ reconnectContracts: options.reconnectContracts
20976
+ });
20977
+ }
20978
+ if (profile === "phone-agent") {
20979
+ return withDefined({
20980
+ auditDeliveries: options.auditDeliveries,
20981
+ carriers: options.carriers,
20982
+ deliveryRuntime: options.deliveryRuntime,
20983
+ gate: options.gate,
20984
+ links: mergeLinks({
20985
+ auditDeliveries: "/audit/deliveries",
20986
+ carriers: "/carriers",
20987
+ deliveryRuntime: "/delivery-runtime",
20988
+ handoffs: "/handoffs",
20989
+ phoneAgentSmoke: "/sessions",
20990
+ providerRoutingContracts: "/resilience",
20991
+ resilience: "/resilience",
20992
+ sessions: "/sessions",
20993
+ traceDeliveries: "/traces/deliveries"
20994
+ }, options.links),
20995
+ phoneAgentSmokes: options.phoneAgentSmokes,
20996
+ proofSources: options.proofSources,
20997
+ providerRoutingContracts: options.providerRoutingContracts,
20998
+ traceDeliveries: options.traceDeliveries
20999
+ });
21000
+ }
21001
+ const opsActionHistory = options.opsActionHistory ?? auditStoreFromOptions(options.audit);
21002
+ return withDefined({
21003
+ audit: options.audit,
21004
+ auditDeliveries: options.auditDeliveries,
21005
+ deliveryRuntime: options.deliveryRuntime,
21006
+ gate: options.gate,
21007
+ links: mergeLinks({
21008
+ audit: "/audit",
21009
+ auditDeliveries: "/audit/deliveries",
21010
+ deliveryRuntime: "/delivery-runtime",
21011
+ opsActions: "/voice/ops-actions",
21012
+ traceDeliveries: "/traces/deliveries"
21013
+ }, options.links),
21014
+ opsActionHistory,
21015
+ proofSources: options.proofSources,
21016
+ traceDeliveries: options.traceDeliveries
21017
+ });
21018
+ };
20889
21019
  // src/opsConsoleRoutes.ts
20890
21020
  import { Elysia as Elysia34 } from "elysia";
20891
21021
  var DEFAULT_LINKS = [
@@ -23594,6 +23724,7 @@ export {
23594
23724
  summarizeVoiceProviderHealth,
23595
23725
  summarizeVoiceProviderFallbackRecovery,
23596
23726
  summarizeVoiceProviderCapabilities,
23727
+ summarizeVoiceProductionReadinessGate,
23597
23728
  summarizeVoiceOpsTasks,
23598
23729
  summarizeVoiceOpsTaskQueue,
23599
23730
  summarizeVoiceOpsTaskAnalytics,
@@ -23809,6 +23940,7 @@ export {
23809
23940
  createVoiceRedisTaskLeaseCoordinator,
23810
23941
  createVoiceRedisIdempotencyStore,
23811
23942
  createVoiceReconnectContractRoutes,
23943
+ createVoiceReadinessProfile,
23812
23944
  createVoiceQualityRoutes,
23813
23945
  createVoiceProviderRouter,
23814
23946
  createVoiceProviderHealthRoutes,
@@ -23967,6 +24099,7 @@ export {
23967
24099
  buildVoiceTraceReplay,
23968
24100
  buildVoiceTraceDeliveryReport,
23969
24101
  buildVoiceProductionReadinessReport,
24102
+ buildVoiceProductionReadinessGate,
23970
24103
  buildVoiceOpsTaskFromSLABreach,
23971
24104
  buildVoiceOpsTaskFromReview,
23972
24105
  buildVoiceOpsConsoleReport,
@@ -27,6 +27,24 @@ export type VoiceProductionReadinessCheck = {
27
27
  status: VoiceProductionReadinessStatus;
28
28
  value?: number | string;
29
29
  };
30
+ export type VoiceProductionReadinessGateIssue = {
31
+ code: string;
32
+ detail?: string;
33
+ href?: string;
34
+ label: string;
35
+ status: Exclude<VoiceProductionReadinessStatus, 'pass'>;
36
+ value?: number | string;
37
+ };
38
+ export type VoiceProductionReadinessGateOptions = {
39
+ failOnWarnings?: boolean;
40
+ };
41
+ export type VoiceProductionReadinessGateReport = {
42
+ checkedAt: number;
43
+ failures: VoiceProductionReadinessGateIssue[];
44
+ ok: boolean;
45
+ status: VoiceProductionReadinessStatus;
46
+ warnings: VoiceProductionReadinessGateIssue[];
47
+ };
30
48
  export type VoiceProductionReadinessProofSource = {
31
49
  detail?: string;
32
50
  href?: string;
@@ -242,6 +260,8 @@ export type VoiceProductionReadinessRoutesOptions = {
242
260
  request: Request;
243
261
  }) => Promise<VoiceDeliveryRuntime | VoiceDeliveryRuntimeSummary> | VoiceDeliveryRuntime | VoiceDeliveryRuntimeSummary);
244
262
  headers?: HeadersInit;
263
+ gate?: false | VoiceProductionReadinessGateOptions;
264
+ gatePath?: false | string;
245
265
  htmlPath?: false | string;
246
266
  links?: VoiceProductionReadinessReport['links'];
247
267
  llmProviders?: readonly string[];
@@ -273,10 +293,15 @@ export type VoiceProductionReadinessRoutesOptions = {
273
293
  liveLatencyWarnAfterMs?: number;
274
294
  liveLatencyFailAfterMs?: number;
275
295
  };
296
+ export declare const summarizeVoiceProductionReadinessGate: (report: VoiceProductionReadinessReport, options?: VoiceProductionReadinessGateOptions) => VoiceProductionReadinessGateReport;
276
297
  export declare const buildVoiceProductionReadinessReport: (options: VoiceProductionReadinessRoutesOptions, input?: {
277
298
  query?: Record<string, unknown>;
278
299
  request?: Request;
279
300
  }) => Promise<VoiceProductionReadinessReport>;
301
+ export declare const buildVoiceProductionReadinessGate: (options: VoiceProductionReadinessRoutesOptions, input?: {
302
+ query?: Record<string, unknown>;
303
+ request?: Request;
304
+ }) => Promise<VoiceProductionReadinessGateReport>;
280
305
  export declare const renderVoiceProductionReadinessHTML: (report: VoiceProductionReadinessReport, options?: {
281
306
  title?: string;
282
307
  }) => string;
@@ -0,0 +1,19 @@
1
+ import type { VoiceProductionReadinessAuditOptions, VoiceProductionReadinessAuditDeliveryOptions, VoiceProductionReadinessOpsActionHistoryOptions, VoiceProductionReadinessRoutesOptions, VoiceProductionReadinessTraceDeliveryOptions } from './productionReadiness';
2
+ export type VoiceReadinessProfileName = 'meeting-recorder' | 'ops-heavy' | 'phone-agent';
3
+ export type VoiceReadinessProfileOptions = {
4
+ audit?: VoiceProductionReadinessAuditOptions;
5
+ auditDeliveries?: VoiceProductionReadinessAuditDeliveryOptions;
6
+ bargeInReports?: VoiceProductionReadinessRoutesOptions['bargeInReports'];
7
+ carriers?: VoiceProductionReadinessRoutesOptions['carriers'];
8
+ deliveryRuntime?: VoiceProductionReadinessRoutesOptions['deliveryRuntime'];
9
+ gate?: VoiceProductionReadinessRoutesOptions['gate'];
10
+ links?: VoiceProductionReadinessRoutesOptions['links'];
11
+ opsActionHistory?: VoiceProductionReadinessOpsActionHistoryOptions;
12
+ phoneAgentSmokes?: VoiceProductionReadinessRoutesOptions['phoneAgentSmokes'];
13
+ proofSources?: VoiceProductionReadinessRoutesOptions['proofSources'];
14
+ providerRoutingContracts?: VoiceProductionReadinessRoutesOptions['providerRoutingContracts'];
15
+ reconnectContracts?: VoiceProductionReadinessRoutesOptions['reconnectContracts'];
16
+ traceDeliveries?: VoiceProductionReadinessTraceDeliveryOptions;
17
+ };
18
+ export type VoiceReadinessProfileRoutesOptions = Partial<Omit<VoiceProductionReadinessRoutesOptions, 'store'>>;
19
+ export declare const createVoiceReadinessProfile: (profile: VoiceReadinessProfileName, options?: VoiceReadinessProfileOptions) => VoiceReadinessProfileRoutesOptions;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.157",
3
+ "version": "0.0.22-beta.159",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",