@d-id/client-sdk 3.0.0-staging.420 → 3.0.0-staging.423

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.
@@ -1,4 +1,4 @@
1
- import { c as Ye, C as Q, S as f, a as en, b as nn, A as S, d as tn, l as ve, e as on, t as rn, f as E, g as U, h as an, I as Te, i as cn, j as w, T as ne, n as sn } from "./index-BrPt8AuN.js";
1
+ import { c as Ye, C as Q, S as f, a as en, b as nn, A as S, d as tn, l as ve, e as on, t as rn, f as E, g as U, h as an, I as Te, i as cn, j as w, T as ne, n as sn } from "./index-WHsoBMGg.js";
2
2
  function un() {
3
3
  try {
4
4
  return Intl.DateTimeFormat().resolvedOptions().timeZone ?? "";
@@ -555,4 +555,4 @@ export {
555
555
  An as createLiveKitStreamingManager,
556
556
  yn as preloadLiveKit
557
557
  };
558
- //# sourceMappingURL=livekit-manager-me8pKdKj.js.map
558
+ //# sourceMappingURL=livekit-manager-BCxu61o7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"livekit-manager-me8pKdKj.js","sources":["../src/utils/user-context.ts","../src/api/streams/streamsApiV2.ts","../src/services/streaming-manager/data-channel-handlers.ts","../src/services/streaming-manager/livekit-manager.ts"],"sourcesContent":["/**\n * Best-effort user context (location + device) resolved entirely on the client\n * and attached to the LiveKit participant as attributes on connect. The agent\n * backend reads these to enrich the LLM context (see `get_user_context`).\n *\n * `location` is the IANA timezone (e.g. `America/New_York`) — a coarse but\n * network-free location proxy. `device` is a short human-readable descriptor.\n */\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? '';\n } catch {\n return '';\n }\n}\n\nfunction getDevice(): string {\n if (typeof navigator === 'undefined') {\n return '';\n }\n\n const userAgent = navigator.userAgent ?? '';\n const platform = (navigator.platform ?? '').toLowerCase();\n\n let os = 'Unknown';\n if (/android/i.test(userAgent)) {\n os = 'Android';\n } else if (/iphone|ipad|ipod/i.test(userAgent)) {\n os = 'iOS';\n } else if (platform.includes('win')) {\n os = 'Windows';\n } else if (platform.includes('mac')) {\n os = 'Mac OS X';\n } else if (platform.includes('linux')) {\n os = 'Linux';\n }\n\n const isMobile = os === 'Android' || os === 'iOS' || /Mobi/i.test(userAgent);\n\n return `${os}, ${isMobile ? 'Mobile' : 'Desktop'}`;\n}\n\n/**\n * Non-empty `{ timezone, device }` attributes to attach to the participant.\n * Keys with no resolvable value are omitted. The backend infers the user's\n * country from the timezone (a timezone identifies a country reliably, but its\n * reference city is not the user's actual city).\n */\nexport function getUserContextAttributes(): Record<string, string> {\n const attributes: Record<string, string> = {};\n\n const timezone = getTimezone();\n if (timezone) {\n attributes.timezone = timezone;\n }\n\n const device = getDevice();\n if (device) {\n attributes.device = device;\n }\n\n return attributes;\n}\n","import { Auth, CreateSessionV2Options, CreateSessionV2Response, ErrorReporter } from '@sdk/types';\nimport { createClient } from '../apiClient';\n\nexport function createStreamApiV2(auth: Auth, host: string, agentId: string, onError?: ErrorReporter) {\n const client = createClient(auth, `${host}/v2/agents/${agentId}`, onError);\n\n return {\n async createStream(options: CreateSessionV2Options) {\n return client.post<CreateSessionV2Response>('/sessions', options);\n },\n };\n}\n","import { ChatProgress } from '@sdk/types/entities/agents/manager';\nimport { StreamEvents } from '@sdk/types/stream';\n\nexport const chatEventMap: Record<string, ChatProgress> = {\n [StreamEvents.ChatAnswer]: ChatProgress.Answer,\n [StreamEvents.ChatPartial]: ChatProgress.Partial,\n};\n","import { StreamError } from '@sdk/errors';\nimport {\n AgentActivityState,\n ConnectionState,\n ConnectivityState,\n CreateSessionV2Options,\n CreateStreamOptions,\n InterruptOptions,\n Message,\n PayloadType,\n RunningToolCall,\n StreamEndReason,\n StreamEvents,\n StreamingManagerOptions,\n StreamingState,\n StreamType,\n ToolCallDonePayload,\n ToolCallDoneWirePayload,\n ToolCallErrorPayload,\n ToolCallErrorWirePayload,\n ToolCallEvent,\n ToolCallStartedPayload,\n ToolCallStartedWirePayload,\n ToolCallWireError,\n TurnEventPayload,\n} from '@sdk/types';\nimport { ChatProgress } from '@sdk/types/entities/agents/manager';\nimport { InternalDataChannelTopic } from '@sdk/types/stream/data-channel';\nimport { noop } from '@sdk/utils';\nimport { getUserContextAttributes } from '@sdk/utils/user-context';\nimport { createStreamApiV2 } from '../../api/streams/streamsApiV2';\nimport { didApiUrl } from '../../config/environment';\nimport { toErrorAnalytics } from '../../utils/error-analytics';\nimport { latencyTimestampTracker } from '../analytics/timestamp-tracker';\nimport { createStreamingLogger, StreamingManager } from './common';\nimport { chatEventMap } from './data-channel-handlers';\n\nimport type {\n ConnectionQuality,\n ConnectionState as LiveKitConnectionState,\n LocalTrackPublication,\n Participant,\n RemoteParticipant,\n RemoteTrack,\n Room,\n RoomEvent,\n RpcError,\n SubscriptionError,\n Track,\n TranscriptionSegment,\n} from 'livekit-client';\nimport { createAudioStatsDetector, createVideoStatsMonitor } from './stats/poll';\nimport { VideoRTCStatsReport } from './stats/report';\n\nconst TRACK_SUBSCRIPTION_TIMEOUT_MS = 20000;\n\nconst NO_RUNNING_TOOL_CALLS: readonly RunningToolCall[] = [];\n\ninterface TrackPublishState {\n isPublishing: boolean;\n publication: LocalTrackPublication | null;\n}\n\ninterface PendingToolCall {\n call: RunningToolCall;\n interruptible: boolean;\n turnId: number | null;\n}\n\ninterface LiveKitModule {\n Room: typeof Room;\n RoomEvent: typeof RoomEvent;\n ConnectionState: typeof LiveKitConnectionState;\n RemoteParticipant: typeof RemoteParticipant;\n RemoteTrack: typeof RemoteTrack;\n RpcError: typeof RpcError;\n Track: typeof Track;\n}\n\n// One download for the life of the page. A rejected import is not kept, so the next call retries.\nlet livekitModule: Promise<LiveKitModule> | undefined;\n\nfunction importLiveKit(): Promise<LiveKitModule> {\n livekitModule ??= import('livekit-client').catch(() => {\n livekitModule = undefined;\n\n throw new Error(\n 'LiveKit client is required for this streaming manager. Please install it using: npm install livekit-client'\n );\n });\n\n return livekitModule;\n}\n\n/**\n * Starts the `livekit-client` download without waiting for it, so an Expressive (V4)\n * `connect()` finds the module loaded instead of downloading it before it can ask for a session.\n * A failure here is ignored: `connect()` imports again and reports it.\n *\n * @internal Implementation detail; not part of the public SDK surface.\n */\nexport function preloadLiveKit(): void {\n void importLiveKit().catch(() => {});\n}\n\nconst connectivityQualityToState = {\n excellent: ConnectivityState.Strong,\n good: ConnectivityState.Strong,\n poor: ConnectivityState.Weak,\n lost: ConnectivityState.Unknown,\n unknown: ConnectivityState.Unknown,\n};\n\nconst streamError = (message = 'Stream Error') => new StreamError(message);\n\nconst dataChannelDecoder = new TextDecoder();\n\ntype VideoMessageData = Pick<Message, 'role' | 'sentiment'>;\n\n/**\n * The server sends tool-call events with snake_case fields; the public payloads are camelCase.\n * This is the single place the two shapes meet.\n */\nfunction toStartedPayload(wire: ToolCallStartedWirePayload): ToolCallStartedPayload {\n return {\n callId: wire.call_id,\n name: wire.name,\n input: wire.input,\n ...(wire.output !== undefined ? { output: wire.output } : {}),\n // The server omits `interruptible` on some started events, and `executionMode` is\n // normalized exactly as `RunningToolCall.executionMode` is, so the two agree about the call.\n interruptible: wire.interruptible === true,\n executionMode: wire.execution_mode === 'async' ? 'async' : 'blocking',\n ...(wire.turn_id !== undefined ? { turnId: wire.turn_id } : {}),\n timestamp: wire.timestamp,\n };\n}\n\nfunction toFinishedPayload(wire: ToolCallDoneWirePayload): ToolCallDonePayload {\n return {\n callId: wire.call_id,\n name: wire.name,\n input: wire.input,\n output: wire.output,\n durationMs: wire.duration_ms,\n extra: wire.extra,\n timestamp: wire.timestamp,\n };\n}\n\n// The server describes the failure under `extra.error` (`{ kind, code, message, data }`), and\n// answers some failures with the reason as a plain-string `output` instead.\nfunction toErrorText(wire: ToolCallErrorWirePayload): string | undefined {\n const error = (wire.extra as { error?: ToolCallWireError } | undefined)?.error;\n\n if (typeof error?.message === 'string' && error.message) {\n return error.message;\n }\n\n return typeof wire.output === 'string' && wire.output ? wire.output : undefined;\n}\n\nfunction toErrorPayload(wire: ToolCallErrorWirePayload): ToolCallErrorPayload {\n const error = toErrorText(wire);\n\n return {\n ...toFinishedPayload(wire as ToolCallDoneWirePayload),\n output: wire.output,\n ...(error !== undefined ? { error } : {}),\n };\n}\n\n/**\n * LiveKit forwards only a thrown `RpcError` to the agent — anything else becomes a fixed\n * `APPLICATION_ERROR` message — so wrap the handler's reason. Takes the class from the lazily\n * imported module, so a Talks/Clips bundle never pulls in `livekit-client`. `RpcError` truncates\n * the message at 256 bytes.\n */\nfunction wrapRpcHandler(RpcErrorClass: typeof RpcError, handler: (data: any) => Promise<string>) {\n return async (data: any): Promise<string> => {\n try {\n return await handler(data);\n } catch (error) {\n // A handler that threw an RpcError chose its own code and data — pass it through.\n if (error instanceof RpcErrorClass) {\n throw error;\n }\n\n throw new RpcErrorClass(\n RpcErrorClass.ErrorCode.APPLICATION_ERROR,\n (error as Error)?.message || 'Client tool failed'\n );\n }\n };\n}\n\nfunction handleInitError(\n error: unknown,\n log: (message?: any, ...optionalParams: any[]) => void,\n callbacks: StreamingManagerOptions['callbacks']\n): void {\n log('Failed to connect to LiveKit room:', error);\n callbacks.onConnectionStateChange?.(ConnectionState.Fail, 'internal:init-error');\n // No session yet, so no id to report.\n callbacks.onError?.(error as Error, {});\n throw error;\n}\n\nexport async function createLiveKitStreamingManager<T extends CreateSessionV2Options>(\n agentId: string,\n sessionOptions: CreateSessionV2Options,\n options: StreamingManagerOptions\n): Promise<StreamingManager<T> & { reconnect(): Promise<void> }> {\n const log = createStreamingLogger(options.debug || false, 'LiveKitStreamingManager');\n\n const { Room, RoomEvent, ConnectionState: LiveKitConnectionState, RpcError, Track } = await importLiveKit();\n\n const { callbacks, auth, baseURL, analytics } = options;\n let room: Room | null = null;\n let isConnected = false;\n const streamType = StreamType.Fluent;\n let sharedMediaStream: MediaStream | null = null;\n const microphoneState: TrackPublishState = { isPublishing: false, publication: null };\n const cameraState: TrackPublishState = { isPublishing: false, publication: null };\n let videoStatsMonitor: ReturnType<typeof createVideoStatsMonitor> | null = null;\n let audioStatsDetector: ReturnType<typeof createAudioStatsDetector> | null = null;\n let videoStreamingState: StreamingState | null = null;\n // We defer Connected until video track is subscribed to align with WebRTC behavior\n let hasEmittedConnected = false;\n\n room = new Room({\n adaptiveStream: false, // Must be false to use mediaStreamTrack directly\n dynacast: true,\n });\n\n for (const [method, handler] of options.rpcMethods ?? []) {\n room.registerRpcMethod(method, wrapRpcHandler(RpcError, handler));\n }\n\n let trackSubscriptionTimeoutId: ReturnType<typeof setTimeout> | null = null;\n let currentActivityState: AgentActivityState = AgentActivityState.Idle;\n let currentInterruptible = true;\n const pendingToolCalls = new Map<string, PendingToolCall>();\n let currentTurnId: number | null = null;\n let streamEndReason: StreamEndReason | null = null;\n\n const streamApi = createStreamApiV2(auth, baseURL || didApiUrl, agentId, callbacks.onError);\n let sessionId: string | undefined;\n\n let token: string | undefined;\n let url: string | undefined;\n let interruptEnabled = true;\n\n try {\n const streamResponse = await streamApi.createStream({\n transport: sessionOptions.transport,\n chat_persist: sessionOptions.chat_persist ?? false,\n verbose: options.verbose ?? false,\n });\n\n const { id, session_token, session_url, interrupt_enabled } = streamResponse;\n callbacks.onStreamCreated?.({ sessionId: id, streamId: id, agentId });\n sessionId = id;\n token = session_token;\n url = session_url;\n interruptEnabled = interrupt_enabled ?? true;\n\n await room.prepareConnection(url, token);\n } catch (error) {\n handleInitError(error, log, callbacks);\n }\n\n if (!url || !token || !sessionId) {\n return Promise.reject(new Error('Failed to initialize LiveKit stream'));\n }\n\n const reportError = (error: Error) => callbacks.onError?.(error, { sessionId });\n\n room.on(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged)\n .on(RoomEvent.ConnectionQualityChanged, handleConnectionQualityChanged)\n .on(RoomEvent.ParticipantConnected, handleParticipantConnected)\n .on(RoomEvent.ParticipantDisconnected, handleParticipantDisconnected)\n .on(RoomEvent.TrackSubscribed, handleTrackSubscribed)\n .on(RoomEvent.TrackUnsubscribed, handleTrackUnsubscribed)\n .on(RoomEvent.DataReceived, handleDataReceived)\n .on(RoomEvent.MediaDevicesError, handleMediaDevicesError)\n .on(RoomEvent.TranscriptionReceived, handleTranscriptionReceived)\n .on(RoomEvent.EncryptionError, handleEncryptionError)\n .on(RoomEvent.TrackSubscriptionFailed, handleTrackSubscriptionFailed);\n\n function handleTranscriptionReceived(_segments: TranscriptionSegment[], participant?: Participant): void {\n if (participant?.isLocal) {\n latencyTimestampTracker.update();\n }\n }\n async function setUserContextAttributes(): Promise<void> {\n const attributes = getUserContextAttributes();\n if (!room || Object.keys(attributes).length === 0) {\n return;\n }\n try {\n await room.localParticipant.setAttributes(attributes);\n } catch (error) {\n log('Failed to set user context attributes', error);\n }\n }\n\n try {\n await room.connect(url, token);\n log('LiveKit room joined successfully');\n\n void setUserContextAttributes();\n\n trackSubscriptionTimeoutId = setTimeout(() => {\n log(\n `Track subscription timeout - no track subscribed within ${TRACK_SUBSCRIPTION_TIMEOUT_MS / 1000} seconds after connect`\n );\n trackSubscriptionTimeoutId = null;\n const error = streamError('Track subscription timeout');\n analytics.track('connectivity-error', {\n error: toErrorAnalytics(error),\n sessionId,\n });\n reportError(error);\n disconnect('internal:track-subscription-timeout');\n }, TRACK_SUBSCRIPTION_TIMEOUT_MS);\n } catch (error) {\n handleInitError(error, log, callbacks);\n }\n\n analytics.enrich({\n 'stream-type': streamType,\n });\n\n function handleConnectionStateChanged(state: LiveKitConnectionState): void {\n log('Connection state changed:', state);\n switch (state) {\n case LiveKitConnectionState.Connecting:\n log('CALLBACK: onConnectionStateChange(Connecting)');\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'livekit:connecting');\n break;\n case LiveKitConnectionState.Connected:\n log('LiveKit room connected successfully');\n isConnected = true;\n break;\n case LiveKitConnectionState.Disconnected:\n log('LiveKit room disconnected');\n isConnected = false;\n hasEmittedConnected = false;\n microphoneState.publication = null;\n cameraState.publication = null;\n callbacks.onConnectionStateChange?.(\n ConnectionState.Disconnected,\n streamEndReason ?? 'livekit:disconnected'\n );\n break;\n case LiveKitConnectionState.Reconnecting:\n log('LiveKit room reconnecting...');\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'livekit:reconnecting');\n break;\n case LiveKitConnectionState.SignalReconnecting:\n log('LiveKit room signal reconnecting...');\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'livekit:signal-reconnecting');\n break;\n }\n }\n\n function handleConnectionQualityChanged(quality: ConnectionQuality, participant?: Participant): void {\n log('Connection quality:', quality);\n if (participant?.isLocal) {\n callbacks.onConnectivityStateChange?.(connectivityQualityToState[quality]);\n }\n }\n\n function handleParticipantConnected(participant: RemoteParticipant): void {\n log('Participant connected:', participant.identity);\n }\n\n function handleParticipantDisconnected(participant: RemoteParticipant): void {\n log('Participant disconnected:', participant.identity);\n\n // Agent left the room - treat as disconnect\n disconnect('livekit:participant-disconnected');\n }\n\n function handleVideoStarted() {\n if (videoStreamingState === StreamingState.Start) {\n return;\n }\n\n log('CALLBACK: onVideoStateChange(Start)');\n videoStreamingState = StreamingState.Start;\n callbacks.onVideoStateChange?.(StreamingState.Start);\n }\n\n function handleVideoStopped(report?: VideoRTCStatsReport) {\n if (videoStreamingState === StreamingState.Stop) {\n return;\n }\n\n log('CALLBACK: onVideoStateChange(Stop)');\n videoStreamingState = StreamingState.Stop;\n callbacks.onVideoStateChange?.(StreamingState.Stop, report);\n }\n\n function handleTrackSubscribed(track: RemoteTrack, publication: any, participant: RemoteParticipant): void {\n log(`Track subscribed: ${track.kind} from ${participant.identity}`);\n\n const mediaStreamTrack = track.mediaStreamTrack;\n if (!mediaStreamTrack) {\n log(`No mediaStreamTrack available for ${track.kind}`);\n return;\n }\n\n // Create shared stream if it doesn't exist, or add track to existing stream\n if (!sharedMediaStream) {\n sharedMediaStream = new MediaStream([mediaStreamTrack]);\n log(`Created shared MediaStream with ${track.kind} track`);\n } else {\n sharedMediaStream.addTrack(mediaStreamTrack);\n log(`Added ${track.kind} track to shared MediaStream`);\n }\n\n if (track.kind === 'audio') {\n audioStatsDetector = createAudioStatsDetector(\n () => track.getRTCStatsReport(),\n ({ sttLatency, serviceLatency }) => {\n const clientLatency = latencyTimestampTracker.get(true);\n let rttLatency = 0;\n if (sttLatency) {\n const rtt = videoStatsMonitor?.getReport()?.webRTCStats?.avgRtt ?? 0;\n rttLatency = rtt > 0 ? Math.round(rtt * 1000) : 0;\n }\n const latency = clientLatency > 0 ? clientLatency + (sttLatency ?? 0) + rttLatency : undefined;\n const networkLatency =\n latency !== undefined && serviceLatency !== undefined ? latency - serviceLatency : undefined;\n callbacks.onFirstAudioDetected?.({ latency, networkLatency });\n }\n );\n }\n\n if (track.kind === 'video') {\n callbacks.onStreamReady?.();\n log('CALLBACK: onSrcObjectReady');\n callbacks.onSrcObjectReady?.(sharedMediaStream);\n if (!hasEmittedConnected) {\n hasEmittedConnected = true;\n log('CALLBACK: onConnectionStateChange(Connected)');\n callbacks.onConnectionStateChange?.(ConnectionState.Connected, 'livekit:track-subscribed');\n }\n videoStatsMonitor = createVideoStatsMonitor(\n () => track.getRTCStatsReport(),\n () => isConnected,\n noop,\n (state, report) => {\n log(`Video state change: ${state}`);\n if (state === StreamingState.Start) {\n if (trackSubscriptionTimeoutId) {\n clearTimeout(trackSubscriptionTimeoutId);\n trackSubscriptionTimeoutId = null;\n log('Track subscription timeout cleared');\n }\n handleVideoStarted();\n } else if (state === StreamingState.Stop) {\n handleVideoStopped(report);\n }\n }\n );\n videoStatsMonitor.start();\n }\n }\n\n function handleTrackUnsubscribed(track: RemoteTrack, publication: any, participant: RemoteParticipant): void {\n log(`Track unsubscribed: ${track.kind} from ${participant.identity}`);\n\n if (track.kind === 'audio') {\n audioStatsDetector?.destroy();\n audioStatsDetector = null;\n }\n\n if (track.kind === 'video') {\n handleVideoStopped(videoStatsMonitor?.getReport() ?? undefined);\n videoStatsMonitor?.stop();\n videoStatsMonitor = null;\n }\n }\n\n function handleChatEvents(subject: string, data: any): void {\n const eventName = chatEventMap[subject];\n if (!eventName) return;\n\n callbacks.onMessage?.(eventName, { event: eventName, ...data });\n }\n\n /**\n * ToolActive state transitions:\n * - tool-call/started -> ToolActive\n * - stream-video/created -> Talking, then back to ToolActive on stream-video/done\n * while any tool call is still pending (e.g. a client tool waiting for user input)\n * - tool-call/done|error only drops the pending call; Idle comes from turn/ended\n */\n function handleToolEvents(subject: string, data: any): void {\n if (subject === StreamEvents.ToolCallStarted) {\n const payload = toStartedPayload(data as ToolCallStartedWirePayload);\n pendingToolCalls.set(payload.callId, {\n call: {\n callId: payload.callId,\n name: payload.name,\n executionMode: payload.executionMode,\n },\n interruptible: payload.interruptible,\n turnId: payload.turnId ?? currentTurnId,\n });\n recomputeInterruptible();\n emitRunningToolCalls();\n currentActivityState = AgentActivityState.ToolActive;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.ToolActive);\n callbacks.onToolEvent?.(ToolCallEvent.Started, payload);\n return;\n }\n\n if (subject === StreamEvents.ToolCallDone) {\n const payload = toFinishedPayload(data as ToolCallDoneWirePayload);\n resolvePendingToolCall(payload.callId);\n callbacks.onToolEvent?.(ToolCallEvent.Done, payload);\n return;\n }\n\n if (subject === StreamEvents.ToolCallError) {\n const payload = toErrorPayload(data as ToolCallErrorWirePayload);\n resolvePendingToolCall(payload.callId);\n callbacks.onToolEvent?.(ToolCallEvent.Error, payload);\n }\n }\n\n function resolvePendingToolCall(callId: string): void {\n if (!pendingToolCalls.delete(callId)) return;\n recomputeInterruptible();\n emitRunningToolCalls();\n }\n\n function dropBlockingToolCallsForTurn(turnId: number | null): void {\n let dropped = false;\n\n for (const [callId, pending] of pendingToolCalls) {\n if (pending.call.executionMode !== 'blocking') continue;\n if (turnId !== null && pending.turnId !== null && pending.turnId !== turnId) continue;\n pendingToolCalls.delete(callId);\n dropped = true;\n }\n\n if (!dropped) return;\n recomputeInterruptible();\n emitRunningToolCalls();\n }\n\n function recomputeInterruptible(): void {\n const next = ![...pendingToolCalls.values()].some(({ call }) => call.executionMode === 'blocking');\n if (next === currentInterruptible) return;\n currentInterruptible = next;\n callbacks.onInterruptibleChange?.(next);\n }\n\n function emitRunningToolCalls(): void {\n callbacks.onRunningToolCallsChange?.(\n pendingToolCalls.size === 0 ? NO_RUNNING_TOOL_CALLS : [...pendingToolCalls.values()].map(({ call }) => call)\n );\n }\n\n function handleVideoActivityState(subject: string, data: any): void {\n if (subject === StreamEvents.StreamVideoCreated) {\n currentActivityState = AgentActivityState.Talking;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Talking);\n audioStatsDetector?.arm({\n sttLatency: data?.stt?.latency,\n serviceLatency: data?.serviceLatency,\n });\n return;\n }\n\n if (pendingToolCalls.size > 0) {\n if (currentActivityState !== AgentActivityState.ToolActive) {\n currentActivityState = AgentActivityState.ToolActive;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.ToolActive);\n }\n return;\n }\n }\n\n function handleVideoEvents(subject: string, data: any): void {\n const rtt = videoStatsMonitor?.getReport()?.webRTCStats?.avgRtt ?? 0;\n const downstreamNetworkLatency = rtt > 0 ? Math.round((rtt / 2) * 1000) : 0;\n const messageData: VideoMessageData = { ...data, downstreamNetworkLatency };\n\n if (options.debug && data?.metadata?.sentiment) {\n messageData.sentiment = {\n id: data.metadata.sentiment.id,\n name: data.metadata.sentiment.sentiment,\n };\n }\n\n callbacks.onMessage?.(subject as StreamEvents, messageData);\n handleVideoActivityState(subject, data);\n }\n\n function handleTranscriptionEvents(_: string, data: any): void {\n callbacks.onMessage?.(ChatProgress.Transcribe, { event: ChatProgress.Transcribe, ...data });\n queueMicrotask(() => {\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Loading);\n });\n }\n\n function handleTurnStarted(_subject: string, data: TurnEventPayload): void {\n currentTurnId = data?.turn_id ?? null;\n currentActivityState = AgentActivityState.Loading;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Loading);\n }\n\n function handleTurnEnded(_subject: string, data: TurnEventPayload): void {\n const turnId: number | null = data?.turn_id ?? null;\n if (currentTurnId !== null && turnId !== null && turnId < currentTurnId) return;\n dropBlockingToolCallsForTurn(turnId);\n currentActivityState = AgentActivityState.Idle;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Idle);\n }\n\n function handleStreamEnded(_subject: string, data: { reason: StreamEndReason }): void {\n streamEndReason = data?.reason ?? null;\n }\n\n type DataChannelHandler = (subject: string, data: any) => void;\n const dataChannelHandlers: Record<string, DataChannelHandler> = {\n [StreamEvents.ChatAnswer]: handleChatEvents,\n [StreamEvents.ChatPartial]: handleChatEvents,\n [StreamEvents.ToolCallStarted]: handleToolEvents,\n [StreamEvents.ToolCallDone]: handleToolEvents,\n [StreamEvents.ToolCallError]: handleToolEvents,\n [StreamEvents.StreamVideoCreated]: handleVideoEvents,\n [StreamEvents.StreamVideoDone]: handleVideoEvents,\n [StreamEvents.StreamVideoError]: handleVideoEvents,\n [StreamEvents.StreamVideoRejected]: handleVideoEvents,\n [StreamEvents.ChatAudioTranscribed]: handleTranscriptionEvents,\n [StreamEvents.TurnStarted]: handleTurnStarted,\n [StreamEvents.TurnEnded]: handleTurnEnded,\n [StreamEvents.StreamDone]: handleStreamEnded,\n [StreamEvents.StreamFailed]: handleStreamEnded,\n };\n\n function handleDataReceived(\n payload: Uint8Array,\n participant?: RemoteParticipant,\n _kind?: any,\n topic?: string\n ): void {\n const message = dataChannelDecoder.decode(payload);\n\n let data: any;\n try {\n data = JSON.parse(message);\n } catch (e) {\n log('Failed to parse data channel message:', e);\n return;\n }\n\n const subject: string | undefined = topic || data.subject;\n\n log('Data received:', { subject, data });\n\n if (!subject) return;\n\n const handler = dataChannelHandlers[subject];\n if (!handler) return;\n\n try {\n handler(subject, data);\n } catch (e) {\n // Always on: a debug-gated log made a dropped event invisible in production.\n console.warn('[LiveKitStreamingManager] Data channel handler failed', { subject, error: e });\n }\n }\n\n function handleMediaDevicesError(error: Error): void {\n log('Media devices error:', error);\n reportError(streamError());\n }\n\n function handleEncryptionError(error: Error): void {\n log('Encryption error:', error);\n reportError(streamError());\n }\n\n function handleTrackSubscriptionFailed(\n trackSid: string,\n participant: RemoteParticipant,\n reason?: SubscriptionError\n ): void {\n log('Track subscription failed:', { trackSid, participant, reason });\n }\n\n function findPublishedTrack(\n track: MediaStreamTrack,\n source: Track.Source,\n publications: Map<string, LocalTrackPublication>\n ): LocalTrackPublication | null {\n for (const [_, publication] of publications) {\n if (publication.source === source && publication.track) {\n const publishedMediaTrack = publication.track.mediaStreamTrack;\n if (publishedMediaTrack === track || publishedMediaTrack?.id === track.id) {\n return publication as LocalTrackPublication;\n }\n }\n }\n return null;\n }\n\n async function publishTrackStream(\n state: TrackPublishState,\n stream: MediaStream,\n getTracks: (stream: MediaStream) => MediaStreamTrack[],\n source: Track.Source,\n getPublications: () => Map<string, LocalTrackPublication>,\n unpublishFn: () => Promise<void>\n ): Promise<void> {\n if (!isConnected || !room) {\n log(`Room is not connected, cannot publish ${source} stream`);\n throw new Error('Room is not connected');\n }\n\n if (state.isPublishing) {\n log(`${source} publish already in progress, skipping`);\n return;\n }\n\n const tracks = getTracks(stream);\n if (tracks.length === 0) {\n throw new Error(`No ${source} track found in the provided MediaStream`);\n }\n\n const track = tracks[0];\n\n const existingPublication = findPublishedTrack(track, source, getPublications());\n if (existingPublication) {\n log(`${source} track is already published, skipping`, {\n trackId: track.id,\n publishedTrackId: existingPublication.track?.mediaStreamTrack?.id,\n });\n state.publication = existingPublication;\n return;\n }\n\n if (state.publication?.track) {\n const publishedMediaTrack = state.publication.track.mediaStreamTrack;\n if (publishedMediaTrack !== track && publishedMediaTrack?.id !== track.id) {\n log(`Unpublishing existing ${source} track before publishing new one`);\n await unpublishFn();\n }\n }\n\n log(`Publishing ${source} track from provided MediaStream`, { trackId: track.id });\n\n state.isPublishing = true;\n try {\n state.publication = await room.localParticipant.publishTrack(track, { source });\n log(`${source} track published successfully`, { trackSid: state.publication.trackSid });\n } catch (error) {\n log(`Failed to publish ${source} track:`, error);\n throw error;\n } finally {\n state.isPublishing = false;\n }\n }\n\n async function unpublishTrackStream(state: TrackPublishState, label: string): Promise<void> {\n if (!state.publication || !state.publication.track) {\n return;\n }\n\n try {\n if (room) {\n await room.localParticipant.unpublishTrack(state.publication.track, false);\n log(`${label} track unpublished`);\n }\n } catch (error) {\n log(`Error unpublishing ${label} track:`, error);\n } finally {\n state.publication = null;\n }\n }\n\n async function publishMicrophoneStream(stream: MediaStream): Promise<void> {\n return publishTrackStream(\n microphoneState,\n stream,\n s => s.getAudioTracks(),\n Track.Source.Microphone,\n () => room!.localParticipant.audioTrackPublications,\n unpublishMicrophoneStream\n );\n }\n\n async function unpublishMicrophoneStream(): Promise<void> {\n return unpublishTrackStream(microphoneState, 'Microphone');\n }\n\n async function replaceMicrophoneTrack(track: MediaStreamTrack): Promise<void> {\n if (!isConnected || !room) {\n log('Cannot replace microphone track: room is not connected');\n throw new Error('Room is not connected');\n }\n if (track.kind !== 'audio') {\n log('Cannot replace microphone track: not an audio track', { kind: track.kind });\n throw new Error('Microphone track must be an audio track');\n }\n if (microphoneState.isPublishing) {\n log('Cannot replace microphone track: publish in progress');\n throw new Error('Microphone publish in progress');\n }\n const pub = microphoneState.publication;\n if (!pub || !pub.track) {\n log('Cannot replace microphone track: no publication to replace');\n throw new Error('No microphone publication to replace');\n }\n try {\n microphoneState.isPublishing = true;\n await pub.track.replaceTrack(track);\n log('Microphone track replaced', { trackId: track.id, trackSid: pub.trackSid });\n } finally {\n microphoneState.isPublishing = false;\n }\n }\n\n async function publishCameraStream(stream: MediaStream): Promise<void> {\n return publishTrackStream(\n cameraState,\n stream,\n s => s.getVideoTracks(),\n Track.Source.Camera,\n () => room!.localParticipant.videoTrackPublications,\n unpublishCameraStream\n );\n }\n\n async function unpublishCameraStream(): Promise<void> {\n return unpublishTrackStream(cameraState, 'Camera');\n }\n\n function cleanMediaStream(): void {\n if (sharedMediaStream) {\n sharedMediaStream.getTracks().forEach(track => track.stop());\n sharedMediaStream = null;\n }\n }\n\n async function sendDataChannelMessage(topic: `${InternalDataChannelTopic}`, payload: string) {\n if (!isConnected || !room) {\n log('Room is not connected for sending messages');\n reportError(streamError());\n return;\n }\n\n try {\n await room.localParticipant.sendText(payload, { topic });\n log('Message sent successfully:', payload);\n } catch (error) {\n log('Failed to send message:', error);\n reportError(streamError());\n }\n }\n\n async function disconnect(reason: string) {\n if (trackSubscriptionTimeoutId) {\n clearTimeout(trackSubscriptionTimeoutId);\n trackSubscriptionTimeoutId = null;\n }\n\n audioStatsDetector?.destroy();\n audioStatsDetector = null;\n\n if (room) {\n callbacks.onConnectionStateChange?.(ConnectionState.Disconnecting, reason);\n await Promise.all([unpublishMicrophoneStream(), unpublishCameraStream()]);\n await room.disconnect();\n }\n cleanMediaStream();\n isConnected = false;\n hasEmittedConnected = false;\n if (pendingToolCalls.size > 0) {\n pendingToolCalls.clear();\n recomputeInterruptible();\n emitRunningToolCalls();\n }\n currentTurnId = null;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Idle);\n currentActivityState = AgentActivityState.Idle;\n }\n\n return {\n speak(payload: PayloadType<T>) {\n const message = typeof payload === 'string' ? payload : JSON.stringify(payload);\n return sendDataChannelMessage(InternalDataChannelTopic.Speak, message);\n },\n\n disconnect: () => disconnect('user:disconnect'),\n\n async reconnect() {\n if (room?.state === LiveKitConnectionState.Connected) {\n log('Room is already connected');\n return;\n }\n\n if (!room || !url || !token) {\n log('Cannot reconnect: missing room, URL or token');\n throw new Error('Cannot reconnect: session not available');\n }\n\n log('Reconnecting to LiveKit room, state:', room.state);\n hasEmittedConnected = false;\n streamEndReason = null;\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'user:reconnect');\n\n try {\n await room.connect(url, token);\n log('Room reconnected');\n isConnected = true;\n\n // If no remote participants, wait for agent to join\n if (room.remoteParticipants.size === 0) {\n log('Waiting for agent to join...');\n\n const agentJoined = await new Promise<boolean>(resolve => {\n const timeout = setTimeout(() => {\n room?.off(RoomEvent.ParticipantConnected, onParticipantConnected);\n resolve(false);\n }, 5000);\n\n const onParticipantConnected = () => {\n clearTimeout(timeout);\n room?.off(RoomEvent.ParticipantConnected, onParticipantConnected);\n resolve(true);\n };\n\n room?.on(RoomEvent.ParticipantConnected, onParticipantConnected);\n });\n\n if (!agentJoined) {\n log('Agent did not join within timeout');\n await room.disconnect();\n throw new Error('Agent did not rejoin the room');\n }\n\n log('Agent joined, reconnection successful');\n }\n } catch (error) {\n log('Failed to reconnect:', error);\n callbacks.onConnectionStateChange?.(ConnectionState.Fail, 'user:reconnect-failed');\n throw error;\n }\n },\n\n sendDataChannelMessage,\n publishMicrophoneStream,\n unpublishMicrophoneStream,\n replaceMicrophoneTrack,\n publishCameraStream,\n unpublishCameraStream,\n\n interrupt(type: InterruptOptions['type']) {\n // Skip text interrupts for V2/expressive: the orchestrator does not\n // cancel the in-flight LLM token stream, and an extra interrupt while\n // a previous one is still settling causes races.\n if (type === 'text') return false;\n\n // Nothing would reach the agent: sendDataChannelMessage drops the payload in this state.\n if (!isConnected || !room) return false;\n\n sendDataChannelMessage(InternalDataChannelTopic.Interrupt, '');\n\n return true;\n },\n\n registerRpcMethod(method: string, handler: (data: any) => Promise<string>) {\n room?.registerRpcMethod(method, wrapRpcHandler(RpcError, handler));\n },\n unregisterRpcMethod(method: string) {\n room?.unregisterRpcMethod(method);\n },\n\n sessionId,\n streamId: sessionId,\n streamType,\n interruptAvailable: interruptEnabled,\n // A getter, not a snapshot: currentInterruptible changes as blocking tool calls come and go.\n get isInterruptible() {\n return currentInterruptible;\n },\n };\n}\n\nexport type LiveKitStreamingManager<T extends CreateStreamOptions> = StreamingManager<T> & {\n reconnect(): Promise<void>;\n};\n"],"names":["getTimezone","getDevice","userAgent","platform","os","isMobile","getUserContextAttributes","attributes","timezone","device","createStreamApiV2","auth","host","agentId","onError","client","createClient","options","chatEventMap","StreamEvents","ChatProgress","TRACK_SUBSCRIPTION_TIMEOUT_MS","NO_RUNNING_TOOL_CALLS","livekitModule","importLiveKit","preloadLiveKit","connectivityQualityToState","ConnectivityState","streamError","message","StreamError","dataChannelDecoder","toStartedPayload","wire","toFinishedPayload","toErrorText","error","_a","toErrorPayload","wrapRpcHandler","RpcErrorClass","handler","data","handleInitError","log","callbacks","ConnectionState","_b","createLiveKitStreamingManager","sessionOptions","createStreamingLogger","Room","RoomEvent","LiveKitConnectionState","RpcError","Track","baseURL","analytics","room","isConnected","streamType","StreamType","sharedMediaStream","microphoneState","cameraState","videoStatsMonitor","audioStatsDetector","videoStreamingState","hasEmittedConnected","method","trackSubscriptionTimeoutId","currentActivityState","AgentActivityState","currentInterruptible","pendingToolCalls","currentTurnId","streamEndReason","streamApi","didApiUrl","sessionId","token","url","interruptEnabled","streamResponse","id","session_token","session_url","interrupt_enabled","reportError","handleConnectionStateChanged","handleConnectionQualityChanged","handleParticipantConnected","handleParticipantDisconnected","handleTrackSubscribed","handleTrackUnsubscribed","handleDataReceived","handleMediaDevicesError","handleTranscriptionReceived","handleEncryptionError","handleTrackSubscriptionFailed","_segments","participant","latencyTimestampTracker","setUserContextAttributes","toErrorAnalytics","disconnect","state","_c","_d","quality","handleVideoStarted","StreamingState","handleVideoStopped","report","track","publication","mediaStreamTrack","createAudioStatsDetector","sttLatency","serviceLatency","clientLatency","rttLatency","rtt","latency","networkLatency","createVideoStatsMonitor","noop","handleChatEvents","subject","eventName","handleToolEvents","payload","recomputeInterruptible","emitRunningToolCalls","ToolCallEvent","resolvePendingToolCall","callId","dropBlockingToolCallsForTurn","turnId","dropped","pending","next","call","handleVideoActivityState","handleVideoEvents","downstreamNetworkLatency","messageData","handleTranscriptionEvents","_","handleTurnStarted","_subject","handleTurnEnded","handleStreamEnded","dataChannelHandlers","_kind","topic","e","trackSid","reason","findPublishedTrack","source","publications","publishedMediaTrack","publishTrackStream","stream","getTracks","getPublications","unpublishFn","tracks","existingPublication","unpublishTrackStream","label","publishMicrophoneStream","s","unpublishMicrophoneStream","replaceMicrophoneTrack","pub","publishCameraStream","unpublishCameraStream","cleanMediaStream","sendDataChannelMessage","InternalDataChannelTopic","resolve","timeout","onParticipantConnected","type"],"mappings":"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"}
1
+ {"version":3,"file":"livekit-manager-BCxu61o7.js","sources":["../src/utils/user-context.ts","../src/api/streams/streamsApiV2.ts","../src/services/streaming-manager/data-channel-handlers.ts","../src/services/streaming-manager/livekit-manager.ts"],"sourcesContent":["/**\n * Best-effort user context (location + device) resolved entirely on the client\n * and attached to the LiveKit participant as attributes on connect. The agent\n * backend reads these to enrich the LLM context (see `get_user_context`).\n *\n * `location` is the IANA timezone (e.g. `America/New_York`) — a coarse but\n * network-free location proxy. `device` is a short human-readable descriptor.\n */\n\nfunction getTimezone(): string {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone ?? '';\n } catch {\n return '';\n }\n}\n\nfunction getDevice(): string {\n if (typeof navigator === 'undefined') {\n return '';\n }\n\n const userAgent = navigator.userAgent ?? '';\n const platform = (navigator.platform ?? '').toLowerCase();\n\n let os = 'Unknown';\n if (/android/i.test(userAgent)) {\n os = 'Android';\n } else if (/iphone|ipad|ipod/i.test(userAgent)) {\n os = 'iOS';\n } else if (platform.includes('win')) {\n os = 'Windows';\n } else if (platform.includes('mac')) {\n os = 'Mac OS X';\n } else if (platform.includes('linux')) {\n os = 'Linux';\n }\n\n const isMobile = os === 'Android' || os === 'iOS' || /Mobi/i.test(userAgent);\n\n return `${os}, ${isMobile ? 'Mobile' : 'Desktop'}`;\n}\n\n/**\n * Non-empty `{ timezone, device }` attributes to attach to the participant.\n * Keys with no resolvable value are omitted. The backend infers the user's\n * country from the timezone (a timezone identifies a country reliably, but its\n * reference city is not the user's actual city).\n */\nexport function getUserContextAttributes(): Record<string, string> {\n const attributes: Record<string, string> = {};\n\n const timezone = getTimezone();\n if (timezone) {\n attributes.timezone = timezone;\n }\n\n const device = getDevice();\n if (device) {\n attributes.device = device;\n }\n\n return attributes;\n}\n","import { Auth, CreateSessionV2Options, CreateSessionV2Response, ErrorReporter } from '@sdk/types';\nimport { createClient } from '../apiClient';\n\nexport function createStreamApiV2(auth: Auth, host: string, agentId: string, onError?: ErrorReporter) {\n const client = createClient(auth, `${host}/v2/agents/${agentId}`, onError);\n\n return {\n async createStream(options: CreateSessionV2Options) {\n return client.post<CreateSessionV2Response>('/sessions', options);\n },\n };\n}\n","import { ChatProgress } from '@sdk/types/entities/agents/manager';\nimport { StreamEvents } from '@sdk/types/stream';\n\nexport const chatEventMap: Record<string, ChatProgress> = {\n [StreamEvents.ChatAnswer]: ChatProgress.Answer,\n [StreamEvents.ChatPartial]: ChatProgress.Partial,\n};\n","import { StreamError } from '@sdk/errors';\nimport {\n AgentActivityState,\n ConnectionState,\n ConnectivityState,\n CreateSessionV2Options,\n CreateStreamOptions,\n InterruptOptions,\n Message,\n PayloadType,\n RunningToolCall,\n StreamEndReason,\n StreamEvents,\n StreamingManagerOptions,\n StreamingState,\n StreamType,\n ToolCallDonePayload,\n ToolCallDoneWirePayload,\n ToolCallErrorPayload,\n ToolCallErrorWirePayload,\n ToolCallEvent,\n ToolCallStartedPayload,\n ToolCallStartedWirePayload,\n ToolCallWireError,\n TurnEventPayload,\n} from '@sdk/types';\nimport { ChatProgress } from '@sdk/types/entities/agents/manager';\nimport { InternalDataChannelTopic } from '@sdk/types/stream/data-channel';\nimport { noop } from '@sdk/utils';\nimport { getUserContextAttributes } from '@sdk/utils/user-context';\nimport { createStreamApiV2 } from '../../api/streams/streamsApiV2';\nimport { didApiUrl } from '../../config/environment';\nimport { toErrorAnalytics } from '../../utils/error-analytics';\nimport { latencyTimestampTracker } from '../analytics/timestamp-tracker';\nimport { createStreamingLogger, StreamingManager } from './common';\nimport { chatEventMap } from './data-channel-handlers';\n\nimport type {\n ConnectionQuality,\n ConnectionState as LiveKitConnectionState,\n LocalTrackPublication,\n Participant,\n RemoteParticipant,\n RemoteTrack,\n Room,\n RoomEvent,\n RpcError,\n SubscriptionError,\n Track,\n TranscriptionSegment,\n} from 'livekit-client';\nimport { createAudioStatsDetector, createVideoStatsMonitor } from './stats/poll';\nimport { VideoRTCStatsReport } from './stats/report';\n\nconst TRACK_SUBSCRIPTION_TIMEOUT_MS = 20000;\n\nconst NO_RUNNING_TOOL_CALLS: readonly RunningToolCall[] = [];\n\ninterface TrackPublishState {\n isPublishing: boolean;\n publication: LocalTrackPublication | null;\n}\n\ninterface PendingToolCall {\n call: RunningToolCall;\n interruptible: boolean;\n turnId: number | null;\n}\n\ninterface LiveKitModule {\n Room: typeof Room;\n RoomEvent: typeof RoomEvent;\n ConnectionState: typeof LiveKitConnectionState;\n RemoteParticipant: typeof RemoteParticipant;\n RemoteTrack: typeof RemoteTrack;\n RpcError: typeof RpcError;\n Track: typeof Track;\n}\n\n// One download for the life of the page. A rejected import is not kept, so the next call retries.\nlet livekitModule: Promise<LiveKitModule> | undefined;\n\nfunction importLiveKit(): Promise<LiveKitModule> {\n livekitModule ??= import('livekit-client').catch(() => {\n livekitModule = undefined;\n\n throw new Error(\n 'LiveKit client is required for this streaming manager. Please install it using: npm install livekit-client'\n );\n });\n\n return livekitModule;\n}\n\n/**\n * Starts the `livekit-client` download without waiting for it, so an Expressive (V4)\n * `connect()` finds the module loaded instead of downloading it before it can ask for a session.\n * A failure here is ignored: `connect()` imports again and reports it.\n *\n * @internal Implementation detail; not part of the public SDK surface.\n */\nexport function preloadLiveKit(): void {\n void importLiveKit().catch(() => {});\n}\n\nconst connectivityQualityToState = {\n excellent: ConnectivityState.Strong,\n good: ConnectivityState.Strong,\n poor: ConnectivityState.Weak,\n lost: ConnectivityState.Unknown,\n unknown: ConnectivityState.Unknown,\n};\n\nconst streamError = (message = 'Stream Error') => new StreamError(message);\n\nconst dataChannelDecoder = new TextDecoder();\n\ntype VideoMessageData = Pick<Message, 'role' | 'sentiment'>;\n\n/**\n * The server sends tool-call events with snake_case fields; the public payloads are camelCase.\n * This is the single place the two shapes meet.\n */\nfunction toStartedPayload(wire: ToolCallStartedWirePayload): ToolCallStartedPayload {\n return {\n callId: wire.call_id,\n name: wire.name,\n input: wire.input,\n ...(wire.output !== undefined ? { output: wire.output } : {}),\n // The server omits `interruptible` on some started events, and `executionMode` is\n // normalized exactly as `RunningToolCall.executionMode` is, so the two agree about the call.\n interruptible: wire.interruptible === true,\n executionMode: wire.execution_mode === 'async' ? 'async' : 'blocking',\n ...(wire.turn_id !== undefined ? { turnId: wire.turn_id } : {}),\n timestamp: wire.timestamp,\n };\n}\n\nfunction toFinishedPayload(wire: ToolCallDoneWirePayload): ToolCallDonePayload {\n return {\n callId: wire.call_id,\n name: wire.name,\n input: wire.input,\n output: wire.output,\n durationMs: wire.duration_ms,\n extra: wire.extra,\n timestamp: wire.timestamp,\n };\n}\n\n// The server describes the failure under `extra.error` (`{ kind, code, message, data }`), and\n// answers some failures with the reason as a plain-string `output` instead.\nfunction toErrorText(wire: ToolCallErrorWirePayload): string | undefined {\n const error = (wire.extra as { error?: ToolCallWireError } | undefined)?.error;\n\n if (typeof error?.message === 'string' && error.message) {\n return error.message;\n }\n\n return typeof wire.output === 'string' && wire.output ? wire.output : undefined;\n}\n\nfunction toErrorPayload(wire: ToolCallErrorWirePayload): ToolCallErrorPayload {\n const error = toErrorText(wire);\n\n return {\n ...toFinishedPayload(wire as ToolCallDoneWirePayload),\n output: wire.output,\n ...(error !== undefined ? { error } : {}),\n };\n}\n\n/**\n * LiveKit forwards only a thrown `RpcError` to the agent — anything else becomes a fixed\n * `APPLICATION_ERROR` message — so wrap the handler's reason. Takes the class from the lazily\n * imported module, so a Talks/Clips bundle never pulls in `livekit-client`. `RpcError` truncates\n * the message at 256 bytes.\n */\nfunction wrapRpcHandler(RpcErrorClass: typeof RpcError, handler: (data: any) => Promise<string>) {\n return async (data: any): Promise<string> => {\n try {\n return await handler(data);\n } catch (error) {\n // A handler that threw an RpcError chose its own code and data — pass it through.\n if (error instanceof RpcErrorClass) {\n throw error;\n }\n\n throw new RpcErrorClass(\n RpcErrorClass.ErrorCode.APPLICATION_ERROR,\n (error as Error)?.message || 'Client tool failed'\n );\n }\n };\n}\n\nfunction handleInitError(\n error: unknown,\n log: (message?: any, ...optionalParams: any[]) => void,\n callbacks: StreamingManagerOptions['callbacks']\n): void {\n log('Failed to connect to LiveKit room:', error);\n callbacks.onConnectionStateChange?.(ConnectionState.Fail, 'internal:init-error');\n // No session yet, so no id to report.\n callbacks.onError?.(error as Error, {});\n throw error;\n}\n\nexport async function createLiveKitStreamingManager<T extends CreateSessionV2Options>(\n agentId: string,\n sessionOptions: CreateSessionV2Options,\n options: StreamingManagerOptions\n): Promise<StreamingManager<T> & { reconnect(): Promise<void> }> {\n const log = createStreamingLogger(options.debug || false, 'LiveKitStreamingManager');\n\n const { Room, RoomEvent, ConnectionState: LiveKitConnectionState, RpcError, Track } = await importLiveKit();\n\n const { callbacks, auth, baseURL, analytics } = options;\n let room: Room | null = null;\n let isConnected = false;\n const streamType = StreamType.Fluent;\n let sharedMediaStream: MediaStream | null = null;\n const microphoneState: TrackPublishState = { isPublishing: false, publication: null };\n const cameraState: TrackPublishState = { isPublishing: false, publication: null };\n let videoStatsMonitor: ReturnType<typeof createVideoStatsMonitor> | null = null;\n let audioStatsDetector: ReturnType<typeof createAudioStatsDetector> | null = null;\n let videoStreamingState: StreamingState | null = null;\n // We defer Connected until video track is subscribed to align with WebRTC behavior\n let hasEmittedConnected = false;\n\n room = new Room({\n adaptiveStream: false, // Must be false to use mediaStreamTrack directly\n dynacast: true,\n });\n\n for (const [method, handler] of options.rpcMethods ?? []) {\n room.registerRpcMethod(method, wrapRpcHandler(RpcError, handler));\n }\n\n let trackSubscriptionTimeoutId: ReturnType<typeof setTimeout> | null = null;\n let currentActivityState: AgentActivityState = AgentActivityState.Idle;\n let currentInterruptible = true;\n const pendingToolCalls = new Map<string, PendingToolCall>();\n let currentTurnId: number | null = null;\n let streamEndReason: StreamEndReason | null = null;\n\n const streamApi = createStreamApiV2(auth, baseURL || didApiUrl, agentId, callbacks.onError);\n let sessionId: string | undefined;\n\n let token: string | undefined;\n let url: string | undefined;\n let interruptEnabled = true;\n\n try {\n const streamResponse = await streamApi.createStream({\n transport: sessionOptions.transport,\n chat_persist: sessionOptions.chat_persist ?? false,\n verbose: options.verbose ?? false,\n });\n\n const { id, session_token, session_url, interrupt_enabled } = streamResponse;\n callbacks.onStreamCreated?.({ sessionId: id, streamId: id, agentId });\n sessionId = id;\n token = session_token;\n url = session_url;\n interruptEnabled = interrupt_enabled ?? true;\n\n await room.prepareConnection(url, token);\n } catch (error) {\n handleInitError(error, log, callbacks);\n }\n\n if (!url || !token || !sessionId) {\n return Promise.reject(new Error('Failed to initialize LiveKit stream'));\n }\n\n const reportError = (error: Error) => callbacks.onError?.(error, { sessionId });\n\n room.on(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged)\n .on(RoomEvent.ConnectionQualityChanged, handleConnectionQualityChanged)\n .on(RoomEvent.ParticipantConnected, handleParticipantConnected)\n .on(RoomEvent.ParticipantDisconnected, handleParticipantDisconnected)\n .on(RoomEvent.TrackSubscribed, handleTrackSubscribed)\n .on(RoomEvent.TrackUnsubscribed, handleTrackUnsubscribed)\n .on(RoomEvent.DataReceived, handleDataReceived)\n .on(RoomEvent.MediaDevicesError, handleMediaDevicesError)\n .on(RoomEvent.TranscriptionReceived, handleTranscriptionReceived)\n .on(RoomEvent.EncryptionError, handleEncryptionError)\n .on(RoomEvent.TrackSubscriptionFailed, handleTrackSubscriptionFailed);\n\n function handleTranscriptionReceived(_segments: TranscriptionSegment[], participant?: Participant): void {\n if (participant?.isLocal) {\n latencyTimestampTracker.update();\n }\n }\n async function setUserContextAttributes(): Promise<void> {\n const attributes = getUserContextAttributes();\n if (!room || Object.keys(attributes).length === 0) {\n return;\n }\n try {\n await room.localParticipant.setAttributes(attributes);\n } catch (error) {\n log('Failed to set user context attributes', error);\n }\n }\n\n try {\n await room.connect(url, token);\n log('LiveKit room joined successfully');\n\n void setUserContextAttributes();\n\n trackSubscriptionTimeoutId = setTimeout(() => {\n log(\n `Track subscription timeout - no track subscribed within ${TRACK_SUBSCRIPTION_TIMEOUT_MS / 1000} seconds after connect`\n );\n trackSubscriptionTimeoutId = null;\n const error = streamError('Track subscription timeout');\n analytics.track('connectivity-error', {\n error: toErrorAnalytics(error),\n sessionId,\n });\n reportError(error);\n disconnect('internal:track-subscription-timeout');\n }, TRACK_SUBSCRIPTION_TIMEOUT_MS);\n } catch (error) {\n handleInitError(error, log, callbacks);\n }\n\n analytics.enrich({\n 'stream-type': streamType,\n });\n\n function handleConnectionStateChanged(state: LiveKitConnectionState): void {\n log('Connection state changed:', state);\n switch (state) {\n case LiveKitConnectionState.Connecting:\n log('CALLBACK: onConnectionStateChange(Connecting)');\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'livekit:connecting');\n break;\n case LiveKitConnectionState.Connected:\n log('LiveKit room connected successfully');\n isConnected = true;\n break;\n case LiveKitConnectionState.Disconnected:\n log('LiveKit room disconnected');\n isConnected = false;\n hasEmittedConnected = false;\n microphoneState.publication = null;\n cameraState.publication = null;\n callbacks.onConnectionStateChange?.(\n ConnectionState.Disconnected,\n streamEndReason ?? 'livekit:disconnected'\n );\n break;\n case LiveKitConnectionState.Reconnecting:\n log('LiveKit room reconnecting...');\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'livekit:reconnecting');\n break;\n case LiveKitConnectionState.SignalReconnecting:\n log('LiveKit room signal reconnecting...');\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'livekit:signal-reconnecting');\n break;\n }\n }\n\n function handleConnectionQualityChanged(quality: ConnectionQuality, participant?: Participant): void {\n log('Connection quality:', quality);\n if (participant?.isLocal) {\n callbacks.onConnectivityStateChange?.(connectivityQualityToState[quality]);\n }\n }\n\n function handleParticipantConnected(participant: RemoteParticipant): void {\n log('Participant connected:', participant.identity);\n }\n\n function handleParticipantDisconnected(participant: RemoteParticipant): void {\n log('Participant disconnected:', participant.identity);\n\n // Agent left the room - treat as disconnect\n disconnect('livekit:participant-disconnected');\n }\n\n function handleVideoStarted() {\n if (videoStreamingState === StreamingState.Start) {\n return;\n }\n\n log('CALLBACK: onVideoStateChange(Start)');\n videoStreamingState = StreamingState.Start;\n callbacks.onVideoStateChange?.(StreamingState.Start);\n }\n\n function handleVideoStopped(report?: VideoRTCStatsReport) {\n if (videoStreamingState === StreamingState.Stop) {\n return;\n }\n\n log('CALLBACK: onVideoStateChange(Stop)');\n videoStreamingState = StreamingState.Stop;\n callbacks.onVideoStateChange?.(StreamingState.Stop, report);\n }\n\n function handleTrackSubscribed(track: RemoteTrack, publication: any, participant: RemoteParticipant): void {\n log(`Track subscribed: ${track.kind} from ${participant.identity}`);\n\n const mediaStreamTrack = track.mediaStreamTrack;\n if (!mediaStreamTrack) {\n log(`No mediaStreamTrack available for ${track.kind}`);\n return;\n }\n\n // Create shared stream if it doesn't exist, or add track to existing stream\n if (!sharedMediaStream) {\n sharedMediaStream = new MediaStream([mediaStreamTrack]);\n log(`Created shared MediaStream with ${track.kind} track`);\n } else {\n sharedMediaStream.addTrack(mediaStreamTrack);\n log(`Added ${track.kind} track to shared MediaStream`);\n }\n\n if (track.kind === 'audio') {\n audioStatsDetector = createAudioStatsDetector(\n () => track.getRTCStatsReport(),\n ({ sttLatency, serviceLatency }) => {\n const clientLatency = latencyTimestampTracker.get(true);\n let rttLatency = 0;\n if (sttLatency) {\n const rtt = videoStatsMonitor?.getReport()?.webRTCStats?.avgRtt ?? 0;\n rttLatency = rtt > 0 ? Math.round(rtt * 1000) : 0;\n }\n const latency = clientLatency > 0 ? clientLatency + (sttLatency ?? 0) + rttLatency : undefined;\n const networkLatency =\n latency !== undefined && serviceLatency !== undefined ? latency - serviceLatency : undefined;\n callbacks.onFirstAudioDetected?.({ latency, networkLatency });\n }\n );\n }\n\n if (track.kind === 'video') {\n callbacks.onStreamReady?.();\n log('CALLBACK: onSrcObjectReady');\n callbacks.onSrcObjectReady?.(sharedMediaStream);\n if (!hasEmittedConnected) {\n hasEmittedConnected = true;\n log('CALLBACK: onConnectionStateChange(Connected)');\n callbacks.onConnectionStateChange?.(ConnectionState.Connected, 'livekit:track-subscribed');\n }\n videoStatsMonitor = createVideoStatsMonitor(\n () => track.getRTCStatsReport(),\n () => isConnected,\n noop,\n (state, report) => {\n log(`Video state change: ${state}`);\n if (state === StreamingState.Start) {\n if (trackSubscriptionTimeoutId) {\n clearTimeout(trackSubscriptionTimeoutId);\n trackSubscriptionTimeoutId = null;\n log('Track subscription timeout cleared');\n }\n handleVideoStarted();\n } else if (state === StreamingState.Stop) {\n handleVideoStopped(report);\n }\n }\n );\n videoStatsMonitor.start();\n }\n }\n\n function handleTrackUnsubscribed(track: RemoteTrack, publication: any, participant: RemoteParticipant): void {\n log(`Track unsubscribed: ${track.kind} from ${participant.identity}`);\n\n if (track.kind === 'audio') {\n audioStatsDetector?.destroy();\n audioStatsDetector = null;\n }\n\n if (track.kind === 'video') {\n handleVideoStopped(videoStatsMonitor?.getReport() ?? undefined);\n videoStatsMonitor?.stop();\n videoStatsMonitor = null;\n }\n }\n\n function handleChatEvents(subject: string, data: any): void {\n const eventName = chatEventMap[subject];\n if (!eventName) return;\n\n callbacks.onMessage?.(eventName, { event: eventName, ...data });\n }\n\n /**\n * ToolActive state transitions:\n * - tool-call/started -> ToolActive\n * - stream-video/created -> Talking, then back to ToolActive on stream-video/done\n * while any tool call is still pending (e.g. a client tool waiting for user input)\n * - tool-call/done|error only drops the pending call; Idle comes from turn/ended\n */\n function handleToolEvents(subject: string, data: any): void {\n if (subject === StreamEvents.ToolCallStarted) {\n const payload = toStartedPayload(data as ToolCallStartedWirePayload);\n pendingToolCalls.set(payload.callId, {\n call: {\n callId: payload.callId,\n name: payload.name,\n executionMode: payload.executionMode,\n },\n interruptible: payload.interruptible,\n turnId: payload.turnId ?? currentTurnId,\n });\n recomputeInterruptible();\n emitRunningToolCalls();\n currentActivityState = AgentActivityState.ToolActive;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.ToolActive);\n callbacks.onToolEvent?.(ToolCallEvent.Started, payload);\n return;\n }\n\n if (subject === StreamEvents.ToolCallDone) {\n const payload = toFinishedPayload(data as ToolCallDoneWirePayload);\n resolvePendingToolCall(payload.callId);\n callbacks.onToolEvent?.(ToolCallEvent.Done, payload);\n return;\n }\n\n if (subject === StreamEvents.ToolCallError) {\n const payload = toErrorPayload(data as ToolCallErrorWirePayload);\n resolvePendingToolCall(payload.callId);\n callbacks.onToolEvent?.(ToolCallEvent.Error, payload);\n }\n }\n\n function resolvePendingToolCall(callId: string): void {\n if (!pendingToolCalls.delete(callId)) return;\n recomputeInterruptible();\n emitRunningToolCalls();\n }\n\n function dropBlockingToolCallsForTurn(turnId: number | null): void {\n let dropped = false;\n\n for (const [callId, pending] of pendingToolCalls) {\n if (pending.call.executionMode !== 'blocking') continue;\n if (turnId !== null && pending.turnId !== null && pending.turnId !== turnId) continue;\n pendingToolCalls.delete(callId);\n dropped = true;\n }\n\n if (!dropped) return;\n recomputeInterruptible();\n emitRunningToolCalls();\n }\n\n function recomputeInterruptible(): void {\n const next = ![...pendingToolCalls.values()].some(({ call }) => call.executionMode === 'blocking');\n if (next === currentInterruptible) return;\n currentInterruptible = next;\n callbacks.onInterruptibleChange?.(next);\n }\n\n function emitRunningToolCalls(): void {\n callbacks.onRunningToolCallsChange?.(\n pendingToolCalls.size === 0 ? NO_RUNNING_TOOL_CALLS : [...pendingToolCalls.values()].map(({ call }) => call)\n );\n }\n\n function handleVideoActivityState(subject: string, data: any): void {\n if (subject === StreamEvents.StreamVideoCreated) {\n currentActivityState = AgentActivityState.Talking;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Talking);\n audioStatsDetector?.arm({\n sttLatency: data?.stt?.latency,\n serviceLatency: data?.serviceLatency,\n });\n return;\n }\n\n if (pendingToolCalls.size > 0) {\n if (currentActivityState !== AgentActivityState.ToolActive) {\n currentActivityState = AgentActivityState.ToolActive;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.ToolActive);\n }\n return;\n }\n }\n\n function handleVideoEvents(subject: string, data: any): void {\n const rtt = videoStatsMonitor?.getReport()?.webRTCStats?.avgRtt ?? 0;\n const downstreamNetworkLatency = rtt > 0 ? Math.round((rtt / 2) * 1000) : 0;\n const messageData: VideoMessageData = { ...data, downstreamNetworkLatency };\n\n if (options.debug && data?.metadata?.sentiment) {\n messageData.sentiment = {\n id: data.metadata.sentiment.id,\n name: data.metadata.sentiment.sentiment,\n };\n }\n\n callbacks.onMessage?.(subject as StreamEvents, messageData);\n handleVideoActivityState(subject, data);\n }\n\n function handleTranscriptionEvents(_: string, data: any): void {\n callbacks.onMessage?.(ChatProgress.Transcribe, { event: ChatProgress.Transcribe, ...data });\n queueMicrotask(() => {\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Loading);\n });\n }\n\n function handleTurnStarted(_subject: string, data: TurnEventPayload): void {\n currentTurnId = data?.turn_id ?? null;\n currentActivityState = AgentActivityState.Loading;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Loading);\n }\n\n function handleTurnEnded(_subject: string, data: TurnEventPayload): void {\n const turnId: number | null = data?.turn_id ?? null;\n if (currentTurnId !== null && turnId !== null && turnId < currentTurnId) return;\n dropBlockingToolCallsForTurn(turnId);\n currentActivityState = AgentActivityState.Idle;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Idle);\n }\n\n function handleStreamEnded(_subject: string, data: { reason: StreamEndReason }): void {\n streamEndReason = data?.reason ?? null;\n }\n\n type DataChannelHandler = (subject: string, data: any) => void;\n const dataChannelHandlers: Record<string, DataChannelHandler> = {\n [StreamEvents.ChatAnswer]: handleChatEvents,\n [StreamEvents.ChatPartial]: handleChatEvents,\n [StreamEvents.ToolCallStarted]: handleToolEvents,\n [StreamEvents.ToolCallDone]: handleToolEvents,\n [StreamEvents.ToolCallError]: handleToolEvents,\n [StreamEvents.StreamVideoCreated]: handleVideoEvents,\n [StreamEvents.StreamVideoDone]: handleVideoEvents,\n [StreamEvents.StreamVideoError]: handleVideoEvents,\n [StreamEvents.StreamVideoRejected]: handleVideoEvents,\n [StreamEvents.ChatAudioTranscribed]: handleTranscriptionEvents,\n [StreamEvents.TurnStarted]: handleTurnStarted,\n [StreamEvents.TurnEnded]: handleTurnEnded,\n [StreamEvents.StreamDone]: handleStreamEnded,\n [StreamEvents.StreamFailed]: handleStreamEnded,\n };\n\n function handleDataReceived(\n payload: Uint8Array,\n participant?: RemoteParticipant,\n _kind?: any,\n topic?: string\n ): void {\n const message = dataChannelDecoder.decode(payload);\n\n let data: any;\n try {\n data = JSON.parse(message);\n } catch (e) {\n log('Failed to parse data channel message:', e);\n return;\n }\n\n const subject: string | undefined = topic || data.subject;\n\n log('Data received:', { subject, data });\n\n if (!subject) return;\n\n const handler = dataChannelHandlers[subject];\n if (!handler) return;\n\n try {\n handler(subject, data);\n } catch (e) {\n // Always on: a debug-gated log made a dropped event invisible in production.\n console.warn('[LiveKitStreamingManager] Data channel handler failed', { subject, error: e });\n }\n }\n\n function handleMediaDevicesError(error: Error): void {\n log('Media devices error:', error);\n reportError(streamError());\n }\n\n function handleEncryptionError(error: Error): void {\n log('Encryption error:', error);\n reportError(streamError());\n }\n\n function handleTrackSubscriptionFailed(\n trackSid: string,\n participant: RemoteParticipant,\n reason?: SubscriptionError\n ): void {\n log('Track subscription failed:', { trackSid, participant, reason });\n }\n\n function findPublishedTrack(\n track: MediaStreamTrack,\n source: Track.Source,\n publications: Map<string, LocalTrackPublication>\n ): LocalTrackPublication | null {\n for (const [_, publication] of publications) {\n if (publication.source === source && publication.track) {\n const publishedMediaTrack = publication.track.mediaStreamTrack;\n if (publishedMediaTrack === track || publishedMediaTrack?.id === track.id) {\n return publication as LocalTrackPublication;\n }\n }\n }\n return null;\n }\n\n async function publishTrackStream(\n state: TrackPublishState,\n stream: MediaStream,\n getTracks: (stream: MediaStream) => MediaStreamTrack[],\n source: Track.Source,\n getPublications: () => Map<string, LocalTrackPublication>,\n unpublishFn: () => Promise<void>\n ): Promise<void> {\n if (!isConnected || !room) {\n log(`Room is not connected, cannot publish ${source} stream`);\n throw new Error('Room is not connected');\n }\n\n if (state.isPublishing) {\n log(`${source} publish already in progress, skipping`);\n return;\n }\n\n const tracks = getTracks(stream);\n if (tracks.length === 0) {\n throw new Error(`No ${source} track found in the provided MediaStream`);\n }\n\n const track = tracks[0];\n\n const existingPublication = findPublishedTrack(track, source, getPublications());\n if (existingPublication) {\n log(`${source} track is already published, skipping`, {\n trackId: track.id,\n publishedTrackId: existingPublication.track?.mediaStreamTrack?.id,\n });\n state.publication = existingPublication;\n return;\n }\n\n if (state.publication?.track) {\n const publishedMediaTrack = state.publication.track.mediaStreamTrack;\n if (publishedMediaTrack !== track && publishedMediaTrack?.id !== track.id) {\n log(`Unpublishing existing ${source} track before publishing new one`);\n await unpublishFn();\n }\n }\n\n log(`Publishing ${source} track from provided MediaStream`, { trackId: track.id });\n\n state.isPublishing = true;\n try {\n state.publication = await room.localParticipant.publishTrack(track, { source });\n log(`${source} track published successfully`, { trackSid: state.publication.trackSid });\n } catch (error) {\n log(`Failed to publish ${source} track:`, error);\n throw error;\n } finally {\n state.isPublishing = false;\n }\n }\n\n async function unpublishTrackStream(state: TrackPublishState, label: string): Promise<void> {\n if (!state.publication || !state.publication.track) {\n return;\n }\n\n try {\n if (room) {\n await room.localParticipant.unpublishTrack(state.publication.track, false);\n log(`${label} track unpublished`);\n }\n } catch (error) {\n log(`Error unpublishing ${label} track:`, error);\n } finally {\n state.publication = null;\n }\n }\n\n async function publishMicrophoneStream(stream: MediaStream): Promise<void> {\n return publishTrackStream(\n microphoneState,\n stream,\n s => s.getAudioTracks(),\n Track.Source.Microphone,\n () => room!.localParticipant.audioTrackPublications,\n unpublishMicrophoneStream\n );\n }\n\n async function unpublishMicrophoneStream(): Promise<void> {\n return unpublishTrackStream(microphoneState, 'Microphone');\n }\n\n async function replaceMicrophoneTrack(track: MediaStreamTrack): Promise<void> {\n if (!isConnected || !room) {\n log('Cannot replace microphone track: room is not connected');\n throw new Error('Room is not connected');\n }\n if (track.kind !== 'audio') {\n log('Cannot replace microphone track: not an audio track', { kind: track.kind });\n throw new Error('Microphone track must be an audio track');\n }\n if (microphoneState.isPublishing) {\n log('Cannot replace microphone track: publish in progress');\n throw new Error('Microphone publish in progress');\n }\n const pub = microphoneState.publication;\n if (!pub || !pub.track) {\n log('Cannot replace microphone track: no publication to replace');\n throw new Error('No microphone publication to replace');\n }\n try {\n microphoneState.isPublishing = true;\n await pub.track.replaceTrack(track);\n log('Microphone track replaced', { trackId: track.id, trackSid: pub.trackSid });\n } finally {\n microphoneState.isPublishing = false;\n }\n }\n\n async function publishCameraStream(stream: MediaStream): Promise<void> {\n return publishTrackStream(\n cameraState,\n stream,\n s => s.getVideoTracks(),\n Track.Source.Camera,\n () => room!.localParticipant.videoTrackPublications,\n unpublishCameraStream\n );\n }\n\n async function unpublishCameraStream(): Promise<void> {\n return unpublishTrackStream(cameraState, 'Camera');\n }\n\n function cleanMediaStream(): void {\n if (sharedMediaStream) {\n sharedMediaStream.getTracks().forEach(track => track.stop());\n sharedMediaStream = null;\n }\n }\n\n async function sendDataChannelMessage(topic: `${InternalDataChannelTopic}`, payload: string) {\n if (!isConnected || !room) {\n log('Room is not connected for sending messages');\n reportError(streamError());\n return;\n }\n\n try {\n await room.localParticipant.sendText(payload, { topic });\n log('Message sent successfully:', payload);\n } catch (error) {\n log('Failed to send message:', error);\n reportError(streamError());\n }\n }\n\n async function disconnect(reason: string) {\n if (trackSubscriptionTimeoutId) {\n clearTimeout(trackSubscriptionTimeoutId);\n trackSubscriptionTimeoutId = null;\n }\n\n audioStatsDetector?.destroy();\n audioStatsDetector = null;\n\n if (room) {\n callbacks.onConnectionStateChange?.(ConnectionState.Disconnecting, reason);\n await Promise.all([unpublishMicrophoneStream(), unpublishCameraStream()]);\n await room.disconnect();\n }\n cleanMediaStream();\n isConnected = false;\n hasEmittedConnected = false;\n if (pendingToolCalls.size > 0) {\n pendingToolCalls.clear();\n recomputeInterruptible();\n emitRunningToolCalls();\n }\n currentTurnId = null;\n callbacks.onAgentActivityStateChange?.(AgentActivityState.Idle);\n currentActivityState = AgentActivityState.Idle;\n }\n\n return {\n speak(payload: PayloadType<T>) {\n const message = typeof payload === 'string' ? payload : JSON.stringify(payload);\n return sendDataChannelMessage(InternalDataChannelTopic.Speak, message);\n },\n\n disconnect: () => disconnect('user:disconnect'),\n\n async reconnect() {\n if (room?.state === LiveKitConnectionState.Connected) {\n log('Room is already connected');\n return;\n }\n\n if (!room || !url || !token) {\n log('Cannot reconnect: missing room, URL or token');\n throw new Error('Cannot reconnect: session not available');\n }\n\n log('Reconnecting to LiveKit room, state:', room.state);\n hasEmittedConnected = false;\n streamEndReason = null;\n callbacks.onConnectionStateChange?.(ConnectionState.Connecting, 'user:reconnect');\n\n try {\n await room.connect(url, token);\n log('Room reconnected');\n isConnected = true;\n\n // If no remote participants, wait for agent to join\n if (room.remoteParticipants.size === 0) {\n log('Waiting for agent to join...');\n\n const agentJoined = await new Promise<boolean>(resolve => {\n const timeout = setTimeout(() => {\n room?.off(RoomEvent.ParticipantConnected, onParticipantConnected);\n resolve(false);\n }, 5000);\n\n const onParticipantConnected = () => {\n clearTimeout(timeout);\n room?.off(RoomEvent.ParticipantConnected, onParticipantConnected);\n resolve(true);\n };\n\n room?.on(RoomEvent.ParticipantConnected, onParticipantConnected);\n });\n\n if (!agentJoined) {\n log('Agent did not join within timeout');\n await room.disconnect();\n throw new Error('Agent did not rejoin the room');\n }\n\n log('Agent joined, reconnection successful');\n }\n } catch (error) {\n log('Failed to reconnect:', error);\n callbacks.onConnectionStateChange?.(ConnectionState.Fail, 'user:reconnect-failed');\n throw error;\n }\n },\n\n sendDataChannelMessage,\n publishMicrophoneStream,\n unpublishMicrophoneStream,\n replaceMicrophoneTrack,\n publishCameraStream,\n unpublishCameraStream,\n\n interrupt(type: InterruptOptions['type']) {\n // Skip text interrupts for V2/expressive: the orchestrator does not\n // cancel the in-flight LLM token stream, and an extra interrupt while\n // a previous one is still settling causes races.\n if (type === 'text') return false;\n\n // Nothing would reach the agent: sendDataChannelMessage drops the payload in this state.\n if (!isConnected || !room) return false;\n\n sendDataChannelMessage(InternalDataChannelTopic.Interrupt, '');\n\n return true;\n },\n\n registerRpcMethod(method: string, handler: (data: any) => Promise<string>) {\n room?.registerRpcMethod(method, wrapRpcHandler(RpcError, handler));\n },\n unregisterRpcMethod(method: string) {\n room?.unregisterRpcMethod(method);\n },\n\n sessionId,\n streamId: sessionId,\n streamType,\n interruptAvailable: interruptEnabled,\n // A getter, not a snapshot: currentInterruptible changes as blocking tool calls come and go.\n get isInterruptible() {\n return currentInterruptible;\n },\n };\n}\n\nexport type LiveKitStreamingManager<T extends CreateStreamOptions> = StreamingManager<T> & {\n reconnect(): Promise<void>;\n};\n"],"names":["getTimezone","getDevice","userAgent","platform","os","isMobile","getUserContextAttributes","attributes","timezone","device","createStreamApiV2","auth","host","agentId","onError","client","createClient","options","chatEventMap","StreamEvents","ChatProgress","TRACK_SUBSCRIPTION_TIMEOUT_MS","NO_RUNNING_TOOL_CALLS","livekitModule","importLiveKit","preloadLiveKit","connectivityQualityToState","ConnectivityState","streamError","message","StreamError","dataChannelDecoder","toStartedPayload","wire","toFinishedPayload","toErrorText","error","_a","toErrorPayload","wrapRpcHandler","RpcErrorClass","handler","data","handleInitError","log","callbacks","ConnectionState","_b","createLiveKitStreamingManager","sessionOptions","createStreamingLogger","Room","RoomEvent","LiveKitConnectionState","RpcError","Track","baseURL","analytics","room","isConnected","streamType","StreamType","sharedMediaStream","microphoneState","cameraState","videoStatsMonitor","audioStatsDetector","videoStreamingState","hasEmittedConnected","method","trackSubscriptionTimeoutId","currentActivityState","AgentActivityState","currentInterruptible","pendingToolCalls","currentTurnId","streamEndReason","streamApi","didApiUrl","sessionId","token","url","interruptEnabled","streamResponse","id","session_token","session_url","interrupt_enabled","reportError","handleConnectionStateChanged","handleConnectionQualityChanged","handleParticipantConnected","handleParticipantDisconnected","handleTrackSubscribed","handleTrackUnsubscribed","handleDataReceived","handleMediaDevicesError","handleTranscriptionReceived","handleEncryptionError","handleTrackSubscriptionFailed","_segments","participant","latencyTimestampTracker","setUserContextAttributes","toErrorAnalytics","disconnect","state","_c","_d","quality","handleVideoStarted","StreamingState","handleVideoStopped","report","track","publication","mediaStreamTrack","createAudioStatsDetector","sttLatency","serviceLatency","clientLatency","rttLatency","rtt","latency","networkLatency","createVideoStatsMonitor","noop","handleChatEvents","subject","eventName","handleToolEvents","payload","recomputeInterruptible","emitRunningToolCalls","ToolCallEvent","resolvePendingToolCall","callId","dropBlockingToolCallsForTurn","turnId","dropped","pending","next","call","handleVideoActivityState","handleVideoEvents","downstreamNetworkLatency","messageData","handleTranscriptionEvents","_","handleTurnStarted","_subject","handleTurnEnded","handleStreamEnded","dataChannelHandlers","_kind","topic","e","trackSid","reason","findPublishedTrack","source","publications","publishedMediaTrack","publishTrackStream","stream","getTracks","getPublications","unpublishFn","tracks","existingPublication","unpublishTrackStream","label","publishMicrophoneStream","s","unpublishMicrophoneStream","replaceMicrophoneTrack","pub","publishCameraStream","unpublishCameraStream","cleanMediaStream","sendDataChannelMessage","InternalDataChannelTopic","resolve","timeout","onParticipantConnected","type"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@d-id/client-sdk",
3
3
  "private": false,
4
- "version": "3.0.0-staging.420",
4
+ "version": "3.0.0-staging.423",
5
5
  "type": "module",
6
6
  "description": "Browser SDK for D-ID Agents: connect to an agent, stream its video and audio, chat and speak.",
7
7
  "keywords": [