@bytexbyte/nxtlinq-ai-agent-sdk 1.2.4 → 1.2.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.
@@ -33,7 +33,27 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
33
33
  const [signer, setSigner] = React.useState(null);
34
34
  const [walletInfo, setWalletInfo] = React.useState(null);
35
35
  const [isWalletLoading, setIsWalletLoading] = React.useState(false);
36
+ const [isAutoConnecting, setIsAutoConnecting] = React.useState(false);
37
+ const [justAutoConnected, setJustAutoConnected] = React.useState(false);
36
38
  const [nxtlinqAITServiceAccessToken, setNxtlinqAITServiceAccessToken] = useLocalStorage('nxtlinqAITServiceAccessToken', '');
39
+ // Use refs to get latest state values in hasPermission function
40
+ const hitAddressRef = React.useRef(hitAddress);
41
+ const aitRef = React.useRef(ait);
42
+ const permissionsRef = React.useRef(permissions);
43
+ const nxtlinqAITServiceAccessTokenRef = React.useRef(nxtlinqAITServiceAccessToken);
44
+ // Update refs when state changes
45
+ React.useEffect(() => {
46
+ hitAddressRef.current = hitAddress;
47
+ }, [hitAddress]);
48
+ React.useEffect(() => {
49
+ aitRef.current = ait;
50
+ }, [ait]);
51
+ React.useEffect(() => {
52
+ permissionsRef.current = permissions;
53
+ }, [permissions]);
54
+ React.useEffect(() => {
55
+ nxtlinqAITServiceAccessTokenRef.current = nxtlinqAITServiceAccessToken;
56
+ }, [nxtlinqAITServiceAccessToken]);
37
57
  const [notification, setNotification] = React.useState({
38
58
  show: false,
39
59
  type: 'info',
@@ -170,6 +190,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
170
190
  localStorage.setItem('walletAddress', userAddress);
171
191
  setHitAddress(userAddress);
172
192
  setSigner(userSigner);
193
+ // Wait for AIT to be loaded if we have a token
173
194
  if (nxtlinqAITServiceAccessToken) {
174
195
  await refreshAIT();
175
196
  }
@@ -230,10 +251,11 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
230
251
  }
231
252
  const { accessToken } = response;
232
253
  setNxtlinqAITServiceAccessToken(accessToken);
254
+ // Wait for AIT to be loaded before showing success message
255
+ await refreshAIT();
233
256
  if (autoShowSuccessMessage) {
234
257
  showSuccess('Successfully signed in with your HIT wallet. You can now use the AI agent.');
235
258
  }
236
- refreshAIT();
237
259
  }
238
260
  catch (error) {
239
261
  console.error('Failed to sign in:', error);
@@ -241,70 +263,164 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
241
263
  }
242
264
  };
243
265
  // Check permissions
244
- const hasPermission = async (toolName) => {
245
- if (!hitAddress) {
246
- setMessages(prev => [...prev, {
247
- id: Date.now().toString(),
248
- content: 'Please connect your HIT wallet to continue.',
249
- role: 'assistant',
250
- timestamp: new Date().toISOString(),
251
- button: 'connect'
252
- }]);
266
+ const hasPermission = async (toolName, autoRetry = true, onAutoConnect) => {
267
+ // Use refs to get latest state values
268
+ const currentHitAddress = hitAddressRef.current;
269
+ const currentAit = aitRef.current;
270
+ const currentPermissions = permissionsRef.current;
271
+ const currentToken = nxtlinqAITServiceAccessTokenRef.current;
272
+ if (!currentHitAddress) {
273
+ if (autoRetry) {
274
+ setIsLoading(false); // Stop thinking before showing message
275
+ setMessages(prev => [...prev, {
276
+ id: Date.now().toString(),
277
+ content: 'Please connect your HIT wallet to continue.',
278
+ role: 'assistant',
279
+ timestamp: new Date().toISOString(),
280
+ button: 'connect'
281
+ }]);
282
+ try {
283
+ setIsAutoConnecting(true); // Mark as auto-connecting
284
+ await connectWallet(false); // Don't show sign-in message yet
285
+ setIsAutoConnecting(false); // Clear auto-connecting state
286
+ setJustAutoConnected(true); // Mark that we just auto-connected
287
+ console.log('Set justAutoConnected to true after auto-connect');
288
+ onAutoConnect?.(); // Call callback if provided
289
+ // If connection successful, continue with permission check
290
+ const result = await hasPermission(toolName, false);
291
+ return result;
292
+ }
293
+ catch (error) {
294
+ console.error('Failed to auto-connect wallet:', error);
295
+ setIsAutoConnecting(false); // Clear auto-connecting state on error
296
+ return false;
297
+ }
298
+ }
299
+ // If autoRetry is false, don't show message again, just return false
253
300
  return false;
254
301
  }
255
- if (!nxtlinqAITServiceAccessToken) {
256
- setMessages(prev => [...prev, {
257
- id: Date.now().toString(),
258
- content: 'Please sign in with your HIT wallet to continue.',
259
- role: 'assistant',
260
- timestamp: new Date().toISOString(),
261
- button: 'signIn'
262
- }]);
302
+ if (!currentToken) {
303
+ if (autoRetry) {
304
+ setIsLoading(false); // Stop thinking before showing message
305
+ setMessages(prev => [...prev, {
306
+ id: Date.now().toString(),
307
+ content: 'Please sign in with your HIT wallet to continue.',
308
+ role: 'assistant',
309
+ timestamp: new Date().toISOString(),
310
+ button: 'signIn'
311
+ }]);
312
+ try {
313
+ setIsAutoConnecting(true); // Mark as auto-signing
314
+ await signInWallet(false); // Don't show success message yet
315
+ setIsAutoConnecting(false); // Clear auto-signing state
316
+ // If sign-in successful, continue with permission check
317
+ const result = await hasPermission(toolName, false);
318
+ return result;
319
+ }
320
+ catch (error) {
321
+ console.error('Failed to auto-sign-in wallet:', error);
322
+ setIsAutoConnecting(false); // Clear auto-signing state on error
323
+ return false;
324
+ }
325
+ }
326
+ // If autoRetry is false, don't show message again, just return false
263
327
  return false;
264
328
  }
265
329
  try {
266
- const payload = JSON.parse(atob(nxtlinqAITServiceAccessToken.split('.')[1]));
330
+ const payload = JSON.parse(atob(currentToken.split('.')[1]));
267
331
  const exp = payload.exp * 1000;
268
332
  const now = Date.now();
269
333
  if (exp < now) {
270
334
  setNxtlinqAITServiceAccessToken('');
271
- setMessages(prev => [...prev, {
272
- id: Date.now().toString(),
273
- content: 'Your wallet session has expired. Please sign in again.',
274
- role: 'assistant',
275
- timestamp: new Date().toISOString(),
276
- button: 'signIn'
277
- }]);
335
+ if (autoRetry) {
336
+ setIsLoading(false); // Stop thinking before showing message
337
+ setMessages(prev => [...prev, {
338
+ id: Date.now().toString(),
339
+ content: 'Your wallet session has expired. Please sign in again.',
340
+ role: 'assistant',
341
+ timestamp: new Date().toISOString(),
342
+ button: 'signIn'
343
+ }]);
344
+ try {
345
+ setIsAutoConnecting(true); // Mark as auto-signing
346
+ await signInWallet(false); // Don't show success message yet
347
+ setIsAutoConnecting(false); // Clear auto-signing state
348
+ // If sign-in successful, continue with permission check
349
+ const result = await hasPermission(toolName, false);
350
+ return result;
351
+ }
352
+ catch (error) {
353
+ console.error('Failed to auto-sign-in after session expiry:', error);
354
+ setIsAutoConnecting(false); // Clear auto-signing state on error
355
+ return false;
356
+ }
357
+ }
358
+ // If autoRetry is false, don't show message again, just return false
278
359
  return false;
279
360
  }
280
361
  const address = payload.address;
281
- if (address !== hitAddress) {
362
+ if (address !== currentHitAddress) {
282
363
  setNxtlinqAITServiceAccessToken('');
364
+ if (autoRetry) {
365
+ setIsLoading(false); // Stop thinking before showing message
366
+ setMessages(prev => [...prev, {
367
+ id: Date.now().toString(),
368
+ content: 'Wallet address mismatch. Please sign in with the correct wallet.',
369
+ role: 'assistant',
370
+ timestamp: new Date().toISOString(),
371
+ button: 'signIn'
372
+ }]);
373
+ try {
374
+ setIsAutoConnecting(true); // Mark as auto-signing
375
+ await signInWallet(false); // Don't show success message yet
376
+ setIsAutoConnecting(false); // Clear auto-signing state
377
+ // If sign-in successful, continue with permission check
378
+ const result = await hasPermission(toolName, false);
379
+ return result;
380
+ }
381
+ catch (error) {
382
+ console.error('Failed to auto-sign-in after address mismatch:', error);
383
+ setIsAutoConnecting(false); // Clear auto-signing state on error
384
+ return false;
385
+ }
386
+ }
387
+ // If autoRetry is false, don't show message again, just return false
388
+ return false;
389
+ }
390
+ }
391
+ catch (error) {
392
+ console.error('Error parsing token:', error);
393
+ setNxtlinqAITServiceAccessToken('');
394
+ if (autoRetry) {
395
+ setIsLoading(false); // Stop thinking before showing message
283
396
  setMessages(prev => [...prev, {
284
397
  id: Date.now().toString(),
285
- content: 'Wallet address mismatch. Please sign in with the correct wallet.',
398
+ content: 'Invalid wallet session. Please sign in again.',
286
399
  role: 'assistant',
287
400
  timestamp: new Date().toISOString(),
288
401
  button: 'signIn'
289
402
  }]);
290
- return false;
403
+ try {
404
+ setIsAutoConnecting(true); // Mark as auto-signing
405
+ await signInWallet(false); // Don't show success message yet
406
+ setIsAutoConnecting(false); // Clear auto-signing state
407
+ // If sign-in successful, continue with permission check
408
+ const result = await hasPermission(toolName, false);
409
+ return result;
410
+ }
411
+ catch (signInError) {
412
+ console.error('Failed to auto-sign-in after token parse error:', signInError);
413
+ setIsAutoConnecting(false); // Clear auto-signing state on error
414
+ return false;
415
+ }
291
416
  }
292
- }
293
- catch (error) {
294
- console.error('Error parsing token:', error);
295
- setNxtlinqAITServiceAccessToken('');
296
- setMessages(prev => [...prev, {
297
- id: Date.now().toString(),
298
- content: 'Invalid wallet session. Please sign in again.',
299
- role: 'assistant',
300
- timestamp: new Date().toISOString(),
301
- button: 'signIn'
302
- }]);
417
+ // If autoRetry is false, don't show message again, just return false
303
418
  return false;
304
419
  }
305
- if (!ait) {
420
+ if (!currentAit) {
306
421
  // Show loading message if AIT is still loading
307
422
  if (isAITLoading) {
423
+ setIsLoading(false); // Stop thinking before showing message
308
424
  setMessages(prev => [...prev, {
309
425
  id: Date.now().toString(),
310
426
  content: 'Loading your wallet configuration... Please wait a moment.',
@@ -313,16 +429,65 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
313
429
  }]);
314
430
  return false;
315
431
  }
432
+ // If AIT is not loaded but we have a token, try to refresh it once
433
+ if (currentToken && !isAITLoading) {
434
+ try {
435
+ await refreshAIT();
436
+ // Wait for AIT to be loaded with polling
437
+ let attempts = 0;
438
+ const maxAttempts = 10; // Wait up to 5 seconds
439
+ while (!aitRef.current && attempts < maxAttempts) {
440
+ await new Promise(resolve => setTimeout(resolve, 500));
441
+ attempts++;
442
+ }
443
+ // Check again after refresh
444
+ if (!aitRef.current) {
445
+ setIsLoading(false); // Stop thinking before showing message
446
+ setMessages(prev => [...prev, {
447
+ id: Date.now().toString(),
448
+ content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
449
+ role: 'assistant',
450
+ timestamp: new Date().toISOString()
451
+ }]);
452
+ return false;
453
+ }
454
+ }
455
+ catch (error) {
456
+ console.error('Failed to refresh AIT during permission check:', error);
457
+ setIsLoading(false); // Stop thinking before showing message
458
+ setMessages(prev => [...prev, {
459
+ id: Date.now().toString(),
460
+ content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
461
+ role: 'assistant',
462
+ timestamp: new Date().toISOString()
463
+ }]);
464
+ return false;
465
+ }
466
+ }
467
+ else {
468
+ setIsLoading(false); // Stop thinking before showing message
469
+ setMessages(prev => [...prev, {
470
+ id: Date.now().toString(),
471
+ content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
472
+ role: 'assistant',
473
+ timestamp: new Date().toISOString()
474
+ }]);
475
+ return false;
476
+ }
477
+ }
478
+ const availablePermissionLabels = availablePermissions.map(p => p.label);
479
+ if (availablePermissions.length === 0) {
480
+ setIsLoading(false); // Stop thinking before showing message
316
481
  setMessages(prev => [...prev, {
317
482
  id: Date.now().toString(),
318
- content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
483
+ content: `No permissions available for your current identity provider. Please check your service configuration or contact support. Service ID: ${serviceId}, Permission Group: ${permissionGroup || 'None'}`,
319
484
  role: 'assistant',
320
485
  timestamp: new Date().toISOString()
321
486
  }]);
322
487
  return false;
323
488
  }
324
- const availablePermissionLabels = availablePermissions.map(p => p.label);
325
489
  if (!availablePermissionLabels.includes(toolName)) {
490
+ setIsLoading(false); // Stop thinking before showing message
326
491
  setMessages(prev => [...prev, {
327
492
  id: Date.now().toString(),
328
493
  content: `This tool (${toolName}) is not available for your current identity provider.`,
@@ -331,12 +496,20 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
331
496
  }]);
332
497
  return false;
333
498
  }
334
- if (!permissions.includes(toolName)) {
499
+ if (!currentPermissions.includes(toolName)) {
500
+ setIsLoading(false); // Stop thinking before showing message
335
501
  setMessages(prev => [...prev, {
336
502
  id: Date.now().toString(),
337
- content: `You do not have the required AIT permission: ${toolName}. Please click the settings button (⚙️) to update your permissions.`,
503
+ content: `You don't have the required AIT permission: ${toolName}. Would you like to enable AIT permissions?`,
338
504
  role: 'assistant',
339
- timestamp: new Date().toISOString()
505
+ timestamp: new Date().toISOString(),
506
+ button: 'enableAIT',
507
+ metadata: {
508
+ model: 'gpt-4',
509
+ permissions: currentPermissions,
510
+ issuedBy: currentHitAddress || '',
511
+ toolName: toolName
512
+ }
340
513
  }]);
341
514
  return false;
342
515
  }
@@ -352,23 +525,27 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
352
525
  return availableModels[selectedModelIndex];
353
526
  }, [availableModels, selectedModelIndex]);
354
527
  // Updated sendMessage function to support different AI models
355
- const sendMessage = async (content, retryCount = 0) => {
528
+ const sendMessage = async (content, retryCount = 0, isPresetMessage = false) => {
356
529
  if (!content.trim() || isLoading)
357
530
  return;
358
531
  const currentModel = getCurrentModel();
359
- const userMessage = {
360
- id: Date.now().toString(),
361
- content,
362
- role: 'user',
363
- timestamp: new Date().toISOString(),
364
- metadata: {
365
- model: currentModel.value,
366
- permissions: permissions,
367
- issuedBy: hitAddress || ''
368
- }
369
- };
370
- setMessages(prev => [...prev, userMessage]);
371
- setInputValue('');
532
+ // Only add user message on first attempt, not on retries
533
+ // Also check if this is not a preset message (preset messages are added separately)
534
+ if (retryCount === 0 && !isPresetMessage) {
535
+ const userMessage = {
536
+ id: Date.now().toString(),
537
+ content,
538
+ role: 'user',
539
+ timestamp: new Date().toISOString(),
540
+ metadata: {
541
+ model: currentModel.value,
542
+ permissions: permissions,
543
+ issuedBy: hitAddress || ''
544
+ }
545
+ };
546
+ setMessages(prev => [...prev, userMessage]);
547
+ setInputValue('');
548
+ }
372
549
  setIsLoading(true);
373
550
  try {
374
551
  // Build context messages
@@ -391,6 +568,23 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
391
568
  // Handle tool calls
392
569
  const toolUse = response.toolCall.toolUse;
393
570
  if (onToolUse) {
571
+ let wasAutoConnected = false;
572
+ const isToolAllowed = await hasPermission(toolUse.name, true, () => {
573
+ wasAutoConnected = true;
574
+ });
575
+ if (!isToolAllowed) {
576
+ // If we just auto-connected, retry the message once
577
+ if (wasAutoConnected && retryCount < 1) {
578
+ console.log('Auto-connected, retrying message...');
579
+ setTimeout(() => {
580
+ sendMessage(content, retryCount + 1, isPresetMessage);
581
+ }, 2000);
582
+ }
583
+ else {
584
+ console.log('Permission denied, not retrying. wasAutoConnected:', wasAutoConnected, 'retryCount:', retryCount);
585
+ }
586
+ return;
587
+ }
394
588
  const toolResult = await onToolUse(toolUse);
395
589
  if (toolResult) {
396
590
  // Ensure the tool result has model information
@@ -473,8 +667,24 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
473
667
  catch (error) {
474
668
  console.error('Failed to send message:', error);
475
669
  if (retryCount < maxRetries) {
670
+ // Show retry indicator to user
671
+ const retryMessage = {
672
+ id: `retry-${Date.now()}-${retryCount}`,
673
+ content: `Retrying... (Attempt ${retryCount + 1}/${maxRetries})`,
674
+ role: 'assistant',
675
+ timestamp: new Date().toISOString(),
676
+ metadata: {
677
+ model: currentModel.value,
678
+ permissions: permissions,
679
+ issuedBy: hitAddress || '',
680
+ isRetry: true
681
+ }
682
+ };
683
+ setMessages(prev => [...prev, retryMessage]);
476
684
  setTimeout(() => {
477
- sendMessage(content, retryCount + 1);
685
+ // Remove retry message before next attempt
686
+ setMessages(prev => prev.filter(msg => msg.id !== retryMessage.id));
687
+ sendMessage(content, retryCount + 1, isPresetMessage);
478
688
  }, retryDelay);
479
689
  return;
480
690
  }
@@ -539,12 +749,12 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
539
749
  };
540
750
  // Handle preset message
541
751
  const handlePresetMessage = (message) => {
542
- // Show loading message if AIT is still loading
543
- if (isAITLoading) {
544
- const loadingMessage = {
752
+ if (message.autoSend) {
753
+ // For preset messages, we need to add the user message first since sendMessage won't add it on retries
754
+ const userMessage = {
545
755
  id: Date.now().toString(),
546
- content: 'Loading your wallet configuration... Please wait a moment.',
547
- role: 'assistant',
756
+ content: message.text,
757
+ role: 'user',
548
758
  timestamp: new Date().toISOString(),
549
759
  metadata: {
550
760
  model: getCurrentModel().value,
@@ -552,29 +762,16 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
552
762
  issuedBy: hitAddress || ''
553
763
  }
554
764
  };
555
- setMessages(prev => [...prev, loadingMessage]);
556
- return;
557
- }
558
- if (message.autoSend) {
559
- setMessages(prev => [...prev, {
560
- id: Date.now().toString(),
561
- content: message.text,
562
- role: 'user',
563
- timestamp: new Date().toISOString(),
564
- metadata: {
565
- model: getCurrentModel().value,
566
- permissions: permissions,
567
- issuedBy: hitAddress || ''
568
- }
569
- }]);
570
- sendMessage(message.text);
765
+ setMessages(prev => [...prev, userMessage]);
766
+ // Pass a flag to indicate this is a preset message so sendMessage won't add user message again
767
+ sendMessage(message.text, 0, true);
571
768
  }
572
769
  else {
573
770
  setInputValue(message.text);
574
771
  }
575
772
  };
576
773
  // Generate and register AIT
577
- const generateAndRegisterAIT = async () => {
774
+ const generateAndRegisterAIT = async (newPermissions) => {
578
775
  if (!signer || !hitAddress) {
579
776
  throw new Error('Missing signer or wallet address');
580
777
  }
@@ -582,7 +779,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
582
779
  const aitId = `did:polygon:ike-dashboard:${hitAddress}:${timestamp}`;
583
780
  const metadata = {
584
781
  model: 'gpt-4',
585
- permissions,
782
+ permissions: newPermissions || permissions,
586
783
  issuedBy: hitAddress,
587
784
  };
588
785
  const metadataStr = stringify(metadata);
@@ -612,11 +809,46 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
612
809
  setAit(aitInfo);
613
810
  setPermissions(permissions);
614
811
  };
812
+ // Auto enable AIT permissions
813
+ const autoEnableAIT = async (toolName) => {
814
+ if (!signer || !hitAddress) {
815
+ showError('Please connect your wallet first');
816
+ return false;
817
+ }
818
+ try {
819
+ // Get available permissions to find the tool
820
+ const availablePermissionLabels = availablePermissions.map(p => p.label);
821
+ if (!availablePermissionLabels.includes(toolName)) {
822
+ showError(`Tool ${toolName} is not available for your current identity provider`);
823
+ return false;
824
+ }
825
+ // Add the required permission to current permissions
826
+ const newPermissions = [...permissions];
827
+ if (!newPermissions.includes(toolName)) {
828
+ newPermissions.push(toolName);
829
+ }
830
+ // Generate and register AIT with new permissions
831
+ await generateAndRegisterAIT(newPermissions);
832
+ showSuccess('AIT permissions enabled successfully! You can now use the AI agent.');
833
+ await refreshAIT(true);
834
+ return true;
835
+ }
836
+ catch (error) {
837
+ console.error('Failed to auto-enable AIT:', error);
838
+ if (error instanceof Error) {
839
+ showError(error.message);
840
+ }
841
+ else {
842
+ showError('Failed to enable AIT permissions. Please try again.');
843
+ }
844
+ return false;
845
+ }
846
+ };
615
847
  // Save permissions
616
- const savePermissions = async () => {
848
+ const savePermissions = async (newPermissions) => {
617
849
  setIsDisabled(true);
618
850
  try {
619
- await generateAndRegisterAIT();
851
+ await generateAndRegisterAIT(newPermissions);
620
852
  showSuccess('AIT permissions saved successfully! You can now use the AI agent with your configured permissions.');
621
853
  setShowPermissionForm(false);
622
854
  setIsPermissionFormOpen(false);
@@ -798,6 +1030,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
798
1030
  isDisabled,
799
1031
  walletInfo,
800
1032
  isWalletLoading,
1033
+ isAutoConnecting,
801
1034
  notification,
802
1035
  // AI Model related state
803
1036
  availableModels,
@@ -822,6 +1055,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
822
1055
  handleSubmit,
823
1056
  handlePresetMessage,
824
1057
  savePermissions,
1058
+ autoEnableAIT,
825
1059
  handleVerifyWalletClick,
826
1060
  showSuccess,
827
1061
  showError,
@@ -68,6 +68,7 @@ export interface ChatBotContextType {
68
68
  isDisabled: boolean;
69
69
  walletInfo: any;
70
70
  isWalletLoading: boolean;
71
+ isAutoConnecting: boolean;
71
72
  notification: {
72
73
  show: boolean;
73
74
  type: 'success' | 'error' | 'warning' | 'info';
@@ -93,7 +94,8 @@ export interface ChatBotContextType {
93
94
  sendMessage: (content: string, retryCount?: number) => Promise<void>;
94
95
  handleSubmit: (e: React.FormEvent) => Promise<void>;
95
96
  handlePresetMessage: (message: PresetMessage) => void;
96
- savePermissions: () => Promise<void>;
97
+ savePermissions: (newPermissions?: string[]) => Promise<void>;
98
+ autoEnableAIT: (toolName: string) => Promise<boolean>;
97
99
  handleVerifyWalletClick: () => Promise<void>;
98
100
  showSuccess: (message: string) => void;
99
101
  showError: (message: string) => void;
@@ -102,7 +104,7 @@ export interface ChatBotContextType {
102
104
  refreshAIT: (forceUpdatePermissions?: boolean) => Promise<void>;
103
105
  handleModelChange: (modelIndex: number) => void;
104
106
  getCurrentModel: () => AIModel;
105
- onSave: () => Promise<void>;
107
+ onSave: (newPermissions?: string[]) => Promise<void>;
106
108
  onConnectWallet: () => Promise<string | undefined>;
107
109
  onSignIn: () => Promise<void>;
108
110
  isNeedSignInWithWallet: boolean;
@@ -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":"ChatBotUI.d.ts","sourceRoot":"","sources":["../../../src/components/ui/ChatBotUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAsP7B,CAAC"}
1
+ {"version":3,"file":"ChatBotUI.d.ts","sourceRoot":"","sources":["../../../src/components/ui/ChatBotUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAqG/B,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAmP7B,CAAC"}