@rqmii_immersive/agent-react-sdk 4.0.1 → 5.0.1

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 (224) hide show
  1. package/dist/RqmiiCloudAvatarPlayer-BI7Uz7DP.cjs +2918 -0
  2. package/dist/RqmiiCloudAvatarPlayer-BI7Uz7DP.cjs.map +1 -0
  3. package/dist/{RqmiiCloudAvatarPlayer-CESlcAGy.js → RqmiiCloudAvatarPlayer-D5aXKUuO.js} +6569 -6932
  4. package/dist/RqmiiCloudAvatarPlayer-D5aXKUuO.js.map +1 -0
  5. package/dist/agent-react-sdk.css +1 -1
  6. package/dist/capture/capture.d.ts +32 -0
  7. package/dist/capture/capture.d.ts.map +1 -0
  8. package/dist/components/RqmiiAgentRoom.d.ts +1 -1
  9. package/dist/components/RqmiiAgentRoom.d.ts.map +1 -1
  10. package/dist/core/constants.d.ts +3 -13
  11. package/dist/core/constants.d.ts.map +1 -1
  12. package/dist/core/managers/session.d.ts +10 -1
  13. package/dist/core/managers/session.d.ts.map +1 -1
  14. package/dist/core/state/reducer.d.ts.map +1 -1
  15. package/dist/core/state/types.d.ts +3 -6
  16. package/dist/core/state/types.d.ts.map +1 -1
  17. package/dist/hooks/use-rqmii-connection.d.ts +10 -1
  18. package/dist/hooks/use-rqmii-connection.d.ts.map +1 -1
  19. package/dist/hooks/use-rqmii-messages.d.ts +2 -0
  20. package/dist/hooks/use-rqmii-messages.d.ts.map +1 -1
  21. package/dist/hooks/use-rqmii-press-to-talk.d.ts.map +1 -1
  22. package/dist/hooks/use-rqmii-sdk.d.ts +0 -2
  23. package/dist/hooks/use-rqmii-sdk.d.ts.map +1 -1
  24. package/dist/hooks/use-rqmii-vad.d.ts.map +1 -1
  25. package/dist/index.cjs +49 -1
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.ts +3 -2
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +297 -218
  30. package/dist/index.js.map +1 -1
  31. package/dist/provider/RqmiiAgentProvider.d.ts +1 -1
  32. package/dist/provider/RqmiiAgentProvider.d.ts.map +1 -1
  33. package/dist/provider/socket-handlers.d.ts +5 -22
  34. package/dist/provider/socket-handlers.d.ts.map +1 -1
  35. package/dist/provider/use-manager-lifecycle.d.ts +11 -27
  36. package/dist/provider/use-manager-lifecycle.d.ts.map +1 -1
  37. package/dist/types/index.d.ts +84 -31
  38. package/dist/types/index.d.ts.map +1 -1
  39. package/dist/ui/Orb.d.ts.map +1 -1
  40. package/dist/ui/RqmiiAgentChat.d.ts +1 -1
  41. package/dist/ui/RqmiiAgentChat.d.ts.map +1 -1
  42. package/dist/ui/agent-data.d.ts +20 -1
  43. package/dist/ui/agent-data.d.ts.map +1 -1
  44. package/dist/ui/agent-data.test.d.ts +2 -0
  45. package/dist/ui/agent-data.test.d.ts.map +1 -0
  46. package/dist/ui/chat/ChatBox.d.ts +1 -1
  47. package/dist/ui/chat/ChatBox.d.ts.map +1 -1
  48. package/dist/ui/chat/chat-box-avatar.d.ts.map +1 -1
  49. package/dist/ui/chat/chat-box-content.d.ts +20 -10
  50. package/dist/ui/chat/chat-box-content.d.ts.map +1 -1
  51. package/dist/ui/chat/chat-box-content.test.d.ts +2 -0
  52. package/dist/ui/chat/chat-box-content.test.d.ts.map +1 -0
  53. package/dist/ui/chat/chat-box-shared.d.ts +20 -0
  54. package/dist/ui/chat/chat-box-shared.d.ts.map +1 -1
  55. package/dist/ui/chat/chat-box-shared.test.d.ts +2 -0
  56. package/dist/ui/chat/chat-box-shared.test.d.ts.map +1 -0
  57. package/dist/ui/chat/chat-box-text-and-voice.d.ts.map +1 -1
  58. package/dist/ui/chat/chat-box-text-and-voice.test.d.ts +2 -0
  59. package/dist/ui/chat/chat-box-text-and-voice.test.d.ts.map +1 -0
  60. package/dist/ui/chat/chat-box-text.d.ts.map +1 -1
  61. package/dist/ui/chat/chat-box-text.test.d.ts +2 -0
  62. package/dist/ui/chat/chat-box-text.test.d.ts.map +1 -0
  63. package/dist/ui/chat/chat-box-types.d.ts +35 -1
  64. package/dist/ui/chat/chat-box-types.d.ts.map +1 -1
  65. package/dist/ui/chat/chat-box-voice.d.ts.map +1 -1
  66. package/dist/ui/chat/components.d.ts +3 -2
  67. package/dist/ui/chat/components.d.ts.map +1 -1
  68. package/dist/ui/chat/consent-dialog.d.ts +10 -0
  69. package/dist/ui/chat/consent-dialog.d.ts.map +1 -0
  70. package/dist/ui/chat/feedback.d.ts +21 -0
  71. package/dist/ui/chat/feedback.d.ts.map +1 -0
  72. package/dist/ui/chat/panels.d.ts +50 -7
  73. package/dist/ui/chat/panels.d.ts.map +1 -1
  74. package/dist/ui/chat/primitives.d.ts +29 -2
  75. package/dist/ui/chat/primitives.d.ts.map +1 -1
  76. package/dist/ui/chat/utils.d.ts +10 -0
  77. package/dist/ui/chat/utils.d.ts.map +1 -1
  78. package/dist/ui/enable-audio.test.d.ts +2 -0
  79. package/dist/ui/enable-audio.test.d.ts.map +1 -0
  80. package/dist/ui/languages/index.d.ts +5 -0
  81. package/dist/ui/languages/index.d.ts.map +1 -0
  82. package/dist/ui/languages/list.d.ts +7 -0
  83. package/dist/ui/languages/list.d.ts.map +1 -0
  84. package/dist/ui/languages/text.d.ts +3 -0
  85. package/dist/ui/languages/text.d.ts.map +1 -0
  86. package/dist/ui/languages/translations/af.d.ts +4 -0
  87. package/dist/ui/languages/translations/af.d.ts.map +1 -0
  88. package/dist/ui/languages/translations/ar.d.ts +4 -0
  89. package/dist/ui/languages/translations/ar.d.ts.map +1 -0
  90. package/dist/ui/languages/translations/az.d.ts +4 -0
  91. package/dist/ui/languages/translations/az.d.ts.map +1 -0
  92. package/dist/ui/languages/translations/be.d.ts +4 -0
  93. package/dist/ui/languages/translations/be.d.ts.map +1 -0
  94. package/dist/ui/languages/translations/bg.d.ts +4 -0
  95. package/dist/ui/languages/translations/bg.d.ts.map +1 -0
  96. package/dist/ui/languages/translations/bn.d.ts +4 -0
  97. package/dist/ui/languages/translations/bn.d.ts.map +1 -0
  98. package/dist/ui/languages/translations/bs.d.ts +4 -0
  99. package/dist/ui/languages/translations/bs.d.ts.map +1 -0
  100. package/dist/ui/languages/translations/ca.d.ts +4 -0
  101. package/dist/ui/languages/translations/ca.d.ts.map +1 -0
  102. package/dist/ui/languages/translations/cs.d.ts +4 -0
  103. package/dist/ui/languages/translations/cs.d.ts.map +1 -0
  104. package/dist/ui/languages/translations/cy.d.ts +4 -0
  105. package/dist/ui/languages/translations/cy.d.ts.map +1 -0
  106. package/dist/ui/languages/translations/da.d.ts +4 -0
  107. package/dist/ui/languages/translations/da.d.ts.map +1 -0
  108. package/dist/ui/languages/translations/de.d.ts +4 -0
  109. package/dist/ui/languages/translations/de.d.ts.map +1 -0
  110. package/dist/ui/languages/translations/el.d.ts +4 -0
  111. package/dist/ui/languages/translations/el.d.ts.map +1 -0
  112. package/dist/ui/languages/translations/en.d.ts +4 -0
  113. package/dist/ui/languages/translations/en.d.ts.map +1 -0
  114. package/dist/ui/languages/translations/es.d.ts +4 -0
  115. package/dist/ui/languages/translations/es.d.ts.map +1 -0
  116. package/dist/ui/languages/translations/et.d.ts +4 -0
  117. package/dist/ui/languages/translations/et.d.ts.map +1 -0
  118. package/dist/ui/languages/translations/eu.d.ts +4 -0
  119. package/dist/ui/languages/translations/eu.d.ts.map +1 -0
  120. package/dist/ui/languages/translations/fa.d.ts +4 -0
  121. package/dist/ui/languages/translations/fa.d.ts.map +1 -0
  122. package/dist/ui/languages/translations/fi.d.ts +4 -0
  123. package/dist/ui/languages/translations/fi.d.ts.map +1 -0
  124. package/dist/ui/languages/translations/fr.d.ts +4 -0
  125. package/dist/ui/languages/translations/fr.d.ts.map +1 -0
  126. package/dist/ui/languages/translations/gl.d.ts +4 -0
  127. package/dist/ui/languages/translations/gl.d.ts.map +1 -0
  128. package/dist/ui/languages/translations/gu.d.ts +4 -0
  129. package/dist/ui/languages/translations/gu.d.ts.map +1 -0
  130. package/dist/ui/languages/translations/hi.d.ts +4 -0
  131. package/dist/ui/languages/translations/hi.d.ts.map +1 -0
  132. package/dist/ui/languages/translations/hr.d.ts +4 -0
  133. package/dist/ui/languages/translations/hr.d.ts.map +1 -0
  134. package/dist/ui/languages/translations/hu.d.ts +4 -0
  135. package/dist/ui/languages/translations/hu.d.ts.map +1 -0
  136. package/dist/ui/languages/translations/id.d.ts +4 -0
  137. package/dist/ui/languages/translations/id.d.ts.map +1 -0
  138. package/dist/ui/languages/translations/it.d.ts +4 -0
  139. package/dist/ui/languages/translations/it.d.ts.map +1 -0
  140. package/dist/ui/languages/translations/ja.d.ts +4 -0
  141. package/dist/ui/languages/translations/ja.d.ts.map +1 -0
  142. package/dist/ui/languages/translations/kk.d.ts +4 -0
  143. package/dist/ui/languages/translations/kk.d.ts.map +1 -0
  144. package/dist/ui/languages/translations/kn.d.ts +4 -0
  145. package/dist/ui/languages/translations/kn.d.ts.map +1 -0
  146. package/dist/ui/languages/translations/ko.d.ts +4 -0
  147. package/dist/ui/languages/translations/ko.d.ts.map +1 -0
  148. package/dist/ui/languages/translations/lt.d.ts +4 -0
  149. package/dist/ui/languages/translations/lt.d.ts.map +1 -0
  150. package/dist/ui/languages/translations/lv.d.ts +4 -0
  151. package/dist/ui/languages/translations/lv.d.ts.map +1 -0
  152. package/dist/ui/languages/translations/mk.d.ts +4 -0
  153. package/dist/ui/languages/translations/mk.d.ts.map +1 -0
  154. package/dist/ui/languages/translations/ml.d.ts +4 -0
  155. package/dist/ui/languages/translations/ml.d.ts.map +1 -0
  156. package/dist/ui/languages/translations/mr.d.ts +4 -0
  157. package/dist/ui/languages/translations/mr.d.ts.map +1 -0
  158. package/dist/ui/languages/translations/ms.d.ts +4 -0
  159. package/dist/ui/languages/translations/ms.d.ts.map +1 -0
  160. package/dist/ui/languages/translations/nl.d.ts +4 -0
  161. package/dist/ui/languages/translations/nl.d.ts.map +1 -0
  162. package/dist/ui/languages/translations/no.d.ts +4 -0
  163. package/dist/ui/languages/translations/no.d.ts.map +1 -0
  164. package/dist/ui/languages/translations/pa.d.ts +4 -0
  165. package/dist/ui/languages/translations/pa.d.ts.map +1 -0
  166. package/dist/ui/languages/translations/pl.d.ts +4 -0
  167. package/dist/ui/languages/translations/pl.d.ts.map +1 -0
  168. package/dist/ui/languages/translations/pt.d.ts +4 -0
  169. package/dist/ui/languages/translations/pt.d.ts.map +1 -0
  170. package/dist/ui/languages/translations/ro.d.ts +4 -0
  171. package/dist/ui/languages/translations/ro.d.ts.map +1 -0
  172. package/dist/ui/languages/translations/ru.d.ts +4 -0
  173. package/dist/ui/languages/translations/ru.d.ts.map +1 -0
  174. package/dist/ui/languages/translations/sk.d.ts +4 -0
  175. package/dist/ui/languages/translations/sk.d.ts.map +1 -0
  176. package/dist/ui/languages/translations/sl.d.ts +4 -0
  177. package/dist/ui/languages/translations/sl.d.ts.map +1 -0
  178. package/dist/ui/languages/translations/sq.d.ts +4 -0
  179. package/dist/ui/languages/translations/sq.d.ts.map +1 -0
  180. package/dist/ui/languages/translations/sr.d.ts +4 -0
  181. package/dist/ui/languages/translations/sr.d.ts.map +1 -0
  182. package/dist/ui/languages/translations/sv.d.ts +4 -0
  183. package/dist/ui/languages/translations/sv.d.ts.map +1 -0
  184. package/dist/ui/languages/translations/sw.d.ts +4 -0
  185. package/dist/ui/languages/translations/sw.d.ts.map +1 -0
  186. package/dist/ui/languages/translations/ta.d.ts +4 -0
  187. package/dist/ui/languages/translations/ta.d.ts.map +1 -0
  188. package/dist/ui/languages/translations/te.d.ts +4 -0
  189. package/dist/ui/languages/translations/te.d.ts.map +1 -0
  190. package/dist/ui/languages/translations/th.d.ts +4 -0
  191. package/dist/ui/languages/translations/th.d.ts.map +1 -0
  192. package/dist/ui/languages/translations/tl.d.ts +4 -0
  193. package/dist/ui/languages/translations/tl.d.ts.map +1 -0
  194. package/dist/ui/languages/translations/tr.d.ts +4 -0
  195. package/dist/ui/languages/translations/tr.d.ts.map +1 -0
  196. package/dist/ui/languages/translations/translations.test.d.ts +2 -0
  197. package/dist/ui/languages/translations/translations.test.d.ts.map +1 -0
  198. package/dist/ui/languages/translations/uk.d.ts +4 -0
  199. package/dist/ui/languages/translations/uk.d.ts.map +1 -0
  200. package/dist/ui/languages/translations/ur.d.ts +4 -0
  201. package/dist/ui/languages/translations/ur.d.ts.map +1 -0
  202. package/dist/ui/languages/translations/vi.d.ts +4 -0
  203. package/dist/ui/languages/translations/vi.d.ts.map +1 -0
  204. package/dist/ui/languages/translations/zh.d.ts +4 -0
  205. package/dist/ui/languages/translations/zh.d.ts.map +1 -0
  206. package/dist/ui/languages/types.d.ts +37 -0
  207. package/dist/ui/languages/types.d.ts.map +1 -0
  208. package/dist/ui/{languages.d.ts → languages/utils.d.ts} +2 -7
  209. package/dist/ui/languages/utils.d.ts.map +1 -0
  210. package/dist/ui.cjs +4502 -3
  211. package/dist/ui.cjs.map +1 -1
  212. package/dist/ui.d.ts +4 -3
  213. package/dist/ui.d.ts.map +1 -1
  214. package/dist/ui.js +52415 -1401
  215. package/dist/ui.js.map +1 -1
  216. package/package.json +11 -2
  217. package/dist/RqmiiCloudAvatarPlayer-CESlcAGy.js.map +0 -1
  218. package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs +0 -2939
  219. package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs.map +0 -1
  220. package/dist/core/managers/heartbeat.d.ts +0 -13
  221. package/dist/core/managers/heartbeat.d.ts.map +0 -1
  222. package/dist/core/managers/reconnect.d.ts +0 -29
  223. package/dist/core/managers/reconnect.d.ts.map +0 -1
  224. package/dist/ui/languages.d.ts.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/use-rqmii-agent.ts","../src/hooks/use-rqmii-session.ts","../src/hooks/use-rqmii-audio-element.ts","../src/hooks/use-rqmii-press-to-talk.ts","../src/hooks/use-rqmii-events.ts","../src/hooks/use-rqmii-sdk.ts","../src/components/RqmiiErrorBoundary.tsx"],"sourcesContent":["import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAgent() {\n return useRqmiiAgentContext();\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiSession() {\n const ctx = useRqmiiAgentContext();\n return {\n sessionState: ctx.sessionState,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n };\n}\n","import { useEffect } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAudioElement(audioRef: React.RefObject<HTMLAudioElement | null>) {\n const { attachAudioElement, resumeAudioPlayback } = useRqmiiAgentContext();\n\n useEffect(() => {\n if (!audioRef?.current) return undefined;\n\n attachAudioElement(audioRef.current);\n const unlock = () => {\n void resumeAudioPlayback();\n };\n\n const node = audioRef.current;\n node.addEventListener('click', unlock);\n node.addEventListener('touchstart', unlock);\n\n return () => {\n node.removeEventListener('click', unlock);\n node.removeEventListener('touchstart', unlock);\n attachAudioElement(null);\n };\n }, [attachAudioElement, audioRef, resumeAudioPlayback]);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { UseRqmiiPressToTalkOptions, UseRqmiiPressToTalkReturn } from '../types';\n\nconst DEFAULT_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 16000,\n};\n\nconst MEDIA_RECORDER_MIME_TYPES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n];\n\nconst getRecorderMimeType = (): string => {\n if (typeof window === 'undefined' || !window.MediaRecorder?.isTypeSupported) return '';\n return MEDIA_RECORDER_MIME_TYPES.find((type) => window.MediaRecorder.isTypeSupported(type)) || '';\n};\n\nexport function useRqmiiPressToTalk(options: UseRqmiiPressToTalkOptions = {}): UseRqmiiPressToTalkReturn {\n const {\n onAudioChunk,\n onAudioEnd,\n onError,\n holdDelayMs = 220,\n timesliceMs = 100,\n interruptOnHoldStart = true,\n audioConstraints = DEFAULT_AUDIO_CONSTRAINTS,\n } = options;\n\n const { sendAudioChunk, endAudioStream, interrupt } = useRqmiiAgentContext();\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const holdTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const shouldSendAudioEndRef = useRef(true);\n const stopRequestedRef = useRef(false);\n\n const [isPressing, setIsPressing] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [micError, setMicError] = useState<string | null>(null);\n\n const handleChunk = useCallback(\n async (blob: Blob) => {\n if (!blob || blob.size <= 0) return;\n const chunkBuffer = await blob.arrayBuffer();\n if (onAudioChunk) {\n onAudioChunk(chunkBuffer);\n return;\n }\n sendAudioChunk(chunkBuffer);\n },\n [onAudioChunk, sendAudioChunk],\n );\n\n const cleanupStream = useCallback(() => {\n if (!streamRef.current) return;\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }, []);\n\n const stopRecording = useCallback(\n ({ discard = false }: { discard?: boolean } = {}): boolean => {\n const mediaRecorder = mediaRecorderRef.current;\n if (!mediaRecorder) {\n stopRequestedRef.current = true;\n return false;\n }\n\n shouldSendAudioEndRef.current = !discard;\n mediaRecorderRef.current = null;\n\n if (mediaRecorder.state === 'inactive') {\n if (!discard) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n cleanupStream();\n setIsRecording(false);\n return true;\n }\n\n try {\n mediaRecorder.requestData();\n } catch {\n // some browsers throw if requestData is called after stopping\n }\n\n mediaRecorder.onstop = () => {\n const shouldSendEnd = shouldSendAudioEndRef.current;\n if (shouldSendEnd) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n cleanupStream();\n setIsRecording(false);\n };\n\n try {\n mediaRecorder.stop();\n } catch (error) {\n cleanupStream();\n setIsRecording(false);\n onError?.(error);\n }\n\n return true;\n },\n [cleanupStream, endAudioStream, onAudioEnd, onError],\n );\n\n const startRecording = useCallback(async (): Promise<boolean> => {\n if (mediaRecorderRef.current) return true;\n stopRequestedRef.current = false;\n if (\n typeof navigator === 'undefined' ||\n !navigator.mediaDevices?.getUserMedia ||\n typeof window === 'undefined' ||\n typeof window.MediaRecorder === 'undefined'\n ) {\n const error = new Error('MediaRecorder or microphone APIs are unavailable in this browser');\n setMicError(error.message);\n onError?.(error);\n return false;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: audioConstraints });\n streamRef.current = stream;\n\n const mimeType = getRecorderMimeType();\n const recorderOptions = mimeType ? { mimeType } : undefined;\n const mediaRecorder = new window.MediaRecorder(stream, recorderOptions);\n\n mediaRecorder.ondataavailable = (event) => {\n void handleChunk(event.data);\n };\n\n mediaRecorder.onerror = (event) => {\n const error = (event as ErrorEvent)?.error || new Error('Microphone recording failed');\n setMicError((error as Error)?.message || 'recording_failed');\n onError?.(error);\n };\n\n mediaRecorderRef.current = mediaRecorder;\n setIsRecording(true);\n setMicError(null);\n mediaRecorder.start(timesliceMs);\n\n if (stopRequestedRef.current) {\n stopRequestedRef.current = false;\n stopRecording();\n }\n\n return true;\n } catch (error) {\n cleanupStream();\n setIsRecording(false);\n setMicError('permission_denied');\n onError?.(error);\n return false;\n }\n }, [audioConstraints, cleanupStream, handleChunk, onError, timesliceMs, stopRecording]);\n\n const startPress = useCallback(() => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n\n setIsPressing(true);\n\n holdTimerRef.current = setTimeout(() => {\n if (interruptOnHoldStart) {\n interrupt();\n }\n void startRecording();\n }, holdDelayMs);\n }, [holdDelayMs, interrupt, interruptOnHoldStart, startRecording]);\n\n const stopPress = useCallback(() => {\n setIsPressing(false);\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n stopRecording();\n }, [stopRecording]);\n\n useEffect(() => {\n return () => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n const mr = mediaRecorderRef.current;\n if (mr) {\n mediaRecorderRef.current = null;\n if (mr.state !== 'inactive') {\n try { mr.stop(); } catch { /* ignore */ }\n }\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n };\n }, []);\n\n const eventHandlers = useMemo(\n () => ({\n onPointerDown: (e: React.PointerEvent) => {\n e.preventDefault();\n startPress();\n },\n onPointerUp: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerCancel: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerLeave: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n }),\n [startPress, stopPress],\n );\n\n return {\n isPressing,\n isRecording,\n micError,\n startRecording,\n stopRecording,\n startPress,\n stopPress,\n eventHandlers,\n };\n}\n","import { useEffect } from 'react';\nimport type { EventType, EventHandlerMap } from '../types';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiEvents<T extends EventType>(event: T, handler: EventHandlerMap[T], deps: unknown[] = []) {\n const { events } = useRqmiiAgentContext();\n\n useEffect(() => {\n return events.on(event, handler);\n }, [event, handler, events, ...deps]);\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { EventHandlerMap, RqmiiMessage, RqmiiState, TranscriptPayload, PartialTranscriptPayload, SessionData } from '../types';\n\ntype Listener<T> = (handler: T) => () => void;\n\nexport interface RqmiiEventListeners {\n onSessionReady: Listener<EventHandlerMap['session:ready']>;\n onSessionJoined: Listener<EventHandlerMap['session:joined']>;\n onSessionTerminated: Listener<EventHandlerMap['session:terminated']>;\n onSessionExpired: Listener<EventHandlerMap['session:expired']>;\n onMessageReceived: Listener<EventHandlerMap['message:received']>;\n onMessageSent: Listener<EventHandlerMap['message:sent']>;\n onAudioPlaying: Listener<EventHandlerMap['audio:playing']>;\n onAudioStopped: Listener<EventHandlerMap['audio:stopped']>;\n onAvatarSpeaking: Listener<EventHandlerMap['avatar:speaking']>;\n onAvatarSpeakingDone: Listener<EventHandlerMap['avatar:speaking_done']>;\n onStateChanged: Listener<EventHandlerMap['state:changed']>;\n onConnected: Listener<EventHandlerMap['connection:connected']>;\n onDisconnected: Listener<EventHandlerMap['connection:disconnected']>;\n onReconnecting: Listener<EventHandlerMap['connection:reconnecting']>;\n onConnectionFailed: Listener<EventHandlerMap['connection:failed']>;\n onError: Listener<EventHandlerMap['error']>;\n onCreditsExhausted: Listener<EventHandlerMap['credits:exhausted']>;\n onTranscript: Listener<EventHandlerMap['transcript']>;\n onPartialTranscript: Listener<EventHandlerMap['partial_transcript']>;\n onInterrupted: Listener<EventHandlerMap['interrupted']>;\n}\n\nexport interface RqmiiSDKHandle {\n state: {\n messages: RqmiiMessage[];\n connectionState: RqmiiState['connectionState'];\n isConnected: boolean;\n isSessionReady: boolean;\n isAudioPlaying: boolean;\n isAgentThinking: boolean;\n isAgentSpeaking: boolean;\n isToolExecuting: boolean;\n isSessionTerminated: boolean;\n isSessionTerminating: boolean;\n creditExhausted: boolean;\n creditError: string | null;\n error: string | null;\n transcript: TranscriptPayload | null;\n partialTranscript: PartialTranscriptPayload | null;\n session: RqmiiState['session'];\n sessionState: RqmiiState['sessionState'];\n reconnectAttempt: number;\n };\n actions: {\n sendTextMessage: (text: string) => boolean;\n sendAudioChunk: (audio: unknown) => boolean;\n endAudioStream: () => boolean;\n interrupt: () => boolean;\n clearSessionHistory: () => boolean;\n clearMessages: () => void;\n changeSessionLanguage: (language: string) => boolean;\n signalClientReady: (payload?: Record<string, unknown>) => boolean;\n initializeSession: (opts?: { apiKey?: string; publicChatId?: string; agentId?: string; language?: string }) => Promise<SessionData>;\n joinDesktopSession: (opts: { uniqueId: string; language?: string }) => Promise<SessionData>;\n disconnect: () => void;\n terminateSession: () => Promise<{ success: boolean }>;\n resumeAudioPlayback: () => void;\n pauseAudioPlayback: () => void;\n attachAudioElement: (el: HTMLAudioElement | null) => void;\n };\n events: RqmiiEventListeners;\n raw: {\n socket: ReturnType<typeof import('socket.io-client').io> | null;\n audioElement: HTMLAudioElement | null;\n };\n}\n\nexport function useRqmiiSDK(): RqmiiSDKHandle {\n const ctx = useRqmiiAgentContext();\n const ev = ctx.events;\n\n return {\n state: {\n messages: ctx.messages,\n connectionState: ctx.connectionState,\n isConnected: ctx.isConnected,\n isSessionReady: ctx.isSessionReady,\n isAudioPlaying: ctx.isAudioPlaying,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n creditExhausted: ctx.creditExhausted,\n creditError: ctx.creditError,\n error: ctx.error,\n transcript: ctx.transcript,\n partialTranscript: ctx.partialTranscript,\n session: ctx.session,\n sessionState: ctx.sessionState,\n reconnectAttempt: ctx.reconnectAttempt,\n },\n actions: {\n sendTextMessage: ctx.sendTextMessage,\n sendAudioChunk: ctx.sendAudioChunk,\n endAudioStream: ctx.endAudioStream,\n interrupt: ctx.interrupt,\n clearSessionHistory: ctx.clearSessionHistory,\n clearMessages: ctx.clearMessages,\n changeSessionLanguage: ctx.changeSessionLanguage,\n signalClientReady: ctx.signalClientReady,\n initializeSession: ctx.initializeSession,\n joinDesktopSession: ctx.joinDesktopSession,\n disconnect: ctx.disconnect,\n terminateSession: ctx.terminateSession,\n resumeAudioPlayback: ctx.resumeAudioPlayback,\n pauseAudioPlayback: ctx.pauseAudioPlayback,\n attachAudioElement: ctx.attachAudioElement,\n },\n events: {\n onSessionReady: (h) => ev.on('session:ready', h),\n onSessionJoined: (h) => ev.on('session:joined', h),\n onSessionTerminated: (h) => ev.on('session:terminated', h),\n onSessionExpired: (h) => ev.on('session:expired', h),\n onMessageReceived: (h) => ev.on('message:received', h),\n onMessageSent: (h) => ev.on('message:sent', h),\n onAudioPlaying: (h) => ev.on('audio:playing', h),\n onAudioStopped: (h) => ev.on('audio:stopped', h),\n onAvatarSpeaking: (h) => ev.on('avatar:speaking', h),\n onAvatarSpeakingDone: (h) => ev.on('avatar:speaking_done', h),\n onStateChanged: (h) => ev.on('state:changed', h),\n onConnected: (h) => ev.on('connection:connected', h),\n onDisconnected: (h) => ev.on('connection:disconnected', h),\n onReconnecting: (h) => ev.on('connection:reconnecting', h),\n onConnectionFailed: (h) => ev.on('connection:failed', h),\n onError: (h) => ev.on('error', h),\n onCreditsExhausted: (h) => ev.on('credits:exhausted', h),\n onTranscript: (h) => ev.on('transcript', h),\n onPartialTranscript: (h) => ev.on('partial_transcript', h),\n onInterrupted: (h) => ev.on('interrupted', h),\n },\n raw: {\n socket: ctx.socket,\n audioElement: ctx.audioElement,\n },\n };\n}\n","import React, { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface RqmiiErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface RqmiiErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class RqmiiErrorBoundary extends Component<RqmiiErrorBoundaryProps, RqmiiErrorBoundaryState> {\n constructor(props: RqmiiErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): RqmiiErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback } = this.props;\n if (fallback) {\n if (typeof fallback === 'function') {\n return this.state.error ? fallback(this.state.error, this.reset) : null;\n }\n return fallback;\n }\n return (\n <div style={{ padding: '24px', textAlign: 'center', color: '#ef4444' }}>\n <h3>Something went wrong</h3>\n <p>{this.state.error?.message || 'An unexpected error occurred'}</p>\n <button onClick={this.reset} style={{ marginTop: '12px', padding: '8px 16px', cursor: 'pointer' }}>\n Try again\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n"],"names":["useRqmiiAgent","useRqmiiAgentContext","useRqmiiSession","ctx","useRqmiiAudioElement","audioRef","attachAudioElement","resumeAudioPlayback","useEffect","unlock","node","DEFAULT_AUDIO_CONSTRAINTS","MEDIA_RECORDER_MIME_TYPES","getRecorderMimeType","type","useRqmiiPressToTalk","options","onAudioChunk","onAudioEnd","onError","holdDelayMs","timesliceMs","interruptOnHoldStart","audioConstraints","sendAudioChunk","endAudioStream","interrupt","mediaRecorderRef","useRef","streamRef","holdTimerRef","shouldSendAudioEndRef","stopRequestedRef","isPressing","setIsPressing","useState","isRecording","setIsRecording","micError","setMicError","handleChunk","useCallback","blob","chunkBuffer","cleanupStream","track","stopRecording","discard","mediaRecorder","error","startRecording","stream","mimeType","recorderOptions","event","startPress","stopPress","mr","eventHandlers","useMemo","e","useRqmiiEvents","handler","deps","events","useRqmiiSDK","ev","h","RqmiiErrorBoundary","Component","props","info","fallback","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/use-rqmii-agent.ts","../src/hooks/use-rqmii-session.ts","../src/hooks/use-rqmii-audio-element.ts","../src/capture/capture.ts","../src/hooks/use-rqmii-press-to-talk.ts","../src/hooks/use-rqmii-events.ts","../src/hooks/use-rqmii-sdk.ts","../src/components/RqmiiErrorBoundary.tsx"],"sourcesContent":["import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAgent() {\n return useRqmiiAgentContext();\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiSession() {\n const ctx = useRqmiiAgentContext();\n return {\n sessionState: ctx.sessionState,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n };\n}\n","import { useEffect } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAudioElement(audioRef: React.RefObject<HTMLAudioElement | null>) {\n const { attachAudioElement, resumeAudioPlayback } = useRqmiiAgentContext();\n\n useEffect(() => {\n if (!audioRef?.current) return undefined;\n\n attachAudioElement(audioRef.current);\n const unlock = () => {\n void resumeAudioPlayback();\n };\n\n const node = audioRef.current;\n node.addEventListener('click', unlock);\n node.addEventListener('touchstart', unlock);\n\n return () => {\n node.removeEventListener('click', unlock);\n node.removeEventListener('touchstart', unlock);\n attachAudioElement(null);\n };\n }, [attachAudioElement, audioRef, resumeAudioPlayback]);\n}\n","export type AudioCaptureState = 'idle' | 'requesting-mic' | 'capturing' | 'unsupported' | 'suspended' | 'error';\n\nexport interface CaptureOptions {\n inputSampleRate?: number;\n frameSizeMs?: number;\n}\n\ntype CaptureHandler = (...args: unknown[]) => void;\n\nclass CaptureEventEmitter {\n private listeners = new Map<string, Set<CaptureHandler>>();\n\n on(event: string, handler: CaptureHandler): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n return () => this.off(event, handler);\n }\n\n off(event: string, handler: CaptureHandler): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n emit(event: string, payload?: unknown): void {\n const handlers = this.listeners.get(event);\n if (!handlers) return;\n for (const handler of handlers) {\n try { handler(payload); } catch { /* silence */ }\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n\nconst DEFAULT_OPTIONS: Required<CaptureOptions> = {\n inputSampleRate: 48000,\n frameSizeMs: 20,\n};\n\nconst PCM_PROCESSOR_CODE = `\nclass PcmCaptureProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n this._downsampleFactor = Math.round((options.processorOptions?.inputSampleRate || 48000) / 16000);\n this._buffer = [];\n this._frameSize = 128;\n }\n\n process(inputs) {\n const input = inputs[0];\n if (!input || !input[0]) return true;\n\n const channelData = input[0];\n\n for (let i = 0; i < channelData.length; i++) {\n this._buffer.push(channelData[i]);\n }\n\n while (this._buffer.length >= this._frameSize * this._downsampleFactor) {\n let outIdx = 0;\n const downsampled = new Float32Array(this._frameSize);\n\n for (let i = 0; i < this._frameSize; i++) {\n const base = i * this._downsampleFactor;\n let sum = 0;\n for (let j = 0; j < this._downsampleFactor; j++) {\n sum += this._buffer[base + j];\n }\n downsampled[outIdx++] = sum / this._downsampleFactor;\n }\n\n this._buffer.splice(0, this._frameSize * this._downsampleFactor);\n\n const pcm = new Int16Array(this._frameSize);\n for (let i = 0; i < this._frameSize; i++) {\n const s = Math.max(-1, Math.min(1, downsampled[i]));\n pcm[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n this.port.postMessage(pcm.buffer, [pcm.buffer]);\n }\n\n return true;\n }\n}\n\nregisterProcessor('pcm-capture-processor', PcmCaptureProcessor);\n`;\n\nexport class AudioCapture {\n private _state: AudioCaptureState = 'idle';\n private _ctx: AudioContext | null = null;\n private _node: AudioWorkletNode | null = null;\n private _stream: MediaStream | null = null;\n private _events = new CaptureEventEmitter();\n private _options: Required<CaptureOptions>;\n\n readonly supported: boolean;\n\n constructor(options?: CaptureOptions) {\n this._options = { ...DEFAULT_OPTIONS, ...options };\n this.supported = typeof AudioWorkletNode !== 'undefined';\n if (!this.supported) {\n this._state = 'unsupported';\n }\n }\n\n get state(): AudioCaptureState {\n return this._state;\n }\n\n get events(): CaptureEventEmitter {\n return this._events;\n }\n\n async start(): Promise<boolean> {\n if (!this.supported) {\n this._state = 'unsupported';\n return false;\n }\n\n if (this._state === 'capturing') return true;\n\n this._state = 'requesting-mic';\n\n try {\n this._stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n this._state = 'error';\n this._events.emit('error', err);\n return false;\n }\n\n try {\n if (this._ctx?.state === 'suspended') {\n await this._ctx.resume();\n }\n\n this._ctx = new AudioContext({ sampleRate: this._options.inputSampleRate });\n\n const blob = new Blob([PCM_PROCESSOR_CODE], { type: 'application/javascript' });\n const processorUrl = URL.createObjectURL(blob);\n await this._ctx.audioWorklet.addModule(processorUrl);\n URL.revokeObjectURL(processorUrl);\n\n const source = this._ctx.createMediaStreamSource(this._stream);\n\n this._node = new AudioWorkletNode(this._ctx, 'pcm-capture-processor', {\n processorOptions: {\n inputSampleRate: this._options.inputSampleRate,\n frameSize: (this._options.inputSampleRate * this._options.frameSizeMs) / 1000,\n },\n });\n\n this._node.port.onmessage = (ev: MessageEvent<ArrayBuffer>) => {\n this._events.emit('audio_chunk', new Uint8Array(ev.data));\n };\n\n source.connect(this._node);\n\n this._state = 'capturing';\n this._events.emit('state_changed', this._state);\n\n if (this._ctx.state === 'suspended') {\n await this._ctx.resume();\n }\n\n return true;\n } catch (err) {\n this._state = 'error';\n this._events.emit('error', err);\n\n if (this._stream) {\n this._stream.getTracks().forEach((t) => t.stop());\n this._stream = null;\n }\n\n return false;\n }\n }\n\n stop(): void {\n if (this._node) {\n this._node.disconnect();\n this._node = null;\n }\n\n if (this._stream) {\n this._stream.getTracks().forEach((t) => t.stop());\n this._stream = null;\n }\n\n if (this._ctx && this._ctx.state !== 'closed') {\n this._ctx.close();\n this._ctx = null;\n }\n\n this._state = 'idle';\n this._events.emit('state_changed', this._state);\n }\n\n async resume(): Promise<void> {\n if (this._ctx?.state === 'suspended') {\n await this._ctx.resume();\n this._state = 'capturing';\n this._events.emit('state_changed', this._state);\n }\n }\n\n async pause(): Promise<void> {\n if (this._ctx?.state === 'running') {\n await this._ctx.suspend();\n this._state = 'suspended';\n this._events.emit('state_changed', this._state);\n }\n }\n\n destroy(): void {\n this.events.removeAllListeners();\n this.stop();\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { AudioCapture } from '../capture/capture';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { UseRqmiiPressToTalkOptions, UseRqmiiPressToTalkReturn } from '../types';\n\nconst DEFAULT_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 16000,\n};\n\nexport function useRqmiiPressToTalk(options: UseRqmiiPressToTalkOptions = {}): UseRqmiiPressToTalkReturn {\n const {\n onAudioChunk,\n onAudioEnd,\n onError,\n holdDelayMs = 220,\n interruptOnHoldStart = true,\n } = options;\n\n const { sendAudioChunk, endAudioStream, interrupt } = useRqmiiAgentContext();\n\n const captureRef = useRef<AudioCapture | null>(null);\n const holdTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [isPressing, setIsPressing] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [micError, setMicError] = useState<string | null>(null);\n\n const startPcmCapture = useCallback(async (): Promise<boolean> => {\n if (captureRef.current) return true;\n\n const capture = new AudioCapture();\n captureRef.current = capture;\n\n if (!capture.supported) {\n const err = new Error('AudioWorklet not supported in this browser');\n setMicError(err.message);\n onError?.(err);\n return false;\n }\n\n capture.events.on('audio_chunk', (chunk: unknown) => {\n if (onAudioChunk) onAudioChunk(chunk as Uint8Array);\n else sendAudioChunk(chunk);\n });\n\n capture.events.on('error', (err: unknown) => {\n onError?.(err);\n });\n\n const ok = await capture.start();\n if (!ok) {\n setMicError('Failed to start capture');\n captureRef.current = null;\n return false;\n }\n\n setIsRecording(true);\n setMicError(null);\n return true;\n }, [onAudioChunk, onError, sendAudioChunk]);\n\n const stopPcmCapture = useCallback((): boolean => {\n const capture = captureRef.current;\n if (!capture) return false;\n\n captureRef.current = null;\n capture.stop();\n capture.destroy();\n setIsRecording(false);\n return true;\n }, []);\n\n const cleanup = useCallback(() => {\n const capture = captureRef.current;\n if (!capture) return;\n captureRef.current = null;\n capture.stop();\n capture.destroy();\n setIsRecording(false);\n }, []);\n\n const startRecording = useCallback(async (): Promise<boolean> => {\n return startPcmCapture();\n }, [startPcmCapture]);\n\n const stopRecording = useCallback(\n ({ discard = false }: { discard?: boolean } = {}): boolean => {\n const ok = stopPcmCapture();\n if (!discard && ok) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n return ok;\n },\n [endAudioStream, onAudioEnd, stopPcmCapture],\n );\n\n const startPress = useCallback(() => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n\n setIsPressing(true);\n\n holdTimerRef.current = setTimeout(() => {\n if (interruptOnHoldStart) {\n interrupt();\n }\n void startPcmCapture();\n }, holdDelayMs);\n }, [holdDelayMs, interrupt, interruptOnHoldStart, startPcmCapture]);\n\n const stopPress = useCallback(() => {\n setIsPressing(false);\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n\n const ok = stopPcmCapture();\n if (ok) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n }, [endAudioStream, onAudioEnd, stopPcmCapture]);\n\n useEffect(() => {\n return () => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n cleanup();\n };\n }, [cleanup]);\n\n const eventHandlers = useMemo(\n () => ({\n onPointerDown: (e: React.PointerEvent) => {\n e.preventDefault();\n startPress();\n },\n onPointerUp: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerCancel: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerLeave: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n }),\n [startPress, stopPress],\n );\n\n return {\n isPressing,\n isRecording,\n micError,\n startRecording,\n stopRecording,\n startPress,\n stopPress,\n eventHandlers,\n };\n}\n","import { useEffect } from 'react';\nimport type { EventType, EventHandlerMap } from '../types';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiEvents<T extends EventType>(event: T, handler: EventHandlerMap[T], deps: unknown[] = []) {\n const { events } = useRqmiiAgentContext();\n\n useEffect(() => {\n return events.on(event, handler);\n }, [event, handler, events, ...deps]);\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { EventHandlerMap, RqmiiMessage, RqmiiState, TranscriptPayload, PartialTranscriptPayload, SessionData } from '../types';\n\ntype Listener<T> = (handler: T) => () => void;\n\nexport interface RqmiiEventListeners {\n onSessionReady: Listener<EventHandlerMap['session:ready']>;\n onSessionJoined: Listener<EventHandlerMap['session:joined']>;\n onSessionTerminated: Listener<EventHandlerMap['session:terminated']>;\n onSessionExpired: Listener<EventHandlerMap['session:expired']>;\n onMessageReceived: Listener<EventHandlerMap['message:received']>;\n onMessageSent: Listener<EventHandlerMap['message:sent']>;\n onAudioPlaying: Listener<EventHandlerMap['audio:playing']>;\n onAudioStopped: Listener<EventHandlerMap['audio:stopped']>;\n onAvatarSpeaking: Listener<EventHandlerMap['avatar:speaking']>;\n onAvatarSpeakingDone: Listener<EventHandlerMap['avatar:speaking_done']>;\n onStateChanged: Listener<EventHandlerMap['state:changed']>;\n onConnected: Listener<EventHandlerMap['connection:connected']>;\n onDisconnected: Listener<EventHandlerMap['connection:disconnected']>;\n onConnectionFailed: Listener<EventHandlerMap['connection:failed']>;\n onError: Listener<EventHandlerMap['error']>;\n onCreditsExhausted: Listener<EventHandlerMap['credits:exhausted']>;\n onTranscript: Listener<EventHandlerMap['transcript']>;\n onPartialTranscript: Listener<EventHandlerMap['partial_transcript']>;\n onInterrupted: Listener<EventHandlerMap['interrupted']>;\n}\n\nexport interface RqmiiSDKHandle {\n state: {\n messages: RqmiiMessage[];\n connectionState: RqmiiState['connectionState'];\n isConnected: boolean;\n isSessionReady: boolean;\n isAudioPlaying: boolean;\n isAgentThinking: boolean;\n isAgentSpeaking: boolean;\n isToolExecuting: boolean;\n isSessionTerminated: boolean;\n isSessionTerminating: boolean;\n creditExhausted: boolean;\n creditError: string | null;\n error: string | null;\n transcript: TranscriptPayload | null;\n partialTranscript: PartialTranscriptPayload | null;\n session: RqmiiState['session'];\n sessionState: RqmiiState['sessionState'];\n };\n actions: {\n sendTextMessage: (text: string) => boolean;\n sendAudioChunk: (audio: unknown) => boolean;\n endAudioStream: () => boolean;\n interrupt: () => boolean;\n clearSessionHistory: () => boolean;\n clearMessages: () => void;\n changeSessionLanguage: (language: string) => boolean;\n signalClientReady: (payload?: Record<string, unknown>) => boolean;\n initializeSession: (opts?: { apiKey?: string; publicChatId?: string; agentId?: string; language?: string }) => Promise<SessionData>;\n joinDesktopSession: (opts: { uniqueId: string; language?: string }) => Promise<SessionData>;\n disconnect: () => void;\n terminateSession: () => Promise<{ success: boolean }>;\n resumeAudioPlayback: () => void;\n pauseAudioPlayback: () => void;\n attachAudioElement: (el: HTMLAudioElement | null) => void;\n };\n events: RqmiiEventListeners;\n raw: {\n socket: ReturnType<typeof import('socket.io-client').io> | null;\n audioElement: HTMLAudioElement | null;\n };\n}\n\nexport function useRqmiiSDK(): RqmiiSDKHandle {\n const ctx = useRqmiiAgentContext();\n const ev = ctx.events;\n\n return {\n state: {\n messages: ctx.messages,\n connectionState: ctx.connectionState,\n isConnected: ctx.isConnected,\n isSessionReady: ctx.isSessionReady,\n isAudioPlaying: ctx.isAudioPlaying,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n creditExhausted: ctx.creditExhausted,\n creditError: ctx.creditError,\n error: ctx.error,\n transcript: ctx.transcript,\n partialTranscript: ctx.partialTranscript,\n session: ctx.session,\n sessionState: ctx.sessionState,\n },\n actions: {\n sendTextMessage: ctx.sendTextMessage,\n sendAudioChunk: ctx.sendAudioChunk,\n endAudioStream: ctx.endAudioStream,\n interrupt: ctx.interrupt,\n clearSessionHistory: ctx.clearSessionHistory,\n clearMessages: ctx.clearMessages,\n changeSessionLanguage: ctx.changeSessionLanguage,\n signalClientReady: ctx.signalClientReady,\n initializeSession: ctx.initializeSession,\n joinDesktopSession: ctx.joinDesktopSession,\n disconnect: ctx.disconnect,\n terminateSession: ctx.terminateSession,\n resumeAudioPlayback: ctx.resumeAudioPlayback,\n pauseAudioPlayback: ctx.pauseAudioPlayback,\n attachAudioElement: ctx.attachAudioElement,\n },\n events: {\n onSessionReady: (h) => ev.on('session:ready', h),\n onSessionJoined: (h) => ev.on('session:joined', h),\n onSessionTerminated: (h) => ev.on('session:terminated', h),\n onSessionExpired: (h) => ev.on('session:expired', h),\n onMessageReceived: (h) => ev.on('message:received', h),\n onMessageSent: (h) => ev.on('message:sent', h),\n onAudioPlaying: (h) => ev.on('audio:playing', h),\n onAudioStopped: (h) => ev.on('audio:stopped', h),\n onAvatarSpeaking: (h) => ev.on('avatar:speaking', h),\n onAvatarSpeakingDone: (h) => ev.on('avatar:speaking_done', h),\n onStateChanged: (h) => ev.on('state:changed', h),\n onConnected: (h) => ev.on('connection:connected', h),\n onDisconnected: (h) => ev.on('connection:disconnected', h),\n onConnectionFailed: (h) => ev.on('connection:failed', h),\n onError: (h) => ev.on('error', h),\n onCreditsExhausted: (h) => ev.on('credits:exhausted', h),\n onTranscript: (h) => ev.on('transcript', h),\n onPartialTranscript: (h) => ev.on('partial_transcript', h),\n onInterrupted: (h) => ev.on('interrupted', h),\n },\n raw: {\n socket: ctx.socket,\n audioElement: ctx.audioElement,\n },\n };\n}\n","import React, { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface RqmiiErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface RqmiiErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class RqmiiErrorBoundary extends Component<RqmiiErrorBoundaryProps, RqmiiErrorBoundaryState> {\n constructor(props: RqmiiErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): RqmiiErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback } = this.props;\n if (fallback) {\n if (typeof fallback === 'function') {\n return this.state.error ? fallback(this.state.error, this.reset) : null;\n }\n return fallback;\n }\n return (\n <div style={{ padding: '24px', textAlign: 'center', color: '#ef4444' }}>\n <h3>Something went wrong</h3>\n <p>{this.state.error?.message || 'An unexpected error occurred'}</p>\n <button onClick={this.reset} style={{ marginTop: '12px', padding: '8px 16px', cursor: 'pointer' }}>\n Try again\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n"],"names":["useRqmiiAgent","useRqmiiAgentContext","useRqmiiSession","ctx","useRqmiiAudioElement","audioRef","attachAudioElement","resumeAudioPlayback","useEffect","unlock","node","CaptureEventEmitter","event","handler","payload","handlers","DEFAULT_OPTIONS","PCM_PROCESSOR_CODE","AudioCapture","options","err","blob","processorUrl","source","ev","t","useRqmiiPressToTalk","onAudioChunk","onAudioEnd","onError","holdDelayMs","interruptOnHoldStart","sendAudioChunk","endAudioStream","interrupt","captureRef","useRef","holdTimerRef","isPressing","setIsPressing","useState","isRecording","setIsRecording","micError","setMicError","startPcmCapture","useCallback","capture","chunk","stopPcmCapture","cleanup","startRecording","stopRecording","discard","ok","startPress","stopPress","eventHandlers","useMemo","e","useRqmiiEvents","deps","events","useRqmiiSDK","h","RqmiiErrorBoundary","Component","props","error","info","fallback","jsxs","jsx"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
1
  import type { RqmiiAgentProviderProps, RqmiiAgentContextValue } from '../types';
2
- export declare function RqmiiAgentProvider({ children, wsUrl, restUrl, reconnectOptions, enableAudio, pcmOptions, debug, heartbeatIntervalSeconds, withCredentials, onSessionExpired, onSessionTerminated, onError, onDisconnect, onReconnectSuccess, onReconnectFailed, }: RqmiiAgentProviderProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function RqmiiAgentProvider({ children, wsUrl, restUrl, enableAudio, pcmOptions, debug, heartbeatIntervalSeconds, withCredentials, onSessionExpired, onSessionTerminated, onError, onDisconnect, }: RqmiiAgentProviderProps): import("react/jsx-runtime").JSX.Element;
3
3
  export declare function useRqmiiAgentContext(): RqmiiAgentContextValue;
4
4
  //# sourceMappingURL=RqmiiAgentProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RqmiiAgentProvider.d.ts","sourceRoot":"","sources":["../../src/provider/RqmiiAgentProvider.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EAMvB,MAAM,UAAU,CAAC;AAIlB,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,OAAO,EACP,gBAAgB,EAChB,WAAkB,EAClB,UAAU,EACV,KAAa,EACb,wBAA6B,EAC7B,eAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,GAClB,EAAE,uBAAuB,2CAiSzB;AAED,wBAAgB,oBAAoB,IAAI,sBAAsB,CAI7D"}
1
+ {"version":3,"file":"RqmiiAgentProvider.d.ts","sourceRoot":"","sources":["../../src/provider/RqmiiAgentProvider.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EAOvB,MAAM,UAAU,CAAC;AAIlB,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,OAAO,EACP,WAAkB,EAClB,UAAU,EACV,KAAa,EACb,wBAA6B,EAC7B,eAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,YAAY,GACb,EAAE,uBAAuB,2CAmUzB;AAED,wBAAgB,oBAAoB,IAAI,sBAAsB,CAI7D"}
@@ -1,8 +1,9 @@
1
1
  import type { Socket } from 'socket.io-client';
2
2
  import type { Dispatch } from 'react';
3
3
  import type { createResponseChunkAccumulator } from '../core/utils/accumulator';
4
- import type { RqmiiState, RqmiiReconnectOptions, AgentType } from '../types';
4
+ import type { RqmiiState, AgentType, ClientToolHandler } from '../types';
5
5
  import type { StateAction } from '../core/state/types';
6
+ import { EventEmitter } from '../core/events/emitter';
6
7
  interface SocketHandlerDeps {
7
8
  socket: Socket;
8
9
  dispatch: Dispatch<StateAction>;
@@ -24,16 +25,8 @@ interface SocketHandlerDeps {
24
25
  chunkAccumulatorRef: {
25
26
  current: ReturnType<typeof createResponseChunkAccumulator>;
26
27
  };
27
- reconnectMgrRef: {
28
- current: {
29
- storeCredential: (p: unknown) => void;
30
- };
31
- };
32
- heartbeatMgrRef: {
33
- current: {
34
- start: (s: Socket) => void;
35
- stop: () => void;
36
- };
28
+ clientToolsRef: {
29
+ current: Record<string, ClientToolHandler>;
37
30
  };
38
31
  audioMgrRef: {
39
32
  current: {
@@ -44,7 +37,6 @@ interface SocketHandlerDeps {
44
37
  };
45
38
  };
46
39
  enableAudio: boolean;
47
- reconnectOptions?: RqmiiReconnectOptions;
48
40
  cbRefs: {
49
41
  current: {
50
42
  onSessionExpired?: (payload?: {
@@ -59,18 +51,9 @@ interface SocketHandlerDeps {
59
51
  detail?: string;
60
52
  }) => void;
61
53
  onDisconnect?: (reason?: string) => void;
62
- onReconnectSuccess?: (payload?: {
63
- sessionId?: string;
64
- reconnectToken?: string;
65
- role?: string;
66
- }) => void;
67
- onReconnectFailed?: (payload?: {
68
- code?: string;
69
- reason?: string;
70
- }) => void;
71
54
  };
72
55
  };
73
- log: (...args: unknown[]) => void;
56
+ eventsEmitter: EventEmitter;
74
57
  }
75
58
  export declare function registerSocketHandlers(deps: SocketHandlerDeps): void;
76
59
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"socket-handlers.d.ts","sourceRoot":"","sources":["../../src/provider/socket-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAA+C,qBAAqB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChC,QAAQ,EAAE;QAAE,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;IAClC,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzC,mBAAmB,EAAE;QAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;KAAE,CAAC;IACnD,cAAc,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,mBAAmB,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,mBAAmB,EAAE;QAAE,OAAO,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAA;KAAE,CAAC;IACpF,eAAe,EAAE;QAAE,OAAO,EAAE;YAAE,eAAe,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;IACxE,eAAe,EAAE;QAAE,OAAO,EAAE;YAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;YAAC,IAAI,EAAE,MAAM,IAAI,CAAA;SAAE,CAAA;KAAE,CAAC;IAC/E,WAAW,EAAE;QAAE,OAAO,EAAE;YAAE,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;YAAC,WAAW,EAAE,MAAM,IAAI,CAAC;YAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC;YAAC,WAAW,EAAE,MAAM,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;IACrJ,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,MAAM,EAAE;QAAE,OAAO,EAAE;YACjB,gBAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;gBAAE,SAAS,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,SAAS,CAAC,EAAE,MAAM,CAAA;aAAE,KAAK,IAAI,CAAC;YACpG,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;YACjC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,KAAK,IAAI,CAAC;YACnF,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;YACzC,kBAAkB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;gBAAE,SAAS,CAAC,EAAE,MAAM,CAAC;gBAAC,cAAc,CAAC,EAAE,MAAM,CAAC;gBAAC,IAAI,CAAC,EAAE,MAAM,CAAA;aAAE,KAAK,IAAI,CAAC;YACxG,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,KAAK,IAAI,CAAC;SAC5E,CAAA;KAAC,CAAC;IACH,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAyMpE"}
1
+ {"version":3,"file":"socket-handlers.d.ts","sourceRoot":"","sources":["../../src/provider/socket-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAItC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAA+C,SAAS,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACtH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,UAAU,iBAAiB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IAChC,QAAQ,EAAE;QAAE,OAAO,EAAE,UAAU,CAAA;KAAE,CAAC;IAClC,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzC,mBAAmB,EAAE;QAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;KAAE,CAAC;IACnD,cAAc,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,mBAAmB,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,mBAAmB,EAAE;QAAE,OAAO,EAAE,UAAU,CAAC,OAAO,8BAA8B,CAAC,CAAA;KAAE,CAAC;IACpF,cAAc,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAA;KAAE,CAAC;IAC/D,WAAW,EAAE;QAAE,OAAO,EAAE;YAAE,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,IAAI,CAAC;YAAC,WAAW,EAAE,MAAM,IAAI,CAAC;YAAC,iBAAiB,EAAE,MAAM,IAAI,CAAC;YAAC,WAAW,EAAE,MAAM,OAAO,CAAA;SAAE,CAAA;KAAE,CAAC;IACrJ,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE;QAAE,OAAO,EAAE;YACjB,gBAAgB,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;gBAAE,SAAS,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,SAAS,CAAC,EAAE,MAAM,CAAA;aAAE,KAAK,IAAI,CAAC;YACpG,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;YACjC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;gBAAE,IAAI,CAAC,EAAE,MAAM,CAAC;gBAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,KAAK,IAAI,CAAC;YACnF,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;SAC1C,CAAA;KAAC,CAAC;IACH,aAAa,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAiMpE"}
@@ -1,9 +1,8 @@
1
1
  import type { Socket } from 'socket.io-client';
2
- import type { RqmiiReconnectOptions, RqmiiPCMOptions } from '../types';
2
+ import type { RqmiiPCMOptions } from '../types';
3
3
  interface ManagerLifecycleOptions {
4
4
  wsUrl: string;
5
5
  restUrl: string;
6
- reconnectOptions?: RqmiiReconnectOptions;
7
6
  enableAudio: boolean;
8
7
  pcmOptions?: RqmiiPCMOptions;
9
8
  debug: boolean;
@@ -34,41 +33,26 @@ export declare function useManagerLifecycle(options: ManagerLifecycleOptions): {
34
33
  getAudioElement: () => HTMLAudioElement | null;
35
34
  isDestroyed: () => boolean;
36
35
  } | null>;
37
- reconnectMgrRef: import("react").MutableRefObject<{
38
- storeCredential: (payload: unknown) => void;
39
- getCredential: () => import("../core/managers/reconnect").ReconnectCredential | null;
40
- clearCredential: () => void;
41
- tryReconnect: ({ connectSocket, onAttempt, onSuccess, onFailure, isAborted, }: {
42
- connectSocket: (args: {
43
- authPayload: Record<string, unknown>;
44
- expectReconnectSuccess: boolean;
45
- }) => Promise<unknown>;
46
- onAttempt?: (attempt: number) => void;
47
- onSuccess?: () => void;
48
- onFailure?: (msg: string) => void;
49
- isAborted?: () => boolean;
50
- }) => Promise<void>;
51
- abortReconnect: () => void;
52
- isReconnecting: () => boolean;
53
- } | null>;
54
36
  sessionMgrRef: import("react").MutableRefObject<{
55
- initializeSession: ({ apiKey, publicChatId, agentId, userId, language, }?: {
37
+ initializeSession: ({ apiKey, publicChatId, agentId, userId, language, timezone, config, }?: {
56
38
  apiKey?: string;
57
39
  publicChatId?: string;
58
40
  agentId?: string;
59
41
  userId?: string;
60
42
  language?: string;
43
+ timezone?: string;
44
+ config?: Record<string, unknown>;
61
45
  }) => Promise<Record<string, unknown>>;
62
46
  joinDesktopSession: ({ uniqueId, }: {
63
47
  uniqueId: string;
64
48
  }) => Promise<Record<string, unknown>>;
65
- } | null>;
66
- heartbeatMgrRef: import("react").MutableRefObject<{
67
- start: (socket: {
68
- emit: (event: string, payload: unknown) => void;
69
- }) => void;
70
- stop: () => void;
71
- isRunning: () => boolean;
49
+ fetchAgentConfig: (publicChatId: string) => Promise<Record<string, unknown>>;
50
+ submitFeedback: ({ sessionId, rating, feedback, endedBy, }: {
51
+ sessionId: string;
52
+ rating?: number;
53
+ feedback?: string;
54
+ endedBy?: string;
55
+ }) => Promise<Record<string, unknown>>;
72
56
  } | null>;
73
57
  log: (...args: unknown[]) => void;
74
58
  };
@@ -1 +1 @@
1
- {"version":3,"file":"use-manager-lifecycle.d.ts","sourceRoot":"","sources":["../../src/provider/use-manager-lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAM/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEvE,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB;;;;sBAhBP,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAyBnC,CAAC;qBAA0C,CAAC;qBAClE,CAAC;qBAAsC,CAAC;;;;;;;kBAF7B,CAAC;wBAA0B,CAAC;mBAAqB,CAAC;kBAC9D,CAAC;oBAAsB,CAAC;;;;;;;;;;;;;mBANQ,OAAO,EAAE;EA0C5C"}
1
+ {"version":3,"file":"use-manager-lifecycle.d.ts","sourceRoot":"","sources":["../../src/provider/use-manager-lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,uBAAuB;;;;sBAXlD,CAAC;;;;;;;;;;;;;;;;;;;;;kBAyBO,CAAC;wBACH,CAAA;mBAAqB,CAAC;kBAAoB,CAAC;oBAAsB,CAAC;oBAElF,CAAC;kBAAqB,CAAA;;;;;;;;kBAkB66D,CAAC;oBAAsB,CAAC;mBAAqB,CAAC;;;mBAhCr9D,OAAO,EAAE;EA+B5C"}
@@ -1,6 +1,7 @@
1
1
  export type AgentType = 'text' | 'voice' | 'text_and_voice' | 'cloud_avatar' | 'desktop_avatar' | (string & {});
2
- export type ConnectionState = 'idle' | 'initializing' | 'connecting' | 'connected' | 'reconnecting' | 'failed' | 'ended' | (string & {});
2
+ export type ConnectionState = 'idle' | 'initializing' | 'connecting' | 'connected' | 'failed' | 'ended' | (string & {});
3
3
  export type SessionState = 'idle' | 'user_speaking' | 'agent_thinking' | 'agent_speaking' | 'tool_executing' | 'terminating' | 'terminated' | (string & {});
4
+ export type AudioCaptureState = 'idle' | 'requesting-mic' | 'capturing' | 'unsupported' | 'suspended' | 'error' | (string & {});
4
5
  export type CloudStreamState = 'idle' | 'connecting' | 'loading' | 'connected' | 'disconnected' | 'error' | (string & {});
5
6
  export interface RqmiiSessionInfo {
6
7
  sessionId: string | null;
@@ -25,6 +26,28 @@ export interface PartialTranscriptPayload {
25
26
  text?: string;
26
27
  [key: string]: unknown;
27
28
  }
29
+ export interface WidgetAppearance {
30
+ brand_color?: string | null;
31
+ position: 'left' | 'right';
32
+ show_branding: boolean;
33
+ footer_content?: Record<string, string>;
34
+ }
35
+ export interface WidgetBehavior {
36
+ post_chat_rating_enabled: boolean;
37
+ welcome_bubble_enabled: boolean;
38
+ welcome_bubble_delay_seconds: number;
39
+ welcome_bubble_sound_enabled: boolean;
40
+ typing_indicator_enabled: boolean;
41
+ }
42
+ export interface RqmiiConsentConfig {
43
+ enabled?: boolean;
44
+ title?: Record<string, string>;
45
+ body?: Record<string, string>;
46
+ acceptLabel?: Record<string, string>;
47
+ declineLabel?: Record<string, string>;
48
+ termsUrl?: Record<string, string>;
49
+ privacyUrl?: Record<string, string>;
50
+ }
28
51
  export interface PublicAgent {
29
52
  id?: string | null;
30
53
  publicChatId?: string | null;
@@ -34,28 +57,36 @@ export interface PublicAgent {
34
57
  useVoice: boolean;
35
58
  faceIndex: number;
36
59
  faceImageUrl?: string | null;
37
- agentCustomization?: Record<string, unknown>;
38
60
  languages: string[];
39
61
  defaultLanguage: string;
40
- }
41
- export interface RqmiiReconnectOptions {
42
- enabled?: boolean;
43
- maxAttempts?: number;
44
- initialDelayMs?: number;
45
- maxDelayMs?: number;
46
- timeoutMs?: number;
62
+ allowInterrupt: boolean;
63
+ allowWelcomeMessageInterrupt: boolean;
64
+ welcomeMessages: Record<string, string>;
65
+ conversation?: {
66
+ default_language: string;
67
+ languages: string[];
68
+ suggested_messages?: Record<string, string[]>;
69
+ };
70
+ widget?: {
71
+ appearance: WidgetAppearance;
72
+ behavior: WidgetBehavior;
73
+ };
74
+ consent?: RqmiiConsentConfig;
47
75
  }
48
76
  export interface RqmiiPCMOptions {
49
77
  encoding?: string;
50
78
  channels?: number;
51
79
  sampleRate?: number;
52
80
  }
81
+ export type ClientToolHandler = (parameters: Record<string, unknown>) => Promise<unknown>;
53
82
  export interface InitializeSessionArgs {
54
83
  apiKey?: string;
55
84
  publicChatId?: string;
56
85
  agentId?: string;
57
86
  userId?: string;
58
87
  language?: string;
88
+ clientTools?: Record<string, ClientToolHandler>;
89
+ config?: Record<string, unknown>;
59
90
  }
60
91
  export interface JoinDesktopSessionArgs {
61
92
  uniqueId: string;
@@ -70,7 +101,6 @@ export interface RqmiiAgentProviderProps {
70
101
  children?: React.ReactNode;
71
102
  wsUrl: string;
72
103
  restUrl: string;
73
- reconnectOptions?: RqmiiReconnectOptions;
74
104
  enableAudio?: boolean;
75
105
  pcmOptions?: RqmiiPCMOptions;
76
106
  debug?: boolean;
@@ -88,15 +118,6 @@ export interface RqmiiAgentProviderProps {
88
118
  detail?: string;
89
119
  }) => void;
90
120
  onDisconnect?: (reason?: string) => void;
91
- onReconnectSuccess?: (payload?: {
92
- sessionId?: string;
93
- reconnectToken?: string;
94
- role?: string;
95
- }) => void;
96
- onReconnectFailed?: (payload?: {
97
- code?: string;
98
- reason?: string;
99
- }) => void;
100
121
  }
101
122
  export interface RqmiiAgentRoomSessionInitialize {
102
123
  mode?: 'initialize';
@@ -104,6 +125,7 @@ export interface RqmiiAgentRoomSessionInitialize {
104
125
  publicChatId?: string;
105
126
  agentId?: string;
106
127
  language?: string;
128
+ config?: Record<string, unknown>;
107
129
  }
108
130
  export interface RqmiiAgentRoomSessionJoinDesktop {
109
131
  mode: 'join_desktop';
@@ -115,6 +137,7 @@ export interface RqmiiAgentRoomProps extends RqmiiAgentProviderProps {
115
137
  connect?: boolean;
116
138
  onError?: (error: unknown) => void;
117
139
  onInitialized?: (data: SessionData) => void;
140
+ clientTools?: Record<string, ClientToolHandler>;
118
141
  }
119
142
  export interface RqmiiCloudAvatarPlayerProps {
120
143
  className?: string;
@@ -128,16 +151,28 @@ export interface RqmiiCloudAvatarPlayerProps {
128
151
  export interface RqmiiAgentChatProps {
129
152
  wsUrl: string;
130
153
  restUrl: string;
154
+ /** Public chat ID for public embed. Mutually exclusive with apiKey and agentId. */
131
155
  publicChatId?: string;
156
+ /** API key auth for session init. Mutually exclusive with publicChatId and agentId. */
157
+ apiKey?: string;
158
+ /** Direct agent ID for playground (use with withCredentials for cookie auth). Mutually exclusive with publicChatId and apiKey. */
159
+ agentId?: string;
160
+ /** Optional fallback agent data (name, face, etc.) for display before session init. */
132
161
  agent?: Partial<PublicAgent> | Record<string, unknown>;
162
+ /** Default language override (e.g. from website locale). Falls back to agent.defaultLanguage. */
163
+ language?: string;
133
164
  defaultOpen?: boolean;
134
165
  className?: string;
135
- reconnectOptions?: RqmiiReconnectOptions;
136
166
  pcmOptions?: RqmiiPCMOptions;
137
167
  debug?: boolean;
168
+ /** Enable cookie-based auth (required when using agentId). */
138
169
  withCredentials?: boolean;
139
170
  onError?: (error: unknown) => void;
140
171
  onInitialized?: (data: unknown) => void;
172
+ /** Optional config override passed during session initialization. */
173
+ config?: Record<string, unknown>;
174
+ /** Custom client tools registered after session initialization. */
175
+ clientTools?: Record<string, ClientToolHandler>;
141
176
  }
142
177
  export interface RqmiiAgentChatPreviewProps {
143
178
  agent: Partial<PublicAgent> | Record<string, unknown>;
@@ -171,7 +206,6 @@ export interface UseRqmiiConnectionReturn {
171
206
  isConnected: boolean;
172
207
  isSessionReady: boolean;
173
208
  error: string | null;
174
- reconnectAttempt: number;
175
209
  session: RqmiiSessionInfo;
176
210
  creditExhausted: boolean;
177
211
  creditError: string | null;
@@ -181,6 +215,7 @@ export interface UseRqmiiConnectionReturn {
181
215
  isAgentThinking: boolean;
182
216
  isAgentSpeaking: boolean;
183
217
  isToolExecuting: boolean;
218
+ agentConfig: Record<string, unknown> | null;
184
219
  initializeSession: (args?: InitializeSessionArgs) => Promise<SessionData>;
185
220
  joinDesktopSession: (args: JoinDesktopSessionArgs) => Promise<SessionData>;
186
221
  disconnect: () => void;
@@ -191,6 +226,8 @@ export interface UseRqmiiConnectionReturn {
191
226
  clearSessionHistory: () => boolean;
192
227
  changeSessionLanguage: (language: string) => boolean;
193
228
  signalClientReady: (payload?: Record<string, unknown>) => boolean;
229
+ fetchAgentConfig: (publicChatId: string) => Promise<Record<string, unknown>>;
230
+ registerClientTools: (tools: Record<string, ClientToolHandler>) => void;
194
231
  }
195
232
  export interface UseRqmiiSessionStateReturn {
196
233
  sessionState: SessionState;
@@ -229,11 +266,10 @@ export interface UseRqmiiAvatarReturn {
229
266
  setCloudStreamState: (nextState: CloudStreamState, error?: unknown) => void;
230
267
  }
231
268
  export interface UseRqmiiPressToTalkOptions {
232
- onAudioChunk?: (chunk: ArrayBuffer) => void;
269
+ onAudioChunk?: (chunk: Uint8Array) => void;
233
270
  onAudioEnd?: () => void;
234
271
  onError?: (error: unknown) => void;
235
272
  holdDelayMs?: number;
236
- timesliceMs?: number;
237
273
  interruptOnHoldStart?: boolean;
238
274
  audioConstraints?: MediaTrackConstraints;
239
275
  }
@@ -250,15 +286,20 @@ export interface UseRqmiiPressToTalkReturn {
250
286
  eventHandlers: React.HTMLAttributes<HTMLElement>;
251
287
  }
252
288
  export interface UseRqmiiVADOptions {
253
- onAudioChunk?: (chunk: ArrayBuffer) => void;
289
+ onAudioChunk?: (chunk: Uint8Array) => void;
254
290
  onAudioEnd?: () => void;
255
291
  onSpeechStart?: () => void;
256
292
  onSpeechEnd?: () => void;
257
293
  onVADMisfire?: () => void;
258
294
  onError?: (error: unknown) => void;
259
295
  enabled?: boolean;
296
+ /**
297
+ * @deprecated No longer used. Barge-in is now driven by the backend when the
298
+ * first confirmed partial transcript arrives, so the SDK never interrupts the
299
+ * agent on raw VAD speech-start (which fires on coughs, noise, and other false
300
+ * positives). Kept only for backward compatibility.
301
+ */
260
302
  interruptOnSpeechStart?: boolean;
261
- forceAudioMp4?: boolean;
262
303
  preloadStream?: boolean;
263
304
  }
264
305
  export interface UseRqmiiVADReturn {
@@ -274,7 +315,7 @@ export interface UseRqmiiVADReturn {
274
315
  pause: () => void;
275
316
  userSpeaking: boolean;
276
317
  }
277
- export type EventType = 'session:ready' | 'session:joined' | 'session:terminated' | 'session:expired' | 'message:received' | 'message:sent' | 'audio:playing' | 'audio:stopped' | 'avatar:speaking' | 'avatar:speaking_done' | 'state:changed' | 'connection:connected' | 'connection:disconnected' | 'connection:reconnecting' | 'connection:failed' | 'error' | 'credits:exhausted' | 'transcript' | 'partial_transcript' | 'interrupted';
318
+ export type EventType = 'session:ready' | 'session:joined' | 'session:terminated' | 'session:expired' | 'message:received' | 'message:sent' | 'audio:playing' | 'audio:stopped' | 'avatar:speaking' | 'avatar:speaking_done' | 'state:changed' | 'connection:connected' | 'connection:disconnected' | 'connection:failed' | 'error' | 'credits:exhausted' | 'transcript' | 'partial_transcript' | 'interrupted' | 'language_changed';
278
319
  export interface EventHandlerMap {
279
320
  'session:ready': (payload?: {
280
321
  agentType?: string;
@@ -295,7 +336,6 @@ export interface EventHandlerMap {
295
336
  'state:changed': (state: RqmiiState) => void;
296
337
  'connection:connected': () => void;
297
338
  'connection:disconnected': (reason?: string) => void;
298
- 'connection:reconnecting': (attempt: number) => void;
299
339
  'connection:failed': (error: string) => void;
300
340
  'error': (payload?: {
301
341
  code?: string;
@@ -306,16 +346,17 @@ export interface EventHandlerMap {
306
346
  'transcript': (payload: TranscriptPayload) => void;
307
347
  'partial_transcript': (payload: PartialTranscriptPayload) => void;
308
348
  'interrupted': () => void;
349
+ 'language_changed': (payload: {
350
+ language: string;
351
+ }) => void;
309
352
  }
310
353
  export interface RqmiiState {
311
354
  connectionState: ConnectionState;
312
355
  isConnected: boolean;
313
356
  isSessionReady: boolean;
314
357
  error: string | null;
315
- reconnectAttempt: number;
316
358
  isAudioPlaying: boolean;
317
359
  isAvatarSpeaking: boolean;
318
- lastHeartbeatAck: string | null;
319
360
  sessionState: SessionState;
320
361
  cloudStream: {
321
362
  state: CloudStreamState;
@@ -327,16 +368,15 @@ export interface RqmiiState {
327
368
  messages: RqmiiMessage[];
328
369
  creditExhausted: boolean;
329
370
  creditError: string | null;
371
+ agentConfig: Record<string, unknown> | null;
330
372
  }
331
373
  export interface RqmiiAgentContextValue {
332
374
  connectionState: ConnectionState;
333
375
  isConnected: boolean;
334
376
  isSessionReady: boolean;
335
377
  error: string | null;
336
- reconnectAttempt: number;
337
378
  isAudioPlaying: boolean;
338
379
  isAvatarSpeaking: boolean;
339
- lastHeartbeatAck: string | null;
340
380
  sessionState: SessionState;
341
381
  cloudStream: {
342
382
  state: CloudStreamState;
@@ -348,6 +388,7 @@ export interface RqmiiAgentContextValue {
348
388
  messages: RqmiiMessage[];
349
389
  creditExhausted: boolean;
350
390
  creditError: string | null;
391
+ agentConfig: Record<string, unknown> | null;
351
392
  isSessionTerminated: boolean;
352
393
  isSessionTerminating: boolean;
353
394
  isAgentThinking: boolean;
@@ -359,8 +400,12 @@ export interface RqmiiAgentContextValue {
359
400
  terminateSession: () => Promise<{
360
401
  success: boolean;
361
402
  }>;
403
+ /** End the session gracefully (emits end_session) without clearing messages, so history is preserved. */
404
+ endSession: () => void;
362
405
  emit: (event: string, payload?: unknown) => boolean;
363
406
  sendTextMessage: (text: string) => boolean;
407
+ addLocalMessage: (role: string, text: string) => void;
408
+ emitUserMessage: (text: string) => boolean;
364
409
  sendAudioChunk: (audio: ArrayBuffer | Uint8Array | unknown) => boolean;
365
410
  endAudioStream: () => boolean;
366
411
  interrupt: () => boolean;
@@ -372,6 +417,14 @@ export interface RqmiiAgentContextValue {
372
417
  pauseAudioPlayback: () => void;
373
418
  attachAudioElement: (element: HTMLAudioElement | null) => void;
374
419
  setCloudStreamState: (state: CloudStreamState, error?: unknown) => void;
420
+ fetchAgentConfig: (publicChatId: string) => Promise<Record<string, unknown>>;
421
+ submitFeedback: (args: {
422
+ sessionId?: string;
423
+ rating?: number;
424
+ feedback?: string;
425
+ endedBy?: string;
426
+ }) => Promise<Record<string, unknown>>;
427
+ registerClientTools: (tools: Record<string, ClientToolHandler>) => void;
375
428
  events: EventEmitter;
376
429
  audioElement: HTMLAudioElement | null;
377
430
  socket: import('socket.io-client').Socket | null;