@bytexbyte/nxtlinq-ai-agent-sdk 1.6.4 → 1.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/components/context/ChatBotContext.d.ts.map +1 -1
- package/dist/components/context/ChatBotContext.js +79 -13
- package/dist/components/types/ChatBotTypes.d.ts +2 -0
- package/dist/components/types/ChatBotTypes.d.ts.map +1 -1
- package/dist/components/ui/MessageInput.d.ts.map +1 -1
- package/dist/components/ui/MessageInput.js +1 -1
- package/dist/components/ui/PermissionForm.d.ts.map +1 -1
- package/dist/components/ui/PermissionForm.js +9 -3
- package/dist/core/lib/useSpeechToTextFromMic/helper.d.ts +1 -1
- package/dist/core/lib/useSpeechToTextFromMic/helper.d.ts.map +1 -1
- package/dist/core/lib/useSpeechToTextFromMic/helper.js +18 -14
- package/dist/core/lib/useSpeechToTextFromMic/index.d.ts +1 -0
- package/dist/core/lib/useSpeechToTextFromMic/index.d.ts.map +1 -1
- package/dist/core/lib/useSpeechToTextFromMic/index.js +10 -1
- package/package.json +2 -2
- package/umd/nxtlinq-ai-agent.umd.js +10 -10
- package/dist/core/utils/__tests__/urlUtils.test.d.ts +0 -5
- package/dist/core/utils/__tests__/urlUtils.test.d.ts.map +0 -1
- package/dist/core/utils/__tests__/urlUtils.test.js +0 -57
- package/dist/core/utils/berifyMeReactFix.d.ts +0 -8
- package/dist/core/utils/berifyMeReactFix.d.ts.map +0 -1
- package/dist/core/utils/berifyMeReactFix.js +0 -81
- package/dist/core/utils/reactInstanceCheck.d.ts +0 -9
- package/dist/core/utils/reactInstanceCheck.d.ts.map +0 -1
- package/dist/core/utils/reactInstanceCheck.js +0 -46
- package/dist/setupTests.d.ts +0 -2
- package/dist/setupTests.d.ts.map +0 -1
- package/dist/setupTests.js +0 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotContext.d.ts","sourceRoot":"","sources":["../../../src/components/context/ChatBotContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,EACL,kBAAkB,EAClB,YAAY,EAGb,MAAM,uBAAuB,CAAC;AAI/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/components/context/ChatBotContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,EACL,kBAAkB,EAClB,YAAY,EAGb,MAAM,uBAAuB,CAAC;AAI/B,eAAO,MAAM,UAAU,0BAMtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAg6DlD,CAAC"}
|
|
@@ -30,11 +30,12 @@ customUserInfo,
|
|
|
30
30
|
// Custom username for wallet verification
|
|
31
31
|
customUsername,
|
|
32
32
|
// IDV suggestion banner configuration
|
|
33
|
-
idvBannerDismissSeconds = 86400
|
|
34
|
-
|
|
33
|
+
idvBannerDismissSeconds = 86400,
|
|
34
|
+
// 24 hours in seconds
|
|
35
|
+
isStopRecordingOnSend = false, }) => {
|
|
35
36
|
const nxtlinqApi = React.useMemo(() => createNxtlinqApi(apiKey, apiSecret), [apiKey, apiSecret]);
|
|
36
37
|
// Custom hook
|
|
37
|
-
const { isRecording, transcript, start: startRecording, stop: stopRecording } = useSpeechToTextFromMic({
|
|
38
|
+
const { isRecording, transcript, start: startRecording, stop: stopRecording, clear: clearRecording } = useSpeechToTextFromMic({
|
|
38
39
|
apiKey,
|
|
39
40
|
apiSecret
|
|
40
41
|
});
|
|
@@ -103,11 +104,11 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
103
104
|
signerRef.current = signer;
|
|
104
105
|
}, [signer]);
|
|
105
106
|
React.useEffect(() => {
|
|
106
|
-
if (!transcript) {
|
|
107
|
+
if (!transcript || isLoading) {
|
|
107
108
|
return;
|
|
108
109
|
}
|
|
109
110
|
setInputValue(transcript);
|
|
110
|
-
}, [transcript]);
|
|
111
|
+
}, [transcript, isLoading]);
|
|
111
112
|
React.useEffect(() => {
|
|
112
113
|
isRecordingRef.current = isRecording;
|
|
113
114
|
}, [isRecording]);
|
|
@@ -190,6 +191,7 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
190
191
|
setAit(null);
|
|
191
192
|
setPermissions([]);
|
|
192
193
|
setWalletInfo(null);
|
|
194
|
+
setIsAITLoading(false);
|
|
193
195
|
return;
|
|
194
196
|
}
|
|
195
197
|
setIsAITLoading(true);
|
|
@@ -369,8 +371,27 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
369
371
|
const currentHitAddress = hitAddressRef.current;
|
|
370
372
|
const currentSigner = signerRef.current;
|
|
371
373
|
// If refs don't have the values, try using current state values
|
|
372
|
-
|
|
373
|
-
|
|
374
|
+
let addressToUse = currentHitAddress || hitAddress;
|
|
375
|
+
let signerToUse = currentSigner || signer;
|
|
376
|
+
// If we have an address but no signer, try to auto-connect wallet
|
|
377
|
+
if (addressToUse && !signerToUse) {
|
|
378
|
+
const storedWalletAddress = localStorage.getItem('walletAddress');
|
|
379
|
+
if (storedWalletAddress === addressToUse) {
|
|
380
|
+
try {
|
|
381
|
+
const autoConnectResult = await connectWallet(false); // Don't show sign-in message yet
|
|
382
|
+
if (autoConnectResult) {
|
|
383
|
+
// Wait for state to update
|
|
384
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
385
|
+
// Get the updated signer
|
|
386
|
+
signerToUse = signerRef.current || signer;
|
|
387
|
+
addressToUse = hitAddressRef.current || hitAddress;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
console.error('Auto-connect failed during sign in:', error);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
374
395
|
if (!addressToUse) {
|
|
375
396
|
console.log('No address available, returning early');
|
|
376
397
|
if (autoShowSuccessMessage) {
|
|
@@ -1170,9 +1191,17 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
1170
1191
|
// Handle submit
|
|
1171
1192
|
const handleSubmit = async (e) => {
|
|
1172
1193
|
e.preventDefault();
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1194
|
+
if (isStopRecordingOnSend) {
|
|
1195
|
+
while (isRecordingRef.current) {
|
|
1196
|
+
stopRecording();
|
|
1197
|
+
await sleep(1000);
|
|
1198
|
+
}
|
|
1199
|
+
}
|
|
1200
|
+
else {
|
|
1201
|
+
if (isRecordingRef.current) {
|
|
1202
|
+
await sleep(1000);
|
|
1203
|
+
clearRecording();
|
|
1204
|
+
}
|
|
1176
1205
|
}
|
|
1177
1206
|
if (!textInputRef.current)
|
|
1178
1207
|
return;
|
|
@@ -1239,10 +1268,31 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
1239
1268
|
};
|
|
1240
1269
|
// Generate and register AIT
|
|
1241
1270
|
const generateAndRegisterAIT = async (newPermissions, isFromAIAgent = false) => {
|
|
1242
|
-
|
|
1271
|
+
let currentSigner = signer;
|
|
1272
|
+
let currentAddress = hitAddress;
|
|
1273
|
+
// If we have an address but no signer, try to auto-connect wallet
|
|
1274
|
+
if (currentAddress && !currentSigner) {
|
|
1275
|
+
const storedWalletAddress = localStorage.getItem('walletAddress');
|
|
1276
|
+
if (storedWalletAddress === currentAddress) {
|
|
1277
|
+
try {
|
|
1278
|
+
const autoConnectResult = await connectWallet(false); // Don't show sign-in message yet
|
|
1279
|
+
if (autoConnectResult) {
|
|
1280
|
+
// Wait for state to update
|
|
1281
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
1282
|
+
// Get the updated signer and address
|
|
1283
|
+
currentSigner = signerRef.current || signer;
|
|
1284
|
+
currentAddress = hitAddressRef.current || hitAddress;
|
|
1285
|
+
}
|
|
1286
|
+
}
|
|
1287
|
+
catch (error) {
|
|
1288
|
+
console.error('Auto-connect failed during AIT generation:', error);
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
if (!currentSigner || !currentAddress) {
|
|
1243
1293
|
throw new Error('Missing signer or wallet address');
|
|
1244
1294
|
}
|
|
1245
|
-
return generateAndRegisterAITWithSigner(newPermissions, isFromAIAgent,
|
|
1295
|
+
return generateAndRegisterAITWithSigner(newPermissions, isFromAIAgent, currentSigner, currentAddress);
|
|
1246
1296
|
};
|
|
1247
1297
|
// Generate and register AIT with explicit signer and address
|
|
1248
1298
|
const generateAndRegisterAITWithSigner = async (newPermissions, isFromAIAgent = false, explicitSigner, explicitAddress) => {
|
|
@@ -1583,11 +1633,25 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
1583
1633
|
throw error;
|
|
1584
1634
|
}
|
|
1585
1635
|
};
|
|
1636
|
+
// Initialize wallet address from localStorage on component mount
|
|
1637
|
+
React.useEffect(() => {
|
|
1638
|
+
const storedWalletAddress = localStorage.getItem('walletAddress');
|
|
1639
|
+
if (storedWalletAddress && !hitAddress) {
|
|
1640
|
+
setHitAddress(storedWalletAddress);
|
|
1641
|
+
hitAddressRef.current = storedWalletAddress;
|
|
1642
|
+
}
|
|
1643
|
+
}, []);
|
|
1586
1644
|
React.useEffect(() => {
|
|
1587
1645
|
if (hitAddress && nxtlinqAITServiceAccessToken) {
|
|
1588
1646
|
refreshAIT();
|
|
1589
1647
|
}
|
|
1590
1648
|
}, [hitAddress, nxtlinqAITServiceAccessToken]);
|
|
1649
|
+
// Set loading state when permission form opens
|
|
1650
|
+
React.useEffect(() => {
|
|
1651
|
+
if (isPermissionFormOpen && hitAddress) {
|
|
1652
|
+
setIsAITLoading(true);
|
|
1653
|
+
}
|
|
1654
|
+
}, [isPermissionFormOpen, hitAddress]);
|
|
1591
1655
|
React.useEffect(() => {
|
|
1592
1656
|
fetchAvailablePermissions();
|
|
1593
1657
|
}, [serviceId, permissionGroup]);
|
|
@@ -1694,6 +1758,7 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
1694
1758
|
refreshAIT,
|
|
1695
1759
|
startRecording,
|
|
1696
1760
|
stopRecording,
|
|
1761
|
+
clearRecording,
|
|
1697
1762
|
// AI Model related functions
|
|
1698
1763
|
handleModelChange,
|
|
1699
1764
|
getCurrentModel,
|
|
@@ -1729,7 +1794,8 @@ idvBannerDismissSeconds = 86400 // 24 hours in seconds
|
|
|
1729
1794
|
isSemiAutomaticMode,
|
|
1730
1795
|
customUserInfo,
|
|
1731
1796
|
customUsername,
|
|
1732
|
-
idvBannerDismissSeconds
|
|
1797
|
+
idvBannerDismissSeconds,
|
|
1798
|
+
isStopRecordingOnSend,
|
|
1733
1799
|
},
|
|
1734
1800
|
nxtlinqApi
|
|
1735
1801
|
};
|
|
@@ -60,6 +60,7 @@ export interface ChatBotProps {
|
|
|
60
60
|
customUsername?: string;
|
|
61
61
|
idvBannerDismissSeconds?: number;
|
|
62
62
|
berifymeMode?: 'built-in' | 'external';
|
|
63
|
+
isStopRecordingOnSend?: boolean;
|
|
63
64
|
}
|
|
64
65
|
export interface ChatBotContextType {
|
|
65
66
|
messages: Message[];
|
|
@@ -118,6 +119,7 @@ export interface ChatBotContextType {
|
|
|
118
119
|
refreshAIT: (forceUpdatePermissions?: boolean) => Promise<void>;
|
|
119
120
|
startRecording: () => Promise<void>;
|
|
120
121
|
stopRecording: () => void;
|
|
122
|
+
clearRecording: () => void;
|
|
121
123
|
handleModelChange: (modelIndex: number) => void;
|
|
122
124
|
getCurrentModel: () => AIModel;
|
|
123
125
|
onSave: (newPermissions?: string[]) => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../../src/components/types/ChatBotTypes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,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,KAAK,EAAE,MAAM,CAAC;IACd,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;AAED,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAKtC,CAAC;AAGF,eAAO,MAAM,oBAAoB,EAAE,OAAO,EAwBzC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwB/C,CAAC;AAEF,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,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAC1D,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,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,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,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;
|
|
1
|
+
{"version":3,"file":"ChatBotTypes.d.ts","sourceRoot":"","sources":["../../../src/components/types/ChatBotTypes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageInput.d.ts","sourceRoot":"","sources":["../../../src/components/ui/MessageInput.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MessageInput.d.ts","sourceRoot":"","sources":["../../../src/components/ui/MessageInput.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAsGhC,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
|
|
2
2
|
/** @jsxImportSource @emotion/react */
|
|
3
|
+
import { css } from '@emotion/react';
|
|
3
4
|
import MicIcon from '@mui/icons-material/Mic';
|
|
4
5
|
import MicOffIcon from '@mui/icons-material/MicOff';
|
|
5
6
|
import { IconButton, InputBase } from '@mui/material';
|
|
6
|
-
import { css } from '@emotion/react';
|
|
7
7
|
import { useChatBot } from '../context/ChatBotContext';
|
|
8
8
|
import { actionButton } from './styles/isolatedStyles';
|
|
9
9
|
export const MessageInput = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionForm.d.ts","sourceRoot":"","sources":["../../../src/components/ui/PermissionForm.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"PermissionForm.d.ts","sourceRoot":"","sources":["../../../src/components/ui/PermissionForm.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA2iBxD,CAAC"}
|
|
@@ -9,10 +9,13 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
9
9
|
const [availablePermissions, setAvailablePermissions] = React.useState([]);
|
|
10
10
|
const [isSaving, setIsSaving] = React.useState(false);
|
|
11
11
|
const [tempPermissions, setTempPermissions] = React.useState(permissions);
|
|
12
|
-
|
|
12
|
+
const [hasUserInteracted, setHasUserInteracted] = React.useState(false);
|
|
13
|
+
// Update temp permissions when permissions change, but only if user hasn't interacted
|
|
13
14
|
React.useEffect(() => {
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
if (!hasUserInteracted) {
|
|
16
|
+
setTempPermissions(permissions);
|
|
17
|
+
}
|
|
18
|
+
}, [permissions, hasUserInteracted]);
|
|
16
19
|
const fetchAvailablePermissions = async () => {
|
|
17
20
|
if (!serviceId)
|
|
18
21
|
return;
|
|
@@ -64,6 +67,7 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
64
67
|
// Update the actual permissions with temp permissions
|
|
65
68
|
setPermissions(tempPermissions);
|
|
66
69
|
await onSave(tempPermissions);
|
|
70
|
+
setHasUserInteracted(false);
|
|
67
71
|
}
|
|
68
72
|
finally {
|
|
69
73
|
setIsSaving(false);
|
|
@@ -72,6 +76,7 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
72
76
|
const handleCancel = () => {
|
|
73
77
|
// Reset temp permissions to original permissions
|
|
74
78
|
setTempPermissions(permissions);
|
|
79
|
+
setHasUserInteracted(false);
|
|
75
80
|
onClose();
|
|
76
81
|
};
|
|
77
82
|
// Check if permissions have changed
|
|
@@ -339,6 +344,7 @@ export const PermissionForm = ({ onClose }) => {
|
|
|
339
344
|
? tempPermissions.filter(p => p !== permission.label)
|
|
340
345
|
: [...tempPermissions, permission.label].sort();
|
|
341
346
|
setTempPermissions(newPermissions);
|
|
347
|
+
setHasUserInteracted(true);
|
|
342
348
|
setIsDisabled(false);
|
|
343
349
|
}
|
|
344
350
|
}, disabled: isAITLoading, css: css `
|
|
@@ -6,7 +6,7 @@ import { Dispatch, SetStateAction } from 'react';
|
|
|
6
6
|
export declare const startSpeechToTextFromMic: (setSpeechToTextArray: Dispatch<SetStateAction<string[]>>, config: {
|
|
7
7
|
apiKey: string;
|
|
8
8
|
apiSecret: string;
|
|
9
|
-
}) => Promise<SpeechRecognizer | undefined>;
|
|
9
|
+
}, historyRef: React.MutableRefObject<string[]>, indexRef: React.MutableRefObject<number>) => Promise<SpeechRecognizer | undefined>;
|
|
10
10
|
/**
|
|
11
11
|
* Stop speech recognition
|
|
12
12
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../../src/core/lib/useSpeechToTextFromMic/helper.ts"],"names":[],"mappings":"AACA,OAAO,EAML,gBAAgB,EACjB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAMjD;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,sBAAsB,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,EACxD,QAAQ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../../../src/core/lib/useSpeechToTextFromMic/helper.ts"],"names":[],"mappings":"AACA,OAAO,EAML,gBAAgB,EACjB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAMjD;;GAEG;AACH,eAAO,MAAM,wBAAwB,GACnC,sBAAsB,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,EACxD,QAAQ;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC7C,YAAY,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAC5C,UAAU,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,KACvC,OAAO,CAAC,gBAAgB,GAAG,SAAS,CA4CtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,YAAY,gBAAgB,GAAG,SAAS,SAIvE,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;;;;;;;;GAwBxE"}
|
|
@@ -5,35 +5,39 @@ let recognizer;
|
|
|
5
5
|
/**
|
|
6
6
|
* Start speech recognition, continuously updates speechToTextArray (each sentence as an array element)
|
|
7
7
|
*/
|
|
8
|
-
export const startSpeechToTextFromMic = async (setSpeechToTextArray, config) => {
|
|
8
|
+
export const startSpeechToTextFromMic = async (setSpeechToTextArray, config, historyRef, indexRef) => {
|
|
9
9
|
const tokenRes = await getTokenOrRefresh(config.apiKey, config.apiSecret);
|
|
10
|
+
if (!tokenRes.authToken || !tokenRes.region) {
|
|
11
|
+
console.error('Speech token retrieval failed:', tokenRes.error);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
10
14
|
const speechConfig = SpeechConfig.fromAuthorizationToken(tokenRes.authToken, tokenRes.region);
|
|
11
15
|
speechConfig.speechRecognitionLanguage = 'en-US';
|
|
12
16
|
speechConfig.setProperty(PropertyId.SpeechServiceConnection_InitialSilenceTimeoutMs, '10000');
|
|
13
17
|
speechConfig.setProperty(PropertyId.SpeechServiceConnection_EndSilenceTimeoutMs, '86400000');
|
|
14
|
-
speechConfig.setProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, '
|
|
18
|
+
speechConfig.setProperty(PropertyId.Speech_SegmentationSilenceTimeoutMs, '1000');
|
|
15
19
|
const audioConfig = AudioConfig.fromDefaultMicrophoneInput();
|
|
16
|
-
recognizer = new SpeechRecognizer(speechConfig, audioConfig);
|
|
17
|
-
const conversationHistory = [];
|
|
18
|
-
let index = 0;
|
|
20
|
+
const recognizer = new SpeechRecognizer(speechConfig, audioConfig);
|
|
19
21
|
recognizer.recognizing = (_s, e) => {
|
|
20
|
-
|
|
21
|
-
setSpeechToTextArray([...
|
|
22
|
+
historyRef.current[indexRef.current] = e.result.text;
|
|
23
|
+
setSpeechToTextArray([...historyRef.current]);
|
|
22
24
|
};
|
|
23
25
|
recognizer.recognized = (_s, e) => {
|
|
24
26
|
if (e.result.reason === ResultReason.RecognizedSpeech) {
|
|
25
|
-
|
|
26
|
-
setSpeechToTextArray([...
|
|
27
|
-
|
|
27
|
+
historyRef.current[indexRef.current] = e.result.text;
|
|
28
|
+
setSpeechToTextArray([...historyRef.current]);
|
|
29
|
+
indexRef.current += 1;
|
|
28
30
|
}
|
|
29
31
|
};
|
|
30
32
|
recognizer.canceled = (_s, e) => {
|
|
33
|
+
console.warn('Speech recognition canceled:', e.reason);
|
|
31
34
|
if (e.reason === CancellationReason.Error) {
|
|
32
|
-
console.error(`
|
|
33
|
-
console.error(`
|
|
34
|
-
console.error('CANCELED: Did you set the speech resource key and region values?');
|
|
35
|
+
console.error(`Error code: ${e.errorCode}`);
|
|
36
|
+
console.error(`Error details: ${e.errorDetails}`);
|
|
35
37
|
}
|
|
36
|
-
|
|
38
|
+
};
|
|
39
|
+
recognizer.sessionStopped = () => {
|
|
40
|
+
console.log('Speech recognition session stopped');
|
|
37
41
|
};
|
|
38
42
|
recognizer.startContinuousRecognitionAsync();
|
|
39
43
|
return recognizer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/lib/useSpeechToTextFromMic/index.ts"],"names":[],"mappings":"AAIA,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,4BAA4B,GAAG;IAClC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,GAAG,4BAA4B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/lib/useSpeechToTextFromMic/index.ts"],"names":[],"mappings":"AAIA,UAAU,KAAK;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,4BAA4B,GAAG;IAClC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,GAAG,4BAA4B,CAqDjG"}
|
|
@@ -5,6 +5,8 @@ export function useSpeechToTextFromMic({ apiKey, apiSecret }) {
|
|
|
5
5
|
const [transcriptArray, setTranscriptArray] = useState([]);
|
|
6
6
|
const [recognizer, setRecognizer] = useState();
|
|
7
7
|
const wakelock = useRef();
|
|
8
|
+
const historyRef = useRef([]);
|
|
9
|
+
const indexRef = useRef(0);
|
|
8
10
|
const canWakeLock = () => 'wakeLock' in navigator;
|
|
9
11
|
async function lockWakeState() {
|
|
10
12
|
if (!canWakeLock())
|
|
@@ -20,9 +22,10 @@ export function useSpeechToTextFromMic({ apiKey, apiSecret }) {
|
|
|
20
22
|
}
|
|
21
23
|
}
|
|
22
24
|
const start = async () => {
|
|
25
|
+
clear();
|
|
23
26
|
await lockWakeState();
|
|
24
27
|
setIsRecording(true);
|
|
25
|
-
const recognizerInstance = await startSpeechToTextFromMic(setTranscriptArray, { apiKey, apiSecret });
|
|
28
|
+
const recognizerInstance = await startSpeechToTextFromMic(setTranscriptArray, { apiKey, apiSecret }, historyRef, indexRef);
|
|
26
29
|
setRecognizer(recognizerInstance);
|
|
27
30
|
};
|
|
28
31
|
const stop = () => {
|
|
@@ -31,10 +34,16 @@ export function useSpeechToTextFromMic({ apiKey, apiSecret }) {
|
|
|
31
34
|
setIsRecording(false);
|
|
32
35
|
setRecognizer(undefined);
|
|
33
36
|
};
|
|
37
|
+
const clear = () => {
|
|
38
|
+
historyRef.current = [];
|
|
39
|
+
indexRef.current = 0;
|
|
40
|
+
setTranscriptArray([]);
|
|
41
|
+
};
|
|
34
42
|
const transcript = transcriptArray.join(' ');
|
|
35
43
|
return {
|
|
36
44
|
start,
|
|
37
45
|
stop,
|
|
46
|
+
clear,
|
|
38
47
|
isRecording,
|
|
39
48
|
transcript,
|
|
40
49
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bytexbyte/nxtlinq-ai-agent-sdk",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.6",
|
|
4
4
|
"description": "Nxtlinq AI Agent SDK - Proprietary Software with enhanced async operation handling",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -59,4 +59,4 @@
|
|
|
59
59
|
"universal-cookie": "^8.0.1",
|
|
60
60
|
"uuid": "^11.1.0"
|
|
61
61
|
}
|
|
62
|
-
}
|
|
62
|
+
}
|