@rqmii_immersive/agent-react-sdk 4.0.1 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/RqmiiCloudAvatarPlayer-BI7Uz7DP.cjs +2918 -0
- package/dist/RqmiiCloudAvatarPlayer-BI7Uz7DP.cjs.map +1 -0
- package/dist/{RqmiiCloudAvatarPlayer-CESlcAGy.js → RqmiiCloudAvatarPlayer-D5aXKUuO.js} +6569 -6932
- package/dist/RqmiiCloudAvatarPlayer-D5aXKUuO.js.map +1 -0
- package/dist/agent-react-sdk.css +1 -1
- package/dist/capture/capture.d.ts +32 -0
- package/dist/capture/capture.d.ts.map +1 -0
- package/dist/components/RqmiiAgentRoom.d.ts +1 -1
- package/dist/components/RqmiiAgentRoom.d.ts.map +1 -1
- package/dist/core/constants.d.ts +3 -13
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/managers/session.d.ts +10 -1
- package/dist/core/managers/session.d.ts.map +1 -1
- package/dist/core/state/reducer.d.ts.map +1 -1
- package/dist/core/state/types.d.ts +3 -6
- package/dist/core/state/types.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-connection.d.ts +10 -1
- package/dist/hooks/use-rqmii-connection.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-messages.d.ts +2 -0
- package/dist/hooks/use-rqmii-messages.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-press-to-talk.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-sdk.d.ts +0 -2
- package/dist/hooks/use-rqmii-sdk.d.ts.map +1 -1
- package/dist/hooks/use-rqmii-vad.d.ts.map +1 -1
- package/dist/index.cjs +49 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +297 -218
- package/dist/index.js.map +1 -1
- package/dist/provider/RqmiiAgentProvider.d.ts +1 -1
- package/dist/provider/RqmiiAgentProvider.d.ts.map +1 -1
- package/dist/provider/socket-handlers.d.ts +5 -22
- package/dist/provider/socket-handlers.d.ts.map +1 -1
- package/dist/provider/use-manager-lifecycle.d.ts +11 -27
- package/dist/provider/use-manager-lifecycle.d.ts.map +1 -1
- package/dist/types/index.d.ts +84 -31
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/Orb.d.ts.map +1 -1
- package/dist/ui/RqmiiAgentChat.d.ts +1 -1
- package/dist/ui/RqmiiAgentChat.d.ts.map +1 -1
- package/dist/ui/agent-data.d.ts +20 -1
- package/dist/ui/agent-data.d.ts.map +1 -1
- package/dist/ui/agent-data.test.d.ts +2 -0
- package/dist/ui/agent-data.test.d.ts.map +1 -0
- package/dist/ui/chat/ChatBox.d.ts +1 -1
- package/dist/ui/chat/ChatBox.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-avatar.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-content.d.ts +20 -10
- package/dist/ui/chat/chat-box-content.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-content.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-content.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-shared.d.ts +20 -0
- package/dist/ui/chat/chat-box-shared.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-shared.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-shared.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-text-and-voice.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-text-and-voice.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-text-and-voice.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-text.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-text.test.d.ts +2 -0
- package/dist/ui/chat/chat-box-text.test.d.ts.map +1 -0
- package/dist/ui/chat/chat-box-types.d.ts +34 -1
- package/dist/ui/chat/chat-box-types.d.ts.map +1 -1
- package/dist/ui/chat/chat-box-voice.d.ts.map +1 -1
- package/dist/ui/chat/components.d.ts +3 -2
- package/dist/ui/chat/components.d.ts.map +1 -1
- package/dist/ui/chat/consent-dialog.d.ts +10 -0
- package/dist/ui/chat/consent-dialog.d.ts.map +1 -0
- package/dist/ui/chat/feedback.d.ts +21 -0
- package/dist/ui/chat/feedback.d.ts.map +1 -0
- package/dist/ui/chat/panels.d.ts +50 -7
- package/dist/ui/chat/panels.d.ts.map +1 -1
- package/dist/ui/chat/primitives.d.ts +29 -2
- package/dist/ui/chat/primitives.d.ts.map +1 -1
- package/dist/ui/chat/utils.d.ts +10 -0
- package/dist/ui/chat/utils.d.ts.map +1 -1
- package/dist/ui/enable-audio.test.d.ts +2 -0
- package/dist/ui/enable-audio.test.d.ts.map +1 -0
- package/dist/ui/languages/index.d.ts +5 -0
- package/dist/ui/languages/index.d.ts.map +1 -0
- package/dist/ui/languages/list.d.ts +7 -0
- package/dist/ui/languages/list.d.ts.map +1 -0
- package/dist/ui/languages/text.d.ts +3 -0
- package/dist/ui/languages/text.d.ts.map +1 -0
- package/dist/ui/languages/translations/af.d.ts +4 -0
- package/dist/ui/languages/translations/af.d.ts.map +1 -0
- package/dist/ui/languages/translations/ar.d.ts +4 -0
- package/dist/ui/languages/translations/ar.d.ts.map +1 -0
- package/dist/ui/languages/translations/az.d.ts +4 -0
- package/dist/ui/languages/translations/az.d.ts.map +1 -0
- package/dist/ui/languages/translations/be.d.ts +4 -0
- package/dist/ui/languages/translations/be.d.ts.map +1 -0
- package/dist/ui/languages/translations/bg.d.ts +4 -0
- package/dist/ui/languages/translations/bg.d.ts.map +1 -0
- package/dist/ui/languages/translations/bn.d.ts +4 -0
- package/dist/ui/languages/translations/bn.d.ts.map +1 -0
- package/dist/ui/languages/translations/bs.d.ts +4 -0
- package/dist/ui/languages/translations/bs.d.ts.map +1 -0
- package/dist/ui/languages/translations/ca.d.ts +4 -0
- package/dist/ui/languages/translations/ca.d.ts.map +1 -0
- package/dist/ui/languages/translations/cs.d.ts +4 -0
- package/dist/ui/languages/translations/cs.d.ts.map +1 -0
- package/dist/ui/languages/translations/cy.d.ts +4 -0
- package/dist/ui/languages/translations/cy.d.ts.map +1 -0
- package/dist/ui/languages/translations/da.d.ts +4 -0
- package/dist/ui/languages/translations/da.d.ts.map +1 -0
- package/dist/ui/languages/translations/de.d.ts +4 -0
- package/dist/ui/languages/translations/de.d.ts.map +1 -0
- package/dist/ui/languages/translations/el.d.ts +4 -0
- package/dist/ui/languages/translations/el.d.ts.map +1 -0
- package/dist/ui/languages/translations/en.d.ts +4 -0
- package/dist/ui/languages/translations/en.d.ts.map +1 -0
- package/dist/ui/languages/translations/es.d.ts +4 -0
- package/dist/ui/languages/translations/es.d.ts.map +1 -0
- package/dist/ui/languages/translations/et.d.ts +4 -0
- package/dist/ui/languages/translations/et.d.ts.map +1 -0
- package/dist/ui/languages/translations/eu.d.ts +4 -0
- package/dist/ui/languages/translations/eu.d.ts.map +1 -0
- package/dist/ui/languages/translations/fa.d.ts +4 -0
- package/dist/ui/languages/translations/fa.d.ts.map +1 -0
- package/dist/ui/languages/translations/fi.d.ts +4 -0
- package/dist/ui/languages/translations/fi.d.ts.map +1 -0
- package/dist/ui/languages/translations/fr.d.ts +4 -0
- package/dist/ui/languages/translations/fr.d.ts.map +1 -0
- package/dist/ui/languages/translations/gl.d.ts +4 -0
- package/dist/ui/languages/translations/gl.d.ts.map +1 -0
- package/dist/ui/languages/translations/gu.d.ts +4 -0
- package/dist/ui/languages/translations/gu.d.ts.map +1 -0
- package/dist/ui/languages/translations/hi.d.ts +4 -0
- package/dist/ui/languages/translations/hi.d.ts.map +1 -0
- package/dist/ui/languages/translations/hr.d.ts +4 -0
- package/dist/ui/languages/translations/hr.d.ts.map +1 -0
- package/dist/ui/languages/translations/hu.d.ts +4 -0
- package/dist/ui/languages/translations/hu.d.ts.map +1 -0
- package/dist/ui/languages/translations/id.d.ts +4 -0
- package/dist/ui/languages/translations/id.d.ts.map +1 -0
- package/dist/ui/languages/translations/it.d.ts +4 -0
- package/dist/ui/languages/translations/it.d.ts.map +1 -0
- package/dist/ui/languages/translations/ja.d.ts +4 -0
- package/dist/ui/languages/translations/ja.d.ts.map +1 -0
- package/dist/ui/languages/translations/kk.d.ts +4 -0
- package/dist/ui/languages/translations/kk.d.ts.map +1 -0
- package/dist/ui/languages/translations/kn.d.ts +4 -0
- package/dist/ui/languages/translations/kn.d.ts.map +1 -0
- package/dist/ui/languages/translations/ko.d.ts +4 -0
- package/dist/ui/languages/translations/ko.d.ts.map +1 -0
- package/dist/ui/languages/translations/lt.d.ts +4 -0
- package/dist/ui/languages/translations/lt.d.ts.map +1 -0
- package/dist/ui/languages/translations/lv.d.ts +4 -0
- package/dist/ui/languages/translations/lv.d.ts.map +1 -0
- package/dist/ui/languages/translations/mk.d.ts +4 -0
- package/dist/ui/languages/translations/mk.d.ts.map +1 -0
- package/dist/ui/languages/translations/ml.d.ts +4 -0
- package/dist/ui/languages/translations/ml.d.ts.map +1 -0
- package/dist/ui/languages/translations/mr.d.ts +4 -0
- package/dist/ui/languages/translations/mr.d.ts.map +1 -0
- package/dist/ui/languages/translations/ms.d.ts +4 -0
- package/dist/ui/languages/translations/ms.d.ts.map +1 -0
- package/dist/ui/languages/translations/nl.d.ts +4 -0
- package/dist/ui/languages/translations/nl.d.ts.map +1 -0
- package/dist/ui/languages/translations/no.d.ts +4 -0
- package/dist/ui/languages/translations/no.d.ts.map +1 -0
- package/dist/ui/languages/translations/pa.d.ts +4 -0
- package/dist/ui/languages/translations/pa.d.ts.map +1 -0
- package/dist/ui/languages/translations/pl.d.ts +4 -0
- package/dist/ui/languages/translations/pl.d.ts.map +1 -0
- package/dist/ui/languages/translations/pt.d.ts +4 -0
- package/dist/ui/languages/translations/pt.d.ts.map +1 -0
- package/dist/ui/languages/translations/ro.d.ts +4 -0
- package/dist/ui/languages/translations/ro.d.ts.map +1 -0
- package/dist/ui/languages/translations/ru.d.ts +4 -0
- package/dist/ui/languages/translations/ru.d.ts.map +1 -0
- package/dist/ui/languages/translations/sk.d.ts +4 -0
- package/dist/ui/languages/translations/sk.d.ts.map +1 -0
- package/dist/ui/languages/translations/sl.d.ts +4 -0
- package/dist/ui/languages/translations/sl.d.ts.map +1 -0
- package/dist/ui/languages/translations/sq.d.ts +4 -0
- package/dist/ui/languages/translations/sq.d.ts.map +1 -0
- package/dist/ui/languages/translations/sr.d.ts +4 -0
- package/dist/ui/languages/translations/sr.d.ts.map +1 -0
- package/dist/ui/languages/translations/sv.d.ts +4 -0
- package/dist/ui/languages/translations/sv.d.ts.map +1 -0
- package/dist/ui/languages/translations/sw.d.ts +4 -0
- package/dist/ui/languages/translations/sw.d.ts.map +1 -0
- package/dist/ui/languages/translations/ta.d.ts +4 -0
- package/dist/ui/languages/translations/ta.d.ts.map +1 -0
- package/dist/ui/languages/translations/te.d.ts +4 -0
- package/dist/ui/languages/translations/te.d.ts.map +1 -0
- package/dist/ui/languages/translations/th.d.ts +4 -0
- package/dist/ui/languages/translations/th.d.ts.map +1 -0
- package/dist/ui/languages/translations/tl.d.ts +4 -0
- package/dist/ui/languages/translations/tl.d.ts.map +1 -0
- package/dist/ui/languages/translations/tr.d.ts +4 -0
- package/dist/ui/languages/translations/tr.d.ts.map +1 -0
- package/dist/ui/languages/translations/translations.test.d.ts +2 -0
- package/dist/ui/languages/translations/translations.test.d.ts.map +1 -0
- package/dist/ui/languages/translations/uk.d.ts +4 -0
- package/dist/ui/languages/translations/uk.d.ts.map +1 -0
- package/dist/ui/languages/translations/ur.d.ts +4 -0
- package/dist/ui/languages/translations/ur.d.ts.map +1 -0
- package/dist/ui/languages/translations/vi.d.ts +4 -0
- package/dist/ui/languages/translations/vi.d.ts.map +1 -0
- package/dist/ui/languages/translations/zh.d.ts +4 -0
- package/dist/ui/languages/translations/zh.d.ts.map +1 -0
- package/dist/ui/languages/types.d.ts +37 -0
- package/dist/ui/languages/types.d.ts.map +1 -0
- package/dist/ui/{languages.d.ts → languages/utils.d.ts} +2 -7
- package/dist/ui/languages/utils.d.ts.map +1 -0
- package/dist/ui.cjs +4502 -3
- package/dist/ui.cjs.map +1 -1
- package/dist/ui.d.ts +4 -3
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +52406 -1401
- package/dist/ui.js.map +1 -1
- package/package.json +11 -2
- package/dist/RqmiiCloudAvatarPlayer-CESlcAGy.js.map +0 -1
- package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs +0 -2939
- package/dist/RqmiiCloudAvatarPlayer-D5npgPcs.cjs.map +0 -1
- package/dist/core/managers/heartbeat.d.ts +0 -13
- package/dist/core/managers/heartbeat.d.ts.map +0 -1
- package/dist/core/managers/reconnect.d.ts +0 -29
- package/dist/core/managers/reconnect.d.ts.map +0 -1
- package/dist/ui/languages.d.ts.map +0 -1
package/dist/agent-react-sdk.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.pixel-streaming-container{position:relative;width:100%;height:100%;background-color:#000;overflow:hidden;margin:0;padding:0}.player-container{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;overflow:hidden}.pixel-streaming-container video,.player-container video,#videoElementParent,#videoElementParent video{width:100%!important;height:100%!important;object-fit:cover}.freezeframeBackground{background-color:#00000080}.loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:#000000b3;z-index:50}.loading-spinner{width:50px;height:50px;border:5px solid rgba(255,255,255,.3);border-radius:50%;border-top-color:#fff;animation:spin 1s ease-in-out infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{color:#fff;margin-top:20px;font-size:18px}.connection-overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:#000c;z-index:50}.error-message{color:#f55;margin-bottom:20px;font-size:16px;text-align:center;max-width:80%}.connect-button{padding:12px 24px;background-color:#2196f3;color:#fff;border:none;border-radius:4px;font-size:16px;cursor:pointer;transition:background-color .3s}.connect-button:hover{background-color:#0b7dda}.playButton{padding:12px 24px;background-color:#2196f3;color:#fff;border:none;border-radius:4px;font-size:16px;cursor:pointer;transition:background-color .3s}.playButton:hover{background-color:#0b7dda}.playButtonContainer{background-color:#000000b3}@media(max-width:768px){.pixel-streaming-container{position:fixed;inset:0;height:100vh;height:100dvh;width:100vw;width:100dvw}.player-container{touch-action:none;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}.pixel-streaming-container,.player-container{overscroll-behavior:none;-webkit-overflow-scrolling:touch}}:root,.rqmii-chat-surface{--rqmii-bg: #1f1f1f;--rqmii-bg-soft: #2a2a2a;--rqmii-bg-hover: #3a3a3a;--rqmii-border: #3c3c3c;--rqmii-text: #fff;--rqmii-muted: #b4b4b4;--rqmii-primary: #0b5cff;--rqmii-action: #0b5cff;--rqmii-danger: #ef1717;--rqmii-font-latin: var( --font-montserrat, var(--font-family-base, "Montserrat", sans-serif) );--rqmii-font-arabic: var( --font-arabic, var(--font-family-arabic, "Arabic", sans-serif) );color:var(--rqmii-text);font-family:var(--rqmii-font-latin)}.rqmii-chat-surface *,.rqmii-chat-surface *:before,.rqmii-chat-surface *:after{box-sizing:border-box}.rqmii-chat-surface button,.rqmii-chat-surface textarea{font:inherit}.rqmii-chat-surface .rqmii-chat-font-latin{font-family:var(--rqmii-font-latin)}.rqmii-chat-surface .rqmii-chat-font-ar{font-family:var(--rqmii-font-arabic)}.rqmii-chat-open-button{border:0;padding:0;border-radius:999px;background:transparent;cursor:pointer;transition:opacity .16s ease,transform .16s ease}.rqmii-chat-open-button:hover{transform:translateY(-1px)}.rqmii-chat-open-button.is-fixed{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-agent-avatar{position:relative;display:grid;place-items:center;overflow:hidden;flex:none;border-radius:999px;background:#0b0b0b;box-shadow:inset 0 0 0 1px #ffffff24}.rqmii-agent-avatar.is-orb{background:transparent;box-shadow:none;overflow:hidden}.rqmii-agent-avatar.is-active{box-shadow:0 0 0 2px var(--rqmii-primary),inset 0 0 0 1px #ffffff24}.rqmii-agent-avatar img{position:absolute;inset:0;width:100%;height:100%;display:block;object-fit:cover;object-position:center center}.rqmii-agent-avatar-orb{position:absolute;inset:-10%;width:120%;height:120%;display:block}.rqmii-orb{width:100%;height:100%;display:block;border-radius:999px;overflow:hidden}.rqmii-agent-avatar--button{width:68px;height:68px;box-shadow:0 0 0 3px var(--rqmii-primary)}.rqmii-agent-avatar--header{width:42px;height:42px}.rqmii-agent-avatar--minimized{width:60px;height:60px}.rqmii-agent-avatar--hero{width:170px;height:170px}.rqmii-chat-panel{width:min(100vw - 24px,350px);min-height:566px;max-height:min(620px,calc(100vh - 32px));display:flex;flex-direction:column;border:1px solid var(--rqmii-border);border-radius:10px;background:var(--rqmii-bg);box-shadow:0 24px 64px #00000052;overflow:hidden}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-chat-panel--conversation,.rqmii-chat-panel--start,.rqmii-chat-panel--voice-start{height:min(566px,calc(100vh - 32px))}.rqmii-chat-panel--voice-call{width:min(100vw - 24px,350px);height:min(566px,calc(100vh - 32px));padding:18px;justify-content:space-between}.rqmii-chat-panel--error{min-height:120px;justify-content:center;align-items:center;gap:14px;padding:20px;text-align:center;color:var(--rqmii-muted);position:relative}.rqmii-error-close{position:absolute;top:12px;right:12px;background:none;border:none;color:var(--rqmii-muted);font-size:24px;cursor:pointer;padding:8px;line-height:1;z-index:1}.rqmii-error-close:hover{color:var(--rqmii-text)}.rqmii-chat-topbar,.rqmii-chat-header{display:flex;align-items:center;gap:8px;padding:16px}.rqmii-chat-topbar{justify-content:space-between}.rqmii-chat-topbar-actions{display:flex;align-items:center;gap:8px}.rqmii-chat-header-spacer{flex:1 1 0;min-width:0}.rqmii-chat-header-status{flex:0 0 112px;min-width:0;max-width:112px;height:42px;min-height:42px;display:inline-flex;align-items:center;justify-content:center;padding:0 10px;border:1px solid var(--rqmii-border);border-radius:999px;color:var(--rqmii-text);background:transparent;font-size:10px;line-height:1.2;text-align:center}.rqmii-chat-header-actions{flex:none;display:inline-flex;align-items:center;gap:5px}.rqmii-chat-header .rqmii-chat-circle-button{width:42px;height:42px}.rqmii-chat-header-status span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rqmii-chat-pill,.rqmii-chat-circle-button{border:0;color:var(--rqmii-text);background:var(--rqmii-bg-hover);cursor:pointer;transition:opacity .16s ease,background-color .16s ease,box-shadow .16s ease}.rqmii-chat-pill:hover,.rqmii-chat-circle-button:hover{opacity:.88}.rqmii-chat-pill{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 16px;border-radius:999px;font-size:15px}.rqmii-chat-circle-button{width:48px;height:48px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:999px}.rqmii-chat-circle-button.is-active{box-shadow:0 0 0 2px var(--rqmii-primary)}.rqmii-chat-circle-button.is-danger{background:var(--rqmii-danger)}.rqmii-chat-language{position:relative}.rqmii-chat-language-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:4;width:176px;max-height:240px;padding:6px;overflow-y:auto;border:1px solid var(--rqmii-border);border-radius:10px;background:#2a2a2a;scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-chat-language-item{width:100%;min-height:30px;padding:0 10px;border:0;border-radius:7px;background:transparent;color:var(--rqmii-text);text-align:left;cursor:pointer}.rqmii-chat-language-item+.rqmii-chat-language-item{margin-top:2px}.rqmii-chat-language-item:hover,.rqmii-chat-language-item.is-selected{background:var(--rqmii-bg-hover)}.rqmii-chat-start-body,.rqmii-chat-call-body{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:20px;padding:44px 24px 12px}.rqmii-chat-call-body{padding-top:74px}.rqmii-chat-call-avatar-wrap{position:relative;margin-bottom:22px}.rqmii-chat-agent-name{font-size:14px;line-height:1.4;color:var(--rqmii-text)}.rqmii-chat-call-button{position:absolute;left:50%;bottom:-18px;width:50px;height:50px;display:grid;place-items:center;border:0;border-radius:999px;color:#fff;background:var(--rqmii-action);transform:translate(-50%);cursor:pointer;box-shadow:0 0 0 6px var(--rqmii-bg)}.rqmii-chat-call-button:disabled{cursor:not-allowed;color:#fff;background:var(--rqmii-action)}.rqmii-chat-spin{animation:rqmii-chat-spin .9s linear infinite}@keyframes rqmii-chat-spin{to{transform:rotate(360deg)}}.rqmii-chat-input{position:relative;flex:none;margin:0 16px;border:1px solid var(--rqmii-border);border-radius:16px;background:var(--rqmii-bg-soft);transition:border-color .16s ease}.rqmii-chat-input:focus-within{border-color:var(--rqmii-action)}.rqmii-chat-input textarea{width:100%;min-height:96px;max-height:168px;resize:none;display:block;padding:16px;border:0;outline:0;color:var(--rqmii-text);background:transparent;font-size:13px;line-height:1.5;overflow-y:auto;scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-chat-input textarea::-webkit-scrollbar{width:6px}.rqmii-chat-input textarea::-webkit-scrollbar-track{background:transparent}.rqmii-chat-input textarea::-webkit-scrollbar-thumb{border-radius:999px;background:#707070}.rqmii-chat-input textarea[dir=rtl]{direction:rtl;text-align:right}.rqmii-chat-input textarea::placeholder{color:var(--rqmii-muted)}.rqmii-chat-input button{position:absolute;right:8px;bottom:8px;z-index:1;width:40px;height:40px;display:grid;place-items:center;border:0;border-radius:999px;color:#fff;background:var(--rqmii-action);cursor:pointer}.rqmii-chat-input button:disabled{cursor:not-allowed;opacity:.45}.rqmii-chat-footer{flex:none;padding:14px 16px 16px;color:var(--rqmii-muted);text-align:center;font-size:10px;line-height:1.35}.rqmii-chat-footer p{margin:0}.rqmii-chat-footer p+p{margin-top:2px}.rqmii-chat-messages{flex:1;min-height:0;padding:0 12px 12px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-chat-messages::-webkit-scrollbar{width:6px}.rqmii-chat-messages::-webkit-scrollbar-track{background:transparent}.rqmii-chat-messages::-webkit-scrollbar-thumb{border-radius:999px;background:#707070}.rqmii-chat-message-row{display:flex;justify-content:flex-start;margin:0 0 16px}.rqmii-chat-message-row.is-user{justify-content:flex-end}.rqmii-chat-message{max-width:80%;padding:12px;border-radius:12px;color:var(--rqmii-text);background:#0a0a0a;font-size:13px;line-height:1.4;text-align:start}.rqmii-chat-message[dir=rtl]{direction:rtl}.rqmii-chat-message-row.is-user .rqmii-chat-message{color:#0a0a0a;background:#dfdfdf}.rqmii-chat-message-row.is-partial .rqmii-chat-message{opacity:.6;font-style:italic}.rqmii-chat-session-counter{margin:8px 0 14px;color:var(--rqmii-muted);text-align:center;font-size:14px;line-height:1;font-variant-numeric:tabular-nums}.rqmii-chat-call-status{height:34px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:8px;color:var(--rqmii-muted);font-size:12px}.rqmii-chat-call-status .rqmii-chat-circle-button{justify-self:end;width:40px;height:40px}.rqmii-chat-live-dot{justify-self:end;width:8px;height:8px;border-radius:999px;background:#12c976}.rqmii-chat-live-dot.is-live{background:#12c976}.rqmii-chat-voice-frame{min-height:315px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;padding:28px 18px}.rqmii-chat-status-pill{min-width:96px;min-height:34px;display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;border:1px solid var(--rqmii-border);border-radius:999px;color:var(--rqmii-muted);text-align:center;font-size:12px}.rqmii-chat-status-pill.is-empty{visibility:hidden}.rqmii-chat-voice-actions{display:flex;align-items:center;gap:10px}.rqmii-chat-voice-actions .rqmii-chat-circle-button{width:44px;height:44px}.rqmii-chat-minimized{height:76px;display:inline-flex;align-items:center;gap:16px;padding:8px 16px 8px 8px;border-radius:999px;color:var(--rqmii-text);background:var(--rqmii-bg);box-shadow:0 24px 64px #00000052}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-minimized{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-chat-minimized-time{color:var(--rqmii-muted);font-size:13px;font-variant-numeric:tabular-nums;white-space:nowrap}.rqmii-chat-minimized-actions{display:inline-flex;align-items:center;gap:8px}.rqmii-chat-minimized .rqmii-chat-circle-button{width:44px;height:44px}.rqmii-avatar-panel{width:min(100vw - 24px,760px);height:min(560px,calc(100vh - 32px));display:flex;overflow:hidden;border:1px solid var(--rqmii-border);border-radius:16px;background:var(--rqmii-bg)}.rqmii-chat-surface:not(.is-preview) .rqmii-avatar-panel{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-avatar-stream{position:relative;flex:1;min-width:0;background:#050505}.rqmii-avatar-overlay{position:absolute;inset:0;display:grid;place-items:center;background:#0000008c;color:var(--rqmii-muted)}.rqmii-avatar-controls{position:absolute;top:14px;left:14px;right:14px;display:flex;align-items:center;gap:8px}.rqmii-avatar-sidebar{width:300px;display:flex;flex-direction:column;border-left:1px solid var(--rqmii-border);padding-top:12px}.rqmii-chat-retry{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 14px;border:0;border-radius:999px;color:#fff;background:var(--rqmii-primary);cursor:pointer}@media(max-width:767px){.rqmii-chat-open-button.is-fixed,.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel,.rqmii-chat-surface:not(.is-preview) .rqmii-avatar-panel{right:12px;bottom:12px}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-minimized{left:50%;right:auto;bottom:24px;transform:translate(-50%)}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel,.rqmii-chat-surface:not(.is-preview) .rqmii-avatar-panel{width:calc(100vw - 24px);max-height:calc(100vh - 24px)}.rqmii-avatar-panel{flex-direction:column}.rqmii-avatar-sidebar{width:100%;height:45%;border-left:0;border-top:1px solid var(--rqmii-border)}}
|
|
1
|
+
.pixel-streaming-container{position:relative;width:100%;height:100%;background-color:#000;overflow:hidden;margin:0;padding:0}.player-container{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;overflow:hidden}.pixel-streaming-container video,.player-container video,#videoElementParent,#videoElementParent video{width:100%!important;height:100%!important;-o-object-fit:cover;object-fit:cover}.freezeframeBackground{background-color:#00000080}.loading-overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:#000000b3;z-index:50}.loading-spinner{width:50px;height:50px;border:5px solid rgba(255,255,255,.3);border-radius:50%;border-top-color:#fff;animation:spin 1s ease-in-out infinite}@keyframes spin{to{transform:rotate(360deg)}}.loading-text{color:#fff;margin-top:20px;font-size:18px}.connection-overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:center;background-color:#000c;z-index:50}.error-message{color:#f55;margin-bottom:20px;font-size:16px;text-align:center;max-width:80%}.connect-button{padding:12px 24px;background-color:#2196f3;color:#fff;border:none;border-radius:4px;font-size:16px;cursor:pointer;transition:background-color .3s}.connect-button:hover{background-color:#0b7dda}.playButton{padding:12px 24px;background-color:#2196f3;color:#fff;border:none;border-radius:4px;font-size:16px;cursor:pointer;transition:background-color .3s}.playButton:hover{background-color:#0b7dda}.playButtonContainer{background-color:#000000b3}@media(max-width:768px){.pixel-streaming-container{position:fixed;inset:0;height:100vh;height:100dvh;width:100vw;width:100dvw}.player-container{touch-action:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pixel-streaming-container,.player-container{overscroll-behavior:none;-webkit-overflow-scrolling:touch}}:root,.rqmii-chat-surface{--rqmii-bg: #1f1f1f;--rqmii-bg-soft: #2a2a2a;--rqmii-bg-hover: #3a3a3a;--rqmii-border: #3c3c3c;--rqmii-text: #fff;--rqmii-muted: #b4b4b4;--rqmii-primary: #0b5cff;--rqmii-action: #0b5cff;--rqmii-danger: #ef1717;--rqmii-success: #12c976;--rqmii-message-user: #dfdfdf;--rqmii-message-agent: #0a0a0a;--rqmii-font-latin: Montserrat, sans-serif;--rqmii-font-arabic: Arabic, sans-serif;--rqmii-shadow: 0 24px 64px rgba(0, 0, 0, .32)}@keyframes rqmii-chat-spin{to{transform:rotate(360deg)}}.rqmii-chat-surface{font-family:var(--rqmii-font-latin);color:var(--rqmii-text)}.rqmii-chat-surface *,.rqmii-chat-surface *:before,.rqmii-chat-surface *:after{box-sizing:border-box}.rqmii-chat-font-latin{font-family:var(--rqmii-font-latin)}.rqmii-chat-font-ar{font-family:var(--rqmii-font-arabic)}.rqmii-chat-language-item.rqmii-chat-font-latin,.rqmii-chat-pill.rqmii-chat-font-latin{font-family:var(--rqmii-font-latin)}.rqmii-chat-language-item.rqmii-chat-font-ar,.rqmii-chat-pill.rqmii-chat-font-ar{font-family:var(--rqmii-font-arabic)}.rqmii-chat-open-button{border:0;padding:0;border-radius:999px;background:transparent;cursor:pointer;transition:opacity .16s ease,transform .16s ease}.rqmii-chat-open-button:hover{transform:translateY(-1px)}.rqmii-chat-open-button.is-fixed{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-chat-surface.rqmii-position-left .rqmii-chat-open-button.is-fixed{right:auto;left:32px}.rqmii-chat-surface.rqmii-position-left:not(.is-preview) .rqmii-chat-panel,.rqmii-chat-surface.rqmii-position-left:not(.is-preview) .rqmii-chat-minimized,.rqmii-chat-surface.rqmii-position-left:not(.is-preview) .rqmii-avatar-panel{right:auto;left:32px}@media(max-width:767px){.rqmii-chat-surface.rqmii-position-left .rqmii-chat-open-button.is-fixed,.rqmii-chat-surface.rqmii-position-left:not(.is-preview) .rqmii-chat-panel,.rqmii-chat-surface.rqmii-position-left:not(.is-preview) .rqmii-avatar-panel{right:auto;left:12px}}@property --rqmii-bubble-border-angle{syntax: "<angle>"; inherits: true; initial-value: 0turn;}.rqmii-chat-welcome-bubble{--rqmii-bubble-border-angle: 0turn;position:fixed;bottom:100px;top:auto;z-index:50;width:-moz-fit-content;width:fit-content;max-width:280px;min-width:120px;padding:12px 14px;color:#d8d8d8;font-size:13px;line-height:1.6;font-weight:500;text-align:start;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;word-break:break-word;box-shadow:0 10px 15px -3px #0000004d;border:solid 2px transparent;border-radius:1rem;background:linear-gradient(#1f1f1f,#1f1f1f) padding-box,conic-gradient(from var(--rqmii-bubble-border-angle),rgba(11,92,255,.08) 0%,rgba(11,92,255,.08) 60%,rgba(11,92,255,.7) 80%,rgba(11,92,255,.7) 85%,rgba(11,92,255,.08) 100%) border-box;animation:rqmii-bubble-spin 3s linear infinite}.rqmii-chat-welcome-bubble.is-right{left:auto;right:100px;text-align:right}.rqmii-chat-welcome-bubble.is-left{right:auto;left:100px;text-align:left}.rqmii-chat-welcome-bubble[dir=rtl]{font-weight:400}@keyframes rqmii-bubble-spin{to{--rqmii-bubble-border-angle: 1turn}}@media(max-width:767px){.rqmii-chat-welcome-bubble{bottom:80px}.rqmii-chat-welcome-bubble.is-right{right:80px}.rqmii-chat-welcome-bubble.is-left{left:80px}}.rqmii-agent-avatar{position:relative;display:grid;place-items:center;overflow:hidden;flex:none;border-radius:999px;background:var(--rqmii-message-agent);box-shadow:inset 0 0 0 1px #ffffff24}.rqmii-agent-avatar.is-orb{background:transparent;box-shadow:none;overflow:visible}.rqmii-agent-avatar.is-active{box-shadow:0 0 0 2px var(--rqmii-primary),inset 0 0 0 1px #ffffff24}.rqmii-agent-avatar img{position:absolute;inset:0;width:100%;height:100%;display:block;-o-object-fit:cover;object-fit:cover;-o-object-position:center center;object-position:center center}.rqmii-agent-avatar-orb{position:absolute;inset:-10%;width:120%;height:120%;display:block}.rqmii-agent-avatar--button{width:68px;height:68px;box-shadow:0 0 0 3px var(--rqmii-primary)}.rqmii-agent-avatar--header{width:42px;height:42px}.rqmii-agent-avatar--minimized{width:60px;height:60px}.rqmii-agent-avatar--hero{width:170px;height:170px}.rqmii-agent-avatar--start{width:130px;height:130px}.rqmii-orb{width:100%;height:100%;display:block;border-radius:999px;overflow:hidden}.rqmii-chat-panel{width:min(100vw - 24px,350px);min-height:566px;max-height:min(620px,calc(100vh - 32px));display:flex;flex-direction:column;border:1px solid var(--rqmii-border);border-radius:10px;background:var(--rqmii-bg);box-shadow:var(--rqmii-shadow);overflow:hidden}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-chat-panel--conversation,.rqmii-chat-panel--start,.rqmii-chat-panel--voice-start{height:min(566px,calc(100vh - 32px))}.rqmii-chat-panel--start-compact .rqmii-chat-start-body{padding-top:0;gap:12px}.rqmii-chat-panel--start-compact .rqmii-chat-call-avatar-wrap,.rqmii-chat-panel--start-compact .rqmii-chat-call-avatar-wrap.is-compact{margin-bottom:0}.rqmii-chat-panel--start-compact .rqmii-chat-call-button.is-compact{width:36px;height:36px;bottom:-14px;box-shadow:0 0 0 4px var(--rqmii-bg)}.rqmii-chat-panel--voice-call{width:min(100vw - 24px,350px);height:min(566px,calc(100vh - 32px));padding:18px;justify-content:space-between}.rqmii-chat-panel--voice-call>.rqmii-chat-topbar{margin:-18px -18px 0;padding:16px 18px}.rqmii-chat-topbar-actions--ended .rqmii-chat-circle-button{width:42px;height:42px}.rqmii-chat-panel--error{min-height:120px;justify-content:center;align-items:center;gap:14px;padding:20px;text-align:center;color:var(--rqmii-muted);position:relative}.rqmii-error-close{position:absolute;top:12px;right:12px;background:none;border:none;color:var(--rqmii-muted);font-size:24px;cursor:pointer;padding:8px;line-height:1;z-index:1}.rqmii-error-close:hover{color:var(--rqmii-text)}.rqmii-chat-topbar,.rqmii-chat-header{display:flex;align-items:center;gap:8px;padding:16px}.rqmii-chat-topbar{justify-content:space-between}.rqmii-chat-topbar-actions{display:flex;align-items:center;gap:8px}.rqmii-chat-header-spacer{flex:1 1 0;min-width:0}.rqmii-chat-header-status{flex:0 0 112px;min-width:0;max-width:112px;height:42px;min-height:42px;display:inline-flex;align-items:center;justify-content:center;padding:0 10px;border:1px solid var(--rqmii-border);border-radius:999px;color:var(--rqmii-text);background:transparent;font-size:10px;line-height:1.2;text-align:center}.rqmii-chat-header-status span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rqmii-chat-header-actions{flex:none;display:inline-flex;align-items:center;gap:5px}.rqmii-chat-header .rqmii-chat-circle-button{width:42px;height:42px}.rqmii-chat-pill,.rqmii-chat-circle-button{border:0;color:var(--rqmii-text);background:var(--rqmii-bg-hover);cursor:pointer;transition:opacity .16s ease,background-color .16s ease,box-shadow .16s ease}.rqmii-chat-pill:hover,.rqmii-chat-circle-button:hover{opacity:.88}.rqmii-chat-pill{display:inline-flex;align-items:center;gap:8px;height:44px;padding:0 16px;border-radius:999px;font-size:15px}.rqmii-chat-circle-button{width:48px;height:48px;flex:none;display:inline-flex;align-items:center;justify-content:center;border-radius:999px}.rqmii-chat-circle-button.is-active{box-shadow:0 0 0 2px var(--rqmii-primary)}.rqmii-chat-circle-button.is-danger{background:var(--rqmii-danger)}.rqmii-chat-circle-button--call-start{background:var(--rqmii-primary);color:#fff}.rqmii-chat-rating{flex:none;display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 16px;text-align:center}.rqmii-chat-rating-header{font-size:14px;font-weight:600;line-height:1.3;color:var(--rqmii-text)}.rqmii-chat-rating-stars{display:inline-flex;align-items:center;gap:3px;direction:ltr}.rqmii-chat-star{border:0;padding:2px;background:transparent;color:var(--rqmii-text);cursor:pointer;display:inline-flex;line-height:0;transition:transform .12s ease,color .12s ease}.rqmii-chat-star:not(.is-filled){color:#6b6b6b}.rqmii-chat-star:not(.is-readonly):hover{transform:scale(1.1)}.rqmii-chat-star.is-readonly{cursor:default}.rqmii-chat-rating-more{height:34px;padding:0 16px;border:1px solid var(--rqmii-border);border-radius:8px;background:transparent;color:var(--rqmii-text);cursor:pointer;font-size:13px;transition:background-color .16s ease}.rqmii-chat-rating-more:hover{background:var(--rqmii-bg-hover)}.rqmii-chat-rating-meta{font-size:12px;line-height:1.4;color:var(--rqmii-muted)}.rqmii-chat-rating-meta div{overflow-wrap:anywhere;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rqmii-chat-panel--feedback{height:min(566px,calc(100vh - 32px))}.rqmii-chat-panel--feedback .rqmii-chat-topbar{justify-content:space-between;direction:ltr}.rqmii-chat-panel--feedback .rqmii-chat-circle-button{width:42px;height:42px}.rqmii-chat-feedback-body{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;gap:12px;padding:0 20px 12px;overflow:hidden}.rqmii-chat-feedback-body .rqmii-agent-avatar--hero{width:110px;height:110px}.rqmii-chat-feedback-title{font-size:14px;font-weight:600;color:var(--rqmii-text);text-align:center}.rqmii-chat-feedback-subtitle{font-size:12px;line-height:1.5;color:var(--rqmii-muted);text-align:center}.rqmii-chat-feedback-input{width:100%;min-height:110px;max-height:140px;resize:none;padding:12px;border:1px solid var(--rqmii-border);border-radius:12px;background:var(--rqmii-bg-soft);color:var(--rqmii-text);font-size:13px;line-height:1.5;outline:0;transition:border-color .16s ease;scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-chat-feedback-input:focus{border-color:var(--rqmii-action)}.rqmii-chat-feedback-input::-moz-placeholder{color:var(--rqmii-muted)}.rqmii-chat-feedback-input::placeholder{color:var(--rqmii-muted)}.rqmii-chat-feedback-input[dir=rtl]{text-align:right}.rqmii-chat-feedback-actions{width:100%;display:flex;justify-content:flex-end;direction:ltr}.rqmii-chat-feedback-submit{min-width:90px;height:38px;padding:0 18px;border:0;border-radius:8px;background:var(--rqmii-primary);color:#fff;font-size:13px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:opacity .16s ease}.rqmii-chat-feedback-submit:disabled{opacity:.45;cursor:not-allowed}.rqmii-chat-language{position:relative}.rqmii-chat-language-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:4;width:176px;max-height:240px;padding:6px;overflow-y:auto;font-size:14px;border:1px solid var(--rqmii-border);border-radius:10px;background:var(--rqmii-bg-soft);scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-chat-language-item{width:100%;min-height:30px;padding:0 10px;border:0;border-radius:7px;font-size:14px;background:transparent;color:var(--rqmii-text);text-align:left;cursor:pointer}.rqmii-chat-language-item+.rqmii-chat-language-item{margin-top:2px}.rqmii-chat-language-item:hover,.rqmii-chat-language-item.is-selected{background:var(--rqmii-bg-hover)}.rqmii-chat-start-body,.rqmii-chat-call-body{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;gap:20px;padding:44px 24px 12px}.rqmii-chat-start-body{position:relative;z-index:1}.rqmii-chat-call-body{padding-top:74px}.rqmii-chat-call-avatar-wrap{position:relative;margin-bottom:8px}.rqmii-chat-agent-name{font-size:14px;line-height:1.4;color:var(--rqmii-text);margin-top:8px}.rqmii-chat-start-suggestions{flex:none;margin:0 16px 8px;z-index:2}.rqmii-chat-error-text{font-size:12px;line-height:1.4;color:#ef4444;text-align:center;padding:8px 12px;background:#ef44441a;border-radius:8px;max-width:260px;word-break:break-word}.rqmii-chat-call-button{position:absolute;left:50%;bottom:-18px;width:50px;height:50px;display:grid;place-items:center;border:0;border-radius:999px;color:#fff;background:var(--rqmii-action);transform:translate(-50%);cursor:pointer;box-shadow:0 0 0 6px var(--rqmii-bg)}.rqmii-chat-call-button:disabled{cursor:not-allowed;color:#fff;background:var(--rqmii-action)}.rqmii-chat-spin{animation:rqmii-chat-spin .9s linear infinite}.rqmii-chat-input{position:relative;flex:none;margin:0 16px;border:1px solid var(--rqmii-border);border-radius:16px;background:var(--rqmii-bg-soft);transition:border-color .16s ease}.rqmii-chat-input:focus-within{border-color:var(--rqmii-action)}.rqmii-chat-input textarea{width:100%;min-height:96px;max-height:168px;resize:none;display:block;padding:16px;border:0;outline:0;color:var(--rqmii-text);background:transparent;font-size:13px;line-height:1.5;overflow-y:auto;scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-chat-input textarea::-webkit-scrollbar{width:6px}.rqmii-chat-input textarea::-webkit-scrollbar-track{background:transparent}.rqmii-chat-input textarea::-webkit-scrollbar-thumb{border-radius:999px;background:#707070}.rqmii-chat-input textarea[dir=rtl]{direction:rtl;text-align:right}.rqmii-chat-input textarea::-moz-placeholder{color:var(--rqmii-muted)}.rqmii-chat-input textarea::placeholder{color:var(--rqmii-muted)}.rqmii-chat-input button{position:absolute;right:8px;bottom:8px;z-index:1;width:40px;height:40px;display:grid;place-items:center;border:0;border-radius:999px;color:#fff;background:var(--rqmii-action);cursor:pointer}.rqmii-chat-input button:disabled{cursor:not-allowed;opacity:.45}.rqmii-chat-footer{flex:none;padding:14px 16px 16px;color:var(--rqmii-muted);text-align:center;font-size:10px;line-height:1.35}.rqmii-chat-footer p{margin:0}.rqmii-chat-footer p+p{margin-top:2px}.rqmii-chat-messages{flex:1;min-height:0;padding:0 12px 12px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-chat-messages::-webkit-scrollbar{width:6px}.rqmii-chat-messages::-webkit-scrollbar-track{background:transparent}.rqmii-chat-messages::-webkit-scrollbar-thumb{border-radius:999px;background:#707070}.rqmii-chat-message-row{display:flex;justify-content:flex-start;margin:0 0 8px}.rqmii-chat-message-row.is-user{justify-content:flex-end}.rqmii-chat-message{max-width:80%;padding:12px;border-radius:12px;color:var(--rqmii-text);background:var(--rqmii-message-agent);font-size:13px;line-height:1.4;text-align:start}.rqmii-chat-message[dir=rtl]{direction:rtl}.rqmii-chat-message-row.is-user .rqmii-chat-message{color:var(--rqmii-message-agent);background:var(--rqmii-message-user)}.rqmii-chat-message-row.is-partial .rqmii-chat-message{opacity:.6;font-style:italic}.rqmii-chat-typing-indicator{display:flex;align-items:center;gap:4px;padding:12px}.rqmii-chat-typing-dot{width:7px;height:7px;border-radius:50%;background:var(--rqmii-muted);opacity:.35;animation:rqmii-typing 1.2s ease-in-out infinite;will-change:transform,opacity}.rqmii-chat-typing-dot:nth-child(1){animation-delay:0s}.rqmii-chat-typing-dot:nth-child(2){animation-delay:.18s}.rqmii-chat-typing-dot:nth-child(3){animation-delay:.36s}@keyframes rqmii-typing{0%,80%,to{transform:scale(.8);opacity:.35}40%{transform:scale(1.15);opacity:1}}.rqmii-chat-session-counter{margin:8px 0 14px;color:var(--rqmii-muted);text-align:center;font-size:14px;line-height:1;font-variant-numeric:tabular-nums}.rqmii-chat-call-status{height:34px;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:8px;color:var(--rqmii-muted);font-size:12px}.rqmii-chat-call-status .rqmii-chat-circle-button{justify-self:end;width:40px;height:40px}.rqmii-chat-call-status.rqmii-chat-call-status--ended{display:flex;justify-content:flex-end}.rqmii-chat-call-status--ended .rqmii-chat-header-actions{display:inline-flex;align-items:center;gap:8px}.rqmii-chat-live-dot{justify-self:end;width:8px;height:8px;border-radius:999px;background:var(--rqmii-success)}.rqmii-chat-voice-frame{min-height:315px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;padding:28px 18px}.rqmii-chat-status-pill{min-width:96px;min-height:34px;display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;border:1px solid var(--rqmii-border);border-radius:999px;color:var(--rqmii-muted);text-align:center;font-size:12px}.rqmii-chat-status-pill.is-empty{visibility:hidden}.rqmii-chat-voice-actions{display:flex;align-items:center;gap:10px}.rqmii-chat-voice-actions .rqmii-chat-circle-button{width:44px;height:44px}.rqmii-chat-minimized{height:76px;display:inline-flex;align-items:center;gap:16px;padding:8px 16px 8px 8px;border-radius:999px;color:var(--rqmii-text);background:var(--rqmii-bg);box-shadow:var(--rqmii-shadow)}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-minimized{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-chat-minimized-time{color:var(--rqmii-muted);font-size:13px;font-variant-numeric:tabular-nums;white-space:nowrap}.rqmii-chat-minimized-actions{display:inline-flex;align-items:center;gap:8px}.rqmii-chat-minimized .rqmii-chat-circle-button{width:44px;height:44px}.rqmii-avatar-panel{width:min(100vw - 24px,760px);height:min(560px,calc(100vh - 32px));display:flex;overflow:hidden;border:1px solid var(--rqmii-border);border-radius:16px;background:var(--rqmii-bg)}.rqmii-chat-surface:not(.is-preview) .rqmii-avatar-panel{position:fixed;right:32px;bottom:32px;z-index:50}.rqmii-avatar-stream{position:relative;flex:1;min-width:0;background:#050505}.rqmii-avatar-overlay{position:absolute;inset:0;display:grid;place-items:center;background:#0000008c;color:var(--rqmii-muted)}.rqmii-avatar-controls{position:absolute;top:14px;left:14px;right:14px;display:flex;align-items:center;gap:8px}.rqmii-avatar-sidebar{width:300px;display:flex;flex-direction:column;border-left:1px solid var(--rqmii-border);padding-top:12px}.rqmii-chat-retry{display:inline-flex;align-items:center;gap:8px;height:36px;padding:0 14px;border:0;border-radius:999px;color:#fff;background:var(--rqmii-primary);cursor:pointer}@media(max-width:767px){.rqmii-chat-open-button.is-fixed{right:12px;bottom:12px}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-minimized{left:50%;right:auto;bottom:24px;transform:translate(-50%)}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel,.rqmii-chat-surface:not(.is-preview) .rqmii-avatar-panel{inset:0;width:100%;height:100%;min-height:0;max-height:none;border:0;border-radius:0}.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel--conversation,.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel--start,.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel--voice-start,.rqmii-chat-surface:not(.is-preview) .rqmii-chat-panel--voice-call{height:100%}.rqmii-avatar-panel{flex-direction:column}.rqmii-avatar-sidebar{width:100%;height:45%;border-left:0;border-top:1px solid var(--rqmii-border)}}.rqmii-suggested-messages{position:relative;width:100%}.rqmii-suggested-messages-inner{position:relative;display:flex;flex-wrap:wrap;align-content:flex-start;gap:6px;max-height:133px}@media(max-width:767px){.rqmii-suggested-messages-inner{max-height:177px}}.rqmii-suggested-messages-inner.is-collapsed{overflow:hidden}.rqmii-suggested-messages-inner.is-expanded{overflow-y:auto;scrollbar-width:thin;scrollbar-color:#707070 transparent}.rqmii-suggested-messages-inner.is-expanded::-webkit-scrollbar{width:4px}.rqmii-suggested-messages-inner.is-expanded::-webkit-scrollbar-track{background:transparent}.rqmii-suggested-messages-inner.is-expanded::-webkit-scrollbar-thumb{border-radius:999px;background:#707070}.rqmii-suggested-message{padding:6px 12px;border:1px solid var(--rqmii-border);border-radius:10px;background:var(--rqmii-bg-hover);color:var(--rqmii-text);line-height:1.4;font-size:14px;cursor:pointer;text-align:start;transition:border-color .16s ease,background-color .16s ease;word-break:break-word}.rqmii-suggested-message:hover{border-color:var(--rqmii-primary);background:#0b5cff14}.rqmii-suggested-messages-toggle{position:absolute;right:0;bottom:0;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--rqmii-border);border-radius:999px;background:var(--rqmii-bg-hover);color:var(--rqmii-muted);cursor:pointer;transition:border-color .16s ease;z-index:2;flex:none}.rqmii-suggested-messages-toggle.is-start-left{right:auto;left:0}.rqmii-suggested-messages-inner.is-expanded .rqmii-suggested-messages-toggle{bottom:auto}.rqmii-suggested-messages-toggle:hover{border-color:var(--rqmii-primary)}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type AudioCaptureState = 'idle' | 'requesting-mic' | 'capturing' | 'unsupported' | 'suspended' | 'error';
|
|
2
|
+
export interface CaptureOptions {
|
|
3
|
+
inputSampleRate?: number;
|
|
4
|
+
frameSizeMs?: number;
|
|
5
|
+
}
|
|
6
|
+
type CaptureHandler = (...args: unknown[]) => void;
|
|
7
|
+
declare class CaptureEventEmitter {
|
|
8
|
+
private listeners;
|
|
9
|
+
on(event: string, handler: CaptureHandler): () => void;
|
|
10
|
+
off(event: string, handler: CaptureHandler): void;
|
|
11
|
+
emit(event: string, payload?: unknown): void;
|
|
12
|
+
removeAllListeners(): void;
|
|
13
|
+
}
|
|
14
|
+
export declare class AudioCapture {
|
|
15
|
+
private _state;
|
|
16
|
+
private _ctx;
|
|
17
|
+
private _node;
|
|
18
|
+
private _stream;
|
|
19
|
+
private _events;
|
|
20
|
+
private _options;
|
|
21
|
+
readonly supported: boolean;
|
|
22
|
+
constructor(options?: CaptureOptions);
|
|
23
|
+
get state(): AudioCaptureState;
|
|
24
|
+
get events(): CaptureEventEmitter;
|
|
25
|
+
start(): Promise<boolean>;
|
|
26
|
+
stop(): void;
|
|
27
|
+
resume(): Promise<void>;
|
|
28
|
+
pause(): Promise<void>;
|
|
29
|
+
destroy(): void;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/capture/capture.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,gBAAgB,GAAG,WAAW,GAAG,aAAa,GAAG,WAAW,GAAG,OAAO,CAAC;AAEhH,MAAM,WAAW,cAAc;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,KAAK,cAAc,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAEnD,cAAM,mBAAmB;IACvB,OAAO,CAAC,SAAS,CAA0C;IAE3D,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,IAAI;IAQtD,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAIjD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI;IAQ5C,kBAAkB,IAAI,IAAI;CAG3B;AAyDD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAA2B;IAE3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,CAAC,EAAE,cAAc;IAQpC,IAAI,KAAK,IAAI,iBAAiB,CAE7B;IAED,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAEK,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAkE/B,IAAI,IAAI,IAAI;IAoBN,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { RqmiiAgentRoomProps } from '../types';
|
|
2
|
-
export declare function RqmiiAgentRoom({ children, wsUrl, restUrl, session, connect,
|
|
2
|
+
export declare function RqmiiAgentRoom({ children, wsUrl, restUrl, session, connect, enableAudio, pcmOptions, debug, withCredentials, onError, onInitialized, clientTools, }: RqmiiAgentRoomProps): import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
//# sourceMappingURL=RqmiiAgentRoom.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RqmiiAgentRoom.d.ts","sourceRoot":"","sources":["../../src/components/RqmiiAgentRoom.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"RqmiiAgentRoom.d.ts","sourceRoot":"","sources":["../../src/components/RqmiiAgentRoom.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAyD,MAAM,UAAU,CAAC;AAwF3G,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,KAAK,EACL,OAAO,EACP,OAAO,EACP,OAAc,EACd,WAAkB,EAClB,UAAU,EACV,KAAa,EACb,eAAuB,EACvB,OAAO,EACP,aAAa,EACb,WAAW,GACZ,EAAE,mBAAmB,2CAqBrB"}
|
package/dist/core/constants.d.ts
CHANGED
|
@@ -17,9 +17,10 @@ export declare const SOCKET_EVENTS: {
|
|
|
17
17
|
readonly AUDIO_END: "audio_end";
|
|
18
18
|
readonly INTERRUPT: "interrupt";
|
|
19
19
|
readonly CHANGE_SESSION_LANGUAGE: "change_session_language";
|
|
20
|
+
readonly LANGUAGE_CHANGED: "language_changed";
|
|
20
21
|
readonly CLIENT_READY: "client_ready";
|
|
21
|
-
readonly
|
|
22
|
-
readonly
|
|
22
|
+
readonly CLIENT_TOOL_REQUEST: "client_tool_request";
|
|
23
|
+
readonly CLIENT_TOOL_RESULT: "client_tool_result";
|
|
23
24
|
readonly CLEAR_SESSION_HISTORY: "clear_session_history";
|
|
24
25
|
readonly TRANSCRIPT: "transcript";
|
|
25
26
|
readonly PARTIAL_TRANSCRIPT: "partial_transcript";
|
|
@@ -32,9 +33,6 @@ export declare const SOCKET_EVENTS: {
|
|
|
32
33
|
readonly INTERRUPTED: "interrupted";
|
|
33
34
|
readonly ERROR: "error";
|
|
34
35
|
readonly AUTH_ERROR: "auth_error";
|
|
35
|
-
readonly RECONNECT_CREDENTIAL: "reconnect_credential";
|
|
36
|
-
readonly RECONNECT_SUCCESS: "reconnect_success";
|
|
37
|
-
readonly RECONNECT_FAILED: "reconnect_failed";
|
|
38
36
|
readonly SESSION_EXPIRED: "session_expired";
|
|
39
37
|
readonly CREDITS_EXHAUSTED: "credits_exhausted";
|
|
40
38
|
readonly SESSION_STATE_CHANGED: "session:state_changed";
|
|
@@ -45,7 +43,6 @@ export declare const CONNECTION_STATE: {
|
|
|
45
43
|
readonly INITIALIZING: "initializing";
|
|
46
44
|
readonly CONNECTING: "connecting";
|
|
47
45
|
readonly CONNECTED: "connected";
|
|
48
|
-
readonly RECONNECTING: "reconnecting";
|
|
49
46
|
readonly FAILED: "failed";
|
|
50
47
|
readonly ENDED: "ended";
|
|
51
48
|
};
|
|
@@ -66,13 +63,6 @@ export declare const SESSION_STATE: {
|
|
|
66
63
|
readonly TERMINATING: "terminating";
|
|
67
64
|
readonly TERMINATED: "terminated";
|
|
68
65
|
};
|
|
69
|
-
export declare const DEFAULT_RECONNECT_OPTIONS: {
|
|
70
|
-
readonly enabled: true;
|
|
71
|
-
readonly maxAttempts: 8;
|
|
72
|
-
readonly initialDelayMs: 500;
|
|
73
|
-
readonly maxDelayMs: 5000;
|
|
74
|
-
readonly timeoutMs: 8000;
|
|
75
|
-
};
|
|
76
66
|
export declare const DEFAULT_PCM_OPTIONS: {
|
|
77
67
|
readonly encoding: "16bitInt";
|
|
78
68
|
readonly channels: 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AAEX,eAAO,MAAM,aAAa
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ChB,CAAC;AAEX,eAAO,MAAM,gBAAgB;;;;;;;CAOnB,CAAC;AAEX,eAAO,MAAM,kBAAkB;;;;;;;CAOrB,CAAC;AAEX,eAAO,MAAM,aAAa;;;;;;;;CAQhB,CAAC;AAEX,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC"}
|
|
@@ -5,16 +5,25 @@ interface SessionManagerOptions {
|
|
|
5
5
|
}
|
|
6
6
|
export declare function detectClientTimezone(): string | undefined;
|
|
7
7
|
export declare function createSessionManager({ restUrl, log, withCredentials }: SessionManagerOptions): {
|
|
8
|
-
initializeSession: ({ apiKey, publicChatId, agentId, userId, language, }?: {
|
|
8
|
+
initializeSession: ({ apiKey, publicChatId, agentId, userId, language, timezone, config, }?: {
|
|
9
9
|
apiKey?: string;
|
|
10
10
|
publicChatId?: string;
|
|
11
11
|
agentId?: string;
|
|
12
12
|
userId?: string;
|
|
13
13
|
language?: string;
|
|
14
|
+
timezone?: string;
|
|
15
|
+
config?: Record<string, unknown>;
|
|
14
16
|
}) => Promise<Record<string, unknown>>;
|
|
15
17
|
joinDesktopSession: ({ uniqueId, }: {
|
|
16
18
|
uniqueId: string;
|
|
17
19
|
}) => Promise<Record<string, unknown>>;
|
|
20
|
+
fetchAgentConfig: (publicChatId: string) => Promise<Record<string, unknown>>;
|
|
21
|
+
submitFeedback: ({ sessionId, rating, feedback, endedBy, }: {
|
|
22
|
+
sessionId: string;
|
|
23
|
+
rating?: number;
|
|
24
|
+
feedback?: string;
|
|
25
|
+
endedBy?: string;
|
|
26
|
+
}) => Promise<Record<string, unknown>>;
|
|
18
27
|
};
|
|
19
28
|
export {};
|
|
20
29
|
//# sourceMappingURL=session.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/core/managers/session.ts"],"names":[],"mappings":"AAAA,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAmBD,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,qBAAqB
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/core/managers/session.ts"],"names":[],"mappings":"AAAA,UAAU,qBAAqB;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAClC,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAOzD;AAmBD,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,qBAAqB;iGAexF;QACD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,KAAQ,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;wCAiCtC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;qCAqBZ,MAAM,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gEAmBpF;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;EAuBrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/core/state/reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../src/core/state/reducer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAE1D,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,UAAU,CAgE/E"}
|
|
@@ -42,15 +42,12 @@ export type StateAction = {
|
|
|
42
42
|
} | {
|
|
43
43
|
type: 'SET_MESSAGES';
|
|
44
44
|
payload: RqmiiMessage[];
|
|
45
|
-
} | {
|
|
46
|
-
type: 'SET_RECONNECT_ATTEMPT';
|
|
47
|
-
payload: number;
|
|
48
|
-
} | {
|
|
49
|
-
type: 'SET_HEARTBEAT_ACK';
|
|
50
|
-
payload: string | null;
|
|
51
45
|
} | {
|
|
52
46
|
type: 'SET_SESSION_READY';
|
|
53
47
|
payload: boolean;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'SET_AGENT_CONFIG';
|
|
50
|
+
payload: Record<string, unknown> | null;
|
|
54
51
|
} | {
|
|
55
52
|
type: 'HARD_RESET';
|
|
56
53
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,UAAU,EACX,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/state/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,UAAU,EACX,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,aAAa,EAAE,UAyB3B,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAC1D;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAE;QAAE,KAAK,EAAE,gBAAgB,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,GAC9F;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAC9C;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,wBAAwB,CAAC;IAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAA;CAAE,GAC5E;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC"}
|
|
@@ -3,7 +3,6 @@ export declare function useRqmiiConnection(): {
|
|
|
3
3
|
isConnected: boolean;
|
|
4
4
|
isSessionReady: boolean;
|
|
5
5
|
error: string | null;
|
|
6
|
-
reconnectAttempt: number;
|
|
7
6
|
session: import("..").RqmiiSessionInfo;
|
|
8
7
|
creditExhausted: boolean;
|
|
9
8
|
creditError: string | null;
|
|
@@ -13,15 +12,25 @@ export declare function useRqmiiConnection(): {
|
|
|
13
12
|
isAgentThinking: boolean;
|
|
14
13
|
isAgentSpeaking: boolean;
|
|
15
14
|
isToolExecuting: boolean;
|
|
15
|
+
agentConfig: Record<string, unknown> | null;
|
|
16
16
|
initializeSession: (args?: import("..").InitializeSessionArgs) => Promise<import("..").SessionData>;
|
|
17
17
|
joinDesktopSession: (args: import("..").JoinDesktopSessionArgs) => Promise<import("..").SessionData>;
|
|
18
18
|
disconnect: () => void;
|
|
19
19
|
terminateSession: () => Promise<{
|
|
20
20
|
success: boolean;
|
|
21
21
|
}>;
|
|
22
|
+
endSession: () => void;
|
|
22
23
|
interrupt: () => boolean;
|
|
23
24
|
clearSessionHistory: () => boolean;
|
|
24
25
|
changeSessionLanguage: (language: string) => boolean;
|
|
25
26
|
signalClientReady: (payload?: Record<string, unknown>) => boolean;
|
|
27
|
+
fetchAgentConfig: (publicChatId: string) => Promise<Record<string, unknown>>;
|
|
28
|
+
submitFeedback: (args: {
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
rating?: number;
|
|
31
|
+
feedback?: string;
|
|
32
|
+
endedBy?: string;
|
|
33
|
+
}) => Promise<Record<string, unknown>>;
|
|
34
|
+
registerClientTools: (tools: Record<string, import("..").ClientToolHandler>) => void;
|
|
26
35
|
};
|
|
27
36
|
//# sourceMappingURL=use-rqmii-connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-rqmii-connection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-connection.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB
|
|
1
|
+
{"version":3,"file":"use-rqmii-connection.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-connection.ts"],"names":[],"mappings":"AAEA,wBAAgB,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+Bk2Z,CAAC;cAAgB,CAAC;gBAAkB,CAAC;eAAiB,CAAC;;;EAD17Z"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export declare function useRqmiiMessages(): {
|
|
2
2
|
messages: import("..").RqmiiMessage[];
|
|
3
3
|
sendTextMessage: (text: string) => boolean;
|
|
4
|
+
addLocalMessage: (role: string, text: string) => void;
|
|
5
|
+
emitUserMessage: (text: string) => boolean;
|
|
4
6
|
clearMessages: () => void;
|
|
5
7
|
};
|
|
6
8
|
//# sourceMappingURL=use-rqmii-messages.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-rqmii-messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-messages.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB
|
|
1
|
+
{"version":3,"file":"use-rqmii-messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-messages.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB;;;;;;EAS/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-rqmii-press-to-talk.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-press-to-talk.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-rqmii-press-to-talk.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-press-to-talk.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAUtF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,0BAA+B,GAAG,yBAAyB,CAgKvG"}
|
|
@@ -14,7 +14,6 @@ export interface RqmiiEventListeners {
|
|
|
14
14
|
onStateChanged: Listener<EventHandlerMap['state:changed']>;
|
|
15
15
|
onConnected: Listener<EventHandlerMap['connection:connected']>;
|
|
16
16
|
onDisconnected: Listener<EventHandlerMap['connection:disconnected']>;
|
|
17
|
-
onReconnecting: Listener<EventHandlerMap['connection:reconnecting']>;
|
|
18
17
|
onConnectionFailed: Listener<EventHandlerMap['connection:failed']>;
|
|
19
18
|
onError: Listener<EventHandlerMap['error']>;
|
|
20
19
|
onCreditsExhausted: Listener<EventHandlerMap['credits:exhausted']>;
|
|
@@ -41,7 +40,6 @@ export interface RqmiiSDKHandle {
|
|
|
41
40
|
partialTranscript: PartialTranscriptPayload | null;
|
|
42
41
|
session: RqmiiState['session'];
|
|
43
42
|
sessionState: RqmiiState['sessionState'];
|
|
44
|
-
reconnectAttempt: number;
|
|
45
43
|
};
|
|
46
44
|
actions: {
|
|
47
45
|
sendTextMessage: (text: string) => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-rqmii-sdk.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-sdk.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpI,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,MAAM,IAAI,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3D,eAAe,EAAE,QAAQ,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC7D,mBAAmB,EAAE,QAAQ,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,CAAC;IACrE,gBAAgB,EAAE,QAAQ,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/D,iBAAiB,EAAE,QAAQ,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjE,aAAa,EAAE,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;IACzD,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3D,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3D,gBAAgB,EAAE,QAAQ,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAC/D,oBAAoB,EAAE,QAAQ,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACxE,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3D,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,sBAAsB,CAAC,CAAC,CAAC;IAC/D,cAAc,EAAE,QAAQ,CAAC,eAAe,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACrE,
|
|
1
|
+
{"version":3,"file":"use-rqmii-sdk.d.ts","sourceRoot":"","sources":["../../src/hooks/use-rqmii-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,50 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./RqmiiCloudAvatarPlayer-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("./RqmiiCloudAvatarPlayer-BI7Uz7DP.cjs"),f=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
|
+
class PcmCaptureProcessor extends AudioWorkletProcessor {
|
|
3
|
+
constructor(options) {
|
|
4
|
+
super();
|
|
5
|
+
this._downsampleFactor = Math.round((options.processorOptions?.inputSampleRate || 48000) / 16000);
|
|
6
|
+
this._buffer = [];
|
|
7
|
+
this._frameSize = 128;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
process(inputs) {
|
|
11
|
+
const input = inputs[0];
|
|
12
|
+
if (!input || !input[0]) return true;
|
|
13
|
+
|
|
14
|
+
const channelData = input[0];
|
|
15
|
+
|
|
16
|
+
for (let i = 0; i < channelData.length; i++) {
|
|
17
|
+
this._buffer.push(channelData[i]);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
while (this._buffer.length >= this._frameSize * this._downsampleFactor) {
|
|
21
|
+
let outIdx = 0;
|
|
22
|
+
const downsampled = new Float32Array(this._frameSize);
|
|
23
|
+
|
|
24
|
+
for (let i = 0; i < this._frameSize; i++) {
|
|
25
|
+
const base = i * this._downsampleFactor;
|
|
26
|
+
let sum = 0;
|
|
27
|
+
for (let j = 0; j < this._downsampleFactor; j++) {
|
|
28
|
+
sum += this._buffer[base + j];
|
|
29
|
+
}
|
|
30
|
+
downsampled[outIdx++] = sum / this._downsampleFactor;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
this._buffer.splice(0, this._frameSize * this._downsampleFactor);
|
|
34
|
+
|
|
35
|
+
const pcm = new Int16Array(this._frameSize);
|
|
36
|
+
for (let i = 0; i < this._frameSize; i++) {
|
|
37
|
+
const s = Math.max(-1, Math.min(1, downsampled[i]));
|
|
38
|
+
pcm[i] = s < 0 ? s * 0x8000 : s * 0x7fff;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
this.port.postMessage(pcm.buffer, [pcm.buffer]);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
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,_]=r.useState(null),m=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 _(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),_(null),!0):(_("Failed to start capture"),c.current=null,!1)},[t,o,R]),h=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()=>m(),[m]),w=r.useCallback(({discard:n=!1}={})=>{const A=h();return!n&&A&&(e?e():p()),A},[p,e,h]),S=r.useCallback(()=>{u.current&&(clearTimeout(u.current),u.current=null),x(!0),u.current=setTimeout(()=>{E&&T(),m()},a)},[a,T,E,m]),d=r.useCallback(()=>{x(!1),u.current&&(clearTimeout(u.current),u.current=null),h()&&(e?e():p())},[p,e,h]);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(s,t,e=[]){const{events:o}=i.useRqmiiAgentContext();r.useEffect(()=>o.on(s,t),[s,t,o,...e])}function U(){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 z 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:f.jsxs("div",{style:{padding:"24px",textAlign:"center",color:"#ef4444"},children:[f.jsx("h3",{children:"Something went wrong"}),f.jsx("p",{children:this.state.error?.message||"An unexpected error occurred"}),f.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.useRqmiiMessages=i.useRqmiiMessages;exports.useRqmiiVAD=i.useRqmiiVAD;exports.useRqmiiVoice=i.useRqmiiVoice;exports.AudioCapture=v;exports.RqmiiErrorBoundary=z;exports.useRqmiiAgent=M;exports.useRqmiiAudioElement=O;exports.useRqmiiEvents=I;exports.useRqmiiPressToTalk=F;exports.useRqmiiSDK=U;exports.useRqmiiSession=D;
|
|
2
50
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -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/hooks/use-rqmii-press-to-talk.ts","../src/hooks/use-rqmii-events.ts","../src/hooks/use-rqmii-sdk.ts","../src/components/RqmiiErrorBoundary.tsx"],"sourcesContent":["import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAgent() {\n return useRqmiiAgentContext();\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiSession() {\n const ctx = useRqmiiAgentContext();\n return {\n sessionState: ctx.sessionState,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n };\n}\n","import { useEffect } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAudioElement(audioRef: React.RefObject<HTMLAudioElement | null>) {\n const { attachAudioElement, resumeAudioPlayback } = useRqmiiAgentContext();\n\n useEffect(() => {\n if (!audioRef?.current) return undefined;\n\n attachAudioElement(audioRef.current);\n const unlock = () => {\n void resumeAudioPlayback();\n };\n\n const node = audioRef.current;\n node.addEventListener('click', unlock);\n node.addEventListener('touchstart', unlock);\n\n return () => {\n node.removeEventListener('click', unlock);\n node.removeEventListener('touchstart', unlock);\n attachAudioElement(null);\n };\n }, [attachAudioElement, audioRef, resumeAudioPlayback]);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { UseRqmiiPressToTalkOptions, UseRqmiiPressToTalkReturn } from '../types';\n\nconst DEFAULT_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 16000,\n};\n\nconst MEDIA_RECORDER_MIME_TYPES = [\n 'audio/webm;codecs=opus',\n 'audio/webm',\n 'audio/mp4',\n];\n\nconst getRecorderMimeType = (): string => {\n if (typeof window === 'undefined' || !window.MediaRecorder?.isTypeSupported) return '';\n return MEDIA_RECORDER_MIME_TYPES.find((type) => window.MediaRecorder.isTypeSupported(type)) || '';\n};\n\nexport function useRqmiiPressToTalk(options: UseRqmiiPressToTalkOptions = {}): UseRqmiiPressToTalkReturn {\n const {\n onAudioChunk,\n onAudioEnd,\n onError,\n holdDelayMs = 220,\n timesliceMs = 100,\n interruptOnHoldStart = true,\n audioConstraints = DEFAULT_AUDIO_CONSTRAINTS,\n } = options;\n\n const { sendAudioChunk, endAudioStream, interrupt } = useRqmiiAgentContext();\n\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const streamRef = useRef<MediaStream | null>(null);\n const holdTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const shouldSendAudioEndRef = useRef(true);\n const stopRequestedRef = useRef(false);\n\n const [isPressing, setIsPressing] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [micError, setMicError] = useState<string | null>(null);\n\n const handleChunk = useCallback(\n async (blob: Blob) => {\n if (!blob || blob.size <= 0) return;\n const chunkBuffer = await blob.arrayBuffer();\n if (onAudioChunk) {\n onAudioChunk(chunkBuffer);\n return;\n }\n sendAudioChunk(chunkBuffer);\n },\n [onAudioChunk, sendAudioChunk],\n );\n\n const cleanupStream = useCallback(() => {\n if (!streamRef.current) return;\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }, []);\n\n const stopRecording = useCallback(\n ({ discard = false }: { discard?: boolean } = {}): boolean => {\n const mediaRecorder = mediaRecorderRef.current;\n if (!mediaRecorder) {\n stopRequestedRef.current = true;\n return false;\n }\n\n shouldSendAudioEndRef.current = !discard;\n mediaRecorderRef.current = null;\n\n if (mediaRecorder.state === 'inactive') {\n if (!discard) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n cleanupStream();\n setIsRecording(false);\n return true;\n }\n\n try {\n mediaRecorder.requestData();\n } catch {\n // some browsers throw if requestData is called after stopping\n }\n\n mediaRecorder.onstop = () => {\n const shouldSendEnd = shouldSendAudioEndRef.current;\n if (shouldSendEnd) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n cleanupStream();\n setIsRecording(false);\n };\n\n try {\n mediaRecorder.stop();\n } catch (error) {\n cleanupStream();\n setIsRecording(false);\n onError?.(error);\n }\n\n return true;\n },\n [cleanupStream, endAudioStream, onAudioEnd, onError],\n );\n\n const startRecording = useCallback(async (): Promise<boolean> => {\n if (mediaRecorderRef.current) return true;\n stopRequestedRef.current = false;\n if (\n typeof navigator === 'undefined' ||\n !navigator.mediaDevices?.getUserMedia ||\n typeof window === 'undefined' ||\n typeof window.MediaRecorder === 'undefined'\n ) {\n const error = new Error('MediaRecorder or microphone APIs are unavailable in this browser');\n setMicError(error.message);\n onError?.(error);\n return false;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: audioConstraints });\n streamRef.current = stream;\n\n const mimeType = getRecorderMimeType();\n const recorderOptions = mimeType ? { mimeType } : undefined;\n const mediaRecorder = new window.MediaRecorder(stream, recorderOptions);\n\n mediaRecorder.ondataavailable = (event) => {\n void handleChunk(event.data);\n };\n\n mediaRecorder.onerror = (event) => {\n const error = (event as ErrorEvent)?.error || new Error('Microphone recording failed');\n setMicError((error as Error)?.message || 'recording_failed');\n onError?.(error);\n };\n\n mediaRecorderRef.current = mediaRecorder;\n setIsRecording(true);\n setMicError(null);\n mediaRecorder.start(timesliceMs);\n\n if (stopRequestedRef.current) {\n stopRequestedRef.current = false;\n stopRecording();\n }\n\n return true;\n } catch (error) {\n cleanupStream();\n setIsRecording(false);\n setMicError('permission_denied');\n onError?.(error);\n return false;\n }\n }, [audioConstraints, cleanupStream, handleChunk, onError, timesliceMs, stopRecording]);\n\n const startPress = useCallback(() => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n\n setIsPressing(true);\n\n holdTimerRef.current = setTimeout(() => {\n if (interruptOnHoldStart) {\n interrupt();\n }\n void startRecording();\n }, holdDelayMs);\n }, [holdDelayMs, interrupt, interruptOnHoldStart, startRecording]);\n\n const stopPress = useCallback(() => {\n setIsPressing(false);\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n stopRecording();\n }, [stopRecording]);\n\n useEffect(() => {\n return () => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n const mr = mediaRecorderRef.current;\n if (mr) {\n mediaRecorderRef.current = null;\n if (mr.state !== 'inactive') {\n try { mr.stop(); } catch { /* ignore */ }\n }\n }\n if (streamRef.current) {\n streamRef.current.getTracks().forEach((track) => track.stop());\n streamRef.current = null;\n }\n };\n }, []);\n\n const eventHandlers = useMemo(\n () => ({\n onPointerDown: (e: React.PointerEvent) => {\n e.preventDefault();\n startPress();\n },\n onPointerUp: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerCancel: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerLeave: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n }),\n [startPress, stopPress],\n );\n\n return {\n isPressing,\n isRecording,\n micError,\n startRecording,\n stopRecording,\n startPress,\n stopPress,\n eventHandlers,\n };\n}\n","import { useEffect } from 'react';\nimport type { EventType, EventHandlerMap } from '../types';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiEvents<T extends EventType>(event: T, handler: EventHandlerMap[T], deps: unknown[] = []) {\n const { events } = useRqmiiAgentContext();\n\n useEffect(() => {\n return events.on(event, handler);\n }, [event, handler, events, ...deps]);\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { EventHandlerMap, RqmiiMessage, RqmiiState, TranscriptPayload, PartialTranscriptPayload, SessionData } from '../types';\n\ntype Listener<T> = (handler: T) => () => void;\n\nexport interface RqmiiEventListeners {\n onSessionReady: Listener<EventHandlerMap['session:ready']>;\n onSessionJoined: Listener<EventHandlerMap['session:joined']>;\n onSessionTerminated: Listener<EventHandlerMap['session:terminated']>;\n onSessionExpired: Listener<EventHandlerMap['session:expired']>;\n onMessageReceived: Listener<EventHandlerMap['message:received']>;\n onMessageSent: Listener<EventHandlerMap['message:sent']>;\n onAudioPlaying: Listener<EventHandlerMap['audio:playing']>;\n onAudioStopped: Listener<EventHandlerMap['audio:stopped']>;\n onAvatarSpeaking: Listener<EventHandlerMap['avatar:speaking']>;\n onAvatarSpeakingDone: Listener<EventHandlerMap['avatar:speaking_done']>;\n onStateChanged: Listener<EventHandlerMap['state:changed']>;\n onConnected: Listener<EventHandlerMap['connection:connected']>;\n onDisconnected: Listener<EventHandlerMap['connection:disconnected']>;\n onReconnecting: Listener<EventHandlerMap['connection:reconnecting']>;\n onConnectionFailed: Listener<EventHandlerMap['connection:failed']>;\n onError: Listener<EventHandlerMap['error']>;\n onCreditsExhausted: Listener<EventHandlerMap['credits:exhausted']>;\n onTranscript: Listener<EventHandlerMap['transcript']>;\n onPartialTranscript: Listener<EventHandlerMap['partial_transcript']>;\n onInterrupted: Listener<EventHandlerMap['interrupted']>;\n}\n\nexport interface RqmiiSDKHandle {\n state: {\n messages: RqmiiMessage[];\n connectionState: RqmiiState['connectionState'];\n isConnected: boolean;\n isSessionReady: boolean;\n isAudioPlaying: boolean;\n isAgentThinking: boolean;\n isAgentSpeaking: boolean;\n isToolExecuting: boolean;\n isSessionTerminated: boolean;\n isSessionTerminating: boolean;\n creditExhausted: boolean;\n creditError: string | null;\n error: string | null;\n transcript: TranscriptPayload | null;\n partialTranscript: PartialTranscriptPayload | null;\n session: RqmiiState['session'];\n sessionState: RqmiiState['sessionState'];\n reconnectAttempt: number;\n };\n actions: {\n sendTextMessage: (text: string) => boolean;\n sendAudioChunk: (audio: unknown) => boolean;\n endAudioStream: () => boolean;\n interrupt: () => boolean;\n clearSessionHistory: () => boolean;\n clearMessages: () => void;\n changeSessionLanguage: (language: string) => boolean;\n signalClientReady: (payload?: Record<string, unknown>) => boolean;\n initializeSession: (opts?: { apiKey?: string; publicChatId?: string; agentId?: string; language?: string }) => Promise<SessionData>;\n joinDesktopSession: (opts: { uniqueId: string; language?: string }) => Promise<SessionData>;\n disconnect: () => void;\n terminateSession: () => Promise<{ success: boolean }>;\n resumeAudioPlayback: () => void;\n pauseAudioPlayback: () => void;\n attachAudioElement: (el: HTMLAudioElement | null) => void;\n };\n events: RqmiiEventListeners;\n raw: {\n socket: ReturnType<typeof import('socket.io-client').io> | null;\n audioElement: HTMLAudioElement | null;\n };\n}\n\nexport function useRqmiiSDK(): RqmiiSDKHandle {\n const ctx = useRqmiiAgentContext();\n const ev = ctx.events;\n\n return {\n state: {\n messages: ctx.messages,\n connectionState: ctx.connectionState,\n isConnected: ctx.isConnected,\n isSessionReady: ctx.isSessionReady,\n isAudioPlaying: ctx.isAudioPlaying,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n creditExhausted: ctx.creditExhausted,\n creditError: ctx.creditError,\n error: ctx.error,\n transcript: ctx.transcript,\n partialTranscript: ctx.partialTranscript,\n session: ctx.session,\n sessionState: ctx.sessionState,\n reconnectAttempt: ctx.reconnectAttempt,\n },\n actions: {\n sendTextMessage: ctx.sendTextMessage,\n sendAudioChunk: ctx.sendAudioChunk,\n endAudioStream: ctx.endAudioStream,\n interrupt: ctx.interrupt,\n clearSessionHistory: ctx.clearSessionHistory,\n clearMessages: ctx.clearMessages,\n changeSessionLanguage: ctx.changeSessionLanguage,\n signalClientReady: ctx.signalClientReady,\n initializeSession: ctx.initializeSession,\n joinDesktopSession: ctx.joinDesktopSession,\n disconnect: ctx.disconnect,\n terminateSession: ctx.terminateSession,\n resumeAudioPlayback: ctx.resumeAudioPlayback,\n pauseAudioPlayback: ctx.pauseAudioPlayback,\n attachAudioElement: ctx.attachAudioElement,\n },\n events: {\n onSessionReady: (h) => ev.on('session:ready', h),\n onSessionJoined: (h) => ev.on('session:joined', h),\n onSessionTerminated: (h) => ev.on('session:terminated', h),\n onSessionExpired: (h) => ev.on('session:expired', h),\n onMessageReceived: (h) => ev.on('message:received', h),\n onMessageSent: (h) => ev.on('message:sent', h),\n onAudioPlaying: (h) => ev.on('audio:playing', h),\n onAudioStopped: (h) => ev.on('audio:stopped', h),\n onAvatarSpeaking: (h) => ev.on('avatar:speaking', h),\n onAvatarSpeakingDone: (h) => ev.on('avatar:speaking_done', h),\n onStateChanged: (h) => ev.on('state:changed', h),\n onConnected: (h) => ev.on('connection:connected', h),\n onDisconnected: (h) => ev.on('connection:disconnected', h),\n onReconnecting: (h) => ev.on('connection:reconnecting', h),\n onConnectionFailed: (h) => ev.on('connection:failed', h),\n onError: (h) => ev.on('error', h),\n onCreditsExhausted: (h) => ev.on('credits:exhausted', h),\n onTranscript: (h) => ev.on('transcript', h),\n onPartialTranscript: (h) => ev.on('partial_transcript', h),\n onInterrupted: (h) => ev.on('interrupted', h),\n },\n raw: {\n socket: ctx.socket,\n audioElement: ctx.audioElement,\n },\n };\n}\n","import React, { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface RqmiiErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface RqmiiErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class RqmiiErrorBoundary extends Component<RqmiiErrorBoundaryProps, RqmiiErrorBoundaryState> {\n constructor(props: RqmiiErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): RqmiiErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback } = this.props;\n if (fallback) {\n if (typeof fallback === 'function') {\n return this.state.error ? fallback(this.state.error, this.reset) : null;\n }\n return fallback;\n }\n return (\n <div style={{ padding: '24px', textAlign: 'center', color: '#ef4444' }}>\n <h3>Something went wrong</h3>\n <p>{this.state.error?.message || 'An unexpected error occurred'}</p>\n <button onClick={this.reset} style={{ marginTop: '12px', padding: '8px 16px', cursor: 'pointer' }}>\n Try again\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n"],"names":["useRqmiiAgent","useRqmiiAgentContext","useRqmiiSession","ctx","useRqmiiAudioElement","audioRef","attachAudioElement","resumeAudioPlayback","useEffect","unlock","node","DEFAULT_AUDIO_CONSTRAINTS","MEDIA_RECORDER_MIME_TYPES","getRecorderMimeType","type","useRqmiiPressToTalk","options","onAudioChunk","onAudioEnd","onError","holdDelayMs","timesliceMs","interruptOnHoldStart","audioConstraints","sendAudioChunk","endAudioStream","interrupt","mediaRecorderRef","useRef","streamRef","holdTimerRef","shouldSendAudioEndRef","stopRequestedRef","isPressing","setIsPressing","useState","isRecording","setIsRecording","micError","setMicError","handleChunk","useCallback","blob","chunkBuffer","cleanupStream","track","stopRecording","discard","mediaRecorder","error","startRecording","stream","mimeType","recorderOptions","event","startPress","stopPress","mr","eventHandlers","useMemo","e","useRqmiiEvents","handler","deps","events","useRqmiiSDK","ev","h","RqmiiErrorBoundary","Component","props","info","fallback","jsxs","jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.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-events.ts","../src/hooks/use-rqmii-sdk.ts","../src/components/RqmiiErrorBoundary.tsx"],"sourcesContent":["import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAgent() {\n return useRqmiiAgentContext();\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiSession() {\n const ctx = useRqmiiAgentContext();\n return {\n sessionState: ctx.sessionState,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n };\n}\n","import { useEffect } from 'react';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiAudioElement(audioRef: React.RefObject<HTMLAudioElement | null>) {\n const { attachAudioElement, resumeAudioPlayback } = useRqmiiAgentContext();\n\n useEffect(() => {\n if (!audioRef?.current) return undefined;\n\n attachAudioElement(audioRef.current);\n const unlock = () => {\n void resumeAudioPlayback();\n };\n\n const node = audioRef.current;\n node.addEventListener('click', unlock);\n node.addEventListener('touchstart', unlock);\n\n return () => {\n node.removeEventListener('click', unlock);\n node.removeEventListener('touchstart', unlock);\n attachAudioElement(null);\n };\n }, [attachAudioElement, audioRef, resumeAudioPlayback]);\n}\n","export type AudioCaptureState = 'idle' | 'requesting-mic' | 'capturing' | 'unsupported' | 'suspended' | 'error';\n\nexport interface CaptureOptions {\n inputSampleRate?: number;\n frameSizeMs?: number;\n}\n\ntype CaptureHandler = (...args: unknown[]) => void;\n\nclass CaptureEventEmitter {\n private listeners = new Map<string, Set<CaptureHandler>>();\n\n on(event: string, handler: CaptureHandler): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n return () => this.off(event, handler);\n }\n\n off(event: string, handler: CaptureHandler): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n emit(event: string, payload?: unknown): void {\n const handlers = this.listeners.get(event);\n if (!handlers) return;\n for (const handler of handlers) {\n try { handler(payload); } catch { /* silence */ }\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n\nconst DEFAULT_OPTIONS: Required<CaptureOptions> = {\n inputSampleRate: 48000,\n frameSizeMs: 20,\n};\n\nconst PCM_PROCESSOR_CODE = `\nclass PcmCaptureProcessor extends AudioWorkletProcessor {\n constructor(options) {\n super();\n this._downsampleFactor = Math.round((options.processorOptions?.inputSampleRate || 48000) / 16000);\n this._buffer = [];\n this._frameSize = 128;\n }\n\n process(inputs) {\n const input = inputs[0];\n if (!input || !input[0]) return true;\n\n const channelData = input[0];\n\n for (let i = 0; i < channelData.length; i++) {\n this._buffer.push(channelData[i]);\n }\n\n while (this._buffer.length >= this._frameSize * this._downsampleFactor) {\n let outIdx = 0;\n const downsampled = new Float32Array(this._frameSize);\n\n for (let i = 0; i < this._frameSize; i++) {\n const base = i * this._downsampleFactor;\n let sum = 0;\n for (let j = 0; j < this._downsampleFactor; j++) {\n sum += this._buffer[base + j];\n }\n downsampled[outIdx++] = sum / this._downsampleFactor;\n }\n\n this._buffer.splice(0, this._frameSize * this._downsampleFactor);\n\n const pcm = new Int16Array(this._frameSize);\n for (let i = 0; i < this._frameSize; i++) {\n const s = Math.max(-1, Math.min(1, downsampled[i]));\n pcm[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n this.port.postMessage(pcm.buffer, [pcm.buffer]);\n }\n\n return true;\n }\n}\n\nregisterProcessor('pcm-capture-processor', PcmCaptureProcessor);\n`;\n\nexport class AudioCapture {\n private _state: AudioCaptureState = 'idle';\n private _ctx: AudioContext | null = null;\n private _node: AudioWorkletNode | null = null;\n private _stream: MediaStream | null = null;\n private _events = new CaptureEventEmitter();\n private _options: Required<CaptureOptions>;\n\n readonly supported: boolean;\n\n constructor(options?: CaptureOptions) {\n this._options = { ...DEFAULT_OPTIONS, ...options };\n this.supported = typeof AudioWorkletNode !== 'undefined';\n if (!this.supported) {\n this._state = 'unsupported';\n }\n }\n\n get state(): AudioCaptureState {\n return this._state;\n }\n\n get events(): CaptureEventEmitter {\n return this._events;\n }\n\n async start(): Promise<boolean> {\n if (!this.supported) {\n this._state = 'unsupported';\n return false;\n }\n\n if (this._state === 'capturing') return true;\n\n this._state = 'requesting-mic';\n\n try {\n this._stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n this._state = 'error';\n this._events.emit('error', err);\n return false;\n }\n\n try {\n if (this._ctx?.state === 'suspended') {\n await this._ctx.resume();\n }\n\n this._ctx = new AudioContext({ sampleRate: this._options.inputSampleRate });\n\n const blob = new Blob([PCM_PROCESSOR_CODE], { type: 'application/javascript' });\n const processorUrl = URL.createObjectURL(blob);\n await this._ctx.audioWorklet.addModule(processorUrl);\n URL.revokeObjectURL(processorUrl);\n\n const source = this._ctx.createMediaStreamSource(this._stream);\n\n this._node = new AudioWorkletNode(this._ctx, 'pcm-capture-processor', {\n processorOptions: {\n inputSampleRate: this._options.inputSampleRate,\n frameSize: (this._options.inputSampleRate * this._options.frameSizeMs) / 1000,\n },\n });\n\n this._node.port.onmessage = (ev: MessageEvent<ArrayBuffer>) => {\n this._events.emit('audio_chunk', new Uint8Array(ev.data));\n };\n\n source.connect(this._node);\n\n this._state = 'capturing';\n this._events.emit('state_changed', this._state);\n\n if (this._ctx.state === 'suspended') {\n await this._ctx.resume();\n }\n\n return true;\n } catch (err) {\n this._state = 'error';\n this._events.emit('error', err);\n\n if (this._stream) {\n this._stream.getTracks().forEach((t) => t.stop());\n this._stream = null;\n }\n\n return false;\n }\n }\n\n stop(): void {\n if (this._node) {\n this._node.disconnect();\n this._node = null;\n }\n\n if (this._stream) {\n this._stream.getTracks().forEach((t) => t.stop());\n this._stream = null;\n }\n\n if (this._ctx && this._ctx.state !== 'closed') {\n this._ctx.close();\n this._ctx = null;\n }\n\n this._state = 'idle';\n this._events.emit('state_changed', this._state);\n }\n\n async resume(): Promise<void> {\n if (this._ctx?.state === 'suspended') {\n await this._ctx.resume();\n this._state = 'capturing';\n this._events.emit('state_changed', this._state);\n }\n }\n\n async pause(): Promise<void> {\n if (this._ctx?.state === 'running') {\n await this._ctx.suspend();\n this._state = 'suspended';\n this._events.emit('state_changed', this._state);\n }\n }\n\n destroy(): void {\n this.events.removeAllListeners();\n this.stop();\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { AudioCapture } from '../capture/capture';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { UseRqmiiPressToTalkOptions, UseRqmiiPressToTalkReturn } from '../types';\n\nconst DEFAULT_AUDIO_CONSTRAINTS: MediaTrackConstraints = {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n channelCount: 1,\n sampleRate: 16000,\n};\n\nexport function useRqmiiPressToTalk(options: UseRqmiiPressToTalkOptions = {}): UseRqmiiPressToTalkReturn {\n const {\n onAudioChunk,\n onAudioEnd,\n onError,\n holdDelayMs = 220,\n interruptOnHoldStart = true,\n } = options;\n\n const { sendAudioChunk, endAudioStream, interrupt } = useRqmiiAgentContext();\n\n const captureRef = useRef<AudioCapture | null>(null);\n const holdTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const [isPressing, setIsPressing] = useState(false);\n const [isRecording, setIsRecording] = useState(false);\n const [micError, setMicError] = useState<string | null>(null);\n\n const startPcmCapture = useCallback(async (): Promise<boolean> => {\n if (captureRef.current) return true;\n\n const capture = new AudioCapture();\n captureRef.current = capture;\n\n if (!capture.supported) {\n const err = new Error('AudioWorklet not supported in this browser');\n setMicError(err.message);\n onError?.(err);\n return false;\n }\n\n capture.events.on('audio_chunk', (chunk: unknown) => {\n if (onAudioChunk) onAudioChunk(chunk as Uint8Array);\n else sendAudioChunk(chunk);\n });\n\n capture.events.on('error', (err: unknown) => {\n onError?.(err);\n });\n\n const ok = await capture.start();\n if (!ok) {\n setMicError('Failed to start capture');\n captureRef.current = null;\n return false;\n }\n\n setIsRecording(true);\n setMicError(null);\n return true;\n }, [onAudioChunk, onError, sendAudioChunk]);\n\n const stopPcmCapture = useCallback((): boolean => {\n const capture = captureRef.current;\n if (!capture) return false;\n\n captureRef.current = null;\n capture.stop();\n capture.destroy();\n setIsRecording(false);\n return true;\n }, []);\n\n const cleanup = useCallback(() => {\n const capture = captureRef.current;\n if (!capture) return;\n captureRef.current = null;\n capture.stop();\n capture.destroy();\n setIsRecording(false);\n }, []);\n\n const startRecording = useCallback(async (): Promise<boolean> => {\n return startPcmCapture();\n }, [startPcmCapture]);\n\n const stopRecording = useCallback(\n ({ discard = false }: { discard?: boolean } = {}): boolean => {\n const ok = stopPcmCapture();\n if (!discard && ok) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n return ok;\n },\n [endAudioStream, onAudioEnd, stopPcmCapture],\n );\n\n const startPress = useCallback(() => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n\n setIsPressing(true);\n\n holdTimerRef.current = setTimeout(() => {\n if (interruptOnHoldStart) {\n interrupt();\n }\n void startPcmCapture();\n }, holdDelayMs);\n }, [holdDelayMs, interrupt, interruptOnHoldStart, startPcmCapture]);\n\n const stopPress = useCallback(() => {\n setIsPressing(false);\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n\n const ok = stopPcmCapture();\n if (ok) {\n if (onAudioEnd) onAudioEnd();\n else endAudioStream();\n }\n }, [endAudioStream, onAudioEnd, stopPcmCapture]);\n\n useEffect(() => {\n return () => {\n if (holdTimerRef.current) {\n clearTimeout(holdTimerRef.current);\n holdTimerRef.current = null;\n }\n cleanup();\n };\n }, [cleanup]);\n\n const eventHandlers = useMemo(\n () => ({\n onPointerDown: (e: React.PointerEvent) => {\n e.preventDefault();\n startPress();\n },\n onPointerUp: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerCancel: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n onPointerLeave: (e: React.PointerEvent) => {\n e.preventDefault();\n stopPress();\n },\n }),\n [startPress, stopPress],\n );\n\n return {\n isPressing,\n isRecording,\n micError,\n startRecording,\n stopRecording,\n startPress,\n stopPress,\n eventHandlers,\n };\n}\n","import { useEffect } from 'react';\nimport type { EventType, EventHandlerMap } from '../types';\nimport { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\n\nexport function useRqmiiEvents<T extends EventType>(event: T, handler: EventHandlerMap[T], deps: unknown[] = []) {\n const { events } = useRqmiiAgentContext();\n\n useEffect(() => {\n return events.on(event, handler);\n }, [event, handler, events, ...deps]);\n}\n","import { useRqmiiAgentContext } from '../provider/RqmiiAgentProvider';\nimport type { EventHandlerMap, RqmiiMessage, RqmiiState, TranscriptPayload, PartialTranscriptPayload, SessionData } from '../types';\n\ntype Listener<T> = (handler: T) => () => void;\n\nexport interface RqmiiEventListeners {\n onSessionReady: Listener<EventHandlerMap['session:ready']>;\n onSessionJoined: Listener<EventHandlerMap['session:joined']>;\n onSessionTerminated: Listener<EventHandlerMap['session:terminated']>;\n onSessionExpired: Listener<EventHandlerMap['session:expired']>;\n onMessageReceived: Listener<EventHandlerMap['message:received']>;\n onMessageSent: Listener<EventHandlerMap['message:sent']>;\n onAudioPlaying: Listener<EventHandlerMap['audio:playing']>;\n onAudioStopped: Listener<EventHandlerMap['audio:stopped']>;\n onAvatarSpeaking: Listener<EventHandlerMap['avatar:speaking']>;\n onAvatarSpeakingDone: Listener<EventHandlerMap['avatar:speaking_done']>;\n onStateChanged: Listener<EventHandlerMap['state:changed']>;\n onConnected: Listener<EventHandlerMap['connection:connected']>;\n onDisconnected: Listener<EventHandlerMap['connection:disconnected']>;\n onConnectionFailed: Listener<EventHandlerMap['connection:failed']>;\n onError: Listener<EventHandlerMap['error']>;\n onCreditsExhausted: Listener<EventHandlerMap['credits:exhausted']>;\n onTranscript: Listener<EventHandlerMap['transcript']>;\n onPartialTranscript: Listener<EventHandlerMap['partial_transcript']>;\n onInterrupted: Listener<EventHandlerMap['interrupted']>;\n}\n\nexport interface RqmiiSDKHandle {\n state: {\n messages: RqmiiMessage[];\n connectionState: RqmiiState['connectionState'];\n isConnected: boolean;\n isSessionReady: boolean;\n isAudioPlaying: boolean;\n isAgentThinking: boolean;\n isAgentSpeaking: boolean;\n isToolExecuting: boolean;\n isSessionTerminated: boolean;\n isSessionTerminating: boolean;\n creditExhausted: boolean;\n creditError: string | null;\n error: string | null;\n transcript: TranscriptPayload | null;\n partialTranscript: PartialTranscriptPayload | null;\n session: RqmiiState['session'];\n sessionState: RqmiiState['sessionState'];\n };\n actions: {\n sendTextMessage: (text: string) => boolean;\n sendAudioChunk: (audio: unknown) => boolean;\n endAudioStream: () => boolean;\n interrupt: () => boolean;\n clearSessionHistory: () => boolean;\n clearMessages: () => void;\n changeSessionLanguage: (language: string) => boolean;\n signalClientReady: (payload?: Record<string, unknown>) => boolean;\n initializeSession: (opts?: { apiKey?: string; publicChatId?: string; agentId?: string; language?: string }) => Promise<SessionData>;\n joinDesktopSession: (opts: { uniqueId: string; language?: string }) => Promise<SessionData>;\n disconnect: () => void;\n terminateSession: () => Promise<{ success: boolean }>;\n resumeAudioPlayback: () => void;\n pauseAudioPlayback: () => void;\n attachAudioElement: (el: HTMLAudioElement | null) => void;\n };\n events: RqmiiEventListeners;\n raw: {\n socket: ReturnType<typeof import('socket.io-client').io> | null;\n audioElement: HTMLAudioElement | null;\n };\n}\n\nexport function useRqmiiSDK(): RqmiiSDKHandle {\n const ctx = useRqmiiAgentContext();\n const ev = ctx.events;\n\n return {\n state: {\n messages: ctx.messages,\n connectionState: ctx.connectionState,\n isConnected: ctx.isConnected,\n isSessionReady: ctx.isSessionReady,\n isAudioPlaying: ctx.isAudioPlaying,\n isAgentThinking: ctx.isAgentThinking,\n isAgentSpeaking: ctx.isAgentSpeaking,\n isToolExecuting: ctx.isToolExecuting,\n isSessionTerminated: ctx.isSessionTerminated,\n isSessionTerminating: ctx.isSessionTerminating,\n creditExhausted: ctx.creditExhausted,\n creditError: ctx.creditError,\n error: ctx.error,\n transcript: ctx.transcript,\n partialTranscript: ctx.partialTranscript,\n session: ctx.session,\n sessionState: ctx.sessionState,\n },\n actions: {\n sendTextMessage: ctx.sendTextMessage,\n sendAudioChunk: ctx.sendAudioChunk,\n endAudioStream: ctx.endAudioStream,\n interrupt: ctx.interrupt,\n clearSessionHistory: ctx.clearSessionHistory,\n clearMessages: ctx.clearMessages,\n changeSessionLanguage: ctx.changeSessionLanguage,\n signalClientReady: ctx.signalClientReady,\n initializeSession: ctx.initializeSession,\n joinDesktopSession: ctx.joinDesktopSession,\n disconnect: ctx.disconnect,\n terminateSession: ctx.terminateSession,\n resumeAudioPlayback: ctx.resumeAudioPlayback,\n pauseAudioPlayback: ctx.pauseAudioPlayback,\n attachAudioElement: ctx.attachAudioElement,\n },\n events: {\n onSessionReady: (h) => ev.on('session:ready', h),\n onSessionJoined: (h) => ev.on('session:joined', h),\n onSessionTerminated: (h) => ev.on('session:terminated', h),\n onSessionExpired: (h) => ev.on('session:expired', h),\n onMessageReceived: (h) => ev.on('message:received', h),\n onMessageSent: (h) => ev.on('message:sent', h),\n onAudioPlaying: (h) => ev.on('audio:playing', h),\n onAudioStopped: (h) => ev.on('audio:stopped', h),\n onAvatarSpeaking: (h) => ev.on('avatar:speaking', h),\n onAvatarSpeakingDone: (h) => ev.on('avatar:speaking_done', h),\n onStateChanged: (h) => ev.on('state:changed', h),\n onConnected: (h) => ev.on('connection:connected', h),\n onDisconnected: (h) => ev.on('connection:disconnected', h),\n onConnectionFailed: (h) => ev.on('connection:failed', h),\n onError: (h) => ev.on('error', h),\n onCreditsExhausted: (h) => ev.on('credits:exhausted', h),\n onTranscript: (h) => ev.on('transcript', h),\n onPartialTranscript: (h) => ev.on('partial_transcript', h),\n onInterrupted: (h) => ev.on('interrupted', h),\n },\n raw: {\n socket: ctx.socket,\n audioElement: ctx.audioElement,\n },\n };\n}\n","import React, { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface RqmiiErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error, reset: () => void) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface RqmiiErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n}\n\nexport class RqmiiErrorBoundary extends Component<RqmiiErrorBoundaryProps, RqmiiErrorBoundaryState> {\n constructor(props: RqmiiErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null };\n }\n\n static getDerivedStateFromError(error: Error): RqmiiErrorBoundaryState {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n this.props.onError?.(error, info);\n }\n\n reset = () => {\n this.setState({ hasError: false, error: null });\n };\n\n render(): ReactNode {\n if (this.state.hasError) {\n const { fallback } = this.props;\n if (fallback) {\n if (typeof fallback === 'function') {\n return this.state.error ? fallback(this.state.error, this.reset) : null;\n }\n return fallback;\n }\n return (\n <div style={{ padding: '24px', textAlign: 'center', color: '#ef4444' }}>\n <h3>Something went wrong</h3>\n <p>{this.state.error?.message || 'An unexpected error occurred'}</p>\n <button onClick={this.reset} style={{ marginTop: '12px', padding: '8px 16px', cursor: 'pointer' }}>\n Try again\n </button>\n </div>\n );\n }\n return this.props.children;\n }\n}\n"],"names":["useRqmiiAgent","useRqmiiAgentContext","useRqmiiSession","ctx","useRqmiiAudioElement","audioRef","attachAudioElement","resumeAudioPlayback","useEffect","unlock","node","CaptureEventEmitter","event","handler","payload","handlers","DEFAULT_OPTIONS","PCM_PROCESSOR_CODE","AudioCapture","options","err","blob","processorUrl","source","ev","t","useRqmiiPressToTalk","onAudioChunk","onAudioEnd","onError","holdDelayMs","interruptOnHoldStart","sendAudioChunk","endAudioStream","interrupt","captureRef","useRef","holdTimerRef","isPressing","setIsPressing","useState","isRecording","setIsRecording","micError","setMicError","startPcmCapture","useCallback","capture","chunk","stopPcmCapture","cleanup","startRecording","stopRecording","discard","ok","startPress","stopPress","eventHandlers","useMemo","e","useRqmiiEvents","deps","events","useRqmiiSDK","h","RqmiiErrorBoundary","Component","props","error","info","fallback","jsxs","jsx"],"mappings":"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"}
|