@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.
- package/dist/RqmiiCloudAvatarPlayer-BI7Uz7DP.cjs +2918 -0
- package/dist/RqmiiCloudAvatarPlayer-BI7Uz7DP.cjs.map +1 -0
- package/dist/{RqmiiCloudAvatarPlayer-CESlcAGy.js → RqmiiCloudAvatarPlayer-D5aXKUuO.js} +6569 -6932
- package/dist/RqmiiCloudAvatarPlayer-D5aXKUuO.js.map +1 -0
- package/dist/agent-react-sdk.css +1 -1
- package/dist/capture/capture.d.ts +32 -0
- package/dist/capture/capture.d.ts.map +1 -0
- package/dist/components/RqmiiAgentRoom.d.ts +1 -1
- package/dist/components/RqmiiAgentRoom.d.ts.map +1 -1
- package/dist/core/constants.d.ts +3 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/managers/session.d.ts +10 -1
- package/dist/core/managers/session.d.ts.map +1 -1
- package/dist/core/state/reducer.d.ts.map +1 -1
- package/dist/core/state/types.d.ts +3 -6
- package/dist/core/state/types.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-connection.d.ts +10 -1
- package/dist/hooks/use-rqmii-connection.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-messages.d.ts +2 -0
- package/dist/hooks/use-rqmii-messages.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-press-to-talk.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-sdk.d.ts +0 -2
- package/dist/hooks/use-rqmii-sdk.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-vad.d.ts.map +1 -1
- package/dist/index.cjs +49 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +297 -218
- package/dist/index.js.map +1 -1
- package/dist/provider/RqmiiAgentProvider.d.ts +1 -1
- package/dist/provider/RqmiiAgentProvider.d.ts.map +1 -1
- package/dist/provider/socket-handlers.d.ts +5 -22
- package/dist/provider/socket-handlers.d.ts.map +1 -1
- package/dist/provider/use-manager-lifecycle.d.ts +11 -27
- package/dist/provider/use-manager-lifecycle.d.ts.map +1 -1
- package/dist/types/index.d.ts +84 -31
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/Orb.d.ts.map +1 -1
- package/dist/ui/RqmiiAgentChat.d.ts +1 -1
- package/dist/ui/RqmiiAgentChat.d.ts.map +1 -1
- package/dist/ui/agent-data.d.ts +20 -1
- package/dist/ui/agent-data.d.ts.map +1 -1
- package/dist/ui/agent-data.test.d.ts +2 -0
- package/dist/ui/agent-data.test.d.ts.map +1 -0
- package/dist/ui/chat/ChatBox.d.ts +1 -1
- package/dist/ui/chat/ChatBox.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-avatar.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-content.d.ts +20 -10
- package/dist/ui/chat/chat-box-content.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-content.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-content.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-shared.d.ts +20 -0
- package/dist/ui/chat/chat-box-shared.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-shared.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-shared.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-text-and-voice.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-text-and-voice.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-text-and-voice.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-text.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-text.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-text.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-types.d.ts +35 -1
- package/dist/ui/chat/chat-box-types.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-voice.d.ts.map +1 -1
- package/dist/ui/chat/components.d.ts +3 -2
- package/dist/ui/chat/components.d.ts.map +1 -1
- package/dist/ui/chat/consent-dialog.d.ts +10 -0
- package/dist/ui/chat/consent-dialog.d.ts.map +1 -0
- package/dist/ui/chat/feedback.d.ts +21 -0
- package/dist/ui/chat/feedback.d.ts.map +1 -0
- package/dist/ui/chat/panels.d.ts +50 -7
- package/dist/ui/chat/panels.d.ts.map +1 -1
- package/dist/ui/chat/primitives.d.ts +29 -2
- package/dist/ui/chat/primitives.d.ts.map +1 -1
- package/dist/ui/chat/utils.d.ts +10 -0
- package/dist/ui/chat/utils.d.ts.map +1 -1
- package/dist/ui/enable-audio.test.d.ts +2 -0
- package/dist/ui/enable-audio.test.d.ts.map +1 -0
- package/dist/ui/languages/index.d.ts +5 -0
- package/dist/ui/languages/index.d.ts.map +1 -0
- package/dist/ui/languages/list.d.ts +7 -0
- package/dist/ui/languages/list.d.ts.map +1 -0
- package/dist/ui/languages/text.d.ts +3 -0
- package/dist/ui/languages/text.d.ts.map +1 -0
- package/dist/ui/languages/translations/af.d.ts +4 -0
- package/dist/ui/languages/translations/af.d.ts.map +1 -0
- package/dist/ui/languages/translations/ar.d.ts +4 -0
- package/dist/ui/languages/translations/ar.d.ts.map +1 -0
- package/dist/ui/languages/translations/az.d.ts +4 -0
- package/dist/ui/languages/translations/az.d.ts.map +1 -0
- package/dist/ui/languages/translations/be.d.ts +4 -0
- package/dist/ui/languages/translations/be.d.ts.map +1 -0
- package/dist/ui/languages/translations/bg.d.ts +4 -0
- package/dist/ui/languages/translations/bg.d.ts.map +1 -0
- package/dist/ui/languages/translations/bn.d.ts +4 -0
- package/dist/ui/languages/translations/bn.d.ts.map +1 -0
- package/dist/ui/languages/translations/bs.d.ts +4 -0
- package/dist/ui/languages/translations/bs.d.ts.map +1 -0
- package/dist/ui/languages/translations/ca.d.ts +4 -0
- package/dist/ui/languages/translations/ca.d.ts.map +1 -0
- package/dist/ui/languages/translations/cs.d.ts +4 -0
- package/dist/ui/languages/translations/cs.d.ts.map +1 -0
- package/dist/ui/languages/translations/cy.d.ts +4 -0
- package/dist/ui/languages/translations/cy.d.ts.map +1 -0
- package/dist/ui/languages/translations/da.d.ts +4 -0
- package/dist/ui/languages/translations/da.d.ts.map +1 -0
- package/dist/ui/languages/translations/de.d.ts +4 -0
- package/dist/ui/languages/translations/de.d.ts.map +1 -0
- package/dist/ui/languages/translations/el.d.ts +4 -0
- package/dist/ui/languages/translations/el.d.ts.map +1 -0
- package/dist/ui/languages/translations/en.d.ts +4 -0
- package/dist/ui/languages/translations/en.d.ts.map +1 -0
- package/dist/ui/languages/translations/es.d.ts +4 -0
- package/dist/ui/languages/translations/es.d.ts.map +1 -0
- package/dist/ui/languages/translations/et.d.ts +4 -0
- package/dist/ui/languages/translations/et.d.ts.map +1 -0
- package/dist/ui/languages/translations/eu.d.ts +4 -0
- package/dist/ui/languages/translations/eu.d.ts.map +1 -0
- package/dist/ui/languages/translations/fa.d.ts +4 -0
- package/dist/ui/languages/translations/fa.d.ts.map +1 -0
- package/dist/ui/languages/translations/fi.d.ts +4 -0
- package/dist/ui/languages/translations/fi.d.ts.map +1 -0
- package/dist/ui/languages/translations/fr.d.ts +4 -0
- package/dist/ui/languages/translations/fr.d.ts.map +1 -0
- package/dist/ui/languages/translations/gl.d.ts +4 -0
- package/dist/ui/languages/translations/gl.d.ts.map +1 -0
- package/dist/ui/languages/translations/gu.d.ts +4 -0
- package/dist/ui/languages/translations/gu.d.ts.map +1 -0
- package/dist/ui/languages/translations/hi.d.ts +4 -0
- package/dist/ui/languages/translations/hi.d.ts.map +1 -0
- package/dist/ui/languages/translations/hr.d.ts +4 -0
- package/dist/ui/languages/translations/hr.d.ts.map +1 -0
- package/dist/ui/languages/translations/hu.d.ts +4 -0
- package/dist/ui/languages/translations/hu.d.ts.map +1 -0
- package/dist/ui/languages/translations/id.d.ts +4 -0
- package/dist/ui/languages/translations/id.d.ts.map +1 -0
- package/dist/ui/languages/translations/it.d.ts +4 -0
- package/dist/ui/languages/translations/it.d.ts.map +1 -0
- package/dist/ui/languages/translations/ja.d.ts +4 -0
- package/dist/ui/languages/translations/ja.d.ts.map +1 -0
- package/dist/ui/languages/translations/kk.d.ts +4 -0
- package/dist/ui/languages/translations/kk.d.ts.map +1 -0
- package/dist/ui/languages/translations/kn.d.ts +4 -0
- package/dist/ui/languages/translations/kn.d.ts.map +1 -0
- package/dist/ui/languages/translations/ko.d.ts +4 -0
- package/dist/ui/languages/translations/ko.d.ts.map +1 -0
- package/dist/ui/languages/translations/lt.d.ts +4 -0
- package/dist/ui/languages/translations/lt.d.ts.map +1 -0
- package/dist/ui/languages/translations/lv.d.ts +4 -0
- package/dist/ui/languages/translations/lv.d.ts.map +1 -0
- package/dist/ui/languages/translations/mk.d.ts +4 -0
- package/dist/ui/languages/translations/mk.d.ts.map +1 -0
- package/dist/ui/languages/translations/ml.d.ts +4 -0
- package/dist/ui/languages/translations/ml.d.ts.map +1 -0
- package/dist/ui/languages/translations/mr.d.ts +4 -0
- package/dist/ui/languages/translations/mr.d.ts.map +1 -0
- package/dist/ui/languages/translations/ms.d.ts +4 -0
- package/dist/ui/languages/translations/ms.d.ts.map +1 -0
- package/dist/ui/languages/translations/nl.d.ts +4 -0
- package/dist/ui/languages/translations/nl.d.ts.map +1 -0
- package/dist/ui/languages/translations/no.d.ts +4 -0
- package/dist/ui/languages/translations/no.d.ts.map +1 -0
- package/dist/ui/languages/translations/pa.d.ts +4 -0
- package/dist/ui/languages/translations/pa.d.ts.map +1 -0
- package/dist/ui/languages/translations/pl.d.ts +4 -0
- package/dist/ui/languages/translations/pl.d.ts.map +1 -0
- package/dist/ui/languages/translations/pt.d.ts +4 -0
- package/dist/ui/languages/translations/pt.d.ts.map +1 -0
- package/dist/ui/languages/translations/ro.d.ts +4 -0
- package/dist/ui/languages/translations/ro.d.ts.map +1 -0
- package/dist/ui/languages/translations/ru.d.ts +4 -0
- package/dist/ui/languages/translations/ru.d.ts.map +1 -0
- package/dist/ui/languages/translations/sk.d.ts +4 -0
- package/dist/ui/languages/translations/sk.d.ts.map +1 -0
- package/dist/ui/languages/translations/sl.d.ts +4 -0
- package/dist/ui/languages/translations/sl.d.ts.map +1 -0
- package/dist/ui/languages/translations/sq.d.ts +4 -0
- package/dist/ui/languages/translations/sq.d.ts.map +1 -0
- package/dist/ui/languages/translations/sr.d.ts +4 -0
- package/dist/ui/languages/translations/sr.d.ts.map +1 -0
- package/dist/ui/languages/translations/sv.d.ts +4 -0
- package/dist/ui/languages/translations/sv.d.ts.map +1 -0
- package/dist/ui/languages/translations/sw.d.ts +4 -0
- package/dist/ui/languages/translations/sw.d.ts.map +1 -0
- package/dist/ui/languages/translations/ta.d.ts +4 -0
- package/dist/ui/languages/translations/ta.d.ts.map +1 -0
- package/dist/ui/languages/translations/te.d.ts +4 -0
- package/dist/ui/languages/translations/te.d.ts.map +1 -0
- package/dist/ui/languages/translations/th.d.ts +4 -0
- package/dist/ui/languages/translations/th.d.ts.map +1 -0
- package/dist/ui/languages/translations/tl.d.ts +4 -0
- package/dist/ui/languages/translations/tl.d.ts.map +1 -0
- package/dist/ui/languages/translations/tr.d.ts +4 -0
- package/dist/ui/languages/translations/tr.d.ts.map +1 -0
- package/dist/ui/languages/translations/translations.test.d.ts +2 -0
- package/dist/ui/languages/translations/translations.test.d.ts.map +1 -0
- package/dist/ui/languages/translations/uk.d.ts +4 -0
- package/dist/ui/languages/translations/uk.d.ts.map +1 -0
- package/dist/ui/languages/translations/ur.d.ts +4 -0
- package/dist/ui/languages/translations/ur.d.ts.map +1 -0
- package/dist/ui/languages/translations/vi.d.ts +4 -0
- package/dist/ui/languages/translations/vi.d.ts.map +1 -0
- package/dist/ui/languages/translations/zh.d.ts +4 -0
- package/dist/ui/languages/translations/zh.d.ts.map +1 -0
- package/dist/ui/languages/types.d.ts +37 -0
- package/dist/ui/languages/types.d.ts.map +1 -0
- package/dist/ui/{languages.d.ts → languages/utils.d.ts} +2 -7
- package/dist/ui/languages/utils.d.ts.map +1 -0
- package/dist/ui.cjs +4502 -3
- package/dist/ui.cjs.map +1 -1
- package/dist/ui.d.ts +4 -3
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +52415 -1401
- package/dist/ui.js.map +1 -1
- package/package.json +11 -2
- package/dist/RqmiiCloudAvatarPlayer-CESlcAGy.js.map +0 -1
- package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs +0 -2939
- package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs.map +0 -1
- package/dist/core/managers/heartbeat.d.ts +0 -13
- package/dist/core/managers/heartbeat.d.ts.map +0 -1
- package/dist/core/managers/reconnect.d.ts +0 -29
- package/dist/core/managers/reconnect.d.ts.map +0 -1
- 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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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;
|
|
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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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' | '
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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;
|