@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.
- package/README.md +204 -55
- package/dist/components/context/ChatBotContext.d.ts.map +1 -1
- package/dist/components/context/ChatBotContext.js +320 -86
- package/dist/components/types/ChatBotTypes.d.ts +4 -2
- package/dist/components/types/ChatBotTypes.d.ts.map +1 -1
- package/dist/components/ui/ChatBotUI.d.ts.map +1 -1
- package/dist/components/ui/ChatBotUI.js +73 -8
- package/dist/components/ui/MessageInput.d.ts.map +1 -1
- package/dist/components/ui/MessageInput.js +7 -4
- package/dist/components/ui/MessageList.d.ts.map +1 -1
- package/dist/components/ui/MessageList.js +40 -11
- package/dist/components/ui/PermissionForm.d.ts.map +1 -1
- package/dist/components/ui/PermissionForm.js +60 -23
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/types/ait-api.d.ts +2 -0
- package/dist/types/ait-api.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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 (!
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
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(
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
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 !==
|
|
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: '
|
|
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
|
-
|
|
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 (!
|
|
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:
|
|
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 (!
|
|
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
|
|
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
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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
|
-
|
|
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
|
-
|
|
543
|
-
|
|
544
|
-
const
|
|
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:
|
|
547
|
-
role: '
|
|
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,
|
|
556
|
-
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAE,MAAM,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,EAMtC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM/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;CAC1C;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,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,GAAG,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,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;IAEF,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAG3B,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,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAG9C,aAAa,EAAE,CAAC,qBAAqB,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChF,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,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,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":"ChatBotUI.d.ts","sourceRoot":"","sources":["../../../src/components/ui/ChatBotUI.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,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"}
|