@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/context/ChatBotContext.d.ts.map +1 -1
- package/dist/context/ChatBotContext.js +5 -2
- package/dist/types/ChatBotTypes.d.ts +11 -0
- package/dist/types/ChatBotTypes.d.ts.map +1 -1
- package/dist/ui/VoiceModePanel.d.ts.map +1 -1
- package/dist/ui/VoiceModePanel.js +37 -2
- package/package.json +2 -2
- package/src/context/ChatBotContext.tsx +6 -0
- package/src/types/ChatBotTypes.ts +11 -0
- package/src/ui/VoiceModePanel.tsx +53 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatBotContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAyB/B,OAAO,EAEL,kBAAkB,EAClB,YAAY,EAEb,MAAM,uBAAuB,CAAC;AAM/B,eAAO,MAAM,UAAU,0BAMtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,
|
|
1
|
+
{"version":3,"file":"ChatBotContext.d.ts","sourceRoot":"","sources":["../../src/context/ChatBotContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAyB/B,OAAO,EAEL,kBAAkB,EAClB,YAAY,EAEb,MAAM,uBAAuB,CAAC;AAM/B,eAAO,MAAM,UAAU,0BAMtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAqrGlD,CAAC"}
|
|
@@ -32,7 +32,7 @@ isStopRecordingOnSend = false,
|
|
|
32
32
|
// Custom error message to display in chat
|
|
33
33
|
customError,
|
|
34
34
|
// PII display mode
|
|
35
|
-
piiDisplayMode = 'redacted', }) => {
|
|
35
|
+
piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, }) => {
|
|
36
36
|
// Set API hosts immediately based on environment (before any API calls)
|
|
37
37
|
setApiHosts(environment);
|
|
38
38
|
const nxtlinqApi = React.useMemo(() => createNxtlinqApi(apiKey, apiSecret), [apiKey, apiSecret]);
|
|
@@ -2232,7 +2232,7 @@ piiDisplayMode = 'redacted', }) => {
|
|
|
2232
2232
|
stopTextToSpeechAndReset();
|
|
2233
2233
|
}
|
|
2234
2234
|
}, [textToSpeechEnabled, stopTextToSpeechAndReset]);
|
|
2235
|
-
const { isVoiceMode, voiceStatus, isVoiceConnecting, isMicMuted, remoteAudioRef, enterVoiceMode, exitVoiceMode, toggleMicMute: toggleVoiceMicMute, interruptVoice, } = useVoiceMode({
|
|
2235
|
+
const { isVoiceMode, voiceStatus, isVoiceConnecting, isMicMuted, remoteAudioRef, enterVoiceMode, exitVoiceMode, toggleMicMute: toggleVoiceMicMute, interruptVoice, micRms, } = useVoiceMode({
|
|
2236
2236
|
apiKey,
|
|
2237
2237
|
apiSecret,
|
|
2238
2238
|
pseudoId,
|
|
@@ -2251,6 +2251,7 @@ piiDisplayMode = 'redacted', }) => {
|
|
|
2251
2251
|
stopRecording,
|
|
2252
2252
|
stopTextToSpeech: stopTextToSpeechAndReset,
|
|
2253
2253
|
voiceTransport: 'ws-realtime',
|
|
2254
|
+
voiceThresholds,
|
|
2254
2255
|
});
|
|
2255
2256
|
React.useEffect(() => {
|
|
2256
2257
|
if (!isOpen && isVoiceMode) {
|
|
@@ -2941,6 +2942,8 @@ piiDisplayMode = 'redacted', }) => {
|
|
|
2941
2942
|
exitVoiceMode: handleExitVoiceMode,
|
|
2942
2943
|
toggleVoiceMicMute,
|
|
2943
2944
|
interruptVoice,
|
|
2945
|
+
micRms,
|
|
2946
|
+
debugVoiceRms,
|
|
2944
2947
|
// Additional properties for PermissionForm
|
|
2945
2948
|
onSave: savePermissions,
|
|
2946
2949
|
onConnectWallet: () => connectWallet(false),
|
|
@@ -67,6 +67,15 @@ export interface ChatBotProps {
|
|
|
67
67
|
* - 'redacted': Anonymized text with PII tokens displayed (default)
|
|
68
68
|
*/
|
|
69
69
|
piiDisplayMode?: 'plain' | 'redacted';
|
|
70
|
+
/** Override mic VAD thresholds. Useful for tuning sensitivity per deployment. */
|
|
71
|
+
voiceThresholds?: {
|
|
72
|
+
speechRmsThreshold?: number;
|
|
73
|
+
bargeInRmsThreshold?: number;
|
|
74
|
+
speechMinDurationMs?: number;
|
|
75
|
+
silenceCommitMs?: number;
|
|
76
|
+
};
|
|
77
|
+
/** Show RMS debug bar in VoiceModePanel. For development/tuning only. */
|
|
78
|
+
debugVoiceRms?: boolean;
|
|
70
79
|
}
|
|
71
80
|
export interface ChatBotContextType {
|
|
72
81
|
messages: Message[];
|
|
@@ -111,6 +120,8 @@ export interface ChatBotContextType {
|
|
|
111
120
|
isVoiceConnecting: boolean;
|
|
112
121
|
isMicMuted: boolean;
|
|
113
122
|
remoteAudioRef: React.RefObject<HTMLAudioElement>;
|
|
123
|
+
micRms: number;
|
|
124
|
+
debugVoiceRms: boolean;
|
|
114
125
|
setInputValue: (value: string) => void;
|
|
115
126
|
setIsOpen: (open: boolean) => void;
|
|
116
127
|
setShowPermissionForm: (show: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAErI,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,KAAK,IAAI,KACP,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,SAAS,CAAC,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC,WAAW,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAElD,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,8CAA8C,CAAC;AAErI,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAGD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CACV,OAAO,EAAE,OAAO,EAChB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,KAAK,IAAI,KACP,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,SAAS,CAAC,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAE3B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC,WAAW,CAAC,EAAE,iBAAiB,GAAG,eAAe,CAAC;IAElD,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAEjC,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACvC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACtC,iFAAiF;IACjF,eAAe,CAAC,EAAE;QAChB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,yEAAyE;IACzE,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,oBAAoB,EAAE,iBAAiB,EAAE,CAAC;IAC1C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,oBAAoB,EAAE,OAAO,CAAC;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE;QACZ,IAAI,EAAE,OAAO,CAAC;QACd,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;QAC/C,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,YAAY,EAAE,OAAO,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAChD,eAAe,EAAE,OAAO,CAAC;IAEzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,aAAa,EAAE,CAAC;IAE7B,cAAc,EAAE,OAAO,GAAG,UAAU,CAAC;IAErC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IAGvB,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,qBAAqB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,uBAAuB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,eAAe,EAAE,CAAC,YAAY,EAAE,GAAG,KAAK,IAAI,CAAC;IAE7C,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,KAAK,IAAI,CAAC;IACvD,kBAAkB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAGnD,aAAa,EAAE,CAAC,qBAAqB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IACxF,YAAY,EAAE,CAAC,sBAAsB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClE,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,YAAY,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChF,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,uBAAuB,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,EAAE,CAAC,sBAAsB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,iBAAiB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,eAAe,EAAE,MAAM,OAAO,CAAC;IAE/B,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,gBAAgB,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/E,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,cAAc,EAAE,MAAM,IAAI,CAAC;IAG3B,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,eAAe,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC,CAAC;IAC3D,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,cAAc,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceModePanel.d.ts","sourceRoot":"","sources":["../../src/ui/VoiceModePanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"VoiceModePanel.d.ts","sourceRoot":"","sources":["../../src/ui/VoiceModePanel.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAwC/B,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EA8KlC,CAAC"}
|
|
@@ -35,8 +35,15 @@ const STATUS_HINTS = {
|
|
|
35
35
|
generating: 'Assistant is responding…',
|
|
36
36
|
speaking: 'Assistant is speaking…',
|
|
37
37
|
};
|
|
38
|
+
const DEFAULT_SPEECH_RMS_THRESHOLD = 0.015;
|
|
39
|
+
const DEFAULT_BARGE_IN_RMS_THRESHOLD = 0.045;
|
|
38
40
|
export const VoiceModePanel = () => {
|
|
39
|
-
const { voiceStatus, isVoiceConnecting, isMicMuted, remoteAudioRef, toggleVoiceMicMute, interruptVoice, } = useChatBot();
|
|
41
|
+
const { voiceStatus, isVoiceConnecting, isMicMuted, remoteAudioRef, toggleVoiceMicMute, interruptVoice, micRms, debugVoiceRms, } = useChatBot();
|
|
42
|
+
const speechRmsThreshold = DEFAULT_SPEECH_RMS_THRESHOLD;
|
|
43
|
+
const bargeInRmsThreshold = DEFAULT_BARGE_IN_RMS_THRESHOLD;
|
|
44
|
+
const activeThreshold = ['transcribing', 'thinking', 'generating', 'speaking'].includes(voiceStatus)
|
|
45
|
+
? bargeInRmsThreshold
|
|
46
|
+
: speechRmsThreshold;
|
|
40
47
|
const isMicHeldForAssistant = ASSISTANT_MIC_HOLD_STATUSES.has(voiceStatus);
|
|
41
48
|
const statusHint = isVoiceConnecting
|
|
42
49
|
? 'Connecting… use Text Mode above to cancel'
|
|
@@ -80,7 +87,35 @@ export const VoiceModePanel = () => {
|
|
|
80
87
|
text-overflow: ellipsis !important;
|
|
81
88
|
white-space: nowrap !important;
|
|
82
89
|
color: #6b7280 !important;
|
|
83
|
-
`, children: statusHint })) : null] }), _jsxs("div", { css: css `
|
|
90
|
+
`, children: statusHint })) : null] }), !isMicMuted ? (_jsxs("div", { css: css `
|
|
91
|
+
flex: 0 0 auto !important;
|
|
92
|
+
display: flex !important;
|
|
93
|
+
align-items: center !important;
|
|
94
|
+
gap: 6px !important;
|
|
95
|
+
font-size: 11px !important;
|
|
96
|
+
font-family: monospace !important;
|
|
97
|
+
color: #6b7280 !important;
|
|
98
|
+
min-width: 180px !important;
|
|
99
|
+
`, children: [_jsxs("div", { css: css `
|
|
100
|
+
flex: 1 !important;
|
|
101
|
+
height: 6px !important;
|
|
102
|
+
background: #e5e7eb !important;
|
|
103
|
+
border-radius: 3px !important;
|
|
104
|
+
overflow: hidden !important;
|
|
105
|
+
position: relative !important;
|
|
106
|
+
`, children: [_jsx("div", { css: css `
|
|
107
|
+
position: absolute !important;
|
|
108
|
+
left: 0 !important; top: 0 !important; bottom: 0 !important;
|
|
109
|
+
width: ${Math.min((micRms ?? 0) / 0.15 * 100, 100)}% !important;
|
|
110
|
+
background: ${(micRms ?? 0) >= activeThreshold ? '#22c55e' : '#94a3b8'} !important;
|
|
111
|
+
transition: width 0.05s !important;
|
|
112
|
+
` }), _jsx("div", { css: css `
|
|
113
|
+
position: absolute !important;
|
|
114
|
+
top: 0 !important; bottom: 0 !important;
|
|
115
|
+
left: ${Math.min(activeThreshold / 0.15 * 100, 100)}% !important;
|
|
116
|
+
width: 2px !important;
|
|
117
|
+
background: #ef4444 !important;
|
|
118
|
+
` })] }), _jsx("span", { css: css `flex: 0 0 auto !important;`, children: ((micRms ?? 0)).toFixed(3) })] })) : null, _jsxs("div", { css: css `display: flex !important; gap: 4px !important;`, children: [_jsx(Tooltip, { title: isVoiceConnecting
|
|
84
119
|
? 'Available after connection'
|
|
85
120
|
: isMicHeldForAssistant
|
|
86
121
|
? 'Mic paused while assistant responds (use Interrupt to speak)'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytexbyte/nxtlinq-ai-agent-ui-react-development",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Official React Web UI for nxtlinq AI Agent — drop-in chat widget",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@bytexbyte/nxtlinq-ai-agent-core-development": "0.4.4",
|
|
42
|
-
"@bytexbyte/nxtlinq-ai-agent-web-development": "0.2.
|
|
42
|
+
"@bytexbyte/nxtlinq-ai-agent-web-development": "0.2.1",
|
|
43
43
|
"@emotion/react": "^11.14.0",
|
|
44
44
|
"@emotion/styled": "^11.14.1",
|
|
45
45
|
"@mui/icons-material": "^7.2.0",
|
|
@@ -79,6 +79,8 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
79
79
|
customError,
|
|
80
80
|
// PII display mode
|
|
81
81
|
piiDisplayMode = 'redacted',
|
|
82
|
+
voiceThresholds,
|
|
83
|
+
debugVoiceRms = false,
|
|
82
84
|
}) => {
|
|
83
85
|
// Set API hosts immediately based on environment (before any API calls)
|
|
84
86
|
setApiHosts(environment);
|
|
@@ -2484,6 +2486,7 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
2484
2486
|
exitVoiceMode,
|
|
2485
2487
|
toggleMicMute: toggleVoiceMicMute,
|
|
2486
2488
|
interruptVoice,
|
|
2489
|
+
micRms,
|
|
2487
2490
|
} = useVoiceMode({
|
|
2488
2491
|
apiKey,
|
|
2489
2492
|
apiSecret,
|
|
@@ -2503,6 +2506,7 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
2503
2506
|
stopRecording,
|
|
2504
2507
|
stopTextToSpeech: stopTextToSpeechAndReset,
|
|
2505
2508
|
voiceTransport: 'ws-realtime',
|
|
2509
|
+
voiceThresholds,
|
|
2506
2510
|
});
|
|
2507
2511
|
|
|
2508
2512
|
React.useEffect(() => {
|
|
@@ -3248,6 +3252,8 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
3248
3252
|
exitVoiceMode: handleExitVoiceMode,
|
|
3249
3253
|
toggleVoiceMicMute,
|
|
3250
3254
|
interruptVoice,
|
|
3255
|
+
micRms,
|
|
3256
|
+
debugVoiceRms,
|
|
3251
3257
|
|
|
3252
3258
|
// Additional properties for PermissionForm
|
|
3253
3259
|
onSave: savePermissions,
|
|
@@ -84,6 +84,15 @@ export interface ChatBotProps {
|
|
|
84
84
|
* - 'redacted': Anonymized text with PII tokens displayed (default)
|
|
85
85
|
*/
|
|
86
86
|
piiDisplayMode?: 'plain' | 'redacted';
|
|
87
|
+
/** Override mic VAD thresholds. Useful for tuning sensitivity per deployment. */
|
|
88
|
+
voiceThresholds?: {
|
|
89
|
+
speechRmsThreshold?: number;
|
|
90
|
+
bargeInRmsThreshold?: number;
|
|
91
|
+
speechMinDurationMs?: number;
|
|
92
|
+
silenceCommitMs?: number;
|
|
93
|
+
};
|
|
94
|
+
/** Show RMS debug bar in VoiceModePanel. For development/tuning only. */
|
|
95
|
+
debugVoiceRms?: boolean;
|
|
87
96
|
}
|
|
88
97
|
|
|
89
98
|
export interface ChatBotContextType {
|
|
@@ -134,6 +143,8 @@ export interface ChatBotContextType {
|
|
|
134
143
|
isVoiceConnecting: boolean;
|
|
135
144
|
isMicMuted: boolean;
|
|
136
145
|
remoteAudioRef: React.RefObject<HTMLAudioElement>;
|
|
146
|
+
micRms: number;
|
|
147
|
+
debugVoiceRms: boolean;
|
|
137
148
|
|
|
138
149
|
// Actions
|
|
139
150
|
setInputValue: (value: string) => void;
|
|
@@ -41,6 +41,9 @@ const STATUS_HINTS: Partial<Record<VoiceStatus, string>> = {
|
|
|
41
41
|
speaking: 'Assistant is speaking…',
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
+
const DEFAULT_SPEECH_RMS_THRESHOLD = 0.015;
|
|
45
|
+
const DEFAULT_BARGE_IN_RMS_THRESHOLD = 0.045;
|
|
46
|
+
|
|
44
47
|
export const VoiceModePanel: React.FC = () => {
|
|
45
48
|
const {
|
|
46
49
|
voiceStatus,
|
|
@@ -49,8 +52,17 @@ export const VoiceModePanel: React.FC = () => {
|
|
|
49
52
|
remoteAudioRef,
|
|
50
53
|
toggleVoiceMicMute,
|
|
51
54
|
interruptVoice,
|
|
55
|
+
micRms,
|
|
56
|
+
debugVoiceRms,
|
|
52
57
|
} = useChatBot();
|
|
53
58
|
|
|
59
|
+
const speechRmsThreshold = DEFAULT_SPEECH_RMS_THRESHOLD;
|
|
60
|
+
const bargeInRmsThreshold = DEFAULT_BARGE_IN_RMS_THRESHOLD;
|
|
61
|
+
|
|
62
|
+
const activeThreshold = ['transcribing', 'thinking', 'generating', 'speaking'].includes(voiceStatus)
|
|
63
|
+
? bargeInRmsThreshold
|
|
64
|
+
: speechRmsThreshold;
|
|
65
|
+
|
|
54
66
|
const isMicHeldForAssistant = ASSISTANT_MIC_HOLD_STATUSES.has(voiceStatus);
|
|
55
67
|
|
|
56
68
|
const statusHint = isVoiceConnecting
|
|
@@ -121,6 +133,46 @@ export const VoiceModePanel: React.FC = () => {
|
|
|
121
133
|
) : null}
|
|
122
134
|
</div>
|
|
123
135
|
|
|
136
|
+
{!isMicMuted ? (
|
|
137
|
+
<div css={css`
|
|
138
|
+
flex: 0 0 auto !important;
|
|
139
|
+
display: flex !important;
|
|
140
|
+
align-items: center !important;
|
|
141
|
+
gap: 6px !important;
|
|
142
|
+
font-size: 11px !important;
|
|
143
|
+
font-family: monospace !important;
|
|
144
|
+
color: #6b7280 !important;
|
|
145
|
+
min-width: 180px !important;
|
|
146
|
+
`}>
|
|
147
|
+
<div css={css`
|
|
148
|
+
flex: 1 !important;
|
|
149
|
+
height: 6px !important;
|
|
150
|
+
background: #e5e7eb !important;
|
|
151
|
+
border-radius: 3px !important;
|
|
152
|
+
overflow: hidden !important;
|
|
153
|
+
position: relative !important;
|
|
154
|
+
`}>
|
|
155
|
+
<div css={css`
|
|
156
|
+
position: absolute !important;
|
|
157
|
+
left: 0 !important; top: 0 !important; bottom: 0 !important;
|
|
158
|
+
width: ${Math.min((micRms ?? 0) / 0.15 * 100, 100)}% !important;
|
|
159
|
+
background: ${(micRms ?? 0) >= activeThreshold ? '#22c55e' : '#94a3b8'} !important;
|
|
160
|
+
transition: width 0.05s !important;
|
|
161
|
+
`} />
|
|
162
|
+
<div css={css`
|
|
163
|
+
position: absolute !important;
|
|
164
|
+
top: 0 !important; bottom: 0 !important;
|
|
165
|
+
left: ${Math.min(activeThreshold / 0.15 * 100, 100)}% !important;
|
|
166
|
+
width: 2px !important;
|
|
167
|
+
background: #ef4444 !important;
|
|
168
|
+
`} />
|
|
169
|
+
</div>
|
|
170
|
+
<span css={css`flex: 0 0 auto !important;`}>
|
|
171
|
+
{((micRms ?? 0)).toFixed(3)}
|
|
172
|
+
</span>
|
|
173
|
+
</div>
|
|
174
|
+
) : null}
|
|
175
|
+
|
|
124
176
|
<div css={css`display: flex !important; gap: 4px !important;`}>
|
|
125
177
|
<Tooltip title={
|
|
126
178
|
isVoiceConnecting
|
|
@@ -142,6 +194,7 @@ export const VoiceModePanel: React.FC = () => {
|
|
|
142
194
|
</IconButton>
|
|
143
195
|
</span>
|
|
144
196
|
</Tooltip>
|
|
197
|
+
|
|
145
198
|
<Tooltip title="Interrupt (barge in)">
|
|
146
199
|
<span>
|
|
147
200
|
<IconButton
|