From 91efc9f017e8a31c30e1ddfdb1b9cb5961bf6b33 Mon Sep 17 00:00:00 2001 From: ReutAtias3 <141619499+ReutAtias3@users.noreply.github.com> Date: Tue, 13 Jan 2026 10:08:58 +0200 Subject: [PATCH 1/3] Implement track subscription timeout in LiveKit streaming manager (#269) --- .../streaming-manager/livekit-manager.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/services/streaming-manager/livekit-manager.ts b/src/services/streaming-manager/livekit-manager.ts index ed329f86..827d16e3 100644 --- a/src/services/streaming-manager/livekit-manager.ts +++ b/src/services/streaming-manager/livekit-manager.ts @@ -100,6 +100,9 @@ export async function createLiveKitStreamingManager | null = null; + const TRACK_SUBSCRIPTION_TIMEOUT_MS = 20000; + const streamApi = createStreamApiV2(auth, baseURL || didApiUrl, agentId, callbacks.onError); let sessionId: string | undefined; @@ -147,6 +150,17 @@ export async function createLiveKitStreamingManager { + log('Track subscription timeout - no track subscribed within 30 seconds after connect'); + trackSubscriptionTimeoutId = null; + analytics.track('connectivity-error', { + error: 'Track subscription timeout', + sessionId, + }); + callbacks.onError?.(new Error('Track subscription timeout'), { sessionId }); + disconnect(); + }, TRACK_SUBSCRIPTION_TIMEOUT_MS); + isInitialConnection = false; } catch (error) { handleInitError(error, log, callbacks, () => { @@ -224,6 +238,12 @@ export async function createLiveKitStreamingManager Date: Thu, 15 Jan 2026 09:56:02 +0200 Subject: [PATCH 2/3] Mark last assistant message as interrupted on new user input in message queue (#270) --- src/services/socket-manager/message-queue.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/services/socket-manager/message-queue.ts b/src/services/socket-manager/message-queue.ts index e73e3ec0..8d21bab5 100644 --- a/src/services/socket-manager/message-queue.ts +++ b/src/services/socket-manager/message-queue.ts @@ -33,6 +33,12 @@ function handleAudioTranscribedMessage( return; } + // Mark the last assistant message as interrupted when new user input arrives via server-side STT + const lastMessage = items.messages[items.messages.length - 1]; + if (lastMessage?.role === 'assistant' && !lastMessage.interrupted) { + lastMessage.interrupted = true; + } + const userMessage: Message = { id: data.id || `user-${Date.now()}`, role: data.role, From 4212d66c37b3379c6b9163461a8dd571b3a04e49 Mon Sep 17 00:00:00 2001 From: ReutAtias Date: Sun, 18 Jan 2026 09:44:38 +0200 Subject: [PATCH 3/3] bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e7503e3..0ade55aa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@d-id/client-sdk", "private": false, - "version": "1.1.24", + "version": "1.1.26", "type": "module", "description": "d-id client sdk", "repository": {