@vrplatform/voice-chat 0.1.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.
package/src/index.ts ADDED
@@ -0,0 +1,33 @@
1
+ export { SupportAssistantDock } from "./SupportAssistantDock";
2
+ export {
3
+ useVRPilotHighlights,
4
+ VRPilotHighlightProvider,
5
+ } from "./VRPilotHighlightProvider";
6
+ export type {
7
+ SupportAssistantActivity,
8
+ SupportAssistantDockProps,
9
+ SupportAssistantEvent,
10
+ SupportAssistantLanguage,
11
+ SupportAssistantSessionCost,
12
+ SupportAssistantSessionContext,
13
+ SupportAssistantSessionEvent,
14
+ SupportAssistantTranscriptMessage,
15
+ } from "./SupportAssistantDock";
16
+ export type {
17
+ VRPilotFillFieldMode,
18
+ VRPilotFillFieldRequest,
19
+ VRPilotFillFieldResult,
20
+ VRPilotHighlightResult,
21
+ VRPilotHighlightRole,
22
+ VRPilotHighlightTargetRequest,
23
+ } from "./VRPilotHighlightProvider";
24
+ export {
25
+ createRealtimeActivityState,
26
+ reduceRealtimeActivity,
27
+ } from "./supportAssistantActivity";
28
+ export type {
29
+ RealtimeActivityState,
30
+ RealtimeActivityStatus,
31
+ RealtimeActivityTransition,
32
+ SupportAssistantActivity as SupportAssistantActivityState,
33
+ } from "./supportAssistantActivity";
@@ -0,0 +1,115 @@
1
+ export type SupportAssistantActivity =
2
+ | 'idle'
3
+ | 'connecting'
4
+ | 'listening'
5
+ | 'thinking'
6
+ | 'speaking'
7
+ | 'muted'
8
+ | 'error';
9
+
10
+ export type RealtimeActivityStatus =
11
+ | 'ready'
12
+ | 'listening'
13
+ | 'thinking'
14
+ | 'speaking';
15
+
16
+ export type RealtimeActivityState = {
17
+ assistantAudioActive: boolean;
18
+ responseInProgress: boolean;
19
+ userSpeechActive: boolean;
20
+ outputBufferStartedForResponse: boolean;
21
+ };
22
+
23
+ export type RealtimeActivityTransition = {
24
+ state: RealtimeActivityState;
25
+ status?: RealtimeActivityStatus;
26
+ shouldFallbackToReady?: boolean;
27
+ };
28
+
29
+ export function createRealtimeActivityState(): RealtimeActivityState {
30
+ return {
31
+ assistantAudioActive: false,
32
+ responseInProgress: false,
33
+ userSpeechActive: false,
34
+ outputBufferStartedForResponse: false,
35
+ };
36
+ }
37
+
38
+ export function reduceRealtimeActivity(
39
+ current: RealtimeActivityState,
40
+ eventType: string
41
+ ): RealtimeActivityTransition {
42
+ const state: RealtimeActivityState = { ...current };
43
+
44
+ switch (eventType) {
45
+ case 'session.updated':
46
+ return {
47
+ state,
48
+ status:
49
+ state.assistantAudioActive || state.responseInProgress
50
+ ? undefined
51
+ : 'ready',
52
+ };
53
+
54
+ case 'input_audio_buffer.speech_started':
55
+ state.userSpeechActive = true;
56
+ return {
57
+ state,
58
+ status:
59
+ state.assistantAudioActive || state.responseInProgress
60
+ ? undefined
61
+ : 'listening',
62
+ };
63
+
64
+ case 'input_audio_buffer.speech_stopped':
65
+ state.userSpeechActive = false;
66
+ return {
67
+ state,
68
+ status:
69
+ state.assistantAudioActive || state.responseInProgress
70
+ ? undefined
71
+ : 'thinking',
72
+ };
73
+
74
+ case 'response.created':
75
+ state.responseInProgress = true;
76
+ state.outputBufferStartedForResponse = false;
77
+ return { state, status: 'speaking' };
78
+
79
+ case 'response.audio.delta':
80
+ case 'response.output_audio.delta':
81
+ state.responseInProgress = true;
82
+ return { state, status: 'speaking' };
83
+
84
+ case 'output_audio_buffer.started':
85
+ state.assistantAudioActive = true;
86
+ state.responseInProgress = true;
87
+ state.outputBufferStartedForResponse = true;
88
+ return { state, status: 'speaking' };
89
+
90
+ case 'response.audio.done':
91
+ case 'response.output_audio.done':
92
+ return { state };
93
+
94
+ case 'response.done':
95
+ state.responseInProgress = false;
96
+ return {
97
+ state,
98
+ shouldFallbackToReady:
99
+ !state.assistantAudioActive && !state.outputBufferStartedForResponse,
100
+ };
101
+
102
+ case 'output_audio_buffer.stopped':
103
+ case 'output_audio_buffer.cleared':
104
+ state.assistantAudioActive = false;
105
+ state.responseInProgress = false;
106
+ state.outputBufferStartedForResponse = false;
107
+ return {
108
+ state,
109
+ status: state.userSpeechActive ? 'listening' : 'ready',
110
+ };
111
+
112
+ default:
113
+ return { state };
114
+ }
115
+ }