@lastbrain/module-ai 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +481 -0
- package/package.json +3 -3
package/README.md
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
# @lastbrain/module-ai
|
|
2
|
+
|
|
3
|
+
Module de génération IA complet pour LastBrain avec OpenAI. Fournit des pages web, des API routes et un système de gestion de tokens pour la génération de texte et d'images.
|
|
4
|
+
|
|
5
|
+
## 🎯 Vue d'ensemble
|
|
6
|
+
|
|
7
|
+
Ce module inclut tout ce dont vous avez besoin pour l'IA :
|
|
8
|
+
|
|
9
|
+
- 🤖 **Génération de texte** - Utilise GPT-4o pour la génération de contenu
|
|
10
|
+
- 🎨 **Génération d'images** - Intégration DALL-E pour créer des images
|
|
11
|
+
- 💳 **Gestion de tokens** - Système de crédits et suivi de consommation
|
|
12
|
+
- 📊 **Dashboard admin** - Gestion des tokens utilisateurs par les admins
|
|
13
|
+
- 🛡️ **Sécurité** - Protection RLS et contrôle d'accès
|
|
14
|
+
|
|
15
|
+
## 🚀 Démarrage rapide
|
|
16
|
+
|
|
17
|
+
> **Recommandé :** Utilisez le CLI LastBrain pour créer une application complète avec le module AI
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Créer une nouvelle application avec le module AI inclus
|
|
21
|
+
pnpx @lastbrain/app@latest init mon-app
|
|
22
|
+
# Sélectionner "🤖 AI Generation" lors de la création
|
|
23
|
+
|
|
24
|
+
cd mon-app
|
|
25
|
+
pnpm db:init # Applique automatiquement les migrations
|
|
26
|
+
pnpm dev
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 📦 Installation manuelle
|
|
30
|
+
|
|
31
|
+
Si vous intégrez LastBrain dans un projet existant :
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpm add @lastbrain/module-ai @lastbrain/core @lastbrain/ui
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Puis ajoutez le module à votre projet LastBrain :
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
pnpm lastbrain add-module ai
|
|
41
|
+
pnpm build:modules
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## ⚙️ Configuration
|
|
45
|
+
|
|
46
|
+
### Variables d'environnement
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# .env.local
|
|
50
|
+
OPENAI_API_KEY=sk-your-openai-api-key-here
|
|
51
|
+
|
|
52
|
+
# Supabase (requis)
|
|
53
|
+
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
|
|
54
|
+
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
|
|
55
|
+
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Configuration OpenAI
|
|
59
|
+
|
|
60
|
+
Le module utilise les modèles OpenAI suivants par défaut :
|
|
61
|
+
|
|
62
|
+
- **Texte** : `gpt-4o` (ou `gpt-4o-mini` pour les tâches simples)
|
|
63
|
+
- **Images** : `dall-e-3` (ou `dall-e-2` pour des coûts réduits)
|
|
64
|
+
|
|
65
|
+
## 🖼️ Pages Web fournies
|
|
66
|
+
|
|
67
|
+
### Pages Utilisateur Authentifié
|
|
68
|
+
|
|
69
|
+
#### 1. Gestion des Tokens (`/auth/ai/token`)
|
|
70
|
+
|
|
71
|
+
**Component**: `TokenPage`
|
|
72
|
+
|
|
73
|
+
Page de gestion des tokens utilisateur :
|
|
74
|
+
|
|
75
|
+
- Solde actuel de tokens
|
|
76
|
+
- Historique des transactions
|
|
77
|
+
- Bouton pour acheter des tokens (placeholder)
|
|
78
|
+
- Statistiques d'utilisation
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
import { TokenPage } from "@lastbrain/module-ai";
|
|
82
|
+
|
|
83
|
+
export default function UserTokens() {
|
|
84
|
+
return <TokenPage />;
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Pages Administration
|
|
89
|
+
|
|
90
|
+
#### 2. Administration des Tokens (`/admin/ai/user-token`)
|
|
91
|
+
|
|
92
|
+
**Component**: `AdminUserTokenPage`
|
|
93
|
+
|
|
94
|
+
Page d'administration pour gérer les tokens de tous les utilisateurs :
|
|
95
|
+
|
|
96
|
+
- Liste de tous les utilisateurs avec leurs soldes
|
|
97
|
+
- Recherche par email ou nom
|
|
98
|
+
- Ajout/retrait de tokens pour un utilisateur
|
|
99
|
+
- Pagination et tri
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
import { AdminUserTokenPage } from "@lastbrain/module-ai";
|
|
103
|
+
|
|
104
|
+
export default function AdminTokens() {
|
|
105
|
+
return <AdminUserTokenPage />;
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### 3. Détail Utilisateur (`/admin/ai/user-token/[id]`)
|
|
110
|
+
|
|
111
|
+
**Component**: `AdminUserTokenDetailPage`
|
|
112
|
+
|
|
113
|
+
Page détaillée pour un utilisateur spécifique :
|
|
114
|
+
|
|
115
|
+
- Historique complet des transactions
|
|
116
|
+
- Ajout/retrait de tokens avec commentaire
|
|
117
|
+
- Statistiques d'utilisation détaillées
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
import { AdminUserTokenDetailPage } from "@lastbrain/module-ai";
|
|
121
|
+
|
|
122
|
+
export default function AdminUserDetail() {
|
|
123
|
+
return <AdminUserTokenDetailPage />;
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## 🔌 Routes API
|
|
128
|
+
|
|
129
|
+
### API Génération IA (`/api/ai/*`)
|
|
130
|
+
|
|
131
|
+
#### POST `/api/ai/generate-text`
|
|
132
|
+
|
|
133
|
+
Génère du texte avec GPT.
|
|
134
|
+
|
|
135
|
+
**Body** :
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"prompt": "Écris un article sur l'IA",
|
|
140
|
+
"model": "gpt-4o", // optionnel, défaut: gpt-4o
|
|
141
|
+
"max_tokens": 1000, // optionnel, défaut: 500
|
|
142
|
+
"temperature": 0.7, // optionnel, défaut: 0.7
|
|
143
|
+
"cost_tokens": 100 // coût en tokens pour cette génération
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**Réponse** :
|
|
148
|
+
|
|
149
|
+
```json
|
|
150
|
+
{
|
|
151
|
+
"data": {
|
|
152
|
+
"text": "L'intelligence artificielle...",
|
|
153
|
+
"tokens_used": 95,
|
|
154
|
+
"model": "gpt-4o",
|
|
155
|
+
"cost_tokens": 100,
|
|
156
|
+
"remaining_tokens": 900
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
#### POST `/api/ai/generate-image`
|
|
162
|
+
|
|
163
|
+
Génère une image avec DALL-E.
|
|
164
|
+
|
|
165
|
+
**Body** :
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"prompt": "Un chat en costume d'astronaute",
|
|
170
|
+
"model": "dall-e-3", // optionnel, défaut: dall-e-3
|
|
171
|
+
"size": "1024x1024", // optionnel, défaut: 1024x1024
|
|
172
|
+
"quality": "hd", // optionnel, défaut: standard
|
|
173
|
+
"cost_tokens": 200 // coût en tokens pour cette génération
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Réponse** :
|
|
178
|
+
|
|
179
|
+
```json
|
|
180
|
+
{
|
|
181
|
+
"data": {
|
|
182
|
+
"image_url": "https://...",
|
|
183
|
+
"revised_prompt": "A cat wearing an astronaut suit...",
|
|
184
|
+
"model": "dall-e-3",
|
|
185
|
+
"cost_tokens": 200,
|
|
186
|
+
"remaining_tokens": 800
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### API Administration (`/api/ai/admin/*`)
|
|
192
|
+
|
|
193
|
+
⚠️ **Toutes les routes admin nécessitent un accès super admin.**
|
|
194
|
+
|
|
195
|
+
#### GET `/api/ai/admin/user-token`
|
|
196
|
+
|
|
197
|
+
Liste tous les utilisateurs avec leurs soldes de tokens.
|
|
198
|
+
|
|
199
|
+
**Query Parameters** :
|
|
200
|
+
|
|
201
|
+
- `page` (optionnel, défaut: 1)
|
|
202
|
+
- `per_page` (optionnel, défaut: 20)
|
|
203
|
+
- `search` (optionnel) : Recherche par email ou nom
|
|
204
|
+
|
|
205
|
+
**Réponse** :
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"data": [
|
|
210
|
+
{
|
|
211
|
+
"user_id": "uuid",
|
|
212
|
+
"email": "user@example.com",
|
|
213
|
+
"full_name": "John Doe",
|
|
214
|
+
"balance": 1500,
|
|
215
|
+
"total_spent": 500,
|
|
216
|
+
"last_transaction": "2024-01-01T00:00:00Z"
|
|
217
|
+
}
|
|
218
|
+
],
|
|
219
|
+
"pagination": {
|
|
220
|
+
"page": 1,
|
|
221
|
+
"per_page": 20,
|
|
222
|
+
"total": 100,
|
|
223
|
+
"total_pages": 5
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
#### POST `/api/ai/admin/user-token`
|
|
229
|
+
|
|
230
|
+
Ajoute ou retire des tokens pour un utilisateur.
|
|
231
|
+
|
|
232
|
+
**Body** :
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"user_id": "uuid",
|
|
237
|
+
"amount": 1000, // positif pour ajouter, négatif pour retirer
|
|
238
|
+
"description": "Achat de tokens premium",
|
|
239
|
+
"transaction_type": "purchase" // purchase, admin_grant, admin_debit, etc.
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
#### GET `/api/ai/admin/user-token/[id]`
|
|
244
|
+
|
|
245
|
+
Détails et historique pour un utilisateur spécifique.
|
|
246
|
+
|
|
247
|
+
**Réponse** :
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"data": {
|
|
252
|
+
"user": {
|
|
253
|
+
"id": "uuid",
|
|
254
|
+
"email": "user@example.com",
|
|
255
|
+
"full_name": "John Doe",
|
|
256
|
+
"balance": 1500
|
|
257
|
+
},
|
|
258
|
+
"transactions": [
|
|
259
|
+
{
|
|
260
|
+
"id": "uuid",
|
|
261
|
+
"amount": 1000,
|
|
262
|
+
"description": "Achat de tokens",
|
|
263
|
+
"transaction_type": "purchase",
|
|
264
|
+
"created_at": "2024-01-01T00:00:00Z"
|
|
265
|
+
}
|
|
266
|
+
],
|
|
267
|
+
"stats": {
|
|
268
|
+
"total_spent": 500,
|
|
269
|
+
"total_generated_texts": 25,
|
|
270
|
+
"total_generated_images": 10
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## 🗄️ Schéma de Base de Données
|
|
277
|
+
|
|
278
|
+
### Table `user_token_ledger`
|
|
279
|
+
|
|
280
|
+
Stocke les transactions de tokens des utilisateurs.
|
|
281
|
+
|
|
282
|
+
```sql
|
|
283
|
+
CREATE TABLE public.user_token_ledger (
|
|
284
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
285
|
+
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
286
|
+
amount INTEGER NOT NULL,
|
|
287
|
+
balance_after INTEGER NOT NULL,
|
|
288
|
+
description TEXT,
|
|
289
|
+
transaction_type TEXT NOT NULL DEFAULT 'usage',
|
|
290
|
+
metadata JSONB DEFAULT '{}'::jsonb,
|
|
291
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
292
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
293
|
+
);
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Types de transactions** :
|
|
297
|
+
|
|
298
|
+
- `purchase` : Achat de tokens
|
|
299
|
+
- `usage` : Utilisation pour génération IA
|
|
300
|
+
- `admin_grant` : Attribution par un admin
|
|
301
|
+
- `admin_debit` : Retrait par un admin
|
|
302
|
+
- `refund` : Remboursement
|
|
303
|
+
|
|
304
|
+
### Table `user_prompts`
|
|
305
|
+
|
|
306
|
+
Stocke l'historique des prompts et générations.
|
|
307
|
+
|
|
308
|
+
```sql
|
|
309
|
+
CREATE TABLE public.user_prompts (
|
|
310
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
311
|
+
owner_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
312
|
+
prompt TEXT NOT NULL,
|
|
313
|
+
response TEXT,
|
|
314
|
+
model TEXT NOT NULL,
|
|
315
|
+
tokens_used INTEGER,
|
|
316
|
+
cost_tokens INTEGER,
|
|
317
|
+
generation_type TEXT NOT NULL, -- 'text' ou 'image'
|
|
318
|
+
metadata JSONB DEFAULT '{}'::jsonb,
|
|
319
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
320
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
321
|
+
);
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Vues et Fonctions
|
|
325
|
+
|
|
326
|
+
#### Vue `user_token_balance_v`
|
|
327
|
+
|
|
328
|
+
Calcule automatiquement le solde actuel de chaque utilisateur :
|
|
329
|
+
|
|
330
|
+
```sql
|
|
331
|
+
CREATE VIEW user_token_balance_v AS
|
|
332
|
+
SELECT
|
|
333
|
+
owner_id,
|
|
334
|
+
COALESCE(SUM(amount), 0) as balance,
|
|
335
|
+
COUNT(*) as total_transactions,
|
|
336
|
+
MAX(created_at) as last_transaction
|
|
337
|
+
FROM user_token_ledger
|
|
338
|
+
GROUP BY owner_id;
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
## 🔧 Utilisation dans le Code
|
|
342
|
+
|
|
343
|
+
### Hooks React
|
|
344
|
+
|
|
345
|
+
```tsx
|
|
346
|
+
import { useTokenBalance, useAIGeneration } from "@lastbrain/module-ai";
|
|
347
|
+
|
|
348
|
+
function MyAIComponent() {
|
|
349
|
+
const { balance, loading, refetch } = useTokenBalance();
|
|
350
|
+
const { generateText, generating } = useAIGeneration();
|
|
351
|
+
|
|
352
|
+
const handleGenerate = async () => {
|
|
353
|
+
const result = await generateText({
|
|
354
|
+
prompt: "Écris un poème sur l'automne",
|
|
355
|
+
max_tokens: 200,
|
|
356
|
+
cost_tokens: 50,
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
if (result.success) {
|
|
360
|
+
console.log("Texte généré:", result.data.text);
|
|
361
|
+
refetch(); // Rafraîchir le solde
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
return (
|
|
366
|
+
<div>
|
|
367
|
+
<p>Solde: {balance} tokens</p>
|
|
368
|
+
<Button onPress={handleGenerate} isLoading={generating}>
|
|
369
|
+
Générer du texte
|
|
370
|
+
</Button>
|
|
371
|
+
</div>
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Utilisation directe des APIs
|
|
377
|
+
|
|
378
|
+
```typescript
|
|
379
|
+
// Génération de texte
|
|
380
|
+
const response = await fetch("/api/ai/generate-text", {
|
|
381
|
+
method: "POST",
|
|
382
|
+
headers: { "Content-Type": "application/json" },
|
|
383
|
+
body: JSON.stringify({
|
|
384
|
+
prompt: "Explique l'intelligence artificielle",
|
|
385
|
+
max_tokens: 500,
|
|
386
|
+
cost_tokens: 100,
|
|
387
|
+
}),
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
const result = await response.json();
|
|
391
|
+
console.log(result.data.text);
|
|
392
|
+
|
|
393
|
+
// Génération d'image
|
|
394
|
+
const imageResponse = await fetch("/api/ai/generate-image", {
|
|
395
|
+
method: "POST",
|
|
396
|
+
headers: { "Content-Type": "application/json" },
|
|
397
|
+
body: JSON.stringify({
|
|
398
|
+
prompt: "Un paysage futuriste",
|
|
399
|
+
size: "1024x1024",
|
|
400
|
+
cost_tokens: 200,
|
|
401
|
+
}),
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
const imageResult = await imageResponse.json();
|
|
405
|
+
console.log(imageResult.data.image_url);
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## 💳 Système de Tokens
|
|
409
|
+
|
|
410
|
+
### Coûts par défaut
|
|
411
|
+
|
|
412
|
+
Les coûts en tokens sont configurables mais voici les valeurs par défaut :
|
|
413
|
+
|
|
414
|
+
**Génération de texte** :
|
|
415
|
+
|
|
416
|
+
- GPT-4o : 1 token = ~10 tokens OpenAI
|
|
417
|
+
- GPT-4o-mini : 1 token = ~5 tokens OpenAI
|
|
418
|
+
|
|
419
|
+
**Génération d'images** :
|
|
420
|
+
|
|
421
|
+
- DALL-E 3 (1024x1024) : 200 tokens
|
|
422
|
+
- DALL-E 2 (1024x1024) : 100 tokens
|
|
423
|
+
|
|
424
|
+
### Gestion du solde
|
|
425
|
+
|
|
426
|
+
```typescript
|
|
427
|
+
// Vérifier le solde avant génération
|
|
428
|
+
const checkBalance = async (requiredTokens: number) => {
|
|
429
|
+
const response = await fetch("/api/ai/user/balance");
|
|
430
|
+
const { balance } = await response.json();
|
|
431
|
+
|
|
432
|
+
if (balance < requiredTokens) {
|
|
433
|
+
throw new Error("Solde insuffisant");
|
|
434
|
+
}
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
// Débiter automatiquement lors de la génération
|
|
438
|
+
await generateText({
|
|
439
|
+
prompt: "...",
|
|
440
|
+
cost_tokens: 100, // Sera automatiquement débité
|
|
441
|
+
});
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
## 🛡️ Sécurité et Limitations
|
|
445
|
+
|
|
446
|
+
### Protection contre l'abus
|
|
447
|
+
|
|
448
|
+
- **Rate limiting** : Les APIs ont des limites de débit
|
|
449
|
+
- **Validation des prompts** : Filtrage du contenu inapproprié
|
|
450
|
+
- **Vérification du solde** : Impossible de générer sans tokens suffisants
|
|
451
|
+
|
|
452
|
+
### Row Level Security (RLS)
|
|
453
|
+
|
|
454
|
+
- Les utilisateurs ne voient que leurs propres transactions et prompts
|
|
455
|
+
- Les admins ont accès à toutes les données via les routes `/admin/*`
|
|
456
|
+
|
|
457
|
+
### Exemple de politique RLS
|
|
458
|
+
|
|
459
|
+
```sql
|
|
460
|
+
-- Les utilisateurs ne voient que leurs propres transactions
|
|
461
|
+
CREATE POLICY "user_token_ledger_owner_select" ON public.user_token_ledger
|
|
462
|
+
FOR SELECT USING (auth.uid() = owner_id);
|
|
463
|
+
|
|
464
|
+
-- Seuls les admins peuvent modifier via les APIs admin
|
|
465
|
+
CREATE POLICY "user_token_ledger_admin_all" ON public.user_token_ledger
|
|
466
|
+
FOR ALL USING (public.is_superadmin(auth.uid()));
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
## 🤝 Contribuer
|
|
470
|
+
|
|
471
|
+
Ce package fait partie du monorepo LastBrain. Voir le [CONTRIBUTING.md](../../CONTRIBUTING.md) principal.
|
|
472
|
+
|
|
473
|
+
## 📄 Licence
|
|
474
|
+
|
|
475
|
+
MIT - Voir [LICENSE](../../LICENSE)
|
|
476
|
+
|
|
477
|
+
## 🔗 Liens utiles
|
|
478
|
+
|
|
479
|
+
- [OpenAI API Documentation](https://platform.openai.com/docs/api-reference)
|
|
480
|
+
- [DALL-E Guide](https://platform.openai.com/docs/guides/images)
|
|
481
|
+
- [GPT-4 Documentation](https://platform.openai.com/docs/models/gpt-4)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lastbrain/module-ai",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Module de génération IA (texte et images) avec gestion de tokens pour LastBrain",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"react": "^19.0.0",
|
|
39
39
|
"react-dom": "^19.0.0",
|
|
40
40
|
"zod": "^3.23.8",
|
|
41
|
-
"@lastbrain/core": "0.1.
|
|
42
|
-
"@lastbrain/ui": "0.1.
|
|
41
|
+
"@lastbrain/core": "0.1.9",
|
|
42
|
+
"@lastbrain/ui": "0.1.12"
|
|
43
43
|
},
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"next": ">=15.0.0"
|