@absolutejs/voice 0.0.22-beta.6 → 0.0.22-beta.61

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.
Files changed (81) hide show
  1. package/README.md +205 -0
  2. package/dist/angular/index.d.ts +4 -0
  3. package/dist/angular/index.js +587 -43
  4. package/dist/angular/voice-app-kit-status.service.d.ts +12 -0
  5. package/dist/angular/voice-ops-status.component.d.ts +15 -0
  6. package/dist/angular/voice-provider-status.service.d.ts +12 -0
  7. package/dist/angular/voice-routing-status.service.d.ts +11 -0
  8. package/dist/angular/voice-stream.service.d.ts +2 -0
  9. package/dist/angular/voice-workflow-status.service.d.ts +12 -0
  10. package/dist/appKit.d.ts +92 -0
  11. package/dist/assistantHealth.d.ts +81 -0
  12. package/dist/client/actions.d.ts +22 -0
  13. package/dist/client/appKitStatus.d.ts +19 -0
  14. package/dist/client/connection.d.ts +3 -0
  15. package/dist/client/htmxBootstrap.js +44 -2
  16. package/dist/client/index.d.ts +18 -0
  17. package/dist/client/index.js +893 -2
  18. package/dist/client/opsStatusWidget.d.ts +40 -0
  19. package/dist/client/providerSimulationControls.d.ts +33 -0
  20. package/dist/client/providerSimulationControlsWidget.d.ts +20 -0
  21. package/dist/client/providerStatus.d.ts +19 -0
  22. package/dist/client/providerStatusWidget.d.ts +32 -0
  23. package/dist/client/routingStatus.d.ts +19 -0
  24. package/dist/client/routingStatusWidget.d.ts +28 -0
  25. package/dist/client/workflowStatus.d.ts +19 -0
  26. package/dist/diagnosticsRoutes.d.ts +44 -0
  27. package/dist/evalRoutes.d.ts +213 -0
  28. package/dist/handoff.d.ts +54 -0
  29. package/dist/handoffHealth.d.ts +94 -0
  30. package/dist/index.d.ts +32 -4
  31. package/dist/index.js +4222 -133
  32. package/dist/modelAdapters.d.ts +75 -0
  33. package/dist/opsConsoleRoutes.d.ts +77 -0
  34. package/dist/opsWebhook.d.ts +126 -0
  35. package/dist/providerAdapters.d.ts +48 -0
  36. package/dist/providerHealth.d.ts +79 -0
  37. package/dist/qualityRoutes.d.ts +76 -0
  38. package/dist/queue.d.ts +52 -0
  39. package/dist/react/VoiceOpsStatus.d.ts +6 -0
  40. package/dist/react/VoiceProviderSimulationControls.d.ts +5 -0
  41. package/dist/react/VoiceProviderStatus.d.ts +6 -0
  42. package/dist/react/VoiceRoutingStatus.d.ts +6 -0
  43. package/dist/react/index.d.ts +9 -0
  44. package/dist/react/index.js +1295 -11
  45. package/dist/react/useVoiceAppKitStatus.d.ts +8 -0
  46. package/dist/react/useVoiceController.d.ts +2 -0
  47. package/dist/react/useVoiceProviderSimulationControls.d.ts +10 -0
  48. package/dist/react/useVoiceProviderStatus.d.ts +8 -0
  49. package/dist/react/useVoiceRoutingStatus.d.ts +8 -0
  50. package/dist/react/useVoiceStream.d.ts +2 -0
  51. package/dist/react/useVoiceWorkflowStatus.d.ts +8 -0
  52. package/dist/resilienceRoutes.d.ts +117 -0
  53. package/dist/sessionReplay.d.ts +175 -0
  54. package/dist/svelte/createVoiceAppKitStatus.d.ts +8 -0
  55. package/dist/svelte/createVoiceOpsStatus.d.ts +9 -0
  56. package/dist/svelte/createVoiceProviderSimulationControls.d.ts +11 -0
  57. package/dist/svelte/createVoiceProviderStatus.d.ts +10 -0
  58. package/dist/svelte/createVoiceRoutingStatus.d.ts +10 -0
  59. package/dist/svelte/createVoiceWorkflowStatus.d.ts +8 -0
  60. package/dist/svelte/index.d.ts +6 -0
  61. package/dist/svelte/index.js +923 -3
  62. package/dist/testing/index.d.ts +2 -0
  63. package/dist/testing/index.js +1537 -7
  64. package/dist/testing/ioProviderSimulator.d.ts +41 -0
  65. package/dist/testing/providerSimulator.d.ts +44 -0
  66. package/dist/trace.d.ts +1 -1
  67. package/dist/types.d.ts +84 -2
  68. package/dist/vue/VoiceOpsStatus.d.ts +30 -0
  69. package/dist/vue/VoiceProviderSimulationControls.d.ts +88 -0
  70. package/dist/vue/VoiceProviderStatus.d.ts +51 -0
  71. package/dist/vue/VoiceRoutingStatus.d.ts +51 -0
  72. package/dist/vue/index.d.ts +9 -0
  73. package/dist/vue/index.js +1354 -25
  74. package/dist/vue/useVoiceAppKitStatus.d.ts +9 -0
  75. package/dist/vue/useVoiceProviderSimulationControls.d.ts +24 -0
  76. package/dist/vue/useVoiceProviderStatus.d.ts +9 -0
  77. package/dist/vue/useVoiceRoutingStatus.d.ts +8 -0
  78. package/dist/vue/useVoiceStream.d.ts +2 -0
  79. package/dist/vue/useVoiceWorkflowStatus.d.ts +9 -0
  80. package/dist/workflowContract.d.ts +91 -0
  81. package/package.json +1 -1
@@ -29,11 +29,86 @@ export type GeminiVoiceAssistantModelOptions = {
29
29
  baseUrl?: string;
30
30
  fetch?: typeof fetch;
31
31
  maxOutputTokens?: number;
32
+ maxRetries?: number;
32
33
  model?: string;
33
34
  onUsage?: (usage: Record<string, unknown>) => Promise<void> | void;
34
35
  temperature?: number;
35
36
  };
37
+ export type VoiceProviderRouterEvent<TProvider extends string = string> = {
38
+ at: number;
39
+ attempt: number;
40
+ elapsedMs: number;
41
+ error?: string;
42
+ fallbackProvider?: TProvider;
43
+ latencyBudgetMs?: number;
44
+ provider: TProvider;
45
+ providerHealth?: VoiceProviderRouterProviderHealth<TProvider>;
46
+ rateLimited?: boolean;
47
+ recovered?: boolean;
48
+ selectedProvider: TProvider;
49
+ suppressionRemainingMs?: number;
50
+ suppressedUntil?: number;
51
+ status: 'error' | 'fallback' | 'success';
52
+ timedOut?: boolean;
53
+ };
54
+ export type VoiceProviderRouterFallbackMode = 'never' | 'provider-error' | 'rate-limit';
55
+ export type VoiceProviderRouterStrategy = 'balanced' | 'ordered' | 'prefer-cheapest' | 'prefer-fastest' | 'prefer-selected' | 'quality-first';
56
+ export type VoiceProviderRouterPolicyPreset = 'balanced' | 'cost-cap' | 'cost-first' | 'latency-first' | 'quality-first';
57
+ export type VoiceProviderRouterPolicyWeights = {
58
+ cost?: number;
59
+ latencyMs?: number;
60
+ priority?: number;
61
+ quality?: number;
62
+ };
63
+ export type VoiceProviderRouterPolicy<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TProvider extends string = string> = VoiceProviderRouterStrategy | VoiceProviderRouterPolicyPreset | {
64
+ allowProviders?: readonly TProvider[] | ((input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
65
+ fallbackMode?: VoiceProviderRouterFallbackMode;
66
+ maxCost?: number;
67
+ maxLatencyMs?: number;
68
+ minQuality?: number;
69
+ scoreProvider?: (provider: TProvider, profile: VoiceProviderRouterProviderProfile | undefined) => number;
70
+ strategy?: VoiceProviderRouterStrategy;
71
+ weights?: VoiceProviderRouterPolicyWeights;
72
+ };
73
+ export type VoiceProviderRouterProviderProfile = {
74
+ cost?: number;
75
+ latencyMs?: number;
76
+ priority?: number;
77
+ quality?: number;
78
+ timeoutMs?: number;
79
+ };
80
+ export declare const resolveVoiceProviderRoutingPolicyPreset: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TProvider extends string = string>(preset: VoiceProviderRouterPolicyPreset, options?: Omit<Extract<VoiceProviderRouterPolicy<TContext, TSession, TProvider>, Record<string, unknown>>, "strategy">) => Extract<VoiceProviderRouterPolicy<TContext, TSession, TProvider>, Record<string, unknown>>;
81
+ export type VoiceProviderRouterHealthOptions = {
82
+ cooldownMs?: number;
83
+ failureThreshold?: number;
84
+ now?: () => number;
85
+ rateLimitCooldownMs?: number;
86
+ };
87
+ export type VoiceProviderRouterProviderHealth<TProvider extends string = string> = {
88
+ consecutiveFailures: number;
89
+ lastFailureAt?: number;
90
+ lastRateLimitedAt?: number;
91
+ provider: TProvider;
92
+ status: 'healthy' | 'suppressed';
93
+ suppressedUntil?: number;
94
+ };
95
+ export type VoiceProviderRouterOptions<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TProvider extends string = string> = {
96
+ allowProviders?: readonly TProvider[] | ((input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
97
+ fallback?: TProvider[] | ((input: VoiceAgentModelInput<TContext, TSession>) => readonly TProvider[] | Promise<readonly TProvider[]>);
98
+ fallbackMode?: VoiceProviderRouterFallbackMode;
99
+ isProviderError?: (error: unknown, provider: TProvider) => boolean;
100
+ isRateLimitError?: (error: unknown, provider: TProvider) => boolean;
101
+ isTimeoutError?: (error: unknown, provider: TProvider) => boolean;
102
+ onProviderEvent?: (event: VoiceProviderRouterEvent<TProvider>, input: VoiceAgentModelInput<TContext, TSession>) => Promise<void> | void;
103
+ policy?: VoiceProviderRouterPolicy<TContext, TSession, TProvider>;
104
+ providerHealth?: boolean | VoiceProviderRouterHealthOptions;
105
+ providerProfiles?: Partial<Record<TProvider, VoiceProviderRouterProviderProfile>>;
106
+ timeoutMs?: number;
107
+ providers: Partial<Record<TProvider, VoiceAgentModel<TContext, TSession, TResult>>>;
108
+ selectProvider?: (input: VoiceAgentModelInput<TContext, TSession>) => TProvider | undefined | Promise<TProvider | undefined>;
109
+ };
36
110
  export declare const createJSONVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: VoiceJSONAssistantModelOptions<TContext, TSession, TResult>) => VoiceAgentModel<TContext, TSession, TResult>;
111
+ export declare const createVoiceProviderRouter: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TProvider extends string = string>(options: VoiceProviderRouterOptions<TContext, TSession, TResult, TProvider>) => VoiceAgentModel<TContext, TSession, TResult>;
37
112
  export declare const createOpenAIVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: OpenAIVoiceAssistantModelOptions) => VoiceAgentModel<TContext, TSession, TResult>;
38
113
  export declare const createAnthropicVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: AnthropicVoiceAssistantModelOptions) => VoiceAgentModel<TContext, TSession, TResult>;
39
114
  export declare const createGeminiVoiceAssistantModel: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown>(options: GeminiVoiceAssistantModelOptions) => VoiceAgentModel<TContext, TSession, TResult>;
@@ -0,0 +1,77 @@
1
+ import { Elysia } from 'elysia';
2
+ import { type VoiceQualityReport } from './qualityRoutes';
3
+ import { type VoiceRoutingEvent } from './resilienceRoutes';
4
+ import { type VoiceSessionListItem } from './sessionReplay';
5
+ import { summarizeVoiceTrace, type VoiceTraceEventStore } from './trace';
6
+ export type VoiceOpsConsoleLink = {
7
+ description?: string;
8
+ href: string;
9
+ label: string;
10
+ statusHref?: string;
11
+ };
12
+ export type VoiceOpsConsoleReport = {
13
+ checkedAt: number;
14
+ eventCount: number;
15
+ handoffs: {
16
+ failed: number;
17
+ total: number;
18
+ };
19
+ links: VoiceOpsConsoleLink[];
20
+ providers: {
21
+ degraded: number;
22
+ healthy: number;
23
+ total: number;
24
+ };
25
+ quality: VoiceQualityReport;
26
+ recentRoutingEvents: VoiceRoutingEvent[];
27
+ recentSessions: VoiceSessionListItem[];
28
+ sessions: {
29
+ failed: number;
30
+ healthy: number;
31
+ total: number;
32
+ };
33
+ trace: ReturnType<typeof summarizeVoiceTrace>;
34
+ };
35
+ export type VoiceOpsConsoleRoutesOptions = {
36
+ headers?: HeadersInit;
37
+ links?: VoiceOpsConsoleLink[];
38
+ llmProviders?: readonly string[];
39
+ name?: string;
40
+ path?: string;
41
+ store: VoiceTraceEventStore;
42
+ sttProviders?: readonly string[];
43
+ title?: string;
44
+ ttsProviders?: readonly string[];
45
+ };
46
+ export declare const buildVoiceOpsConsoleReport: (options: VoiceOpsConsoleRoutesOptions) => Promise<VoiceOpsConsoleReport>;
47
+ export declare const renderVoiceOpsConsoleHTML: (report: VoiceOpsConsoleReport, options?: {
48
+ title?: string;
49
+ }) => string;
50
+ export declare const createVoiceOpsConsoleRoutes: (options: VoiceOpsConsoleRoutesOptions) => Elysia<"", {
51
+ decorator: {};
52
+ store: {};
53
+ derive: {};
54
+ resolve: {};
55
+ }, {
56
+ typebox: {};
57
+ error: {};
58
+ }, {
59
+ schema: {};
60
+ standaloneSchema: {};
61
+ macro: {};
62
+ macroFn: {};
63
+ parser: {};
64
+ response: {};
65
+ }, {}, {
66
+ derive: {};
67
+ resolve: {};
68
+ schema: {};
69
+ standaloneSchema: {};
70
+ response: {};
71
+ }, {
72
+ derive: {};
73
+ resolve: {};
74
+ schema: {};
75
+ standaloneSchema: {};
76
+ response: {};
77
+ }>;
@@ -0,0 +1,126 @@
1
+ import { Elysia } from 'elysia';
2
+ import type { StoredVoiceIntegrationEvent, VoiceIntegrationEventType } from './ops';
3
+ import type { VoiceIntegrationHTTPSinkOptions, VoiceIntegrationSink } from './opsSinks';
4
+ type MaybePromise<T> = T | Promise<T>;
5
+ export type VoiceOpsWebhookLinkResolver = string | ((input: {
6
+ event: StoredVoiceIntegrationEvent;
7
+ }) => MaybePromise<string | undefined>);
8
+ export type VoiceOpsWebhookEntity = {
9
+ disposition?: string;
10
+ outcome?: string;
11
+ priority?: string;
12
+ queue?: string;
13
+ reviewId?: string;
14
+ scenarioId?: string;
15
+ sessionId?: string;
16
+ status?: string;
17
+ target?: string;
18
+ taskId?: string;
19
+ };
20
+ export type VoiceOpsWebhookEnvelope = {
21
+ entity: VoiceOpsWebhookEntity;
22
+ event: {
23
+ createdAt: number;
24
+ id: string;
25
+ payload: Record<string, unknown>;
26
+ type: VoiceIntegrationEventType;
27
+ };
28
+ links?: {
29
+ event?: string;
30
+ replay?: string;
31
+ review?: string;
32
+ task?: string;
33
+ };
34
+ schemaVersion: 1;
35
+ source: 'absolutejs-voice';
36
+ };
37
+ export type VoiceOpsWebhookSinkOptions = Omit<VoiceIntegrationHTTPSinkOptions<VoiceOpsWebhookEnvelope>, 'body'> & {
38
+ baseUrl?: string;
39
+ eventHref?: VoiceOpsWebhookLinkResolver;
40
+ replayHref?: VoiceOpsWebhookLinkResolver;
41
+ reviewHref?: VoiceOpsWebhookLinkResolver;
42
+ taskHref?: VoiceOpsWebhookLinkResolver;
43
+ };
44
+ export type VoiceOpsWebhookVerificationResult = {
45
+ ok: true;
46
+ } | {
47
+ ok: false;
48
+ reason: 'invalid-signature' | 'missing-secret' | 'missing-signature' | 'missing-timestamp' | 'stale-timestamp' | 'unsupported-algorithm';
49
+ };
50
+ export type VoiceOpsWebhookReceiverRoutesOptions = {
51
+ onEnvelope?: (input: {
52
+ envelope: VoiceOpsWebhookEnvelope;
53
+ request: Request;
54
+ }) => MaybePromise<void>;
55
+ path?: string;
56
+ signingSecret?: string;
57
+ toleranceMs?: number;
58
+ };
59
+ export declare const createVoiceOpsWebhookEnvelope: (input: {
60
+ baseUrl?: string;
61
+ event: StoredVoiceIntegrationEvent;
62
+ eventHref?: VoiceOpsWebhookLinkResolver;
63
+ replayHref?: VoiceOpsWebhookLinkResolver;
64
+ reviewHref?: VoiceOpsWebhookLinkResolver;
65
+ taskHref?: VoiceOpsWebhookLinkResolver;
66
+ }) => Promise<VoiceOpsWebhookEnvelope>;
67
+ export declare const createVoiceOpsWebhookSink: (options: VoiceOpsWebhookSinkOptions) => VoiceIntegrationSink;
68
+ export declare const verifyVoiceOpsWebhookSignature: (input: {
69
+ body: string;
70
+ now?: number;
71
+ secret?: string;
72
+ signature?: string | null;
73
+ timestamp?: string | null;
74
+ toleranceMs?: number;
75
+ }) => Promise<VoiceOpsWebhookVerificationResult>;
76
+ export declare const createVoiceOpsWebhookReceiverRoutes: (options?: VoiceOpsWebhookReceiverRoutesOptions) => Elysia<"", {
77
+ decorator: {};
78
+ store: {};
79
+ derive: {};
80
+ resolve: {};
81
+ }, {
82
+ typebox: {};
83
+ error: {};
84
+ }, {
85
+ schema: {};
86
+ standaloneSchema: {};
87
+ macro: {};
88
+ macroFn: {};
89
+ parser: {};
90
+ response: {};
91
+ }, {
92
+ [x: string]: {
93
+ post: {
94
+ body: unknown;
95
+ params: {};
96
+ query: unknown;
97
+ headers: unknown;
98
+ response: {
99
+ 200: {
100
+ ok: boolean;
101
+ reason: "invalid-signature" | "missing-secret" | "missing-signature" | "missing-timestamp" | "stale-timestamp" | "unsupported-algorithm";
102
+ eventId?: undefined;
103
+ type?: undefined;
104
+ } | {
105
+ eventId: string;
106
+ ok: boolean;
107
+ type: VoiceIntegrationEventType;
108
+ reason?: undefined;
109
+ };
110
+ };
111
+ };
112
+ };
113
+ }, {
114
+ derive: {};
115
+ resolve: {};
116
+ schema: {};
117
+ standaloneSchema: {};
118
+ response: {};
119
+ }, {
120
+ derive: {};
121
+ resolve: {};
122
+ schema: {};
123
+ standaloneSchema: {};
124
+ response: {};
125
+ }>;
126
+ export {};
@@ -0,0 +1,48 @@
1
+ import type { STTAdapter, STTAdapterOpenOptions, TTSAdapter, TTSAdapterOpenOptions } from './types';
2
+ import type { VoiceProviderRouterHealthOptions, VoiceProviderRouterProviderHealth, VoiceProviderRouterProviderProfile, VoiceProviderRouterPolicyPreset, VoiceProviderRouterPolicyWeights, VoiceProviderRouterStrategy } from './modelAdapters';
3
+ type MaybePromise<T> = T | Promise<T>;
4
+ type VoiceIOProviderKind = 'stt' | 'tts';
5
+ type VoiceIOProviderStatus = 'error' | 'fallback' | 'success';
6
+ export type VoiceIOProviderRouterEvent<TProvider extends string = string> = {
7
+ at: number;
8
+ attempt: number;
9
+ elapsedMs: number;
10
+ error?: string;
11
+ fallbackProvider?: TProvider;
12
+ kind: VoiceIOProviderKind;
13
+ latencyBudgetMs?: number;
14
+ operation: 'open' | 'send';
15
+ provider: TProvider;
16
+ providerHealth?: VoiceProviderRouterProviderHealth<TProvider>;
17
+ selectedProvider: TProvider;
18
+ status: VoiceIOProviderStatus;
19
+ suppressionRemainingMs?: number;
20
+ suppressedUntil?: number;
21
+ timedOut?: boolean;
22
+ };
23
+ export type VoiceIOProviderRouterPolicyConfig<TOpenOptions = unknown, TProvider extends string = string> = {
24
+ allowProviders?: readonly TProvider[] | ((input: TOpenOptions) => MaybePromise<readonly TProvider[]>);
25
+ maxCost?: number;
26
+ maxLatencyMs?: number;
27
+ minQuality?: number;
28
+ scoreProvider?: (provider: TProvider, profile: VoiceProviderRouterProviderProfile | undefined) => number;
29
+ strategy?: VoiceProviderRouterStrategy;
30
+ weights?: VoiceProviderRouterPolicyWeights;
31
+ };
32
+ export type VoiceIOProviderRouterPolicy<TOpenOptions = unknown, TProvider extends string = string> = VoiceProviderRouterStrategy | VoiceProviderRouterPolicyPreset | VoiceIOProviderRouterPolicyConfig<TOpenOptions, TProvider>;
33
+ export type VoiceIOProviderRouterOptions<TProvider extends string, TAdapter, TOpenOptions> = {
34
+ adapters: Partial<Record<TProvider, TAdapter>>;
35
+ fallback?: readonly TProvider[] | ((input: TOpenOptions) => MaybePromise<readonly TProvider[]>);
36
+ isProviderError?: (error: unknown, provider: TProvider) => boolean;
37
+ onProviderEvent?: (event: VoiceIOProviderRouterEvent<TProvider>, input: TOpenOptions) => Promise<void> | void;
38
+ policy?: VoiceIOProviderRouterPolicy<TOpenOptions, TProvider>;
39
+ providerHealth?: boolean | VoiceProviderRouterHealthOptions;
40
+ providerProfiles?: Partial<Record<TProvider, VoiceProviderRouterProviderProfile>>;
41
+ selectProvider?: (input: TOpenOptions) => MaybePromise<TProvider | undefined>;
42
+ timeoutMs?: number;
43
+ };
44
+ export type VoiceSTTProviderRouterOptions<TProvider extends string = string, TOptions extends STTAdapterOpenOptions = STTAdapterOpenOptions> = VoiceIOProviderRouterOptions<TProvider, STTAdapter<TOptions>, TOptions>;
45
+ export type VoiceTTSProviderRouterOptions<TProvider extends string = string, TOptions extends TTSAdapterOpenOptions = TTSAdapterOpenOptions> = VoiceIOProviderRouterOptions<TProvider, TTSAdapter<TOptions>, TOptions>;
46
+ export declare const createVoiceSTTProviderRouter: <TProvider extends string = string, TOptions extends STTAdapterOpenOptions = STTAdapterOpenOptions>(options: VoiceSTTProviderRouterOptions<TProvider, TOptions>) => STTAdapter<TOptions>;
47
+ export declare const createVoiceTTSProviderRouter: <TProvider extends string = string, TOptions extends TTSAdapterOpenOptions = TTSAdapterOpenOptions>(options: VoiceTTSProviderRouterOptions<TProvider, TOptions>) => TTSAdapter<TOptions>;
48
+ export {};
@@ -0,0 +1,79 @@
1
+ import { Elysia } from 'elysia';
2
+ import type { StoredVoiceTraceEvent, VoiceTraceEventStore } from './trace';
3
+ export type VoiceProviderHealthStatus = 'healthy' | 'idle' | 'rate-limited' | 'degraded' | 'recoverable' | 'suppressed';
4
+ export type VoiceProviderHealthSummary<TProvider extends string = string> = {
5
+ averageElapsedMs?: number;
6
+ errorCount: number;
7
+ fallbackCount: number;
8
+ lastError?: string;
9
+ lastErrorAt?: number;
10
+ lastSuccessAt?: number;
11
+ provider: TProvider;
12
+ rateLimited: boolean;
13
+ recommended: boolean;
14
+ runCount: number;
15
+ status: VoiceProviderHealthStatus;
16
+ suppressionRemainingMs?: number;
17
+ suppressedUntil?: number;
18
+ timeoutCount: number;
19
+ };
20
+ export type VoiceProviderHealthSummaryOptions<TProvider extends string = string> = {
21
+ events?: StoredVoiceTraceEvent[];
22
+ now?: number;
23
+ providers?: readonly TProvider[];
24
+ store?: VoiceTraceEventStore;
25
+ };
26
+ export type VoiceProviderHealthHandlerOptions<TProvider extends string = string> = VoiceProviderHealthSummaryOptions<TProvider>;
27
+ export type VoiceProviderHealthHTMLHandlerOptions<TProvider extends string = string> = VoiceProviderHealthHandlerOptions<TProvider> & {
28
+ headers?: HeadersInit;
29
+ render?: (providers: VoiceProviderHealthSummary<TProvider>[]) => string | Promise<string>;
30
+ };
31
+ export type VoiceProviderHealthRoutesOptions<TProvider extends string = string> = VoiceProviderHealthHTMLHandlerOptions<TProvider> & {
32
+ htmlPath?: false | string;
33
+ name?: string;
34
+ path?: string;
35
+ };
36
+ export declare const summarizeVoiceProviderHealth: <TProvider extends string = string>(input: StoredVoiceTraceEvent[] | VoiceProviderHealthSummaryOptions<TProvider>) => Promise<VoiceProviderHealthSummary<TProvider>[]>;
37
+ export declare const renderVoiceProviderHealthHTML: (providers: VoiceProviderHealthSummary[]) => string;
38
+ export declare const createVoiceProviderHealthJSONHandler: <TProvider extends string = string>(options: VoiceProviderHealthHandlerOptions<TProvider>) => () => Promise<VoiceProviderHealthSummary<TProvider>[]>;
39
+ export declare const createVoiceProviderHealthHTMLHandler: <TProvider extends string = string>(options: VoiceProviderHealthHTMLHandlerOptions<TProvider>) => () => Promise<Response>;
40
+ export declare const createVoiceProviderHealthRoutes: <TProvider extends string = string>(options: VoiceProviderHealthRoutesOptions<TProvider>) => Elysia<"", {
41
+ decorator: {};
42
+ store: {};
43
+ derive: {};
44
+ resolve: {};
45
+ }, {
46
+ typebox: {};
47
+ error: {};
48
+ }, {
49
+ schema: {};
50
+ standaloneSchema: {};
51
+ macro: {};
52
+ macroFn: {};
53
+ parser: {};
54
+ response: {};
55
+ }, {
56
+ [x: string]: {
57
+ get: {
58
+ body: unknown;
59
+ params: {};
60
+ query: unknown;
61
+ headers: unknown;
62
+ response: {
63
+ 200: VoiceProviderHealthSummary<TProvider>[];
64
+ };
65
+ };
66
+ };
67
+ }, {
68
+ derive: {};
69
+ resolve: {};
70
+ schema: {};
71
+ standaloneSchema: {};
72
+ response: {};
73
+ }, {
74
+ derive: {};
75
+ resolve: {};
76
+ schema: {};
77
+ standaloneSchema: {};
78
+ response: {};
79
+ }>;
@@ -0,0 +1,76 @@
1
+ import { Elysia } from 'elysia';
2
+ import { type StoredVoiceTraceEvent, type VoiceTraceEventStore } from './trace';
3
+ export type VoiceQualityStatus = 'pass' | 'fail';
4
+ export type VoiceQualityThresholds = {
5
+ maxDuplicateTurnRate?: number;
6
+ maxEmptyTurnRate?: number;
7
+ maxHandoffFailureRate?: number;
8
+ maxMissingAssistantReplyRate?: number;
9
+ maxProviderAverageLatencyMs?: number;
10
+ maxProviderErrorRate?: number;
11
+ maxProviderFallbackRate?: number;
12
+ maxProviderTimeoutRate?: number;
13
+ };
14
+ export type VoiceQualityMetric = {
15
+ actual: number;
16
+ label: string;
17
+ pass: boolean;
18
+ threshold: number;
19
+ unit: 'count' | 'ms' | 'rate';
20
+ };
21
+ export type VoiceQualityReport = {
22
+ checkedAt: number;
23
+ eventCount: number;
24
+ metrics: Record<string, VoiceQualityMetric>;
25
+ status: VoiceQualityStatus;
26
+ thresholds: Required<VoiceQualityThresholds>;
27
+ };
28
+ export type VoiceQualityLink = {
29
+ href: string;
30
+ label: string;
31
+ };
32
+ export type VoiceQualityRoutesOptions = {
33
+ events?: StoredVoiceTraceEvent[];
34
+ headers?: HeadersInit;
35
+ links?: VoiceQualityLink[];
36
+ name?: string;
37
+ path?: string;
38
+ store?: VoiceTraceEventStore;
39
+ thresholds?: VoiceQualityThresholds;
40
+ };
41
+ export declare const evaluateVoiceQuality: (input: {
42
+ events?: StoredVoiceTraceEvent[];
43
+ store?: VoiceTraceEventStore;
44
+ thresholds?: VoiceQualityThresholds;
45
+ }) => Promise<VoiceQualityReport>;
46
+ export declare const renderVoiceQualityHTML: (report: VoiceQualityReport, options?: {
47
+ links?: VoiceQualityLink[];
48
+ }) => string;
49
+ export declare const createVoiceQualityRoutes: (options: VoiceQualityRoutesOptions) => Elysia<"", {
50
+ decorator: {};
51
+ store: {};
52
+ derive: {};
53
+ resolve: {};
54
+ }, {
55
+ typebox: {};
56
+ error: {};
57
+ }, {
58
+ schema: {};
59
+ standaloneSchema: {};
60
+ macro: {};
61
+ macroFn: {};
62
+ parser: {};
63
+ response: {};
64
+ }, {}, {
65
+ derive: {};
66
+ resolve: {};
67
+ schema: {};
68
+ standaloneSchema: {};
69
+ response: {};
70
+ }, {
71
+ derive: {};
72
+ resolve: {};
73
+ schema: {};
74
+ standaloneSchema: {};
75
+ response: {};
76
+ }>;
package/dist/queue.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { RedisClient } from 'bun';
2
2
  import type { VoiceIntegrationSink } from './opsSinks';
3
3
  import type { VoiceTraceRedactionConfig, VoiceTraceSink, VoiceTraceSinkDeliveryRecord, VoiceTraceSinkDeliveryStore, VoiceTraceSinkDeliveryQueueStatus } from './trace';
4
+ import type { StoredVoiceHandoffDelivery, VoiceHandoffAdapter, VoiceHandoffDeliveryQueueStatus, VoiceHandoffDeliveryStore, VoiceSessionHandle, VoiceSessionRecord } from './types';
4
5
  import type { VoiceOpsTaskPriority, StoredVoiceOpsTask, StoredVoiceIntegrationEvent, VoiceIntegrationDeliveryStatus, VoiceIntegrationEventStore, VoiceIntegrationWebhookConfig, VoiceOpsTaskKind, VoiceOpsTaskStatus, VoiceOpsTaskStore } from './ops';
5
6
  export type VoiceOpsTaskLease = {
6
7
  expiresAt: number;
@@ -159,6 +160,50 @@ export type VoiceTraceSinkDeliveryQueueSummary = {
159
160
  skipped: number;
160
161
  total: number;
161
162
  };
163
+ export type VoiceHandoffDeliveryWorkerOptions<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TDelivery extends StoredVoiceHandoffDelivery<TContext, TSession, TResult> = StoredVoiceHandoffDelivery<TContext, TSession, TResult>> = {
164
+ adapters: VoiceHandoffAdapter<TContext, TSession, TResult>[];
165
+ api: VoiceSessionHandle<TContext, TSession, TResult>;
166
+ deadLetters?: VoiceHandoffDeliveryStore<TDelivery>;
167
+ deliveries: VoiceHandoffDeliveryStore<TDelivery>;
168
+ failMode?: 'record' | 'throw';
169
+ idempotency?: VoiceIdempotencyStore;
170
+ idempotencyTtlSeconds?: number;
171
+ leaseMs?: number;
172
+ leases: VoiceRedisTaskLeaseCoordinator;
173
+ maxFailures?: number;
174
+ onDeadLetter?: (delivery: TDelivery) => Promise<void> | void;
175
+ statuses?: VoiceHandoffDeliveryQueueStatus[];
176
+ workerId: string;
177
+ };
178
+ export type VoiceHandoffDeliveryWorkerResult = {
179
+ alreadyProcessed: number;
180
+ attempted: number;
181
+ deadLettered: number;
182
+ delivered: number;
183
+ failed: number;
184
+ skipped: number;
185
+ };
186
+ export type VoiceHandoffDeliveryWorkerLoopOptions<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TDelivery extends StoredVoiceHandoffDelivery<TContext, TSession, TResult> = StoredVoiceHandoffDelivery<TContext, TSession, TResult>> = {
187
+ onError?: (error: unknown) => Promise<void> | void;
188
+ pollIntervalMs?: number;
189
+ worker: ReturnType<typeof createVoiceHandoffDeliveryWorker<TContext, TSession, TResult, TDelivery>>;
190
+ };
191
+ export type VoiceHandoffDeliveryWorkerLoop = {
192
+ isRunning: () => boolean;
193
+ start: () => void;
194
+ stop: () => void;
195
+ tick: () => Promise<VoiceHandoffDeliveryWorkerResult>;
196
+ };
197
+ export type VoiceHandoffDeliveryQueueSummary = {
198
+ byAction: Array<[StoredVoiceHandoffDelivery['action'], number]>;
199
+ deadLettered: number;
200
+ delivered: number;
201
+ failed: number;
202
+ pending: number;
203
+ retryEligible: number;
204
+ skipped: number;
205
+ total: number;
206
+ };
162
207
  export type VoiceOpsTaskWorkerOptions<TTask extends StoredVoiceOpsTask = StoredVoiceOpsTask> = {
163
208
  leaseMs?: number;
164
209
  leases: VoiceRedisTaskLeaseCoordinator;
@@ -252,6 +297,9 @@ export declare const summarizeVoiceIntegrationEvents: <TEvent extends StoredVoic
252
297
  export declare const summarizeVoiceTraceSinkDeliveries: <TDelivery extends VoiceTraceSinkDeliveryRecord = VoiceTraceSinkDeliveryRecord>(deliveries: TDelivery[], input?: {
253
298
  deadLetters?: VoiceTraceSinkDeliveryStore<TDelivery>;
254
299
  }) => Promise<VoiceTraceSinkDeliveryQueueSummary> | VoiceTraceSinkDeliveryQueueSummary;
300
+ export declare const summarizeVoiceHandoffDeliveries: <TDelivery extends StoredVoiceHandoffDelivery = StoredVoiceHandoffDelivery>(deliveries: TDelivery[], input?: {
301
+ deadLetters?: VoiceHandoffDeliveryStore<TDelivery>;
302
+ }) => Promise<VoiceHandoffDeliveryQueueSummary> | VoiceHandoffDeliveryQueueSummary;
255
303
  export declare const summarizeVoiceOpsTaskQueue: <TTask extends StoredVoiceOpsTask = StoredVoiceOpsTask>(tasks: TTask[], input?: {
256
304
  deadLetters?: VoiceOpsTaskStore<TTask>;
257
305
  }) => Promise<VoiceOpsTaskQueueSummary> | VoiceOpsTaskQueueSummary;
@@ -269,6 +317,10 @@ export declare const createVoiceTraceSinkDeliveryWorker: <TDelivery extends Voic
269
317
  drain: () => Promise<VoiceTraceSinkDeliveryWorkerResult>;
270
318
  };
271
319
  export declare const createVoiceTraceSinkDeliveryWorkerLoop: <TDelivery extends VoiceTraceSinkDeliveryRecord = VoiceTraceSinkDeliveryRecord>(options: VoiceTraceSinkDeliveryWorkerLoopOptions<TDelivery>) => VoiceTraceSinkDeliveryWorkerLoop;
320
+ export declare const createVoiceHandoffDeliveryWorker: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TDelivery extends StoredVoiceHandoffDelivery<TContext, TSession, TResult> = StoredVoiceHandoffDelivery<TContext, TSession, TResult>>(options: VoiceHandoffDeliveryWorkerOptions<TContext, TSession, TResult, TDelivery>) => {
321
+ drain: () => Promise<VoiceHandoffDeliveryWorkerResult>;
322
+ };
323
+ export declare const createVoiceHandoffDeliveryWorkerLoop: <TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown, TDelivery extends StoredVoiceHandoffDelivery<TContext, TSession, TResult> = StoredVoiceHandoffDelivery<TContext, TSession, TResult>>(options: VoiceHandoffDeliveryWorkerLoopOptions<TContext, TSession, TResult, TDelivery>) => VoiceHandoffDeliveryWorkerLoop;
272
324
  export declare const createVoiceOpsTaskWorker: <TTask extends StoredVoiceOpsTask = StoredVoiceOpsTask>(options: VoiceOpsTaskWorkerOptions<TTask>) => VoiceOpsTaskWorker<TTask>;
273
325
  export declare const createVoiceOpsTaskProcessorWorker: <TTask extends StoredVoiceOpsTask = StoredVoiceOpsTask>(options: VoiceOpsTaskProcessorWorkerOptions<TTask>) => {
274
326
  drain: () => Promise<VoiceOpsTaskProcessorWorkerResult>;
@@ -0,0 +1,6 @@
1
+ import { type VoiceOpsStatusWidgetOptions } from '../client/opsStatusWidget';
2
+ export type VoiceOpsStatusProps = VoiceOpsStatusWidgetOptions & {
3
+ className?: string;
4
+ path?: string;
5
+ };
6
+ export declare const VoiceOpsStatus: ({ className, path, ...options }: VoiceOpsStatusProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import type { VoiceProviderSimulationControlsOptions } from '../client/providerSimulationControls';
2
+ export type VoiceProviderSimulationControlsProps<TProvider extends string = string> = VoiceProviderSimulationControlsOptions<TProvider> & {
3
+ className?: string;
4
+ };
5
+ export declare const VoiceProviderSimulationControls: <TProvider extends string = string>({ className, ...options }: VoiceProviderSimulationControlsProps<TProvider>) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { type VoiceProviderStatusWidgetOptions } from '../client/providerStatusWidget';
2
+ export type VoiceProviderStatusProps = VoiceProviderStatusWidgetOptions & {
3
+ className?: string;
4
+ path?: string;
5
+ };
6
+ export declare const VoiceProviderStatus: ({ className, path, ...options }: VoiceProviderStatusProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ import { type VoiceRoutingStatusWidgetOptions } from '../client/routingStatusWidget';
2
+ export type VoiceRoutingStatusProps = VoiceRoutingStatusWidgetOptions & {
3
+ className?: string;
4
+ path?: string;
5
+ };
6
+ export declare const VoiceRoutingStatus: ({ className, path, ...options }: VoiceRoutingStatusProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,11 @@
1
+ export { VoiceOpsStatus } from './VoiceOpsStatus';
2
+ export { VoiceProviderSimulationControls } from './VoiceProviderSimulationControls';
3
+ export { VoiceProviderStatus } from './VoiceProviderStatus';
4
+ export { VoiceRoutingStatus } from './VoiceRoutingStatus';
5
+ export { useVoiceAppKitStatus } from './useVoiceAppKitStatus';
1
6
  export { useVoiceStream } from './useVoiceStream';
2
7
  export { useVoiceController } from './useVoiceController';
8
+ export { useVoiceProviderStatus } from './useVoiceProviderStatus';
9
+ export { useVoiceProviderSimulationControls } from './useVoiceProviderSimulationControls';
10
+ export { useVoiceRoutingStatus } from './useVoiceRoutingStatus';
11
+ export { useVoiceWorkflowStatus } from './useVoiceWorkflowStatus';