@convai/web-sdk 1.8.0-beta.6 → 1.8.0-beta.7
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 +285 -1
- package/dist/core/ConvaiClient.d.ts +59 -2
- package/dist/core/ConvaiClient.d.ts.map +1 -1
- package/dist/core/ConvaiClient.js +457 -6
- package/dist/core/ConvaiClient.js.map +1 -1
- package/dist/core/MessageHandler.d.ts +11 -0
- package/dist/core/MessageHandler.d.ts.map +1 -1
- package/dist/core/MessageHandler.js +325 -30
- package/dist/core/MessageHandler.js.map +1 -1
- package/dist/core/SSESession.js +2 -2
- package/dist/core/SSESession.js.map +1 -1
- package/dist/core/connectRequest.d.ts +38 -3
- package/dist/core/connectRequest.d.ts.map +1 -1
- package/dist/core/connectRequest.js +57 -11
- package/dist/core/connectRequest.js.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/logicalTurn.d.ts +4 -1
- package/dist/core/logicalTurn.d.ts.map +1 -1
- package/dist/core/logicalTurn.js +35 -4
- package/dist/core/logicalTurn.js.map +1 -1
- package/dist/core/modelOutput.d.ts +40 -0
- package/dist/core/modelOutput.d.ts.map +1 -0
- package/dist/core/modelOutput.js +187 -0
- package/dist/core/modelOutput.js.map +1 -0
- package/dist/core/publishedChat.d.ts +9 -0
- package/dist/core/publishedChat.d.ts.map +1 -0
- package/dist/core/publishedChat.js +13 -0
- package/dist/core/publishedChat.js.map +1 -0
- package/dist/core/types.d.ts +225 -25
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/embed/ConvaiChatElement.d.ts +27 -0
- package/dist/embed/ConvaiChatElement.d.ts.map +1 -0
- package/dist/embed/ConvaiChatElement.js +300 -0
- package/dist/embed/ConvaiChatElement.js.map +1 -0
- package/dist/embed/browser.d.ts +3 -0
- package/dist/embed/browser.d.ts.map +1 -0
- package/dist/embed/browser.js +5 -0
- package/dist/embed/browser.js.map +1 -0
- package/dist/embed/chat-embed-v1.js +100 -0
- package/dist/embed/chat-embed-v1.js.map +7 -0
- package/dist/embed/index.d.ts +9 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +9 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/publicationApi.d.ts +23 -0
- package/dist/embed/publicationApi.d.ts.map +1 -0
- package/dist/embed/publicationApi.js +141 -0
- package/dist/embed/publicationApi.js.map +1 -0
- package/dist/react/components/ConvaiWidget.d.ts +11 -1
- package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
- package/dist/react/components/ConvaiWidget.js +67 -11
- package/dist/react/components/ConvaiWidget.js.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +2 -2
- package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -1
- package/dist/react/hooks/useConvaiClient.d.ts +2 -0
- package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
- package/dist/react/hooks/useConvaiClient.js +8 -0
- 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/ConvaiWidget.d.ts.map +1 -1
- package/dist/vanilla/ConvaiWidget.js +153 -32
- package/dist/vanilla/ConvaiWidget.js.map +1 -1
- package/dist/vanilla/WidgetEventSubscriptions.d.ts +15 -0
- package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -0
- package/dist/vanilla/WidgetEventSubscriptions.js +37 -0
- package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -0
- package/dist/vanilla/index.d.ts +1 -1
- package/dist/vanilla/index.d.ts.map +1 -1
- package/dist/vanilla/index.js +1 -1
- package/dist/vanilla/index.js.map +1 -1
- package/dist/vanilla/types.d.ts +8 -1
- 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.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +19 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../src/core/MessageHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Room, RoomEvent } from \"livekit-client\";\nimport {\n ChatMessage,\n ConvaiAction,\n InteractionCreated,\n ServerResponse,\n CharacterStatusEvent,\n} from \"./types\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport {\n BlendshapeQueue,\n type BlendshapeChunkMetadata,\n} from \"./BlendshapeQueue\";\n\ntype LifecycleOwnerPayload = {\n response_id?: string;\n neurosync_turn_id?: number;\n turn_id?: number;\n epoch?: number;\n};\n\n/**\n * Handles incoming messages from Convai\n * Processes various message types from the AI assistant and updates chat history\n */\nexport class MessageHandler extends EventEmitter {\n private room: Room | null = null;\n private chatMessages: ChatMessage[] = [];\n private activeBotLlmMessageId: string | null = null;\n private userTranscription: string = \"\";\n private logRtviMessages: boolean = true;\n private isBotResponding: boolean = false;\n private isSpeaking: boolean = false;\n private isListening: boolean = false;\n private totalBlendshapesReceived: number = 0;\n private blendshapeQueue: BlendshapeQueue;\n private _currentEmotion: { emotion: string; scale?: number } | null = null;\n // bot-output segments already added to the chat. The server re-sends the\n // same segment (full text) as TTS progress advances (spoken_status\n // in-progress → completed); only the first sighting may touch the chat.\n private seenBotOutputSegments = new Set<number | string>();\n\n // Fix 4: store a single bound reference so setupListeners/cleanupListeners use the\n // exact same function object. Previously .bind(this) in each call created a new\n // reference every time, making room.off() a no-op and leaking listeners on reconnect.\n private readonly _boundHandleDataReceived: (\n payload: Uint8Array,\n participant: unknown,\n ) => void;\n\n constructor(room?: Room) {\n super();\n this._boundHandleDataReceived = this.handleDataReceived.bind(this);\n this.blendshapeQueue = new BlendshapeQueue();\n if (room) {\n this.setRoom(room);\n }\n }\n\n /**\n * Get the blendshape queue instance\n */\n getBlendshapeQueue(): BlendshapeQueue {\n return this.blendshapeQueue;\n }\n\n /**\n * Enable or disable console logging for decoded incoming RTVI messages.\n */\n setRtviMessageLogging(enabled: boolean): void {\n this.logRtviMessages = enabled;\n }\n\n /**\n * Get current chat messages\n */\n getChatMessages(): ChatMessage[] {\n return this.chatMessages;\n }\n\n /**\n * Get current user transcription\n */\n getUserTranscription(): string {\n return this.userTranscription;\n }\n\n /**\n * Get bot responding state\n */\n getIsBotResponding(): boolean {\n return this.isBotResponding;\n }\n\n /**\n * Get speaking state\n */\n getIsSpeaking(): boolean {\n return this.isSpeaking;\n }\n\n /**\n * Get current bot emotion (updated from bot-emotion messages)\n */\n getEmotion(): { emotion: string; scale?: number } | null {\n return this._currentEmotion;\n }\n\n /**\n * Get whether the user is currently speaking (bot is in \"listening\" state).\n * True from user-started-speaking until user-stopped-speaking.\n */\n getIsListening(): boolean {\n return this.isListening;\n }\n\n /**\n * Local interruption path used by the client before the server cancel/terminal\n * arrives. Keep MessageHandler state and BlendshapeQueue state in sync so the\n * next bot-started-speaking can activate cleanly.\n */\n interruptLipsyncPlayback(): void {\n const wasSpeaking = this.isSpeaking;\n this.isSpeaking = false;\n this.blendshapeQueue.interrupt();\n if (wasSpeaking) {\n this.emit(\"speakingChange\", false);\n }\n }\n\n /**\n * Set the LiveKit room instance\n */\n setRoom(room: Room): void {\n // Clean up previous room listeners\n if (this.room) {\n this.cleanupListeners();\n }\n\n this.room = room;\n this.setupListeners();\n }\n\n /**\n * Setup message listeners\n */\n private setupListeners(): void {\n if (!this.room) return;\n\n this.room.on(RoomEvent.DataReceived, this._boundHandleDataReceived);\n }\n\n /**\n * Clean up message listeners\n */\n private cleanupListeners(): void {\n if (!this.room) return;\n\n this.room.off(RoomEvent.DataReceived, this._boundHandleDataReceived);\n }\n\n /**\n * Handle incoming data message\n */\n private handleDataReceived(\n payload: Uint8Array,\n _participant: unknown,\n _transport: \"livekit\" | \"websocket\" = \"livekit\",\n ): void {\n let messageString = \"\";\n let parsed = false;\n\n try {\n // Decode bytes to string\n const decoder = new TextDecoder();\n messageString = decoder.decode(payload);\n\n // Parse JSON\n const messageData = JSON.parse(messageString);\n parsed = true;\n\n // Extract and categorize messages for chat display\n const timestamp = new Date().toISOString();\n const messageId = `${messageData.type}-${Date.now()}-${Math.random()}`;\n\n // Multi-character routing identity, carried inline on every\n // character-originated event. Undefined in single-character sessions, so\n // these spread to nothing and every existing message keeps its shape.\n const attribution: Pick<ChatMessage, \"membershipId\" | \"characterId\"> = {\n ...(messageData.data?.membership_id && {\n membershipId: messageData.data.membership_id as string,\n }),\n ...(messageData.data?.character_id && {\n characterId: messageData.data.character_id as string,\n }),\n };\n /**\n * Two instances must never share a streaming bubble. Without this a\n * target switch mid-turn splices one character's text onto another's,\n * because the merge would only be checking `isStreaming`.\n */\n const sameSpeaker = (msg: ChatMessage | undefined): boolean =>\n !!msg && msg.membershipId === attribution.membershipId;\n\n // Handle different message types\n switch (messageData.type) {\n // User text messages - Skip these, only allow user-transcription\n case \"user_text_message\":\n case \"user-llm-text\":\n case \"text-input\":\n case \"user-input\":\n case \"text-message\":\n case \"chat-message\":\n case \"input-text\":\n case \"message\":\n // Skip user text messages - only allow user-transcription\n break;\n\n // Bot Ready - Bot is ready, connection should be true\n case \"bot-ready\":\n // `about` carries this instance's routing identity in a roster room,\n // and the same fields are also flattened onto `data`. Prefer `about`,\n // fall back to the flattened copy, and pass undefined for a\n // single-character session.\n this.emit(\n \"botReady\",\n messageData.data?.about ??\n (messageData.data?.membership_id ? messageData.data : undefined),\n );\n break;\n\n // Bot LLM Started - Begin streaming response\n case \"bot-llm-started\":\n this.isBotResponding = true;\n this.emit(\"botRespondingChange\", true);\n this.seenBotOutputSegments.clear();\n\n // Add initial streaming message to chat\n const streamingMessage: ChatMessage = {\n id: messageId,\n type: \"bot-llm-text\",\n content: \"\",\n timestamp: timestamp,\n isStreaming: true,\n ...attribution,\n };\n this.activeBotLlmMessageId = messageId;\n this.chatMessages.push(streamingMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n break;\n\n // Bot Output - Aggregated output stream (sentence/word-level, replaces bot-transcript)\n // Payload: { text, spoken, aggregated_by, segment_id, spoken_status,\n // spoken_progress }. The same segment_id is re-sent with the FULL\n // segment text on every TTS progress tick (spoken_status\n // \"in-progress\" → \"completed\"), so appending per event repeats the\n // sentence once per tick.\n case \"bot-output\":\n if (messageData.data?.text) {\n const newText = messageData.data.text;\n const segmentId = messageData.data.segment_id as\n | number\n | string\n | undefined;\n this.emit(\"botOutput\", {\n text: newText,\n spoken: messageData.data.spoken ?? false,\n aggregatedBy: messageData.data.aggregated_by ?? \"sentence\",\n segmentId,\n spokenStatus: messageData.data.spoken_status,\n });\n\n // Progress re-send of a segment already in the chat — skip.\n if (segmentId !== undefined) {\n if (this.seenBotOutputSegments.has(segmentId)) break;\n this.seenBotOutputSegments.add(segmentId);\n }\n\n const activeBotLlmMessage = this.activeBotLlmMessageId\n ? this.chatMessages.find(\n (message) => message.id === this.activeBotLlmMessageId,\n )\n : undefined;\n const lastMsg = this.chatMessages[this.chatMessages.length - 1];\n // When the reply is rendered by the LLM text stream\n // (bot-llm-text), the TTS echo adds nothing — never mix\n // bot-output into an LLM bubble (streaming or complete).\n if (activeBotLlmMessage?.type === \"bot-llm-text\") break;\n if (lastMsg?.type === \"bot-llm-text\") break;\n if (\n lastMsg?.type === \"bot-output\" &&\n lastMsg.content.includes(newText)\n ) {\n break;\n }\n if (\n lastMsg?.type === \"bot-output\" &&\n lastMsg.isStreaming &&\n sameSpeaker(lastMsg)\n ) {\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastMsg,\n content: lastMsg.content + newText,\n };\n } else {\n this.chatMessages.push({\n id: `bot-output-${Date.now()}-${Math.random()}`,\n type: \"bot-output\",\n content: newText,\n timestamp: new Date().toISOString(),\n isStreaming: true,\n ...attribution,\n });\n }\n this.emit(\"messagesChange\", this.chatMessages);\n }\n break;\n\n // Bot LLM Text Messages - Streaming chunks\n case \"bot-llm-text\":\n if (messageData.data?.text) {\n const newChunk = messageData.data.text;\n\n // Update the streaming message in chat\n const activeIndex = this.activeBotLlmMessageId\n ? this.chatMessages.findIndex(\n (message) =>\n message.id === this.activeBotLlmMessageId &&\n message.type === \"bot-llm-text\" &&\n message.isStreaming &&\n sameSpeaker(message),\n )\n : -1;\n if (activeIndex >= 0) {\n const activeMessage = this.chatMessages[activeIndex];\n this.chatMessages[activeIndex] = {\n ...activeMessage,\n content: activeMessage.content + newChunk,\n };\n } else {\n // If no streaming message exists yet, create one\n const streamingMsg: ChatMessage = {\n id: `${messageData.type}-${Date.now()}-${Math.random()}`,\n type: \"bot-llm-text\",\n content: newChunk,\n timestamp: new Date().toISOString(),\n isStreaming: true,\n ...attribution,\n };\n this.activeBotLlmMessageId = streamingMsg.id;\n this.chatMessages.push(streamingMsg);\n }\n this.emit(\"messagesChange\", this.chatMessages);\n }\n break;\n\n // Bot LLM Stopped - Complete streaming response\n case \"bot-llm-stopped\":\n const activeIndex = this.activeBotLlmMessageId\n ? this.chatMessages.findIndex(\n (message) => message.id === this.activeBotLlmMessageId,\n )\n : -1;\n if (activeIndex >= 0 && this.chatMessages[activeIndex].isStreaming) {\n const activeMessage = this.chatMessages[activeIndex];\n this.chatMessages[activeIndex] = {\n ...activeMessage,\n isStreaming: false,\n };\n }\n\n // Clear streaming state\n this.isBotResponding = false;\n this.emit(\"botRespondingChange\", false);\n this.emit(\"messagesChange\", this.chatMessages);\n break;\n\n // Text-only Interactions API terminal marker. This is deliberately a\n // separate event: a completed REST turn must not be represented as a\n // synthetic bot-llm-stopped message.\n case \"bot-turn-completed\":\n const completedIndex = this.activeBotLlmMessageId\n ? this.chatMessages.findIndex(\n (message) => message.id === this.activeBotLlmMessageId,\n )\n : -1;\n if (completedIndex >= 0 && this.chatMessages[completedIndex].isStreaming) {\n this.chatMessages[completedIndex] = {\n ...this.chatMessages[completedIndex],\n isStreaming: false,\n };\n this.emit(\"messagesChange\", this.chatMessages);\n }\n this.isBotResponding = false;\n this.emit(\"botRespondingChange\", false);\n this.emit(\"botTurnCompleted\", messageData.data ?? {});\n break;\n\n // User Transcription Messages\n case \"user-transcription\":\n if (messageData.data?.text) {\n const messageContent = messageData.data.text;\n\n if (messageData.data?.final) {\n // Final transcription - accumulate in single bubble until bot responds\n const lastUserMsg =\n this.chatMessages[this.chatMessages.length - 1];\n\n // Check if last message is an accumulating user message (isStreaming=true)\n if (\n lastUserMsg &&\n lastUserMsg.type === \"user-transcription\" &&\n lastUserMsg.isStreaming === true\n ) {\n // Accumulate: append new content to existing message with space\n const accumulatedContent =\n lastUserMsg.content.trim() + \" \" + messageContent.trim();\n\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastUserMsg,\n content: accumulatedContent,\n timestamp: timestamp,\n };\n } else {\n // Start new accumulating message (isStreaming=true means \"still accumulating\")\n const userMessage: ChatMessage = {\n id: messageId,\n type: \"user-transcription\",\n content: messageContent,\n timestamp: timestamp,\n isStreaming: true,\n };\n this.chatMessages.push(userMessage);\n }\n this.emit(\"messagesChange\", this.chatMessages);\n\n // Clear live transcription when final\n this.userTranscription = \"\";\n this.emit(\"userTranscriptionChange\", \"\");\n } else {\n // Non-final transcription - show in input field\n this.userTranscription = messageContent;\n this.emit(\"userTranscriptionChange\", messageContent);\n }\n }\n break;\n\n // Bot Emotion Messages — LiveKit path: arrives as an RTVI message frame (messageData.data)\n case \"bot-emotion\":\n if (messageData.data?.emotion) {\n this._currentEmotion = {\n emotion: messageData.data.emotion,\n scale: messageData.data.scale,\n };\n if (this.logRtviMessages) console.log(\"[SDK bot-emotion]\", messageData.data);\n this.emit(\"emotionChange\", this._currentEmotion);\n const emotionMessage: ChatMessage = {\n id: messageId,\n type: \"bot-emotion\",\n content: `${messageData.data.emotion} (scale: ${messageData.data.scale || 1})`,\n timestamp,\n };\n this.chatMessages.push(emotionMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n }\n break;\n // Bot TTS Text - Words as spoken by TTS (word-by-word for socket-based TTS)\n case \"bot-tts-text\":\n if (messageData.data?.text) {\n this.emit(\"botTtsText\", { text: messageData.data.text });\n }\n break;\n\n // Bot TTS lifecycle (more granular than bot-started/stopped-speaking)\n case \"bot-tts-started\":\n this.emit(\"botTtsStarted\");\n break;\n\n case \"bot-tts-stopped\":\n this.emit(\"botTtsStopped\");\n break;\n\n // Server-side muting indicators\n case \"user-mute-started\":\n this.emit(\"userMuteStarted\");\n break;\n\n case \"user-mute-stopped\":\n this.emit(\"userMuteStopped\");\n break;\n\n case \"user-started-speaking\":\n this.isListening = true;\n this.emit(\"listeningChange\", true);\n break;\n\n case \"user-stopped-speaking\":\n this.isListening = false;\n this.emit(\"listeningChange\", false);\n break;\n\n // Bot Started Speaking (priority over listening: state becomes speaking)\n case \"bot-started-speaking\": {\n const owner = this.lifecycleOwner(messageData.data);\n if (this.blendshapeQueue.isStaleOwner(owner)) {\n break;\n }\n const allowed = this.blendshapeQueue.startBotSpeaking();\n if (allowed) {\n this.isSpeaking = true;\n this.totalBlendshapesReceived = 0;\n this.emit(\"speakingChange\", true);\n }\n break;\n }\n\n // Bot Stopped Speaking\n case \"bot-stopped-speaking\":\n if (this.blendshapeQueue.isStaleOwner(this.lifecycleOwner(messageData.data))) {\n break;\n }\n if (this.isSpeaking) {\n this.isSpeaking = false;\n this.blendshapeQueue.stopBotSpeaking();\n this.emit(\"speakingChange\", false);\n }\n break;\n\n // Action Response Messages (LiveKit/WebRTC path)\n case \"action-response\":\n this._handleActionResponse(messageData.data?.actions ?? [], messageId, timestamp);\n break;\n\n case \"metrics\":\n if (messageData.data) {\n this.emit(\"metrics\", messageData.data);\n }\n break;\n\n // Per-turn usage/cost breakdown. Informational only: the server streams\n // it once the client opts in with usage-toggle, and it never affects\n // server-side usage tracking or billing.\n case \"usage-update\":\n if (messageData.data) {\n this.emit(\"usageUpdate\", messageData.data);\n }\n break;\n // Behavior Tree Response Messages\n case \"behavior-tree-response\":\n if (messageData.data?.narrative_section_id) {\n const behaviorMessage: ChatMessage = {\n id: messageId,\n type: \"behavior-tree\",\n content: `Narrative Section: ${messageData.data.narrative_section_id}`,\n timestamp,\n };\n this.chatMessages.push(behaviorMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n }\n break;\n\n // Server Message - Contains various data types like blendshapes\n case \"server-message\":\n if (messageData.data) {\n const serverData = messageData.data;\n\n switch (serverData.type) {\n case \"final-user-transcription\":\n if (serverData.text) {\n const finalText = serverData.text;\n const lastUserMsg =\n this.chatMessages[this.chatMessages.length - 1];\n if (\n lastUserMsg &&\n lastUserMsg.type === \"user-transcription\" &&\n lastUserMsg.isStreaming === true\n ) {\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastUserMsg,\n content: finalText,\n timestamp,\n isStreaming: false,\n };\n } else {\n this.chatMessages.push({\n id: `${serverData.type}-${Date.now()}-${Math.random()}`,\n type: \"user-transcription\",\n content: finalText,\n timestamp,\n isStreaming: false,\n });\n }\n this.emit(\"messagesChange\", this.chatMessages);\n this.userTranscription = \"\";\n this.emit(\"userTranscriptionChange\", \"\");\n }\n break;\n\n // WebSocket path: arrives inside a bot-text data message as serverData (not messageData.data)\n case \"bot-emotion\":\n if (serverData.emotion) {\n this._currentEmotion = {\n emotion: serverData.emotion,\n scale: serverData.scale,\n };\n if (this.logRtviMessages) console.log(\"[SDK bot-emotion (ws)]\", serverData);\n this.emit(\"emotionChange\", this._currentEmotion);\n }\n break;\n\n case \"blendshape-turn-stats\":\n if (this.blendshapeQueue.isStaleOwner(this.lifecycleOwner(serverData))) {\n break;\n }\n this.blendshapeQueue.endConversation(\n serverData.stats,\n this.lifecycleOwner(serverData),\n );\n this.emit(\"blendshapeStatsReceived\", serverData);\n break;\n\n case \"chunked-neurosync-blendshapes\":\n if (serverData.blendshapes) {\n const owner = this.lifecycleOwner(serverData);\n if (this.blendshapeQueue.isRetiredOwner(owner)) {\n break;\n }\n // If the queue is idle (no active conversation, bot not yet speaking),\n // start a conversation so early chunks from an initial bot greeting\n // are accepted rather than silently dropped.\n if (\n !this.blendshapeQueue.isConversationActive() &&\n !this.isSpeaking\n ) {\n this.blendshapeQueue.startConversation();\n }\n this.blendshapeQueue.addChunk(\n serverData.blendshapes,\n owner,\n );\n if (\n this.blendshapeQueue.consumeOwnerReplacementStoppedSpeaking() &&\n this.isSpeaking\n ) {\n this.isSpeaking = false;\n this.emit(\"speakingChange\", false);\n }\n this.totalBlendshapesReceived +=\n serverData.blendshapes.length;\n this.emit(\"blendshapes\", serverData);\n }\n break;\n\n case \"neurosync-blendshapes-cancel\": {\n const cancelledActive = this.blendshapeQueue.cancelOwner(\n this.lifecycleOwner(serverData),\n );\n if (cancelledActive && this.isSpeaking) {\n this.isSpeaking = false;\n this.emit(\"speakingChange\", false);\n }\n this.emit(\"blendshapeCancel\", serverData);\n break;\n }\n\n case \"user-idle-warning\": {\n const remainingSeconds: number | null =\n serverData.remaining_seconds ??\n serverData.remainingSeconds ??\n null;\n this.emit(\"idleWarning\", { remainingSeconds });\n this.chatMessages.push({\n id: `user-idle-warning-${Date.now()}-${Math.random()}`,\n type: \"idle-warning\",\n content:\n remainingSeconds !== null ? String(remainingSeconds) : \"\",\n timestamp,\n });\n this.emit(\"messagesChange\", this.chatMessages);\n break;\n }\n\n case \"llm-no-response\":\n this.emit(\"llmNoResponse\");\n this.chatMessages.push({\n id: `llm-no-response-${Date.now()}-${Math.random()}`,\n type: \"llm-no-response\",\n content: \"\",\n timestamp,\n });\n this.emit(\"messagesChange\", this.chatMessages);\n break;\n\n // Action Response (WebSocket/RTVI path — wrapped in server-message)\n case \"action-response\":\n this._handleActionResponse(serverData.actions ?? [], messageId, timestamp);\n break;\n\n // Server acknowledgment — arrives wrapped in server-message envelope\n case \"server-response\": {\n // client-ready is an internal RTVI handshake; server echoes an\n // \"Unknown message type\" error for it which is expected and harmless.\n if (serverData.event_type === \"client-ready\") break;\n const serverResponse: ServerResponse = {\n event_type: serverData.event_type ?? \"unknown\",\n status: serverData.status ?? \"error\",\n message: serverData.message ?? null,\n extras: serverData.extras ?? null,\n };\n this.emit(\"serverResponse\", serverResponse);\n break;\n }\n\n /**\n * Lifecycle of one roster member. Emitted when a member is added\n * at runtime, becomes ready, or fails after /connect already\n * returned 200. `bot-ready` stays the readiness authority --\n * a `character-status` of \"ready\" must not enable interaction on\n * its own -- but this is the only way a background dispatch\n * failure is ever reported.\n */\n case \"character-status\": {\n const status: CharacterStatusEvent = {\n status: (serverData.status as CharacterStatusEvent[\"status\"]) ?? \"starting\",\n membershipId: (serverData.membership_id as string) ?? \"\",\n characterId: (serverData.character_id as string) ?? \"\",\n characterSessionId:\n (serverData.character_session_id as string) ?? null,\n participantIdentity:\n (serverData.participant_identity as string) ??\n (serverData.membership_id\n ? `character:${serverData.membership_id}`\n : \"\"),\n roomSessionId: (serverData.room_session_id as string) ?? null,\n rosterEpoch:\n typeof serverData.roster_epoch === \"number\"\n ? serverData.roster_epoch\n : null,\n failureCode: (serverData.failure_code as string) ?? null,\n };\n // Unattributable status is dropped rather than guessed at.\n if (status.membershipId) this.emit(\"characterStatus\", status);\n break;\n }\n\n // interaction-created: session IDs for analytics/tracking\n case \"interaction-created\": {\n const interactionCreated: InteractionCreated = {\n interactionId: serverData.interaction_id,\n characterSessionId: serverData.character_session_id,\n };\n this.emit(\"interactionCreated\", interactionCreated);\n break;\n }\n }\n }\n break;\n\n // Fallback: server-response at top level (not currently observed but kept for safety)\n case \"server-response\": {\n if (messageData.event_type === \"client-ready\") break;\n const serverResponse: ServerResponse = {\n event_type: messageData.event_type ?? \"unknown\",\n status: messageData.status ?? \"error\",\n message: messageData.message ?? null,\n extras: messageData.extras ?? null,\n };\n this.emit(\"serverResponse\", serverResponse);\n break;\n }\n\n // Silently ignore other message types\n case \"moderation-response\":\n case \"trigger-message\":\n case \"update-template-keys\":\n case \"update-dynamic-info\":\n case \"interrupt-bot\":\n break;\n }\n } catch (error) {\n // Silently handle parse errors\n }\n }\n\n private _handleActionResponse(\n actions: ConvaiAction[],\n messageId: string,\n timestamp: string,\n ): void {\n this.emit(\"actionResponse\", { actions });\n const label = actions.length === 0\n ? \"No action\"\n : actions.map((a) => (a.target ? `${a.name} → ${a.target}` : a.name)).join(\", \");\n const actionMessage: ChatMessage = {\n id: messageId,\n type: \"action\",\n content: label,\n timestamp,\n };\n this.chatMessages.push(actionMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n }\n\n private lifecycleOwner(\n data: LifecycleOwnerPayload | undefined,\n ): BlendshapeChunkMetadata {\n if (!data) {\n return {};\n }\n\n return {\n responseId: data.response_id,\n neurosyncTurnId: data.neurosync_turn_id ?? data.turn_id,\n epoch: data.epoch,\n fps: this.numberOrUndefined((data as { fps?: number }).fps),\n startFrameIndex: this.numberOrUndefined(\n (data as { start_frame_index?: number }).start_frame_index,\n ),\n };\n }\n\n private numberOrUndefined(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n }\n\n /**\n * Public entry point for WebSocket transport to inject messages into the same pipeline.\n */\n handleDataReceivedPublic(payload: Uint8Array): void {\n this.handleDataReceived(payload, null, \"websocket\");\n }\n\n /**\n * Insert a message into the transcript locally. Nothing is transmitted and\n * no LLM turn is billed -- this is for client-side lines (a greeting, a\n * system notice, a replayed history entry) that must appear in the chat.\n *\n * Subscribers see it through the same `messagesChange` as a live message,\n * so React and the widgets pick it up with no special casing.\n */\n appendLocalMessage(message: {\n sender: \"user\" | \"bot\";\n content: string;\n membershipId?: string;\n characterId?: string;\n }): ChatMessage {\n const chatMessage: ChatMessage = {\n id: `local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,\n type: message.sender === \"user\" ? \"user-llm-text\" : \"bot-llm-text\",\n content: message.content,\n timestamp: new Date().toISOString(),\n ...(message.membershipId && { membershipId: message.membershipId }),\n ...(message.characterId && { characterId: message.characterId }),\n };\n this.chatMessages.push(chatMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n return chatMessage;\n }\n\n /**\n * Reset message state\n */\n reset(): void {\n this.chatMessages = [];\n this.activeBotLlmMessageId = null;\n this.userTranscription = \"\";\n this.isBotResponding = false;\n this.isSpeaking = false;\n this.isListening = false;\n this.totalBlendshapesReceived = 0;\n this._currentEmotion = null;\n this.blendshapeQueue.reset();\n this.emit(\"messagesChange\", this.chatMessages);\n this.emit(\"userTranscriptionChange\", \"\");\n this.emit(\"botRespondingChange\", false);\n this.emit(\"speakingChange\", false);\n this.emit(\"listeningChange\", false);\n this.emit(\"emotionChange\", null);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../src/core/MessageHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAWjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EACL,eAAe,GAEhB,MAAM,mBAAmB,CAAC;AAS3B,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3D,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7D,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aACpD,GAAG,CACF,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CACd,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAC1D,CAAC;QACJ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,oCAAoC,GAAG,GAAG,CAAC;AACjD,6EAA6E;AAC7E,sEAAsE;AACtE,MAAM,sCAAsC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/D;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,YAAY;IA4B9C,YAAY,IAAW;QACrB,KAAK,EAAE,CAAC;QA5BF,SAAI,GAAgB,IAAI,CAAC;QACzB,iBAAY,GAAkB,EAAE,CAAC;QACjC,0BAAqB,GAAkB,IAAI,CAAC;QAC5C,sBAAiB,GAAW,EAAE,CAAC;QAC/B,oBAAe,GAAY,IAAI,CAAC;QAChC,oBAAe,GAAY,KAAK,CAAC;QACjC,eAAU,GAAY,KAAK,CAAC;QAC5B,gBAAW,GAAY,KAAK,CAAC;QAC7B,6BAAwB,GAAW,CAAC,CAAC;QAErC,oBAAe,GAA+C,IAAI,CAAC;QACnE,uBAAkB,GAAU,CAAC,CAAC;QAC9B,4BAAuB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC5C,qCAAgC,GAAG,CAAC,CAAC;QAC7C,yEAAyE;QACzE,mEAAmE;QACnE,wEAAwE;QAChE,0BAAqB,GAAG,IAAI,GAAG,EAAmB,CAAC;QAYzD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAC7C,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,OAAgB;QACpC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;IACjC,CAAC;IAED,8EAA8E;IAC9E,qBAAqB,CAAC,OAAc;QAClC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;QAClC,IAAI,CAAC,6BAA6B,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,wBAAwB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;QACjC,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,IAAU;QAChB,mCAAmC;QACnC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACK,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QAEvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACK,kBAAkB,CACxB,OAAmB,EACnB,YAAqB,EACrB,aAAsC,SAAS;QAE/C,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IAAI,CAAC;YACH,yBAAyB;YACzB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;YAClC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAExC,aAAa;YACb,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC;YAEd,wEAAwE;YACxE,wEAAwE;YACxE,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,WAAW,CAAC,CAAC;YAClE,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;gBACrC,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YAED,mDAAmD;YACnD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,GAAG,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAEvE,4DAA4D;YAC5D,yEAAyE;YACzE,sEAAsE;YACtE,MAAM,WAAW,GAAsD;gBACrE,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,IAAI;oBACrC,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,aAAuB;iBACvD,CAAC;gBACF,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,IAAI;oBACpC,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,YAAsB;iBACrD,CAAC;aACH,CAAC;YACF;;;;eAIG;YACH,MAAM,WAAW,GAAG,CAAC,GAA4B,EAAW,EAAE,CAC5D,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAAC;YAEzD,iCAAiC;YACjC,QAAQ,WAAW,CAAC,IAAI,EAAE,CAAC;gBACzB,oEAAoE;gBACpE,2DAA2D;gBAC3D,KAAK,mBAAmB,CAAC;gBACzB,KAAK,eAAe,CAAC;gBACrB,KAAK,YAAY,CAAC;gBAClB,KAAK,YAAY,CAAC;gBAClB,KAAK,cAAc,CAAC;gBACpB,KAAK,cAAc,CAAC;gBACpB,KAAK,YAAY,CAAC;gBAClB,KAAK,SAAS;oBACZ,iFAAiF;oBACjF,MAAM;gBAER,sDAAsD;gBACtD,KAAK,WAAW;oBACd,qEAAqE;oBACrE,sEAAsE;oBACtE,4DAA4D;oBAC5D,4BAA4B;oBAC5B,IAAI,CAAC,IAAI,CACP,UAAU,EACV,WAAW,CAAC,IAAI,EAAE,KAAK;wBACrB,CAAC,WAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CACnE,CAAC;oBACF,MAAM;gBAER,6CAA6C;gBAC7C,KAAK,iBAAiB;oBACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAC5B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;oBACvC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;oBAEnC,mEAAmE;oBACnE,mEAAmE;oBACnE,sEAAsE;oBACtE,mEAAmE;oBACnE,MAAM,mBAAmB,GACvB,IAAI,CAAC,kBAAkB,KAAK,CAAC;wBAC7B,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,IAAI,KAAK,cAAc;4BAC/B,OAAO,CAAC,WAAW;4BACnB,OAAO,CAAC,OAAO,KAAK,EAAE;4BACtB,OAAO,CAAC,QAAQ,KAAK,SAAS;4BAC9B,OAAO,CAAC,aAAa,KAAK,SAAS,CACtC,CAAC;oBACJ,IAAI,mBAAmB;wBAAE,MAAM;oBAE/B,yCAAyC;oBACzC,MAAM,gBAAgB,GAAgB;wBACpC,EAAE,EAAE,SAAS;wBACb,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,EAAE;wBACX,SAAS,EAAE,SAAS;wBACpB,WAAW,EAAE,IAAI;wBACjB,GAAG,WAAW;qBACf,CAAC;oBACF,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;oBACvC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACzC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC/C,MAAM;gBAER,uFAAuF;gBACvF,qEAAqE;gBACrE,kEAAkE;gBAClE,yDAAyD;gBACzD,mEAAmE;gBACnE,0BAA0B;gBAC1B,KAAK,YAAY;oBACf,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;wBAC3B,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;wBACtC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,UAGtB,CAAC;wBACd,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;4BACrB,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK;4BACxC,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,aAAa,IAAI,UAAU;4BAC1D,SAAS;4BACT,YAAY,EAAE,WAAW,CAAC,IAAI,CAAC,aAAa;yBAC7C,CAAC,CAAC;wBAEH,4DAA4D;wBAC5D,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;4BAC5B,IAAI,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC;gCAAE,MAAM;4BACrD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;wBAC5C,CAAC;wBAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB;4BACpD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CACpB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,qBAAqB,CACvD;4BACH,CAAC,CAAC,SAAS,CAAC;wBACd,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAChE,oDAAoD;wBACpD,wDAAwD;wBACxD,yDAAyD;wBACzD,IAAI,mBAAmB,EAAE,IAAI,KAAK,cAAc;4BAAE,MAAM;wBACxD,IAAI,OAAO,EAAE,IAAI,KAAK,cAAc;4BAAE,MAAM;wBAC5C,IACE,OAAO,EAAE,IAAI,KAAK,YAAY;4BAC9B,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EACjC,CAAC;4BACD,MAAM;wBACR,CAAC;wBACD,IACE,OAAO,EAAE,IAAI,KAAK,YAAY;4BAC9B,OAAO,CAAC,WAAW;4BACnB,WAAW,CAAC,OAAO,CAAC,EACpB,CAAC;4BACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;gCAChD,GAAG,OAAO;gCACV,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,OAAO;6BACnC,CAAC;wBACJ,CAAC;6BAAM,CAAC;4BACN,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gCACrB,EAAE,EAAE,cAAc,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gCAC/C,IAAI,EAAE,YAAY;gCAClB,OAAO,EAAE,OAAO;gCAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCACnC,WAAW,EAAE,IAAI;gCACjB,GAAG,WAAW;6BACf,CAAC,CAAC;wBACL,CAAC;wBACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBACjD,CAAC;oBACD,MAAM;gBAER,2CAA2C;gBAC3C,KAAK,cAAc;oBACjB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;wBAC3B,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;wBACvC,8DAA8D;wBAC9D,kEAAkE;wBAClE,MAAM,QAAQ,GACZ,IAAI,CAAC,kBAAkB,KAAK,CAAC;4BAC7B,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC;4BACzC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS;4BAC5B,CAAC,CAAC,SAAS,CAAC;wBAChB,MAAM,aAAa,GACjB,IAAI,CAAC,kBAAkB,KAAK,CAAC;4BAC7B,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC;4BACpD,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe;4BAClC,CAAC,CAAC,SAAS,CAAC;wBAEhB,gEAAgE;wBAChE,gEAAgE;wBAChE,iEAAiE;wBACjE,4DAA4D;wBAC5D,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC;wBAC5B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;4BAC3B,KACE,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EACxC,KAAK,IAAI,CAAC,EACV,KAAK,EAAE,EACP,CAAC;gCACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gCACzC,IACE,OAAO,CAAC,IAAI,KAAK,cAAc;oCAC/B,OAAO,CAAC,WAAW;oCACnB,OAAO,CAAC,QAAQ,KAAK,QAAQ;oCAC7B,WAAW,CAAC,OAAO,CAAC,EACpB,CAAC;oCACD,kBAAkB,GAAG,KAAK,CAAC;oCAC3B,MAAM;gCACR,CAAC;4BACH,CAAC;4BAED,8DAA8D;4BAC9D,2DAA2D;4BAC3D,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;gCAC9B,KACE,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EACxC,KAAK,IAAI,CAAC,EACV,KAAK,EAAE,EACP,CAAC;oCACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;oCACzC,IACE,OAAO,CAAC,IAAI,KAAK,cAAc;wCAC/B,OAAO,CAAC,WAAW;wCACnB,OAAO,CAAC,OAAO,KAAK,EAAE;wCACtB,OAAO,CAAC,QAAQ,KAAK,SAAS;wCAC9B,OAAO,CAAC,aAAa,KAAK,SAAS;wCACnC,WAAW,CAAC,OAAO,CAAC,EACpB,CAAC;wCACD,kBAAkB,GAAG,KAAK,CAAC;wCAC3B,MAAM;oCACR,CAAC;gCACH,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;4BACvC,KACE,IAAI,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EACxC,KAAK,IAAI,CAAC,EACV,KAAK,EAAE,EACP,CAAC;gCACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gCACzC,IACE,OAAO,CAAC,IAAI,KAAK,cAAc;oCAC/B,OAAO,CAAC,WAAW;oCACnB,OAAO,CAAC,QAAQ,KAAK,SAAS;oCAC9B,OAAO,CAAC,aAAa,KAAK,aAAa;oCACvC,WAAW,CAAC,OAAO,CAAC,EACpB,CAAC;oCACD,kBAAkB,GAAG,KAAK,CAAC;oCAC3B,MAAM;gCACR,CAAC;4BACH,CAAC;4BAED,8DAA8D;4BAC9D,4CAA4C;4BAC5C,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;gCAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gCAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gCACjD,IACE,WAAW,EAAE,IAAI,KAAK,cAAc;oCACpC,WAAW,CAAC,WAAW;oCACvB,WAAW,CAAC,OAAO,KAAK,EAAE;oCAC1B,WAAW,CAAC,QAAQ,KAAK,SAAS;oCAClC,WAAW,CAAC,aAAa,KAAK,SAAS;oCACvC,WAAW,CAAC,WAAW,CAAC,EACxB,CAAC;oCACD,kBAAkB,GAAG,SAAS,CAAC;gCACjC,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,oEAAoE;4BACpE,oEAAoE;4BACpE,mEAAmE;4BACnE,kEAAkE;4BAClE,oCAAoC;4BACpC,kEAAkE;4BAClE,iEAAiE;4BACjE,sDAAsD;4BACtD,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;gCAC/B,kBAAkB,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAC9C,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,qBAAqB;oCACzC,OAAO,CAAC,IAAI,KAAK,cAAc;oCAC/B,OAAO,CAAC,WAAW;oCACnB,CAAC,OAAO,CAAC,QAAQ;oCACjB,CAAC,OAAO,CAAC,aAAa;oCACtB,WAAW,CAAC,OAAO,CAAC,CACvB,CAAC;4BACJ,CAAC;4BACD,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;gCAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;gCAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;gCACjD,IACE,WAAW;oCACX,WAAW,CAAC,IAAI,KAAK,cAAc;oCACnC,WAAW,CAAC,WAAW;oCACvB,CAAC,WAAW,CAAC,QAAQ;oCACrB,CAAC,WAAW,CAAC,aAAa;oCAC1B,WAAW,CAAC,WAAW,CAAC,EACxB,CAAC;oCACD,kBAAkB,GAAG,SAAS,CAAC;gCACjC,CAAC;4BACH,CAAC;wBACH,CAAC;wBAED,IAAI,cAA2B,CAAC;wBAChC,IAAI,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;4BAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;4BAC5D,cAAc,GAAG;gCACf,GAAG,aAAa;gCAChB,OAAO,EAAE,aAAa,CAAC,OAAO,GAAG,QAAQ;gCACzC,GAAG,CAAC,QAAQ,KAAK,SAAS;oCAC1B,aAAa,CAAC,QAAQ,KAAK,SAAS;oCAClC,CAAC,CAAC,EAAE,QAAQ,EAAE;oCACd,CAAC,CAAC,EAAE,CAAC;gCACP,GAAG,CAAC,aAAa,KAAK,SAAS;oCAC/B,aAAa,CAAC,aAAa,KAAK,SAAS;oCACvC,CAAC,CAAC,EAAE,aAAa,EAAE;oCACnB,CAAC,CAAC,EAAE,CAAC;6BACR,CAAC;4BACF,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,GAAG,cAAc,CAAC;wBACzD,CAAC;6BAAM,CAAC;4BACN,iDAAiD;4BACjD,cAAc,GAAG;gCACf,EAAE,EAAE,GAAG,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gCACxD,IAAI,EAAE,cAAc;gCACpB,OAAO,EAAE,QAAQ;gCACjB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gCACnC,WAAW,EAAE,IAAI;gCACjB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCACjC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gCAC3C,GAAG,WAAW;6BACf,CAAC;4BACF,IAAI,CAAC,qBAAqB,GAAG,cAAc,CAAC,EAAE,CAAC;4BAC/C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBACzC,CAAC;wBACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;oBACjE,CAAC;oBACD,MAAM;gBAER,oEAAoE;gBACpE,yDAAyD;gBACzD,KAAK,kBAAkB;oBACrB,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC5C,MAAM;gBAER,gDAAgD;gBAChD,KAAK,iBAAiB,CAAC,CAAC,CAAC;oBACvB,qEAAqE;oBACrE,gEAAgE;oBAChE,MAAM,iBAAiB,GAAkB,EAAE,CAAC;oBAC5C,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,EAAE,CAAC;wBAClC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;4BAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;4BACzC,IACE,CAAC,OAAO,CAAC,IAAI,KAAK,cAAc;gCAC9B,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC;gCAChC,OAAO,CAAC,WAAW,EACnB,CAAC;gCACD,MAAM,gBAAgB,GAAG;oCACvB,GAAG,OAAO;oCACV,WAAW,EAAE,KAAK;iCACnB,CAAC;gCACF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;gCAC5C,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;4BAC3C,CAAC;wBACH,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,qEAAqE;wBACrE,6DAA6D;wBAC7D,IAAI,SAAS,GAAG,IAAI,CAAC,qBAAqB;4BACxC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CACzB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,qBAAqB,CACvD;4BACH,CAAC,CAAC,CAAC,CAAC,CAAC;wBACP,IAAI,SAAS,KAAK,CAAC,CAAC;4BAAE,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;wBAChD,IAAI,UAAU,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;4BACzC,MAAM,gBAAgB,GAAG,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;4BAC/D,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,gBAAgB,CAAC;4BAChD,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;wBAC3C,CAAC;oBACH,CAAC;oBAED,wBAAwB;oBACxB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC7B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;oBACxC,mEAAmE;oBACnE,0DAA0D;oBAC1D,IAAI,CAAC,IAAI,CACP,gBAAgB,EAChB,IAAI,CAAC,YAAY,EACjB,SAAS,EACT,iBAAiB,CAClB,CAAC;oBACF,MAAM;gBACR,CAAC;gBAED,qEAAqE;gBACrE,qEAAqE;gBACrE,qCAAqC;gBACrC,KAAK,oBAAoB;oBACvB,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB;wBAC/C,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CACzB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,qBAAqB,CACvD;wBACH,CAAC,CAAC,CAAC,CAAC,CAAC;oBACP,IAAI,cAAc,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;wBACzE,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG;4BAClC,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;4BACpC,WAAW,EAAE,KAAK;yBACnB,CAAC;wBACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC7B,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;oBACtD,MAAM;gBAER,8BAA8B;gBAC9B,KAAK,oBAAoB;oBACvB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;wBAC3B,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;wBAE7C,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;4BAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CACnD,WAAW,CAAC,IAAI,CAAC,eAAe,CACjC,CAAC;4BACF,uEAAuE;4BACvE,MAAM,WAAW,GACf,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;4BAClD,0EAA0E;4BAC1E,yEAAyE;4BACzE,IACE,WAAW,EAAE,IAAI,KAAK,eAAe;gCACrC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE,EAC5D,CAAC;gCACD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;gCAC5B,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;gCACzC,MAAM;4BACR,CAAC;4BAED,2EAA2E;4BAC3E,IACE,WAAW;gCACX,WAAW,CAAC,IAAI,KAAK,oBAAoB;gCACzC,WAAW,CAAC,WAAW,KAAK,IAAI,EAChC,CAAC;gCACD,gEAAgE;gCAChE,MAAM,kBAAkB,GACtB,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;gCAE3D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;oCAChD,GAAG,WAAW;oCACd,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;oCACzD,OAAO,EAAE,kBAAkB;oCAC3B,SAAS,EAAE,SAAS;iCACrB,CAAC;4BACJ,CAAC;iCAAM,CAAC;gCACN,+EAA+E;gCAC/E,MAAM,WAAW,GAAgB;oCAC/B,EAAE,EAAE,SAAS;oCACb,IAAI,EAAE,oBAAoB;oCAC1B,OAAO,EAAE,cAAc;oCACvB,SAAS,EAAE,SAAS;oCACpB,WAAW,EAAE,IAAI;oCACjB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;iCAC1D,CAAC;gCACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;4BACtC,CAAC;4BACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;4BAE/C,sCAAsC;4BACtC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;4BAC5B,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;wBAC3C,CAAC;6BAAM,CAAC;4BACN,gDAAgD;4BAChD,IAAI,CAAC,iBAAiB,GAAG,cAAc,CAAC;4BACxC,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,cAAc,CAAC,CAAC;wBACvD,CAAC;oBACH,CAAC;oBACD,MAAM;gBAER,2FAA2F;gBAC3F,KAAK,aAAa;oBAChB,IAAI,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;wBAC9B,IAAI,CAAC,eAAe,GAAG;4BACrB,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO;4BACjC,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK;yBAC9B,CAAC;wBACF,IAAI,IAAI,CAAC,eAAe;4BAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;wBAC7E,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;wBACjD,MAAM,cAAc,GAAgB;4BAClC,EAAE,EAAE,SAAS;4BACb,IAAI,EAAE,aAAa;4BACnB,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,YAAY,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;4BAC9E,SAAS;yBACV,CAAC;wBACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;wBACvC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBACjD,CAAC;oBACD,MAAM;gBACR,4EAA4E;gBAC5E,KAAK,cAAc;oBACjB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;wBAC3B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBAC3D,CAAC;oBACD,MAAM;gBAER,sEAAsE;gBACtE,KAAK,iBAAiB;oBACpB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBAC3B,MAAM;gBAER,KAAK,iBAAiB;oBACpB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBAC3B,MAAM;gBAER,gCAAgC;gBAChC,KAAK,mBAAmB;oBACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAC7B,MAAM;gBAER,KAAK,mBAAmB;oBACtB,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;oBAC7B,MAAM;gBAER,KAAK,uBAAuB;oBAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;oBACnC,MAAM;gBAER,KAAK,uBAAuB;oBAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;oBACpC,MAAM;gBAER,yEAAyE;gBACzE,KAAK,sBAAsB,CAAC,CAAC,CAAC;oBAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;oBACpD,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC7C,MAAM;oBACR,CAAC;oBACD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC;oBACxD,IAAI,OAAO,EAAE,CAAC;wBACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;wBACvB,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;wBAClC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;oBACpC,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,uBAAuB;gBACvB,KAAK,sBAAsB;oBACzB,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;wBAC7E,MAAM;oBACR,CAAC;oBACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACpB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;wBACxB,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,CAAC;wBACvC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;oBACrC,CAAC;oBACD,MAAM;gBAER,iDAAiD;gBACjD,KAAK,iBAAiB;oBACpB,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBAClF,MAAM;gBAER,KAAK,SAAS;oBACZ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;wBACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;oBACzC,CAAC;oBACD,MAAM;gBAER,wEAAwE;gBACxE,qEAAqE;gBACrE,yCAAyC;gBACzC,KAAK,cAAc;oBACjB,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;wBACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC7C,CAAC;oBACD,MAAM;gBACR,kCAAkC;gBAClC,KAAK,wBAAwB;oBAC3B,IAAI,WAAW,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC;wBAC3C,MAAM,eAAe,GAAgB;4BACnC,EAAE,EAAE,SAAS;4BACb,IAAI,EAAE,eAAe;4BACrB,OAAO,EAAE,sBAAsB,WAAW,CAAC,IAAI,CAAC,oBAAoB,EAAE;4BACtE,SAAS;yBACV,CAAC;wBACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;wBACxC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBACjD,CAAC;oBACD,MAAM;gBAER,gEAAgE;gBAChE,KAAK,gBAAgB;oBACnB,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC;wBACrB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC;wBAEpC,QAAQ,UAAU,CAAC,IAAI,EAAE,CAAC;4BACxB,KAAK,kBAAkB;gCACrB,IAAI,CAAC,oBAAoB,CAAC,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,CAAC;gCACzD,MAAM;4BAER,KAAK,0BAA0B;gCAC7B,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;oCACpB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC;oCAClC,MAAM,aAAa,GAAG,IAAI,CAAC,0BAA0B,CACnD,UAAU,CAAC,eAAe,CAC3B,CAAC;oCACF,MAAM,WAAW,GACf,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oCAClD,0EAA0E;oCAC1E,yEAAyE;oCACzE,IACE,WAAW,EAAE,IAAI,KAAK,eAAe;wCACrC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EACvD,CAAC;wCACD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;wCAC5B,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;wCACzC,MAAM;oCACR,CAAC;oCACD,IACE,WAAW;wCACX,WAAW,CAAC,IAAI,KAAK,oBAAoB;wCACzC,WAAW,CAAC,WAAW,KAAK,IAAI,EAChC,CAAC;wCACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG;4CAChD,GAAG,WAAW;4CACd,GAAG,CAAC,aAAa,KAAK,SAAS;gDAC7B,CAAC,CAAC,EAAE;gDACJ,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;4CACtB,OAAO,EAAE,SAAS;4CAClB,SAAS;4CACT,WAAW,EAAE,KAAK;yCACnB,CAAC;oCACJ,CAAC;yCAAM,CAAC;wCACN,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;4CACrB,EAAE,EAAE,GAAG,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;4CACvD,IAAI,EAAE,oBAAoB;4CAC1B,OAAO,EAAE,SAAS;4CAClB,SAAS;4CACT,WAAW,EAAE,KAAK;4CAClB,GAAG,CAAC,aAAa,KAAK,SAAS;gDAC7B,CAAC,CAAC,EAAE;gDACJ,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;yCACvB,CAAC,CAAC;oCACL,CAAC;oCACD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oCAC/C,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;oCAC5B,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;gCAC3C,CAAC;gCACD,MAAM;4BAER,8FAA8F;4BAC9F,KAAK,aAAa;gCAChB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oCACvB,IAAI,CAAC,eAAe,GAAG;wCACrB,OAAO,EAAE,UAAU,CAAC,OAAO;wCAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;qCACxB,CAAC;oCACF,IAAI,IAAI,CAAC,eAAe;wCAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;oCAC5E,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gCACnD,CAAC;gCACD,MAAM;4BAER,KAAK,uBAAuB;gCAC1B,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;oCACvE,MAAM;gCACR,CAAC;gCACD,IAAI,CAAC,eAAe,CAAC,eAAe,CAClC,UAAU,CAAC,KAAK,EAChB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAChC,CAAC;gCACF,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC;gCACjD,MAAM;4BAER,KAAK,+BAA+B;gCAClC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oCAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;oCAC9C,IAAI,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;wCAC/C,MAAM;oCACR,CAAC;oCACD,uEAAuE;oCACvE,oEAAoE;oCACpE,6CAA6C;oCAC7C,IACE,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE;wCAC5C,CAAC,IAAI,CAAC,UAAU,EAChB,CAAC;wCACD,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC;oCAC3C,CAAC;oCACD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAC3B,UAAU,CAAC,WAAW,EACtB,KAAK,CACN,CAAC;oCACF,IACE,IAAI,CAAC,eAAe,CAAC,sCAAsC,EAAE;wCAC7D,IAAI,CAAC,UAAU,EACf,CAAC;wCACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;wCACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;oCACrC,CAAC;oCACD,IAAI,CAAC,wBAAwB;wCAC3B,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC;oCAChC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;gCACvC,CAAC;gCACD,MAAM;4BAER,KAAK,8BAA8B,CAAC,CAAC,CAAC;gCACpC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,WAAW,CACtD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAChC,CAAC;gCACF,IAAI,eAAe,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oCACvC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;oCACxB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;gCACrC,CAAC;gCACD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;gCAC1C,MAAM;4BACR,CAAC;4BAED,KAAK,mBAAmB,CAAC,CAAC,CAAC;gCACzB,MAAM,gBAAgB,GACpB,UAAU,CAAC,iBAAiB;oCAC5B,UAAU,CAAC,gBAAgB;oCAC3B,IAAI,CAAC;gCACP,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC;gCAC/C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oCACrB,EAAE,EAAE,qBAAqB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;oCACtD,IAAI,EAAE,cAAc;oCACpB,OAAO,EACL,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE;oCAC3D,SAAS;iCACV,CAAC,CAAC;gCACH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gCAC/C,MAAM;4BACR,CAAC;4BAED,KAAK,iBAAiB;gCACpB,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gCAC3B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oCACrB,EAAE,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;oCACpD,IAAI,EAAE,iBAAiB;oCACvB,OAAO,EAAE,EAAE;oCACX,SAAS;iCACV,CAAC,CAAC;gCACH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;gCAC/C,MAAM;4BAER,oEAAoE;4BACpE,KAAK,iBAAiB;gCACpB,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gCAC3E,MAAM;4BAER,qEAAqE;4BACrE,KAAK,iBAAiB,CAAC,CAAC,CAAC;gCACvB,+DAA+D;gCAC/D,sEAAsE;gCACtE,IAAI,UAAU,CAAC,UAAU,KAAK,cAAc;oCAAE,MAAM;gCACpD,MAAM,cAAc,GAAmB;oCACrC,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,SAAS;oCAC9C,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,OAAO;oCACpC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,IAAI;oCACnC,MAAM,EAAE,UAAU,CAAC,MAAM,IAAI,IAAI;iCAClC,CAAC;gCACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;gCAC5C,MAAM;4BACR,CAAC;4BAED;;;;;;;+BAOG;4BACH,KAAK,kBAAkB,CAAC,CAAC,CAAC;gCACxB,MAAM,MAAM,GAAyB;oCACnC,MAAM,EAAG,UAAU,CAAC,MAAyC,IAAI,UAAU;oCAC3E,YAAY,EAAG,UAAU,CAAC,aAAwB,IAAI,EAAE;oCACxD,WAAW,EAAG,UAAU,CAAC,YAAuB,IAAI,EAAE;oCACtD,kBAAkB,EACf,UAAU,CAAC,oBAA+B,IAAI,IAAI;oCACrD,mBAAmB,EAChB,UAAU,CAAC,oBAA+B;wCAC3C,CAAC,UAAU,CAAC,aAAa;4CACvB,CAAC,CAAC,aAAa,UAAU,CAAC,aAAa,EAAE;4CACzC,CAAC,CAAC,EAAE,CAAC;oCACT,aAAa,EAAG,UAAU,CAAC,eAA0B,IAAI,IAAI;oCAC7D,WAAW,EACT,OAAO,UAAU,CAAC,YAAY,KAAK,QAAQ;wCACzC,CAAC,CAAC,UAAU,CAAC,YAAY;wCACzB,CAAC,CAAC,IAAI;oCACV,WAAW,EAAG,UAAU,CAAC,YAAuB,IAAI,IAAI;iCACzD,CAAC;gCACF,2DAA2D;gCAC3D,IAAI,MAAM,CAAC,YAAY;oCAAE,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;gCAC9D,MAAM;4BACR,CAAC;4BAED,0DAA0D;4BAC1D,KAAK,qBAAqB,CAAC,CAAC,CAAC;gCAC3B,MAAM,kBAAkB,GAAuB;oCAC7C,aAAa,EAAE,UAAU,CAAC,cAAc;oCACxC,kBAAkB,EAAE,UAAU,CAAC,oBAAoB;iCACpD,CAAC;gCACF,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,kBAAkB,CAAC,CAAC;gCACpD,MAAM;4BACR,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,MAAM;gBAER,sFAAsF;gBACtF,KAAK,iBAAiB,CAAC,CAAC,CAAC;oBACvB,IAAI,WAAW,CAAC,UAAU,KAAK,cAAc;wBAAE,MAAM;oBACrD,MAAM,cAAc,GAAmB;wBACrC,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,SAAS;wBAC/C,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,OAAO;wBACrC,OAAO,EAAE,WAAW,CAAC,OAAO,IAAI,IAAI;wBACpC,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,IAAI;qBACnC,CAAC;oBACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;oBAC5C,MAAM;gBACR,CAAC;gBAED,sCAAsC;gBACtC,KAAK,qBAAqB,CAAC;gBAC3B,KAAK,iBAAiB,CAAC;gBACvB,KAAK,sBAAsB,CAAC;gBAC5B,KAAK,qBAAqB,CAAC;gBAC3B,KAAK,eAAe;oBAClB,MAAM;YACV,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,+BAA+B;QACjC,CAAC;IACH,CAAC;IAEO,qBAAqB,CAC3B,OAA6C,EAC7C,SAAiB,EACjB,SAAiB;QAEjB,wEAAwE;QACxE,oEAAoE;QACpE,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC;YAAE,OAAO;QAC1C,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC;YAChC,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnF,MAAM,aAAa,GAAgB;YACjC,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,KAAK;YACd,SAAS;SACV,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAEO,kBAAkB,CAAC,KAAc;QACvC,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC;YAAE,OAAO;QAC1C,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBACpC,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,4DAA4D;aACtE,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO;QAC1D,IAAI,WAAW,CAAC,MAAM,GAAG,sCAAsC,EAAE,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBACpC,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,8CAA8C;aACxD,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC9C,IAAI,CAAC,gCAAgC,IAAI,WAAW,CAAC,MAAM,CAAC;QAC5D,OACE,IAAI,CAAC,uBAAuB,CAAC,IAAI,GAAG,oCAAoC;YACxE,IAAI,CAAC,gCAAgC;gBACnC,sCAAsC,EACxC,CAAC;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;iBACnE,KAA2B,CAAC;YAC/B,IAAI,CAAC,iBAAiB;gBAAE,MAAM;YAC9B,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACvD,IAAI,CAAC,gCAAgC,IAAI,iBAAiB,CAAC,MAAM,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,MAAmC,CAAC,CAAC;IAChE,CAAC;IAEO,6BAA6B;QACnC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,gCAAgC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEO,oBAAoB,CAAC,KAAc;QACzC,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,KAIZ,CAAC;QACF,IACE,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC7B,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,EAC3C,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,IAAI,CAAC,eAAe;YACrC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;gBACjC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE;gBAC/B,CAAC,CAAC,EAAE,CAAC;SACqB,CAAC,CAAC;IAClC,CAAC;IAEO,cAAc,CACpB,IAAuC;QAEvC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,eAAe,EAAE,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO;YACvD,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,EAAE,IAAI,CAAC,iBAAiB,CAAE,IAAyB,CAAC,GAAG,CAAC;YAC3D,eAAe,EAAE,IAAI,CAAC,iBAAiB,CACpC,IAAuC,CAAC,iBAAiB,CAC3D;SACF,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,KAAc;QACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YACxD,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAEO,0BAA0B,CAAC,KAAc;QAC/C,OAAO,IAAI,CAAC,kBAAkB,KAAK,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC;YACjE,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,wBAAwB,CAAC,OAAmB;QAC1C,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACtD,CAAC;IAED,yEAAyE;IACzE,kBAAkB,CAAC,IAAY;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACrB,EAAE,EAAE,iBAAiB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;YAClD,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED;;;;;;;OAOG;IACH,kBAAkB,CAAC,OAKlB;QACC,MAAM,WAAW,GAAgB;YAC/B,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;YACjF,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc;YAClE,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;YACnE,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;SACjE,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,6BAA6B,EAAE,CAAC;QACrC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;CACF","sourcesContent":["import { Room, RoomEvent } from \"livekit-client\";\nimport {\n ChatMessage,\n BotLlmTextRawEvent,\n ConvaiAction,\n InteractionCreated,\n ServerResponse,\n CharacterStatusEvent,\n ConvaiToolCall,\n ModelOutputMessage,\n} from \"./types\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport {\n extractModelOutputPayload,\n parseModelOutputMessage,\n} from \"./modelOutput\";\nimport { isValidLogicalTurnId, isValidOutputId } from \"./logicalTurn\";\nimport {\n BlendshapeQueue,\n type BlendshapeChunkMetadata,\n} from \"./BlendshapeQueue\";\n\ntype LifecycleOwnerPayload = {\n response_id?: string;\n neurosync_turn_id?: number;\n turn_id?: number;\n epoch?: number;\n};\n\nfunction stableJsonFingerprint(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableJsonFingerprint).join(\",\")}]`;\n }\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([key, item]) =>\n `${JSON.stringify(key)}:${stableJsonFingerprint(item)}`,\n );\n return `{${entries.join(\",\")}}`;\n }\n return JSON.stringify(value);\n}\n\nconst MAX_MODEL_OUTPUT_REPLAY_FINGERPRINTS = 400;\n// Preserve exact replay matching instead of accepting hash collisions, while\n// bounding the aggregate strings retained by a long-lived v2 session.\nconst MAX_MODEL_OUTPUT_REPLAY_RETAINED_CHARS = 4 * 1024 * 1024;\n\n/**\n * Handles incoming messages from Convai\n * Processes various message types from the AI assistant and updates chat history\n */\nexport class MessageHandler extends EventEmitter {\n private room: Room | null = null;\n private chatMessages: ChatMessage[] = [];\n private activeBotLlmMessageId: string | null = null;\n private userTranscription: string = \"\";\n private logRtviMessages: boolean = true;\n private isBotResponding: boolean = false;\n private isSpeaking: boolean = false;\n private isListening: boolean = false;\n private totalBlendshapesReceived: number = 0;\n private blendshapeQueue: BlendshapeQueue;\n private _currentEmotion: { emotion: string; scale?: number } | null = null;\n private modelOutputVersion: 1 | 2 = 1;\n private seenModelOutputPayloads = new Set<string>();\n private seenModelOutputPayloadCharacters = 0;\n // bot-output segments already added to the chat. The server re-sends the\n // same segment (full text) as TTS progress advances (spoken_status\n // in-progress → completed); only the first sighting may touch the chat.\n private seenBotOutputSegments = new Set<number | string>();\n\n // Fix 4: store a single bound reference so setupListeners/cleanupListeners use the\n // exact same function object. Previously .bind(this) in each call created a new\n // reference every time, making room.off() a no-op and leaking listeners on reconnect.\n private readonly _boundHandleDataReceived: (\n payload: Uint8Array,\n participant: unknown,\n ) => void;\n\n constructor(room?: Room) {\n super();\n this._boundHandleDataReceived = this.handleDataReceived.bind(this);\n this.blendshapeQueue = new BlendshapeQueue();\n if (room) {\n this.setRoom(room);\n }\n }\n\n /**\n * Get the blendshape queue instance\n */\n getBlendshapeQueue(): BlendshapeQueue {\n return this.blendshapeQueue;\n }\n\n /**\n * Enable or disable console logging for decoded incoming RTVI messages.\n */\n setRtviMessageLogging(enabled: boolean): void {\n this.logRtviMessages = enabled;\n }\n\n /** Select the server-negotiated canonical output version for this session. */\n setModelOutputVersion(version: 1 | 2): void {\n this.modelOutputVersion = version;\n this._clearModelOutputReplayLedger();\n }\n\n /**\n * Get current chat messages\n */\n getChatMessages(): ChatMessage[] {\n return this.chatMessages;\n }\n\n /**\n * Get current user transcription\n */\n getUserTranscription(): string {\n return this.userTranscription;\n }\n\n /**\n * Get bot responding state\n */\n getIsBotResponding(): boolean {\n return this.isBotResponding;\n }\n\n /**\n * Get speaking state\n */\n getIsSpeaking(): boolean {\n return this.isSpeaking;\n }\n\n /**\n * Get current bot emotion (updated from bot-emotion messages)\n */\n getEmotion(): { emotion: string; scale?: number } | null {\n return this._currentEmotion;\n }\n\n /**\n * Get whether the user is currently speaking (bot is in \"listening\" state).\n * True from user-started-speaking until user-stopped-speaking.\n */\n getIsListening(): boolean {\n return this.isListening;\n }\n\n /**\n * Local interruption path used by the client before the server cancel/terminal\n * arrives. Keep MessageHandler state and BlendshapeQueue state in sync so the\n * next bot-started-speaking can activate cleanly.\n */\n interruptLipsyncPlayback(): void {\n const wasSpeaking = this.isSpeaking;\n this.isSpeaking = false;\n this.blendshapeQueue.interrupt();\n if (wasSpeaking) {\n this.emit(\"speakingChange\", false);\n }\n }\n\n /**\n * Set the LiveKit room instance\n */\n setRoom(room: Room): void {\n // Clean up previous room listeners\n if (this.room) {\n this.cleanupListeners();\n }\n\n this.room = room;\n this.setupListeners();\n }\n\n /**\n * Setup message listeners\n */\n private setupListeners(): void {\n if (!this.room) return;\n\n this.room.on(RoomEvent.DataReceived, this._boundHandleDataReceived);\n }\n\n /**\n * Clean up message listeners\n */\n private cleanupListeners(): void {\n if (!this.room) return;\n\n this.room.off(RoomEvent.DataReceived, this._boundHandleDataReceived);\n }\n\n /**\n * Handle incoming data message\n */\n private handleDataReceived(\n payload: Uint8Array,\n _participant: unknown,\n _transport: \"livekit\" | \"websocket\" = \"livekit\",\n ): void {\n let messageString = \"\";\n let parsed = false;\n\n try {\n // Decode bytes to string\n const decoder = new TextDecoder();\n messageString = decoder.decode(payload);\n\n // Parse JSON\n const messageData = JSON.parse(messageString);\n parsed = true;\n\n // Canonical output has two transport envelopes. Normalize it before the\n // legacy message switch so both LiveKit and WebSocket execute one path.\n const modelOutputPayload = extractModelOutputPayload(messageData);\n if (modelOutputPayload !== undefined) {\n this._handleModelOutput(modelOutputPayload);\n return;\n }\n\n // Extract and categorize messages for chat display\n const timestamp = new Date().toISOString();\n const messageId = `${messageData.type}-${Date.now()}-${Math.random()}`;\n\n // Multi-character routing identity, carried inline on every\n // character-originated event. Undefined in single-character sessions, so\n // these spread to nothing and every existing message keeps its shape.\n const attribution: Pick<ChatMessage, \"membershipId\" | \"characterId\"> = {\n ...(messageData.data?.membership_id && {\n membershipId: messageData.data.membership_id as string,\n }),\n ...(messageData.data?.character_id && {\n characterId: messageData.data.character_id as string,\n }),\n };\n /**\n * Two instances must never share a streaming bubble. Without this a\n * target switch mid-turn splices one character's text onto another's,\n * because the merge would only be checking `isStreaming`.\n */\n const sameSpeaker = (msg: ChatMessage | undefined): boolean =>\n !!msg && msg.membershipId === attribution.membershipId;\n\n // Handle different message types\n switch (messageData.type) {\n // Submitted text is appended locally by sendUserTextMessage. Ignore\n // server echoes so each user message appears exactly once.\n case \"user_text_message\":\n case \"user-llm-text\":\n case \"text-input\":\n case \"user-input\":\n case \"text-message\":\n case \"chat-message\":\n case \"input-text\":\n case \"message\":\n // Skip server echoes; local text and voice transcription are handled separately.\n break;\n\n // Bot Ready - Bot is ready, connection should be true\n case \"bot-ready\":\n // `about` carries this instance's routing identity in a roster room,\n // and the same fields are also flattened onto `data`. Prefer `about`,\n // fall back to the flattened copy, and pass undefined for a\n // single-character session.\n this.emit(\n \"botReady\",\n messageData.data?.about ??\n (messageData.data?.membership_id ? messageData.data : undefined),\n );\n break;\n\n // Bot LLM Started - Begin streaming response\n case \"bot-llm-started\":\n this.isBotResponding = true;\n this.emit(\"botRespondingChange\", true);\n this.seenBotOutputSegments.clear();\n\n // Lifecycle frames do not carry output_id. In v2, keep at most one\n // unowned placeholder so concurrent starts cannot create anonymous\n // rows that later get adopted in reverse order. Invocation-correlated\n // chunks establish additional rows in authoritative arrival order.\n const hasUnownedV2Starter =\n this.modelOutputVersion === 2 &&\n this.chatMessages.some(\n (message) =>\n message.type === \"bot-llm-text\" &&\n message.isStreaming &&\n message.content === \"\" &&\n message.outputId === undefined &&\n message.logicalTurnId === undefined,\n );\n if (hasUnownedV2Starter) break;\n\n // Add initial streaming message to chat.\n const streamingMessage: ChatMessage = {\n id: messageId,\n type: \"bot-llm-text\",\n content: \"\",\n timestamp: timestamp,\n isStreaming: true,\n ...attribution,\n };\n this.activeBotLlmMessageId = messageId;\n this.chatMessages.push(streamingMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n break;\n\n // Bot Output - Aggregated output stream (sentence/word-level, replaces bot-transcript)\n // Payload: { text, spoken, aggregated_by, segment_id, spoken_status,\n // spoken_progress }. The same segment_id is re-sent with the FULL\n // segment text on every TTS progress tick (spoken_status\n // \"in-progress\" → \"completed\"), so appending per event repeats the\n // sentence once per tick.\n case \"bot-output\":\n if (messageData.data?.text) {\n const newText = messageData.data.text;\n const segmentId = messageData.data.segment_id as\n | number\n | string\n | undefined;\n this.emit(\"botOutput\", {\n text: newText,\n spoken: messageData.data.spoken ?? false,\n aggregatedBy: messageData.data.aggregated_by ?? \"sentence\",\n segmentId,\n spokenStatus: messageData.data.spoken_status,\n });\n\n // Progress re-send of a segment already in the chat — skip.\n if (segmentId !== undefined) {\n if (this.seenBotOutputSegments.has(segmentId)) break;\n this.seenBotOutputSegments.add(segmentId);\n }\n\n const activeBotLlmMessage = this.activeBotLlmMessageId\n ? this.chatMessages.find(\n (message) => message.id === this.activeBotLlmMessageId,\n )\n : undefined;\n const lastMsg = this.chatMessages[this.chatMessages.length - 1];\n // When the reply is rendered by the LLM text stream\n // (bot-llm-text), the TTS echo adds nothing — never mix\n // bot-output into an LLM bubble (streaming or complete).\n if (activeBotLlmMessage?.type === \"bot-llm-text\") break;\n if (lastMsg?.type === \"bot-llm-text\") break;\n if (\n lastMsg?.type === \"bot-output\" &&\n lastMsg.content.includes(newText)\n ) {\n break;\n }\n if (\n lastMsg?.type === \"bot-output\" &&\n lastMsg.isStreaming &&\n sameSpeaker(lastMsg)\n ) {\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastMsg,\n content: lastMsg.content + newText,\n };\n } else {\n this.chatMessages.push({\n id: `bot-output-${Date.now()}-${Math.random()}`,\n type: \"bot-output\",\n content: newText,\n timestamp: new Date().toISOString(),\n isStreaming: true,\n ...attribution,\n });\n }\n this.emit(\"messagesChange\", this.chatMessages);\n }\n break;\n\n // Bot LLM Text Messages - Streaming chunks\n case \"bot-llm-text\":\n if (messageData.data?.text) {\n const newChunk = messageData.data.text;\n // Core adds this correlation metadata only for negotiated v2.\n // Legacy frames retain their exact historical shape and behavior.\n const outputId =\n this.modelOutputVersion === 2 &&\n isValidOutputId(messageData.data.output_id)\n ? messageData.data.output_id\n : undefined;\n const logicalTurnId =\n this.modelOutputVersion === 2 &&\n isValidLogicalTurnId(messageData.data.logical_turn_id)\n ? messageData.data.logical_turn_id\n : undefined;\n\n // A logical turn can contain multiple provider invocations (for\n // example, the response before a tool call and the continuation\n // after its result). Prefer the invocation id, then fall back to\n // the older v2 logical-turn id when Core does not send one.\n let targetMessageIndex = -1;\n if (outputId !== undefined) {\n for (\n let index = this.chatMessages.length - 1;\n index >= 0;\n index--\n ) {\n const message = this.chatMessages[index];\n if (\n message.type === \"bot-llm-text\" &&\n message.isStreaming &&\n message.outputId === outputId &&\n sameSpeaker(message)\n ) {\n targetMessageIndex = index;\n break;\n }\n }\n\n // bot-llm-started has no correlation metadata. Let one empty,\n // unowned row adopt the first authoritative invocation id.\n if (targetMessageIndex === -1) {\n for (\n let index = this.chatMessages.length - 1;\n index >= 0;\n index--\n ) {\n const message = this.chatMessages[index];\n if (\n message.type === \"bot-llm-text\" &&\n message.isStreaming &&\n message.content === \"\" &&\n message.outputId === undefined &&\n message.logicalTurnId === undefined &&\n sameSpeaker(message)\n ) {\n targetMessageIndex = index;\n break;\n }\n }\n }\n } else if (logicalTurnId !== undefined) {\n for (\n let index = this.chatMessages.length - 1;\n index >= 0;\n index--\n ) {\n const message = this.chatMessages[index];\n if (\n message.type === \"bot-llm-text\" &&\n message.isStreaming &&\n message.outputId === undefined &&\n message.logicalTurnId === logicalTurnId &&\n sameSpeaker(message)\n ) {\n targetMessageIndex = index;\n break;\n }\n }\n\n // Older v2 Core still needs the starter-row behavior that was\n // introduced with logical-turn correlation.\n if (targetMessageIndex === -1) {\n const lastIndex = this.chatMessages.length - 1;\n const lastMessage = this.chatMessages[lastIndex];\n if (\n lastMessage?.type === \"bot-llm-text\" &&\n lastMessage.isStreaming &&\n lastMessage.content === \"\" &&\n lastMessage.outputId === undefined &&\n lastMessage.logicalTurnId === undefined &&\n sameSpeaker(lastMessage)\n ) {\n targetMessageIndex = lastIndex;\n }\n }\n } else {\n // Uncorrelated (v1) chunk: it belongs to the bubble bot-llm-started\n // opened for this speaker. Only when no such bubble exists does the\n // historical \"last streaming row\" rule apply -- and still only for\n // the same speaker, so a target switch mid-turn cannot splice one\n // member's text onto another's row.\n // Ownership applies among uncorrelated rows only: an uncorrelated\n // chunk must never join a row that carries an output or turn id,\n // or a v2 correlated stream would absorb legacy text.\n if (this.activeBotLlmMessageId) {\n targetMessageIndex = this.chatMessages.findIndex(\n (message) =>\n message.id === this.activeBotLlmMessageId &&\n message.type === \"bot-llm-text\" &&\n message.isStreaming &&\n !message.outputId &&\n !message.logicalTurnId &&\n sameSpeaker(message),\n );\n }\n if (targetMessageIndex === -1) {\n const lastIndex = this.chatMessages.length - 1;\n const lastMessage = this.chatMessages[lastIndex];\n if (\n lastMessage &&\n lastMessage.type === \"bot-llm-text\" &&\n lastMessage.isStreaming &&\n !lastMessage.outputId &&\n !lastMessage.logicalTurnId &&\n sameSpeaker(lastMessage)\n ) {\n targetMessageIndex = lastIndex;\n }\n }\n }\n\n let updatedMessage: ChatMessage;\n if (targetMessageIndex !== -1) {\n const targetMessage = this.chatMessages[targetMessageIndex];\n updatedMessage = {\n ...targetMessage,\n content: targetMessage.content + newChunk,\n ...(outputId !== undefined &&\n targetMessage.outputId === undefined\n ? { outputId }\n : {}),\n ...(logicalTurnId !== undefined &&\n targetMessage.logicalTurnId === undefined\n ? { logicalTurnId }\n : {}),\n };\n this.chatMessages[targetMessageIndex] = updatedMessage;\n } else {\n // If no streaming message exists yet, create one\n updatedMessage = {\n id: `${messageData.type}-${Date.now()}-${Math.random()}`,\n type: \"bot-llm-text\",\n content: newChunk,\n timestamp: new Date().toISOString(),\n isStreaming: true,\n ...(outputId ? { outputId } : {}),\n ...(logicalTurnId ? { logicalTurnId } : {}),\n ...attribution,\n };\n this.activeBotLlmMessageId = updatedMessage.id;\n this.chatMessages.push(updatedMessage);\n }\n this.emit(\"messagesChange\", this.chatMessages, updatedMessage);\n }\n break;\n\n // Parallel diagnostics-only provider output. This must never affect\n // normal chat, speech, TTS, or response lifecycle state.\n case \"bot-llm-text-raw\":\n this._handleBotLlmTextRaw(messageData.data);\n break;\n\n // Bot LLM Stopped - Complete streaming response\n case \"bot-llm-stopped\": {\n // A v2 response can have interleaved correlated rows. The stop event\n // is response-scoped, so none may remain open for later chunks.\n const finalizedMessages: ChatMessage[] = [];\n if (this.modelOutputVersion === 2) {\n for (let index = 0; index < this.chatMessages.length; index++) {\n const message = this.chatMessages[index];\n if (\n (message.type === \"bot-llm-text\" ||\n message.type === \"bot-output\") &&\n message.isStreaming\n ) {\n const finalizedMessage = {\n ...message,\n isStreaming: false,\n };\n this.chatMessages[index] = finalizedMessage;\n finalizedMessages.push(finalizedMessage);\n }\n }\n } else {\n // v1: a stop frame finalizes the bubble this turn owns; only when no\n // bubble was opened does the historical last-row rule apply.\n let stopIndex = this.activeBotLlmMessageId\n ? this.chatMessages.findIndex(\n (message) => message.id === this.activeBotLlmMessageId,\n )\n : -1;\n if (stopIndex === -1) stopIndex = this.chatMessages.length - 1;\n const lastBotMsg = this.chatMessages[stopIndex];\n if (lastBotMsg && lastBotMsg.isStreaming) {\n const finalizedMessage = { ...lastBotMsg, isStreaming: false };\n this.chatMessages[stopIndex] = finalizedMessage;\n finalizedMessages.push(finalizedMessage);\n }\n }\n\n // Clear streaming state\n this.isBotResponding = false;\n this.emit(\"botRespondingChange\", false);\n // Keep the full-list event at one emission per stop while carrying\n // every v2 terminal delta for singular-message consumers.\n this.emit(\n \"messagesChange\",\n this.chatMessages,\n undefined,\n finalizedMessages,\n );\n break;\n }\n\n // Text-only Interactions API terminal marker. This is deliberately a\n // separate event: a completed REST turn must not be represented as a\n // synthetic bot-llm-stopped message.\n case \"bot-turn-completed\":\n const completedIndex = this.activeBotLlmMessageId\n ? this.chatMessages.findIndex(\n (message) => message.id === this.activeBotLlmMessageId,\n )\n : -1;\n if (completedIndex >= 0 && this.chatMessages[completedIndex].isStreaming) {\n this.chatMessages[completedIndex] = {\n ...this.chatMessages[completedIndex],\n isStreaming: false,\n };\n this.emit(\"messagesChange\", this.chatMessages);\n }\n this.isBotResponding = false;\n this.emit(\"botRespondingChange\", false);\n this.emit(\"botTurnCompleted\", messageData.data ?? {});\n break;\n\n // User Transcription Messages\n case \"user-transcription\":\n if (messageData.data?.text) {\n const messageContent = messageData.data.text;\n\n if (messageData.data?.final) {\n const logicalTurnId = this.transcriptionLogicalTurnId(\n messageData.data.logical_turn_id,\n );\n // Final transcription - accumulate in single bubble until bot responds\n const lastUserMsg =\n this.chatMessages[this.chatMessages.length - 1];\n // A final transcription identical to the line appended locally on send is\n // the server echoing that send back: drop it, or the user sees it twice.\n if (\n lastUserMsg?.type === \"user-llm-text\" &&\n lastUserMsg.content.trim() === String(messageContent).trim()\n ) {\n this.userTranscription = \"\";\n this.emit(\"userTranscriptionChange\", \"\");\n break;\n }\n\n // Check if last message is an accumulating user message (isStreaming=true)\n if (\n lastUserMsg &&\n lastUserMsg.type === \"user-transcription\" &&\n lastUserMsg.isStreaming === true\n ) {\n // Accumulate: append new content to existing message with space\n const accumulatedContent =\n lastUserMsg.content.trim() + \" \" + messageContent.trim();\n\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastUserMsg,\n ...(logicalTurnId === undefined ? {} : { logicalTurnId }),\n content: accumulatedContent,\n timestamp: timestamp,\n };\n } else {\n // Start new accumulating message (isStreaming=true means \"still accumulating\")\n const userMessage: ChatMessage = {\n id: messageId,\n type: \"user-transcription\",\n content: messageContent,\n timestamp: timestamp,\n isStreaming: true,\n ...(logicalTurnId === undefined ? {} : { logicalTurnId }),\n };\n this.chatMessages.push(userMessage);\n }\n this.emit(\"messagesChange\", this.chatMessages);\n\n // Clear live transcription when final\n this.userTranscription = \"\";\n this.emit(\"userTranscriptionChange\", \"\");\n } else {\n // Non-final transcription - show in input field\n this.userTranscription = messageContent;\n this.emit(\"userTranscriptionChange\", messageContent);\n }\n }\n break;\n\n // Bot Emotion Messages — LiveKit path: arrives as an RTVI message frame (messageData.data)\n case \"bot-emotion\":\n if (messageData.data?.emotion) {\n this._currentEmotion = {\n emotion: messageData.data.emotion,\n scale: messageData.data.scale,\n };\n if (this.logRtviMessages) console.log(\"[SDK bot-emotion]\", messageData.data);\n this.emit(\"emotionChange\", this._currentEmotion);\n const emotionMessage: ChatMessage = {\n id: messageId,\n type: \"bot-emotion\",\n content: `${messageData.data.emotion} (scale: ${messageData.data.scale || 1})`,\n timestamp,\n };\n this.chatMessages.push(emotionMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n }\n break;\n // Bot TTS Text - Words as spoken by TTS (word-by-word for socket-based TTS)\n case \"bot-tts-text\":\n if (messageData.data?.text) {\n this.emit(\"botTtsText\", { text: messageData.data.text });\n }\n break;\n\n // Bot TTS lifecycle (more granular than bot-started/stopped-speaking)\n case \"bot-tts-started\":\n this.emit(\"botTtsStarted\");\n break;\n\n case \"bot-tts-stopped\":\n this.emit(\"botTtsStopped\");\n break;\n\n // Server-side muting indicators\n case \"user-mute-started\":\n this.emit(\"userMuteStarted\");\n break;\n\n case \"user-mute-stopped\":\n this.emit(\"userMuteStopped\");\n break;\n\n case \"user-started-speaking\":\n this.isListening = true;\n this.emit(\"listeningChange\", true);\n break;\n\n case \"user-stopped-speaking\":\n this.isListening = false;\n this.emit(\"listeningChange\", false);\n break;\n\n // Bot Started Speaking (priority over listening: state becomes speaking)\n case \"bot-started-speaking\": {\n const owner = this.lifecycleOwner(messageData.data);\n if (this.blendshapeQueue.isStaleOwner(owner)) {\n break;\n }\n const allowed = this.blendshapeQueue.startBotSpeaking();\n if (allowed) {\n this.isSpeaking = true;\n this.totalBlendshapesReceived = 0;\n this.emit(\"speakingChange\", true);\n }\n break;\n }\n\n // Bot Stopped Speaking\n case \"bot-stopped-speaking\":\n if (this.blendshapeQueue.isStaleOwner(this.lifecycleOwner(messageData.data))) {\n break;\n }\n if (this.isSpeaking) {\n this.isSpeaking = false;\n this.blendshapeQueue.stopBotSpeaking();\n this.emit(\"speakingChange\", false);\n }\n break;\n\n // Action Response Messages (LiveKit/WebRTC path)\n case \"action-response\":\n this._handleActionResponse(messageData.data?.actions ?? [], messageId, timestamp);\n break;\n\n case \"metrics\":\n if (messageData.data) {\n this.emit(\"metrics\", messageData.data);\n }\n break;\n\n // Per-turn usage/cost breakdown. Informational only: the server streams\n // it once the client opts in with usage-toggle, and it never affects\n // server-side usage tracking or billing.\n case \"usage-update\":\n if (messageData.data) {\n this.emit(\"usageUpdate\", messageData.data);\n }\n break;\n // Behavior Tree Response Messages\n case \"behavior-tree-response\":\n if (messageData.data?.narrative_section_id) {\n const behaviorMessage: ChatMessage = {\n id: messageId,\n type: \"behavior-tree\",\n content: `Narrative Section: ${messageData.data.narrative_section_id}`,\n timestamp,\n };\n this.chatMessages.push(behaviorMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n }\n break;\n\n // Server Message - Contains various data types like blendshapes\n case \"server-message\":\n if (messageData.data) {\n const serverData = messageData.data;\n\n switch (serverData.type) {\n case \"bot-llm-text-raw\":\n this._handleBotLlmTextRaw(serverData.data ?? serverData);\n break;\n\n case \"final-user-transcription\":\n if (serverData.text) {\n const finalText = serverData.text;\n const logicalTurnId = this.transcriptionLogicalTurnId(\n serverData.logical_turn_id,\n );\n const lastUserMsg =\n this.chatMessages[this.chatMessages.length - 1];\n // A final transcription identical to the line appended locally on send is\n // the server echoing that send back: drop it, or the user sees it twice.\n if (\n lastUserMsg?.type === \"user-llm-text\" &&\n lastUserMsg.content.trim() === String(finalText).trim()\n ) {\n this.userTranscription = \"\";\n this.emit(\"userTranscriptionChange\", \"\");\n break;\n }\n if (\n lastUserMsg &&\n lastUserMsg.type === \"user-transcription\" &&\n lastUserMsg.isStreaming === true\n ) {\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastUserMsg,\n ...(logicalTurnId === undefined\n ? {}\n : { logicalTurnId }),\n content: finalText,\n timestamp,\n isStreaming: false,\n };\n } else {\n this.chatMessages.push({\n id: `${serverData.type}-${Date.now()}-${Math.random()}`,\n type: \"user-transcription\",\n content: finalText,\n timestamp,\n isStreaming: false,\n ...(logicalTurnId === undefined\n ? {}\n : { logicalTurnId }),\n });\n }\n this.emit(\"messagesChange\", this.chatMessages);\n this.userTranscription = \"\";\n this.emit(\"userTranscriptionChange\", \"\");\n }\n break;\n\n // WebSocket path: arrives inside a bot-text data message as serverData (not messageData.data)\n case \"bot-emotion\":\n if (serverData.emotion) {\n this._currentEmotion = {\n emotion: serverData.emotion,\n scale: serverData.scale,\n };\n if (this.logRtviMessages) console.log(\"[SDK bot-emotion (ws)]\", serverData);\n this.emit(\"emotionChange\", this._currentEmotion);\n }\n break;\n\n case \"blendshape-turn-stats\":\n if (this.blendshapeQueue.isStaleOwner(this.lifecycleOwner(serverData))) {\n break;\n }\n this.blendshapeQueue.endConversation(\n serverData.stats,\n this.lifecycleOwner(serverData),\n );\n this.emit(\"blendshapeStatsReceived\", serverData);\n break;\n\n case \"chunked-neurosync-blendshapes\":\n if (serverData.blendshapes) {\n const owner = this.lifecycleOwner(serverData);\n if (this.blendshapeQueue.isRetiredOwner(owner)) {\n break;\n }\n // If the queue is idle (no active conversation, bot not yet speaking),\n // start a conversation so early chunks from an initial bot greeting\n // are accepted rather than silently dropped.\n if (\n !this.blendshapeQueue.isConversationActive() &&\n !this.isSpeaking\n ) {\n this.blendshapeQueue.startConversation();\n }\n this.blendshapeQueue.addChunk(\n serverData.blendshapes,\n owner,\n );\n if (\n this.blendshapeQueue.consumeOwnerReplacementStoppedSpeaking() &&\n this.isSpeaking\n ) {\n this.isSpeaking = false;\n this.emit(\"speakingChange\", false);\n }\n this.totalBlendshapesReceived +=\n serverData.blendshapes.length;\n this.emit(\"blendshapes\", serverData);\n }\n break;\n\n case \"neurosync-blendshapes-cancel\": {\n const cancelledActive = this.blendshapeQueue.cancelOwner(\n this.lifecycleOwner(serverData),\n );\n if (cancelledActive && this.isSpeaking) {\n this.isSpeaking = false;\n this.emit(\"speakingChange\", false);\n }\n this.emit(\"blendshapeCancel\", serverData);\n break;\n }\n\n case \"user-idle-warning\": {\n const remainingSeconds: number | null =\n serverData.remaining_seconds ??\n serverData.remainingSeconds ??\n null;\n this.emit(\"idleWarning\", { remainingSeconds });\n this.chatMessages.push({\n id: `user-idle-warning-${Date.now()}-${Math.random()}`,\n type: \"idle-warning\",\n content:\n remainingSeconds !== null ? String(remainingSeconds) : \"\",\n timestamp,\n });\n this.emit(\"messagesChange\", this.chatMessages);\n break;\n }\n\n case \"llm-no-response\":\n this.emit(\"llmNoResponse\");\n this.chatMessages.push({\n id: `llm-no-response-${Date.now()}-${Math.random()}`,\n type: \"llm-no-response\",\n content: \"\",\n timestamp,\n });\n this.emit(\"messagesChange\", this.chatMessages);\n break;\n\n // Action Response (WebSocket/RTVI path — wrapped in server-message)\n case \"action-response\":\n this._handleActionResponse(serverData.actions ?? [], messageId, timestamp);\n break;\n\n // Server acknowledgment — arrives wrapped in server-message envelope\n case \"server-response\": {\n // client-ready is an internal RTVI handshake; server echoes an\n // \"Unknown message type\" error for it which is expected and harmless.\n if (serverData.event_type === \"client-ready\") break;\n const serverResponse: ServerResponse = {\n event_type: serverData.event_type ?? \"unknown\",\n status: serverData.status ?? \"error\",\n message: serverData.message ?? null,\n extras: serverData.extras ?? null,\n };\n this.emit(\"serverResponse\", serverResponse);\n break;\n }\n\n /**\n * Lifecycle of one roster member. Emitted when a member is added\n * at runtime, becomes ready, or fails after /connect already\n * returned 200. `bot-ready` stays the readiness authority --\n * a `character-status` of \"ready\" must not enable interaction on\n * its own -- but this is the only way a background dispatch\n * failure is ever reported.\n */\n case \"character-status\": {\n const status: CharacterStatusEvent = {\n status: (serverData.status as CharacterStatusEvent[\"status\"]) ?? \"starting\",\n membershipId: (serverData.membership_id as string) ?? \"\",\n characterId: (serverData.character_id as string) ?? \"\",\n characterSessionId:\n (serverData.character_session_id as string) ?? null,\n participantIdentity:\n (serverData.participant_identity as string) ??\n (serverData.membership_id\n ? `character:${serverData.membership_id}`\n : \"\"),\n roomSessionId: (serverData.room_session_id as string) ?? null,\n rosterEpoch:\n typeof serverData.roster_epoch === \"number\"\n ? serverData.roster_epoch\n : null,\n failureCode: (serverData.failure_code as string) ?? null,\n };\n // Unattributable status is dropped rather than guessed at.\n if (status.membershipId) this.emit(\"characterStatus\", status);\n break;\n }\n\n // interaction-created: session IDs for analytics/tracking\n case \"interaction-created\": {\n const interactionCreated: InteractionCreated = {\n interactionId: serverData.interaction_id,\n characterSessionId: serverData.character_session_id,\n };\n this.emit(\"interactionCreated\", interactionCreated);\n break;\n }\n }\n }\n break;\n\n // Fallback: server-response at top level (not currently observed but kept for safety)\n case \"server-response\": {\n if (messageData.event_type === \"client-ready\") break;\n const serverResponse: ServerResponse = {\n event_type: messageData.event_type ?? \"unknown\",\n status: messageData.status ?? \"error\",\n message: messageData.message ?? null,\n extras: messageData.extras ?? null,\n };\n this.emit(\"serverResponse\", serverResponse);\n break;\n }\n\n // Silently ignore other message types\n case \"moderation-response\":\n case \"trigger-message\":\n case \"update-template-keys\":\n case \"update-dynamic-info\":\n case \"interrupt-bot\":\n break;\n }\n } catch (error) {\n // Silently handle parse errors\n }\n }\n\n private _handleActionResponse(\n actions: Array<ConvaiAction | ConvaiToolCall>,\n messageId: string,\n timestamp: string,\n ): void {\n // model-output v2 is canonical. action-response remains a compatibility\n // projection and executing both would duplicate the same operation.\n if (this.modelOutputVersion === 2) return;\n this.emit(\"actionResponse\", { actions });\n const label = actions.length === 0\n ? \"No action\"\n : actions.map((a) => (a.target ? `${a.name} → ${a.target}` : a.name)).join(\", \");\n const actionMessage: ChatMessage = {\n id: messageId,\n type: \"action\",\n content: label,\n timestamp,\n };\n this.chatMessages.push(actionMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n }\n\n private _handleModelOutput(value: unknown): void {\n if (this.modelOutputVersion !== 2) return;\n const output = parseModelOutputMessage(value);\n if (!output) {\n this.emit(\"modelOutputProtocolError\", {\n code: \"invalid_model_output\",\n message: \"Core sent a malformed or unsupported model-output envelope\",\n });\n return;\n }\n // output_id identifies a provider invocation, not a serialized envelope.\n // One invocation can produce distinct text and tool-call projections with\n // the same id, and consumers must receive both in transport arrival order.\n // Suppress only an exact transport replay of an already delivered payload.\n const fingerprint = stableJsonFingerprint(output);\n if (this.seenModelOutputPayloads.has(fingerprint)) return;\n if (fingerprint.length > MAX_MODEL_OUTPUT_REPLAY_RETAINED_CHARS) {\n this.emit(\"modelOutputProtocolError\", {\n code: \"invalid_model_output\",\n message: \"Core sent an oversized model-output envelope\",\n });\n return;\n }\n this.seenModelOutputPayloads.add(fingerprint);\n this.seenModelOutputPayloadCharacters += fingerprint.length;\n while (\n this.seenModelOutputPayloads.size > MAX_MODEL_OUTPUT_REPLAY_FINGERPRINTS ||\n this.seenModelOutputPayloadCharacters >\n MAX_MODEL_OUTPUT_REPLAY_RETAINED_CHARS\n ) {\n const oldestFingerprint = this.seenModelOutputPayloads.values().next()\n .value as string | undefined;\n if (!oldestFingerprint) break;\n this.seenModelOutputPayloads.delete(oldestFingerprint);\n this.seenModelOutputPayloadCharacters -= oldestFingerprint.length;\n }\n this.emit(\"modelOutput\", output satisfies ModelOutputMessage);\n }\n\n private _clearModelOutputReplayLedger(): void {\n this.seenModelOutputPayloads.clear();\n this.seenModelOutputPayloadCharacters = 0;\n }\n\n private _handleBotLlmTextRaw(value: unknown): void {\n if (this.modelOutputVersion !== 2 || !value || typeof value !== \"object\") {\n return;\n }\n const data = value as {\n text?: unknown;\n logical_turn_id?: unknown;\n output_id?: unknown;\n };\n if (\n typeof data.text !== \"string\" ||\n !isValidLogicalTurnId(data.logical_turn_id)\n ) {\n return;\n }\n this.emit(\"botLlmTextRaw\", {\n text: data.text,\n logical_turn_id: data.logical_turn_id,\n ...(isValidOutputId(data.output_id)\n ? { output_id: data.output_id }\n : {}),\n } satisfies BotLlmTextRawEvent);\n }\n\n private lifecycleOwner(\n data: LifecycleOwnerPayload | undefined,\n ): BlendshapeChunkMetadata {\n if (!data) {\n return {};\n }\n\n return {\n responseId: data.response_id,\n neurosyncTurnId: data.neurosync_turn_id ?? data.turn_id,\n epoch: data.epoch,\n fps: this.numberOrUndefined((data as { fps?: number }).fps),\n startFrameIndex: this.numberOrUndefined(\n (data as { start_frame_index?: number }).start_frame_index,\n ),\n };\n }\n\n private numberOrUndefined(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n }\n\n private transcriptionLogicalTurnId(value: unknown): string | undefined {\n return this.modelOutputVersion === 2 && isValidLogicalTurnId(value)\n ? value\n : undefined;\n }\n\n /**\n * Public entry point for WebSocket transport to inject messages into the same pipeline.\n */\n handleDataReceivedPublic(payload: Uint8Array): void {\n this.handleDataReceived(payload, null, \"websocket\");\n }\n\n /** Append a submitted text message without waiting for a server echo. */\n addUserTextMessage(text: string): void {\n const content = text.trim();\n if (!content) return;\n this.chatMessages.push({\n id: `user-llm-text-${Date.now()}-${Math.random()}`,\n type: \"user-llm-text\",\n content,\n timestamp: new Date().toISOString(),\n });\n this.emit(\"messagesChange\", this.chatMessages);\n }\n\n /**\n * Insert a message into the transcript locally. Nothing is transmitted and\n * no LLM turn is billed -- this is for client-side lines (a greeting, a\n * system notice, a replayed history entry) that must appear in the chat.\n *\n * Subscribers see it through the same `messagesChange` as a live message,\n * so React and the widgets pick it up with no special casing.\n */\n appendLocalMessage(message: {\n sender: \"user\" | \"bot\";\n content: string;\n membershipId?: string;\n characterId?: string;\n }): ChatMessage {\n const chatMessage: ChatMessage = {\n id: `local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,\n type: message.sender === \"user\" ? \"user-llm-text\" : \"bot-llm-text\",\n content: message.content,\n timestamp: new Date().toISOString(),\n ...(message.membershipId && { membershipId: message.membershipId }),\n ...(message.characterId && { characterId: message.characterId }),\n };\n this.chatMessages.push(chatMessage);\n this.emit(\"messagesChange\", this.chatMessages);\n return chatMessage;\n }\n\n /**\n * Reset message state\n */\n reset(): void {\n this.chatMessages = [];\n this.activeBotLlmMessageId = null;\n this.userTranscription = \"\";\n this.isBotResponding = false;\n this.isSpeaking = false;\n this.isListening = false;\n this.totalBlendshapesReceived = 0;\n this._currentEmotion = null;\n this.seenBotOutputSegments.clear();\n this._clearModelOutputReplayLedger();\n this.blendshapeQueue.reset();\n this.emit(\"messagesChange\", this.chatMessages);\n this.emit(\"userTranscriptionChange\", \"\");\n this.emit(\"botRespondingChange\", false);\n this.emit(\"speakingChange\", false);\n this.emit(\"listeningChange\", false);\n this.emit(\"emotionChange\", null);\n }\n}\n"]}
|
package/dist/core/SSESession.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { buildActionConnectConfig, buildEmotionConnectConfig,
|
|
1
|
+
import { buildActionConnectConfig, buildEmotionConnectConfig, serializeProtocolCapabilities, } from "./connectRequest.js";
|
|
2
2
|
/** Text-only interaction transport. One POST/SSE stream is used per message. */
|
|
3
3
|
export class SSESession {
|
|
4
4
|
constructor(options) {
|
|
@@ -87,7 +87,7 @@ export class SSESession {
|
|
|
87
87
|
action_config: buildActionConnectConfig(this.options),
|
|
88
88
|
}),
|
|
89
89
|
...(this.options.capabilities && {
|
|
90
|
-
capabilities:
|
|
90
|
+
capabilities: serializeProtocolCapabilities(this.options.capabilities),
|
|
91
91
|
}),
|
|
92
92
|
...(this.options.dynamicInfo && {
|
|
93
93
|
dynamic_info: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SSESession.js","sourceRoot":"","sources":["../../src/core/SSESession.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConvaiConfig } from \"./types\";\nimport {\n buildActionConnectConfig,\n buildEmotionConnectConfig,\n serializeActionProtocolCapabilities,\n} from \"./connectRequest\";\n\nexport interface SSESessionOptions {\n interactionApiUrl: string;\n authorization: string;\n characterId: string;\n getCharacterSessionId: () => string | null;\n onCharacterSessionId: (characterSessionId: string) => void;\n endUserId?: string;\n endUserMetadata?: Record<string, unknown>;\n takeStateOfMind: () => string | null;\n enableEmotion?: ConvaiConfig[\"enableEmotion\"];\n emotionConfig?: ConvaiConfig[\"emotionConfig\"];\n actionConfig?: ConvaiConfig[\"actionConfig\"];\n capabilities?: ConvaiConfig[\"capabilities\"];\n dynamicInfo?: ConvaiConfig[\"dynamicInfo\"];\n keepInContext?: ConvaiConfig[\"keepInContext\"];\n narrativeTemplateKeys?: ConvaiConfig[\"narrativeTemplateKeys\"];\n sceneDescription?: ConvaiConfig[\"sceneDescription\"];\n respondModes?: ConvaiConfig[\"respondModes\"];\n debug?: boolean;\n useResponseLifecycleContract?: boolean;\n invocationMetadata?: ConvaiConfig[\"invocationMetadata\"];\n onMessage: (payload: Uint8Array) => void;\n onError: (error: unknown) => void;\n}\n\nexport interface SSEMessage {\n type: string;\n data: unknown;\n id?: string;\n}\n\n/** Text-only interaction transport. One POST/SSE stream is used per message. */\nexport class SSESession {\n private static readonly BOT_LLM_TEXT_FLUSH_MS = 16;\n private connected = false;\n private abortController: AbortController | null = null;\n private queue: Promise<void> = Promise.resolve();\n private pendingBotLlmText = \"\";\n private botLlmTextFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingMessages: SSEMessage[] = [];\n\n constructor(private readonly options: SSESessionOptions) {}\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n connect(): void {\n this.connected = true;\n }\n\n sendMessage(type: string, data: unknown, id?: string): void {\n this.sendMessages([{ type, data, ...(id !== undefined ? { id } : {}) }]);\n }\n\n sendMessages(messages: SSEMessage[]): void {\n if (messages.length === 0) return;\n this.queue = this.queue\n .then(() => {\n if (!this.connected) return;\n const pending = this.pendingMessages;\n this.pendingMessages = [];\n const context = messages.filter((message) => message.type === \"update-dynamic-info\");\n const rest = messages.filter((message) => message.type !== \"update-dynamic-info\");\n return this.sendInteraction(\n [...context, ...pending, ...rest],\n this.options.takeStateOfMind(),\n );\n })\n .catch((error: unknown) => {\n if (!isAbortError(error)) this.options.onError(error);\n });\n }\n\n /** Update request-scoped dynamic context without opening a control-only request. */\n updateDynamicInfo(dynamicInfo: string): void {\n this.options.dynamicInfo = dynamicInfo;\n }\n\n getDynamicInfo(): string | undefined {\n return this.options.dynamicInfo;\n }\n\n /** Carry a silent control update into the next stateless interaction request. */\n queueMessage(type: string, data: unknown): void {\n this.pendingMessages.push({ type, data });\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n this.abortController?.abort();\n await this.queue;\n this.clearPendingBotLlmText();\n this.abortController = null;\n this.pendingMessages = [];\n }\n\n private async sendInteraction(\n messages: SSEMessage[],\n stateOfMind: string | null,\n ): Promise<void> {\n const controller = new AbortController();\n this.abortController = controller;\n try {\n const characterSessionId = this.options.getCharacterSessionId();\n const response = await fetch(this.options.interactionApiUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.authorization}`,\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n character_id: this.options.characterId,\n ...(stateOfMind ? { state_of_mind: stateOfMind } : {}),\n ...(characterSessionId && characterSessionId !== \"-1\"\n ? { character_session_id: characterSessionId }\n : {}),\n ...(this.options.endUserId\n ? { end_user_id: this.options.endUserId }\n : {}),\n ...(this.options.endUserMetadata\n ? { end_user_metadata: this.options.endUserMetadata }\n : {}),\n ...(buildEmotionConnectConfig(this.options) && {\n emotion_config: buildEmotionConnectConfig(this.options),\n }),\n ...(buildActionConnectConfig(this.options) && {\n action_config: buildActionConnectConfig(this.options),\n }),\n ...(this.options.capabilities && {\n capabilities: serializeActionProtocolCapabilities(this.options.capabilities),\n }),\n ...(this.options.dynamicInfo && {\n dynamic_info: {\n text: this.options.dynamicInfo,\n ...(this.options.keepInContext !== undefined && {\n keep_in_context: this.options.keepInContext,\n }),\n },\n }),\n ...(this.options.narrativeTemplateKeys &&\n Object.keys(this.options.narrativeTemplateKeys).length > 0 && {\n narrative_template_keys: this.options.narrativeTemplateKeys,\n }),\n ...(this.options.sceneDescription && {\n scene_description: this.options.sceneDescription,\n }),\n ...(this.options.respondModes && {\n respond_modes: serializeRespondModes(this.options.respondModes),\n }),\n ...(this.options.debug !== undefined\n ? { debug: this.options.debug }\n : {}),\n ...(this.options.useResponseLifecycleContract !== undefined\n ? {\n use_response_lifecycle_contract:\n this.options.useResponseLifecycleContract,\n }\n : {}),\n ...(this.options.invocationMetadata && {\n invocation_metadata: {\n source: this.options.invocationMetadata.source ?? \"web_sdk\",\n ...(this.options.invocationMetadata.clientVersion && {\n client_version: this.options.invocationMetadata.clientVersion,\n }),\n ...(this.options.invocationMetadata.extraMetadata && {\n extra_metadata: this.options.invocationMetadata.extraMetadata,\n }),\n },\n }),\n messages: messages.map(({ type, data, id }) => ({\n label: \"rtvi-ai\",\n type,\n ...(id !== undefined ? { id } : {}),\n data,\n })),\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Interaction API HTTP ${response.status}${text ? `: ${text}` : \"\"}`,\n );\n }\n if (!response.body) throw new Error(\"Interaction API returned no SSE body\");\n\n await this.readEvents(response.body, controller.signal);\n } finally {\n if (this.abortController === controller) this.abortController = null;\n }\n }\n\n private async readEvents(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n ): Promise<void> {\n const reader = body.getReader();\n try {\n await this.consumeReader(reader, signal);\n } finally {\n // A spec-compliant fetch errors the body when its signal aborts, and the\n // read loop exits on that rejection. Not every runtime the SDK now\n // targets (Node, SSR shims, polyfills) does, and with no cancel the\n // loop would await a read that never settles -- so disconnect() would\n // hang forever. Cancelling is idempotent on an already-closed stream.\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n }\n\n private async consumeReader(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal: AbortSignal,\n ): Promise<void> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n let eventType = \"message\";\n let eventData: string[] = [];\n\n const dispatch = () => {\n if (eventData.length === 0) {\n // Per the SSE spec a frame with no data is not dispatched, but its\n // event-type buffer is still reset. Leaving it set would hand the type\n // to the next frame that omits its own `event:` line -- so a bare\n // `event: done` marker would retype the frame after it as `done`, and\n // that frame would be swallowed as a session-id lookup.\n eventType = \"message\";\n return;\n }\n const dataText = eventData.join(\"\\n\");\n let data: unknown = dataText;\n try {\n data = JSON.parse(dataText);\n } catch {\n // SSE data is JSON for the interaction API; preserve malformed data for diagnostics.\n }\n if (\n eventType === \"bot-llm-text\" &&\n typeof data === \"object\" &&\n data !== null &&\n typeof (data as { text?: unknown }).text === \"string\"\n ) {\n this.queueBotLlmText((data as { text: string }).text);\n eventType = \"message\";\n eventData = [];\n return;\n }\n this.flushBotLlmText();\n if (eventType === \"session\" || eventType === \"done\") {\n const sessionId = (data as { character_session_id?: unknown })\n ?.character_session_id;\n if (typeof sessionId === \"string\") this.options.onCharacterSessionId(sessionId);\n } else {\n if (eventType === \"error\") this.options.onError(data);\n this.options.onMessage(\n new TextEncoder().encode(JSON.stringify({ type: eventType, data })),\n );\n }\n eventType = \"message\";\n eventData = [];\n };\n\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n buffer += decoder.decode(value, { stream: !done });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line) dispatch();\n else if (line.startsWith(\"event:\")) eventType = line.slice(6).trim();\n else if (line.startsWith(\"data:\")) {\n eventData.push(line.slice(5).trimStart());\n }\n }\n if (done) {\n if (buffer) {\n if (buffer.startsWith(\"event:\")) eventType = buffer.slice(6).trim();\n else if (buffer.startsWith(\"data:\")) eventData.push(buffer.slice(5).trimStart());\n }\n dispatch();\n this.flushBotLlmText();\n return;\n }\n }\n }\n\n private queueBotLlmText(text: string): void {\n this.pendingBotLlmText += text;\n if (this.botLlmTextFlushTimer !== null) return;\n this.botLlmTextFlushTimer = setTimeout(() => {\n this.botLlmTextFlushTimer = null;\n this.flushBotLlmText();\n }, SSESession.BOT_LLM_TEXT_FLUSH_MS);\n }\n\n private flushBotLlmText(): void {\n if (this.botLlmTextFlushTimer !== null) {\n clearTimeout(this.botLlmTextFlushTimer);\n this.botLlmTextFlushTimer = null;\n }\n if (!this.pendingBotLlmText) return;\n const text = this.pendingBotLlmText;\n this.pendingBotLlmText = \"\";\n this.options.onMessage(\n new TextEncoder().encode(\n JSON.stringify({ type: \"bot-llm-text\", data: { text } }),\n ),\n );\n }\n\n private clearPendingBotLlmText(): void {\n if (this.botLlmTextFlushTimer !== null) {\n clearTimeout(this.botLlmTextFlushTimer);\n this.botLlmTextFlushTimer = null;\n }\n this.pendingBotLlmText = \"\";\n }\n}\n\nfunction serializeRespondModes(\n config: NonNullable<ConvaiConfig[\"respondModes\"]>,\n): 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\nfunction isAbortError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n error.name === \"AbortError\"\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SSESession.js","sourceRoot":"","sources":["../../src/core/SSESession.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConvaiConfig } from \"./types\";\nimport {\n buildActionConnectConfig,\n buildEmotionConnectConfig,\n serializeProtocolCapabilities,\n} from \"./connectRequest\";\n\nexport interface SSESessionOptions {\n interactionApiUrl: string;\n authorization: string;\n characterId: string;\n getCharacterSessionId: () => string | null;\n onCharacterSessionId: (characterSessionId: string) => void;\n endUserId?: string;\n endUserMetadata?: Record<string, unknown>;\n takeStateOfMind: () => string | null;\n enableEmotion?: ConvaiConfig[\"enableEmotion\"];\n emotionConfig?: ConvaiConfig[\"emotionConfig\"];\n actionConfig?: ConvaiConfig[\"actionConfig\"];\n capabilities?: ConvaiConfig[\"capabilities\"];\n dynamicInfo?: ConvaiConfig[\"dynamicInfo\"];\n keepInContext?: ConvaiConfig[\"keepInContext\"];\n narrativeTemplateKeys?: ConvaiConfig[\"narrativeTemplateKeys\"];\n sceneDescription?: ConvaiConfig[\"sceneDescription\"];\n respondModes?: ConvaiConfig[\"respondModes\"];\n debug?: boolean;\n useResponseLifecycleContract?: boolean;\n invocationMetadata?: ConvaiConfig[\"invocationMetadata\"];\n onMessage: (payload: Uint8Array) => void;\n onError: (error: unknown) => void;\n}\n\nexport interface SSEMessage {\n type: string;\n data: unknown;\n id?: string;\n}\n\n/** Text-only interaction transport. One POST/SSE stream is used per message. */\nexport class SSESession {\n private static readonly BOT_LLM_TEXT_FLUSH_MS = 16;\n private connected = false;\n private abortController: AbortController | null = null;\n private queue: Promise<void> = Promise.resolve();\n private pendingBotLlmText = \"\";\n private botLlmTextFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingMessages: SSEMessage[] = [];\n\n constructor(private readonly options: SSESessionOptions) {}\n\n get isConnected(): boolean {\n return this.connected;\n }\n\n connect(): void {\n this.connected = true;\n }\n\n sendMessage(type: string, data: unknown, id?: string): void {\n this.sendMessages([{ type, data, ...(id !== undefined ? { id } : {}) }]);\n }\n\n sendMessages(messages: SSEMessage[]): void {\n if (messages.length === 0) return;\n this.queue = this.queue\n .then(() => {\n if (!this.connected) return;\n const pending = this.pendingMessages;\n this.pendingMessages = [];\n const context = messages.filter((message) => message.type === \"update-dynamic-info\");\n const rest = messages.filter((message) => message.type !== \"update-dynamic-info\");\n return this.sendInteraction(\n [...context, ...pending, ...rest],\n this.options.takeStateOfMind(),\n );\n })\n .catch((error: unknown) => {\n if (!isAbortError(error)) this.options.onError(error);\n });\n }\n\n /** Update request-scoped dynamic context without opening a control-only request. */\n updateDynamicInfo(dynamicInfo: string): void {\n this.options.dynamicInfo = dynamicInfo;\n }\n\n getDynamicInfo(): string | undefined {\n return this.options.dynamicInfo;\n }\n\n /** Carry a silent control update into the next stateless interaction request. */\n queueMessage(type: string, data: unknown): void {\n this.pendingMessages.push({ type, data });\n }\n\n async disconnect(): Promise<void> {\n this.connected = false;\n this.abortController?.abort();\n await this.queue;\n this.clearPendingBotLlmText();\n this.abortController = null;\n this.pendingMessages = [];\n }\n\n private async sendInteraction(\n messages: SSEMessage[],\n stateOfMind: string | null,\n ): Promise<void> {\n const controller = new AbortController();\n this.abortController = controller;\n try {\n const characterSessionId = this.options.getCharacterSessionId();\n const response = await fetch(this.options.interactionApiUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.options.authorization}`,\n Accept: \"text/event-stream\",\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n character_id: this.options.characterId,\n ...(stateOfMind ? { state_of_mind: stateOfMind } : {}),\n ...(characterSessionId && characterSessionId !== \"-1\"\n ? { character_session_id: characterSessionId }\n : {}),\n ...(this.options.endUserId\n ? { end_user_id: this.options.endUserId }\n : {}),\n ...(this.options.endUserMetadata\n ? { end_user_metadata: this.options.endUserMetadata }\n : {}),\n ...(buildEmotionConnectConfig(this.options) && {\n emotion_config: buildEmotionConnectConfig(this.options),\n }),\n ...(buildActionConnectConfig(this.options) && {\n action_config: buildActionConnectConfig(this.options),\n }),\n ...(this.options.capabilities && {\n capabilities: serializeProtocolCapabilities(this.options.capabilities),\n }),\n ...(this.options.dynamicInfo && {\n dynamic_info: {\n text: this.options.dynamicInfo,\n ...(this.options.keepInContext !== undefined && {\n keep_in_context: this.options.keepInContext,\n }),\n },\n }),\n ...(this.options.narrativeTemplateKeys &&\n Object.keys(this.options.narrativeTemplateKeys).length > 0 && {\n narrative_template_keys: this.options.narrativeTemplateKeys,\n }),\n ...(this.options.sceneDescription && {\n scene_description: this.options.sceneDescription,\n }),\n ...(this.options.respondModes && {\n respond_modes: serializeRespondModes(this.options.respondModes),\n }),\n ...(this.options.debug !== undefined\n ? { debug: this.options.debug }\n : {}),\n ...(this.options.useResponseLifecycleContract !== undefined\n ? {\n use_response_lifecycle_contract:\n this.options.useResponseLifecycleContract,\n }\n : {}),\n ...(this.options.invocationMetadata && {\n invocation_metadata: {\n source: this.options.invocationMetadata.source ?? \"web_sdk\",\n ...(this.options.invocationMetadata.clientVersion && {\n client_version: this.options.invocationMetadata.clientVersion,\n }),\n ...(this.options.invocationMetadata.extraMetadata && {\n extra_metadata: this.options.invocationMetadata.extraMetadata,\n }),\n },\n }),\n messages: messages.map(({ type, data, id }) => ({\n label: \"rtvi-ai\",\n type,\n ...(id !== undefined ? { id } : {}),\n data,\n })),\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(\n `Interaction API HTTP ${response.status}${text ? `: ${text}` : \"\"}`,\n );\n }\n if (!response.body) throw new Error(\"Interaction API returned no SSE body\");\n\n await this.readEvents(response.body, controller.signal);\n } finally {\n if (this.abortController === controller) this.abortController = null;\n }\n }\n\n private async readEvents(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n ): Promise<void> {\n const reader = body.getReader();\n try {\n await this.consumeReader(reader, signal);\n } finally {\n // A spec-compliant fetch errors the body when its signal aborts, and the\n // read loop exits on that rejection. Not every runtime the SDK now\n // targets (Node, SSR shims, polyfills) does, and with no cancel the\n // loop would await a read that never settles -- so disconnect() would\n // hang forever. Cancelling is idempotent on an already-closed stream.\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n }\n\n private async consumeReader(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal: AbortSignal,\n ): Promise<void> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n let eventType = \"message\";\n let eventData: string[] = [];\n\n const dispatch = () => {\n if (eventData.length === 0) {\n // Per the SSE spec a frame with no data is not dispatched, but its\n // event-type buffer is still reset. Leaving it set would hand the type\n // to the next frame that omits its own `event:` line -- so a bare\n // `event: done` marker would retype the frame after it as `done`, and\n // that frame would be swallowed as a session-id lookup.\n eventType = \"message\";\n return;\n }\n const dataText = eventData.join(\"\\n\");\n let data: unknown = dataText;\n try {\n data = JSON.parse(dataText);\n } catch {\n // SSE data is JSON for the interaction API; preserve malformed data for diagnostics.\n }\n if (\n eventType === \"bot-llm-text\" &&\n typeof data === \"object\" &&\n data !== null &&\n typeof (data as { text?: unknown }).text === \"string\"\n ) {\n this.queueBotLlmText((data as { text: string }).text);\n eventType = \"message\";\n eventData = [];\n return;\n }\n this.flushBotLlmText();\n if (eventType === \"session\" || eventType === \"done\") {\n const sessionId = (data as { character_session_id?: unknown })\n ?.character_session_id;\n if (typeof sessionId === \"string\") this.options.onCharacterSessionId(sessionId);\n } else {\n if (eventType === \"error\") this.options.onError(data);\n this.options.onMessage(\n new TextEncoder().encode(JSON.stringify({ type: eventType, data })),\n );\n }\n eventType = \"message\";\n eventData = [];\n };\n\n while (!signal.aborted) {\n const { done, value } = await reader.read();\n buffer += decoder.decode(value, { stream: !done });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n if (!line) dispatch();\n else if (line.startsWith(\"event:\")) eventType = line.slice(6).trim();\n else if (line.startsWith(\"data:\")) {\n eventData.push(line.slice(5).trimStart());\n }\n }\n if (done) {\n if (buffer) {\n if (buffer.startsWith(\"event:\")) eventType = buffer.slice(6).trim();\n else if (buffer.startsWith(\"data:\")) eventData.push(buffer.slice(5).trimStart());\n }\n dispatch();\n this.flushBotLlmText();\n return;\n }\n }\n }\n\n private queueBotLlmText(text: string): void {\n this.pendingBotLlmText += text;\n if (this.botLlmTextFlushTimer !== null) return;\n this.botLlmTextFlushTimer = setTimeout(() => {\n this.botLlmTextFlushTimer = null;\n this.flushBotLlmText();\n }, SSESession.BOT_LLM_TEXT_FLUSH_MS);\n }\n\n private flushBotLlmText(): void {\n if (this.botLlmTextFlushTimer !== null) {\n clearTimeout(this.botLlmTextFlushTimer);\n this.botLlmTextFlushTimer = null;\n }\n if (!this.pendingBotLlmText) return;\n const text = this.pendingBotLlmText;\n this.pendingBotLlmText = \"\";\n this.options.onMessage(\n new TextEncoder().encode(\n JSON.stringify({ type: \"bot-llm-text\", data: { text } }),\n ),\n );\n }\n\n private clearPendingBotLlmText(): void {\n if (this.botLlmTextFlushTimer !== null) {\n clearTimeout(this.botLlmTextFlushTimer);\n this.botLlmTextFlushTimer = null;\n }\n this.pendingBotLlmText = \"\";\n }\n}\n\nfunction serializeRespondModes(\n config: NonNullable<ConvaiConfig[\"respondModes\"]>,\n): 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\nfunction isAbortError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n error.name === \"AbortError\"\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ConvaiConfig } from "./types.js";
|
|
1
|
+
import type { ClientToolDeclaration, ConvaiConfig, JsonObject, ProtocolCapabilitiesConfig } from "./types.js";
|
|
2
2
|
export interface BlendshapeConnectRequestConfig {
|
|
3
3
|
blendshape_provider: "neurosync" | "not_provided";
|
|
4
4
|
blendshape_config: {
|
|
@@ -10,6 +10,28 @@ export interface BlendshapeConnectRequestConfig {
|
|
|
10
10
|
deliver_chunks_ahead?: true;
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
|
+
export interface ClientToolConnectRequestDeclaration {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
input_schema: JsonObject;
|
|
17
|
+
}
|
|
18
|
+
export interface ProtocolCapabilitiesConnectRequest {
|
|
19
|
+
action_protocol_version?: 1 | 2;
|
|
20
|
+
model_output_version?: 1 | 2;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Serialize only explicitly selected capabilities.
|
|
24
|
+
*
|
|
25
|
+
* Returning undefined for an omitted or empty config keeps legacy /connect
|
|
26
|
+
* request bodies unchanged, including for clients using strict wire snapshots.
|
|
27
|
+
*/
|
|
28
|
+
export declare function serializeProtocolCapabilities(capabilities: ProtocolCapabilitiesConfig | undefined): ProtocolCapabilitiesConnectRequest | undefined;
|
|
29
|
+
/** Serialize the public camelCase SDK shape to Core's snake_case wire contract. */
|
|
30
|
+
export declare function serializeClientTools(tools: ClientToolDeclaration[]): ClientToolConnectRequestDeclaration[];
|
|
31
|
+
/** Reject unsupported action versions, downgrades, and unsolicited v2 upgrades. */
|
|
32
|
+
export declare function validateActionProtocolSelection(requestedVersion: 1 | 2 | undefined, selectedVersion: unknown): void;
|
|
33
|
+
/** Reject unsupported model-output versions, downgrades, and unsolicited v2 upgrades. */
|
|
34
|
+
export declare function validateModelOutputVersionSelection(requestedVersion: 1 | 2 | undefined, selectedVersion: unknown): 1 | 2;
|
|
13
35
|
/**
|
|
14
36
|
* Build the lipsync part of the /connect request.
|
|
15
37
|
*
|
|
@@ -20,6 +42,19 @@ export interface BlendshapeConnectRequestConfig {
|
|
|
20
42
|
*/
|
|
21
43
|
export declare function buildBlendshapeConnectConfig(config: Pick<ConvaiConfig, "enableLipsync" | "blendshapeConfig">): BlendshapeConnectRequestConfig;
|
|
22
44
|
export declare function buildEmotionConnectConfig(config: Pick<ConvaiConfig, "enableEmotion" | "emotionConfig">): Record<string, unknown> | undefined;
|
|
23
|
-
|
|
24
|
-
export
|
|
45
|
+
/** The `action_config` block as sent on the wire; tools are already serialized. */
|
|
46
|
+
export interface ActionConnectRequestConfig {
|
|
47
|
+
actions: string[];
|
|
48
|
+
characters: {
|
|
49
|
+
name: string;
|
|
50
|
+
bio: string;
|
|
51
|
+
}[];
|
|
52
|
+
objects: {
|
|
53
|
+
name: string;
|
|
54
|
+
description: string;
|
|
55
|
+
}[];
|
|
56
|
+
current_attention_object?: string;
|
|
57
|
+
tools?: ClientToolConnectRequestDeclaration[];
|
|
58
|
+
}
|
|
59
|
+
export declare function buildActionConnectConfig(config: Pick<ConvaiConfig, "actionConfig">): ActionConnectRequestConfig | undefined;
|
|
25
60
|
//# sourceMappingURL=connectRequest.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectRequest.d.ts","sourceRoot":"","sources":["../../src/core/connectRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"connectRequest.d.ts","sourceRoot":"","sources":["../../src/core/connectRequest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,YAAY,EACZ,UAAU,EACV,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,8BAA8B;IAC7C,mBAAmB,EAAE,WAAW,GAAG,cAAc,CAAC;IAClD,iBAAiB,EAAE;QACjB,eAAe,EAAE,IAAI,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;QAChE,sBAAsB,EAAE,MAAM,CAAC;QAC/B,UAAU,EAAE,MAAM,CAAC;QACnB,oBAAoB,CAAC,EAAE,IAAI,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,mCAAmC;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,UAAU,CAAC;CAC1B;AAED,MAAM,WAAW,kCAAkC;IACjD,uBAAuB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAChC,oBAAoB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,0BAA0B,GAAG,SAAS,GACnD,kCAAkC,GAAG,SAAS,CAahD;AAED,mFAAmF;AACnF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,qBAAqB,EAAE,GAC7B,mCAAmC,EAAE,CAMvC;AAED,mFAAmF;AACnF,wBAAgB,+BAA+B,CAC7C,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EACnC,eAAe,EAAE,OAAO,GACvB,IAAI,CAkBN;AAED,yFAAyF;AACzF,wBAAgB,mCAAmC,CACjD,gBAAgB,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,EACnC,eAAe,EAAE,OAAO,GACvB,CAAC,GAAG,CAAC,CAoBP;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,kBAAkB,CAAC,GAC/D,8BAA8B,CAuBhC;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,eAAe,CAAC,GAC5D,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAYrC;AAED,mFAAmF;AACnF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,KAAK,CAAC,EAAE,mCAAmC,EAAE,CAAC;CAC/C;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,GACzC,0BAA0B,GAAG,SAAS,CAYxC"}
|
|
@@ -1,3 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serialize only explicitly selected capabilities.
|
|
3
|
+
*
|
|
4
|
+
* Returning undefined for an omitted or empty config keeps legacy /connect
|
|
5
|
+
* request bodies unchanged, including for clients using strict wire snapshots.
|
|
6
|
+
*/
|
|
7
|
+
export function serializeProtocolCapabilities(capabilities) {
|
|
8
|
+
if (!capabilities)
|
|
9
|
+
return undefined;
|
|
10
|
+
const serialized = {
|
|
11
|
+
...(capabilities.actionProtocolVersion !== undefined && {
|
|
12
|
+
action_protocol_version: capabilities.actionProtocolVersion,
|
|
13
|
+
}),
|
|
14
|
+
...(capabilities.modelOutputVersion !== undefined && {
|
|
15
|
+
model_output_version: capabilities.modelOutputVersion,
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
return Object.keys(serialized).length > 0 ? serialized : undefined;
|
|
19
|
+
}
|
|
20
|
+
/** Serialize the public camelCase SDK shape to Core's snake_case wire contract. */
|
|
21
|
+
export function serializeClientTools(tools) {
|
|
22
|
+
return tools.map((tool) => ({
|
|
23
|
+
name: tool.name,
|
|
24
|
+
description: tool.description,
|
|
25
|
+
input_schema: tool.inputSchema,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
/** Reject unsupported action versions, downgrades, and unsolicited v2 upgrades. */
|
|
29
|
+
export function validateActionProtocolSelection(requestedVersion, selectedVersion) {
|
|
30
|
+
if (selectedVersion != null &&
|
|
31
|
+
selectedVersion !== 1 &&
|
|
32
|
+
selectedVersion !== 2) {
|
|
33
|
+
throw new Error(`Core selected unsupported action protocol version: ${String(selectedVersion)}`);
|
|
34
|
+
}
|
|
35
|
+
if (requestedVersion === 2 && selectedVersion !== 2) {
|
|
36
|
+
throw new Error("Core did not select requested action protocol version 2");
|
|
37
|
+
}
|
|
38
|
+
if (selectedVersion === 2 && requestedVersion !== 2) {
|
|
39
|
+
throw new Error("Core selected action protocol version 2 without an explicit client opt-in");
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Reject unsupported model-output versions, downgrades, and unsolicited v2 upgrades. */
|
|
43
|
+
export function validateModelOutputVersionSelection(requestedVersion, selectedVersion) {
|
|
44
|
+
if (selectedVersion != null &&
|
|
45
|
+
selectedVersion !== 1 &&
|
|
46
|
+
selectedVersion !== 2) {
|
|
47
|
+
throw new Error(`Core selected unsupported model output version: ${String(selectedVersion)}`);
|
|
48
|
+
}
|
|
49
|
+
if (requestedVersion === 2 && selectedVersion !== 2) {
|
|
50
|
+
throw new Error("Core did not select requested model output version 2");
|
|
51
|
+
}
|
|
52
|
+
if (selectedVersion === 2 && requestedVersion !== 2) {
|
|
53
|
+
throw new Error("Core selected model output version 2 without an explicit client opt-in");
|
|
54
|
+
}
|
|
55
|
+
return selectedVersion === 2 ? 2 : 1;
|
|
56
|
+
}
|
|
1
57
|
/**
|
|
2
58
|
* Build the lipsync part of the /connect request.
|
|
3
59
|
*
|
|
@@ -52,17 +108,7 @@ export function buildActionConnectConfig(config) {
|
|
|
52
108
|
...(actionConfig.current_attention_object && {
|
|
53
109
|
current_attention_object: actionConfig.current_attention_object,
|
|
54
110
|
}),
|
|
55
|
-
...(actionConfig.tools && { tools: actionConfig.tools }),
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
export function serializeActionProtocolCapabilities(capabilities) {
|
|
59
|
-
if (!capabilities)
|
|
60
|
-
return undefined;
|
|
61
|
-
return {
|
|
62
|
-
action_protocol_version: capabilities.actionProtocolVersion,
|
|
63
|
-
...(capabilities.modelOutputVersion !== undefined
|
|
64
|
-
? { model_output_version: capabilities.modelOutputVersion }
|
|
65
|
-
: {}),
|
|
111
|
+
...(actionConfig.tools && { tools: serializeClientTools(actionConfig.tools) }),
|
|
66
112
|
};
|
|
67
113
|
}
|
|
68
114
|
//# sourceMappingURL=connectRequest.js.map
|