@lastbrain/ai-ui-react 1.0.58 → 1.0.60

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.
@@ -1 +1 @@
1
- {"version":3,"file":"AiStatusButton.d.ts","sourceRoot":"","sources":["../../src/components/AiStatusButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAmBtD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,OAAe,EACf,SAAc,GACf,EAAE,mBAAmB,2CA8kCrB"}
1
+ {"version":3,"file":"AiStatusButton.d.ts","sourceRoot":"","sources":["../../src/components/AiStatusButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAmBtD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,OAAe,EACf,SAAc,GACf,EAAE,mBAAmB,2CAolCrB"}
@@ -48,7 +48,7 @@ export function AiStatusButton({ status, loading = false, className = "", }) {
48
48
  const effectiveStatus = status || {
49
49
  ...lbApiStatus,
50
50
  ...lbBasicStatus,
51
- storage: lbStorageStatus?.storage
51
+ storage: lbStorageStatus?.storage,
52
52
  };
53
53
  // Récupérer refetchProviders depuis AiProvider si disponible
54
54
  let refetchProviders;
@@ -434,7 +434,11 @@ export function AiStatusButton({ status, loading = false, className = "", }) {
434
434
  effectiveStatus.api_key?.env ||
435
435
  "N/A" })] }), _jsxs("div", { style: aiStyles.tooltipRow, children: [_jsx("span", { style: aiStyles.tooltipLabel, children: "Rate Limit:" }), _jsxs("span", { style: aiStyles.tooltipValue, children: [effectiveStatus.apiKey?.rate_limit_rpm ||
436
436
  effectiveStatus.api_key?.rate_limit_rpm ||
437
- 0, " ", "req/min"] })] })] }), _jsxs("div", { style: aiStyles.tooltipSection, children: [_jsx("div", { style: aiStyles.tooltipSubtitle, children: "Wallet" }), _jsxs("div", { style: aiStyles.tooltipRow, children: [_jsx("span", { style: aiStyles.tooltipLabel, children: "Total:" }), _jsxs("span", { style: aiStyles.tooltipValue, children: ["$", formatFixed(balanceUsed, 6), " / $", formatNumber(balanceTotal)] }), renderUsageCircle(balancePercentage)] })] }), _jsxs("div", { style: aiStyles.tooltipSection, children: [_jsx("div", { style: aiStyles.tooltipSubtitle, children: "Storage" }), _jsxs("div", { style: aiStyles.tooltipRow, children: [_jsx("span", { style: aiStyles.tooltipLabel, children: "Total:" }), lbIsLoadingStorage ? (_jsxs("div", { style: { display: "flex", alignItems: "center", gap: "8px" }, children: [_jsx("div", { style: {
437
+ 0, " ", "req/min"] })] })] }), _jsxs("div", { style: aiStyles.tooltipSection, children: [_jsx("div", { style: aiStyles.tooltipSubtitle, children: "Wallet" }), _jsxs("div", { style: aiStyles.tooltipRow, children: [_jsx("span", { style: aiStyles.tooltipLabel, children: "Total:" }), _jsxs("span", { style: aiStyles.tooltipValue, children: ["$", formatFixed(balanceUsed, 6), " / $", formatNumber(balanceTotal)] }), renderUsageCircle(balancePercentage)] })] }), _jsxs("div", { style: aiStyles.tooltipSection, children: [_jsx("div", { style: aiStyles.tooltipSubtitle, children: "Storage" }), _jsxs("div", { style: aiStyles.tooltipRow, children: [_jsx("span", { style: aiStyles.tooltipLabel, children: "Total:" }), lbIsLoadingStorage ? (_jsxs("div", { style: {
438
+ display: "flex",
439
+ alignItems: "center",
440
+ gap: "8px",
441
+ }, children: [_jsx("div", { style: {
438
442
  height: "16px",
439
443
  width: "120px",
440
444
  background: "rgba(139, 92, 246, 0.1)",
@@ -1 +1 @@
1
- {"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAIR,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAE/B,UAAU,eAAe;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACzD,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,UAAU,cAAe,SAAQ,WAAW;IAC1C,4BAA4B;IAC5B,KAAK,EAAE,CACL,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,6CAA6C;IAC7C,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,gEAAgE;IAChE,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,mDAAmD;IACnD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,iEAAiE;IACjE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,oCAAoC;IACpC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,2BAA2B;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,mEAAmE;IACnE,WAAW,EAAE,GAAG,CAAC;IACjB,uCAAuC;IACvC,aAAa,EAAE,GAAG,CAAC;IACnB,gDAAgD;IAChD,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,iEAAiE;IACjE,oBAAoB,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,kEAAkE;IAClE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAID,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,EAAE,QAA2B,EACpC,QAA2B,EAC3B,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CA+hBjB;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,cAAc,CAMtC"}
1
+ {"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAIR,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAE/B,UAAU,eAAe;IACvB,QAAQ,EAAE,SAAS,CAAC;IACpB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACzD,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,UAAU,cAAe,SAAQ,WAAW;IAC1C,4BAA4B;IAC5B,KAAK,EAAE,CACL,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC;QACX,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,8BAA8B;IAC9B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,6CAA6C;IAC7C,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3D,gEAAgE;IAChE,YAAY,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,mDAAmD;IACnD,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,iEAAiE;IACjE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,oCAAoC;IACpC,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,2BAA2B;IAC3B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,SAAS,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,mEAAmE;IACnE,WAAW,EAAE,GAAG,CAAC;IACjB,uCAAuC;IACvC,aAAa,EAAE,GAAG,CAAC;IACnB,gDAAgD;IAChD,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,iEAAiE;IACjE,oBAAoB,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,kEAAkE;IAClE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,8DAA8D;IAC9D,eAAe,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAID,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,OAAO,EAAE,QAA2B,EACpC,QAA2B,EAC3B,cAAc,EACd,YAAY,GACb,EAAE,eAAe,2CAikBjB;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,cAAc,CAMtC"}
@@ -307,32 +307,48 @@ export function LBProvider({ children, baseUrl: _baseUrl = "/api/lastbrain", pro
307
307
  // Cache de 5 minutes sauf si force=true
308
308
  const now = Date.now();
309
309
  const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
310
- if (!force && storageLastFetch && (now - storageLastFetch) < CACHE_DURATION) {
310
+ if (!force &&
311
+ storageLastFetch &&
312
+ now - storageLastFetch < CACHE_DURATION) {
311
313
  console.log("[LBProvider] Storage cache still valid, skipping fetch");
312
314
  return;
313
315
  }
314
316
  setIsLoadingStorage(true);
315
317
  try {
316
- const response = await fetch(`${proxyUrl}/auth/status/storage`, {
318
+ // Essayer l'endpoint spécialisé storage d'abord
319
+ let response = await fetch(`${proxyUrl}/auth/status/storage`, {
317
320
  credentials: "include",
318
321
  });
322
+ // Si 404, faire un fallback vers l'endpoint normal (backward compatibility)
323
+ if (!response.ok && response.status === 404) {
324
+ console.log("[LBProvider] Storage endpoint not available, using fallback");
325
+ response = await fetch(`${proxyUrl}/auth/status`, {
326
+ credentials: "include",
327
+ });
328
+ }
319
329
  if (response.ok) {
320
330
  const data = await response.json();
321
- setStorageStatus(data);
331
+ // Si c'est la réponse complète (fallback), extraire juste le storage
332
+ const storageData = data.storage ? { storage: data.storage } : data;
333
+ setStorageStatus(storageData);
322
334
  setStorageLastFetch(now);
323
335
  // Combiner avec le basic status
324
336
  const combinedStatus = {
325
337
  ...basicStatus,
326
- storage: data.storage,
338
+ storage: storageData.storage,
327
339
  };
328
340
  setApiStatus(combinedStatus);
329
341
  }
330
342
  else {
331
343
  console.warn("[LBProvider] Failed to fetch storage status:", response.status);
344
+ // Arrêter les tentatives répétées si échec persistant
345
+ setStorageLastFetch(now); // Marquer comme essayé pour éviter la boucle
332
346
  }
333
347
  }
334
348
  catch (error) {
335
349
  console.error("[LBProvider] Failed to fetch storage status:", error);
350
+ // Arrêter les tentatives répétées si erreur persistante
351
+ setStorageLastFetch(now); // Marquer comme essayé pour éviter la boucle
336
352
  }
337
353
  finally {
338
354
  setIsLoadingStorage(false);
@@ -375,7 +391,14 @@ export function LBProvider({ children, baseUrl: _baseUrl = "/api/lastbrain", pro
375
391
  else {
376
392
  throw new Error("No valid authentication method available");
377
393
  }
378
- }, [state.status, proxyUrl, accessToken, selectApiKey, refreshBasicStatus, refreshStorageStatus]);
394
+ }, [
395
+ state.status,
396
+ proxyUrl,
397
+ accessToken,
398
+ selectApiKey,
399
+ refreshBasicStatus,
400
+ refreshStorageStatus,
401
+ ]);
379
402
  /**
380
403
  * Déconnexion
381
404
  */
@@ -446,7 +469,7 @@ export function LBProvider({ children, baseUrl: _baseUrl = "/api/lastbrain", pro
446
469
  setStorageStatus(null);
447
470
  setApiKeys([]);
448
471
  }
449
- }, [state.status, refreshBasicStatus, refreshStorageStatus, fetchApiKeysWithSession]);
472
+ }, [state.status]); // Supprimer les fonctions des dépendances pour éviter la boucle
450
473
  const value = {
451
474
  ...state,
452
475
  login,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/ai-ui-react",
3
- "version": "1.0.58",
3
+ "version": "1.0.60",
4
4
  "description": "Headless React components for LastBrain AI UI Kit",
5
5
  "private": false,
6
6
  "type": "module",
@@ -70,7 +70,7 @@ export function AiStatusButton({
70
70
  const effectiveStatus = status || {
71
71
  ...lbApiStatus,
72
72
  ...lbBasicStatus,
73
- storage: lbStorageStatus?.storage
73
+ storage: lbStorageStatus?.storage,
74
74
  };
75
75
 
76
76
  // Récupérer refetchProviders depuis AiProvider si disponible
@@ -846,7 +846,13 @@ export function AiStatusButton({
846
846
  <div style={aiStyles.tooltipRow}>
847
847
  <span style={aiStyles.tooltipLabel}>Total:</span>
848
848
  {lbIsLoadingStorage ? (
849
- <div style={{ display: "flex", alignItems: "center", gap: "8px" }}>
849
+ <div
850
+ style={{
851
+ display: "flex",
852
+ alignItems: "center",
853
+ gap: "8px",
854
+ }}
855
+ >
850
856
  <div
851
857
  style={{
852
858
  height: "16px",
@@ -425,7 +425,7 @@ export function LBProvider({
425
425
  if (response.ok) {
426
426
  const data = await response.json();
427
427
  setBasicStatus(data);
428
-
428
+
429
429
  // Combiner avec le storage existant si disponible
430
430
  const combinedStatus = {
431
431
  ...data,
@@ -446,46 +446,73 @@ export function LBProvider({
446
446
  /**
447
447
  * Récupère le storage - LENT avec cache (5 minutes)
448
448
  */
449
- const refreshStorageStatus = useCallback(async (force = false): Promise<void> => {
450
- if (state.status !== "ready") {
451
- setStorageStatus(null);
452
- return;
453
- }
449
+ const refreshStorageStatus = useCallback(
450
+ async (force = false): Promise<void> => {
451
+ if (state.status !== "ready") {
452
+ setStorageStatus(null);
453
+ return;
454
+ }
454
455
 
455
- // Cache de 5 minutes sauf si force=true
456
- const now = Date.now();
457
- const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
458
- if (!force && storageLastFetch && (now - storageLastFetch) < CACHE_DURATION) {
459
- console.log("[LBProvider] Storage cache still valid, skipping fetch");
460
- return;
461
- }
456
+ // Cache de 5 minutes sauf si force=true
457
+ const now = Date.now();
458
+ const CACHE_DURATION = 5 * 60 * 1000; // 5 minutes
459
+ if (
460
+ !force &&
461
+ storageLastFetch &&
462
+ now - storageLastFetch < CACHE_DURATION
463
+ ) {
464
+ console.log("[LBProvider] Storage cache still valid, skipping fetch");
465
+ return;
466
+ }
462
467
 
463
- setIsLoadingStorage(true);
464
- try {
465
- const response = await fetch(`${proxyUrl}/auth/status/storage`, {
466
- credentials: "include",
467
- });
468
+ setIsLoadingStorage(true);
469
+ try {
470
+ // Essayer l'endpoint spécialisé storage d'abord
471
+ let response = await fetch(`${proxyUrl}/auth/status/storage`, {
472
+ credentials: "include",
473
+ });
468
474
 
469
- if (response.ok) {
470
- const data = await response.json();
471
- setStorageStatus(data);
472
- setStorageLastFetch(now);
473
-
474
- // Combiner avec le basic status
475
- const combinedStatus = {
476
- ...basicStatus,
477
- storage: data.storage,
478
- };
479
- setApiStatus(combinedStatus);
480
- } else {
481
- console.warn("[LBProvider] Failed to fetch storage status:", response.status);
475
+ // Si 404, faire un fallback vers l'endpoint normal (backward compatibility)
476
+ if (!response.ok && response.status === 404) {
477
+ console.log("[LBProvider] Storage endpoint not available, using fallback");
478
+ response = await fetch(`${proxyUrl}/auth/status`, {
479
+ credentials: "include",
480
+ });
481
+ }
482
+
483
+ if (response.ok) {
484
+ const data = await response.json();
485
+
486
+ // Si c'est la réponse complète (fallback), extraire juste le storage
487
+ const storageData = data.storage ? { storage: data.storage } : data;
488
+
489
+ setStorageStatus(storageData);
490
+ setStorageLastFetch(now);
491
+
492
+ // Combiner avec le basic status
493
+ const combinedStatus = {
494
+ ...basicStatus,
495
+ storage: storageData.storage,
496
+ };
497
+ setApiStatus(combinedStatus);
498
+ } else {
499
+ console.warn(
500
+ "[LBProvider] Failed to fetch storage status:",
501
+ response.status
502
+ );
503
+ // Arrêter les tentatives répétées si échec persistant
504
+ setStorageLastFetch(now); // Marquer comme essayé pour éviter la boucle
505
+ }
506
+ } catch (error) {
507
+ console.error("[LBProvider] Failed to fetch storage status:", error);
508
+ // Arrêter les tentatives répétées si erreur persistante
509
+ setStorageLastFetch(now); // Marquer comme essayé pour éviter la boucle
510
+ } finally {
511
+ setIsLoadingStorage(false);
482
512
  }
483
- } catch (error) {
484
- console.error("[LBProvider] Failed to fetch storage status:", error);
485
- } finally {
486
- setIsLoadingStorage(false);
487
- }
488
- }, [proxyUrl, state.status, basicStatus, storageLastFetch]);
513
+ },
514
+ [proxyUrl, state.status, basicStatus, storageLastFetch]
515
+ );
489
516
 
490
517
  /**
491
518
  * Sélectionne une clé API avec le token déjà stocké (après login)
@@ -533,7 +560,14 @@ export function LBProvider({
533
560
  throw new Error("No valid authentication method available");
534
561
  }
535
562
  },
536
- [state.status, proxyUrl, accessToken, selectApiKey, refreshBasicStatus, refreshStorageStatus]
563
+ [
564
+ state.status,
565
+ proxyUrl,
566
+ accessToken,
567
+ selectApiKey,
568
+ refreshBasicStatus,
569
+ refreshStorageStatus,
570
+ ]
537
571
  );
538
572
 
539
573
  /**
@@ -606,7 +640,7 @@ export function LBProvider({
606
640
  setStorageStatus(null);
607
641
  setApiKeys([]);
608
642
  }
609
- }, [state.status, refreshBasicStatus, refreshStorageStatus, fetchApiKeysWithSession]);
643
+ }, [state.status]); // Supprimer les fonctions des dépendances pour éviter la boucle
610
644
 
611
645
  const value: LBContextValue = {
612
646
  ...state,