@lastbrain/module-ai 2.0.26 → 2.0.30
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 +52 -1
- package/dist/ai.build.config.d.ts.map +1 -1
- package/dist/ai.build.config.js +508 -9
- package/dist/api/admin/ai-provider-models/[id].d.ts +18 -0
- package/dist/api/admin/ai-provider-models/[id].d.ts.map +1 -0
- package/dist/api/admin/ai-provider-models/[id].js +58 -0
- package/dist/api/admin/ai-provider-models.d.ts +20 -0
- package/dist/api/admin/ai-provider-models.d.ts.map +1 -0
- package/dist/api/admin/ai-provider-models.js +26 -0
- package/dist/api/admin/ai-providers/[key].d.ts +18 -0
- package/dist/api/admin/ai-providers/[key].d.ts.map +1 -0
- package/dist/api/admin/ai-providers/[key].js +55 -0
- package/dist/api/admin/ai-providers.d.ts +20 -0
- package/dist/api/admin/ai-providers.d.ts.map +1 -0
- package/dist/api/admin/ai-providers.js +26 -0
- package/dist/api/admin/billing-analytics.d.ts +43 -0
- package/dist/api/admin/billing-analytics.d.ts.map +1 -0
- package/dist/api/admin/billing-analytics.js +144 -0
- package/dist/api/admin/global-ai-settings.d.ts +14 -0
- package/dist/api/admin/global-ai-settings.d.ts.map +1 -0
- package/dist/api/admin/global-ai-settings.js +63 -0
- package/dist/api/admin/token-packs/[id].d.ts.map +1 -1
- package/dist/api/admin/token-packs/[id].js +3 -2
- package/dist/api/admin/token-packs.d.ts.map +1 -1
- package/dist/api/admin/token-packs.js +3 -2
- package/dist/api/admin/user-monthly-details.d.ts +49 -0
- package/dist/api/admin/user-monthly-details.d.ts.map +1 -0
- package/dist/api/admin/user-monthly-details.js +140 -0
- package/dist/api/admin/user-quota.d.ts +21 -0
- package/dist/api/admin/user-quota.d.ts.map +1 -0
- package/dist/api/admin/user-quota.js +59 -0
- package/dist/api/admin/user-token/[id].d.ts.map +1 -1
- package/dist/api/admin/user-token/[id].js +2 -1
- package/dist/api/admin/user-token.d.ts +5 -2
- package/dist/api/admin/user-token.d.ts.map +1 -1
- package/dist/api/admin/user-token.js +91 -17
- package/dist/api/admin/user-usage-by-model.d.ts +22 -0
- package/dist/api/admin/user-usage-by-model.d.ts.map +1 -0
- package/dist/api/admin/user-usage-by-model.js +78 -0
- package/dist/api/admin/user-wallet-analytics.d.ts +15 -0
- package/dist/api/admin/user-wallet-analytics.d.ts.map +1 -0
- package/dist/api/admin/user-wallet-analytics.js +67 -0
- package/dist/api/admin/wallet-repair/route.d.ts +30 -0
- package/dist/api/admin/wallet-repair/route.d.ts.map +1 -0
- package/dist/api/admin/wallet-repair/route.js +63 -0
- package/dist/api/auth/ai-model-settings.d.ts +21 -0
- package/dist/api/auth/ai-model-settings.d.ts.map +1 -0
- package/dist/api/auth/ai-model-settings.js +86 -0
- package/dist/api/auth/ai-settings.d.ts +17 -0
- package/dist/api/auth/ai-settings.d.ts.map +1 -0
- package/dist/api/auth/ai-settings.js +87 -0
- package/dist/api/auth/api-keys/[id].d.ts +17 -0
- package/dist/api/auth/api-keys/[id].d.ts.map +1 -0
- package/dist/api/auth/api-keys/[id].js +66 -0
- package/dist/api/auth/api-keys.d.ts +19 -0
- package/dist/api/auth/api-keys.d.ts.map +1 -0
- package/dist/api/auth/api-keys.js +94 -0
- package/dist/api/auth/create-checkout.d.ts +1 -1
- package/dist/api/auth/create-checkout.d.ts.map +1 -1
- package/dist/api/auth/create-checkout.js +8 -6
- package/dist/api/auth/generate-image.d.ts +2 -2
- package/dist/api/auth/generate-image.d.ts.map +1 -1
- package/dist/api/auth/generate-image.js +404 -104
- package/dist/api/auth/generate-text.d.ts +3 -2
- package/dist/api/auth/generate-text.d.ts.map +1 -1
- package/dist/api/auth/generate-text.js +130 -58
- package/dist/api/auth/process-ocr.d.ts +9 -0
- package/dist/api/auth/process-ocr.d.ts.map +1 -0
- package/dist/api/auth/process-ocr.js +43 -0
- package/dist/api/auth/prompts/stats.d.ts +14 -0
- package/dist/api/auth/prompts/stats.d.ts.map +1 -0
- package/dist/api/auth/prompts/stats.js +46 -0
- package/dist/api/auth/prompts.d.ts +26 -0
- package/dist/api/auth/prompts.d.ts.map +1 -0
- package/dist/api/auth/prompts.js +175 -0
- package/dist/api/auth/token-balance.d.ts +26 -0
- package/dist/api/auth/token-balance.d.ts.map +1 -0
- package/dist/api/auth/token-balance.js +47 -0
- package/dist/api/auth/token-checkout.d.ts.map +1 -1
- package/dist/api/auth/token-checkout.js +22 -4
- package/dist/api/auth/token-packs.d.ts.map +1 -1
- package/dist/api/auth/token-packs.js +2 -1
- package/dist/api/auth/usage-by-model.d.ts +25 -0
- package/dist/api/auth/usage-by-model.d.ts.map +1 -0
- package/dist/api/auth/usage-by-model.js +95 -0
- package/dist/api/auth/usage.d.ts +26 -0
- package/dist/api/auth/usage.d.ts.map +1 -0
- package/dist/api/auth/usage.js +127 -0
- package/dist/api/auth/user-tokens.d.ts.map +1 -1
- package/dist/api/auth/user-tokens.js +36 -2
- package/dist/api/auth/wallet/route.d.ts +17 -0
- package/dist/api/auth/wallet/route.d.ts.map +1 -0
- package/dist/api/auth/wallet/route.js +68 -0
- package/dist/api/auth/wallet.d.ts +16 -0
- package/dist/api/auth/wallet.d.ts.map +1 -0
- package/dist/api/auth/wallet.js +71 -0
- package/dist/api/public/gateway-models.d.ts +25 -0
- package/dist/api/public/gateway-models.d.ts.map +1 -0
- package/dist/api/public/gateway-models.js +49 -0
- package/dist/api/public/pricing-summary.d.ts +46 -0
- package/dist/api/public/pricing-summary.d.ts.map +1 -0
- package/dist/api/public/pricing-summary.js +70 -0
- package/dist/api/public/prompts/[id]/stats.d.ts +15 -0
- package/dist/api/public/prompts/[id]/stats.d.ts.map +1 -0
- package/dist/api/public/prompts/[id]/stats.js +37 -0
- package/dist/api/public/prompts/[id]/view.d.ts +15 -0
- package/dist/api/public/prompts/[id]/view.d.ts.map +1 -0
- package/dist/api/public/prompts/[id]/view.js +41 -0
- package/dist/api/public/prompts/slug/[slug].d.ts +15 -0
- package/dist/api/public/prompts/slug/[slug].d.ts.map +1 -0
- package/dist/api/public/prompts/slug/[slug].js +40 -0
- package/dist/api/public/prompts/user/[username].d.ts +17 -0
- package/dist/api/public/prompts/user/[username].d.ts.map +1 -0
- package/dist/api/public/prompts/user/[username].js +51 -0
- package/dist/api/public/prompts.d.ts +15 -0
- package/dist/api/public/prompts.d.ts.map +1 -0
- package/dist/api/public/prompts.js +45 -0
- package/dist/api/public/token-packs.d.ts +11 -0
- package/dist/api/public/token-packs.d.ts.map +1 -0
- package/dist/api/public/token-packs.js +25 -0
- package/dist/api/public/token-pricing.d.ts +44 -0
- package/dist/api/public/token-pricing.d.ts.map +1 -0
- package/dist/api/public/token-pricing.js +168 -0
- package/dist/api/public/v1/_lib/artifacts.d.ts +52 -0
- package/dist/api/public/v1/_lib/artifacts.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/artifacts.js +217 -0
- package/dist/api/public/v1/_lib/auth.d.ts +43 -0
- package/dist/api/public/v1/_lib/auth.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/auth.js +108 -0
- package/dist/api/public/v1/_lib/errors.d.ts +17 -0
- package/dist/api/public/v1/_lib/errors.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/errors.js +16 -0
- package/dist/api/public/v1/_lib/log.d.ts +29 -0
- package/dist/api/public/v1/_lib/log.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/log.js +68 -0
- package/dist/api/public/v1/_lib/quota.d.ts +24 -0
- package/dist/api/public/v1/_lib/quota.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/quota.js +118 -0
- package/dist/api/public/v1/_lib/router.d.ts +54 -0
- package/dist/api/public/v1/_lib/router.d.ts.map +1 -0
- package/dist/api/public/v1/_lib/router.js +119 -0
- package/dist/api/public/v1/connect.d.ts +20 -0
- package/dist/api/public/v1/connect.d.ts.map +1 -0
- package/dist/api/public/v1/connect.js +119 -0
- package/dist/api/public/v1/doc.d.ts +239 -0
- package/dist/api/public/v1/doc.d.ts.map +1 -0
- package/dist/api/public/v1/doc.js +253 -0
- package/dist/api/public/v1/history/[id].d.ts +92 -0
- package/dist/api/public/v1/history/[id].d.ts.map +1 -0
- package/dist/api/public/v1/history/[id].js +176 -0
- package/dist/api/public/v1/history.d.ts +30 -0
- package/dist/api/public/v1/history.d.ts.map +1 -0
- package/dist/api/public/v1/history.js +142 -0
- package/dist/api/public/v1/image-ai.d.ts +24 -0
- package/dist/api/public/v1/image-ai.d.ts.map +1 -0
- package/dist/api/public/v1/image-ai.js +233 -0
- package/dist/api/public/v1/prompts.d.ts +19 -0
- package/dist/api/public/v1/prompts.d.ts.map +1 -0
- package/dist/api/public/v1/prompts.js +107 -0
- package/dist/api/public/v1/provider.d.ts +16 -0
- package/dist/api/public/v1/provider.d.ts.map +1 -0
- package/dist/api/public/v1/provider.js +130 -0
- package/dist/api/public/v1/purchase.d.ts +11 -0
- package/dist/api/public/v1/purchase.d.ts.map +1 -0
- package/dist/api/public/v1/purchase.js +18 -0
- package/dist/api/public/v1/status.d.ts +35 -0
- package/dist/api/public/v1/status.d.ts.map +1 -0
- package/dist/api/public/v1/status.js +163 -0
- package/dist/api/public/v1/text-ai.d.ts +26 -0
- package/dist/api/public/v1/text-ai.d.ts.map +1 -0
- package/dist/api/public/v1/text-ai.js +239 -0
- package/dist/api/public/webhook.d.ts.map +1 -1
- package/dist/api/public/webhook.js +50 -39
- package/dist/api/track-usage.d.ts +12 -0
- package/dist/api/track-usage.d.ts.map +1 -0
- package/dist/api/track-usage.js +37 -0
- package/dist/components/Doc.d.ts.map +1 -1
- package/dist/components/Doc.js +1 -1
- package/dist/components/DocUsageCustom.js +6 -6
- package/dist/components/admin/UserTokenTab.d.ts.map +1 -1
- package/dist/components/admin/UserTokenTab.js +170 -23
- package/dist/components/auth/AuthDashboardAi.d.ts +2 -0
- package/dist/components/auth/AuthDashboardAi.d.ts.map +1 -0
- package/dist/components/auth/AuthDashboardAi.js +53 -0
- package/dist/docs/REFACTORING_BILLING_GUIDE.d.ts +277 -0
- package/dist/docs/REFACTORING_BILLING_GUIDE.d.ts.map +1 -0
- package/dist/docs/REFACTORING_BILLING_GUIDE.js +276 -0
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/scripts/migrate-tokens-to-wallet.d.ts +13 -0
- package/dist/scripts/migrate-tokens-to-wallet.d.ts.map +1 -0
- package/dist/scripts/migrate-tokens-to-wallet.js +165 -0
- package/dist/server/__tests__/billing.test.d.ts +5 -0
- package/dist/server/__tests__/billing.test.d.ts.map +1 -0
- package/dist/server/__tests__/billing.test.js +223 -0
- package/dist/server/ai-client.d.ts +59 -0
- package/dist/server/ai-client.d.ts.map +1 -0
- package/dist/server/ai-client.js +111 -0
- package/dist/server/ai-generation-service.d.ts +66 -0
- package/dist/server/ai-generation-service.d.ts.map +1 -0
- package/dist/server/ai-generation-service.js +274 -0
- package/dist/server/billing.d.ts +200 -0
- package/dist/server/billing.d.ts.map +1 -0
- package/dist/server/billing.js +488 -0
- package/dist/server/gateway-service.d.ts +13 -0
- package/dist/server/gateway-service.d.ts.map +1 -0
- package/dist/server/gateway-service.js +161 -0
- package/dist/server/global-settings.d.ts +16 -0
- package/dist/server/global-settings.d.ts.map +1 -0
- package/dist/server/global-settings.js +42 -0
- package/dist/server/model-filter.d.ts +25 -0
- package/dist/server/model-filter.d.ts.map +1 -0
- package/dist/server/model-filter.js +240 -0
- package/dist/server/ocr.d.ts +39 -0
- package/dist/server/ocr.d.ts.map +1 -0
- package/dist/server/ocr.js +280 -0
- package/dist/server/openai-client.d.ts +19 -0
- package/dist/server/openai-client.d.ts.map +1 -0
- package/dist/server/openai-client.js +26 -0
- package/dist/server/pricing-config.d.ts +18 -0
- package/dist/server/pricing-config.d.ts.map +1 -0
- package/dist/server/pricing-config.js +94 -0
- package/dist/server/pricing-validator.d.ts +41 -0
- package/dist/server/pricing-validator.d.ts.map +1 -0
- package/dist/server/pricing-validator.js +113 -0
- package/dist/server/pricing.d.ts +121 -0
- package/dist/server/pricing.d.ts.map +1 -0
- package/dist/server/pricing.js +225 -0
- package/dist/server/quota.d.ts +66 -0
- package/dist/server/quota.d.ts.map +1 -0
- package/dist/server/quota.js +538 -0
- package/dist/server/wallet-repair.d.ts +32 -0
- package/dist/server/wallet-repair.d.ts.map +1 -0
- package/dist/server/wallet-repair.js +189 -0
- package/dist/server.d.ts +13 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +87 -16
- package/dist/sitemap/handlers/prompts.d.ts +6 -0
- package/dist/sitemap/handlers/prompts.d.ts.map +1 -0
- package/dist/sitemap/handlers/prompts.js +72 -0
- package/dist/sitemap/handlers/users.d.ts +6 -0
- package/dist/sitemap/handlers/users.d.ts.map +1 -0
- package/dist/sitemap/handlers/users.js +80 -0
- package/dist/sitemap/manifest.d.ts +8 -0
- package/dist/sitemap/manifest.d.ts.map +1 -0
- package/dist/sitemap/manifest.js +27 -0
- package/dist/types/gateway.d.ts +40 -0
- package/dist/types/gateway.d.ts.map +1 -0
- package/dist/types/gateway.js +4 -0
- package/dist/types/quota.d.ts +74 -0
- package/dist/types/quota.d.ts.map +1 -0
- package/dist/types/quota.js +11 -0
- package/dist/utils/date.d.ts +7 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +17 -0
- package/dist/web/admin/AdminTokenPacksPage.js +1 -1
- package/dist/web/admin/BillingAnalyticsPage.d.ts +2 -0
- package/dist/web/admin/BillingAnalyticsPage.d.ts.map +1 -0
- package/dist/web/admin/BillingAnalyticsPage.js +141 -0
- package/dist/web/admin/GlobalAISettingsPage.d.ts +2 -0
- package/dist/web/admin/GlobalAISettingsPage.d.ts.map +1 -0
- package/dist/web/admin/GlobalAISettingsPage.js +93 -0
- package/dist/web/admin/UserTokenPage.d.ts.map +1 -1
- package/dist/web/admin/UserTokenPage.js +20 -7
- package/dist/web/auth/AISettingsPage.d.ts +2 -0
- package/dist/web/auth/AISettingsPage.d.ts.map +1 -0
- package/dist/web/auth/AISettingsPage.js +258 -0
- package/dist/web/auth/APIKeysPage.d.ts +2 -0
- package/dist/web/auth/APIKeysPage.d.ts.map +1 -0
- package/dist/web/auth/APIKeysPage.js +154 -0
- package/dist/web/auth/HistoryPage.d.ts +2 -0
- package/dist/web/auth/HistoryPage.d.ts.map +1 -0
- package/dist/web/auth/HistoryPage.js +279 -0
- package/dist/web/auth/PromptsPage.d.ts +5 -0
- package/dist/web/auth/PromptsPage.d.ts.map +1 -0
- package/dist/web/auth/PromptsPage.js +137 -0
- package/dist/web/auth/TokenPage.d.ts.map +1 -1
- package/dist/web/auth/TokenPage.js +88 -31
- package/dist/web/auth/UsageAndTokensPage.d.ts +2 -0
- package/dist/web/auth/UsageAndTokensPage.d.ts.map +1 -0
- package/dist/web/auth/UsageAndTokensPage.js +157 -0
- package/dist/web/auth/UsagePage.d.ts +2 -0
- package/dist/web/auth/UsagePage.d.ts.map +1 -0
- package/dist/web/auth/UsagePage.js +62 -0
- package/dist/web/auth/components/ApiKeyFilterSelect.d.ts +13 -0
- package/dist/web/auth/components/ApiKeyFilterSelect.d.ts.map +1 -0
- package/dist/web/auth/components/ApiKeyFilterSelect.js +16 -0
- package/dist/web/auth/components/ModelUsageTable.d.ts +19 -0
- package/dist/web/auth/components/ModelUsageTable.d.ts.map +1 -0
- package/dist/web/auth/components/ModelUsageTable.js +37 -0
- package/dist/web/auth/components/PurchaseButton.d.ts +7 -0
- package/dist/web/auth/components/PurchaseButton.d.ts.map +1 -0
- package/dist/web/auth/components/PurchaseButton.js +13 -0
- package/dist/web/auth/components/TokenHistoryCard.d.ts +20 -0
- package/dist/web/auth/components/TokenHistoryCard.d.ts.map +1 -0
- package/dist/web/auth/components/TokenHistoryCard.js +76 -0
- package/dist/web/auth/components/TokenKpiGrid.d.ts +24 -0
- package/dist/web/auth/components/TokenKpiGrid.d.ts.map +1 -0
- package/dist/web/auth/components/TokenKpiGrid.js +38 -0
- package/dist/web/auth/components/UsageByDayChart.d.ts +11 -0
- package/dist/web/auth/components/UsageByDayChart.d.ts.map +1 -0
- package/dist/web/auth/components/UsageByDayChart.js +32 -0
- package/dist/web/auth/components/UsageByModelBarChart.d.ts +12 -0
- package/dist/web/auth/components/UsageByModelBarChart.d.ts.map +1 -0
- package/dist/web/auth/components/UsageByModelBarChart.js +32 -0
- package/dist/web/auth/components/WalletStatusCard.d.ts +9 -0
- package/dist/web/auth/components/WalletStatusCard.d.ts.map +1 -0
- package/dist/web/auth/components/WalletStatusCard.js +50 -0
- package/dist/web/components/ImageGenerative.d.ts +3 -1
- package/dist/web/components/ImageGenerative.d.ts.map +1 -1
- package/dist/web/components/ImageGenerative.js +139 -52
- package/dist/web/components/TextareaGenerative.d.ts +3 -1
- package/dist/web/components/TextareaGenerative.d.ts.map +1 -1
- package/dist/web/components/TextareaGenerative.js +10 -5
- package/dist/web/public/PromptDetailPage.d.ts +25 -0
- package/dist/web/public/PromptDetailPage.d.ts.map +1 -0
- package/dist/web/public/PromptDetailPage.js +71 -0
- package/dist/web/public/PromptDetailPageServer.d.ts +15 -0
- package/dist/web/public/PromptDetailPageServer.d.ts.map +1 -0
- package/dist/web/public/PromptDetailPageServer.js +68 -0
- package/dist/web/public/PublicPromptsPage.d.ts +5 -0
- package/dist/web/public/PublicPromptsPage.d.ts.map +1 -0
- package/dist/web/public/PublicPromptsPage.js +110 -0
- package/dist/web/public/PurchaseTokensPage.d.ts +2 -0
- package/dist/web/public/PurchaseTokensPage.d.ts.map +1 -0
- package/dist/web/public/PurchaseTokensPage.js +98 -0
- package/dist/web/public/UserAvatar.d.ts +13 -0
- package/dist/web/public/UserAvatar.d.ts.map +1 -0
- package/dist/web/public/UserAvatar.js +13 -0
- package/dist/web/public/UserDetailPageServer.d.ts +15 -0
- package/dist/web/public/UserDetailPageServer.d.ts.map +1 -0
- package/dist/web/public/UserDetailPageServer.js +31 -0
- package/dist/web/public/UserPromptsPage.d.ts +9 -0
- package/dist/web/public/UserPromptsPage.d.ts.map +1 -0
- package/dist/web/public/UserPromptsPage.js +112 -0
- package/dist/web/public/UserPromptsPageServer.d.ts +15 -0
- package/dist/web/public/UserPromptsPageServer.d.ts.map +1 -0
- package/dist/web/public/UserPromptsPageServer.js +31 -0
- package/package.json +18 -9
- package/supabase/migrations/20251125000000_ai_tokens.sql +7 -0
- package/supabase/migrations/20260123100002_user_token_quota_monthly copy.sql +173 -0
- package/supabase/migrations/20260128100003_update_and_add_table.sql +368 -0
- package/supabase/migrations/20260128120000_seed_providers_models.sql +78 -0
- package/supabase/migrations/20260128131405_add_api_key_id_to_ledgers.sql +41 -0
- package/supabase/migrations/20260128140000_ai_artifacts_storage.sql +99 -0
- package/supabase/migrations/20260128140002_ai_user_settings.sql +57 -0
- package/supabase/migrations/20260128150000_drop_ai_user_settings.sql +21 -0
- package/supabase/migrations/20260128160000_wallet_billing_system.sql +192 -0
- package/supabase/migrations/20260128160001_wallet_rpc_functions.sql +165 -0
- package/supabase/migrations/20260128170000_add_pack_coef_to_token_packs.sql +30 -0
- package/supabase/migrations/20260129120000_wallet_view_rpc.sql +41 -0
- package/supabase/migrations/20260129220003_update_pack_margins.sql +31 -0
- package/supabase/migrations/20260129330004_ai_user_prompts.sql +151 -0
- package/supabase/migrations/20260129330005_ai_prompts_ip_tracking.sql +92 -0
- package/supabase/migrations/20260129330006_ai_prompts_slug.sql +64 -0
- package/supabase/migrations/20260129330007_ai_prompts_view_slug.sql +26 -0
- package/supabase/migrations/20260129440000_ai_prompts_view_username.sql +33 -0
- package/supabase/migrations/20260129450000_ai_prompts_add_lang.sql +40 -0
- package/supabase/migrations/20260131000000_extract_model_prompt_in_ledger.sql +92 -0
- package/supabase/migrations/20260131140000_fix_duplicate_purchases.sql +64 -0
- package/supabase/migrations/20260201120000_module-ai_default_models.sql +63 -0
- package/supabase/migrations/20260201130000_module-ai_remove_provider_tables.sql +17 -0
- package/supabase/migrations-down/20251217120000_user_token_quota_monthly.sql +34 -0
- package/supabase/migrations-down/20260128131405_add_api_key_id_to_ledgers.sql +25 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface TokenTransaction {
|
|
2
|
+
id: string;
|
|
3
|
+
amount: number;
|
|
4
|
+
type: "purchase" | "gift" | "use" | "adjust" | "quota_use";
|
|
5
|
+
source?: "quota" | "purchased";
|
|
6
|
+
description?: string;
|
|
7
|
+
model?: string;
|
|
8
|
+
prompt?: string;
|
|
9
|
+
created_at: string;
|
|
10
|
+
running_balance: number;
|
|
11
|
+
}
|
|
12
|
+
interface TokenHistoryCardProps {
|
|
13
|
+
transactions: TokenTransaction[];
|
|
14
|
+
maxVisible?: number;
|
|
15
|
+
loading?: boolean;
|
|
16
|
+
isFiltered?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function TokenHistoryCard({ transactions, maxVisible, loading, isFiltered, }: TokenHistoryCardProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=TokenHistoryCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenHistoryCard.d.ts","sourceRoot":"","sources":["../../../../src/web/auth/components/TokenHistoryCard.tsx"],"names":[],"mappings":"AAyBA,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC3D,MAAM,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,UAAU,qBAAqB;IAC7B,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,UAAc,EACd,OAAe,EACf,UAAkB,GACnB,EAAE,qBAAqB,2CAyMvB"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { Card, CardBody, CardHeader, Table, TableHeader, TableColumn, TableBody, TableRow, TableCell, Button, Chip, Modal, ModalContent, ModalHeader, ModalBody, ModalFooter, Skeleton, } from "@lastbrain/ui";
|
|
5
|
+
import { Eye, ArrowUp, ArrowDown } from "lucide-react";
|
|
6
|
+
import { useModuleTranslation } from "@lastbrain/core";
|
|
7
|
+
export function TokenHistoryCard({ transactions, maxVisible = 5, loading = false, isFiltered = false, }) {
|
|
8
|
+
const t = useModuleTranslation("ai");
|
|
9
|
+
const [isModalOpen, setIsModalOpen] = useState(false);
|
|
10
|
+
const formatDate = (dateString) => {
|
|
11
|
+
return new Date(dateString).toLocaleDateString("fr-FR", {
|
|
12
|
+
day: "2-digit",
|
|
13
|
+
month: "short",
|
|
14
|
+
year: "numeric",
|
|
15
|
+
hour: "2-digit",
|
|
16
|
+
minute: "2-digit",
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
const getTypeLabel = (type, source) => {
|
|
20
|
+
if (type === "use" && source === "quota") {
|
|
21
|
+
return t("tokens.type.quota_use") || "Quota utilisé";
|
|
22
|
+
}
|
|
23
|
+
const labels = {
|
|
24
|
+
purchase: t("tokens.type.purchase") || "Achat",
|
|
25
|
+
gift: t("tokens.type.gift") || "Cadeau",
|
|
26
|
+
use: t("tokens.type.use") || "Utilisation",
|
|
27
|
+
adjust: t("tokens.type.adjust") || "Ajustement",
|
|
28
|
+
quota_use: t("tokens.type.quota_use") || "Quota utilisé",
|
|
29
|
+
};
|
|
30
|
+
return labels[type] || type;
|
|
31
|
+
};
|
|
32
|
+
const getTypeColor = (type, source) => {
|
|
33
|
+
if (type === "use" && source === "quota") {
|
|
34
|
+
return "primary";
|
|
35
|
+
}
|
|
36
|
+
const colors = {
|
|
37
|
+
purchase: "success",
|
|
38
|
+
gift: "primary",
|
|
39
|
+
use: "danger",
|
|
40
|
+
adjust: "warning",
|
|
41
|
+
quota_use: "primary",
|
|
42
|
+
};
|
|
43
|
+
return colors[type] || "default";
|
|
44
|
+
};
|
|
45
|
+
// Filtrer les transactions valides (avec amount défini)
|
|
46
|
+
const validTransactions = transactions.filter((tx) => tx && typeof tx.amount === "number");
|
|
47
|
+
const visibleTransactions = validTransactions.slice(0, maxVisible);
|
|
48
|
+
if (loading) {
|
|
49
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("div", { className: "flex justify-between items-center w-full", children: _jsx("div", { children: _jsx("h3", { className: "text-lg font-semibold", children: "Historique des transactions" }) }) }) }), _jsx(CardBody, { children: _jsxs("div", { className: "space-y-3", children: [_jsx(Skeleton, { className: "h-12 w-full" }), _jsx(Skeleton, { className: "h-12 w-full" }), _jsx(Skeleton, { className: "h-12 w-full" }), _jsx(Skeleton, { className: "h-12 w-full" }), _jsx(Skeleton, { className: "h-12 w-full" })] }) })] }));
|
|
50
|
+
}
|
|
51
|
+
const renderTable = (data, showBalance = false) => {
|
|
52
|
+
const columns = [
|
|
53
|
+
t("tokens.history.column_date"),
|
|
54
|
+
t("tokens.history.column_type"),
|
|
55
|
+
t("tokens.history.column_description"),
|
|
56
|
+
t("tokens.history.column_amount"),
|
|
57
|
+
];
|
|
58
|
+
if (showBalance) {
|
|
59
|
+
columns.push(t("tokens.history.column_balance"));
|
|
60
|
+
}
|
|
61
|
+
return (_jsxs(Table, { className: "h-full", "aria-label": t("tokens.history.aria_label"), children: [_jsx(TableHeader, { children: columns.map((col, idx) => (_jsx(TableColumn, { children: col }, idx))) }), _jsx(TableBody, { emptyContent: t("tokens.history.no_transactions") ||
|
|
62
|
+
"Aucune transaction pour ce mois", children: data.map((tx) => {
|
|
63
|
+
const cells = [
|
|
64
|
+
_jsx(TableCell, { className: "text-sm", children: formatDate(tx.created_at) }, "date"),
|
|
65
|
+
_jsx(TableCell, { children: _jsx(Chip, { size: "sm", variant: "flat", color: getTypeColor(tx.type, tx.source), children: getTypeLabel(tx.type, tx.source) }) }, "type"),
|
|
66
|
+
_jsxs(TableCell, { className: "max-w-xs truncate", children: [tx.description || tx.model || "-", tx.prompt && (_jsx("span", { className: "text-xs text-gray-500 block truncate", children: tx.prompt }))] }, "description"),
|
|
67
|
+
_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-1", children: [(tx.amount ?? 0) > 0 ? (_jsx(ArrowUp, { size: 16, className: "text-success" })) : (_jsx(ArrowDown, { size: 16, className: "text-danger" })), _jsxs("span", { className: `font-semibold ${(tx.amount ?? 0) > 0 ? "text-success" : "text-danger"}`, children: [(tx.amount ?? 0) > 0 ? "+" : "", (tx.amount ?? 0).toLocaleString()] })] }) }, "amount"),
|
|
68
|
+
];
|
|
69
|
+
if (showBalance) {
|
|
70
|
+
cells.push(_jsx(TableCell, { className: "font-mono text-sm", children: (tx.running_balance ?? 0).toLocaleString() }, "balance"));
|
|
71
|
+
}
|
|
72
|
+
return _jsx(TableRow, { children: cells }, tx.id);
|
|
73
|
+
}) })] }));
|
|
74
|
+
};
|
|
75
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Card, { className: "h-full ", children: [_jsxs(CardHeader, { className: "flex flex-row items-center justify-between", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold", children: t("tokens.history.title") }), _jsxs("p", { className: "text-xs text-gray-500", children: [validTransactions.length, " transactions au total"] })] }), validTransactions.length > maxVisible && (_jsx(Button, { size: "sm", variant: "flat", color: "primary", startContent: _jsx(Eye, { size: 16 }), onPress: () => setIsModalOpen(true), children: "Voir plus" }))] }), _jsx(CardBody, { children: renderTable(visibleTransactions, false) })] }), _jsx(Modal, { isOpen: isModalOpen, onClose: () => setIsModalOpen(false), size: "5xl", scrollBehavior: "inside", children: _jsxs(ModalContent, { children: [_jsx(ModalHeader, { children: _jsx("h2", { className: "text-xl font-bold", children: t("tokens.history.title") }) }), _jsx(ModalBody, { children: renderTable(validTransactions, !isFiltered) }), _jsx(ModalFooter, { children: _jsx(Button, { variant: "light", onPress: () => setIsModalOpen(false), children: "Fermer" }) })] }) })] }));
|
|
76
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
interface TokenBalance {
|
|
2
|
+
quota: {
|
|
3
|
+
hasQuota: boolean;
|
|
4
|
+
plan: string;
|
|
5
|
+
effectiveQuota: number;
|
|
6
|
+
usedQuota: number;
|
|
7
|
+
remainingQuota: number;
|
|
8
|
+
periodStart: string | null;
|
|
9
|
+
periodEnd: string | null;
|
|
10
|
+
isActive: boolean;
|
|
11
|
+
};
|
|
12
|
+
purchased: {
|
|
13
|
+
balance: number;
|
|
14
|
+
totalAdded: number;
|
|
15
|
+
totalUsed: number;
|
|
16
|
+
};
|
|
17
|
+
balance: number;
|
|
18
|
+
}
|
|
19
|
+
interface TokenKpiGridProps {
|
|
20
|
+
balance: TokenBalance | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function TokenKpiGrid({ balance }: TokenKpiGridProps): import("react/jsx-runtime").JSX.Element | null;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=TokenKpiGrid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenKpiGrid.d.ts","sourceRoot":"","sources":["../../../../src/web/auth/components/TokenKpiGrid.tsx"],"names":[],"mappings":"AAMA,UAAU,YAAY;IACpB,KAAK,EAAE;QACL,QAAQ,EAAE,OAAO,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,SAAS,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,iBAAiB,kDAqL1D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Card, CardBody, Progress, Chip } from "@lastbrain/ui";
|
|
4
|
+
import { Coins, TrendingDown, Crown, Package, Gauge } from "lucide-react";
|
|
5
|
+
import { useModuleTranslation } from "@lastbrain/core";
|
|
6
|
+
export function TokenKpiGrid({ balance }) {
|
|
7
|
+
const t = useModuleTranslation("ai");
|
|
8
|
+
const formatTokensShort = (tokens) => {
|
|
9
|
+
if (tokens >= 1000 && tokens % 1000 === 0) {
|
|
10
|
+
const thousands = tokens / 1000;
|
|
11
|
+
return `${thousands}K`;
|
|
12
|
+
}
|
|
13
|
+
return tokens.toLocaleString();
|
|
14
|
+
};
|
|
15
|
+
if (!balance)
|
|
16
|
+
return null;
|
|
17
|
+
const hasQuota = balance.quota.hasQuota && balance.quota.isActive;
|
|
18
|
+
const quotaPercentage = hasQuota
|
|
19
|
+
? (balance.quota.usedQuota / balance.quota.effectiveQuota) * 100
|
|
20
|
+
: 0;
|
|
21
|
+
const totalBalance = balance.purchased.balance + (hasQuota ? balance.quota.remainingQuota : 0);
|
|
22
|
+
// Calculer le pourcentage total d'utilisation
|
|
23
|
+
const totalAvailable = (hasQuota ? balance.quota.effectiveQuota : 0) +
|
|
24
|
+
balance.purchased.totalAdded;
|
|
25
|
+
const totalUsed = (hasQuota ? balance.quota.usedQuota : 0) + balance.purchased.totalUsed;
|
|
26
|
+
const usagePercentage = totalAvailable > 0 ? (totalUsed / totalAvailable) * 100 : 0;
|
|
27
|
+
// Déterminer la couleur selon le pourcentage
|
|
28
|
+
const getUsageColor = (percentage) => {
|
|
29
|
+
if (percentage > 90)
|
|
30
|
+
return "danger";
|
|
31
|
+
if (percentage >= 80)
|
|
32
|
+
return "warning";
|
|
33
|
+
return "success";
|
|
34
|
+
};
|
|
35
|
+
const usageColor = getUsageColor(usagePercentage);
|
|
36
|
+
return (_jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4", children: [_jsx(Card, { className: "border-2 border-primary", children: _jsxs(CardBody, { className: "p-6", children: [_jsxs("div", { className: "flex items-center gap-3 mb-4", children: [_jsx("div", { className: "p-2 rounded-lg bg-primary/10", children: _jsx(Coins, { size: 24, className: "text-primary" }) }), _jsx("div", { className: "flex-1", children: _jsx("p", { className: "text-sm text-default-800", children: t("tokens.balance.current") }) })] }), _jsx("p", { className: "text-3xl font-bold text-primary", children: formatTokensShort(totalBalance) }), _jsx("p", { className: "text-xs text-default-700 mt-1", children: t("tokens.balance.available") })] }) }), hasQuota && (_jsx(Card, { className: "border-2 border-warning", children: _jsxs(CardBody, { className: "p-6", children: [_jsxs("div", { className: "flex items-center gap-3 mb-4", children: [_jsx("div", { className: "p-2 rounded-lg bg-warning/10", children: _jsx(Crown, { size: 24, className: "text-warning" }) }), _jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "text-sm text-default-800", children: t("tokens.quota.title") }), _jsx(Chip, { variant: "flat", color: "warning", size: "sm", children: balance.quota.plan.toUpperCase() })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex justify-between text-sm", children: [_jsx("span", { children: t("tokens.quota.used") }), _jsxs("span", { className: "font-semibold", children: [formatTokensShort(balance.quota.usedQuota), " /", " ", formatTokensShort(balance.quota.effectiveQuota)] })] }), _jsx(Progress, { value: quotaPercentage, color: quotaPercentage > 80 ? "danger" : "warning", className: "h-2" }), _jsxs("p", { className: "text-xs text-default-700", children: [formatTokensShort(balance.quota.remainingQuota), " ", t("tokens.quota.remaining")] })] })] }) })), _jsx(Card, { className: "border-2 border-success", children: _jsxs(CardBody, { className: "p-6", children: [_jsxs("div", { className: "flex items-center gap-3 mb-4", children: [_jsx("div", { className: "p-2 rounded-lg bg-success/10", children: _jsx(Package, { size: 24, className: "text-success" }) }), _jsx("div", { className: "flex-1", children: _jsx("p", { className: "text-sm text-default-800", children: t("tokens.purchased.title") }) })] }), _jsx("p", { className: "text-3xl font-bold text-success", children: formatTokensShort(balance.purchased.balance) }), _jsx("p", { className: "text-xs text-default-700 mt-1", children: t("tokens.purchased.available") })] }) }), _jsx(Card, { className: "border-2 border-danger", children: _jsxs(CardBody, { className: "p-6", children: [_jsxs("div", { className: "flex items-center gap-3 mb-4", children: [_jsx("div", { className: "p-2 rounded-lg bg-danger/10", children: _jsx(TrendingDown, { size: 24, className: "text-danger" }) }), _jsx("div", { className: "flex-1", children: _jsx("p", { className: "text-sm text-default-800", children: t("tokens.balance.total_used") }) })] }), _jsx("p", { className: "text-3xl font-bold text-danger", children: formatTokensShort((hasQuota ? balance.quota.usedQuota : 0) +
|
|
37
|
+
balance.purchased.totalUsed) }), _jsx("p", { className: "text-xs text-default-700 mt-1", children: t("tokens.balance.consumed") })] }) }), _jsx(Card, { className: `border-2 border-${usageColor}`, children: _jsxs(CardBody, { className: "p-6", children: [_jsxs("div", { className: "flex items-center gap-3 mb-4", children: [_jsx("div", { className: `p-2 rounded-lg bg-${usageColor}/10`, children: _jsx(Gauge, { size: 24, className: `text-${usageColor}` }) }), _jsx("div", { className: "flex-1", children: _jsx("p", { className: "text-sm text-default-800", children: t("tokens.usage.percentage") || "Utilisation" }) })] }), _jsxs("p", { className: `text-3xl font-bold text-${usageColor}`, children: [usagePercentage.toFixed(1), "%"] }), _jsx("div", { className: "mt-3", children: _jsx(Progress, { value: usagePercentage, color: usageColor, className: "h-2" }) }), _jsxs("p", { className: "text-xs text-default-700 mt-2", children: [formatTokensShort(totalUsed), " / ", formatTokensShort(totalAvailable)] })] }) })] }));
|
|
38
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface DailyUsage {
|
|
2
|
+
date: string;
|
|
3
|
+
[model: string]: string | number;
|
|
4
|
+
}
|
|
5
|
+
interface UsageByDayChartProps {
|
|
6
|
+
data: DailyUsage[];
|
|
7
|
+
loading?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function UsageByDayChart({ data, loading, }: UsageByDayChartProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=UsageByDayChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageByDayChart.d.ts","sourceRoot":"","sources":["../../../../src/web/auth/components/UsageByDayChart.tsx"],"names":[],"mappings":"AAcA,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,UAAU,oBAAoB;IAC5B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAaD,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,OAAe,GAChB,EAAE,oBAAoB,2CAoGtB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, CardBody, CardHeader } from "@lastbrain/ui";
|
|
3
|
+
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, } from "recharts";
|
|
4
|
+
import { useModuleTranslation } from "@lastbrain/core";
|
|
5
|
+
import { Skeleton } from "@lastbrain/ui";
|
|
6
|
+
const COLORS = [
|
|
7
|
+
"#3b82f6", // blue
|
|
8
|
+
"#10b981", // green
|
|
9
|
+
"#f59e0b", // amber
|
|
10
|
+
"#ef4444", // red
|
|
11
|
+
"#8b5cf6", // purple
|
|
12
|
+
"#ec4899", // pink
|
|
13
|
+
"#14b8a6", // teal
|
|
14
|
+
"#f97316", // orange
|
|
15
|
+
];
|
|
16
|
+
export function UsageByDayChart({ data, loading = false, }) {
|
|
17
|
+
const t = useModuleTranslation("ai");
|
|
18
|
+
if (loading) {
|
|
19
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-lg font-semibold", children: t("usage.daily_chart_title") }) }), _jsx(CardBody, { children: _jsxs("div", { className: "space-y-3", children: [_jsx(Skeleton, { className: "h-8 w-full" }), _jsx(Skeleton, { className: "h-8 w-full" }), _jsx(Skeleton, { className: "h-8 w-full" }), _jsx(Skeleton, { className: "h-8 w-full" })] }) })] }));
|
|
20
|
+
}
|
|
21
|
+
if (!data || data.length === 0) {
|
|
22
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-lg font-semibold", children: t("usage.daily_chart_title") }) }), _jsx(CardBody, { children: _jsx("div", { className: "flex items-center justify-center h-64 text-gray-500", children: t("usage.no_data") }) })] }));
|
|
23
|
+
}
|
|
24
|
+
// Extract all model names from the data (excluding 'date')
|
|
25
|
+
const modelNames = Object.keys(data[0] || {}).filter((key) => key !== "date");
|
|
26
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold", children: t("usage.daily_chart_title") }), _jsx("p", { className: "text-xs text-gray-500", children: t("usage.daily_chart_subtitle") })] }) }), _jsx(CardBody, { children: _jsx(ResponsiveContainer, { width: "100%", height: 300, children: _jsxs(LineChart, { data: data, margin: { top: 5, right: 30, left: 20, bottom: 5 }, children: [_jsx(CartesianGrid, { strokeDasharray: "3 3", opacity: 0.3 }), _jsx(XAxis, { dataKey: "date", tick: { fontSize: 12 }, angle: -45, textAnchor: "end", height: 80 }), _jsx(YAxis, { tick: { fontSize: 12 }, tickFormatter: (value) => {
|
|
27
|
+
return `$${value.toFixed(2)}`;
|
|
28
|
+
} }), _jsx(Tooltip, { formatter: (value, name) => [
|
|
29
|
+
`$${value.toFixed(3)}`,
|
|
30
|
+
name,
|
|
31
|
+
], labelFormatter: (label) => `Date: ${label}` }), _jsx(Legend, {}), modelNames.map((model, index) => (_jsx(Line, { type: "monotone", dataKey: model, stroke: COLORS[index % COLORS.length], strokeWidth: 2, dot: { r: 3 }, activeDot: { r: 5 }, name: model }, model)))] }) }) })] }));
|
|
32
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface UsageByModel {
|
|
2
|
+
model: string;
|
|
3
|
+
tokens: number;
|
|
4
|
+
calls: number;
|
|
5
|
+
}
|
|
6
|
+
interface UsageByModelBarChartProps {
|
|
7
|
+
data: UsageByModel[];
|
|
8
|
+
loading?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function UsageByModelBarChart({ data, loading, }: UsageByModelBarChartProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=UsageByModelBarChart.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UsageByModelBarChart.d.ts","sourceRoot":"","sources":["../../../../src/web/auth/components/UsageByModelBarChart.tsx"],"names":[],"mappings":"AAaA,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,yBAAyB;IACjC,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAWD,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,OAAe,GAChB,EAAE,yBAAyB,2CAyG3B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Card, CardBody, CardHeader } from "@lastbrain/ui";
|
|
3
|
+
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, Cell, } from "recharts";
|
|
4
|
+
import { useModuleTranslation } from "@lastbrain/core";
|
|
5
|
+
import { Skeleton } from "@lastbrain/ui";
|
|
6
|
+
const COLORS = [
|
|
7
|
+
"#3b82f6", // blue
|
|
8
|
+
"#10b981", // green
|
|
9
|
+
"#f59e0b", // amber
|
|
10
|
+
"#ef4444", // red
|
|
11
|
+
"#8b5cf6", // purple
|
|
12
|
+
"#ec4899", // pink
|
|
13
|
+
];
|
|
14
|
+
export function UsageByModelBarChart({ data, loading = false, }) {
|
|
15
|
+
const t = useModuleTranslation("ai");
|
|
16
|
+
if (loading) {
|
|
17
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-lg font-semibold", children: "Utilisation par mod\u00E8le" }) }), _jsx(CardBody, { children: _jsxs("div", { className: "space-y-3", children: [_jsx(Skeleton, { className: "h-6 w-full" }), _jsx(Skeleton, { className: "h-6 w-3/4" }), _jsx(Skeleton, { className: "h-6 w-5/6" }), _jsx(Skeleton, { className: "h-6 w-2/3" }), _jsx(Skeleton, { className: "h-6 w-4/5" })] }) })] }));
|
|
18
|
+
}
|
|
19
|
+
if (!data || data.length === 0) {
|
|
20
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsx("h3", { className: "text-lg font-semibold", children: "Utilisation par mod\u00E8le" }) }), _jsx(CardBody, { children: _jsx("div", { className: "flex items-center justify-center h-64 text-gray-500", children: "Aucune donn\u00E9e d'utilisation" }) })] }));
|
|
21
|
+
}
|
|
22
|
+
// Sort by tokens descending and take top 10
|
|
23
|
+
const topData = [...data].sort((a, b) => b.tokens - a.tokens).slice(0, 10);
|
|
24
|
+
return (_jsxs(Card, { children: [_jsx(CardHeader, { children: _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold", children: "Utilisation par mod\u00E8le" }), _jsx("p", { className: "text-xs text-gray-500", children: "Top 10 des mod\u00E8les les plus utilis\u00E9s" })] }) }), _jsxs(CardBody, { children: [_jsx(ResponsiveContainer, { width: "100%", height: 300, children: _jsxs(BarChart, { data: topData, margin: { top: 5, right: 30, left: 20, bottom: 5 }, children: [_jsx(XAxis, { dataKey: "model", tick: { fontSize: 12 }, angle: -45, textAnchor: "end", height: 80 }), _jsx(YAxis, { tick: { fontSize: 12 }, tickFormatter: (value) => {
|
|
25
|
+
return `$${value.toFixed(2)}`;
|
|
26
|
+
} }), _jsx(Tooltip, { formatter: (value, name) => {
|
|
27
|
+
if (name === "tokens") {
|
|
28
|
+
return [`$${value.toFixed(3)}`, "Coût"];
|
|
29
|
+
}
|
|
30
|
+
return [value, name];
|
|
31
|
+
}, labelFormatter: (label) => `Modèle: ${label}` }), _jsx(Bar, { dataKey: "tokens", radius: [8, 8, 0, 0], children: topData.map((entry, index) => (_jsx(Cell, { fill: COLORS[index % COLORS.length] }, `cell-${index}`))) })] }) }), _jsx("div", { className: "mt-4 grid grid-cols-2 md:grid-cols-5 gap-2", children: topData.slice(0, 5).map((item, index) => (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "w-3 h-3 rounded-full", style: { backgroundColor: COLORS[index % COLORS.length] } }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("p", { className: "text-xs font-medium truncate", children: item.model }), _jsxs("p", { className: "text-xs text-gray-500", children: [item.calls, " calls"] })] })] }, item.model))) })] })] }));
|
|
32
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
interface WalletStatusCardProps {
|
|
2
|
+
walletSellValueUsd: number;
|
|
3
|
+
percentRemaining: number;
|
|
4
|
+
status: "ok" | "warning" | "critical";
|
|
5
|
+
loading?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function WalletStatusCard({ walletSellValueUsd, percentRemaining, status, loading, }: WalletStatusCardProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=WalletStatusCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletStatusCard.d.ts","sourceRoot":"","sources":["../../../../src/web/auth/components/WalletStatusCard.tsx"],"names":[],"mappings":"AAUA,UAAU,qBAAqB;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,kBAAkB,EAClB,gBAAgB,EAChB,MAAM,EACN,OAAO,GACR,EAAE,qBAAqB,2CAyHvB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wallet Status Card - Affiche l'état du wallet avec barre de progression
|
|
3
|
+
*/
|
|
4
|
+
"use client";
|
|
5
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { Card, CardHeader, CardBody, Alert, Spinner } from "@lastbrain/ui";
|
|
7
|
+
import { AlertCircle, Wallet } from "lucide-react";
|
|
8
|
+
import { PurchaseButton } from "./PurchaseButton";
|
|
9
|
+
import { useModuleTranslation } from "@lastbrain/core";
|
|
10
|
+
export function WalletStatusCard({ walletSellValueUsd, percentRemaining, status, loading, }) {
|
|
11
|
+
const t = useModuleTranslation("ai");
|
|
12
|
+
const getColorClass = (percent) => {
|
|
13
|
+
if (percent > 50)
|
|
14
|
+
return "text-green-600 dark:text-green-400";
|
|
15
|
+
if (percent > 25)
|
|
16
|
+
return "text-orange-500 dark:text-orange-400";
|
|
17
|
+
return "text-red-600 dark:text-red-400";
|
|
18
|
+
};
|
|
19
|
+
const getProgressBarColor = (percent) => {
|
|
20
|
+
if (percent > 50)
|
|
21
|
+
return "bg-green-500";
|
|
22
|
+
if (percent > 25)
|
|
23
|
+
return "bg-orange-500";
|
|
24
|
+
return "bg-red-500";
|
|
25
|
+
};
|
|
26
|
+
const getStatusLabel = (status) => {
|
|
27
|
+
switch (status) {
|
|
28
|
+
case "ok":
|
|
29
|
+
return t("wallet.status.ok") || "Crédit suffisant";
|
|
30
|
+
case "warning":
|
|
31
|
+
return t("wallet.status.warning") || "Attention : crédit faible";
|
|
32
|
+
case "critical":
|
|
33
|
+
return t("wallet.status.critical") || "Crédit critique";
|
|
34
|
+
default:
|
|
35
|
+
return "";
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
if (loading) {
|
|
39
|
+
return (_jsx(Card, { children: _jsx(CardBody, { className: "flex justify-center items-center py-12", children: _jsx(Spinner, { size: "lg" }) }) }));
|
|
40
|
+
}
|
|
41
|
+
return (_jsxs(Card, { className: "border-2 border-primary/20", children: [_jsx(CardHeader, { children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(Wallet, { size: 28, className: "text-primary" }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-bold", children: t("wallet.title") || "Crédits IA restants" }), _jsx("p", { className: "text-sm text-gray-500", children: getStatusLabel(status) })] })] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("div", { className: "flex justify-between items-baseline", children: [_jsxs("span", { className: "text-4xl font-bold text-primary", children: ["$", walletSellValueUsd?.toFixed(2)] }), _jsxs("span", { className: `text-xl font-semibold ${getColorClass(percentRemaining)}`, children: [percentRemaining?.toFixed(1), "%"] })] }), _jsxs("div", { children: [_jsx("div", { className: "w-full bg-gray-200 dark:bg-gray-700 rounded-full h-4 overflow-hidden", children: _jsx("div", { className: `h-4 rounded-full transition-all duration-500 ${getProgressBarColor(percentRemaining)}`, style: {
|
|
42
|
+
width: `${Math.max(0, Math.min(100, percentRemaining))}%`,
|
|
43
|
+
} }) }), _jsx("p", { className: "text-xs text-gray-500 mt-1", children: "Sur votre cr\u00E9dit initial" })] }), percentRemaining < 25 && (_jsx(Alert, { color: status === "critical" ? "danger" : "warning", className: "mt-4", children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx(AlertCircle, { size: 20, className: "mt-0.5 flex-shrink-0" }), _jsxs("div", { className: "flex-1", children: [_jsx("p", { className: "font-semibold text-sm", children: status === "critical"
|
|
44
|
+
? t("wallet.alert.critical.title") ||
|
|
45
|
+
"Vos crédits sont presque épuisés"
|
|
46
|
+
: t("wallet.alert.warning.title") ||
|
|
47
|
+
"Vos crédits sont faibles" }), _jsx("p", { className: "text-xs mt-1", children: t("wallet.alert.message") ||
|
|
48
|
+
"Rechargez maintenant pour continuer à utiliser nos services IA sans interruption." }), _jsx(PurchaseButton, { className: "mt-3" })] })] }) })), percentRemaining >= 25 && (_jsx("div", { className: "p-3 bg-blue-50 dark:bg-blue-950 rounded-lg", children: _jsxs("p", { className: "text-xs text-gray-600 dark:text-gray-400", children: ["\uD83D\uDCA1 ", _jsx("strong", { children: t("wallet.tip.prefix") || "Astuce :" }), " ", t("wallet.tip.text") ||
|
|
49
|
+
"Avec ce crédit, vous pouvez encore générer environ", " ", _jsx("strong", { children: Math.floor(walletSellValueUsd / 0.1) }), " ", t("wallet.tip.recipes") || "recettes complètes", " ", t("wallet.tip.or") || "ou", " ", _jsx("strong", { children: Math.floor(walletSellValueUsd / 0.1) }), " ", t("wallet.tip.images") || "images", "."] }) }))] })] }));
|
|
50
|
+
}
|
|
@@ -22,9 +22,11 @@ export interface ImageGenerativeProps {
|
|
|
22
22
|
description?: string;
|
|
23
23
|
defaultStyle?: string;
|
|
24
24
|
hideStyleEditor?: boolean;
|
|
25
|
+
hideModelSelector?: boolean;
|
|
25
26
|
uploadPath?: string;
|
|
26
27
|
preview?: boolean;
|
|
27
28
|
inline?: boolean;
|
|
29
|
+
autoGenerate?: boolean;
|
|
28
30
|
}
|
|
29
|
-
export declare function ImageGenerative({ defaultPrompt, model, size, quality, onChange, onError, className, disabled, apiEndpoint, showTokenBalance, label, description, defaultStyle, hideStyleEditor, uploadPath, preview, inline, }: ImageGenerativeProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export declare function ImageGenerative({ defaultPrompt, model, size, quality, onChange, onError, className, disabled, apiEndpoint, showTokenBalance, label, description, defaultStyle, hideStyleEditor, hideModelSelector, uploadPath, preview, inline, autoGenerate, }: ImageGenerativeProps): import("react/jsx-runtime").JSX.Element;
|
|
30
32
|
//# sourceMappingURL=ImageGenerative.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageGenerative.d.ts","sourceRoot":"","sources":["../../../src/web/components/ImageGenerative.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ImageGenerative.d.ts","sourceRoot":"","sources":["../../../src/web/components/ImageGenerative.tsx"],"names":[],"mappings":"AA8BA,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAsID,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;IACvE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,CACT,gBAAgB,EAAE,MAAM,EACxB,QAAQ,CAAC,EAAE,uBAAuB,KAC/B,IAAI,CAAC;IACV,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,EAC9B,aAAkB,EAClB,KAAK,EACL,IAAkB,EAClB,OAAoB,EACpB,QAAQ,EACR,OAAO,EACP,SAAS,EACT,QAAgB,EAChB,WAAsC,EACtC,gBAAuB,EACvB,KAAK,EACL,WAAW,EACX,YAA0B,EAC1B,eAAuB,EACvB,iBAAyB,EACzB,UAAU,EACV,OAAc,EACd,MAAc,EACd,YAAoB,GACrB,EAAE,oBAAoB,2CAgvBtB"}
|