@convai/web-sdk 1.8.0-beta.7 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +44 -194
  2. package/dist/core/ConvaiClient.d.ts +1 -190
  3. package/dist/core/ConvaiClient.d.ts.map +1 -1
  4. package/dist/core/ConvaiClient.js +286 -1306
  5. package/dist/core/ConvaiClient.js.map +1 -1
  6. package/dist/core/MessageHandler.d.ts +1 -19
  7. package/dist/core/MessageHandler.d.ts.map +1 -1
  8. package/dist/core/MessageHandler.js +27 -378
  9. package/dist/core/MessageHandler.js.map +1 -1
  10. package/dist/core/connectRequest.d.ts +4 -17
  11. package/dist/core/connectRequest.d.ts.map +1 -1
  12. package/dist/core/connectRequest.js +17 -28
  13. package/dist/core/connectRequest.js.map +1 -1
  14. package/dist/core/index.d.ts +1 -6
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js +1 -7
  17. package/dist/core/index.js.map +1 -1
  18. package/dist/core/logicalTurn.d.ts +6 -4
  19. package/dist/core/logicalTurn.d.ts.map +1 -1
  20. package/dist/core/logicalTurn.js +4 -29
  21. package/dist/core/logicalTurn.js.map +1 -1
  22. package/dist/core/modelOutput.d.ts.map +1 -1
  23. package/dist/core/modelOutput.js +2 -2
  24. package/dist/core/modelOutput.js.map +1 -1
  25. package/dist/core/types.d.ts +22 -860
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/core/types.js.map +1 -1
  28. package/dist/embed/chat-embed-v1.js +9 -10
  29. package/dist/embed/chat-embed-v1.js.map +4 -4
  30. package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
  31. package/dist/react/components/ConvaiWidget.js +1 -6
  32. package/dist/react/components/ConvaiWidget.js.map +1 -1
  33. package/dist/react/components/rtc-widget/components/AudioVisualizer.d.ts.map +1 -1
  34. package/dist/react/components/rtc-widget/components/AudioVisualizer.js +1 -28
  35. package/dist/react/components/rtc-widget/components/AudioVisualizer.js.map +1 -1
  36. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -1
  37. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +44 -39
  38. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -1
  39. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -1
  40. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +49 -93
  41. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -1
  42. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
  43. package/dist/react/hooks/useConvaiClient.js +2 -17
  44. package/dist/react/hooks/useConvaiClient.js.map +1 -1
  45. package/dist/react/index.d.ts +1 -1
  46. package/dist/react/index.d.ts.map +1 -1
  47. package/dist/react/index.js +1 -1
  48. package/dist/react/index.js.map +1 -1
  49. package/dist/vanilla/AudioRenderer.d.ts +1 -3
  50. package/dist/vanilla/AudioRenderer.d.ts.map +1 -1
  51. package/dist/vanilla/AudioRenderer.js +2 -8
  52. package/dist/vanilla/AudioRenderer.js.map +1 -1
  53. package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
  54. package/dist/vanilla/ConvaiWidget.js +300 -994
  55. package/dist/vanilla/ConvaiWidget.js.map +1 -1
  56. package/dist/vanilla/WidgetEventSubscriptions.d.ts +1 -1
  57. package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -1
  58. package/dist/vanilla/WidgetEventSubscriptions.js +0 -5
  59. package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -1
  60. package/dist/vanilla/icons.d.ts.map +1 -1
  61. package/dist/vanilla/icons.js +15 -62
  62. package/dist/vanilla/icons.js.map +1 -1
  63. package/dist/vanilla/index.d.ts +2 -4
  64. package/dist/vanilla/index.d.ts.map +1 -1
  65. package/dist/vanilla/index.js +1 -3
  66. package/dist/vanilla/index.js.map +1 -1
  67. package/dist/vanilla/styles.d.ts +1 -18
  68. package/dist/vanilla/styles.d.ts.map +1 -1
  69. package/dist/vanilla/styles.js +29 -129
  70. package/dist/vanilla/styles.js.map +1 -1
  71. package/dist/vanilla/types.d.ts +0 -74
  72. package/dist/vanilla/types.d.ts.map +1 -1
  73. package/dist/vanilla/types.js.map +1 -1
  74. package/dist/version.d.ts +1 -1
  75. package/dist/version.d.ts.map +1 -1
  76. package/dist/version.js +1 -1
  77. package/dist/version.js.map +1 -1
  78. package/package.json +8 -13
  79. package/dist/core/CharacterRoster.d.ts +0 -84
  80. package/dist/core/CharacterRoster.d.ts.map +0 -1
  81. package/dist/core/CharacterRoster.js +0 -348
  82. package/dist/core/CharacterRoster.js.map +0 -1
  83. package/dist/core/CharacterVersionManager.d.ts +0 -100
  84. package/dist/core/CharacterVersionManager.d.ts.map +0 -1
  85. package/dist/core/CharacterVersionManager.js +0 -227
  86. package/dist/core/CharacterVersionManager.js.map +0 -1
  87. package/dist/core/ConvaiRoomError.d.ts +0 -48
  88. package/dist/core/ConvaiRoomError.d.ts.map +0 -1
  89. package/dist/core/ConvaiRoomError.js +0 -111
  90. package/dist/core/ConvaiRoomError.js.map +0 -1
  91. package/dist/core/SSESession.d.ts +0 -59
  92. package/dist/core/SSESession.d.ts.map +0 -1
  93. package/dist/core/SSESession.js +0 -289
  94. package/dist/core/SSESession.js.map +0 -1
  95. package/dist/core/characterReference.d.ts +0 -40
  96. package/dist/core/characterReference.d.ts.map +0 -1
  97. package/dist/core/characterReference.js +0 -72
  98. package/dist/core/characterReference.js.map +0 -1
  99. package/dist/core/rosterRequest.d.ts +0 -57
  100. package/dist/core/rosterRequest.d.ts.map +0 -1
  101. package/dist/core/rosterRequest.js +0 -210
  102. package/dist/core/rosterRequest.js.map +0 -1
  103. package/dist/utils/inlineMarkdown.d.ts +0 -38
  104. package/dist/utils/inlineMarkdown.d.ts.map +0 -1
  105. package/dist/utils/inlineMarkdown.js +0 -106
  106. package/dist/utils/inlineMarkdown.js.map +0 -1
@@ -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 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"]}
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 ConvaiToolCall,\n InteractionCreated,\n ModelOutputMessage,\n ServerResponse,\n} from \"./types\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport {\n extractModelOutputPayload,\n parseModelOutputMessage,\n} from \"./modelOutput\";\nimport { isValidLogicalTurnId } 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\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 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 seenModelOutputIds = new Set<string>();\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.seenModelOutputIds.clear();\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 // 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 this.emit(\"botReady\");\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 };\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 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 (lastMsg?.type === \"bot-llm-text\") break;\n if (\n lastMsg?.type === \"bot-output\" &&\n lastMsg.content.includes(newText)\n ) {\n break;\n }\n if (lastMsg?.type === \"bot-output\" && lastMsg.isStreaming) {\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 });\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 lastMessage = this.chatMessages[this.chatMessages.length - 1];\n if (lastMessage && lastMessage.isStreaming) {\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastMessage,\n content: lastMessage.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 };\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 lastBotMsg = this.chatMessages[this.chatMessages.length - 1];\n if (lastBotMsg && lastBotMsg.isStreaming) {\n this.chatMessages[this.chatMessages.length - 1] = {\n ...lastBotMsg,\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 // 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\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 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 // 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 logicalTurnId = this.transcriptionLogicalTurnId(\n serverData.logical_turn_id,\n );\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 ...(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 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 // 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 if (this.seenModelOutputIds.has(output.output_id)) return;\n this.seenModelOutputIds.add(output.output_id);\n this.emit(\"modelOutput\", output satisfies ModelOutputMessage);\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 * Reset message state\n */\n reset(): void {\n this.chatMessages = [];\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.seenModelOutputIds.clear();\n this.seenBotOutputSegments.clear();\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"]}
@@ -4,7 +4,7 @@ export interface BlendshapeConnectRequestConfig {
4
4
  blendshape_config: {
5
5
  enable_chunking: true;
6
6
  chunk_size: number;
7
- format: "arkit" | "mha" | "cc4_extended" | "cc5_hd" | "visemes";
7
+ format: "arkit" | "mha";
8
8
  frames_buffer_duration: number;
9
9
  output_fps: number;
10
10
  deliver_chunks_ahead?: true;
@@ -18,6 +18,7 @@ export interface ClientToolConnectRequestDeclaration {
18
18
  export interface ProtocolCapabilitiesConnectRequest {
19
19
  action_protocol_version?: 1 | 2;
20
20
  model_output_version?: 1 | 2;
21
+ bot_llm_text_mode?: "legacy" | "raw";
21
22
  }
22
23
  /**
23
24
  * Serialize only explicitly selected capabilities.
@@ -32,6 +33,8 @@ export declare function serializeClientTools(tools: ClientToolDeclaration[]): Cl
32
33
  export declare function validateActionProtocolSelection(requestedVersion: 1 | 2 | undefined, selectedVersion: unknown): void;
33
34
  /** Reject unsupported model-output versions, downgrades, and unsolicited v2 upgrades. */
34
35
  export declare function validateModelOutputVersionSelection(requestedVersion: 1 | 2 | undefined, selectedVersion: unknown): 1 | 2;
36
+ /** Reject unsupported text modes, raw downgrades, and unsolicited raw upgrades. */
37
+ export declare function validateBotLlmTextModeSelection(requestedMode: "legacy" | "raw" | undefined, selectedMode: unknown): void;
35
38
  /**
36
39
  * Build the lipsync part of the /connect request.
37
40
  *
@@ -41,20 +44,4 @@ export declare function validateModelOutputVersionSelection(requestedVersion: 1
41
44
  * to the legacy paced path with deliver_chunks_ahead: false.
42
45
  */
43
46
  export declare function buildBlendshapeConnectConfig(config: Pick<ConvaiConfig, "enableLipsync" | "blendshapeConfig">): BlendshapeConnectRequestConfig;
44
- export declare function buildEmotionConnectConfig(config: Pick<ConvaiConfig, "enableEmotion" | "emotionConfig">): Record<string, unknown> | undefined;
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;
60
47
  //# 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,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
+ {"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,CAAC;QACxB,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;IAC7B,iBAAiB,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;CACtC;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE,0BAA0B,GAAG,SAAS,GACnD,kCAAkC,GAAG,SAAS,CAgBhD;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,mFAAmF;AACnF,wBAAgB,+BAA+B,CAC7C,aAAa,EAAE,QAAQ,GAAG,KAAK,GAAG,SAAS,EAC3C,YAAY,EAAE,OAAO,GACpB,IAAI,CAkBN;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,kBAAkB,CAAC,GAC/D,8BAA8B,CAuBhC"}
@@ -14,6 +14,9 @@ export function serializeProtocolCapabilities(capabilities) {
14
14
  ...(capabilities.modelOutputVersion !== undefined && {
15
15
  model_output_version: capabilities.modelOutputVersion,
16
16
  }),
17
+ ...(capabilities.botLlmTextMode !== undefined && {
18
+ bot_llm_text_mode: capabilities.botLlmTextMode,
19
+ }),
17
20
  };
18
21
  return Object.keys(serialized).length > 0 ? serialized : undefined;
19
22
  }
@@ -54,6 +57,20 @@ export function validateModelOutputVersionSelection(requestedVersion, selectedVe
54
57
  }
55
58
  return selectedVersion === 2 ? 2 : 1;
56
59
  }
60
+ /** Reject unsupported text modes, raw downgrades, and unsolicited raw upgrades. */
61
+ export function validateBotLlmTextModeSelection(requestedMode, selectedMode) {
62
+ if (selectedMode != null &&
63
+ selectedMode !== "legacy" &&
64
+ selectedMode !== "raw") {
65
+ throw new Error(`Core selected unsupported bot LLM text mode: ${String(selectedMode)}`);
66
+ }
67
+ if (requestedMode === "raw" && selectedMode !== "raw") {
68
+ throw new Error("Core did not select requested raw bot LLM text mode");
69
+ }
70
+ if (selectedMode === "raw" && requestedMode !== "raw") {
71
+ throw new Error("Core selected raw bot LLM text mode without an explicit client opt-in");
72
+ }
73
+ }
57
74
  /**
58
75
  * Build the lipsync part of the /connect request.
59
76
  *
@@ -83,32 +100,4 @@ export function buildBlendshapeConnectConfig(config) {
83
100
  },
84
101
  };
85
102
  }
86
- export function buildEmotionConnectConfig(config) {
87
- if (config.enableEmotion !== true)
88
- return undefined;
89
- const emotionConfig = config.emotionConfig;
90
- if (emotionConfig?.provider === "nrclex") {
91
- return {
92
- provider: emotionConfig.provider,
93
- min_word_threshold: emotionConfig.min_word_threshold ?? 3,
94
- low_intensity_threshold: emotionConfig.low_intensity_threshold ?? 0.33,
95
- high_intensity_threshold: emotionConfig.high_intensity_threshold ?? 0.66,
96
- };
97
- }
98
- return { provider: emotionConfig?.provider ?? "llm" };
99
- }
100
- export function buildActionConnectConfig(config) {
101
- const actionConfig = config.actionConfig;
102
- if (!actionConfig)
103
- return undefined;
104
- return {
105
- actions: actionConfig.actions,
106
- objects: actionConfig.objects,
107
- characters: actionConfig.characters,
108
- ...(actionConfig.current_attention_object && {
109
- current_attention_object: actionConfig.current_attention_object,
110
- }),
111
- ...(actionConfig.tools && { tools: serializeClientTools(actionConfig.tools) }),
112
- };
113
- }
114
103
  //# sourceMappingURL=connectRequest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"connectRequest.js","sourceRoot":"","sources":["../../src/core/connectRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ClientToolDeclaration,\n ConvaiConfig,\n JsonObject,\n ProtocolCapabilitiesConfig,\n} from \"./types\";\n\nexport interface BlendshapeConnectRequestConfig {\n blendshape_provider: \"neurosync\" | \"not_provided\";\n blendshape_config: {\n enable_chunking: true;\n chunk_size: number;\n format: \"arkit\" | \"mha\" | \"cc4_extended\" | \"cc5_hd\" | \"visemes\";\n frames_buffer_duration: number;\n output_fps: number;\n deliver_chunks_ahead?: true;\n };\n}\n\nexport interface ClientToolConnectRequestDeclaration {\n name: string;\n description: string;\n input_schema: JsonObject;\n}\n\nexport interface ProtocolCapabilitiesConnectRequest {\n action_protocol_version?: 1 | 2;\n model_output_version?: 1 | 2;\n}\n\n/**\n * Serialize only explicitly selected capabilities.\n *\n * Returning undefined for an omitted or empty config keeps legacy /connect\n * request bodies unchanged, including for clients using strict wire snapshots.\n */\nexport function serializeProtocolCapabilities(\n capabilities: ProtocolCapabilitiesConfig | undefined,\n): ProtocolCapabilitiesConnectRequest | undefined {\n if (!capabilities) return undefined;\n\n const serialized: ProtocolCapabilitiesConnectRequest = {\n ...(capabilities.actionProtocolVersion !== undefined && {\n action_protocol_version: capabilities.actionProtocolVersion,\n }),\n ...(capabilities.modelOutputVersion !== undefined && {\n model_output_version: capabilities.modelOutputVersion,\n }),\n };\n\n return Object.keys(serialized).length > 0 ? serialized : undefined;\n}\n\n/** Serialize the public camelCase SDK shape to Core's snake_case wire contract. */\nexport function serializeClientTools(\n tools: ClientToolDeclaration[],\n): ClientToolConnectRequestDeclaration[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n}\n\n/** Reject unsupported action versions, downgrades, and unsolicited v2 upgrades. */\nexport function validateActionProtocolSelection(\n requestedVersion: 1 | 2 | undefined,\n selectedVersion: unknown,\n): void {\n if (\n selectedVersion != null &&\n selectedVersion !== 1 &&\n selectedVersion !== 2\n ) {\n throw new Error(\n `Core selected unsupported action protocol version: ${String(selectedVersion)}`,\n );\n }\n if (requestedVersion === 2 && selectedVersion !== 2) {\n throw new Error(\"Core did not select requested action protocol version 2\");\n }\n if (selectedVersion === 2 && requestedVersion !== 2) {\n throw new Error(\n \"Core selected action protocol version 2 without an explicit client opt-in\",\n );\n }\n}\n\n/** Reject unsupported model-output versions, downgrades, and unsolicited v2 upgrades. */\nexport function validateModelOutputVersionSelection(\n requestedVersion: 1 | 2 | undefined,\n selectedVersion: unknown,\n): 1 | 2 {\n if (\n selectedVersion != null &&\n selectedVersion !== 1 &&\n selectedVersion !== 2\n ) {\n throw new Error(\n `Core selected unsupported model output version: ${String(selectedVersion)}`,\n );\n }\n if (requestedVersion === 2 && selectedVersion !== 2) {\n throw new Error(\"Core did not select requested model output version 2\");\n }\n if (selectedVersion === 2 && requestedVersion !== 2) {\n throw new Error(\n \"Core selected model output version 2 without an explicit client opt-in\",\n );\n }\n\n return selectedVersion === 2 ? 2 : 1;\n}\n\n/**\n * Build the lipsync part of the /connect request.\n *\n * Ahead-delivery changes the client contract because frames can arrive before\n * bot-started-speaking and cancellation must be handled with owner metadata.\n * It is the default now that server support is verified; callers can fall back\n * to the legacy paced path with deliver_chunks_ahead: false.\n */\nexport function buildBlendshapeConnectConfig(\n config: Pick<ConvaiConfig, \"enableLipsync\" | \"blendshapeConfig\">,\n): BlendshapeConnectRequestConfig {\n const deliverChunksAhead =\n config.enableLipsync === true &&\n config.blendshapeConfig?.deliver_chunks_ahead !== false;\n\n return {\n blendshape_provider: config.enableLipsync ? \"neurosync\" : \"not_provided\",\n blendshape_config: {\n enable_chunking: true,\n chunk_size: 10,\n format: config.blendshapeConfig?.format || \"mha\",\n frames_buffer_duration:\n config.blendshapeConfig?.frames_buffer_duration ?? 0.1,\n // In the legacy paced path, output_fps is a delivery cadence and the SDK\n // player keeps its 60fps visual timeline. Only ahead-delivery treats\n // output_fps as a client-visible timeline override because chunks carry\n // fps metadata.\n output_fps: deliverChunksAhead\n ? config.blendshapeConfig?.output_fps ?? 60\n : 90,\n ...(deliverChunksAhead ? { deliver_chunks_ahead: true } : {}),\n },\n };\n}\n\nexport function buildEmotionConnectConfig(\n config: Pick<ConvaiConfig, \"enableEmotion\" | \"emotionConfig\">,\n): Record<string, unknown> | undefined {\n if (config.enableEmotion !== true) return undefined;\n const emotionConfig = config.emotionConfig;\n if (emotionConfig?.provider === \"nrclex\") {\n return {\n provider: emotionConfig.provider,\n min_word_threshold: emotionConfig.min_word_threshold ?? 3,\n low_intensity_threshold: emotionConfig.low_intensity_threshold ?? 0.33,\n high_intensity_threshold: emotionConfig.high_intensity_threshold ?? 0.66,\n };\n }\n return { provider: emotionConfig?.provider ?? \"llm\" };\n}\n\n/** The `action_config` block as sent on the wire; tools are already serialized. */\nexport interface ActionConnectRequestConfig {\n actions: string[];\n characters: { name: string; bio: string }[];\n objects: { name: string; description: string }[];\n current_attention_object?: string;\n tools?: ClientToolConnectRequestDeclaration[];\n}\n\nexport function buildActionConnectConfig(\n config: Pick<ConvaiConfig, \"actionConfig\">,\n): ActionConnectRequestConfig | undefined {\n const actionConfig = config.actionConfig;\n if (!actionConfig) return undefined;\n return {\n actions: actionConfig.actions,\n objects: actionConfig.objects,\n characters: actionConfig.characters,\n ...(actionConfig.current_attention_object && {\n current_attention_object: actionConfig.current_attention_object,\n }),\n ...(actionConfig.tools && { tools: serializeClientTools(actionConfig.tools) }),\n };\n}\n\n"]}
1
+ {"version":3,"file":"connectRequest.js","sourceRoot":"","sources":["../../src/core/connectRequest.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ClientToolDeclaration,\n ConvaiConfig,\n JsonObject,\n ProtocolCapabilitiesConfig,\n} from \"./types\";\n\nexport interface BlendshapeConnectRequestConfig {\n blendshape_provider: \"neurosync\" | \"not_provided\";\n blendshape_config: {\n enable_chunking: true;\n chunk_size: number;\n format: \"arkit\" | \"mha\";\n frames_buffer_duration: number;\n output_fps: number;\n deliver_chunks_ahead?: true;\n };\n}\n\nexport interface ClientToolConnectRequestDeclaration {\n name: string;\n description: string;\n input_schema: JsonObject;\n}\n\nexport interface ProtocolCapabilitiesConnectRequest {\n action_protocol_version?: 1 | 2;\n model_output_version?: 1 | 2;\n bot_llm_text_mode?: \"legacy\" | \"raw\";\n}\n\n/**\n * Serialize only explicitly selected capabilities.\n *\n * Returning undefined for an omitted or empty config keeps legacy /connect\n * request bodies unchanged, including for clients using strict wire snapshots.\n */\nexport function serializeProtocolCapabilities(\n capabilities: ProtocolCapabilitiesConfig | undefined,\n): ProtocolCapabilitiesConnectRequest | undefined {\n if (!capabilities) return undefined;\n\n const serialized: ProtocolCapabilitiesConnectRequest = {\n ...(capabilities.actionProtocolVersion !== undefined && {\n action_protocol_version: capabilities.actionProtocolVersion,\n }),\n ...(capabilities.modelOutputVersion !== undefined && {\n model_output_version: capabilities.modelOutputVersion,\n }),\n ...(capabilities.botLlmTextMode !== undefined && {\n bot_llm_text_mode: capabilities.botLlmTextMode,\n }),\n };\n\n return Object.keys(serialized).length > 0 ? serialized : undefined;\n}\n\n/** Serialize the public camelCase SDK shape to Core's snake_case wire contract. */\nexport function serializeClientTools(\n tools: ClientToolDeclaration[],\n): ClientToolConnectRequestDeclaration[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n}\n\n/** Reject unsupported action versions, downgrades, and unsolicited v2 upgrades. */\nexport function validateActionProtocolSelection(\n requestedVersion: 1 | 2 | undefined,\n selectedVersion: unknown,\n): void {\n if (\n selectedVersion != null &&\n selectedVersion !== 1 &&\n selectedVersion !== 2\n ) {\n throw new Error(\n `Core selected unsupported action protocol version: ${String(selectedVersion)}`,\n );\n }\n if (requestedVersion === 2 && selectedVersion !== 2) {\n throw new Error(\"Core did not select requested action protocol version 2\");\n }\n if (selectedVersion === 2 && requestedVersion !== 2) {\n throw new Error(\n \"Core selected action protocol version 2 without an explicit client opt-in\",\n );\n }\n}\n\n/** Reject unsupported model-output versions, downgrades, and unsolicited v2 upgrades. */\nexport function validateModelOutputVersionSelection(\n requestedVersion: 1 | 2 | undefined,\n selectedVersion: unknown,\n): 1 | 2 {\n if (\n selectedVersion != null &&\n selectedVersion !== 1 &&\n selectedVersion !== 2\n ) {\n throw new Error(\n `Core selected unsupported model output version: ${String(selectedVersion)}`,\n );\n }\n if (requestedVersion === 2 && selectedVersion !== 2) {\n throw new Error(\"Core did not select requested model output version 2\");\n }\n if (selectedVersion === 2 && requestedVersion !== 2) {\n throw new Error(\n \"Core selected model output version 2 without an explicit client opt-in\",\n );\n }\n\n return selectedVersion === 2 ? 2 : 1;\n}\n\n/** Reject unsupported text modes, raw downgrades, and unsolicited raw upgrades. */\nexport function validateBotLlmTextModeSelection(\n requestedMode: \"legacy\" | \"raw\" | undefined,\n selectedMode: unknown,\n): void {\n if (\n selectedMode != null &&\n selectedMode !== \"legacy\" &&\n selectedMode !== \"raw\"\n ) {\n throw new Error(\n `Core selected unsupported bot LLM text mode: ${String(selectedMode)}`,\n );\n }\n if (requestedMode === \"raw\" && selectedMode !== \"raw\") {\n throw new Error(\"Core did not select requested raw bot LLM text mode\");\n }\n if (selectedMode === \"raw\" && requestedMode !== \"raw\") {\n throw new Error(\n \"Core selected raw bot LLM text mode without an explicit client opt-in\",\n );\n }\n}\n\n/**\n * Build the lipsync part of the /connect request.\n *\n * Ahead-delivery changes the client contract because frames can arrive before\n * bot-started-speaking and cancellation must be handled with owner metadata.\n * It is the default now that server support is verified; callers can fall back\n * to the legacy paced path with deliver_chunks_ahead: false.\n */\nexport function buildBlendshapeConnectConfig(\n config: Pick<ConvaiConfig, \"enableLipsync\" | \"blendshapeConfig\">,\n): BlendshapeConnectRequestConfig {\n const deliverChunksAhead =\n config.enableLipsync === true &&\n config.blendshapeConfig?.deliver_chunks_ahead !== false;\n\n return {\n blendshape_provider: config.enableLipsync ? \"neurosync\" : \"not_provided\",\n blendshape_config: {\n enable_chunking: true,\n chunk_size: 10,\n format: config.blendshapeConfig?.format || \"mha\",\n frames_buffer_duration:\n config.blendshapeConfig?.frames_buffer_duration ?? 0.1,\n // In the legacy paced path, output_fps is a delivery cadence and the SDK\n // player keeps its 60fps visual timeline. Only ahead-delivery treats\n // output_fps as a client-visible timeline override because chunks carry\n // fps metadata.\n output_fps: deliverChunksAhead\n ? config.blendshapeConfig?.output_fps ?? 60\n : 90,\n ...(deliverChunksAhead ? { deliver_chunks_ahead: true } : {}),\n },\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- export { ActionResultAckError, ConvaiClient } from './ConvaiClient.js';
1
+ export { ConvaiClient } from './ConvaiClient.js';
2
2
  export * from './types.js';
3
3
  export { getDisconnectReasonMessage } from './types.js';
4
4
  export type { ConvaiClient as ConvaiClientType } from './ConvaiClient.js';
@@ -7,11 +7,6 @@ export { VideoManager } from './VideoManager.js';
7
7
  export { ScreenShareManager } from './ScreenShareManager.js';
8
8
  export { MessageHandler } from './MessageHandler.js';
9
9
  export { MemoryManager } from './MemoryManager.js';
10
- export { CharacterRoster } from './CharacterRoster.js';
11
- export { ConvaiRoomError } from './ConvaiRoomError.js';
12
- export { MULTI_CHARACTER_MAX_CHARACTERS, isRosterConfig, } from './rosterRequest.js';
13
- export { CharacterVersionManager, CharacterApiError, DEFAULT_CHARACTER_API_URL, } from './CharacterVersionManager.js';
14
- export { parseCharacterReference, resolveCharacterReference, isCharacterVersionSelector, isCharacterUuid, } from './characterReference.js';
15
10
  export { BlendshapeQueue } from './BlendshapeQueue.js';
16
11
  export type { TurnStats, BlendshapeChunkMetadata } from './BlendshapeQueue.js';
17
12
  export { EventEmitter } from './EventEmitter.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGpE,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAGrD,YAAY,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,8BAA8B,EAC9B,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,cAAc,SAAS,CAAC;AAGxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAGrD,YAAY,EAAE,YAAY,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAG5E,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,eAAe,CAAC"}
@@ -1,5 +1,5 @@
1
1
  // Main client
2
- export { ActionResultAckError, ConvaiClient } from './ConvaiClient.js';
2
+ export { ConvaiClient } from './ConvaiClient.js';
3
3
  // Types (including IConvaiClient interface)
4
4
  export * from './types.js';
5
5
  // Helper functions
@@ -10,12 +10,6 @@ export { VideoManager } from './VideoManager.js';
10
10
  export { ScreenShareManager } from './ScreenShareManager.js';
11
11
  export { MessageHandler } from './MessageHandler.js';
12
12
  export { MemoryManager } from './MemoryManager.js';
13
- export { CharacterRoster } from './CharacterRoster.js';
14
- export { ConvaiRoomError } from './ConvaiRoomError.js';
15
- export { MULTI_CHARACTER_MAX_CHARACTERS, isRosterConfig, } from './rosterRequest.js';
16
- export { CharacterVersionManager, CharacterApiError, DEFAULT_CHARACTER_API_URL, } from './CharacterVersionManager.js';
17
- // Character reference helpers (version selectors)
18
- export { parseCharacterReference, resolveCharacterReference, isCharacterVersionSelector, isCharacterUuid, } from './characterReference.js';
19
13
  // Blendshape queue for lipsync
20
14
  export { BlendshapeQueue } from './BlendshapeQueue.js';
21
15
  // Event Emitter (for advanced usage)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEpE,4CAA4C;AAC5C,cAAc,SAAS,CAAC;AAExB,mBAAmB;AACnB,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAKrD,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,8BAA8B,EAC9B,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,kDAAkD;AAClD,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC","sourcesContent":["// Main client\nexport { ActionResultAckError, ConvaiClient } from './ConvaiClient';\n\n// Types (including IConvaiClient interface)\nexport * from './types';\n\n// Helper functions\nexport { getDisconnectReasonMessage } from './types';\n\n// Type alias for easier usage\nexport type { ConvaiClient as ConvaiClientType } from './ConvaiClient';\n\n// Managers (for advanced usage)\nexport { AudioManager } from './AudioManager';\nexport { VideoManager } from './VideoManager';\nexport { ScreenShareManager } from './ScreenShareManager';\nexport { MessageHandler } from './MessageHandler';\nexport { MemoryManager } from './MemoryManager';\nexport { CharacterRoster } from './CharacterRoster';\nexport { ConvaiRoomError } from './ConvaiRoomError';\nexport {\n MULTI_CHARACTER_MAX_CHARACTERS,\n isRosterConfig,\n} from './rosterRequest';\nexport {\n CharacterVersionManager,\n CharacterApiError,\n DEFAULT_CHARACTER_API_URL,\n} from './CharacterVersionManager';\n\n// Character reference helpers (version selectors)\nexport {\n parseCharacterReference,\n resolveCharacterReference,\n isCharacterVersionSelector,\n isCharacterUuid,\n} from './characterReference';\n\n// Blendshape queue for lipsync\nexport { BlendshapeQueue } from './BlendshapeQueue';\nexport type { TurnStats, BlendshapeChunkMetadata } from './BlendshapeQueue';\n\n// Event Emitter (for advanced usage)\nexport { EventEmitter } from './EventEmitter';\n\nexport {\n ModelOutputExtensionRegistry,\n isJsonObject,\n isJsonValue,\n parseModelOutputMessage,\n} from './modelOutput';\nexport type {\n ExtensionRenderResult,\n ModelOutputExtensionRenderer,\n} from './modelOutput';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,4CAA4C;AAC5C,cAAc,SAAS,CAAC;AAExB,mBAAmB;AACnB,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAKrD,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EACL,4BAA4B,EAC5B,YAAY,EACZ,WAAW,EACX,uBAAuB,GACxB,MAAM,eAAe,CAAC","sourcesContent":["// Main client\nexport { ConvaiClient } from './ConvaiClient';\n\n// Types (including IConvaiClient interface)\nexport * from './types';\n\n// Helper functions\nexport { getDisconnectReasonMessage } from './types';\n\n// Type alias for easier usage\nexport type { ConvaiClient as ConvaiClientType } from './ConvaiClient';\n\n// Managers (for advanced usage)\nexport { AudioManager } from './AudioManager';\nexport { VideoManager } from './VideoManager';\nexport { ScreenShareManager } from './ScreenShareManager';\nexport { MessageHandler } from './MessageHandler';\nexport { MemoryManager } from './MemoryManager';\n\n// Blendshape queue for lipsync\nexport { BlendshapeQueue } from './BlendshapeQueue';\nexport type { TurnStats, BlendshapeChunkMetadata } from './BlendshapeQueue';\n\n// Event Emitter (for advanced usage)\nexport { EventEmitter } from './EventEmitter';\n\nexport {\n ModelOutputExtensionRegistry,\n isJsonObject,\n isJsonValue,\n parseModelOutputMessage,\n} from './modelOutput';\nexport type {\n ExtensionRenderResult,\n ModelOutputExtensionRenderer,\n} from './modelOutput';\n"]}
@@ -1,8 +1,10 @@
1
1
  /** Maximum wire size for a logical turn identifier, in UTF-8 bytes. */
2
2
  export declare const LOGICAL_TURN_ID_MAX_UTF8_BYTES = 128;
3
- /** Maximum wire size for a model invocation identifier, in UTF-8 bytes. */
4
- export declare const OUTPUT_ID_MAX_UTF8_BYTES = 128;
3
+ /**
4
+ * Return whether a logical turn identifier is safe to place on the wire.
5
+ *
6
+ * Identifiers are preserved exactly. They must contain at least one
7
+ * non-whitespace character and fit within the bounded RTVI field.
8
+ */
5
9
  export declare function isValidLogicalTurnId(value: unknown): value is string;
6
- /** Return whether a Core model invocation id is safe to retain and expose. */
7
- export declare function isValidOutputId(value: unknown): value is string;
8
10
  //# sourceMappingURL=logicalTurn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logicalTurn.d.ts","sourceRoot":"","sources":["../../src/core/logicalTurn.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,2EAA2E;AAC3E,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAoC5C,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAKpE;AAED,8EAA8E;AAC9E,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE/D"}
1
+ {"version":3,"file":"logicalTurn.d.ts","sourceRoot":"","sources":["../../src/core/logicalTurn.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAQpE"}