@kuralle-syrinx/browser-client 4.4.0 → 4.5.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/dist/agent-state.d.ts +35 -0
- package/dist/agent-state.d.ts.map +1 -0
- package/dist/agent-state.js +76 -0
- package/dist/agent-state.js.map +1 -0
- package/dist/audio.d.ts +61 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +276 -0
- package/dist/audio.js.map +1 -0
- package/dist/browser-opus.d.ts +41 -0
- package/dist/browser-opus.d.ts.map +1 -0
- package/dist/browser-opus.js +81 -0
- package/dist/browser-opus.js.map +1 -0
- package/dist/index.d.ts +270 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +744 -0
- package/dist/index.js.map +1 -0
- package/dist/session-metrics.d.ts +28 -0
- package/dist/session-metrics.d.ts.map +1 -0
- package/dist/session-metrics.js +60 -0
- package/dist/session-metrics.js.map +1 -0
- package/dist/session-record.d.ts +112 -0
- package/dist/session-record.d.ts.map +1 -0
- package/dist/session-record.js +181 -0
- package/dist/session-record.js.map +1 -0
- package/dist/transport.d.ts +16 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +3 -0
- package/dist/transport.js.map +1 -0
- package/dist/turn-recorder.d.ts +56 -0
- package/dist/turn-recorder.d.ts.map +1 -0
- package/dist/turn-recorder.js +168 -0
- package/dist/turn-recorder.js.map +1 -0
- package/dist/turn-timeline.d.ts +51 -0
- package/dist/turn-timeline.d.ts.map +1 -0
- package/dist/turn-timeline.js +92 -0
- package/dist/turn-timeline.js.map +1 -0
- package/dist/websocket-transport.d.ts +20 -0
- package/dist/websocket-transport.d.ts.map +1 -0
- package/dist/websocket-transport.js +92 -0
- package/dist/websocket-transport.js.map +1 -0
- package/package.json +35 -11
- package/src/agent-state.test.ts +143 -0
- package/src/audio.test.ts +130 -0
- package/src/index.test.ts +842 -0
- package/src/jitter-buffer.test.ts +275 -0
- package/src/session-metrics.test.ts +102 -0
- package/src/session-record.test.ts +219 -0
- package/src/studio-page.test.ts +69 -0
- package/src/transport.test.ts +233 -0
- package/src/turn-recorder.test.ts +138 -0
- package/src/turn-timeline.test.ts +151 -0
- package/index.html +0 -1073
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
export { decodeBrowserAssistantAudio, encodeBrowserAudioEnvelopeFrame, encodeBrowserAudioFrame, float32ToPcm16, pcm16FrameSampleCount, resampleFloat32Linear, type EncodeBrowserAudioOptions, type ResampleFloat32Options, type SyrinxAudioJsonFrame, } from "./audio.js";
|
|
2
|
+
import type { TurnEndOwner, TurnEndReason } from "@kuralle-syrinx/core";
|
|
3
|
+
import { type BrowserAssistantAudio, type EncodeBrowserAudioOptions, type AudioJitterBufferOptions } from "./audio.js";
|
|
4
|
+
import type { ClientTransport } from "./transport.js";
|
|
5
|
+
export type { ClientTransport, ClientTransportHandlers } from "./transport.js";
|
|
6
|
+
export { WebSocketClientTransport } from "./websocket-transport.js";
|
|
7
|
+
export { BROWSER_OPUS_FRAME_DURATION_MS, BROWSER_OPUS_SAMPLE_RATE_HZ, BROWSER_SUPPORTED_INPUT_CODECS, createBrowserOpusCodec, encodeBrowserOpusEnvelope, encodeBrowserPcmEnvelope, loadBrowserOpusModule, pickBrowserWireCodec, type BrowserOpusCodec, type BrowserWireCodec, } from "./browser-opus.js";
|
|
8
|
+
export type SyrinxStudioMessage = {
|
|
9
|
+
readonly type: "ready";
|
|
10
|
+
readonly sessionId?: string;
|
|
11
|
+
readonly resumed?: boolean;
|
|
12
|
+
readonly resumeWindowMs?: number;
|
|
13
|
+
readonly audio?: {
|
|
14
|
+
readonly inputSampleRateHz: number;
|
|
15
|
+
readonly outputSampleRateHz: number;
|
|
16
|
+
readonly encoding: "pcm_s16le" | "opus";
|
|
17
|
+
readonly supportedInputCodecs?: readonly string[];
|
|
18
|
+
readonly channels: 1;
|
|
19
|
+
/** Node states this; the Workers/DO host does not. Optional for that reason. */
|
|
20
|
+
readonly targetFrameDurationMs?: number;
|
|
21
|
+
readonly binaryEnvelope?: "syrinx.audio.v1";
|
|
22
|
+
readonly rawBinaryInput?: boolean;
|
|
23
|
+
};
|
|
24
|
+
} | {
|
|
25
|
+
readonly type: "speech_started";
|
|
26
|
+
readonly turnId?: string;
|
|
27
|
+
} | {
|
|
28
|
+
readonly type: "speech_ended";
|
|
29
|
+
readonly turnId?: string;
|
|
30
|
+
} | {
|
|
31
|
+
readonly type: "stt_chunk";
|
|
32
|
+
readonly turnId?: string;
|
|
33
|
+
readonly transcript: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly type: "stt_output";
|
|
36
|
+
readonly turnId?: string;
|
|
37
|
+
readonly transcript: string;
|
|
38
|
+
readonly confidence?: number;
|
|
39
|
+
} | {
|
|
40
|
+
readonly type: "agent_chunk";
|
|
41
|
+
readonly turnId?: string;
|
|
42
|
+
readonly text: string;
|
|
43
|
+
} | {
|
|
44
|
+
readonly type: "agent_tool_call";
|
|
45
|
+
readonly turnId?: string;
|
|
46
|
+
readonly id?: string;
|
|
47
|
+
readonly name: string;
|
|
48
|
+
readonly args?: unknown;
|
|
49
|
+
} | {
|
|
50
|
+
readonly type: "agent_tool_result";
|
|
51
|
+
readonly turnId?: string;
|
|
52
|
+
readonly id?: string;
|
|
53
|
+
readonly result?: unknown;
|
|
54
|
+
} | {
|
|
55
|
+
readonly type: "tool_call_started";
|
|
56
|
+
readonly turnId?: string;
|
|
57
|
+
readonly toolId?: string;
|
|
58
|
+
readonly toolName?: string;
|
|
59
|
+
} | {
|
|
60
|
+
readonly type: "tool_call_delayed";
|
|
61
|
+
readonly turnId?: string;
|
|
62
|
+
readonly toolId?: string;
|
|
63
|
+
readonly toolName?: string;
|
|
64
|
+
readonly afterMs?: number;
|
|
65
|
+
} | {
|
|
66
|
+
readonly type: "tool_call_complete";
|
|
67
|
+
readonly turnId?: string;
|
|
68
|
+
readonly toolId?: string;
|
|
69
|
+
readonly toolName?: string;
|
|
70
|
+
} | {
|
|
71
|
+
readonly type: "tool_call_failed";
|
|
72
|
+
readonly turnId?: string;
|
|
73
|
+
readonly toolId?: string;
|
|
74
|
+
readonly toolName?: string;
|
|
75
|
+
} | {
|
|
76
|
+
readonly type: "agent_end";
|
|
77
|
+
readonly turnId?: string;
|
|
78
|
+
} | {
|
|
79
|
+
readonly type: "agent_interrupted";
|
|
80
|
+
readonly turnId?: string;
|
|
81
|
+
readonly reason?: string;
|
|
82
|
+
} | {
|
|
83
|
+
readonly type: "audio_clear";
|
|
84
|
+
readonly turnId?: string;
|
|
85
|
+
readonly reason?: string;
|
|
86
|
+
} | {
|
|
87
|
+
readonly type: "tts_end";
|
|
88
|
+
readonly turnId?: string;
|
|
89
|
+
} | {
|
|
90
|
+
readonly type: "turn_complete";
|
|
91
|
+
readonly turnId?: string;
|
|
92
|
+
readonly transcript: string;
|
|
93
|
+
} | {
|
|
94
|
+
readonly type: "tts_chunk";
|
|
95
|
+
readonly turnId?: string;
|
|
96
|
+
readonly sequence: number;
|
|
97
|
+
readonly sampleRateHz: number;
|
|
98
|
+
readonly encoding: "pcm_s16le";
|
|
99
|
+
readonly channels: 1;
|
|
100
|
+
readonly byteLength: number;
|
|
101
|
+
readonly durationMs: number;
|
|
102
|
+
} | {
|
|
103
|
+
readonly type: "metrics";
|
|
104
|
+
readonly turnId?: string;
|
|
105
|
+
readonly correlationId?: string;
|
|
106
|
+
readonly speechEndMs?: number;
|
|
107
|
+
readonly textReadyMs?: number;
|
|
108
|
+
readonly firstAudioByteMs?: number;
|
|
109
|
+
readonly firstAudioPlayedMs?: number;
|
|
110
|
+
readonly lastAudioPlayedMs?: number;
|
|
111
|
+
readonly sttMs?: number;
|
|
112
|
+
readonly llmTTFTMs?: number;
|
|
113
|
+
readonly ttsTTFBMs?: number;
|
|
114
|
+
readonly e2eMs?: number;
|
|
115
|
+
/** Which owner decided the turn ended. Omitted when the backend did not say. */
|
|
116
|
+
readonly endpointingOwner?: TurnEndOwner;
|
|
117
|
+
/** Why the turn ended. Omitted when the backend did not say. */
|
|
118
|
+
readonly endpointingReason?: TurnEndReason;
|
|
119
|
+
} | {
|
|
120
|
+
readonly type: "error";
|
|
121
|
+
readonly component?: string;
|
|
122
|
+
readonly category?: string;
|
|
123
|
+
readonly message: string;
|
|
124
|
+
};
|
|
125
|
+
export type SyrinxBrowserClientEvent = {
|
|
126
|
+
readonly type: "open";
|
|
127
|
+
} | {
|
|
128
|
+
readonly type: "close";
|
|
129
|
+
readonly code: number;
|
|
130
|
+
readonly reason: string;
|
|
131
|
+
} | {
|
|
132
|
+
readonly type: "error";
|
|
133
|
+
readonly error: Event | Error;
|
|
134
|
+
} | {
|
|
135
|
+
readonly type: "message";
|
|
136
|
+
readonly message: SyrinxStudioMessage;
|
|
137
|
+
} | {
|
|
138
|
+
readonly type: "audio";
|
|
139
|
+
readonly data: ArrayBuffer;
|
|
140
|
+
readonly metadata?: BrowserAssistantAudio["metadata"];
|
|
141
|
+
} | {
|
|
142
|
+
readonly type: "reconnecting";
|
|
143
|
+
readonly attempt: number;
|
|
144
|
+
readonly delayMs: number;
|
|
145
|
+
} | {
|
|
146
|
+
readonly type: "reconnected";
|
|
147
|
+
readonly attempt: number;
|
|
148
|
+
} | {
|
|
149
|
+
readonly type: "resumed";
|
|
150
|
+
};
|
|
151
|
+
export type SyrinxBrowserClientHandler = (event: SyrinxBrowserClientEvent) => void;
|
|
152
|
+
export interface SyrinxBrowserClientOptions {
|
|
153
|
+
readonly url: string;
|
|
154
|
+
readonly protocols?: string | readonly string[];
|
|
155
|
+
/** Injectable transport seam (default: WebSocket). Future: WebRTC / WebTransport. */
|
|
156
|
+
readonly transport?: ClientTransport;
|
|
157
|
+
/**
|
|
158
|
+
* Auto-reconnect on unexpected close. Set false to disable entirely.
|
|
159
|
+
* Defaults to enabled with 10 attempts, 1 s base delay, 30 s cap.
|
|
160
|
+
*/
|
|
161
|
+
readonly reconnect?: false | {
|
|
162
|
+
readonly maxAttempts?: number;
|
|
163
|
+
readonly baseDelayMs?: number;
|
|
164
|
+
readonly maxDelayMs?: number;
|
|
165
|
+
/** A reconnect that opens then dies within this window counts as a quick failure. Default 5000 ms. */
|
|
166
|
+
readonly minStableMs?: number;
|
|
167
|
+
/** Consecutive quick failures (open-then-die) before giving up — backoff can't fix a flapping peer. Default 3. */
|
|
168
|
+
readonly maxQuickFailures?: number;
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Interval (ms) for periodic {type:"ping"} keepalives. Set false to disable.
|
|
172
|
+
* Default: 10 000 ms — below typical proxy idle-kill thresholds.
|
|
173
|
+
*/
|
|
174
|
+
readonly keepaliveIntervalMs?: number | false;
|
|
175
|
+
/**
|
|
176
|
+
* AudioContext for audio playback scheduling. If provided, enables jitter buffering.
|
|
177
|
+
* If not provided, audio events are emitted directly without buffering.
|
|
178
|
+
*/
|
|
179
|
+
readonly audioContext?: AudioContext;
|
|
180
|
+
/**
|
|
181
|
+
* Jitter buffer configuration. Only used when audioContext is provided.
|
|
182
|
+
*/
|
|
183
|
+
readonly jitterBuffer?: Omit<AudioJitterBufferOptions, "sampleRateHz">;
|
|
184
|
+
/**
|
|
185
|
+
* Local barge-in: while assistant audio is playing out, sustained mic energy on
|
|
186
|
+
* the uplink sends {type:"client_interrupt"} so the server stops the agent at
|
|
187
|
+
* local-VAD speed instead of waiting for provider STT evidence. Provider-agnostic
|
|
188
|
+
* (pure PCM energy; works with any STT/TTS). Requires audioContext (playout
|
|
189
|
+
* knowledge) and benefits from getUserMedia echoCancellation. Set false to disable.
|
|
190
|
+
*/
|
|
191
|
+
readonly bargeIn?: false | {
|
|
192
|
+
/** Sustained speech required before interrupting. Default 280 ms (mirrors the server gate). */
|
|
193
|
+
readonly minSpeechMs?: number;
|
|
194
|
+
/** Speech threshold as a multiple of the rolling noise floor. Default 3. */
|
|
195
|
+
readonly thresholdFactor?: number;
|
|
196
|
+
/** Absolute RMS floor (0..1 full scale) below which audio is never speech. Default 0.015. */
|
|
197
|
+
readonly minRms?: number;
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
export declare class SyrinxBrowserClient {
|
|
201
|
+
private readonly options;
|
|
202
|
+
private readonly transport;
|
|
203
|
+
private readonly handlers;
|
|
204
|
+
private audioSequence;
|
|
205
|
+
private currentSessionId;
|
|
206
|
+
private cleanClose;
|
|
207
|
+
private reconnectAttempt;
|
|
208
|
+
private quickFailures;
|
|
209
|
+
private openedAt;
|
|
210
|
+
private reconnectTimer;
|
|
211
|
+
private keepaliveTimer;
|
|
212
|
+
private playoutProgressTimer;
|
|
213
|
+
private lastProgressContextId;
|
|
214
|
+
private jitterBuffer;
|
|
215
|
+
private outputSampleRateHz;
|
|
216
|
+
private wireCodec;
|
|
217
|
+
private inputSampleRateHz;
|
|
218
|
+
private opusCodec;
|
|
219
|
+
private opusLoadFailed;
|
|
220
|
+
private codecNegotiation;
|
|
221
|
+
private uplinkCodecDecided;
|
|
222
|
+
private pendingUplink;
|
|
223
|
+
private readonly streamingResamplers;
|
|
224
|
+
private bargeInNoiseFloorRms;
|
|
225
|
+
private bargeInSpeechMs;
|
|
226
|
+
private bargeInInterruptSent;
|
|
227
|
+
constructor(options: SyrinxBrowserClientOptions);
|
|
228
|
+
get connected(): boolean;
|
|
229
|
+
/** The sessionId received from the server's last `ready` message. Used to resume on reconnect. */
|
|
230
|
+
get sessionId(): string | null;
|
|
231
|
+
on(handler: SyrinxBrowserClientHandler): () => void;
|
|
232
|
+
connect(): void;
|
|
233
|
+
close(code?: number, reason?: string): void;
|
|
234
|
+
sendAudioPcm(audio: ArrayBuffer | ArrayBufferView, sampleRateHz: number, options?: {
|
|
235
|
+
readonly contextId?: string;
|
|
236
|
+
readonly sequence?: number;
|
|
237
|
+
}): void;
|
|
238
|
+
sendAudioBase64(audio: string, sampleRateHz: number, options?: {
|
|
239
|
+
readonly contextId?: string;
|
|
240
|
+
readonly sequence?: number;
|
|
241
|
+
}): void;
|
|
242
|
+
sendFloat32Audio(input: Float32Array, options: EncodeBrowserAudioOptions): void;
|
|
243
|
+
sendText(text: string): void;
|
|
244
|
+
private observeUplinkForBargeIn;
|
|
245
|
+
sendJson(value: unknown): void;
|
|
246
|
+
private openTransport;
|
|
247
|
+
private handleTransportOpen;
|
|
248
|
+
private handleTransportClose;
|
|
249
|
+
private handleTransportMessage;
|
|
250
|
+
private handleTransportAudio;
|
|
251
|
+
private scheduleReconnect;
|
|
252
|
+
private cancelReconnect;
|
|
253
|
+
private startKeepalive;
|
|
254
|
+
private stopKeepalive;
|
|
255
|
+
private startPlayoutProgressReporting;
|
|
256
|
+
private stopPlayoutProgressReporting;
|
|
257
|
+
private handleJsonMessage;
|
|
258
|
+
private handleBinaryMessage;
|
|
259
|
+
private scheduleUplink;
|
|
260
|
+
private flushPendingUplink;
|
|
261
|
+
private negotiateWireCodec;
|
|
262
|
+
private reportDownlinkCodecCapability;
|
|
263
|
+
private encodeUplinkPcm;
|
|
264
|
+
private requireOpenTransport;
|
|
265
|
+
private assertAudioSequenceCanAdvance;
|
|
266
|
+
private nextAudioSequence;
|
|
267
|
+
private handleAudioData;
|
|
268
|
+
private emit;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|