@memberjunction/ai-realtime-client 5.47.0 → 5.48.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.
@@ -0,0 +1,176 @@
1
+ import { ClientRealtimeSessionConfig } from '@memberjunction/ai';
2
+ import { BaseRealtimeClient } from '../generic/baseRealtimeClient.js';
3
+ import { IRealtimePcmPlayback } from '../audio/pcmPlayback.js';
4
+ import { IPcmMicCapture } from '../audio/micCapture.js';
5
+ /**
6
+ * Default PCM16 sample rate (mono) both directions, used when the server pact omits `sampleRate`.
7
+ * HuggingFace's speech-to-speech cascade is natively **16 kHz**, so capture AND playout default to that
8
+ * (a wrong rate pitch/speed-distorts audio). Matches the server driver's {@link HUGGINGFACE_DEFAULT_PCM_SAMPLE_RATE}.
9
+ */
10
+ export declare const HUGGINGFACE_DEFAULT_PCM_SAMPLE_RATE = 16000;
11
+ /** A parsed inbound frame from the OpenAI-Realtime-compatible endpoint (discriminated by `type`). */
12
+ export interface HuggingFaceClientServerEvent {
13
+ type?: string;
14
+ /** `response.output_audio.delta` / `*_audio_transcript.delta` / input-transcription delta. */
15
+ delta?: string;
16
+ /** `*_audio_transcript.done` — the finalized assistant transcript. */
17
+ transcript?: string;
18
+ /** `response.function_call_arguments.done` — the tool name. */
19
+ name?: string;
20
+ /** `response.function_call_arguments.done` — correlation id the result must echo. */
21
+ call_id?: string;
22
+ /** `response.function_call_arguments.done` — JSON-encoded tool arguments (a STRING). */
23
+ arguments?: string;
24
+ /** `response.done` — usage payload for the completed response. */
25
+ response?: {
26
+ usage?: {
27
+ input_tokens?: number;
28
+ output_tokens?: number;
29
+ };
30
+ };
31
+ /** `error` — the provider error payload. */
32
+ error?: {
33
+ message?: string;
34
+ code?: string;
35
+ };
36
+ }
37
+ /** The minimal websocket surface this client depends on (mirrors the other websocket drivers). */
38
+ export interface IHuggingFaceClientSocket {
39
+ onopen: (() => void) | null;
40
+ onmessage: ((data: string) => void) | null;
41
+ onerror: ((message: string) => void) | null;
42
+ onclose: (() => void) | null;
43
+ send(data: string): void;
44
+ close(): void;
45
+ }
46
+ /**
47
+ * HuggingFace speech-to-speech implementation of {@link BaseRealtimeClient}: a **browser-direct**
48
+ * websocket that speaks the OpenAI-Realtime wire protocol over the shared PCM audio plane.
49
+ *
50
+ * Registered under the key `'huggingface'` — the `Provider` string the server's `HuggingFaceRealtime`
51
+ * driver stamps — so hosts resolve it without referencing this class directly.
52
+ *
53
+ * The `EphemeralToken` is the full `wss://<mjapi-public>/realtime-proxy?ticket=…` URL (ElevenLabs-style
54
+ * — the credential IS the URL): the browser connects to MJAPI's realtime proxy, which tunnels
55
+ * transparently to the internal self-hosted endpoint. The client never learns the internal endpoint.
56
+ *
57
+ * OpenAI ordering: the session config is applied via `session.update` only AFTER the endpoint's
58
+ * `session.created` frame (sending it earlier is dropped), and `'listening'` is reported at that point
59
+ * (obligation #7). Because the audio plane is a raw websocket (not WebRTC), the client OWNS playback —
60
+ * `IsAudioPlaying` reflects the local playout clock, and barge-in/cancel flush it locally.
61
+ */
62
+ export declare class HuggingFaceRealtimeClient extends BaseRealtimeClient {
63
+ protected socket: IHuggingFaceClientSocket | null;
64
+ private playback;
65
+ private micCapture;
66
+ private micStream;
67
+ /** The OpenAI-Realtime `session` object applied via `session.update` on `session.created`. */
68
+ private sessionObject;
69
+ /** Resolver for the in-flight Connect's `session.created` wait (null outside Connect). */
70
+ private onSessionCreated;
71
+ private pendingAssistantText;
72
+ private responseActive;
73
+ private pendingResultResponse;
74
+ private pendingNarrationKind;
75
+ private activeResponseKind;
76
+ private currentState;
77
+ private closedByConsumer;
78
+ /**
79
+ * Opens the browser-direct websocket to the proxy URL (`config.EphemeralToken`), waits for the
80
+ * endpoint's `session.created`, applies the server-built session config, builds the PCM audio plane
81
+ * at the pact's sample rate, and reports `'listening'`.
82
+ */
83
+ Connect(config: ClientRealtimeSessionConfig, micStream: MediaStream): Promise<void>;
84
+ /** Tears down the audio plane + socket and resets the response state machine. */
85
+ Disconnect(): Promise<void>;
86
+ /**
87
+ * Injects typed text as a user-role message, then triggers a reply through the same collision-safe
88
+ * path tool results use. SendText implies barge-in — an active spoken response is cancelled first.
89
+ */
90
+ SendText(text: string): void;
91
+ /**
92
+ * Cancels the model's in-flight response (only when one is active) and flushes local playback so
93
+ * already-buffered speech stops immediately. Preserves any queued tool-result trigger. No-op when idle.
94
+ */
95
+ CancelActiveResponse(): void;
96
+ /** Injects a system-role context item the model can draw on next time it speaks, WITHOUT a reply. */
97
+ SendContextNote(text: string): void;
98
+ /**
99
+ * Triggers ONE short spoken update; marks the upcoming response `'narration'` so its transcripts are
100
+ * ephemeral. Skipped while a response is in flight (narration is disposable by contract).
101
+ */
102
+ RequestSpokenUpdate(instructions: string): void;
103
+ /**
104
+ * Sends the tool result as a `function_call_output` item, then triggers a reply — immediately if idle,
105
+ * otherwise queued until the current response finishes (so the model always voices delegated results).
106
+ */
107
+ SendToolResult(callID: string, outputJson: string): void;
108
+ /** Mute / unmute by toggling the mic tracks' `enabled` flag (transport stays up). */
109
+ SetMuted(muted: boolean): void;
110
+ /** @inheritdoc */
111
+ get IsBusy(): boolean;
112
+ /** @inheritdoc */
113
+ get IsAudioPlaying(): boolean;
114
+ /** Creates the websocket to the given URL (the proxy URL). Production wraps the platform `WebSocket`. */
115
+ protected createSocket(url: string): IHuggingFaceClientSocket;
116
+ /** Creation seam for the mic-capture pipeline. Production delegates to the shared {@link createPcmMicCapture}. */
117
+ protected createMicCapture(micStream: MediaStream, sampleRate: number, onPcmChunk: (base64Pcm16: string) => void): Promise<IPcmMicCapture>;
118
+ /** Creation seam for the playout engine. Production returns the shared {@link RealtimePcmPlayback}. */
119
+ protected createPlayback(sampleRate: number): IRealtimePcmPlayback;
120
+ /** Resolver for the in-flight Connect's socket-open wait. */
121
+ private onOpen;
122
+ /** Extracts the wire-shaped `session` object from the server pact (`{ session, sampleRate }`). */
123
+ private static parseSessionObject;
124
+ /** Extracts the PCM sample rate from the server pact, defaulting to the HF-native 16 kHz. */
125
+ private static parseSampleRate;
126
+ /** Creates a one-shot signal promise, handing its resolver to the supplied setter. */
127
+ private buildSignal;
128
+ /** Sends the server-built session config once the session exists (skipped when empty). */
129
+ private applySessionConfig;
130
+ /** Streams one base64 PCM16 mic frame as an `input_audio_buffer.append`. */
131
+ private sendInput;
132
+ /** Parses an inbound frame and dispatches it. */
133
+ private handleSocketMessage;
134
+ /** Dispatches a typed OpenAI-Realtime server event to the appropriate behavior. */
135
+ private handleEvent;
136
+ /** Enqueues one base64 audio chunk for playout and reflects `'speaking'`. */
137
+ private handleAudioDelta;
138
+ /** Appends an assistant transcript delta and emits it (tagged with the active response kind). */
139
+ private onAssistantDelta;
140
+ /** Finalizes the assistant turn (empty turns emit nothing). */
141
+ private onAssistantDone;
142
+ /**
143
+ * Surfaces a completed tool call. Silently leaves `'speaking'` (no emission) so a host busy indicator
144
+ * isn't clobbered, and clears the busy flag (deadlock guard — obligation #2). `arguments` is already a
145
+ * JSON string on the wire.
146
+ */
147
+ private onToolCallFrame;
148
+ /**
149
+ * True barge-in ONLY: the user started speaking over active model output (a response in flight or audio
150
+ * audibly playing). Flushes local playback, emits the interruption, returns to `'listening'`.
151
+ */
152
+ private handleSpeechStarted;
153
+ /** Response boundary: release the lock, emit usage, fire any queued tool-result reply, return to listening. */
154
+ private handleResponseDone;
155
+ /** Triggers a reply immediately when idle, else queues it until the current response finishes. */
156
+ private requestResultResponse;
157
+ /** On a turn completing, fire any queued tool-result response so the answer is spoken. */
158
+ private flushPendingResultResponse;
159
+ /** Resets the per-session response state machine (used on Disconnect). */
160
+ private resetResponseState;
161
+ /** A socket-level error is fatal — the transport is gone (obligation #6). */
162
+ private handleSocketError;
163
+ /** A close is silent when consumer-initiated; otherwise reported as a terminal `'closed'`. */
164
+ private handleSocketClose;
165
+ /** Updates the client's own state view and emits the change to the host. */
166
+ private setState;
167
+ /** JSON-serializes and sends one client frame (no-op when the socket is closed). */
168
+ private sendFrame;
169
+ }
170
+ /**
171
+ * Tree-shaking prevention: bundlers cannot see that {@link HuggingFaceRealtimeClient} is instantiated
172
+ * dynamically through the ClassFactory, so a consumer must call this no-op to keep the `@RegisterClass`
173
+ * side effect alive.
174
+ */
175
+ export declare function LoadHuggingFaceRealtimeClient(): void;
176
+ //# sourceMappingURL=huggingFaceRealtimeClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingFaceRealtimeClient.d.ts","sourceRoot":"","sources":["../../src/drivers/huggingFaceRealtimeClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,457 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var HuggingFaceRealtimeClient_1;
8
+ import { RegisterClass } from '@memberjunction/global';
9
+ import { BaseRealtimeClient } from '../generic/baseRealtimeClient.js';
10
+ import { base64ToArrayBuffer } from '../audio/pcmUtils.js';
11
+ import { RealtimePcmPlayback } from '../audio/pcmPlayback.js';
12
+ import { RealtimeAudioMeter } from '../audio/audioMeter.js';
13
+ import { createPcmMicCapture } from '../audio/micCapture.js';
14
+ // ── Audio constants ────────────────────────────────────────────────────────────
15
+ /**
16
+ * Default PCM16 sample rate (mono) both directions, used when the server pact omits `sampleRate`.
17
+ * HuggingFace's speech-to-speech cascade is natively **16 kHz**, so capture AND playout default to that
18
+ * (a wrong rate pitch/speed-distorts audio). Matches the server driver's {@link HUGGINGFACE_DEFAULT_PCM_SAMPLE_RATE}.
19
+ */
20
+ export const HUGGINGFACE_DEFAULT_PCM_SAMPLE_RATE = 16000;
21
+ // ── The driver ─────────────────────────────────────────────────────────────────
22
+ /**
23
+ * HuggingFace speech-to-speech implementation of {@link BaseRealtimeClient}: a **browser-direct**
24
+ * websocket that speaks the OpenAI-Realtime wire protocol over the shared PCM audio plane.
25
+ *
26
+ * Registered under the key `'huggingface'` — the `Provider` string the server's `HuggingFaceRealtime`
27
+ * driver stamps — so hosts resolve it without referencing this class directly.
28
+ *
29
+ * The `EphemeralToken` is the full `wss://<mjapi-public>/realtime-proxy?ticket=…` URL (ElevenLabs-style
30
+ * — the credential IS the URL): the browser connects to MJAPI's realtime proxy, which tunnels
31
+ * transparently to the internal self-hosted endpoint. The client never learns the internal endpoint.
32
+ *
33
+ * OpenAI ordering: the session config is applied via `session.update` only AFTER the endpoint's
34
+ * `session.created` frame (sending it earlier is dropped), and `'listening'` is reported at that point
35
+ * (obligation #7). Because the audio plane is a raw websocket (not WebRTC), the client OWNS playback —
36
+ * `IsAudioPlaying` reflects the local playout clock, and barge-in/cancel flush it locally.
37
+ */
38
+ let HuggingFaceRealtimeClient = HuggingFaceRealtimeClient_1 = class HuggingFaceRealtimeClient extends BaseRealtimeClient {
39
+ constructor() {
40
+ super(...arguments);
41
+ // ── Transport ──────────────────────────────────────────────────────────────
42
+ this.socket = null;
43
+ this.playback = null;
44
+ this.micCapture = null;
45
+ this.micStream = null;
46
+ /** The OpenAI-Realtime `session` object applied via `session.update` on `session.created`. */
47
+ this.sessionObject = {};
48
+ /** Resolver for the in-flight Connect's `session.created` wait (null outside Connect). */
49
+ this.onSessionCreated = null;
50
+ // ── Response state machine (mirrors the OpenAI WebRTC client) ──────────────
51
+ this.pendingAssistantText = '';
52
+ this.responseActive = false;
53
+ this.pendingResultResponse = false;
54
+ this.pendingNarrationKind = false;
55
+ this.activeResponseKind = 'normal';
56
+ this.currentState = 'closed';
57
+ this.closedByConsumer = false;
58
+ // ── Connection internals ───────────────────────────────────────────────────
59
+ /** Resolver for the in-flight Connect's socket-open wait. */
60
+ this.onOpen = null;
61
+ }
62
+ // ── BaseRealtimeClient: connection lifecycle ───────────────────────────────
63
+ /**
64
+ * Opens the browser-direct websocket to the proxy URL (`config.EphemeralToken`), waits for the
65
+ * endpoint's `session.created`, applies the server-built session config, builds the PCM audio plane
66
+ * at the pact's sample rate, and reports `'listening'`.
67
+ */
68
+ async Connect(config, micStream) {
69
+ this.setState('connecting');
70
+ this.sessionObject = HuggingFaceRealtimeClient_1.parseSessionObject(config);
71
+ const sampleRate = HuggingFaceRealtimeClient_1.parseSampleRate(config);
72
+ this.micStream = micStream;
73
+ const opened = this.buildSignal((resolve) => (this.onOpen = resolve));
74
+ const created = this.buildSignal((resolve) => (this.onSessionCreated = resolve));
75
+ this.socket = this.createSocket(config.EphemeralToken);
76
+ this.socket.onopen = () => this.onOpen?.();
77
+ this.socket.onmessage = (data) => this.handleSocketMessage(data);
78
+ this.socket.onerror = (message) => this.handleSocketError(message);
79
+ this.socket.onclose = () => this.handleSocketClose();
80
+ await opened;
81
+ this.setState('connected');
82
+ await created;
83
+ this.applySessionConfig();
84
+ this.playback = this.createPlayback(sampleRate);
85
+ this.micCapture = await this.createMicCapture(micStream, sampleRate, (b64) => this.sendInput(b64));
86
+ this.attachOutputAudioMeter(this.playback?.CreateMeter?.() ?? null);
87
+ this.attachInputAudioMeter(RealtimeAudioMeter.ForMicStream(micStream));
88
+ this.setState('listening');
89
+ }
90
+ /** Tears down the audio plane + socket and resets the response state machine. */
91
+ async Disconnect() {
92
+ this.closedByConsumer = true;
93
+ this.closeAudioMeters();
94
+ this.micCapture?.Stop();
95
+ this.micCapture = null;
96
+ this.micStream?.getTracks().forEach((t) => t.stop());
97
+ this.micStream = null;
98
+ this.playback?.Close();
99
+ this.playback = null;
100
+ if (this.socket) {
101
+ try {
102
+ this.socket.close();
103
+ }
104
+ catch { /* already closing */ }
105
+ this.socket = null;
106
+ }
107
+ this.resetResponseState();
108
+ if (this.currentState !== 'error') {
109
+ this.setState('closed');
110
+ }
111
+ }
112
+ // ── BaseRealtimeClient: outbound actions ──────────────────────────────────
113
+ /**
114
+ * Injects typed text as a user-role message, then triggers a reply through the same collision-safe
115
+ * path tool results use. SendText implies barge-in — an active spoken response is cancelled first.
116
+ */
117
+ SendText(text) {
118
+ if (!this.socket) {
119
+ return;
120
+ }
121
+ this.CancelActiveResponse();
122
+ this.sendFrame({
123
+ type: 'conversation.item.create',
124
+ item: { type: 'message', role: 'user', content: [{ type: 'input_text', text }] },
125
+ });
126
+ this.requestResultResponse();
127
+ }
128
+ /**
129
+ * Cancels the model's in-flight response (only when one is active) and flushes local playback so
130
+ * already-buffered speech stops immediately. Preserves any queued tool-result trigger. No-op when idle.
131
+ */
132
+ CancelActiveResponse() {
133
+ if (!this.socket) {
134
+ return;
135
+ }
136
+ const playing = this.playback?.IsPlaying ?? false;
137
+ if (!this.responseActive && !playing) {
138
+ return;
139
+ }
140
+ if (this.responseActive) {
141
+ this.sendFrame({ type: 'response.cancel' });
142
+ this.responseActive = false;
143
+ this.pendingNarrationKind = false;
144
+ this.activeResponseKind = 'normal';
145
+ this.pendingAssistantText = '';
146
+ }
147
+ this.playback?.Flush();
148
+ if (this.currentState === 'speaking') {
149
+ this.setState('listening');
150
+ }
151
+ }
152
+ /** Injects a system-role context item the model can draw on next time it speaks, WITHOUT a reply. */
153
+ SendContextNote(text) {
154
+ if (!this.socket) {
155
+ return;
156
+ }
157
+ this.sendFrame({
158
+ type: 'conversation.item.create',
159
+ item: { type: 'message', role: 'system', content: [{ type: 'input_text', text }] },
160
+ });
161
+ }
162
+ /**
163
+ * Triggers ONE short spoken update; marks the upcoming response `'narration'` so its transcripts are
164
+ * ephemeral. Skipped while a response is in flight (narration is disposable by contract).
165
+ */
166
+ RequestSpokenUpdate(instructions) {
167
+ if (!this.socket || this.responseActive) {
168
+ return;
169
+ }
170
+ this.responseActive = true;
171
+ this.pendingNarrationKind = true;
172
+ this.sendFrame({ type: 'response.create', response: { instructions } });
173
+ }
174
+ /**
175
+ * Sends the tool result as a `function_call_output` item, then triggers a reply — immediately if idle,
176
+ * otherwise queued until the current response finishes (so the model always voices delegated results).
177
+ */
178
+ SendToolResult(callID, outputJson) {
179
+ if (!this.socket) {
180
+ return;
181
+ }
182
+ this.sendFrame({
183
+ type: 'conversation.item.create',
184
+ item: { type: 'function_call_output', call_id: callID, output: outputJson },
185
+ });
186
+ this.requestResultResponse();
187
+ }
188
+ /** Mute / unmute by toggling the mic tracks' `enabled` flag (transport stays up). */
189
+ SetMuted(muted) {
190
+ for (const t of this.micStream?.getAudioTracks() ?? []) {
191
+ t.enabled = !muted;
192
+ }
193
+ }
194
+ /** @inheritdoc */
195
+ get IsBusy() {
196
+ return this.responseActive;
197
+ }
198
+ /** @inheritdoc */
199
+ get IsAudioPlaying() {
200
+ return this.playback?.IsPlaying ?? false;
201
+ }
202
+ // ── Overridable creation seams (tests inject fakes — no network / WebAudio) ──
203
+ /** Creates the websocket to the given URL (the proxy URL). Production wraps the platform `WebSocket`. */
204
+ createSocket(url) {
205
+ const WS = globalThis.WebSocket;
206
+ if (!WS) {
207
+ throw new Error('HuggingFaceRealtimeClient requires a global WebSocket (browser or Node 22+).');
208
+ }
209
+ const ws = new WS(url);
210
+ const seam = {
211
+ onopen: null,
212
+ onmessage: null,
213
+ onerror: null,
214
+ onclose: null,
215
+ send: (data) => ws.send(data),
216
+ close: () => ws.close(),
217
+ };
218
+ ws.onopen = () => seam.onopen?.();
219
+ ws.onmessage = (event) => seam.onmessage?.(String(event.data));
220
+ ws.onerror = () => seam.onerror?.('HuggingFace realtime websocket error');
221
+ ws.onclose = () => seam.onclose?.();
222
+ return seam;
223
+ }
224
+ /** Creation seam for the mic-capture pipeline. Production delegates to the shared {@link createPcmMicCapture}. */
225
+ async createMicCapture(micStream, sampleRate, onPcmChunk) {
226
+ return createPcmMicCapture(micStream, sampleRate, onPcmChunk);
227
+ }
228
+ /** Creation seam for the playout engine. Production returns the shared {@link RealtimePcmPlayback}. */
229
+ createPlayback(sampleRate) {
230
+ return new RealtimePcmPlayback(sampleRate);
231
+ }
232
+ /** Extracts the wire-shaped `session` object from the server pact (`{ session, sampleRate }`). */
233
+ static parseSessionObject(config) {
234
+ const sessionConfig = config.SessionConfig ?? {};
235
+ const raw = sessionConfig['session'];
236
+ return raw !== null && typeof raw === 'object' && !Array.isArray(raw) ? raw : {};
237
+ }
238
+ /** Extracts the PCM sample rate from the server pact, defaulting to the HF-native 16 kHz. */
239
+ static parseSampleRate(config) {
240
+ const raw = config.SessionConfig?.['sampleRate'];
241
+ return typeof raw === 'number' && raw > 0 ? raw : HUGGINGFACE_DEFAULT_PCM_SAMPLE_RATE;
242
+ }
243
+ /** Creates a one-shot signal promise, handing its resolver to the supplied setter. */
244
+ buildSignal(assign) {
245
+ return new Promise((resolve) => assign(resolve));
246
+ }
247
+ /** Sends the server-built session config once the session exists (skipped when empty). */
248
+ applySessionConfig() {
249
+ if (Object.keys(this.sessionObject).length === 0) {
250
+ return;
251
+ }
252
+ this.sendFrame({ type: 'session.update', session: this.sessionObject });
253
+ }
254
+ /** Streams one base64 PCM16 mic frame as an `input_audio_buffer.append`. */
255
+ sendInput(base64Pcm16) {
256
+ this.sendFrame({ type: 'input_audio_buffer.append', audio: base64Pcm16 });
257
+ }
258
+ // ── Inbound event translation ──────────────────────────────────────────────
259
+ /** Parses an inbound frame and dispatches it. */
260
+ handleSocketMessage(data) {
261
+ let event;
262
+ try {
263
+ event = JSON.parse(data);
264
+ }
265
+ catch {
266
+ return; // non-JSON frame — ignore
267
+ }
268
+ if (event === null || typeof event !== 'object') {
269
+ return;
270
+ }
271
+ this.handleEvent(event);
272
+ }
273
+ /** Dispatches a typed OpenAI-Realtime server event to the appropriate behavior. */
274
+ handleEvent(event) {
275
+ switch (event.type) {
276
+ case 'session.created':
277
+ this.onSessionCreated?.();
278
+ this.onSessionCreated = null;
279
+ break;
280
+ case 'response.output_audio.delta':
281
+ case 'response.audio.delta':
282
+ this.handleAudioDelta(event.delta);
283
+ break;
284
+ case 'response.output_audio_transcript.delta':
285
+ case 'response.audio_transcript.delta':
286
+ this.onAssistantDelta(event.delta ?? '');
287
+ break;
288
+ case 'response.output_audio_transcript.done':
289
+ case 'response.audio_transcript.done':
290
+ this.onAssistantDone(event.transcript ?? '');
291
+ break;
292
+ case 'conversation.item.input_audio_transcription.completed':
293
+ this.emitTranscript({ Role: 'User', Text: event.transcript ?? '', IsFinal: true, Kind: 'normal' });
294
+ break;
295
+ case 'response.function_call_arguments.done':
296
+ this.onToolCallFrame(event);
297
+ break;
298
+ case 'input_audio_buffer.speech_started':
299
+ this.handleSpeechStarted();
300
+ break;
301
+ case 'response.created':
302
+ this.responseActive = true;
303
+ this.activeResponseKind = this.pendingNarrationKind ? 'narration' : 'normal';
304
+ this.pendingNarrationKind = false;
305
+ break;
306
+ case 'response.done':
307
+ this.handleResponseDone(event);
308
+ break;
309
+ case 'error':
310
+ this.emitError({ Message: event.error?.message ?? 'Unknown provider error', Code: event.error?.code, Fatal: false });
311
+ break;
312
+ default:
313
+ break;
314
+ }
315
+ }
316
+ /** Enqueues one base64 audio chunk for playout and reflects `'speaking'`. */
317
+ handleAudioDelta(deltaBase64) {
318
+ if (!deltaBase64) {
319
+ return;
320
+ }
321
+ if (this.currentState !== 'speaking') {
322
+ this.setState('speaking');
323
+ }
324
+ this.playback?.Enqueue(base64ToArrayBuffer(deltaBase64));
325
+ }
326
+ /** Appends an assistant transcript delta and emits it (tagged with the active response kind). */
327
+ onAssistantDelta(delta) {
328
+ if (!delta) {
329
+ return;
330
+ }
331
+ if (this.currentState !== 'speaking') {
332
+ this.setState('speaking');
333
+ }
334
+ this.pendingAssistantText += delta;
335
+ this.emitTranscript({ Role: 'Assistant', Text: delta, IsFinal: false, Kind: this.activeResponseKind });
336
+ }
337
+ /** Finalizes the assistant turn (empty turns emit nothing). */
338
+ onAssistantDone(transcript) {
339
+ const finalText = transcript || this.pendingAssistantText;
340
+ this.pendingAssistantText = '';
341
+ if (finalText.trim().length > 0) {
342
+ this.emitTranscript({ Role: 'Assistant', Text: finalText, IsFinal: true, Kind: this.activeResponseKind });
343
+ }
344
+ }
345
+ /**
346
+ * Surfaces a completed tool call. Silently leaves `'speaking'` (no emission) so a host busy indicator
347
+ * isn't clobbered, and clears the busy flag (deadlock guard — obligation #2). `arguments` is already a
348
+ * JSON string on the wire.
349
+ */
350
+ onToolCallFrame(event) {
351
+ if (this.currentState === 'speaking') {
352
+ this.currentState = 'connected';
353
+ }
354
+ this.responseActive = false;
355
+ this.emitToolCall({
356
+ CallID: event.call_id ?? '',
357
+ ToolName: event.name ?? '',
358
+ ArgumentsJson: typeof event.arguments === 'string' ? event.arguments : JSON.stringify(event.arguments ?? {}),
359
+ });
360
+ }
361
+ /**
362
+ * True barge-in ONLY: the user started speaking over active model output (a response in flight or audio
363
+ * audibly playing). Flushes local playback, emits the interruption, returns to `'listening'`.
364
+ */
365
+ handleSpeechStarted() {
366
+ const playing = this.playback?.IsPlaying ?? false;
367
+ if (this.responseActive || playing) {
368
+ this.playback?.Flush();
369
+ this.emitInterruption();
370
+ }
371
+ this.setState('listening');
372
+ }
373
+ /** Response boundary: release the lock, emit usage, fire any queued tool-result reply, return to listening. */
374
+ handleResponseDone(event) {
375
+ this.responseActive = false;
376
+ this.activeResponseKind = 'normal';
377
+ const usage = event.response?.usage;
378
+ if (usage) {
379
+ this.emitUsage({ InputTokens: usage.input_tokens, OutputTokens: usage.output_tokens, Raw: usage });
380
+ }
381
+ this.flushPendingResultResponse();
382
+ if (this.currentState === 'speaking') {
383
+ this.setState('listening');
384
+ }
385
+ }
386
+ // ── Response state machine ─────────────────────────────────────────────────
387
+ /** Triggers a reply immediately when idle, else queues it until the current response finishes. */
388
+ requestResultResponse() {
389
+ if (!this.socket) {
390
+ return;
391
+ }
392
+ if (this.responseActive) {
393
+ this.pendingResultResponse = true;
394
+ return;
395
+ }
396
+ this.pendingResultResponse = false;
397
+ this.responseActive = true;
398
+ this.sendFrame({ type: 'response.create' });
399
+ this.setState('speaking');
400
+ }
401
+ /** On a turn completing, fire any queued tool-result response so the answer is spoken. */
402
+ flushPendingResultResponse() {
403
+ if (!this.pendingResultResponse || !this.socket) {
404
+ return;
405
+ }
406
+ this.pendingResultResponse = false;
407
+ this.responseActive = true;
408
+ this.sendFrame({ type: 'response.create' });
409
+ this.setState('speaking');
410
+ }
411
+ /** Resets the per-session response state machine (used on Disconnect). */
412
+ resetResponseState() {
413
+ this.pendingAssistantText = '';
414
+ this.responseActive = false;
415
+ this.pendingResultResponse = false;
416
+ this.pendingNarrationKind = false;
417
+ this.activeResponseKind = 'normal';
418
+ }
419
+ // ── Transport error / close ────────────────────────────────────────────────
420
+ /** A socket-level error is fatal — the transport is gone (obligation #6). */
421
+ handleSocketError(message) {
422
+ this.emitError({ Message: message, Fatal: true });
423
+ this.setState('error');
424
+ }
425
+ /** A close is silent when consumer-initiated; otherwise reported as a terminal `'closed'`. */
426
+ handleSocketClose() {
427
+ if (this.closedByConsumer) {
428
+ return;
429
+ }
430
+ if (this.currentState !== 'error') {
431
+ this.setState('closed');
432
+ }
433
+ }
434
+ // ── Helpers ────────────────────────────────────────────────────────────────
435
+ /** Updates the client's own state view and emits the change to the host. */
436
+ setState(state) {
437
+ this.currentState = state;
438
+ this.emitStateChange(state);
439
+ }
440
+ /** JSON-serializes and sends one client frame (no-op when the socket is closed). */
441
+ sendFrame(frame) {
442
+ this.socket?.send(JSON.stringify(frame));
443
+ }
444
+ };
445
+ HuggingFaceRealtimeClient = HuggingFaceRealtimeClient_1 = __decorate([
446
+ RegisterClass(BaseRealtimeClient, 'huggingface')
447
+ ], HuggingFaceRealtimeClient);
448
+ export { HuggingFaceRealtimeClient };
449
+ /**
450
+ * Tree-shaking prevention: bundlers cannot see that {@link HuggingFaceRealtimeClient} is instantiated
451
+ * dynamically through the ClassFactory, so a consumer must call this no-op to keep the `@RegisterClass`
452
+ * side effect alive.
453
+ */
454
+ export function LoadHuggingFaceRealtimeClient() {
455
+ // intentional no-op — the static import of this module is the point
456
+ }
457
+ //# sourceMappingURL=huggingFaceRealtimeClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingFaceRealtimeClient.js","sourceRoot":"","sources":["../../src/drivers/huggingFaceRealtimeClient.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,4 +8,5 @@ export * from './drivers/geminiRealtimeClient.js';
8
8
  export * from './drivers/elevenLabsRealtimeClient.js';
9
9
  export * from './drivers/assemblyAIRealtimeClient.js';
10
10
  export * from './drivers/xaiRealtimeClient.js';
11
+ export * from './drivers/huggingFaceRealtimeClient.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC"}
package/dist/index.js CHANGED
@@ -8,4 +8,5 @@ export * from './drivers/geminiRealtimeClient.js';
8
8
  export * from './drivers/elevenLabsRealtimeClient.js';
9
9
  export * from './drivers/assemblyAIRealtimeClient.js';
10
10
  export * from './drivers/xaiRealtimeClient.js';
11
+ export * from './drivers/huggingFaceRealtimeClient.js';
11
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,oCAAoC,CAAC;AACnD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qCAAqC,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@memberjunction/ai-realtime-client",
3
3
  "type": "module",
4
- "version": "5.47.0",
4
+ "version": "5.48.0",
5
5
  "description": "MemberJunction: Framework-agnostic browser client abstraction for provider-direct realtime (voice) sessions - BaseRealtimeClient + provider drivers",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -16,8 +16,8 @@
16
16
  "author": "MemberJunction.com",
17
17
  "license": "ISC",
18
18
  "dependencies": {
19
- "@memberjunction/global": "5.47.0",
20
- "@memberjunction/ai": "5.47.0",
19
+ "@memberjunction/global": "5.48.0",
20
+ "@memberjunction/ai": "5.48.0",
21
21
  "@google/genai": "^1.40.0"
22
22
  },
23
23
  "devDependencies": {