@bytexbyte/nxtlinq-ai-agent-sdk 1.2.5 → 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/dist/components/context/ChatBotContext.d.ts.map +1 -1
- package/dist/components/context/ChatBotContext.js +309 -88
- package/dist/components/types/ChatBotTypes.d.ts +2 -0
- package/dist/components/types/ChatBotTypes.d.ts.map +1 -1
- package/dist/components/ui/MessageList.d.ts.map +1 -1
- package/dist/components/ui/MessageList.js +38 -15
- package/dist/types/ait-api.d.ts +2 -0
- package/dist/types/ait-api.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatBotContext.d.ts","sourceRoot":"","sources":["../../../src/components/context/ChatBotContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EACL,kBAAkB,EAClB,YAAY,EAOb,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":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EACL,kBAAkB,EAClB,YAAY,EAOb,MAAM,uBAAuB,CAAC;AAI/B,eAAO,MAAM,UAAU,0BAMtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CAqpClD,CAAC"}
|
|
@@ -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,55 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
313
429
|
}]);
|
|
314
430
|
return false;
|
|
315
431
|
}
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
+
}
|
|
323
477
|
}
|
|
324
478
|
const availablePermissionLabels = availablePermissions.map(p => p.label);
|
|
325
479
|
if (availablePermissions.length === 0) {
|
|
480
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
326
481
|
setMessages(prev => [...prev, {
|
|
327
482
|
id: Date.now().toString(),
|
|
328
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'}`,
|
|
@@ -332,6 +487,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
332
487
|
return false;
|
|
333
488
|
}
|
|
334
489
|
if (!availablePermissionLabels.includes(toolName)) {
|
|
490
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
335
491
|
setMessages(prev => [...prev, {
|
|
336
492
|
id: Date.now().toString(),
|
|
337
493
|
content: `This tool (${toolName}) is not available for your current identity provider.`,
|
|
@@ -340,12 +496,20 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
340
496
|
}]);
|
|
341
497
|
return false;
|
|
342
498
|
}
|
|
343
|
-
if (!
|
|
499
|
+
if (!currentPermissions.includes(toolName)) {
|
|
500
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
344
501
|
setMessages(prev => [...prev, {
|
|
345
502
|
id: Date.now().toString(),
|
|
346
|
-
content: `You
|
|
503
|
+
content: `You don't have the required AIT permission: ${toolName}. Would you like to enable AIT permissions?`,
|
|
347
504
|
role: 'assistant',
|
|
348
|
-
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
|
+
}
|
|
349
513
|
}]);
|
|
350
514
|
return false;
|
|
351
515
|
}
|
|
@@ -361,23 +525,27 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
361
525
|
return availableModels[selectedModelIndex];
|
|
362
526
|
}, [availableModels, selectedModelIndex]);
|
|
363
527
|
// Updated sendMessage function to support different AI models
|
|
364
|
-
const sendMessage = async (content, retryCount = 0) => {
|
|
528
|
+
const sendMessage = async (content, retryCount = 0, isPresetMessage = false) => {
|
|
365
529
|
if (!content.trim() || isLoading)
|
|
366
530
|
return;
|
|
367
531
|
const currentModel = getCurrentModel();
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
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
|
+
}
|
|
381
549
|
setIsLoading(true);
|
|
382
550
|
try {
|
|
383
551
|
// Build context messages
|
|
@@ -400,8 +568,21 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
400
568
|
// Handle tool calls
|
|
401
569
|
const toolUse = response.toolCall.toolUse;
|
|
402
570
|
if (onToolUse) {
|
|
403
|
-
|
|
571
|
+
let wasAutoConnected = false;
|
|
572
|
+
const isToolAllowed = await hasPermission(toolUse.name, true, () => {
|
|
573
|
+
wasAutoConnected = true;
|
|
574
|
+
});
|
|
404
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
|
+
}
|
|
405
586
|
return;
|
|
406
587
|
}
|
|
407
588
|
const toolResult = await onToolUse(toolUse);
|
|
@@ -486,8 +667,24 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
486
667
|
catch (error) {
|
|
487
668
|
console.error('Failed to send message:', error);
|
|
488
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]);
|
|
489
684
|
setTimeout(() => {
|
|
490
|
-
|
|
685
|
+
// Remove retry message before next attempt
|
|
686
|
+
setMessages(prev => prev.filter(msg => msg.id !== retryMessage.id));
|
|
687
|
+
sendMessage(content, retryCount + 1, isPresetMessage);
|
|
491
688
|
}, retryDelay);
|
|
492
689
|
return;
|
|
493
690
|
}
|
|
@@ -552,12 +749,12 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
552
749
|
};
|
|
553
750
|
// Handle preset message
|
|
554
751
|
const handlePresetMessage = (message) => {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
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 = {
|
|
558
755
|
id: Date.now().toString(),
|
|
559
|
-
content:
|
|
560
|
-
role: '
|
|
756
|
+
content: message.text,
|
|
757
|
+
role: 'user',
|
|
561
758
|
timestamp: new Date().toISOString(),
|
|
562
759
|
metadata: {
|
|
563
760
|
model: getCurrentModel().value,
|
|
@@ -565,22 +762,9 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
565
762
|
issuedBy: hitAddress || ''
|
|
566
763
|
}
|
|
567
764
|
};
|
|
568
|
-
setMessages(prev => [...prev,
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
if (message.autoSend) {
|
|
572
|
-
setMessages(prev => [...prev, {
|
|
573
|
-
id: Date.now().toString(),
|
|
574
|
-
content: message.text,
|
|
575
|
-
role: 'user',
|
|
576
|
-
timestamp: new Date().toISOString(),
|
|
577
|
-
metadata: {
|
|
578
|
-
model: getCurrentModel().value,
|
|
579
|
-
permissions: permissions,
|
|
580
|
-
issuedBy: hitAddress || ''
|
|
581
|
-
}
|
|
582
|
-
}]);
|
|
583
|
-
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);
|
|
584
768
|
}
|
|
585
769
|
else {
|
|
586
770
|
setInputValue(message.text);
|
|
@@ -625,6 +809,41 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
625
809
|
setAit(aitInfo);
|
|
626
810
|
setPermissions(permissions);
|
|
627
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
|
+
};
|
|
628
847
|
// Save permissions
|
|
629
848
|
const savePermissions = async (newPermissions) => {
|
|
630
849
|
setIsDisabled(true);
|
|
@@ -811,6 +1030,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
811
1030
|
isDisabled,
|
|
812
1031
|
walletInfo,
|
|
813
1032
|
isWalletLoading,
|
|
1033
|
+
isAutoConnecting,
|
|
814
1034
|
notification,
|
|
815
1035
|
// AI Model related state
|
|
816
1036
|
availableModels,
|
|
@@ -835,6 +1055,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
835
1055
|
handleSubmit,
|
|
836
1056
|
handlePresetMessage,
|
|
837
1057
|
savePermissions,
|
|
1058
|
+
autoEnableAIT,
|
|
838
1059
|
handleVerifyWalletClick,
|
|
839
1060
|
showSuccess,
|
|
840
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';
|
|
@@ -94,6 +95,7 @@ export interface ChatBotContextType {
|
|
|
94
95
|
handleSubmit: (e: React.FormEvent) => Promise<void>;
|
|
95
96
|
handlePresetMessage: (message: PresetMessage) => void;
|
|
96
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;
|
|
@@ -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":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/ui/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"MessageList.d.ts","sourceRoot":"","sources":["../../../src/components/ui/MessageList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EA6K/B,CAAC"}
|
|
@@ -3,7 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import { useChatBot } from '../context/ChatBotContext';
|
|
4
4
|
import { AI_MODEL_MAP } from '../types/ChatBotTypes';
|
|
5
5
|
export const MessageList = () => {
|
|
6
|
-
const { messages, isLoading, connectWallet, signInWallet, hitAddress, ait, setShowPermissionForm, isWalletLoading, isNeedSignInWithWallet } = useChatBot();
|
|
6
|
+
const { messages, isLoading, connectWallet, signInWallet, hitAddress, ait, setShowPermissionForm, isWalletLoading, isAutoConnecting, isNeedSignInWithWallet, autoEnableAIT, isAITLoading } = useChatBot();
|
|
7
7
|
const messagesEndRef = React.useRef(null);
|
|
8
8
|
const scrollToBottom = () => {
|
|
9
9
|
messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });
|
|
@@ -11,13 +11,23 @@ export const MessageList = () => {
|
|
|
11
11
|
React.useEffect(() => {
|
|
12
12
|
scrollToBottom();
|
|
13
13
|
}, [messages]);
|
|
14
|
-
const handleButtonClick = (buttonType) => {
|
|
14
|
+
const handleButtonClick = async (buttonType, message) => {
|
|
15
15
|
if (buttonType === 'connect') {
|
|
16
16
|
connectWallet(true);
|
|
17
17
|
}
|
|
18
18
|
else if (buttonType === 'signIn') {
|
|
19
19
|
signInWallet(true);
|
|
20
20
|
}
|
|
21
|
+
else if (buttonType === 'enableAIT') {
|
|
22
|
+
const toolName = message.metadata?.toolName;
|
|
23
|
+
if (toolName) {
|
|
24
|
+
const success = await autoEnableAIT(toolName);
|
|
25
|
+
if (success) {
|
|
26
|
+
// If AIT is successfully enabled, you can choose to resend the user's last message
|
|
27
|
+
// Here you can add logic to reprocess the user's request
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
21
31
|
};
|
|
22
32
|
const getModelDisplayName = (modelValue) => {
|
|
23
33
|
if (!modelValue)
|
|
@@ -36,28 +46,41 @@ export const MessageList = () => {
|
|
|
36
46
|
maxWidth: '80%',
|
|
37
47
|
marginBottom: '10px'
|
|
38
48
|
}, children: [_jsxs("div", { style: {
|
|
39
|
-
backgroundColor: message.role === 'user' ? '#007bff' :
|
|
40
|
-
|
|
49
|
+
backgroundColor: message.role === 'user' ? '#007bff' :
|
|
50
|
+
message.metadata?.isRetry ? '#fff3cd' : '#f1f1f1',
|
|
51
|
+
color: message.role === 'user' ? 'white' :
|
|
52
|
+
message.metadata?.isRetry ? '#856404' : '#333',
|
|
41
53
|
padding: '10px 15px',
|
|
42
54
|
borderRadius: '15px',
|
|
43
55
|
wordWrap: 'break-word',
|
|
44
|
-
position: 'relative'
|
|
45
|
-
|
|
46
|
-
|
|
56
|
+
position: 'relative',
|
|
57
|
+
border: message.metadata?.isRetry ? '1px solid #ffeaa7' : 'none'
|
|
58
|
+
}, children: [message.metadata?.isRetry && (_jsx("span", { style: { marginRight: '8px', fontSize: '14px' }, children: "\uD83D\uDD04" })), message.content, message.button && (_jsx("div", { style: { marginTop: '10px' }, children: _jsx("button", { onClick: () => handleButtonClick(message.button, message), disabled: isAutoConnecting ||
|
|
59
|
+
(message.button === 'connect' && Boolean(hitAddress)) ||
|
|
60
|
+
(message.button === 'signIn' && !isNeedSignInWithWallet) ||
|
|
61
|
+
(message.button === 'enableAIT' && isAITLoading), style: {
|
|
47
62
|
padding: '8px 16px',
|
|
48
63
|
backgroundColor: message.role === 'user' ? 'rgba(255, 255, 255, 0.2)' :
|
|
49
|
-
|
|
50
|
-
(message.button === '
|
|
64
|
+
isAutoConnecting ? '#6c757d' :
|
|
65
|
+
(message.button === 'connect' && Boolean(hitAddress)) ? '#28a745' :
|
|
66
|
+
(message.button === 'signIn' && !isNeedSignInWithWallet) ? '#28a745' :
|
|
67
|
+
(message.button === 'enableAIT' && isAITLoading) ? '#6c757d' : '#007bff',
|
|
51
68
|
color: message.role === 'user' ? 'white' : 'white',
|
|
52
69
|
border: 'none',
|
|
53
70
|
borderRadius: '5px',
|
|
54
|
-
cursor: (
|
|
55
|
-
(message.button === '
|
|
71
|
+
cursor: (isAutoConnecting ||
|
|
72
|
+
(message.button === 'connect' && Boolean(hitAddress)) ||
|
|
73
|
+
(message.button === 'signIn' && !isNeedSignInWithWallet) ||
|
|
74
|
+
(message.button === 'enableAIT' && isAITLoading)) ? 'not-allowed' : 'pointer',
|
|
56
75
|
fontSize: '14px',
|
|
57
|
-
opacity: (
|
|
58
|
-
(message.button === '
|
|
59
|
-
|
|
60
|
-
|
|
76
|
+
opacity: (isAutoConnecting ||
|
|
77
|
+
(message.button === 'connect' && Boolean(hitAddress)) ||
|
|
78
|
+
(message.button === 'signIn' && !isNeedSignInWithWallet) ||
|
|
79
|
+
(message.button === 'enableAIT' && isAITLoading)) ? 0.8 : 1
|
|
80
|
+
}, children: isAutoConnecting ? 'Connecting...' :
|
|
81
|
+
message.button === 'connect' ? (Boolean(hitAddress) ? 'Connected' : 'Connect Wallet') :
|
|
82
|
+
message.button === 'signIn' ? (!isNeedSignInWithWallet ? 'Signed In' : 'Sign In') :
|
|
83
|
+
message.button === 'enableAIT' ? (isAITLoading ? 'Enabling...' : 'Enable AIT Permissions') : message.button }) }))] }), message.role === 'assistant' && message.metadata?.model && (_jsx("div", { style: {
|
|
61
84
|
display: 'flex',
|
|
62
85
|
alignItems: 'center',
|
|
63
86
|
marginTop: '4px',
|
package/dist/types/ait-api.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ait-api.d.ts","sourceRoot":"","sources":["../../src/types/ait-api.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE;YACR,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SAC5B,CAAC;
|
|
1
|
+
{"version":3,"file":"ait-api.d.ts","sourceRoot":"","sources":["../../src/types/ait-api.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED