@voicethere/client 0.17.0 → 0.18.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/CHANGELOG.md +70 -50
- package/README.md +25 -0
- package/dist/agent-control-events.d.ts +7 -1
- package/dist/agent-control-events.d.ts.map +1 -1
- package/dist/agent-control-events.js +42 -0
- package/dist/agent-control-events.js.map +1 -1
- package/dist/browser/browser-session.d.ts +3 -2
- package/dist/browser/browser-session.d.ts.map +1 -1
- package/dist/browser/browser-session.js +2 -1
- package/dist/browser/browser-session.js.map +1 -1
- package/dist/browser/browser-voice-session.d.ts +6 -1
- package/dist/browser/browser-voice-session.d.ts.map +1 -1
- package/dist/browser/browser-voice-session.js +10 -1
- package/dist/browser/browser-voice-session.js.map +1 -1
- package/dist/embed/index.d.ts.map +1 -1
- package/dist/embed/index.js +35 -0
- package/dist/embed/index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/node/index.d.ts +2 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +1 -0
- package/dist/node/index.js.map +1 -1
- package/dist/spoken-text-reveal.d.ts.map +1 -1
- package/dist/spoken-text-reveal.js +151 -8
- package/dist/spoken-text-reveal.js.map +1 -1
- package/dist/types.d.ts +18 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.18.0] - 2026-11-01
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Links from the agent. New session option `onAgentContent` on `connectBrowserSession`, `connectBrowserVoiceSession` and the `./node` entry receives `assistant_content` messages (sent by `@voicethere/agent` 0.22+) as `{ turnId, inReplyTo?, spoken, content: { kind: "link", url, label? } }`. Only `https:` links are reported; unknown kinds are skipped. `parseAgentContentEvent` and the `AgentContent` / `AgentContentEvent` types are exported from `.`, `./browser` and `./node`. The embed widget shows each link as a clickable line in the transcript that opens in a new tab.
|
|
8
|
+
|
|
9
|
+
## [0.17.1] - 2026-10-30
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- A spoken reply interrupted before its first word was revealed (a barge-in, often the listener's speakers echoing into the mic) no longer disappears. Once the reply's audio has started, `onAgentText` and the spoken caption show at least its first sentence when the turn is interrupted, replaced by the next turn, or when the session closes or reconnects. A reply whose audio never started still shows nothing. An `agent_speaking_start` that arrives just before a turn's first `assistant_delta` now counts for that turn and its text starts revealing right away, and closing the session while a completed reply is still being revealed reports its full text.
|
|
14
|
+
|
|
3
15
|
## [0.17.0] - 2026-10-30
|
|
4
16
|
|
|
5
17
|
### Added
|
|
@@ -133,7 +145,7 @@
|
|
|
133
145
|
- Session error code `SESSION_ENDED_DURING_RECONNECT` when the gateway rejects the reconnect token with HTTP 401.
|
|
134
146
|
- `disconnect()` / `disconnectAsync()` send `{ "type": "client_hangup" }` (`CLIENT_HANGUP_MESSAGE_TYPE`) on the control channel before closing.
|
|
135
147
|
|
|
136
|
-
## 0.10.0
|
|
148
|
+
## [0.10.0] - 2026-10-04
|
|
137
149
|
|
|
138
150
|
### Changed
|
|
139
151
|
|
|
@@ -145,19 +157,19 @@
|
|
|
145
157
|
- `startSession` failures from a rejected `POST /sessions` now include `httpStatus`.
|
|
146
158
|
- Exported `widgetKeyMapUrl` and `widgetProjectBootstrapUrl` URL builders.
|
|
147
159
|
|
|
148
|
-
## 0.9.0
|
|
160
|
+
## [0.9.0] - 2026-09-26
|
|
149
161
|
|
|
150
162
|
### Added
|
|
151
163
|
|
|
152
164
|
- **Key-only embed bootstrap** — `createVoiceThereWidgetAsync({ clientKey })` loads `{cdn}/widgets/by-key/{sha256(clientKey)}/bootstrap.json` (no `Authorization`; `credentials: "omit"`), caches the document in `sessionStorage` for repeat navigations, and merges optional published `widget` appearance. Legacy `configUrl` still fetches `config.json` only. Default hosts: `https://sessions.voicethere.io/v1` and `https://cdn.voicethere.io` (staging sessions host pairs with `https://cdn.voicethere.dev`).
|
|
153
165
|
|
|
154
|
-
## 0.8.3
|
|
166
|
+
## [0.8.3] - 2026-09-21
|
|
155
167
|
|
|
156
168
|
### Added
|
|
157
169
|
|
|
158
170
|
- **Embed spoken chat captions** — optional `streamSpokenText` (default off) reveals incoming agent `chat_reply` text word-by-word during speech; snaps on `agent_speaking_end` and freezes on `barge_in`. Supports `chat_reply` fields `stream`, `utteranceId`, and `durationMs` on voice-control messages.
|
|
159
171
|
|
|
160
|
-
## 0.8.2
|
|
172
|
+
## [0.8.2] - 2026-09-19
|
|
161
173
|
|
|
162
174
|
### Added
|
|
163
175
|
|
|
@@ -171,13 +183,13 @@
|
|
|
171
183
|
- **Embed panel UX** — opening the chat hides the launcher pill; panel header includes a close control (`data-vt-open` on the root).
|
|
172
184
|
- **Embed transcript** — message bubbles replace the debug `<pre>` log; `onControlMessage` appends incoming agent/chat text.
|
|
173
185
|
|
|
174
|
-
## 0.8.1
|
|
186
|
+
## [0.8.1] - 2026-09-01
|
|
175
187
|
|
|
176
188
|
### Fixed
|
|
177
189
|
|
|
178
190
|
- **Mic-denied synthetic fallback** — When microphone permission is denied or unavailable, the synthetic outbound track now sends inaudible looping white noise instead of silence so WebRTC is not DTX-suppressed, the runner receives `ontrack`, and the voice conversation can start. The production embed API `createVoiceThereWidget({ apiBase, projectId, clientKey, mode })` (no `configUrl`) is unchanged.
|
|
179
191
|
|
|
180
|
-
## 0.8.0
|
|
192
|
+
## [0.8.0] - 2026-08-31
|
|
181
193
|
|
|
182
194
|
### Added
|
|
183
195
|
|
|
@@ -188,7 +200,7 @@
|
|
|
188
200
|
- **Embed widget CDN config** — `createVoiceThereWidgetAsync` still mounts the launcher from inline options when `configUrl` is missing, unreachable, or returns invalid JSON; warns in the console instead of rejecting the promise.
|
|
189
201
|
- **Audio visualizer idle frame** — `attachAudioVisualizer().stop()` and ended MediaStream tracks now clear the canvas and draw a flat midline instead of freezing on the last analyser snapshot.
|
|
190
202
|
|
|
191
|
-
## 0.7.29
|
|
203
|
+
## [0.7.29] - 2026-08-28
|
|
192
204
|
|
|
193
205
|
### Added
|
|
194
206
|
|
|
@@ -203,13 +215,13 @@
|
|
|
203
215
|
|
|
204
216
|
- **Reconnect callbacks** — `onIceRecovery`, `onReconnecting`, and `onReconnected` accept an optional 2nd arg `VoiceSessionReconnectInfo` (`reason`, effective `iceTransportPolicy`) for E2E/load-test diagnostics.
|
|
205
217
|
|
|
206
|
-
## 0.7.28
|
|
218
|
+
## [0.7.28] - 2026-08-15
|
|
207
219
|
|
|
208
220
|
### Fixed
|
|
209
221
|
|
|
210
222
|
- Node runtime (`createNodeWebRtcRuntime`) waits for ICE gathering (`gatheringComplete` when available) before sending the SDP answer so relay candidates are in the answer. Browser default remains trickle-immediate.
|
|
211
223
|
|
|
212
|
-
## 0.7.27
|
|
224
|
+
## [0.7.27] - 2026-08-12
|
|
213
225
|
|
|
214
226
|
### Added
|
|
215
227
|
|
|
@@ -218,77 +230,77 @@
|
|
|
218
230
|
- **`audioInputDeviceId`** option on connect (`deviceId: { ideal }` for initial GUM).
|
|
219
231
|
- **`client/src/browser/microphone.ts`** helpers exported from `@voicethere/client/browser`.
|
|
220
232
|
|
|
221
|
-
## 0.7.26
|
|
233
|
+
## [0.7.26] - 2026-08-05
|
|
222
234
|
|
|
223
235
|
### Added
|
|
224
236
|
|
|
225
237
|
- **ICE recovery (relay-leaning)** — before same-session auto-reconnect budget: on PeerConnection fail (or stuck ICE checking ≥12s with `nominated=0`), rebuild via signaling with `iceTransportPolicy=relay`. Uses `onIceRecovery` / `maxIceRecoveryAttempts` (default **1**) and does **not** increment `autoReconnectAttempts` or call `onReconnecting`. Set `maxIceRecoveryAttempts=0` for legacy behavior; `iceRecoveryStuckCheckingMs=0` disables proactive stuck-checking.
|
|
226
238
|
- **`webrtc ice_triage`** — compact diagnostics line (selected/nominated/succeeded/failed + host/srflx/relay counts) in `formatWebRtcDiagnosticsLines` / `formatIceTriageLine`.
|
|
227
239
|
|
|
228
|
-
## 0.7.25
|
|
240
|
+
## [0.7.25] - 2026-08-03
|
|
229
241
|
|
|
230
242
|
### Fixed
|
|
231
243
|
|
|
232
244
|
- **`session_reconnect_token`** — after updating join credentials, forward the control message to `onControlMessage` so E2E waiters and app hooks observe the token (previously returned early after internal update only).
|
|
233
245
|
|
|
234
|
-
## 0.7.24
|
|
246
|
+
## [0.7.24] - 2026-08-03
|
|
235
247
|
|
|
236
248
|
### Added
|
|
237
249
|
|
|
238
250
|
- **`onReconnected`** — callback after same-session reconnect reaches ready again (not on first connect). Enables load/e2e mid-turn phrase resend without treating reconnect as a fresh session.
|
|
239
251
|
|
|
240
|
-
## 0.7.23
|
|
252
|
+
## [0.7.23] - 2026-08-03
|
|
241
253
|
|
|
242
254
|
### Added
|
|
243
255
|
|
|
244
256
|
- **`session_reconnect_token`** — voice-control handler updates in-memory join credentials when the runner mints an opaque reconnect token; same-session `reconnect()` and auto-reconnect open signaling with the latest token.
|
|
245
257
|
- **`forceCloseSignalingForTests()`** — test/E2E hook on `BrowserVoiceSession` to force-close the signaling WebSocket and trigger `signaling_closed` auto-reconnect.
|
|
246
258
|
|
|
247
|
-
## 0.7.22
|
|
259
|
+
## [0.7.22] - 2026-07-31
|
|
248
260
|
|
|
249
261
|
### Fixed
|
|
250
262
|
|
|
251
263
|
- **POST `/sessions` 429 mapping** — monthly usage gate responses (`NWRTC_MONTHLY_USAGE_EXCEEDED`) now surface `MONTHLY_USAGE_EXCEEDED` instead of always `CAPACITY_EXCEEDED`.
|
|
252
264
|
|
|
253
|
-
## 0.7.21
|
|
265
|
+
## [0.7.21] - 2026-07-31
|
|
254
266
|
|
|
255
267
|
### Fixed
|
|
256
268
|
|
|
257
269
|
- **`getConnectionState()` after idle kick** — inbound `session_close` now sets internal `connectionState` to `closed` (matching connection status), so callers polling `getConnectionState()` observe the disconnect.
|
|
258
270
|
|
|
259
|
-
## 0.7.20
|
|
271
|
+
## [0.7.20] - 2026-07-31
|
|
260
272
|
|
|
261
273
|
### Changed
|
|
262
274
|
|
|
263
275
|
- **Deps** — `@node-webrtc-rust/{sdk,signaling}` **0.7.0** (Opus SDP omits `maxaveragebitrate` unless env set; encode default 400 kbps).
|
|
264
276
|
|
|
265
|
-
## 0.7.19
|
|
277
|
+
## [0.7.19] - 2026-07-30
|
|
266
278
|
|
|
267
279
|
### Fixed
|
|
268
280
|
|
|
269
281
|
- **Inbound `session_close`** — idle kick and other server-initiated closes now emit a non-recoverable `session_error` (`SESSION_IDLE_TIMEOUT` or `WEBRTC_CONNECTION_CLOSED`) and stop auto-reconnect so dashboard chat does not stay "Connected".
|
|
270
282
|
- **`auto_reconnect_exhausted`** — emits `WEBRTC_RECONNECT_EXHAUSTED`, marks the session terminal, and publishes a closed/not-ready connection snapshot.
|
|
271
283
|
|
|
272
|
-
## 0.7.18
|
|
284
|
+
## [0.7.18] - 2026-07-30
|
|
273
285
|
|
|
274
286
|
### Fixed
|
|
275
287
|
|
|
276
288
|
- **Browser ICE:** send the SDP answer immediately after `setLocalDescription` and trickle candidates via `onicecandidate`, instead of waiting for `iceGatheringState === "complete"`. Waiting for gather-complete delayed CreatePermission on the runner and caused Chromium sessions (especially TURN relay) to fail with `WEBRTC_CONNECTION_FAILED` while Node clients succeeded.
|
|
277
289
|
- **`waitForConnected`:** fail fast when `connectionState` / `iceConnectionState` enter `failed` or `disconnected`, instead of waiting for the full timeout (dashboard half-open recovery).
|
|
278
290
|
|
|
279
|
-
## 0.7.17
|
|
291
|
+
## [0.7.17] - 2026-07-28
|
|
280
292
|
|
|
281
293
|
### Changed
|
|
282
294
|
|
|
283
295
|
- Treat control-channel JSON `position` as high-frequency: log at debug (with `keepalive` / `state` / `tick`) so load/redis-sync smokes stay quiet unless `LOAD_TEST_CLIENT_DEBUG=1`.
|
|
284
296
|
|
|
285
|
-
## 0.7.16
|
|
297
|
+
## [0.7.16] - 2026-07-28
|
|
286
298
|
|
|
287
299
|
### Changed
|
|
288
300
|
|
|
289
301
|
- Stop logging `dc/control_not_open` / `dc/sync_not_open` on every failed send while channels are connecting. Open/close transitions remain single `dc/open` / `dc/close` events (avoids spam from readiness polls).
|
|
290
302
|
|
|
291
|
-
## 0.7.15
|
|
303
|
+
## [0.7.15] - 2026-07-28
|
|
292
304
|
|
|
293
305
|
### Added
|
|
294
306
|
|
|
@@ -299,7 +311,7 @@
|
|
|
299
311
|
|
|
300
312
|
- Consumers that require abortable `startSession` (canonical voice soak) must install this release (or newer). Older published `0.7.14` builds do not advertise the capability.
|
|
301
313
|
|
|
302
|
-
## 0.7.14
|
|
314
|
+
## [0.7.14] - 2026-07-27
|
|
303
315
|
|
|
304
316
|
### Added
|
|
305
317
|
|
|
@@ -313,31 +325,31 @@
|
|
|
313
325
|
- **Removed startup ICE PC reconstruction** — race-prone automatic peer rebuild on failed/disconnected startup was dropped. Existing same-session signaling reconnect is unchanged.
|
|
314
326
|
- Diagnostic redaction covers `http(s)`, `ws(s)`, `turn(s)`, `stun` URIs, join tokens, JSON credentials, and SDP `ice-pwd`; async diagnostic handler rejections are isolated.
|
|
315
327
|
|
|
316
|
-
## 0.7.13
|
|
328
|
+
## [0.7.13] - 2026-07-26
|
|
317
329
|
|
|
318
330
|
### Added
|
|
319
331
|
|
|
320
332
|
- **ICE candidate-pair diagnostics** — `getWebRtcDiagnostics()` / `summarizeRtcStatsReport` now resolve local/remote candidate types for every retained pair (order-independent), including failed non-selected pairs. Aggregate counts add `prflx` / unknown local candidates and total local candidate reports. Formatted lines stay redacted (no addresses, ports, URLs, or credentials).
|
|
321
333
|
|
|
322
|
-
## 0.7.12
|
|
334
|
+
## [0.7.12] - 2026-07-24
|
|
323
335
|
|
|
324
336
|
### Added
|
|
325
337
|
|
|
326
338
|
- **`fetchSessionApi`** — retries session-service `POST`/`GET` on Envoy-style 502–504 / `upstream connect error` / connection termination (and network `fetch failed`), with short backoff. Wired into `startSession` and status polling so rolling deploys do not fail one-shot polls.
|
|
327
339
|
|
|
328
|
-
## 0.7.11
|
|
340
|
+
## [0.7.11] - 2026-07-23
|
|
329
341
|
|
|
330
342
|
### Changed
|
|
331
343
|
|
|
332
344
|
- **Adaptive session provisioning polling** — replace fixed 1s status polls with backoff + jitter, and honor Session API `retry_after_ms` hints to cut control-plane load during wait queues.
|
|
333
345
|
|
|
334
|
-
## 0.7.10
|
|
346
|
+
## [0.7.10] - 2026-07-21
|
|
335
347
|
|
|
336
348
|
### Fixed
|
|
337
349
|
|
|
338
350
|
- **Same-session reconnect after `WEBRTC_SDP_NEGOTIATION_FAILED`** — malformed/empty remote offers (missing `a=ice-ufrag`) now trigger signaling reconnect under the default `same-session` policy so `waitForConnected()` can recover instead of hanging until timeout (scale-up burst flake class).
|
|
339
351
|
|
|
340
|
-
## 0.7.9
|
|
352
|
+
## [0.7.9] - 2026-07-17
|
|
341
353
|
|
|
342
354
|
### Added
|
|
343
355
|
|
|
@@ -348,19 +360,19 @@
|
|
|
348
360
|
|
|
349
361
|
- **`waitForConnected()` after early offer failure** — preserve non-retriable SDP handler errors via `pendingConnectFailure` so callers fail fast instead of waiting for the connect timeout.
|
|
350
362
|
|
|
351
|
-
## 0.7.8
|
|
363
|
+
## [0.7.8] - 2026-07-17
|
|
352
364
|
|
|
353
365
|
### Fixed
|
|
354
366
|
|
|
355
367
|
- **Terminal `session_error` vs transport failure** — when the server sends `session_error` with `recoverable: false` (e.g. `AGENT_HANDLER_FAILED`), mark the session as gracefully disconnected so auto-reconnect does not overwrite the error with `WEBRTC_CONNECTION_FAILED`.
|
|
356
368
|
|
|
357
|
-
## 0.7.7
|
|
369
|
+
## [0.7.7] - 2026-07-15
|
|
358
370
|
|
|
359
371
|
### Changed
|
|
360
372
|
|
|
361
373
|
- **Data-channel debug noise** — `keepalive`, `state`, and `tick` payloads log at `debug` instead of `info` (inbound and `sendToAgent` outbound). Staging E2E omits them unless `LOAD_TEST_CLIENT_DEBUG=1`.
|
|
362
374
|
|
|
363
|
-
## 0.7.6
|
|
375
|
+
## [0.7.6] - 2026-07-15
|
|
364
376
|
|
|
365
377
|
### Added
|
|
366
378
|
|
|
@@ -371,31 +383,31 @@
|
|
|
371
383
|
|
|
372
384
|
- **`waitForConnected()` during reconnect** — preserve the connect wait promise across signaling rejoin and ignore intentional peer-connection teardown when applying a replacement server offer.
|
|
373
385
|
|
|
374
|
-
## 0.7.5
|
|
386
|
+
## [0.7.5] - 2026-07-13
|
|
375
387
|
|
|
376
388
|
### Changed
|
|
377
389
|
|
|
378
390
|
- **`waitForConnected()` timeout** — error message includes connection phase, peer connection state, and data-channel flags for E2E/Loki triage without extra debug tooling.
|
|
379
391
|
|
|
380
|
-
## 0.7.4
|
|
392
|
+
## [0.7.4] - 2026-07-10
|
|
381
393
|
|
|
382
394
|
### Added
|
|
383
395
|
|
|
384
396
|
- **`getWebRtcDiagnostics()`** on `BrowserVoiceSession` — ICE transport state plus `getStats()` candidate-pair / relay summary for connect failure triage in staging E2E.
|
|
385
397
|
|
|
386
|
-
## 0.7.3
|
|
398
|
+
## [0.7.3] - 2026-07-07
|
|
387
399
|
|
|
388
400
|
### Fixed
|
|
389
401
|
|
|
390
402
|
- **`waitForIceGatheringComplete` on Node** — fall back to `onicegatheringstatechange` when `RTCPeerConnection.addEventListener` is unavailable (`@node-webrtc-rust/sdk`), fixing headless E2E load tests that use `@voicethere/client/node`.
|
|
391
403
|
|
|
392
|
-
## 0.7.2
|
|
404
|
+
## [0.7.2] - 2026-07-07
|
|
393
405
|
|
|
394
406
|
### Fixed
|
|
395
407
|
|
|
396
408
|
- **Browser answer ICE gathering** — wait for local ICE gathering to complete before sending the SDP answer (matches agent offer and `@node-webrtc-rust/signaling` auto-negotiate), reducing first-connect `WEBRTC_CONNECTION_FAILED` when TURN relay candidates are required.
|
|
397
409
|
|
|
398
|
-
## 0.7.1
|
|
410
|
+
## [0.7.1] - 2026-07-07
|
|
399
411
|
|
|
400
412
|
### Added
|
|
401
413
|
|
|
@@ -412,7 +424,7 @@
|
|
|
412
424
|
|
|
413
425
|
- **Initial signaling join** — first connect uses a dedicated join path instead of the same-session reconnect flow, avoiding spurious peer-connection resets and reconnect debug noise.
|
|
414
426
|
|
|
415
|
-
## 0.7.0
|
|
427
|
+
## [0.7.0] - 2026-07-03
|
|
416
428
|
|
|
417
429
|
### Added
|
|
418
430
|
|
|
@@ -426,7 +438,7 @@
|
|
|
426
438
|
|
|
427
439
|
- **`connectBrowserSession` mic request** — `requestMic` is derived from resolved mode (`voice` and `voice+data` request mic; data-only provisioning maps to `chat` without mic).
|
|
428
440
|
|
|
429
|
-
## 0.6.1
|
|
441
|
+
## [0.6.1] - 2026-06-28
|
|
430
442
|
|
|
431
443
|
### Fixed
|
|
432
444
|
|
|
@@ -437,7 +449,7 @@
|
|
|
437
449
|
- **Split binary receive callbacks** — browser voice sessions now support a dedicated `onSyncBinaryMessage` callback for `voicethere-sync`, while `onBinaryMessage` handles `voice-control` binary frames.
|
|
438
450
|
- **Regression coverage** — added tests to lock callback forwarding and channel-specific binary routing.
|
|
439
451
|
|
|
440
|
-
## 0.6.0
|
|
452
|
+
## [0.6.0] - 2026-06-28
|
|
441
453
|
|
|
442
454
|
### Changed
|
|
443
455
|
|
|
@@ -448,13 +460,13 @@
|
|
|
448
460
|
|
|
449
461
|
- **Boundary regression tests** — added tests that fail if browser-facing sources reintroduce `@node-webrtc-rust/sdk` imports.
|
|
450
462
|
|
|
451
|
-
## 0.5.7
|
|
463
|
+
## [0.5.7] - 2026-06-28
|
|
452
464
|
|
|
453
465
|
### Added
|
|
454
466
|
|
|
455
467
|
- **Root connection error handler surface** — session and signaling transport errors now bubble to the process-wide root connection error handler so apps can centralize telemetry/logging without wiring `.on("error")` on every connection.
|
|
456
468
|
|
|
457
|
-
## 0.5.6
|
|
469
|
+
## [0.5.6] - 2026-06-23
|
|
458
470
|
|
|
459
471
|
### Added
|
|
460
472
|
|
|
@@ -464,20 +476,20 @@
|
|
|
464
476
|
|
|
465
477
|
- **Dependencies** — `@node-webrtc-rust/signaling@0.6.2`; peer `@node-webrtc-rust/sdk` `>=0.6.2`.
|
|
466
478
|
|
|
467
|
-
## 0.5.5
|
|
479
|
+
## [0.5.5] - 2026-06-20
|
|
468
480
|
|
|
469
481
|
### Fixed
|
|
470
482
|
|
|
471
483
|
- **`waitForConnected` after transport failure** — clear the internal connect promise when the peer connection enters `failed` or `closed` so same-session auto-reconnect and a subsequent `waitForConnected()` can succeed instead of hanging on a stale rejected promise.
|
|
472
484
|
- **`micPump: "external"` Node connect** — send a short PCM kick on mic attach (before answer handling) so headless load tests emit RTP during ICE like the default silent pump.
|
|
473
485
|
|
|
474
|
-
## 0.5.4
|
|
486
|
+
## [0.5.4] - 2026-06-19
|
|
475
487
|
|
|
476
488
|
### Added
|
|
477
489
|
|
|
478
490
|
- **`micPump`** on `connectBrowserVoiceSession` — `'silent'` (default) or `'external'` so headless load tests can pump scripted PCM via `writeSample` without racing the silent mic loop
|
|
479
491
|
|
|
480
|
-
## 0.5.3
|
|
492
|
+
## [0.5.3] - 2026-06-19
|
|
481
493
|
|
|
482
494
|
### Added
|
|
483
495
|
|
|
@@ -491,7 +503,7 @@
|
|
|
491
503
|
|
|
492
504
|
- Recoverable WebRTC disconnects (`WEBRTC_CONNECTION_FAILED`, `WEBRTC_CONNECTION_CLOSED`) emit `session_error` with `recoverable: true` and trigger same-session retry when policy allows
|
|
493
505
|
|
|
494
|
-
## 0.5.2
|
|
506
|
+
## [0.5.2] - 2026-06-19
|
|
495
507
|
|
|
496
508
|
### Added
|
|
497
509
|
|
|
@@ -499,13 +511,21 @@
|
|
|
499
511
|
- **`onSessionError`** on `startSession` and `connectBrowserSession` — provisioning failures, WebRTC errors, and runner `session_error` DC events
|
|
500
512
|
- **`customerContext`** on voice/browser sessions — forwarded in `session_hello` for agent `errorHook` context
|
|
501
513
|
- Exports from `@voicethere/client/browser`: `SESSION_ERROR_CODES`, `createLocalSessionError`, `emitSessionError`, related types
|
|
514
|
+
- **`sendCloseSignal(reason?)`** on browser voice sessions — asks the server to close the WebRTC leg before the client disconnects
|
|
515
|
+
- **`connectDataSession`** (browser and `@voicethere/client/node`) — DataChannel-only session without a microphone
|
|
516
|
+
|
|
517
|
+
## [0.5.1] - 2026-06-18
|
|
502
518
|
|
|
503
519
|
### Fixed
|
|
504
520
|
|
|
505
|
-
-
|
|
506
|
-
-
|
|
521
|
+
- Node headless voice (`@voicethere/client/node`): the microphone track is now attached with `addTrack` before the remote description is set, so the answer SDP includes `sendrecv`.
|
|
522
|
+
- After the connection is up, the Node mic sends a short kick frame and then silent PCM frames through `writeSample`, so the server receives the audio track and starts the voice agent. The pump stops when the connection leaves `connected`.
|
|
523
|
+
|
|
524
|
+
### Changed
|
|
525
|
+
|
|
526
|
+
- Browser test harness README: documents the CORS requirements for calling the session API from the browser.
|
|
507
527
|
|
|
508
|
-
## 0.5.0
|
|
528
|
+
## [0.5.0] - 2026-06-17
|
|
509
529
|
|
|
510
530
|
### Added
|
|
511
531
|
|
|
@@ -513,7 +533,7 @@
|
|
|
513
533
|
- Injectable `WebRtcRuntime` on `connectBrowserVoiceSession` for Node test harnesses
|
|
514
534
|
- `waitForConnected`, `onControlMessage` on browser voice sessions
|
|
515
535
|
|
|
516
|
-
## 0.4.0
|
|
536
|
+
## [0.4.0] - 2026-06-16
|
|
517
537
|
|
|
518
538
|
### Added
|
|
519
539
|
|
|
@@ -521,7 +541,7 @@
|
|
|
521
541
|
- `onBinaryMessage` callback for inbound binary frames.
|
|
522
542
|
- Export `VOICE_SYNC_CHANNEL_LABEL` (matches helpers / agent sync channel).
|
|
523
543
|
|
|
524
|
-
## 0.3.0
|
|
544
|
+
## [0.3.0] - 2026-06-15
|
|
525
545
|
|
|
526
546
|
### Added
|
|
527
547
|
|
|
@@ -530,6 +550,6 @@
|
|
|
530
550
|
- `templates/` — React hook, embed HTML, debug page starters
|
|
531
551
|
- CI workflow and release tag publish (mirror `@voicethere/cli`)
|
|
532
552
|
|
|
533
|
-
## 0.1.0
|
|
553
|
+
## [0.1.0]
|
|
534
554
|
|
|
535
555
|
- Initial `connectVoiceSession` cloud/local signaling helper
|
package/README.md
CHANGED
|
@@ -217,6 +217,31 @@ await connectBrowserSession({
|
|
|
217
217
|
|
|
218
218
|
Agents send these events with `@voicethere/agent` 0.11+ on current runners. Older agents send none, so the callbacks simply never fire. `onControlMessage` still receives the raw payloads.
|
|
219
219
|
|
|
220
|
+
## Links from the agent
|
|
221
|
+
|
|
222
|
+
Agents built on `@voicethere/agent` 0.22+ take links out of what they speak and send each one as an `assistant_content` message. Pass `onAgentContent` to show them, for example as a clickable link under the reply:
|
|
223
|
+
|
|
224
|
+
```typescript
|
|
225
|
+
await connectBrowserSession({
|
|
226
|
+
mode: "voice",
|
|
227
|
+
credentials: provision.credentials,
|
|
228
|
+
onAgentContent: ({ turnId, spoken, content }) => {
|
|
229
|
+
if (content.kind !== "link") return;
|
|
230
|
+
const a = document.createElement("a");
|
|
231
|
+
a.href = content.url;
|
|
232
|
+
a.target = "_blank";
|
|
233
|
+
a.rel = "noopener noreferrer";
|
|
234
|
+
a.textContent = content.label ?? content.url;
|
|
235
|
+
appendToTurn(turnId, a);
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
- Only `https:` links are reported. Other schemes, malformed URLs and content kinds this client does not know are skipped, and `onControlMessage` still receives the raw message.
|
|
241
|
+
- `spoken` is `true` when the link belongs to a voice reply. A voice turn that held only a link may have no spoken text at all.
|
|
242
|
+
- `parseAgentContentEvent(payload)` applies the same checks to a raw control message.
|
|
243
|
+
- The embed widget renders each link as its own line in the transcript and opens it in a new tab.
|
|
244
|
+
|
|
220
245
|
## Spoken text reveal
|
|
221
246
|
|
|
222
247
|
When the agent speaks, its text arrives as `assistant_delta` (one per sentence, `spoken: true`) and `assistant_done` messages, sent before the audio is heard. Pass `onAgentText` and the session reveals that text word by word while the agent talks, instead of showing every sentence the moment it is sent.
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import type { AgentInterruptedEvent, AgentStateEvent } from "./types.js";
|
|
1
|
+
import type { AgentContentEvent, AgentInterruptedEvent, AgentStateEvent } from "./types.js";
|
|
2
2
|
/** Parse a voice-control `agent_state` payload; returns null for anything else. */
|
|
3
3
|
export declare function parseAgentStateEvent(payload: Record<string, unknown>): AgentStateEvent | null;
|
|
4
4
|
/** Parse a voice-control `agent_interrupted` payload; returns null for anything else. */
|
|
5
5
|
export declare function parseAgentInterruptedEvent(payload: Record<string, unknown>): AgentInterruptedEvent | null;
|
|
6
|
+
/**
|
|
7
|
+
* Parse an `assistant_content` payload; returns null for anything else.
|
|
8
|
+
* Unknown `content.kind` values and links that are not https are ignored, so
|
|
9
|
+
* newer agents can add kinds without breaking older clients.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseAgentContentEvent(payload: Record<string, unknown>): AgentContentEvent | null;
|
|
6
12
|
//# sourceMappingURL=agent-control-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-control-events.d.ts","sourceRoot":"","sources":["../src/agent-control-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"agent-control-events.d.ts","sourceRoot":"","sources":["../src/agent-control-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EAChB,MAAM,YAAY,CAAC;AAYpB,mFAAmF;AACnF,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,eAAe,GAAG,IAAI,CASxB;AAED,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,qBAAqB,GAAG,IAAI,CAc9B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,iBAAiB,GAAG,IAAI,CA+B1B"}
|
|
@@ -5,6 +5,8 @@ const AGENT_STATES = new Set([
|
|
|
5
5
|
"speaking",
|
|
6
6
|
]);
|
|
7
7
|
const MAX_DETAIL_LENGTH = 64;
|
|
8
|
+
const MAX_URL_LENGTH = 2048;
|
|
9
|
+
const MAX_LABEL_LENGTH = 200;
|
|
8
10
|
/** Parse a voice-control `agent_state` payload; returns null for anything else. */
|
|
9
11
|
export function parseAgentStateEvent(payload) {
|
|
10
12
|
if (payload.type !== "agent_state")
|
|
@@ -35,4 +37,44 @@ export function parseAgentInterruptedEvent(payload) {
|
|
|
35
37
|
}
|
|
36
38
|
return event;
|
|
37
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Parse an `assistant_content` payload; returns null for anything else.
|
|
42
|
+
* Unknown `content.kind` values and links that are not https are ignored, so
|
|
43
|
+
* newer agents can add kinds without breaking older clients.
|
|
44
|
+
*/
|
|
45
|
+
export function parseAgentContentEvent(payload) {
|
|
46
|
+
if (payload.type !== "assistant_content")
|
|
47
|
+
return null;
|
|
48
|
+
if (typeof payload.turnId !== "string" || payload.turnId.length === 0) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const content = payload.content;
|
|
52
|
+
if (!content || typeof content !== "object" || content.kind !== "link") {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const url = content.url;
|
|
56
|
+
if (typeof url !== "string" || url.length > MAX_URL_LENGTH)
|
|
57
|
+
return null;
|
|
58
|
+
let parsed;
|
|
59
|
+
try {
|
|
60
|
+
parsed = new URL(url);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
if (parsed.protocol !== "https:")
|
|
66
|
+
return null;
|
|
67
|
+
const label = typeof content.label === "string"
|
|
68
|
+
? content.label.trim().slice(0, MAX_LABEL_LENGTH)
|
|
69
|
+
: "";
|
|
70
|
+
const event = {
|
|
71
|
+
turnId: payload.turnId,
|
|
72
|
+
spoken: payload.spoken === true,
|
|
73
|
+
content: { kind: "link", url, ...(label ? { label } : {}) },
|
|
74
|
+
};
|
|
75
|
+
if (typeof payload.inReplyTo === "string" && payload.inReplyTo.length > 0) {
|
|
76
|
+
event.inReplyTo = payload.inReplyTo;
|
|
77
|
+
}
|
|
78
|
+
return event;
|
|
79
|
+
}
|
|
38
80
|
//# sourceMappingURL=agent-control-events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-control-events.js","sourceRoot":"","sources":["../src/agent-control-events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"agent-control-events.js","sourceRoot":"","sources":["../src/agent-control-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ export type ConnectBrowserSessionOptions = {
|
|
|
18
18
|
/** The only callback that reports agent text (see {@link BrowserVoiceSessionOptions.onAgentText}). */
|
|
19
19
|
onAgentText?: BrowserVoiceSessionOptions["onAgentText"];
|
|
20
20
|
onAgentInterrupted?: BrowserVoiceSessionOptions["onAgentInterrupted"];
|
|
21
|
+
onAgentContent?: BrowserVoiceSessionOptions["onAgentContent"];
|
|
21
22
|
onBinaryMessage?: BrowserVoiceSessionOptions["onBinaryMessage"];
|
|
22
23
|
onSyncBinaryMessage?: BrowserVoiceSessionOptions["onSyncBinaryMessage"];
|
|
23
24
|
onAgentAudioTrack?: BrowserVoiceSessionOptions["onAgentAudioTrack"];
|
|
@@ -44,8 +45,8 @@ export declare function connectDataSession(options: Omit<BrowserVoiceSessionOpti
|
|
|
44
45
|
export type { ReconnectPolicy, VoiceSessionReconnectInfo, } from "./browser-voice-session.js";
|
|
45
46
|
export { connectBrowserChatSession, VOICETHERE_CHAT_CHANNEL_LABEL, } from "./browser-chat-session.js";
|
|
46
47
|
export { CLIENT_HANGUP_MESSAGE_TYPE, connectBrowserVoiceSession, VOICE_SYNC_CHANNEL_LABEL, VOICE_CONTROL_CHANNEL_LABEL, type BinaryMessageHandler, type SyncBinaryMessageHandler, type DataChannelKind, type BrowserVoiceSession, type BrowserVoiceSessionOptions, } from "./browser-voice-session.js";
|
|
47
|
-
export { parseAgentInterruptedEvent, parseAgentStateEvent, } from "../agent-control-events.js";
|
|
48
|
-
export type { AgentInterruptedEvent, AgentStateEvent, AgentStateName, } from "../types.js";
|
|
48
|
+
export { parseAgentContentEvent, parseAgentInterruptedEvent, parseAgentStateEvent, } from "../agent-control-events.js";
|
|
49
|
+
export type { AgentContent, AgentContentEvent, AgentInterruptedEvent, AgentStateEvent, AgentStateName, } from "../types.js";
|
|
49
50
|
export { CustomerContextTooLargeError, MAX_CUSTOMER_CONTEXT_BYTES, startSession, } from "./session-provision.js";
|
|
50
51
|
export { DEFAULT_SESSION_API_RETRY_DELAYS_MS, fetchSessionApi, isRetryableSessionApiBody, isRetryableSessionApiFailure, isRetryableSessionApiNetworkError, isRetryableSessionApiStatus, type FetchSessionApiOptions, type SessionApiRetryRuntime, } from "./session-api-retry.js";
|
|
51
52
|
export { createLocalSessionError, emitSessionError, isSessionErrorEvent, LOCAL_SESSION_ERROR_CODES, REMOTE_SESSION_ERROR_CODES, SESSION_ERROR_CODES, type SessionErrorCode, type SessionErrorEvent, type SessionErrorHandler, } from "../session-errors.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,0BAA0B,EAChC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,sBAAsB,EAEvB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,4BAA4B,GAAG;IACzC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IAC1B,WAAW,EAAE,kBAAkB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,OAAO,sBAAsB,EAAE,mBAAmB,CAAC;IACpE,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,YAAY,CAAC,EAAE,0BAA0B,CAAC,cAAc,CAAC,CAAC;IAC1D,mGAAmG;IACnG,gBAAgB,CAAC,EAAE,0BAA0B,CAAC,kBAAkB,CAAC,CAAC;IAClE,sGAAsG;IACtG,WAAW,CAAC,EAAE,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACxD,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,oBAAoB,CAAC,CAAC;IACtE,eAAe,CAAC,EAAE,0BAA0B,CAAC,iBAAiB,CAAC,CAAC;IAChE,mBAAmB,CAAC,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;IACxE,iBAAiB,CAAC,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;IACpE,eAAe,CAAC,EAAE,OAAO,4BAA4B,EAAE,eAAe,CAAC;IACvE,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,OAAO,4BAA4B,EAAE,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACjG,cAAc,CAAC,EAAE,OAAO,4BAA4B,EAAE,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;IACnG,aAAa,CAAC,EAAE,OAAO,4BAA4B,EAAE,0BAA0B,CAAC,eAAe,CAAC,CAAC;IACjG,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAC9D,kBAAkB,CAAC,EAAE,0BAA0B,CAAC,oBAAoB,CAAC,CAAC;IACtE,iBAAiB,CAAC,EAAE,0BAA0B,CAAC,mBAAmB,CAAC,CAAC;IACpE,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mFAAmF;IACnF,eAAe,CAAC,EAAE,0BAA0B,CAAC,iBAAiB,CAAC,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,IAAI,EAAE,kBAAkB,CAAC;CAC1B,CAAC;AAEF,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"browser-session.d.ts","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,7 @@ export async function connectBrowserSession(options) {
|
|
|
34
34
|
spokenTextReveal: options.spokenTextReveal,
|
|
35
35
|
onAgentText: options.onAgentText,
|
|
36
36
|
onAgentInterrupted: options.onAgentInterrupted,
|
|
37
|
+
onAgentContent: options.onAgentContent,
|
|
37
38
|
onBinaryMessage: options.onBinaryMessage,
|
|
38
39
|
onSyncBinaryMessage: options.onSyncBinaryMessage,
|
|
39
40
|
onAgentAudioTrack: options.onAgentAudioTrack,
|
|
@@ -57,7 +58,7 @@ export async function connectDataSession(options) {
|
|
|
57
58
|
}
|
|
58
59
|
export { connectBrowserChatSession, VOICETHERE_CHAT_CHANNEL_LABEL, } from "./browser-chat-session.js";
|
|
59
60
|
export { CLIENT_HANGUP_MESSAGE_TYPE, connectBrowserVoiceSession, VOICE_SYNC_CHANNEL_LABEL, VOICE_CONTROL_CHANNEL_LABEL, } from "./browser-voice-session.js";
|
|
60
|
-
export { parseAgentInterruptedEvent, parseAgentStateEvent, } from "../agent-control-events.js";
|
|
61
|
+
export { parseAgentContentEvent, parseAgentInterruptedEvent, parseAgentStateEvent, } from "../agent-control-events.js";
|
|
61
62
|
export { CustomerContextTooLargeError, MAX_CUSTOMER_CONTEXT_BYTES, startSession, } from "./session-provision.js";
|
|
62
63
|
export { DEFAULT_SESSION_API_RETRY_DELAYS_MS, fetchSessionApi, isRetryableSessionApiBody, isRetryableSessionApiFailure, isRetryableSessionApiNetworkError, isRetryableSessionApiStatus, } from "./session-api-retry.js";
|
|
63
64
|
export { createLocalSessionError, emitSessionError, isSessionErrorEvent, LOCAL_SESSION_ERROR_CODES, REMOTE_SESSION_ERROR_CODES, SESSION_ERROR_CODES, } from "../session-errors.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,0BAA0B,GAG3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,GAE1B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"browser-session.js","sourceRoot":"","sources":["../../src/browser/browser-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { type AgentTextUpdate, type SpokenTextRevealMode } from "../spoken-text-
|
|
|
2
2
|
import { type SessionErrorHandler } from "../session-errors.js";
|
|
3
3
|
import type { SessionCredentials } from "./session-provision.js";
|
|
4
4
|
import type { DebugConsole } from "./debug-console.js";
|
|
5
|
-
import type { AgentInterruptedEvent, AgentStateEvent } from "../types.js";
|
|
5
|
+
import type { AgentContentEvent, AgentInterruptedEvent, AgentStateEvent } from "../types.js";
|
|
6
6
|
import { type WebRtcConnectionStatus, type WebRtcReadinessProfile } from "./webrtc-connection-status.js";
|
|
7
7
|
import { type WebRtcDiagnostics } from "./webrtc-diagnostics.js";
|
|
8
8
|
import { type WebRtcRuntime } from "./webrtc-runtime.js";
|
|
@@ -116,6 +116,11 @@ export type BrowserVoiceSessionOptions = {
|
|
|
116
116
|
onAgentState?: (event: AgentStateEvent) => void;
|
|
117
117
|
/** Fired when the caller cut the agent off (`agent_interrupted` on voice-control). Older agents send none. */
|
|
118
118
|
onAgentInterrupted?: (event: AgentInterruptedEvent) => void;
|
|
119
|
+
/**
|
|
120
|
+
* Fired once per `assistant_content` message: structured content (today a https link) that belongs
|
|
121
|
+
* to the reply with the same `turnId`. The URL is not part of the reply text. Older agents send none.
|
|
122
|
+
*/
|
|
123
|
+
onAgentContent?: (event: AgentContentEvent) => void;
|
|
119
124
|
/** Fired for binary frames on voice-control. */
|
|
120
125
|
onBinaryMessage?: BinaryMessageHandler;
|
|
121
126
|
/** Fired for binary frames on voicethere-sync. */
|