@convai/web-sdk 1.8.0-beta.2 → 1.8.0-beta.3
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/README.md +19 -0
- package/dist/core/ConvaiClient.d.ts +3 -2
- package/dist/core/ConvaiClient.d.ts.map +1 -1
- package/dist/core/ConvaiClient.js +115 -32
- package/dist/core/ConvaiClient.js.map +1 -1
- package/dist/core/MessageHandler.d.ts +1 -0
- package/dist/core/MessageHandler.d.ts.map +1 -1
- package/dist/core/MessageHandler.js +26 -9
- package/dist/core/MessageHandler.js.map +1 -1
- package/dist/core/SSESession.d.ts +44 -0
- package/dist/core/SSESession.d.ts.map +1 -0
- package/dist/core/SSESession.js +200 -0
- package/dist/core/SSESession.js.map +1 -0
- package/dist/core/connectRequest.d.ts +2 -0
- package/dist/core/connectRequest.d.ts.map +1 -1
- package/dist/core/connectRequest.js +27 -0
- package/dist/core/connectRequest.js.map +1 -1
- package/dist/core/logicalTurn.d.ts +5 -0
- package/dist/core/logicalTurn.d.ts.map +1 -0
- package/dist/core/logicalTurn.js +10 -0
- package/dist/core/logicalTurn.js.map +1 -0
- package/dist/core/types.d.ts +12 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConvaiClient.js","sourceRoot":"","sources":["../../src/core/ConvaiClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Room,\n RoomEvent,\n ConnectionState,\n DisconnectReason,\n DefaultReconnectPolicy,\n setLogLevel,\n} from \"livekit-client\";\n\nsetLogLevel(\"warn\");\nimport {\n ConvaiConfig,\n ConvaiClientState,\n ChatMessage,\n AudioSettings,\n IConvaiClient,\n AudioControls,\n VideoControls,\n ScreenShareControls,\n DynamicInfo,\n ContextUpdateOptions,\n UploadFileOptions,\n ServerResponse,\n InteractionCreated,\n IWebSocketSession,\n WebSocketSessionFactory,\n RespondModeUpdateOptions,\n RespondModesConfig,\n UpdateSceneMetadataOptions,\n VisionStatusOptions,\n VisionTriggerOptions,\n DisconnectReasonEnum,\n ActionResponseEvent,\n ConnectionData,\n} from \"./types\";\nimport { AudioManager } from \"./AudioManager\";\nimport { VideoManager } from \"./VideoManager\";\nimport { ScreenShareManager } from \"./ScreenShareManager\";\nimport { MessageHandler } from \"./MessageHandler\";\nimport { SDK_VERSION } from \"../version\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { BlendshapeQueue } from \"./BlendshapeQueue\";\nimport { MemoryManager } from \"./MemoryManager\";\nimport { ConnectionStateHandler } from \"./ConnectionStateHandler\";\nimport { buildBlendshapeConnectConfig } from \"./connectRequest\";\nimport {\n shouldPreemptForContextUpdateResponse,\n shouldPreemptForExplicitRespondMode,\n} from \"./contextUpdateRequest\";\nimport {\n resolveVisionInputConfig,\n serializeVisionInputConfig,\n} from \"./visionRequest\";\n\n// Module-level registry — populated by importing @convai/web-sdk/vanilla/websocket\nlet _wsFactory: WebSocketSessionFactory | null = null;\n\nfunction normalizeStateOfMind(value: string | null | undefined): string | null | undefined {\n if (value == null) return value;\n const normalized = value.trim().toLowerCase();\n return normalized === \"neutral\" || normalized === \"\" ? null : normalized;\n}\n\n/**\n * Custom reconnect policy that disables automatic reconnection\n */\nclass NoReconnectPolicy extends DefaultReconnectPolicy {\n nextRetryDelayInMs(): number | null {\n return null; // Always return null to prevent any reconnection attempts\n }\n}\n\n/**\n * Main Convai client class for managing AI voice assistant connections\n * Provides complete interface for connecting to Convai's voice assistants,\n * managing real-time audio/video conversations, and handling messages.\n *\n * @example\n * ```typescript\n * import { ConvaiClient } from '@convai/web-sdk/core';\n *\n * // Recommended: Pass config to constructor\n * const client = new ConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * endUserId: 'user-uuid', // Optional: enables memory & analytics\n * enableVideo: true,\n * });\n *\n * // Listen for state changes\n * client.on('stateChange', (state) => {\n * console.log('State:', state);\n * });\n *\n * // Connect (uses stored config from constructor)\n * await client.connect();\n *\n * // Send a message\n * client.sendUserTextMessage('Hello!');\n *\n * // Advanced: Override config or connect without constructor config\n * await client.connect({ apiKey: 'different-key', characterId: 'different-id' });\n *\n * // Disconnect and reconnect\n * await client.disconnect();\n * await client.reconnect();\n * ```\n */\nexport class ConvaiClient extends EventEmitter implements IConvaiClient {\n private _room: Room;\n private _state: ConvaiClientState;\n private _connectionType: \"audio\" | \"video\" | null = null;\n private _apiKey: string | null = null;\n private _authToken: string | null = null;\n private _characterId: string | null = null;\n private _characterSessionId: string | null = \"-1\";\n private _isBotReady: boolean = false;\n private _participantSid: string = \"\";\n private _audioSettings: AudioSettings;\n private _storedConfig: ConvaiConfig | null = null;\n /**\n * Runtime state of mind. Source of truth for the value sent on connect,\n * so updateEmotion() called before any config is stored is not lost.\n */\n private _stateOfMind: string | null = null;\n private _endUserId: string | null = null;\n private _endUserMetadata: Record<string, unknown> | null = null;\n private _wsSession: IWebSocketSession | null = null;\n private _activeTransport: \"livekit\" | \"websocket\" | null = null;\n private _logRtviMessages: boolean = true;\n private _isDisconnecting: boolean = false;\n\n // RTVI client-ready handshake (race-proof bot-ready delivery)\n private _clientReadyRetryTimer: ReturnType<typeof setTimeout> | null = null;\n private _clientReadyTimeoutTimer: ReturnType<typeof setTimeout> | null = null;\n private _clientReadyMsgId: string | null = null;\n private static readonly CLIENT_READY_RETRY_MS = 500;\n private static readonly CLIENT_READY_TIMEOUT_MS = 45_000;\n\n /**\n * Register the WebSocket transport factory. Called automatically as a side-effect\n * when you import `@convai/web-sdk/vanilla/websocket` (or the react equivalent).\n * Only needed when using `transport: \"websocket\"` in ConvaiConfig.\n */\n static registerWebSocketTransport(factory: WebSocketSessionFactory): void {\n _wsFactory = factory;\n }\n\n // Managers\n private _audioManager: AudioManager;\n private _videoManager: VideoManager;\n private _screenShareManager: ScreenShareManager;\n private _messageHandler: MessageHandler;\n private _connectionStateHandler: ConnectionStateHandler;\n\n // Conversation session tracking\n private _conversationSessionId: number = 0;\n private _conversationStartTime: number = 0;\n\n // Memory manager instance\n private _memoryManager: MemoryManager | null = null;\n\n constructor(config?: ConvaiConfig) {\n super();\n\n // Store config if provided\n if (config) {\n this._storedConfig = config;\n this._logRtviMessages = config.logRtviMessages !== false;\n }\n\n // Initialize room with no reconnect policy\n this._room = new Room({\n reconnectPolicy: new NoReconnectPolicy(),\n });\n\n // Initialize state\n this._state = {\n isConnected: false,\n isConnecting: false,\n isListening: false,\n isThinking: false,\n isSpeaking: false,\n agentState: \"disconnected\",\n emotion: null,\n endUserId: null,\n endUserMetadata: null,\n metrics: [],\n disconnectReason: null,\n };\n\n // Default audio settings for optimal interruption handling\n this._audioSettings = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n sampleRate: 48000,\n channelCount: 1,\n };\n\n // Initialize managers\n this._audioManager = new AudioManager(this._room);\n this._videoManager = new VideoManager(this._room);\n this._screenShareManager = new ScreenShareManager(this._room);\n this._messageHandler = new MessageHandler(this._room);\n this._messageHandler.setRtviMessageLogging(this._logRtviMessages);\n this._connectionStateHandler = new ConnectionStateHandler(\n this.updateState.bind(this),\n (ready) => (this._isBotReady = ready),\n () => {\n this._messageHandler.reset();\n this._endUserId = null;\n this._endUserMetadata = null;\n },\n (reason) => this.emit(\"disconnect\", reason),\n );\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Connect MessageHandler to conversation start events\n this.setupMessageHandlerEvents();\n }\n\n // Getters\n get state(): ConvaiClientState {\n return { ...this._state };\n }\n\n get connectionType(): \"audio\" | \"video\" | null {\n return this._connectionType;\n }\n\n get apiKey(): string | null {\n return this._apiKey;\n }\n\n get authToken(): string | null {\n return this._authToken;\n }\n\n get characterId(): string | null {\n return this._characterId;\n }\n\n get room(): Room {\n return this._room;\n }\n\n get chatMessages(): ChatMessage[] {\n return this._messageHandler.getChatMessages();\n }\n\n get userTranscription(): string {\n return this._messageHandler.getUserTranscription();\n }\n\n get characterSessionId(): string | null {\n return this._characterSessionId;\n }\n\n get isBotReady(): boolean {\n return this._isBotReady;\n }\n\n get audioControls(): AudioControls {\n return this._audioManager;\n }\n\n get videoControls(): VideoControls {\n return this._videoManager;\n }\n\n get screenShareControls(): ScreenShareControls {\n return this._screenShareManager;\n }\n\n get blendshapeQueue(): BlendshapeQueue {\n return this._messageHandler.getBlendshapeQueue();\n }\n\n get conversationSessionId(): number {\n return this._conversationSessionId;\n }\n\n get memoryManager(): MemoryManager | null {\n return this._memoryManager;\n }\n\n /**\n * Setup event listeners for room and managers\n */\n private setupEventListeners(): void {\n // Room event listeners\n this._room.on(RoomEvent.Disconnected, (reason?: DisconnectReason) => {\n this._connectionStateHandler.handleDisconnected(reason);\n });\n this._room.on(\n RoomEvent.ConnectionStateChanged,\n this._connectionStateHandler.handleConnectionStateChanged.bind(\n this._connectionStateHandler,\n ),\n );\n\n // Message handler events\n this._messageHandler.on(\"botReady\", () => {\n // Server may send multiple bot-ready frames (one per client-ready\n // we retried). Only surface the first to consumers per connect.\n if (this._isBotReady) {\n return;\n }\n this._isBotReady = true;\n this._stopClientReadyHandshake();\n this.updateState({ isConnected: true });\n this.emit(\"botReady\");\n });\n\n this._messageHandler.on(\"messagesChange\", (messages: ChatMessage[]) => {\n this.emit(\"message\", messages[messages.length - 1]);\n this.emit(\"messagesChange\", messages);\n });\n\n this._messageHandler.on(\n \"userTranscriptionChange\",\n (transcription: string) => {\n this.emit(\"userTranscriptionChange\", transcription);\n },\n );\n\n this._messageHandler.on(\"speakingChange\", (isSpeaking: boolean) => {\n this.updateState({ isSpeaking });\n this.emit(\"speakingChange\", isSpeaking);\n\n if (!isSpeaking && this._conversationSessionId > 0) {\n // Bot stopped speaking - turn end signal (same semantics as BlendshapeQueue.hasReceivedEndSignal())\n const duration = (\n (Date.now() - this._conversationStartTime) /\n 1000\n ).toFixed(2);\n\n this.emit(\"turnEnd\", {\n sessionId: this._conversationSessionId,\n duration: parseFloat(duration),\n timestamp: Date.now(),\n });\n }\n });\n\n this._messageHandler.on(\"botRespondingChange\", (isResponding: boolean) => {\n this.updateState({ isThinking: isResponding });\n });\n\n this._messageHandler.on(\n \"emotionChange\",\n (emotion: { emotion: string; scale?: number } | null) => {\n this.updateState({ emotion });\n this.emit(\"emotionChange\", emotion);\n },\n );\n\n this._messageHandler.on(\"listeningChange\", (isListening: boolean) => {\n const wasListening = this._state.isListening;\n this.updateState({ isListening });\n\n // Voice input path — activate the blendshape queue as soon as the user\n // starts speaking (user-started-speaking) so conversationActive is true\n // immediately, matching the text-input path where it's true on send.\n if (!wasListening && isListening) {\n // Reset blendshape queue if mid-conversation, but don't interrupt the server\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage: \"[voice]\",\n timestamp: this._conversationStartTime,\n });\n }\n });\n\n // Handle metrics events\n this._messageHandler.on(\"metrics\", (metricsData: any) => {\n const newMetrics = [\n ...this._state.metrics,\n {\n id: `metrics-${Date.now()}-${Math.random()}`,\n data: metricsData,\n timestamp: new Date().toISOString(),\n },\n ];\n this.updateState({ metrics: newMetrics });\n this.emit(\"metrics\", metricsData);\n });\n\n // Forward blendshapes events\n this._messageHandler.on(\"blendshapes\", (data: unknown) => {\n this.emit(\"blendshapes\", data);\n });\n\n // Forward blendshape stats event (conversation end marker)\n this._messageHandler.on(\"blendshapeStatsReceived\", (stats: unknown) => {\n this.emit(\"blendshapeStatsReceived\", stats);\n });\n\n // Forward blendshape cancel event (owner-scoped visual hard stop)\n this._messageHandler.on(\"blendshapeCancel\", (data: unknown) => {\n this.emit(\"blendshapeCancel\", data);\n });\n\n // Forward idle warning event\n this._messageHandler.on(\n \"idleWarning\",\n (data: { remainingSeconds: number | null }) => {\n this.emit(\"idleWarning\", data);\n },\n );\n\n // Forward LLM no-response event\n this._messageHandler.on(\"llmNoResponse\", () => {\n this.emit(\"llmNoResponse\");\n });\n\n // Forward bot-output event (aggregated output with spoken status)\n this._messageHandler.on(\n \"botOutput\",\n (data: { text: string; spoken: boolean; aggregatedBy: string }) => {\n this.emit(\"botOutput\", data);\n },\n );\n\n // Forward bot TTS text (word-by-word as spoken)\n this._messageHandler.on(\"botTtsText\", (data: { text: string }) => {\n this.emit(\"botTtsText\", data);\n });\n\n // Forward bot TTS lifecycle events\n this._messageHandler.on(\"botTtsStarted\", () => {\n this.emit(\"botTtsStarted\");\n });\n\n this._messageHandler.on(\"botTtsStopped\", () => {\n this.emit(\"botTtsStopped\");\n });\n\n // Forward server-side muting events\n this._messageHandler.on(\"userMuteStarted\", () => {\n this.emit(\"userMuteStarted\");\n });\n\n this._messageHandler.on(\"userMuteStopped\", () => {\n this.emit(\"userMuteStopped\");\n });\n\n this._messageHandler.on(\"actionResponse\", (data: ActionResponseEvent) => {\n this.emit(\"actionResponse\", data);\n });\n\n this._messageHandler.on(\"serverResponse\", (response: ServerResponse) => {\n this.emit(\"serverResponse\", response);\n });\n\n this._messageHandler.on(\"interactionCreated\", (data: InteractionCreated) => {\n this.emit(\"interactionCreated\", data);\n });\n }\n\n /**\n * Setup MessageHandler to respond to conversation start events\n * This ensures the BlendshapeQueue starts accepting frames when user sends a message,\n * rather than waiting for bot-started-speaking (which would cause early frames to be dropped)\n */\n private setupMessageHandlerEvents(): void {\n this.on(\n \"conversationStart\",\n (data: { sessionId: number; userMessage: string; timestamp: number }) => {\n this._messageHandler.getBlendshapeQueue().startConversation();\n },\n );\n }\n\n /**\n * Update state and emit changes\n */\n private updateState(updates: Partial<ConvaiClientState>): void {\n const oldState = { ...this._state };\n this._state = { ...this._state, ...updates };\n\n // Update agentState: speaking (highest) > listening (user speaking) > thinking > connected\n if (!this._state.isConnected) {\n this._state.agentState = \"disconnected\";\n } else if (this._state.isSpeaking) {\n this._state.agentState = \"speaking\";\n } else if (this._state.isListening) {\n this._state.agentState = \"listening\";\n } else if (this._state.isThinking) {\n this._state.agentState = \"thinking\";\n } else {\n this._state.agentState = \"connected\";\n }\n\n // Emit state change if changed\n if (JSON.stringify(oldState) !== JSON.stringify(this._state)) {\n this.emit(\"stateChange\", this._state);\n }\n }\n\n /**\n * Send a data message via the active transport.\n * For LiveKit: publishes via the data channel.\n * For WebSocket: sends via PipecatClient.sendClientMessage (wrapped in {t,d} envelope).\n */\n private publishMessage(type: string, data: unknown): void {\n const message = { type, data };\n\n if (this._activeTransport === \"websocket\" && this._wsSession?.isConnected) {\n this._wsSession.sendMessage(type, data);\n } else if (\n this._room?.localParticipant &&\n this._room.state !== \"disconnected\"\n ) {\n const encodedData = new TextEncoder().encode(JSON.stringify(message));\n this._room.localParticipant.publishData(encodedData, { reliable: true });\n }\n }\n\n /**\n * Returns true when a message can be sent on the active transport.\n */\n private isTransportReady(): boolean {\n if (this._activeTransport === \"websocket\") {\n return this._wsSession?.isConnected ?? false;\n }\n return (\n !!this._room?.localParticipant && this._room.state !== \"disconnected\"\n );\n }\n\n /**\n * Connect to a Convai character\n */\n async connect(config?: ConvaiConfig): Promise<void> {\n // Use provided config or stored config\n const finalConfig = config || this._storedConfig;\n\n if (!finalConfig) {\n throw new Error(\n \"No configuration provided. Pass config to connect() or store it in the client\",\n );\n }\n\n // Store config for reconnection\n this._storedConfig = { ...finalConfig };\n\n // Use characterSessionId from config when reconnecting (so we resume the same session)\n if (\n finalConfig.characterSessionId &&\n finalConfig.characterSessionId !== \"-1\"\n ) {\n this._characterSessionId = finalConfig.characterSessionId;\n }\n\n const configWithDefaults = this.applyConfigDefaults(finalConfig);\n\n this.updateState({ isConnecting: true });\n\n try {\n // Store connection config\n this._apiKey = configWithDefaults.apiKey ?? null;\n this._authToken = configWithDefaults.authToken ?? null;\n this._characterId = configWithDefaults.characterId;\n\n // Determine connection type based on enableVideo\n const connType = configWithDefaults.enableVideo ? \"video\" : \"audio\";\n this._connectionType = connType;\n\n const transportType = configWithDefaults.transport ?? \"livekit\";\n this._activeTransport = transportType;\n const effectiveVisionInputConfig =\n resolveVisionInputConfig(configWithDefaults);\n\n // Prepare request body with required parameters\n // An explicit stateOfMind in the config wins; otherwise carry whatever\n // updateEmotion() last set, including before the first connect.\n const stateOfMind =\n configWithDefaults.stateOfMind !== undefined\n ? normalizeStateOfMind(configWithDefaults.stateOfMind) ?? null\n : this._stateOfMind;\n this._stateOfMind = stateOfMind;\n const characterSessionIdToSend =\n configWithDefaults.characterSessionId ?? this._characterSessionId;\n const requestBody = {\n character_id: configWithDefaults.characterId,\n ...(stateOfMind ? { state_of_mind: stateOfMind } : {}),\n ...(configWithDefaults.endUserId && {\n end_user_id: configWithDefaults.endUserId,\n }),\n ...(configWithDefaults.endUserMetadata != null && {\n end_user_metadata: configWithDefaults.endUserMetadata,\n }),\n transport: transportType,\n connection_type: connType,\n ...buildBlendshapeConnectConfig(configWithDefaults),\n llm_provider: \"dynamic\",\n ...(configWithDefaults.enableEmotion === true && {\n emotion_config: (() => {\n const cfg = configWithDefaults.emotionConfig;\n const provider = cfg?.provider ?? \"llm\";\n if (provider === \"nrclex\") {\n return {\n provider,\n min_word_threshold: (cfg as { provider: \"nrclex\"; min_word_threshold?: number }).min_word_threshold ?? 3,\n low_intensity_threshold: (cfg as { provider: \"nrclex\"; low_intensity_threshold?: number }).low_intensity_threshold ?? 0.33,\n high_intensity_threshold: (cfg as { provider: \"nrclex\"; high_intensity_threshold?: number }).high_intensity_threshold ?? 0.66,\n };\n }\n return { provider };\n })(),\n }),\n default_tts_enabled:\n configWithDefaults.ttsEnabled !== undefined\n ? configWithDefaults.ttsEnabled\n : true,\n default_stt_enabled: true,\n ...(effectiveVisionInputConfig && {\n vision_input_config: serializeVisionInputConfig(\n effectiveVisionInputConfig,\n ),\n }),\n ...(configWithDefaults.respondModes && {\n respond_modes: this.serializeRespondModes(\n configWithDefaults.respondModes,\n ),\n }),\n ...(characterSessionIdToSend &&\n characterSessionIdToSend !== \"-1\" && {\n character_session_id: characterSessionIdToSend,\n }),\n ...(configWithDefaults.actionConfig && {\n action_config: {\n actions: configWithDefaults.actionConfig.actions,\n objects: configWithDefaults.actionConfig.objects,\n characters: configWithDefaults.actionConfig.characters,\n ...(configWithDefaults.actionConfig.current_attention_object && {\n current_attention_object: configWithDefaults.actionConfig.current_attention_object,\n }),\n },\n }),\n ...(configWithDefaults.dynamicInfo && {\n dynamic_info: {\n text: configWithDefaults.dynamicInfo,\n ...(configWithDefaults.keepInContext !== undefined && {\n keep_in_context: configWithDefaults.keepInContext,\n }),\n },\n }),\n ...(configWithDefaults.narrativeTemplateKeys &&\n Object.keys(configWithDefaults.narrativeTemplateKeys).length > 0 && {\n narrative_template_keys: configWithDefaults.narrativeTemplateKeys,\n }),\n ...(configWithDefaults.debug !== undefined && {\n debug: configWithDefaults.debug,\n }),\n invocation_metadata: {\n source: configWithDefaults.invocationMetadata?.source ?? \"web_sdk\",\n client_version:\n configWithDefaults.invocationMetadata?.clientVersion ??\n SDK_VERSION,\n ...(configWithDefaults.invocationMetadata?.extraMetadata && {\n extra_metadata: configWithDefaults.invocationMetadata.extraMetadata,\n }),\n },\n };\n\n const connectHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (configWithDefaults.authToken) {\n connectHeaders[\"API-AUTH-TOKEN\"] = configWithDefaults.authToken;\n } else if (configWithDefaults.apiKey) {\n connectHeaders[\"X-API-Key\"] = configWithDefaults.apiKey;\n }\n\n // HTTP POST /connect — same request for both transports\n const response = await fetch(`${configWithDefaults.url}/connect`, {\n method: \"POST\",\n headers: connectHeaders,\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorData = JSON.parse(errorText);\n const raw = errorData.message ?? errorData.error ?? errorData.detail;\n if (typeof raw === \"string\") {\n errorMessage = raw;\n } else if (Array.isArray(raw)) {\n // FastAPI/Pydantic 422 — detail is an array of validation error objects\n errorMessage = raw\n .map((e: { msg?: string; loc?: string[] }) =>\n [e.loc?.join(\".\"), e.msg].filter(Boolean).join(\": \")\n )\n .join(\"; \") || errorMessage;\n } else if (raw != null) {\n errorMessage = JSON.stringify(raw);\n } else if (errorText) {\n errorMessage = `${errorMessage}: ${errorText}`;\n }\n } catch {\n if (errorText) errorMessage = `${errorMessage}: ${errorText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n const connectionData = await response.json();\n return await this.consumeConnectionData(connectionData, configWithDefaults);\n } catch (error) {\n await this.cleanupWebSocketSessionAfterConnectFailure();\n this.updateState({\n isConnected: false,\n isConnecting: false,\n });\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n /**\n * Complete a connection from an already-fetched /connect response body.\n *\n * `connect()` fetches /connect and then calls this internally. Call it\n * directly when the response was obtained elsewhere — a server-side session\n * manager, or the embed's connect-proxy flow, where the API key must never\n * reach the browser.\n *\n * @example\n * // Server (customer's backend): holds the API key, calls Convai's\n * // /connect, and relays the response body verbatim.\n * // Browser: never sees the API key, only the relayed response.\n * const data = await fetch('/api/convai-connect', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ characterId: 'your-character-id' }),\n * }).then(r => r.json())\n * await client.connectWithConnectionData(data)\n */\n async connectWithConnectionData(\n data: ConnectionData,\n config?: ConvaiConfig,\n ): Promise<void> {\n const finalConfig = config || this._storedConfig;\n if (!finalConfig) {\n throw new Error(\n \"No configuration provided. Pass config to connectWithConnectionData() or store it in the client\",\n );\n }\n this._storedConfig = { ...finalConfig };\n\n // Use characterSessionId from config when reconnecting (so we resume the same session)\n if (\n finalConfig.characterSessionId &&\n finalConfig.characterSessionId !== \"-1\"\n ) {\n this._characterSessionId = finalConfig.characterSessionId;\n }\n\n const configWithDefaults = this.applyConfigDefaults(finalConfig, {\n requireCredential: false,\n });\n\n // Symmetric with connect(): the catch below emits isConnecting: false, so\n // without this a UI bound to stateChange never sees a connecting state on\n // the proxy path -- and on failure receives a transition out of a state it\n // was never told about. consumeConnectionData() clears the flag on success.\n this.updateState({ isConnecting: true });\n\n try {\n return await this.consumeConnectionData(data, configWithDefaults);\n } catch (error) {\n await this.cleanupWebSocketSessionAfterConnectFailure();\n this.updateState({\n isConnected: false,\n isConnecting: false,\n });\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n /**\n * Add default URL, apply RTVI-logging config, and validate that either an\n * API key or auth token plus a character ID are present.\n * Shared by connect() and connectWithConnectionData() so both derive\n * `configWithDefaults` identically.\n *\n * `connect()` performs its own /connect fetch and always needs a credential\n * to do so, so it uses the default `requireCredential: true`.\n * `connectWithConnectionData()` consumes a response obtained elsewhere (e.g.\n * a proxy that holds the credential server-side) and passes\n * `requireCredential: false` — a character ID is still required either way.\n */\n private applyConfigDefaults(\n finalConfig: ConvaiConfig,\n opts: { requireCredential?: boolean } = {},\n ) {\n const { requireCredential = true } = opts;\n\n // Add default URL if not provided\n const configWithDefaults = {\n url: \"https://realtime-api.convai.com\",\n ...finalConfig,\n };\n\n this._logRtviMessages = configWithDefaults.logRtviMessages !== false;\n this._messageHandler.setRtviMessageLogging(this._logRtviMessages);\n\n const hasApiKey = Boolean(configWithDefaults.apiKey);\n const hasAuthToken = Boolean(configWithDefaults.authToken);\n const missingCredential =\n requireCredential && !hasApiKey && !hasAuthToken;\n if (missingCredential || !configWithDefaults.characterId) {\n throw new Error(\n \"Either apiKey or authToken is required, and characterId is required\",\n );\n }\n\n return configWithDefaults;\n }\n\n /**\n * Consume a /connect response and bring up the transport.\n * `connect()` calls this after its own fetch; external callers use it\n * when the response came from a proxy.\n */\n private async consumeConnectionData(\n connectionData: ConnectionData,\n configWithDefaults: ReturnType<ConvaiClient[\"applyConfigDefaults\"]>,\n ): Promise<void> {\n // Store connection config (mirrors connect()'s pre-fetch setup so this\n // method is self-sufficient when called directly, without connect()\n // having run first).\n //\n // Known race, judged acceptable: when called from connect(), that method\n // sets these same fields once, before the /connect fetch, then awaits\n // the network round trip. If disconnect() -> clearAllManagers() lands in\n // that await window, the pre-split code left these fields null (nothing\n // re-set them post-fetch), whereas re-deriving them here re-arms them\n // once the response arrives. Checked `_isDisconnecting` as a guard: it\n // doesn't cover this window — it's flipped back to false (in a\n // `finally`) before clearAllManagers() runs on the websocket path, and\n // disconnect()'s LiveKit-room path never sets it at all — so it can't\n // reliably detect \"a disconnect landed mid-connect\" here. Even\n // pre-split, connect() never checked for a concurrent disconnect after\n // the fetch resolved; it always went on to establish a new room/session\n // regardless. Re-arming these fields keeps them consistent with the\n // connection actually being brought up in that case, rather than\n // silently stale. Building a proper cancellation token for\n // connect()-vs-disconnect() races is out of scope for this additive\n // split.\n this._apiKey = configWithDefaults.apiKey ?? null;\n this._authToken = configWithDefaults.authToken ?? null;\n this._characterId = configWithDefaults.characterId;\n\n const connType = configWithDefaults.enableVideo ? \"video\" : \"audio\";\n this._connectionType = connType;\n\n const transportType = configWithDefaults.transport ?? \"livekit\";\n this._activeTransport = transportType;\n const effectiveVisionInputConfig =\n resolveVisionInputConfig(configWithDefaults);\n\n // Capture session identifiers from /connect response\n if (connectionData.character_session_id) {\n this._characterSessionId = connectionData.character_session_id;\n this._storedConfig = {\n ...this._storedConfig!,\n characterSessionId: connectionData.character_session_id,\n };\n }\n if (connectionData.end_user_id) {\n this._endUserId = connectionData.end_user_id;\n }\n if (connectionData.end_user_metadata) {\n this._endUserMetadata = connectionData.end_user_metadata;\n }\n\n if (transportType === \"websocket\") {\n // ── WebSocket (Pipecat) transport path ────────────────────────────\n // Server returns the WebSocket URL in room_url (same field as LiveKit).\n const wsUrl = connectionData.room_url as string;\n if (!wsUrl) {\n throw new Error(\n \"No WebSocket URL returned from /connect endpoint (expected room_url)\",\n );\n }\n\n if (!_wsFactory) {\n throw new Error(\n \"[ConvaiClient] WebSocket transport is not registered. \" +\n \"Add `import '@convai/web-sdk/vanilla/websocket'` before calling connect().\",\n );\n }\n // Always enable mic at construction so WavMediaManager initializes the\n // audio stream during connect(). If startWithAudioOn is false, we mute\n // after the connection is established (enableMic(false) works once the\n // stream exists, but not before it is initialized).\n this._wsSession = _wsFactory(\n (payload) => this._messageHandler.handleDataReceivedPublic(payload),\n true,\n );\n const webSocketVisionEnabled =\n configWithDefaults.enableVideo === true &&\n effectiveVisionInputConfig?.enabled !== false;\n if (webSocketVisionEnabled) {\n this._videoManager.setWebSocketVisionMessageSender((type, data) => {\n if (\n this._activeTransport !== \"websocket\" ||\n !this._wsSession?.isConnected\n ) {\n return;\n }\n this._wsSession.sendMessage(type, data);\n });\n } else {\n this._videoManager.setWebSocketVisionDisabled();\n }\n\n const wsSession = this._wsSession;\n\n wsSession.on(\"botAudioTrack\", (track: MediaStreamTrack) => {\n this.emit(\"botAudioTrack\", track);\n });\n\n wsSession.on(\"disconnected\", () => {\n if (this._wsSession !== wsSession || this._isDisconnecting) {\n return;\n }\n this._connectionStateHandler.handleDisconnected();\n this.clearAllManagers();\n });\n\n this._audioManager.setWebSocketSession(this._wsSession);\n\n // Wait for WebSocket transport to connect (fires before bot-ready)\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanupConnectListeners = () => {\n wsSession.off(\"connected\", onConnected);\n wsSession.off(\"error\", onError);\n wsSession.off(\"disconnected\", onDisconnected);\n };\n const settle = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanupConnectListeners();\n callback();\n };\n const onConnected = () => {\n settle(resolve);\n };\n const onError = (err: unknown) => {\n settle(() => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n };\n const onDisconnected = () => {\n settle(() => {\n reject(new Error(\"WebSocket disconnected before connect completed\"));\n });\n };\n wsSession.on(\"connected\", onConnected);\n wsSession.on(\"error\", onError);\n wsSession.on(\"disconnected\", onDisconnected);\n // connectWithUrl calls initDevices() then connect({ wsUrl }) — matches sandbox flow\n wsSession.connectWithUrl(wsUrl).catch((err: unknown) => {\n settle(() => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n });\n\n // For WebSocket, mic is already streaming after connect.\n // Only mute if the caller explicitly sets startWithAudioOn: false.\n // Defaulting to on matches the sandbox behavior and ensures the bot\n // sees audio when it initializes (avoids server \"tap mic to talk\" prompt).\n if (configWithDefaults.startWithAudioOn === false) {\n this._wsSession.enableMic(false);\n this._audioManager.syncWsAudioState(false);\n } else {\n this._audioManager.syncWsAudioState(true);\n }\n\n if (\n webSocketVisionEnabled &&\n configWithDefaults.enableVideo &&\n configWithDefaults.startWithVideoOn\n ) {\n await this._videoManager.enableVideo();\n }\n } else {\n this._videoManager.setWebSocketVisionMessageSender(null);\n // ── LiveKit transport path (default) ─────────────────────────────\n await this._room.connect(\n connectionData.room_url,\n connectionData.token!,\n {\n rtcConfig: {\n // Defaults to \"relay\" (TURN-only) for reliable NAT traversal\n // against Convai's hosted LiveKit. Set iceTransportPolicy: \"all\"\n // when pointing at a LiveKit without TURN (e.g. local dev).\n iceTransportPolicy:\n configWithDefaults.iceTransportPolicy ?? \"relay\",\n },\n },\n );\n\n if (configWithDefaults.startWithAudioOn) {\n await this._room.localParticipant.setMicrophoneEnabled(true, {\n echoCancellation: this._audioSettings.echoCancellation,\n noiseSuppression: this._audioSettings.noiseSuppression,\n autoGainControl: this._audioSettings.autoGainControl,\n sampleRate: this._audioSettings.sampleRate,\n channelCount: this._audioSettings.channelCount,\n });\n }\n\n if (\n configWithDefaults.enableVideo &&\n configWithDefaults.startWithVideoOn\n ) {\n await this._room.localParticipant.setCameraEnabled(true);\n }\n\n this._audioManager.syncStateFromRoom({ emit: true });\n this._participantSid = this._room.localParticipant.sid;\n }\n\n // Apply custom mapper to blendshape queue if provided\n if (configWithDefaults.blendshapeConfig?.customMapper) {\n this.blendshapeQueue.setMapper(\n configWithDefaults.blendshapeConfig.customMapper,\n );\n }\n\n this.updateState({\n isConnected: true,\n isConnecting: false,\n endUserId: this._endUserId,\n endUserMetadata: this._endUserMetadata,\n });\n\n // Initialize memory manager if we have authentication and endUserId\n if (this._endUserId) {\n if (this._apiKey) {\n // Use API key authentication\n this._memoryManager = new MemoryManager(\n this._apiKey,\n this._characterId!,\n this._endUserId,\n undefined, // Use default base URL\n false, // Use as API key\n );\n } else if (this._authToken) {\n // Use auth token authentication\n this._memoryManager = new MemoryManager(\n this._authToken,\n this._characterId!,\n this._endUserId,\n undefined, // Use default base URL\n true, // Use as auth token\n );\n }\n }\n\n this.emit(\"connect\");\n\n this._startClientReadyHandshake();\n }\n\n private async cleanupWebSocketSessionAfterConnectFailure(): Promise<void> {\n if (this._activeTransport !== \"websocket\" || !this._wsSession) {\n return;\n }\n\n this._isDisconnecting = true;\n try {\n await this._wsSession.disconnect();\n } catch {\n // ignore cleanup errors while preserving the original connect failure\n } finally {\n this._isDisconnecting = false;\n }\n this.clearAllManagers();\n }\n\n /**\n * RTVI client-ready handshake. Server-side gates bot-ready emission on\n * receipt of client-ready (and re-emits bot-ready on every client-ready),\n * so we can retry until we hear bot-ready back. Closes the race where the\n * bot publishes bot-ready before the client data-channel is subscribed.\n */\n private _startClientReadyHandshake(): void {\n // RTVI client-ready handshake is LiveKit-only. WebSocket transport\n // uses its own pipecat ready signalling.\n if (this._activeTransport !== \"livekit\") {\n return;\n }\n this._stopClientReadyHandshake();\n this._clientReadyMsgId =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `client-ready-${Date.now()}-${Math.random()}`;\n\n const send = () => {\n if (this._isBotReady) return;\n if (!this._room || this._room.state !== \"connected\") return;\n try {\n const msg = {\n id: this._clientReadyMsgId,\n label: \"rtvi-ai\",\n type: \"client-ready\",\n data: {\n version: \"1.0.0\",\n about: { library: \"convai-web-sdk\" },\n },\n };\n const encoded = new TextEncoder().encode(JSON.stringify(msg));\n this._room.localParticipant.publishData(encoded, { reliable: true });\n } catch {\n // swallow; next retry will try again\n }\n this._clientReadyRetryTimer = setTimeout(\n send,\n ConvaiClient.CLIENT_READY_RETRY_MS,\n );\n };\n\n send();\n\n this._clientReadyTimeoutTimer = setTimeout(() => {\n if (this._isBotReady) return;\n this._stopClientReadyHandshake();\n const err = new Error(\n `bot-ready not received within ${ConvaiClient.CLIENT_READY_TIMEOUT_MS}ms`,\n );\n this.emit(\"error\", err);\n }, ConvaiClient.CLIENT_READY_TIMEOUT_MS);\n }\n\n private _stopClientReadyHandshake(): void {\n if (this._clientReadyRetryTimer) {\n clearTimeout(this._clientReadyRetryTimer);\n this._clientReadyRetryTimer = null;\n }\n if (this._clientReadyTimeoutTimer) {\n clearTimeout(this._clientReadyTimeoutTimer);\n this._clientReadyTimeoutTimer = null;\n }\n }\n\n /**\n * Disconnect from the current character session\n */\n async disconnect(): Promise<void> {\n this._stopClientReadyHandshake();\n if (this._activeTransport === \"websocket\" && this._wsSession) {\n this._isDisconnecting = true;\n try {\n await this._wsSession.disconnect();\n } catch {\n // ignore disconnect errors\n } finally {\n this._isDisconnecting = false;\n }\n this._wsSession = null;\n this._connectionStateHandler.handleDisconnected(\n DisconnectReasonEnum.CLIENT_INITIATED as DisconnectReason,\n );\n this.clearAllManagers();\n } else if (this._room && this._room.state !== \"disconnected\") {\n try {\n await this._room.disconnect();\n this._connectionStateHandler.resetConnectionState();\n this.clearAllManagers();\n } catch (error) {\n // Handle disconnect errors gracefully\n this._connectionStateHandler.resetConnectionState();\n this.clearAllManagers();\n }\n }\n }\n\n /**\n * Clear all manager states\n */\n private clearAllManagers(): void {\n this._connectionType = null;\n this._activeTransport = null;\n this._wsSession = null;\n this._apiKey = null;\n this._authToken = null;\n this._characterId = null;\n this._endUserId = null;\n this._endUserMetadata = null;\n this._memoryManager = null; // Clear memory manager on disconnect\n this._audioManager.setWebSocketSession(null);\n this._audioManager.reset();\n this._videoManager.setWebSocketVisionMessageSender(null);\n this._videoManager.reset();\n this._screenShareManager.reset();\n }\n\n /**\n * Reconnect - disconnect and connect again using stored config\n */\n async reconnect(): Promise<void> {\n if (!this._storedConfig) {\n throw new Error(\"No stored config available for reconnection\");\n }\n await this.connect(this._storedConfig);\n }\n\n /**\n * Reset the session ID to start a new conversation\n */\n resetSession(): void {\n this._characterSessionId = \"-1\";\n this._messageHandler.reset();\n // Clear metrics and disconnect reason when resetting session\n this.updateState({ metrics: [], disconnectReason: null });\n }\n\n /**\n * Send a text message to the character\n */\n sendUserTextMessage(text: string): void {\n if (!this.isTransportReady()) return;\n if (!text || !text.trim()) return;\n\n try {\n // Reset blendshape queue if mid-conversation, but don't interrupt the server\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n // Start new conversation session\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n\n // Emit conversation start event\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage: text.trim(),\n timestamp: this._conversationStartTime,\n });\n\n this.publishMessage(\"user_text_message\", {\n text: text.trim(),\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Send a trigger message to invoke specific character actions\n */\n sendTriggerMessage(triggerName?: string, triggerMessage?: string): void {\n if (!this.isTransportReady()) return;\n\n // Reset blendshape queue if mid-conversation, but don't interrupt the server\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage: `[trigger:${triggerName ?? \"\"}]`,\n timestamp: this._conversationStartTime,\n });\n\n this.publishMessage(\"trigger-message\", {\n ...(triggerName && { trigger_name: triggerName }),\n ...(triggerMessage && { trigger_message: triggerMessage }),\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * If the bot is currently speaking or a conversation is active, send an\n * interrupt to the server and end the blendshape conversation so the queue\n * is clean before a new response starts arriving.\n */\n private endCurrentConversationIfActive(): void {\n const queueActive =\n this.blendshapeQueue.isConversationActive() ||\n this.blendshapeQueue.hasBufferedFrames();\n const botSpeaking = this._state.isSpeaking;\n\n if (!queueActive && !botSpeaking) return;\n\n if (this.isTransportReady()) {\n this.publishMessage(\"interrupt-bot\", {\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n // End the blendshape queue so the lipsync player finishes cleanly\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n private startTrackedConversation(userMessage: string): void {\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage,\n timestamp: this._conversationStartTime,\n });\n }\n\n /**\n * Send an interrupt message to stop the bot's current response\n */\n sendInterruptMessage(): void {\n if (!this.isTransportReady()) return;\n\n try {\n this.publishMessage(\"interrupt-bot\", {\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n\n // Stop local lipsync immediately for every transport. WebSocket can also\n // buffer ahead-delivered frames, and waiting for a server cancel leaves\n // stale mouth animation visible after the audio stop.\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Replace the Narrative Design template keys on the live session.\n * Same key map as the `narrativeTemplateKeys` config option; full replace,\n * not a merge. Requires Narrative Design enabled on the character.\n */\n updateTemplateKeys(templateKeys: { [key: string]: string }): void {\n if (!this.isTransportReady() || Object.keys(templateKeys).length === 0)\n return;\n\n this.publishMessage(\"update-template-keys\", {\n template_keys: templateKeys,\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * Update dynamic information about the current context\n */\n updateDynamicInfo(dynamicInfo: DynamicInfo): void {\n if (!this.isTransportReady() || !dynamicInfo?.trim()) return;\n\n this.publishMessage(\"update-dynamic-info\", {\n dynamic_info: { text: dynamicInfo },\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * Update the bot's temporary runtime context in a unified way.\n * Provides flexible control over ephemeral context management.\n *\n * @param options - Context update configuration\n *\n * @example\n * ```typescript\n * // Append to existing context\n * client.updateContext({\n * text: \"User completed dragon quest\",\n * mode: \"append\",\n * run_llm: \"false\"\n * });\n *\n * // Replace entire context\n * client.updateContext({\n * text: \"New game state: level 5\",\n * mode: \"replace\",\n * run_llm: \"auto\"\n * });\n *\n * // Clear context\n * client.updateContext({ mode: \"reset\" });\n * ```\n */\n updateContext(options: ContextUpdateOptions): void {\n if (!this.isTransportReady()) return;\n\n const hasText = !!options.text?.trim();\n const hasAttention = options.current_attention_object !== undefined;\n\n // text is required unless mode is \"reset\" or only updating attention\n if (options.mode !== \"reset\" && !hasText && !hasAttention) {\n console.warn(\n \"[ConvaiClient] updateContext: text or current_attention_object is required unless mode is 'reset'\",\n );\n return;\n }\n\n // Only guaranteed-response updates should preempt active local lipsync.\n // Server-scheduled auto/silent updates may be downgraded while the bot is\n // speaking, so clearing the local queue here can stop lipsync while audio\n // continues.\n const shouldPreemptLipsync = shouldPreemptForContextUpdateResponse(options);\n if (shouldPreemptLipsync) {\n this.startTrackedConversation(\n `[context-update:${options.mode ?? \"append\"}]`,\n );\n }\n\n this.publishMessage(\"context-update\", {\n ...(hasText && { text: options.text!.trim() }),\n ...(options.mode && { mode: options.mode }),\n ...(options.run_llm && { run_llm: options.run_llm }),\n ...(options.respond_mode && { respond_mode: options.respond_mode }),\n ...(hasAttention && { current_attention_object: options.current_attention_object }),\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n visionStatus(options: VisionStatusOptions = {}): string | null {\n if (!this.isTransportReady()) return null;\n const updateId = options.updateId ?? this.createUpdateId(\"vision-status\");\n this.publishMessage(\"vision-status\", {\n update_id: updateId,\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n return updateId;\n }\n\n visionTrigger(options: VisionTriggerOptions = {}): string | null {\n if (!this.isTransportReady()) return null;\n const updateId = options.updateId ?? this.createUpdateId(\"vision-trigger\");\n const respondMode = options.respondMode;\n if (shouldPreemptForExplicitRespondMode(respondMode)) {\n this.startTrackedConversation(`[vision-trigger:${respondMode}]`);\n }\n this.publishMessage(\"vision-trigger\", {\n update_id: updateId,\n ...(options.text && { text: options.text }),\n ...(respondMode && { respond_mode: respondMode }),\n ...(options.frameIndices && { frame_indices: options.frameIndices }),\n ...(options.frameIds && { frame_ids: options.frameIds }),\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n return updateId;\n }\n\n respondModeUpdate(options: RespondModeUpdateOptions): string | null {\n if (!this.isTransportReady()) return null;\n const updateId = options.updateId ?? this.createUpdateId(\"respond-mode\");\n this.publishMessage(\"respond-mode-update\", {\n update_id: updateId,\n modality: options.modality,\n mode: options.mode,\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n return updateId;\n }\n\n /**\n * Set or clear the character's temporary state of mind.\n * This is silent: it affects the next response and does not trigger one.\n */\n updateEmotion(stateOfMind: string | null): void {\n const normalized = normalizeStateOfMind(stateOfMind) ?? null;\n\n this._stateOfMind = normalized;\n if (this._storedConfig) {\n this._storedConfig = { ...this._storedConfig, stateOfMind: normalized };\n }\n\n if (!this.isTransportReady()) return;\n\n this.publishMessage(\"update-emotion\", {\n state_of_mind: normalized,\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * Send descriptive scene updates. Use when environment description changes\n * and the bot should know what is visible or nearby. Does not modify action_config.\n */\n updateSceneMetadata(\n items: Array<{ name: string; description: string }>,\n options: UpdateSceneMetadataOptions = {},\n ): void {\n if (!this.isTransportReady()) return;\n if (shouldPreemptForExplicitRespondMode(options.respondMode)) {\n this.startTrackedConversation(\n `[scene-metadata:${options.respondMode}]`,\n );\n }\n this.publishMessage(\"update-scene-metadata\", {\n scene_metadata: items,\n ...(options.respondMode && { respond_mode: options.respondMode }),\n });\n }\n\n private createUpdateId(prefix: string): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}:${crypto.randomUUID()}`;\n }\n return `${prefix}:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n }\n\n private serializeRespondModes(config: RespondModesConfig): Record<string, unknown> {\n return {\n ...(config.text !== undefined && { text: config.text }),\n ...(config.audio !== undefined && { audio: config.audio }),\n ...(config.vision !== undefined && { vision: config.vision }),\n ...(config.contextUpdate !== undefined && {\n context_update: config.contextUpdate,\n }),\n ...(config.trigger !== undefined && { trigger: config.trigger }),\n ...(config.sceneMetadata !== undefined && {\n scene_metadata: config.sceneMetadata,\n }),\n };\n }\n\n /**\n * Upload a file to the character via the LiveKit byte stream transport.\n * Only works when connected with the LiveKit transport.\n *\n * @throws if not connected or if the LiveKit room is unavailable\n */\n async uploadFile(file: File, options: UploadFileOptions = {}): Promise<void> {\n if (!this._room?.localParticipant) {\n throw new Error(\"[ConvaiClient] uploadFile: not connected to a LiveKit room\");\n }\n\n const { topic = \"file-upload\", onProgress } = options;\n\n await this._room.localParticipant.sendFile(file, {\n topic,\n mimeType: file.type,\n ...(onProgress && {\n onProgress: (raw: number) => onProgress(Math.ceil(raw * 100)),\n }),\n });\n }\n\n /**\n * Toggle text-to-speech on or off\n */\n toggleTts(enabled: boolean): void {\n if (!this.isTransportReady()) return;\n this.publishMessage(\"tts-toggle\", { enabled });\n }\n\n /**\n * Toggle speech-to-text on or off\n */\n toggleStt(enabled: boolean): void {\n if (!this.isTransportReady()) return;\n this.publishMessage(\"stt-toggle\", { muted: !enabled });\n }\n\n /**\n * Reset the server-side idle timer.\n * Call this on any user activity (clicks, UI interactions, etc.) to prevent\n * the session from being disconnected due to inactivity.\n */\n resetIdleTimer(): void {\n if (!this.isTransportReady()) return;\n this.publishMessage(\"reset-idle-timer\", {\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ConvaiClient.js","sourceRoot":"","sources":["../../src/core/ConvaiClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Room,\n RoomEvent,\n ConnectionState,\n DisconnectReason,\n DefaultReconnectPolicy,\n setLogLevel,\n} from \"livekit-client\";\n\nsetLogLevel(\"warn\");\nimport {\n ConvaiConfig,\n ConvaiClientState,\n ChatMessage,\n AudioSettings,\n IConvaiClient,\n AudioControls,\n VideoControls,\n ScreenShareControls,\n DynamicInfo,\n ContextUpdateOptions,\n UploadFileOptions,\n ServerResponse,\n InteractionCreated,\n IWebSocketSession,\n WebSocketSessionFactory,\n RespondModeUpdateOptions,\n RespondModesConfig,\n UpdateSceneMetadataOptions,\n VisionStatusOptions,\n VisionTriggerOptions,\n DisconnectReasonEnum,\n ActionResponseEvent,\n ConnectionData,\n SendUserTextMessageOptions,\n} from \"./types\";\nimport { AudioManager } from \"./AudioManager\";\nimport { VideoManager } from \"./VideoManager\";\nimport { ScreenShareManager } from \"./ScreenShareManager\";\nimport { MessageHandler } from \"./MessageHandler\";\nimport { SDK_VERSION } from \"../version\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { BlendshapeQueue } from \"./BlendshapeQueue\";\nimport { MemoryManager } from \"./MemoryManager\";\nimport { ConnectionStateHandler } from \"./ConnectionStateHandler\";\nimport {\n buildActionConnectConfig,\n buildBlendshapeConnectConfig,\n buildEmotionConnectConfig,\n} from \"./connectRequest\";\nimport {\n shouldPreemptForContextUpdateResponse,\n shouldPreemptForExplicitRespondMode,\n} from \"./contextUpdateRequest\";\nimport {\n resolveVisionInputConfig,\n serializeVisionInputConfig,\n} from \"./visionRequest\";\nimport { SSESession } from \"./SSESession\";\nimport { isValidLogicalTurnId } from \"./logicalTurn\";\n\n// Module-level registry — populated by importing @convai/web-sdk/vanilla/websocket\nlet _wsFactory: WebSocketSessionFactory | null = null;\n\nfunction normalizeStateOfMind(value: string | null | undefined): string | null | undefined {\n if (value == null) return value;\n const normalized = value.trim().toLowerCase();\n return normalized === \"neutral\" || normalized === \"\" ? null : normalized;\n}\n\n/**\n * Custom reconnect policy that disables automatic reconnection\n */\nclass NoReconnectPolicy extends DefaultReconnectPolicy {\n nextRetryDelayInMs(): number | null {\n return null; // Always return null to prevent any reconnection attempts\n }\n}\n\n/**\n * Main Convai client class for managing AI voice assistant connections\n * Provides complete interface for connecting to Convai's voice assistants,\n * managing real-time audio/video conversations, and handling messages.\n *\n * @example\n * ```typescript\n * import { ConvaiClient } from '@convai/web-sdk/core';\n *\n * // Recommended: Pass config to constructor\n * const client = new ConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * endUserId: 'user-uuid', // Optional: enables memory & analytics\n * enableVideo: true,\n * });\n *\n * // Listen for state changes\n * client.on('stateChange', (state) => {\n * console.log('State:', state);\n * });\n *\n * // Connect (uses stored config from constructor)\n * await client.connect();\n *\n * // Send a message\n * client.sendUserTextMessage('Hello!');\n *\n * // Advanced: Override config or connect without constructor config\n * await client.connect({ apiKey: 'different-key', characterId: 'different-id' });\n *\n * // Disconnect and reconnect\n * await client.disconnect();\n * await client.reconnect();\n * ```\n */\nexport class ConvaiClient extends EventEmitter implements IConvaiClient {\n private _room: Room;\n private _state: ConvaiClientState;\n private _connectionType: \"audio\" | \"video\" | null = null;\n private _apiKey: string | null = null;\n private _authToken: string | null = null;\n private _characterId: string | null = null;\n private _characterSessionId: string | null = \"-1\";\n private _isBotReady: boolean = false;\n private _participantSid: string = \"\";\n private _audioSettings: AudioSettings;\n private _storedConfig: ConvaiConfig | null = null;\n /**\n * Runtime state of mind. Source of truth for the value sent on connect,\n * so updateEmotion() called before any config is stored is not lost.\n */\n private _stateOfMind: string | null = null;\n private _endUserId: string | null = null;\n private _endUserMetadata: Record<string, unknown> | null = null;\n private _wsSession: IWebSocketSession | null = null;\n private _activeTransport: \"livekit\" | \"websocket\" | \"sse\" | null = null;\n private _sseSession: SSESession | null = null;\n private _logRtviMessages: boolean = true;\n private _isDisconnecting: boolean = false;\n\n // RTVI client-ready handshake (race-proof bot-ready delivery)\n private _clientReadyRetryTimer: ReturnType<typeof setTimeout> | null = null;\n private _clientReadyTimeoutTimer: ReturnType<typeof setTimeout> | null = null;\n private _clientReadyMsgId: string | null = null;\n private static readonly CLIENT_READY_RETRY_MS = 500;\n private static readonly CLIENT_READY_TIMEOUT_MS = 45_000;\n\n /**\n * Register the WebSocket transport factory. Called automatically as a side-effect\n * when you import `@convai/web-sdk/vanilla/websocket` (or the react equivalent).\n * Only needed when using `transport: \"websocket\"` in ConvaiConfig.\n */\n static registerWebSocketTransport(factory: WebSocketSessionFactory): void {\n _wsFactory = factory;\n }\n\n // Managers\n private _audioManager: AudioManager;\n private _videoManager: VideoManager;\n private _screenShareManager: ScreenShareManager;\n private _messageHandler: MessageHandler;\n private _connectionStateHandler: ConnectionStateHandler;\n\n // Conversation session tracking\n private _conversationSessionId: number = 0;\n private _conversationStartTime: number = 0;\n\n // Memory manager instance\n private _memoryManager: MemoryManager | null = null;\n\n constructor(config?: ConvaiConfig) {\n super();\n\n // Store config if provided\n if (config) {\n this._storedConfig = config;\n this._logRtviMessages = config.logRtviMessages !== false;\n }\n\n // Initialize room with no reconnect policy\n this._room = new Room({\n reconnectPolicy: new NoReconnectPolicy(),\n });\n\n // Initialize state\n this._state = {\n isConnected: false,\n isConnecting: false,\n isListening: false,\n isThinking: false,\n isSpeaking: false,\n agentState: \"disconnected\",\n emotion: null,\n endUserId: null,\n endUserMetadata: null,\n metrics: [],\n disconnectReason: null,\n };\n\n // Default audio settings for optimal interruption handling\n this._audioSettings = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n sampleRate: 48000,\n channelCount: 1,\n };\n\n // Initialize managers\n this._audioManager = new AudioManager(this._room);\n this._videoManager = new VideoManager(this._room);\n this._screenShareManager = new ScreenShareManager(this._room);\n this._messageHandler = new MessageHandler(this._room);\n this._messageHandler.setRtviMessageLogging(this._logRtviMessages);\n this._connectionStateHandler = new ConnectionStateHandler(\n this.updateState.bind(this),\n (ready) => (this._isBotReady = ready),\n () => {\n this._messageHandler.reset();\n this._endUserId = null;\n this._endUserMetadata = null;\n },\n (reason) => this.emit(\"disconnect\", reason),\n );\n\n // Setup event listeners\n this.setupEventListeners();\n\n // Connect MessageHandler to conversation start events\n this.setupMessageHandlerEvents();\n }\n\n // Getters\n get state(): ConvaiClientState {\n return { ...this._state };\n }\n\n get connectionType(): \"audio\" | \"video\" | null {\n return this._connectionType;\n }\n\n get apiKey(): string | null {\n return this._apiKey;\n }\n\n get authToken(): string | null {\n return this._authToken;\n }\n\n get characterId(): string | null {\n return this._characterId;\n }\n\n get room(): Room {\n return this._room;\n }\n\n get chatMessages(): ChatMessage[] {\n return this._messageHandler.getChatMessages();\n }\n\n get userTranscription(): string {\n return this._messageHandler.getUserTranscription();\n }\n\n get characterSessionId(): string | null {\n return this._characterSessionId;\n }\n\n get isBotReady(): boolean {\n return this._isBotReady;\n }\n\n get audioControls(): AudioControls {\n return this._audioManager;\n }\n\n get videoControls(): VideoControls {\n return this._videoManager;\n }\n\n get screenShareControls(): ScreenShareControls {\n return this._screenShareManager;\n }\n\n get blendshapeQueue(): BlendshapeQueue {\n return this._messageHandler.getBlendshapeQueue();\n }\n\n get conversationSessionId(): number {\n return this._conversationSessionId;\n }\n\n get memoryManager(): MemoryManager | null {\n return this._memoryManager;\n }\n\n /**\n * Setup event listeners for room and managers\n */\n private setupEventListeners(): void {\n // Room event listeners\n this._room.on(RoomEvent.Disconnected, (reason?: DisconnectReason) => {\n this._connectionStateHandler.handleDisconnected(reason);\n });\n this._room.on(\n RoomEvent.ConnectionStateChanged,\n this._connectionStateHandler.handleConnectionStateChanged.bind(\n this._connectionStateHandler,\n ),\n );\n\n // Message handler events\n this._messageHandler.on(\"botReady\", () => {\n // Server may send multiple bot-ready frames (one per client-ready\n // we retried). Only surface the first to consumers per connect.\n if (this._isBotReady) {\n return;\n }\n this._isBotReady = true;\n this._stopClientReadyHandshake();\n this.updateState({ isConnected: true });\n this.emit(\"botReady\");\n });\n\n this._messageHandler.on(\"messagesChange\", (messages: ChatMessage[]) => {\n this.emit(\"message\", messages[messages.length - 1]);\n this.emit(\"messagesChange\", messages);\n });\n\n this._messageHandler.on(\n \"userTranscriptionChange\",\n (transcription: string) => {\n this.emit(\"userTranscriptionChange\", transcription);\n },\n );\n\n this._messageHandler.on(\"speakingChange\", (isSpeaking: boolean) => {\n this.updateState({ isSpeaking });\n this.emit(\"speakingChange\", isSpeaking);\n\n if (!isSpeaking && this._conversationSessionId > 0) {\n // Bot stopped speaking - turn end signal (same semantics as BlendshapeQueue.hasReceivedEndSignal())\n const duration = (\n (Date.now() - this._conversationStartTime) /\n 1000\n ).toFixed(2);\n\n this.emit(\"turnEnd\", {\n sessionId: this._conversationSessionId,\n duration: parseFloat(duration),\n timestamp: Date.now(),\n });\n }\n });\n\n this._messageHandler.on(\"botRespondingChange\", (isResponding: boolean) => {\n this.updateState({ isThinking: isResponding });\n });\n\n this._messageHandler.on(\n \"emotionChange\",\n (emotion: { emotion: string; scale?: number } | null) => {\n this.updateState({ emotion });\n this.emit(\"emotionChange\", emotion);\n },\n );\n\n this._messageHandler.on(\"listeningChange\", (isListening: boolean) => {\n const wasListening = this._state.isListening;\n this.updateState({ isListening });\n\n // Voice input path — activate the blendshape queue as soon as the user\n // starts speaking (user-started-speaking) so conversationActive is true\n // immediately, matching the text-input path where it's true on send.\n if (!wasListening && isListening) {\n // Reset blendshape queue if mid-conversation, but don't interrupt the server\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage: \"[voice]\",\n timestamp: this._conversationStartTime,\n });\n }\n });\n\n // Handle metrics events\n this._messageHandler.on(\"metrics\", (metricsData: any) => {\n const newMetrics = [\n ...this._state.metrics,\n {\n id: `metrics-${Date.now()}-${Math.random()}`,\n data: metricsData,\n timestamp: new Date().toISOString(),\n },\n ];\n this.updateState({ metrics: newMetrics });\n this.emit(\"metrics\", metricsData);\n });\n\n // Forward blendshapes events\n this._messageHandler.on(\"blendshapes\", (data: unknown) => {\n this.emit(\"blendshapes\", data);\n });\n\n // Forward blendshape stats event (conversation end marker)\n this._messageHandler.on(\"blendshapeStatsReceived\", (stats: unknown) => {\n this.emit(\"blendshapeStatsReceived\", stats);\n });\n\n // Forward blendshape cancel event (owner-scoped visual hard stop)\n this._messageHandler.on(\"blendshapeCancel\", (data: unknown) => {\n this.emit(\"blendshapeCancel\", data);\n });\n\n // Forward idle warning event\n this._messageHandler.on(\n \"idleWarning\",\n (data: { remainingSeconds: number | null }) => {\n this.emit(\"idleWarning\", data);\n },\n );\n\n // Forward LLM no-response event\n this._messageHandler.on(\"llmNoResponse\", () => {\n this.emit(\"llmNoResponse\");\n });\n\n // Forward bot-output event (aggregated output with spoken status)\n this._messageHandler.on(\n \"botOutput\",\n (data: { text: string; spoken: boolean; aggregatedBy: string }) => {\n this.emit(\"botOutput\", data);\n },\n );\n\n // Forward bot TTS text (word-by-word as spoken)\n this._messageHandler.on(\"botTtsText\", (data: { text: string }) => {\n this.emit(\"botTtsText\", data);\n });\n\n // Forward bot TTS lifecycle events\n this._messageHandler.on(\"botTtsStarted\", () => {\n this.emit(\"botTtsStarted\");\n });\n\n this._messageHandler.on(\"botTtsStopped\", () => {\n this.emit(\"botTtsStopped\");\n });\n\n // Forward server-side muting events\n this._messageHandler.on(\"userMuteStarted\", () => {\n this.emit(\"userMuteStarted\");\n });\n\n this._messageHandler.on(\"userMuteStopped\", () => {\n this.emit(\"userMuteStopped\");\n });\n\n this._messageHandler.on(\"actionResponse\", (data: ActionResponseEvent) => {\n this.emit(\"actionResponse\", data);\n });\n\n this._messageHandler.on(\"serverResponse\", (response: ServerResponse) => {\n this.emit(\"serverResponse\", response);\n });\n\n this._messageHandler.on(\"interactionCreated\", (data: InteractionCreated) => {\n this.emit(\"interactionCreated\", data);\n });\n }\n\n /**\n * Setup MessageHandler to respond to conversation start events\n * This ensures the BlendshapeQueue starts accepting frames when user sends a message,\n * rather than waiting for bot-started-speaking (which would cause early frames to be dropped)\n */\n private setupMessageHandlerEvents(): void {\n this.on(\n \"conversationStart\",\n (data: { sessionId: number; userMessage: string; timestamp: number }) => {\n this._messageHandler.getBlendshapeQueue().startConversation();\n },\n );\n }\n\n /**\n * Update state and emit changes\n */\n private updateState(updates: Partial<ConvaiClientState>): void {\n const oldState = { ...this._state };\n this._state = { ...this._state, ...updates };\n\n // Update agentState: speaking (highest) > listening (user speaking) > thinking > connected\n if (!this._state.isConnected) {\n this._state.agentState = \"disconnected\";\n } else if (this._state.isSpeaking) {\n this._state.agentState = \"speaking\";\n } else if (this._state.isListening) {\n this._state.agentState = \"listening\";\n } else if (this._state.isThinking) {\n this._state.agentState = \"thinking\";\n } else {\n this._state.agentState = \"connected\";\n }\n\n // Emit state change if changed\n if (JSON.stringify(oldState) !== JSON.stringify(this._state)) {\n this.emit(\"stateChange\", this._state);\n }\n }\n\n /**\n * Send a data message via the active transport.\n * For LiveKit: publishes via the data channel.\n * For WebSocket: sends via PipecatClient.sendClientMessage (wrapped in {t,d} envelope).\n */\n private publishMessage(type: string, data: unknown, id?: string): void {\n const message = id === undefined ? { type, data } : { type, id, data };\n\n if (this._activeTransport === \"sse\" && this._sseSession?.isConnected) {\n this._sseSession.sendMessage(type, data, id);\n return;\n }\n if (this._activeTransport === \"websocket\" && this._wsSession?.isConnected) {\n this._wsSession.sendMessage(type, data);\n } else if (\n this._room?.localParticipant &&\n this._room.state !== \"disconnected\"\n ) {\n const encodedData = new TextEncoder().encode(JSON.stringify(message));\n this._room.localParticipant.publishData(encodedData, { reliable: true });\n }\n }\n\n /**\n * Returns true when a message can be sent on the active transport.\n */\n private isTransportReady(): boolean {\n if (this._activeTransport === \"sse\") {\n return this._sseSession?.isConnected ?? false;\n }\n if (this._activeTransport === \"websocket\") {\n return this._wsSession?.isConnected ?? false;\n }\n return (\n !!this._room?.localParticipant && this._room.state !== \"disconnected\"\n );\n }\n\n /**\n * Connect to a Convai character\n */\n async connect(config?: ConvaiConfig): Promise<void> {\n // Use provided config or stored config\n const finalConfig = config || this._storedConfig;\n\n if (!finalConfig) {\n throw new Error(\n \"No configuration provided. Pass config to connect() or store it in the client\",\n );\n }\n\n // Store config for reconnection\n this._storedConfig = { ...finalConfig };\n\n // Use characterSessionId from config when reconnecting (so we resume the same session)\n if (\n finalConfig.characterSessionId &&\n finalConfig.characterSessionId !== \"-1\"\n ) {\n this._characterSessionId = finalConfig.characterSessionId;\n }\n\n const configWithDefaults = this.applyConfigDefaults(finalConfig);\n\n this.updateState({ isConnecting: true });\n\n try {\n // Store connection config\n this._apiKey = configWithDefaults.apiKey ?? null;\n this._authToken = configWithDefaults.authToken ?? null;\n this._characterId = configWithDefaults.characterId;\n\n // Determine connection type based on enableVideo\n const connType = configWithDefaults.enableVideo ? \"video\" : \"audio\";\n this._connectionType = connType;\n\n const transportType =\n configWithDefaults.transport ??\n (configWithDefaults.interactionApiUrl ? \"sse\" : \"livekit\");\n if (transportType === \"sse\" && !configWithDefaults.interactionApiUrl) {\n throw new Error(\n \"interactionApiUrl is required when using the SSE transport\",\n );\n }\n if (transportType === \"sse\" && configWithDefaults.enableVideo) {\n throw new Error(\"The SSE transport supports text interactions only\");\n }\n this._activeTransport = transportType;\n const effectiveVisionInputConfig =\n resolveVisionInputConfig(configWithDefaults);\n // An explicit stateOfMind in the config wins; otherwise carry whatever\n // updateEmotion() last set, including before the first connect.\n const stateOfMind =\n configWithDefaults.stateOfMind !== undefined\n ? normalizeStateOfMind(configWithDefaults.stateOfMind) ?? null\n : this._stateOfMind;\n this._stateOfMind = stateOfMind;\n\n if (transportType === \"sse\") {\n this._sseSession = new SSESession({\n interactionApiUrl: configWithDefaults.interactionApiUrl!,\n authorization: configWithDefaults.authToken ?? configWithDefaults.apiKey!,\n characterId: configWithDefaults.characterId,\n getCharacterSessionId: () => this._characterSessionId,\n takeStateOfMind: () => {\n const stateOfMind = this._stateOfMind;\n this._stateOfMind = null;\n if (this._storedConfig?.stateOfMind !== undefined) {\n this._storedConfig = { ...this._storedConfig, stateOfMind: null };\n }\n return stateOfMind;\n },\n onCharacterSessionId: (characterSessionId) => {\n this._characterSessionId = characterSessionId;\n this.emit(\"characterSessionId\", characterSessionId);\n this._storedConfig = {\n ...this._storedConfig!,\n characterSessionId,\n };\n },\n endUserId: configWithDefaults.endUserId,\n endUserMetadata: configWithDefaults.endUserMetadata,\n enableEmotion: configWithDefaults.enableEmotion,\n emotionConfig: configWithDefaults.emotionConfig,\n actionConfig: configWithDefaults.actionConfig,\n debug: configWithDefaults.debug,\n onMessage: (payload) =>\n this._messageHandler.handleDataReceivedPublic(payload),\n onError: (error) => this.emit(\"error\", error),\n });\n this._sseSession.connect();\n this._connectionType = \"audio\";\n this._isBotReady = true;\n this.updateState({\n isConnected: true,\n isConnecting: false,\n endUserId: configWithDefaults.endUserId ?? null,\n endUserMetadata: configWithDefaults.endUserMetadata ?? null,\n });\n this.emit(\"connect\");\n this.emit(\"botReady\");\n return;\n }\n\n // Prepare request body with required parameters\n const characterSessionIdToSend =\n configWithDefaults.characterSessionId ?? this._characterSessionId;\n const requestBody = {\n character_id: configWithDefaults.characterId,\n ...(stateOfMind ? { state_of_mind: stateOfMind } : {}),\n ...(configWithDefaults.endUserId && {\n end_user_id: configWithDefaults.endUserId,\n }),\n ...(configWithDefaults.endUserMetadata != null && {\n end_user_metadata: configWithDefaults.endUserMetadata,\n }),\n transport: transportType,\n connection_type: connType,\n ...buildBlendshapeConnectConfig(configWithDefaults),\n llm_provider: \"dynamic\",\n ...(buildEmotionConnectConfig(configWithDefaults) && {\n emotion_config: buildEmotionConnectConfig(configWithDefaults),\n }),\n default_tts_enabled:\n configWithDefaults.ttsEnabled !== undefined\n ? configWithDefaults.ttsEnabled\n : true,\n default_stt_enabled: true,\n ...(effectiveVisionInputConfig && {\n vision_input_config: serializeVisionInputConfig(\n effectiveVisionInputConfig,\n ),\n }),\n ...(configWithDefaults.respondModes && {\n respond_modes: this.serializeRespondModes(\n configWithDefaults.respondModes,\n ),\n }),\n ...(characterSessionIdToSend &&\n characterSessionIdToSend !== \"-1\" && {\n character_session_id: characterSessionIdToSend,\n }),\n ...(buildActionConnectConfig(configWithDefaults) && {\n action_config: buildActionConnectConfig(configWithDefaults),\n }),\n ...(configWithDefaults.dynamicInfo && {\n dynamic_info: {\n text: configWithDefaults.dynamicInfo,\n ...(configWithDefaults.keepInContext !== undefined && {\n keep_in_context: configWithDefaults.keepInContext,\n }),\n },\n }),\n ...(configWithDefaults.narrativeTemplateKeys &&\n Object.keys(configWithDefaults.narrativeTemplateKeys).length > 0 && {\n narrative_template_keys: configWithDefaults.narrativeTemplateKeys,\n }),\n ...(configWithDefaults.debug !== undefined && {\n debug: configWithDefaults.debug,\n }),\n invocation_metadata: {\n source: configWithDefaults.invocationMetadata?.source ?? \"web_sdk\",\n client_version:\n configWithDefaults.invocationMetadata?.clientVersion ??\n SDK_VERSION,\n ...(configWithDefaults.invocationMetadata?.extraMetadata && {\n extra_metadata: configWithDefaults.invocationMetadata.extraMetadata,\n }),\n },\n };\n\n const connectHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (configWithDefaults.authToken) {\n connectHeaders[\"API-AUTH-TOKEN\"] = configWithDefaults.authToken;\n } else if (configWithDefaults.apiKey) {\n connectHeaders[\"X-API-Key\"] = configWithDefaults.apiKey;\n }\n\n // HTTP POST /connect — same request for both transports\n const response = await fetch(`${configWithDefaults.url}/connect`, {\n method: \"POST\",\n headers: connectHeaders,\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorData = JSON.parse(errorText);\n const raw = errorData.message ?? errorData.error ?? errorData.detail;\n if (typeof raw === \"string\") {\n errorMessage = raw;\n } else if (Array.isArray(raw)) {\n // FastAPI/Pydantic 422 — detail is an array of validation error objects\n errorMessage = raw\n .map((e: { msg?: string; loc?: string[] }) =>\n [e.loc?.join(\".\"), e.msg].filter(Boolean).join(\": \")\n )\n .join(\"; \") || errorMessage;\n } else if (raw != null) {\n errorMessage = JSON.stringify(raw);\n } else if (errorText) {\n errorMessage = `${errorMessage}: ${errorText}`;\n }\n } catch {\n if (errorText) errorMessage = `${errorMessage}: ${errorText}`;\n }\n\n throw new Error(errorMessage);\n }\n\n const connectionData = await response.json();\n return await this.consumeConnectionData(connectionData, configWithDefaults);\n } catch (error) {\n await this.cleanupWebSocketSessionAfterConnectFailure();\n this.updateState({\n isConnected: false,\n isConnecting: false,\n });\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n /**\n * Complete a connection from an already-fetched /connect response body.\n *\n * `connect()` fetches /connect and then calls this internally. Call it\n * directly when the response was obtained elsewhere — a server-side session\n * manager, or the embed's connect-proxy flow, where the API key must never\n * reach the browser.\n *\n * @example\n * // Server (customer's backend): holds the API key, calls Convai's\n * // /connect, and relays the response body verbatim.\n * // Browser: never sees the API key, only the relayed response.\n * const data = await fetch('/api/convai-connect', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ characterId: 'your-character-id' }),\n * }).then(r => r.json())\n * await client.connectWithConnectionData(data)\n */\n async connectWithConnectionData(\n data: ConnectionData,\n config?: ConvaiConfig,\n ): Promise<void> {\n const finalConfig = config || this._storedConfig;\n if (!finalConfig) {\n throw new Error(\n \"No configuration provided. Pass config to connectWithConnectionData() or store it in the client\",\n );\n }\n this._storedConfig = { ...finalConfig };\n\n // Use characterSessionId from config when reconnecting (so we resume the same session)\n if (\n finalConfig.characterSessionId &&\n finalConfig.characterSessionId !== \"-1\"\n ) {\n this._characterSessionId = finalConfig.characterSessionId;\n }\n\n const configWithDefaults = this.applyConfigDefaults(finalConfig, {\n requireCredential: false,\n });\n\n // Symmetric with connect(): the catch below emits isConnecting: false, so\n // without this a UI bound to stateChange never sees a connecting state on\n // the proxy path -- and on failure receives a transition out of a state it\n // was never told about. consumeConnectionData() clears the flag on success.\n this.updateState({ isConnecting: true });\n\n try {\n return await this.consumeConnectionData(data, configWithDefaults);\n } catch (error) {\n await this.cleanupWebSocketSessionAfterConnectFailure();\n this.updateState({\n isConnected: false,\n isConnecting: false,\n });\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n /**\n * Add default URL, apply RTVI-logging config, and validate that either an\n * API key or auth token plus a character ID are present.\n * Shared by connect() and connectWithConnectionData() so both derive\n * `configWithDefaults` identically.\n *\n * `connect()` performs its own /connect fetch and always needs a credential\n * to do so, so it uses the default `requireCredential: true`.\n * `connectWithConnectionData()` consumes a response obtained elsewhere (e.g.\n * a proxy that holds the credential server-side) and passes\n * `requireCredential: false` — a character ID is still required either way.\n */\n private applyConfigDefaults(\n finalConfig: ConvaiConfig,\n opts: { requireCredential?: boolean } = {},\n ) {\n const { requireCredential = true } = opts;\n\n // Add default URL if not provided\n const configWithDefaults = {\n url: \"https://realtime-api.convai.com\",\n ...finalConfig,\n };\n\n this._logRtviMessages = configWithDefaults.logRtviMessages !== false;\n this._messageHandler.setRtviMessageLogging(this._logRtviMessages);\n\n const hasApiKey = Boolean(configWithDefaults.apiKey);\n const hasAuthToken = Boolean(configWithDefaults.authToken);\n const missingCredential =\n requireCredential && !hasApiKey && !hasAuthToken;\n if (missingCredential || !configWithDefaults.characterId) {\n throw new Error(\n \"Either apiKey or authToken is required, and characterId is required\",\n );\n }\n\n return configWithDefaults;\n }\n\n /**\n * Consume a /connect response and bring up the transport.\n * `connect()` calls this after its own fetch; external callers use it\n * when the response came from a proxy.\n */\n private async consumeConnectionData(\n connectionData: ConnectionData,\n configWithDefaults: ReturnType<ConvaiClient[\"applyConfigDefaults\"]>,\n ): Promise<void> {\n // Store connection config (mirrors connect()'s pre-fetch setup so this\n // method is self-sufficient when called directly, without connect()\n // having run first).\n //\n // Known race, judged acceptable: when called from connect(), that method\n // sets these same fields once, before the /connect fetch, then awaits\n // the network round trip. If disconnect() -> clearAllManagers() lands in\n // that await window, the pre-split code left these fields null (nothing\n // re-set them post-fetch), whereas re-deriving them here re-arms them\n // once the response arrives. Checked `_isDisconnecting` as a guard: it\n // doesn't cover this window — it's flipped back to false (in a\n // `finally`) before clearAllManagers() runs on the websocket path, and\n // disconnect()'s LiveKit-room path never sets it at all — so it can't\n // reliably detect \"a disconnect landed mid-connect\" here. Even\n // pre-split, connect() never checked for a concurrent disconnect after\n // the fetch resolved; it always went on to establish a new room/session\n // regardless. Re-arming these fields keeps them consistent with the\n // connection actually being brought up in that case, rather than\n // silently stale. Building a proper cancellation token for\n // connect()-vs-disconnect() races is out of scope for this additive\n // split.\n this._apiKey = configWithDefaults.apiKey ?? null;\n this._authToken = configWithDefaults.authToken ?? null;\n this._characterId = configWithDefaults.characterId;\n\n const connType = configWithDefaults.enableVideo ? \"video\" : \"audio\";\n this._connectionType = connType;\n\n const transportType = configWithDefaults.transport ?? \"livekit\";\n this._activeTransport = transportType;\n const effectiveVisionInputConfig =\n resolveVisionInputConfig(configWithDefaults);\n\n // Capture session identifiers from /connect response\n if (connectionData.character_session_id) {\n this._characterSessionId = connectionData.character_session_id;\n // Emitted here rather than in connect(), so the proxy-auth path\n // (connectWithConnectionData) surfaces the session id too -- both routes\n // establish it at exactly this point.\n this.emit(\"characterSessionId\", connectionData.character_session_id);\n this._storedConfig = {\n ...this._storedConfig!,\n characterSessionId: connectionData.character_session_id,\n };\n }\n if (connectionData.end_user_id) {\n this._endUserId = connectionData.end_user_id;\n }\n if (connectionData.end_user_metadata) {\n this._endUserMetadata = connectionData.end_user_metadata;\n }\n\n if (transportType === \"websocket\") {\n // ── WebSocket (Pipecat) transport path ────────────────────────────\n // Server returns the WebSocket URL in room_url (same field as LiveKit).\n const wsUrl = connectionData.room_url as string;\n if (!wsUrl) {\n throw new Error(\n \"No WebSocket URL returned from /connect endpoint (expected room_url)\",\n );\n }\n\n if (!_wsFactory) {\n throw new Error(\n \"[ConvaiClient] WebSocket transport is not registered. \" +\n \"Add `import '@convai/web-sdk/vanilla/websocket'` before calling connect().\",\n );\n }\n // Always enable mic at construction so WavMediaManager initializes the\n // audio stream during connect(). If startWithAudioOn is false, we mute\n // after the connection is established (enableMic(false) works once the\n // stream exists, but not before it is initialized).\n this._wsSession = _wsFactory(\n (payload) => this._messageHandler.handleDataReceivedPublic(payload),\n true,\n );\n const webSocketVisionEnabled =\n configWithDefaults.enableVideo === true &&\n effectiveVisionInputConfig?.enabled !== false;\n if (webSocketVisionEnabled) {\n this._videoManager.setWebSocketVisionMessageSender((type, data) => {\n if (\n this._activeTransport !== \"websocket\" ||\n !this._wsSession?.isConnected\n ) {\n return;\n }\n this._wsSession.sendMessage(type, data);\n });\n } else {\n this._videoManager.setWebSocketVisionDisabled();\n }\n\n const wsSession = this._wsSession;\n\n wsSession.on(\"botAudioTrack\", (track: MediaStreamTrack) => {\n this.emit(\"botAudioTrack\", track);\n });\n\n wsSession.on(\"disconnected\", () => {\n if (this._wsSession !== wsSession || this._isDisconnecting) {\n return;\n }\n this._connectionStateHandler.handleDisconnected();\n this.clearAllManagers();\n });\n\n this._audioManager.setWebSocketSession(this._wsSession);\n\n // Wait for WebSocket transport to connect (fires before bot-ready)\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n const cleanupConnectListeners = () => {\n wsSession.off(\"connected\", onConnected);\n wsSession.off(\"error\", onError);\n wsSession.off(\"disconnected\", onDisconnected);\n };\n const settle = (callback: () => void) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanupConnectListeners();\n callback();\n };\n const onConnected = () => {\n settle(resolve);\n };\n const onError = (err: unknown) => {\n settle(() => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n };\n const onDisconnected = () => {\n settle(() => {\n reject(new Error(\"WebSocket disconnected before connect completed\"));\n });\n };\n wsSession.on(\"connected\", onConnected);\n wsSession.on(\"error\", onError);\n wsSession.on(\"disconnected\", onDisconnected);\n // connectWithUrl calls initDevices() then connect({ wsUrl }) — matches sandbox flow\n wsSession.connectWithUrl(wsUrl).catch((err: unknown) => {\n settle(() => {\n reject(err instanceof Error ? err : new Error(String(err)));\n });\n });\n });\n\n // For WebSocket, mic is already streaming after connect.\n // Only mute if the caller explicitly sets startWithAudioOn: false.\n // Defaulting to on matches the sandbox behavior and ensures the bot\n // sees audio when it initializes (avoids server \"tap mic to talk\" prompt).\n if (configWithDefaults.startWithAudioOn === false) {\n this._wsSession.enableMic(false);\n this._audioManager.syncWsAudioState(false);\n } else {\n this._audioManager.syncWsAudioState(true);\n }\n\n if (\n webSocketVisionEnabled &&\n configWithDefaults.enableVideo &&\n configWithDefaults.startWithVideoOn\n ) {\n await this._videoManager.enableVideo();\n }\n } else {\n this._videoManager.setWebSocketVisionMessageSender(null);\n // ── LiveKit transport path (default) ─────────────────────────────\n await this._room.connect(\n connectionData.room_url,\n connectionData.token!,\n {\n rtcConfig: {\n // Defaults to \"relay\" (TURN-only) for reliable NAT traversal\n // against Convai's hosted LiveKit. Set iceTransportPolicy: \"all\"\n // when pointing at a LiveKit without TURN (e.g. local dev).\n iceTransportPolicy:\n configWithDefaults.iceTransportPolicy ?? \"relay\",\n },\n },\n );\n\n if (configWithDefaults.startWithAudioOn) {\n await this._room.localParticipant.setMicrophoneEnabled(true, {\n echoCancellation: this._audioSettings.echoCancellation,\n noiseSuppression: this._audioSettings.noiseSuppression,\n autoGainControl: this._audioSettings.autoGainControl,\n sampleRate: this._audioSettings.sampleRate,\n channelCount: this._audioSettings.channelCount,\n });\n }\n\n if (\n configWithDefaults.enableVideo &&\n configWithDefaults.startWithVideoOn\n ) {\n await this._room.localParticipant.setCameraEnabled(true);\n }\n\n this._audioManager.syncStateFromRoom({ emit: true });\n this._participantSid = this._room.localParticipant.sid;\n }\n\n // Apply custom mapper to blendshape queue if provided\n if (configWithDefaults.blendshapeConfig?.customMapper) {\n this.blendshapeQueue.setMapper(\n configWithDefaults.blendshapeConfig.customMapper,\n );\n }\n\n this.updateState({\n isConnected: true,\n isConnecting: false,\n endUserId: this._endUserId,\n endUserMetadata: this._endUserMetadata,\n });\n\n // Initialize memory manager if we have authentication and endUserId\n if (this._endUserId) {\n if (this._apiKey) {\n // Use API key authentication\n this._memoryManager = new MemoryManager(\n this._apiKey,\n this._characterId!,\n this._endUserId,\n undefined, // Use default base URL\n false, // Use as API key\n );\n } else if (this._authToken) {\n // Use auth token authentication\n this._memoryManager = new MemoryManager(\n this._authToken,\n this._characterId!,\n this._endUserId,\n undefined, // Use default base URL\n true, // Use as auth token\n );\n }\n }\n\n this.emit(\"connect\");\n\n this._startClientReadyHandshake();\n }\n\n private async cleanupWebSocketSessionAfterConnectFailure(): Promise<void> {\n if (this._activeTransport !== \"websocket\" || !this._wsSession) {\n return;\n }\n\n this._isDisconnecting = true;\n try {\n await this._wsSession.disconnect();\n } catch {\n // ignore cleanup errors while preserving the original connect failure\n } finally {\n this._isDisconnecting = false;\n }\n this.clearAllManagers();\n }\n\n /**\n * RTVI client-ready handshake. Server-side gates bot-ready emission on\n * receipt of client-ready (and re-emits bot-ready on every client-ready),\n * so we can retry until we hear bot-ready back. Closes the race where the\n * bot publishes bot-ready before the client data-channel is subscribed.\n */\n private _startClientReadyHandshake(): void {\n // RTVI client-ready handshake is LiveKit-only. WebSocket transport\n // uses its own pipecat ready signalling.\n if (this._activeTransport !== \"livekit\") {\n return;\n }\n this._stopClientReadyHandshake();\n this._clientReadyMsgId =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID()\n : `client-ready-${Date.now()}-${Math.random()}`;\n\n const send = () => {\n if (this._isBotReady) return;\n if (!this._room || this._room.state !== \"connected\") return;\n try {\n const msg = {\n id: this._clientReadyMsgId,\n label: \"rtvi-ai\",\n type: \"client-ready\",\n data: {\n version: \"1.0.0\",\n about: { library: \"convai-web-sdk\" },\n },\n };\n const encoded = new TextEncoder().encode(JSON.stringify(msg));\n this._room.localParticipant.publishData(encoded, { reliable: true });\n } catch {\n // swallow; next retry will try again\n }\n this._clientReadyRetryTimer = setTimeout(\n send,\n ConvaiClient.CLIENT_READY_RETRY_MS,\n );\n };\n\n send();\n\n this._clientReadyTimeoutTimer = setTimeout(() => {\n if (this._isBotReady) return;\n this._stopClientReadyHandshake();\n const err = new Error(\n `bot-ready not received within ${ConvaiClient.CLIENT_READY_TIMEOUT_MS}ms`,\n );\n this.emit(\"error\", err);\n }, ConvaiClient.CLIENT_READY_TIMEOUT_MS);\n }\n\n private _stopClientReadyHandshake(): void {\n if (this._clientReadyRetryTimer) {\n clearTimeout(this._clientReadyRetryTimer);\n this._clientReadyRetryTimer = null;\n }\n if (this._clientReadyTimeoutTimer) {\n clearTimeout(this._clientReadyTimeoutTimer);\n this._clientReadyTimeoutTimer = null;\n }\n }\n\n /**\n * Disconnect from the current character session\n */\n async disconnect(): Promise<void> {\n this._stopClientReadyHandshake();\n if (this._activeTransport === \"sse\" && this._sseSession) {\n await this._sseSession.disconnect();\n this._connectionStateHandler.resetConnectionState();\n this.clearAllManagers();\n } else if (this._activeTransport === \"websocket\" && this._wsSession) {\n this._isDisconnecting = true;\n try {\n await this._wsSession.disconnect();\n } catch {\n // ignore disconnect errors\n } finally {\n this._isDisconnecting = false;\n }\n this._wsSession = null;\n this._connectionStateHandler.handleDisconnected(\n DisconnectReasonEnum.CLIENT_INITIATED as DisconnectReason,\n );\n this.clearAllManagers();\n } else if (this._room && this._room.state !== \"disconnected\") {\n try {\n await this._room.disconnect();\n this._connectionStateHandler.resetConnectionState();\n this.clearAllManagers();\n } catch (error) {\n // Handle disconnect errors gracefully\n this._connectionStateHandler.resetConnectionState();\n this.clearAllManagers();\n }\n }\n }\n\n /**\n * Clear all manager states\n */\n private clearAllManagers(): void {\n this._connectionType = null;\n this._activeTransport = null;\n this._wsSession = null;\n this._sseSession = null;\n this._apiKey = null;\n this._authToken = null;\n this._characterId = null;\n this._endUserId = null;\n this._endUserMetadata = null;\n this._memoryManager = null; // Clear memory manager on disconnect\n this._audioManager.setWebSocketSession(null);\n this._audioManager.reset();\n this._videoManager.setWebSocketVisionMessageSender(null);\n this._videoManager.reset();\n this._screenShareManager.reset();\n }\n\n /**\n * Reconnect - disconnect and connect again using stored config\n */\n async reconnect(): Promise<void> {\n if (!this._storedConfig) {\n throw new Error(\"No stored config available for reconnection\");\n }\n await this.connect(this._storedConfig);\n }\n\n /**\n * Reset the session ID to start a new conversation\n */\n resetSession(): void {\n this._characterSessionId = \"-1\";\n this.emit(\"characterSessionId\", \"-1\");\n this._messageHandler.reset();\n // Clear metrics and disconnect reason when resetting session\n this.updateState({ metrics: [], disconnectReason: null });\n }\n\n /**\n * Send a text message to the character\n */\n sendUserTextMessage(text: string, options: SendUserTextMessageOptions = {}): void {\n if (!this.isTransportReady()) return;\n if (!text || !text.trim()) return;\n\n const logicalTurnId = options?.logicalTurnId;\n if (logicalTurnId !== undefined && !isValidLogicalTurnId(logicalTurnId)) {\n throw new Error(\n \"logicalTurnId must be non-empty and at most 128 UTF-8 bytes\",\n );\n }\n\n try {\n // Reset blendshape queue if mid-conversation, but don't interrupt the server\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n // Start new conversation session\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n\n // Emit conversation start event\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage: text.trim(),\n timestamp: this._conversationStartTime,\n });\n\n const userTextMessage = {\n text: text.trim(),\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n };\n const stateOfMind = normalizeStateOfMind(options.stateOfMind) ?? null;\n if (stateOfMind) this._stateOfMind = stateOfMind;\n\n if (stateOfMind && this._activeTransport === \"sse\") {\n this._sseSession?.sendMessages([\n { type: \"update-emotion\", data: { state_of_mind: stateOfMind } },\n {\n type: \"user_text_message\",\n data: userTextMessage,\n ...(logicalTurnId !== undefined ? { id: logicalTurnId } : {}),\n },\n ]);\n } else {\n if (stateOfMind) {\n this.publishMessage(\"update-emotion\", {\n state_of_mind: stateOfMind,\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n }\n this.publishMessage(\"user_text_message\", userTextMessage, logicalTurnId);\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Send a trigger message to invoke specific character actions\n */\n sendTriggerMessage(triggerName?: string, triggerMessage?: string): void {\n if (!this.isTransportReady()) return;\n\n // Reset blendshape queue if mid-conversation, but don't interrupt the server\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage: `[trigger:${triggerName ?? \"\"}]`,\n timestamp: this._conversationStartTime,\n });\n\n this.publishMessage(\"trigger-message\", {\n ...(triggerName && { trigger_name: triggerName }),\n ...(triggerMessage && { trigger_message: triggerMessage }),\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * If the bot is currently speaking or a conversation is active, send an\n * interrupt to the server and end the blendshape conversation so the queue\n * is clean before a new response starts arriving.\n */\n private endCurrentConversationIfActive(): void {\n const queueActive =\n this.blendshapeQueue.isConversationActive() ||\n this.blendshapeQueue.hasBufferedFrames();\n const botSpeaking = this._state.isSpeaking;\n\n if (!queueActive && !botSpeaking) return;\n\n if (this.isTransportReady()) {\n this.publishMessage(\"interrupt-bot\", {\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n // End the blendshape queue so the lipsync player finishes cleanly\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n private startTrackedConversation(userMessage: string): void {\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n\n this._conversationSessionId++;\n this._conversationStartTime = Date.now();\n this.emit(\"conversationStart\", {\n sessionId: this._conversationSessionId,\n userMessage,\n timestamp: this._conversationStartTime,\n });\n }\n\n /**\n * Send an interrupt message to stop the bot's current response\n */\n sendInterruptMessage(): void {\n if (!this.isTransportReady()) return;\n\n try {\n this.publishMessage(\"interrupt-bot\", {\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n\n // Stop local lipsync immediately for every transport. WebSocket can also\n // buffer ahead-delivered frames, and waiting for a server cancel leaves\n // stale mouth animation visible after the audio stop.\n if (\n this.blendshapeQueue.isConversationActive() ||\n this._state.isSpeaking ||\n this.blendshapeQueue.hasBufferedFrames()\n ) {\n this._messageHandler.interruptLipsyncPlayback();\n }\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Replace the Narrative Design template keys on the live session.\n * Same key map as the `narrativeTemplateKeys` config option; full replace,\n * not a merge. Requires Narrative Design enabled on the character.\n */\n updateTemplateKeys(templateKeys: { [key: string]: string }): void {\n if (!this.isTransportReady() || Object.keys(templateKeys).length === 0)\n return;\n\n this.publishMessage(\"update-template-keys\", {\n template_keys: templateKeys,\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * Update dynamic information about the current context\n */\n updateDynamicInfo(dynamicInfo: DynamicInfo): void {\n if (!this.isTransportReady() || !dynamicInfo?.trim()) return;\n\n this.publishMessage(\"update-dynamic-info\", {\n dynamic_info: { text: dynamicInfo },\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * Update the bot's temporary runtime context in a unified way.\n * Provides flexible control over ephemeral context management.\n *\n * @param options - Context update configuration\n *\n * @example\n * ```typescript\n * // Append to existing context\n * client.updateContext({\n * text: \"User completed dragon quest\",\n * mode: \"append\",\n * run_llm: \"false\"\n * });\n *\n * // Replace entire context\n * client.updateContext({\n * text: \"New game state: level 5\",\n * mode: \"replace\",\n * run_llm: \"auto\"\n * });\n *\n * // Clear context\n * client.updateContext({ mode: \"reset\" });\n * ```\n */\n updateContext(options: ContextUpdateOptions): void {\n if (!this.isTransportReady()) return;\n\n const hasText = !!options.text?.trim();\n const hasAttention = options.current_attention_object !== undefined;\n\n // text is required unless mode is \"reset\" or only updating attention\n if (options.mode !== \"reset\" && !hasText && !hasAttention) {\n console.warn(\n \"[ConvaiClient] updateContext: text or current_attention_object is required unless mode is 'reset'\",\n );\n return;\n }\n\n // Only guaranteed-response updates should preempt active local lipsync.\n // Server-scheduled auto/silent updates may be downgraded while the bot is\n // speaking, so clearing the local queue here can stop lipsync while audio\n // continues.\n const shouldPreemptLipsync = shouldPreemptForContextUpdateResponse(options);\n if (shouldPreemptLipsync) {\n this.startTrackedConversation(\n `[context-update:${options.mode ?? \"append\"}]`,\n );\n }\n\n this.publishMessage(\"context-update\", {\n ...(hasText && { text: options.text!.trim() }),\n ...(options.mode && { mode: options.mode }),\n ...(options.run_llm && { run_llm: options.run_llm }),\n ...(options.respond_mode && { respond_mode: options.respond_mode }),\n ...(hasAttention && { current_attention_object: options.current_attention_object }),\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n visionStatus(options: VisionStatusOptions = {}): string | null {\n if (!this.isTransportReady()) return null;\n const updateId = options.updateId ?? this.createUpdateId(\"vision-status\");\n this.publishMessage(\"vision-status\", {\n update_id: updateId,\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n return updateId;\n }\n\n visionTrigger(options: VisionTriggerOptions = {}): string | null {\n if (!this.isTransportReady()) return null;\n const updateId = options.updateId ?? this.createUpdateId(\"vision-trigger\");\n const respondMode = options.respondMode;\n if (shouldPreemptForExplicitRespondMode(respondMode)) {\n this.startTrackedConversation(`[vision-trigger:${respondMode}]`);\n }\n this.publishMessage(\"vision-trigger\", {\n update_id: updateId,\n ...(options.text && { text: options.text }),\n ...(respondMode && { respond_mode: respondMode }),\n ...(options.frameIndices && { frame_indices: options.frameIndices }),\n ...(options.frameIds && { frame_ids: options.frameIds }),\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n return updateId;\n }\n\n respondModeUpdate(options: RespondModeUpdateOptions): string | null {\n if (!this.isTransportReady()) return null;\n const updateId = options.updateId ?? this.createUpdateId(\"respond-mode\");\n this.publishMessage(\"respond-mode-update\", {\n update_id: updateId,\n modality: options.modality,\n mode: options.mode,\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n return updateId;\n }\n\n /**\n * Set or clear the character's temporary state of mind.\n * This is silent: it affects the next response and does not trigger one.\n */\n updateEmotion(stateOfMind: string | null): void {\n const normalized = normalizeStateOfMind(stateOfMind) ?? null;\n\n this._stateOfMind = normalized;\n if (this._storedConfig) {\n this._storedConfig = { ...this._storedConfig, stateOfMind: normalized };\n }\n\n if (!this.isTransportReady()) return;\n\n this.publishMessage(\"update-emotion\", {\n state_of_mind: normalized,\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n });\n }\n\n /**\n * Send descriptive scene updates. Use when environment description changes\n * and the bot should know what is visible or nearby. Does not modify action_config.\n */\n updateSceneMetadata(\n items: Array<{ name: string; description: string }>,\n options: UpdateSceneMetadataOptions = {},\n ): void {\n if (!this.isTransportReady()) return;\n if (shouldPreemptForExplicitRespondMode(options.respondMode)) {\n this.startTrackedConversation(\n `[scene-metadata:${options.respondMode}]`,\n );\n }\n this.publishMessage(\"update-scene-metadata\", {\n scene_metadata: items,\n ...(options.respondMode && { respond_mode: options.respondMode }),\n });\n }\n\n private createUpdateId(prefix: string): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return `${prefix}:${crypto.randomUUID()}`;\n }\n return `${prefix}:${Date.now()}:${Math.random().toString(36).slice(2)}`;\n }\n\n private serializeRespondModes(config: RespondModesConfig): Record<string, unknown> {\n return {\n ...(config.text !== undefined && { text: config.text }),\n ...(config.audio !== undefined && { audio: config.audio }),\n ...(config.vision !== undefined && { vision: config.vision }),\n ...(config.contextUpdate !== undefined && {\n context_update: config.contextUpdate,\n }),\n ...(config.trigger !== undefined && { trigger: config.trigger }),\n ...(config.sceneMetadata !== undefined && {\n scene_metadata: config.sceneMetadata,\n }),\n };\n }\n\n /**\n * Upload a file to the character via the LiveKit byte stream transport.\n * Only works when connected with the LiveKit transport.\n *\n * @throws if not connected or if the LiveKit room is unavailable\n */\n async uploadFile(file: File, options: UploadFileOptions = {}): Promise<void> {\n if (!this._room?.localParticipant) {\n throw new Error(\"[ConvaiClient] uploadFile: not connected to a LiveKit room\");\n }\n\n const { topic = \"file-upload\", onProgress } = options;\n\n await this._room.localParticipant.sendFile(file, {\n topic,\n mimeType: file.type,\n ...(onProgress && {\n onProgress: (raw: number) => onProgress(Math.ceil(raw * 100)),\n }),\n });\n }\n\n /**\n * Toggle text-to-speech on or off\n */\n toggleTts(enabled: boolean): void {\n if (!this.isTransportReady()) return;\n this.publishMessage(\"tts-toggle\", { enabled });\n }\n\n /**\n * Toggle speech-to-text on or off\n */\n toggleStt(enabled: boolean): void {\n if (!this.isTransportReady()) return;\n this.publishMessage(\"stt-toggle\", { muted: !enabled });\n }\n\n /**\n * Reset the server-side idle timer.\n * Call this on any user activity (clicks, UI interactions, etc.) to prevent\n * the session from being disconnected due to inactivity.\n */\n resetIdleTimer(): void {\n // SSE requests are one-turn streams; there is no persistent server-side\n // realtime session for an idle timer to keep alive.\n if (this._activeTransport === \"sse\") return;\n if (!this.isTransportReady()) return;\n this.publishMessage(\"reset-idle-timer\", {\n participant_sid: this._participantSid || this._room.localParticipant?.sid,\n });\n }\n}\n"]}
|
|
@@ -9,6 +9,7 @@ import { BlendshapeQueue } from "./BlendshapeQueue";
|
|
|
9
9
|
export declare class MessageHandler extends EventEmitter {
|
|
10
10
|
private room;
|
|
11
11
|
private chatMessages;
|
|
12
|
+
private activeBotLlmMessageId;
|
|
12
13
|
private userTranscription;
|
|
13
14
|
private logRtviMessages;
|
|
14
15
|
private isBotResponding;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageHandler.d.ts","sourceRoot":"","sources":["../../src/core/MessageHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAoD,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAS3B;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,wBAAwB,CAAa;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,eAAe,CAAoD;IAI3E,OAAO,CAAC,qBAAqB,CAA8B;IAK3D,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAG/B;gBAEE,IAAI,CAAC,EAAE,IAAI;IASvB;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7C;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,UAAU,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIxD;;;OAGG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;OAIG;IACH,wBAAwB,IAAI,IAAI;IAShC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAUzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;
|
|
1
|
+
{"version":3,"file":"MessageHandler.d.ts","sourceRoot":"","sources":["../../src/core/MessageHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAoD,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAS3B;;;GAGG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,qBAAqB,CAAuB;IACpD,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,wBAAwB,CAAa;IAC7C,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,eAAe,CAAoD;IAI3E,OAAO,CAAC,qBAAqB,CAA8B;IAK3D,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAG/B;gBAEE,IAAI,CAAC,EAAE,IAAI;IASvB;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7C;;OAEG;IACH,eAAe,IAAI,WAAW,EAAE;IAIhC;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,UAAU,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIxD;;;OAGG;IACH,cAAc,IAAI,OAAO;IAIzB;;;;OAIG;IACH,wBAAwB,IAAI,IAAI;IAShC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAUzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA2gB1B,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,wBAAwB,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAInD;;OAEG;IACH,KAAK,IAAI,IAAI;CAiBd"}
|
|
@@ -10,6 +10,7 @@ export class MessageHandler extends EventEmitter {
|
|
|
10
10
|
super();
|
|
11
11
|
this.room = null;
|
|
12
12
|
this.chatMessages = [];
|
|
13
|
+
this.activeBotLlmMessageId = null;
|
|
13
14
|
this.userTranscription = "";
|
|
14
15
|
this.logRtviMessages = true;
|
|
15
16
|
this.isBotResponding = false;
|
|
@@ -162,6 +163,7 @@ export class MessageHandler extends EventEmitter {
|
|
|
162
163
|
timestamp: timestamp,
|
|
163
164
|
isStreaming: true,
|
|
164
165
|
};
|
|
166
|
+
this.activeBotLlmMessageId = messageId;
|
|
165
167
|
this.chatMessages.push(streamingMessage);
|
|
166
168
|
this.emit("messagesChange", this.chatMessages);
|
|
167
169
|
break;
|
|
@@ -188,10 +190,15 @@ export class MessageHandler extends EventEmitter {
|
|
|
188
190
|
break;
|
|
189
191
|
this.seenBotOutputSegments.add(segmentId);
|
|
190
192
|
}
|
|
193
|
+
const activeBotLlmMessage = this.activeBotLlmMessageId
|
|
194
|
+
? this.chatMessages.find((message) => message.id === this.activeBotLlmMessageId)
|
|
195
|
+
: undefined;
|
|
191
196
|
const lastMsg = this.chatMessages[this.chatMessages.length - 1];
|
|
192
197
|
// When the reply is rendered by the LLM text stream
|
|
193
198
|
// (bot-llm-text), the TTS echo adds nothing — never mix
|
|
194
199
|
// bot-output into an LLM bubble (streaming or complete).
|
|
200
|
+
if (activeBotLlmMessage?.type === "bot-llm-text")
|
|
201
|
+
break;
|
|
195
202
|
if (lastMsg?.type === "bot-llm-text")
|
|
196
203
|
break;
|
|
197
204
|
if (lastMsg?.type === "bot-output" &&
|
|
@@ -221,11 +228,16 @@ export class MessageHandler extends EventEmitter {
|
|
|
221
228
|
if (messageData.data?.text) {
|
|
222
229
|
const newChunk = messageData.data.text;
|
|
223
230
|
// Update the streaming message in chat
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
231
|
+
const activeIndex = this.activeBotLlmMessageId
|
|
232
|
+
? this.chatMessages.findIndex((message) => message.id === this.activeBotLlmMessageId &&
|
|
233
|
+
message.type === "bot-llm-text" &&
|
|
234
|
+
message.isStreaming)
|
|
235
|
+
: -1;
|
|
236
|
+
if (activeIndex >= 0) {
|
|
237
|
+
const activeMessage = this.chatMessages[activeIndex];
|
|
238
|
+
this.chatMessages[activeIndex] = {
|
|
239
|
+
...activeMessage,
|
|
240
|
+
content: activeMessage.content + newChunk,
|
|
229
241
|
};
|
|
230
242
|
}
|
|
231
243
|
else {
|
|
@@ -237,6 +249,7 @@ export class MessageHandler extends EventEmitter {
|
|
|
237
249
|
timestamp: new Date().toISOString(),
|
|
238
250
|
isStreaming: true,
|
|
239
251
|
};
|
|
252
|
+
this.activeBotLlmMessageId = streamingMsg.id;
|
|
240
253
|
this.chatMessages.push(streamingMsg);
|
|
241
254
|
}
|
|
242
255
|
this.emit("messagesChange", this.chatMessages);
|
|
@@ -244,10 +257,13 @@ export class MessageHandler extends EventEmitter {
|
|
|
244
257
|
break;
|
|
245
258
|
// Bot LLM Stopped - Complete streaming response
|
|
246
259
|
case "bot-llm-stopped":
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
260
|
+
const activeIndex = this.activeBotLlmMessageId
|
|
261
|
+
? this.chatMessages.findIndex((message) => message.id === this.activeBotLlmMessageId)
|
|
262
|
+
: -1;
|
|
263
|
+
if (activeIndex >= 0 && this.chatMessages[activeIndex].isStreaming) {
|
|
264
|
+
const activeMessage = this.chatMessages[activeIndex];
|
|
265
|
+
this.chatMessages[activeIndex] = {
|
|
266
|
+
...activeMessage,
|
|
251
267
|
isStreaming: false,
|
|
252
268
|
};
|
|
253
269
|
}
|
|
@@ -599,6 +615,7 @@ export class MessageHandler extends EventEmitter {
|
|
|
599
615
|
*/
|
|
600
616
|
reset() {
|
|
601
617
|
this.chatMessages = [];
|
|
618
|
+
this.activeBotLlmMessageId = null;
|
|
602
619
|
this.userTranscription = "";
|
|
603
620
|
this.isBotResponding = false;
|
|
604
621
|
this.isSpeaking = false;
|