@voxevolv/client 0.3.12 → 0.3.14
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 +18 -0
- package/dist/browser/index.js +7 -7
- package/dist/browser/index.js.map +3 -3
- package/dist/browser/index.js.sha384 +1 -1
- package/dist/browser/manifest.json +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +96 -30
- package/dist/index.js.map +3 -3
- package/dist/vendor/livekit-client.esm.mjs +66 -12
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n ConnectionState as LiveKitConnectionState,\n DataPacket_Kind,\n DisconnectReason,\n LocalAudioTrack,\n Room,\n RoomEvent,\n RpcError,\n type RpcInvocationData,\n Track,\n} from \"livekit-client\";\n\nimport {\n createClientMessage,\n CommandError,\n EventCursor,\n isCommandAckPayload,\n isCommandErrorPayload,\n isContextRejectedPayload,\n isContextUpdatePayload,\n isContextUpdatedPayload,\n isRealtimeEvent,\n type CommandAckPayload,\n type ClientMessage,\n type ContextUpdate,\n type ContextUpdatePayload,\n type ContextUpdatedPayload,\n type EventGap,\n type RealtimeEvent,\n} from \"./protocol.js\";\nimport { ContextDeliveryError, contextRetryDelay, ReplacementContextQueue } from \"./context-queue.js\";\nimport {\n ClientDiagnosticBuffer,\n DiagnosticDeliveryError,\n type ClientDiagnosticInput,\n type ClientDiagnosticReport,\n type DiagnosticEventType,\n type DiagnosticOperation,\n type RecoveryStage,\n} from \"./diagnostics.js\";\nimport { TranscriptStore, type TranscriptMessage } from \"./transcripts.js\";\nexport { TranscriptStore, type TranscriptMessage } from \"./transcripts.js\";\n\nexport {\n CommandError,\n EventCursor,\n createClientMessage,\n isCommandAckPayload,\n isCommandErrorPayload,\n isContextRejectedPayload,\n isContextUpdatePayload,\n isContextUpdatedPayload,\n isRealtimeEvent,\n} from \"./protocol.js\";\nexport type {\n ClientMessage,\n CommandAckPayload,\n CommandErrorPayload,\n ContextRejectedPayload,\n ContextUpdate,\n ContextUpdatePayload,\n ContextUpdatedPayload,\n EventGap,\n RealtimeEvent,\n} from \"./protocol.js\";\nexport {\n decodeAgentSnapshotPayload,\n decodeClientHelloPayload,\n decodeClientMessage,\n decodeCommandAckPayload,\n decodeCommandErrorPayload,\n decodeContextRejectedPayload,\n decodeContextUpdatePayload,\n decodeContextUpdatedPayload,\n decodeRealtimeEvent,\n} from \"./generated/protocol-codecs.js\";\n\nexport type ConnectionState =\n | \"idle\"\n | \"connecting\"\n | \"connected_not_ready\"\n | \"connected\"\n | \"reconnecting\"\n | \"resuming\"\n | \"disconnected\"\n | \"failed\";\n\nexport type ConnectionQuality =\n | \"unknown\"\n | \"excellent\"\n | \"good\"\n | \"poor\"\n | \"lost\";\n\nexport interface ConnectionCredentials {\n url: string;\n token: string;\n room_name: string;\n}\n\nexport interface SessionCredentials {\n id: string;\n connection: ConnectionCredentials;\n access_token: string;\n access_token_expires_at: string;\n}\n\nexport const SDK_VERSION = \"0.3.12\";\nconst CLIENT_HELLO_TIMEOUT_MS = 30_000;\nconst RECOVERY_BUFFER_STALL_MS = 5_000;\nconst RECOVERY_BUFFER_POLL_MS = 500;\nconst DIAGNOSTIC_REPORT_TIMEOUT_MS = 5_000;\nconst DEFAULT_STARTUP_ATTEMPTS: readonly ResolvedStartupAttempt[] = [\n { delayBeforeMs: 0, readyTimeoutMs: 15_000 },\n { delayBeforeMs: 1_000, readyTimeoutMs: 20_000 },\n { delayBeforeMs: 3_000, readyTimeoutMs: 50_000 },\n];\nconst DEFAULT_STARTUP_TIMEOUT_MS = 90_000;\n\nclass RecoveryDataChannelStalledError extends Error {\n constructor() {\n super(\"Recovery data channel stopped draining before the agent handshake completed\");\n this.name = \"RecoveryDataChannelStalledError\";\n }\n}\n\ntype Listener = (event: RealtimeEvent) => void;\ntype StateListener = (state: ConnectionState) => void;\ntype GapListener = (gap: EventGap) => void;\ntype ConnectionQualityListener = (quality: ConnectionQuality) => void;\ntype RecoveryListener = (event: RecoveryEvent) => void;\ntype StartupAttemptListener = (event: StartupAttemptEvent) => void;\nexport type FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\nexport type RemoteAudioTrackListener = (\n track: MediaStreamTrack,\n stream: MediaStream,\n) => void;\nexport interface TranscriptEvent {\n role: \"user\" | \"agent\";\n text: string;\n final: boolean;\n event: RealtimeEvent;\n}\nexport interface ToolCallEvent {\n name: string;\n callId: string;\n arguments: Record<string, unknown>;\n}\nexport interface ConnectOptions {\n microphone?: boolean;\n audioTrack?: MediaStreamTrack;\n readyTimeoutMs?: number;\n waitForRemoteAudio?: boolean;\n apiBase?: string;\n}\nexport interface AutoRejoinOptions {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n timeoutMs?: number;\n}\nexport interface StartupAttempt {\n readyTimeoutMs: number;\n delayBeforeMs?: number;\n}\nexport interface StartupRetryOptions {\n attempts?: readonly StartupAttempt[];\n timeoutMs?: number;\n}\nexport interface RealtimeSessionOptions {\n connect?: ConnectOptions;\n tools?: Record<string, ToolHandler>;\n fetch?: FetchLike;\n endEndpoint?: string;\n refreshCredentials?: () => Promise<SessionCredentials>;\n autoRejoin?: boolean | AutoRejoinOptions;\n /** Enabled by default. Set false for a single startup attempt. */\n startupRetry?: boolean | StartupRetryOptions;\n lifecycleCredentials?: RequestCredentials;\n}\nexport interface RealtimeSessionCreateOptions extends Omit<RealtimeSessionOptions, \"connect\"> {\n endpoint: string;\n apiBase: string;\n request?: Omit<RequestInit, \"method\">;\n microphone?: boolean;\n audioTrack?: MediaStreamTrack;\n readyTimeoutMs?: number;\n waitForRemoteAudio?: boolean;\n}\nexport interface EndOptions {\n endpoint?: string;\n request?: RequestInit;\n disconnect?: boolean;\n}\nexport interface AudioPlaybackBlockedEvent {\n error: unknown;\n element: HTMLMediaElement;\n track: MediaStreamTrack;\n}\nexport interface WaitForStateOptions {\n signal?: AbortSignal;\n}\nexport interface RecoveryEvent {\n status: \"started\" | \"succeeded\" | \"failed\";\n strategy: \"livekit\" | \"rejoin\";\n attempt: number;\n trigger: RecoveryTrigger;\n operation?: DiagnosticOperation;\n messageId?: string;\n contextKey?: string;\n timeoutMs?: number;\n error?: Error;\n}\nexport interface StartupAttemptEvent {\n status: \"started\" | \"succeeded\" | \"failed\";\n attempt: number;\n maxAttempts: number;\n readyTimeoutMs: number;\n error?: Error;\n}\n\nexport type RecoveryTrigger =\n | \"manual_rejoin\"\n | \"livekit_reconnecting\"\n | \"livekit_resume_failed\"\n | \"livekit_disconnected\"\n | \"agent_disconnected\"\n | \"worker_replaced\"\n | \"context_transfer_timeout\"\n | \"context_command_timeout\";\n\ntype ResolvedAutoRejoinOptions = {\n maxAttempts: number;\n baseDelayMs: number;\n maxDelayMs: number;\n timeoutMs: number;\n};\n\ntype ResolvedStartupAttempt = {\n readyTimeoutMs: number;\n delayBeforeMs: number;\n};\n\ntype ResolvedStartupRetryOptions = {\n attempts: readonly ResolvedStartupAttempt[];\n timeoutMs: number;\n};\n\ntype ActiveRecovery = {\n strategy: \"livekit\" | \"rejoin\";\n attempt: number;\n details: RecoveryDetails;\n};\n\ntype RecoveryDetails = {\n trigger: RecoveryTrigger;\n operation?: DiagnosticOperation;\n messageId?: string;\n contextKey?: string;\n timeoutMs?: number;\n};\n\ntype DisconnectMode = \"intentional\" | \"rejoin\" | \"connect_failure\" | null;\n\nexport class RealtimeSessionHttpError extends Error {\n readonly status: number;\n readonly code: string | null;\n readonly requestId: string | null;\n readonly details: unknown[];\n\n constructor(\n message: string,\n options: {\n status: number;\n code?: string | null;\n requestId?: string | null;\n details?: unknown[];\n },\n ) {\n super(message);\n this.name = \"RealtimeSessionHttpError\";\n this.status = options.status;\n this.code = options.code ?? null;\n this.requestId = options.requestId ?? null;\n this.details = options.details ?? [];\n }\n}\n\nclass SessionConfigurationError extends TypeError {}\n\nclass SessionErrorEventError extends Error {\n readonly retryable: boolean;\n\n constructor(event: RealtimeEvent) {\n const payload = event.payload as Record<string, unknown>;\n const message = typeof payload.message === \"string\"\n ? payload.message\n : \"VoxEvolv reported a session error\";\n super(message);\n this.name = \"SessionErrorEventError\";\n this.retryable = payload.retryable === true;\n }\n}\ntype PendingCommand = {\n commandType: string;\n message: ClientMessage;\n startedAt: number;\n contextKey?: string;\n payloadBytes?: number;\n retryCount: number;\n publishQueued: boolean;\n resolve: (payload: CommandAckPayload) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof globalThis.setTimeout>;\n retry?: ReturnType<typeof globalThis.setTimeout>;\n settled: Promise<void>;\n markSettled: () => void;\n retryTransfer?: () => Promise<void>;\n transferRetrying: boolean;\n transferRetryRequested: boolean;\n transferSettled?: Promise<void>;\n};\ntype ContextTransfer = {\n payload: ContextUpdatePayload;\n resend?: () => Promise<void>;\n};\nexport type ToolHandler = (\n arguments_: Record<string, unknown>,\n context: { callId: string },\n) => unknown | Promise<unknown>;\n\nexport class RealtimeSession {\n readonly id: string;\n readonly room: Room;\n private accessToken: string;\n private credentials: ConnectionCredentials;\n private stateValue: ConnectionState = \"idle\";\n private listeners = new Set<Listener>();\n private stateListeners = new Set<StateListener>();\n private gapListeners = new Set<GapListener>();\n private connectionQualityListeners = new Set<ConnectionQualityListener>();\n private recoveryListeners = new Set<RecoveryListener>();\n private startupAttemptListeners = new Set<StartupAttemptListener>();\n private remoteAudioTrackListeners = new Set<RemoteAudioTrackListener>();\n private remoteAudioTrackUnsubscribedListeners = new Set<RemoteAudioTrackListener>();\n private readyListeners = new Set<(event: RealtimeEvent) => void>();\n private userTranscriptListeners = new Set<(event: TranscriptEvent) => void>();\n private agentTranscriptListeners = new Set<(event: TranscriptEvent) => void>();\n private transcriptListeners = new Set<(message: TranscriptMessage) => void>();\n private transcriptStore = new TranscriptStore();\n private errorListeners = new Set<(event: RealtimeEvent) => void>();\n private endedListeners = new Set<(event: RealtimeEvent) => void>();\n private toolCallListeners = new Set<(event: ToolCallEvent) => void>();\n private audioPlaybackBlockedListeners = new Set<(event: AudioPlaybackBlockedEvent) => void>();\n private remoteAudioStreams = new WeakMap<object, MediaStream>();\n private outputMediaStream: MediaStream | null = null;\n private remoteAudioTrackResolve: (() => void) | null = null;\n private readonly cursor = new EventCursor();\n private connectionId = `conn_${Math.random().toString(36).slice(2)}_${Date.now().toString(36)}`;\n private clientSeq = 0;\n private lastHelloMessageId: string | null = null;\n private reconnectStartedAt: number | null = null;\n private pendingReconnect: {\n started_at: string;\n recovered_at: string;\n duration_ms: number;\n } | null = null;\n private agentReady = false;\n private agentStreamId: string | null = null;\n private contextGeneration = 0;\n private readonly replacementContext = new ReplacementContextQueue(\n (update, timeoutMs) => this.sendContextUpdate(update, timeoutMs),\n );\n private readyResolve: (() => void) | null = null;\n private replayPromise: Promise<void> | null = null;\n private pendingCommands = new Map<string, PendingCommand>();\n private commandPublishTail: Promise<void> = Promise.resolve();\n private toolHandlers = new Map<string, ToolHandler>();\n private apiBase = \"/v1\";\n private hasConnectedValue = false;\n private sessionEnded = false;\n private pendingEndEvent: RealtimeEvent | null = null;\n private agentDisconnected = false;\n private terminalSessionError: SessionErrorEventError | null = null;\n private endNotificationDelivered = false;\n private disconnectMode: DisconnectMode = null;\n private activeRecovery: ActiveRecovery | null = null;\n private recoveryStartedAt: number | null = null;\n private livekitResumeController: AbortController | null = null;\n private autoRejoinPromise: Promise<void> | null = null;\n private autoRejoinController: AbortController | null = null;\n private manualRejoinController: AbortController | null = null;\n private startupConnectController: AbortController | null = null;\n private startupAttemptController: AbortController | null = null;\n private useManagedMicrophone = true;\n private microphoneEnabled = true;\n private applicationAudioTrack: MediaStreamTrack | null = null;\n private localApplicationAudioTrack: LocalAudioTrack | null = null;\n private readonly connectDefaults: ConnectOptions;\n private recoveryReadiness: Required<Pick<ConnectOptions, \"readyTimeoutMs\" | \"waitForRemoteAudio\">>;\n private credentialRefreshGeneration = 0;\n private readonly fetcher: FetchLike;\n private readonly endEndpoint: string | null;\n private readonly refreshCredentialsCallback: (() => Promise<SessionCredentials>) | null;\n private readonly autoRejoinOptions: ResolvedAutoRejoinOptions | null;\n private readonly startupRetryOptions: ResolvedStartupRetryOptions | null;\n private readonly lifecycleCredentials: RequestCredentials;\n private readonly diagnostics = new ClientDiagnosticBuffer({ sdkVersion: SDK_VERSION });\n private activeContextTransfers = 0;\n private activeContextBytes = 0;\n private diagnosticLoopTimer: ReturnType<typeof setInterval> | undefined;\n private diagnosticLoopExpectedAt = 0;\n private diagnosticLoopDelayMs: number | undefined;\n private readonly diagnosticReportTimeoutMs = DIAGNOSTIC_REPORT_TIMEOUT_MS;\n private readonly onDiagnosticVisibilityChange = (): void => {\n if (globalThis.document?.visibilityState === \"hidden\") this.flushDiagnostics(\"page_hidden\");\n };\n\n constructor(credentials: SessionCredentials, options: RealtimeSessionOptions = {}) {\n validateSessionCredentials(credentials);\n this.id = credentials.id;\n this.accessToken = credentials.access_token;\n this.credentials = credentials.connection;\n this.connectDefaults = options.connect?.apiBase === undefined\n ? (options.connect ?? {})\n : { ...options.connect, apiBase: normalizeApiBase(options.connect.apiBase) };\n this.apiBase = this.connectDefaults.apiBase ?? this.apiBase;\n this.recoveryReadiness = {\n readyTimeoutMs: this.connectDefaults.readyTimeoutMs ?? 15_000,\n waitForRemoteAudio: this.connectDefaults.waitForRemoteAudio ?? true,\n };\n this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.endEndpoint = options.endEndpoint ?? null;\n this.refreshCredentialsCallback = options.refreshCredentials ?? null;\n this.autoRejoinOptions = resolveAutoRejoinOptions(options.autoRejoin);\n this.startupRetryOptions = resolveStartupRetryOptions(options.startupRetry);\n this.lifecycleCredentials = options.lifecycleCredentials ?? \"same-origin\";\n this.room = new Room({ adaptiveStream: true, dynacast: true });\n for (const [name, handler] of Object.entries(options.tools ?? {})) {\n this.registerTool(name, handler);\n }\n this.room.registerRpcMethod(\"voxevolv.tool.invoke\", (invocation) => this.invokeBrowserTool(invocation));\n this.room.registerRpcMethod(\"voxevolv.diagnostics.flush\", async (invocation) => {\n const payload = JSON.parse(invocation.payload);\n if (typeof payload?.call_id !== \"string\" || payload.call_id.length > 200) {\n throw new RpcError(1500, \"Invalid diagnostic request\");\n }\n this.recordDiagnostic({\n operation: \"tool_rpc\", status: \"started\", stage: \"flush_requested\",\n call_id: payload.call_id, rpc_request_id: invocation.requestId,\n });\n // HTTP delivery has its own retry/receipt handling; never await it on the RPC channel.\n this.flushDiagnostics(\"tool_rpc_worker_request\");\n return \"{}\";\n });\n this.bindRoomEvents();\n }\n\n private async invokeBrowserTool(invocation: RpcInvocationData): Promise<string> {\n const receivedAt = performance.now();\n let callId: string | undefined;\n let toolName: string | undefined;\n let slowTimer: ReturnType<typeof setTimeout> | undefined;\n const record = (entry: Partial<ClientDiagnosticInput>) => this.recordDiagnostic({\n operation: \"tool_rpc\", status: \"started\", rpc_request_id: invocation.requestId,\n call_id: callId, tool_name: toolName,\n duration_ms: performance.now() - receivedAt, ...entry,\n });\n record({ stage: \"received\" });\n try {\n let payload: { name?: unknown; call_id?: unknown; arguments?: unknown };\n try {\n payload = JSON.parse(invocation.payload) as typeof payload;\n } catch (error) {\n throw new RpcError(1500, \"Tool invocation payload was not valid JSON\", undefined, { cause: error });\n }\n if (typeof payload?.name !== \"string\") {\n throw new RpcError(1500, \"Tool invocation did not include a valid name\");\n }\n toolName = payload.name;\n callId = typeof payload.call_id === \"string\" ? payload.call_id : invocation.requestId;\n const handler = this.toolHandlers.get(toolName);\n if (!handler) throw new RpcError(1500, `No browser handler is registered for ${toolName}`);\n if (!payload.arguments || typeof payload.arguments !== \"object\" || Array.isArray(payload.arguments)) {\n throw new RpcError(1500, \"Tool invocation arguments must be an object\");\n }\n const arguments_ = payload.arguments as Record<string, unknown>;\n this.notifyListeners(this.toolCallListeners, { name: toolName, callId, arguments: arguments_ });\n record({ stage: \"handler_started\" });\n this.flushDiagnostics(\"tool_rpc_received\");\n slowTimer = globalThis.setTimeout(() => {\n record({ stage: \"handler_started\", reason: \"handler_slow\" });\n this.flushDiagnostics(\"tool_rpc_slow\");\n }, 2_000);\n let response: string;\n try {\n const result = await handler(arguments_, { callId });\n response = JSON.stringify(result ?? null);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Browser tool handler failed\";\n throw new RpcError(1500, message, undefined, { cause: error });\n }\n // LiveKit sends the response after this callback returns. This is readiness,\n // not proof of a network send or acknowledgement by the worker.\n record({ stage: \"response_ready\", status: \"succeeded\" });\n return response;\n } catch (error) {\n record({ status: \"failed\", rpc_error_code: error instanceof RpcError ? error.code : undefined });\n throw error;\n } finally {\n globalThis.clearTimeout(slowTimer);\n this.flushDiagnostics(\"tool_rpc_finished\");\n }\n }\n\n static async create(options: RealtimeSessionCreateOptions): Promise<RealtimeSession> {\n if (\"connect\" in options) {\n throw new TypeError(\n \"RealtimeSession.create() accepts apiBase and media options at the top level, not in connect\",\n );\n }\n const {\n endpoint,\n request,\n microphone,\n audioTrack,\n readyTimeoutMs,\n waitForRemoteAudio,\n apiBase,\n ...sessionOptions\n } = options;\n if (!endpoint) throw new TypeError(\"endpoint is required\");\n if (!apiBase) {\n throw new TypeError(\n \"apiBase is required so rejoin, replay, and end use the intended VoxEvolv API or application proxy\",\n );\n }\n const normalizedApiBase = normalizeApiBase(apiBase);\n const fetcher = sessionOptions.fetch ?? globalThis.fetch.bind(globalThis);\n const response = await fetcher(endpoint, { ...request, method: \"POST\" });\n if (!response.ok) throw await httpError(response, \"Could not create realtime session\");\n const credentials = await response.json() as SessionCredentials;\n return new RealtimeSession(credentials, {\n ...sessionOptions,\n fetch: fetcher,\n connect: { microphone, audioTrack, readyTimeoutMs, waitForRemoteAudio, apiBase: normalizedApiBase },\n });\n }\n\n get state(): ConnectionState {\n return this.stateValue;\n }\n\n get hasConnectedBefore(): boolean {\n return this.hasConnectedValue;\n }\n\n /**\n * Stable stream holding the agent's current remote audio tracks. The stream\n * object never changes across track arrival, reconnects, or rejoin; tracks\n * are added and removed as the room subscribes and unsubscribes them.\n */\n get outputStream(): MediaStream {\n this.outputMediaStream ??= new MediaStream();\n return this.outputMediaStream;\n }\n\n onEvent(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n onStateChange(listener: StateListener): () => void {\n this.stateListeners.add(listener);\n this.notifyListeners(new Set([listener]), this.stateValue);\n return () => this.stateListeners.delete(listener);\n }\n\n onProtocolGap(listener: GapListener): () => void {\n this.gapListeners.add(listener);\n return () => this.gapListeners.delete(listener);\n }\n\n onConnectionQuality(listener: ConnectionQualityListener): () => void {\n this.connectionQualityListeners.add(listener);\n this.notifyListeners(\n new Set([listener]),\n this.room.localParticipant.connectionQuality as ConnectionQuality,\n );\n return () => this.connectionQualityListeners.delete(listener);\n }\n\n onRecovery(listener: RecoveryListener): () => void {\n this.recoveryListeners.add(listener);\n return () => this.recoveryListeners.delete(listener);\n }\n\n onStartupAttempt(listener: StartupAttemptListener): () => void {\n this.startupAttemptListeners.add(listener);\n return () => this.startupAttemptListeners.delete(listener);\n }\n\n waitForState(\n states: readonly ConnectionState[],\n timeoutMs: number,\n options: WaitForStateOptions = {},\n ): Promise<ConnectionState> {\n if (!states.length) throw new TypeError(\"states must contain at least one connection state\");\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new TypeError(\"timeoutMs must be a non-negative finite number\");\n }\n const targets = new Set(states);\n if (targets.has(this.stateValue)) return Promise.resolve(this.stateValue);\n if (options.signal?.aborted) {\n return Promise.reject(options.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n const finish = (state: ConnectionState | null, error?: unknown) => {\n if (settled) return;\n settled = true;\n globalThis.clearTimeout(timeout);\n this.stateListeners.delete(onState);\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (error !== undefined) {\n reject(error);\n } else if (state !== null) {\n resolve(state);\n }\n };\n const onState = (state: ConnectionState) => {\n if (targets.has(state)) finish(state);\n };\n const onAbort = () => {\n finish(null, options.signal?.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n const timeout = globalThis.setTimeout(() => {\n finish(\n null,\n new Error(`Session did not reach ${states.join(\" or \")} within ${timeoutMs}ms`),\n );\n }, timeoutMs);\n this.stateListeners.add(onState);\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n onRemoteAudioTrack(listener: RemoteAudioTrackListener): () => void {\n this.remoteAudioTrackListeners.add(listener);\n return () => this.remoteAudioTrackListeners.delete(listener);\n }\n\n onRemoteAudioTrackUnsubscribed(listener: RemoteAudioTrackListener): () => void {\n this.remoteAudioTrackUnsubscribedListeners.add(listener);\n return () => this.remoteAudioTrackUnsubscribedListeners.delete(listener);\n }\n\n onReady(listener: (event: RealtimeEvent) => void): () => void {\n this.readyListeners.add(listener);\n return () => this.readyListeners.delete(listener);\n }\n\n onUserTranscript(listener: (event: TranscriptEvent) => void): () => void {\n this.userTranscriptListeners.add(listener);\n return () => this.userTranscriptListeners.delete(listener);\n }\n\n onAgentTranscript(listener: (event: TranscriptEvent) => void): () => void {\n this.agentTranscriptListeners.add(listener);\n return () => this.agentTranscriptListeners.delete(listener);\n }\n\n /** Latest message snapshots, retained across transport recovery and replay. */\n get transcript(): readonly TranscriptMessage[] {\n return this.transcriptStore.snapshot;\n }\n\n onTranscriptUpdated(listener: (message: TranscriptMessage) => void): () => void {\n this.transcriptListeners.add(listener);\n return () => this.transcriptListeners.delete(listener);\n }\n\n onError(listener: (event: RealtimeEvent) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n onEnded(listener: (event: RealtimeEvent) => void): () => void {\n this.endedListeners.add(listener);\n return () => this.endedListeners.delete(listener);\n }\n\n onToolCall(listener: (event: ToolCallEvent) => void): () => void {\n this.toolCallListeners.add(listener);\n return () => this.toolCallListeners.delete(listener);\n }\n\n onAudioPlaybackBlocked(listener: (event: AudioPlaybackBlockedEvent) => void): () => void {\n this.audioPlaybackBlockedListeners.add(listener);\n return () => this.audioPlaybackBlockedListeners.delete(listener);\n }\n\n registerTool(name: string, handler: ToolHandler): () => void {\n if (\n [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\", \"resuming\"]\n .includes(this.stateValue)\n ) {\n throw new Error(\"Browser tools must be registered before connect()\");\n }\n if (!/^[a-z][a-z0-9_]{0,79}$/.test(name)) {\n throw new TypeError(\"Tool name must be lowercase letters, numbers, and underscores\");\n }\n if (this.toolHandlers.has(name)) throw new TypeError(`Tool ${name} is already registered`);\n this.toolHandlers.set(name, handler);\n return () => {\n if (this.toolHandlers.get(name) === handler) this.toolHandlers.delete(name);\n };\n }\n\n async connect(options: ConnectOptions = {}): Promise<void> {\n if (this.startupConnectController || this.manualRejoinController) {\n throw new Error(\"A session connection attempt is already in progress\");\n }\n if (\n [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\", \"resuming\"]\n .includes(this.stateValue)\n ) {\n throw new Error(`Cannot connect while session is ${this.stateValue}`);\n }\n this.cancelRecovery();\n const controller = new AbortController();\n this.startupConnectController = controller;\n this.credentialRefreshGeneration += 1;\n const resolved = { ...this.connectDefaults, ...options };\n // Keep caller preferences separate from temporary startup-attempt budgets.\n this.recoveryReadiness = {\n readyTimeoutMs: resolved.readyTimeoutMs ?? 15_000,\n waitForRemoteAudio: resolved.waitForRemoteAudio ?? true,\n };\n this.microphoneEnabled = resolved.audioTrack\n ? resolved.audioTrack.enabled !== false\n : resolved.microphone ?? true;\n this.setState(\"connecting\");\n try {\n if (this.startupRetryOptions) {\n await this.connectWithStartupRetry(options, controller);\n } else {\n this.startupAttemptController = controller;\n await this.connectWithMode(options, false, controller.signal, false);\n }\n } catch (error) {\n if (this.startupConnectController === controller && this.terminalSessionError) {\n this.sessionEnded = true;\n this.setState(\"failed\");\n } else if (this.startupConnectController === controller && !this.sessionEnded) {\n this.setState(\"failed\");\n }\n throw error;\n } finally {\n if (this.startupAttemptController === controller) {\n this.startupAttemptController = null;\n }\n if (this.startupConnectController === controller) {\n this.startupConnectController = null;\n }\n }\n }\n\n private async connectWithStartupRetry(\n options: ConnectOptions,\n controller: AbortController,\n ): Promise<void> {\n const startupOptions = this.startupRetryOptions;\n if (!startupOptions) return;\n const startupStartedAt = performance.now();\n const timeout = globalThis.setTimeout(() => {\n controller.abort(new Error(\n `Session startup did not complete within ${startupOptions.timeoutMs}ms`,\n ));\n }, startupOptions.timeoutMs);\n let lastError = new Error(\"Session startup failed\");\n let startupRegistered = this.hasConnectedValue;\n this.apiBase = normalizeApiBase(options.apiBase ?? this.connectDefaults.apiBase ?? this.apiBase);\n\n try {\n for (const [index, attempt] of startupOptions.attempts.entries()) {\n const attemptNumber = index + 1;\n if (attempt.delayBeforeMs > 0) {\n this.setState(\"connecting\");\n await abortableDelay(attempt.delayBeforeMs, controller.signal);\n }\n throwIfAborted(controller.signal);\n\n const attemptController = createLinkedAbortController(controller.signal);\n this.startupAttemptController = attemptController;\n this.notifyStartupAttempt(\"started\", attemptNumber, attempt.readyTimeoutMs);\n try {\n if (!startupRegistered) {\n const remainingMs = startupOptions.timeoutMs - (performance.now() - startupStartedAt);\n await this.registerStartupRecovery(remainingMs, attemptController.signal);\n startupRegistered = true;\n }\n throwIfAborted(attemptController.signal);\n if (index === 0) {\n await this.connectWithMode(\n { ...options, readyTimeoutMs: attempt.readyTimeoutMs },\n false,\n attemptController.signal,\n false,\n );\n } else {\n await this.performRejoin(this.apiBase, {\n signal: attemptController.signal,\n recovering: false,\n connect: { ...options, readyTimeoutMs: attempt.readyTimeoutMs },\n markFailureTerminal: false,\n });\n }\n throwIfAborted(controller.signal);\n this.notifyStartupAttempt(\"succeeded\", attemptNumber, attempt.readyTimeoutMs);\n return;\n } catch (error) {\n lastError = toError(error);\n this.notifyStartupAttempt(\"failed\", attemptNumber, attempt.readyTimeoutMs, lastError);\n if (controller.signal.aborted) throw abortError(controller.signal);\n if (isTerminalStartupError(error) || attemptNumber === startupOptions.attempts.length) {\n throw error;\n }\n this.setState(\"connecting\");\n } finally {\n if (this.startupAttemptController === attemptController) {\n this.startupAttemptController = null;\n }\n }\n }\n throw lastError;\n } finally {\n globalThis.clearTimeout(timeout);\n }\n }\n\n private async registerStartupRecovery(timeoutMs: number, signal: AbortSignal): Promise<void> {\n const reserveMs = Math.min(5_000, timeoutMs / 10);\n const controller = createLinkedAbortController(signal);\n const requestTimeout = globalThis.setTimeout(() => {\n controller.abort(new Error(\"Startup registration timed out\"));\n }, Math.max(1, reserveMs));\n try {\n // Leave room for registration latency and final readiness before the\n // browser's existing overall deadline. Rejoins never renew this window.\n const send = () => raceWithAbort(this.fetcher(`${this.apiBase}/sessions/${this.id}/startup`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.accessToken}`, \"Content-Type\": \"application/json\" },\n credentials: this.lifecycleCredentials,\n body: JSON.stringify({ timeout_ms: Math.max(1, Math.floor(Math.min(timeoutMs - reserveMs, 85_000))) }),\n signal: controller.signal,\n }), controller.signal);\n let response = await send();\n if (response.status === 401 && this.refreshCredentialsCallback) {\n await this.refreshCredentials(controller.signal);\n response = await send();\n }\n if (!response.ok) throw await httpError(response, \"Could not register session startup\");\n const body = await raceWithAbort(response.json(), controller.signal) as { remaining_ms?: number };\n if (typeof body.remaining_ms !== \"number\" || body.remaining_ms <= 0) {\n throw new Error(\"Session startup window has expired\");\n }\n } finally {\n globalThis.clearTimeout(requestTimeout);\n }\n }\n\n private notifyStartupAttempt(\n status: StartupAttemptEvent[\"status\"],\n attempt: number,\n readyTimeoutMs: number,\n error?: Error,\n ): void {\n const maxAttempts = this.startupRetryOptions?.attempts.length ?? 1;\n this.notifyListeners(this.startupAttemptListeners, {\n status,\n attempt,\n maxAttempts,\n readyTimeoutMs,\n ...(error ? { error } : {}),\n });\n }\n\n private async connectWithMode(\n options: ConnectOptions,\n recovering: boolean,\n signal?: AbortSignal,\n markFailureTerminal = true,\n ): Promise<void> {\n throwIfAborted(signal);\n const blockedStates: ConnectionState[] = recovering\n ? [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\"]\n : [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\", \"resuming\"];\n const continuingStartupRetry = (\n !recovering\n && !markFailureTerminal\n && this.stateValue === \"connecting\"\n );\n if (blockedStates.includes(this.stateValue) && !continuingStartupRetry) {\n throw new Error(`Cannot connect while session is ${this.stateValue}`);\n }\n const generation = this.contextGeneration;\n const resolved = { ...this.connectDefaults, ...options };\n const audioTrack = resolved.audioTrack ?? null;\n const microphone = resolved.microphone ?? audioTrack === null;\n const readyTimeoutMs = resolved.readyTimeoutMs ?? 15_000;\n const waitForRemoteAudio = resolved.waitForRemoteAudio ?? true;\n const apiBase = normalizeApiBase(resolved.apiBase ?? this.apiBase);\n this.validateAudioOptions(microphone, audioTrack);\n this.useManagedMicrophone = microphone;\n this.applicationAudioTrack = audioTrack;\n if (!recovering) {\n this.sessionEnded = false;\n this.agentStreamId = null;\n this.reconnectStartedAt = null;\n this.pendingEndEvent = null;\n this.agentDisconnected = false;\n this.terminalSessionError = null;\n this.endNotificationDelivered = false;\n this.setState(\"connecting\");\n } else {\n this.setState(\"resuming\");\n }\n this.apiBase = apiBase;\n this.agentReady = false;\n try {\n await this.measureRecoveryStage(\n \"room_connect\", () => this.connectRoom(signal, recovering), recovering,\n );\n throwIfAborted(signal);\n if (audioTrack) {\n await raceWithAbort(this.publishApplicationAudioTrack(audioTrack), signal);\n } else if (microphone) {\n await raceWithAbort(\n this.room.localParticipant.setMicrophoneEnabled(this.microphoneEnabled),\n signal,\n );\n }\n throwIfAborted(signal);\n this.setState(recovering ? \"resuming\" : \"connected_not_ready\");\n await this.measureRecoveryStage(\"hello\", () => (\n recovering ? this.sendRecoveryHello(signal) : raceWithAbort(this.sendHello(), signal)\n ), recovering);\n const readyDeadline = Date.now() + readyTimeoutMs;\n await this.measureRecoveryStage(\n \"agent_ready\", () => this.waitForAgentReady(readyTimeoutMs, signal), recovering,\n );\n if (waitForRemoteAudio) {\n await this.measureRecoveryStage(\n \"remote_audio\", () => this.waitForRemoteAudioTrack(readyDeadline, signal), recovering,\n );\n }\n throwIfAborted(signal);\n if (this.sessionEnded || generation !== this.contextGeneration) {\n throw new Error(\"Connection restoration interrupted\");\n }\n this.resumeContextDelivery(recovering);\n throwIfAborted(signal);\n if (this.sessionEnded || generation !== this.contextGeneration) {\n throw new Error(\"Connection restoration interrupted\");\n }\n this.hasConnectedValue = true;\n this.setState(\"connected\");\n } catch (error) {\n if (signal?.aborted) this.rejectPendingCommands(toError(abortError(signal)));\n this.disconnectMode = recovering ? \"rejoin\" : \"connect_failure\";\n try {\n await this.room.disconnect();\n } catch {\n // Preserve the original connection/readiness failure.\n } finally {\n this.disconnectMode = null;\n }\n if (!recovering && markFailureTerminal) this.setState(\"failed\");\n throw error;\n }\n }\n\n private connectRoom(signal: AbortSignal | undefined, recovering: boolean): Promise<void> {\n throwIfAborted(signal);\n const connection = this.room.connect(this.credentials.url, this.credentials.token);\n if (!signal) return connection;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const resolveOnce = () => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n const rejectOnce = (error: unknown) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n reject(error);\n };\n const onAbort = () => {\n this.disconnectMode = recovering ? \"rejoin\" : \"connect_failure\";\n void this.room.disconnect().catch(() => {});\n rejectOnce(abortError(signal));\n };\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n connection.then(resolveOnce, rejectOnce);\n });\n }\n\n async rejoin(apiBase = this.apiBase): Promise<void> {\n if (this.startupConnectController || this.manualRejoinController) {\n throw new Error(\"A session connection attempt is already in progress\");\n }\n if (this.sessionEnded) {\n throw this.terminalSessionError ?? new Error(\"Cannot rejoin a session that has ended\");\n }\n if ([\"connecting\", \"connected_not_ready\", \"reconnecting\", \"resuming\"].includes(this.stateValue)) {\n throw new Error(`Cannot rejoin while session is ${this.stateValue}`);\n }\n this.cancelRecovery();\n const normalizedApiBase = normalizeApiBase(apiBase);\n const recovering = this.hasConnectedValue;\n const controller = new AbortController();\n this.manualRejoinController = controller;\n if (recovering) {\n this.beginRecovery(\"rejoin\", 1, { trigger: \"manual_rejoin\" });\n this.setState(\"resuming\");\n }\n try {\n await this.performRejoin(normalizedApiBase, { recovering, signal: controller.signal });\n if (this.sessionEnded) return;\n if (recovering) this.completeRecovery();\n } catch (error) {\n if (controller.signal.aborted && !this.terminalSessionError) return;\n const normalizedError = toError(error);\n if (recovering) this.failRecovery(normalizedError);\n this.setState(\"failed\");\n throw error;\n } finally {\n if (this.manualRejoinController === controller) {\n this.manualRejoinController = null;\n }\n }\n }\n\n private async performRejoin(\n apiBase: string,\n options: {\n signal?: AbortSignal;\n recovering?: boolean;\n connect?: ConnectOptions;\n markFailureTerminal?: boolean;\n } = {},\n ): Promise<void> {\n const {\n signal,\n recovering = true,\n connect,\n markFailureTerminal = true,\n } = options;\n this.contextGeneration += 1;\n this.replacementContext.pause();\n this.rejectPendingCommands(new Error(\"Restoring the session\"));\n let response = await this.fetchRoomToken(apiBase, signal, recovering);\n if (response.status === 401 && this.refreshCredentialsCallback) {\n await this.refreshCredentials(signal);\n throwIfAborted(signal);\n response = await this.fetchRoomToken(apiBase, signal, recovering);\n }\n // A live ending may arrive while token renewal is in flight.\n if (this.sessionEnded) {\n if (this.terminalSessionError) throw this.terminalSessionError;\n return;\n }\n if (!response.ok) {\n if (response.status === 409 && await this.recoverSessionEnd(apiBase, signal)) return;\n throw await raceWithAbort(httpError(response, \"Could not renew room token\"), signal);\n }\n const payload = (await raceWithAbort(response.json(), signal)) as {\n connection: ConnectionCredentials;\n };\n throwIfAborted(signal);\n this.credentials = payload.connection;\n if (this.room.state !== LiveKitConnectionState.Disconnected) {\n this.disconnectMode = \"rejoin\";\n try {\n await this.measureRecoveryStage(\n \"room_disconnect\", () => raceWithAbort(this.room.disconnect(), signal), recovering,\n );\n } finally {\n this.disconnectMode = null;\n }\n }\n throwIfAborted(signal);\n if (recovering && this.reconnectStartedAt !== null) {\n this.pendingReconnect = {\n started_at: new Date(this.reconnectStartedAt).toISOString(),\n recovered_at: new Date().toISOString(),\n duration_ms: Date.now() - this.reconnectStartedAt,\n };\n }\n // Startup retries resolve the original caller options with constructor defaults.\n // A later rejoin restores the audio settings saved by the previous connection.\n const connectionOptions = connect ?? {\n ...this.recoveryReadiness,\n microphone: this.useManagedMicrophone,\n ...(this.applicationAudioTrack ? { audioTrack: this.applicationAudioTrack } : {}),\n };\n await this.connectWithMode({ ...connectionOptions, apiBase }, recovering, signal, markFailureTerminal);\n }\n\n async setMicrophoneEnabled(enabled: boolean): Promise<void> {\n // Recovery must see the user's latest intent while the media operation waits.\n this.microphoneEnabled = enabled;\n if (this.applicationAudioTrack) {\n // The room may not know this track yet while publication is pending.\n const track = this.localApplicationAudioTrack;\n if (enabled) await track?.unmute();\n else await track?.mute();\n return;\n }\n await this.room.localParticipant.setMicrophoneEnabled(enabled);\n }\n\n async sendCommand<T extends Record<string, unknown>>(\n type: string,\n payload: T,\n timeoutMs = 10_000,\n ): Promise<CommandAckPayload> {\n const message = createClientMessage(\n this.connectionId,\n ++this.clientSeq,\n type,\n payload,\n );\n return this.sendTrackedCommand(message, timeoutMs);\n }\n\n async updateContext(\n update: ContextUpdate,\n timeoutMs = 20_000,\n ): Promise<ContextUpdatedPayload> {\n if (this.sessionEnded || [\"failed\", \"disconnected\"].includes(this.stateValue)) {\n throw new Error(\"Cannot update context while the session is inactive\");\n }\n if (update.mode === \"replace\") return this.replacementContext.submit(update, timeoutMs);\n if (this.activeRecovery) throw new Error(\"Cannot append context during recovery\");\n return this.sendContextUpdate(update, timeoutMs);\n }\n\n private async sendContextUpdate(update: ContextUpdate, timeoutMs: number): Promise<ContextUpdatedPayload> {\n const generation = this.contextGeneration;\n const payloadBytes = contextUpdateBytes(update);\n const transferStartedAt = Date.now();\n let transferTimedOut = false;\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"started\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n });\n this.activeContextTransfers += 1;\n this.activeContextBytes += payloadBytes;\n const uploading = (\"image\" in update ? this.uploadImageContext(update) : this.uploadTextContext(update))\n .finally(() => {\n this.activeContextTransfers -= 1;\n this.activeContextBytes -= payloadBytes;\n });\n const transferSettled = uploading.then(() => {}, () => {});\n let transferTimeout: ReturnType<typeof setTimeout> | undefined;\n const transferExpired = new Promise<never>((_resolve, reject) => {\n transferTimeout = globalThis.setTimeout(() => {\n transferTimedOut = true;\n const error = new ContextDeliveryError(`Context transfer timed out after ${timeoutMs}ms`, {\n retryAfter: transferSettled,\n });\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"timed_out\",\n reason: \"context_transfer_timeout\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n duration_ms: Date.now() - transferStartedAt,\n timeout_ms: timeoutMs,\n });\n this.flushDiagnostics(\"context_transfer_timeout\");\n reject(error);\n }, timeoutMs);\n });\n let transfer: ContextTransfer;\n try {\n transfer = await Promise.race([\n uploading,\n transferExpired,\n ]);\n } catch (error) {\n if (!transferTimedOut) {\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"failed\",\n reason: \"context_transfer_failed\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n duration_ms: Date.now() - transferStartedAt,\n });\n this.flushDiagnostics(\"command_failed\");\n }\n if (error instanceof TypeError || error instanceof ContextDeliveryError) throw error;\n throw new ContextDeliveryError(toError(error).message, { cause: error });\n } finally {\n globalThis.clearTimeout(transferTimeout);\n }\n const transferDurationMs = Date.now() - transferStartedAt;\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"succeeded\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n duration_ms: transferDurationMs,\n });\n if (transferDurationMs > 2_000) this.flushDiagnostics(\"slow_operation\");\n if (generation !== this.contextGeneration) throw new Error(\"Context transfer interrupted by recovery\");\n const { payload } = transfer;\n if (!isContextUpdatePayload(payload)) {\n throw new TypeError(\"Invalid context update payload\");\n }\n const message = createClientMessage(\n this.connectionId,\n ++this.clientSeq,\n \"context.update\",\n { ...payload },\n );\n return this.sendTrackedCommand(\n message,\n timeoutMs,\n transfer.resend,\n ) as Promise<ContextUpdatedPayload>;\n }\n\n private resumeContextDelivery(restore: boolean): void {\n // Audio readiness owns connection recovery. Context delivery has its own\n // deadlines and retries, and may be interrupted by a later disconnect.\n void this.replacementContext.resume(restore).catch(() => {});\n }\n\n private async uploadTextContext(update: Extract<ContextUpdate, { text: string }>): Promise<ContextTransfer> {\n const data = new TextEncoder().encode(update.text);\n if (data.byteLength === 0) throw new TypeError(\"Context text cannot be empty\");\n if (data.byteLength > 262_144) {\n throw new TypeError(\"Context text must be at most 262144 UTF-8 bytes\");\n }\n const base = {\n key: update.key,\n mode: update.mode,\n label: update.label ?? \"\",\n respond: update.respond ?? false,\n };\n if (data.byteLength <= 32_768) return { payload: { ...base, text: update.text } };\n const sha256 = await sha256Hex(data);\n const streamId = contextStreamId();\n const send = async () => {\n const writer = await this.room.localParticipant.streamText({\n streamId,\n topic: \"voxevolv.context.text\",\n totalSize: data.byteLength,\n attributes: { sha256 },\n });\n await writer.write(update.text);\n await writer.close();\n };\n await send();\n return {\n payload: {\n ...base,\n text_stream: { stream_id: streamId, bytes: data.byteLength, sha256 },\n },\n resend: send,\n };\n }\n\n private async uploadImageContext(update: Extract<ContextUpdate, { image: Blob }>): Promise<ContextTransfer> {\n const allowed = new Set([\"image/jpeg\", \"image/png\", \"image/webp\"]);\n if (!allowed.has(update.image.type)) {\n throw new TypeError(\"Image context must be JPEG, PNG, or WebP\");\n }\n const data = new Uint8Array(await update.image.arrayBuffer());\n if (data.byteLength === 0 || data.byteLength > 5_242_880) {\n throw new TypeError(\"Image context must be between 1 byte and 5 MiB\");\n }\n const sha256 = await sha256Hex(data);\n const streamId = contextStreamId();\n const send = async () => {\n const writer = await this.room.localParticipant.streamBytes({\n streamId,\n topic: \"voxevolv.context.image\",\n name: \"context-image\",\n mimeType: update.image.type,\n totalSize: data.byteLength,\n attributes: { sha256 },\n });\n await writer.write(data);\n await writer.close();\n };\n await send();\n return {\n payload: {\n key: update.key,\n mode: \"replace\",\n label: update.label ?? \"\",\n image: {\n stream_id: streamId,\n mime: update.image.type as \"image/jpeg\" | \"image/png\" | \"image/webp\",\n bytes: data.byteLength,\n sha256,\n ...(update.width === undefined ? {} : { width: update.width }),\n ...(update.height === undefined ? {} : { height: update.height }),\n detail: update.detail ?? \"low\",\n },\n respond: update.respond ?? false,\n },\n resend: send,\n };\n }\n\n async disconnect(): Promise<void> {\n this.abortStartupConnect(new Error(\"Session disconnected\"));\n this.startupConnectController = null;\n this.failRecovery(new Error(\"Session disconnected during recovery\"));\n this.cancelRecovery();\n this.contextGeneration += 1;\n this.localApplicationAudioTrack = null;\n this.replacementContext.clear(new Error(\"Session disconnected\"));\n if (this.stateValue === \"disconnected\") return;\n this.rejectPendingCommands(new Error(\"Session disconnected before command completion\"));\n this.disconnectMode = \"intentional\";\n try {\n await this.room.disconnect();\n } finally {\n this.disconnectMode = null;\n this.activeRecovery = null;\n this.setState(\"disconnected\");\n }\n }\n\n async end(options: EndOptions = {}): Promise<void> {\n this.credentialRefreshGeneration += 1;\n this.abortStartupConnect(new Error(\"Session ended\"));\n this.startupConnectController = null;\n this.failRecovery(new Error(\"Session ended during recovery\"));\n this.cancelRecovery();\n this.sessionEnded = true;\n const endpoint = options.endpoint ?? this.endEndpoint ?? `${this.apiBase}/sessions/${this.id}`;\n const request = options.request ?? {};\n const headers = new Headers(request.headers);\n const usesScopedSessionEndpoint = !options.endpoint && !this.endEndpoint;\n if (!headers.has(\"Authorization\") && usesScopedSessionEndpoint) {\n headers.set(\"Authorization\", `Bearer ${this.accessToken}`);\n }\n let response = await this.fetcher(endpoint, {\n ...request,\n method: request.method ?? \"DELETE\",\n headers,\n credentials: request.credentials ?? this.lifecycleCredentials,\n });\n if (response.status === 401 && usesScopedSessionEndpoint && this.refreshCredentialsCallback) {\n await this.refreshCredentials(request.signal ?? undefined);\n headers.set(\"Authorization\", `Bearer ${this.accessToken}`);\n response = await this.fetcher(endpoint, {\n ...request,\n method: request.method ?? \"DELETE\",\n headers,\n credentials: request.credentials ?? this.lifecycleCredentials,\n });\n }\n if (!response.ok) throw await httpError(response, \"Could not end realtime session\");\n if (options.disconnect ?? true) await this.disconnect();\n }\n\n async replay(apiBase = this.apiBase, afterSeq = this.cursor.lastServerSeq): Promise<void> {\n if (this.replayPromise) return this.replayPromise;\n const normalizedApiBase = normalizeApiBase(apiBase);\n this.replayPromise = this.fetchReplay(normalizedApiBase, afterSeq).finally(() => {\n this.replayPromise = null;\n });\n return this.replayPromise;\n }\n\n private setState(state: ConnectionState): void {\n if (this.stateValue === state) return;\n this.stateValue = state;\n if (state === \"connecting\" || state === \"resuming\") {\n this.startDiagnosticLoopMonitor();\n globalThis.document?.addEventListener?.(\"visibilitychange\", this.onDiagnosticVisibilityChange);\n }\n if (state === \"disconnected\" || state === \"failed\") {\n globalThis.clearInterval(this.diagnosticLoopTimer);\n this.diagnosticLoopTimer = undefined;\n this.diagnosticLoopDelayMs = undefined;\n globalThis.document?.removeEventListener?.(\"visibilitychange\", this.onDiagnosticVisibilityChange);\n this.flushDiagnostics(\"session_finished\");\n const error = new Error(`Session ${state}`);\n this.contextGeneration += 1;\n this.replacementContext.clear(error);\n this.rejectPendingCommands(error);\n }\n this.notifyListeners(this.stateListeners, state);\n }\n\n private bindRoomEvents(): void {\n this.room.on(RoomEvent.ParticipantDisconnected, (participant) => {\n if (participant.isAgent && !this.disconnectMode) {\n // LiveKit removes its local participant objects BEFORE announcing a\n // native restart. Let that synchronous cleanup finish before deciding\n // whether the agent actually left an otherwise connected room.\n queueMicrotask(() => {\n if (this.disconnectMode || this.terminalSessionError) return;\n if (this.sessionEnded) {\n this.agentDisconnected = true;\n this.finishPendingEnd();\n return;\n }\n if (\n this.room.state === LiveKitConnectionState.Reconnecting\n || this.activeRecovery !== null\n || this.autoRejoinPromise !== null\n || this.manualRejoinController !== null\n ) return;\n if ([...this.room.remoteParticipants.values()].some((remote) => remote.isAgent)) return;\n this.agentDisconnected = true;\n this.startAutoRejoin(\n new Error(\"Agent disconnected from the room\"),\n { trigger: \"agent_disconnected\" },\n );\n });\n }\n });\n this.room.on(RoomEvent.SignalReconnecting, () => this.handleLiveKitReconnecting());\n this.room.on(RoomEvent.Reconnecting, () => this.handleLiveKitReconnecting());\n this.room.on(RoomEvent.Reconnected, () => {\n void this.handleLiveKitReconnected();\n });\n this.room.on(RoomEvent.Disconnected, (reason) => {\n this.handleLiveKitDisconnected(reason);\n });\n this.room.on(RoomEvent.ConnectionStateChanged, (state) => {\n if (this.sessionEnded || this.terminalSessionError) return;\n if (state === LiveKitConnectionState.Connected) {\n const recovering = this.activeRecovery !== null || this.stateValue === \"resuming\";\n this.setState(\n this.agentReady\n ? \"connected\"\n : recovering\n ? \"resuming\"\n : \"connected_not_ready\",\n );\n }\n });\n this.room.on(RoomEvent.ConnectionQualityChanged, (quality, participant) => {\n if (!participant.isLocal) return;\n this.notifyListeners(\n this.connectionQualityListeners,\n quality as ConnectionQuality,\n );\n });\n this.room.on(RoomEvent.TrackSubscribed, (track) => {\n if (track.kind !== Track.Kind.Audio) return;\n const element = track.attach();\n element.dataset.voxevolvRemoteAudio = \"true\";\n element.style.display = \"none\";\n document.body.appendChild(element);\n try {\n const playback = element.play();\n void playback.catch((error) => {\n this.notifyListeners(this.audioPlaybackBlockedListeners, {\n error,\n element,\n track: track.mediaStreamTrack,\n });\n });\n } catch (error) {\n this.notifyListeners(this.audioPlaybackBlockedListeners, {\n error,\n element,\n track: track.mediaStreamTrack,\n });\n }\n const stream = new MediaStream([track.mediaStreamTrack]);\n this.remoteAudioStreams.set(track, stream);\n this.outputStream.addTrack(track.mediaStreamTrack);\n this.notifyRemoteAudioListeners(this.remoteAudioTrackListeners, track.mediaStreamTrack, stream);\n this.remoteAudioTrackResolve?.();\n });\n this.room.on(RoomEvent.TrackUnsubscribed, (track) => {\n if (track.kind !== Track.Kind.Audio) return;\n const stream = this.remoteAudioStreams.get(track) ?? new MediaStream([track.mediaStreamTrack]);\n this.notifyRemoteAudioListeners(\n this.remoteAudioTrackUnsubscribedListeners,\n track.mediaStreamTrack,\n stream,\n );\n this.remoteAudioStreams.delete(track);\n this.outputMediaStream?.removeTrack(track.mediaStreamTrack);\n track.detach().forEach((element) => element.remove());\n });\n this.room.on(RoomEvent.DataReceived, (data, _participant, kind, topic) => {\n if (topic !== \"voxevolv.events\" || kind !== DataPacket_Kind.RELIABLE) return;\n let value: unknown;\n try {\n value = JSON.parse(new TextDecoder().decode(data));\n } catch {\n // Ignore data from other room participants that is not a VoxEvolv envelope.\n return;\n }\n if (!isRealtimeEvent(value)) return;\n const result = this.cursor.accept(value);\n if (result.gap) {\n this.notifyListeners(this.gapListeners, result.gap);\n void this.replay(this.apiBase, result.gap.after_server_seq);\n }\n if (!result.deliver) return;\n this.observeReadiness(value);\n this.observeCommandResult(value);\n this.observeConvenienceEvents(value);\n this.notifyListeners(this.listeners, value);\n });\n }\n\n private handleLiveKitReconnecting(): void {\n if (this.sessionEnded || this.disconnectMode === \"intentional\") return;\n this.agentReady = false;\n // Once full rejoin owns recovery, late LiveKit reconnect notifications\n // from the old transport must not move the wrapper back to reconnecting.\n // Doing so makes connectWithMode() reject the replacement connection.\n if (\n this.autoRejoinPromise !== null\n || this.activeRecovery?.strategy === \"rejoin\"\n || this.disconnectMode === \"rejoin\"\n ) {\n this.setState(\"resuming\");\n return;\n }\n this.contextGeneration += 1;\n this.livekitResumeController?.abort(new Error(\"LiveKit connection interrupted again\"));\n this.livekitResumeController = null;\n this.replacementContext.pause();\n this.reconnectStartedAt ??= Date.now();\n this.rejectPendingCommands(\n new Error(\"Connection interrupted before command completion\"),\n true,\n );\n if (this.activeRecovery === null) {\n this.beginRecovery(\"livekit\", 1, { trigger: \"livekit_reconnecting\" });\n this.recordDiagnostic({ operation: \"connection_recovery\", stage: \"room_connect\", status: \"started\" });\n }\n this.setState(\"reconnecting\");\n }\n\n private async handleLiveKitReconnected(): Promise<void> {\n if (\n this.sessionEnded || this.disconnectMode\n || this.autoRejoinPromise || this.livekitResumeController\n ) return;\n const generation = this.contextGeneration;\n const controller = new AbortController();\n this.livekitResumeController = controller;\n const recoveredAt = Date.now();\n if (this.reconnectStartedAt !== null) {\n this.pendingReconnect = {\n started_at: new Date(this.reconnectStartedAt).toISOString(),\n recovered_at: new Date(recoveredAt).toISOString(),\n duration_ms: Math.max(recoveredAt - this.reconnectStartedAt, 0),\n };\n this.reconnectStartedAt = null;\n }\n if (this.hasConnectedValue && this.activeRecovery === null) {\n this.beginRecovery(\"livekit\", 1, { trigger: \"livekit_reconnecting\" });\n }\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"room_connect\", status: \"succeeded\",\n duration_ms: Math.max(Date.now() - (this.recoveryStartedAt ?? Date.now()), 0),\n });\n this.connectionId = `conn_${Math.random().toString(36).slice(2)}_${Date.now().toString(36)}`;\n this.clientSeq = 0;\n this.setState(this.hasConnectedValue ? \"resuming\" : \"connected_not_ready\");\n try {\n await this.measureRecoveryStage(\"hello\", () => this.sendRecoveryHello(controller.signal));\n const deadline = Date.now() + this.recoveryReadiness.readyTimeoutMs;\n await this.measureRecoveryStage(\n \"agent_ready\",\n () => this.waitForAgentReady(Math.max(deadline - Date.now(), 0), controller.signal),\n );\n if (this.recoveryReadiness.waitForRemoteAudio) {\n await this.measureRecoveryStage(\n \"remote_audio\", () => this.waitForRemoteAudioTrack(deadline, controller.signal),\n );\n }\n if (this.sessionEnded || generation !== this.contextGeneration) return;\n this.resumeContextDelivery(true);\n if (this.sessionEnded || generation !== this.contextGeneration) return;\n this.setState(\"connected\");\n this.completeRecovery();\n } catch (error) {\n if (controller.signal.aborted || this.sessionEnded || generation !== this.contextGeneration) return;\n const normalizedError = toError(error);\n if (this.shouldAutoRejoin()) {\n this.startAutoRejoin(normalizedError, { trigger: \"livekit_resume_failed\" });\n } else {\n this.failRecovery(normalizedError);\n this.setState(\"failed\");\n }\n } finally {\n if (this.livekitResumeController === controller) this.livekitResumeController = null;\n }\n }\n\n private handleLiveKitDisconnected(reason?: DisconnectReason): void {\n this.agentReady = false;\n if (this.disconnectMode !== \"rejoin\") {\n this.pendingReconnect = null;\n }\n // Drop any remaining remote tracks so a stale, ended track cannot\n // satisfy the next connect()'s wait for agent audio.\n this.outputMediaStream?.getTracks().forEach((track) => {\n this.outputMediaStream?.removeTrack(track);\n });\n this.rejectPendingCommands(new Error(\"Session disconnected before command completion\"));\n\n if (this.disconnectMode === \"rejoin\") return;\n if (this.disconnectMode === \"connect_failure\") return;\n if (this.disconnectMode === \"intentional\") {\n this.activeRecovery = null;\n this.deliverPendingEndEvent();\n this.setState(\"disconnected\");\n return;\n }\n if (this.terminalSessionError) return;\n if (this.shouldAutoRejoin(reason)) {\n this.startAutoRejoin(\n new Error(`LiveKit disconnected (${disconnectReasonName(reason)})`),\n { trigger: \"livekit_disconnected\" },\n );\n return;\n }\n if (this.activeRecovery !== null) {\n this.failRecovery(\n new Error(`LiveKit disconnected (${disconnectReasonName(reason)})`),\n );\n }\n this.deliverPendingEndEvent();\n this.setState(\"disconnected\");\n }\n\n // The terminal session.ended event is recorded durably after room teardown,\n // so turn the earlier live announcement into the browser completion signal.\n private deliverPendingEndEvent(): void {\n const ending = this.pendingEndEvent;\n if (!ending) return;\n this.pendingEndEvent = null;\n this.notifyEnded({ ...ending, type: \"session.ended\" });\n }\n\n private finishPendingEnd(): void {\n this.deliverPendingEndEvent();\n // The agent can leave while the browser remains in the room. Close that\n // transport ourselves, after notifying the application of the true reason.\n void this.disconnect().catch(() => {});\n }\n\n private async recoverSessionEnd(apiBase: string, signal?: AbortSignal): Promise<boolean> {\n const controller = new AbortController();\n const cancel = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", cancel, { once: true });\n if (signal?.aborted) cancel();\n const timeout = globalThis.setTimeout(() => controller.abort(), 5_000);\n try {\n // A later live event may have advanced the cursor past a missed ending.\n // Replay from the start; event IDs suppress already delivered messages.\n await this.fetchReplay(apiBase, 0, { signal: controller.signal, terminalOnly: true });\n } catch {\n // A 409 also covers failed sessions. Without an authoritative ending,\n // retain the original HTTP failure rather than invent a normal end.\n } finally {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", cancel);\n }\n if (!this.sessionEnded || this.terminalSessionError) return false;\n this.finishPendingEnd();\n return true;\n }\n\n private notifyEnded(event: RealtimeEvent): void {\n if (this.endNotificationDelivered) return;\n this.endNotificationDelivered = true;\n this.notifyListeners(this.endedListeners, event);\n }\n\n private beginRecovery(\n strategy: ActiveRecovery[\"strategy\"],\n attempt: number,\n details: RecoveryDetails,\n ): void {\n this.recoveryStartedAt ??= Date.now();\n this.activeRecovery = { strategy, attempt, details };\n this.recordDiagnostic({\n operation: \"connection_recovery\",\n status: \"started\",\n reason: details.trigger,\n message_id: details.messageId,\n context_key: details.contextKey,\n timeout_ms: details.timeoutMs,\n retry_count: attempt - 1,\n });\n this.flushDiagnostics(\"recovery_started\");\n this.notifyListeners(this.recoveryListeners, {\n status: \"started\",\n strategy,\n attempt,\n ...details,\n });\n }\n\n private completeRecovery(): void {\n const recovery = this.activeRecovery;\n if (!recovery) return;\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"complete\", status: \"succeeded\",\n duration_ms: Math.max(Date.now() - (this.recoveryStartedAt ?? Date.now()), 0),\n retry_count: recovery.attempt - 1,\n reason: recovery.details.trigger,\n });\n this.flushDiagnostics(\"recovery_completed\");\n this.recoveryStartedAt = null;\n this.activeRecovery = null;\n this.notifyListeners(this.recoveryListeners, {\n status: \"succeeded\",\n strategy: recovery.strategy,\n attempt: recovery.attempt,\n ...recovery.details,\n });\n }\n\n private failRecovery(error: Error): void {\n const recovery = this.activeRecovery;\n if (!recovery) return;\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"complete\", status: \"failed\",\n duration_ms: Math.max(Date.now() - (this.recoveryStartedAt ?? Date.now()), 0),\n retry_count: recovery.attempt - 1,\n reason: recovery.details.trigger,\n });\n this.flushDiagnostics(\"recovery_failed\");\n this.activeRecovery = null;\n this.notifyListeners(this.recoveryListeners, {\n status: \"failed\",\n strategy: recovery.strategy,\n attempt: recovery.attempt,\n ...recovery.details,\n error,\n });\n }\n\n private shouldAutoRejoin(reason?: DisconnectReason): boolean {\n return (\n this.autoRejoinOptions !== null\n && this.hasConnectedValue\n && !this.sessionEnded\n && ![\"disconnected\", \"failed\"].includes(this.stateValue)\n && !isTerminalDisconnectReason(reason)\n );\n }\n\n private startAutoRejoin(initialError: Error, details: RecoveryDetails): void {\n if (this.autoRejoinPromise || !this.shouldAutoRejoin()) return;\n // Include time spent offline before the first token request can start.\n this.recoveryStartedAt ??= Date.now();\n this.agentReady = false;\n this.contextGeneration += 1;\n this.livekitResumeController?.abort(initialError);\n this.replacementContext.pause();\n this.rejectPendingCommands(initialError);\n this.reconnectStartedAt ??= Date.now();\n const controller = new AbortController();\n this.autoRejoinController = controller;\n const timeout = globalThis.setTimeout(() => {\n if (controller.signal.aborted) return;\n const error = new Error(\"Session recovery timed out\");\n controller.abort(error);\n this.contextGeneration += 1;\n this.rejectPendingCommands(error);\n this.replacementContext.clear(error);\n this.failRecovery(error);\n this.setState(\"failed\");\n }, this.autoRejoinOptions!.timeoutMs);\n const promise = this.runAutoRejoin(initialError, controller.signal, details)\n .finally(() => {\n globalThis.clearTimeout(timeout);\n if (this.autoRejoinController === controller) {\n this.autoRejoinController = null;\n this.autoRejoinPromise = null;\n }\n });\n this.autoRejoinPromise = promise;\n void promise;\n }\n\n private async runAutoRejoin(\n initialError: Error,\n signal: AbortSignal,\n details: RecoveryDetails,\n ): Promise<void> {\n const options = this.autoRejoinOptions;\n if (!options) return;\n let lastError = initialError;\n if (this.activeRecovery?.strategy === \"livekit\") {\n this.failRecovery(initialError);\n }\n this.setState(\"resuming\");\n for (let attempt = 1; attempt <= options.maxAttempts; attempt += 1) {\n try {\n await waitUntilOnline(signal);\n if (attempt > 1) {\n const exponentialDelay = options.baseDelayMs * (2 ** (attempt - 2));\n const delayMs = Math.min(exponentialDelay, options.maxDelayMs);\n await abortableDelay(delayMs + Math.random() * Math.min(delayMs, 500), signal);\n }\n throwIfAborted(signal);\n this.beginRecovery(\"rejoin\", attempt, details);\n await this.performRejoin(this.apiBase, { signal });\n if (this.sessionEnded) return;\n throwIfAborted(signal);\n this.reconnectStartedAt = null;\n this.completeRecovery();\n return;\n } catch (error) {\n if (signal.aborted) return;\n lastError = toError(error);\n if (isTerminalRejoinError(error)) break;\n }\n }\n this.failRecovery(lastError);\n this.replacementContext.clear(lastError);\n this.setState(\"failed\");\n }\n\n private cancelRecovery(): void {\n this.livekitResumeController?.abort();\n this.livekitResumeController = null;\n this.recoveryStartedAt = null;\n this.autoRejoinController?.abort();\n this.autoRejoinController = null;\n this.manualRejoinController?.abort();\n this.manualRejoinController = null;\n this.autoRejoinPromise = null;\n this.activeRecovery = null;\n }\n\n private notifyListeners<T>(listeners: ReadonlySet<(value: T) => void>, value: T): void {\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n console.error(\"VoxEvolv event listener failed\", error);\n }\n }\n }\n\n private notifyRemoteAudioListeners(\n listeners: ReadonlySet<RemoteAudioTrackListener>,\n track: MediaStreamTrack,\n stream: MediaStream,\n ): void {\n for (const listener of listeners) {\n try {\n listener(track, stream);\n } catch (error) {\n console.error(\"VoxEvolv remote audio listener failed\", error);\n }\n }\n }\n\n private validateAudioOptions(\n microphone: boolean,\n audioTrack: MediaStreamTrack | null,\n ): void {\n if (microphone && audioTrack) {\n throw new SessionConfigurationError(\"microphone and audioTrack cannot both be enabled\");\n }\n if (!audioTrack) return;\n if (audioTrack.kind !== \"audio\") {\n throw new SessionConfigurationError(\"audioTrack must be an audio MediaStreamTrack\");\n }\n if (audioTrack.readyState === \"ended\") {\n throw new SessionConfigurationError(\"audioTrack has already ended\");\n }\n }\n\n private async measureRecoveryStage<T>(\n stage: RecoveryStage,\n operation: () => Promise<T>,\n recovering = true,\n ): Promise<T> {\n if (!recovering) return operation();\n const startedAt = Date.now();\n this.recordDiagnostic({ operation: \"connection_recovery\", stage, status: \"started\" });\n try {\n const result = await operation();\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage, status: \"succeeded\",\n duration_ms: Date.now() - startedAt,\n });\n return result;\n } catch (error) {\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage, status: \"failed\",\n duration_ms: Date.now() - startedAt,\n reason: error instanceof RecoveryDataChannelStalledError ? \"data_channel_stalled\" : \"stage_failed\",\n });\n this.flushDiagnostics(\"recovery_stage_failed\");\n throw error;\n }\n }\n\n private async fetchRoomToken(\n apiBase: string,\n signal?: AbortSignal,\n recovering = true,\n ): Promise<Response> {\n const controller = new AbortController();\n const cancel = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", cancel, { once: true });\n const timeout = globalThis.setTimeout(() => controller.abort(), 10_000);\n const startedAt = Date.now();\n if (recovering) {\n this.recordDiagnostic({ operation: \"connection_recovery\", stage: \"token_request\", status: \"started\" });\n }\n try {\n throwIfAborted(signal);\n const response = await raceWithAbort(this.fetcher(`${apiBase}/sessions/${this.id}/room-tokens`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: this.lifecycleCredentials,\n signal: controller.signal,\n }), controller.signal);\n if (recovering) {\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"token_request\",\n status: response.ok ? \"succeeded\" : \"failed\", http_status: response.status,\n duration_ms: Date.now() - startedAt,\n });\n if (!response.ok) this.flushDiagnostics(\"recovery_stage_failed\");\n }\n return response;\n } catch (error) {\n if (recovering) {\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"token_request\", status: \"failed\",\n duration_ms: Date.now() - startedAt,\n reason: signal?.aborted ? \"cancelled\" : controller.signal.aborted ? \"request_timeout\" : \"request_failed\",\n });\n this.flushDiagnostics(\"recovery_stage_failed\");\n }\n throw error;\n } finally {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", cancel);\n }\n }\n\n private async refreshCredentials(signal?: AbortSignal): Promise<void> {\n if (!this.refreshCredentialsCallback) return;\n throwIfAborted(signal);\n const connectionGeneration = this.contextGeneration;\n const refreshGeneration = ++this.credentialRefreshGeneration;\n const refreshed = await raceWithAbort(this.refreshCredentialsCallback(), signal);\n throwIfAborted(signal);\n if (\n connectionGeneration !== this.contextGeneration\n || refreshGeneration !== this.credentialRefreshGeneration\n ) {\n throw new Error(\"Credential refresh was superseded\");\n }\n validateSessionCredentials(refreshed);\n if (refreshed.id !== this.id) {\n throw new Error(\"Refreshed credentials belong to a different session\");\n }\n this.accessToken = refreshed.access_token;\n this.credentials = refreshed.connection;\n }\n\n private async finishSessionFailure(error: Error): Promise<void> {\n this.sessionEnded = true;\n this.contextGeneration += 1;\n this.rejectPendingCommands(error);\n this.replacementContext.clear(error);\n this.failRecovery(error);\n this.cancelRecovery();\n this.disconnectMode = \"connect_failure\";\n try {\n await this.room.disconnect();\n } finally {\n this.disconnectMode = null;\n this.setState(\"failed\");\n }\n }\n\n private observeConvenienceEvents(event: RealtimeEvent): void {\n if (event.type === \"session.error\") {\n // Teardown errors must not overwrite an already announced normal ending.\n if (this.sessionEnded) return;\n const error = new SessionErrorEventError(event);\n // Retryability applies to an active startup attempt. Once connected,\n // a durable session.error means the server has failed the session.\n if (error.retryable && this.startupAttemptController) {\n this.startupAttemptController.abort(error);\n } else {\n this.terminalSessionError = error;\n this.abortStartupConnect(error);\n // Startup owns its aborted attempt's cleanup. An established session\n // needs to release media and settle recovery immediately on failure.\n if (!this.startupConnectController) {\n void this.finishSessionFailure(error).catch(() => {});\n }\n }\n }\n if (event.type === \"session.ending\" || event.type === \"session.ended\") {\n // A worker shutdown event can follow a durable session.error. The server\n // retains FAILED in that case, so it must not become a normal completion.\n if (this.terminalSessionError) return;\n this.abortStartupConnect(new Error(\"Session ended during startup\"));\n this.contextGeneration += 1;\n this.rejectPendingCommands(new Error(\"Session ended\"));\n this.failRecovery(new Error(\"Session ended during recovery\"));\n }\n if (event.type === \"session.ending\") {\n // The server announced an intentional hang-up before tearing down the\n // room, so the coming disconnect must not fail recovery or auto-rejoin.\n this.sessionEnded = true;\n this.cancelRecovery();\n this.replacementContext.clear(new Error(\"Session ended\"));\n // Match the server's first terminal outcome, even if teardown announces\n // another ending before the agent has left the room.\n this.pendingEndEvent ??= event;\n if (\n !this.hasConnectedValue\n || this.agentDisconnected\n || this.room.state === LiveKitConnectionState.Disconnected\n ) {\n this.finishPendingEnd();\n }\n }\n if (event.type === \"session.ended\") {\n const ending = this.pendingEndEvent;\n this.pendingEndEvent = null;\n this.sessionEnded = true;\n this.replacementContext.clear(new Error(\"Session ended\"));\n this.cancelRecovery();\n this.notifyEnded(ending ? { ...ending, type: \"session.ended\" } : event);\n void this.disconnect().catch(() => {});\n }\n if (event.type.endsWith(\".error\")) this.notifyListeners(this.errorListeners, event);\n const message = this.transcriptStore.accept(event);\n if (message) this.notifyListeners(this.transcriptListeners, message);\n const transcript = transcriptEvent(event);\n if (!transcript) return;\n this.notifyListeners(\n transcript.role === \"user\" ? this.userTranscriptListeners : this.agentTranscriptListeners,\n transcript,\n );\n }\n\n private abortStartupConnect(error: Error): void {\n if (!this.startupConnectController?.signal.aborted) {\n this.startupConnectController?.abort(error);\n }\n }\n\n private async publishApplicationAudioTrack(audioTrack: MediaStreamTrack): Promise<void> {\n const clonedTrack = audioTrack.clone();\n let publishedTrack: LocalAudioTrack | null = null;\n try {\n publishedTrack = new LocalAudioTrack(clonedTrack, undefined, true);\n this.localApplicationAudioTrack = publishedTrack;\n if (!this.microphoneEnabled) {\n // LiveKit can re-enable a raw track when wrapping it. Mute the wrapper\n // before publication so recovery cannot briefly transmit muted input.\n await publishedTrack.mute();\n }\n await this.room.localParticipant.publishTrack(publishedTrack, {\n source: Track.Source.Microphone,\n name: \"voxevolv-application-audio\",\n });\n } catch (error) {\n if (this.localApplicationAudioTrack === publishedTrack) {\n this.localApplicationAudioTrack = null;\n }\n clonedTrack.stop();\n throw error;\n }\n }\n\n private async sendHello(): Promise<void> {\n const reconnect = this.pendingReconnect;\n const message = createClientMessage(\n this.connectionId,\n ++this.clientSeq,\n \"client.hello\",\n {\n last_server_seq: this.cursor.lastServerSeq,\n sdk: `@voxevolv/client@${SDK_VERSION}`,\n tool_handlers: [...this.toolHandlers.keys()].sort(),\n ...(reconnect ? { reconnect } : {}),\n },\n );\n this.lastHelloMessageId = message.message_id;\n await this.sendTrackedCommand(message, CLIENT_HELLO_TIMEOUT_MS);\n if (this.pendingReconnect === reconnect) this.pendingReconnect = null;\n }\n\n private async sendRecoveryHello(signal?: AbortSignal): Promise<void> {\n throwIfAborted(signal);\n let previousBytes = this.reliableDataChannelBufferedBytes();\n let lastProgressAt = Date.now();\n let timer: ReturnType<typeof globalThis.setTimeout> | undefined;\n const stalled = new Promise<never>((_resolve, reject) => {\n const checkProgress = () => {\n const bufferedBytes = this.reliableDataChannelBufferedBytes();\n if (\n bufferedBytes === undefined || bufferedBytes === 0\n || previousBytes === undefined || previousBytes === 0\n || bufferedBytes < previousBytes\n ) {\n lastProgressAt = Date.now();\n } else if (Date.now() - lastProgressAt >= RECOVERY_BUFFER_STALL_MS) {\n reject(new RecoveryDataChannelStalledError());\n return;\n }\n previousBytes = bufferedBytes;\n timer = globalThis.setTimeout(checkProgress, RECOVERY_BUFFER_POLL_MS);\n };\n timer = globalThis.setTimeout(checkProgress, RECOVERY_BUFFER_POLL_MS);\n });\n try {\n // Initial joins keep their existing deadline. During recovery, positive\n // queued bytes with no draining progress indicate a stuck transport; a\n // slow but draining channel still gets the normal hello deadline.\n await raceWithAbort(Promise.race([this.sendHello(), stalled]), signal);\n } catch (error) {\n if (error instanceof RecoveryDataChannelStalledError) {\n this.rejectPendingCommands(error);\n }\n throw error;\n } finally {\n if (timer !== undefined) globalThis.clearTimeout(timer);\n }\n }\n\n private async sendTrackedCommand(\n message: ClientMessage,\n timeoutMs: number,\n retryTransfer?: () => Promise<void>,\n ): Promise<CommandAckPayload> {\n const contextKey = contextKeyFromMessage(message);\n const payloadBytes = contextPayloadBytes(message.payload);\n const startedAt = Date.now();\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"started\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: contextKey,\n payload_bytes: payloadBytes,\n retry_count: 0,\n timeout_ms: timeoutMs,\n event_type: diagnosticEventType(message.type),\n });\n let markSettled = () => {};\n const settled = new Promise<void>((resolve) => { markSettled = resolve; });\n const response = new Promise<CommandAckPayload>((resolve, reject) => {\n const timeout = globalThis.setTimeout(() => {\n const pending = this.pendingCommands.get(message.message_id);\n if (pending) globalThis.clearTimeout(pending.retry);\n pending?.markSettled();\n this.pendingCommands.delete(message.message_id);\n const detail = `Command ${message.type} timed out after ${timeoutMs}ms`;\n const error = message.type === \"context.update\"\n ? new ContextDeliveryError(detail, { retryAfter: pending?.transferSettled })\n : new Error(detail);\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"timed_out\",\n reason: message.type === \"context.update\"\n ? \"context_command_timeout\"\n : \"command_timeout\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: contextKey,\n payload_bytes: payloadBytes,\n duration_ms: Date.now() - startedAt,\n retry_count: pending?.retryCount ?? 0,\n timeout_ms: timeoutMs,\n event_type: diagnosticEventType(message.type),\n });\n this.flushDiagnostics(\"command_timeout\");\n reject(error);\n }, timeoutMs);\n this.pendingCommands.set(\n message.message_id,\n {\n commandType: message.type,\n message,\n startedAt,\n contextKey,\n payloadBytes,\n retryCount: 0,\n publishQueued: false,\n resolve,\n reject,\n timeout,\n settled,\n markSettled,\n retryTransfer,\n transferRetrying: false,\n transferRetryRequested: false,\n },\n );\n this.scheduleCommandRetry(message);\n });\n void this.publishCommandAttempt(message, false).catch(() => {\n // The reliable data channel may still be warming immediately after a\n // reconnect. Keep the command pending so the retry timer can publish\n // it once the transport accepts writes, or reject at the normal timeout.\n });\n return response;\n }\n\n private scheduleCommandRetry(message: ClientMessage): void {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending) return;\n const delayMs = message.type === \"context.update\"\n ? contextRetryDelay(pending.retryCount + 1)\n : 500;\n pending.retry = globalThis.setTimeout(() => {\n void this.retryCommand(message).finally(() => this.scheduleCommandRetry(message));\n }, delayMs);\n }\n\n private async retryCommand(message: ClientMessage): Promise<void> {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending) return;\n if (message.type === \"context.update\" && (\n this.sessionEnded || [\"reconnecting\", \"resuming\", \"disconnected\", \"failed\"].includes(this.stateValue)\n )) return;\n try {\n if (pending.transferRetryRequested && pending.retryTransfer) {\n pending.transferRetryRequested = false;\n pending.transferRetrying = true;\n const transfer = pending.retryTransfer();\n pending.transferSettled = transfer.then(() => {}, () => {});\n if (pending.contextKey) {\n this.replacementContext.blockUntilTransferSettles(pending.contextKey, pending.transferSettled);\n }\n await Promise.race([transfer, pending.settled]);\n }\n await this.publishCommandAttempt(message, true);\n } catch {\n // Failed writes retain their original deadline and retry with backoff.\n } finally {\n pending.transferRetrying = false;\n }\n }\n\n private publishCommandAttempt(message: ClientMessage, retrying: boolean): Promise<void> {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending || pending.publishQueued) return Promise.resolve();\n pending.publishQueued = true;\n // Context keys drain independently, but client_seq is global. Serialize the\n // asynchronous LiveKit publish boundary so a later sequence cannot overtake\n // an earlier one before the reliable data channel receives it.\n const attempt = this.commandPublishTail\n .then(() => this.publishCommandAttemptNow(message, retrying))\n .finally(() => {\n const current = this.pendingCommands.get(message.message_id);\n if (current === pending) current.publishQueued = false;\n });\n this.commandPublishTail = attempt.catch(() => {});\n return attempt;\n }\n\n private async publishCommandAttemptNow(\n message: ClientMessage,\n retrying: boolean,\n ): Promise<void> {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending) return;\n if (retrying) {\n pending.retryCount += 1;\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"retrying\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n retry_count: pending.retryCount,\n event_type: diagnosticEventType(message.type),\n });\n }\n const attemptStartedAt = Date.now();\n try {\n let publishFinished = false;\n const publish = this.publishCommand(message).then(() => { publishFinished = true; });\n await Promise.race([publish, pending.settled]);\n if (!publishFinished) return;\n } catch (error) {\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"failed\",\n reason: \"command_publish_failed\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n duration_ms: Date.now() - attemptStartedAt,\n retry_count: pending.retryCount,\n event_type: diagnosticEventType(message.type),\n });\n this.flushDiagnostics(\"command_failed\");\n throw error;\n }\n const durationMs = Date.now() - attemptStartedAt;\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"succeeded\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n duration_ms: durationMs,\n retry_count: pending.retryCount,\n event_type: diagnosticEventType(message.type),\n });\n if (durationMs > 2_000) this.flushDiagnostics(\"slow_operation\");\n }\n\n private async publishCommand(message: ClientMessage): Promise<void> {\n await this.room.localParticipant.publishData(\n new TextEncoder().encode(JSON.stringify(message)),\n { reliable: true, topic: \"voxevolv.commands\" },\n );\n }\n\n private startDiagnosticLoopMonitor(): void {\n if (this.diagnosticLoopTimer !== undefined) return;\n this.diagnosticLoopExpectedAt = performance.now() + 1_000;\n this.diagnosticLoopTimer = globalThis.setInterval(() => {\n const now = performance.now();\n this.diagnosticLoopDelayMs = Math.max(0, now - this.diagnosticLoopExpectedAt);\n this.diagnosticLoopExpectedAt = now + 1_000;\n }, 1_000);\n (this.diagnosticLoopTimer as unknown as { unref?: () => void }).unref?.();\n }\n\n private recordDiagnostic(entry: ClientDiagnosticInput): void {\n const snapshot: ClientDiagnosticInput = {\n ...entry,\n connection_state: this.stateValue,\n buffered_bytes: this.reliableDataChannelBufferedBytes(),\n };\n if (entry.operation === \"tool_rpc\") {\n snapshot.page_visibility = globalThis.document?.visibilityState;\n snapshot.active_context_transfers = this.activeContextTransfers;\n snapshot.active_context_bytes = this.activeContextBytes;\n if (this.diagnosticLoopTimer !== undefined) {\n snapshot.event_loop_delay_ms = Math.max(\n this.diagnosticLoopDelayMs ?? 0, performance.now() - this.diagnosticLoopExpectedAt,\n );\n }\n }\n this.diagnostics.record(snapshot);\n }\n\n private reliableDataChannelBufferedBytes(): number | undefined {\n try {\n const bufferedAmount = this.room.engine.dataChannelForKind(0)?.bufferedAmount;\n return typeof bufferedAmount === \"number\" ? bufferedAmount : undefined;\n } catch {\n return undefined;\n }\n }\n\n private flushDiagnostics(trigger: string): void {\n void this.diagnostics.flush(trigger, (report) => this.postDiagnostics(report));\n }\n\n private async postDiagnostics(report: ClientDiagnosticReport): Promise<void> {\n const controller = new AbortController();\n let timeout: ReturnType<typeof globalThis.setTimeout> | undefined;\n const timeoutExpired = new Promise<never>((_resolve, reject) => {\n timeout = globalThis.setTimeout(() => {\n controller.abort();\n reject(new Error(\n `Diagnostic report timed out after ${this.diagnosticReportTimeoutMs}ms`,\n ));\n }, this.diagnosticReportTimeoutMs);\n });\n try {\n const upload = async (): Promise<void> => {\n const response = await this.fetcher(`${this.apiBase}/sessions/${this.id}/diagnostics`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n credentials: this.lifecycleCredentials,\n body: JSON.stringify(report),\n signal: controller.signal,\n keepalive: true,\n });\n const body = await response.json().catch(() => null) as {\n report_id?: string; retry_after_ms?: number;\n } | null;\n if (!response.ok) {\n const retryable = response.status === 408 || response.status === 429 || response.status >= 500;\n const headerDelay = Number(response.headers.get(\"Retry-After\")) * 1000;\n const retryAfterMs = typeof body?.retry_after_ms === \"number\"\n ? body.retry_after_ms : headerDelay;\n throw new DiagnosticDeliveryError(\n `Diagnostic report failed (${response.status})`,\n retryable,\n Number.isFinite(retryAfterMs) ? Math.max(retryAfterMs, 0) : 0,\n );\n }\n if (body?.report_id !== report.report_id) {\n throw new DiagnosticDeliveryError(\"Diagnostic report was not acknowledged\");\n }\n };\n // The receipt body is part of the timeout too, not just the response headers.\n await Promise.race([upload(), timeoutExpired]);\n } finally {\n if (timeout !== undefined) globalThis.clearTimeout(timeout);\n }\n }\n\n private waitForRemoteAudioTrack(deadline: number, signal?: AbortSignal): Promise<void> {\n if ((this.outputMediaStream?.getAudioTracks().length ?? 0) > 0) return Promise.resolve();\n throwIfAborted(signal);\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", onAbort);\n this.remoteAudioTrackResolve = null;\n };\n const timeout = globalThis.setTimeout(() => {\n cleanup();\n reject(new Error(\n \"Agent audio track did not arrive within the ready timeout;\"\n + \" pass waitForRemoteAudio: false to resolve connect() on signaling readiness alone\",\n ));\n }, Math.max(deadline - Date.now(), 0));\n const onAbort = () => {\n cleanup();\n reject(abortError(signal!));\n };\n this.remoteAudioTrackResolve = () => {\n cleanup();\n resolve();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n private waitForAgentReady(timeoutMs: number, signal?: AbortSignal): Promise<void> {\n if (this.agentReady) return Promise.resolve();\n throwIfAborted(signal);\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", onAbort);\n this.readyResolve = null;\n };\n const timeout = globalThis.setTimeout(() => {\n cleanup();\n reject(new Error(`Agent did not become ready within ${timeoutMs}ms`));\n }, timeoutMs);\n const onAbort = () => {\n cleanup();\n reject(abortError(signal!));\n };\n this.readyResolve = () => {\n cleanup();\n resolve();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n private observeReadiness(event: RealtimeEvent): void {\n // Replayed readiness describes an old worker, not the current transport.\n if (event.stream_id === \"durable-replay\") return;\n const payload = event.payload as Record<string, unknown>;\n const snapshotReady = event.type === \"agent.snapshot\"\n && payload.status === \"ready\"\n && payload.connection_id === this.connectionId\n && payload.ack_message_id === this.lastHelloMessageId;\n if (event.type !== \"agent.ready\" && !snapshotReady) return;\n if (this.agentStreamId && this.agentStreamId !== event.stream_id && !this.activeRecovery) {\n this.startAutoRejoin(\n new Error(\"Agent worker was replaced\"),\n { trigger: \"worker_replaced\" },\n );\n return;\n }\n this.agentStreamId = event.stream_id;\n this.agentDisconnected = false;\n const wasReady = this.agentReady;\n this.agentReady = true;\n // connect/reconnect owns the transition after hello and audio are ready.\n // Context restoration proceeds independently in the background.\n this.readyResolve?.();\n if (!wasReady) this.notifyListeners(this.readyListeners, event);\n }\n\n private observeCommandResult(event: RealtimeEvent): void {\n if (\n event.type !== \"command.ack\"\n && event.type !== \"command.error\"\n && event.type !== \"context.updated\"\n && event.type !== \"context.rejected\"\n ) return;\n const pending = this.pendingCommands.get(String(event.payload.message_id ?? \"\"));\n if (!pending) return;\n if (event.type === \"command.ack\" && isCommandAckPayload(event.payload)) {\n this.recordCommandResult(pending, event.type, \"acknowledged\");\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n this.pendingCommands.delete(event.payload.message_id);\n pending.resolve(event.payload);\n return;\n }\n if (event.type === \"context.updated\" && isContextUpdatedPayload(event.payload)) {\n this.recordCommandResult(pending, event.type, \"acknowledged\");\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n this.pendingCommands.delete(event.payload.message_id);\n pending.resolve(event.payload);\n return;\n }\n if (\n (event.type === \"command.error\" && isCommandErrorPayload(event.payload))\n || (event.type === \"context.rejected\" && isContextRejectedPayload(event.payload))\n ) {\n this.recordCommandResult(pending, event.type, \"rejected\", event.payload.code);\n this.flushDiagnostics(\"command_rejected\");\n if (event.type === \"context.rejected\" && event.payload.retryable) {\n if (event.payload.code === \"stream_unavailable\" && pending.retryTransfer && !pending.transferRetrying) {\n pending.transferRetryRequested = true;\n }\n return;\n }\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n this.pendingCommands.delete(event.payload.message_id);\n pending.reject(new CommandError(event.payload));\n }\n }\n\n private rejectPendingCommands(error: Error, preserveContext = false): void {\n for (const [messageId, pending] of this.pendingCommands) {\n if (preserveContext && pending.commandType === \"context.update\") continue;\n this.recordCommandResult(\n pending,\n pending.commandType === \"context.update\" ? \"context.rejected\" : \"command.error\",\n \"failed\",\n \"pending_command_cancelled\",\n );\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n pending.reject(pending.commandType === \"context.update\"\n ? new ContextDeliveryError(error.message, { cause: error, retryAfter: pending.transferSettled })\n : error);\n this.pendingCommands.delete(messageId);\n }\n }\n\n private recordCommandResult(\n pending: PendingCommand,\n eventType: \"command.ack\" | \"command.error\" | \"context.updated\" | \"context.rejected\",\n status: \"acknowledged\" | \"rejected\" | \"failed\",\n reason?: string,\n ): void {\n const durationMs = Date.now() - pending.startedAt;\n this.recordDiagnostic({\n operation: \"command_result\",\n status,\n reason,\n message_id: pending.message.message_id,\n connection_id: pending.message.connection_id,\n client_seq: pending.message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n duration_ms: durationMs,\n retry_count: pending.retryCount,\n event_type: eventType,\n });\n if (durationMs > 2_000) this.flushDiagnostics(\"slow_operation\");\n }\n\n private async fetchReplay(\n apiBase: string,\n afterSeq: number,\n options: { signal?: AbortSignal; terminalOnly?: boolean } = {},\n ): Promise<void> {\n const { signal, terminalOnly = false } = options;\n let nextAfter = afterSeq;\n while (true) {\n throwIfAborted(signal);\n const url = `${apiBase}/sessions/${this.id}/events?after_seq=${nextAfter}&limit=200`\n + (terminalOnly ? \"&terminal_only=true\" : \"\");\n let response = await raceWithAbort(this.fetcher(\n url,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: this.lifecycleCredentials,\n signal,\n },\n ), signal);\n if (response.status === 401 && this.refreshCredentialsCallback) {\n await this.refreshCredentials(signal);\n response = await raceWithAbort(this.fetcher(\n url,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: this.lifecycleCredentials,\n signal,\n },\n ), signal);\n }\n if (!response.ok) {\n throw await raceWithAbort(httpError(response, \"Could not replay session events\"), signal);\n }\n const page = (await raceWithAbort(response.json(), signal)) as {\n items: Array<{\n event_id: string;\n server_seq: number;\n type: string;\n payload: Record<string, unknown>;\n created_at: string;\n }>;\n next_after_seq: number;\n has_more: boolean;\n };\n throwIfAborted(signal);\n for (const stored of page.items) {\n nextAfter = Math.max(nextAfter, stored.server_seq);\n const event: RealtimeEvent = {\n protocol_version: 1,\n event_id: stored.event_id,\n stream_id: \"durable-replay\",\n stream_seq: Math.max(this.cursor.lastStreamSeq, 1),\n server_seq: stored.server_seq,\n ts: stored.created_at,\n type: stored.type,\n payload: stored.payload,\n };\n if (!this.cursor.acceptReplay(event)) continue;\n this.observeReadiness(event);\n this.observeConvenienceEvents(event);\n this.notifyListeners(this.listeners, event);\n }\n nextAfter = Math.max(nextAfter, page.next_after_seq);\n if (!page.has_more) return;\n }\n }\n}\n\nfunction resolveAutoRejoinOptions(\n value: boolean | AutoRejoinOptions | undefined,\n): ResolvedAutoRejoinOptions | null {\n if (!value) return null;\n const options = value === true ? {} : value;\n const resolved = {\n maxAttempts: options.maxAttempts ?? Number.MAX_SAFE_INTEGER,\n baseDelayMs: options.baseDelayMs ?? 750,\n maxDelayMs: options.maxDelayMs ?? 5_000,\n timeoutMs: options.timeoutMs ?? 180_000,\n };\n if (!Number.isFinite(resolved.timeoutMs) || resolved.timeoutMs <= 0) {\n throw new TypeError(\"autoRejoin.timeoutMs must be a positive finite number\");\n }\n if (!Number.isInteger(resolved.maxAttempts) || resolved.maxAttempts < 1) {\n throw new TypeError(\"autoRejoin.maxAttempts must be a positive integer\");\n }\n if (!Number.isFinite(resolved.baseDelayMs) || resolved.baseDelayMs < 0) {\n throw new TypeError(\"autoRejoin.baseDelayMs must be a non-negative finite number\");\n }\n if (!Number.isFinite(resolved.maxDelayMs) || resolved.maxDelayMs < 0) {\n throw new TypeError(\"autoRejoin.maxDelayMs must be a non-negative finite number\");\n }\n return resolved;\n}\n\nfunction resolveStartupRetryOptions(\n value: boolean | StartupRetryOptions | undefined,\n): ResolvedStartupRetryOptions | null {\n if (value === false) return null;\n const options = typeof value === \"object\" ? value : {};\n const attempts = (options.attempts ?? DEFAULT_STARTUP_ATTEMPTS).map((attempt) => ({\n readyTimeoutMs: attempt.readyTimeoutMs,\n delayBeforeMs: attempt.delayBeforeMs ?? 0,\n }));\n const timeoutMs = options.timeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;\n\n if (attempts.length === 0) {\n throw new TypeError(\"startupRetry.attempts must contain at least one attempt\");\n }\n for (const attempt of attempts) {\n if (!Number.isFinite(attempt.readyTimeoutMs) || attempt.readyTimeoutMs <= 0) {\n throw new TypeError(\n \"startupRetry.attempts readyTimeoutMs must be a positive finite number\",\n );\n }\n if (!Number.isFinite(attempt.delayBeforeMs) || attempt.delayBeforeMs < 0) {\n throw new TypeError(\n \"startupRetry.attempts delayBeforeMs must be a non-negative finite number\",\n );\n }\n }\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new TypeError(\"startupRetry.timeoutMs must be a positive finite number\");\n }\n return { attempts, timeoutMs };\n}\n\nfunction isTerminalDisconnectReason(reason?: DisconnectReason): boolean {\n return reason !== undefined && [\n DisconnectReason.CLIENT_INITIATED,\n DisconnectReason.DUPLICATE_IDENTITY,\n DisconnectReason.PARTICIPANT_REMOVED,\n DisconnectReason.ROOM_DELETED,\n DisconnectReason.ROOM_CLOSED,\n DisconnectReason.USER_UNAVAILABLE,\n DisconnectReason.USER_REJECTED,\n ].includes(reason);\n}\n\nfunction disconnectReasonName(reason?: DisconnectReason): string {\n if (reason === undefined) return \"unknown\";\n return DisconnectReason[reason] ?? String(reason);\n}\n\nfunction isTerminalRejoinError(error: unknown): boolean {\n return error instanceof RealtimeSessionHttpError\n && [401, 403, 409].includes(error.status);\n}\n\nfunction isTerminalStartupError(error: unknown): boolean {\n if (error instanceof SessionErrorEventError) return !error.retryable;\n if (error instanceof RealtimeSessionHttpError) {\n return error.status >= 400\n && error.status < 500\n && ![408, 425, 429].includes(error.status);\n }\n // Browser fetch also rejects network failures with TypeError. Only our\n // explicit configuration errors are terminal before transport is established.\n if (error instanceof SessionConfigurationError) return true;\n return error instanceof Error && [\n \"ConstraintNotSatisfiedError\",\n \"DevicesNotFoundError\",\n \"InvalidStateError\",\n \"NotAllowedError\",\n \"NotFoundError\",\n \"NotReadableError\",\n \"NotSupportedError\",\n \"OverconstrainedError\",\n \"SecurityError\",\n \"TrackStartError\",\n ].includes(error.name);\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction abortError(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction createLinkedAbortController(parentSignal: AbortSignal): AbortController {\n const controller = new AbortController();\n if (parentSignal.aborted) {\n controller.abort(abortError(parentSignal));\n } else {\n parentSignal.addEventListener(\n \"abort\",\n () => controller.abort(abortError(parentSignal)),\n { once: true },\n );\n }\n return controller;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw abortError(signal);\n}\n\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return promise;\n return new Promise((resolve, reject) => {\n let settled = false;\n const resolveOnce = (value: T) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n };\n const rejectOnce = (error: unknown) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n reject(error);\n };\n const onAbort = () => rejectOnce(abortError(signal));\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n // Always observe the operation, including when it aborted the signal before\n // returning its promise, so a later rejection cannot escape to the caller.\n promise.then(resolveOnce, rejectOnce);\n });\n}\n\nfunction abortableDelay(delayMs: number, signal: AbortSignal): Promise<void> {\n throwIfAborted(signal);\n if (delayMs <= 0) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timeout = globalThis.setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n const onAbort = () => {\n globalThis.clearTimeout(timeout);\n reject(abortError(signal));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction waitUntilOnline(signal: AbortSignal): Promise<void> {\n throwIfAborted(signal);\n if (typeof navigator === \"undefined\" || navigator.onLine !== false) {\n return Promise.resolve();\n }\n if (typeof globalThis.addEventListener !== \"function\") return Promise.resolve();\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n globalThis.removeEventListener(\"online\", onOnline);\n signal.removeEventListener(\"abort\", onAbort);\n };\n const onOnline = () => {\n cleanup();\n resolve();\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n globalThis.addEventListener(\"online\", onOnline, { once: true });\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nasync function sha256Hex(data: Uint8Array): Promise<string> {\n if (!globalThis.crypto?.subtle) throw new Error(\"Web Crypto SHA-256 is unavailable\");\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", Uint8Array.from(data).buffer);\n return [...new Uint8Array(digest)]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction contextStreamId(): string {\n if (globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID();\n return `ctx_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;\n}\n\nfunction contextUpdateBytes(update: ContextUpdate): number {\n return \"image\" in update\n ? update.image.size\n : new TextEncoder().encode(update.text).byteLength;\n}\n\nfunction contextPayloadBytes(payload: Record<string, unknown>): number | undefined {\n const image = payload.image;\n if (image && typeof image === \"object\" && \"bytes\" in image) {\n const bytes = (image as { bytes?: unknown }).bytes;\n if (typeof bytes === \"number\") return bytes;\n }\n const textStream = payload.text_stream;\n if (textStream && typeof textStream === \"object\" && \"bytes\" in textStream) {\n const bytes = (textStream as { bytes?: unknown }).bytes;\n if (typeof bytes === \"number\") return bytes;\n }\n if (typeof payload.text === \"string\") {\n return new TextEncoder().encode(payload.text).byteLength;\n }\n try {\n return new TextEncoder().encode(JSON.stringify(payload)).byteLength;\n } catch {\n return undefined;\n }\n}\n\nfunction contextKeyFromMessage(message: ClientMessage): string | undefined {\n if (message.type !== \"context.update\") return undefined;\n const key = message.payload.key;\n return typeof key === \"string\" ? key : undefined;\n}\n\nfunction diagnosticEventType(type: string): DiagnosticEventType | undefined {\n return type === \"client.hello\" || type === \"context.update\" ? type : undefined;\n}\n\nfunction validateSessionCredentials(value: SessionCredentials): void {\n if (!value || typeof value !== \"object\") {\n throw new SessionConfigurationError(\"Session credentials must be an object\");\n }\n if (!value.id || !value.access_token || !value.access_token_expires_at) {\n throw new SessionConfigurationError(\"Session credentials are incomplete\");\n }\n if (\n !value.connection\n || !value.connection.url\n || !value.connection.token\n || !value.connection.room_name\n ) {\n throw new SessionConfigurationError(\"Session connection credentials are incomplete\");\n }\n}\n\nfunction normalizeApiBase(value: string): string {\n const normalized = value.trim().replace(/\\/+$/, \"\");\n if (!normalized) {\n throw new SessionConfigurationError(\"apiBase must be a non-root relative path or an absolute URL\");\n }\n return normalized;\n}\n\nfunction transcriptEvent(event: RealtimeEvent): TranscriptEvent | null {\n const match = /^transcript\\.(user|agent)\\.(interim|final)$/.exec(event.type);\n if (!match) return null;\n const text = (event.payload as Record<string, unknown>).text;\n if (typeof text !== \"string\") return null;\n return {\n role: match[1] as \"user\" | \"agent\",\n text,\n final: match[2] === \"final\",\n event,\n };\n}\n\nasync function httpError(response: Response, fallback: string): Promise<RealtimeSessionHttpError> {\n let payload: Record<string, unknown> = {};\n try {\n payload = await response.json() as Record<string, unknown>;\n } catch {\n // The HTTP status and fallback message remain actionable without a JSON body.\n }\n return new RealtimeSessionHttpError(\n typeof payload.message === \"string\" ? payload.message : `${fallback} (${response.status})`,\n {\n status: response.status,\n code: typeof payload.error === \"string\" ? payload.error : null,\n requestId: typeof payload.request_id === \"string\" ? payload.request_id : null,\n details: Array.isArray(payload.details) ? payload.details : [],\n },\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["TranscriptStore", "CommandError", "EventCursor", "createClientMessage", "isCommandAckPayload", "isCommandErrorPayload", "isContextRejectedPayload", "isContextUpdatePayload", "isContextUpdatedPayload", "isRealtimeEvent"]
|
|
4
|
+
"sourcesContent": ["import {\n ConnectionState as LiveKitConnectionState,\n DataPacket_Kind,\n DisconnectReason,\n LocalAudioTrack,\n Room,\n RoomEvent,\n RpcError,\n type RpcInvocationData,\n Track,\n} from \"livekit-client\";\n\nimport {\n createClientMessage,\n CommandError,\n EventCursor,\n isCommandAckPayload,\n isCommandErrorPayload,\n isContextRejectedPayload,\n isContextUpdatePayload,\n isContextUpdatedPayload,\n isRealtimeEvent,\n type CommandAckPayload,\n type ClientMessage,\n type ContextUpdate,\n type ContextUpdatePayload,\n type ContextUpdatedPayload,\n type EventGap,\n type RealtimeEvent,\n} from \"./protocol.js\";\nimport { ContextDeliveryError, contextRetryDelay, ReplacementContextQueue } from \"./context-queue.js\";\nimport {\n ClientDiagnosticBuffer,\n DiagnosticDeliveryError,\n type ClientDiagnosticInput,\n type ClientDiagnosticReport,\n type DiagnosticEventType,\n type DiagnosticOperation,\n type RecoveryStage,\n} from \"./diagnostics.js\";\nimport { TranscriptStore, type TranscriptMessage } from \"./transcripts.js\";\nexport { TranscriptStore, type TranscriptMessage } from \"./transcripts.js\";\n\nexport {\n CommandError,\n EventCursor,\n createClientMessage,\n isCommandAckPayload,\n isCommandErrorPayload,\n isContextRejectedPayload,\n isContextUpdatePayload,\n isContextUpdatedPayload,\n isRealtimeEvent,\n} from \"./protocol.js\";\nexport type {\n ClientMessage,\n CommandAckPayload,\n CommandErrorPayload,\n ContextRejectedPayload,\n ContextUpdate,\n ContextUpdatePayload,\n ContextUpdatedPayload,\n EventGap,\n RealtimeEvent,\n} from \"./protocol.js\";\nexport {\n decodeAgentSnapshotPayload,\n decodeClientHelloPayload,\n decodeClientMessage,\n decodeCommandAckPayload,\n decodeCommandErrorPayload,\n decodeContextRejectedPayload,\n decodeContextUpdatePayload,\n decodeContextUpdatedPayload,\n decodeRealtimeEvent,\n} from \"./generated/protocol-codecs.js\";\n\nexport type ConnectionState =\n | \"idle\"\n | \"connecting\"\n | \"connected_not_ready\"\n | \"connected\"\n | \"reconnecting\"\n | \"resuming\"\n | \"disconnected\"\n | \"failed\";\n\nexport type ConnectionQuality =\n | \"unknown\"\n | \"excellent\"\n | \"good\"\n | \"poor\"\n | \"lost\";\n\nexport interface ConnectionCredentials {\n url: string;\n token: string;\n room_name: string;\n}\n\nexport interface SessionCredentials {\n id: string;\n connection: ConnectionCredentials;\n access_token: string;\n access_token_expires_at: string;\n}\n\nexport const SDK_VERSION = \"0.3.14\";\nconst CLIENT_HELLO_TIMEOUT_MS = 30_000;\nconst RECOVERY_BUFFER_STALL_MS = 5_000;\nconst RECOVERY_BUFFER_POLL_MS = 500;\nconst DIAGNOSTIC_REPORT_TIMEOUT_MS = 5_000;\nconst DEFAULT_STARTUP_ATTEMPTS: readonly ResolvedStartupAttempt[] = [\n { delayBeforeMs: 0, readyTimeoutMs: 15_000 },\n { delayBeforeMs: 1_000, readyTimeoutMs: 20_000 },\n { delayBeforeMs: 3_000, readyTimeoutMs: 50_000 },\n];\nconst DEFAULT_STARTUP_TIMEOUT_MS = 90_000;\n\nclass RecoveryDataChannelStalledError extends Error {\n constructor() {\n super(\"Recovery data channel stopped draining before the agent handshake completed\");\n this.name = \"RecoveryDataChannelStalledError\";\n }\n}\n\ntype Listener = (event: RealtimeEvent) => void;\ntype StateListener = (state: ConnectionState) => void;\ntype GapListener = (gap: EventGap) => void;\ntype ConnectionQualityListener = (quality: ConnectionQuality) => void;\ntype RecoveryListener = (event: RecoveryEvent) => void;\ntype StartupAttemptListener = (event: StartupAttemptEvent) => void;\nexport type FetchLike = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\nexport type RemoteAudioTrackListener = (\n track: MediaStreamTrack,\n stream: MediaStream,\n) => void;\nexport interface TranscriptEvent {\n role: \"user\" | \"agent\";\n text: string;\n final: boolean;\n event: RealtimeEvent;\n}\nexport interface ToolCallEvent {\n name: string;\n callId: string;\n arguments: Record<string, unknown>;\n}\nexport interface ConnectOptions {\n microphone?: boolean;\n audioTrack?: MediaStreamTrack;\n readyTimeoutMs?: number;\n waitForRemoteAudio?: boolean;\n apiBase?: string;\n}\nexport interface AutoRejoinOptions {\n maxAttempts?: number;\n baseDelayMs?: number;\n maxDelayMs?: number;\n timeoutMs?: number;\n}\nexport interface StartupAttempt {\n readyTimeoutMs: number;\n delayBeforeMs?: number;\n}\nexport interface StartupRetryOptions {\n attempts?: readonly StartupAttempt[];\n timeoutMs?: number;\n}\nexport interface RealtimeSessionOptions {\n connect?: ConnectOptions;\n tools?: Record<string, ToolHandler>;\n fetch?: FetchLike;\n endEndpoint?: string;\n refreshCredentials?: () => Promise<SessionCredentials>;\n autoRejoin?: boolean | AutoRejoinOptions;\n /** Enabled by default. Set false for a single startup attempt. */\n startupRetry?: boolean | StartupRetryOptions;\n lifecycleCredentials?: RequestCredentials;\n}\nexport interface RealtimeSessionCreateOptions extends Omit<RealtimeSessionOptions, \"connect\"> {\n endpoint: string;\n apiBase: string;\n request?: Omit<RequestInit, \"method\">;\n microphone?: boolean;\n audioTrack?: MediaStreamTrack;\n readyTimeoutMs?: number;\n waitForRemoteAudio?: boolean;\n}\nexport interface EndOptions {\n endpoint?: string;\n request?: RequestInit;\n disconnect?: boolean;\n}\nexport interface AudioPlaybackBlockedEvent {\n error: unknown;\n element: HTMLMediaElement;\n track: MediaStreamTrack;\n}\nexport interface WaitForStateOptions {\n signal?: AbortSignal;\n}\nexport interface RecoveryEvent {\n status: \"started\" | \"succeeded\" | \"failed\";\n strategy: \"livekit\" | \"rejoin\";\n attempt: number;\n trigger: RecoveryTrigger;\n operation?: DiagnosticOperation;\n messageId?: string;\n contextKey?: string;\n timeoutMs?: number;\n error?: Error;\n}\nexport interface StartupAttemptEvent {\n status: \"started\" | \"succeeded\" | \"failed\";\n attempt: number;\n maxAttempts: number;\n readyTimeoutMs: number;\n error?: Error;\n}\n\nexport type RecoveryTrigger =\n | \"manual_rejoin\"\n | \"livekit_reconnecting\"\n | \"livekit_resume_failed\"\n | \"livekit_disconnected\"\n | \"agent_disconnected\"\n | \"worker_replaced\"\n | \"context_transfer_timeout\"\n | \"context_command_timeout\";\n\ntype ResolvedAutoRejoinOptions = {\n maxAttempts: number;\n baseDelayMs: number;\n maxDelayMs: number;\n timeoutMs: number;\n};\n\ntype ResolvedStartupAttempt = {\n readyTimeoutMs: number;\n delayBeforeMs: number;\n};\n\ntype ResolvedStartupRetryOptions = {\n attempts: readonly ResolvedStartupAttempt[];\n timeoutMs: number;\n};\n\ntype ActiveRecovery = {\n strategy: \"livekit\" | \"rejoin\";\n attempt: number;\n details: RecoveryDetails;\n};\n\ntype RecoveryDetails = {\n trigger: RecoveryTrigger;\n operation?: DiagnosticOperation;\n messageId?: string;\n contextKey?: string;\n timeoutMs?: number;\n};\n\ntype DisconnectMode = \"intentional\" | \"rejoin\" | \"connect_failure\" | null;\n\nexport class RealtimeSessionHttpError extends Error {\n readonly status: number;\n readonly code: string | null;\n readonly requestId: string | null;\n readonly details: unknown[];\n\n constructor(\n message: string,\n options: {\n status: number;\n code?: string | null;\n requestId?: string | null;\n details?: unknown[];\n },\n ) {\n super(message);\n this.name = \"RealtimeSessionHttpError\";\n this.status = options.status;\n this.code = options.code ?? null;\n this.requestId = options.requestId ?? null;\n this.details = options.details ?? [];\n }\n}\n\nclass SessionConfigurationError extends TypeError {}\n\nclass SessionErrorEventError extends Error {\n readonly retryable: boolean;\n\n constructor(event: RealtimeEvent) {\n const payload = event.payload as Record<string, unknown>;\n const message = typeof payload.message === \"string\"\n ? payload.message\n : \"VoxEvolv reported a session error\";\n super(message);\n this.name = \"SessionErrorEventError\";\n this.retryable = payload.retryable === true;\n }\n}\ntype PendingCommand = {\n commandType: string;\n message: ClientMessage;\n startedAt: number;\n contextKey?: string;\n payloadBytes?: number;\n retryCount: number;\n publishQueued: boolean;\n resolve: (payload: CommandAckPayload) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof globalThis.setTimeout>;\n retry?: ReturnType<typeof globalThis.setTimeout>;\n settled: Promise<void>;\n markSettled: () => void;\n retryTransfer?: (signal: AbortSignal) => Promise<void>;\n sendController?: AbortController;\n transferRetrying: boolean;\n transferRetryRequested: boolean;\n transferSettled?: Promise<void>;\n};\ntype ContextTransfer = {\n payload: ContextUpdatePayload;\n resend?: (signal: AbortSignal) => Promise<void>;\n};\nexport type ToolHandler = (\n arguments_: Record<string, unknown>,\n context: { callId: string },\n) => unknown | Promise<unknown>;\n\nexport class RealtimeSession {\n readonly id: string;\n readonly room: Room;\n private accessToken: string;\n private credentials: ConnectionCredentials;\n private stateValue: ConnectionState = \"idle\";\n private listeners = new Set<Listener>();\n private stateListeners = new Set<StateListener>();\n private gapListeners = new Set<GapListener>();\n private connectionQualityListeners = new Set<ConnectionQualityListener>();\n private recoveryListeners = new Set<RecoveryListener>();\n private startupAttemptListeners = new Set<StartupAttemptListener>();\n private remoteAudioTrackListeners = new Set<RemoteAudioTrackListener>();\n private remoteAudioTrackUnsubscribedListeners = new Set<RemoteAudioTrackListener>();\n private readyListeners = new Set<(event: RealtimeEvent) => void>();\n private userTranscriptListeners = new Set<(event: TranscriptEvent) => void>();\n private agentTranscriptListeners = new Set<(event: TranscriptEvent) => void>();\n private transcriptListeners = new Set<(message: TranscriptMessage) => void>();\n private transcriptStore = new TranscriptStore();\n private errorListeners = new Set<(event: RealtimeEvent) => void>();\n private endedListeners = new Set<(event: RealtimeEvent) => void>();\n private toolCallListeners = new Set<(event: ToolCallEvent) => void>();\n private audioPlaybackBlockedListeners = new Set<(event: AudioPlaybackBlockedEvent) => void>();\n private remoteAudioStreams = new WeakMap<object, MediaStream>();\n private outputMediaStream: MediaStream | null = null;\n private remoteAudioTrackResolve: (() => void) | null = null;\n private readonly cursor = new EventCursor();\n private connectionId = `conn_${Math.random().toString(36).slice(2)}_${Date.now().toString(36)}`;\n private clientSeq = 0;\n private lastHelloMessageId: string | null = null;\n private reconnectStartedAt: number | null = null;\n private pendingReconnect: {\n started_at: string;\n recovered_at: string;\n duration_ms: number;\n } | null = null;\n private agentReady = false;\n private agentStreamId: string | null = null;\n private contextGeneration = 0;\n private readonly replacementContext = new ReplacementContextQueue(\n (update, timeoutMs) => this.sendContextUpdate(update, timeoutMs),\n );\n private readyResolve: (() => void) | null = null;\n private replayPromise: Promise<void> | null = null;\n private pendingCommands = new Map<string, PendingCommand>();\n private commandPublishTail: Promise<void> = Promise.resolve();\n private toolHandlers = new Map<string, ToolHandler>();\n private apiBase = \"/v1\";\n private hasConnectedValue = false;\n private sessionEnded = false;\n private pendingEndEvent: RealtimeEvent | null = null;\n private agentDisconnected = false;\n private terminalSessionError: SessionErrorEventError | null = null;\n private endNotificationDelivered = false;\n private disconnectMode: DisconnectMode = null;\n private activeRecovery: ActiveRecovery | null = null;\n private recoveryStartedAt: number | null = null;\n private livekitResumeController: AbortController | null = null;\n private terminalReplayController: AbortController | null = null;\n private autoRejoinPromise: Promise<void> | null = null;\n private autoRejoinController: AbortController | null = null;\n private manualRejoinController: AbortController | null = null;\n private startupConnectController: AbortController | null = null;\n private startupAttemptController: AbortController | null = null;\n private useManagedMicrophone = true;\n private microphoneEnabled = true;\n private applicationAudioTrack: MediaStreamTrack | null = null;\n private localApplicationAudioTrack: LocalAudioTrack | null = null;\n private readonly connectDefaults: ConnectOptions;\n private recoveryReadiness: Required<Pick<ConnectOptions, \"readyTimeoutMs\" | \"waitForRemoteAudio\">>;\n private credentialRefreshGeneration = 0;\n private readonly fetcher: FetchLike;\n private readonly endEndpoint: string | null;\n private readonly refreshCredentialsCallback: (() => Promise<SessionCredentials>) | null;\n private readonly autoRejoinOptions: ResolvedAutoRejoinOptions | null;\n private readonly startupRetryOptions: ResolvedStartupRetryOptions | null;\n private readonly lifecycleCredentials: RequestCredentials;\n private readonly diagnostics = new ClientDiagnosticBuffer({ sdkVersion: SDK_VERSION });\n private activeContextTransfers = 0;\n private contextTransferControllers = new Set<AbortController>();\n private activeContextBytes = 0;\n private diagnosticLoopTimer: ReturnType<typeof setInterval> | undefined;\n private diagnosticLoopExpectedAt = 0;\n private diagnosticLoopDelayMs: number | undefined;\n private readonly diagnosticReportTimeoutMs = DIAGNOSTIC_REPORT_TIMEOUT_MS;\n private readonly onDiagnosticVisibilityChange = (): void => {\n if (globalThis.document?.visibilityState === \"hidden\") this.flushDiagnostics(\"page_hidden\");\n };\n\n constructor(credentials: SessionCredentials, options: RealtimeSessionOptions = {}) {\n validateSessionCredentials(credentials);\n this.id = credentials.id;\n this.accessToken = credentials.access_token;\n this.credentials = credentials.connection;\n this.connectDefaults = options.connect?.apiBase === undefined\n ? (options.connect ?? {})\n : { ...options.connect, apiBase: normalizeApiBase(options.connect.apiBase) };\n this.apiBase = this.connectDefaults.apiBase ?? this.apiBase;\n this.recoveryReadiness = {\n readyTimeoutMs: this.connectDefaults.readyTimeoutMs ?? 15_000,\n waitForRemoteAudio: this.connectDefaults.waitForRemoteAudio ?? true,\n };\n this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);\n this.endEndpoint = options.endEndpoint ?? null;\n this.refreshCredentialsCallback = options.refreshCredentials ?? null;\n this.autoRejoinOptions = resolveAutoRejoinOptions(options.autoRejoin);\n this.startupRetryOptions = resolveStartupRetryOptions(options.startupRetry);\n this.lifecycleCredentials = options.lifecycleCredentials ?? \"same-origin\";\n this.room = new Room({ adaptiveStream: true, dynacast: true });\n for (const [name, handler] of Object.entries(options.tools ?? {})) {\n this.registerTool(name, handler);\n }\n this.room.registerRpcMethod(\"voxevolv.tool.invoke\", (invocation) => this.invokeBrowserTool(invocation));\n this.room.registerRpcMethod(\"voxevolv.diagnostics.flush\", async (invocation) => {\n const payload = JSON.parse(invocation.payload);\n if (typeof payload?.call_id !== \"string\" || payload.call_id.length > 200) {\n throw new RpcError(1500, \"Invalid diagnostic request\");\n }\n this.recordDiagnostic({\n operation: \"tool_rpc\", status: \"started\", stage: \"flush_requested\",\n call_id: payload.call_id, rpc_request_id: invocation.requestId,\n });\n // HTTP delivery has its own retry/receipt handling; never await it on the RPC channel.\n this.flushDiagnostics(\"tool_rpc_worker_request\");\n return \"{}\";\n });\n this.bindRoomEvents();\n }\n\n private async invokeBrowserTool(invocation: RpcInvocationData): Promise<string> {\n const receivedAt = performance.now();\n let callId: string | undefined;\n let toolName: string | undefined;\n let slowTimer: ReturnType<typeof setTimeout> | undefined;\n const record = (entry: Partial<ClientDiagnosticInput>) => this.recordDiagnostic({\n operation: \"tool_rpc\", status: \"started\", rpc_request_id: invocation.requestId,\n call_id: callId, tool_name: toolName,\n duration_ms: performance.now() - receivedAt, ...entry,\n });\n record({ stage: \"received\" });\n try {\n let payload: { name?: unknown; call_id?: unknown; arguments?: unknown };\n try {\n payload = JSON.parse(invocation.payload) as typeof payload;\n } catch (error) {\n throw new RpcError(1500, \"Tool invocation payload was not valid JSON\", undefined, { cause: error });\n }\n if (typeof payload?.name !== \"string\") {\n throw new RpcError(1500, \"Tool invocation did not include a valid name\");\n }\n toolName = payload.name;\n callId = typeof payload.call_id === \"string\" ? payload.call_id : invocation.requestId;\n const handler = this.toolHandlers.get(toolName);\n if (!handler) throw new RpcError(1500, `No browser handler is registered for ${toolName}`);\n if (!payload.arguments || typeof payload.arguments !== \"object\" || Array.isArray(payload.arguments)) {\n throw new RpcError(1500, \"Tool invocation arguments must be an object\");\n }\n const arguments_ = payload.arguments as Record<string, unknown>;\n this.notifyListeners(this.toolCallListeners, { name: toolName, callId, arguments: arguments_ });\n record({ stage: \"handler_started\" });\n this.flushDiagnostics(\"tool_rpc_received\");\n slowTimer = globalThis.setTimeout(() => {\n record({ stage: \"handler_started\", reason: \"handler_slow\" });\n this.flushDiagnostics(\"tool_rpc_slow\");\n }, 2_000);\n let response: string;\n try {\n const result = await handler(arguments_, { callId });\n response = JSON.stringify(result ?? null);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Browser tool handler failed\";\n throw new RpcError(1500, message, undefined, { cause: error });\n }\n // LiveKit sends the response after this callback returns. This is readiness,\n // not proof of a network send or acknowledgement by the worker.\n record({ stage: \"response_ready\", status: \"succeeded\" });\n return response;\n } catch (error) {\n record({ status: \"failed\", rpc_error_code: error instanceof RpcError ? error.code : undefined });\n throw error;\n } finally {\n globalThis.clearTimeout(slowTimer);\n this.flushDiagnostics(\"tool_rpc_finished\");\n }\n }\n\n static async create(options: RealtimeSessionCreateOptions): Promise<RealtimeSession> {\n if (\"connect\" in options) {\n throw new TypeError(\n \"RealtimeSession.create() accepts apiBase and media options at the top level, not in connect\",\n );\n }\n const {\n endpoint,\n request,\n microphone,\n audioTrack,\n readyTimeoutMs,\n waitForRemoteAudio,\n apiBase,\n ...sessionOptions\n } = options;\n if (!endpoint) throw new TypeError(\"endpoint is required\");\n if (!apiBase) {\n throw new TypeError(\n \"apiBase is required so rejoin, replay, and end use the intended VoxEvolv API or application proxy\",\n );\n }\n const normalizedApiBase = normalizeApiBase(apiBase);\n const fetcher = sessionOptions.fetch ?? globalThis.fetch.bind(globalThis);\n const response = await fetcher(endpoint, { ...request, method: \"POST\" });\n if (!response.ok) throw await httpError(response, \"Could not create realtime session\");\n const credentials = await response.json() as SessionCredentials;\n return new RealtimeSession(credentials, {\n ...sessionOptions,\n fetch: fetcher,\n connect: { microphone, audioTrack, readyTimeoutMs, waitForRemoteAudio, apiBase: normalizedApiBase },\n });\n }\n\n get state(): ConnectionState {\n return this.stateValue;\n }\n\n get hasConnectedBefore(): boolean {\n return this.hasConnectedValue;\n }\n\n /**\n * Stable stream holding the agent's current remote audio tracks. The stream\n * object never changes across track arrival, reconnects, or rejoin; tracks\n * are added and removed as the room subscribes and unsubscribes them.\n */\n get outputStream(): MediaStream {\n this.outputMediaStream ??= new MediaStream();\n return this.outputMediaStream;\n }\n\n onEvent(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n onStateChange(listener: StateListener): () => void {\n this.stateListeners.add(listener);\n this.notifyListeners(new Set([listener]), this.stateValue);\n return () => this.stateListeners.delete(listener);\n }\n\n onProtocolGap(listener: GapListener): () => void {\n this.gapListeners.add(listener);\n return () => this.gapListeners.delete(listener);\n }\n\n onConnectionQuality(listener: ConnectionQualityListener): () => void {\n this.connectionQualityListeners.add(listener);\n this.notifyListeners(\n new Set([listener]),\n this.room.localParticipant.connectionQuality as ConnectionQuality,\n );\n return () => this.connectionQualityListeners.delete(listener);\n }\n\n onRecovery(listener: RecoveryListener): () => void {\n this.recoveryListeners.add(listener);\n return () => this.recoveryListeners.delete(listener);\n }\n\n onStartupAttempt(listener: StartupAttemptListener): () => void {\n this.startupAttemptListeners.add(listener);\n return () => this.startupAttemptListeners.delete(listener);\n }\n\n waitForState(\n states: readonly ConnectionState[],\n timeoutMs: number,\n options: WaitForStateOptions = {},\n ): Promise<ConnectionState> {\n if (!states.length) throw new TypeError(\"states must contain at least one connection state\");\n if (!Number.isFinite(timeoutMs) || timeoutMs < 0) {\n throw new TypeError(\"timeoutMs must be a non-negative finite number\");\n }\n const targets = new Set(states);\n if (targets.has(this.stateValue)) return Promise.resolve(this.stateValue);\n if (options.signal?.aborted) {\n return Promise.reject(options.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n }\n return new Promise((resolve, reject) => {\n let settled = false;\n const finish = (state: ConnectionState | null, error?: unknown) => {\n if (settled) return;\n settled = true;\n globalThis.clearTimeout(timeout);\n this.stateListeners.delete(onState);\n options.signal?.removeEventListener(\"abort\", onAbort);\n if (error !== undefined) {\n reject(error);\n } else if (state !== null) {\n resolve(state);\n }\n };\n const onState = (state: ConnectionState) => {\n if (targets.has(state)) finish(state);\n };\n const onAbort = () => {\n finish(null, options.signal?.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n };\n const timeout = globalThis.setTimeout(() => {\n finish(\n null,\n new Error(`Session did not reach ${states.join(\" or \")} within ${timeoutMs}ms`),\n );\n }, timeoutMs);\n this.stateListeners.add(onState);\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n onRemoteAudioTrack(listener: RemoteAudioTrackListener): () => void {\n this.remoteAudioTrackListeners.add(listener);\n return () => this.remoteAudioTrackListeners.delete(listener);\n }\n\n onRemoteAudioTrackUnsubscribed(listener: RemoteAudioTrackListener): () => void {\n this.remoteAudioTrackUnsubscribedListeners.add(listener);\n return () => this.remoteAudioTrackUnsubscribedListeners.delete(listener);\n }\n\n onReady(listener: (event: RealtimeEvent) => void): () => void {\n this.readyListeners.add(listener);\n return () => this.readyListeners.delete(listener);\n }\n\n onUserTranscript(listener: (event: TranscriptEvent) => void): () => void {\n this.userTranscriptListeners.add(listener);\n return () => this.userTranscriptListeners.delete(listener);\n }\n\n onAgentTranscript(listener: (event: TranscriptEvent) => void): () => void {\n this.agentTranscriptListeners.add(listener);\n return () => this.agentTranscriptListeners.delete(listener);\n }\n\n /** Latest message snapshots, retained across transport recovery and replay. */\n get transcript(): readonly TranscriptMessage[] {\n return this.transcriptStore.snapshot;\n }\n\n onTranscriptUpdated(listener: (message: TranscriptMessage) => void): () => void {\n this.transcriptListeners.add(listener);\n return () => this.transcriptListeners.delete(listener);\n }\n\n onError(listener: (event: RealtimeEvent) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n onEnded(listener: (event: RealtimeEvent) => void): () => void {\n this.endedListeners.add(listener);\n return () => this.endedListeners.delete(listener);\n }\n\n onToolCall(listener: (event: ToolCallEvent) => void): () => void {\n this.toolCallListeners.add(listener);\n return () => this.toolCallListeners.delete(listener);\n }\n\n onAudioPlaybackBlocked(listener: (event: AudioPlaybackBlockedEvent) => void): () => void {\n this.audioPlaybackBlockedListeners.add(listener);\n return () => this.audioPlaybackBlockedListeners.delete(listener);\n }\n\n registerTool(name: string, handler: ToolHandler): () => void {\n if (\n [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\", \"resuming\"]\n .includes(this.stateValue)\n ) {\n throw new Error(\"Browser tools must be registered before connect()\");\n }\n if (!/^[a-z][a-z0-9_]{0,79}$/.test(name)) {\n throw new TypeError(\"Tool name must be lowercase letters, numbers, and underscores\");\n }\n if (this.toolHandlers.has(name)) throw new TypeError(`Tool ${name} is already registered`);\n this.toolHandlers.set(name, handler);\n return () => {\n if (this.toolHandlers.get(name) === handler) this.toolHandlers.delete(name);\n };\n }\n\n async connect(options: ConnectOptions = {}): Promise<void> {\n if (this.startupConnectController || this.manualRejoinController) {\n throw new Error(\"A session connection attempt is already in progress\");\n }\n if (\n [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\", \"resuming\"]\n .includes(this.stateValue)\n ) {\n throw new Error(`Cannot connect while session is ${this.stateValue}`);\n }\n this.cancelRecovery();\n const controller = new AbortController();\n this.startupConnectController = controller;\n this.credentialRefreshGeneration += 1;\n const resolved = { ...this.connectDefaults, ...options };\n // Keep caller preferences separate from temporary startup-attempt budgets.\n this.recoveryReadiness = {\n readyTimeoutMs: resolved.readyTimeoutMs ?? 15_000,\n waitForRemoteAudio: resolved.waitForRemoteAudio ?? true,\n };\n this.microphoneEnabled = resolved.audioTrack\n ? resolved.audioTrack.enabled !== false\n : resolved.microphone ?? true;\n this.setState(\"connecting\");\n try {\n if (this.startupRetryOptions) {\n await this.connectWithStartupRetry(options, controller);\n } else {\n this.startupAttemptController = controller;\n await this.connectWithMode(options, false, controller.signal, false);\n }\n } catch (error) {\n if (this.startupConnectController === controller && this.terminalSessionError) {\n this.sessionEnded = true;\n this.setState(\"failed\");\n } else if (this.startupConnectController === controller && !this.sessionEnded) {\n this.setState(\"failed\");\n }\n throw error;\n } finally {\n if (this.startupAttemptController === controller) {\n this.startupAttemptController = null;\n }\n if (this.startupConnectController === controller) {\n this.startupConnectController = null;\n }\n }\n }\n\n private async connectWithStartupRetry(\n options: ConnectOptions,\n controller: AbortController,\n ): Promise<void> {\n const startupOptions = this.startupRetryOptions;\n if (!startupOptions) return;\n const startupStartedAt = performance.now();\n const timeout = globalThis.setTimeout(() => {\n controller.abort(new Error(\n `Session startup did not complete within ${startupOptions.timeoutMs}ms`,\n ));\n }, startupOptions.timeoutMs);\n let lastError = new Error(\"Session startup failed\");\n let startupRegistered = this.hasConnectedValue;\n this.apiBase = normalizeApiBase(options.apiBase ?? this.connectDefaults.apiBase ?? this.apiBase);\n\n try {\n for (const [index, attempt] of startupOptions.attempts.entries()) {\n const attemptNumber = index + 1;\n if (attempt.delayBeforeMs > 0) {\n this.setState(\"connecting\");\n await abortableDelay(attempt.delayBeforeMs, controller.signal);\n }\n throwIfAborted(controller.signal);\n\n const attemptController = createLinkedAbortController(controller.signal);\n this.startupAttemptController = attemptController;\n this.notifyStartupAttempt(\"started\", attemptNumber, attempt.readyTimeoutMs);\n try {\n if (!startupRegistered) {\n const remainingMs = startupOptions.timeoutMs - (performance.now() - startupStartedAt);\n await this.registerStartupRecovery(remainingMs, attemptController.signal);\n startupRegistered = true;\n }\n throwIfAborted(attemptController.signal);\n if (index === 0) {\n await this.connectWithMode(\n { ...options, readyTimeoutMs: attempt.readyTimeoutMs },\n false,\n attemptController.signal,\n false,\n );\n } else {\n await this.performRejoin(this.apiBase, {\n signal: attemptController.signal,\n recovering: false,\n connect: { ...options, readyTimeoutMs: attempt.readyTimeoutMs },\n markFailureTerminal: false,\n });\n }\n throwIfAborted(controller.signal);\n this.notifyStartupAttempt(\"succeeded\", attemptNumber, attempt.readyTimeoutMs);\n return;\n } catch (error) {\n lastError = toError(error);\n this.notifyStartupAttempt(\"failed\", attemptNumber, attempt.readyTimeoutMs, lastError);\n if (controller.signal.aborted) throw abortError(controller.signal);\n if (isTerminalStartupError(error) || attemptNumber === startupOptions.attempts.length) {\n throw error;\n }\n this.setState(\"connecting\");\n } finally {\n if (this.startupAttemptController === attemptController) {\n this.startupAttemptController = null;\n }\n }\n }\n throw lastError;\n } finally {\n globalThis.clearTimeout(timeout);\n }\n }\n\n private async registerStartupRecovery(timeoutMs: number, signal: AbortSignal): Promise<void> {\n const reserveMs = Math.min(5_000, timeoutMs / 10);\n const controller = createLinkedAbortController(signal);\n const requestTimeout = globalThis.setTimeout(() => {\n controller.abort(new Error(\"Startup registration timed out\"));\n }, Math.max(1, reserveMs));\n try {\n // Leave room for registration latency and final readiness before the\n // browser's existing overall deadline. Rejoins never renew this window.\n const send = () => raceWithAbort(this.fetcher(`${this.apiBase}/sessions/${this.id}/startup`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.accessToken}`, \"Content-Type\": \"application/json\" },\n credentials: this.lifecycleCredentials,\n body: JSON.stringify({ timeout_ms: Math.max(1, Math.floor(Math.min(timeoutMs - reserveMs, 85_000))) }),\n signal: controller.signal,\n }), controller.signal);\n let response = await send();\n if (response.status === 401 && this.refreshCredentialsCallback) {\n await this.refreshCredentials(controller.signal);\n response = await send();\n }\n if (!response.ok) throw await httpError(response, \"Could not register session startup\");\n const body = await raceWithAbort(response.json(), controller.signal) as { remaining_ms?: number };\n if (typeof body.remaining_ms !== \"number\" || body.remaining_ms <= 0) {\n throw new Error(\"Session startup window has expired\");\n }\n } finally {\n globalThis.clearTimeout(requestTimeout);\n }\n }\n\n private notifyStartupAttempt(\n status: StartupAttemptEvent[\"status\"],\n attempt: number,\n readyTimeoutMs: number,\n error?: Error,\n ): void {\n const maxAttempts = this.startupRetryOptions?.attempts.length ?? 1;\n this.notifyListeners(this.startupAttemptListeners, {\n status,\n attempt,\n maxAttempts,\n readyTimeoutMs,\n ...(error ? { error } : {}),\n });\n }\n\n private async connectWithMode(\n options: ConnectOptions,\n recovering: boolean,\n signal?: AbortSignal,\n markFailureTerminal = true,\n ): Promise<void> {\n throwIfAborted(signal);\n const blockedStates: ConnectionState[] = recovering\n ? [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\"]\n : [\"connecting\", \"connected_not_ready\", \"connected\", \"reconnecting\", \"resuming\"];\n const continuingStartupRetry = (\n !recovering\n && !markFailureTerminal\n && this.stateValue === \"connecting\"\n );\n if (blockedStates.includes(this.stateValue) && !continuingStartupRetry) {\n throw new Error(`Cannot connect while session is ${this.stateValue}`);\n }\n const generation = this.contextGeneration;\n const resolved = { ...this.connectDefaults, ...options };\n const audioTrack = resolved.audioTrack ?? null;\n const microphone = resolved.microphone ?? audioTrack === null;\n const readyTimeoutMs = resolved.readyTimeoutMs ?? 15_000;\n const waitForRemoteAudio = resolved.waitForRemoteAudio ?? true;\n const apiBase = normalizeApiBase(resolved.apiBase ?? this.apiBase);\n this.validateAudioOptions(microphone, audioTrack);\n this.useManagedMicrophone = microphone;\n this.applicationAudioTrack = audioTrack;\n if (!recovering) {\n this.sessionEnded = false;\n this.agentStreamId = null;\n this.reconnectStartedAt = null;\n this.pendingEndEvent = null;\n this.agentDisconnected = false;\n this.terminalSessionError = null;\n this.endNotificationDelivered = false;\n this.setState(\"connecting\");\n } else {\n this.setState(\"resuming\");\n }\n this.apiBase = apiBase;\n this.agentReady = false;\n try {\n await this.measureRecoveryStage(\n \"room_connect\", () => this.connectRoom(signal, recovering), recovering,\n );\n throwIfAborted(signal);\n if (audioTrack) {\n await raceWithAbort(this.publishApplicationAudioTrack(audioTrack), signal);\n } else if (microphone) {\n await raceWithAbort(\n this.room.localParticipant.setMicrophoneEnabled(this.microphoneEnabled),\n signal,\n );\n }\n throwIfAborted(signal);\n this.setState(recovering ? \"resuming\" : \"connected_not_ready\");\n await this.measureRecoveryStage(\"hello\", () => (\n recovering ? this.sendRecoveryHello(signal) : raceWithAbort(this.sendHello(), signal)\n ), recovering);\n const readyDeadline = Date.now() + readyTimeoutMs;\n await this.measureRecoveryStage(\n \"agent_ready\", () => this.waitForAgentReady(readyTimeoutMs, signal), recovering,\n );\n if (waitForRemoteAudio) {\n await this.measureRecoveryStage(\n \"remote_audio\", () => this.waitForRemoteAudioTrack(readyDeadline, signal), recovering,\n );\n }\n throwIfAborted(signal);\n if (this.sessionEnded || generation !== this.contextGeneration) {\n throw new Error(\"Connection restoration interrupted\");\n }\n this.resumeContextDelivery(recovering);\n throwIfAborted(signal);\n if (this.sessionEnded || generation !== this.contextGeneration) {\n throw new Error(\"Connection restoration interrupted\");\n }\n this.hasConnectedValue = true;\n this.setState(\"connected\");\n } catch (error) {\n if (signal?.aborted) this.rejectPendingCommands(toError(abortError(signal)));\n this.disconnectMode = recovering ? \"rejoin\" : \"connect_failure\";\n try {\n await this.room.disconnect();\n } catch {\n // Preserve the original connection/readiness failure.\n } finally {\n this.disconnectMode = null;\n }\n if (!recovering && markFailureTerminal) this.setState(\"failed\");\n throw error;\n }\n }\n\n private connectRoom(signal: AbortSignal | undefined, recovering: boolean): Promise<void> {\n throwIfAborted(signal);\n const connection = this.room.connect(this.credentials.url, this.credentials.token);\n if (!signal) return connection;\n\n return new Promise((resolve, reject) => {\n let settled = false;\n const resolveOnce = () => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n const rejectOnce = (error: unknown) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n reject(error);\n };\n const onAbort = () => {\n this.disconnectMode = recovering ? \"rejoin\" : \"connect_failure\";\n void this.room.disconnect().catch(() => {});\n rejectOnce(abortError(signal));\n };\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n connection.then(resolveOnce, rejectOnce);\n });\n }\n\n async rejoin(apiBase = this.apiBase): Promise<void> {\n if (this.startupConnectController || this.manualRejoinController) {\n throw new Error(\"A session connection attempt is already in progress\");\n }\n if (this.sessionEnded) {\n throw this.terminalSessionError ?? new Error(\"Cannot rejoin a session that has ended\");\n }\n if ([\"connecting\", \"connected_not_ready\", \"reconnecting\", \"resuming\"].includes(this.stateValue)) {\n throw new Error(`Cannot rejoin while session is ${this.stateValue}`);\n }\n this.cancelRecovery();\n const normalizedApiBase = normalizeApiBase(apiBase);\n const recovering = this.hasConnectedValue;\n const controller = new AbortController();\n this.manualRejoinController = controller;\n if (recovering) {\n this.beginRecovery(\"rejoin\", 1, { trigger: \"manual_rejoin\" });\n this.setState(\"resuming\");\n }\n try {\n await this.performRejoin(normalizedApiBase, { recovering, signal: controller.signal });\n if (this.sessionEnded) return;\n if (recovering) this.completeRecovery();\n } catch (error) {\n if (controller.signal.aborted && !this.terminalSessionError) return;\n const normalizedError = toError(error);\n if (recovering) this.failRecovery(normalizedError);\n this.setState(\"failed\");\n throw error;\n } finally {\n if (this.manualRejoinController === controller) {\n this.manualRejoinController = null;\n }\n }\n }\n\n private async performRejoin(\n apiBase: string,\n options: {\n signal?: AbortSignal;\n recovering?: boolean;\n connect?: ConnectOptions;\n markFailureTerminal?: boolean;\n } = {},\n ): Promise<void> {\n const {\n signal,\n recovering = true,\n connect,\n markFailureTerminal = true,\n } = options;\n this.contextGeneration += 1;\n this.replacementContext.pause();\n this.rejectPendingCommands(new Error(\"Restoring the session\"));\n let response = await this.fetchRoomToken(apiBase, signal, recovering);\n if (response.status === 401 && this.refreshCredentialsCallback) {\n await this.refreshCredentials(signal);\n throwIfAborted(signal);\n response = await this.fetchRoomToken(apiBase, signal, recovering);\n }\n // A live ending may arrive while token renewal is in flight.\n if (this.sessionEnded) {\n if (this.terminalSessionError) throw this.terminalSessionError;\n return;\n }\n if (!response.ok) {\n if (response.status === 409 && await this.recoverSessionEnd(apiBase, signal)) return;\n throw await raceWithAbort(httpError(response, \"Could not renew room token\"), signal);\n }\n const payload = (await raceWithAbort(response.json(), signal)) as {\n connection: ConnectionCredentials;\n };\n throwIfAborted(signal);\n this.credentials = payload.connection;\n if (this.room.state !== LiveKitConnectionState.Disconnected) {\n this.disconnectMode = \"rejoin\";\n try {\n await this.measureRecoveryStage(\n \"room_disconnect\", () => raceWithAbort(this.room.disconnect(), signal), recovering,\n );\n } finally {\n this.disconnectMode = null;\n }\n }\n throwIfAborted(signal);\n if (recovering && this.reconnectStartedAt !== null) {\n this.pendingReconnect = {\n started_at: new Date(this.reconnectStartedAt).toISOString(),\n recovered_at: new Date().toISOString(),\n duration_ms: Date.now() - this.reconnectStartedAt,\n };\n }\n // Startup retries resolve the original caller options with constructor defaults.\n // A later rejoin restores the audio settings saved by the previous connection.\n const connectionOptions = connect ?? {\n ...this.recoveryReadiness,\n microphone: this.useManagedMicrophone,\n ...(this.applicationAudioTrack ? { audioTrack: this.applicationAudioTrack } : {}),\n };\n await this.connectWithMode({ ...connectionOptions, apiBase }, recovering, signal, markFailureTerminal);\n }\n\n async setMicrophoneEnabled(enabled: boolean): Promise<void> {\n // Recovery must see the user's latest intent while the media operation waits.\n this.microphoneEnabled = enabled;\n if (this.applicationAudioTrack) {\n // The room may not know this track yet while publication is pending.\n const track = this.localApplicationAudioTrack;\n if (enabled) await track?.unmute();\n else await track?.mute();\n return;\n }\n await this.room.localParticipant.setMicrophoneEnabled(enabled);\n }\n\n async sendCommand<T extends Record<string, unknown>>(\n type: string,\n payload: T,\n timeoutMs = 10_000,\n ): Promise<CommandAckPayload> {\n const message = createClientMessage(\n this.connectionId,\n ++this.clientSeq,\n type,\n payload,\n );\n return this.sendTrackedCommand(message, timeoutMs);\n }\n\n async updateContext(\n update: ContextUpdate,\n timeoutMs = 20_000,\n ): Promise<ContextUpdatedPayload> {\n if (this.sessionEnded || [\"failed\", \"disconnected\"].includes(this.stateValue)) {\n throw new Error(\"Cannot update context while the session is inactive\");\n }\n if (update.mode === \"replace\") return this.replacementContext.submit(update, timeoutMs);\n if (this.activeRecovery) throw new Error(\"Cannot append context during recovery\");\n return this.sendContextUpdate(update, timeoutMs);\n }\n\n private async sendContextUpdate(update: ContextUpdate, timeoutMs: number): Promise<ContextUpdatedPayload> {\n const generation = this.contextGeneration;\n const controller = new AbortController();\n this.contextTransferControllers.add(controller);\n const payloadBytes = contextUpdateBytes(update);\n const transferStartedAt = Date.now();\n let transferTimedOut = false;\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"started\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n });\n this.activeContextTransfers += 1;\n this.activeContextBytes += payloadBytes;\n const uploading = (\"image\" in update\n ? this.uploadImageContext(update, controller.signal)\n : this.uploadTextContext(update, controller.signal))\n .finally(() => {\n this.contextTransferControllers.delete(controller);\n this.activeContextTransfers -= 1;\n this.activeContextBytes -= payloadBytes;\n });\n const transferSettled = uploading.then(() => {}, () => {});\n let transferTimeout: ReturnType<typeof setTimeout> | undefined;\n const transferExpired = new Promise<never>((_resolve, reject) => {\n transferTimeout = globalThis.setTimeout(() => {\n transferTimedOut = true;\n const error = new ContextDeliveryError(`Context transfer timed out after ${timeoutMs}ms`, {\n retryAfter: transferSettled,\n });\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"timed_out\",\n reason: \"context_transfer_timeout\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n duration_ms: Date.now() - transferStartedAt,\n timeout_ms: timeoutMs,\n });\n this.flushDiagnostics(\"context_transfer_timeout\");\n controller.abort(error);\n reject(error);\n }, timeoutMs);\n });\n let transfer: ContextTransfer;\n try {\n transfer = await Promise.race([\n uploading,\n transferExpired,\n ]);\n } catch (error) {\n if (!transferTimedOut) {\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"failed\",\n reason: \"context_transfer_failed\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n duration_ms: Date.now() - transferStartedAt,\n });\n this.flushDiagnostics(\"command_failed\");\n }\n if (error instanceof TypeError || error instanceof ContextDeliveryError) throw error;\n throw new ContextDeliveryError(toError(error).message, { cause: error });\n } finally {\n globalThis.clearTimeout(transferTimeout);\n }\n const transferDurationMs = Date.now() - transferStartedAt;\n this.recordDiagnostic({\n operation: \"context_transfer\",\n status: \"succeeded\",\n context_key: update.key,\n payload_bytes: payloadBytes,\n duration_ms: transferDurationMs,\n });\n if (transferDurationMs > 2_000) this.flushDiagnostics(\"slow_operation\");\n if (generation !== this.contextGeneration) throw new Error(\"Context transfer interrupted by recovery\");\n const { payload } = transfer;\n if (!isContextUpdatePayload(payload)) {\n throw new TypeError(\"Invalid context update payload\");\n }\n const message = createClientMessage(\n this.connectionId,\n ++this.clientSeq,\n \"context.update\",\n { ...payload },\n );\n return this.sendTrackedCommand(\n message,\n timeoutMs,\n transfer.resend,\n ) as Promise<ContextUpdatedPayload>;\n }\n\n private resumeContextDelivery(restore: boolean): void {\n // Audio readiness owns connection recovery. Context delivery has its own\n // deadlines and retries, and may be interrupted by a later disconnect.\n void this.replacementContext.resume(restore).catch(() => {});\n }\n\n private async uploadTextContext(\n update: Extract<ContextUpdate, { text: string }>, signal: AbortSignal,\n ): Promise<ContextTransfer> {\n const data = new TextEncoder().encode(update.text);\n if (data.byteLength === 0) throw new TypeError(\"Context text cannot be empty\");\n if (data.byteLength > 262_144) {\n throw new TypeError(\"Context text must be at most 262144 UTF-8 bytes\");\n }\n const base = {\n key: update.key,\n mode: update.mode,\n label: update.label ?? \"\",\n respond: update.respond ?? false,\n };\n if (data.byteLength <= 32_768) return { payload: { ...base, text: update.text } };\n const sha256 = await sha256Hex(data);\n const streamId = contextStreamId();\n const send = async (signal: AbortSignal) => {\n signal.throwIfAborted();\n // The optional signal is implemented by our version-pinned LiveKit patch.\n const options = {\n streamId,\n topic: \"voxevolv.context.text\",\n totalSize: data.byteLength,\n attributes: { sha256 },\n signal,\n };\n const writer = await this.room.localParticipant.streamText(options);\n await writer.write(update.text);\n await writer.close();\n };\n await send(signal);\n return {\n payload: {\n ...base,\n text_stream: { stream_id: streamId, bytes: data.byteLength, sha256 },\n },\n resend: send,\n };\n }\n\n private async uploadImageContext(\n update: Extract<ContextUpdate, { image: Blob }>, signal: AbortSignal,\n ): Promise<ContextTransfer> {\n const allowed = new Set([\"image/jpeg\", \"image/png\", \"image/webp\"]);\n if (!allowed.has(update.image.type)) {\n throw new TypeError(\"Image context must be JPEG, PNG, or WebP\");\n }\n const data = new Uint8Array(await update.image.arrayBuffer());\n if (data.byteLength === 0 || data.byteLength > 5_242_880) {\n throw new TypeError(\"Image context must be between 1 byte and 5 MiB\");\n }\n const sha256 = await sha256Hex(data);\n const streamId = contextStreamId();\n const send = async (signal: AbortSignal) => {\n signal.throwIfAborted();\n const options = {\n streamId,\n topic: \"voxevolv.context.image\",\n name: \"context-image\",\n mimeType: update.image.type,\n totalSize: data.byteLength,\n attributes: { sha256 },\n signal,\n };\n const writer = await this.room.localParticipant.streamBytes(options);\n await writer.write(data);\n await writer.close();\n };\n await send(signal);\n return {\n payload: {\n key: update.key,\n mode: \"replace\",\n label: update.label ?? \"\",\n image: {\n stream_id: streamId,\n mime: update.image.type as \"image/jpeg\" | \"image/png\" | \"image/webp\",\n bytes: data.byteLength,\n sha256,\n ...(update.width === undefined ? {} : { width: update.width }),\n ...(update.height === undefined ? {} : { height: update.height }),\n detail: update.detail ?? \"low\",\n },\n respond: update.respond ?? false,\n },\n resend: send,\n };\n }\n\n async disconnect(): Promise<void> {\n this.abortStartupConnect(new Error(\"Session disconnected\"));\n this.startupConnectController = null;\n this.failRecovery(new Error(\"Session disconnected during recovery\"));\n this.cancelRecovery();\n this.contextGeneration += 1;\n this.localApplicationAudioTrack = null;\n this.replacementContext.clear(new Error(\"Session disconnected\"));\n if (this.stateValue === \"disconnected\") return;\n this.rejectPendingCommands(new Error(\"Session disconnected before command completion\"));\n this.disconnectMode = \"intentional\";\n try {\n await this.room.disconnect();\n } finally {\n this.disconnectMode = null;\n this.activeRecovery = null;\n this.setState(\"disconnected\");\n }\n }\n\n async end(options: EndOptions = {}): Promise<void> {\n this.credentialRefreshGeneration += 1;\n this.abortStartupConnect(new Error(\"Session ended\"));\n this.startupConnectController = null;\n this.failRecovery(new Error(\"Session ended during recovery\"));\n this.cancelRecovery();\n this.sessionEnded = true;\n const endpoint = options.endpoint ?? this.endEndpoint ?? `${this.apiBase}/sessions/${this.id}`;\n const request = options.request ?? {};\n const headers = new Headers(request.headers);\n const usesScopedSessionEndpoint = !options.endpoint && !this.endEndpoint;\n if (!headers.has(\"Authorization\") && usesScopedSessionEndpoint) {\n headers.set(\"Authorization\", `Bearer ${this.accessToken}`);\n }\n let response = await this.fetcher(endpoint, {\n ...request,\n method: request.method ?? \"DELETE\",\n headers,\n credentials: request.credentials ?? this.lifecycleCredentials,\n });\n if (response.status === 401 && usesScopedSessionEndpoint && this.refreshCredentialsCallback) {\n await this.refreshCredentials(request.signal ?? undefined);\n headers.set(\"Authorization\", `Bearer ${this.accessToken}`);\n response = await this.fetcher(endpoint, {\n ...request,\n method: request.method ?? \"DELETE\",\n headers,\n credentials: request.credentials ?? this.lifecycleCredentials,\n });\n }\n if (!response.ok) throw await httpError(response, \"Could not end realtime session\");\n if (options.disconnect ?? true) await this.disconnect();\n }\n\n async replay(apiBase = this.apiBase, afterSeq = this.cursor.lastServerSeq): Promise<void> {\n if (this.replayPromise) return this.replayPromise;\n const normalizedApiBase = normalizeApiBase(apiBase);\n this.replayPromise = this.fetchReplay(normalizedApiBase, afterSeq).finally(() => {\n this.replayPromise = null;\n });\n return this.replayPromise;\n }\n\n private setState(state: ConnectionState): void {\n if (this.stateValue === state) return;\n this.stateValue = state;\n if (state === \"connecting\" || state === \"resuming\") {\n this.startDiagnosticLoopMonitor();\n globalThis.document?.addEventListener?.(\"visibilitychange\", this.onDiagnosticVisibilityChange);\n }\n if (state === \"disconnected\" || state === \"failed\") {\n globalThis.clearInterval(this.diagnosticLoopTimer);\n this.diagnosticLoopTimer = undefined;\n this.diagnosticLoopDelayMs = undefined;\n globalThis.document?.removeEventListener?.(\"visibilitychange\", this.onDiagnosticVisibilityChange);\n this.flushDiagnostics(\"session_finished\");\n const error = new Error(`Session ${state}`);\n this.contextGeneration += 1;\n this.replacementContext.clear(error);\n this.rejectPendingCommands(error);\n }\n this.notifyListeners(this.stateListeners, state);\n }\n\n private bindRoomEvents(): void {\n this.room.on(RoomEvent.ParticipantDisconnected, (participant) => {\n if (participant.isAgent && !this.disconnectMode) {\n // LiveKit removes its local participant objects BEFORE announcing a\n // native restart. Let that synchronous cleanup finish before deciding\n // whether the agent actually left an otherwise connected room.\n queueMicrotask(() => {\n if (\n this.disconnectMode || this.terminalSessionError || this.terminalReplayController\n || [\"disconnected\", \"failed\"].includes(this.stateValue)\n ) return;\n if (this.sessionEnded) {\n this.agentDisconnected = true;\n this.finishPendingEnd();\n return;\n }\n if (\n !this.hasConnectedValue\n || this.room.state === LiveKitConnectionState.Reconnecting\n || this.activeRecovery !== null\n || this.autoRejoinPromise !== null\n || this.manualRejoinController !== null\n ) return;\n if ([...this.room.remoteParticipants.values()].some((remote) => remote.isAgent)) return;\n this.agentDisconnected = true;\n if (!this.shouldAutoRejoin()) {\n void this.recoverDisconnectedSession().catch(() => {});\n return;\n }\n this.startAutoRejoin(\n new Error(\"Agent disconnected from the room\"),\n { trigger: \"agent_disconnected\" },\n );\n });\n }\n });\n this.room.on(RoomEvent.SignalReconnecting, () => this.handleLiveKitReconnecting());\n this.room.on(RoomEvent.Reconnecting, () => this.handleLiveKitReconnecting());\n this.room.on(RoomEvent.Reconnected, () => {\n void this.handleLiveKitReconnected();\n });\n this.room.on(RoomEvent.Disconnected, (reason) => {\n this.handleLiveKitDisconnected(reason);\n });\n this.room.on(RoomEvent.ConnectionStateChanged, (state) => {\n if (\n this.sessionEnded || this.terminalSessionError || this.terminalReplayController\n || [\"disconnected\", \"failed\"].includes(this.stateValue)\n ) return;\n if (state === LiveKitConnectionState.Connected) {\n const recovering = this.activeRecovery !== null || this.stateValue === \"resuming\";\n this.setState(\n this.agentReady\n ? \"connected\"\n : recovering\n ? \"resuming\"\n : \"connected_not_ready\",\n );\n }\n });\n this.room.on(RoomEvent.ConnectionQualityChanged, (quality, participant) => {\n if (!participant.isLocal) return;\n this.notifyListeners(\n this.connectionQualityListeners,\n quality as ConnectionQuality,\n );\n });\n this.room.on(RoomEvent.TrackSubscribed, (track) => {\n if (track.kind !== Track.Kind.Audio) return;\n const element = track.attach();\n element.dataset.voxevolvRemoteAudio = \"true\";\n element.style.display = \"none\";\n document.body.appendChild(element);\n try {\n const playback = element.play();\n void playback.catch((error) => {\n this.notifyListeners(this.audioPlaybackBlockedListeners, {\n error,\n element,\n track: track.mediaStreamTrack,\n });\n });\n } catch (error) {\n this.notifyListeners(this.audioPlaybackBlockedListeners, {\n error,\n element,\n track: track.mediaStreamTrack,\n });\n }\n const stream = new MediaStream([track.mediaStreamTrack]);\n this.remoteAudioStreams.set(track, stream);\n this.outputStream.addTrack(track.mediaStreamTrack);\n this.notifyRemoteAudioListeners(this.remoteAudioTrackListeners, track.mediaStreamTrack, stream);\n this.remoteAudioTrackResolve?.();\n });\n this.room.on(RoomEvent.TrackUnsubscribed, (track) => {\n if (track.kind !== Track.Kind.Audio) return;\n const stream = this.remoteAudioStreams.get(track) ?? new MediaStream([track.mediaStreamTrack]);\n this.notifyRemoteAudioListeners(\n this.remoteAudioTrackUnsubscribedListeners,\n track.mediaStreamTrack,\n stream,\n );\n this.remoteAudioStreams.delete(track);\n this.outputMediaStream?.removeTrack(track.mediaStreamTrack);\n track.detach().forEach((element) => element.remove());\n });\n this.room.on(RoomEvent.DataReceived, (data, _participant, kind, topic) => {\n if (topic !== \"voxevolv.events\" || kind !== DataPacket_Kind.RELIABLE) return;\n let value: unknown;\n try {\n value = JSON.parse(new TextDecoder().decode(data));\n } catch {\n // Ignore data from other room participants that is not a VoxEvolv envelope.\n return;\n }\n if (!isRealtimeEvent(value)) return;\n const result = this.cursor.accept(value);\n if (result.gap) {\n this.notifyListeners(this.gapListeners, result.gap);\n void this.replay(this.apiBase, result.gap.after_server_seq);\n }\n if (!result.deliver) return;\n this.observeReadiness(value);\n this.observeCommandResult(value);\n this.observeConvenienceEvents(value);\n this.notifyListeners(this.listeners, value);\n });\n }\n\n private handleLiveKitReconnecting(): void {\n if (\n this.sessionEnded || this.disconnectMode === \"intentional\" || this.terminalReplayController\n || [\"disconnected\", \"failed\"].includes(this.stateValue)\n ) return;\n this.agentReady = false;\n // Once full rejoin owns recovery, late LiveKit reconnect notifications\n // from the old transport must not move the wrapper back to reconnecting.\n // Doing so makes connectWithMode() reject the replacement connection.\n if (\n this.autoRejoinPromise !== null\n || this.activeRecovery?.strategy === \"rejoin\"\n || this.disconnectMode === \"rejoin\"\n ) {\n this.setState(\"resuming\");\n return;\n }\n this.contextGeneration += 1;\n this.livekitResumeController?.abort(new Error(\"LiveKit connection interrupted again\"));\n this.livekitResumeController = null;\n this.replacementContext.pause();\n this.reconnectStartedAt ??= Date.now();\n this.rejectPendingCommands(\n new Error(\"Connection interrupted before command completion\"),\n true,\n );\n if (this.activeRecovery === null) {\n this.beginRecovery(\"livekit\", 1, { trigger: \"livekit_reconnecting\" });\n this.recordDiagnostic({ operation: \"connection_recovery\", stage: \"room_connect\", status: \"started\" });\n }\n this.setState(\"reconnecting\");\n }\n\n private async handleLiveKitReconnected(): Promise<void> {\n if (\n this.sessionEnded || this.disconnectMode\n || this.autoRejoinPromise || this.livekitResumeController || this.terminalReplayController\n || [\"disconnected\", \"failed\"].includes(this.stateValue)\n ) return;\n const generation = this.contextGeneration;\n const controller = new AbortController();\n this.livekitResumeController = controller;\n const recoveredAt = Date.now();\n if (this.reconnectStartedAt !== null) {\n this.pendingReconnect = {\n started_at: new Date(this.reconnectStartedAt).toISOString(),\n recovered_at: new Date(recoveredAt).toISOString(),\n duration_ms: Math.max(recoveredAt - this.reconnectStartedAt, 0),\n };\n this.reconnectStartedAt = null;\n }\n if (this.hasConnectedValue && this.activeRecovery === null) {\n this.beginRecovery(\"livekit\", 1, { trigger: \"livekit_reconnecting\" });\n }\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"room_connect\", status: \"succeeded\",\n duration_ms: Math.max(Date.now() - (this.recoveryStartedAt ?? Date.now()), 0),\n });\n this.connectionId = `conn_${Math.random().toString(36).slice(2)}_${Date.now().toString(36)}`;\n this.clientSeq = 0;\n this.setState(this.hasConnectedValue ? \"resuming\" : \"connected_not_ready\");\n try {\n await this.measureRecoveryStage(\"hello\", () => this.sendRecoveryHello(controller.signal));\n const deadline = Date.now() + this.recoveryReadiness.readyTimeoutMs;\n await this.measureRecoveryStage(\n \"agent_ready\",\n () => this.waitForAgentReady(Math.max(deadline - Date.now(), 0), controller.signal),\n );\n if (this.recoveryReadiness.waitForRemoteAudio) {\n await this.measureRecoveryStage(\n \"remote_audio\", () => this.waitForRemoteAudioTrack(deadline, controller.signal),\n );\n }\n if (this.sessionEnded || generation !== this.contextGeneration) return;\n this.resumeContextDelivery(true);\n if (this.sessionEnded || generation !== this.contextGeneration) return;\n this.setState(\"connected\");\n this.completeRecovery();\n } catch (error) {\n if (controller.signal.aborted || this.sessionEnded || generation !== this.contextGeneration) return;\n const normalizedError = toError(error);\n if (this.shouldAutoRejoin()) {\n this.startAutoRejoin(normalizedError, { trigger: \"livekit_resume_failed\" });\n } else {\n this.failRecovery(normalizedError);\n this.setState(\"failed\");\n }\n } finally {\n if (this.livekitResumeController === controller) this.livekitResumeController = null;\n }\n }\n\n private handleLiveKitDisconnected(reason?: DisconnectReason): void {\n this.agentReady = false;\n if (this.disconnectMode !== \"rejoin\") {\n this.pendingReconnect = null;\n }\n // Drop any remaining remote tracks so a stale, ended track cannot\n // satisfy the next connect()'s wait for agent audio.\n this.outputMediaStream?.getTracks().forEach((track) => {\n this.outputMediaStream?.removeTrack(track);\n });\n this.rejectPendingCommands(new Error(\"Session disconnected before command completion\"));\n\n if (this.disconnectMode === \"rejoin\") return;\n if (this.disconnectMode === \"connect_failure\") return;\n if (this.disconnectMode === \"intentional\") {\n this.activeRecovery = null;\n this.deliverPendingEndEvent();\n this.setState(\"disconnected\");\n return;\n }\n // Room teardown can emit both participant and transport notifications.\n // Once terminal replay owns the outcome, those events cannot start rejoin.\n if (this.terminalSessionError || this.terminalReplayController) return;\n if (this.shouldAutoRejoin(reason)) {\n this.startAutoRejoin(\n new Error(`LiveKit disconnected (${disconnectReasonName(reason)})`),\n { trigger: \"livekit_disconnected\" },\n );\n return;\n }\n if (\n this.hasConnectedValue && !this.sessionEnded\n && ![\"disconnected\", \"failed\"].includes(this.stateValue)\n && (\n !isTerminalDisconnectReason(reason)\n || reason === DisconnectReason.ROOM_CLOSED\n || reason === DisconnectReason.ROOM_DELETED\n )\n ) {\n void this.recoverDisconnectedSession().catch(() => {});\n return;\n }\n if (this.activeRecovery !== null) {\n this.failRecovery(\n new Error(`LiveKit disconnected (${disconnectReasonName(reason)})`),\n );\n }\n this.deliverPendingEndEvent();\n this.setState(\"disconnected\");\n }\n\n // The terminal session.ended event is recorded durably after room teardown,\n // so turn the earlier live announcement into the browser completion signal.\n private deliverPendingEndEvent(): void {\n const ending = this.pendingEndEvent;\n if (!ending) return;\n this.pendingEndEvent = null;\n this.notifyEnded({ ...ending, type: \"session.ended\" });\n }\n\n private finishPendingEnd(): void {\n this.deliverPendingEndEvent();\n // The agent can leave while the browser remains in the room. Close that\n // transport ourselves, after notifying the application of the true reason.\n void this.disconnect().catch(() => {});\n }\n\n private async recoverDisconnectedSession(): Promise<void> {\n if (this.terminalReplayController) return;\n this.failRecovery(new Error(\"Transport closed during recovery\"));\n this.cancelRecovery();\n this.contextGeneration += 1;\n this.replacementContext.pause();\n const controller = new AbortController();\n this.terminalReplayController = controller;\n this.setState(\"resuming\");\n try {\n // Room closure can beat both the live final event and its durable commit.\n // Briefly query the authoritative outcome before reporting a lost call.\n await this.recoverSessionEnd(this.apiBase, controller.signal, true);\n } finally {\n if (this.terminalReplayController === controller) {\n this.terminalReplayController = null;\n if (!controller.signal.aborted && !this.sessionEnded && !this.terminalSessionError) {\n await this.disconnect();\n }\n }\n }\n }\n\n private async recoverSessionEnd(\n apiBase: string,\n signal?: AbortSignal,\n waitForCommit = false,\n ): Promise<boolean> {\n const controller = new AbortController();\n const cancel = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", cancel, { once: true });\n if (signal?.aborted) cancel();\n const timeout = globalThis.setTimeout(() => controller.abort(), 5_000);\n try {\n // A later live event may have advanced the cursor past a missed ending.\n // Replay from the start; event IDs suppress already delivered messages.\n do {\n try {\n await this.fetchReplay(apiBase, 0, { signal: controller.signal, terminalOnly: true });\n } catch (error) {\n if (!waitForCommit || controller.signal.aborted || isTerminalRejoinError(error)) throw error;\n // A transient HTTP/network failure may share the transport outage.\n // Retry only within this lookup's existing five-second deadline.\n }\n if (!waitForCommit || this.sessionEnded || this.terminalSessionError) break;\n await abortableDelay(500, controller.signal);\n } while (!controller.signal.aborted);\n } catch {\n // A 409 also covers failed sessions. Without an authoritative ending,\n // retain the original HTTP failure rather than invent a normal end.\n } finally {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", cancel);\n }\n if (!this.sessionEnded || this.terminalSessionError) return false;\n this.finishPendingEnd();\n return true;\n }\n\n private notifyEnded(event: RealtimeEvent): void {\n if (this.endNotificationDelivered) return;\n this.endNotificationDelivered = true;\n this.notifyListeners(this.endedListeners, event);\n }\n\n private beginRecovery(\n strategy: ActiveRecovery[\"strategy\"],\n attempt: number,\n details: RecoveryDetails,\n ): void {\n this.recoveryStartedAt ??= Date.now();\n this.activeRecovery = { strategy, attempt, details };\n this.recordDiagnostic({\n operation: \"connection_recovery\",\n status: \"started\",\n reason: details.trigger,\n message_id: details.messageId,\n context_key: details.contextKey,\n timeout_ms: details.timeoutMs,\n retry_count: attempt - 1,\n });\n this.flushDiagnostics(\"recovery_started\");\n this.notifyListeners(this.recoveryListeners, {\n status: \"started\",\n strategy,\n attempt,\n ...details,\n });\n }\n\n private completeRecovery(): void {\n const recovery = this.activeRecovery;\n if (!recovery) return;\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"complete\", status: \"succeeded\",\n duration_ms: Math.max(Date.now() - (this.recoveryStartedAt ?? Date.now()), 0),\n retry_count: recovery.attempt - 1,\n reason: recovery.details.trigger,\n });\n this.flushDiagnostics(\"recovery_completed\");\n this.recoveryStartedAt = null;\n this.activeRecovery = null;\n this.notifyListeners(this.recoveryListeners, {\n status: \"succeeded\",\n strategy: recovery.strategy,\n attempt: recovery.attempt,\n ...recovery.details,\n });\n }\n\n private failRecovery(error: Error): void {\n const recovery = this.activeRecovery;\n if (!recovery) return;\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"complete\", status: \"failed\",\n duration_ms: Math.max(Date.now() - (this.recoveryStartedAt ?? Date.now()), 0),\n retry_count: recovery.attempt - 1,\n reason: recovery.details.trigger,\n });\n this.flushDiagnostics(\"recovery_failed\");\n this.activeRecovery = null;\n this.notifyListeners(this.recoveryListeners, {\n status: \"failed\",\n strategy: recovery.strategy,\n attempt: recovery.attempt,\n ...recovery.details,\n error,\n });\n }\n\n private shouldAutoRejoin(reason?: DisconnectReason): boolean {\n return (\n this.autoRejoinOptions !== null\n && this.hasConnectedValue\n && !this.sessionEnded\n && ![\"disconnected\", \"failed\"].includes(this.stateValue)\n && !isTerminalDisconnectReason(reason)\n );\n }\n\n private startAutoRejoin(initialError: Error, details: RecoveryDetails): void {\n if (this.autoRejoinPromise || !this.shouldAutoRejoin()) return;\n // Include time spent offline before the first token request can start.\n this.recoveryStartedAt ??= Date.now();\n this.agentReady = false;\n this.contextGeneration += 1;\n this.livekitResumeController?.abort(initialError);\n this.replacementContext.pause();\n this.rejectPendingCommands(initialError);\n this.reconnectStartedAt ??= Date.now();\n const controller = new AbortController();\n this.autoRejoinController = controller;\n const remainingMs = Math.max(\n this.autoRejoinOptions!.timeoutMs - (Date.now() - this.recoveryStartedAt), 0,\n );\n const timeout = globalThis.setTimeout(() => {\n if (controller.signal.aborted) return;\n const error = new Error(\"Session recovery timed out\");\n controller.abort(error);\n this.contextGeneration += 1;\n this.rejectPendingCommands(error);\n this.replacementContext.clear(error);\n this.failRecovery(error);\n this.setState(\"failed\");\n }, remainingMs);\n const promise = this.runAutoRejoin(initialError, controller.signal, details)\n .finally(() => {\n globalThis.clearTimeout(timeout);\n if (this.autoRejoinController === controller) {\n this.autoRejoinController = null;\n this.autoRejoinPromise = null;\n }\n });\n this.autoRejoinPromise = promise;\n void promise;\n }\n\n private async runAutoRejoin(\n initialError: Error,\n signal: AbortSignal,\n details: RecoveryDetails,\n ): Promise<void> {\n const options = this.autoRejoinOptions;\n if (!options) return;\n let lastError = initialError;\n if (this.activeRecovery?.strategy === \"livekit\") {\n this.failRecovery(initialError);\n }\n this.setState(\"resuming\");\n for (let attempt = 1; attempt <= options.maxAttempts; attempt += 1) {\n try {\n await waitUntilOnline(signal);\n if (attempt > 1) {\n const exponentialDelay = options.baseDelayMs * (2 ** (attempt - 2));\n const delayMs = Math.min(exponentialDelay, options.maxDelayMs);\n await abortableDelay(delayMs + Math.random() * Math.min(delayMs, 500), signal);\n }\n throwIfAborted(signal);\n this.beginRecovery(\"rejoin\", attempt, details);\n await this.performRejoin(this.apiBase, { signal });\n if (this.sessionEnded) return;\n throwIfAborted(signal);\n this.reconnectStartedAt = null;\n this.completeRecovery();\n return;\n } catch (error) {\n if (signal.aborted) return;\n lastError = toError(error);\n if (isTerminalRejoinError(error)) break;\n }\n }\n this.failRecovery(lastError);\n this.replacementContext.clear(lastError);\n this.setState(\"failed\");\n }\n\n private cancelRecovery(): void {\n this.terminalReplayController?.abort();\n this.terminalReplayController = null;\n this.livekitResumeController?.abort();\n this.livekitResumeController = null;\n this.recoveryStartedAt = null;\n this.autoRejoinController?.abort();\n this.autoRejoinController = null;\n this.manualRejoinController?.abort();\n this.manualRejoinController = null;\n this.autoRejoinPromise = null;\n this.activeRecovery = null;\n }\n\n private notifyListeners<T>(listeners: ReadonlySet<(value: T) => void>, value: T): void {\n for (const listener of listeners) {\n try {\n listener(value);\n } catch (error) {\n console.error(\"VoxEvolv event listener failed\", error);\n }\n }\n }\n\n private notifyRemoteAudioListeners(\n listeners: ReadonlySet<RemoteAudioTrackListener>,\n track: MediaStreamTrack,\n stream: MediaStream,\n ): void {\n for (const listener of listeners) {\n try {\n listener(track, stream);\n } catch (error) {\n console.error(\"VoxEvolv remote audio listener failed\", error);\n }\n }\n }\n\n private validateAudioOptions(\n microphone: boolean,\n audioTrack: MediaStreamTrack | null,\n ): void {\n if (microphone && audioTrack) {\n throw new SessionConfigurationError(\"microphone and audioTrack cannot both be enabled\");\n }\n if (!audioTrack) return;\n if (audioTrack.kind !== \"audio\") {\n throw new SessionConfigurationError(\"audioTrack must be an audio MediaStreamTrack\");\n }\n if (audioTrack.readyState === \"ended\") {\n throw new SessionConfigurationError(\"audioTrack has already ended\");\n }\n }\n\n private async measureRecoveryStage<T>(\n stage: RecoveryStage,\n operation: () => Promise<T>,\n recovering = true,\n ): Promise<T> {\n if (!recovering) return operation();\n const startedAt = Date.now();\n this.recordDiagnostic({ operation: \"connection_recovery\", stage, status: \"started\" });\n try {\n const result = await operation();\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage, status: \"succeeded\",\n duration_ms: Date.now() - startedAt,\n });\n return result;\n } catch (error) {\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage, status: \"failed\",\n duration_ms: Date.now() - startedAt,\n reason: error instanceof RecoveryDataChannelStalledError ? \"data_channel_stalled\" : \"stage_failed\",\n });\n this.flushDiagnostics(\"recovery_stage_failed\");\n throw error;\n }\n }\n\n private async fetchRoomToken(\n apiBase: string,\n signal?: AbortSignal,\n recovering = true,\n ): Promise<Response> {\n const controller = new AbortController();\n const cancel = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", cancel, { once: true });\n const timeout = globalThis.setTimeout(() => controller.abort(), 10_000);\n const startedAt = Date.now();\n if (recovering) {\n this.recordDiagnostic({ operation: \"connection_recovery\", stage: \"token_request\", status: \"started\" });\n }\n try {\n throwIfAborted(signal);\n const response = await raceWithAbort(this.fetcher(`${apiBase}/sessions/${this.id}/room-tokens`, {\n method: \"POST\",\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: this.lifecycleCredentials,\n signal: controller.signal,\n }), controller.signal);\n if (recovering) {\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"token_request\",\n status: response.ok ? \"succeeded\" : \"failed\", http_status: response.status,\n duration_ms: Date.now() - startedAt,\n });\n if (!response.ok) this.flushDiagnostics(\"recovery_stage_failed\");\n }\n return response;\n } catch (error) {\n if (recovering) {\n this.recordDiagnostic({\n operation: \"connection_recovery\", stage: \"token_request\", status: \"failed\",\n duration_ms: Date.now() - startedAt,\n reason: signal?.aborted ? \"cancelled\" : controller.signal.aborted ? \"request_timeout\" : \"request_failed\",\n });\n this.flushDiagnostics(\"recovery_stage_failed\");\n }\n throw error;\n } finally {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", cancel);\n }\n }\n\n private async refreshCredentials(signal?: AbortSignal): Promise<void> {\n if (!this.refreshCredentialsCallback) return;\n throwIfAborted(signal);\n const connectionGeneration = this.contextGeneration;\n const refreshGeneration = ++this.credentialRefreshGeneration;\n const refreshed = await raceWithAbort(this.refreshCredentialsCallback(), signal);\n throwIfAborted(signal);\n if (\n connectionGeneration !== this.contextGeneration\n || refreshGeneration !== this.credentialRefreshGeneration\n ) {\n throw new Error(\"Credential refresh was superseded\");\n }\n validateSessionCredentials(refreshed);\n if (refreshed.id !== this.id) {\n throw new Error(\"Refreshed credentials belong to a different session\");\n }\n this.accessToken = refreshed.access_token;\n this.credentials = refreshed.connection;\n }\n\n private async finishSessionFailure(error: Error): Promise<void> {\n this.sessionEnded = true;\n this.contextGeneration += 1;\n this.rejectPendingCommands(error);\n this.replacementContext.clear(error);\n this.failRecovery(error);\n this.cancelRecovery();\n this.disconnectMode = \"connect_failure\";\n try {\n await this.room.disconnect();\n } finally {\n this.disconnectMode = null;\n this.setState(\"failed\");\n }\n }\n\n private observeConvenienceEvents(event: RealtimeEvent): void {\n if (event.type === \"session.error\") {\n // Teardown errors must not overwrite an already announced normal ending.\n if (this.sessionEnded) return;\n const error = new SessionErrorEventError(event);\n // Retryability applies to an active startup attempt. Once connected,\n // a durable session.error means the server has failed the session.\n if (error.retryable && this.startupAttemptController) {\n this.startupAttemptController.abort(error);\n } else {\n this.terminalSessionError = error;\n this.abortStartupConnect(error);\n // Startup owns its aborted attempt's cleanup. An established session\n // needs to release media and settle recovery immediately on failure.\n if (!this.startupConnectController) {\n void this.finishSessionFailure(error).catch(() => {});\n }\n }\n }\n if (event.type === \"session.ending\" || event.type === \"session.ended\") {\n // A worker shutdown event can follow a durable session.error. The server\n // retains FAILED in that case, so it must not become a normal completion.\n if (this.terminalSessionError) return;\n this.abortStartupConnect(new Error(\"Session ended during startup\"));\n this.contextGeneration += 1;\n this.rejectPendingCommands(new Error(\"Session ended\"));\n this.failRecovery(new Error(\"Session ended during recovery\"));\n }\n if (event.type === \"session.ending\") {\n // The server announced an intentional hang-up before tearing down the\n // room, so the coming disconnect must not fail recovery or auto-rejoin.\n this.sessionEnded = true;\n this.cancelRecovery();\n this.replacementContext.clear(new Error(\"Session ended\"));\n // Match the server's first terminal outcome, even if teardown announces\n // another ending before the agent has left the room.\n this.pendingEndEvent ??= event;\n if (\n !this.hasConnectedValue\n || this.agentDisconnected\n || this.room.state === LiveKitConnectionState.Disconnected\n ) {\n this.finishPendingEnd();\n }\n }\n if (event.type === \"session.ended\") {\n const ending = this.pendingEndEvent;\n this.pendingEndEvent = null;\n this.sessionEnded = true;\n this.replacementContext.clear(new Error(\"Session ended\"));\n this.cancelRecovery();\n this.notifyEnded(ending ? { ...ending, type: \"session.ended\" } : event);\n void this.disconnect().catch(() => {});\n }\n if (event.type.endsWith(\".error\")) this.notifyListeners(this.errorListeners, event);\n const message = this.transcriptStore.accept(event);\n if (message) this.notifyListeners(this.transcriptListeners, message);\n const transcript = transcriptEvent(event);\n if (!transcript) return;\n this.notifyListeners(\n transcript.role === \"user\" ? this.userTranscriptListeners : this.agentTranscriptListeners,\n transcript,\n );\n }\n\n private abortStartupConnect(error: Error): void {\n if (!this.startupConnectController?.signal.aborted) {\n this.startupConnectController?.abort(error);\n }\n }\n\n private async publishApplicationAudioTrack(audioTrack: MediaStreamTrack): Promise<void> {\n const clonedTrack = audioTrack.clone();\n let publishedTrack: LocalAudioTrack | null = null;\n try {\n publishedTrack = new LocalAudioTrack(clonedTrack, undefined, true);\n this.localApplicationAudioTrack = publishedTrack;\n if (!this.microphoneEnabled) {\n // LiveKit can re-enable a raw track when wrapping it. Mute the wrapper\n // before publication so recovery cannot briefly transmit muted input.\n await publishedTrack.mute();\n }\n await this.room.localParticipant.publishTrack(publishedTrack, {\n source: Track.Source.Microphone,\n name: \"voxevolv-application-audio\",\n });\n } catch (error) {\n if (this.localApplicationAudioTrack === publishedTrack) {\n this.localApplicationAudioTrack = null;\n }\n clonedTrack.stop();\n throw error;\n }\n }\n\n private async sendHello(): Promise<void> {\n const reconnect = this.pendingReconnect;\n const message = createClientMessage(\n this.connectionId,\n ++this.clientSeq,\n \"client.hello\",\n {\n last_server_seq: this.cursor.lastServerSeq,\n sdk: `@voxevolv/client@${SDK_VERSION}`,\n tool_handlers: [...this.toolHandlers.keys()].sort(),\n ...(reconnect ? { reconnect } : {}),\n },\n );\n this.lastHelloMessageId = message.message_id;\n await this.sendTrackedCommand(message, CLIENT_HELLO_TIMEOUT_MS);\n if (this.pendingReconnect === reconnect) this.pendingReconnect = null;\n }\n\n private async sendRecoveryHello(signal?: AbortSignal): Promise<void> {\n throwIfAborted(signal);\n let previousBytes = this.reliableDataChannelBufferedBytes();\n let lastProgressAt = Date.now();\n let timer: ReturnType<typeof globalThis.setTimeout> | undefined;\n const stalled = new Promise<never>((_resolve, reject) => {\n const checkProgress = () => {\n const bufferedBytes = this.reliableDataChannelBufferedBytes();\n if (\n bufferedBytes === undefined || bufferedBytes === 0\n || previousBytes === undefined || previousBytes === 0\n || bufferedBytes < previousBytes\n ) {\n lastProgressAt = Date.now();\n } else if (Date.now() - lastProgressAt >= RECOVERY_BUFFER_STALL_MS) {\n reject(new RecoveryDataChannelStalledError());\n return;\n }\n previousBytes = bufferedBytes;\n timer = globalThis.setTimeout(checkProgress, RECOVERY_BUFFER_POLL_MS);\n };\n timer = globalThis.setTimeout(checkProgress, RECOVERY_BUFFER_POLL_MS);\n });\n try {\n // Initial joins keep their existing deadline. During recovery, positive\n // queued bytes with no draining progress indicate a stuck transport; a\n // slow but draining channel still gets the normal hello deadline.\n await raceWithAbort(Promise.race([this.sendHello(), stalled]), signal);\n } catch (error) {\n if (error instanceof RecoveryDataChannelStalledError) {\n this.rejectPendingCommands(error);\n }\n throw error;\n } finally {\n if (timer !== undefined) globalThis.clearTimeout(timer);\n }\n }\n\n private async sendTrackedCommand(\n message: ClientMessage,\n timeoutMs: number,\n retryTransfer?: (signal: AbortSignal) => Promise<void>,\n ): Promise<CommandAckPayload> {\n const contextKey = contextKeyFromMessage(message);\n const payloadBytes = contextPayloadBytes(message.payload);\n const startedAt = Date.now();\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"started\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: contextKey,\n payload_bytes: payloadBytes,\n retry_count: 0,\n timeout_ms: timeoutMs,\n event_type: diagnosticEventType(message.type),\n });\n // Only context delivery opts into cancellation; other commands retain their\n // existing transport behavior. Settling cannot retract a packet already sent.\n const sendController = message.type === \"context.update\" ? new AbortController() : undefined;\n let markSettled = () => {};\n const settled = new Promise<void>((resolve) => {\n markSettled = () => {\n sendController?.abort();\n resolve();\n };\n });\n const response = new Promise<CommandAckPayload>((resolve, reject) => {\n const timeout = globalThis.setTimeout(() => {\n const pending = this.pendingCommands.get(message.message_id);\n if (pending) globalThis.clearTimeout(pending.retry);\n pending?.markSettled();\n this.pendingCommands.delete(message.message_id);\n const detail = `Command ${message.type} timed out after ${timeoutMs}ms`;\n const error = message.type === \"context.update\"\n ? new ContextDeliveryError(detail, { retryAfter: pending?.transferSettled })\n : new Error(detail);\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"timed_out\",\n reason: message.type === \"context.update\"\n ? \"context_command_timeout\"\n : \"command_timeout\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: contextKey,\n payload_bytes: payloadBytes,\n duration_ms: Date.now() - startedAt,\n retry_count: pending?.retryCount ?? 0,\n timeout_ms: timeoutMs,\n event_type: diagnosticEventType(message.type),\n });\n this.flushDiagnostics(\"command_timeout\");\n reject(error);\n }, timeoutMs);\n this.pendingCommands.set(\n message.message_id,\n {\n commandType: message.type,\n message,\n startedAt,\n contextKey,\n payloadBytes,\n retryCount: 0,\n publishQueued: false,\n resolve,\n reject,\n timeout,\n settled,\n markSettled,\n retryTransfer,\n sendController,\n transferRetrying: false,\n transferRetryRequested: false,\n },\n );\n this.scheduleCommandRetry(message);\n });\n void this.publishCommandAttempt(message, false).catch(() => {\n // The reliable data channel may still be warming immediately after a\n // reconnect. Keep the command pending so the retry timer can publish\n // it once the transport accepts writes, or reject at the normal timeout.\n });\n return response;\n }\n\n private scheduleCommandRetry(message: ClientMessage): void {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending) return;\n const delayMs = message.type === \"context.update\"\n ? contextRetryDelay(pending.retryCount + 1)\n : 500;\n pending.retry = globalThis.setTimeout(() => {\n void this.retryCommand(message).finally(() => this.scheduleCommandRetry(message));\n }, delayMs);\n }\n\n private async retryCommand(message: ClientMessage): Promise<void> {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending) return;\n if (message.type === \"context.update\" && (\n this.sessionEnded || [\"reconnecting\", \"resuming\", \"disconnected\", \"failed\"].includes(this.stateValue)\n )) return;\n try {\n if (pending.transferRetryRequested && pending.retryTransfer && pending.sendController) {\n pending.transferRetryRequested = false;\n pending.transferRetrying = true;\n const transfer = pending.retryTransfer(pending.sendController.signal);\n pending.transferSettled = transfer.then(() => {}, () => {});\n if (pending.contextKey) {\n this.replacementContext.blockUntilTransferSettles(pending.contextKey, pending.transferSettled);\n }\n await Promise.race([transfer, pending.settled]);\n }\n await this.publishCommandAttempt(message, true);\n } catch {\n // Failed writes retain their original deadline and retry with backoff.\n } finally {\n pending.transferRetrying = false;\n }\n }\n\n private publishCommandAttempt(message: ClientMessage, retrying: boolean): Promise<void> {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending || pending.publishQueued) return Promise.resolve();\n pending.publishQueued = true;\n // Context keys drain independently, but client_seq is global. Serialize the\n // asynchronous LiveKit publish boundary so a later sequence cannot overtake\n // an earlier one before the reliable data channel receives it.\n const attempt = this.commandPublishTail\n .then(() => this.publishCommandAttemptNow(message, retrying))\n .finally(() => {\n const current = this.pendingCommands.get(message.message_id);\n if (current === pending) current.publishQueued = false;\n });\n this.commandPublishTail = attempt.catch(() => {});\n return attempt;\n }\n\n private async publishCommandAttemptNow(\n message: ClientMessage,\n retrying: boolean,\n ): Promise<void> {\n const pending = this.pendingCommands.get(message.message_id);\n if (!pending) return;\n if (retrying) {\n pending.retryCount += 1;\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"retrying\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n retry_count: pending.retryCount,\n event_type: diagnosticEventType(message.type),\n });\n }\n const attemptStartedAt = Date.now();\n try {\n let publishFinished = false;\n const publish = this.publishCommand(message, pending.sendController?.signal)\n .then(() => { publishFinished = true; });\n await Promise.race([publish, pending.settled]);\n if (!publishFinished) return;\n } catch (error) {\n if (pending.sendController?.signal.aborted) return;\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"failed\",\n reason: \"command_publish_failed\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n duration_ms: Date.now() - attemptStartedAt,\n retry_count: pending.retryCount,\n event_type: diagnosticEventType(message.type),\n });\n this.flushDiagnostics(\"command_failed\");\n throw error;\n }\n const durationMs = Date.now() - attemptStartedAt;\n this.recordDiagnostic({\n operation: \"command_send\",\n status: \"succeeded\",\n message_id: message.message_id,\n connection_id: message.connection_id,\n client_seq: message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n duration_ms: durationMs,\n retry_count: pending.retryCount,\n event_type: diagnosticEventType(message.type),\n });\n if (durationMs > 2_000) this.flushDiagnostics(\"slow_operation\");\n }\n\n private async publishCommand(message: ClientMessage, signal?: AbortSignal): Promise<void> {\n const options = { reliable: true, topic: \"voxevolv.commands\", signal };\n await this.room.localParticipant.publishData(\n new TextEncoder().encode(JSON.stringify(message)),\n options,\n );\n }\n\n private startDiagnosticLoopMonitor(): void {\n if (this.diagnosticLoopTimer !== undefined) return;\n this.diagnosticLoopExpectedAt = performance.now() + 1_000;\n this.diagnosticLoopTimer = globalThis.setInterval(() => {\n const now = performance.now();\n this.diagnosticLoopDelayMs = Math.max(0, now - this.diagnosticLoopExpectedAt);\n this.diagnosticLoopExpectedAt = now + 1_000;\n }, 1_000);\n (this.diagnosticLoopTimer as unknown as { unref?: () => void }).unref?.();\n }\n\n private recordDiagnostic(entry: ClientDiagnosticInput): void {\n const snapshot: ClientDiagnosticInput = {\n ...entry,\n connection_state: this.stateValue,\n buffered_bytes: this.reliableDataChannelBufferedBytes(),\n };\n if (entry.operation === \"tool_rpc\" || entry.operation === \"connection_recovery\") {\n snapshot.page_visibility = globalThis.document?.visibilityState;\n snapshot.active_context_transfers = this.activeContextTransfers;\n snapshot.active_context_bytes = this.activeContextBytes;\n if (this.diagnosticLoopTimer !== undefined) {\n snapshot.event_loop_delay_ms = Math.max(\n this.diagnosticLoopDelayMs ?? 0, performance.now() - this.diagnosticLoopExpectedAt,\n );\n }\n }\n this.diagnostics.record(snapshot);\n }\n\n private reliableDataChannelBufferedBytes(): number | undefined {\n try {\n const bufferedAmount = this.room.engine.dataChannelForKind(0)?.bufferedAmount;\n return typeof bufferedAmount === \"number\" ? bufferedAmount : undefined;\n } catch {\n return undefined;\n }\n }\n\n private flushDiagnostics(trigger: string): void {\n void this.diagnostics.flush(trigger, (report) => this.postDiagnostics(report));\n }\n\n private async postDiagnostics(report: ClientDiagnosticReport): Promise<void> {\n const controller = new AbortController();\n let timeout: ReturnType<typeof globalThis.setTimeout> | undefined;\n const timeoutExpired = new Promise<never>((_resolve, reject) => {\n timeout = globalThis.setTimeout(() => {\n controller.abort();\n reject(new Error(\n `Diagnostic report timed out after ${this.diagnosticReportTimeoutMs}ms`,\n ));\n }, this.diagnosticReportTimeoutMs);\n });\n try {\n const upload = async (): Promise<void> => {\n const response = await this.fetcher(`${this.apiBase}/sessions/${this.id}/diagnostics`, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.accessToken}`,\n \"Content-Type\": \"application/json\",\n },\n credentials: this.lifecycleCredentials,\n body: JSON.stringify(report),\n signal: controller.signal,\n keepalive: true,\n });\n const body = await response.json().catch(() => null) as {\n report_id?: string; retry_after_ms?: number;\n } | null;\n if (!response.ok) {\n const retryable = response.status === 408 || response.status === 429 || response.status >= 500;\n const headerDelay = Number(response.headers.get(\"Retry-After\")) * 1000;\n const retryAfterMs = typeof body?.retry_after_ms === \"number\"\n ? body.retry_after_ms : headerDelay;\n throw new DiagnosticDeliveryError(\n `Diagnostic report failed (${response.status})`,\n retryable,\n Number.isFinite(retryAfterMs) ? Math.max(retryAfterMs, 0) : 0,\n );\n }\n if (body?.report_id !== report.report_id) {\n throw new DiagnosticDeliveryError(\"Diagnostic report was not acknowledged\");\n }\n };\n // The receipt body is part of the timeout too, not just the response headers.\n await Promise.race([upload(), timeoutExpired]);\n } finally {\n if (timeout !== undefined) globalThis.clearTimeout(timeout);\n }\n }\n\n private waitForRemoteAudioTrack(deadline: number, signal?: AbortSignal): Promise<void> {\n if ((this.outputMediaStream?.getAudioTracks().length ?? 0) > 0) return Promise.resolve();\n throwIfAborted(signal);\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", onAbort);\n this.remoteAudioTrackResolve = null;\n };\n const timeout = globalThis.setTimeout(() => {\n cleanup();\n reject(new Error(\n \"Agent audio track did not arrive within the ready timeout;\"\n + \" pass waitForRemoteAudio: false to resolve connect() on signaling readiness alone\",\n ));\n }, Math.max(deadline - Date.now(), 0));\n const onAbort = () => {\n cleanup();\n reject(abortError(signal!));\n };\n this.remoteAudioTrackResolve = () => {\n cleanup();\n resolve();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n private waitForAgentReady(timeoutMs: number, signal?: AbortSignal): Promise<void> {\n if (this.agentReady) return Promise.resolve();\n throwIfAborted(signal);\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n globalThis.clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", onAbort);\n this.readyResolve = null;\n };\n const timeout = globalThis.setTimeout(() => {\n cleanup();\n reject(new Error(`Agent did not become ready within ${timeoutMs}ms`));\n }, timeoutMs);\n const onAbort = () => {\n cleanup();\n reject(abortError(signal!));\n };\n this.readyResolve = () => {\n cleanup();\n resolve();\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n private observeReadiness(event: RealtimeEvent): void {\n // Replayed readiness describes an old worker, not the current transport.\n if (event.stream_id === \"durable-replay\") return;\n const payload = event.payload as Record<string, unknown>;\n const snapshotReady = event.type === \"agent.snapshot\"\n && payload.status === \"ready\"\n && payload.connection_id === this.connectionId\n && payload.ack_message_id === this.lastHelloMessageId;\n if (event.type !== \"agent.ready\" && !snapshotReady) return;\n if (this.agentStreamId && this.agentStreamId !== event.stream_id && !this.activeRecovery) {\n this.startAutoRejoin(\n new Error(\"Agent worker was replaced\"),\n { trigger: \"worker_replaced\" },\n );\n return;\n }\n this.agentStreamId = event.stream_id;\n this.agentDisconnected = false;\n const wasReady = this.agentReady;\n this.agentReady = true;\n // connect/reconnect owns the transition after hello and audio are ready.\n // Context restoration proceeds independently in the background.\n this.readyResolve?.();\n if (!wasReady) this.notifyListeners(this.readyListeners, event);\n }\n\n private observeCommandResult(event: RealtimeEvent): void {\n if (\n event.type !== \"command.ack\"\n && event.type !== \"command.error\"\n && event.type !== \"context.updated\"\n && event.type !== \"context.rejected\"\n ) return;\n const pending = this.pendingCommands.get(String(event.payload.message_id ?? \"\"));\n if (!pending) return;\n if (event.type === \"command.ack\" && isCommandAckPayload(event.payload)) {\n this.recordCommandResult(pending, event.type, \"acknowledged\");\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n this.pendingCommands.delete(event.payload.message_id);\n pending.resolve(event.payload);\n return;\n }\n if (event.type === \"context.updated\" && isContextUpdatedPayload(event.payload)) {\n this.recordCommandResult(pending, event.type, \"acknowledged\");\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n this.pendingCommands.delete(event.payload.message_id);\n pending.resolve(event.payload);\n return;\n }\n if (\n (event.type === \"command.error\" && isCommandErrorPayload(event.payload))\n || (event.type === \"context.rejected\" && isContextRejectedPayload(event.payload))\n ) {\n this.recordCommandResult(pending, event.type, \"rejected\", event.payload.code);\n this.flushDiagnostics(\"command_rejected\");\n if (event.type === \"context.rejected\" && event.payload.retryable) {\n if (event.payload.code === \"stream_unavailable\" && pending.retryTransfer && !pending.transferRetrying) {\n pending.transferRetryRequested = true;\n }\n return;\n }\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n this.pendingCommands.delete(event.payload.message_id);\n pending.reject(new CommandError(event.payload));\n }\n }\n\n private rejectPendingCommands(error: Error, preserveContext = false): void {\n if (!preserveContext) {\n for (const controller of this.contextTransferControllers) controller.abort(error);\n }\n for (const [messageId, pending] of this.pendingCommands) {\n if (preserveContext && pending.commandType === \"context.update\") continue;\n this.recordCommandResult(\n pending,\n pending.commandType === \"context.update\" ? \"context.rejected\" : \"command.error\",\n \"failed\",\n \"pending_command_cancelled\",\n );\n globalThis.clearTimeout(pending.timeout);\n globalThis.clearTimeout(pending.retry);\n pending.markSettled();\n pending.reject(pending.commandType === \"context.update\"\n ? new ContextDeliveryError(error.message, { cause: error, retryAfter: pending.transferSettled })\n : error);\n this.pendingCommands.delete(messageId);\n }\n }\n\n private recordCommandResult(\n pending: PendingCommand,\n eventType: \"command.ack\" | \"command.error\" | \"context.updated\" | \"context.rejected\",\n status: \"acknowledged\" | \"rejected\" | \"failed\",\n reason?: string,\n ): void {\n const durationMs = Date.now() - pending.startedAt;\n this.recordDiagnostic({\n operation: \"command_result\",\n status,\n reason,\n message_id: pending.message.message_id,\n connection_id: pending.message.connection_id,\n client_seq: pending.message.client_seq,\n context_key: pending.contextKey,\n payload_bytes: pending.payloadBytes,\n duration_ms: durationMs,\n retry_count: pending.retryCount,\n event_type: eventType,\n });\n if (durationMs > 2_000) this.flushDiagnostics(\"slow_operation\");\n }\n\n private async fetchReplay(\n apiBase: string,\n afterSeq: number,\n options: { signal?: AbortSignal; terminalOnly?: boolean } = {},\n ): Promise<void> {\n const { signal, terminalOnly = false } = options;\n let nextAfter = afterSeq;\n while (true) {\n throwIfAborted(signal);\n const url = `${apiBase}/sessions/${this.id}/events?after_seq=${nextAfter}&limit=200`\n + (terminalOnly ? \"&terminal_only=true\" : \"\");\n let response = await raceWithAbort(this.fetcher(\n url,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: this.lifecycleCredentials,\n signal,\n },\n ), signal);\n if (response.status === 401 && this.refreshCredentialsCallback) {\n await this.refreshCredentials(signal);\n response = await raceWithAbort(this.fetcher(\n url,\n {\n headers: { Authorization: `Bearer ${this.accessToken}` },\n credentials: this.lifecycleCredentials,\n signal,\n },\n ), signal);\n }\n if (!response.ok) {\n throw await raceWithAbort(httpError(response, \"Could not replay session events\"), signal);\n }\n const page = (await raceWithAbort(response.json(), signal)) as {\n items: Array<{\n event_id: string;\n server_seq: number;\n type: string;\n payload: Record<string, unknown>;\n created_at: string;\n }>;\n next_after_seq: number;\n has_more: boolean;\n };\n throwIfAborted(signal);\n for (const stored of page.items) {\n nextAfter = Math.max(nextAfter, stored.server_seq);\n const event: RealtimeEvent = {\n protocol_version: 1,\n event_id: stored.event_id,\n stream_id: \"durable-replay\",\n stream_seq: Math.max(this.cursor.lastStreamSeq, 1),\n server_seq: stored.server_seq,\n ts: stored.created_at,\n type: stored.type,\n payload: stored.payload,\n };\n if (!this.cursor.acceptReplay(event)) continue;\n this.observeReadiness(event);\n this.observeConvenienceEvents(event);\n this.notifyListeners(this.listeners, event);\n }\n nextAfter = Math.max(nextAfter, page.next_after_seq);\n if (!page.has_more) return;\n }\n }\n}\n\nfunction resolveAutoRejoinOptions(\n value: boolean | AutoRejoinOptions | undefined,\n): ResolvedAutoRejoinOptions | null {\n if (!value) return null;\n const options = value === true ? {} : value;\n const resolved = {\n maxAttempts: options.maxAttempts ?? Number.MAX_SAFE_INTEGER,\n baseDelayMs: options.baseDelayMs ?? 750,\n maxDelayMs: options.maxDelayMs ?? 5_000,\n timeoutMs: options.timeoutMs ?? 180_000,\n };\n if (!Number.isFinite(resolved.timeoutMs) || resolved.timeoutMs <= 0) {\n throw new TypeError(\"autoRejoin.timeoutMs must be a positive finite number\");\n }\n if (!Number.isInteger(resolved.maxAttempts) || resolved.maxAttempts < 1) {\n throw new TypeError(\"autoRejoin.maxAttempts must be a positive integer\");\n }\n if (!Number.isFinite(resolved.baseDelayMs) || resolved.baseDelayMs < 0) {\n throw new TypeError(\"autoRejoin.baseDelayMs must be a non-negative finite number\");\n }\n if (!Number.isFinite(resolved.maxDelayMs) || resolved.maxDelayMs < 0) {\n throw new TypeError(\"autoRejoin.maxDelayMs must be a non-negative finite number\");\n }\n return resolved;\n}\n\nfunction resolveStartupRetryOptions(\n value: boolean | StartupRetryOptions | undefined,\n): ResolvedStartupRetryOptions | null {\n if (value === false) return null;\n const options = typeof value === \"object\" ? value : {};\n const attempts = (options.attempts ?? DEFAULT_STARTUP_ATTEMPTS).map((attempt) => ({\n readyTimeoutMs: attempt.readyTimeoutMs,\n delayBeforeMs: attempt.delayBeforeMs ?? 0,\n }));\n const timeoutMs = options.timeoutMs ?? DEFAULT_STARTUP_TIMEOUT_MS;\n\n if (attempts.length === 0) {\n throw new TypeError(\"startupRetry.attempts must contain at least one attempt\");\n }\n for (const attempt of attempts) {\n if (!Number.isFinite(attempt.readyTimeoutMs) || attempt.readyTimeoutMs <= 0) {\n throw new TypeError(\n \"startupRetry.attempts readyTimeoutMs must be a positive finite number\",\n );\n }\n if (!Number.isFinite(attempt.delayBeforeMs) || attempt.delayBeforeMs < 0) {\n throw new TypeError(\n \"startupRetry.attempts delayBeforeMs must be a non-negative finite number\",\n );\n }\n }\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new TypeError(\"startupRetry.timeoutMs must be a positive finite number\");\n }\n return { attempts, timeoutMs };\n}\n\nfunction isTerminalDisconnectReason(reason?: DisconnectReason): boolean {\n return reason !== undefined && [\n DisconnectReason.CLIENT_INITIATED,\n DisconnectReason.DUPLICATE_IDENTITY,\n DisconnectReason.PARTICIPANT_REMOVED,\n DisconnectReason.ROOM_DELETED,\n DisconnectReason.ROOM_CLOSED,\n DisconnectReason.USER_UNAVAILABLE,\n DisconnectReason.USER_REJECTED,\n ].includes(reason);\n}\n\nfunction disconnectReasonName(reason?: DisconnectReason): string {\n if (reason === undefined) return \"unknown\";\n return DisconnectReason[reason] ?? String(reason);\n}\n\nfunction isTerminalRejoinError(error: unknown): boolean {\n return error instanceof RealtimeSessionHttpError\n && [401, 403, 409].includes(error.status);\n}\n\nfunction isTerminalStartupError(error: unknown): boolean {\n if (error instanceof SessionErrorEventError) return !error.retryable;\n if (error instanceof RealtimeSessionHttpError) {\n return error.status >= 400\n && error.status < 500\n && ![408, 425, 429].includes(error.status);\n }\n // Browser fetch also rejects network failures with TypeError. Only our\n // explicit configuration errors are terminal before transport is established.\n if (error instanceof SessionConfigurationError) return true;\n return error instanceof Error && [\n \"ConstraintNotSatisfiedError\",\n \"DevicesNotFoundError\",\n \"InvalidStateError\",\n \"NotAllowedError\",\n \"NotFoundError\",\n \"NotReadableError\",\n \"NotSupportedError\",\n \"OverconstrainedError\",\n \"SecurityError\",\n \"TrackStartError\",\n ].includes(error.name);\n}\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\nfunction abortError(signal: AbortSignal): unknown {\n return signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n}\n\nfunction createLinkedAbortController(parentSignal: AbortSignal): AbortController {\n const controller = new AbortController();\n if (parentSignal.aborted) {\n controller.abort(abortError(parentSignal));\n } else {\n parentSignal.addEventListener(\n \"abort\",\n () => controller.abort(abortError(parentSignal)),\n { once: true },\n );\n }\n return controller;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) throw abortError(signal);\n}\n\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) return promise;\n return new Promise((resolve, reject) => {\n let settled = false;\n const resolveOnce = (value: T) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n resolve(value);\n };\n const rejectOnce = (error: unknown) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", onAbort);\n reject(error);\n };\n const onAbort = () => rejectOnce(abortError(signal));\n if (signal.aborted) {\n onAbort();\n } else {\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n // Always observe the operation, including when it aborted the signal before\n // returning its promise, so a later rejection cannot escape to the caller.\n promise.then(resolveOnce, rejectOnce);\n });\n}\n\nfunction abortableDelay(delayMs: number, signal: AbortSignal): Promise<void> {\n throwIfAborted(signal);\n if (delayMs <= 0) return Promise.resolve();\n return new Promise((resolve, reject) => {\n const timeout = globalThis.setTimeout(() => {\n signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delayMs);\n const onAbort = () => {\n globalThis.clearTimeout(timeout);\n reject(abortError(signal));\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction waitUntilOnline(signal: AbortSignal): Promise<void> {\n throwIfAborted(signal);\n if (typeof navigator === \"undefined\" || navigator.onLine !== false) {\n return Promise.resolve();\n }\n if (typeof globalThis.addEventListener !== \"function\") return Promise.resolve();\n return new Promise((resolve, reject) => {\n const cleanup = () => {\n globalThis.removeEventListener(\"online\", onOnline);\n signal.removeEventListener(\"abort\", onAbort);\n };\n const onOnline = () => {\n cleanup();\n resolve();\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n globalThis.addEventListener(\"online\", onOnline, { once: true });\n signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nasync function sha256Hex(data: Uint8Array): Promise<string> {\n if (!globalThis.crypto?.subtle) throw new Error(\"Web Crypto SHA-256 is unavailable\");\n const digest = await globalThis.crypto.subtle.digest(\"SHA-256\", Uint8Array.from(data).buffer);\n return [...new Uint8Array(digest)]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\nfunction contextStreamId(): string {\n if (globalThis.crypto?.randomUUID) return globalThis.crypto.randomUUID();\n return `ctx_${Date.now().toString(36)}_${Math.random().toString(36).slice(2)}`;\n}\n\nfunction contextUpdateBytes(update: ContextUpdate): number {\n return \"image\" in update\n ? update.image.size\n : new TextEncoder().encode(update.text).byteLength;\n}\n\nfunction contextPayloadBytes(payload: Record<string, unknown>): number | undefined {\n const image = payload.image;\n if (image && typeof image === \"object\" && \"bytes\" in image) {\n const bytes = (image as { bytes?: unknown }).bytes;\n if (typeof bytes === \"number\") return bytes;\n }\n const textStream = payload.text_stream;\n if (textStream && typeof textStream === \"object\" && \"bytes\" in textStream) {\n const bytes = (textStream as { bytes?: unknown }).bytes;\n if (typeof bytes === \"number\") return bytes;\n }\n if (typeof payload.text === \"string\") {\n return new TextEncoder().encode(payload.text).byteLength;\n }\n try {\n return new TextEncoder().encode(JSON.stringify(payload)).byteLength;\n } catch {\n return undefined;\n }\n}\n\nfunction contextKeyFromMessage(message: ClientMessage): string | undefined {\n if (message.type !== \"context.update\") return undefined;\n const key = message.payload.key;\n return typeof key === \"string\" ? key : undefined;\n}\n\nfunction diagnosticEventType(type: string): DiagnosticEventType | undefined {\n return type === \"client.hello\" || type === \"context.update\" ? type : undefined;\n}\n\nfunction validateSessionCredentials(value: SessionCredentials): void {\n if (!value || typeof value !== \"object\") {\n throw new SessionConfigurationError(\"Session credentials must be an object\");\n }\n if (!value.id || !value.access_token || !value.access_token_expires_at) {\n throw new SessionConfigurationError(\"Session credentials are incomplete\");\n }\n if (\n !value.connection\n || !value.connection.url\n || !value.connection.token\n || !value.connection.room_name\n ) {\n throw new SessionConfigurationError(\"Session connection credentials are incomplete\");\n }\n}\n\nfunction normalizeApiBase(value: string): string {\n const normalized = value.trim().replace(/\\/+$/, \"\");\n if (!normalized) {\n throw new SessionConfigurationError(\"apiBase must be a non-root relative path or an absolute URL\");\n }\n return normalized;\n}\n\nfunction transcriptEvent(event: RealtimeEvent): TranscriptEvent | null {\n const match = /^transcript\\.(user|agent)\\.(interim|final)$/.exec(event.type);\n if (!match) return null;\n const text = (event.payload as Record<string, unknown>).text;\n if (typeof text !== \"string\") return null;\n return {\n role: match[1] as \"user\" | \"agent\",\n text,\n final: match[2] === \"final\",\n event,\n };\n}\n\nasync function httpError(response: Response, fallback: string): Promise<RealtimeSessionHttpError> {\n let payload: Record<string, unknown> = {};\n try {\n payload = await response.json() as Record<string, unknown>;\n } catch {\n // The HTTP status and fallback message remain actionable without a JSON body.\n }\n return new RealtimeSessionHttpError(\n typeof payload.message === \"string\" ? payload.message : `${fallback} (${response.status})`,\n {\n status: response.status,\n code: typeof payload.error === \"string\" ? payload.error : null,\n requestId: typeof payload.request_id === \"string\" ? payload.request_id : null,\n details: Array.isArray(payload.details) ? payload.details : [],\n },\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["TranscriptStore", "CommandError", "EventCursor", "createClientMessage", "isCommandAckPayload", "isCommandErrorPayload", "isContextRejectedPayload", "isContextUpdatePayload", "isContextUpdatedPayload", "isRealtimeEvent", "signal"]
|
|
7
7
|
}
|