@absolutejs/voice 0.0.21 → 0.0.22-beta.0

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 (39) hide show
  1. package/README.md +499 -2
  2. package/dist/angular/index.js +90 -0
  3. package/dist/angular/voice-controller.service.d.ts +6 -0
  4. package/dist/angular/voice-stream.service.d.ts +6 -0
  5. package/dist/client/actions.d.ts +41 -0
  6. package/dist/client/audioPlayer.d.ts +40 -0
  7. package/dist/client/duplex.d.ts +3 -0
  8. package/dist/client/htmxBootstrap.js +84 -0
  9. package/dist/client/index.d.ts +2 -0
  10. package/dist/client/index.js +507 -5
  11. package/dist/correction.d.ts +18 -1
  12. package/dist/fileStore.d.ts +27 -0
  13. package/dist/index.d.ts +12 -1
  14. package/dist/index.js +2425 -33
  15. package/dist/ops.d.ts +100 -0
  16. package/dist/react/index.js +86 -0
  17. package/dist/react/useVoiceController.d.ts +6 -0
  18. package/dist/react/useVoiceStream.d.ts +6 -0
  19. package/dist/routing.d.ts +3 -0
  20. package/dist/runtimeOps.d.ts +23 -0
  21. package/dist/svelte/index.js +84 -0
  22. package/dist/telephony/response.d.ts +7 -0
  23. package/dist/telephony/twilio.d.ts +116 -0
  24. package/dist/testing/benchmark.d.ts +59 -4
  25. package/dist/testing/corrected.d.ts +41 -0
  26. package/dist/testing/duplex.d.ts +59 -0
  27. package/dist/testing/fixtures.d.ts +18 -2
  28. package/dist/testing/index.d.ts +5 -0
  29. package/dist/testing/index.js +4940 -307
  30. package/dist/testing/review.d.ts +143 -0
  31. package/dist/testing/sessionBenchmark.d.ts +25 -0
  32. package/dist/testing/stt.d.ts +2 -1
  33. package/dist/testing/telephony.d.ts +70 -0
  34. package/dist/testing/tts.d.ts +73 -0
  35. package/dist/types.d.ts +290 -3
  36. package/dist/vue/index.js +90 -0
  37. package/dist/vue/useVoiceController.d.ts +11 -0
  38. package/dist/vue/useVoiceStream.d.ts +11 -0
  39. package/package.json +115 -1
@@ -0,0 +1,143 @@
1
+ import type { VoiceCallDisposition, VoiceServerMessage } from '../types';
2
+ type ReviewTimelineSource = 'benchmark' | 'stt' | 'turn' | 'twilio';
3
+ export type VoiceCallReviewTimelineEvent = {
4
+ atMs: number;
5
+ event: string;
6
+ source: ReviewTimelineSource;
7
+ bytes?: number;
8
+ chunkDurationMs?: number;
9
+ chunkIndex?: number;
10
+ confidence?: number;
11
+ name?: string;
12
+ reason?: string;
13
+ text?: string;
14
+ track?: string;
15
+ };
16
+ export type VoiceCallReviewConfig = {
17
+ preset?: string;
18
+ stt?: Record<string, unknown>;
19
+ tts?: Record<string, unknown>;
20
+ turnDetection?: Record<string, unknown>;
21
+ };
22
+ export type VoiceCallReviewPostCallSummary = {
23
+ label: string;
24
+ recommendedAction: string;
25
+ reason?: string;
26
+ summary: string;
27
+ target?: string;
28
+ };
29
+ export type VoiceCallReviewSummary = {
30
+ clearLatencyMs?: number;
31
+ elapsedMs?: number;
32
+ firstOutboundMediaLatencyMs?: number;
33
+ firstTurnLatencyMs?: number;
34
+ markLatencyMs?: number;
35
+ outcome?: VoiceCallDisposition;
36
+ outboundMediaCount?: number;
37
+ pass: boolean;
38
+ termRecall?: number;
39
+ turnCount?: number;
40
+ wordErrorRate?: number;
41
+ };
42
+ export type VoiceCallReviewArtifact = {
43
+ id?: string;
44
+ config?: VoiceCallReviewConfig;
45
+ errors: string[];
46
+ expectedText?: string;
47
+ fixtureId?: string;
48
+ generatedAt?: number;
49
+ latencyBreakdown: Array<{
50
+ label: string;
51
+ valueMs: number;
52
+ }>;
53
+ notes: string[];
54
+ path?: string;
55
+ postCall?: VoiceCallReviewPostCallSummary;
56
+ summary: VoiceCallReviewSummary;
57
+ title: string;
58
+ timeline: VoiceCallReviewTimelineEvent[];
59
+ transcript: {
60
+ actual: string;
61
+ expected?: string;
62
+ };
63
+ };
64
+ export type StoredVoiceCallReviewArtifact = VoiceCallReviewArtifact & {
65
+ id: string;
66
+ };
67
+ export type VoiceCallReviewStore<TArtifact extends StoredVoiceCallReviewArtifact = StoredVoiceCallReviewArtifact> = {
68
+ get: (id: string) => Promise<TArtifact | undefined> | TArtifact | undefined;
69
+ list: () => Promise<TArtifact[]> | TArtifact[];
70
+ remove: (id: string) => Promise<void> | void;
71
+ set: (id: string, artifact: TArtifact) => Promise<void> | void;
72
+ };
73
+ type LiveTelephonyFixture = {
74
+ actualText: string;
75
+ clearLatencyMs?: number;
76
+ elapsedMs?: number;
77
+ errors?: string[];
78
+ expectedText?: string;
79
+ fixtureId?: string;
80
+ firstOutboundMediaLatencyMs?: number;
81
+ firstTurnLatencyMs?: number;
82
+ markLatencyMs?: number;
83
+ outboundMediaCount?: number;
84
+ passes: boolean;
85
+ termRecall?: number;
86
+ title?: string;
87
+ turnCount?: number;
88
+ wordErrorRate?: number;
89
+ };
90
+ type LiveTelephonyTraceEvent = VoiceCallReviewTimelineEvent;
91
+ type LiveTelephonyReviewInput = {
92
+ fixtures?: LiveTelephonyFixture[];
93
+ generatedAt?: number;
94
+ trace?: LiveTelephonyTraceEvent[];
95
+ ttsConfig?: Record<string, unknown>;
96
+ turnDetectionConfig?: Record<string, unknown>;
97
+ variant?: {
98
+ description?: string;
99
+ id?: string;
100
+ model?: string;
101
+ };
102
+ };
103
+ export type VoiceCallReviewRecorderOptions = {
104
+ config?: VoiceCallReviewConfig;
105
+ fixtureId?: string;
106
+ now?: () => number;
107
+ path?: string;
108
+ title?: string;
109
+ };
110
+ export type VoiceCallReviewRecorder = {
111
+ finalize: () => VoiceCallReviewArtifact;
112
+ recordError: (error: unknown) => void;
113
+ recordTwilioInbound: (input: {
114
+ bytes?: number;
115
+ chunkDurationMs?: number;
116
+ event: 'connected' | 'mark' | 'media' | 'start' | 'stop';
117
+ name?: string;
118
+ reason?: string;
119
+ text?: string;
120
+ track?: string;
121
+ }) => void;
122
+ recordTwilioOutbound: (input: {
123
+ bytes?: number;
124
+ chunkDurationMs?: number;
125
+ event: 'clear' | 'mark' | 'media';
126
+ name?: string;
127
+ reason?: string;
128
+ text?: string;
129
+ track?: string;
130
+ }) => void;
131
+ recordVoiceMessage: (message: VoiceServerMessage) => void;
132
+ };
133
+ export declare const withVoiceCallReviewId: <TArtifact extends VoiceCallReviewArtifact = VoiceCallReviewArtifact>(id: string, artifact: TArtifact) => TArtifact & {
134
+ id: string;
135
+ };
136
+ export declare const createVoiceCallReviewFromLiveTelephonyReport: (report: LiveTelephonyReviewInput, options?: {
137
+ path?: string;
138
+ preset?: string;
139
+ }) => VoiceCallReviewArtifact;
140
+ export declare const createVoiceCallReviewRecorder: (options?: VoiceCallReviewRecorderOptions) => VoiceCallReviewRecorder;
141
+ export declare const renderVoiceCallReviewMarkdown: (artifact: VoiceCallReviewArtifact) => string;
142
+ export declare const renderVoiceCallReviewHTML: (artifact: VoiceCallReviewArtifact) => string;
143
+ export {};
@@ -5,7 +5,9 @@ export type VoiceSessionBenchmarkScenario = VoiceTestFixture & {
5
5
  expectedTurnTexts: string[];
6
6
  phraseHints?: VoicePhraseHint[];
7
7
  reconnectAtChunkIndex?: number;
8
+ reconnectAtChunkIndices?: number[];
8
9
  reconnectPauseMs?: number;
10
+ reconnectPauseMsByIndex?: number[];
9
11
  silenceMs?: number;
10
12
  speechThreshold?: number;
11
13
  transcriptStabilityMs?: number;
@@ -29,14 +31,20 @@ export type VoiceSessionBenchmarkTurnResult = {
29
31
  };
30
32
  export type VoiceSessionBenchmarkScenarioResult = {
31
33
  actualTurns: string[];
34
+ averageRelativeCostUnits: number;
32
35
  duplicateTurnCount: number;
33
36
  elapsedMs: number;
37
+ fallbackReplayAudioMs: number;
38
+ expectedReconnectCount: number;
34
39
  expectedTurns: string[];
35
40
  fixtureId: string;
41
+ primaryAudioMs: number;
36
42
  passes: boolean;
43
+ reconnectCount: number;
37
44
  reconnectTriggered: boolean;
38
45
  tags: string[];
39
46
  title: string;
47
+ turnPassRate: number;
40
48
  turnCountDelta: number;
41
49
  turnResults: VoiceSessionBenchmarkTurnResult[];
42
50
  trace?: VoiceSessionBenchmarkTraceEntry[];
@@ -44,10 +52,16 @@ export type VoiceSessionBenchmarkScenarioResult = {
44
52
  export type VoiceSessionBenchmarkSummary = {
45
53
  adapterId: string;
46
54
  averageElapsedMs: number;
55
+ averageFallbackReplayAudioMs: number;
56
+ averagePrimaryAudioMs: number;
57
+ averageReconnectCount: number;
58
+ averageRelativeCostUnits: number;
59
+ averageTurnPassRate: number;
47
60
  averageWordErrorRate: number;
48
61
  duplicateTurnRate: number;
49
62
  passCount: number;
50
63
  passRate: number;
64
+ reconnectCoverageRate: number;
51
65
  reconnectSuccessRate: number;
52
66
  scenarioCount: number;
53
67
  scenariosWithDuplicateTurns: number;
@@ -61,6 +75,11 @@ export type VoiceSessionBenchmarkReport = {
61
75
  };
62
76
  export type VoiceSessionBenchmarkScenarioAggregate = {
63
77
  averageElapsedMs: number;
78
+ averageFallbackReplayAudioMs: number;
79
+ averagePrimaryAudioMs: number;
80
+ averageReconnectCount: number;
81
+ averageRelativeCostUnits: number;
82
+ averageTurnPassRate: number;
64
83
  averageWordErrorRate: number;
65
84
  bestWordErrorRate: number;
66
85
  fixtureId: string;
@@ -75,10 +94,16 @@ export type VoiceSessionBenchmarkScenarioAggregate = {
75
94
  export type VoiceSessionBenchmarkSeriesSummary = {
76
95
  adapterId: string;
77
96
  averageElapsedMs: number;
97
+ averageFallbackReplayAudioMs: number;
78
98
  averagePassRate: number;
99
+ averagePrimaryAudioMs: number;
100
+ averageReconnectCount: number;
101
+ averageRelativeCostUnits: number;
102
+ averageTurnPassRate: number;
79
103
  averageWordErrorRate: number;
80
104
  flakyScenarioCount: number;
81
105
  generatedRunCount: number;
106
+ reconnectCoverageRate: number;
82
107
  reconnectSuccessRate: number;
83
108
  scenarioCount: number;
84
109
  stableScenarioCount: number;
@@ -1,9 +1,10 @@
1
1
  import { type VoiceTranscriptAccuracy } from './accuracy';
2
- import type { STTAdapter, VoiceCloseEvent, VoiceEndOfTurnEvent, VoiceErrorEvent, VoiceFinalEvent, VoicePartialEvent } from '../types';
2
+ import type { STTAdapter, STTAdapterOpenOptions, VoiceCloseEvent, VoiceEndOfTurnEvent, VoiceErrorEvent, VoiceFinalEvent, VoicePartialEvent } from '../types';
3
3
  import type { VoiceTestFixture } from './fixtures';
4
4
  export type VoiceSTTAdapterHarnessOptions = {
5
5
  chunkDurationMs?: number;
6
6
  idleTimeoutMs?: number;
7
+ openOptions?: Partial<STTAdapterOpenOptions> | ((fixture: VoiceTestFixture) => Partial<STTAdapterOpenOptions> | undefined);
7
8
  settleMs?: number;
8
9
  tailPaddingMs?: number;
9
10
  transcriptThreshold?: number;
@@ -0,0 +1,70 @@
1
+ export type VoiceTelephonyBenchmarkScenario = {
2
+ expectClear: boolean;
3
+ expectMark: boolean;
4
+ expectOutboundMedia: boolean;
5
+ id: string;
6
+ secondInboundDelayMs?: number;
7
+ sttDelayMs?: number;
8
+ title: string;
9
+ ttsChunkCount?: number;
10
+ ttsChunkDelayMs?: number;
11
+ };
12
+ export type VoiceTelephonyBenchmarkScenarioResult = {
13
+ clearCount: number;
14
+ clearLatencyMs?: number;
15
+ elapsedMs: number;
16
+ expectClear: boolean;
17
+ expectMark: boolean;
18
+ expectOutboundMedia: boolean;
19
+ fixtureId: string;
20
+ firstOutboundMediaLatencyMs?: number;
21
+ markCount: number;
22
+ markLatencyMs?: number;
23
+ outboundMediaCount: number;
24
+ passes: boolean;
25
+ receivedAudioBytes: number;
26
+ title: string;
27
+ };
28
+ export type VoiceTelephonyBenchmarkSummary = {
29
+ averageClearLatencyMs?: number;
30
+ averageElapsedMs: number;
31
+ averageFirstOutboundMediaLatencyMs?: number;
32
+ averageMarkLatencyMs?: number;
33
+ passCount: number;
34
+ passRate: number;
35
+ scenarioCount: number;
36
+ totalOutboundMediaCount: number;
37
+ };
38
+ export type VoiceTelephonyBenchmarkReport = {
39
+ fixtures: VoiceTelephonyBenchmarkScenarioResult[];
40
+ generatedAt: number;
41
+ summary: VoiceTelephonyBenchmarkSummary;
42
+ };
43
+ type VoiceTelephonyBenchmarkOptions = {
44
+ timeoutMs?: number;
45
+ };
46
+ export declare const getDefaultVoiceTelephonyBenchmarkScenarios: () => {
47
+ expectClear: boolean;
48
+ expectMark: boolean;
49
+ expectOutboundMedia: boolean;
50
+ id: string;
51
+ secondInboundDelayMs?: number;
52
+ sttDelayMs?: number;
53
+ title: string;
54
+ ttsChunkCount?: number;
55
+ ttsChunkDelayMs?: number;
56
+ }[];
57
+ export declare const runVoiceTelephonyBenchmarkScenario: (scenario: VoiceTelephonyBenchmarkScenario, options?: VoiceTelephonyBenchmarkOptions) => Promise<VoiceTelephonyBenchmarkScenarioResult>;
58
+ export declare const summarizeVoiceTelephonyBenchmark: (fixtures: VoiceTelephonyBenchmarkScenarioResult[]) => VoiceTelephonyBenchmarkSummary;
59
+ export declare const runVoiceTelephonyBenchmark: (scenarios?: {
60
+ expectClear: boolean;
61
+ expectMark: boolean;
62
+ expectOutboundMedia: boolean;
63
+ id: string;
64
+ secondInboundDelayMs?: number;
65
+ sttDelayMs?: number;
66
+ title: string;
67
+ ttsChunkCount?: number;
68
+ ttsChunkDelayMs?: number;
69
+ }[], options?: VoiceTelephonyBenchmarkOptions) => Promise<VoiceTelephonyBenchmarkReport>;
70
+ export {};
@@ -0,0 +1,73 @@
1
+ import type { AudioFormat, RealtimeAdapter, RealtimeAdapterOpenOptions, TTSAdapter, TTSAdapterOpenOptions } from '../types';
2
+ export type VoiceTTSBenchmarkFixture = {
3
+ id: string;
4
+ tags?: string[];
5
+ text: string;
6
+ title: string;
7
+ };
8
+ export type VoiceTTSBenchmarkFixtureResult = {
9
+ audioChunkCount: number;
10
+ audioDurationMs: number;
11
+ audioFormat?: AudioFormat;
12
+ closeCount: number;
13
+ elapsedMs: number;
14
+ errorCount: number;
15
+ fixtureId: string;
16
+ firstAudioLatencyMs?: number;
17
+ interruptionLatencyMs?: number;
18
+ interruptionRequestedAtMs?: number;
19
+ passes: boolean;
20
+ postInterruptAudioBytes?: number;
21
+ preInterruptAudioBytes?: number;
22
+ tags: string[];
23
+ textLength: number;
24
+ title: string;
25
+ totalAudioBytes: number;
26
+ };
27
+ export type VoiceTTSBenchmarkSummary = {
28
+ adapterId: string;
29
+ averageAudioChunkCount: number;
30
+ averageAudioDurationMs: number;
31
+ averageElapsedMs: number;
32
+ averageFirstAudioLatencyMs?: number;
33
+ averageInterruptionLatencyMs?: number;
34
+ averageTextLength: number;
35
+ fixtureCount: number;
36
+ passCount: number;
37
+ passRate: number;
38
+ totalAudioBytes: number;
39
+ totalErrorCount: number;
40
+ };
41
+ export type VoiceTTSBenchmarkReport = {
42
+ adapterId: string;
43
+ fixtures: VoiceTTSBenchmarkFixtureResult[];
44
+ generatedAt: number;
45
+ profileId?: string;
46
+ summary: VoiceTTSBenchmarkSummary;
47
+ };
48
+ export type VoiceTTSBenchmarkOptions = {
49
+ idleTimeoutMs?: number;
50
+ interruptAfterFirstAudioMs?: number;
51
+ minAudioBytes?: number;
52
+ openOptions?: Partial<TTSAdapterOpenOptions & RealtimeAdapterOpenOptions> | ((fixture: VoiceTTSBenchmarkFixture) => Partial<TTSAdapterOpenOptions & RealtimeAdapterOpenOptions> | undefined);
53
+ realtimeFormat?: AudioFormat;
54
+ settleMs?: number;
55
+ waitForFirstAudioMs?: number;
56
+ waitForCloseAfterInterruptMs?: number;
57
+ };
58
+ type VoiceOutputAdapter = TTSAdapter | RealtimeAdapter;
59
+ export declare const getDefaultTTSBenchmarkFixtures: () => {
60
+ id: string;
61
+ tags?: string[];
62
+ text: string;
63
+ title: string;
64
+ }[];
65
+ export declare const runTTSAdapterFixture: (adapter: VoiceOutputAdapter, fixture: VoiceTTSBenchmarkFixture, options?: VoiceTTSBenchmarkOptions) => Promise<VoiceTTSBenchmarkFixtureResult>;
66
+ export declare const runTTSAdapterBenchmark: (adapterId: string, adapter: VoiceOutputAdapter, fixtures?: {
67
+ id: string;
68
+ tags?: string[];
69
+ text: string;
70
+ title: string;
71
+ }[], options?: VoiceTTSBenchmarkOptions) => Promise<VoiceTTSBenchmarkReport>;
72
+ export declare const summarizeTTSBenchmark: (adapterId: string, fixtures: VoiceTTSBenchmarkFixtureResult[]) => VoiceTTSBenchmarkSummary;
73
+ export {};