@bytexbyte/nxtlinq-ai-agent-ui-react-development 0.2.3 → 0.2.5
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 +39 -15
- package/dist/types/ChatBotTypes.d.ts +2 -0
- package/dist/types/ChatBotTypes.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/context/ChatBotContext.tsx +41 -14
- package/src/types/ChatBotTypes.ts +2 -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,CAgtGlD,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', voiceThresholds, debugVoiceRms = false, }) => {
|
|
35
|
+
piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, sttGlossary, }) => {
|
|
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]);
|
|
@@ -44,9 +44,21 @@ piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, }) => {
|
|
|
44
44
|
apiSecretRef.current = apiSecret;
|
|
45
45
|
}, [apiKey, apiSecret]);
|
|
46
46
|
// Custom hook
|
|
47
|
-
const
|
|
47
|
+
const handleSttCorrected = React.useCallback((rawText, corrected) => {
|
|
48
|
+
const normalizedRaw = normalizeTranscript(rawText);
|
|
49
|
+
const normalizedCorrected = normalizeTranscript(corrected);
|
|
50
|
+
setInputValue(prev => {
|
|
51
|
+
const idx = prev.lastIndexOf(normalizedRaw);
|
|
52
|
+
if (idx === -1)
|
|
53
|
+
return prev; // raw text no longer in input — don't touch it
|
|
54
|
+
return prev.slice(0, idx) + normalizedCorrected + prev.slice(idx + normalizedRaw.length);
|
|
55
|
+
});
|
|
56
|
+
}, []);
|
|
57
|
+
const { isMicEnabled, transcript, partialTranscript, isCorrecting, start: startRecording, stop: stopRecording, clear: clearRecording } = useSpeechToTextFromMic({
|
|
48
58
|
apiKey,
|
|
49
|
-
apiSecret
|
|
59
|
+
apiSecret,
|
|
60
|
+
phraseHints: sttGlossary,
|
|
61
|
+
onCorrected: handleSttCorrected,
|
|
50
62
|
});
|
|
51
63
|
// Messages: Use storage based on storageMode to support cross-tab sync (local-storage) or session isolation (session-storage)
|
|
52
64
|
const [messages, setMessages] = storageMode === "local-storage"
|
|
@@ -148,6 +160,7 @@ piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, }) => {
|
|
|
148
160
|
const lastPartialRangeRef = React.useRef(null);
|
|
149
161
|
const lastAutoSentTranscriptRef = React.useRef('');
|
|
150
162
|
const autoSendTimerRef = React.useRef(null);
|
|
163
|
+
const isCorrectingRef = React.useRef(false);
|
|
151
164
|
const lastCustomErrorRef = React.useRef(undefined);
|
|
152
165
|
function insertPartial(input, partial, caret) {
|
|
153
166
|
let start = caret;
|
|
@@ -487,18 +500,25 @@ piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, }) => {
|
|
|
487
500
|
clearTimeout(autoSendTimerRef.current);
|
|
488
501
|
}
|
|
489
502
|
const currentTranscript = normalizedText.trim();
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
503
|
+
const scheduleAutoSend = (text, delay) => {
|
|
504
|
+
autoSendTimerRef.current = setTimeout(() => {
|
|
505
|
+
if (isCorrectingRef.current) {
|
|
506
|
+
// Correction still in flight — re-check in 300ms
|
|
507
|
+
autoSendTimerRef.current = null;
|
|
508
|
+
scheduleAutoSend(text, 300);
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
if (lastAutoSentTranscriptRef.current !== text && !isLoading) {
|
|
512
|
+
lastAutoSentTranscriptRef.current = text;
|
|
513
|
+
sendMessage(text).catch(error => {
|
|
514
|
+
console.error('Failed to auto-send message from speech:', error);
|
|
515
|
+
lastAutoSentTranscriptRef.current = '';
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
autoSendTimerRef.current = null;
|
|
519
|
+
}, delay);
|
|
520
|
+
};
|
|
521
|
+
scheduleAutoSend(currentTranscript, 600);
|
|
502
522
|
}
|
|
503
523
|
}
|
|
504
524
|
else if (autoSendTimerRef.current) {
|
|
@@ -508,6 +528,10 @@ piiDisplayMode = 'redacted', voiceThresholds, debugVoiceRms = false, }) => {
|
|
|
508
528
|
}
|
|
509
529
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
510
530
|
}, [transcript, autoSendEnabled, isMicEnabled, isLoading]);
|
|
531
|
+
// Keep isCorrectingRef in sync with isCorrecting state
|
|
532
|
+
React.useEffect(() => {
|
|
533
|
+
isCorrectingRef.current = isCorrecting;
|
|
534
|
+
}, [isCorrecting]);
|
|
511
535
|
// Clear timer when user continues speaking (partialTranscript updates)
|
|
512
536
|
React.useEffect(() => {
|
|
513
537
|
if (partialTranscript && partialTranscript.trim() && autoSendEnabled && isMicEnabled && autoSendTimerRef.current) {
|
|
@@ -76,6 +76,8 @@ export interface ChatBotProps {
|
|
|
76
76
|
};
|
|
77
77
|
/** Show RMS debug bar in VoiceModePanel. For development/tuning only. */
|
|
78
78
|
debugVoiceRms?: boolean;
|
|
79
|
+
/** Brand names and proper nouns to boost recognition accuracy in text-mode STT (Azure PhraseList). */
|
|
80
|
+
sttGlossary?: string[];
|
|
79
81
|
}
|
|
80
82
|
export interface ChatBotContextType {
|
|
81
83
|
messages: Message[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../src/types/ChatBotTypes.ts"],"names":[],"mappings":"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"}
|
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.5",
|
|
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.5",
|
|
43
43
|
"@emotion/react": "^11.14.0",
|
|
44
44
|
"@emotion/styled": "^11.14.1",
|
|
45
45
|
"@mui/icons-material": "^7.2.0",
|
|
@@ -81,6 +81,7 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
81
81
|
piiDisplayMode = 'redacted',
|
|
82
82
|
voiceThresholds,
|
|
83
83
|
debugVoiceRms = false,
|
|
84
|
+
sttGlossary,
|
|
84
85
|
}) => {
|
|
85
86
|
// Set API hosts immediately based on environment (before any API calls)
|
|
86
87
|
setApiHosts(environment);
|
|
@@ -96,9 +97,21 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
96
97
|
}, [apiKey, apiSecret]);
|
|
97
98
|
|
|
98
99
|
// Custom hook
|
|
99
|
-
const
|
|
100
|
+
const handleSttCorrected = React.useCallback((rawText: string, corrected: string) => {
|
|
101
|
+
const normalizedRaw = normalizeTranscript(rawText);
|
|
102
|
+
const normalizedCorrected = normalizeTranscript(corrected);
|
|
103
|
+
setInputValue(prev => {
|
|
104
|
+
const idx = prev.lastIndexOf(normalizedRaw);
|
|
105
|
+
if (idx === -1) return prev; // raw text no longer in input — don't touch it
|
|
106
|
+
return prev.slice(0, idx) + normalizedCorrected + prev.slice(idx + normalizedRaw.length);
|
|
107
|
+
});
|
|
108
|
+
}, []);
|
|
109
|
+
|
|
110
|
+
const { isMicEnabled, transcript, partialTranscript, isCorrecting, start: startRecording, stop: stopRecording, clear: clearRecording } = useSpeechToTextFromMic({
|
|
100
111
|
apiKey,
|
|
101
|
-
apiSecret
|
|
112
|
+
apiSecret,
|
|
113
|
+
phraseHints: sttGlossary,
|
|
114
|
+
onCorrected: handleSttCorrected,
|
|
102
115
|
});
|
|
103
116
|
|
|
104
117
|
// Messages: Use storage based on storageMode to support cross-tab sync (local-storage) or session isolation (session-storage)
|
|
@@ -211,6 +224,7 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
211
224
|
const lastPartialRangeRef = React.useRef<{ start: number; end: number } | null>(null);
|
|
212
225
|
const lastAutoSentTranscriptRef = React.useRef<string>('');
|
|
213
226
|
const autoSendTimerRef = React.useRef<NodeJS.Timeout | null>(null);
|
|
227
|
+
const isCorrectingRef = React.useRef(false);
|
|
214
228
|
const lastCustomErrorRef = React.useRef<string | undefined>(undefined);
|
|
215
229
|
|
|
216
230
|
function insertPartial(input: string, partial: string, caret: number) {
|
|
@@ -575,18 +589,26 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
575
589
|
|
|
576
590
|
const currentTranscript = normalizedText.trim();
|
|
577
591
|
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
592
|
+
const scheduleAutoSend = (text: string, delay: number) => {
|
|
593
|
+
autoSendTimerRef.current = setTimeout(() => {
|
|
594
|
+
if (isCorrectingRef.current) {
|
|
595
|
+
// Correction still in flight — re-check in 300ms
|
|
596
|
+
autoSendTimerRef.current = null;
|
|
597
|
+
scheduleAutoSend(text, 300);
|
|
598
|
+
return;
|
|
599
|
+
}
|
|
600
|
+
if (lastAutoSentTranscriptRef.current !== text && !isLoading) {
|
|
601
|
+
lastAutoSentTranscriptRef.current = text;
|
|
602
|
+
sendMessage(text).catch(error => {
|
|
603
|
+
console.error('Failed to auto-send message from speech:', error);
|
|
604
|
+
lastAutoSentTranscriptRef.current = '';
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
autoSendTimerRef.current = null;
|
|
608
|
+
}, delay);
|
|
609
|
+
};
|
|
610
|
+
|
|
611
|
+
scheduleAutoSend(currentTranscript, 600);
|
|
590
612
|
}
|
|
591
613
|
} else if (autoSendTimerRef.current) {
|
|
592
614
|
// Clear timer if auto-send disabled or mic disabled
|
|
@@ -596,6 +618,11 @@ export const ChatBotProvider: React.FC<ChatBotProps> = ({
|
|
|
596
618
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
597
619
|
}, [transcript, autoSendEnabled, isMicEnabled, isLoading]);
|
|
598
620
|
|
|
621
|
+
// Keep isCorrectingRef in sync with isCorrecting state
|
|
622
|
+
React.useEffect(() => {
|
|
623
|
+
isCorrectingRef.current = isCorrecting;
|
|
624
|
+
}, [isCorrecting]);
|
|
625
|
+
|
|
599
626
|
// Clear timer when user continues speaking (partialTranscript updates)
|
|
600
627
|
React.useEffect(() => {
|
|
601
628
|
if (partialTranscript && partialTranscript.trim() && autoSendEnabled && isMicEnabled && autoSendTimerRef.current) {
|
|
@@ -93,6 +93,8 @@ export interface ChatBotProps {
|
|
|
93
93
|
};
|
|
94
94
|
/** Show RMS debug bar in VoiceModePanel. For development/tuning only. */
|
|
95
95
|
debugVoiceRms?: boolean;
|
|
96
|
+
/** Brand names and proper nouns to boost recognition accuracy in text-mode STT (Azure PhraseList). */
|
|
97
|
+
sttGlossary?: string[];
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
export interface ChatBotContextType {
|