@lastbrain/ai-ui-react 1.0.69 → 1.0.70
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/AiChipLabel.d.ts.map +1 -1
- package/dist/components/AiChipLabel.js +3 -1
- package/dist/components/AiContextButton.d.ts +5 -1
- package/dist/components/AiContextButton.d.ts.map +1 -1
- package/dist/components/AiContextButton.js +10 -4
- package/dist/components/AiPromptPanel.js +12 -6
- package/dist/components/AiStatusButton.d.ts.map +1 -1
- package/dist/components/AiStatusButton.js +18 -13
- package/dist/components/AiTextarea.d.ts.map +1 -1
- package/dist/components/LBApiKeySelector.d.ts.map +1 -1
- package/dist/components/LBConnectButton.d.ts.map +1 -1
- package/dist/components/LBConnectButton.js +1 -1
- package/dist/components/LBSigninModal.d.ts.map +1 -1
- package/dist/components/LBSigninModal.js +1 -1
- package/dist/context/LBAuthProvider.d.ts +35 -3
- package/dist/context/LBAuthProvider.d.ts.map +1 -1
- package/dist/context/LBAuthProvider.js +2 -0
- package/dist/examples/AiUiPremiumShowcase.d.ts.map +1 -1
- package/dist/hooks/useAiModels.d.ts.map +1 -1
- package/dist/hooks/useModelManagement.d.ts.map +1 -1
- package/dist/utils/errorHandler.d.ts +2 -2
- package/dist/utils/errorHandler.d.ts.map +1 -1
- package/dist/utils/errorHandler.js +8 -1
- package/dist/utils/modelManagement.d.ts +13 -10
- package/dist/utils/modelManagement.d.ts.map +1 -1
- package/dist/utils/modelManagement.js +19 -2
- package/package.json +1 -1
- package/src/components/AiChipLabel.tsx +5 -1
- package/src/components/AiContextButton.tsx +44 -23
- package/src/components/AiPromptPanel.tsx +19 -15
- package/src/components/AiStatusButton.tsx +24 -19
- package/src/components/AiTextarea.tsx +3 -1
- package/src/components/LBApiKeySelector.tsx +13 -3
- package/src/components/LBConnectButton.tsx +3 -12
- package/src/components/LBSigninModal.tsx +20 -10
- package/src/context/LBAuthProvider.tsx +45 -6
- package/src/examples/AiUiPremiumShowcase.tsx +4 -1
- package/src/hooks/useAiModels.ts +2 -1
- package/src/hooks/useModelManagement.ts +2 -1
- package/src/utils/errorHandler.ts +16 -3
- package/src/utils/modelManagement.ts +53 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiChipLabel.d.ts","sourceRoot":"","sources":["../../src/components/AiChipLabel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAS/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAmB,EACnB,IAAW,EACX,MAAe,EACf,SAAS,EACT,KAAK,EAAE,WAAW,GACnB,EAAE,gBAAgB,2CAiBlB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,QAAQ,EACR,WAAoE,EACpE,OAAO,EACP,QAAQ,EACR,eAAuB,EACvB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,IAAW,EACX,MAAe,GAChB,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"AiChipLabel.d.ts","sourceRoot":"","sources":["../../src/components/AiChipLabel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAS/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,OAAmB,EACnB,IAAW,EACX,MAAe,EACf,SAAS,EACT,KAAK,EAAE,WAAW,GACnB,EAAE,gBAAgB,2CAiBlB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAU,EACV,QAAQ,EACR,WAAoE,EACpE,OAAO,EACP,QAAQ,EACR,eAAuB,EACvB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,IAAW,EACX,MAAe,GAChB,EAAE,gBAAgB,2CAqMlB"}
|
|
@@ -131,7 +131,9 @@ Exemple de réponse attendue: javascript, react, frontend, api, development`;
|
|
|
131
131
|
else {
|
|
132
132
|
setShowSigninModal(true);
|
|
133
133
|
}
|
|
134
|
-
}, className: `ai-control-action ai-spark ${sizeClass} ${radiusClass}`, "aria-label": isAuthenticated
|
|
134
|
+
}, className: `ai-control-action ai-spark ${sizeClass} ${radiusClass}`, "aria-label": isAuthenticated
|
|
135
|
+
? "Générer des tags avec l'IA"
|
|
136
|
+
: "Connexion requise", title: isAuthenticated
|
|
135
137
|
? "Générer des tags avec l'IA"
|
|
136
138
|
: "Se connecter pour utiliser l'IA", children: isAuthenticated ? _jsx(Sparkles, { size: 16 }) : _jsx(Lock, { size: 16 }) })] }) }), value.length > 0 && (_jsx("div", { className: "ai-chip-input", children: value.map((chip, index) => (_jsxs("div", { className: `ai-chip ai-chip--with-close ${sizeClass} ${radiusClass}`, children: [_jsx("span", { children: chip }), _jsx("button", { onClick: () => removeChip(index), className: "ai-chip-remover", title: "Supprimer", children: _jsx(X, { size: 14 }) })] }, index))) })), _jsx(AiPromptPanel, { isOpen: showPromptPanel, onClose: () => setShowPromptPanel(false), onSubmit: handlePromptSubmit, models: models || undefined, baseUrl: baseUrl, sourceText: context ? `Contexte: ${context}` : undefined, enableModelManagement: true, showOnlyUserModels: true }), _jsx(LBSigninModal, { isOpen: showSigninModal, onClose: () => setShowSigninModal(false) })] }));
|
|
137
139
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { type ButtonHTMLAttributes } from "react";
|
|
2
2
|
import type { BaseAiProps } from "../types";
|
|
3
3
|
import type { AiRadius, AiSize, AiVariant } from "../types";
|
|
4
|
+
type ContextData = string | number | boolean | object | unknown[] | {
|
|
5
|
+
[key: string]: unknown;
|
|
6
|
+
};
|
|
4
7
|
export interface AiContextButtonProps extends Omit<BaseAiProps, "onValue" | "type">, Omit<ButtonHTMLAttributes<HTMLButtonElement>, "baseUrl" | "apiKeyId"> {
|
|
5
|
-
contextData:
|
|
8
|
+
contextData: ContextData;
|
|
6
9
|
contextDescription?: string;
|
|
7
10
|
onResult?: (result: string, metadata?: {
|
|
8
11
|
requestId: string;
|
|
@@ -19,4 +22,5 @@ export interface AiContextButtonProps extends Omit<BaseAiProps, "onValue" | "typ
|
|
|
19
22
|
variant?: AiVariant;
|
|
20
23
|
}
|
|
21
24
|
export declare function AiContextButton({ baseUrl: propBaseUrl, apiKeyId: propApiKeyId, uiMode, contextData, contextDescription, onResult, onToast, disabled, className, children, resultModalTitle, size, radius, variant, context: _context, ...buttonProps }: AiContextButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export {};
|
|
22
26
|
//# sourceMappingURL=AiContextButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiContextButton.d.ts","sourceRoot":"","sources":["../../src/components/AiContextButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AiContextButton.d.ts","sourceRoot":"","sources":["../../src/components/AiContextButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAW5D,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAE/F,MAAM,WAAW,oBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACvE,WAAW,EAAE,WAAW,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,KAC7C,IAAI,CAAC;IACV,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,WAAW,EACX,kBAAyC,EACzC,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,gBAA0C,EAC1C,IAAW,EACX,MAAe,EACf,OAAmB,EACnB,OAAO,EAAE,QAAQ,EACjB,GAAG,WAAW,EACf,EAAE,oBAAoB,2CA+QtB"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { useState } from "react";
|
|
4
|
-
import { Download, FileText, Loader2, Lock, Sparkles, X
|
|
4
|
+
import { Download, FileText, Loader2, Lock, Sparkles, X } from "lucide-react";
|
|
5
5
|
import { useAiCallText } from "../hooks/useAiCallText";
|
|
6
6
|
import { AiPromptPanel } from "./AiPromptPanel";
|
|
7
7
|
import { useUsageToast } from "./UsageToast";
|
|
@@ -107,10 +107,14 @@ export function AiContextButton({ baseUrl: propBaseUrl, apiKeyId: propApiKeyId,
|
|
|
107
107
|
if (!analysisResult) {
|
|
108
108
|
return;
|
|
109
109
|
}
|
|
110
|
-
const currentDate = new Date()
|
|
110
|
+
const currentDate = new Date()
|
|
111
|
+
.toLocaleDateString("fr-FR")
|
|
112
|
+
.replace(/\//g, "-");
|
|
111
113
|
const defaultName = `analyse-${currentDate}.txt`;
|
|
112
114
|
const fileName = prompt("Nom du fichier :", defaultName) || defaultName;
|
|
113
|
-
const content = `ANALYSE DES DONNÉES - ${new Date().toLocaleString("fr-FR")}\n\nPROMPT UTILISÉ :\n${analysisResult.prompt}\n\nRÉSULTAT DE L'ANALYSE :\n${analysisResult.content}\n\n--- MÉTADONNÉES ---\nTokens utilisés: ${analysisResult.tokens.toLocaleString()}\nCoût: $${(apiKeyId?.includes("dev")
|
|
115
|
+
const content = `ANALYSE DES DONNÉES - ${new Date().toLocaleString("fr-FR")}\n\nPROMPT UTILISÉ :\n${analysisResult.prompt}\n\nRÉSULTAT DE L'ANALYSE :\n${analysisResult.content}\n\n--- MÉTADONNÉES ---\nTokens utilisés: ${analysisResult.tokens.toLocaleString()}\nCoût: $${(apiKeyId?.includes("dev")
|
|
116
|
+
? 0
|
|
117
|
+
: analysisResult.cost).toFixed(6)}\nID de requête: ${analysisResult.requestId || "N/A"}`;
|
|
114
118
|
const blob = new Blob([content], { type: "text/plain;charset=utf-8" });
|
|
115
119
|
const url = URL.createObjectURL(blob);
|
|
116
120
|
const anchor = document.createElement("a");
|
|
@@ -132,5 +136,7 @@ export function AiContextButton({ baseUrl: propBaseUrl, apiKeyId: propApiKeyId,
|
|
|
132
136
|
}, children: _jsxs("div", { className: "ai-popover ai-result-modal", onClick: (e) => e.stopPropagation(), children: [_jsxs("div", { className: "ai-result-header", children: [_jsxs("div", { className: "ai-row", children: [_jsx(FileText, { size: 18 }), _jsx("h2", { className: "ai-result-title", children: resultModalTitle })] }), _jsxs("div", { className: "ai-row", children: [_jsxs("button", { type: "button", className: `ai-btn ai-btn--ghost ai-btn--compact ${sizeClass} ${radiusClass}`, onClick: saveToFile, children: [_jsx(Download, { size: 14 }), "Sauvegarder"] }), _jsx("button", { type: "button", className: "ai-icon-btn", onClick: () => {
|
|
133
137
|
setIsResultOpen(false);
|
|
134
138
|
setAnalysisResult(null);
|
|
135
|
-
}, "aria-label": "Fermer", children: _jsx(X, { size: 16 }) })] })] }), _jsxs("div", { className: "ai-result-body", children: [_jsxs("div", { className: "ai-result-block", children: [_jsx("h3", { className: "ai-result-subtitle", children: "Prompt utilis\u00E9" }), _jsx("pre", { className: "ai-result-code", children: analysisResult.prompt })] }), _jsxs("div", { className: "ai-result-block", children: [_jsx("h3", { className: "ai-result-subtitle", children: "R\u00E9sultat" }), _jsx("div", { className: "ai-result-content", children: analysisResult.content })] }), _jsxs("div", { className: "ai-result-meta ai-between", children: [_jsxs("span", { children: ["Co\u00FBt: $", (apiKeyId?.includes("dev")
|
|
139
|
+
}, "aria-label": "Fermer", children: _jsx(X, { size: 16 }) })] })] }), _jsxs("div", { className: "ai-result-body", children: [_jsxs("div", { className: "ai-result-block", children: [_jsx("h3", { className: "ai-result-subtitle", children: "Prompt utilis\u00E9" }), _jsx("pre", { className: "ai-result-code", children: analysisResult.prompt })] }), _jsxs("div", { className: "ai-result-block", children: [_jsx("h3", { className: "ai-result-subtitle", children: "R\u00E9sultat" }), _jsx("div", { className: "ai-result-content", children: analysisResult.content })] }), _jsxs("div", { className: "ai-result-meta ai-between", children: [_jsxs("span", { children: ["Co\u00FBt: $", (apiKeyId?.includes("dev")
|
|
140
|
+
? 0
|
|
141
|
+
: analysisResult.cost).toFixed(6)] }), _jsxs("span", { children: ["ID: ", analysisResult.requestId?.slice(-8) || "N/A"] })] })] })] }) })) : null, _jsx(LBSigninModal, { isOpen: showAuthModal, onClose: () => setShowAuthModal(false) }), _jsx(ErrorToast, { error: errorData, onComplete: clearError }, errorKey)] }));
|
|
136
142
|
}
|
|
@@ -464,11 +464,14 @@ function AiPromptPanelInternal({ isOpen, onClose, onSubmit, uiMode: _uiMode = "m
|
|
|
464
464
|
cursor: "pointer",
|
|
465
465
|
transition: "all 0.2s",
|
|
466
466
|
}, onMouseEnter: (e) => {
|
|
467
|
-
e.currentTarget.style.background =
|
|
468
|
-
|
|
467
|
+
e.currentTarget.style.background =
|
|
468
|
+
"color-mix(in srgb, var(--ai-primary) 10%, transparent)";
|
|
469
|
+
e.currentTarget.style.borderColor =
|
|
470
|
+
"var(--ai-primary)";
|
|
469
471
|
}, onMouseLeave: (e) => {
|
|
470
472
|
e.currentTarget.style.background = "transparent";
|
|
471
|
-
e.currentTarget.style.borderColor =
|
|
473
|
+
e.currentTarget.style.borderColor =
|
|
474
|
+
"var(--ai-border)";
|
|
472
475
|
}, children: [_jsxs("div", { style: {
|
|
473
476
|
display: "flex",
|
|
474
477
|
alignItems: "center",
|
|
@@ -506,11 +509,14 @@ function AiPromptPanelInternal({ isOpen, onClose, onSubmit, uiMode: _uiMode = "m
|
|
|
506
509
|
cursor: "pointer",
|
|
507
510
|
transition: "all 0.2s",
|
|
508
511
|
}, onMouseEnter: (e) => {
|
|
509
|
-
e.currentTarget.style.background =
|
|
510
|
-
|
|
512
|
+
e.currentTarget.style.background =
|
|
513
|
+
"color-mix(in srgb, var(--ai-primary) 10%, transparent)";
|
|
514
|
+
e.currentTarget.style.borderColor =
|
|
515
|
+
"var(--ai-primary)";
|
|
511
516
|
}, onMouseLeave: (e) => {
|
|
512
517
|
e.currentTarget.style.background = "transparent";
|
|
513
|
-
e.currentTarget.style.borderColor =
|
|
518
|
+
e.currentTarget.style.borderColor =
|
|
519
|
+
"var(--ai-border)";
|
|
514
520
|
}, children: [_jsx("div", { style: {
|
|
515
521
|
fontWeight: 600,
|
|
516
522
|
marginBottom: "4px",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiStatusButton.d.ts","sourceRoot":"","sources":["../../src/components/AiStatusButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"AiStatusButton.d.ts","sourceRoot":"","sources":["../../src/components/AiStatusButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAU,MAAM,uBAAuB,CAAC;AAkB9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAmHD,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,OAAe,EACf,SAAc,EACd,IAAW,EACX,MAAe,GAChB,EAAE,mBAAmB,2CA4erB"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { useLayoutEffect, useMemo, useRef, useState, useContext } from "react";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
5
|
import { ArrowRightLeft, BarChart3, FileText, Folder, History, Loader2, LogOut, Settings, Shield, } from "lucide-react";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
6
|
+
import { LBContext } from "../context/LBAuthProvider";
|
|
7
|
+
import { AiContext } from "../context/AiProvider";
|
|
8
8
|
import { LBApiKeySelector } from "./LBApiKeySelector";
|
|
9
9
|
import { LBSigninModal } from "./LBSigninModal";
|
|
10
10
|
const QUICK_LINKS = [
|
|
@@ -64,7 +64,7 @@ function UsageCircle({ percentage }) {
|
|
|
64
64
|
}
|
|
65
65
|
export function AiStatusButton({ status, loading = false, className = "", size = "md", radius = "full", }) {
|
|
66
66
|
let lbStatus;
|
|
67
|
-
let user;
|
|
67
|
+
let user = null;
|
|
68
68
|
let logout;
|
|
69
69
|
let apiKeys = [];
|
|
70
70
|
let switchApiKey;
|
|
@@ -76,10 +76,10 @@ export function AiStatusButton({ status, loading = false, className = "", size =
|
|
|
76
76
|
let lbSelectedKey = null;
|
|
77
77
|
let lbRefreshBasicStatus;
|
|
78
78
|
let lbRefreshStorageStatus;
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
const lbContext = useContext(LBContext);
|
|
80
|
+
if (lbContext) {
|
|
81
81
|
lbStatus = lbContext.status;
|
|
82
|
-
user = lbContext.user;
|
|
82
|
+
user = lbContext.user ?? null;
|
|
83
83
|
logout = lbContext.logout;
|
|
84
84
|
apiKeys = lbContext.apiKeys || [];
|
|
85
85
|
switchApiKey = lbContext.switchApiKey;
|
|
@@ -92,14 +92,15 @@ export function AiStatusButton({ status, loading = false, className = "", size =
|
|
|
92
92
|
lbRefreshBasicStatus = lbContext.refreshBasicStatus;
|
|
93
93
|
lbRefreshStorageStatus = lbContext.refreshStorageStatus;
|
|
94
94
|
}
|
|
95
|
-
|
|
95
|
+
else {
|
|
96
96
|
lbStatus = undefined;
|
|
97
97
|
}
|
|
98
|
+
const aiContext = useContext(AiContext);
|
|
98
99
|
let refetchProviders;
|
|
99
|
-
|
|
100
|
-
refetchProviders =
|
|
100
|
+
if (aiContext) {
|
|
101
|
+
refetchProviders = aiContext.refetchProviders;
|
|
101
102
|
}
|
|
102
|
-
|
|
103
|
+
else {
|
|
103
104
|
refetchProviders = undefined;
|
|
104
105
|
}
|
|
105
106
|
const [showSigninModal, setShowSigninModal] = useState(false);
|
|
@@ -120,7 +121,7 @@ export function AiStatusButton({ status, loading = false, className = "", size =
|
|
|
120
121
|
effectiveStatus?.api_key?.id ||
|
|
121
122
|
lbSelectedKey?.id);
|
|
122
123
|
const requiresApiKeySelection = lbStatus === "ready" && !hasApiKeySelected && apiKeys.length > 0;
|
|
123
|
-
const isApiKeyAuthMode = effectiveStatus
|
|
124
|
+
const isApiKeyAuthMode = effectiveStatus && 'authType' in effectiveStatus && effectiveStatus.authType === "api_key";
|
|
124
125
|
const [tooltipStyle, setTooltipStyle] = useState({});
|
|
125
126
|
useLayoutEffect(() => {
|
|
126
127
|
if (!showTooltip || !buttonRef.current || !canPortal) {
|
|
@@ -259,7 +260,11 @@ export function AiStatusButton({ status, loading = false, className = "", size =
|
|
|
259
260
|
effectiveStatus?.api_key?.rate_limit_rpm ||
|
|
260
261
|
0, " ", "req/min"] }))] }), _jsxs("div", { className: "ai-popover-row", children: [_jsx("span", { className: "ai-popover-label", children: "Auth" }), _jsx("span", { className: "ai-popover-value", children: lbIsLoadingStatus
|
|
261
262
|
? "..."
|
|
262
|
-
: effectiveStatus
|
|
263
|
+
: (effectiveStatus &&
|
|
264
|
+
"authType" in effectiveStatus &&
|
|
265
|
+
effectiveStatus.authType) ||
|
|
266
|
+
lbStatus ||
|
|
267
|
+
"unknown" })] })] }), _jsxs("div", { className: "ai-popover-section", children: [_jsx("div", { className: "ai-popover-header text-xs mb-2", children: "Wallet" }), _jsxs("div", { className: "ai-popover-row", children: [_jsx("span", { className: "ai-popover-label", children: "Total" }), lbIsLoadingStatus && !effectiveStatus?.balance ? (_jsxs("div", { className: "ai-row", children: [_jsx("div", { className: "ai-kv-skeleton w-[120px]" }), _jsx("div", { className: "ai-kv-skeleton w-7 h-7 rounded-full" })] })) : (_jsxs("div", { className: "ai-row", children: [_jsxs("span", { className: "ai-popover-value", children: ["$", fixed(balanceUsed, 2), " / $", fixed(balanceTotal, 2)] }), _jsx(UsageCircle, { percentage: balancePct })] }))] })] }), _jsxs("div", { className: "ai-popover-section", children: [_jsx("div", { className: "ai-popover-header text-xs mb-2", children: "Storage" }), _jsxs("div", { className: "ai-popover-row", children: [_jsx("span", { className: "ai-popover-label", children: "Total" }), lbIsLoadingStorage ? (_jsxs("div", { className: "ai-row", children: [_jsx("div", { className: "ai-kv-skeleton w-[120px]" }), _jsx("div", { className: "ai-kv-skeleton w-7 h-7 rounded-full" })] })) : (_jsxs("div", { className: "ai-row", children: [_jsxs("span", { className: "ai-popover-value", children: [formatStorage(storageUsed), " /", " ", formatStorage(storageTotal)] }), _jsx(UsageCircle, { percentage: storagePct })] }))] })] }), _jsxs("div", { className: "ai-status-actions", children: [QUICK_LINKS.map((item) => {
|
|
263
268
|
const Icon = item.icon;
|
|
264
269
|
return (_jsx("button", { type: "button", className: "ai-status-action-btn", onClick: () => window.open(item.href, "_blank"), title: item.title, children: _jsx(Icon, { size: 17 }) }, item.href));
|
|
265
270
|
}), logout && !isApiKeyAuthMode ? (_jsx("button", { type: "button", className: "ai-status-action-btn ai-status-action-btn--danger", onClick: async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiTextarea.d.ts","sourceRoot":"","sources":["../../src/components/AiTextarea.tsx"],"names":[],"mappings":"AAEA,OAAc,EAIZ,KAAK,sBAAsB,EAC5B,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAU9D,MAAM,WAAW,eACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAC9D,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,IAAW,EACX,MAAa,EACb,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,aAAa,EACjB,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"AiTextarea.d.ts","sourceRoot":"","sources":["../../src/components/AiTextarea.tsx"],"names":[],"mappings":"AAEA,OAAc,EAIZ,KAAK,sBAAsB,EAC5B,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAU9D,MAAM,WAAW,eACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,sBAAsB,CAAC,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAC9D,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,QAAQ,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,YAAY,EACtB,MAAgB,EAChB,IAAW,EACX,MAAa,EACb,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,aAAa,EACjB,EAAE,eAAe,2CA+NjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LBApiKeySelector.d.ts","sourceRoot":"","sources":["../../src/components/LBApiKeySelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,UAAU,qBAAqB;IAC7B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,qBAAqB,
|
|
1
|
+
{"version":3,"file":"LBApiKeySelector.d.ts","sourceRoot":"","sources":["../../src/components/LBApiKeySelector.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,UAAU,qBAAqB;IAC7B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,MAAM,GACP,EAAE,qBAAqB,kDAsIvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LBConnectButton.d.ts","sourceRoot":"","sources":["../../src/components/LBConnectButton.tsx"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAsB,EACtB,SAAc,EACd,WAAW,EACX,WAAW,GACZ,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"LBConnectButton.d.ts","sourceRoot":"","sources":["../../src/components/LBConnectButton.tsx"],"names":[],"mappings":"AAOA,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAsB,EACtB,SAAc,EACd,WAAW,EACX,WAAW,GACZ,EAAE,oBAAoB,2CAoDtB;AAED;;;GAGG;AACH,UAAU,gBAAgB;IACxB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACrC;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,gBAAgB,2CAExD"}
|
|
@@ -25,5 +25,5 @@ export function LBConnectButton({ label = "Se connecter", className = "", onConn
|
|
|
25
25
|
return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", onClick: handleClick, className: className || "ai-btn ai-btn--auth", disabled: status === "loading", children: status === "loading" ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { size: 16, className: "animate-spin" }), "Chargement..."] })) : status === "ready" && user ? (_jsxs(_Fragment, { children: [_jsx(LogOut, { size: 16 }), buttonLabel] })) : (_jsxs(_Fragment, { children: [_jsx(LogIn, { size: 16 }), buttonLabel] })) }), _jsx(LBSigninModal, { isOpen: showModal, onClose: () => setShowModal(false) })] }));
|
|
26
26
|
}
|
|
27
27
|
export function LBAuthModal({ onClose }) {
|
|
28
|
-
return
|
|
28
|
+
return _jsx(LBSigninModal, { isOpen: true, onClose: () => onClose(false) });
|
|
29
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LBSigninModal.d.ts","sourceRoot":"","sources":["../../src/components/LBSigninModal.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"LBSigninModal.d.ts","sourceRoot":"","sources":["../../src/components/LBSigninModal.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,kBAAkB,sCAqOpE"}
|
|
@@ -14,7 +14,7 @@ export function LBSigninModal({ isOpen, onClose }) {
|
|
|
14
14
|
const [error, setError] = useState("");
|
|
15
15
|
const [showKeySelector, setShowKeySelector] = useState(false);
|
|
16
16
|
const [currentApiKeys, setCurrentApiKeys] = useState([]);
|
|
17
|
-
const { login, selectApiKeyWithToken, fetchApiKeys
|
|
17
|
+
const { login, selectApiKeyWithToken, fetchApiKeys } = lbContext || {};
|
|
18
18
|
const canRender = Boolean(isOpen && lbContext && login);
|
|
19
19
|
const panelTitle = useMemo(() => "Connexion LastBrain", []);
|
|
20
20
|
useEffect(() => {
|
|
@@ -4,6 +4,36 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { type ReactNode } from "react";
|
|
6
6
|
import type { LBAuthState, LBApiKey, AiStatus } from "@lastbrain/ai-ui-core";
|
|
7
|
+
export interface ApiKeyUser {
|
|
8
|
+
id?: string;
|
|
9
|
+
name?: string;
|
|
10
|
+
prefix?: string;
|
|
11
|
+
env?: string;
|
|
12
|
+
rate_limit_rpm?: number;
|
|
13
|
+
scopes?: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface BasicStatus {
|
|
16
|
+
authType?: string;
|
|
17
|
+
user?: {
|
|
18
|
+
id?: string;
|
|
19
|
+
email?: string;
|
|
20
|
+
} | null;
|
|
21
|
+
apiKey?: ApiKeyUser | null;
|
|
22
|
+
api_key?: ApiKeyUser | null;
|
|
23
|
+
balance?: {
|
|
24
|
+
used?: number;
|
|
25
|
+
total?: number;
|
|
26
|
+
percentage?: number;
|
|
27
|
+
};
|
|
28
|
+
storage?: StorageStatus["storage"];
|
|
29
|
+
}
|
|
30
|
+
export interface StorageStatus {
|
|
31
|
+
storage?: {
|
|
32
|
+
used_mb?: number;
|
|
33
|
+
allocated_mb?: number;
|
|
34
|
+
percentage?: number;
|
|
35
|
+
} | null;
|
|
36
|
+
}
|
|
7
37
|
interface LBProviderProps {
|
|
8
38
|
children: ReactNode;
|
|
9
39
|
/** URL de l'API LastBrain (ex: https://api.lastbrain.io) */
|
|
@@ -42,9 +72,9 @@ interface LBContextValue extends LBAuthState {
|
|
|
42
72
|
/** Status API (balance, storage, API key info) */
|
|
43
73
|
apiStatus: AiStatus | null;
|
|
44
74
|
/** Status basique (rapide) - balance, API key info sans storage */
|
|
45
|
-
basicStatus:
|
|
75
|
+
basicStatus: BasicStatus | null;
|
|
46
76
|
/** Status storage (lent) avec cache */
|
|
47
|
-
storageStatus:
|
|
77
|
+
storageStatus: StorageStatus | null;
|
|
48
78
|
/** Fonction pour rafraîchir le status rapide */
|
|
49
79
|
refreshBasicStatus: () => Promise<void>;
|
|
50
80
|
/** Fonction pour rafraîchir le storage (avec cache optionnel) */
|
|
@@ -56,10 +86,12 @@ interface LBContextValue extends LBAuthState {
|
|
|
56
86
|
/** Indique si le storage est en cours de chargement */
|
|
57
87
|
isLoadingStorage: boolean;
|
|
58
88
|
}
|
|
89
|
+
declare const LBContext: import("react").Context<LBContextValue | undefined>;
|
|
90
|
+
export { LBContext };
|
|
59
91
|
export declare function LBProvider({ children, baseUrl: _baseUrl, proxyUrl, onStatusChange, onAuthChange, }: LBProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
60
92
|
/**
|
|
61
93
|
* Hook pour accéder au contexte LastBrain
|
|
62
94
|
*/
|
|
63
95
|
export declare function useLB(): LBContextValue;
|
|
64
|
-
export {};
|
|
96
|
+
export type { LBApiKey };
|
|
65
97
|
//# sourceMappingURL=LBAuthProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAIR,QAAQ,EACT,MAAM,uBAAuB,CAAC;AAG/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;
|
|
1
|
+
{"version":3,"file":"LBAuthProvider.d.ts","sourceRoot":"","sources":["../../src/context/LBAuthProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,8 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
7
7
|
import { createContext, useContext, useEffect, useCallback, useMemo, useState, } from "react";
|
|
8
8
|
import { createLBClient } from "@lastbrain/ai-ui-core";
|
|
9
9
|
const LBContext = createContext(undefined);
|
|
10
|
+
// Export pour usage dans d'autres composants
|
|
11
|
+
export { LBContext };
|
|
10
12
|
export function LBProvider({ children, baseUrl: _baseUrl = "/api/lastbrain", proxyUrl = "/api/lastbrain", onStatusChange, onAuthChange, }) {
|
|
11
13
|
const [state, setState] = useState({
|
|
12
14
|
status: "loading",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiUiPremiumShowcase.d.ts","sourceRoot":"","sources":["../../src/examples/AiUiPremiumShowcase.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AiUiPremiumShowcase.d.ts","sourceRoot":"","sources":["../../src/examples/AiUiPremiumShowcase.tsx"],"names":[],"mappings":"AAsFA,wBAAgB,mBAAmB,4CAOlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAiModels.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiModels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,kBAAkB,CAAC;CAC1E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,
|
|
1
|
+
{"version":3,"file":"useAiModels.d.ts","sourceRoot":"","sources":["../../src/hooks/useAiModels.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,kBAAkB,CAAC;CAC1E;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,iBAAiB,CA6F3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IAEvC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,eAAe,EAAE,MAAM,OAAO,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,OAAO,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,
|
|
1
|
+
{"version":3,"file":"useModelManagement.d.ts","sourceRoot":"","sources":["../../src/hooks/useModelManagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACnE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;CACjD;AAED,MAAM,WAAW,wBAAwB;IAEvC,eAAe,EAAE,OAAO,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAGrB,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,aAAa,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,eAAe,EAAE,MAAM,OAAO,EAAE,CAAC;IACjC,iBAAiB,EAAE,MAAM,OAAO,EAAE,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,yBAA8B,GACtC,wBAAwB,CAgI1B"}
|
|
@@ -6,7 +6,7 @@ export interface ParsedError {
|
|
|
6
6
|
/**
|
|
7
7
|
* Parse et uniformise la gestion des erreurs des composants AI
|
|
8
8
|
*/
|
|
9
|
-
export declare function parseAIError(error:
|
|
9
|
+
export declare function parseAIError(error: unknown): ParsedError;
|
|
10
10
|
/**
|
|
11
11
|
* Interface pour la callback de gestion d'erreur uniforme
|
|
12
12
|
*/
|
|
@@ -23,7 +23,7 @@ export interface ErrorToastCallback {
|
|
|
23
23
|
* @param onToast Callback externe optionnelle fournie par le parent
|
|
24
24
|
* @param showInternalToast Callback interne optionnelle pour afficher un toast dans le composant
|
|
25
25
|
*/
|
|
26
|
-
export declare function handleAIError(error:
|
|
26
|
+
export declare function handleAIError(error: unknown, onToast?: ErrorToastCallback, showInternalToast?: (error: {
|
|
27
27
|
message: string;
|
|
28
28
|
code?: string;
|
|
29
29
|
}) => void): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/utils/errorHandler.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;CACzB;AAeD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CA8CxD;AAyFD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAClE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,kBAAkB,EAC5B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,GACtE,IAAI,CAuBN"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { ErrorCode } from "@lastbrain/ai-ui-core";
|
|
3
|
+
function isNormalizedErrorLike(value) {
|
|
4
|
+
if (!value || typeof value !== "object") {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const v = value;
|
|
8
|
+
return typeof v.code === "string" && typeof v.message === "string";
|
|
9
|
+
}
|
|
3
10
|
/**
|
|
4
11
|
* Parse et uniformise la gestion des erreurs des composants AI
|
|
5
12
|
*/
|
|
6
13
|
export function parseAIError(error) {
|
|
7
14
|
// Si l'erreur est déjà un objet normalisé
|
|
8
|
-
if (error
|
|
15
|
+
if (isNormalizedErrorLike(error)) {
|
|
9
16
|
return {
|
|
10
17
|
message: getUserFriendlyMessage(error.code, error.message),
|
|
11
18
|
code: error.code,
|
|
@@ -5,25 +5,28 @@ export interface ModelToggleOptions {
|
|
|
5
5
|
apiKey?: string;
|
|
6
6
|
baseUrl?: string;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
*/
|
|
11
|
-
export declare function toggleUserModel(modelId: string, isActive: boolean, options?: ModelToggleOptions): Promise<void>;
|
|
12
|
-
/**
|
|
13
|
-
* Récupère tous les modèles disponibles avec API key ou via proxy
|
|
14
|
-
*/
|
|
15
|
-
export declare function getAvailableModels(options?: ModelToggleOptions): Promise<Array<{
|
|
8
|
+
type ModelCategory = "text" | "image" | "audio" | "video";
|
|
9
|
+
interface ModelInfo {
|
|
16
10
|
id: string;
|
|
17
11
|
name: string;
|
|
18
12
|
description?: string;
|
|
19
13
|
provider: string;
|
|
20
|
-
category:
|
|
14
|
+
category: ModelCategory;
|
|
21
15
|
isActive?: boolean;
|
|
22
16
|
isPro?: boolean;
|
|
23
17
|
costPer1M?: number;
|
|
24
|
-
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Active ou désactive un modèle pour l'utilisateur courant
|
|
21
|
+
*/
|
|
22
|
+
export declare function toggleUserModel(modelId: string, isActive: boolean, options?: ModelToggleOptions): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Récupère tous les modèles disponibles avec API key ou via proxy
|
|
25
|
+
*/
|
|
26
|
+
export declare function getAvailableModels(options?: ModelToggleOptions): Promise<ModelInfo[]>;
|
|
25
27
|
/**
|
|
26
28
|
* Récupère les modèles activés par l'utilisateur avec API key
|
|
27
29
|
*/
|
|
28
30
|
export declare function getUserModels(options?: ModelToggleOptions): Promise<string[]>;
|
|
31
|
+
export {};
|
|
29
32
|
//# sourceMappingURL=modelManagement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modelManagement.d.ts","sourceRoot":"","sources":["../../src/utils/modelManagement.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"modelManagement.d.ts","sourceRoot":"","sources":["../../src/utils/modelManagement.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD,KAAK,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8BD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAqCf;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,SAAS,EAAE,CAAC,CA0DtB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,EAAE,CAAC,CAkDnB"}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utilitaires pour la gestion des modèles IA
|
|
3
3
|
*/
|
|
4
|
+
function isModelCategory(value) {
|
|
5
|
+
return (value === "text" ||
|
|
6
|
+
value === "image" ||
|
|
7
|
+
value === "audio" ||
|
|
8
|
+
value === "video");
|
|
9
|
+
}
|
|
10
|
+
function isModelInfo(value) {
|
|
11
|
+
if (!value || typeof value !== "object")
|
|
12
|
+
return false;
|
|
13
|
+
const v = value;
|
|
14
|
+
return (typeof v.id === "string" &&
|
|
15
|
+
typeof v.name === "string" &&
|
|
16
|
+
typeof v.provider === "string" &&
|
|
17
|
+
isModelCategory(v.category));
|
|
18
|
+
}
|
|
4
19
|
function isAuthTokenCandidate(value) {
|
|
5
20
|
if (!value)
|
|
6
21
|
return false;
|
|
@@ -76,10 +91,12 @@ export async function getAvailableModels(options = {}) {
|
|
|
76
91
|
}
|
|
77
92
|
const data = await response.json();
|
|
78
93
|
if (Array.isArray(data?.models)) {
|
|
79
|
-
return data.models;
|
|
94
|
+
return data.models.filter(isModelInfo);
|
|
80
95
|
}
|
|
81
96
|
if (Array.isArray(data?.providers)) {
|
|
82
|
-
return data.providers
|
|
97
|
+
return (data.providers?.flatMap((provider) => Array.isArray(provider.models)
|
|
98
|
+
? provider.models.filter(isModelInfo)
|
|
99
|
+
: []) || []);
|
|
83
100
|
}
|
|
84
101
|
return [];
|
|
85
102
|
}
|
package/package.json
CHANGED
|
@@ -218,7 +218,11 @@ Exemple de réponse attendue: javascript, react, frontend, api, development`;
|
|
|
218
218
|
}
|
|
219
219
|
}}
|
|
220
220
|
className={`ai-control-action ai-spark ${sizeClass} ${radiusClass}`}
|
|
221
|
-
aria-label={
|
|
221
|
+
aria-label={
|
|
222
|
+
isAuthenticated
|
|
223
|
+
? "Générer des tags avec l'IA"
|
|
224
|
+
: "Connexion requise"
|
|
225
|
+
}
|
|
222
226
|
title={
|
|
223
227
|
isAuthenticated
|
|
224
228
|
? "Générer des tags avec l'IA"
|