@rqmii_immersive/agent-react-sdk 5.0.5 → 5.1.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.
@@ -1 +1 @@
1
- {"version":3,"file":"use-rqmii-connection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-connection.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgCwlc,CAAC;cAAgB,CAAC;gBAAkB,CAAC;eAAiB,CAAC;;;;EADhrc"}
1
+ {"version":3,"file":"use-rqmii-connection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-connection.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgC0lc,CAAC;cAAgB,CAAC;gBAAkB,CAAC;eAAiB,CAAC;;;;EADlrc"}
@@ -1 +1 @@
1
- {"version":3,"file":"use-rqmii-vad.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-vad.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAuCtE,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAmR/E"}
1
+ {"version":3,"file":"use-rqmii-vad.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-vad.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AA8DtE,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAmR/E"}
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./RqmiiCloudAvatarPlayer-DGywLDgp.cjs"),_=require("react/jsx-runtime"),r=require("react");function M(){return i.useRqmiiAgentContext()}function D(){const s=i.useRqmiiAgentContext();return{sessionState:s.sessionState,isSessionTerminated:s.isSessionTerminated,isSessionTerminating:s.isSessionTerminating,isAgentThinking:s.isAgentThinking,isAgentSpeaking:s.isAgentSpeaking,isToolExecuting:s.isToolExecuting}}function O(s){const{attachAudioElement:t,resumeAudioPlayback:e}=i.useRqmiiAgentContext();r.useEffect(()=>{if(!s?.current)return;t(s.current);const o=()=>{e()},a=s.current;return a.addEventListener("click",o),a.addEventListener("touchstart",o),()=>{a.removeEventListener("click",o),a.removeEventListener("touchstart",o),t(null)}},[t,s,e])}class L{listeners=new Map;on(t,e){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e),()=>this.off(t,e)}off(t,e){this.listeners.get(t)?.delete(e)}emit(t,e){const o=this.listeners.get(t);if(o)for(const a of o)try{a(e)}catch{}}removeAllListeners(){this.listeners.clear()}}const N={inputSampleRate:48e3,frameSizeMs:20},j=`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./RqmiiCloudAvatarPlayer-C2bz7pkW.cjs"),g=require("react/jsx-runtime"),r=require("react");function M(){return i.useRqmiiAgentContext()}function D(){const s=i.useRqmiiAgentContext();return{sessionState:s.sessionState,isSessionTerminated:s.isSessionTerminated,isSessionTerminating:s.isSessionTerminating,isAgentThinking:s.isAgentThinking,isAgentSpeaking:s.isAgentSpeaking,isToolExecuting:s.isToolExecuting}}function O(s){const{attachAudioElement:t,resumeAudioPlayback:e}=i.useRqmiiAgentContext();r.useEffect(()=>{if(!s?.current)return;t(s.current);const o=()=>{e()},a=s.current;return a.addEventListener("click",o),a.addEventListener("touchstart",o),()=>{a.removeEventListener("click",o),a.removeEventListener("touchstart",o),t(null)}},[t,s,e])}class L{listeners=new Map;on(t,e){return this.listeners.has(t)||this.listeners.set(t,new Set),this.listeners.get(t).add(e),()=>this.off(t,e)}off(t,e){this.listeners.get(t)?.delete(e)}emit(t,e){const o=this.listeners.get(t);if(o)for(const a of o)try{a(e)}catch{}}removeAllListeners(){this.listeners.clear()}}const N={inputSampleRate:48e3,frameSizeMs:20},j=`
2
2
  class PcmCaptureProcessor extends AudioWorkletProcessor {
3
3
  constructor(options) {
4
4
  super();
@@ -46,5 +46,5 @@ class PcmCaptureProcessor extends AudioWorkletProcessor {
46
46
  }
47
47
 
48
48
  registerProcessor('pcm-capture-processor', PcmCaptureProcessor);
49
- `;class v{_state="idle";_ctx=null;_node=null;_stream=null;_events=new L;_options;supported;constructor(t){this._options={...N,...t},this.supported=typeof AudioWorkletNode<"u",this.supported||(this._state="unsupported")}get state(){return this._state}get events(){return this._events}async start(){if(!this.supported)return this._state="unsupported",!1;if(this._state==="capturing")return!0;this._state="requesting-mic";try{this._stream=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(t){return this._state="error",this._events.emit("error",t),!1}try{this._ctx?.state==="suspended"&&await this._ctx.resume(),this._ctx=new AudioContext({sampleRate:this._options.inputSampleRate});const t=new Blob([j],{type:"application/javascript"}),e=URL.createObjectURL(t);await this._ctx.audioWorklet.addModule(e),URL.revokeObjectURL(e);const o=this._ctx.createMediaStreamSource(this._stream);return this._node=new AudioWorkletNode(this._ctx,"pcm-capture-processor",{processorOptions:{inputSampleRate:this._options.inputSampleRate,frameSize:this._options.inputSampleRate*this._options.frameSizeMs/1e3}}),this._node.port.onmessage=a=>{this._events.emit("audio_chunk",new Uint8Array(a.data))},o.connect(this._node),this._state="capturing",this._events.emit("state_changed",this._state),this._ctx.state==="suspended"&&await this._ctx.resume(),!0}catch(t){return this._state="error",this._events.emit("error",t),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),!1}}stop(){this._node&&(this._node.disconnect(),this._node=null),this._stream&&(this._stream.getTracks().forEach(t=>t.stop()),this._stream=null),this._ctx&&this._ctx.state!=="closed"&&(this._ctx.close(),this._ctx=null),this._state="idle",this._events.emit("state_changed",this._state)}async resume(){this._ctx?.state==="suspended"&&(await this._ctx.resume(),this._state="capturing",this._events.emit("state_changed",this._state))}async pause(){this._ctx?.state==="running"&&(await this._ctx.suspend(),this._state="suspended",this._events.emit("state_changed",this._state))}destroy(){this.events.removeAllListeners(),this.stop()}}function F(s={}){const{onAudioChunk:t,onAudioEnd:e,onError:o,holdDelayMs:a=220,interruptOnHoldStart:E=!0}=s,{sendAudioChunk:R,endAudioStream:p,interrupt:T}=i.useRqmiiAgentContext(),c=r.useRef(null),u=r.useRef(null),[k,x]=r.useState(!1),[y,g]=r.useState(!1),[q,f]=r.useState(null),h=r.useCallback(async()=>{if(c.current)return!0;const n=new v;if(c.current=n,!n.supported){const l=new Error("AudioWorklet not supported in this browser");return f(l.message),o?.(l),!1}return n.events.on("audio_chunk",l=>{t?t(l):R(l)}),n.events.on("error",l=>{o?.(l)}),await n.start()?(g(!0),f(null),!0):(f("Failed to start capture"),c.current=null,!1)},[t,o,R]),m=r.useCallback(()=>{const n=c.current;return n?(c.current=null,n.stop(),n.destroy(),g(!1),!0):!1},[]),C=r.useCallback(()=>{const n=c.current;n&&(c.current=null,n.stop(),n.destroy(),g(!1))},[]),P=r.useCallback(async()=>h(),[h]),w=r.useCallback(({discard:n=!1}={})=>{const A=m();return!n&&A&&(e?e():p()),A},[p,e,m]),S=r.useCallback(()=>{u.current&&(clearTimeout(u.current),u.current=null),x(!0),u.current=setTimeout(()=>{E&&T(),h()},a)},[a,T,E,h]),d=r.useCallback(()=>{x(!1),u.current&&(clearTimeout(u.current),u.current=null),m()&&(e?e():p())},[p,e,m]);r.useEffect(()=>()=>{u.current&&(clearTimeout(u.current),u.current=null),C()},[C]);const b=r.useMemo(()=>({onPointerDown:n=>{n.preventDefault(),S()},onPointerUp:n=>{n.preventDefault(),d()},onPointerCancel:n=>{n.preventDefault(),d()},onPointerLeave:n=>{n.preventDefault(),d()}}),[S,d]);return{isPressing:k,isRecording:y,micError:q,startRecording:P,stopRecording:w,startPress:S,stopPress:d,eventHandlers:b}}function I(){const s=i.useRqmiiAgentContext(),t=s.events;return{state:{messages:s.messages,connectionState:s.connectionState,isConnected:s.isConnected,isSessionReady:s.isSessionReady,isAudioPlaying:s.isAudioPlaying,isAgentThinking:s.isAgentThinking,isAgentSpeaking:s.isAgentSpeaking,isToolExecuting:s.isToolExecuting,isSessionTerminated:s.isSessionTerminated,isSessionTerminating:s.isSessionTerminating,creditExhausted:s.creditExhausted,creditError:s.creditError,error:s.error,transcript:s.transcript,partialTranscript:s.partialTranscript,session:s.session,sessionState:s.sessionState},actions:{sendTextMessage:s.sendTextMessage,sendAudioChunk:s.sendAudioChunk,endAudioStream:s.endAudioStream,interrupt:s.interrupt,clearSessionHistory:s.clearSessionHistory,clearMessages:s.clearMessages,changeSessionLanguage:s.changeSessionLanguage,signalClientReady:s.signalClientReady,initializeSession:s.initializeSession,joinDesktopSession:s.joinDesktopSession,disconnect:s.disconnect,terminateSession:s.terminateSession,resumeAudioPlayback:s.resumeAudioPlayback,pauseAudioPlayback:s.pauseAudioPlayback,attachAudioElement:s.attachAudioElement},events:{onSessionReady:e=>t.on("session:ready",e),onSessionJoined:e=>t.on("session:joined",e),onSessionTerminated:e=>t.on("session:terminated",e),onSessionExpired:e=>t.on("session:expired",e),onMessageReceived:e=>t.on("message:received",e),onMessageSent:e=>t.on("message:sent",e),onAudioPlaying:e=>t.on("audio:playing",e),onAudioStopped:e=>t.on("audio:stopped",e),onAvatarSpeaking:e=>t.on("avatar:speaking",e),onAvatarSpeakingDone:e=>t.on("avatar:speaking_done",e),onStateChanged:e=>t.on("state:changed",e),onConnected:e=>t.on("connection:connected",e),onDisconnected:e=>t.on("connection:disconnected",e),onConnectionFailed:e=>t.on("connection:failed",e),onError:e=>t.on("error",e),onCreditsExhausted:e=>t.on("credits:exhausted",e),onTranscript:e=>t.on("transcript",e),onPartialTranscript:e=>t.on("partial_transcript",e),onInterrupted:e=>t.on("interrupted",e)},raw:{socket:s.socket,audioElement:s.audioElement}}}class U extends r.Component{constructor(t){super(t),this.state={hasError:!1,error:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,e){this.props.onError?.(t,e)}reset=()=>{this.setState({hasError:!1,error:null})};render(){if(this.state.hasError){const{fallback:t}=this.props;return t?typeof t=="function"?this.state.error?t(this.state.error,this.reset):null:t:_.jsxs("div",{style:{padding:"24px",textAlign:"center",color:"#ef4444"},children:[_.jsx("h3",{children:"Something went wrong"}),_.jsx("p",{children:this.state.error?.message||"An unexpected error occurred"}),_.jsx("button",{onClick:this.reset,style:{marginTop:"12px",padding:"8px 16px",cursor:"pointer"},children:"Try again"})]})}return this.props.children}}exports.AGENT_TYPES=i.AGENT_TYPES;exports.CLOUD_STREAM_STATE=i.CLOUD_STREAM_STATE;exports.CONNECTION_STATE=i.CONNECTION_STATE;exports.DEFAULT_PCM_OPTIONS=i.DEFAULT_PCM_OPTIONS;exports.EventEmitter=i.EventEmitter;exports.RqmiiAgentProvider=i.RqmiiAgentProvider;exports.RqmiiAgentRoom=i.RqmiiAgentRoom;exports.RqmiiCloudAvatarPlayer=i.RqmiiCloudAvatarPlayer;exports.SESSION_STATE=i.SESSION_STATE;exports.SOCKET_EVENTS=i.SOCKET_EVENTS;exports.useRqmiiAgentContext=i.useRqmiiAgentContext;exports.useRqmiiAvatar=i.useRqmiiAvatar;exports.useRqmiiConnection=i.useRqmiiConnection;exports.useRqmiiEvents=i.useRqmiiEvents;exports.useRqmiiMessages=i.useRqmiiMessages;exports.useRqmiiVAD=i.useRqmiiVAD;exports.useRqmiiVoice=i.useRqmiiVoice;exports.AudioCapture=v;exports.RqmiiErrorBoundary=U;exports.useRqmiiAgent=M;exports.useRqmiiAudioElement=O;exports.useRqmiiPressToTalk=F;exports.useRqmiiSDK=I;exports.useRqmiiSession=D;
49
+ `;class v{_state="idle";_ctx=null;_node=null;_stream=null;_events=new L;_options;supported;constructor(t){this._options={...N,...t},this.supported=typeof AudioWorkletNode<"u",this.supported||(this._state="unsupported")}get state(){return this._state}get events(){return this._events}async start(){if(!this.supported)return this._state="unsupported",!1;if(this._state==="capturing")return!0;this._state="requesting-mic";try{this._stream=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(t){return this._state="error",this._events.emit("error",t),!1}try{this._ctx?.state==="suspended"&&await this._ctx.resume(),this._ctx=new AudioContext({sampleRate:this._options.inputSampleRate});const t=new Blob([j],{type:"application/javascript"}),e=URL.createObjectURL(t);await this._ctx.audioWorklet.addModule(e),URL.revokeObjectURL(e);const o=this._ctx.createMediaStreamSource(this._stream);return this._node=new AudioWorkletNode(this._ctx,"pcm-capture-processor",{processorOptions:{inputSampleRate:this._options.inputSampleRate,frameSize:this._options.inputSampleRate*this._options.frameSizeMs/1e3}}),this._node.port.onmessage=a=>{this._events.emit("audio_chunk",new Uint8Array(a.data))},o.connect(this._node),this._state="capturing",this._events.emit("state_changed",this._state),this._ctx.state==="suspended"&&await this._ctx.resume(),!0}catch(t){return this._state="error",this._events.emit("error",t),this._stream&&(this._stream.getTracks().forEach(e=>e.stop()),this._stream=null),!1}}stop(){this._node&&(this._node.disconnect(),this._node=null),this._stream&&(this._stream.getTracks().forEach(t=>t.stop()),this._stream=null),this._ctx&&this._ctx.state!=="closed"&&(this._ctx.close(),this._ctx=null),this._state="idle",this._events.emit("state_changed",this._state)}async resume(){this._ctx?.state==="suspended"&&(await this._ctx.resume(),this._state="capturing",this._events.emit("state_changed",this._state))}async pause(){this._ctx?.state==="running"&&(await this._ctx.suspend(),this._state="suspended",this._events.emit("state_changed",this._state))}destroy(){this.events.removeAllListeners(),this.stop()}}function F(s={}){const{onAudioChunk:t,onAudioEnd:e,onError:o,holdDelayMs:a=220,interruptOnHoldStart:E=!0}=s,{sendAudioChunk:R,endAudioStream:p,interrupt:T}=i.useRqmiiAgentContext(),c=r.useRef(null),u=r.useRef(null),[k,x]=r.useState(!1),[y,_]=r.useState(!1),[q,f]=r.useState(null),h=r.useCallback(async()=>{if(c.current)return!0;const n=new v;if(c.current=n,!n.supported){const l=new Error("AudioWorklet not supported in this browser");return f(l.message),o?.(l),!1}return n.events.on("audio_chunk",l=>{t?t(l):R(l)}),n.events.on("error",l=>{o?.(l)}),await n.start()?(_(!0),f(null),!0):(f("Failed to start capture"),c.current=null,!1)},[t,o,R]),m=r.useCallback(()=>{const n=c.current;return n?(c.current=null,n.stop(),n.destroy(),_(!1),!0):!1},[]),C=r.useCallback(()=>{const n=c.current;n&&(c.current=null,n.stop(),n.destroy(),_(!1))},[]),P=r.useCallback(async()=>h(),[h]),w=r.useCallback(({discard:n=!1}={})=>{const A=m();return!n&&A&&(e?e():p()),A},[p,e,m]),S=r.useCallback(()=>{u.current&&(clearTimeout(u.current),u.current=null),x(!0),u.current=setTimeout(()=>{E&&T(),h()},a)},[a,T,E,h]),d=r.useCallback(()=>{x(!1),u.current&&(clearTimeout(u.current),u.current=null),m()&&(e?e():p())},[p,e,m]);r.useEffect(()=>()=>{u.current&&(clearTimeout(u.current),u.current=null),C()},[C]);const b=r.useMemo(()=>({onPointerDown:n=>{n.preventDefault(),S()},onPointerUp:n=>{n.preventDefault(),d()},onPointerCancel:n=>{n.preventDefault(),d()},onPointerLeave:n=>{n.preventDefault(),d()}}),[S,d]);return{isPressing:k,isRecording:y,micError:q,startRecording:P,stopRecording:w,startPress:S,stopPress:d,eventHandlers:b}}function I(){const s=i.useRqmiiAgentContext(),t=s.events;return{state:{messages:s.messages,connectionState:s.connectionState,isConnected:s.isConnected,isSessionReady:s.isSessionReady,isAudioPlaying:s.isAudioPlaying,isAgentThinking:s.isAgentThinking,isAgentSpeaking:s.isAgentSpeaking,isToolExecuting:s.isToolExecuting,isSessionTerminated:s.isSessionTerminated,isSessionTerminating:s.isSessionTerminating,creditExhausted:s.creditExhausted,creditError:s.creditError,error:s.error,transcript:s.transcript,partialTranscript:s.partialTranscript,session:s.session,sessionState:s.sessionState},actions:{sendTextMessage:s.sendTextMessage,sendAudioChunk:s.sendAudioChunk,endAudioStream:s.endAudioStream,interrupt:s.interrupt,clearSessionHistory:s.clearSessionHistory,clearMessages:s.clearMessages,changeSessionLanguage:s.changeSessionLanguage,signalClientReady:s.signalClientReady,initializeSession:s.initializeSession,joinDesktopSession:s.joinDesktopSession,disconnect:s.disconnect,terminateSession:s.terminateSession,resumeAudioPlayback:s.resumeAudioPlayback,pauseAudioPlayback:s.pauseAudioPlayback,attachAudioElement:s.attachAudioElement},events:{onSessionReady:e=>t.on("session:ready",e),onSessionJoined:e=>t.on("session:joined",e),onSessionTerminated:e=>t.on("session:terminated",e),onSessionExpired:e=>t.on("session:expired",e),onMessageReceived:e=>t.on("message:received",e),onMessageSent:e=>t.on("message:sent",e),onAudioPlaying:e=>t.on("audio:playing",e),onAudioStopped:e=>t.on("audio:stopped",e),onAvatarSpeaking:e=>t.on("avatar:speaking",e),onAvatarSpeakingDone:e=>t.on("avatar:speaking_done",e),onStateChanged:e=>t.on("state:changed",e),onConnected:e=>t.on("connection:connected",e),onDisconnected:e=>t.on("connection:disconnected",e),onConnectionFailed:e=>t.on("connection:failed",e),onError:e=>t.on("error",e),onCreditsExhausted:e=>t.on("credits:exhausted",e),onTranscript:e=>t.on("transcript",e),onPartialTranscript:e=>t.on("partial_transcript",e),onInterrupted:e=>t.on("interrupted",e)},raw:{socket:s.socket,audioElement:s.audioElement}}}class U extends r.Component{constructor(t){super(t),this.state={hasError:!1,error:null}}static getDerivedStateFromError(t){return{hasError:!0,error:t}}componentDidCatch(t,e){this.props.onError?.(t,e)}reset=()=>{this.setState({hasError:!1,error:null})};render(){if(this.state.hasError){const{fallback:t}=this.props;return t?typeof t=="function"?this.state.error?t(this.state.error,this.reset):null:t:g.jsxs("div",{style:{padding:"24px",textAlign:"center",color:"#ef4444"},children:[g.jsx("h3",{children:"Something went wrong"}),g.jsx("p",{children:this.state.error?.message||"An unexpected error occurred"}),g.jsx("button",{onClick:this.reset,style:{marginTop:"12px",padding:"8px 16px",cursor:"pointer"},children:"Try again"})]})}return this.props.children}}i.suppressNoisyLogs();exports.AGENT_TYPES=i.AGENT_TYPES;exports.CLOUD_STREAM_STATE=i.CLOUD_STREAM_STATE;exports.CONNECTION_STATE=i.CONNECTION_STATE;exports.DEFAULT_PCM_OPTIONS=i.DEFAULT_PCM_OPTIONS;exports.EventEmitter=i.EventEmitter;exports.RqmiiAgentProvider=i.RqmiiAgentProvider;exports.RqmiiAgentRoom=i.RqmiiAgentRoom;exports.RqmiiCloudAvatarPlayer=i.RqmiiCloudAvatarPlayer;exports.SESSION_STATE=i.SESSION_STATE;exports.SOCKET_EVENTS=i.SOCKET_EVENTS;exports.useRqmiiAgentContext=i.useRqmiiAgentContext;exports.useRqmiiAvatar=i.useRqmiiAvatar;exports.useRqmiiConnection=i.useRqmiiConnection;exports.useRqmiiEvents=i.useRqmiiEvents;exports.useRqmiiMessages=i.useRqmiiMessages;exports.useRqmiiVAD=i.useRqmiiVAD;exports.useRqmiiVoice=i.useRqmiiVoice;exports.AudioCapture=v;exports.RqmiiErrorBoundary=U;exports.useRqmiiAgent=M;exports.useRqmiiAudioElement=O;exports.useRqmiiPressToTalk=F;exports.useRqmiiSDK=I;exports.useRqmiiSession=D;
50
50
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","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-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 { 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","useRqmiiSDK","h","RqmiiErrorBoundary","Component","props","error","info","fallback","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","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-sdk.ts","../src/components/RqmiiErrorBoundary.tsx","../src/index.ts"],"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 { 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","import { suppressNoisyLogs } from './core/utils/suppress-logs';\nsuppressNoisyLogs();\nexport { RqmiiAgentProvider, useRqmiiAgentContext } from './provider/RqmiiAgentProvider';\n\nexport {\n useRqmiiAgent,\n useRqmiiConnection,\n useRqmiiSession,\n useRqmiiMessages,\n useRqmiiVoice,\n useRqmiiAvatar,\n useRqmiiAudioElement,\n useRqmiiPressToTalk,\n useRqmiiVAD,\n useRqmiiEvents,\n useRqmiiSDK,\n} from './hooks';\n\nexport type { RqmiiSDKHandle, RqmiiEventListeners } from './hooks';\n\nexport { RqmiiAgentRoom } from './components/RqmiiAgentRoom';\nexport { RqmiiCloudAvatarPlayer } from './components/RqmiiCloudAvatarPlayer';\nexport { RqmiiErrorBoundary } from './components/RqmiiErrorBoundary';\n\nexport { AGENT_TYPES, SOCKET_EVENTS, CONNECTION_STATE, CLOUD_STREAM_STATE, SESSION_STATE, DEFAULT_PCM_OPTIONS } from './core/constants';\n\nexport type {\n AgentType,\n ConnectionState,\n SessionState,\n CloudStreamState,\n RqmiiSessionInfo,\n RqmiiMessage,\n PublicAgent,\n RqmiiPCMOptions,\n InitializeSessionArgs,\n JoinDesktopSessionArgs,\n RqmiiAgentProviderProps,\n RqmiiAgentContextValue,\n RqmiiState,\n EventType,\n EventHandlerMap,\n SessionData,\n TranscriptPayload,\n PartialTranscriptPayload,\n RqmiiAgentChatProps,\n RqmiiAgentChatPreviewProps,\n RqmiiAgentRoomProps,\n RqmiiCloudAvatarPlayerProps,\n UseRqmiiConnectionReturn,\n UseRqmiiMessagesReturn,\n UseRqmiiVoiceReturn,\n UseRqmiiAvatarReturn,\n UseRqmiiPressToTalkReturn,\n UseRqmiiVADReturn,\n UseRqmiiSessionStateReturn,\n AudioCaptureState,\n ClientToolHandler,\n} from './types';\n\nexport { AudioCapture } from './capture/capture';\n\nexport { EventEmitter } from './core/events/emitter';\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","useRqmiiSDK","h","RqmiiErrorBoundary","Component","props","error","info","fallback","jsxs","jsx","suppressNoisyLogs"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEzF,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAExI,YAAY,EACV,SAAS,EACT,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAEzF,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAExI,YAAY,EACV,SAAS,EACT,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,UAAU,EACV,SAAS,EACT,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,0BAA0B,EAC1B,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,EACxB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,0BAA0B,EAC1B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
- import { u as d } from "./RqmiiCloudAvatarPlayer-CzYyyu9R.js";
2
- import { A as Z, C as $, a as ee, D as te, b as se, R as ne, c as ie, d as re, S as oe, f as ae, g as ce, h as ue, i as le, j as de, k as pe, l as he } from "./RqmiiCloudAvatarPlayer-CzYyyu9R.js";
1
+ import { u as d, s as L } from "./RqmiiCloudAvatarPlayer-CXKmEFce.js";
2
+ import { A as $, C as ee, a as te, D as se, b as ne, R as ie, c as re, d as oe, S as ae, f as ce, g as ue, h as le, i as de, j as pe, k as he, l as me } from "./RqmiiCloudAvatarPlayer-CXKmEFce.js";
3
3
  import { jsxs as O, jsx as A } from "react/jsx-runtime";
4
- import { useEffect as C, useRef as y, useState as E, useCallback as u, useMemo as L, Component as j } from "react";
5
- function V() {
4
+ import { useEffect as C, useRef as y, useState as E, useCallback as u, useMemo as j, Component as z } from "react";
5
+ function B() {
6
6
  return d();
7
7
  }
8
- function B() {
8
+ function K() {
9
9
  const s = d();
10
10
  return {
11
11
  sessionState: s.sessionState,
@@ -16,7 +16,7 @@ function B() {
16
16
  isToolExecuting: s.isToolExecuting
17
17
  };
18
18
  }
19
- function K(s) {
19
+ function G(s) {
20
20
  const { attachAudioElement: t, resumeAudioPlayback: e } = d();
21
21
  C(() => {
22
22
  if (!s?.current) return;
@@ -29,7 +29,7 @@ function K(s) {
29
29
  };
30
30
  }, [t, s, e]);
31
31
  }
32
- class z {
32
+ class F {
33
33
  listeners = /* @__PURE__ */ new Map();
34
34
  on(t, e) {
35
35
  return this.listeners.has(t) || this.listeners.set(t, /* @__PURE__ */ new Set()), this.listeners.get(t).add(e), () => this.off(t, e);
@@ -50,7 +50,7 @@ class z {
50
50
  this.listeners.clear();
51
51
  }
52
52
  }
53
- const F = {
53
+ const N = {
54
54
  inputSampleRate: 48e3,
55
55
  frameSizeMs: 20
56
56
  }, U = `
@@ -107,11 +107,11 @@ class I {
107
107
  _ctx = null;
108
108
  _node = null;
109
109
  _stream = null;
110
- _events = new z();
110
+ _events = new F();
111
111
  _options;
112
112
  supported;
113
113
  constructor(t) {
114
- this._options = { ...F, ...t }, this.supported = typeof AudioWorkletNode < "u", this.supported || (this._state = "unsupported");
114
+ this._options = { ...N, ...t }, this.supported = typeof AudioWorkletNode < "u", this.supported || (this._state = "unsupported");
115
115
  }
116
116
  get state() {
117
117
  return this._state;
@@ -159,7 +159,7 @@ class I {
159
159
  this.events.removeAllListeners(), this.stop();
160
160
  }
161
161
  }
162
- function G(s = {}) {
162
+ function J(s = {}) {
163
163
  const {
164
164
  onAudioChunk: t,
165
165
  onAudioEnd: e,
@@ -200,7 +200,7 @@ function G(s = {}) {
200
200
  C(() => () => {
201
201
  o.current && (clearTimeout(o.current), o.current = null), R();
202
202
  }, [R]);
203
- const q = L(
203
+ const q = j(
204
204
  () => ({
205
205
  onPointerDown: (n) => {
206
206
  n.preventDefault(), g();
@@ -228,7 +228,7 @@ function G(s = {}) {
228
228
  eventHandlers: q
229
229
  };
230
230
  }
231
- function J() {
231
+ function Y() {
232
232
  const s = d(), t = s.events;
233
233
  return {
234
234
  state: {
@@ -294,7 +294,7 @@ function J() {
294
294
  }
295
295
  };
296
296
  }
297
- class Y extends j {
297
+ class Q extends z {
298
298
  constructor(t) {
299
299
  super(t), this.state = { hasError: !1, error: null };
300
300
  }
@@ -319,30 +319,31 @@ class Y extends j {
319
319
  return this.props.children;
320
320
  }
321
321
  }
322
+ L();
322
323
  export {
323
- Z as AGENT_TYPES,
324
+ $ as AGENT_TYPES,
324
325
  I as AudioCapture,
325
- $ as CLOUD_STREAM_STATE,
326
- ee as CONNECTION_STATE,
327
- te as DEFAULT_PCM_OPTIONS,
328
- se as EventEmitter,
329
- ne as RqmiiAgentProvider,
330
- ie as RqmiiAgentRoom,
331
- re as RqmiiCloudAvatarPlayer,
332
- Y as RqmiiErrorBoundary,
333
- oe as SESSION_STATE,
334
- ae as SOCKET_EVENTS,
335
- V as useRqmiiAgent,
326
+ ee as CLOUD_STREAM_STATE,
327
+ te as CONNECTION_STATE,
328
+ se as DEFAULT_PCM_OPTIONS,
329
+ ne as EventEmitter,
330
+ ie as RqmiiAgentProvider,
331
+ re as RqmiiAgentRoom,
332
+ oe as RqmiiCloudAvatarPlayer,
333
+ Q as RqmiiErrorBoundary,
334
+ ae as SESSION_STATE,
335
+ ce as SOCKET_EVENTS,
336
+ B as useRqmiiAgent,
336
337
  d as useRqmiiAgentContext,
337
- K as useRqmiiAudioElement,
338
- ce as useRqmiiAvatar,
339
- ue as useRqmiiConnection,
340
- le as useRqmiiEvents,
341
- de as useRqmiiMessages,
342
- G as useRqmiiPressToTalk,
343
- J as useRqmiiSDK,
344
- B as useRqmiiSession,
345
- pe as useRqmiiVAD,
346
- he as useRqmiiVoice
338
+ G as useRqmiiAudioElement,
339
+ ue as useRqmiiAvatar,
340
+ le as useRqmiiConnection,
341
+ de as useRqmiiEvents,
342
+ pe as useRqmiiMessages,
343
+ J as useRqmiiPressToTalk,
344
+ Y as useRqmiiSDK,
345
+ K as useRqmiiSession,
346
+ he as useRqmiiVAD,
347
+ me as useRqmiiVoice
347
348
  };
348
349
  //# sourceMappingURL=index.js.map
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/capture/capture.ts","../src/hooks/use-rqmii-press-to-talk.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 { 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","useRqmiiSDK","h","RqmiiErrorBoundary","Component","props","error","info","fallback","jsxs","jsx"],"mappings":";;;;AAEO,SAASA,IAAgB;AAC9B,SAAOC,EAAA;AACT;ACFO,SAASC,IAAkB;AAChC,QAAMC,IAAMF,EAAA;AACZ,SAAO;AAAA,IACL,cAAcE,EAAI;AAAA,IAClB,qBAAqBA,EAAI;AAAA,IACzB,sBAAsBA,EAAI;AAAA,IAC1B,iBAAiBA,EAAI;AAAA,IACrB,iBAAiBA,EAAI;AAAA,IACrB,iBAAiBA,EAAI;AAAA,EAAA;AAEzB;ACTO,SAASC,EAAqBC,GAAoD;AACvF,QAAM,EAAE,oBAAAC,GAAoB,qBAAAC,EAAA,IAAwBN,EAAA;AAEpD,EAAAO,EAAU,MAAM;AACd,QAAI,CAACH,GAAU,QAAS;AAExB,IAAAC,EAAmBD,EAAS,OAAO;AACnC,UAAMI,IAAS,MAAM;AACnB,MAAKF,EAAA;AAAA,IACP,GAEMG,IAAOL,EAAS;AACtB,WAAAK,EAAK,iBAAiB,SAASD,CAAM,GACrCC,EAAK,iBAAiB,cAAcD,CAAM,GAEnC,MAAM;AACX,MAAAC,EAAK,oBAAoB,SAASD,CAAM,GACxCC,EAAK,oBAAoB,cAAcD,CAAM,GAC7CH,EAAmB,IAAI;AAAA,IACzB;AAAA,EACF,GAAG,CAACA,GAAoBD,GAAUE,CAAmB,CAAC;AACxD;ACfA,MAAMI,EAAoB;AAAA,EAChB,gCAAgB,IAAA;AAAA,EAExB,GAAGC,GAAeC,GAAqC;AACrD,WAAK,KAAK,UAAU,IAAID,CAAK,KAC3B,KAAK,UAAU,IAAIA,GAAO,oBAAI,KAAK,GAErC,KAAK,UAAU,IAAIA,CAAK,EAAG,IAAIC,CAAO,GAC/B,MAAM,KAAK,IAAID,GAAOC,CAAO;AAAA,EACtC;AAAA,EAEA,IAAID,GAAeC,GAA+B;AAChD,SAAK,UAAU,IAAID,CAAK,GAAG,OAAOC,CAAO;AAAA,EAC3C;AAAA,EAEA,KAAKD,GAAeE,GAAyB;AAC3C,UAAMC,IAAW,KAAK,UAAU,IAAIH,CAAK;AACzC,QAAKG;AACL,iBAAWF,KAAWE;AACpB,YAAI;AAAE,UAAAF,EAAQC,CAAO;AAAA,QAAG,QAAQ;AAAA,QAAgB;AAAA,EAEpD;AAAA,EAEA,qBAA2B;AACzB,SAAK,UAAU,MAAA;AAAA,EACjB;AACF;AAEA,MAAME,IAA4C;AAAA,EAChD,iBAAiB;AAAA,EACjB,aAAa;AACf,GAEMC,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkDpB,MAAMC,EAAa;AAAA,EAChB,SAA4B;AAAA,EAC5B,OAA4B;AAAA,EAC5B,QAAiC;AAAA,EACjC,UAA8B;AAAA,EAC9B,UAAU,IAAIP,EAAA;AAAA,EACd;AAAA,EAEC;AAAA,EAET,YAAYQ,GAA0B;AACpC,SAAK,WAAW,EAAE,GAAGH,GAAiB,GAAGG,EAAA,GACzC,KAAK,YAAY,OAAO,mBAAqB,KACxC,KAAK,cACR,KAAK,SAAS;AAAA,EAElB;AAAA,EAEA,IAAI,QAA2B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,SAA8B;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAA0B;AAC9B,QAAI,CAAC,KAAK;AACR,kBAAK,SAAS,eACP;AAGT,QAAI,KAAK,WAAW,YAAa,QAAO;AAExC,SAAK,SAAS;AAEd,QAAI;AACF,WAAK,UAAU,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,IAAM;AAAA,IAC1E,SAASC,GAAK;AACZ,kBAAK,SAAS,SACd,KAAK,QAAQ,KAAK,SAASA,CAAG,GACvB;AAAA,IACT;AAEA,QAAI;AACF,MAAI,KAAK,MAAM,UAAU,eACvB,MAAM,KAAK,KAAK,OAAA,GAGlB,KAAK,OAAO,IAAI,aAAa,EAAE,YAAY,KAAK,SAAS,iBAAiB;AAE1E,YAAMC,IAAO,IAAI,KAAK,CAACJ,CAAkB,GAAG,EAAE,MAAM,0BAA0B,GACxEK,IAAe,IAAI,gBAAgBD,CAAI;AAC7C,YAAM,KAAK,KAAK,aAAa,UAAUC,CAAY,GACnD,IAAI,gBAAgBA,CAAY;AAEhC,YAAMC,IAAS,KAAK,KAAK,wBAAwB,KAAK,OAAO;AAE7D,kBAAK,QAAQ,IAAI,iBAAiB,KAAK,MAAM,yBAAyB;AAAA,QACpE,kBAAkB;AAAA,UAChB,iBAAiB,KAAK,SAAS;AAAA,UAC/B,WAAY,KAAK,SAAS,kBAAkB,KAAK,SAAS,cAAe;AAAA,QAAA;AAAA,MAC3E,CACD,GAED,KAAK,MAAM,KAAK,YAAY,CAACC,MAAkC;AAC7D,aAAK,QAAQ,KAAK,eAAe,IAAI,WAAWA,EAAG,IAAI,CAAC;AAAA,MAC1D,GAEAD,EAAO,QAAQ,KAAK,KAAK,GAEzB,KAAK,SAAS,aACd,KAAK,QAAQ,KAAK,iBAAiB,KAAK,MAAM,GAE1C,KAAK,KAAK,UAAU,eACtB,MAAM,KAAK,KAAK,OAAA,GAGX;AAAA,IACT,SAASH,GAAK;AACZ,kBAAK,SAAS,SACd,KAAK,QAAQ,KAAK,SAASA,CAAG,GAE1B,KAAK,YACP,KAAK,QAAQ,YAAY,QAAQ,CAACK,MAAMA,EAAE,MAAM,GAChD,KAAK,UAAU,OAGV;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAa;AACX,IAAI,KAAK,UACP,KAAK,MAAM,WAAA,GACX,KAAK,QAAQ,OAGX,KAAK,YACP,KAAK,QAAQ,YAAY,QAAQ,CAAC,MAAM,EAAE,MAAM,GAChD,KAAK,UAAU,OAGb,KAAK,QAAQ,KAAK,KAAK,UAAU,aACnC,KAAK,KAAK,MAAA,GACV,KAAK,OAAO,OAGd,KAAK,SAAS,QACd,KAAK,QAAQ,KAAK,iBAAiB,KAAK,MAAM;AAAA,EAChD;AAAA,EAEA,MAAM,SAAwB;AAC5B,IAAI,KAAK,MAAM,UAAU,gBACvB,MAAM,KAAK,KAAK,OAAA,GAChB,KAAK,SAAS,aACd,KAAK,QAAQ,KAAK,iBAAiB,KAAK,MAAM;AAAA,EAElD;AAAA,EAEA,MAAM,QAAuB;AAC3B,IAAI,KAAK,MAAM,UAAU,cACvB,MAAM,KAAK,KAAK,QAAA,GAChB,KAAK,SAAS,aACd,KAAK,QAAQ,KAAK,iBAAiB,KAAK,MAAM;AAAA,EAElD;AAAA,EAEA,UAAgB;AACd,SAAK,OAAO,mBAAA,GACZ,KAAK,KAAA;AAAA,EACP;AACF;ACnNO,SAASC,EAAoBP,IAAsC,IAA+B;AACvG,QAAM;AAAA,IACJ,cAAAQ;AAAA,IACA,YAAAC;AAAA,IACA,SAAAC;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,sBAAAC,IAAuB;AAAA,EAAA,IACrBZ,GAEE,EAAE,gBAAAa,GAAgB,gBAAAC,GAAgB,WAAAC,EAAA,IAAcjC,EAAA,GAEhDkC,IAAaC,EAA4B,IAAI,GAC7CC,IAAeD,EAA6C,IAAI,GAEhE,CAACE,GAAYC,CAAa,IAAIC,EAAS,EAAK,GAC5C,CAACC,GAAaC,CAAc,IAAIF,EAAS,EAAK,GAC9C,CAACG,GAAUC,CAAW,IAAIJ,EAAwB,IAAI,GAEtDK,IAAkBC,EAAY,YAA8B;AAChE,QAAIX,EAAW,QAAS,QAAO;AAE/B,UAAMY,IAAU,IAAI7B,EAAA;AAGpB,QAFAiB,EAAW,UAAUY,GAEjB,CAACA,EAAQ,WAAW;AACtB,YAAM3B,IAAM,IAAI,MAAM,4CAA4C;AAClE,aAAAwB,EAAYxB,EAAI,OAAO,GACvBS,IAAUT,CAAG,GACN;AAAA,IACT;AAYA,WAVA2B,EAAQ,OAAO,GAAG,eAAe,CAACC,MAAmB;AACnD,MAAIrB,MAA2BqB,CAAmB,MAC9BA,CAAK;AAAA,IAC3B,CAAC,GAEDD,EAAQ,OAAO,GAAG,SAAS,CAAC3B,MAAiB;AAC3C,MAAAS,IAAUT,CAAG;AAAA,IACf,CAAC,GAEU,MAAM2B,EAAQ,MAAA,KAOzBL,EAAe,EAAI,GACnBE,EAAY,IAAI,GACT,OAPLA,EAAY,yBAAyB,GACrCT,EAAW,UAAU,MACd;AAAA,EAMX,GAAG,CAACR,GAAcE,GAASG,CAAc,CAAC,GAEpCiB,IAAiBH,EAAY,MAAe;AAChD,UAAMC,IAAUZ,EAAW;AAC3B,WAAKY,KAELZ,EAAW,UAAU,MACrBY,EAAQ,KAAA,GACRA,EAAQ,QAAA,GACRL,EAAe,EAAK,GACb,MANc;AAAA,EAOvB,GAAG,CAAA,CAAE,GAECQ,IAAUJ,EAAY,MAAM;AAChC,UAAMC,IAAUZ,EAAW;AAC3B,IAAKY,MACLZ,EAAW,UAAU,MACrBY,EAAQ,KAAA,GACRA,EAAQ,QAAA,GACRL,EAAe,EAAK;AAAA,EACtB,GAAG,CAAA,CAAE,GAECS,IAAiBL,EAAY,YAC1BD,EAAA,GACN,CAACA,CAAe,CAAC,GAEdO,IAAgBN;AAAA,IACpB,CAAC,EAAE,SAAAO,IAAU,GAAA,IAAiC,OAAgB;AAC5D,YAAMC,IAAKL,EAAA;AACX,aAAI,CAACI,KAAWC,MACV1B,IAAYA,EAAA,IACXK,EAAA,IAEAqB;AAAA,IACT;AAAA,IACA,CAACrB,GAAgBL,GAAYqB,CAAc;AAAA,EAAA,GAGvCM,IAAaT,EAAY,MAAM;AACnC,IAAIT,EAAa,YACf,aAAaA,EAAa,OAAO,GACjCA,EAAa,UAAU,OAGzBE,EAAc,EAAI,GAElBF,EAAa,UAAU,WAAW,MAAM;AACtC,MAAIN,KACFG,EAAA,GAEGW,EAAA;AAAA,IACP,GAAGf,CAAW;AAAA,EAChB,GAAG,CAACA,GAAaI,GAAWH,GAAsBc,CAAe,CAAC,GAE5DW,IAAYV,EAAY,MAAM;AAClC,IAAAP,EAAc,EAAK,GACfF,EAAa,YACf,aAAaA,EAAa,OAAO,GACjCA,EAAa,UAAU,OAGdY,EAAA,MAELrB,IAAYA,EAAA,IACXK,EAAA;AAAA,EAET,GAAG,CAACA,GAAgBL,GAAYqB,CAAc,CAAC;AAE/C,EAAAzC,EAAU,MACD,MAAM;AACX,IAAI6B,EAAa,YACf,aAAaA,EAAa,OAAO,GACjCA,EAAa,UAAU,OAEzBa,EAAA;AAAA,EACF,GACC,CAACA,CAAO,CAAC;AAEZ,QAAMO,IAAgBC;AAAA,IACpB,OAAO;AAAA,MACL,eAAe,CAACC,MAA0B;AACxC,QAAAA,EAAE,eAAA,GACFJ,EAAA;AAAA,MACF;AAAA,MACA,aAAa,CAACI,MAA0B;AACtC,QAAAA,EAAE,eAAA,GACFH,EAAA;AAAA,MACF;AAAA,MACA,iBAAiB,CAACG,MAA0B;AAC1C,QAAAA,EAAE,eAAA,GACFH,EAAA;AAAA,MACF;AAAA,MACA,gBAAgB,CAACG,MAA0B;AACzC,QAAAA,EAAE,eAAA,GACFH,EAAA;AAAA,MACF;AAAA,IAAA;AAAA,IAEF,CAACD,GAAYC,CAAS;AAAA,EAAA;AAGxB,SAAO;AAAA,IACL,YAAAlB;AAAA,IACA,aAAAG;AAAA,IACA,UAAAE;AAAA,IACA,gBAAAQ;AAAA,IACA,eAAAC;AAAA,IACA,YAAAG;AAAA,IACA,WAAAC;AAAA,IACA,eAAAC;AAAA,EAAA;AAEJ;ACtGO,SAASG,IAA8B;AAC5C,QAAMzD,IAAMF,EAAA,GACNuB,IAAKrB,EAAI;AAEf,SAAO;AAAA,IACL,OAAO;AAAA,MACL,UAAUA,EAAI;AAAA,MACd,iBAAiBA,EAAI;AAAA,MACrB,aAAaA,EAAI;AAAA,MACjB,gBAAgBA,EAAI;AAAA,MACpB,gBAAgBA,EAAI;AAAA,MACpB,iBAAiBA,EAAI;AAAA,MACrB,iBAAiBA,EAAI;AAAA,MACrB,iBAAiBA,EAAI;AAAA,MACrB,qBAAqBA,EAAI;AAAA,MACzB,sBAAsBA,EAAI;AAAA,MAC1B,iBAAiBA,EAAI;AAAA,MACrB,aAAaA,EAAI;AAAA,MACjB,OAAOA,EAAI;AAAA,MACX,YAAYA,EAAI;AAAA,MAChB,mBAAmBA,EAAI;AAAA,MACvB,SAASA,EAAI;AAAA,MACb,cAAcA,EAAI;AAAA,IAAA;AAAA,IAEpB,SAAS;AAAA,MACP,iBAAiBA,EAAI;AAAA,MACrB,gBAAgBA,EAAI;AAAA,MACpB,gBAAgBA,EAAI;AAAA,MACpB,WAAWA,EAAI;AAAA,MACf,qBAAqBA,EAAI;AAAA,MACzB,eAAeA,EAAI;AAAA,MACnB,uBAAuBA,EAAI;AAAA,MAC3B,mBAAmBA,EAAI;AAAA,MACvB,mBAAmBA,EAAI;AAAA,MACvB,oBAAoBA,EAAI;AAAA,MACxB,YAAYA,EAAI;AAAA,MAChB,kBAAkBA,EAAI;AAAA,MACtB,qBAAqBA,EAAI;AAAA,MACzB,oBAAoBA,EAAI;AAAA,MACxB,oBAAoBA,EAAI;AAAA,IAAA;AAAA,IAE1B,QAAQ;AAAA,MACN,gBAAgB,CAAC0D,MAAMrC,EAAG,GAAG,iBAAiBqC,CAAC;AAAA,MAC/C,iBAAiB,CAACA,MAAMrC,EAAG,GAAG,kBAAkBqC,CAAC;AAAA,MACjD,qBAAqB,CAACA,MAAMrC,EAAG,GAAG,sBAAsBqC,CAAC;AAAA,MACzD,kBAAkB,CAACA,MAAMrC,EAAG,GAAG,mBAAmBqC,CAAC;AAAA,MACnD,mBAAmB,CAACA,MAAMrC,EAAG,GAAG,oBAAoBqC,CAAC;AAAA,MACrD,eAAe,CAACA,MAAMrC,EAAG,GAAG,gBAAgBqC,CAAC;AAAA,MAC7C,gBAAgB,CAACA,MAAMrC,EAAG,GAAG,iBAAiBqC,CAAC;AAAA,MAC/C,gBAAgB,CAACA,MAAMrC,EAAG,GAAG,iBAAiBqC,CAAC;AAAA,MAC/C,kBAAkB,CAACA,MAAMrC,EAAG,GAAG,mBAAmBqC,CAAC;AAAA,MACnD,sBAAsB,CAACA,MAAMrC,EAAG,GAAG,wBAAwBqC,CAAC;AAAA,MAC5D,gBAAgB,CAACA,MAAMrC,EAAG,GAAG,iBAAiBqC,CAAC;AAAA,MAC/C,aAAa,CAACA,MAAMrC,EAAG,GAAG,wBAAwBqC,CAAC;AAAA,MACnD,gBAAgB,CAACA,MAAMrC,EAAG,GAAG,2BAA2BqC,CAAC;AAAA,MACzD,oBAAoB,CAACA,MAAMrC,EAAG,GAAG,qBAAqBqC,CAAC;AAAA,MACvD,SAAS,CAACA,MAAMrC,EAAG,GAAG,SAASqC,CAAC;AAAA,MAChC,oBAAoB,CAACA,MAAMrC,EAAG,GAAG,qBAAqBqC,CAAC;AAAA,MACvD,cAAc,CAACA,MAAMrC,EAAG,GAAG,cAAcqC,CAAC;AAAA,MAC1C,qBAAqB,CAACA,MAAMrC,EAAG,GAAG,sBAAsBqC,CAAC;AAAA,MACzD,eAAe,CAACA,MAAMrC,EAAG,GAAG,eAAeqC,CAAC;AAAA,IAAA;AAAA,IAE9C,KAAK;AAAA,MACH,QAAQ1D,EAAI;AAAA,MACZ,cAAcA,EAAI;AAAA,IAAA;AAAA,EACpB;AAEJ;AC7HO,MAAM2D,UAA2BC,EAA4D;AAAA,EAClG,YAAYC,GAAgC;AAC1C,UAAMA,CAAK,GACX,KAAK,QAAQ,EAAE,UAAU,IAAO,OAAO,KAAA;AAAA,EACzC;AAAA,EAEA,OAAO,yBAAyBC,GAAuC;AACrE,WAAO,EAAE,UAAU,IAAM,OAAAA,EAAA;AAAA,EAC3B;AAAA,EAEA,kBAAkBA,GAAcC,GAAiB;AAC/C,SAAK,MAAM,UAAUD,GAAOC,CAAI;AAAA,EAClC;AAAA,EAEA,QAAQ,MAAM;AACZ,SAAK,SAAS,EAAE,UAAU,IAAO,OAAO,MAAM;AAAA,EAChD;AAAA,EAEA,SAAoB;AAClB,QAAI,KAAK,MAAM,UAAU;AACvB,YAAM,EAAE,UAAAC,MAAa,KAAK;AAC1B,aAAIA,IACE,OAAOA,KAAa,aACf,KAAK,MAAM,QAAQA,EAAS,KAAK,MAAM,OAAO,KAAK,KAAK,IAAI,OAE9DA,IAGP,gBAAAC,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,WAAW,UAAU,OAAO,UAAA,GACzD,UAAA;AAAA,QAAA,gBAAAC,EAAC,QAAG,UAAA,uBAAA,CAAoB;AAAA,0BACvB,KAAA,EAAG,UAAA,KAAK,MAAM,OAAO,WAAW,gCAA+B;AAAA,QAChE,gBAAAA,EAAC,UAAA,EAAO,SAAS,KAAK,OAAO,OAAO,EAAE,WAAW,QAAQ,SAAS,YAAY,QAAQ,UAAA,GAAa,UAAA,YAAA,CAEnG;AAAA,MAAA,GACF;AAAA,IAEJ;AACA,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;"}
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-sdk.ts","../src/components/RqmiiErrorBoundary.tsx","../src/index.ts"],"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 { 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","import { suppressNoisyLogs } from './core/utils/suppress-logs';\nsuppressNoisyLogs();\nexport { RqmiiAgentProvider, useRqmiiAgentContext } from './provider/RqmiiAgentProvider';\n\nexport {\n useRqmiiAgent,\n useRqmiiConnection,\n useRqmiiSession,\n useRqmiiMessages,\n useRqmiiVoice,\n useRqmiiAvatar,\n useRqmiiAudioElement,\n useRqmiiPressToTalk,\n useRqmiiVAD,\n useRqmiiEvents,\n useRqmiiSDK,\n} from './hooks';\n\nexport type { RqmiiSDKHandle, RqmiiEventListeners } from './hooks';\n\nexport { RqmiiAgentRoom } from './components/RqmiiAgentRoom';\nexport { RqmiiCloudAvatarPlayer } from './components/RqmiiCloudAvatarPlayer';\nexport { RqmiiErrorBoundary } from './components/RqmiiErrorBoundary';\n\nexport { AGENT_TYPES, SOCKET_EVENTS, CONNECTION_STATE, CLOUD_STREAM_STATE, SESSION_STATE, DEFAULT_PCM_OPTIONS } from './core/constants';\n\nexport type {\n AgentType,\n ConnectionState,\n SessionState,\n CloudStreamState,\n RqmiiSessionInfo,\n RqmiiMessage,\n PublicAgent,\n RqmiiPCMOptions,\n InitializeSessionArgs,\n JoinDesktopSessionArgs,\n RqmiiAgentProviderProps,\n RqmiiAgentContextValue,\n RqmiiState,\n EventType,\n EventHandlerMap,\n SessionData,\n TranscriptPayload,\n PartialTranscriptPayload,\n RqmiiAgentChatProps,\n RqmiiAgentChatPreviewProps,\n RqmiiAgentRoomProps,\n RqmiiCloudAvatarPlayerProps,\n UseRqmiiConnectionReturn,\n UseRqmiiMessagesReturn,\n UseRqmiiVoiceReturn,\n UseRqmiiAvatarReturn,\n UseRqmiiPressToTalkReturn,\n UseRqmiiVADReturn,\n UseRqmiiSessionStateReturn,\n AudioCaptureState,\n ClientToolHandler,\n} from './types';\n\nexport { AudioCapture } from './capture/capture';\n\nexport { EventEmitter } from './core/events/emitter';\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","useRqmiiSDK","h","RqmiiErrorBoundary","Component","props","error","info","fallback","jsxs","jsx","suppressNoisyLogs"],"mappings":"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"}
@@ -1 +1 @@
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,2CAqVzB;AAED,wBAAgB,oBAAoB,IAAI,sBAAsB,CAI7D"}
1
+ {"version":3,"file":"RqmiiAgentProvider.d.ts","sourceRoot":"","sources":["../../src/provider/RqmiiAgentProvider.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,uBAAuB,EACvB,sBAAsB,EAOvB,MAAM,UAAU,CAAC;AAIlB,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAA4B,EAC5B,OAAiC,EACjC,WAAkB,EAClB,UAAU,EACV,KAAa,EACb,wBAA6B,EAC7B,eAAuB,EACvB,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,EACP,YAAY,GACb,EAAE,uBAAuB,2CAyVzB;AAED,wBAAgB,oBAAoB,IAAI,sBAAsB,CAI7D"}
@@ -121,8 +121,8 @@ export interface SessionData {
121
121
  }
122
122
  export interface RqmiiAgentProviderProps {
123
123
  children?: React.ReactNode;
124
- wsUrl: string;
125
- restUrl: string;
124
+ wsUrl?: string;
125
+ restUrl?: string;
126
126
  enableAudio?: boolean;
127
127
  pcmOptions?: RqmiiPCMOptions;
128
128
  debug?: boolean;