@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.
Files changed (28) hide show
  1. package/dist/components/context/ChatBotContext.d.ts.map +1 -1
  2. package/dist/components/context/ChatBotContext.js +79 -13
  3. package/dist/components/types/ChatBotTypes.d.ts +2 -0
  4. package/dist/components/types/ChatBotTypes.d.ts.map +1 -1
  5. package/dist/components/ui/MessageInput.d.ts.map +1 -1
  6. package/dist/components/ui/MessageInput.js +1 -1
  7. package/dist/components/ui/PermissionForm.d.ts.map +1 -1
  8. package/dist/components/ui/PermissionForm.js +9 -3
  9. package/dist/core/lib/useSpeechToTextFromMic/helper.d.ts +1 -1
  10. package/dist/core/lib/useSpeechToTextFromMic/helper.d.ts.map +1 -1
  11. package/dist/core/lib/useSpeechToTextFromMic/helper.js +18 -14
  12. package/dist/core/lib/useSpeechToTextFromMic/index.d.ts +1 -0
  13. package/dist/core/lib/useSpeechToTextFromMic/index.d.ts.map +1 -1
  14. package/dist/core/lib/useSpeechToTextFromMic/index.js +10 -1
  15. package/package.json +2 -2
  16. package/umd/nxtlinq-ai-agent.umd.js +10 -10
  17. package/dist/core/utils/__tests__/urlUtils.test.d.ts +0 -5
  18. package/dist/core/utils/__tests__/urlUtils.test.d.ts.map +0 -1
  19. package/dist/core/utils/__tests__/urlUtils.test.js +0 -57
  20. package/dist/core/utils/berifyMeReactFix.d.ts +0 -8
  21. package/dist/core/utils/berifyMeReactFix.d.ts.map +0 -1
  22. package/dist/core/utils/berifyMeReactFix.js +0 -81
  23. package/dist/core/utils/reactInstanceCheck.d.ts +0 -9
  24. package/dist/core/utils/reactInstanceCheck.d.ts.map +0 -1
  25. package/dist/core/utils/reactInstanceCheck.js +0 -46
  26. package/dist/setupTests.d.ts +0 -2
  27. package/dist/setupTests.d.ts.map +0 -1
  28. 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,CA21DlD,CAAC"}
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 // 24 hours in seconds
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
- const addressToUse = currentHitAddress || hitAddress;
373
- const signerToUse = currentSigner || signer;
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
- while (isRecordingRef.current) {
1174
- stopRecording();
1175
- await sleep(1000);
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
- if (!signer || !hitAddress) {
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, signer, hitAddress);
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":"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"}
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":"AAIA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAsGhC,CAAC"}
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,CAqiBxD,CAAC"}
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
- // Update temp permissions when permissions change
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
- setTempPermissions(permissions);
15
- }, [permissions]);
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,KAC5C,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAsCtC,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"}
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, '2500');
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
- conversationHistory[index] = e.result.text;
21
- setSpeechToTextArray([...conversationHistory]);
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
- conversationHistory[index] = e.result.text;
26
- setSpeechToTextArray([...conversationHistory]);
27
- index += 1;
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(`CANCELED: ErrorCode=${e.errorCode}`);
33
- console.error(`CANCELED: ErrorDetails=${e.errorDetails}`);
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
- stopRecognition(recognizer);
38
+ };
39
+ recognizer.sessionStopped = () => {
40
+ console.log('Speech recognition session stopped');
37
41
  };
38
42
  recognizer.startContinuousRecognitionAsync();
39
43
  return recognizer;
@@ -5,6 +5,7 @@ interface Props {
5
5
  type UseSpeechToTextFromMicResult = {
6
6
  start: () => Promise<void>;
7
7
  stop: () => void;
8
+ clear: () => void;
8
9
  isRecording: boolean;
9
10
  transcript: string;
10
11
  };
@@ -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,CA0CjG"}
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.4",
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
+ }