@bytexbyte/nxtlinq-ai-agent-sdk 1.2.5 → 1.2.7
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 +462 -102
- 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/components/ui/PermissionForm.d.ts.map +1 -1
- package/dist/components/ui/PermissionForm.js +17 -1
- 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,CAqzClD,CAAC"}
|
|
@@ -33,7 +33,31 @@ 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
|
+
const signerRef = React.useRef(signer);
|
|
45
|
+
// Update refs when state changes
|
|
46
|
+
React.useEffect(() => {
|
|
47
|
+
hitAddressRef.current = hitAddress;
|
|
48
|
+
}, [hitAddress]);
|
|
49
|
+
React.useEffect(() => {
|
|
50
|
+
aitRef.current = ait;
|
|
51
|
+
}, [ait]);
|
|
52
|
+
React.useEffect(() => {
|
|
53
|
+
permissionsRef.current = permissions;
|
|
54
|
+
}, [permissions]);
|
|
55
|
+
React.useEffect(() => {
|
|
56
|
+
nxtlinqAITServiceAccessTokenRef.current = nxtlinqAITServiceAccessToken;
|
|
57
|
+
}, [nxtlinqAITServiceAccessToken]);
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
signerRef.current = signer;
|
|
60
|
+
}, [signer]);
|
|
37
61
|
const [notification, setNotification] = React.useState({
|
|
38
62
|
show: false,
|
|
39
63
|
type: 'info',
|
|
@@ -64,6 +88,13 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
64
88
|
const showError = (message) => showNotification('error', message, 5000);
|
|
65
89
|
const showWarning = (message) => showNotification('warning', message, 4000);
|
|
66
90
|
const showInfo = (message) => showNotification('info', message, 3000);
|
|
91
|
+
// Filter out wallet connection messages for API calls
|
|
92
|
+
const getFilteredMessagesForAPI = () => {
|
|
93
|
+
return messages.filter(msg => !msg.content.includes('Please connect your HIT wallet') &&
|
|
94
|
+
!msg.content.includes('Please sign in with your wallet') &&
|
|
95
|
+
!msg.content.includes('connect your wallet') &&
|
|
96
|
+
!msg.content.includes('Wallet verification completed successfully'));
|
|
97
|
+
};
|
|
67
98
|
// Fetch available permissions
|
|
68
99
|
const fetchAvailablePermissions = async () => {
|
|
69
100
|
if (!serviceId)
|
|
@@ -93,18 +124,25 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
93
124
|
}
|
|
94
125
|
setIsAITLoading(true);
|
|
95
126
|
try {
|
|
96
|
-
// Get wallet info first
|
|
127
|
+
// Get wallet info first - always try to get wallet info if we have a token
|
|
97
128
|
if (nxtlinqAITServiceAccessToken) {
|
|
98
129
|
try {
|
|
99
130
|
const walletResponse = await nxtlinqApi.wallet.getWallet({ address: hitAddress }, nxtlinqAITServiceAccessToken);
|
|
100
131
|
if (!('error' in walletResponse)) {
|
|
101
132
|
setWalletInfo(walletResponse);
|
|
133
|
+
console.log('Wallet info updated:', walletResponse);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.log('Failed to get wallet info:', walletResponse.error);
|
|
102
137
|
}
|
|
103
138
|
}
|
|
104
139
|
catch (error) {
|
|
105
140
|
console.error('Failed to fetch wallet info:', error);
|
|
106
141
|
}
|
|
107
142
|
}
|
|
143
|
+
else {
|
|
144
|
+
console.log('No access token available for wallet info fetch');
|
|
145
|
+
}
|
|
108
146
|
const response = await nxtlinqApi.ait.getAITByServiceIdAndController({
|
|
109
147
|
serviceId,
|
|
110
148
|
controller: hitAddress
|
|
@@ -170,6 +208,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
170
208
|
localStorage.setItem('walletAddress', userAddress);
|
|
171
209
|
setHitAddress(userAddress);
|
|
172
210
|
setSigner(userSigner);
|
|
211
|
+
// Wait for AIT to be loaded if we have a token
|
|
173
212
|
if (nxtlinqAITServiceAccessToken) {
|
|
174
213
|
await refreshAIT();
|
|
175
214
|
}
|
|
@@ -194,117 +233,293 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
194
233
|
localStorage.removeItem('walletAddress');
|
|
195
234
|
setHitAddress(null);
|
|
196
235
|
setSigner(null);
|
|
197
|
-
|
|
236
|
+
if (autoShowSignInMessage) {
|
|
237
|
+
throw error;
|
|
238
|
+
}
|
|
198
239
|
}
|
|
199
240
|
}, [nxtlinqAITServiceAccessToken, refreshAIT, isNeedSignInWithWallet]);
|
|
200
241
|
// Sign in wallet
|
|
201
242
|
const signInWallet = async (autoShowSuccessMessage = true) => {
|
|
202
|
-
|
|
203
|
-
|
|
243
|
+
// Use refs to get latest state values for consistency with hasPermission
|
|
244
|
+
const currentHitAddress = hitAddressRef.current;
|
|
245
|
+
const currentSigner = signerRef.current;
|
|
246
|
+
console.log('signInWallet called: currentHitAddress =', currentHitAddress, 'currentSigner =', !!currentSigner);
|
|
247
|
+
if (!currentHitAddress) {
|
|
248
|
+
console.log('No currentHitAddress, returning early');
|
|
249
|
+
if (autoShowSuccessMessage) {
|
|
250
|
+
showError('Please connect your wallet first.');
|
|
251
|
+
}
|
|
204
252
|
return;
|
|
205
253
|
}
|
|
206
|
-
if (!
|
|
207
|
-
|
|
254
|
+
if (!currentSigner) {
|
|
255
|
+
console.log('No currentSigner, returning early');
|
|
256
|
+
if (autoShowSuccessMessage) {
|
|
257
|
+
showError('Please connect your wallet first.');
|
|
258
|
+
}
|
|
208
259
|
return;
|
|
209
260
|
}
|
|
210
261
|
try {
|
|
211
|
-
const nonceResponse = await nxtlinqApi.auth.getNonce({ address:
|
|
262
|
+
const nonceResponse = await nxtlinqApi.auth.getNonce({ address: currentHitAddress });
|
|
212
263
|
if ('error' in nonceResponse) {
|
|
213
|
-
|
|
264
|
+
if (autoShowSuccessMessage) {
|
|
265
|
+
showError(nonceResponse.error);
|
|
266
|
+
}
|
|
214
267
|
return;
|
|
215
268
|
}
|
|
216
269
|
const payload = {
|
|
217
|
-
address:
|
|
270
|
+
address: currentHitAddress,
|
|
218
271
|
code: nonceResponse.code,
|
|
219
272
|
timestamp: nonceResponse.timestamp
|
|
220
273
|
};
|
|
221
274
|
const stringToSign = stringify(payload);
|
|
222
|
-
const signature = await
|
|
275
|
+
const signature = await currentSigner.signMessage(stringToSign || '');
|
|
223
276
|
const response = await nxtlinqApi.auth.signIn({
|
|
224
277
|
...payload,
|
|
225
278
|
signature
|
|
226
279
|
});
|
|
227
280
|
if ('error' in response) {
|
|
228
|
-
|
|
281
|
+
if (autoShowSuccessMessage) {
|
|
282
|
+
showError(response.error);
|
|
283
|
+
}
|
|
229
284
|
return;
|
|
230
285
|
}
|
|
231
286
|
const { accessToken } = response;
|
|
232
287
|
setNxtlinqAITServiceAccessToken(accessToken);
|
|
288
|
+
// Wait for AIT to be loaded before showing success message
|
|
289
|
+
await refreshAIT();
|
|
233
290
|
if (autoShowSuccessMessage) {
|
|
234
291
|
showSuccess('Successfully signed in with your HIT wallet. You can now use the AI agent.');
|
|
235
292
|
}
|
|
236
|
-
refreshAIT();
|
|
237
293
|
}
|
|
238
294
|
catch (error) {
|
|
239
295
|
console.error('Failed to sign in:', error);
|
|
240
|
-
|
|
296
|
+
if (autoShowSuccessMessage) {
|
|
297
|
+
showError('Failed to sign in. Please try again.');
|
|
298
|
+
}
|
|
241
299
|
}
|
|
242
300
|
};
|
|
243
301
|
// Check permissions
|
|
244
|
-
const hasPermission = async (toolName) => {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
302
|
+
const hasPermission = async (toolName, autoRetry = true, onAutoConnect) => {
|
|
303
|
+
// Use refs to get latest state values
|
|
304
|
+
const currentHitAddress = hitAddressRef.current;
|
|
305
|
+
const currentAit = aitRef.current;
|
|
306
|
+
const currentPermissions = permissionsRef.current;
|
|
307
|
+
const currentToken = nxtlinqAITServiceAccessTokenRef.current;
|
|
308
|
+
if (!currentHitAddress) {
|
|
309
|
+
if (autoRetry) {
|
|
310
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
311
|
+
setMessages(prev => [...prev, {
|
|
312
|
+
id: Date.now().toString(),
|
|
313
|
+
content: 'Please connect your HIT wallet to continue.',
|
|
314
|
+
role: 'assistant',
|
|
315
|
+
timestamp: new Date().toISOString(),
|
|
316
|
+
button: 'connect'
|
|
317
|
+
}]);
|
|
318
|
+
try {
|
|
319
|
+
setIsAutoConnecting(true); // Mark as auto-connecting
|
|
320
|
+
await connectWallet(false); // Don't show sign-in message yet
|
|
321
|
+
setIsAutoConnecting(false); // Clear auto-connecting state
|
|
322
|
+
setJustAutoConnected(true); // Mark that we just auto-connected
|
|
323
|
+
console.log('Set justAutoConnected to true after auto-connect');
|
|
324
|
+
// Show brief success message for auto-connect
|
|
325
|
+
showSuccess('Auto wallet connection successful');
|
|
326
|
+
// Clear the flag after a short delay
|
|
327
|
+
setTimeout(() => {
|
|
328
|
+
setJustAutoConnected(false);
|
|
329
|
+
}, 2000);
|
|
330
|
+
onAutoConnect?.(); // Call callback if provided
|
|
331
|
+
// If connection successful, continue with permission check
|
|
332
|
+
// Wait a bit for state to update
|
|
333
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
334
|
+
const result = await hasPermission(toolName, false);
|
|
335
|
+
return result;
|
|
336
|
+
}
|
|
337
|
+
catch (error) {
|
|
338
|
+
console.error('Failed to auto-connect wallet:', error);
|
|
339
|
+
setIsAutoConnecting(false); // Clear auto-connecting state on error
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// If autoRetry is false, don't show message again, just return false
|
|
253
344
|
return false;
|
|
254
345
|
}
|
|
255
|
-
if (!
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
346
|
+
if (!currentToken) {
|
|
347
|
+
if (autoRetry) {
|
|
348
|
+
console.log('Auto sign-in triggered: currentHitAddress =', currentHitAddress, 'currentToken =', currentToken);
|
|
349
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
350
|
+
setMessages(prev => [...prev, {
|
|
351
|
+
id: Date.now().toString(),
|
|
352
|
+
content: 'Please sign in with your HIT wallet to continue.',
|
|
353
|
+
role: 'assistant',
|
|
354
|
+
timestamp: new Date().toISOString(),
|
|
355
|
+
button: 'signIn'
|
|
356
|
+
}]);
|
|
357
|
+
try {
|
|
358
|
+
setIsAutoConnecting(true); // Mark as auto-signing
|
|
359
|
+
console.log('Starting auto sign-in...');
|
|
360
|
+
await signInWallet(false); // Don't show success message yet
|
|
361
|
+
console.log('Auto sign-in completed');
|
|
362
|
+
setIsAutoConnecting(false); // Clear auto-signing state
|
|
363
|
+
// Show brief success message for auto-sign-in
|
|
364
|
+
showSuccess('Auto sign-in successful');
|
|
365
|
+
// Ensure AIT is refreshed after sign-in
|
|
366
|
+
await refreshAIT();
|
|
367
|
+
// Wait for AIT to be fully loaded with polling
|
|
368
|
+
let attempts = 0;
|
|
369
|
+
const maxAttempts = 20; // Wait up to 10 seconds
|
|
370
|
+
while (!aitRef.current && attempts < maxAttempts) {
|
|
371
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
372
|
+
attempts++;
|
|
373
|
+
}
|
|
374
|
+
// Wait a bit more to ensure permissions are also loaded
|
|
375
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
376
|
+
// If sign-in successful, continue with permission check
|
|
377
|
+
const result = await hasPermission(toolName, false);
|
|
378
|
+
return result;
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
console.error('Failed to auto-sign-in wallet:', error);
|
|
382
|
+
setIsAutoConnecting(false); // Clear auto-signing state on error
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
// If autoRetry is false, don't show message again, just return false
|
|
263
387
|
return false;
|
|
264
388
|
}
|
|
265
389
|
try {
|
|
266
|
-
const payload = JSON.parse(atob(
|
|
390
|
+
const payload = JSON.parse(atob(currentToken.split('.')[1]));
|
|
267
391
|
const exp = payload.exp * 1000;
|
|
268
392
|
const now = Date.now();
|
|
269
393
|
if (exp < now) {
|
|
270
394
|
setNxtlinqAITServiceAccessToken('');
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
395
|
+
if (autoRetry) {
|
|
396
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
397
|
+
setMessages(prev => [...prev, {
|
|
398
|
+
id: Date.now().toString(),
|
|
399
|
+
content: 'Your wallet session has expired. Please sign in again.',
|
|
400
|
+
role: 'assistant',
|
|
401
|
+
timestamp: new Date().toISOString(),
|
|
402
|
+
button: 'signIn'
|
|
403
|
+
}]);
|
|
404
|
+
try {
|
|
405
|
+
setIsAutoConnecting(true); // Mark as auto-signing
|
|
406
|
+
await signInWallet(false); // Don't show success message yet
|
|
407
|
+
setIsAutoConnecting(false); // Clear auto-signing state
|
|
408
|
+
// Show brief success message for auto-sign-in after session expiry
|
|
409
|
+
showSuccess('Auto sign-in successful after session expiry');
|
|
410
|
+
// Ensure AIT is refreshed after sign-in
|
|
411
|
+
await refreshAIT();
|
|
412
|
+
// Wait for AIT to be fully loaded with polling
|
|
413
|
+
let attempts = 0;
|
|
414
|
+
const maxAttempts = 20; // Wait up to 10 seconds
|
|
415
|
+
while (!aitRef.current && attempts < maxAttempts) {
|
|
416
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
417
|
+
attempts++;
|
|
418
|
+
}
|
|
419
|
+
// Wait a bit more to ensure permissions are also loaded
|
|
420
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
421
|
+
// If sign-in successful, continue with permission check
|
|
422
|
+
const result = await hasPermission(toolName, false);
|
|
423
|
+
return result;
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
console.error('Failed to auto-sign-in after session expiry:', error);
|
|
427
|
+
setIsAutoConnecting(false); // Clear auto-signing state on error
|
|
428
|
+
return false;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
// If autoRetry is false, don't show message again, just return false
|
|
278
432
|
return false;
|
|
279
433
|
}
|
|
280
434
|
const address = payload.address;
|
|
281
|
-
if (address !==
|
|
435
|
+
if (address !== currentHitAddress) {
|
|
282
436
|
setNxtlinqAITServiceAccessToken('');
|
|
437
|
+
if (autoRetry) {
|
|
438
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
439
|
+
setMessages(prev => [...prev, {
|
|
440
|
+
id: Date.now().toString(),
|
|
441
|
+
content: 'Wallet address mismatch. Please sign in with the correct wallet.',
|
|
442
|
+
role: 'assistant',
|
|
443
|
+
timestamp: new Date().toISOString(),
|
|
444
|
+
button: 'signIn'
|
|
445
|
+
}]);
|
|
446
|
+
try {
|
|
447
|
+
setIsAutoConnecting(true); // Mark as auto-signing
|
|
448
|
+
await signInWallet(false); // Don't show success message yet
|
|
449
|
+
setIsAutoConnecting(false); // Clear auto-signing state
|
|
450
|
+
// Show brief success message for auto-sign-in after address mismatch
|
|
451
|
+
showSuccess('Auto sign-in successful after address mismatch');
|
|
452
|
+
// Ensure AIT is refreshed after sign-in
|
|
453
|
+
await refreshAIT();
|
|
454
|
+
// Wait for AIT to be fully loaded with polling
|
|
455
|
+
let attempts = 0;
|
|
456
|
+
const maxAttempts = 20; // Wait up to 10 seconds
|
|
457
|
+
while (!aitRef.current && attempts < maxAttempts) {
|
|
458
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
459
|
+
attempts++;
|
|
460
|
+
}
|
|
461
|
+
// Wait a bit more to ensure permissions are also loaded
|
|
462
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
463
|
+
// If sign-in successful, continue with permission check
|
|
464
|
+
const result = await hasPermission(toolName, false);
|
|
465
|
+
return result;
|
|
466
|
+
}
|
|
467
|
+
catch (error) {
|
|
468
|
+
console.error('Failed to auto-sign-in after address mismatch:', error);
|
|
469
|
+
setIsAutoConnecting(false); // Clear auto-signing state on error
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
// If autoRetry is false, don't show message again, just return false
|
|
474
|
+
return false;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
catch (error) {
|
|
478
|
+
console.error('Error parsing token:', error);
|
|
479
|
+
setNxtlinqAITServiceAccessToken('');
|
|
480
|
+
if (autoRetry) {
|
|
481
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
283
482
|
setMessages(prev => [...prev, {
|
|
284
483
|
id: Date.now().toString(),
|
|
285
|
-
content: '
|
|
484
|
+
content: 'Invalid wallet session. Please sign in again.',
|
|
286
485
|
role: 'assistant',
|
|
287
486
|
timestamp: new Date().toISOString(),
|
|
288
487
|
button: 'signIn'
|
|
289
488
|
}]);
|
|
290
|
-
|
|
489
|
+
try {
|
|
490
|
+
setIsAutoConnecting(true); // Mark as auto-signing
|
|
491
|
+
await signInWallet(false); // Don't show success message yet
|
|
492
|
+
setIsAutoConnecting(false); // Clear auto-signing state
|
|
493
|
+
// Show brief success message for auto-sign-in after token parse error
|
|
494
|
+
showSuccess('Auto sign-in successful after token error');
|
|
495
|
+
// Ensure AIT is refreshed after sign-in
|
|
496
|
+
await refreshAIT();
|
|
497
|
+
// Wait for AIT to be fully loaded with polling
|
|
498
|
+
let attempts = 0;
|
|
499
|
+
const maxAttempts = 20; // Wait up to 10 seconds
|
|
500
|
+
while (!aitRef.current && attempts < maxAttempts) {
|
|
501
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
502
|
+
attempts++;
|
|
503
|
+
}
|
|
504
|
+
// Wait a bit more to ensure permissions are also loaded
|
|
505
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
506
|
+
// If sign-in successful, continue with permission check
|
|
507
|
+
const result = await hasPermission(toolName, false);
|
|
508
|
+
return result;
|
|
509
|
+
}
|
|
510
|
+
catch (signInError) {
|
|
511
|
+
console.error('Failed to auto-sign-in after token parse error:', signInError);
|
|
512
|
+
setIsAutoConnecting(false); // Clear auto-signing state on error
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
291
515
|
}
|
|
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
|
-
}]);
|
|
516
|
+
// If autoRetry is false, don't show message again, just return false
|
|
303
517
|
return false;
|
|
304
518
|
}
|
|
305
|
-
if (!
|
|
519
|
+
if (!currentAit) {
|
|
306
520
|
// Show loading message if AIT is still loading
|
|
307
521
|
if (isAITLoading) {
|
|
522
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
308
523
|
setMessages(prev => [...prev, {
|
|
309
524
|
id: Date.now().toString(),
|
|
310
525
|
content: 'Loading your wallet configuration... Please wait a moment.',
|
|
@@ -313,16 +528,55 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
313
528
|
}]);
|
|
314
529
|
return false;
|
|
315
530
|
}
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
531
|
+
// If AIT is not loaded but we have a token, try to refresh it once
|
|
532
|
+
if (currentToken && !isAITLoading) {
|
|
533
|
+
try {
|
|
534
|
+
await refreshAIT();
|
|
535
|
+
// Wait for AIT to be loaded with polling
|
|
536
|
+
let attempts = 0;
|
|
537
|
+
const maxAttempts = 10; // Wait up to 5 seconds
|
|
538
|
+
while (!aitRef.current && attempts < maxAttempts) {
|
|
539
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
540
|
+
attempts++;
|
|
541
|
+
}
|
|
542
|
+
// Check again after refresh
|
|
543
|
+
if (!aitRef.current) {
|
|
544
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
545
|
+
setMessages(prev => [...prev, {
|
|
546
|
+
id: Date.now().toString(),
|
|
547
|
+
content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
|
|
548
|
+
role: 'assistant',
|
|
549
|
+
timestamp: new Date().toISOString()
|
|
550
|
+
}]);
|
|
551
|
+
return false;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
catch (error) {
|
|
555
|
+
console.error('Failed to refresh AIT during permission check:', error);
|
|
556
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
557
|
+
setMessages(prev => [...prev, {
|
|
558
|
+
id: Date.now().toString(),
|
|
559
|
+
content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
|
|
560
|
+
role: 'assistant',
|
|
561
|
+
timestamp: new Date().toISOString()
|
|
562
|
+
}]);
|
|
563
|
+
return false;
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
else {
|
|
567
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
568
|
+
setMessages(prev => [...prev, {
|
|
569
|
+
id: Date.now().toString(),
|
|
570
|
+
content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
|
|
571
|
+
role: 'assistant',
|
|
572
|
+
timestamp: new Date().toISOString()
|
|
573
|
+
}]);
|
|
574
|
+
return false;
|
|
575
|
+
}
|
|
323
576
|
}
|
|
324
577
|
const availablePermissionLabels = availablePermissions.map(p => p.label);
|
|
325
578
|
if (availablePermissions.length === 0) {
|
|
579
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
326
580
|
setMessages(prev => [...prev, {
|
|
327
581
|
id: Date.now().toString(),
|
|
328
582
|
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 +586,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
332
586
|
return false;
|
|
333
587
|
}
|
|
334
588
|
if (!availablePermissionLabels.includes(toolName)) {
|
|
589
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
335
590
|
setMessages(prev => [...prev, {
|
|
336
591
|
id: Date.now().toString(),
|
|
337
592
|
content: `This tool (${toolName}) is not available for your current identity provider.`,
|
|
@@ -340,12 +595,43 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
340
595
|
}]);
|
|
341
596
|
return false;
|
|
342
597
|
}
|
|
343
|
-
if (!
|
|
598
|
+
if (!currentPermissions.includes(toolName)) {
|
|
599
|
+
// Check if AIT is still loading or if we just auto-connected
|
|
600
|
+
if (isAITLoading || isAutoConnecting) {
|
|
601
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
602
|
+
setMessages(prev => [...prev, {
|
|
603
|
+
id: Date.now().toString(),
|
|
604
|
+
content: 'Loading your wallet configuration... Please wait a moment.',
|
|
605
|
+
role: 'assistant',
|
|
606
|
+
timestamp: new Date().toISOString()
|
|
607
|
+
}]);
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
610
|
+
// If AIT is loaded but permissions are empty, it means no AIT was found
|
|
611
|
+
if (currentAit && currentPermissions.length === 0) {
|
|
612
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
613
|
+
setMessages(prev => [...prev, {
|
|
614
|
+
id: Date.now().toString(),
|
|
615
|
+
content: 'No AIT found for your wallet. Please click the settings button (⚙️) to configure your AIT permissions.',
|
|
616
|
+
role: 'assistant',
|
|
617
|
+
timestamp: new Date().toISOString()
|
|
618
|
+
}]);
|
|
619
|
+
return false;
|
|
620
|
+
}
|
|
621
|
+
// Only show permission error if AIT is loaded and permissions are not empty
|
|
622
|
+
setIsLoading(false); // Stop thinking before showing message
|
|
344
623
|
setMessages(prev => [...prev, {
|
|
345
624
|
id: Date.now().toString(),
|
|
346
|
-
content: `You
|
|
625
|
+
content: `You don't have the required AIT permission: ${toolName}. Would you like to enable AIT permissions?`,
|
|
347
626
|
role: 'assistant',
|
|
348
|
-
timestamp: new Date().toISOString()
|
|
627
|
+
timestamp: new Date().toISOString(),
|
|
628
|
+
button: 'enableAIT',
|
|
629
|
+
metadata: {
|
|
630
|
+
model: 'gpt-4',
|
|
631
|
+
permissions: currentPermissions,
|
|
632
|
+
issuedBy: currentHitAddress || '',
|
|
633
|
+
toolName: toolName
|
|
634
|
+
}
|
|
349
635
|
}]);
|
|
350
636
|
return false;
|
|
351
637
|
}
|
|
@@ -361,27 +647,32 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
361
647
|
return availableModels[selectedModelIndex];
|
|
362
648
|
}, [availableModels, selectedModelIndex]);
|
|
363
649
|
// Updated sendMessage function to support different AI models
|
|
364
|
-
const sendMessage = async (content, retryCount = 0) => {
|
|
650
|
+
const sendMessage = async (content, retryCount = 0, isPresetMessage = false) => {
|
|
365
651
|
if (!content.trim() || isLoading)
|
|
366
652
|
return;
|
|
367
653
|
const currentModel = getCurrentModel();
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
654
|
+
// Only add user message on first attempt, not on retries
|
|
655
|
+
// Also check if this is not a preset message (preset messages are added separately)
|
|
656
|
+
if (retryCount === 0 && !isPresetMessage) {
|
|
657
|
+
const userMessage = {
|
|
658
|
+
id: Date.now().toString(),
|
|
659
|
+
content,
|
|
660
|
+
role: 'user',
|
|
661
|
+
timestamp: new Date().toISOString(),
|
|
662
|
+
metadata: {
|
|
663
|
+
model: currentModel.value,
|
|
664
|
+
permissions: permissions,
|
|
665
|
+
issuedBy: hitAddress || ''
|
|
666
|
+
}
|
|
667
|
+
};
|
|
668
|
+
setMessages(prev => [...prev, userMessage]);
|
|
669
|
+
setInputValue('');
|
|
670
|
+
}
|
|
381
671
|
setIsLoading(true);
|
|
382
672
|
try {
|
|
383
|
-
// Build context messages
|
|
384
|
-
const
|
|
673
|
+
// Build context messages (filter out wallet connection messages)
|
|
674
|
+
const filteredMessages = getFilteredMessagesForAPI();
|
|
675
|
+
const contextMessages = filteredMessages.map(msg => ({
|
|
385
676
|
role: msg.role,
|
|
386
677
|
text: msg.content
|
|
387
678
|
}));
|
|
@@ -400,8 +691,37 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
400
691
|
// Handle tool calls
|
|
401
692
|
const toolUse = response.toolCall.toolUse;
|
|
402
693
|
if (onToolUse) {
|
|
403
|
-
|
|
694
|
+
let wasAutoConnected = false;
|
|
695
|
+
const isToolAllowed = await hasPermission(toolUse.name, true, () => {
|
|
696
|
+
wasAutoConnected = true;
|
|
697
|
+
});
|
|
404
698
|
if (!isToolAllowed) {
|
|
699
|
+
// If we just auto-connected, retry the message once
|
|
700
|
+
if (wasAutoConnected && retryCount < 1) {
|
|
701
|
+
console.log('Auto-connected, retrying message...');
|
|
702
|
+
// Clear loading state and retry immediately
|
|
703
|
+
setIsLoading(false);
|
|
704
|
+
// Use a longer delay to ensure AIT is fully loaded
|
|
705
|
+
setTimeout(async () => {
|
|
706
|
+
// Wait for AIT to be loaded if needed
|
|
707
|
+
if (!aitRef.current && nxtlinqAITServiceAccessTokenRef.current) {
|
|
708
|
+
await refreshAIT();
|
|
709
|
+
// Wait for AIT to be fully loaded with polling
|
|
710
|
+
let attempts = 0;
|
|
711
|
+
const maxAttempts = 20; // Wait up to 10 seconds
|
|
712
|
+
while (!aitRef.current && attempts < maxAttempts) {
|
|
713
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
714
|
+
attempts++;
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
// Wait a bit more to ensure permissions are also loaded
|
|
718
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
719
|
+
sendMessage(content, retryCount + 1, isPresetMessage);
|
|
720
|
+
}, 1000);
|
|
721
|
+
}
|
|
722
|
+
else {
|
|
723
|
+
console.log('Permission denied, not retrying. wasAutoConnected:', wasAutoConnected, 'retryCount:', retryCount);
|
|
724
|
+
}
|
|
405
725
|
return;
|
|
406
726
|
}
|
|
407
727
|
const toolResult = await onToolUse(toolUse);
|
|
@@ -486,8 +806,24 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
486
806
|
catch (error) {
|
|
487
807
|
console.error('Failed to send message:', error);
|
|
488
808
|
if (retryCount < maxRetries) {
|
|
809
|
+
// Show retry indicator to user
|
|
810
|
+
const retryMessage = {
|
|
811
|
+
id: `retry-${Date.now()}-${retryCount}`,
|
|
812
|
+
content: `Retrying... (Attempt ${retryCount + 1}/${maxRetries})`,
|
|
813
|
+
role: 'assistant',
|
|
814
|
+
timestamp: new Date().toISOString(),
|
|
815
|
+
metadata: {
|
|
816
|
+
model: currentModel.value,
|
|
817
|
+
permissions: permissions,
|
|
818
|
+
issuedBy: hitAddress || '',
|
|
819
|
+
isRetry: true
|
|
820
|
+
}
|
|
821
|
+
};
|
|
822
|
+
setMessages(prev => [...prev, retryMessage]);
|
|
489
823
|
setTimeout(() => {
|
|
490
|
-
|
|
824
|
+
// Remove retry message before next attempt
|
|
825
|
+
setMessages(prev => prev.filter(msg => msg.id !== retryMessage.id));
|
|
826
|
+
sendMessage(content, retryCount + 1, isPresetMessage);
|
|
491
827
|
}, retryDelay);
|
|
492
828
|
return;
|
|
493
829
|
}
|
|
@@ -552,12 +888,12 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
552
888
|
};
|
|
553
889
|
// Handle preset message
|
|
554
890
|
const handlePresetMessage = (message) => {
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
const
|
|
891
|
+
if (message.autoSend) {
|
|
892
|
+
// For preset messages, we need to add the user message first since sendMessage won't add it on retries
|
|
893
|
+
const userMessage = {
|
|
558
894
|
id: Date.now().toString(),
|
|
559
|
-
content:
|
|
560
|
-
role: '
|
|
895
|
+
content: message.text,
|
|
896
|
+
role: 'user',
|
|
561
897
|
timestamp: new Date().toISOString(),
|
|
562
898
|
metadata: {
|
|
563
899
|
model: getCurrentModel().value,
|
|
@@ -565,22 +901,9 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
565
901
|
issuedBy: hitAddress || ''
|
|
566
902
|
}
|
|
567
903
|
};
|
|
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);
|
|
904
|
+
setMessages(prev => [...prev, userMessage]);
|
|
905
|
+
// Pass a flag to indicate this is a preset message so sendMessage won't add user message again
|
|
906
|
+
sendMessage(message.text, 0, true);
|
|
584
907
|
}
|
|
585
908
|
else {
|
|
586
909
|
setInputValue(message.text);
|
|
@@ -625,6 +948,41 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
625
948
|
setAit(aitInfo);
|
|
626
949
|
setPermissions(permissions);
|
|
627
950
|
};
|
|
951
|
+
// Auto enable AIT permissions
|
|
952
|
+
const autoEnableAIT = async (toolName) => {
|
|
953
|
+
if (!signer || !hitAddress) {
|
|
954
|
+
showError('Please connect your wallet first');
|
|
955
|
+
return false;
|
|
956
|
+
}
|
|
957
|
+
try {
|
|
958
|
+
// Get available permissions to find the tool
|
|
959
|
+
const availablePermissionLabels = availablePermissions.map(p => p.label);
|
|
960
|
+
if (!availablePermissionLabels.includes(toolName)) {
|
|
961
|
+
showError(`Tool ${toolName} is not available for your current identity provider`);
|
|
962
|
+
return false;
|
|
963
|
+
}
|
|
964
|
+
// Add the required permission to current permissions
|
|
965
|
+
const newPermissions = [...permissions];
|
|
966
|
+
if (!newPermissions.includes(toolName)) {
|
|
967
|
+
newPermissions.push(toolName);
|
|
968
|
+
}
|
|
969
|
+
// Generate and register AIT with new permissions
|
|
970
|
+
await generateAndRegisterAIT(newPermissions);
|
|
971
|
+
showSuccess('AIT permissions enabled successfully! You can now use the AI agent.');
|
|
972
|
+
await refreshAIT(true);
|
|
973
|
+
return true;
|
|
974
|
+
}
|
|
975
|
+
catch (error) {
|
|
976
|
+
console.error('Failed to auto-enable AIT:', error);
|
|
977
|
+
if (error instanceof Error) {
|
|
978
|
+
showError(error.message);
|
|
979
|
+
}
|
|
980
|
+
else {
|
|
981
|
+
showError('Failed to enable AIT permissions. Please try again.');
|
|
982
|
+
}
|
|
983
|
+
return false;
|
|
984
|
+
}
|
|
985
|
+
};
|
|
628
986
|
// Save permissions
|
|
629
987
|
const savePermissions = async (newPermissions) => {
|
|
630
988
|
setIsDisabled(true);
|
|
@@ -811,6 +1169,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
811
1169
|
isDisabled,
|
|
812
1170
|
walletInfo,
|
|
813
1171
|
isWalletLoading,
|
|
1172
|
+
isAutoConnecting,
|
|
814
1173
|
notification,
|
|
815
1174
|
// AI Model related state
|
|
816
1175
|
availableModels,
|
|
@@ -835,6 +1194,7 @@ availableModels = DEFAULT_AI_MODELS, defaultModelIndex = 0, showModelSelector =
|
|
|
835
1194
|
handleSubmit,
|
|
836
1195
|
handlePresetMessage,
|
|
837
1196
|
savePermissions,
|
|
1197
|
+
autoEnableAIT,
|
|
838
1198
|
handleVerifyWalletClick,
|
|
839
1199
|
showSuccess,
|
|
840
1200
|
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',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionForm.d.ts","sourceRoot":"","sources":["../../../src/components/ui/PermissionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,
|
|
1
|
+
{"version":3,"file":"PermissionForm.d.ts","sourceRoot":"","sources":["../../../src/components/ui/PermissionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,UAAU,mBAAmB;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkgBxD,CAAC"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useChatBot } from '../context/ChatBotContext';
|
|
4
4
|
export const PermissionForm = ({ onClose, onOpen }) => {
|
|
5
|
-
const { hitAddress, permissions, setPermissions, setIsDisabled, onSave, onConnectWallet, onSignIn, isNeedSignInWithWallet, walletInfo, onVerifyWallet, serviceId, nxtlinqApi, permissionGroup, isAITLoading, isWalletLoading = false } = useChatBot();
|
|
5
|
+
const { hitAddress, permissions, setPermissions, setIsDisabled, onSave, onConnectWallet, onSignIn, isNeedSignInWithWallet, walletInfo, onVerifyWallet, serviceId, nxtlinqApi, permissionGroup, isAITLoading, isWalletLoading = false, refreshAIT } = useChatBot();
|
|
6
6
|
const [availablePermissions, setAvailablePermissions] = React.useState([]);
|
|
7
7
|
const [isSaving, setIsSaving] = React.useState(false);
|
|
8
8
|
const [tempPermissions, setTempPermissions] = React.useState(permissions);
|
|
@@ -31,6 +31,22 @@ export const PermissionForm = ({ onClose, onOpen }) => {
|
|
|
31
31
|
React.useEffect(() => {
|
|
32
32
|
fetchAvailablePermissions();
|
|
33
33
|
}, [serviceId, nxtlinqApi, permissionGroup]);
|
|
34
|
+
// Refresh wallet info when component mounts or when hitAddress changes
|
|
35
|
+
React.useEffect(() => {
|
|
36
|
+
if (hitAddress) {
|
|
37
|
+
// Trigger a refresh of AIT and wallet info when the form opens
|
|
38
|
+
const refreshWalletInfo = async () => {
|
|
39
|
+
try {
|
|
40
|
+
// This will trigger refreshAIT which includes wallet info fetch
|
|
41
|
+
await refreshAIT();
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
console.error('Failed to refresh wallet info:', error);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
refreshWalletInfo();
|
|
48
|
+
}
|
|
49
|
+
}, [hitAddress]);
|
|
34
50
|
const isWalletVerified = Boolean(walletInfo?.id);
|
|
35
51
|
const handleSave = async () => {
|
|
36
52
|
setIsSaving(true);
|
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