dominus-sdk-nodejs-dev 1.2.18 → 1.2.44

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 (57) hide show
  1. package/dist/index.d.ts +15 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +14 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/client.d.ts +2 -0
  6. package/dist/lib/client.d.ts.map +1 -1
  7. package/dist/lib/client.js +14 -7
  8. package/dist/lib/client.js.map +1 -1
  9. package/dist/namespaces/admin.d.ts +54 -0
  10. package/dist/namespaces/admin.d.ts.map +1 -0
  11. package/dist/namespaces/admin.js +60 -0
  12. package/dist/namespaces/admin.js.map +1 -0
  13. package/dist/namespaces/auth.d.ts +6 -0
  14. package/dist/namespaces/auth.d.ts.map +1 -1
  15. package/dist/namespaces/auth.js +25 -5
  16. package/dist/namespaces/auth.js.map +1 -1
  17. package/dist/namespaces/db.d.ts +9 -0
  18. package/dist/namespaces/db.d.ts.map +1 -1
  19. package/dist/namespaces/db.js +23 -1
  20. package/dist/namespaces/db.js.map +1 -1
  21. package/dist/namespaces/ddl.d.ts +193 -0
  22. package/dist/namespaces/ddl.d.ts.map +1 -1
  23. package/dist/namespaces/ddl.js +135 -0
  24. package/dist/namespaces/ddl.js.map +1 -1
  25. package/dist/namespaces/files.d.ts +153 -0
  26. package/dist/namespaces/files.d.ts.map +1 -1
  27. package/dist/namespaces/files.js +125 -0
  28. package/dist/namespaces/files.js.map +1 -1
  29. package/dist/namespaces/oracle/OracleSession.d.ts +92 -0
  30. package/dist/namespaces/oracle/OracleSession.d.ts.map +1 -0
  31. package/dist/namespaces/oracle/OracleSession.js +219 -0
  32. package/dist/namespaces/oracle/OracleSession.js.map +1 -0
  33. package/dist/namespaces/oracle/index.d.ts +78 -0
  34. package/dist/namespaces/oracle/index.d.ts.map +1 -0
  35. package/dist/namespaces/oracle/index.js +87 -0
  36. package/dist/namespaces/oracle/index.js.map +1 -0
  37. package/dist/namespaces/oracle/internal/AudioCapture.d.ts +42 -0
  38. package/dist/namespaces/oracle/internal/AudioCapture.d.ts.map +1 -0
  39. package/dist/namespaces/oracle/internal/AudioCapture.js +316 -0
  40. package/dist/namespaces/oracle/internal/AudioCapture.js.map +1 -0
  41. package/dist/namespaces/oracle/internal/OracleWebSocket.d.ts +81 -0
  42. package/dist/namespaces/oracle/internal/OracleWebSocket.d.ts.map +1 -0
  43. package/dist/namespaces/oracle/internal/OracleWebSocket.js +209 -0
  44. package/dist/namespaces/oracle/internal/OracleWebSocket.js.map +1 -0
  45. package/dist/namespaces/oracle/internal/VADGate.d.ts +76 -0
  46. package/dist/namespaces/oracle/internal/VADGate.d.ts.map +1 -0
  47. package/dist/namespaces/oracle/internal/VADGate.js +260 -0
  48. package/dist/namespaces/oracle/internal/VADGate.js.map +1 -0
  49. package/dist/namespaces/oracle/types.d.ts +98 -0
  50. package/dist/namespaces/oracle/types.d.ts.map +1 -0
  51. package/dist/namespaces/oracle/types.js +28 -0
  52. package/dist/namespaces/oracle/types.js.map +1 -0
  53. package/dist/namespaces/portal.d.ts +1 -0
  54. package/dist/namespaces/portal.d.ts.map +1 -1
  55. package/dist/namespaces/portal.js +2 -0
  56. package/dist/namespaces/portal.js.map +1 -1
  57. package/package.json +2 -1
@@ -0,0 +1,209 @@
1
+ /**
2
+ * OracleWebSocket - WebSocket wrapper for Oracle streaming (INTERNAL)
3
+ *
4
+ * Handles:
5
+ * - First-message authentication (browser WS doesn't support headers)
6
+ * - Binary frames for audio (NOT base64)
7
+ * - JSON frames for control messages
8
+ * - Ping/pong keepalive during IDLE
9
+ * - Transcript parsing and callback firing
10
+ *
11
+ * This module is INTERNAL and should NOT be exported publicly.
12
+ */
13
+ /**
14
+ * WebSocket ready states (matches browser WebSocket API).
15
+ */
16
+ const WS_READY_STATE = {
17
+ CONNECTING: 0,
18
+ OPEN: 1,
19
+ CLOSING: 2,
20
+ CLOSED: 3,
21
+ };
22
+ /**
23
+ * OracleWebSocket - Manages WebSocket connection to Oracle service.
24
+ */
25
+ export class OracleWebSocket {
26
+ baseUrl;
27
+ ws = null;
28
+ authenticated = false;
29
+ pingInterval = null;
30
+ config;
31
+ /** Callback for transcript events */
32
+ onTranscript = null;
33
+ /** Callback for errors */
34
+ onError = null;
35
+ /** Callback for connection close */
36
+ onClose = null;
37
+ constructor(baseUrl, config = {}) {
38
+ this.baseUrl = baseUrl;
39
+ this.config = {
40
+ pingIntervalMs: config.pingIntervalMs ?? 10000,
41
+ };
42
+ }
43
+ /**
44
+ * Check if WebSocket is connected and authenticated.
45
+ */
46
+ get isConnected() {
47
+ return this.ws !== null &&
48
+ this.ws.readyState === WS_READY_STATE.OPEN &&
49
+ this.authenticated;
50
+ }
51
+ /**
52
+ * Connect to Oracle WebSocket endpoint with first-message auth.
53
+ *
54
+ * @param userToken - User JWT for authentication
55
+ * @returns Promise that resolves when authenticated, rejects on error
56
+ */
57
+ async connect(userToken) {
58
+ return new Promise((resolve, reject) => {
59
+ // Convert HTTP URL to WebSocket URL
60
+ const wsUrl = this.buildWebSocketUrl();
61
+ try {
62
+ this.ws = new WebSocket(wsUrl);
63
+ this.ws.binaryType = 'arraybuffer';
64
+ }
65
+ catch (error) {
66
+ reject(new Error(`Failed to create WebSocket: ${error}`));
67
+ return;
68
+ }
69
+ // Connection opened - send auth message
70
+ this.ws.onopen = () => {
71
+ // First-message auth (browser WS doesn't support custom headers)
72
+ this.ws.send(JSON.stringify({
73
+ type: 'auth',
74
+ token: userToken,
75
+ }));
76
+ };
77
+ // Handle incoming messages
78
+ this.ws.onmessage = (event) => {
79
+ this.handleMessage(event, resolve, reject);
80
+ };
81
+ // Handle connection close
82
+ this.ws.onclose = (event) => {
83
+ this.stopPingInterval();
84
+ this.authenticated = false;
85
+ // If we never authenticated, reject the connection promise
86
+ if (!this.authenticated && event.code !== 1000) {
87
+ reject(new Error(`WebSocket closed: ${event.reason || `code ${event.code}`}`));
88
+ }
89
+ this.onClose?.();
90
+ };
91
+ // Handle connection errors
92
+ this.ws.onerror = () => {
93
+ reject(new Error('WebSocket connection failed'));
94
+ };
95
+ });
96
+ }
97
+ /**
98
+ * Send binary PCM audio frame.
99
+ * Only called by VADGate - NOT exposed publicly.
100
+ *
101
+ * @param pcmFrame - Raw PCM audio data
102
+ */
103
+ sendBinary(pcmFrame) {
104
+ if (this.ws?.readyState === WS_READY_STATE.OPEN && this.authenticated) {
105
+ this.ws.send(pcmFrame);
106
+ }
107
+ }
108
+ /**
109
+ * Send a ping message for keepalive.
110
+ */
111
+ sendPing() {
112
+ if (this.ws?.readyState === WS_READY_STATE.OPEN && this.authenticated) {
113
+ this.ws.send(JSON.stringify({ type: 'ping' }));
114
+ }
115
+ }
116
+ /**
117
+ * Close the WebSocket connection gracefully.
118
+ */
119
+ async close() {
120
+ this.stopPingInterval();
121
+ if (this.ws) {
122
+ // Send close message before closing
123
+ if (this.ws.readyState === WS_READY_STATE.OPEN) {
124
+ try {
125
+ this.ws.send(JSON.stringify({ type: 'close' }));
126
+ }
127
+ catch {
128
+ // Ignore send errors during close
129
+ }
130
+ }
131
+ this.ws.close(1000, 'Session ended');
132
+ this.ws = null;
133
+ }
134
+ this.authenticated = false;
135
+ }
136
+ /**
137
+ * Build WebSocket URL from base URL.
138
+ */
139
+ buildWebSocketUrl() {
140
+ // Replace http(s) with ws(s)
141
+ const wsProtocol = this.baseUrl.startsWith('https') ? 'wss' : 'ws';
142
+ const httpProtocol = this.baseUrl.startsWith('https') ? 'https' : 'http';
143
+ return this.baseUrl.replace(httpProtocol, wsProtocol) + '/api/oracle/stream';
144
+ }
145
+ /**
146
+ * Handle incoming WebSocket message.
147
+ */
148
+ handleMessage(event, resolveConnect, rejectConnect) {
149
+ // Binary messages are not expected from server (audio is one-way)
150
+ if (event.data instanceof ArrayBuffer) {
151
+ return;
152
+ }
153
+ // Parse JSON message
154
+ let data;
155
+ try {
156
+ data = JSON.parse(event.data);
157
+ }
158
+ catch {
159
+ console.warn('[OracleSDK] Received invalid JSON from server');
160
+ return;
161
+ }
162
+ switch (data.type) {
163
+ case 'ready':
164
+ this.authenticated = true;
165
+ this.startPingInterval();
166
+ resolveConnect();
167
+ break;
168
+ case 'transcript':
169
+ console.log('[OracleSDK] Transcript received:', {
170
+ text: data.text?.substring(0, 40),
171
+ is_final: data.is_final,
172
+ speech_final: data.speech_final,
173
+ });
174
+ this.onTranscript?.(data.text, data.is_final, data.speech_final);
175
+ break;
176
+ case 'pong':
177
+ // Keepalive response - no action needed
178
+ break;
179
+ case 'error':
180
+ const error = new Error(data.message);
181
+ this.onError?.(error);
182
+ if (!this.authenticated) {
183
+ rejectConnect(error);
184
+ }
185
+ break;
186
+ default:
187
+ console.warn('[OracleSDK] Unknown message type:', data.type);
188
+ }
189
+ }
190
+ /**
191
+ * Start ping interval for keepalive.
192
+ * Sends ping every pingIntervalMs during IDLE state.
193
+ */
194
+ startPingInterval() {
195
+ this.pingInterval = setInterval(() => {
196
+ this.sendPing();
197
+ }, this.config.pingIntervalMs);
198
+ }
199
+ /**
200
+ * Stop ping interval.
201
+ */
202
+ stopPingInterval() {
203
+ if (this.pingInterval !== null) {
204
+ clearInterval(this.pingInterval);
205
+ this.pingInterval = null;
206
+ }
207
+ }
208
+ }
209
+ //# sourceMappingURL=OracleWebSocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OracleWebSocket.js","sourceRoot":"","sources":["../../../../src/namespaces/oracle/internal/OracleWebSocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * VADGate - Voice Activity Detection Gate (INTERNAL)
3
+ *
4
+ * Implements a 4-state machine for VAD gating:
5
+ * IDLE → ARMED → SPEAKING → TRAILING → IDLE
6
+ *
7
+ * Features:
8
+ * - Pre-roll buffer (320ms) to capture word onsets
9
+ * - Armed confirmation (80ms) to reject false triggers
10
+ * - Post-roll/trailing (400ms) to avoid chopped endings
11
+ * - Circular buffer for pre-roll storage
12
+ *
13
+ * This module is INTERNAL and should NOT be exported publicly.
14
+ */
15
+ import type { VADState, ResolvedOracleSessionOptions } from '../types.js';
16
+ /**
17
+ * VADGate - 4-state Voice Activity Detection machine.
18
+ *
19
+ * State transitions:
20
+ * - IDLE → ARMED: When VAD detects speech
21
+ * - ARMED → SPEAKING: After armedConfirmFrames of continuous speech
22
+ * - ARMED → IDLE: If speech stops before confirmation
23
+ * - SPEAKING → TRAILING: When VAD detects silence
24
+ * - TRAILING → SPEAKING: If speech resumes
25
+ * - TRAILING → IDLE: After postrollMs timeout
26
+ */
27
+ export declare class VADGate {
28
+ private state;
29
+ private preRollBuffer;
30
+ private armedFrameCount;
31
+ private silenceFrameCount;
32
+ private trailingTimeout;
33
+ private config;
34
+ private vadModel;
35
+ /** Callback when audio should be sent to server */
36
+ onSendAudio: ((frames: ArrayBuffer[]) => void) | null;
37
+ /** Callback when VAD state changes */
38
+ onStateChange: ((state: VADState) => void) | null;
39
+ constructor(options: ResolvedOracleSessionOptions, frameDurationMs?: number);
40
+ /**
41
+ * Initialize the VAD model (call before processing frames).
42
+ */
43
+ initialize(): Promise<void>;
44
+ /**
45
+ * Get current VAD state.
46
+ */
47
+ getState(): VADState;
48
+ /**
49
+ * Process an audio frame through the VAD gate.
50
+ *
51
+ * @param pcmFrame - 20ms PCM16 audio frame (640 bytes)
52
+ */
53
+ processFrame(pcmFrame: ArrayBuffer): void;
54
+ /**
55
+ * Reset VAD state to idle.
56
+ */
57
+ reset(): void;
58
+ /**
59
+ * Clean up resources.
60
+ */
61
+ dispose(): void;
62
+ /**
63
+ * Update VAD state and fire callback.
64
+ */
65
+ private setState;
66
+ /**
67
+ * Start the trailing timeout.
68
+ * After postrollMs, transition back to idle.
69
+ */
70
+ private startTrailingTimer;
71
+ /**
72
+ * Cancel the trailing timeout.
73
+ */
74
+ private cancelTrailingTimer;
75
+ }
76
+ //# sourceMappingURL=VADGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VADGate.d.ts","sourceRoot":"","sources":["../../../../src/namespaces/oracle/internal/VADGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AA0H1E;;;;;;;;;;GAUG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,eAAe,CAA8C;IACrE,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAW;IAE3B,mDAAmD;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAEpE,sCAAsC;IAC/B,aAAa,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;gBAEpD,OAAO,EAAE,4BAA4B,EAAE,eAAe,GAAE,MAAW;IAe/E;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;OAEG;IACH,QAAQ,IAAI,QAAQ;IAIpB;;;;OAIG;IACH,YAAY,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IA0DzC;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,OAAO,CAAC,QAAQ;IAOhB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAM5B"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * VADGate - Voice Activity Detection Gate (INTERNAL)
3
+ *
4
+ * Implements a 4-state machine for VAD gating:
5
+ * IDLE → ARMED → SPEAKING → TRAILING → IDLE
6
+ *
7
+ * Features:
8
+ * - Pre-roll buffer (320ms) to capture word onsets
9
+ * - Armed confirmation (80ms) to reject false triggers
10
+ * - Post-roll/trailing (400ms) to avoid chopped endings
11
+ * - Circular buffer for pre-roll storage
12
+ *
13
+ * This module is INTERNAL and should NOT be exported publicly.
14
+ */
15
+ /**
16
+ * Energy-based VAD fallback.
17
+ * Uses RMS energy detection when Silero ONNX is unavailable.
18
+ */
19
+ class EnergyVAD {
20
+ energyThreshold;
21
+ constructor(energyThreshold) {
22
+ this.energyThreshold = energyThreshold;
23
+ }
24
+ isSpeech(pcmFrame, _threshold) {
25
+ const int16Array = new Int16Array(pcmFrame);
26
+ return detectSpeechByEnergy(int16Array, this.energyThreshold);
27
+ }
28
+ dispose() {
29
+ // No resources to clean up
30
+ }
31
+ }
32
+ /**
33
+ * Energy-based speech detection fallback.
34
+ * Calculates RMS energy and compares against threshold.
35
+ */
36
+ function detectSpeechByEnergy(pcmFrame, threshold = 500) {
37
+ let sum = 0;
38
+ for (let i = 0; i < pcmFrame.length; i++) {
39
+ sum += pcmFrame[i] * pcmFrame[i];
40
+ }
41
+ return Math.sqrt(sum / pcmFrame.length) > threshold;
42
+ }
43
+ /**
44
+ * Silero VAD wrapper using @ricky0123/vad-web.
45
+ * Falls back to energy-based detection if ONNX fails.
46
+ */
47
+ class SileroVAD {
48
+ threshold;
49
+ micVAD = null;
50
+ isInitialized = false;
51
+ fallback;
52
+ useFallback = false;
53
+ constructor(threshold, energyThreshold) {
54
+ this.threshold = threshold;
55
+ this.fallback = new EnergyVAD(energyThreshold);
56
+ }
57
+ /**
58
+ * Initialize Silero VAD model.
59
+ * Called lazily on first use.
60
+ */
61
+ async initialize() {
62
+ if (this.isInitialized)
63
+ return;
64
+ try {
65
+ // Dynamic import to avoid bundling issues in non-browser environments
66
+ const vadModule = await import('@ricky0123/vad-web');
67
+ // Create the VAD instance
68
+ this.micVAD = await vadModule.MicVAD.new({
69
+ positiveSpeechThreshold: this.threshold,
70
+ negativeSpeechThreshold: this.threshold - 0.15,
71
+ redemptionFrames: 3,
72
+ preSpeechPadFrames: 1,
73
+ minSpeechFrames: 3,
74
+ onSpeechStart: () => { },
75
+ onSpeechEnd: () => { },
76
+ onVADMisfire: () => { },
77
+ });
78
+ this.isInitialized = true;
79
+ }
80
+ catch (error) {
81
+ console.warn('[OracleSDK] Silero VAD initialization failed, using energy-based fallback:', error);
82
+ this.useFallback = true;
83
+ this.isInitialized = true;
84
+ }
85
+ }
86
+ isSpeech(pcmFrame, threshold) {
87
+ if (this.useFallback || !this.micVAD) {
88
+ return this.fallback.isSpeech(pcmFrame, threshold);
89
+ }
90
+ // For now, use energy-based detection as Silero requires specific frame processing
91
+ // The full Silero integration would require feeding frames through the ONNX model
92
+ // This is a simplification - in production, you'd use the micVAD's internal VAD
93
+ return this.fallback.isSpeech(pcmFrame, threshold);
94
+ }
95
+ dispose() {
96
+ if (this.micVAD && typeof this.micVAD.destroy === 'function') {
97
+ this.micVAD.destroy();
98
+ }
99
+ this.micVAD = null;
100
+ this.isInitialized = false;
101
+ }
102
+ }
103
+ /**
104
+ * VADGate - 4-state Voice Activity Detection machine.
105
+ *
106
+ * State transitions:
107
+ * - IDLE → ARMED: When VAD detects speech
108
+ * - ARMED → SPEAKING: After armedConfirmFrames of continuous speech
109
+ * - ARMED → IDLE: If speech stops before confirmation
110
+ * - SPEAKING → TRAILING: When VAD detects silence
111
+ * - TRAILING → SPEAKING: If speech resumes
112
+ * - TRAILING → IDLE: After postrollMs timeout
113
+ */
114
+ export class VADGate {
115
+ state = 'idle';
116
+ preRollBuffer = [];
117
+ armedFrameCount = 0;
118
+ silenceFrameCount = 0; // Hysteresis counter for speaking→trailing
119
+ trailingTimeout = null;
120
+ config;
121
+ vadModel;
122
+ /** Callback when audio should be sent to server */
123
+ onSendAudio = null;
124
+ /** Callback when VAD state changes */
125
+ onStateChange = null;
126
+ constructor(options, frameDurationMs = 20) {
127
+ this.config = {
128
+ prerollFrames: Math.ceil(options.prerollMs / frameDurationMs),
129
+ armedConfirmFrames: Math.ceil(options.armedConfirmMs / frameDurationMs),
130
+ silenceConfirmFrames: 8, // 160ms of silence before trailing (hysteresis)
131
+ postrollMs: options.postrollMs,
132
+ threshold: options.vadThreshold,
133
+ energyThreshold: options.energyThreshold,
134
+ };
135
+ // Use energy-based VAD as the primary implementation
136
+ // Silero VAD requires complex ONNX setup that may not work in all environments
137
+ this.vadModel = new EnergyVAD(this.config.energyThreshold);
138
+ }
139
+ /**
140
+ * Initialize the VAD model (call before processing frames).
141
+ */
142
+ async initialize() {
143
+ if (this.vadModel instanceof SileroVAD) {
144
+ await this.vadModel.initialize();
145
+ }
146
+ }
147
+ /**
148
+ * Get current VAD state.
149
+ */
150
+ getState() {
151
+ return this.state;
152
+ }
153
+ /**
154
+ * Process an audio frame through the VAD gate.
155
+ *
156
+ * @param pcmFrame - 20ms PCM16 audio frame (640 bytes)
157
+ */
158
+ processFrame(pcmFrame) {
159
+ // Maintain circular pre-roll buffer
160
+ this.preRollBuffer.push(pcmFrame);
161
+ if (this.preRollBuffer.length > this.config.prerollFrames) {
162
+ this.preRollBuffer.shift();
163
+ }
164
+ const isSpeech = this.vadModel.isSpeech(pcmFrame, this.config.threshold);
165
+ switch (this.state) {
166
+ case 'idle':
167
+ if (isSpeech) {
168
+ this.setState('armed');
169
+ this.armedFrameCount = 1;
170
+ }
171
+ break;
172
+ case 'armed':
173
+ if (isSpeech) {
174
+ this.armedFrameCount++;
175
+ if (this.armedFrameCount >= this.config.armedConfirmFrames) {
176
+ // Confirmed speech - flush pre-roll buffer
177
+ this.onSendAudio?.(this.preRollBuffer.slice());
178
+ this.setState('speaking');
179
+ }
180
+ }
181
+ else {
182
+ // False trigger - back to idle
183
+ this.setState('idle');
184
+ this.armedFrameCount = 0;
185
+ }
186
+ break;
187
+ case 'speaking':
188
+ this.onSendAudio?.([pcmFrame]);
189
+ if (!isSpeech) {
190
+ // Hysteresis: require multiple consecutive silence frames
191
+ this.silenceFrameCount++;
192
+ if (this.silenceFrameCount >= this.config.silenceConfirmFrames) {
193
+ this.setState('trailing');
194
+ this.startTrailingTimer();
195
+ this.silenceFrameCount = 0;
196
+ }
197
+ }
198
+ else {
199
+ // Speech detected - reset silence counter
200
+ this.silenceFrameCount = 0;
201
+ }
202
+ break;
203
+ case 'trailing':
204
+ this.onSendAudio?.([pcmFrame]);
205
+ if (isSpeech) {
206
+ this.cancelTrailingTimer();
207
+ this.setState('speaking');
208
+ }
209
+ break;
210
+ }
211
+ }
212
+ /**
213
+ * Reset VAD state to idle.
214
+ */
215
+ reset() {
216
+ this.cancelTrailingTimer();
217
+ this.state = 'idle';
218
+ this.preRollBuffer = [];
219
+ this.armedFrameCount = 0;
220
+ this.silenceFrameCount = 0;
221
+ }
222
+ /**
223
+ * Clean up resources.
224
+ */
225
+ dispose() {
226
+ this.cancelTrailingTimer();
227
+ this.vadModel.dispose();
228
+ this.onSendAudio = null;
229
+ this.onStateChange = null;
230
+ }
231
+ /**
232
+ * Update VAD state and fire callback.
233
+ */
234
+ setState(newState) {
235
+ if (this.state !== newState) {
236
+ this.state = newState;
237
+ this.onStateChange?.(newState);
238
+ }
239
+ }
240
+ /**
241
+ * Start the trailing timeout.
242
+ * After postrollMs, transition back to idle.
243
+ */
244
+ startTrailingTimer() {
245
+ this.trailingTimeout = setTimeout(() => {
246
+ this.setState('idle');
247
+ this.trailingTimeout = null;
248
+ }, this.config.postrollMs);
249
+ }
250
+ /**
251
+ * Cancel the trailing timeout.
252
+ */
253
+ cancelTrailingTimer() {
254
+ if (this.trailingTimeout !== null) {
255
+ clearTimeout(this.trailingTimeout);
256
+ this.trailingTimeout = null;
257
+ }
258
+ }
259
+ }
260
+ //# sourceMappingURL=VADGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VADGate.js","sourceRoot":"","sources":["../../../../src/namespaces/oracle/internal/VADGate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Oracle Namespace Types - Public interfaces for streaming transcription.
3
+ *
4
+ * Oracle provides real-time speech-to-text via Deepgram streaming,
5
+ * with built-in VAD (Voice Activity Detection) for cost optimization.
6
+ */
7
+ /**
8
+ * VAD (Voice Activity Detection) states.
9
+ *
10
+ * The VAD gate uses a 4-state machine:
11
+ * - IDLE: No speech detected, not sending audio
12
+ * - ARMED: Potential speech detected, buffering for confirmation
13
+ * - SPEAKING: Confirmed speech, actively streaming
14
+ * - TRAILING: Speech ended, post-roll buffer active
15
+ */
16
+ export type VADState = 'idle' | 'armed' | 'speaking' | 'trailing';
17
+ /**
18
+ * Configuration options for OracleSession.
19
+ */
20
+ export interface OracleSessionOptions {
21
+ /** Pre-roll buffer duration in ms (default: 320) */
22
+ prerollMs?: number;
23
+ /** Post-roll duration in ms (default: 400) */
24
+ postrollMs?: number;
25
+ /** VAD confirmation time in ms (default: 80) */
26
+ armedConfirmMs?: number;
27
+ /** VAD speech threshold 0-1 (default: 0.5) - used for energy-based fallback */
28
+ vadThreshold?: number;
29
+ /** Energy threshold for fallback VAD (default: 500) */
30
+ energyThreshold?: number;
31
+ /** Ping interval in ms for keepalive (default: 10000) */
32
+ pingIntervalMs?: number;
33
+ }
34
+ /**
35
+ * Resolved session options with all defaults applied.
36
+ */
37
+ export interface ResolvedOracleSessionOptions {
38
+ prerollMs: number;
39
+ postrollMs: number;
40
+ armedConfirmMs: number;
41
+ vadThreshold: number;
42
+ energyThreshold: number;
43
+ pingIntervalMs: number;
44
+ }
45
+ /**
46
+ * Default configuration values for OracleSession.
47
+ */
48
+ export declare const DEFAULT_OPTIONS: ResolvedOracleSessionOptions;
49
+ /**
50
+ * Audio configuration constants.
51
+ */
52
+ export declare const AUDIO_CONFIG: {
53
+ readonly SAMPLE_RATE: 16000;
54
+ readonly CHANNELS: 1;
55
+ readonly FRAME_DURATION_MS: 20;
56
+ readonly FRAME_SIZE_BYTES: 640;
57
+ readonly SAMPLES_PER_FRAME: 320;
58
+ };
59
+ /**
60
+ * WebSocket message types from the server.
61
+ */
62
+ export interface ServerReadyMessage {
63
+ type: 'ready';
64
+ }
65
+ export interface ServerTranscriptMessage {
66
+ type: 'transcript';
67
+ text: string;
68
+ is_final: boolean;
69
+ speech_final: boolean;
70
+ }
71
+ export interface ServerPongMessage {
72
+ type: 'pong';
73
+ }
74
+ export interface ServerErrorMessage {
75
+ type: 'error';
76
+ message: string;
77
+ }
78
+ export type ServerMessage = ServerReadyMessage | ServerTranscriptMessage | ServerPongMessage | ServerErrorMessage;
79
+ /**
80
+ * Event callbacks for OracleSession.
81
+ */
82
+ export interface OracleSessionCallbacks {
83
+ /** Called when session is ready to receive speech */
84
+ onReady?: () => void;
85
+ /** Called with interim transcripts (may change) */
86
+ onInterim?: (text: string) => void;
87
+ /** Called when a transcript segment is finalized */
88
+ onFinal?: (text: string) => void;
89
+ /** Called when user finishes an utterance (trigger for Curator) */
90
+ onUtterance?: (text: string) => void;
91
+ /** Called on any error */
92
+ onError?: (error: Error) => void;
93
+ /** Called when session closes */
94
+ onClose?: () => void;
95
+ /** Called when VAD state changes (for UI indicators) */
96
+ onVADStateChange?: (state: VADState) => void;
97
+ }
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/namespaces/oracle/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,UAAU,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yDAAyD;IACzD,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,4BAO7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;CAMf,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,YAAY,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GACrB,kBAAkB,GAClB,uBAAuB,GACvB,iBAAiB,GACjB,kBAAkB,CAAC;AAEvB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,mDAAmD;IACnD,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,oDAAoD;IACpD,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,mEAAmE;IACnE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,0BAA0B;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC9C"}