@convai/web-sdk 1.8.0-beta.7 → 1.8.0
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 +44 -194
- package/dist/core/ConvaiClient.d.ts +1 -190
- package/dist/core/ConvaiClient.d.ts.map +1 -1
- package/dist/core/ConvaiClient.js +286 -1306
- package/dist/core/ConvaiClient.js.map +1 -1
- package/dist/core/MessageHandler.d.ts +1 -19
- package/dist/core/MessageHandler.d.ts.map +1 -1
- package/dist/core/MessageHandler.js +27 -378
- package/dist/core/MessageHandler.js.map +1 -1
- package/dist/core/connectRequest.d.ts +4 -17
- package/dist/core/connectRequest.d.ts.map +1 -1
- package/dist/core/connectRequest.js +17 -28
- package/dist/core/connectRequest.js.map +1 -1
- package/dist/core/index.d.ts +1 -6
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -7
- package/dist/core/index.js.map +1 -1
- package/dist/core/logicalTurn.d.ts +6 -4
- package/dist/core/logicalTurn.d.ts.map +1 -1
- package/dist/core/logicalTurn.js +4 -29
- package/dist/core/logicalTurn.js.map +1 -1
- package/dist/core/modelOutput.d.ts.map +1 -1
- package/dist/core/modelOutput.js +2 -2
- package/dist/core/modelOutput.js.map +1 -1
- package/dist/core/types.d.ts +22 -860
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/embed/chat-embed-v1.js +9 -10
- package/dist/embed/chat-embed-v1.js.map +4 -4
- package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
- package/dist/react/components/ConvaiWidget.js +1 -6
- package/dist/react/components/ConvaiWidget.js.map +1 -1
- package/dist/react/components/rtc-widget/components/AudioVisualizer.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/AudioVisualizer.js +1 -28
- package/dist/react/components/rtc-widget/components/AudioVisualizer.js.map +1 -1
- package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +44 -39
- package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +49 -93
- package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -1
- package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
- package/dist/react/hooks/useConvaiClient.js +2 -17
- package/dist/react/hooks/useConvaiClient.js.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -1
- package/dist/react/index.js.map +1 -1
- package/dist/vanilla/AudioRenderer.d.ts +1 -3
- package/dist/vanilla/AudioRenderer.d.ts.map +1 -1
- package/dist/vanilla/AudioRenderer.js +2 -8
- package/dist/vanilla/AudioRenderer.js.map +1 -1
- package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
- package/dist/vanilla/ConvaiWidget.js +300 -994
- package/dist/vanilla/ConvaiWidget.js.map +1 -1
- package/dist/vanilla/WidgetEventSubscriptions.d.ts +1 -1
- package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -1
- package/dist/vanilla/WidgetEventSubscriptions.js +0 -5
- package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -1
- package/dist/vanilla/icons.d.ts.map +1 -1
- package/dist/vanilla/icons.js +15 -62
- package/dist/vanilla/icons.js.map +1 -1
- package/dist/vanilla/index.d.ts +2 -4
- package/dist/vanilla/index.d.ts.map +1 -1
- package/dist/vanilla/index.js +1 -3
- package/dist/vanilla/index.js.map +1 -1
- package/dist/vanilla/styles.d.ts +1 -18
- package/dist/vanilla/styles.d.ts.map +1 -1
- package/dist/vanilla/styles.js +29 -129
- package/dist/vanilla/styles.js.map +1 -1
- package/dist/vanilla/types.d.ts +0 -74
- package/dist/vanilla/types.d.ts.map +1 -1
- package/dist/vanilla/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +8 -13
- package/dist/core/CharacterRoster.d.ts +0 -84
- package/dist/core/CharacterRoster.d.ts.map +0 -1
- package/dist/core/CharacterRoster.js +0 -348
- package/dist/core/CharacterRoster.js.map +0 -1
- package/dist/core/CharacterVersionManager.d.ts +0 -100
- package/dist/core/CharacterVersionManager.d.ts.map +0 -1
- package/dist/core/CharacterVersionManager.js +0 -227
- package/dist/core/CharacterVersionManager.js.map +0 -1
- package/dist/core/ConvaiRoomError.d.ts +0 -48
- package/dist/core/ConvaiRoomError.d.ts.map +0 -1
- package/dist/core/ConvaiRoomError.js +0 -111
- package/dist/core/ConvaiRoomError.js.map +0 -1
- package/dist/core/SSESession.d.ts +0 -59
- package/dist/core/SSESession.d.ts.map +0 -1
- package/dist/core/SSESession.js +0 -289
- package/dist/core/SSESession.js.map +0 -1
- package/dist/core/characterReference.d.ts +0 -40
- package/dist/core/characterReference.d.ts.map +0 -1
- package/dist/core/characterReference.js +0 -72
- package/dist/core/characterReference.js.map +0 -1
- package/dist/core/rosterRequest.d.ts +0 -57
- package/dist/core/rosterRequest.d.ts.map +0 -1
- package/dist/core/rosterRequest.js +0 -210
- package/dist/core/rosterRequest.js.map +0 -1
- package/dist/utils/inlineMarkdown.d.ts +0 -38
- package/dist/utils/inlineMarkdown.d.ts.map +0 -1
- package/dist/utils/inlineMarkdown.js +0 -106
- package/dist/utils/inlineMarkdown.js.map +0 -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 PublishedChatConnectOptions,\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 ConvaiCharacterInstance,\n ConvaiRoomSession,\n JoinRoomOptions,\n CharacterStatusEvent,\n ActiveCharacterChange,\n CharacterRosterChange,\n UpdateCharacterRosterOptions,\n ServerResponseExtras,\n AppendMessageOptions,\n UsageUpdate,\n ConvaiEventMap,\n ActionResult,\n ActionResultAck,\n ActionResultAckFailureReason,\n ActionResultAckOptions,\n BotLlmTextRawEvent,\n ModelOutputMessage,\n ModelOutputProtocolError,\n JsonValue,\n} from \"./types\";\nimport { AudioManager } from \"./AudioManager\";\nimport { VideoManager } from \"./VideoManager\";\nimport { ScreenShareManager } from \"./ScreenShareManager\";\nimport { MessageHandler } from \"./MessageHandler\";\nimport { CharacterRoster } from \"./CharacterRoster\";\nimport {\n buildJoinRequestBody,\n buildRosterConnectFields,\n isRosterConfig,\n validateJoinOptions,\n validateProtocolTopology,\n validateRosterConfig,\n} from \"./rosterRequest\";\nimport { ConvaiRoomError, roomErrorFromResponse } from \"./ConvaiRoomError\";\nimport { SDK_VERSION } from \"../version\";\nimport { EventEmitter, type EventCallback } from \"./EventEmitter\";\nimport { BlendshapeQueue } from \"./BlendshapeQueue\";\nimport { MemoryManager } from \"./MemoryManager\";\nimport { CharacterVersionManager } from \"./CharacterVersionManager\";\nimport {\n resolveCharacterReference,\n type CharacterVersionSelector,\n} from \"./characterReference\";\nimport { ConnectionStateHandler } from \"./ConnectionStateHandler\";\nimport {\n buildActionConnectConfig,\n buildBlendshapeConnectConfig,\n buildEmotionConnectConfig,\n serializeClientTools,\n serializeProtocolCapabilities,\n validateActionProtocolSelection,\n validateModelOutputVersionSelection,\n} from \"./connectRequest\";\nimport {\n shouldPreemptForContextUpdateResponse,\n shouldPreemptForExplicitRespondMode,\n} from \"./contextUpdateRequest\";\nimport {\n resolveVisionInputConfig,\n serializeVisionInputConfig,\n} from \"./visionRequest\";\nimport { SSESession } from \"./SSESession\";\nimport { isJsonValue } from \"./modelOutput\";\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\ntype ActionResultPayload = {\n id: string;\n status: ActionResult[\"status\"];\n output?: JsonValue;\n error?: JsonValue;\n character_session_id?: string;\n};\n\n/**\n * Rejection from {@link ConvaiClient.sendActionResultAndWait} after local\n * validation succeeds. Inspect `reason` rather than parsing the message.\n */\nexport class ActionResultAckError extends Error {\n readonly reason: ActionResultAckFailureReason;\n readonly toolCallId: string;\n readonly errorCode?: string;\n readonly response?: ServerResponse;\n readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n reason: ActionResultAckFailureReason;\n toolCallId: string;\n errorCode?: string;\n response?: ServerResponse;\n cause?: unknown;\n },\n ) {\n super(message);\n this.name =\n options.reason === \"aborted\"\n ? \"AbortError\"\n : options.reason === \"timeout\"\n ? \"TimeoutError\"\n : \"ActionResultAckError\";\n this.reason = options.reason;\n this.toolCallId = options.toolCallId;\n this.errorCode = options.errorCode;\n this.response = options.response;\n this.cause = options.cause;\n }\n}\n\n/**\n * Marks a publication exchange failure that is safe to retry with the same\n * logical connect attempt. The launch grant itself is single-use, so callers\n * must never mint or submit a second grant for this recovery path.\n */\nclass RetryablePublishedChatExchangeError extends Error {}\n\ntype PublishedChatConnectionData = ConnectionData & {\n room_url: string;\n token: string;\n character_session_id: string;\n request_trace_id?: string;\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\" | \"text\" | null = null;\n private _apiKey: string | null = null;\n private _authToken: string | null = null;\n private _characterId: string | null = null;\n private _characterVersion: CharacterVersionSelector | null = null;\n private _characterReference: string | null = null;\n private _characterVersionManager: CharacterVersionManager | null = null;\n private _characterVersionManagerKey: string | null = null;\n private _characterSessionId: string | null = \"-1\";\n /** Roster state for multi-character rooms. Empty for single-character sessions. */\n private _roster = new CharacterRoster();\n /** Roster commands awaiting their ack, keyed by command id. */\n private _pendingRosterCommands = new Map<\n string,\n {\n resolve: (change: ActiveCharacterChange | CharacterRosterChange) => void;\n reject: (error: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n >();\n private _rosterCommandSeq = 0;\n private _requestTraceId: string | null = null;\n private _isBotReady: boolean = false;\n private _participantSid: string = \"\";\n private _audioSettings: AudioSettings;\n private _storedConfig: ConvaiConfig | null = null;\n\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 private _isPublishedChatSession: 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 _pendingActionResultAcks: Map<string, symbol> = new Map();\n private static readonly CLIENT_READY_RETRY_MS = 500;\n private static readonly CLIENT_READY_TIMEOUT_MS = 45_000;\n private static readonly ACTION_RESULT_ACK_TIMEOUT_MS = 10_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 // Derive the version readouts from the config eagerly, as\n // characterVersions already is, so a React consumer destructuring\n // characterReference off the hook sees the selector on first render\n // rather than null until connect(). A malformed selector is left for\n // connect() to reject -- the constructor has never thrown on config and\n // starting to would be a behaviour change.\n if (config.characterId && !isRosterConfig(config)) {\n try {\n const ref = resolveCharacterReference(\n config.characterId,\n config.characterVersion,\n );\n this._characterId = ref.characterId;\n this._characterVersion = ref.version;\n this._characterReference = ref.reference;\n } catch {\n /* reported by connect() */\n }\n }\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 characters: [],\n activeMembershipId: null,\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\" | \"text\" | null {\n return this._connectionType;\n }\n\n get isPublishedChatSession(): boolean {\n return this._isPublishedChatSession;\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 characterVersion(): CharacterVersionSelector | null {\n return this._characterVersion;\n }\n\n get characterReference(): string | null {\n return this._characterReference;\n }\n\n /**\n * Character version manager for the configured character. Built from the\n * live connection when there is one, otherwise from the stored config, so\n * versions can be listed and released before connecting. Null without an\n * API key (the Character REST platform does not accept realtime auth tokens).\n */\n get characterVersions(): CharacterVersionManager | null {\n const apiKey = this._apiKey ?? this._storedConfig?.apiKey ?? null;\n const rawCharacterId =\n this._characterId ?? this._storedConfig?.characterId ?? null;\n if (!apiKey || !rawCharacterId) return null;\n\n let characterId = rawCharacterId;\n try {\n characterId = resolveCharacterReference(rawCharacterId).characterId;\n } catch {\n // A malformed id is reported by connect(); use it verbatim here.\n }\n const baseUrl = this._storedConfig?.characterApiUrl ?? undefined;\n const key = `${apiKey}\\u0000${characterId}\\u0000${baseUrl ?? \"\"}`;\n if (this._characterVersionManagerKey !== key) {\n this._characterVersionManager = new CharacterVersionManager({\n apiKey,\n characterId,\n baseUrl,\n });\n this._characterVersionManagerKey = key;\n }\n return this._characterVersionManager;\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 /**\n * Subscribe to a client event. Typed against {@link ConvaiEventMap}, so a\n * listener for a known event gets its payload inferred instead of `any`.\n * The plain-string form is kept so existing callers and dynamic event names\n * still build -- which also means a misspelt literal is not a compile error.\n */\n on<E extends keyof ConvaiEventMap>(\n event: E,\n callback: (...args: ConvaiEventMap[E]) => void,\n ): () => void;\n on(event: string, callback: (...args: any[]) => void): () => void;\n on(event: string, callback: (...args: any[]) => void): () => void {\n return super.on(event, callback);\n }\n\n /**\n * Server-owned snapshot of a multi-character room, or null for a\n * single-character session. Carries the room id, epochs and roster.\n */\n get roomSession(): ConvaiRoomSession | null {\n return this._roster.roomSession;\n }\n\n /**\n * Character instances in a multi-character room, in roster order. Empty for a\n * single-character session, so `length` distinguishes the two.\n */\n get characters(): ConvaiCharacterInstance[] {\n return this._roster.characters;\n }\n\n /** Membership currently receiving user turns, or null. */\n get activeMembershipId(): string | null {\n return this._roster.activeMembershipId;\n }\n\n /**\n * Start or stop the server streaming per-turn usage/cost breakdowns as\n * `usageUpdate` events. Informational only; server-side usage tracking and\n * billing are unaffected either way.\n */\n toggleUsageUpdates(enabled: boolean): void {\n if (!this.isTransportReady()) return;\n this.publishMessage(\"usage-toggle\", { enabled });\n }\n\n /** Insert a transcript line locally. Nothing is sent; nothing is billed. */\n appendMessage(message: AppendMessageOptions): ChatMessage {\n if (!message?.content?.trim()) {\n throw new Error(\"appendMessage requires non-empty content\");\n }\n return this._messageHandler.appendLocalMessage(message);\n }\n\n /** Trace id of the /connect that produced this session; quote it to backend support. */\n get requestTraceId(): string | null {\n return this._requestTraceId;\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 // Per-membership audio binding. In a roster room every character is its\n // own participant with identity `character:{membership_id}`; the guide's\n // rule is to bind a track to the exact member or drop it, never to fall\n // back to the active character. Single-character rooms keep the legacy\n // behaviour: the track is surfaced with no attribution.\n this._room.on(RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n if (track.kind !== \"audio\") return;\n const identity = participant.identity;\n if (!this._roster.isMultiCharacter) {\n this.emit(\"characterAudioTrack\", {\n membershipId: null,\n characterId: this._characterId,\n participantIdentity: identity,\n track: track.mediaStreamTrack,\n });\n return;\n }\n const membershipId = identity.startsWith(\"character:\")\n ? identity.slice(\"character:\".length)\n : null;\n const member = membershipId ? this._roster.find(membershipId) : undefined;\n if (!member) {\n // Unattributable in a roster room: quarantine rather than guess.\n if (this._logRtviMessages) {\n console.warn(\n `[ConvaiClient] dropped audio track from unattributed participant \"${identity}\"`,\n );\n }\n return;\n }\n this.emit(\"characterAudioTrack\", {\n membershipId: member.membershipId,\n characterId: member.characterId,\n participantIdentity: identity,\n track: track.mediaStreamTrack,\n });\n });\n\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\", (about?: Record<string, unknown>) => {\n // Each roster member sends its own bot-ready. Feed the roster before the\n // de-dupe below, which only guards the single consumer-facing event --\n // otherwise every member after the first would be dropped.\n if (this._roster.applyBotReady(about)) {\n this.updateState({\n characters: this._roster.characters,\n activeMembershipId: this._roster.activeMembershipId,\n });\n const membershipId = about?.membership_id as string | undefined;\n if (membershipId) this.emit(\"characterReady\", this._roster.find(membershipId));\n }\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(\n \"messagesChange\",\n (\n messages: ChatMessage[],\n updatedMessage?: ChatMessage,\n updatedMessages?: ChatMessage[],\n ) => {\n // Most updates target the tail. Correlated v2 chunks can update an\n // earlier streaming row. A v2 stop can finalize several rows at once.\n if (updatedMessages?.length) {\n for (const message of updatedMessages) {\n this.emit(\"message\", message);\n }\n } else {\n this.emit(\"message\", updatedMessage ?? messages[messages.length - 1]);\n }\n this.emit(\"messagesChange\", messages);\n },\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 this._messageHandler.on(\"botTurnCompleted\", (data: unknown) => {\n this.emit(\"botTurnCompleted\", data);\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(\"usageUpdate\", (data: UsageUpdate) => {\n this.emit(\"usageUpdate\", data);\n });\n\n this._messageHandler.on(\"characterStatus\", (status: CharacterStatusEvent) => {\n if (this._roster.applyCharacterStatus(status)) {\n this.updateState({\n characters: this._roster.characters,\n activeMembershipId: this._roster.activeMembershipId,\n });\n }\n this.emit(\"characterStatus\", status);\n });\n\n this._messageHandler.on(\"modelOutput\", (data: ModelOutputMessage) => {\n this.emit(\"modelOutput\", data);\n });\n\n this._messageHandler.on(\"botLlmTextRaw\", (data: BotLlmTextRawEvent) => {\n this.emit(\"botLlmTextRaw\", data);\n });\n\n this._messageHandler.on(\n \"modelOutputProtocolError\",\n (data: ModelOutputProtocolError) => {\n this.emit(\"modelOutputProtocolError\", data);\n },\n );\n\n this._messageHandler.on(\"serverResponse\", (response: ServerResponse) => {\n this._handleRosterServerResponse(response);\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 * Publish exactly one message while retaining the transport's local completion\n * signal. Server acceptance is still proved separately by `serverResponse`.\n */\n private async publishMessageAndWaitForLocalPublication(\n type: string,\n data: unknown,\n id?: string,\n ): Promise<void> {\n const message = id === undefined ? { type, data } : { type, id, data };\n\n if (this._activeTransport === \"websocket\") {\n if (!this._wsSession?.isConnected) {\n throw new Error(\"The action-result WebSocket transport is no longer available\");\n }\n this._wsSession.sendMessage(type, data);\n return;\n }\n if (\n this._activeTransport === \"livekit\" &&\n this._room?.localParticipant &&\n this._room.state !== \"disconnected\"\n ) {\n const encodedData = new TextEncoder().encode(JSON.stringify(message));\n await this._room.localParticipant.publishData(encodedData, {\n reliable: true,\n });\n return;\n }\n throw new Error(\"The action-result transport is no longer available\");\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 this._isPublishedChatSession = false;\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 // A fresh connect starts on the v1 model-output contract; the /connect\n // response upgrades it once the server confirms the negotiated version.\n this._messageHandler.setModelOutputVersion(1);\n\n this.updateState({ isConnecting: true });\n this._requestTraceId = null;\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 this._characterVersion = configWithDefaults.characterVersion ?? null;\n this._characterReference = configWithDefaults.characterReference;\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.characterReference,\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 capabilities: configWithDefaults.capabilities,\n dynamicInfo: configWithDefaults.dynamicInfo,\n keepInContext: configWithDefaults.keepInContext,\n narrativeTemplateKeys: configWithDefaults.narrativeTemplateKeys,\n sceneDescription: configWithDefaults.sceneDescription,\n respondModes: configWithDefaults.respondModes,\n useResponseLifecycleContract:\n configWithDefaults.useResponseLifecycleContract,\n invocationMetadata: configWithDefaults.invocationMetadata,\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 isRoster = isRosterConfig(configWithDefaults);\n const serializedCapabilities = serializeProtocolCapabilities(\n configWithDefaults.capabilities,\n );\n const requestBody = {\n ...(isRoster\n ? buildRosterConnectFields(configWithDefaults)\n : { character_id: configWithDefaults.characterReference }),\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 ...(serializedCapabilities && {\n capabilities: serializedCapabilities,\n }),\n connection_type: connType,\n ...buildBlendshapeConnectConfig(configWithDefaults),\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.visionPromptMode !== undefined && {\n vision_prompt_mode: configWithDefaults.visionPromptMode,\n }),\n ...(configWithDefaults.respondModes && {\n respond_modes: this.serializeRespondModes(\n configWithDefaults.respondModes,\n ),\n }),\n ...(serializedCapabilities && { capabilities: serializedCapabilities }),\n ...(configWithDefaults.sceneDescription && {\n scene_description: configWithDefaults.sceneDescription,\n }),\n // A roster room owns its members' sessions; the singular resume id is\n // a compatibility mirror and must not go back on the wire.\n ...(!isRoster &&\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 ...(configWithDefaults.preserveLinksInOutput !== undefined && {\n preserve_links_in_output: configWithDefaults.preserveLinksInOutput,\n }),\n ...(configWithDefaults.useResponseLifecycleContract !== undefined && {\n use_response_lifecycle_contract:\n configWithDefaults.useResponseLifecycleContract,\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. A roster room\n // may still be provisioning from an identical concurrent create, which\n // the runtime answers with a retryable 409; the wrapper replays the\n // identical payload and is a straight pass-through otherwise.\n const connectOnce = async () => {\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 // A roster room's failures are named and machine-actionable, and the\n // trace id is what backend support correlates on, so they get a typed\n // error. Single-character behaviour is unchanged.\n if (isRoster) {\n let parsed: unknown = errorText;\n try {\n parsed = JSON.parse(errorText);\n } catch {\n /* keep the raw text as the detail */\n }\n throw roomErrorFromResponse(response.status, parsed);\n }\n throw new Error(errorMessage);\n }\n\n return await response.json();\n };\n\n const connectionData = isRoster\n ? await this._withProvisioningRetry(configWithDefaults, connectOnce)\n : await connectOnce();\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 // A client can be reused after a published session. This is a normal\n // credentialed/proxy connection path, so never leave published-only UI\n // semantics (fresh grant requirement, text-only controls) enabled.\n this._isPublishedChatSession = false;\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 * How long to wait for a roster command's ack.\n *\n * A timeout is *not* a failure. Every character participant observes the\n * broadcast and duplicate forwards are response-suppressed after one actor\n * answers, so a lost ack is an expected outcome. The contract's rule is to\n * treat it as unknown and reconcile from the next authoritative snapshot,\n * which is what the rejection below tells the caller to do.\n */\n private static readonly ROSTER_COMMAND_TIMEOUT_MS = 10000;\n\n /** Correlate roster acks back to the promise that issued the command. */\n private _handleRosterServerResponse(response: ServerResponse): void {\n const eventType = response.event_type;\n if (\n eventType !== \"interaction-target\" &&\n eventType !== \"character-roster-update\"\n ) {\n return;\n }\n const extras = response.extras ?? null;\n const commandId = extras?.command_id;\n const pending = commandId\n ? this._pendingRosterCommands.get(commandId)\n : undefined;\n\n if (response.status === \"error\") {\n // Adopt the server's epochs even from a rejection -- a stale-epoch error\n // carries the authoritative value, and that is what makes a retry\n // meaningful.\n this._roster.adoptEpochs(extras);\n this._pushRosterState();\n if (pending && commandId) {\n this._pendingRosterCommands.delete(commandId);\n clearTimeout(pending.timer);\n pending.reject(\n Object.assign(\n new Error(response.message ?? `${eventType} was rejected`),\n { code: extras?.code ?? null, extras },\n ),\n );\n }\n return;\n }\n\n // Apply the change whether or not this client asked for it: another\n // participant's switch reaches us through the same event.\n let change: ActiveCharacterChange | CharacterRosterChange;\n if (eventType === \"interaction-target\") {\n change = this._roster.applyInteractionTarget(extras);\n this._pushRosterState();\n this.emit(\"activeCharacterChange\", change);\n } else {\n change = this._roster.applyRosterUpdate(extras);\n this._pushRosterState();\n this.emit(\"rosterChange\", change);\n }\n\n if (pending && commandId) {\n this._pendingRosterCommands.delete(commandId);\n clearTimeout(pending.timer);\n pending.resolve(change);\n }\n }\n\n /**\n * Settle every in-flight roster command.\n *\n * Without this a caller who disconnects mid-command keeps a live 10s timer\n * and gets a rejection long after the session ended -- an unhandled rejection\n * if they stopped awaiting when they tore the client down. The roster is\n * reset alongside, so the command could not be applied meaningfully anyway.\n */\n private _failPendingRosterCommands(reason: string): void {\n for (const [, pending] of this._pendingRosterCommands) {\n clearTimeout(pending.timer);\n pending.reject(new Error(reason));\n }\n this._pendingRosterCommands.clear();\n }\n\n private _pushRosterState(): void {\n this.updateState({\n characters: this._roster.characters,\n activeMembershipId: this._roster.activeMembershipId,\n });\n }\n\n /** Publish a roster command and settle when its ack arrives. */\n private _sendRosterCommand(\n type: \"interaction-target\" | \"character-roster-update\",\n build: (commandId: string) => Record<string, unknown>,\n ): Promise<ActiveCharacterChange | CharacterRosterChange> {\n if (!this._roster.isMultiCharacter) {\n return Promise.reject(\n new Error(\n `Cannot send ${type}: this session was not created with a characters array`,\n ),\n );\n }\n if (!this.isTransportReady()) {\n return Promise.reject(new Error(`Cannot send ${type}: not connected`));\n }\n\n const commandId = `${type}-${++this._rosterCommandSeq}-${Date.now()}`;\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this._pendingRosterCommands.delete(commandId);\n reject(\n new Error(\n `${type} was not acknowledged within ${ConvaiClient.ROSTER_COMMAND_TIMEOUT_MS}ms. ` +\n `The outcome is unknown -- acks can be suppressed as duplicates. ` +\n `Reconcile from the next authoritative room state before sending a conflicting command.`,\n ),\n );\n }, ConvaiClient.ROSTER_COMMAND_TIMEOUT_MS);\n this._pendingRosterCommands.set(commandId, { resolve, reject, timer });\n this.publishMessage(type, build(commandId), commandId);\n });\n }\n\n /**\n * Route subsequent user turns to a different character instance.\n *\n * Pass null to close every gate, so no member consumes the user until a\n * target is set again.\n */\n async setInteractionTarget(\n membershipId: string | null,\n ): Promise<ActiveCharacterChange> {\n if (!this._roster.isMultiCharacter) {\n throw new Error(\n \"Cannot send interaction-target: this session was not created with a characters array\",\n );\n }\n if (membershipId !== null) {\n if (!membershipId) {\n throw new Error(\"setInteractionTarget requires a membershipId, or null to close all gates\");\n }\n const instance = this._roster.find(membershipId);\n if (this._roster.isMultiCharacter && !instance) {\n throw new Error(\n `Unknown membershipId \"${membershipId}\". Address instances by membershipId, not characterId.`,\n );\n }\n if (instance && !instance.isReady) {\n throw new Error(\n `Membership \"${membershipId}\" has not sent bot-ready yet; the runtime refuses an unready target`,\n );\n }\n }\n\n const send = () =>\n this._sendRosterCommand(\"interaction-target\", (commandId) =>\n this._roster.buildInteractionTarget(membershipId, commandId),\n );\n\n try {\n return (await send()) as ActiveCharacterChange;\n } catch (error) {\n // Another participant switched first. The roster adopted the server's\n // epoch when the rejection arrived, so exactly one retry is now fenced\n // correctly; a second would mean we are losing a race we should report.\n if ((error as { code?: string })?.code !== \"stale_route_epoch\") throw error;\n return (await send()) as ActiveCharacterChange;\n }\n }\n\n /** Add or remove character instances on a live room, without reconnecting. */\n async updateCharacterRoster(\n options: UpdateCharacterRosterOptions,\n ): Promise<CharacterRosterChange> {\n // Report the wrong-session-shape first. Otherwise a single-character\n // client, whose roster is empty, trips the \"cannot be emptied\" rule below\n // and gets an error about a room it never had.\n if (!this._roster.isMultiCharacter) {\n throw new Error(\n \"Cannot send character-roster-update: this session was not created with a characters array\",\n );\n }\n const add = options?.add ?? [];\n const remove = options?.remove ?? [];\n if (add.length === 0 && remove.length === 0) {\n throw new Error(\"updateCharacterRoster requires at least one add or remove\");\n }\n if (add.some((c) => !c?.characterId?.trim())) {\n throw new Error(\"Every entry in add requires a characterId\");\n }\n if (remove.length && remove.length >= this._roster.characters.length && add.length === 0) {\n throw new Error(\"A roster room cannot be emptied; add a replacement or keep one member\");\n }\n\n // Removing the active member needs an explicit, ready replacement --\n // the runtime answers `replacement_target_required` otherwise, and\n // `replacement_target_unavailable` for one that has not sent bot-ready.\n const active = this._roster.activeMembershipId;\n const effective: UpdateCharacterRosterOptions =\n !options.replacementTarget && active && remove.includes(active)\n ? { ...options, replacementTarget: this._roster.pickReplacement(remove) }\n : options;\n\n return (await this._sendRosterCommand(\n \"character-roster-update\",\n (commandId) => this._roster.buildRosterUpdate(effective, commandId),\n )) as CharacterRosterChange;\n }\n\n /** Default bounded retry while a roster room is still provisioning. */\n private static readonly ROSTER_RETRY_ATTEMPTS = 4;\n private static readonly ROSTER_RETRY_INITIAL_MS = 500;\n\n /**\n * Run a room request, retrying only the conflicts that mean \"still working\".\n *\n * The runtime answers a create that collides with an in-flight identical\n * create with 409 `ROSTER_PROVISIONING_IN_PROGRESS`, and the documented\n * recovery is to retry the same key with bounded backoff. Left to callers,\n * every integration reimplements that, usually without a cap. The payload is\n * replayed verbatim -- changing it would turn the retry into a fingerprint\n * mismatch.\n */\n private async _withProvisioningRetry<T>(\n config: ConvaiConfig,\n run: () => Promise<T>,\n ): Promise<T> {\n const setting = config.rosterProvisioningRetry;\n if (setting === false) return run();\n\n const attempts = Math.max(1, setting?.attempts ?? ConvaiClient.ROSTER_RETRY_ATTEMPTS);\n const initialDelayMs = Math.max(\n 0,\n setting?.initialDelayMs ?? ConvaiClient.ROSTER_RETRY_INITIAL_MS,\n );\n\n let lastError: unknown;\n for (let attempt = 0; attempt < attempts; attempt++) {\n try {\n return await run();\n } catch (error) {\n lastError = error;\n const retryable =\n error instanceof ConvaiRoomError && error.isRetryable;\n if (!retryable || attempt === attempts - 1) throw error;\n // Jitter so a lobby of clients waking on the same room does not\n // retry in lockstep.\n const base = initialDelayMs * 2 ** attempt;\n const jittered = base * (0.8 + Math.random() * 0.4);\n await new Promise((resolve) => setTimeout(resolve, jittered));\n }\n }\n throw lastError;\n }\n\n /**\n * Join a multi-character room that already exists.\n *\n * A join supplies a locator and the joining human, and nothing else: the\n * roster is server-owned, so resending topology is rejected. It never spawns,\n * removes or repairs a character -- only room creation does that.\n *\n * Capacity counts distinct speakers derived from `endUserId`, and defaults to\n * one, so raise `maxNumParticipants` at creation before expecting a second\n * human to get in.\n *\n * @example\n * ```ts\n * const client = new ConvaiClient({ apiKey: 'YOUR_API_KEY' })\n * await client.joinRoom({\n * roomSessionId: 'the-room-session-id',\n * endUserId: 'player-99',\n * })\n * ```\n */\n async joinRoom(options: JoinRoomOptions): Promise<void> {\n validateJoinOptions(options);\n // joinRoom is a credentialed Workspace connection, not a publication.\n // Reset this before further validation so a rejected normal attempt also\n // cannot leave a reused client in published-session mode.\n this._isPublishedChatSession = false;\n\n const stored = this._storedConfig ?? {};\n const url = stored.url ?? \"https://realtime-api.convai.com\";\n if (!stored.apiKey && !stored.authToken) {\n throw new Error(\"Either apiKey or authToken is required to join a room\");\n }\n\n this._logRtviMessages = stored.logRtviMessages !== false;\n this._messageHandler.setRtviMessageLogging(this._logRtviMessages);\n this.updateState({ isConnecting: true });\n\n try {\n const connectionData = await this._withProvisioningRetry(stored, async () => {\n const response = await fetch(`${url}/connect`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...(stored.apiKey\n ? { \"X-API-Key\": stored.apiKey }\n : { \"API-AUTH-TOKEN\": stored.authToken! }),\n },\n body: JSON.stringify(buildJoinRequestBody(options)),\n });\n\n if (!response.ok) {\n const text = await response.text();\n let parsed: unknown = text;\n try {\n parsed = JSON.parse(text);\n } catch {\n /* keep the raw text as the detail */\n }\n throw roomErrorFromResponse(response.status, parsed);\n }\n return (await response.json()) as ConnectionData;\n });\n\n // The join response carries the persisted roster, so the joining client\n // learns the topology it never sent.\n const rosterCharacters = (connectionData as unknown as {\n characters?: { character_id?: string }[];\n }).characters;\n const initialCharacterId = rosterCharacters?.[0]?.character_id;\n\n const joinConfig: ConvaiConfig = {\n ...stored,\n characters: undefined,\n characterId: initialCharacterId ?? stored.characterId,\n endUserId: options.endUserId,\n ...(options.endUserMetadata\n ? { endUserMetadata: options.endUserMetadata }\n : {}),\n };\n this._storedConfig = joinConfig;\n\n const configWithDefaults = this.applyConfigDefaults(joinConfig, {\n requireCredential: false,\n });\n return await this.consumeConnectionData(connectionData, configWithDefaults);\n } catch (error) {\n await this.cleanupWebSocketSessionAfterConnectFailure();\n this.updateState({ isConnected: false, isConnecting: false });\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 // Runs for every topology: the v2 protocol constraints rule out\n // sharedSessionKey and extra human capacity in single-character rooms too.\n validateProtocolTopology(configWithDefaults);\n\n const roster = isRosterConfig(configWithDefaults);\n if (missingCredential || (!roster && !configWithDefaults.characterId)) {\n throw new Error(\n \"Either apiKey or authToken is required, and characterId is required\",\n );\n }\n // A roster names its members individually; every roster rule is checked\n // before a request is built.\n if (roster) {\n validateRosterConfig(configWithDefaults);\n const initial = configWithDefaults.characters![0]!.characterId.trim();\n return {\n ...configWithDefaults,\n // Singular readouts mirror characters[0], exactly as the wire's own\n // top-level session_id/character_session_id aliases do.\n characterId: initial,\n characterVersion: null,\n characterReference: initial,\n };\n }\n\n // Split the character id from its version selector. The bare UUID names\n // the character everywhere inside the SDK (memory, character info); the\n // joined reference is what the runtime receives.\n const reference = resolveCharacterReference(\n configWithDefaults.characterId!,\n configWithDefaults.characterVersion,\n );\n\n return {\n ...configWithDefaults,\n characterId: reference.characterId,\n characterVersion: reference.version,\n characterReference: reference.reference,\n };\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 this._characterVersion = configWithDefaults.characterVersion ?? null;\n this._characterReference = configWithDefaults.characterReference;\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 // The server answers a capability request with what it actually selected.\n // A silent downgrade would leave the client parsing v2 frames as v1 (or the\n // reverse), so each selection is validated and the model-output version the\n // message handler decodes is set from the server's answer, not the request.\n const selectedCapabilities =\n (connectionData as { capabilities?: Record<string, unknown> }).capabilities ?? {};\n const requestedCapabilities = configWithDefaults.capabilities;\n validateActionProtocolSelection(\n requestedCapabilities?.actionProtocolVersion,\n selectedCapabilities.action_protocol_version as number | undefined,\n );\n this._messageHandler.setModelOutputVersion(\n validateModelOutputVersionSelection(\n requestedCapabilities?.modelOutputVersion,\n selectedCapabilities.model_output_version as number | undefined,\n ),\n );\n this._requestTraceId =\n (connectionData as { request_trace_id?: string }).request_trace_id ?? null;\n\n // Seed the roster before the transport comes up, so the first bot-ready and\n // any early roster change already have instances to match against.\n if (this._roster.applyConnectResponse(\n connectionData as unknown as Record<string, unknown>,\n )) {\n this.updateState({\n characters: this._roster.characters,\n activeMembershipId: this._roster.activeMembershipId,\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 * Connect to a published text-chat revision without publisher credentials.\n *\n * The launch grant is single-use and is never retained for reconnect. This\n * path is LiveKit data-only: it does not enable microphone, camera, TTS,\n * video, or lipsync.\n */\n async connectWithPublicationGrant(\n launchToken: string,\n options: PublishedChatConnectOptions = {},\n ): Promise<void> {\n if (\n typeof launchToken !== \"string\" ||\n launchToken.length < 32 ||\n launchToken.length > 512\n ) {\n throw new Error(\"A valid publication launch token is required\");\n }\n if (this._state.isConnected || this._state.isConnecting) {\n throw new Error(\"Disconnect the current session before connecting again\");\n }\n\n const throwIfAborted = (): void => {\n if (options.signal?.aborted) {\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n };\n throwIfAborted();\n\n let abortDisconnect: Promise<void> | null = null;\n const disconnectOnAbort = (): void => {\n abortDisconnect ??= this.disconnect().catch(() => undefined);\n };\n\n const apiUrl = (options.url ?? \"https://realtime-api.convai.com\").replace(\n /\\/+$/,\n \"\",\n );\n const connectAttemptId =\n options.connectAttemptId ??\n (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? `published_${crypto.randomUUID().replace(/-/g, \"\")}`\n : `published_${Date.now()}_${Math.random().toString(36).slice(2)}`);\n if (!/^[a-zA-Z0-9_-]{1,128}$/.test(connectAttemptId)) {\n throw new Error(\"A valid published chat connect attempt id is required\");\n }\n\n this._storedConfig = null;\n this._isPublishedChatSession = true;\n this._requestTraceId = null;\n this._apiKey = null;\n this._authToken = null;\n this._characterId = null;\n this._characterSessionId = \"-1\";\n this._endUserId = null;\n this._endUserMetadata = null;\n this._requestTraceId = null;\n this._memoryManager = null;\n this._connectionType = \"text\";\n this._activeTransport = \"livekit\";\n // Published chat does not negotiate protocol capabilities. A client may\n // have previously connected to a v2 character, so restore the default v1\n // handling before accepting this text-only session's legacy envelopes.\n this._messageHandler.setModelOutputVersion(1);\n this.updateState({ isConnecting: true });\n\n try {\n options.signal?.addEventListener(\"abort\", disconnectOnAbort, {\n once: true,\n });\n const exchangeGrant = (): Promise<Response> =>\n fetch(`${apiUrl}/published-chat/connect`, {\n method: \"POST\",\n // A published launch token is bearer-like. Never include any ambient\n // cookies when the host happens to be same-origin with Core.\n credentials: \"omit\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n launch_token: launchToken,\n connect_attempt_id: connectAttemptId,\n }),\n signal: options.signal,\n });\n\n const readConnectionResponse = async (\n response: Response,\n retryTransientFailure: boolean,\n ): Promise<PublishedChatConnectionData> => {\n if (!response.ok) {\n if (retryTransientFailure && response.status >= 500) {\n throw new RetryablePublishedChatExchangeError();\n }\n\n const errorText = await response.text();\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorData = JSON.parse(errorText);\n this._requestTraceId =\n errorData.request_trace_id ?? errorData.requestTraceId ?? null;\n const raw = errorData.message ?? errorData.error ?? errorData.detail;\n errorMessage =\n typeof raw === \"string\"\n ? raw\n : raw == null\n ? errorMessage\n : JSON.stringify(raw);\n } catch {\n if (errorText) errorMessage = `${errorMessage}: ${errorText}`;\n }\n throw new Error(errorMessage);\n }\n\n let connectionData: unknown;\n try {\n connectionData = await response.json();\n } catch {\n if (retryTransientFailure) {\n throw new RetryablePublishedChatExchangeError();\n }\n throw new Error(\"Published chat returned an invalid connection response\");\n }\n throwIfAborted();\n if (\n typeof connectionData !== \"object\" ||\n connectionData === null ||\n typeof (connectionData as Record<string, unknown>).room_url !== \"string\" ||\n typeof (connectionData as Record<string, unknown>).token !== \"string\" ||\n typeof (connectionData as Record<string, unknown>).character_session_id !==\n \"string\"\n ) {\n if (retryTransientFailure) {\n throw new RetryablePublishedChatExchangeError();\n }\n throw new Error(\"Published chat returned an invalid connection response\");\n }\n\n return connectionData as PublishedChatConnectionData;\n };\n\n const requestConnection = async (\n retryTransientFailure: boolean,\n ): Promise<PublishedChatConnectionData> => {\n let response: Response;\n try {\n response = await exchangeGrant();\n } catch (error) {\n throwIfAborted();\n if (retryTransientFailure) {\n throw new RetryablePublishedChatExchangeError();\n }\n throw error;\n }\n return readConnectionResponse(response, retryTransientFailure);\n };\n\n let connectionData: PublishedChatConnectionData;\n try {\n connectionData = await requestConnection(true);\n } catch (error) {\n throwIfAborted();\n if (!(error instanceof RetryablePublishedChatExchangeError)) {\n throw error;\n }\n // A response can be lost or corrupted after Core consumed the\n // single-use grant. Retry exactly once with the same attempt key;\n // Core/Character API replay that logical attempt instead of creating\n // a second session.\n connectionData = await requestConnection(false);\n }\n throwIfAborted();\n\n this._requestTraceId = connectionData.request_trace_id ?? null;\n this._characterSessionId = connectionData.character_session_id;\n this._endUserId = connectionData.end_user_id ?? null;\n this._endUserMetadata = connectionData.end_user_metadata ?? null;\n\n await this._room.connect(connectionData.room_url, connectionData.token, {\n rtcConfig: {\n // Hosted Core has TURN, so relay is the safe default. On-prem\n // deployments without TURN may explicitly allow host/srflx paths.\n iceTransportPolicy: options.iceTransportPolicy ?? \"relay\",\n },\n });\n throwIfAborted();\n\n this._audioManager.syncStateFromRoom({ emit: true });\n this._participantSid = this._room.localParticipant.sid;\n this.updateState({\n isConnected: true,\n isConnecting: false,\n endUserId: this._endUserId,\n endUserMetadata: this._endUserMetadata,\n });\n this.emit(\"connect\");\n this._startClientReadyHandshake();\n } catch (error) {\n if (options.signal?.aborted) {\n abortDisconnect ??= this.disconnect().catch(() => undefined);\n await abortDisconnect;\n }\n this.updateState({ isConnected: false, isConnecting: false });\n this.emit(\"error\", error);\n throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", disconnectOnAbort);\n }\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 // Unconditional: the branches below each depend on a transport being\n // matched, and none of them runs when there is nothing to tear down. A\n // command in flight must still be settled either way.\n this._failPendingRosterCommands(\n \"Disconnected before the roster command was acknowledged; its outcome is unknown\",\n );\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 } else if (this._state.isConnected || this._state.isConnecting) {\n // No transport matched, but the client believes it is (or is becoming)\n // connected -- a connect() that failed after flipping isConnecting, or\n // was torn down underneath us. Without this branch disconnect() was a\n // silent no-op here and the flags stayed stuck, so a UI bound to\n // stateChange kept showing a session that did not exist.\n this._connectionStateHandler.resetConnectionState();\n this.clearAllManagers();\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._failPendingRosterCommands(\n \"Disconnected before the roster command was acknowledged; its outcome is unknown\",\n );\n this._roster.reset();\n this._sseSession = null;\n this._apiKey = null;\n this._authToken = null;\n this._characterId = null;\n this._characterVersion = null;\n this._characterReference = 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 // In a roster room the singular session id is a compatibility mirror of\n // characters[0], and character sessions are server-owned -- there is no\n // client-side reset for them. Throwing names the situation; a silent no-op\n // would look like it worked.\n if (this._roster.isMultiCharacter) {\n throw new Error(\n \"resetSession() is not supported in a multi-character room; character sessions are server-owned\",\n );\n }\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 (this._activeTransport === \"sse\") {\n const requestedDynamicInfo = options.dynamicInfo?.trim();\n if (requestedDynamicInfo) {\n this._sseSession?.updateDynamicInfo(requestedDynamicInfo);\n }\n const messages = [];\n const dynamicInfo = this._sseSession?.getDynamicInfo()?.trim();\n if (dynamicInfo) {\n messages.push({\n type: \"update-dynamic-info\",\n data: { dynamic_info: { text: dynamicInfo } },\n });\n }\n if (stateOfMind) {\n messages.push({ type: \"update-emotion\", data: { state_of_mind: stateOfMind } });\n }\n messages.push({\n type: \"user_text_message\",\n data: userTextMessage,\n ...(logicalTurnId !== undefined ? { id: logicalTurnId } : {}),\n });\n this._sseSession?.sendMessages(messages);\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 // The submitted line is appended locally on every transport, so it shows\n // without waiting for a server echo. Sessions that do echo it back as a\n // final user-transcription are deduplicated in the message handler.\n this._messageHandler.addUserTextMessage(text);\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Return a correlated terminal result for a client-executed tool call.\n */\n sendActionResult(result: ActionResult): void {\n const payload = this.buildActionResultPayload(result);\n this.publishMessage(\"action-result\", payload);\n }\n\n /**\n * Publish one correlated terminal result and wait for Core's exact\n * `server-response` acknowledgement. This method performs one publication;\n * callers own any idempotent retry policy.\n */\n async sendActionResultAndWait(\n result: ActionResult,\n options: ActionResultAckOptions = {},\n ): Promise<ActionResultAck> {\n const timeoutMs =\n options.timeoutMs ?? ConvaiClient.ACTION_RESULT_ACK_TIMEOUT_MS;\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {\n throw new Error(\n \"Action result acknowledgement timeout must be greater than zero\",\n );\n }\n if (options.signal?.aborted) {\n throw new ActionResultAckError(\"Action result acknowledgement was aborted\", {\n reason: \"aborted\",\n toolCallId: result.id,\n });\n }\n\n const payload = this.buildActionResultPayload(result);\n const toolCallId = payload.id;\n if (this._pendingActionResultAcks.has(toolCallId)) {\n throw new ActionResultAckError(\n `An action result acknowledgement is already pending for ${toolCallId}`,\n {\n reason: \"duplicate_in_flight\",\n toolCallId,\n },\n );\n }\n\n const reservation = Symbol(toolCallId);\n this._pendingActionResultAcks.set(toolCallId, reservation);\n\n return new Promise<ActionResultAck>((resolve, reject) => {\n let settled = false;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n let unsubscribe: (() => void) | null = null;\n\n const cleanup = () => {\n if (timeout !== null) {\n clearTimeout(timeout);\n timeout = null;\n }\n if (unsubscribe) {\n unsubscribe();\n unsubscribe = null;\n }\n options.signal?.removeEventListener(\"abort\", handleAbort);\n if (this._pendingActionResultAcks.get(toolCallId) === reservation) {\n this._pendingActionResultAcks.delete(toolCallId);\n }\n };\n const resolveOnce = (ack: ActionResultAck) => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve(ack);\n };\n const rejectOnce = (error: ActionResultAckError) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n };\n const handleAbort = () => {\n rejectOnce(\n new ActionResultAckError(\"Action result acknowledgement was aborted\", {\n reason: \"aborted\",\n toolCallId,\n }),\n );\n };\n const handleServerResponse = (response: unknown) => {\n if (!response || typeof response !== \"object\") return;\n const candidate = response as Partial<ServerResponse>;\n if (candidate.event_type !== \"action-result\") return;\n const extras = candidate.extras;\n if (!extras || extras.tool_call_id !== toolCallId) return;\n\n const message =\n typeof candidate.message === \"string\" ? candidate.message : null;\n if (candidate.status === \"success\") {\n resolveOnce({\n toolCallId,\n status: \"success\",\n message,\n idempotent: extras.idempotent === true,\n });\n return;\n }\n if (candidate.status !== \"error\") return;\n\n const errorCode =\n typeof extras.error_code === \"string\" ? extras.error_code : undefined;\n rejectOnce(\n new ActionResultAckError(\n message ?? errorCode ?? \"Core rejected the action result\",\n {\n reason: \"server_error\",\n toolCallId,\n ...(errorCode ? { errorCode } : {}),\n response: candidate as ServerResponse,\n },\n ),\n );\n };\n\n // Register every terminal observer before publication so a synchronous\n // WebSocket acknowledgement cannot outrun its waiter.\n unsubscribe = this.on(\"serverResponse\", handleServerResponse);\n options.signal?.addEventListener(\"abort\", handleAbort, { once: true });\n timeout = setTimeout(() => {\n rejectOnce(\n new ActionResultAckError(\n `Timed out waiting for action result acknowledgement for ${toolCallId}`,\n {\n reason: \"timeout\",\n toolCallId,\n },\n ),\n );\n }, timeoutMs);\n\n void this.publishMessageAndWaitForLocalPublication(\n \"action-result\",\n payload,\n ).catch((cause: unknown) => {\n const detail = cause instanceof Error ? `: ${cause.message}` : \"\";\n rejectOnce(\n new ActionResultAckError(\n `Failed to publish action result ${toolCallId}${detail}`,\n {\n reason: \"publication_error\",\n toolCallId,\n cause,\n },\n ),\n );\n });\n });\n }\n\n private buildActionResultPayload(result: ActionResult): ActionResultPayload {\n if (!this.isTransportReady()) {\n throw new Error(\"Cannot send an action result before the session is ready\");\n }\n if (!result.id.trim()) throw new Error(\"Action result id is required\");\n if (\n result.status !== \"completed\" &&\n result.status !== \"error\" &&\n result.status !== \"cancelled\"\n ) {\n throw new Error(\"Unsupported action result status\");\n }\n if (result.status === \"completed\" && result.error !== undefined) {\n throw new Error(\"Completed action results cannot include error\");\n }\n if (result.output !== undefined && !isJsonValue(result.output)) {\n throw new Error(\"Action result output must contain only finite JSON values\");\n }\n if (result.error !== undefined && !isJsonValue(result.error)) {\n throw new Error(\"Action result error must contain only finite JSON values\");\n }\n\n const characterSessionId =\n result.characterSessionId ?? this._characterSessionId;\n return {\n id: result.id,\n status: result.status,\n ...(result.output !== undefined && { output: result.output }),\n ...(result.error !== undefined && { error: result.error }),\n ...(characterSessionId &&\n characterSessionId !== \"-1\" && {\n character_session_id: characterSessionId,\n }),\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 const nextDynamicInfo = dynamicInfo.trim();\n if (this._storedConfig) {\n this._storedConfig = { ...this._storedConfig, dynamicInfo: nextDynamicInfo };\n }\n\n if (this._activeTransport === \"sse\" && this._sseSession) {\n this._sseSession.updateDynamicInfo(nextDynamicInfo);\n return;\n }\n\n this.publishMessage(\"update-dynamic-info\", {\n dynamic_info: { text: nextDynamicInfo },\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 if (this._activeTransport === \"sse\" && this._sseSession) {\n const data = {\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 };\n if (options.run_llm === \"false\") {\n this._sseSession.queueMessage(\"context-update\", data);\n } else {\n this._sseSession.sendMessage(\"context-update\", data);\n }\n return;\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 if (this._activeTransport === \"sse\") 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"]}
|
|
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 PublishedChatConnectOptions,\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 ActionResult,\n SendUserTextMessageOptions,\n ModelOutputMessage,\n ModelOutputProtocolError,\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 buildBlendshapeConnectConfig,\n serializeClientTools,\n serializeProtocolCapabilities,\n validateActionProtocolSelection,\n validateBotLlmTextModeSelection,\n validateModelOutputVersionSelection,\n} from \"./connectRequest\";\nimport {\n shouldPreemptForContextUpdateResponse,\n shouldPreemptForExplicitRespondMode,\n} from \"./contextUpdateRequest\";\nimport {\n resolveVisionInputConfig,\n serializeVisionInputConfig,\n} from \"./visionRequest\";\nimport { isJsonValue } from \"./modelOutput\";\nimport { isValidLogicalTurnId } from \"./logicalTurn.js\";\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\" | \"text\" | 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 _requestTraceId: string | null = null;\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 private _isPublishedChatSession: 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\" | \"text\" | null {\n return this._connectionType;\n }\n\n get isPublishedChatSession(): boolean {\n return this._isPublishedChatSession;\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 requestTraceId(): string | null {\n return this._requestTraceId;\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(\"modelOutput\", (data: ModelOutputMessage) => {\n this.emit(\"modelOutput\", data);\n });\n\n this._messageHandler.on(\n \"modelOutputProtocolError\",\n (data: ModelOutputProtocolError) => {\n this.emit(\"modelOutputProtocolError\", data);\n },\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 === \"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 this._isPublishedChatSession = false;\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 // 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 this._messageHandler.setModelOutputVersion(1);\n\n const hasApiKey = Boolean(configWithDefaults.apiKey);\n const hasAuthToken = Boolean(configWithDefaults.authToken);\n if ((!hasApiKey && !hasAuthToken) || !configWithDefaults.characterId) {\n throw new Error(\n \"Either apiKey or authToken is required, and characterId is required\",\n );\n }\n\n this.updateState({ isConnecting: true });\n this._requestTraceId = null;\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 serializedCapabilities = serializeProtocolCapabilities(\n configWithDefaults.capabilities,\n );\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 ...(serializedCapabilities && {\n capabilities: serializedCapabilities,\n }),\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 ...(configWithDefaults.actionConfig.tools && {\n tools: serializeClientTools(configWithDefaults.actionConfig.tools),\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\n const selectedCapabilities = connectionData.capabilities ?? {};\n const requestedCapabilities = configWithDefaults.capabilities;\n validateActionProtocolSelection(\n requestedCapabilities?.actionProtocolVersion,\n selectedCapabilities.action_protocol_version,\n );\n validateBotLlmTextModeSelection(\n requestedCapabilities?.botLlmTextMode,\n selectedCapabilities.bot_llm_text_mode,\n );\n this._messageHandler.setModelOutputVersion(\n validateModelOutputVersionSelection(\n requestedCapabilities?.modelOutputVersion,\n selectedCapabilities.model_output_version,\n ),\n );\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 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 } 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 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 * Connect to a published text-chat revision without publisher credentials.\n *\n * The launch grant is single-use and is never retained for reconnect. This\n * path is LiveKit data-only: it does not enable microphone, camera, TTS,\n * video, or lipsync.\n */\n async connectWithPublicationGrant(\n launchToken: string,\n options: PublishedChatConnectOptions = {},\n ): Promise<void> {\n if (\n typeof launchToken !== \"string\" ||\n launchToken.length < 32 ||\n launchToken.length > 512\n ) {\n throw new Error(\"A valid publication launch token is required\");\n }\n if (this._state.isConnected || this._state.isConnecting) {\n throw new Error(\"Disconnect the current session before connecting again\");\n }\n\n const throwIfAborted = (): void => {\n if (options.signal?.aborted) {\n throw new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n };\n throwIfAborted();\n\n let abortDisconnect: Promise<void> | null = null;\n const disconnectOnAbort = (): void => {\n abortDisconnect ??= this.disconnect().catch(() => undefined);\n };\n\n const apiUrl = (options.url ?? \"https://realtime-api.convai.com\").replace(\n /\\/+$/,\n \"\",\n );\n const connectAttemptId =\n options.connectAttemptId ??\n (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? `published_${crypto.randomUUID().replace(/-/g, \"\")}`\n : `published_${Date.now()}_${Math.random().toString(36).slice(2)}`);\n if (!/^[a-zA-Z0-9_-]{1,128}$/.test(connectAttemptId)) {\n throw new Error(\"A valid published chat connect attempt id is required\");\n }\n\n this._storedConfig = null;\n this._isPublishedChatSession = true;\n this._requestTraceId = null;\n this._apiKey = null;\n this._authToken = null;\n this._characterId = null;\n this._characterSessionId = \"-1\";\n this._endUserId = null;\n this._endUserMetadata = null;\n this._memoryManager = null;\n this._connectionType = \"text\";\n this._activeTransport = \"livekit\";\n // Published chat does not negotiate protocol capabilities. A client may\n // have previously connected to a v2 character, so restore the default v1\n // handling before accepting this text-only session's legacy envelopes.\n this._messageHandler.setModelOutputVersion(1);\n this.updateState({ isConnecting: true });\n\n try {\n options.signal?.addEventListener(\"abort\", disconnectOnAbort, {\n once: true,\n });\n const exchangeGrant = (): Promise<Response> =>\n fetch(`${apiUrl}/published-chat/connect`, {\n method: \"POST\",\n // A published launch token is bearer-like. Never include any ambient\n // cookies when the host happens to be same-origin with Core.\n credentials: \"omit\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n launch_token: launchToken,\n connect_attempt_id: connectAttemptId,\n }),\n signal: options.signal,\n });\n\n let response: Response;\n let exchangeRetried = false;\n try {\n response = await exchangeGrant();\n } catch (error) {\n throwIfAborted();\n // A response can be lost after Core consumed the single-use grant.\n // Retry exactly once with the same attempt key; Core/Character API\n // replay that logical attempt instead of creating a second session.\n exchangeRetried = true;\n response = await exchangeGrant();\n }\n if (!exchangeRetried && response.status >= 500) {\n throwIfAborted();\n response = await exchangeGrant();\n }\n throwIfAborted();\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `HTTP ${response.status}`;\n try {\n const errorData = JSON.parse(errorText);\n this._requestTraceId =\n errorData.request_trace_id ?? errorData.requestTraceId ?? null;\n const raw = errorData.message ?? errorData.error ?? errorData.detail;\n errorMessage =\n typeof raw === \"string\"\n ? raw\n : raw == null\n ? errorMessage\n : JSON.stringify(raw);\n } catch {\n if (errorText) errorMessage = `${errorMessage}: ${errorText}`;\n }\n throw new Error(errorMessage);\n }\n\n const connectionData = await response.json();\n throwIfAborted();\n if (\n typeof connectionData.room_url !== \"string\" ||\n typeof connectionData.token !== \"string\" ||\n typeof connectionData.character_session_id !== \"string\"\n ) {\n throw new Error(\"Published chat returned an invalid connection response\");\n }\n\n this._requestTraceId = connectionData.request_trace_id ?? null;\n this._characterSessionId = connectionData.character_session_id;\n this._endUserId = connectionData.end_user_id ?? null;\n this._endUserMetadata = connectionData.end_user_metadata ?? null;\n\n await this._room.connect(connectionData.room_url, connectionData.token, {\n rtcConfig: { iceTransportPolicy: \"relay\" },\n });\n throwIfAborted();\n\n this._audioManager.syncStateFromRoom({ emit: true });\n this._participantSid = this._room.localParticipant.sid;\n this.updateState({\n isConnected: true,\n isConnecting: false,\n endUserId: this._endUserId,\n endUserMetadata: this._endUserMetadata,\n });\n this.emit(\"connect\");\n this._startClientReadyHandshake();\n } catch (error) {\n if (options.signal?.aborted) {\n abortDisconnect ??= this.disconnect().catch(() => undefined);\n await abortDisconnect;\n }\n this.updateState({ isConnected: false, isConnecting: false });\n this.emit(\"error\", error);\n throw error;\n } finally {\n options.signal?.removeEventListener(\"abort\", disconnectOnAbort);\n }\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(\n text: string,\n options?: SendUserTextMessageOptions,\n ): 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 this.publishMessage(\n \"user_text_message\",\n {\n text: text.trim(),\n participant_sid:\n this._participantSid || this._room.localParticipant?.sid,\n },\n logicalTurnId,\n );\n this._messageHandler.addUserTextMessage(text);\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Return a correlated terminal result for a client-executed tool call.\n */\n sendActionResult(result: ActionResult): void {\n if (!this.isTransportReady()) {\n throw new Error(\"Cannot send an action result before the session is ready\");\n }\n if (!result.id.trim()) throw new Error(\"Action result id is required\");\n if (\n result.status !== \"completed\" &&\n result.status !== \"error\" &&\n result.status !== \"cancelled\"\n ) {\n throw new Error(\"Unsupported action result status\");\n }\n if (result.status === \"completed\" && result.error !== undefined) {\n throw new Error(\"Completed action results cannot include error\");\n }\n if (result.output !== undefined && !isJsonValue(result.output)) {\n throw new Error(\"Action result output must contain only finite JSON values\");\n }\n if (result.error !== undefined && !isJsonValue(result.error)) {\n throw new Error(\"Action result error must contain only finite JSON values\");\n }\n\n const payload = {\n id: result.id,\n status: result.status,\n ...(result.output !== undefined && { output: result.output }),\n ...(result.error !== undefined && { error: result.error }),\n ...((result.characterSessionId ?? this._characterSessionId) &&\n (result.characterSessionId ?? this._characterSessionId) !== \"-1\" && {\n character_session_id:\n result.characterSessionId ?? this._characterSessionId,\n }),\n };\n this.publishMessage(\"action-result\", payload);\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"]}
|