@rqmii_immersive/agent-react-sdk 5.6.5 → 5.6.6
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/Orb-B1DErA0O.cjs +4517 -0
- package/dist/Orb-B1DErA0O.cjs.map +1 -0
- package/dist/RqmiiAgentChat-C0ymqkkq.cjs +2 -0
- package/dist/RqmiiAgentChat-C0ymqkkq.cjs.map +1 -0
- package/dist/RqmiiCloudAvatarPlayer-CmovoCKk.cjs +2918 -0
- package/dist/RqmiiCloudAvatarPlayer-CmovoCKk.cjs.map +1 -0
- package/dist/RqmiiErrorBoundary-Byif85f5.cjs +2 -0
- package/dist/RqmiiErrorBoundary-Byif85f5.cjs.map +1 -0
- package/dist/embed/chunks/Orb-CBt2svdc.js +40903 -0
- package/dist/embed/chunks/Orb-CBt2svdc.js.map +1 -0
- package/dist/embed/chunks/RqmiiCloudAvatarPlayer-DpvI9bmI.js +3357 -0
- package/dist/embed/chunks/RqmiiCloudAvatarPlayer-DpvI9bmI.js.map +1 -0
- package/dist/embed/chunks/chat-box-avatar-DlUI3fDi.js +10 -0
- package/dist/embed/chunks/chat-box-avatar-DlUI3fDi.js.map +1 -0
- package/dist/embed/chunks/chat-box-text-and-voice-BgdFP0_P.js +112 -0
- package/dist/embed/chunks/chat-box-text-and-voice-BgdFP0_P.js.map +1 -0
- package/dist/embed/chunks/chat-box-voice-D0gPyOVt.js +74 -0
- package/dist/embed/chunks/chat-box-voice-D0gPyOVt.js.map +1 -0
- package/dist/embed/chunks/embed-core-B3d4u3wf.js +12623 -0
- package/dist/embed/chunks/embed-core-B3d4u3wf.js.map +1 -0
- package/dist/embed/chunks/highlighted-body-KPVGNVTW-CJl4AHHd.js +19 -0
- package/dist/embed/chunks/highlighted-body-KPVGNVTW-CJl4AHHd.js.map +1 -0
- package/dist/embed/chunks/mermaid-HWGCJPDP-DD9SRoUR.js +22773 -0
- package/dist/embed/chunks/mermaid-HWGCJPDP-DD9SRoUR.js.map +1 -0
- package/dist/embed/chunks/use-rqmii-vad-COqAsQsT.js +10225 -0
- package/dist/embed/chunks/use-rqmii-vad-COqAsQsT.js.map +1 -0
- package/dist/embed/core.js +6 -0
- package/dist/embed/core.js.map +1 -0
- package/dist/embed.js +2 -0
- package/dist/embed.js.map +1 -0
- package/dist/highlighted-body-KPVGNVTW-CSL27xRm.cjs +2 -0
- package/dist/highlighted-body-KPVGNVTW-CSL27xRm.cjs.map +1 -0
- package/dist/index.cjs +50 -0
- package/dist/index.cjs.map +1 -0
- package/dist/lazy.cjs +2 -0
- package/dist/lazy.cjs.map +1 -0
- package/dist/mermaid-HWGCJPDP-CssnmrD3.cjs +2 -0
- package/dist/mermaid-HWGCJPDP-CssnmrD3.cjs.map +1 -0
- package/dist/schedule-load-DbAlv7OH.cjs +2 -0
- package/dist/schedule-load-DbAlv7OH.cjs.map +1 -0
- package/dist/ui-1UzY5QCI.cjs +251 -0
- package/dist/ui-1UzY5QCI.cjs.map +1 -0
- package/dist/ui.cjs +2 -0
- package/dist/ui.cjs.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { v as x, t as c, j as o, n as C } from "./embed-core-B3d4u3wf.js";
|
|
2
|
+
import { e as R, u as f, a as p, A as v } from "./mermaid-HWGCJPDP-DD9SRoUR.js";
|
|
3
|
+
function E(i) {
|
|
4
|
+
const { isPreview: t = !1, agent: r, language: e, languages: M, onLanguageChange: j, onEndSession: g, onMinimize: m, messages: h, onSendMessage: q } = i, s = g || m || C, { messages: u, sendTextMessage: l } = x(), { signalClientReady: d, error: a, isSessionReady: n } = c();
|
|
5
|
+
return R({ isSessionReady: n, sendTextMessage: l, messages: u }), f({ isSessionReady: n, signalClientReady: d }), a && !t ? /* @__PURE__ */ o.jsx(p, { message: a, language: e, onClose: s }) : /* @__PURE__ */ o.jsx(v, { agent: r, language: e, onClose: s });
|
|
6
|
+
}
|
|
7
|
+
export {
|
|
8
|
+
E as RqmiiAvatarChatBox
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=chat-box-avatar-DlUI3fDi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-box-avatar-DlUI3fDi.js","sources":["../../../src/ui/chat/chat-box-avatar.tsx"],"sourcesContent":["import React from 'react';\nimport { useRqmiiConnection, useRqmiiMessages } from '../../hooks';\nimport { AvatarChatPanel } from './panels';\nimport { ErrorPanel } from './primitives';\nimport { DUMMY_VAD, useDeferredClientReady, useWelcomeTextHandling } from './chat-box-shared';\nimport { noop } from './utils';\nimport type { ChatBoxEventHandlers, ChatBoxSdkActions, RqmiiChatBoxProps, SdkState } from './chat-box-types';\n\nexport function RqmiiAvatarChatBox(props: RqmiiChatBoxProps & ChatBoxEventHandlers) {\n const { isPreview = false, agent, language, languages, onLanguageChange, onEndSession, onMinimize, messages: previewMessages, onSendMessage } = props;\n const onClose = onEndSession || onMinimize || noop;\n const { messages, sendTextMessage, clearMessages } = useRqmiiMessages();\n const { changeSessionLanguage, clearSessionHistory, signalClientReady, error, isSessionReady, isAgentThinking, isAgentSpeaking } = useRqmiiConnection();\n const { pendingWelcomeText: _pwt, pendingMessage: _pm, setPendingWelcomeText, setPendingMessage } = useWelcomeTextHandling({ isSessionReady, sendTextMessage, messages });\n const { emitClientReady: deferredClientReady } = useDeferredClientReady({ isSessionReady, signalClientReady });\n\n const startSession = () => { props.onSessionStart?.(); };\n\n const actions: ChatBoxSdkActions = {\n emitClientReady: deferredClientReady,\n sendMessage: (text) => {\n if (isSessionReady) {\n sendTextMessage(text);\n } else {\n setPendingMessage(text);\n }\n },\n queueForWelcome: (text) => setPendingWelcomeText(text),\n enableVoice: noop,\n disableVoice: noop,\n language,\n isSessionReady,\n supportsVoice: false,\n isVoiceActive: false,\n chatKind: 'avatar',\n };\n\n const defaultTextSend = (text: string, a: ChatBoxSdkActions) => {\n startSession();\n const welcomeText = props.agent.welcomeMessages?.[props.language];\n a.emitClientReady(welcomeText ? { welcomeMessage: welcomeText } : undefined);\n a.queueForWelcome(text);\n };\n\n const handleTextSend = (text: string) => {\n if (props.onTextSend) {\n props.onTextSend(text, actions);\n } else {\n defaultTextSend(text, actions);\n }\n };\n\n const sdk: SdkState = {\n messages,\n sendTextMessage: handleTextSend,\n clearMessages,\n clearSessionHistory,\n isAudioPlaying: false,\n partialTranscript: null,\n changeSessionLanguage,\n error,\n isAgentThinking,\n isAgentSpeaking,\n isVoiceSetupLoading: false,\n isVoiceActive: false,\n isSessionReady,\n vad: DUMMY_VAD,\n startVoice: noop,\n prepareVoice: noop,\n toggleVoice: noop,\n signalClientReady,\n };\n\n if (error && !isPreview) return <ErrorPanel message={error} language={language} onClose={onClose} />;\n\n return <AvatarChatPanel agent={agent} language={language} onClose={onClose} />;\n}\n"],"names":["RqmiiAvatarChatBox","props","isPreview","agent","language","languages","onLanguageChange","onEndSession","onMinimize","previewMessages","onSendMessage","onClose","noop","messages","sendTextMessage","useRqmiiMessages","signalClientReady","error","isSessionReady","useRqmiiConnection","useWelcomeTextHandling","useDeferredClientReady","ErrorPanel","jsx","AvatarChatPanel"],"mappings":";;AAQO,SAASA,EAAmBC,GAAiD;AAClF,QAAM,EAAE,WAAAC,IAAY,IAAO,OAAAC,GAAO,UAAAC,GAAU,WAAAC,GAAW,kBAAAC,GAAkB,cAAAC,GAAc,YAAAC,GAAY,UAAUC,GAAiB,eAAAC,EAAA,IAAkBT,GAC1IU,IAAUJ,KAAgBC,KAAcI,GACxC,EAAE,UAAAC,GAAU,iBAAAC,EAA+B,IAAIC,EAAA,GAC/C,EAA8C,mBAAAC,GAAmB,OAAAC,GAAO,gBAAAC,EAAiD,IAAIC,EAAA;AA6DnI,SA5DoGC,EAAuB,EAAE,gBAAAF,GAAgB,iBAAAJ,GAAiB,UAAAD,GAAU,GACvHQ,EAAuB,EAAE,gBAAAH,GAAgB,mBAAAF,GAAmB,GA2DzGC,KAAS,CAACf,0BAAmBoB,GAAA,EAAW,SAASL,GAAO,UAAAb,GAAoB,SAAAO,GAAkB,IAE3FY,gBAAAA,EAAAA,IAACC,GAAA,EAAgB,OAAArB,GAAc,UAAAC,GAAoB,SAAAO,EAAA,CAAkB;AAC9E;"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { v as $, t as p, r as t, j as ee } from "./embed-core-B3d4u3wf.js";
|
|
2
|
+
import { u as te, d as se, R as ne } from "./mermaid-HWGCJPDP-DD9SRoUR.js";
|
|
3
|
+
import { a as ie, u as ae } from "./use-rqmii-vad-COqAsQsT.js";
|
|
4
|
+
const oe = 300;
|
|
5
|
+
function fe(s) {
|
|
6
|
+
const { isPreview: L = !1, ..._ } = s, { messages: n, sendTextMessage: k, emitUserMessage: l, addLocalMessage: g, clearMessages: C } = $(), { isAudioPlaying: D, partialTranscript: P } = ie(), { changeSessionLanguage: U, clearSessionHistory: j, signalClientReady: d, error: W, isSessionReady: i, isAgentThinking: B, isAgentSpeaking: K } = p(), { emitClientReady: O } = te({ isSessionReady: i, signalClientReady: d }), [m, S] = t.useState(!1), R = t.useRef(null), [A, G] = t.useState(!1), V = t.useRef(null), [w, y] = t.useState(!1), F = t.useRef(!1), o = t.useRef(!1), r = t.useRef(!1), [x, T] = t.useState(null), [H, c] = t.useState(!1), q = t.useRef(n.length);
|
|
7
|
+
t.useEffect(() => {
|
|
8
|
+
if (n.length > q.current) {
|
|
9
|
+
const e = n[n.length - 1];
|
|
10
|
+
e.role === "assistant" && e.streaming && c(!1);
|
|
11
|
+
}
|
|
12
|
+
q.current = n.length;
|
|
13
|
+
}, [n]), se("message_rate_limited", t.useCallback(() => {
|
|
14
|
+
c(!1);
|
|
15
|
+
}, []));
|
|
16
|
+
const E = ae({
|
|
17
|
+
enabled: !0,
|
|
18
|
+
preloadStream: !1
|
|
19
|
+
}), { isLoading: M, isListening: f, toggle: h } = E, z = M, b = f || m;
|
|
20
|
+
t.useEffect(() => {
|
|
21
|
+
!m || !i || M || f || h();
|
|
22
|
+
}, [m, i, M, f, h]), t.useEffect(() => {
|
|
23
|
+
if (!i || !A || r.current) return;
|
|
24
|
+
const e = R.current;
|
|
25
|
+
if (e === null) return;
|
|
26
|
+
r.current = !0, R.current = null, g("user", e), T(null);
|
|
27
|
+
const a = s.agent.welcomeMessages?.[s.language];
|
|
28
|
+
d(a ? { welcomeMessage: a } : void 0);
|
|
29
|
+
const Z = setTimeout(() => {
|
|
30
|
+
l(e), c(!0);
|
|
31
|
+
}, oe);
|
|
32
|
+
return () => clearTimeout(Z);
|
|
33
|
+
}, [i, A, d, l, g]), t.useEffect(() => {
|
|
34
|
+
if (!i || !w || F.current) return;
|
|
35
|
+
const e = V.current;
|
|
36
|
+
e !== null && (F.current = !0, V.current = null, g("user", e), l(e), c(!0), y(!1));
|
|
37
|
+
}, [i, w, l, g]);
|
|
38
|
+
const I = t.useMemo(() => x ? [{ id: "first-user", role: "user", text: x }, ...n] : n, [x, n]), J = t.useCallback(() => {
|
|
39
|
+
T(null), o.current = !1, r.current = !1, C();
|
|
40
|
+
}, [C]), v = () => {
|
|
41
|
+
s.onSessionStart?.();
|
|
42
|
+
}, u = {
|
|
43
|
+
emitClientReady: (e) => {
|
|
44
|
+
r.current = !0, o.current = !0, O(e);
|
|
45
|
+
},
|
|
46
|
+
sendMessage: (e) => {
|
|
47
|
+
k(e);
|
|
48
|
+
},
|
|
49
|
+
queueForWelcome: () => {
|
|
50
|
+
},
|
|
51
|
+
enableVoice: () => S(!0),
|
|
52
|
+
disableVoice: () => {
|
|
53
|
+
S(!1), f && h();
|
|
54
|
+
},
|
|
55
|
+
language: s.language,
|
|
56
|
+
isSessionReady: i,
|
|
57
|
+
supportsVoice: !0,
|
|
58
|
+
isVoiceActive: b,
|
|
59
|
+
chatKind: "text_and_voice"
|
|
60
|
+
}, N = (e, a) => {
|
|
61
|
+
v(), !o.current && !r.current ? (o.current = !0, s.onStartText?.(), T(e), R.current = e, G(!0), c(!0)) : (o.current = !0, c(!0), a.sendMessage(e));
|
|
62
|
+
}, Q = (e) => {
|
|
63
|
+
v(), o.current = !0, r.current = !0, s.onStartVoice?.(), e.enableVoice();
|
|
64
|
+
const a = s.agent.welcomeMessages?.[s.language];
|
|
65
|
+
e.emitClientReady(a ? { welcomeMessage: a } : void 0);
|
|
66
|
+
}, X = (e) => {
|
|
67
|
+
e.isVoiceActive ? e.disableVoice() : e.enableVoice();
|
|
68
|
+
}, Y = {
|
|
69
|
+
messages: I,
|
|
70
|
+
sendTextMessage: (e) => {
|
|
71
|
+
s.onTextSend ? s.onTextSend(e, u) : N(e, u);
|
|
72
|
+
},
|
|
73
|
+
clearMessages: J,
|
|
74
|
+
clearSessionHistory: j,
|
|
75
|
+
isAudioPlaying: D,
|
|
76
|
+
partialTranscript: P,
|
|
77
|
+
changeSessionLanguage: U,
|
|
78
|
+
error: W,
|
|
79
|
+
isAgentThinking: B,
|
|
80
|
+
isAgentSpeaking: K,
|
|
81
|
+
isVoiceSetupLoading: z,
|
|
82
|
+
isVoiceActive: b,
|
|
83
|
+
isSessionReady: i,
|
|
84
|
+
vad: E,
|
|
85
|
+
startVoice: () => {
|
|
86
|
+
s.onVoiceStart ? s.onVoiceStart(u) : Q(u);
|
|
87
|
+
},
|
|
88
|
+
prepareVoice: () => {
|
|
89
|
+
},
|
|
90
|
+
toggleVoice: () => {
|
|
91
|
+
s.onVoiceToggle ? s.onVoiceToggle(u) : X(u);
|
|
92
|
+
},
|
|
93
|
+
signalClientReady: d,
|
|
94
|
+
waitingForResponse: H,
|
|
95
|
+
sendSuggestion: (e) => {
|
|
96
|
+
v(), o.current = !0, r.current = !0, s.onStartVoice?.(), S(!0), V.current = e, y(!0);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
return /* @__PURE__ */ ee.jsx(
|
|
100
|
+
ne,
|
|
101
|
+
{
|
|
102
|
+
..._,
|
|
103
|
+
isPreview: L,
|
|
104
|
+
chatKind: s.textOnly ? "text" : "text_and_voice",
|
|
105
|
+
sdk: Y
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
fe as RqmiiTextAndVoiceChatBox
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=chat-box-text-and-voice-BgdFP0_P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-box-text-and-voice-BgdFP0_P.js","sources":["../../../src/ui/chat/chat-box-text-and-voice.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRqmiiConnection, useRqmiiEvents, useRqmiiMessages, useRqmiiVAD, useRqmiiVoice } from '../../hooks';\nimport { RqmiiChatBoxContent } from './chat-box-content';\nimport { useDeferredClientReady } from './chat-box-shared';\nimport type { ChatBoxEventHandlers, ChatBoxSdkActions, RqmiiChatBoxProps, SdkState } from './chat-box-types';\n\n// Safeguard delay between client_ready (welcome) and the user's first text message (response)\n// on the text-first path, so the backend welcome arrives before the response.\nconst WELCOME_SAFEGUARD_MS = 300;\n\nexport function RqmiiTextAndVoiceChatBox(props: RqmiiChatBoxProps & ChatBoxEventHandlers) {\n const { isPreview = false, ...restProps } = props;\n const { messages, sendTextMessage, emitUserMessage, addLocalMessage, clearMessages } = useRqmiiMessages();\n const { isAudioPlaying, partialTranscript } = useRqmiiVoice();\n const { changeSessionLanguage, clearSessionHistory, signalClientReady, error, isSessionReady, isAgentThinking, isAgentSpeaking } = useRqmiiConnection();\n const { emitClientReady: deferredClientReady } = useDeferredClientReady({ isSessionReady, signalClientReady });\n const [voiceRequested, setVoiceRequested] = useState(false);\n // First message from the text-first path is queued until the session is ready (backend welcome flow).\n const pendingTextRef = useRef<string | null>(null);\n const [pendingFlag, setPendingFlag] = useState(false);\n // A suggestion click starts voice + text together, so its message is queued separately\n // from the text-first welcome flow above (no client_ready is emitted for suggestions).\n const pendingSuggestionRef = useRef<string | null>(null);\n const [pendingSuggestionFlag, setPendingSuggestionFlag] = useState(false);\n const suggestionFlowDoneRef = useRef(false);\n const textStartedRef = useRef(false);\n const welcomeFlowDoneRef = useRef(false);\n // The first text-first user message is kept in local state so it survives the provider's\n // HARD_RESET during session initialization and appears immediately.\n const [firstUserText, setFirstUserText] = useState<string | null>(null);\n const [waitingForResponse, setWaitingForResponse] = useState(false);\n const prevMsgCountRef = useRef(messages.length);\n\n useEffect(() => {\n if (messages.length > prevMsgCountRef.current) {\n const lastMsg = messages[messages.length - 1];\n const isAssistant = lastMsg.role === 'assistant';\n if (isAssistant && lastMsg.streaming) {\n setWaitingForResponse(false);\n }\n }\n prevMsgCountRef.current = messages.length;\n }, [messages]);\n\n // A rate-limited message never yields an agent response, so release the\n // typing indicator instead of leaving it spinning forever.\n useRqmiiEvents('message_rate_limited', useCallback(() => {\n setWaitingForResponse(false);\n }, []));\n\n // Barge-in is owned entirely by the backend now. It interrupts the agent only\n // when the first confirmed partial transcript arrives and emits `interrupted`,\n // which stops playback via the socket handler. We intentionally do NOT pause\n // playback locally on VAD speech-start: that fired on coughs / background\n // noise and cut the agent off on false positives.\n const vad = useRqmiiVAD({\n enabled: true,\n preloadStream: false,\n });\n const { isLoading: isVadLoading, isListening, toggle: toggleListening } = vad;\n const isVoiceSetupLoading = isVadLoading;\n const isVoiceActive = isListening || voiceRequested;\n\n useEffect(() => {\n if (!voiceRequested || !isSessionReady || isVadLoading || isListening) return;\n void toggleListening();\n }, [voiceRequested, isSessionReady, isVadLoading, isListening, toggleListening]);\n\n // Text-first backend welcome flow: once the session is ready, emit client_ready (backend\n // produces the welcome), then after a short safeguard delay emit the user's message\n // (backend responds). The user's message is already shown via `firstUserText`. The pending\n // text is held in a ref so the delayed send is not cancelled by a re-render.\n useEffect(() => {\n if (!isSessionReady || !pendingFlag || welcomeFlowDoneRef.current) return;\n const text = pendingTextRef.current;\n if (text === null) return;\n welcomeFlowDoneRef.current = true;\n pendingTextRef.current = null;\n // Persist the first user message to provider state (durable history) and drop the\n // optimistic local copy.\n addLocalMessage('user', text);\n setFirstUserText(null);\n const welcomeText = props.agent.welcomeMessages?.[props.language];\n signalClientReady(welcomeText ? { welcomeMessage: welcomeText } : undefined);\n const timer = setTimeout(() => { emitUserMessage(text); setWaitingForResponse(true); }, WELCOME_SAFEGUARD_MS);\n return () => clearTimeout(timer);\n }, [isSessionReady, pendingFlag, signalClientReady, emitUserMessage, addLocalMessage]);\n\n // Suggestion click flow: the session is only just starting (socket not connected yet), so the\n // message is held until the session is ready, then displayed locally and emitted to the\n // backend. No client_ready is emitted here — the suggestion IS the user's first message.\n useEffect(() => {\n if (!isSessionReady || !pendingSuggestionFlag || suggestionFlowDoneRef.current) return;\n const text = pendingSuggestionRef.current;\n if (text === null) return;\n suggestionFlowDoneRef.current = true;\n pendingSuggestionRef.current = null;\n addLocalMessage('user', text);\n emitUserMessage(text);\n setWaitingForResponse(true);\n setPendingSuggestionFlag(false);\n }, [isSessionReady, pendingSuggestionFlag, emitUserMessage, addLocalMessage]);\n\n // The first user message shows first, followed by the backend welcome and response.\n const displayMessages = useMemo(() => (\n firstUserText\n ? [{ id: 'first-user', role: 'user', text: firstUserText }, ...messages]\n : messages\n ), [firstUserText, messages]);\n\n // Refresh clears both the optimistic first message and the provider messages.\n const clearAll = useCallback(() => {\n setFirstUserText(null);\n textStartedRef.current = false;\n welcomeFlowDoneRef.current = false;\n clearMessages();\n }, [clearMessages]);\n\n const startSession = () => { props.onSessionStart?.(); };\n\n const actions: ChatBoxSdkActions = {\n emitClientReady: (payload) => {\n welcomeFlowDoneRef.current = true;\n textStartedRef.current = true;\n deferredClientReady(payload);\n },\n sendMessage: (text) => {\n sendTextMessage(text);\n },\n queueForWelcome: () => {},\n enableVoice: () => setVoiceRequested(true),\n disableVoice: () => { setVoiceRequested(false); if (isListening) void toggleListening(); },\n language: props.language,\n isSessionReady,\n supportsVoice: true,\n isVoiceActive,\n chatKind: 'text_and_voice',\n };\n\n const defaultTextSend = (text: string, a: ChatBoxSdkActions) => {\n startSession();\n if (!textStartedRef.current && !welcomeFlowDoneRef.current) {\n // First text message chooses the text-only path and runs the backend welcome flow:\n // display locally now, then client_ready + delayed backend send once the session is ready.\n textStartedRef.current = true;\n props.onStartText?.();\n setFirstUserText(text);\n pendingTextRef.current = text;\n setPendingFlag(true);\n setWaitingForResponse(true);\n } else {\n // Subsequent messages in the established text-only session send normally.\n textStartedRef.current = true;\n setWaitingForResponse(true);\n a.sendMessage(text);\n }\n };\n\n const defaultVoiceStart = (a: ChatBoxSdkActions) => {\n startSession();\n textStartedRef.current = true;\n welcomeFlowDoneRef.current = true;\n props.onStartVoice?.();\n a.enableVoice();\n const welcomeText = props.agent.welcomeMessages?.[props.language];\n a.emitClientReady(welcomeText ? { welcomeMessage: welcomeText } : undefined);\n };\n\n const defaultVoiceToggle = (a: ChatBoxSdkActions) => {\n if (a.isVoiceActive) {\n a.disableVoice();\n } else {\n a.enableVoice();\n }\n };\n\n const handleTextSend = (text: string) => {\n if (props.onTextSend) {\n props.onTextSend(text, actions);\n } else {\n defaultTextSend(text, actions);\n }\n };\n\n const handleVoiceStart = () => {\n if (props.onVoiceStart) {\n props.onVoiceStart(actions);\n } else {\n defaultVoiceStart(actions);\n }\n };\n\n const handleVoiceToggle = () => {\n if (props.onVoiceToggle) {\n props.onVoiceToggle(actions);\n } else {\n defaultVoiceToggle(actions);\n }\n };\n\n const sdk: SdkState = {\n messages: displayMessages,\n sendTextMessage: handleTextSend,\n clearMessages: clearAll,\n clearSessionHistory,\n isAudioPlaying,\n partialTranscript,\n changeSessionLanguage,\n error,\n isAgentThinking,\n isAgentSpeaking,\n isVoiceSetupLoading,\n isVoiceActive,\n isSessionReady,\n vad,\n startVoice: handleVoiceStart,\n prepareVoice: () => {},\n toggleVoice: handleVoiceToggle,\n signalClientReady,\n waitingForResponse,\n sendSuggestion: (text) => {\n startSession();\n textStartedRef.current = true;\n welcomeFlowDoneRef.current = true;\n props.onStartVoice?.();\n setVoiceRequested(true);\n pendingSuggestionRef.current = text;\n setPendingSuggestionFlag(true);\n },\n };\n\n return (\n <RqmiiChatBoxContent\n {...restProps}\n isPreview={isPreview}\n chatKind={props.textOnly ? 'text' : 'text_and_voice'}\n sdk={sdk}\n />\n );\n}\n"],"names":["WELCOME_SAFEGUARD_MS","RqmiiTextAndVoiceChatBox","props","isPreview","restProps","messages","sendTextMessage","emitUserMessage","addLocalMessage","clearMessages","useRqmiiMessages","isAudioPlaying","partialTranscript","useRqmiiVoice","changeSessionLanguage","clearSessionHistory","signalClientReady","error","isSessionReady","isAgentThinking","isAgentSpeaking","useRqmiiConnection","deferredClientReady","useDeferredClientReady","voiceRequested","setVoiceRequested","useState","pendingTextRef","useRef","pendingFlag","setPendingFlag","pendingSuggestionRef","pendingSuggestionFlag","setPendingSuggestionFlag","suggestionFlowDoneRef","textStartedRef","welcomeFlowDoneRef","firstUserText","setFirstUserText","waitingForResponse","setWaitingForResponse","prevMsgCountRef","useEffect","lastMsg","useRqmiiEvents","useCallback","vad","useRqmiiVAD","isVadLoading","isListening","toggleListening","isVoiceSetupLoading","isVoiceActive","text","welcomeText","timer","displayMessages","useMemo","clearAll","startSession","actions","payload","defaultTextSend","defaultVoiceStart","a","defaultVoiceToggle","sdk","jsx","RqmiiChatBoxContent"],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { v as W, t as B, r as f, j as D } from "./embed-core-B3d4u3wf.js";
|
|
2
|
+
import { e as H, u as K, R as F } from "./mermaid-HWGCJPDP-DD9SRoUR.js";
|
|
3
|
+
import { a as p, u as z } from "./use-rqmii-vad-COqAsQsT.js";
|
|
4
|
+
function Q(i) {
|
|
5
|
+
const { isPreview: R = !1, ...S } = i, { messages: l, sendTextMessage: g, clearMessages: T } = W(), { isAudioPlaying: v, partialTranscript: x } = p(), { changeSessionLanguage: h, clearSessionHistory: C, signalClientReady: d, error: q, isSessionReady: s, isAgentThinking: y, isAgentSpeaking: M } = B(), { setPendingWelcomeText: b, setPendingMessage: A } = H({ isSessionReady: s, sendTextMessage: g, messages: l }), { emitClientReady: L } = K({ isSessionReady: s, signalClientReady: d }), [n, r] = f.useState(!1), u = z({
|
|
6
|
+
enabled: !0,
|
|
7
|
+
preloadStream: !1
|
|
8
|
+
}), { isLoading: a, isListening: t, toggle: c } = u, P = a, V = t || n;
|
|
9
|
+
f.useEffect(() => {
|
|
10
|
+
!n || !s || a || t || c();
|
|
11
|
+
}, [n, s, a, t, c]);
|
|
12
|
+
const w = () => {
|
|
13
|
+
i.onSessionStart?.();
|
|
14
|
+
}, o = {
|
|
15
|
+
emitClientReady: L,
|
|
16
|
+
sendMessage: (e) => {
|
|
17
|
+
s ? g(e) : A(e);
|
|
18
|
+
},
|
|
19
|
+
queueForWelcome: (e) => b(e),
|
|
20
|
+
enableVoice: () => r(!0),
|
|
21
|
+
disableVoice: () => {
|
|
22
|
+
r(!1), t && c();
|
|
23
|
+
},
|
|
24
|
+
language: i.language,
|
|
25
|
+
isSessionReady: s,
|
|
26
|
+
supportsVoice: !0,
|
|
27
|
+
isVoiceActive: V,
|
|
28
|
+
chatKind: "voice"
|
|
29
|
+
}, j = (e) => {
|
|
30
|
+
w(), e.enableVoice();
|
|
31
|
+
const m = i.agent.welcomeMessages?.[i.language];
|
|
32
|
+
e.emitClientReady(m ? { welcomeMessage: m } : void 0);
|
|
33
|
+
}, k = (e) => {
|
|
34
|
+
e.isVoiceActive ? e.disableVoice() : e.enableVoice();
|
|
35
|
+
}, E = {
|
|
36
|
+
messages: l,
|
|
37
|
+
sendTextMessage: () => {
|
|
38
|
+
},
|
|
39
|
+
clearMessages: T,
|
|
40
|
+
clearSessionHistory: C,
|
|
41
|
+
isAudioPlaying: v,
|
|
42
|
+
partialTranscript: x,
|
|
43
|
+
changeSessionLanguage: h,
|
|
44
|
+
error: q,
|
|
45
|
+
isAgentThinking: y,
|
|
46
|
+
isAgentSpeaking: M,
|
|
47
|
+
isVoiceSetupLoading: P,
|
|
48
|
+
isVoiceActive: V,
|
|
49
|
+
isSessionReady: s,
|
|
50
|
+
vad: u,
|
|
51
|
+
startVoice: () => {
|
|
52
|
+
i.onVoiceStart ? i.onVoiceStart(o) : j(o);
|
|
53
|
+
},
|
|
54
|
+
prepareVoice: () => {
|
|
55
|
+
},
|
|
56
|
+
toggleVoice: () => {
|
|
57
|
+
i.onVoiceToggle ? i.onVoiceToggle(o) : k(o);
|
|
58
|
+
},
|
|
59
|
+
signalClientReady: d
|
|
60
|
+
};
|
|
61
|
+
return /* @__PURE__ */ D.jsx(
|
|
62
|
+
F,
|
|
63
|
+
{
|
|
64
|
+
...S,
|
|
65
|
+
isPreview: R,
|
|
66
|
+
chatKind: "voice",
|
|
67
|
+
sdk: E
|
|
68
|
+
}
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
export {
|
|
72
|
+
Q as RqmiiVoiceChatBox
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=chat-box-voice-D0gPyOVt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-box-voice-D0gPyOVt.js","sources":["../../../src/ui/chat/chat-box-voice.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useRqmiiConnection, useRqmiiMessages, useRqmiiVAD, useRqmiiVoice } from '../../hooks';\nimport { RqmiiChatBoxContent } from './chat-box-content';\nimport { useDeferredClientReady, useWelcomeTextHandling } from './chat-box-shared';\nimport type { ChatBoxEventHandlers, ChatBoxSdkActions, RqmiiChatBoxProps, SdkState } from './chat-box-types';\n\nexport function RqmiiVoiceChatBox(props: RqmiiChatBoxProps & ChatBoxEventHandlers) {\n const { isPreview = false, ...restProps } = props;\n const { messages, sendTextMessage, clearMessages } = useRqmiiMessages();\n const { isAudioPlaying, partialTranscript } = useRqmiiVoice();\n const { changeSessionLanguage, clearSessionHistory, signalClientReady, error, isSessionReady, isAgentThinking, isAgentSpeaking } = useRqmiiConnection();\n const { pendingWelcomeText: _pwt, pendingMessage: _pm, setPendingWelcomeText, setPendingMessage } = useWelcomeTextHandling({ isSessionReady, sendTextMessage, messages });\n const { emitClientReady: deferredClientReady } = useDeferredClientReady({ isSessionReady, signalClientReady });\n const [voiceRequested, setVoiceRequested] = useState(false);\n\n // Barge-in is owned entirely by the backend now. It interrupts the agent only\n // when the first confirmed partial transcript arrives and emits `interrupted`,\n // which stops playback via the socket handler. We intentionally do NOT pause\n // playback locally on VAD speech-start: that fired on coughs / background\n // noise and cut the agent off on false positives.\n const vad = useRqmiiVAD({\n enabled: true,\n preloadStream: false,\n });\n const { isLoading: isVadLoading, isListening, toggle: toggleListening } = vad;\n const isVoiceSetupLoading = isVadLoading;\n const isVoiceActive = isListening || voiceRequested;\n\n useEffect(() => {\n if (!voiceRequested || !isSessionReady || isVadLoading || isListening) return;\n void toggleListening();\n }, [voiceRequested, isSessionReady, isVadLoading, isListening, toggleListening]);\n\n const startSession = () => { props.onSessionStart?.(); };\n\n const actions: ChatBoxSdkActions = {\n emitClientReady: deferredClientReady,\n sendMessage: (text) => {\n if (isSessionReady) {\n sendTextMessage(text);\n } else {\n setPendingMessage(text);\n }\n },\n queueForWelcome: (text) => setPendingWelcomeText(text),\n enableVoice: () => setVoiceRequested(true),\n disableVoice: () => { setVoiceRequested(false); if (isListening) void toggleListening(); },\n language: props.language,\n isSessionReady,\n supportsVoice: true,\n isVoiceActive,\n chatKind: 'voice',\n };\n\n const defaultVoiceStart = (a: ChatBoxSdkActions) => {\n startSession();\n a.enableVoice();\n const welcomeText = props.agent.welcomeMessages?.[props.language];\n a.emitClientReady(welcomeText ? { welcomeMessage: welcomeText } : undefined);\n };\n\n const defaultVoiceToggle = (a: ChatBoxSdkActions) => {\n if (a.isVoiceActive) {\n a.disableVoice();\n } else {\n a.enableVoice();\n }\n };\n\n const handleVoiceStart = () => {\n if (props.onVoiceStart) {\n props.onVoiceStart(actions);\n } else {\n defaultVoiceStart(actions);\n }\n };\n\n const handleVoiceToggle = () => {\n if (props.onVoiceToggle) {\n props.onVoiceToggle(actions);\n } else {\n defaultVoiceToggle(actions);\n }\n };\n\n const sdk: SdkState = {\n messages,\n sendTextMessage: () => {},\n clearMessages,\n clearSessionHistory,\n isAudioPlaying,\n partialTranscript,\n changeSessionLanguage,\n error,\n isAgentThinking,\n isAgentSpeaking,\n isVoiceSetupLoading,\n isVoiceActive,\n isSessionReady,\n vad,\n startVoice: handleVoiceStart,\n prepareVoice: () => {},\n toggleVoice: handleVoiceToggle,\n signalClientReady,\n };\n\n return (\n <RqmiiChatBoxContent\n {...restProps}\n isPreview={isPreview}\n chatKind=\"voice\"\n sdk={sdk}\n />\n );\n}\n"],"names":["RqmiiVoiceChatBox","props","isPreview","restProps","messages","sendTextMessage","clearMessages","useRqmiiMessages","isAudioPlaying","partialTranscript","useRqmiiVoice","changeSessionLanguage","clearSessionHistory","signalClientReady","error","isSessionReady","isAgentThinking","isAgentSpeaking","useRqmiiConnection","setPendingWelcomeText","setPendingMessage","useWelcomeTextHandling","deferredClientReady","useDeferredClientReady","voiceRequested","setVoiceRequested","useState","vad","useRqmiiVAD","isVadLoading","isListening","toggleListening","isVoiceSetupLoading","isVoiceActive","useEffect","startSession","actions","text","defaultVoiceStart","a","welcomeText","defaultVoiceToggle","sdk","jsx","RqmiiChatBoxContent"],"mappings":"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"}
|