@estuary-ai/sdk 0.1.22 → 0.1.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts","../src/audio/audio-utils.ts","../src/voice/websocket-voice.ts","../src/voice/livekit-voice.ts","../src/utils/event-emitter.ts","../src/connection/socket-manager.ts","../src/types.ts","../src/voice/voice-manager.ts","../src/rest/rest-client.ts","../src/rest/memory-client.ts","../src/audio/audio-player.ts","../src/utils/logger.ts","../src/client.ts","../src/utils/action-parser.ts","../src/index.ts"],"names":["ErrorCode","EstuaryError","ConnectionState","io","WebSocketVoiceManager","LiveKitVoiceManager"],"mappings":"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","file":"index.js","sourcesContent":["export enum ErrorCode {\r\n CONNECTION_FAILED = 'CONNECTION_FAILED',\r\n AUTH_FAILED = 'AUTH_FAILED',\r\n CONNECTION_TIMEOUT = 'CONNECTION_TIMEOUT',\r\n QUOTA_EXCEEDED = 'QUOTA_EXCEEDED',\r\n VOICE_NOT_SUPPORTED = 'VOICE_NOT_SUPPORTED',\r\n VOICE_ALREADY_ACTIVE = 'VOICE_ALREADY_ACTIVE',\r\n VOICE_NOT_ACTIVE = 'VOICE_NOT_ACTIVE',\r\n LIVEKIT_UNAVAILABLE = 'LIVEKIT_UNAVAILABLE',\r\n MICROPHONE_DENIED = 'MICROPHONE_DENIED',\r\n NOT_CONNECTED = 'NOT_CONNECTED',\r\n REST_ERROR = 'REST_ERROR',\r\n UNKNOWN = 'UNKNOWN',\r\n}\r\n\r\nexport class EstuaryError extends Error {\r\n readonly code: ErrorCode;\r\n readonly details?: unknown;\r\n\r\n constructor(code: ErrorCode, message: string, details?: unknown) {\r\n super(message);\r\n this.name = 'EstuaryError';\r\n this.code = code;\r\n this.details = details;\r\n }\r\n}\r\n","export function resample(input: Float32Array, fromRate: number, toRate: number): Float32Array {\r\n const ratio = fromRate / toRate;\r\n const outputLength = Math.round(input.length / ratio);\r\n const output = new Float32Array(outputLength);\r\n for (let i = 0; i < outputLength; i++) {\r\n const srcIndex = i * ratio;\r\n const low = Math.floor(srcIndex);\r\n const high = Math.min(low + 1, input.length - 1);\r\n const frac = srcIndex - low;\r\n output[i] = input[low] * (1 - frac) + input[high] * frac;\r\n }\r\n return output;\r\n}\r\n\r\nexport function float32ToInt16(float32: Float32Array): Int16Array {\r\n const int16 = new Int16Array(float32.length);\r\n for (let i = 0; i < float32.length; i++) {\r\n const clamped = Math.max(-1, Math.min(1, float32[i]));\r\n int16[i] = clamped < 0 ? clamped * 0x8000 : clamped * 0x7fff;\r\n }\r\n return int16;\r\n}\r\n\r\nexport function uint8ArrayToBase64(bytes: Uint8Array): string {\r\n if (typeof btoa === 'function') {\r\n let binary = '';\r\n for (let i = 0; i < bytes.length; i++) {\r\n binary += String.fromCharCode(bytes[i]);\r\n }\r\n return btoa(binary);\r\n }\r\n // Node.js fallback\r\n return Buffer.from(bytes).toString('base64');\r\n}\r\n","import type { VoiceManager } from '../types';\r\nimport type { SocketManager } from '../connection/socket-manager';\r\nimport type { Logger } from '../utils/logger';\r\nimport { EstuaryError, ErrorCode } from '../errors';\r\nimport { resample, float32ToInt16, uint8ArrayToBase64 } from '../audio/audio-utils';\r\n\r\nexport class WebSocketVoiceManager implements VoiceManager {\r\n private socketManager: SocketManager;\r\n private sampleRate: number;\r\n private logger: Logger;\r\n private audioContext: AudioContext | null = null;\r\n private mediaStream: MediaStream | null = null;\r\n private scriptProcessor: ScriptProcessorNode | null = null;\r\n private sourceNode: MediaStreamAudioSourceNode | null = null;\r\n private zeroGainNode: GainNode | null = null;\r\n private _isMuted = false;\r\n private _isSuppressed = false;\r\n private _isActive = false;\r\n\r\n constructor(socketManager: SocketManager, sampleRate: number, logger: Logger) {\r\n this.socketManager = socketManager;\r\n this.sampleRate = sampleRate;\r\n this.logger = logger;\r\n }\r\n\r\n get isMuted(): boolean {\r\n return this._isMuted;\r\n }\r\n\r\n get isActive(): boolean {\r\n return this._isActive;\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this._isActive) {\r\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\r\n }\r\n\r\n if (typeof AudioContext === 'undefined' && typeof (globalThis as any).webkitAudioContext === 'undefined') {\r\n throw new EstuaryError(ErrorCode.VOICE_NOT_SUPPORTED, 'AudioContext is not available in this environment');\r\n }\r\n\r\n let stream: MediaStream;\r\n try {\r\n stream = await navigator.mediaDevices.getUserMedia({\r\n audio: {\r\n sampleRate: this.sampleRate,\r\n channelCount: 1,\r\n echoCancellation: true,\r\n noiseSuppression: true,\r\n autoGainControl: true,\r\n },\r\n });\r\n } catch (err) {\r\n throw new EstuaryError(\r\n ErrorCode.MICROPHONE_DENIED,\r\n 'Microphone access denied',\r\n err,\r\n );\r\n }\r\n\r\n this.mediaStream = stream;\r\n const AudioCtx = globalThis.AudioContext || (globalThis as any).webkitAudioContext;\r\n this.audioContext = new AudioCtx({ sampleRate: this.sampleRate });\r\n\r\n this.sourceNode = this.audioContext.createMediaStreamSource(stream);\r\n this.scriptProcessor = this.audioContext.createScriptProcessor(4096, 1, 1);\r\n\r\n const nativeRate = this.audioContext.sampleRate;\r\n const targetRate = this.sampleRate;\r\n\r\n this.scriptProcessor.onaudioprocess = (event: AudioProcessingEvent) => {\r\n if (this._isMuted || this._isSuppressed) return;\r\n\r\n const inputData = event.inputBuffer.getChannelData(0);\r\n let pcmFloat: Float32Array;\r\n\r\n if (nativeRate !== targetRate) {\r\n pcmFloat = resample(inputData, nativeRate, targetRate);\r\n } else {\r\n pcmFloat = inputData;\r\n }\r\n\r\n const pcm16 = float32ToInt16(pcmFloat);\r\n const base64 = uint8ArrayToBase64(new Uint8Array(pcm16.buffer));\r\n\r\n try {\r\n this.socketManager.emitEvent('stream_audio', { audio: base64 });\r\n } catch {\r\n // Not connected — ignore, will be handled by disconnect logic\r\n }\r\n };\r\n\r\n this.sourceNode.connect(this.scriptProcessor);\r\n this.zeroGainNode = this.audioContext.createGain();\r\n this.zeroGainNode.gain.value = 0;\r\n this.scriptProcessor.connect(this.zeroGainNode);\r\n this.zeroGainNode.connect(this.audioContext.destination);\r\n\r\n this._isActive = true;\r\n this.socketManager.emitEvent('start_voice');\r\n this.logger.debug('WebSocket voice started');\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (!this._isActive) return;\r\n\r\n try {\r\n this.socketManager.emitEvent('stop_voice');\r\n } catch {\r\n // May not be connected\r\n }\r\n\r\n this.cleanup();\r\n this._isActive = false;\r\n this._isMuted = false;\r\n this._isSuppressed = false;\r\n this.logger.debug('WebSocket voice stopped');\r\n }\r\n\r\n toggleMute(): void {\r\n if (!this._isActive || !this.mediaStream) return;\r\n this._isMuted = !this._isMuted;\r\n for (const track of this.mediaStream.getAudioTracks()) {\r\n track.enabled = !this._isMuted;\r\n }\r\n this.logger.debug('Mute toggled:', this._isMuted);\r\n }\r\n\r\n setSuppressed(suppressed: boolean): void {\r\n this._isSuppressed = suppressed;\r\n this.logger.debug('Audio suppression:', suppressed ? 'on' : 'off');\r\n }\r\n\r\n dispose(): void {\r\n this.cleanup();\r\n this._isActive = false;\r\n this._isMuted = false;\r\n this._isSuppressed = false;\r\n }\r\n\r\n private cleanup(): void {\r\n if (this.scriptProcessor) {\r\n this.scriptProcessor.onaudioprocess = null;\r\n this.scriptProcessor.disconnect();\r\n this.scriptProcessor = null;\r\n }\r\n if (this.zeroGainNode) {\r\n this.zeroGainNode.disconnect();\r\n this.zeroGainNode = null;\r\n }\r\n if (this.sourceNode) {\r\n this.sourceNode.disconnect();\r\n this.sourceNode = null;\r\n }\r\n if (this.mediaStream) {\r\n for (const track of this.mediaStream.getTracks()) {\r\n track.stop();\r\n }\r\n this.mediaStream = null;\r\n }\r\n if (this.audioContext) {\r\n this.audioContext.close().catch(() => {});\r\n this.audioContext = null;\r\n }\r\n }\r\n}\r\n","import type { VoiceManager, LiveKitTokenResponse } from '../types';\r\nimport type { SocketManager } from '../connection/socket-manager';\r\nimport type { Logger } from '../utils/logger';\r\nimport { EstuaryError, ErrorCode } from '../errors';\r\n\r\nexport class LiveKitVoiceManager implements VoiceManager {\r\n private socketManager: SocketManager;\r\n private logger: Logger;\r\n private room: any = null; // livekit-client Room (dynamically imported)\r\n private _isMuted = false;\r\n private _isActive = false;\r\n\r\n constructor(socketManager: SocketManager, logger: Logger) {\r\n this.socketManager = socketManager;\r\n this.logger = logger;\r\n }\r\n\r\n get isMuted(): boolean {\r\n return this._isMuted;\r\n }\r\n\r\n get isActive(): boolean {\r\n return this._isActive;\r\n }\r\n\r\n async start(): Promise<void> {\r\n if (this._isActive) {\r\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\r\n }\r\n\r\n let Room: any;\r\n let RoomEvent: any;\r\n let Track: any;\r\n try {\r\n const lk = await import('livekit-client');\r\n Room = lk.Room;\r\n RoomEvent = lk.RoomEvent;\r\n Track = lk.Track;\r\n } catch {\r\n throw new EstuaryError(\r\n ErrorCode.LIVEKIT_UNAVAILABLE,\r\n 'livekit-client package is not installed',\r\n );\r\n }\r\n\r\n // Request token from server\r\n const tokenData = await this.requestToken();\r\n\r\n // Create and configure room\r\n this.room = new Room({\r\n adaptiveStream: true,\r\n dynacast: true,\r\n audioCaptureDefaults: {\r\n echoCancellation: true,\r\n noiseSuppression: true,\r\n autoGainControl: true,\r\n },\r\n });\r\n\r\n // Handle remote audio tracks (bot audio)\r\n this.room.on(RoomEvent.TrackSubscribed, (\r\n track: any,\r\n _publication: any,\r\n participant: any,\r\n ) => {\r\n if (track.kind === Track.Kind.Audio) {\r\n this.logger.debug('Bot audio track subscribed from', participant.identity);\r\n const audioElement = track.attach();\r\n audioElement.autoplay = true;\r\n audioElement.style.display = 'none';\r\n if (typeof document !== 'undefined') {\r\n document.body.appendChild(audioElement);\r\n }\r\n audioElement.play().catch(() => {});\r\n }\r\n });\r\n\r\n this.room.on(RoomEvent.TrackUnsubscribed, (track: any) => {\r\n if (track.kind === Track.Kind.Audio) {\r\n track.detach().forEach((el: HTMLMediaElement) => el.remove());\r\n }\r\n });\r\n\r\n this.room.on(RoomEvent.Disconnected, () => {\r\n this.logger.debug('LiveKit room disconnected');\r\n this._isActive = false;\r\n });\r\n\r\n // Connect to room\r\n try {\r\n await this.room.connect(tokenData.url, tokenData.token);\r\n this.logger.debug('Connected to LiveKit room:', tokenData.room);\r\n } catch (err) {\r\n this.room = null;\r\n const reason = err instanceof Error ? `: ${err.message}` : '';\r\n throw new EstuaryError(\r\n ErrorCode.CONNECTION_FAILED,\r\n `Failed to connect to LiveKit room${reason}`,\r\n err,\r\n );\r\n }\r\n\r\n // Enable microphone\r\n try {\r\n await this.room.localParticipant.setMicrophoneEnabled(true);\r\n this.logger.debug('Microphone enabled');\r\n } catch (err) {\r\n this.room.disconnect();\r\n this.room = null;\r\n const reason = err instanceof Error ? `: ${err.message}` : '';\r\n throw new EstuaryError(\r\n ErrorCode.MICROPHONE_DENIED,\r\n `Failed to enable microphone${reason}`,\r\n err,\r\n );\r\n }\r\n\r\n // Notify backend\r\n this.socketManager.emitEvent('livekit_join', { room: tokenData.room });\r\n this._isActive = true;\r\n this.logger.debug('LiveKit voice started');\r\n }\r\n\r\n async stop(): Promise<void> {\r\n if (!this._isActive) return;\r\n\r\n try {\r\n this.socketManager.emitEvent('livekit_leave');\r\n } catch {\r\n // May not be connected\r\n }\r\n\r\n if (this.room) {\r\n // Stop local tracks\r\n for (const [, publication] of this.room.localParticipant.trackPublications) {\r\n if (publication.track) {\r\n publication.track.stop();\r\n }\r\n }\r\n this.room.disconnect();\r\n this.room = null;\r\n }\r\n\r\n this._isActive = false;\r\n this._isMuted = false;\r\n this.logger.debug('LiveKit voice stopped');\r\n }\r\n\r\n toggleMute(): void {\r\n if (!this._isActive || !this.room) return;\r\n this._isMuted = !this._isMuted;\r\n this.room.localParticipant.setMicrophoneEnabled(!this._isMuted);\r\n this.logger.debug('Mute toggled:', this._isMuted);\r\n }\r\n\r\n dispose(): void {\r\n if (this.room) {\r\n this.room.disconnect();\r\n this.room = null;\r\n }\r\n this._isActive = false;\r\n this._isMuted = false;\r\n }\r\n\r\n private requestToken(): Promise<LiveKitTokenResponse> {\r\n return new Promise<LiveKitTokenResponse>((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n this.socketManager.onLiveKitToken(() => {}); // clear callback\r\n reject(new EstuaryError(\r\n ErrorCode.CONNECTION_TIMEOUT,\r\n 'Timed out waiting for LiveKit token',\r\n ));\r\n }, 10000);\r\n\r\n this.socketManager.onLiveKitToken((data: LiveKitTokenResponse) => {\r\n clearTimeout(timeout);\r\n resolve(data);\r\n });\r\n\r\n this.socketManager.emitEvent('livekit_token');\r\n });\r\n }\r\n}\r\n","export class TypedEventEmitter<T extends Record<string, unknown>> {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private listeners = new Map<keyof T, Set<any>>();\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private onceListeners = new Map<keyof T, Set<any>>();\r\n\r\n on<K extends keyof T>(event: K, listener: T[K]): this {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set());\r\n }\r\n this.listeners.get(event)!.add(listener);\r\n return this;\r\n }\r\n\r\n off<K extends keyof T>(event: K, listener: T[K]): this {\r\n this.listeners.get(event)?.delete(listener);\r\n this.onceListeners.get(event)?.delete(listener);\r\n return this;\r\n }\r\n\r\n once<K extends keyof T>(event: K, listener: T[K]): this {\r\n if (!this.onceListeners.has(event)) {\r\n this.onceListeners.set(event, new Set());\r\n }\r\n this.onceListeners.get(event)!.add(listener);\r\n this.on(event, listener);\r\n return this;\r\n }\r\n\r\n protected emit<K extends keyof T>(\r\n event: K,\r\n ...args: T[K] extends (...a: infer A) => void ? A : never[]\r\n ): boolean {\r\n const listeners = this.listeners.get(event);\r\n if (!listeners || listeners.size === 0) return false;\r\n\r\n for (const listener of listeners) {\r\n try {\r\n (listener as Function)(...args);\r\n } catch {\r\n // Listener threw — swallow to not break other listeners\r\n }\r\n }\r\n\r\n // Remove once listeners after firing\r\n const onceSet = this.onceListeners.get(event);\r\n if (onceSet) {\r\n for (const listener of onceSet) {\r\n this.listeners.get(event)?.delete(listener);\r\n }\r\n onceSet.clear();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n removeAllListeners<K extends keyof T>(event?: K): this {\r\n if (event) {\r\n this.listeners.delete(event);\r\n this.onceListeners.delete(event);\r\n } else {\r\n this.listeners.clear();\r\n this.onceListeners.clear();\r\n }\r\n return this;\r\n }\r\n\r\n listenerCount<K extends keyof T>(event: K): number {\r\n return this.listeners.get(event)?.size ?? 0;\r\n }\r\n}\r\n","import { io, Socket } from 'socket.io-client';\r\nimport { TypedEventEmitter } from '../utils/event-emitter';\r\nimport { Logger } from '../utils/logger';\r\nimport { EstuaryError, ErrorCode } from '../errors';\r\nimport {\r\n EstuaryConfig,\r\n EstuaryEventMap,\r\n ConnectionState,\r\n WireSessionInfo,\r\n WireBotResponse,\r\n WireBotVoice,\r\n WireSttResponse,\r\n WireInterruptData,\r\n WireQuotaExceededData,\r\n WireCameraCaptureRequest,\r\n WireLiveKitTokenResponse,\r\n WireMemoryUpdated,\r\n SessionInfo,\r\n LiveKitTokenResponse,\r\n toSessionInfo,\r\n toBotResponse,\r\n toBotVoice,\r\n toSttResponse,\r\n toInterruptData,\r\n toQuotaExceededData,\r\n toCameraCaptureRequest,\r\n toLiveKitTokenResponse,\r\n toMemoryUpdatedEvent,\r\n} from '../types';\r\n\r\nexport class SocketManager extends TypedEventEmitter<EstuaryEventMap> {\r\n private socket: Socket | null = null;\r\n private config: EstuaryConfig;\r\n private logger: Logger;\r\n private connectionState: ConnectionState = ConnectionState.Disconnected;\r\n private reconnectAttempt = 0;\r\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n private sessionInfo: SessionInfo | null = null;\r\n\r\n constructor(config: EstuaryConfig, logger: Logger) {\r\n super();\r\n this.config = config;\r\n this.logger = logger;\r\n }\r\n\r\n get state(): ConnectionState {\r\n return this.connectionState;\r\n }\r\n\r\n get session(): SessionInfo | null {\r\n return this.sessionInfo;\r\n }\r\n\r\n get isConnected(): boolean {\r\n return this.connectionState === ConnectionState.Connected;\r\n }\r\n\r\n get rawSocket(): Socket | null {\r\n return this.socket;\r\n }\r\n\r\n connect(): Promise<SessionInfo> {\r\n return new Promise((resolve, reject) => {\r\n if (this.socket?.connected) {\r\n if (this.sessionInfo) {\r\n resolve(this.sessionInfo);\r\n return;\r\n }\r\n }\r\n\r\n this.setConnectionState(ConnectionState.Connecting);\r\n this.reconnectAttempt = 0;\r\n\r\n const url = `${this.config.serverUrl}/sdk`;\r\n this.logger.debug('Connecting to', url);\r\n\r\n this.socket = io(url, {\r\n transports: ['websocket'],\r\n timeout: 10000,\r\n reconnection: false, // We handle reconnection ourselves\r\n path: '/socket.io/',\r\n });\r\n\r\n let settled = false;\r\n\r\n const onConnect = () => {\r\n this.logger.debug('Socket connected, authenticating...');\r\n this.socket!.emit('authenticate', {\r\n api_key: this.config.apiKey,\r\n character_id: this.config.characterId,\r\n player_id: this.config.playerId,\r\n audio_sample_rate: this.config.audioSampleRate ?? 16000,\r\n realtime_memory: this.config.realtimeMemory ?? false,\r\n });\r\n };\r\n\r\n const onSessionInfo = (data: WireSessionInfo) => {\r\n this.sessionInfo = toSessionInfo(data);\r\n this.setConnectionState(ConnectionState.Connected);\r\n this.reconnectAttempt = 0;\r\n this.logger.info('Connected, session:', this.sessionInfo.sessionId);\r\n this.emit('connected', this.sessionInfo);\r\n if (!settled) {\r\n settled = true;\r\n resolve(this.sessionInfo);\r\n }\r\n };\r\n\r\n const onAuthError = (data: { error: string }) => {\r\n this.logger.error('Auth error:', data.error);\r\n this.setConnectionState(ConnectionState.Error);\r\n this.emit('authError', data.error);\r\n if (!settled) {\r\n settled = true;\r\n reject(new EstuaryError(ErrorCode.AUTH_FAILED, data.error));\r\n }\r\n };\r\n\r\n const onConnectError = (err: Error) => {\r\n this.logger.error('Connection error:', err.message);\r\n if (!settled) {\r\n settled = true;\r\n this.setConnectionState(ConnectionState.Error);\r\n reject(new EstuaryError(ErrorCode.CONNECTION_FAILED, err.message));\r\n } else {\r\n this.handleDisconnect('connect_error');\r\n }\r\n };\r\n\r\n const onDisconnect = (reason: string) => {\r\n this.logger.info('Disconnected:', reason);\r\n this.sessionInfo = null;\r\n if (!settled) {\r\n settled = true;\r\n this.setConnectionState(ConnectionState.Disconnected);\r\n reject(new EstuaryError(ErrorCode.CONNECTION_FAILED, `Disconnected: ${reason}`));\r\n } else {\r\n this.handleDisconnect(reason);\r\n }\r\n };\r\n\r\n this.socket.on('connect', onConnect);\r\n this.socket.on('session_info', onSessionInfo);\r\n this.socket.on('auth_error', onAuthError);\r\n this.socket.on('connect_error', onConnectError);\r\n this.socket.on('disconnect', onDisconnect);\r\n\r\n // Wire up all server → client events\r\n this.bindServerEvents();\r\n });\r\n }\r\n\r\n disconnect(): void {\r\n this.clearReconnectTimer();\r\n this.sessionInfo = null;\r\n if (this.socket) {\r\n this.socket.removeAllListeners();\r\n this.socket.disconnect();\r\n this.socket = null;\r\n }\r\n this.setConnectionState(ConnectionState.Disconnected);\r\n this.emit('disconnected', 'manual');\r\n }\r\n\r\n emitEvent(event: string, data?: unknown): void {\r\n if (!this.socket?.connected) {\r\n throw new EstuaryError(ErrorCode.NOT_CONNECTED, 'Not connected to server');\r\n }\r\n this.socket.emit(event, data);\r\n }\r\n\r\n private bindServerEvents(): void {\r\n if (!this.socket) return;\r\n\r\n this.socket.on('bot_response', (data: WireBotResponse) => {\r\n this.emit('botResponse', toBotResponse(data));\r\n });\r\n\r\n this.socket.on('bot_voice', (data: WireBotVoice) => {\r\n this.emit('botVoice', toBotVoice(data));\r\n });\r\n\r\n this.socket.on('stt_response', (data: WireSttResponse) => {\r\n this.emit('sttResponse', toSttResponse(data));\r\n });\r\n\r\n this.socket.on('interrupt', (data: WireInterruptData) => {\r\n this.emit('interrupt', toInterruptData(data));\r\n });\r\n\r\n this.socket.on('quota_exceeded', (data: WireQuotaExceededData) => {\r\n this.emit('quotaExceeded', toQuotaExceededData(data));\r\n });\r\n\r\n this.socket.on('camera_capture', (data: WireCameraCaptureRequest) => {\r\n this.emit('cameraCaptureRequest', toCameraCaptureRequest(data));\r\n });\r\n\r\n this.socket.on('error', (data: { message: string }) => {\r\n this.emit('error', new EstuaryError(ErrorCode.UNKNOWN, data.message));\r\n });\r\n\r\n this.socket.on('livekit_token', (data: WireLiveKitTokenResponse) => {\r\n // This is handled by LiveKitVoiceManager via a separate listener\r\n // We store it here so the voice manager can access it\r\n (this as unknown as { _livekitTokenCallback?: (d: LiveKitTokenResponse) => void })\r\n ._livekitTokenCallback?.(toLiveKitTokenResponse(data));\r\n });\r\n\r\n this.socket.on('livekit_ready', (data: { room: string }) => {\r\n this.emit('livekitConnected', data.room);\r\n });\r\n\r\n this.socket.on('memory_updated', (data: WireMemoryUpdated) => {\r\n this.emit('memoryUpdated', toMemoryUpdatedEvent(data));\r\n });\r\n }\r\n\r\n /** Register a callback for livekit_token events (used by LiveKitVoiceManager) */\r\n onLiveKitToken(callback: (data: LiveKitTokenResponse) => void): void {\r\n (this as unknown as { _livekitTokenCallback?: (d: LiveKitTokenResponse) => void })\r\n ._livekitTokenCallback = callback;\r\n }\r\n\r\n private handleDisconnect(reason: string): void {\r\n this.sessionInfo = null;\r\n this.setConnectionState(ConnectionState.Disconnected);\r\n this.emit('disconnected', reason);\r\n\r\n const autoReconnect = this.config.autoReconnect ?? true;\r\n const maxAttempts = this.config.maxReconnectAttempts ?? 5;\r\n\r\n if (autoReconnect && this.reconnectAttempt < maxAttempts) {\r\n this.attemptReconnect();\r\n }\r\n }\r\n\r\n private attemptReconnect(): void {\r\n const maxAttempts = this.config.maxReconnectAttempts ?? 5;\r\n const delay = this.config.reconnectDelayMs ?? 2000;\r\n\r\n if (this.reconnectAttempt >= maxAttempts) {\r\n this.logger.warn('Max reconnect attempts reached');\r\n this.setConnectionState(ConnectionState.Error);\r\n this.emit('error', new EstuaryError(\r\n ErrorCode.CONNECTION_FAILED,\r\n `Failed to reconnect after ${maxAttempts} attempts`,\r\n ));\r\n return;\r\n }\r\n\r\n this.reconnectAttempt++;\r\n this.setConnectionState(ConnectionState.Reconnecting);\r\n this.emit('reconnecting', this.reconnectAttempt);\r\n this.logger.info(`Reconnecting (attempt ${this.reconnectAttempt}/${maxAttempts})...`);\r\n\r\n this.clearReconnectTimer();\r\n this.reconnectTimer = setTimeout(() => {\r\n this.connect().catch((err) => {\r\n this.logger.error('Reconnect failed:', err.message);\r\n // Will trigger another attempt via handleDisconnect\r\n });\r\n }, delay * this.reconnectAttempt); // Linear backoff: delay * attempt\r\n }\r\n\r\n private clearReconnectTimer(): void {\r\n if (this.reconnectTimer) {\r\n clearTimeout(this.reconnectTimer);\r\n this.reconnectTimer = null;\r\n }\r\n }\r\n\r\n private setConnectionState(state: ConnectionState): void {\r\n if (this.connectionState !== state) {\r\n this.connectionState = state;\r\n this.emit('connectionStateChanged', state);\r\n }\r\n }\r\n}\r\n","// ─── Configuration ───────────────────────────────────────────────\r\n\r\nexport interface EstuaryConfig {\r\n /** Base URL of the Estuary server (e.g., \"https://api.estuary-ai.com\") */\r\n serverUrl: string;\r\n /** API key (starts with \"est_\") */\r\n apiKey: string;\r\n /** Character (agent) ID */\r\n characterId: string;\r\n /** Unique identifier for the end user */\r\n playerId: string;\r\n /** Audio sample rate in Hz (default: 16000) */\r\n audioSampleRate?: number;\r\n /** Auto-reconnect on disconnect (default: true) */\r\n autoReconnect?: boolean;\r\n /** Max reconnect attempts (default: 5) */\r\n maxReconnectAttempts?: number;\r\n /** Base delay between reconnect attempts in ms (default: 2000). Actual delay is baseDelay × attemptNumber (linear backoff). */\r\n reconnectDelayMs?: number;\r\n /** Enable debug logging (default: false) */\r\n debug?: boolean;\r\n /** Voice transport: 'websocket' | 'livekit' | 'auto' (default: 'auto') */\r\n voiceTransport?: VoiceTransport;\r\n /** Enable real-time memory extraction after each response (default: false) */\r\n realtimeMemory?: boolean;\r\n /** Suppress mic during TTS playback (software AEC fallback, disables barge-in). Default: false */\r\n suppressMicDuringPlayback?: boolean;\r\n /** Proactively interrupt bot audio when user starts speaking (default: true) */\r\n autoInterruptOnSpeech?: boolean;\r\n}\r\n\r\nexport type VoiceTransport = 'websocket' | 'livekit' | 'auto';\r\n\r\n// ─── Connection State ────────────────────────────────────────────\r\n\r\nexport enum ConnectionState {\r\n Disconnected = 'disconnected',\r\n Connecting = 'connecting',\r\n Connected = 'connected',\r\n Reconnecting = 'reconnecting',\r\n Error = 'error',\r\n}\r\n\r\n// ─── Wire Format Types (snake_case from server) ─────────────────\r\n\r\n/** @internal */\r\nexport interface WireSessionInfo {\r\n session_id: string;\r\n conversation_id: string;\r\n character_id: string;\r\n player_id: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface WireBotResponse {\r\n text: string;\r\n is_final: boolean;\r\n partial: string;\r\n message_id: string;\r\n chunk_index: number;\r\n is_interjection: boolean;\r\n token_stream?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport interface WireBotVoice {\r\n audio: string;\r\n message_id: string;\r\n chunk_index: number;\r\n is_final: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport interface WireSttResponse {\r\n text: string;\r\n is_final: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport interface WireInterruptData {\r\n message_id?: string;\r\n reason?: string;\r\n interrupted_at?: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface WireQuotaExceededData {\r\n message: string;\r\n current: number;\r\n limit: number;\r\n remaining: number;\r\n tier: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface WireLiveKitTokenResponse {\r\n token: string;\r\n url: string;\r\n room: string;\r\n}\r\n\r\n/** @internal */\r\nexport interface WireCameraCaptureRequest {\r\n request_id: string;\r\n text?: string;\r\n}\r\n\r\n/** @internal — new_memories items are already camelCase from Memory.to_dict() */\r\nexport interface WireMemoryUpdated {\r\n agent_id: string;\r\n player_id: string;\r\n memories_extracted: number;\r\n facts_extracted: number;\r\n conversation_id: string;\r\n new_memories: MemoryData[];\r\n timestamp: string;\r\n}\r\n\r\n// ─── Public Types (camelCase) ────────────────────────────────────\r\n\r\nexport interface SessionInfo {\r\n sessionId: string;\r\n conversationId: string;\r\n characterId: string;\r\n playerId: string;\r\n}\r\n\r\nexport interface BotResponse {\r\n text: string;\r\n isFinal: boolean;\r\n partial: string;\r\n messageId: string;\r\n chunkIndex: number;\r\n isInterjection: boolean;\r\n tokenStream?: boolean;\r\n}\r\n\r\nexport interface BotVoice {\r\n audio: string;\r\n messageId: string;\r\n chunkIndex: number;\r\n isFinal: boolean;\r\n}\r\n\r\nexport interface SttResponse {\r\n text: string;\r\n isFinal: boolean;\r\n}\r\n\r\nexport interface InterruptData {\r\n messageId?: string;\r\n reason?: string;\r\n interruptedAt?: string;\r\n}\r\n\r\nexport interface QuotaExceededData {\r\n message: string;\r\n current: number;\r\n limit: number;\r\n remaining: number;\r\n tier: string;\r\n}\r\n\r\nexport interface LiveKitTokenResponse {\r\n token: string;\r\n url: string;\r\n room: string;\r\n}\r\n\r\nexport interface CameraCaptureRequest {\r\n requestId: string;\r\n text?: string;\r\n}\r\n\r\nexport interface MemoryData {\r\n id: string;\r\n userId: string;\r\n agentId: string;\r\n playerId: string;\r\n content: string;\r\n memoryType: string;\r\n confidence: number;\r\n status: string;\r\n sourceConversationId: string;\r\n sourceQuote?: string;\r\n source?: string;\r\n topic?: string;\r\n secondaryTopics?: string[];\r\n lastAccessedAt?: string | null;\r\n accessCount?: number;\r\n extractedAt?: string | null;\r\n createdAt?: string | null;\r\n updatedAt?: string | null;\r\n}\r\n\r\nexport interface MemoryUpdatedEvent {\r\n agentId: string;\r\n playerId: string;\r\n memoriesExtracted: number;\r\n factsExtracted: number;\r\n conversationId: string;\r\n newMemories: MemoryData[];\r\n timestamp: string;\r\n}\r\n\r\n// ─── Wire → Public Converters ────────────────────────────────────\r\n\r\n/** @internal */\r\nexport function toSessionInfo(wire: WireSessionInfo): SessionInfo {\r\n return {\r\n sessionId: wire.session_id,\r\n conversationId: wire.conversation_id,\r\n characterId: wire.character_id,\r\n playerId: wire.player_id,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toBotResponse(wire: WireBotResponse): BotResponse {\r\n return {\r\n text: wire.text,\r\n isFinal: wire.is_final,\r\n partial: wire.partial,\r\n messageId: wire.message_id,\r\n chunkIndex: wire.chunk_index,\r\n isInterjection: wire.is_interjection,\r\n tokenStream: wire.token_stream,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toBotVoice(wire: WireBotVoice): BotVoice {\r\n return {\r\n audio: wire.audio,\r\n messageId: wire.message_id,\r\n chunkIndex: wire.chunk_index,\r\n isFinal: wire.is_final,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toSttResponse(wire: WireSttResponse): SttResponse {\r\n return {\r\n text: wire.text,\r\n isFinal: wire.is_final,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toInterruptData(wire: WireInterruptData): InterruptData {\r\n return {\r\n messageId: wire.message_id,\r\n reason: wire.reason,\r\n interruptedAt: wire.interrupted_at,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toQuotaExceededData(wire: WireQuotaExceededData): QuotaExceededData {\r\n return {\r\n message: wire.message,\r\n current: wire.current,\r\n limit: wire.limit,\r\n remaining: wire.remaining,\r\n tier: wire.tier,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toLiveKitTokenResponse(wire: WireLiveKitTokenResponse): LiveKitTokenResponse {\r\n return {\r\n token: wire.token,\r\n url: wire.url,\r\n room: wire.room,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toCameraCaptureRequest(wire: WireCameraCaptureRequest): CameraCaptureRequest {\r\n return {\r\n requestId: wire.request_id,\r\n text: wire.text,\r\n };\r\n}\r\n\r\n/** @internal */\r\nexport function toMemoryUpdatedEvent(wire: WireMemoryUpdated): MemoryUpdatedEvent {\r\n return {\r\n agentId: wire.agent_id,\r\n playerId: wire.player_id,\r\n memoriesExtracted: wire.memories_extracted,\r\n factsExtracted: wire.facts_extracted,\r\n conversationId: wire.conversation_id,\r\n newMemories: wire.new_memories ?? [],\r\n timestamp: wire.timestamp,\r\n };\r\n}\r\n\r\n// ─── Character Actions ───────────────────────────────────────────\r\n\r\nexport interface CharacterAction {\r\n /** Action name (e.g., \"follow_user\", \"sit\", \"look_at\") */\r\n name: string;\r\n /** Action parameters as key-value pairs */\r\n params: Record<string, string>;\r\n /** Message ID of the bot response that contained this action */\r\n messageId: string;\r\n}\r\n\r\n// ─── Event Map ───────────────────────────────────────────────────\r\n\r\nexport type EstuaryEventMap = {\r\n connected: (session: SessionInfo) => void;\r\n disconnected: (reason: string) => void;\r\n reconnecting: (attempt: number) => void;\r\n connectionStateChanged: (state: ConnectionState) => void;\r\n botResponse: (response: BotResponse) => void;\r\n botVoice: (voice: BotVoice) => void;\r\n sttResponse: (response: SttResponse) => void;\r\n interrupt: (data: InterruptData) => void;\r\n error: (error: Error) => void;\r\n authError: (error: string) => void;\r\n quotaExceeded: (data: QuotaExceededData) => void;\r\n cameraCaptureRequest: (request: CameraCaptureRequest) => void;\r\n characterAction: (action: CharacterAction) => void;\r\n voiceStarted: () => void;\r\n voiceStopped: () => void;\r\n livekitConnected: (room: string) => void;\r\n livekitDisconnected: () => void;\r\n audioPlaybackStarted: (messageId: string) => void;\r\n audioPlaybackComplete: (messageId: string) => void;\r\n memoryUpdated: (event: MemoryUpdatedEvent) => void;\r\n}\r\n\r\n// ─── Voice Manager Interface ─────────────────────────────────────\r\n\r\nexport interface VoiceManager {\r\n start(): Promise<void>;\r\n stop(): Promise<void>;\r\n toggleMute(): void;\r\n /** Suppress audio sending (software AEC). No-op if not supported. */\r\n setSuppressed?(suppressed: boolean): void;\r\n readonly isMuted: boolean;\r\n readonly isActive: boolean;\r\n dispose(): void;\r\n}\r\n\r\n// ─── Memory Types ────────────────────────────────────────────────\r\n\r\nexport interface MemoryListOptions {\r\n memoryType?: string;\r\n status?: string;\r\n limit?: number;\r\n offset?: number;\r\n sortBy?: 'created_at' | 'confidence' | 'last_accessed_at';\r\n sortOrder?: 'asc' | 'desc';\r\n}\r\n\r\nexport interface MemoryTimelineOptions {\r\n startDate?: string;\r\n endDate?: string;\r\n groupBy?: 'day' | 'week' | 'month';\r\n}\r\n\r\nexport interface MemoryGraphOptions {\r\n includeEntities?: boolean;\r\n includeCharacterMemories?: boolean;\r\n}\r\n\r\nexport interface MemorySearchOptions {\r\n query: string;\r\n limit?: number;\r\n}\r\n\r\nexport interface MemoryListResponse {\r\n memories: MemoryData[];\r\n total: number;\r\n limit: number;\r\n offset: number;\r\n}\r\n\r\nexport interface MemoryTimelineResponse {\r\n timeline: { date: string; memories: MemoryData[] }[];\r\n totalMemories: number;\r\n groupBy: string;\r\n}\r\n\r\nexport interface MemoryStatsResponse {\r\n totalActive: number;\r\n totalSuperseded: number;\r\n totalDecayed: number;\r\n byType: Record<string, number>;\r\n coreFacts: number;\r\n}\r\n\r\nexport interface MemoryGraphNode {\r\n id: string;\r\n type: 'user' | 'cluster' | 'memory' | 'entity';\r\n label?: string;\r\n /** Cluster fields */\r\n level?: number;\r\n memoryCount?: number;\r\n typeDistribution?: Record<string, number>;\r\n expanded?: boolean;\r\n parentClusterId?: string | null;\r\n childClusterIds?: string[];\r\n labelPending?: boolean;\r\n /** Memory fields */\r\n memoryType?: string;\r\n content?: string;\r\n confidence?: number;\r\n clusterId?: string;\r\n sourceQuote?: string | null;\r\n sourceConversationId?: string | null;\r\n createdAt?: string | null;\r\n accessCount?: number;\r\n /** Entity fields */\r\n entityType?: string | null;\r\n name?: string;\r\n mentionCount?: number;\r\n extraData?: Record<string, string>;\r\n}\r\n\r\nexport interface MemoryGraphEdge {\r\n source: string;\r\n target: string;\r\n type: 'has_cluster' | 'contains' | 'mentions' | 'relationship';\r\n relationshipType?: string;\r\n label?: string | null;\r\n confidence?: number;\r\n}\r\n\r\nexport interface MemoryGraphResponse {\r\n nodes: MemoryGraphNode[];\r\n edges: MemoryGraphEdge[];\r\n stats: {\r\n totalMemories: number;\r\n totalEntities: number;\r\n clusterCount: number;\r\n clusters: Record<string, number>;\r\n };\r\n stale?: boolean;\r\n}\r\n\r\nexport interface MemorySearchResponse {\r\n results: { memory: MemoryData; score: number; similarityScore: number }[];\r\n query: string;\r\n total: number;\r\n}\r\n\r\nexport interface CoreFact {\r\n id: string;\r\n userId: string;\r\n agentId: string;\r\n playerId: string;\r\n factKey: string;\r\n factValue: string;\r\n sourceMemoryId?: string | null;\r\n createdAt?: string | null;\r\n updatedAt?: string | null;\r\n}\r\n\r\nexport interface CoreFactsResponse {\r\n coreFacts: CoreFact[];\r\n}\r\n","import type { VoiceManager, VoiceTransport } from '../types';\r\nimport type { SocketManager } from '../connection/socket-manager';\r\nimport type { Logger } from '../utils/logger';\r\n\r\nexport type { VoiceManager };\r\n\r\nasync function isLiveKitAvailable(): Promise<boolean> {\r\n try {\r\n await import('livekit-client');\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport async function createVoiceManager(\r\n transport: VoiceTransport,\r\n socketManager: SocketManager,\r\n sampleRate: number,\r\n logger: Logger,\r\n): Promise<VoiceManager | null> {\r\n if (transport === 'websocket') {\r\n const { WebSocketVoiceManager } = await import('./websocket-voice');\r\n return new WebSocketVoiceManager(socketManager, sampleRate, logger);\r\n }\r\n\r\n if (transport === 'livekit') {\r\n if (await isLiveKitAvailable()) {\r\n const { LiveKitVoiceManager } = await import('./livekit-voice');\r\n return new LiveKitVoiceManager(socketManager, logger);\r\n }\r\n logger.warn('livekit-client not installed, falling back to WebSocket voice');\r\n const { WebSocketVoiceManager } = await import('./websocket-voice');\r\n return new WebSocketVoiceManager(socketManager, sampleRate, logger);\r\n }\r\n\r\n // auto: prefer LiveKit if available, else WebSocket\r\n if (transport === 'auto') {\r\n if (await isLiveKitAvailable()) {\r\n const { LiveKitVoiceManager } = await import('./livekit-voice');\r\n return new LiveKitVoiceManager(socketManager, logger);\r\n }\r\n const { WebSocketVoiceManager } = await import('./websocket-voice');\r\n return new WebSocketVoiceManager(socketManager, sampleRate, logger);\r\n }\r\n\r\n return null;\r\n}\r\n","import { EstuaryError, ErrorCode } from '../errors';\r\n\r\nconst DEFAULT_TIMEOUT_MS = 10_000;\r\n\r\nexport class RestClient {\r\n private baseUrl: string;\r\n private apiKey: string;\r\n private timeoutMs: number;\r\n\r\n constructor(baseUrl: string, apiKey: string, timeoutMs: number = DEFAULT_TIMEOUT_MS) {\r\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\r\n this.apiKey = apiKey;\r\n this.timeoutMs = timeoutMs;\r\n }\r\n\r\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\r\n const url = this.buildUrl(path, params);\r\n return this.request<T>(url, { method: 'GET' });\r\n }\r\n\r\n async post<T>(path: string, body?: unknown): Promise<T> {\r\n const url = this.buildUrl(path);\r\n const init: RequestInit = { method: 'POST' };\r\n if (body !== undefined) {\r\n init.headers = { 'Content-Type': 'application/json' };\r\n init.body = JSON.stringify(body);\r\n }\r\n return this.request<T>(url, init);\r\n }\r\n\r\n async delete<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\r\n const url = this.buildUrl(path, params);\r\n return this.request<T>(url, { method: 'DELETE' });\r\n }\r\n\r\n dispose(): void {\r\n // No persistent resources to clean up\r\n }\r\n\r\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\r\n const url = new URL(path, this.baseUrl);\r\n if (params) {\r\n for (const [key, value] of Object.entries(params)) {\r\n if (value !== undefined) {\r\n url.searchParams.set(key, String(value));\r\n }\r\n }\r\n }\r\n return url.toString();\r\n }\r\n\r\n private async request<T>(url: string, init: RequestInit): Promise<T> {\r\n const headers = new Headers(init.headers);\r\n headers.set('X-API-Key', this.apiKey);\r\n\r\n const response = await fetch(url, {\r\n ...init,\r\n headers,\r\n signal: AbortSignal.timeout(this.timeoutMs),\r\n });\r\n\r\n if (!response.ok) {\r\n let detail: unknown;\r\n try {\r\n detail = await response.json();\r\n } catch {\r\n detail = await response.text().catch(() => null);\r\n }\r\n throw new EstuaryError(\r\n ErrorCode.REST_ERROR,\r\n `HTTP ${response.status}: ${response.statusText}`,\r\n detail,\r\n );\r\n }\r\n\r\n return response.json() as Promise<T>;\r\n }\r\n}\r\n","import type {\r\n MemoryListOptions,\r\n MemoryListResponse,\r\n MemoryTimelineOptions,\r\n MemoryTimelineResponse,\r\n MemoryStatsResponse,\r\n CoreFactsResponse,\r\n MemoryGraphOptions,\r\n MemoryGraphResponse,\r\n MemorySearchResponse,\r\n} from '../types';\r\nimport type { RestClient } from './rest-client';\r\n\r\nexport class MemoryClient {\r\n private rest: RestClient;\r\n private basePath: string;\r\n\r\n constructor(rest: RestClient, agentId: string, playerId: string) {\r\n this.rest = rest;\r\n this.basePath = `/api/agents/${agentId}/players/${playerId}/memories`;\r\n }\r\n\r\n async getMemories(options?: MemoryListOptions): Promise<MemoryListResponse> {\r\n return this.rest.get<MemoryListResponse>(this.basePath, options as Record<string, string | number | boolean | undefined>);\r\n }\r\n\r\n async getTimeline(options?: MemoryTimelineOptions): Promise<MemoryTimelineResponse> {\r\n return this.rest.get<MemoryTimelineResponse>(`${this.basePath}/timeline`, options as Record<string, string | number | boolean | undefined>);\r\n }\r\n\r\n async getStats(): Promise<MemoryStatsResponse> {\r\n return this.rest.get<MemoryStatsResponse>(`${this.basePath}/stats`);\r\n }\r\n\r\n async getCoreFacts(): Promise<CoreFactsResponse> {\r\n return this.rest.get<CoreFactsResponse>(`${this.basePath}/core-facts`);\r\n }\r\n\r\n async getGraph(options?: MemoryGraphOptions): Promise<MemoryGraphResponse> {\r\n const params: Record<string, string | number | boolean | undefined> = {};\r\n if (options) {\r\n if (options.includeEntities !== undefined) params.include_entities = options.includeEntities;\r\n if (options.includeCharacterMemories !== undefined) params.include_character_memories = options.includeCharacterMemories;\r\n }\r\n return this.rest.get<MemoryGraphResponse>(`${this.basePath}/graph`, params);\r\n }\r\n\r\n async search(query: string, limit?: number): Promise<MemorySearchResponse> {\r\n return this.rest.get<MemorySearchResponse>(`${this.basePath}/search`, { q: query, limit });\r\n }\r\n\r\n async deleteAll(confirm: boolean): Promise<{ message: string; deletedCount: number }> {\r\n return this.rest.delete<{ message: string; deletedCount: number }>(this.basePath, { confirm });\r\n }\r\n\r\n dispose(): void {\r\n // No persistent resources to clean up\r\n }\r\n}\r\n","import type { BotVoice } from '../types';\r\n\r\nexport type AudioPlaybackEvent =\r\n | { type: 'started'; messageId: string }\r\n | { type: 'complete'; messageId: string };\r\n\r\nexport class AudioPlayer {\r\n private sampleRate: number;\r\n private onEvent: (event: AudioPlaybackEvent) => void;\r\n private audioContext: AudioContext | null = null;\r\n private mediaStreamDest: MediaStreamAudioDestinationNode | null = null;\r\n private audioElement: HTMLAudioElement | null = null;\r\n private queue: { buffer: AudioBuffer; messageId: string }[] = [];\r\n private currentSource: AudioBufferSourceNode | null = null;\r\n private currentMessageId: string | null = null;\r\n private isPlaying = false;\r\n private _isCleared = false;\r\n private _interruptedMessageId: string | null = null;\r\n\r\n constructor(sampleRate: number, onEvent: (event: AudioPlaybackEvent) => void) {\r\n this.sampleRate = sampleRate;\r\n this.onEvent = onEvent;\r\n }\r\n\r\n /** Whether audio is currently playing */\r\n get playing(): boolean {\r\n return this.isPlaying;\r\n }\r\n\r\n /** The messageId of the currently playing audio, or null */\r\n get playingMessageId(): string | null {\r\n return this.currentMessageId;\r\n }\r\n\r\n /** Mark a messageId as interrupted so late-arriving chunks are dropped */\r\n setInterruptedMessageId(id: string | null): void {\r\n this._interruptedMessageId = id;\r\n }\r\n\r\n enqueue(voice: BotVoice): void {\r\n // Drop chunks belonging to the interrupted message\r\n if (voice.messageId === this._interruptedMessageId) return;\r\n // Clear the filter once a new message arrives\r\n if (this._interruptedMessageId && voice.messageId !== this._interruptedMessageId) {\r\n this._interruptedMessageId = null;\r\n }\r\n\r\n this._isCleared = false;\r\n\r\n const ctx = this.getAudioContext();\r\n if (!ctx) return;\r\n\r\n const pcm16 = base64ToInt16Array(voice.audio);\r\n const float32 = int16ToFloat32(pcm16);\r\n\r\n const buffer = ctx.createBuffer(1, float32.length, this.sampleRate);\r\n buffer.getChannelData(0).set(float32);\r\n\r\n this.queue.push({ buffer, messageId: voice.messageId });\r\n\r\n if (!this.isPlaying) {\r\n this.playNext();\r\n }\r\n }\r\n\r\n clear(): void {\r\n this._isCleared = true;\r\n this.queue.length = 0;\r\n if (this.currentSource) {\r\n try {\r\n this.currentSource.onended = null;\r\n this.currentSource.stop();\r\n this.currentSource.disconnect();\r\n } catch {\r\n // Already stopped\r\n }\r\n this.currentSource = null;\r\n }\r\n // Push silence through mediaStreamDest to flush the <audio> element's\r\n // internal pipeline buffer. Without this, mobile browsers replay the last\r\n // buffered frames. We can't touch the <audio> element directly (pause or\r\n // srcObject reassignment revokes the autoplay privilege on mobile).\r\n if (this.audioContext && this.mediaStreamDest) {\r\n const silence = this.audioContext.createBuffer(\r\n 1,\r\n this.sampleRate * 0.25,\r\n this.sampleRate,\r\n );\r\n const src = this.audioContext.createBufferSource();\r\n src.buffer = silence;\r\n src.connect(this.mediaStreamDest);\r\n src.start();\r\n }\r\n this.isPlaying = false;\r\n this.currentMessageId = null;\r\n }\r\n\r\n dispose(): void {\r\n this.clear();\r\n if (this.audioElement) {\r\n this.audioElement.pause();\r\n this.audioElement.srcObject = null;\r\n this.audioElement.remove();\r\n this.audioElement = null;\r\n }\r\n if (this.mediaStreamDest) {\r\n this.mediaStreamDest.disconnect();\r\n this.mediaStreamDest = null;\r\n }\r\n if (this.audioContext) {\r\n this.audioContext.close().catch(() => {});\r\n this.audioContext = null;\r\n }\r\n }\r\n\r\n private getAudioContext(): AudioContext | null {\r\n if (this.audioContext) return this.audioContext;\r\n\r\n if (typeof AudioContext === 'undefined' && typeof (globalThis as any).webkitAudioContext === 'undefined') {\r\n return null;\r\n }\r\n\r\n const AudioCtx = globalThis.AudioContext || (globalThis as any).webkitAudioContext;\r\n const ctx = new AudioCtx({ sampleRate: this.sampleRate });\r\n this.audioContext = ctx;\r\n\r\n // Route through a MediaStreamDestination → hidden <audio> element so the\r\n // browser's AEC pipeline can see our playback as the echo reference signal.\r\n if (typeof document !== 'undefined') {\r\n this.mediaStreamDest = ctx.createMediaStreamDestination();\r\n const el = document.createElement('audio');\r\n el.srcObject = this.mediaStreamDest.stream;\r\n el.autoplay = true;\r\n // Hidden but in the DOM so the browser treats it as a real media element\r\n el.style.display = 'none';\r\n document.body.appendChild(el);\r\n el.play().catch(() => {});\r\n this.audioElement = el;\r\n }\r\n\r\n return ctx;\r\n }\r\n\r\n private playNext(): void {\r\n if (this._isCleared) return;\r\n\r\n const ctx = this.getAudioContext();\r\n if (!ctx || this.queue.length === 0) {\r\n if (this.isPlaying && this.currentMessageId) {\r\n this.onEvent({ type: 'complete', messageId: this.currentMessageId });\r\n }\r\n this.isPlaying = false;\r\n this.currentMessageId = null;\r\n return;\r\n }\r\n\r\n const { buffer, messageId } = this.queue.shift()!;\r\n\r\n // Emit started if this is a new message\r\n if (messageId !== this.currentMessageId) {\r\n if (this.currentMessageId) {\r\n this.onEvent({ type: 'complete', messageId: this.currentMessageId });\r\n }\r\n this.currentMessageId = messageId;\r\n this.onEvent({ type: 'started', messageId });\r\n }\r\n\r\n this.isPlaying = true;\r\n const source = ctx.createBufferSource();\r\n source.buffer = buffer;\r\n source.connect(this.mediaStreamDest ?? ctx.destination);\r\n this.currentSource = source;\r\n\r\n source.onended = () => {\r\n if (this._isCleared) return;\r\n this.currentSource = null;\r\n this.playNext();\r\n };\r\n\r\n if (this.audioElement) {\r\n this.audioElement.play().catch(() => {});\r\n }\r\n ctx.resume().catch(() => {});\r\n source.start();\r\n }\r\n}\r\n\r\nfunction base64ToInt16Array(base64: string): Int16Array {\r\n let bytes: Uint8Array;\r\n if (typeof atob === 'function') {\r\n const binary = atob(base64);\r\n bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n } else {\r\n // Node.js fallback\r\n bytes = new Uint8Array(Buffer.from(base64, 'base64'));\r\n }\r\n return new Int16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);\r\n}\r\n\r\nfunction int16ToFloat32(int16: Int16Array): Float32Array {\r\n const float32 = new Float32Array(int16.length);\r\n for (let i = 0; i < int16.length; i++) {\r\n float32[i] = int16[i] / (int16[i] < 0 ? 0x8000 : 0x7fff);\r\n }\r\n return float32;\r\n}\r\n","export class Logger {\r\n private enabled: boolean;\r\n\r\n constructor(debug = false) {\r\n this.enabled = debug;\r\n }\r\n\r\n setDebug(enabled: boolean): void {\r\n this.enabled = enabled;\r\n }\r\n\r\n debug(...args: unknown[]): void {\r\n if (this.enabled) console.debug('[Estuary]', ...args);\r\n }\r\n\r\n info(...args: unknown[]): void {\r\n if (this.enabled) console.info('[Estuary]', ...args);\r\n }\r\n\r\n warn(...args: unknown[]): void {\r\n console.warn('[Estuary]', ...args);\r\n }\r\n\r\n error(...args: unknown[]): void {\r\n console.error('[Estuary]', ...args);\r\n }\r\n}\r\n","import { SocketManager } from './connection/socket-manager';\r\nimport { createVoiceManager } from './voice/voice-manager';\r\nimport { RestClient } from './rest/rest-client';\r\nimport { MemoryClient } from './rest/memory-client';\r\nimport { AudioPlayer } from './audio/audio-player';\r\nimport { TypedEventEmitter } from './utils/event-emitter';\r\nimport { Logger } from './utils/logger';\r\nimport { EstuaryError, ErrorCode } from './errors';\r\nimport {\r\n EstuaryConfig,\r\n EstuaryEventMap,\r\n ConnectionState,\r\n SessionInfo,\r\n BotResponse,\r\n BotVoice,\r\n SttResponse,\r\n VoiceManager,\r\n} from './types';\r\nimport { StreamingActionParser } from './utils/action-parser';\r\n\r\nconst DEFAULT_SAMPLE_RATE = 16000;\r\n\r\nexport class EstuaryClient extends TypedEventEmitter<EstuaryEventMap> {\r\n private config: EstuaryConfig;\r\n private logger: Logger;\r\n private socketManager: SocketManager;\r\n private voiceManager: VoiceManager | null = null;\r\n private audioPlayer: AudioPlayer | null = null;\r\n private _memory: MemoryClient;\r\n private _sessionInfo: SessionInfo | null = null;\r\n private actionParsers = new Map<string, StreamingActionParser>();\r\n private _hasAutoInterrupted = false;\r\n private _autoInterruptGraceTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor(config: EstuaryConfig) {\r\n super();\r\n this.config = config;\r\n this.logger = new Logger(config.debug ?? false);\r\n this.socketManager = new SocketManager(config, this.logger);\r\n this.forwardSocketEvents();\r\n\r\n // Set up REST client for memory API\r\n const restClient = new RestClient(config.serverUrl, config.apiKey);\r\n this._memory = new MemoryClient(restClient, config.characterId, config.playerId);\r\n }\r\n\r\n /** Memory API client for querying memories, graphs, and facts */\r\n get memory(): MemoryClient {\r\n return this._memory;\r\n }\r\n\r\n /** Current session info (null if not connected) */\r\n get session(): SessionInfo | null {\r\n return this._sessionInfo;\r\n }\r\n\r\n /** Current connection state */\r\n get connectionState(): ConnectionState {\r\n return this.socketManager.state;\r\n }\r\n\r\n /** Whether the client is connected and authenticated */\r\n get isConnected(): boolean {\r\n return this.socketManager.isConnected;\r\n }\r\n\r\n /** Connect to the Estuary server and authenticate */\r\n async connect(): Promise<SessionInfo> {\r\n this.logger.info('Connecting...');\r\n const session = await this.socketManager.connect();\r\n this._sessionInfo = session;\r\n return session;\r\n }\r\n\r\n /** Disconnect from the server */\r\n async disconnect(): Promise<void> {\r\n this.logger.info('Disconnecting...');\r\n if (this._autoInterruptGraceTimer) {\r\n clearTimeout(this._autoInterruptGraceTimer);\r\n this._autoInterruptGraceTimer = null;\r\n }\r\n await this.stopVoice();\r\n this.audioPlayer?.dispose();\r\n this.audioPlayer = null;\r\n this.socketManager.disconnect();\r\n this._sessionInfo = null;\r\n }\r\n\r\n /** Send a text message to the character. Defaults to textOnly=true (no TTS audio response). Pass textOnly=false to receive voice audio. */\r\n sendText(text: string, textOnly = true): void {\r\n this.ensureConnected();\r\n this.socketManager.emitEvent('text', { text, textOnly });\r\n }\r\n\r\n /** Interrupt the current bot response */\r\n interrupt(messageId?: string): void {\r\n this.ensureConnected();\r\n this.socketManager.emitEvent('client_interrupt', { message_id: messageId });\r\n this.audioPlayer?.setInterruptedMessageId(messageId ?? this.audioPlayer.playingMessageId);\r\n this.audioPlayer?.clear();\r\n this._hasAutoInterrupted = true;\r\n if (this._autoInterruptGraceTimer) {\r\n clearTimeout(this._autoInterruptGraceTimer);\r\n this._autoInterruptGraceTimer = null;\r\n }\r\n if (this.config.suppressMicDuringPlayback) {\r\n this.voiceManager?.setSuppressed?.(false);\r\n }\r\n }\r\n\r\n /** Send a camera image for vision processing */\r\n sendCameraImage(imageBase64: string, mimeType: string, requestId?: string, text?: string): void {\r\n this.ensureConnected();\r\n this.socketManager.emitEvent('camera_image', {\r\n image: imageBase64,\r\n mime_type: mimeType,\r\n request_id: requestId,\r\n text,\r\n });\r\n }\r\n\r\n /** Update session preferences */\r\n updatePreferences(preferences: { enableVisionAcknowledgment?: boolean }): void {\r\n this.ensureConnected();\r\n this.socketManager.emitEvent('update_preferences', preferences);\r\n }\r\n\r\n /** Notify server that audio playback completed for a message */\r\n notifyAudioPlaybackComplete(messageId?: string): void {\r\n this.ensureConnected();\r\n this.socketManager.emitEvent('audio_playback_complete', { message_id: messageId });\r\n }\r\n\r\n // ─── Voice ───────────────────────────────────────────────────\r\n\r\n /** Start voice input (requests microphone permission) */\r\n async startVoice(): Promise<void> {\r\n this.ensureConnected();\r\n\r\n if (this.voiceManager?.isActive) {\r\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\r\n }\r\n\r\n const transport = this.config.voiceTransport ?? 'auto';\r\n const sampleRate = this.config.audioSampleRate ?? DEFAULT_SAMPLE_RATE;\r\n\r\n this.voiceManager = await createVoiceManager(transport, this.socketManager, sampleRate, this.logger);\r\n if (!this.voiceManager) {\r\n throw new EstuaryError(ErrorCode.VOICE_NOT_SUPPORTED, 'No voice transport available');\r\n }\r\n\r\n // Set up audio player for bot voice responses (browser only)\r\n if (!this.audioPlayer && typeof AudioContext !== 'undefined') {\r\n this.audioPlayer = new AudioPlayer(sampleRate, (event) => {\r\n if (event.type === 'started') {\r\n // Suppress auto-interrupt during grace period so trailing STT partials\r\n // from the user's previous speech don't kill the new audio.\r\n this._hasAutoInterrupted = true;\r\n if (this._autoInterruptGraceTimer) clearTimeout(this._autoInterruptGraceTimer);\r\n this._autoInterruptGraceTimer = setTimeout(() => {\r\n this._hasAutoInterrupted = false;\r\n this._autoInterruptGraceTimer = null;\r\n }, 1500);\r\n this.emit('audioPlaybackStarted', event.messageId);\r\n if (this.config.suppressMicDuringPlayback) {\r\n this.voiceManager?.setSuppressed?.(true);\r\n }\r\n } else if (event.type === 'complete') {\r\n this.emit('audioPlaybackComplete', event.messageId);\r\n this.notifyAudioPlaybackComplete(event.messageId);\r\n if (this.config.suppressMicDuringPlayback) {\r\n this.voiceManager?.setSuppressed?.(false);\r\n }\r\n }\r\n });\r\n }\r\n\r\n await this.voiceManager.start();\r\n this.emit('voiceStarted');\r\n }\r\n\r\n /** Stop voice input */\r\n async stopVoice(): Promise<void> {\r\n if (this.voiceManager?.isActive) {\r\n await this.voiceManager.stop();\r\n this.voiceManager.dispose();\r\n this.voiceManager = null;\r\n this.emit('voiceStopped');\r\n }\r\n }\r\n\r\n /** Toggle microphone mute */\r\n toggleMute(): void {\r\n if (!this.voiceManager?.isActive) {\r\n throw new EstuaryError(ErrorCode.VOICE_NOT_ACTIVE, 'Voice is not active');\r\n }\r\n this.voiceManager.toggleMute();\r\n }\r\n\r\n /** Whether the microphone is muted */\r\n get isMuted(): boolean {\r\n return this.voiceManager?.isMuted ?? false;\r\n }\r\n\r\n /** Whether voice is currently active */\r\n get isVoiceActive(): boolean {\r\n return this.voiceManager?.isActive ?? false;\r\n }\r\n\r\n // ─── Internal ────────────────────────────────────────────────\r\n\r\n private ensureConnected(): void {\r\n if (!this.socketManager.isConnected) {\r\n throw new EstuaryError(ErrorCode.NOT_CONNECTED, 'Not connected to server. Call connect() first.');\r\n }\r\n }\r\n\r\n private forwardSocketEvents(): void {\r\n // Forward all socket manager events to this client's event emitter\r\n this.socketManager.on('connected', (session) => {\r\n this._sessionInfo = session;\r\n this.emit('connected', session);\r\n });\r\n this.socketManager.on('disconnected', (reason) => {\r\n this._sessionInfo = null;\r\n this.actionParsers.clear();\r\n this.emit('disconnected', reason);\r\n });\r\n this.socketManager.on('reconnecting', (attempt) => this.emit('reconnecting', attempt));\r\n this.socketManager.on('connectionStateChanged', (state) => this.emit('connectionStateChanged', state));\r\n this.socketManager.on('botResponse', (response) => this.handleBotResponse(response));\r\n this.socketManager.on('botVoice', (voice) => this.handleBotVoice(voice));\r\n this.socketManager.on('sttResponse', (response) => {\r\n this.maybeAutoInterrupt(response);\r\n this.emit('sttResponse', response);\r\n });\r\n this.socketManager.on('interrupt', (data) => {\r\n this.audioPlayer?.setInterruptedMessageId(data.messageId ?? null);\r\n this.audioPlayer?.clear();\r\n this.actionParsers.clear();\r\n if (this.config.suppressMicDuringPlayback) {\r\n this.voiceManager?.setSuppressed?.(false);\r\n }\r\n this.emit('interrupt', data);\r\n });\r\n this.socketManager.on('error', (error) => this.emit('error', error));\r\n this.socketManager.on('authError', (error) => this.emit('authError', error));\r\n this.socketManager.on('quotaExceeded', (data) => this.emit('quotaExceeded', data));\r\n this.socketManager.on('cameraCaptureRequest', (request) => this.emit('cameraCaptureRequest', request));\r\n this.socketManager.on('livekitConnected', (room) => this.emit('livekitConnected', room));\r\n this.socketManager.on('livekitDisconnected', () => this.emit('livekitDisconnected'));\r\n this.socketManager.on('memoryUpdated', (event) => this.emit('memoryUpdated', event));\r\n }\r\n\r\n private handleBotResponse(response: BotResponse): void {\r\n const { messageId } = response;\r\n\r\n // Get or create a parser for this message stream\r\n if (!this.actionParsers.has(messageId)) {\r\n this.actionParsers.set(messageId, new StreamingActionParser());\r\n }\r\n const parser = this.actionParsers.get(messageId)!;\r\n\r\n // Parse actions from accumulated text\r\n const { actions, cleanText } = parser.parse(response.text);\r\n\r\n // Emit characterAction events for newly discovered actions\r\n for (const action of actions) {\r\n this.emit('characterAction', {\r\n name: action.name,\r\n params: action.params,\r\n messageId,\r\n });\r\n }\r\n\r\n // Forward botResponse with cleaned text\r\n this.emit('botResponse', {\r\n ...response,\r\n text: cleanText,\r\n });\r\n\r\n // Clean up parser when message is final\r\n if (response.isFinal) {\r\n this.actionParsers.delete(messageId);\r\n }\r\n }\r\n\r\n private handleBotVoice(voice: BotVoice): void {\r\n this.emit('botVoice', voice);\r\n // Enqueue audio for playback if we have an audio player\r\n this.audioPlayer?.enqueue(voice);\r\n }\r\n\r\n private maybeAutoInterrupt(stt: SttResponse): void {\r\n if ((this.config.autoInterruptOnSpeech ?? true) === false) return;\r\n if (this.config.suppressMicDuringPlayback) return;\r\n if (stt.isFinal) return;\r\n if (!this.audioPlayer?.playing) return;\r\n if (this._hasAutoInterrupted) return;\r\n\r\n this._hasAutoInterrupted = true;\r\n this.interrupt();\r\n }\r\n}\r\n","/**\r\n * Parses `<action name=\"...\" .../>` XML tags from bot response text.\r\n *\r\n * Designed for streaming: call `parse()` with the accumulated text on each\r\n * chunk and it returns only newly-discovered actions since the last call.\r\n */\r\n\r\nexport interface ParsedAction {\r\n name: string;\r\n params: Record<string, string>;\r\n}\r\n\r\n// Matches self-closing <action .../> tags (with optional whitespace before />)\r\nconst ACTION_TAG_RE = /<action\\s+([^>]*?)\\/>/gi;\r\n// Matches key=\"value\" or key='value' attribute pairs\r\nconst ATTR_RE = /(\\w+)\\s*=\\s*\"([^\"]*)\"|(\\w+)\\s*=\\s*'([^']*)'/g;\r\n\r\nfunction parseAttributes(attrString: string): Record<string, string> {\r\n const attrs: Record<string, string> = {};\r\n let match: RegExpExecArray | null;\r\n while ((match = ATTR_RE.exec(attrString)) !== null) {\r\n const key = match[1] ?? match[3];\r\n const value = match[2] ?? match[4];\r\n attrs[key] = value;\r\n }\r\n return attrs;\r\n}\r\n\r\nexport class StreamingActionParser {\r\n private emittedCount = 0;\r\n\r\n /**\r\n * Parse the accumulated response text and return any new actions found\r\n * since the last call. Also returns the text with all action tags stripped.\r\n */\r\n parse(accumulatedText: string): { actions: ParsedAction[]; cleanText: string } {\r\n const allActions: ParsedAction[] = [];\r\n let match: RegExpExecArray | null;\r\n\r\n ACTION_TAG_RE.lastIndex = 0;\r\n while ((match = ACTION_TAG_RE.exec(accumulatedText)) !== null) {\r\n const attrs = parseAttributes(match[1]);\r\n const name = attrs.name;\r\n if (name) {\r\n delete attrs.name;\r\n allActions.push({ name, params: attrs });\r\n }\r\n }\r\n\r\n const newActions = allActions.slice(this.emittedCount);\r\n this.emittedCount = allActions.length;\r\n\r\n const cleanText = accumulatedText.replace(ACTION_TAG_RE, '').replace(/\\s{2,}/g, ' ').trimEnd();\r\n\r\n return { actions: newActions, cleanText };\r\n }\r\n\r\n reset(): void {\r\n this.emittedCount = 0;\r\n }\r\n}\r\n\r\n/**\r\n * One-shot parse: extract all actions and return clean text.\r\n * Useful for non-streaming contexts.\r\n */\r\nexport function parseActions(text: string): { actions: ParsedAction[]; cleanText: string } {\r\n const parser = new StreamingActionParser();\r\n return parser.parse(text);\r\n}\r\n","// Main client\r\nexport { EstuaryClient } from './client';\r\n\r\n// Errors\r\nexport { EstuaryError, ErrorCode } from './errors';\r\n\r\n// Types — public interfaces and enums\r\nexport type {\r\n EstuaryConfig,\r\n VoiceTransport,\r\n SessionInfo,\r\n BotResponse,\r\n BotVoice,\r\n SttResponse,\r\n InterruptData,\r\n QuotaExceededData,\r\n LiveKitTokenResponse,\r\n CameraCaptureRequest,\r\n CharacterAction,\r\n EstuaryEventMap,\r\n VoiceManager,\r\n MemoryListOptions,\r\n MemoryTimelineOptions,\r\n MemoryGraphOptions,\r\n MemorySearchOptions,\r\n MemoryListResponse,\r\n MemoryTimelineResponse,\r\n MemoryStatsResponse,\r\n MemoryGraphNode,\r\n MemoryGraphEdge,\r\n MemoryGraphResponse,\r\n MemorySearchResponse,\r\n CoreFact,\r\n CoreFactsResponse,\r\n MemoryData,\r\n MemoryUpdatedEvent,\r\n} from './types';\r\n\r\nexport { ConnectionState } from './types';\r\n\r\n// Action parsing utilities\r\nexport { parseActions } from './utils/action-parser';\r\nexport type { ParsedAction } from './utils/action-parser';\r\n\r\n// Memory client (so users can type `client.memory` properly)\r\nexport type { MemoryClient } from './rest/memory-client';\r\n"]}
1
+ {"version":3,"sources":["../src/errors.ts","../src/audio/audio-utils.ts","../src/voice/websocket-voice.ts","../src/voice/livekit-voice.ts","../src/utils/event-emitter.ts","../src/connection/socket-manager.ts","../src/types.ts","../src/voice/voice-manager.ts","../src/rest/rest-client.ts","../src/rest/memory-client.ts","../src/rest/character-client.ts","../src/audio/audio-player.ts","../src/utils/logger.ts","../src/client.ts","../src/utils/action-parser.ts","../src/index.ts"],"names":["ErrorCode","EstuaryError","ConnectionState","io","WebSocketVoiceManager","LiveKitVoiceManager"],"mappings":"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","file":"index.js","sourcesContent":["export enum ErrorCode {\n CONNECTION_FAILED = 'CONNECTION_FAILED',\n AUTH_FAILED = 'AUTH_FAILED',\n CONNECTION_TIMEOUT = 'CONNECTION_TIMEOUT',\n QUOTA_EXCEEDED = 'QUOTA_EXCEEDED',\n VOICE_NOT_SUPPORTED = 'VOICE_NOT_SUPPORTED',\n VOICE_ALREADY_ACTIVE = 'VOICE_ALREADY_ACTIVE',\n VOICE_NOT_ACTIVE = 'VOICE_NOT_ACTIVE',\n LIVEKIT_UNAVAILABLE = 'LIVEKIT_UNAVAILABLE',\n MICROPHONE_DENIED = 'MICROPHONE_DENIED',\n NOT_CONNECTED = 'NOT_CONNECTED',\n REST_ERROR = 'REST_ERROR',\n UNKNOWN = 'UNKNOWN',\n}\n\nexport class EstuaryError extends Error {\n readonly code: ErrorCode;\n readonly details?: unknown;\n\n constructor(code: ErrorCode, message: string, details?: unknown) {\n super(message);\n this.name = 'EstuaryError';\n this.code = code;\n this.details = details;\n }\n}\n","export function resample(input: Float32Array, fromRate: number, toRate: number): Float32Array {\n const ratio = fromRate / toRate;\n const outputLength = Math.round(input.length / ratio);\n const output = new Float32Array(outputLength);\n for (let i = 0; i < outputLength; i++) {\n const srcIndex = i * ratio;\n const low = Math.floor(srcIndex);\n const high = Math.min(low + 1, input.length - 1);\n const frac = srcIndex - low;\n output[i] = input[low] * (1 - frac) + input[high] * frac;\n }\n return output;\n}\n\nexport function float32ToInt16(float32: Float32Array): Int16Array {\n const int16 = new Int16Array(float32.length);\n for (let i = 0; i < float32.length; i++) {\n const clamped = Math.max(-1, Math.min(1, float32[i]));\n int16[i] = clamped < 0 ? clamped * 0x8000 : clamped * 0x7fff;\n }\n return int16;\n}\n\nexport function uint8ArrayToBase64(bytes: Uint8Array): string {\n if (typeof btoa === 'function') {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n // Node.js fallback\n return Buffer.from(bytes).toString('base64');\n}\n","import type { VoiceManager } from '../types';\nimport type { SocketManager } from '../connection/socket-manager';\nimport type { Logger } from '../utils/logger';\nimport { EstuaryError, ErrorCode } from '../errors';\nimport { resample, float32ToInt16, uint8ArrayToBase64 } from '../audio/audio-utils';\n\nexport class WebSocketVoiceManager implements VoiceManager {\n private socketManager: SocketManager;\n private sampleRate: number;\n private logger: Logger;\n private audioContext: AudioContext | null = null;\n private mediaStream: MediaStream | null = null;\n private scriptProcessor: ScriptProcessorNode | null = null;\n private sourceNode: MediaStreamAudioSourceNode | null = null;\n private zeroGainNode: GainNode | null = null;\n private _isMuted = false;\n private _isSuppressed = false;\n private _isActive = false;\n\n constructor(socketManager: SocketManager, sampleRate: number, logger: Logger) {\n this.socketManager = socketManager;\n this.sampleRate = sampleRate;\n this.logger = logger;\n }\n\n get isMuted(): boolean {\n return this._isMuted;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n async start(): Promise<void> {\n if (this._isActive) {\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\n }\n\n if (typeof AudioContext === 'undefined' && typeof (globalThis as any).webkitAudioContext === 'undefined') {\n throw new EstuaryError(ErrorCode.VOICE_NOT_SUPPORTED, 'AudioContext is not available in this environment');\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: this.sampleRate,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n } catch (err) {\n throw new EstuaryError(\n ErrorCode.MICROPHONE_DENIED,\n 'Microphone access denied',\n err,\n );\n }\n\n this.mediaStream = stream;\n const AudioCtx = globalThis.AudioContext || (globalThis as any).webkitAudioContext;\n this.audioContext = new AudioCtx({ sampleRate: this.sampleRate });\n\n this.sourceNode = this.audioContext.createMediaStreamSource(stream);\n this.scriptProcessor = this.audioContext.createScriptProcessor(4096, 1, 1);\n\n const nativeRate = this.audioContext.sampleRate;\n const targetRate = this.sampleRate;\n\n this.scriptProcessor.onaudioprocess = (event: AudioProcessingEvent) => {\n if (this._isMuted || this._isSuppressed) return;\n\n const inputData = event.inputBuffer.getChannelData(0);\n let pcmFloat: Float32Array;\n\n if (nativeRate !== targetRate) {\n pcmFloat = resample(inputData, nativeRate, targetRate);\n } else {\n pcmFloat = inputData;\n }\n\n const pcm16 = float32ToInt16(pcmFloat);\n const base64 = uint8ArrayToBase64(new Uint8Array(pcm16.buffer));\n\n try {\n this.socketManager.emitEvent('stream_audio', { audio: base64 });\n } catch {\n // Not connected — ignore, will be handled by disconnect logic\n }\n };\n\n this.sourceNode.connect(this.scriptProcessor);\n this.zeroGainNode = this.audioContext.createGain();\n this.zeroGainNode.gain.value = 0;\n this.scriptProcessor.connect(this.zeroGainNode);\n this.zeroGainNode.connect(this.audioContext.destination);\n\n this._isActive = true;\n this.socketManager.emitEvent('start_voice');\n this.logger.debug('WebSocket voice started');\n }\n\n async stop(): Promise<void> {\n if (!this._isActive) return;\n\n try {\n this.socketManager.emitEvent('stop_voice');\n } catch {\n // May not be connected\n }\n\n this.cleanup();\n this._isActive = false;\n this._isMuted = false;\n this._isSuppressed = false;\n this.logger.debug('WebSocket voice stopped');\n }\n\n toggleMute(): void {\n if (!this._isActive || !this.mediaStream) return;\n this._isMuted = !this._isMuted;\n for (const track of this.mediaStream.getAudioTracks()) {\n track.enabled = !this._isMuted;\n }\n this.logger.debug('Mute toggled:', this._isMuted);\n }\n\n setSuppressed(suppressed: boolean): void {\n this._isSuppressed = suppressed;\n this.logger.debug('Audio suppression:', suppressed ? 'on' : 'off');\n }\n\n dispose(): void {\n this.cleanup();\n this._isActive = false;\n this._isMuted = false;\n this._isSuppressed = false;\n }\n\n private cleanup(): void {\n if (this.scriptProcessor) {\n this.scriptProcessor.onaudioprocess = null;\n this.scriptProcessor.disconnect();\n this.scriptProcessor = null;\n }\n if (this.zeroGainNode) {\n this.zeroGainNode.disconnect();\n this.zeroGainNode = null;\n }\n if (this.sourceNode) {\n this.sourceNode.disconnect();\n this.sourceNode = null;\n }\n if (this.mediaStream) {\n for (const track of this.mediaStream.getTracks()) {\n track.stop();\n }\n this.mediaStream = null;\n }\n if (this.audioContext) {\n this.audioContext.close().catch(() => {});\n this.audioContext = null;\n }\n }\n}\n","import type { VoiceManager, LiveKitTokenResponse } from '../types';\nimport type { SocketManager } from '../connection/socket-manager';\nimport type { Logger } from '../utils/logger';\nimport { EstuaryError, ErrorCode } from '../errors';\n\nexport class LiveKitVoiceManager implements VoiceManager {\n private socketManager: SocketManager;\n private logger: Logger;\n private room: any = null; // livekit-client Room (dynamically imported)\n private _isMuted = false;\n private _isActive = false;\n private speakingStateCallback: ((speaking: boolean) => void) | null = null;\n private audioLevelCallback: ((level: number) => void) | null = null;\n\n // Audio analyser (via livekit-client's createAudioAnalyser)\n private calculateVolume: (() => number) | null = null;\n private analyserCleanup: (() => Promise<void>) | null = null;\n private audioLevelPollTimer: ReturnType<typeof setInterval> | null = null;\n private _isBotSpeaking = false;\n\n constructor(socketManager: SocketManager, logger: Logger) {\n this.socketManager = socketManager;\n this.logger = logger;\n }\n\n get isMuted(): boolean {\n return this._isMuted;\n }\n\n get isActive(): boolean {\n return this._isActive;\n }\n\n setSpeakingStateCallback(cb: (speaking: boolean) => void): void {\n this.speakingStateCallback = cb;\n }\n\n setAudioLevelCallback(cb: (level: number) => void): void {\n this.audioLevelCallback = cb;\n }\n\n async start(): Promise<void> {\n if (this._isActive) {\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\n }\n\n let Room: any;\n let RoomEvent: any;\n let Track: any;\n try {\n const lk = await import('livekit-client');\n Room = lk.Room;\n RoomEvent = lk.RoomEvent;\n Track = lk.Track;\n } catch {\n throw new EstuaryError(\n ErrorCode.LIVEKIT_UNAVAILABLE,\n 'livekit-client package is not installed',\n );\n }\n\n // Request token from server\n const tokenData = await this.requestToken();\n\n // Create and configure room\n this.room = new Room({\n adaptiveStream: true,\n dynacast: true,\n audioCaptureDefaults: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n\n // Handle remote audio tracks (bot audio)\n this.room.on(RoomEvent.TrackSubscribed, (\n track: any,\n _publication: any,\n participant: any,\n ) => {\n if (track.kind === Track.Kind.Audio) {\n this.logger.debug('Bot audio track subscribed from', participant.identity);\n const audioElement = track.attach();\n audioElement.autoplay = true;\n audioElement.style.display = 'none';\n if (typeof document !== 'undefined') {\n document.body.appendChild(audioElement);\n }\n audioElement.play().catch(() => {});\n\n // Set up audio analyser for real-time level metering\n this.setupAnalyser(track);\n if (this._isBotSpeaking) {\n // Async setupAnalyser may not have completed yet — retry shortly\n setTimeout(() => this.startAudioLevelPolling(), 50);\n }\n }\n });\n\n this.room.on(RoomEvent.TrackUnsubscribed, (track: any) => {\n if (track.kind === Track.Kind.Audio) {\n this.teardownAnalyser();\n track.detach().forEach((el: HTMLMediaElement) => el.remove());\n }\n });\n\n this.room.on(RoomEvent.Disconnected, () => {\n this.logger.debug('LiveKit room disconnected');\n this._isActive = false;\n this._isBotSpeaking = false;\n this.teardownAnalyser();\n this.speakingStateCallback?.(false);\n });\n\n // Connect to room\n try {\n await this.room.connect(tokenData.url, tokenData.token);\n this.logger.debug('Connected to LiveKit room:', tokenData.room);\n } catch (err) {\n this.room = null;\n const reason = err instanceof Error ? `: ${err.message}` : '';\n throw new EstuaryError(\n ErrorCode.CONNECTION_FAILED,\n `Failed to connect to LiveKit room${reason}`,\n err,\n );\n }\n\n // Listen for participant attribute changes (speaking state from backend)\n this.room.on(RoomEvent.ParticipantAttributesChanged,\n (changedAttributes: Record<string, string>, participant: any) => {\n if (participant === this.room?.localParticipant) return;\n const state = changedAttributes['estuary.state'];\n if (state === 'speaking') {\n this._isBotSpeaking = true;\n this.speakingStateCallback?.(true);\n this.startAudioLevelPolling();\n } else if (state === 'idle') {\n this._isBotSpeaking = false;\n this.stopAudioLevelPolling();\n this.speakingStateCallback?.(false);\n this.audioLevelCallback?.(0);\n }\n }\n );\n\n // Enable microphone\n try {\n await this.room.localParticipant.setMicrophoneEnabled(true);\n this.logger.debug('Microphone enabled');\n } catch (err) {\n this.room.disconnect();\n this.room = null;\n const reason = err instanceof Error ? `: ${err.message}` : '';\n throw new EstuaryError(\n ErrorCode.MICROPHONE_DENIED,\n `Failed to enable microphone${reason}`,\n err,\n );\n }\n\n // Notify backend\n this.socketManager.emitEvent('livekit_join', { room: tokenData.room });\n this._isActive = true;\n this.logger.debug('LiveKit voice started');\n }\n\n async stop(): Promise<void> {\n if (!this._isActive) return;\n\n try {\n this.socketManager.emitEvent('livekit_leave');\n } catch {\n // May not be connected\n }\n\n this._isBotSpeaking = false;\n this.teardownAnalyser();\n\n // Fire final \"stopped\" if bot was considered speaking\n this.speakingStateCallback?.(false);\n\n if (this.room) {\n // Stop local tracks\n for (const [, publication] of this.room.localParticipant.trackPublications) {\n if (publication.track) {\n publication.track.stop();\n }\n }\n this.room.disconnect();\n this.room = null;\n }\n\n this._isActive = false;\n this._isMuted = false;\n this.logger.debug('LiveKit voice stopped');\n }\n\n toggleMute(): void {\n if (!this._isActive || !this.room) return;\n this._isMuted = !this._isMuted;\n this.room.localParticipant.setMicrophoneEnabled(!this._isMuted);\n this.logger.debug('Mute toggled:', this._isMuted);\n }\n\n dispose(): void {\n this.speakingStateCallback = null;\n this.audioLevelCallback = null;\n this._isBotSpeaking = false;\n this.teardownAnalyser();\n\n if (this.room) {\n this.room.disconnect();\n this.room = null;\n }\n this._isActive = false;\n this._isMuted = false;\n }\n\n // ─── Audio Analyser (livekit-client built-in) ───────────────────\n\n private async setupAnalyser(track: any): Promise<void> {\n this.teardownAnalyser();\n try {\n const { createAudioAnalyser } = await import('livekit-client');\n const { analyser, calculateVolume, cleanup } = createAudioAnalyser(track, {\n fftSize: 256,\n smoothingTimeConstant: 0.3,\n });\n // Resume the AudioContext — it may start suspended due to browser autoplay policy.\n // The user has already clicked to start voice, so resume() will succeed.\n if (analyser.context.state === 'suspended') {\n await (analyser.context as AudioContext).resume();\n }\n this.calculateVolume = calculateVolume;\n this.analyserCleanup = cleanup;\n this.logger.debug('Audio analyser created for bot track');\n } catch (err) {\n this.logger.debug('Failed to create audio analyser:', err);\n }\n }\n\n private teardownAnalyser(): void {\n this.stopAudioLevelPolling();\n if (this.analyserCleanup) {\n this.analyserCleanup().catch(() => {});\n this.analyserCleanup = null;\n }\n this.calculateVolume = null;\n }\n\n private startAudioLevelPolling(): void {\n if (this.audioLevelPollTimer !== null) return;\n if (!this.calculateVolume) return;\n\n // ~30fps polling\n this.audioLevelPollTimer = setInterval(() => {\n if (!this.calculateVolume) {\n this.stopAudioLevelPolling();\n return;\n }\n const vol = this.calculateVolume();\n this.audioLevelCallback?.(vol);\n }, 33);\n }\n\n private stopAudioLevelPolling(): void {\n if (this.audioLevelPollTimer !== null) {\n clearInterval(this.audioLevelPollTimer);\n this.audioLevelPollTimer = null;\n }\n }\n\n // ─── Private ────────────────────────────────────────────────────\n\n private requestToken(): Promise<LiveKitTokenResponse> {\n return new Promise<LiveKitTokenResponse>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.socketManager.onLiveKitToken(() => {}); // clear callback\n reject(new EstuaryError(\n ErrorCode.CONNECTION_TIMEOUT,\n 'Timed out waiting for LiveKit token',\n ));\n }, 10000);\n\n this.socketManager.onLiveKitToken((data: LiveKitTokenResponse) => {\n clearTimeout(timeout);\n resolve(data);\n });\n\n this.socketManager.emitEvent('livekit_token');\n });\n }\n}\n","export class TypedEventEmitter<T extends Record<string, unknown>> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private listeners = new Map<keyof T, Set<any>>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private onceListeners = new Map<keyof T, Set<any>>();\n\n on<K extends keyof T>(event: K, listener: T[K]): this {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(listener);\n return this;\n }\n\n off<K extends keyof T>(event: K, listener: T[K]): this {\n this.listeners.get(event)?.delete(listener);\n this.onceListeners.get(event)?.delete(listener);\n return this;\n }\n\n once<K extends keyof T>(event: K, listener: T[K]): this {\n if (!this.onceListeners.has(event)) {\n this.onceListeners.set(event, new Set());\n }\n this.onceListeners.get(event)!.add(listener);\n this.on(event, listener);\n return this;\n }\n\n protected emit<K extends keyof T>(\n event: K,\n ...args: T[K] extends (...a: infer A) => void ? A : never[]\n ): boolean {\n const listeners = this.listeners.get(event);\n if (!listeners || listeners.size === 0) return false;\n\n for (const listener of listeners) {\n try {\n (listener as Function)(...args);\n } catch {\n // Listener threw — swallow to not break other listeners\n }\n }\n\n // Remove once listeners after firing\n const onceSet = this.onceListeners.get(event);\n if (onceSet) {\n for (const listener of onceSet) {\n this.listeners.get(event)?.delete(listener);\n }\n onceSet.clear();\n }\n\n return true;\n }\n\n removeAllListeners<K extends keyof T>(event?: K): this {\n if (event) {\n this.listeners.delete(event);\n this.onceListeners.delete(event);\n } else {\n this.listeners.clear();\n this.onceListeners.clear();\n }\n return this;\n }\n\n listenerCount<K extends keyof T>(event: K): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","import { io, Socket } from 'socket.io-client';\nimport { TypedEventEmitter } from '../utils/event-emitter';\nimport { Logger } from '../utils/logger';\nimport { EstuaryError, ErrorCode } from '../errors';\nimport {\n EstuaryConfig,\n EstuaryEventMap,\n ConnectionState,\n WireSessionInfo,\n WireBotResponse,\n WireBotVoice,\n WireSttResponse,\n WireInterruptData,\n WireQuotaExceededData,\n WireCameraCaptureRequest,\n WireLiveKitTokenResponse,\n WireMemoryUpdated,\n SessionInfo,\n LiveKitTokenResponse,\n toSessionInfo,\n toBotResponse,\n toBotVoice,\n toSttResponse,\n toInterruptData,\n toQuotaExceededData,\n toCameraCaptureRequest,\n toLiveKitTokenResponse,\n toMemoryUpdatedEvent,\n} from '../types';\n\nexport class SocketManager extends TypedEventEmitter<EstuaryEventMap> {\n private socket: Socket | null = null;\n private config: EstuaryConfig;\n private logger: Logger;\n private connectionState: ConnectionState = ConnectionState.Disconnected;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private sessionInfo: SessionInfo | null = null;\n\n constructor(config: EstuaryConfig, logger: Logger) {\n super();\n this.config = config;\n this.logger = logger;\n }\n\n get state(): ConnectionState {\n return this.connectionState;\n }\n\n get session(): SessionInfo | null {\n return this.sessionInfo;\n }\n\n get isConnected(): boolean {\n return this.connectionState === ConnectionState.Connected;\n }\n\n get rawSocket(): Socket | null {\n return this.socket;\n }\n\n connect(): Promise<SessionInfo> {\n return new Promise((resolve, reject) => {\n if (this.socket?.connected) {\n if (this.sessionInfo) {\n resolve(this.sessionInfo);\n return;\n }\n }\n\n this.setConnectionState(ConnectionState.Connecting);\n this.reconnectAttempt = 0;\n\n const url = `${this.config.serverUrl}/sdk`;\n this.logger.debug('Connecting to', url);\n\n this.socket = io(url, {\n transports: ['websocket'],\n timeout: 10000,\n reconnection: false, // We handle reconnection ourselves\n path: '/socket.io/',\n });\n\n let settled = false;\n\n const onConnect = () => {\n this.logger.debug('Socket connected, authenticating...');\n this.socket!.emit('authenticate', {\n api_key: this.config.apiKey,\n character_id: this.config.characterId,\n player_id: this.config.playerId,\n audio_sample_rate: this.config.audioSampleRate ?? 16000,\n realtime_memory: this.config.realtimeMemory ?? false,\n });\n };\n\n const onSessionInfo = (data: WireSessionInfo) => {\n this.sessionInfo = toSessionInfo(data);\n this.setConnectionState(ConnectionState.Connected);\n this.reconnectAttempt = 0;\n this.logger.info('Connected, session:', this.sessionInfo.sessionId);\n this.emit('connected', this.sessionInfo);\n if (!settled) {\n settled = true;\n resolve(this.sessionInfo);\n }\n };\n\n const onAuthError = (data: { error: string }) => {\n this.logger.error('Auth error:', data.error);\n this.setConnectionState(ConnectionState.Error);\n this.emit('authError', data.error);\n if (!settled) {\n settled = true;\n reject(new EstuaryError(ErrorCode.AUTH_FAILED, data.error));\n }\n };\n\n const onConnectError = (err: Error) => {\n this.logger.error('Connection error:', err.message);\n if (!settled) {\n settled = true;\n this.setConnectionState(ConnectionState.Error);\n reject(new EstuaryError(ErrorCode.CONNECTION_FAILED, err.message));\n } else {\n this.handleDisconnect('connect_error');\n }\n };\n\n const onDisconnect = (reason: string) => {\n this.logger.info('Disconnected:', reason);\n this.sessionInfo = null;\n if (!settled) {\n settled = true;\n this.setConnectionState(ConnectionState.Disconnected);\n reject(new EstuaryError(ErrorCode.CONNECTION_FAILED, `Disconnected: ${reason}`));\n } else {\n this.handleDisconnect(reason);\n }\n };\n\n this.socket.on('connect', onConnect);\n this.socket.on('session_info', onSessionInfo);\n this.socket.on('auth_error', onAuthError);\n this.socket.on('connect_error', onConnectError);\n this.socket.on('disconnect', onDisconnect);\n\n // Wire up all server → client events\n this.bindServerEvents();\n });\n }\n\n disconnect(): void {\n this.clearReconnectTimer();\n this.sessionInfo = null;\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket.disconnect();\n this.socket = null;\n }\n this.setConnectionState(ConnectionState.Disconnected);\n this.emit('disconnected', 'manual');\n }\n\n emitEvent(event: string, data?: unknown): void {\n if (!this.socket?.connected) {\n throw new EstuaryError(ErrorCode.NOT_CONNECTED, 'Not connected to server');\n }\n this.socket.emit(event, data);\n }\n\n private bindServerEvents(): void {\n if (!this.socket) return;\n\n this.socket.on('bot_response', (data: WireBotResponse) => {\n this.emit('botResponse', toBotResponse(data));\n });\n\n this.socket.on('bot_voice', (data: WireBotVoice) => {\n this.emit('botVoice', toBotVoice(data));\n });\n\n this.socket.on('stt_response', (data: WireSttResponse) => {\n this.emit('sttResponse', toSttResponse(data));\n });\n\n this.socket.on('interrupt', (data: WireInterruptData) => {\n this.emit('interrupt', toInterruptData(data));\n });\n\n this.socket.on('quota_exceeded', (data: WireQuotaExceededData) => {\n this.emit('quotaExceeded', toQuotaExceededData(data));\n });\n\n this.socket.on('camera_capture', (data: WireCameraCaptureRequest) => {\n this.emit('cameraCaptureRequest', toCameraCaptureRequest(data));\n });\n\n this.socket.on('error', (data: { message: string }) => {\n this.emit('error', new EstuaryError(ErrorCode.UNKNOWN, data.message));\n });\n\n this.socket.on('livekit_token', (data: WireLiveKitTokenResponse) => {\n // This is handled by LiveKitVoiceManager via a separate listener\n // We store it here so the voice manager can access it\n (this as unknown as { _livekitTokenCallback?: (d: LiveKitTokenResponse) => void })\n ._livekitTokenCallback?.(toLiveKitTokenResponse(data));\n });\n\n this.socket.on('livekit_ready', (data: { room: string }) => {\n this.emit('livekitConnected', data.room);\n });\n\n this.socket.on('memory_updated', (data: WireMemoryUpdated) => {\n this.emit('memoryUpdated', toMemoryUpdatedEvent(data));\n });\n }\n\n /** Register a callback for livekit_token events (used by LiveKitVoiceManager) */\n onLiveKitToken(callback: (data: LiveKitTokenResponse) => void): void {\n (this as unknown as { _livekitTokenCallback?: (d: LiveKitTokenResponse) => void })\n ._livekitTokenCallback = callback;\n }\n\n private handleDisconnect(reason: string): void {\n this.sessionInfo = null;\n this.setConnectionState(ConnectionState.Disconnected);\n this.emit('disconnected', reason);\n\n const autoReconnect = this.config.autoReconnect ?? true;\n const maxAttempts = this.config.maxReconnectAttempts ?? 5;\n\n if (autoReconnect && this.reconnectAttempt < maxAttempts) {\n this.attemptReconnect();\n }\n }\n\n private attemptReconnect(): void {\n const maxAttempts = this.config.maxReconnectAttempts ?? 5;\n const delay = this.config.reconnectDelayMs ?? 2000;\n\n if (this.reconnectAttempt >= maxAttempts) {\n this.logger.warn('Max reconnect attempts reached');\n this.setConnectionState(ConnectionState.Error);\n this.emit('error', new EstuaryError(\n ErrorCode.CONNECTION_FAILED,\n `Failed to reconnect after ${maxAttempts} attempts`,\n ));\n return;\n }\n\n this.reconnectAttempt++;\n this.setConnectionState(ConnectionState.Reconnecting);\n this.emit('reconnecting', this.reconnectAttempt);\n this.logger.info(`Reconnecting (attempt ${this.reconnectAttempt}/${maxAttempts})...`);\n\n this.clearReconnectTimer();\n this.reconnectTimer = setTimeout(() => {\n this.connect().catch((err) => {\n this.logger.error('Reconnect failed:', err.message);\n // Will trigger another attempt via handleDisconnect\n });\n }, delay * this.reconnectAttempt); // Linear backoff: delay * attempt\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private setConnectionState(state: ConnectionState): void {\n if (this.connectionState !== state) {\n this.connectionState = state;\n this.emit('connectionStateChanged', state);\n }\n }\n}\n","// ─── Configuration ───────────────────────────────────────────────\n\nexport interface EstuaryConfig {\n /** Base URL of the Estuary server (e.g., \"https://api.estuary-ai.com\") */\n serverUrl: string;\n /** API key (starts with \"est_\") */\n apiKey: string;\n /** Character (agent) ID */\n characterId: string;\n /** Unique identifier for the end user */\n playerId: string;\n /** Audio sample rate in Hz (default: 16000) */\n audioSampleRate?: number;\n /** Auto-reconnect on disconnect (default: true) */\n autoReconnect?: boolean;\n /** Max reconnect attempts (default: 5) */\n maxReconnectAttempts?: number;\n /** Base delay between reconnect attempts in ms (default: 2000). Actual delay is baseDelay × attemptNumber (linear backoff). */\n reconnectDelayMs?: number;\n /** Enable debug logging (default: false) */\n debug?: boolean;\n /** Voice transport: 'websocket' | 'livekit' | 'auto' (default: 'auto') */\n voiceTransport?: VoiceTransport;\n /** Enable real-time memory extraction after each response (default: false) */\n realtimeMemory?: boolean;\n /** Suppress mic during TTS playback (software AEC fallback, disables barge-in). Default: false */\n suppressMicDuringPlayback?: boolean;\n /** Proactively interrupt bot audio when user starts speaking (default: true) */\n autoInterruptOnSpeech?: boolean;\n}\n\nexport type VoiceTransport = 'websocket' | 'livekit' | 'auto';\n\n// ─── Connection State ────────────────────────────────────────────\n\nexport enum ConnectionState {\n Disconnected = 'disconnected',\n Connecting = 'connecting',\n Connected = 'connected',\n Reconnecting = 'reconnecting',\n Error = 'error',\n}\n\n// ─── Wire Format Types (snake_case from server) ─────────────────\n\n/** @internal */\nexport interface WireSessionInfo {\n session_id: string;\n conversation_id: string;\n character_id: string;\n player_id: string;\n}\n\n/** @internal */\nexport interface WireBotResponse {\n text: string;\n is_final: boolean;\n partial: string;\n message_id: string;\n chunk_index: number;\n is_interjection: boolean;\n token_stream?: boolean;\n}\n\n/** @internal */\nexport interface WireBotVoice {\n audio: string;\n message_id: string;\n chunk_index: number;\n is_final: boolean;\n}\n\n/** @internal */\nexport interface WireSttResponse {\n text: string;\n is_final: boolean;\n}\n\n/** @internal */\nexport interface WireInterruptData {\n message_id?: string;\n reason?: string;\n interrupted_at?: string;\n}\n\n/** @internal */\nexport interface WireQuotaExceededData {\n message: string;\n current: number;\n limit: number;\n remaining: number;\n tier: string;\n}\n\n/** @internal */\nexport interface WireLiveKitTokenResponse {\n token: string;\n url: string;\n room: string;\n}\n\n/** @internal */\nexport interface WireCameraCaptureRequest {\n request_id: string;\n text?: string;\n}\n\n/** @internal — new_memories items are already camelCase from Memory.to_dict() */\nexport interface WireMemoryUpdated {\n agent_id: string;\n player_id: string;\n memories_extracted: number;\n facts_extracted: number;\n conversation_id: string;\n new_memories: MemoryData[];\n timestamp: string;\n}\n\n// ─── Public Types (camelCase) ────────────────────────────────────\n\nexport interface SessionInfo {\n sessionId: string;\n conversationId: string;\n characterId: string;\n playerId: string;\n}\n\nexport interface BotResponse {\n text: string;\n isFinal: boolean;\n partial: string;\n messageId: string;\n chunkIndex: number;\n isInterjection: boolean;\n tokenStream?: boolean;\n}\n\nexport interface BotVoice {\n audio: string;\n messageId: string;\n chunkIndex: number;\n isFinal: boolean;\n}\n\nexport interface SttResponse {\n text: string;\n isFinal: boolean;\n}\n\nexport interface InterruptData {\n messageId?: string;\n reason?: string;\n interruptedAt?: string;\n}\n\nexport interface QuotaExceededData {\n message: string;\n current: number;\n limit: number;\n remaining: number;\n tier: string;\n}\n\nexport interface LiveKitTokenResponse {\n token: string;\n url: string;\n room: string;\n}\n\nexport interface CameraCaptureRequest {\n requestId: string;\n text?: string;\n}\n\nexport interface MemoryData {\n id: string;\n userId: string;\n agentId: string;\n playerId: string;\n content: string;\n memoryType: string;\n confidence: number;\n status: string;\n sourceConversationId: string;\n sourceQuote?: string;\n source?: string;\n topic?: string;\n secondaryTopics?: string[];\n lastAccessedAt?: string | null;\n accessCount?: number;\n extractedAt?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface MemoryUpdatedEvent {\n agentId: string;\n playerId: string;\n memoriesExtracted: number;\n factsExtracted: number;\n conversationId: string;\n newMemories: MemoryData[];\n timestamp: string;\n}\n\n// ─── Wire → Public Converters ────────────────────────────────────\n\n/** @internal */\nexport function toSessionInfo(wire: WireSessionInfo): SessionInfo {\n return {\n sessionId: wire.session_id,\n conversationId: wire.conversation_id,\n characterId: wire.character_id,\n playerId: wire.player_id,\n };\n}\n\n/** @internal */\nexport function toBotResponse(wire: WireBotResponse): BotResponse {\n return {\n text: wire.text,\n isFinal: wire.is_final,\n partial: wire.partial,\n messageId: wire.message_id,\n chunkIndex: wire.chunk_index,\n isInterjection: wire.is_interjection,\n tokenStream: wire.token_stream,\n };\n}\n\n/** @internal */\nexport function toBotVoice(wire: WireBotVoice): BotVoice {\n return {\n audio: wire.audio,\n messageId: wire.message_id,\n chunkIndex: wire.chunk_index,\n isFinal: wire.is_final,\n };\n}\n\n/** @internal */\nexport function toSttResponse(wire: WireSttResponse): SttResponse {\n return {\n text: wire.text,\n isFinal: wire.is_final,\n };\n}\n\n/** @internal */\nexport function toInterruptData(wire: WireInterruptData): InterruptData {\n return {\n messageId: wire.message_id,\n reason: wire.reason,\n interruptedAt: wire.interrupted_at,\n };\n}\n\n/** @internal */\nexport function toQuotaExceededData(wire: WireQuotaExceededData): QuotaExceededData {\n return {\n message: wire.message,\n current: wire.current,\n limit: wire.limit,\n remaining: wire.remaining,\n tier: wire.tier,\n };\n}\n\n/** @internal */\nexport function toLiveKitTokenResponse(wire: WireLiveKitTokenResponse): LiveKitTokenResponse {\n return {\n token: wire.token,\n url: wire.url,\n room: wire.room,\n };\n}\n\n/** @internal */\nexport function toCameraCaptureRequest(wire: WireCameraCaptureRequest): CameraCaptureRequest {\n return {\n requestId: wire.request_id,\n text: wire.text,\n };\n}\n\n/** @internal */\nexport function toMemoryUpdatedEvent(wire: WireMemoryUpdated): MemoryUpdatedEvent {\n return {\n agentId: wire.agent_id,\n playerId: wire.player_id,\n memoriesExtracted: wire.memories_extracted,\n factsExtracted: wire.facts_extracted,\n conversationId: wire.conversation_id,\n newMemories: wire.new_memories ?? [],\n timestamp: wire.timestamp,\n };\n}\n\n// ─── Character Info ──────────────────────────────────────────────\n\nexport interface CharacterInfo {\n id: string;\n name: string;\n tagline: string | null;\n avatar: string | null;\n modelUrl: string | null;\n modelPreviewUrl: string | null;\n modelStatus: string | null;\n sourceImageUrl: string | null;\n}\n\n// ─── Character Actions ───────────────────────────────────────────\n\nexport interface CharacterAction {\n /** Action name (e.g., \"follow_user\", \"sit\", \"look_at\") */\n name: string;\n /** Action parameters as key-value pairs */\n params: Record<string, string>;\n /** Message ID of the bot response that contained this action */\n messageId: string;\n}\n\n// ─── Event Map ───────────────────────────────────────────────────\n\nexport type EstuaryEventMap = {\n connected: (session: SessionInfo) => void;\n disconnected: (reason: string) => void;\n reconnecting: (attempt: number) => void;\n connectionStateChanged: (state: ConnectionState) => void;\n botResponse: (response: BotResponse) => void;\n botVoice: (voice: BotVoice) => void;\n sttResponse: (response: SttResponse) => void;\n interrupt: (data: InterruptData) => void;\n error: (error: Error) => void;\n authError: (error: string) => void;\n quotaExceeded: (data: QuotaExceededData) => void;\n cameraCaptureRequest: (request: CameraCaptureRequest) => void;\n characterAction: (action: CharacterAction) => void;\n voiceStarted: () => void;\n voiceStopped: () => void;\n livekitConnected: (room: string) => void;\n livekitDisconnected: () => void;\n audioPlaybackStarted: (messageId: string) => void;\n audioPlaybackComplete: (messageId: string) => void;\n /** Bot audio level 0.0–1.0, emitted during playback for both transports. */\n botAudioLevel: (level: number) => void;\n memoryUpdated: (event: MemoryUpdatedEvent) => void;\n}\n\n// ─── Voice Manager Interface ─────────────────────────────────────\n\nexport interface VoiceManager {\n start(): Promise<void>;\n stop(): Promise<void>;\n toggleMute(): void;\n /** Suppress audio sending (software AEC). No-op if not supported. */\n setSuppressed?(suppressed: boolean): void;\n /** Set callback for speaking state from participant attributes (LiveKit only). */\n setSpeakingStateCallback?(cb: (speaking: boolean) => void): void;\n /** Set callback for audio level updates (0-1) during bot speech. */\n setAudioLevelCallback?(cb: (level: number) => void): void;\n readonly isMuted: boolean;\n readonly isActive: boolean;\n dispose(): void;\n}\n\n// ─── Memory Types ────────────────────────────────────────────────\n\nexport interface MemoryListOptions {\n memoryType?: string;\n status?: string;\n limit?: number;\n offset?: number;\n sortBy?: 'created_at' | 'confidence' | 'last_accessed_at';\n sortOrder?: 'asc' | 'desc';\n}\n\nexport interface MemoryTimelineOptions {\n startDate?: string;\n endDate?: string;\n groupBy?: 'day' | 'week' | 'month';\n}\n\nexport interface MemoryGraphOptions {\n includeEntities?: boolean;\n includeCharacterMemories?: boolean;\n}\n\nexport interface MemorySearchOptions {\n query: string;\n limit?: number;\n}\n\nexport interface MemoryListResponse {\n memories: MemoryData[];\n total: number;\n limit: number;\n offset: number;\n}\n\nexport interface MemoryTimelineResponse {\n timeline: { date: string; memories: MemoryData[] }[];\n totalMemories: number;\n groupBy: string;\n}\n\nexport interface MemoryStatsResponse {\n totalActive: number;\n totalSuperseded: number;\n totalDecayed: number;\n byType: Record<string, number>;\n coreFacts: number;\n}\n\nexport interface MemoryGraphNode {\n id: string;\n type: 'user' | 'cluster' | 'memory' | 'entity';\n label?: string;\n /** Cluster fields */\n level?: number;\n memoryCount?: number;\n typeDistribution?: Record<string, number>;\n expanded?: boolean;\n parentClusterId?: string | null;\n childClusterIds?: string[];\n labelPending?: boolean;\n /** Memory fields */\n memoryType?: string;\n content?: string;\n confidence?: number;\n clusterId?: string;\n sourceQuote?: string | null;\n sourceConversationId?: string | null;\n createdAt?: string | null;\n accessCount?: number;\n /** Entity fields */\n entityType?: string | null;\n name?: string;\n mentionCount?: number;\n extraData?: Record<string, string>;\n}\n\nexport interface MemoryGraphEdge {\n source: string;\n target: string;\n type: 'has_cluster' | 'contains' | 'mentions' | 'relationship';\n relationshipType?: string;\n label?: string | null;\n confidence?: number;\n}\n\nexport interface MemoryGraphResponse {\n nodes: MemoryGraphNode[];\n edges: MemoryGraphEdge[];\n stats: {\n totalMemories: number;\n totalEntities: number;\n clusterCount: number;\n clusters: Record<string, number>;\n };\n stale?: boolean;\n}\n\nexport interface MemorySearchResponse {\n results: { memory: MemoryData; score: number; similarityScore: number }[];\n query: string;\n total: number;\n}\n\nexport interface CoreFact {\n id: string;\n userId: string;\n agentId: string;\n playerId: string;\n factKey: string;\n factValue: string;\n sourceMemoryId?: string | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface CoreFactsResponse {\n coreFacts: CoreFact[];\n}\n","import type { VoiceManager, VoiceTransport } from '../types';\nimport type { SocketManager } from '../connection/socket-manager';\nimport type { Logger } from '../utils/logger';\n\nexport type { VoiceManager };\n\nasync function isLiveKitAvailable(): Promise<boolean> {\n try {\n await import('livekit-client');\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function createVoiceManager(\n transport: VoiceTransport,\n socketManager: SocketManager,\n sampleRate: number,\n logger: Logger,\n): Promise<VoiceManager | null> {\n if (transport === 'websocket') {\n const { WebSocketVoiceManager } = await import('./websocket-voice');\n return new WebSocketVoiceManager(socketManager, sampleRate, logger);\n }\n\n if (transport === 'livekit') {\n if (await isLiveKitAvailable()) {\n const { LiveKitVoiceManager } = await import('./livekit-voice');\n return new LiveKitVoiceManager(socketManager, logger);\n }\n logger.warn('livekit-client not installed, falling back to WebSocket voice');\n const { WebSocketVoiceManager } = await import('./websocket-voice');\n return new WebSocketVoiceManager(socketManager, sampleRate, logger);\n }\n\n // auto: prefer LiveKit if available, else WebSocket\n if (transport === 'auto') {\n if (await isLiveKitAvailable()) {\n const { LiveKitVoiceManager } = await import('./livekit-voice');\n return new LiveKitVoiceManager(socketManager, logger);\n }\n const { WebSocketVoiceManager } = await import('./websocket-voice');\n return new WebSocketVoiceManager(socketManager, sampleRate, logger);\n }\n\n return null;\n}\n","import { EstuaryError, ErrorCode } from '../errors';\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport class RestClient {\n private baseUrl: string;\n private apiKey: string;\n private timeoutMs: number;\n\n constructor(baseUrl: string, apiKey: string, timeoutMs: number = DEFAULT_TIMEOUT_MS) {\n this.baseUrl = baseUrl.replace(/\\/+$/, '');\n this.apiKey = apiKey;\n this.timeoutMs = timeoutMs;\n }\n\n async get<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n const url = this.buildUrl(path, params);\n return this.request<T>(url, { method: 'GET' });\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n const url = this.buildUrl(path);\n const init: RequestInit = { method: 'POST' };\n if (body !== undefined) {\n init.headers = { 'Content-Type': 'application/json' };\n init.body = JSON.stringify(body);\n }\n return this.request<T>(url, init);\n }\n\n async delete<T>(path: string, params?: Record<string, string | number | boolean | undefined>): Promise<T> {\n const url = this.buildUrl(path, params);\n return this.request<T>(url, { method: 'DELETE' });\n }\n\n dispose(): void {\n // No persistent resources to clean up\n }\n\n private buildUrl(path: string, params?: Record<string, string | number | boolean | undefined>): string {\n const url = new URL(path, this.baseUrl);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n }\n\n private async request<T>(url: string, init: RequestInit): Promise<T> {\n const headers = new Headers(init.headers);\n headers.set('X-API-Key', this.apiKey);\n\n const response = await fetch(url, {\n ...init,\n headers,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n\n if (!response.ok) {\n let detail: unknown;\n try {\n detail = await response.json();\n } catch {\n detail = await response.text().catch(() => null);\n }\n throw new EstuaryError(\n ErrorCode.REST_ERROR,\n `HTTP ${response.status}: ${response.statusText}`,\n detail,\n );\n }\n\n return response.json() as Promise<T>;\n }\n}\n","import type {\n MemoryListOptions,\n MemoryListResponse,\n MemoryTimelineOptions,\n MemoryTimelineResponse,\n MemoryStatsResponse,\n CoreFactsResponse,\n MemoryGraphOptions,\n MemoryGraphResponse,\n MemorySearchResponse,\n} from '../types';\nimport type { RestClient } from './rest-client';\n\nexport class MemoryClient {\n private rest: RestClient;\n private basePath: string;\n\n constructor(rest: RestClient, agentId: string, playerId: string) {\n this.rest = rest;\n this.basePath = `/api/agents/${agentId}/players/${playerId}/memories`;\n }\n\n async getMemories(options?: MemoryListOptions): Promise<MemoryListResponse> {\n return this.rest.get<MemoryListResponse>(this.basePath, options as Record<string, string | number | boolean | undefined>);\n }\n\n async getTimeline(options?: MemoryTimelineOptions): Promise<MemoryTimelineResponse> {\n return this.rest.get<MemoryTimelineResponse>(`${this.basePath}/timeline`, options as Record<string, string | number | boolean | undefined>);\n }\n\n async getStats(): Promise<MemoryStatsResponse> {\n return this.rest.get<MemoryStatsResponse>(`${this.basePath}/stats`);\n }\n\n async getCoreFacts(): Promise<CoreFactsResponse> {\n return this.rest.get<CoreFactsResponse>(`${this.basePath}/core-facts`);\n }\n\n async getGraph(options?: MemoryGraphOptions): Promise<MemoryGraphResponse> {\n const params: Record<string, string | number | boolean | undefined> = {};\n if (options) {\n if (options.includeEntities !== undefined) params.include_entities = options.includeEntities;\n if (options.includeCharacterMemories !== undefined) params.include_character_memories = options.includeCharacterMemories;\n }\n return this.rest.get<MemoryGraphResponse>(`${this.basePath}/graph`, params);\n }\n\n async search(query: string, limit?: number): Promise<MemorySearchResponse> {\n return this.rest.get<MemorySearchResponse>(`${this.basePath}/search`, { q: query, limit });\n }\n\n async deleteAll(confirm: boolean): Promise<{ message: string; deletedCount: number }> {\n return this.rest.delete<{ message: string; deletedCount: number }>(this.basePath, { confirm });\n }\n\n dispose(): void {\n // No persistent resources to clean up\n }\n}\n","import type { CharacterInfo } from '../types';\nimport type { RestClient } from './rest-client';\n\nexport class CharacterClient {\n private rest: RestClient;\n\n constructor(rest: RestClient) {\n this.rest = rest;\n }\n\n /** Fetch character details including 3D model and avatar URLs. */\n async getCharacter(characterId: string): Promise<CharacterInfo> {\n const raw = await this.rest.get<Record<string, unknown>>(`/api/agents/${characterId}`);\n return {\n id: raw.id as string,\n name: raw.name as string,\n tagline: (raw.tagline as string) ?? null,\n avatar: (raw.avatar as string) ?? null,\n modelUrl: (raw.modelUrl as string) ?? null,\n modelPreviewUrl: (raw.modelPreviewUrl as string) ?? null,\n modelStatus: (raw.modelStatus as string) ?? null,\n sourceImageUrl: (raw.sourceImageUrl as string) ?? null,\n };\n }\n\n dispose(): void {\n // No persistent resources to clean up\n }\n}\n","import type { BotVoice } from '../types';\n\nexport type AudioPlaybackEvent =\n | { type: 'started'; messageId: string }\n | { type: 'complete'; messageId: string };\n\nexport class AudioPlayer {\n private sampleRate: number;\n private onEvent: (event: AudioPlaybackEvent) => void;\n private audioContext: AudioContext | null = null;\n private mediaStreamDest: MediaStreamAudioDestinationNode | null = null;\n private audioElement: HTMLAudioElement | null = null;\n private queue: { buffer: AudioBuffer; messageId: string }[] = [];\n private currentSource: AudioBufferSourceNode | null = null;\n private currentMessageId: string | null = null;\n private isPlaying = false;\n private _isCleared = false;\n private _interruptedMessageId: string | null = null;\n\n constructor(sampleRate: number, onEvent: (event: AudioPlaybackEvent) => void) {\n this.sampleRate = sampleRate;\n this.onEvent = onEvent;\n }\n\n /** Whether audio is currently playing */\n get playing(): boolean {\n return this.isPlaying;\n }\n\n /** The messageId of the currently playing audio, or null */\n get playingMessageId(): string | null {\n return this.currentMessageId;\n }\n\n /** Mark a messageId as interrupted so late-arriving chunks are dropped */\n setInterruptedMessageId(id: string | null): void {\n this._interruptedMessageId = id;\n }\n\n enqueue(voice: BotVoice): void {\n // Drop chunks belonging to the interrupted message\n if (voice.messageId === this._interruptedMessageId) return;\n // Clear the filter once a new message arrives\n if (this._interruptedMessageId && voice.messageId !== this._interruptedMessageId) {\n this._interruptedMessageId = null;\n }\n\n this._isCleared = false;\n\n const ctx = this.getAudioContext();\n if (!ctx) return;\n\n const pcm16 = base64ToInt16Array(voice.audio);\n const float32 = int16ToFloat32(pcm16);\n\n const buffer = ctx.createBuffer(1, float32.length, this.sampleRate);\n buffer.getChannelData(0).set(float32);\n\n this.queue.push({ buffer, messageId: voice.messageId });\n\n if (!this.isPlaying) {\n this.playNext();\n }\n }\n\n clear(): void {\n this._isCleared = true;\n this.queue.length = 0;\n if (this.currentSource) {\n try {\n this.currentSource.onended = null;\n this.currentSource.stop();\n this.currentSource.disconnect();\n } catch {\n // Already stopped\n }\n this.currentSource = null;\n }\n // Push silence through mediaStreamDest to flush the <audio> element's\n // internal pipeline buffer. Without this, mobile browsers replay the last\n // buffered frames. We can't touch the <audio> element directly (pause or\n // srcObject reassignment revokes the autoplay privilege on mobile).\n if (this.audioContext && this.mediaStreamDest) {\n const silence = this.audioContext.createBuffer(\n 1,\n this.sampleRate * 0.25,\n this.sampleRate,\n );\n const src = this.audioContext.createBufferSource();\n src.buffer = silence;\n src.connect(this.mediaStreamDest);\n src.start();\n }\n this.isPlaying = false;\n this.currentMessageId = null;\n }\n\n dispose(): void {\n this.clear();\n if (this.audioElement) {\n this.audioElement.pause();\n this.audioElement.srcObject = null;\n this.audioElement.remove();\n this.audioElement = null;\n }\n if (this.mediaStreamDest) {\n this.mediaStreamDest.disconnect();\n this.mediaStreamDest = null;\n }\n if (this.audioContext) {\n this.audioContext.close().catch(() => {});\n this.audioContext = null;\n }\n }\n\n private getAudioContext(): AudioContext | null {\n if (this.audioContext) return this.audioContext;\n\n if (typeof AudioContext === 'undefined' && typeof (globalThis as any).webkitAudioContext === 'undefined') {\n return null;\n }\n\n const AudioCtx = globalThis.AudioContext || (globalThis as any).webkitAudioContext;\n const ctx = new AudioCtx({ sampleRate: this.sampleRate });\n this.audioContext = ctx;\n\n // Route through a MediaStreamDestination → hidden <audio> element so the\n // browser's AEC pipeline can see our playback as the echo reference signal.\n if (typeof document !== 'undefined') {\n this.mediaStreamDest = ctx.createMediaStreamDestination();\n const el = document.createElement('audio');\n el.srcObject = this.mediaStreamDest.stream;\n el.autoplay = true;\n // Hidden but in the DOM so the browser treats it as a real media element\n el.style.display = 'none';\n document.body.appendChild(el);\n el.play().catch(() => {});\n this.audioElement = el;\n }\n\n return ctx;\n }\n\n private playNext(): void {\n if (this._isCleared) return;\n\n const ctx = this.getAudioContext();\n if (!ctx || this.queue.length === 0) {\n if (this.isPlaying && this.currentMessageId) {\n this.onEvent({ type: 'complete', messageId: this.currentMessageId });\n }\n this.isPlaying = false;\n this.currentMessageId = null;\n return;\n }\n\n const { buffer, messageId } = this.queue.shift()!;\n\n // Emit started if this is a new message\n if (messageId !== this.currentMessageId) {\n if (this.currentMessageId) {\n this.onEvent({ type: 'complete', messageId: this.currentMessageId });\n }\n this.currentMessageId = messageId;\n this.onEvent({ type: 'started', messageId });\n }\n\n this.isPlaying = true;\n const source = ctx.createBufferSource();\n source.buffer = buffer;\n source.connect(this.mediaStreamDest ?? ctx.destination);\n this.currentSource = source;\n\n source.onended = () => {\n if (this._isCleared) return;\n this.currentSource = null;\n this.playNext();\n };\n\n if (this.audioElement) {\n this.audioElement.play().catch(() => {});\n }\n ctx.resume().catch(() => {});\n source.start();\n }\n}\n\nfunction base64ToInt16Array(base64: string): Int16Array {\n let bytes: Uint8Array;\n if (typeof atob === 'function') {\n const binary = atob(base64);\n bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n } else {\n // Node.js fallback\n bytes = new Uint8Array(Buffer.from(base64, 'base64'));\n }\n return new Int16Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 2);\n}\n\nfunction int16ToFloat32(int16: Int16Array): Float32Array {\n const float32 = new Float32Array(int16.length);\n for (let i = 0; i < int16.length; i++) {\n float32[i] = int16[i] / (int16[i] < 0 ? 0x8000 : 0x7fff);\n }\n return float32;\n}\n","export class Logger {\n private enabled: boolean;\n\n constructor(debug = false) {\n this.enabled = debug;\n }\n\n setDebug(enabled: boolean): void {\n this.enabled = enabled;\n }\n\n debug(...args: unknown[]): void {\n if (this.enabled) console.debug('[Estuary]', ...args);\n }\n\n info(...args: unknown[]): void {\n if (this.enabled) console.info('[Estuary]', ...args);\n }\n\n warn(...args: unknown[]): void {\n console.warn('[Estuary]', ...args);\n }\n\n error(...args: unknown[]): void {\n console.error('[Estuary]', ...args);\n }\n}\n","import { SocketManager } from './connection/socket-manager';\nimport { createVoiceManager } from './voice/voice-manager';\nimport { RestClient } from './rest/rest-client';\nimport { MemoryClient } from './rest/memory-client';\nimport { CharacterClient } from './rest/character-client';\nimport { AudioPlayer } from './audio/audio-player';\nimport { TypedEventEmitter } from './utils/event-emitter';\nimport { Logger } from './utils/logger';\nimport { EstuaryError, ErrorCode } from './errors';\nimport {\n EstuaryConfig,\n EstuaryEventMap,\n ConnectionState,\n SessionInfo,\n CharacterInfo,\n BotResponse,\n BotVoice,\n SttResponse,\n VoiceManager,\n} from './types';\nimport { StreamingActionParser } from './utils/action-parser';\n\nconst DEFAULT_SAMPLE_RATE = 16000;\n\nexport class EstuaryClient extends TypedEventEmitter<EstuaryEventMap> {\n private config: EstuaryConfig;\n private logger: Logger;\n private socketManager: SocketManager;\n private voiceManager: VoiceManager | null = null;\n private audioPlayer: AudioPlayer | null = null;\n private _memory: MemoryClient;\n private _character: CharacterClient;\n private _sessionInfo: SessionInfo | null = null;\n private actionParsers = new Map<string, StreamingActionParser>();\n private _hasAutoInterrupted = false;\n private _autoInterruptGraceTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(config: EstuaryConfig) {\n super();\n this.config = config;\n this.logger = new Logger(config.debug ?? false);\n this.socketManager = new SocketManager(config, this.logger);\n this.forwardSocketEvents();\n\n // Set up REST clients\n const restClient = new RestClient(config.serverUrl, config.apiKey);\n this._memory = new MemoryClient(restClient, config.characterId, config.playerId);\n this._character = new CharacterClient(restClient);\n }\n\n /** Memory API client for querying memories, graphs, and facts */\n get memory(): MemoryClient {\n return this._memory;\n }\n\n /** Fetch character details including 3D model and avatar URLs. */\n async getCharacter(characterId?: string): Promise<CharacterInfo> {\n return this._character.getCharacter(characterId ?? this.config.characterId);\n }\n\n /** Current session info (null if not connected) */\n get session(): SessionInfo | null {\n return this._sessionInfo;\n }\n\n /** Current connection state */\n get connectionState(): ConnectionState {\n return this.socketManager.state;\n }\n\n /** Whether the client is connected and authenticated */\n get isConnected(): boolean {\n return this.socketManager.isConnected;\n }\n\n /** Connect to the Estuary server and authenticate */\n async connect(): Promise<SessionInfo> {\n this.logger.info('Connecting...');\n const session = await this.socketManager.connect();\n this._sessionInfo = session;\n return session;\n }\n\n /** Disconnect from the server */\n async disconnect(): Promise<void> {\n this.logger.info('Disconnecting...');\n if (this._autoInterruptGraceTimer) {\n clearTimeout(this._autoInterruptGraceTimer);\n this._autoInterruptGraceTimer = null;\n }\n await this.stopVoice();\n this.audioPlayer?.dispose();\n this.audioPlayer = null;\n this.socketManager.disconnect();\n this._sessionInfo = null;\n }\n\n /** Send a text message to the character. Defaults to textOnly=true (no TTS audio response). Pass textOnly=false to receive voice audio. */\n sendText(text: string, textOnly = true): void {\n this.ensureConnected();\n this.socketManager.emitEvent('text', { text, textOnly });\n }\n\n /** Interrupt the current bot response */\n interrupt(messageId?: string): void {\n this.ensureConnected();\n this.socketManager.emitEvent('client_interrupt', { message_id: messageId });\n this.audioPlayer?.setInterruptedMessageId(messageId ?? this.audioPlayer.playingMessageId);\n this.audioPlayer?.clear();\n this._hasAutoInterrupted = true;\n if (this._autoInterruptGraceTimer) {\n clearTimeout(this._autoInterruptGraceTimer);\n this._autoInterruptGraceTimer = null;\n }\n if (this.config.suppressMicDuringPlayback) {\n this.voiceManager?.setSuppressed?.(false);\n }\n }\n\n /** Send a camera image for vision processing */\n sendCameraImage(imageBase64: string, mimeType: string, requestId?: string, text?: string): void {\n this.ensureConnected();\n this.socketManager.emitEvent('camera_image', {\n image: imageBase64,\n mime_type: mimeType,\n request_id: requestId,\n text,\n });\n }\n\n /** Update session preferences */\n updatePreferences(preferences: { enableVisionAcknowledgment?: boolean }): void {\n this.ensureConnected();\n this.socketManager.emitEvent('update_preferences', preferences);\n }\n\n /** Notify server that audio playback completed for a message */\n notifyAudioPlaybackComplete(messageId?: string): void {\n this.ensureConnected();\n this.socketManager.emitEvent('audio_playback_complete', { message_id: messageId });\n }\n\n // ─── Voice ───────────────────────────────────────────────────\n\n /** Start voice input (requests microphone permission) */\n async startVoice(): Promise<void> {\n this.ensureConnected();\n\n if (this.voiceManager?.isActive) {\n throw new EstuaryError(ErrorCode.VOICE_ALREADY_ACTIVE, 'Voice is already active');\n }\n\n const transport = this.config.voiceTransport ?? 'auto';\n const sampleRate = this.config.audioSampleRate ?? DEFAULT_SAMPLE_RATE;\n\n this.voiceManager = await createVoiceManager(transport, this.socketManager, sampleRate, this.logger);\n if (!this.voiceManager) {\n throw new EstuaryError(ErrorCode.VOICE_NOT_SUPPORTED, 'No voice transport available');\n }\n\n // Set up audio player for bot voice responses (browser only)\n if (!this.audioPlayer && typeof AudioContext !== 'undefined') {\n this.audioPlayer = new AudioPlayer(sampleRate, (event) => {\n if (event.type === 'started') {\n // Suppress auto-interrupt during grace period so trailing STT partials\n // from the user's previous speech don't kill the new audio.\n this._hasAutoInterrupted = true;\n if (this._autoInterruptGraceTimer) clearTimeout(this._autoInterruptGraceTimer);\n this._autoInterruptGraceTimer = setTimeout(() => {\n this._hasAutoInterrupted = false;\n this._autoInterruptGraceTimer = null;\n }, 1500);\n this.emit('audioPlaybackStarted', event.messageId);\n if (this.config.suppressMicDuringPlayback) {\n this.voiceManager?.setSuppressed?.(true);\n }\n } else if (event.type === 'complete') {\n this.emit('audioPlaybackComplete', event.messageId);\n this.emit('botAudioLevel', 0);\n this.notifyAudioPlaybackComplete(event.messageId);\n if (this.config.suppressMicDuringPlayback) {\n this.voiceManager?.setSuppressed?.(false);\n }\n }\n });\n }\n\n await this.voiceManager.start();\n\n // Wire LiveKit speaking state (participant attributes) to events\n this.voiceManager.setSpeakingStateCallback?.((speaking: boolean) => {\n if (speaking) {\n this.emit('audioPlaybackStarted', 'livekit-audio');\n if (this.config.suppressMicDuringPlayback) {\n this.voiceManager?.setSuppressed?.(true);\n }\n } else {\n this.emit('audioPlaybackComplete', 'livekit-audio');\n this.emit('botAudioLevel', 0);\n this.notifyAudioPlaybackComplete('livekit-audio');\n if (this.config.suppressMicDuringPlayback) {\n this.voiceManager?.setSuppressed?.(false);\n }\n }\n });\n // Wire LiveKit audio level to botAudioLevel event\n this.voiceManager.setAudioLevelCallback?.((level: number) => {\n this.emit('botAudioLevel', level);\n });\n\n this.emit('voiceStarted');\n }\n\n /** Stop voice input */\n async stopVoice(): Promise<void> {\n if (this.voiceManager?.isActive) {\n await this.voiceManager.stop();\n this.voiceManager.dispose();\n this.voiceManager = null;\n this.emit('voiceStopped');\n }\n }\n\n /** Toggle microphone mute */\n toggleMute(): void {\n if (!this.voiceManager?.isActive) {\n throw new EstuaryError(ErrorCode.VOICE_NOT_ACTIVE, 'Voice is not active');\n }\n this.voiceManager.toggleMute();\n }\n\n /** Whether the microphone is muted */\n get isMuted(): boolean {\n return this.voiceManager?.isMuted ?? false;\n }\n\n /** Get/set suppressMicDuringPlayback at runtime (no reconnect needed) */\n get suppressMicDuringPlayback(): boolean {\n return this.config.suppressMicDuringPlayback ?? false;\n }\n\n set suppressMicDuringPlayback(enabled: boolean) {\n this.config.suppressMicDuringPlayback = enabled;\n }\n\n /** Whether voice is currently active */\n get isVoiceActive(): boolean {\n return this.voiceManager?.isActive ?? false;\n }\n\n // ─── Internal ────────────────────────────────────────────────\n\n private ensureConnected(): void {\n if (!this.socketManager.isConnected) {\n throw new EstuaryError(ErrorCode.NOT_CONNECTED, 'Not connected to server. Call connect() first.');\n }\n }\n\n private forwardSocketEvents(): void {\n // Forward all socket manager events to this client's event emitter\n this.socketManager.on('connected', (session) => {\n this._sessionInfo = session;\n this.emit('connected', session);\n });\n this.socketManager.on('disconnected', (reason) => {\n this._sessionInfo = null;\n this.actionParsers.clear();\n this.emit('disconnected', reason);\n });\n this.socketManager.on('reconnecting', (attempt) => this.emit('reconnecting', attempt));\n this.socketManager.on('connectionStateChanged', (state) => this.emit('connectionStateChanged', state));\n this.socketManager.on('botResponse', (response) => this.handleBotResponse(response));\n this.socketManager.on('botVoice', (voice) => this.handleBotVoice(voice));\n this.socketManager.on('sttResponse', (response) => {\n this.maybeAutoInterrupt(response);\n this.emit('sttResponse', response);\n });\n this.socketManager.on('interrupt', (data) => {\n this.audioPlayer?.setInterruptedMessageId(data.messageId ?? null);\n this.audioPlayer?.clear();\n this.actionParsers.clear();\n if (this.config.suppressMicDuringPlayback) {\n this.voiceManager?.setSuppressed?.(false);\n }\n this.emit('interrupt', data);\n });\n this.socketManager.on('error', (error) => this.emit('error', error));\n this.socketManager.on('authError', (error) => this.emit('authError', error));\n this.socketManager.on('quotaExceeded', (data) => this.emit('quotaExceeded', data));\n this.socketManager.on('cameraCaptureRequest', (request) => this.emit('cameraCaptureRequest', request));\n this.socketManager.on('livekitConnected', (room) => this.emit('livekitConnected', room));\n this.socketManager.on('livekitDisconnected', () => this.emit('livekitDisconnected'));\n this.socketManager.on('memoryUpdated', (event) => this.emit('memoryUpdated', event));\n }\n\n private handleBotResponse(response: BotResponse): void {\n const { messageId } = response;\n\n // Get or create a parser for this message stream\n if (!this.actionParsers.has(messageId)) {\n this.actionParsers.set(messageId, new StreamingActionParser());\n }\n const parser = this.actionParsers.get(messageId)!;\n\n // Parse actions from accumulated text\n const { actions, cleanText } = parser.parse(response.text);\n\n // Emit characterAction events for newly discovered actions\n for (const action of actions) {\n this.emit('characterAction', {\n name: action.name,\n params: action.params,\n messageId,\n });\n }\n\n // Forward botResponse with cleaned text\n this.emit('botResponse', {\n ...response,\n text: cleanText,\n });\n\n // Clean up parser when message is final\n if (response.isFinal) {\n this.actionParsers.delete(messageId);\n }\n }\n\n private handleBotVoice(voice: BotVoice): void {\n this.emit('botVoice', voice);\n if (voice.audio) {\n // WebSocket transport — real audio data, AudioPlayer handles full lifecycle\n this.audioPlayer?.enqueue(voice);\n // Compute and emit audio level from PCM data\n this.emit('botAudioLevel', this.computeAudioLevel(voice.audio));\n }\n // LiveKit transport: no metadata-only events expected anymore.\n // Speaking state is now driven by participant attributes.\n }\n\n /** Compute RMS audio level (0-1) from base64-encoded Int16 PCM. */\n private computeAudioLevel(base64Audio: string): number {\n try {\n const binaryStr = atob(base64Audio);\n const len = binaryStr.length;\n // Sample every 8th sample for performance (voice chunks are small)\n const step = 16; // 8 samples * 2 bytes per Int16\n let sum = 0;\n let count = 0;\n for (let i = 0; i + 1 < len; i += step) {\n const sample = (binaryStr.charCodeAt(i) | (binaryStr.charCodeAt(i + 1) << 8));\n const signed = sample > 32767 ? sample - 65536 : sample;\n const normalized = signed / 32768;\n sum += normalized * normalized;\n count++;\n }\n if (count === 0) return 0;\n // RMS is typically 0-0.3 for speech; scale up to 0-1 range\n return Math.min(1, Math.sqrt(sum / count) * 5);\n } catch {\n return 0;\n }\n }\n\n private maybeAutoInterrupt(stt: SttResponse): void {\n if ((this.config.autoInterruptOnSpeech ?? true) === false) return;\n if (this.config.suppressMicDuringPlayback) return;\n if (stt.isFinal) return;\n if (!this.audioPlayer?.playing) return;\n if (this._hasAutoInterrupted) return;\n\n this._hasAutoInterrupted = true;\n this.interrupt();\n }\n}\n","/**\n * Parses `<action name=\"...\" .../>` XML tags from bot response text.\n *\n * Designed for streaming: call `parse()` with the accumulated text on each\n * chunk and it returns only newly-discovered actions since the last call.\n */\n\nexport interface ParsedAction {\n name: string;\n params: Record<string, string>;\n}\n\n// Matches self-closing <action .../> tags (with optional whitespace before />)\nconst ACTION_TAG_RE = /<action\\s+([^>]*?)\\/>/gi;\n// Matches key=\"value\" or key='value' attribute pairs\nconst ATTR_RE = /(\\w+)\\s*=\\s*\"([^\"]*)\"|(\\w+)\\s*=\\s*'([^']*)'/g;\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n let match: RegExpExecArray | null;\n while ((match = ATTR_RE.exec(attrString)) !== null) {\n const key = match[1] ?? match[3];\n const value = match[2] ?? match[4];\n attrs[key] = value;\n }\n return attrs;\n}\n\nexport class StreamingActionParser {\n private emittedCount = 0;\n\n /**\n * Parse the accumulated response text and return any new actions found\n * since the last call. Also returns the text with all action tags stripped.\n */\n parse(accumulatedText: string): { actions: ParsedAction[]; cleanText: string } {\n const allActions: ParsedAction[] = [];\n let match: RegExpExecArray | null;\n\n ACTION_TAG_RE.lastIndex = 0;\n while ((match = ACTION_TAG_RE.exec(accumulatedText)) !== null) {\n const attrs = parseAttributes(match[1]);\n const name = attrs.name;\n if (name) {\n delete attrs.name;\n allActions.push({ name, params: attrs });\n }\n }\n\n const newActions = allActions.slice(this.emittedCount);\n this.emittedCount = allActions.length;\n\n const cleanText = accumulatedText.replace(ACTION_TAG_RE, '').replace(/\\s{2,}/g, ' ').trimEnd();\n\n return { actions: newActions, cleanText };\n }\n\n reset(): void {\n this.emittedCount = 0;\n }\n}\n\n/**\n * One-shot parse: extract all actions and return clean text.\n * Useful for non-streaming contexts.\n */\nexport function parseActions(text: string): { actions: ParsedAction[]; cleanText: string } {\n const parser = new StreamingActionParser();\n return parser.parse(text);\n}\n","// Main client\nexport { EstuaryClient } from './client';\n\n// Errors\nexport { EstuaryError, ErrorCode } from './errors';\n\n// Types — public interfaces and enums\nexport type {\n EstuaryConfig,\n VoiceTransport,\n SessionInfo,\n CharacterInfo,\n BotResponse,\n BotVoice,\n SttResponse,\n InterruptData,\n QuotaExceededData,\n LiveKitTokenResponse,\n CameraCaptureRequest,\n CharacterAction,\n EstuaryEventMap,\n VoiceManager,\n MemoryListOptions,\n MemoryTimelineOptions,\n MemoryGraphOptions,\n MemorySearchOptions,\n MemoryListResponse,\n MemoryTimelineResponse,\n MemoryStatsResponse,\n MemoryGraphNode,\n MemoryGraphEdge,\n MemoryGraphResponse,\n MemorySearchResponse,\n CoreFact,\n CoreFactsResponse,\n MemoryData,\n MemoryUpdatedEvent,\n} from './types';\n\nexport { ConnectionState } from './types';\n\n// Action parsing utilities\nexport { parseActions } from './utils/action-parser';\nexport type { ParsedAction } from './utils/action-parser';\n\n// Memory client (so users can type `client.memory` properly)\nexport type { MemoryClient } from './rest/memory-client';\n\n// Character client\nexport type { CharacterClient } from './rest/character-client';\n"]}