@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,30 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
/**
|
|
3
|
+
* POST /api/ai/admin/wallet-repair
|
|
4
|
+
* Repair wallets that have tokens but 0 USD budget
|
|
5
|
+
* Query params:
|
|
6
|
+
* - userId: repair specific user (optional)
|
|
7
|
+
* - all: repair all wallets (optional)
|
|
8
|
+
*/
|
|
9
|
+
export declare function POST(request: Request): Promise<NextResponse<{
|
|
10
|
+
success: boolean;
|
|
11
|
+
userId: string;
|
|
12
|
+
before: {
|
|
13
|
+
balance: number;
|
|
14
|
+
providerBudget: number;
|
|
15
|
+
sellValue: number;
|
|
16
|
+
} | undefined;
|
|
17
|
+
after: {
|
|
18
|
+
balance: number;
|
|
19
|
+
providerBudget: number;
|
|
20
|
+
sellValue: number;
|
|
21
|
+
} | undefined;
|
|
22
|
+
}> | NextResponse<{
|
|
23
|
+
success: boolean;
|
|
24
|
+
repaired: number;
|
|
25
|
+
failed: number;
|
|
26
|
+
errors: string[];
|
|
27
|
+
}> | NextResponse<{
|
|
28
|
+
error: any;
|
|
29
|
+
}>>;
|
|
30
|
+
//# sourceMappingURL=route.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../src/api/admin/wallet-repair/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAS3C;;;;;;GAMG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;IAgE1C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { NextResponse } from "next/server";
|
|
2
|
+
import { getSupabaseServerClient } from "@lastbrain/core/server";
|
|
3
|
+
import { repairUserWallet, repairAllWallets, } from "../../../server/wallet-repair";
|
|
4
|
+
import { logger } from "@lastbrain/core";
|
|
5
|
+
/**
|
|
6
|
+
* POST /api/ai/admin/wallet-repair
|
|
7
|
+
* Repair wallets that have tokens but 0 USD budget
|
|
8
|
+
* Query params:
|
|
9
|
+
* - userId: repair specific user (optional)
|
|
10
|
+
* - all: repair all wallets (optional)
|
|
11
|
+
*/
|
|
12
|
+
export async function POST(request) {
|
|
13
|
+
try {
|
|
14
|
+
// 1. Check admin auth
|
|
15
|
+
const supabase = await getSupabaseServerClient();
|
|
16
|
+
const { data: { user }, error: authError, } = await supabase.auth.getUser();
|
|
17
|
+
if (authError || !user) {
|
|
18
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
19
|
+
}
|
|
20
|
+
// TODO: Check if user is admin (for now, any authenticated user can repair)
|
|
21
|
+
// const isAdmin = await checkAdminRole(user.id);
|
|
22
|
+
// if (!isAdmin) {
|
|
23
|
+
// return NextResponse.json({ error: "Forbidden" }, { status: 403 });
|
|
24
|
+
// }
|
|
25
|
+
// 2. Parse request
|
|
26
|
+
const { searchParams } = new URL(request.url);
|
|
27
|
+
const userId = searchParams.get("userId");
|
|
28
|
+
const all = searchParams.get("all") === "true";
|
|
29
|
+
if (!userId && !all) {
|
|
30
|
+
return NextResponse.json({ error: "Missing userId or all=true parameter" }, { status: 400 });
|
|
31
|
+
}
|
|
32
|
+
// 3. Repair wallet(s)
|
|
33
|
+
if (userId) {
|
|
34
|
+
logger.info(`[wallet-repair] Repairing wallet for user ${userId}`);
|
|
35
|
+
const result = await repairUserWallet(userId);
|
|
36
|
+
if (result.success) {
|
|
37
|
+
return NextResponse.json({
|
|
38
|
+
success: true,
|
|
39
|
+
userId,
|
|
40
|
+
before: result.before,
|
|
41
|
+
after: result.after,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return NextResponse.json({ error: result.error }, { status: 500 });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
logger.info("[wallet-repair] Repairing all wallets");
|
|
50
|
+
const result = await repairAllWallets();
|
|
51
|
+
return NextResponse.json({
|
|
52
|
+
success: true,
|
|
53
|
+
repaired: result.repaired,
|
|
54
|
+
failed: result.failed,
|
|
55
|
+
errors: result.errors,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
logger.error("[wallet-repair] Error:", error);
|
|
61
|
+
return NextResponse.json({ error: error.message || "Wallet repair failed" }, { status: 500 });
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/auth/ai-model-settings
|
|
3
|
+
* Update user's enabled AI models settings
|
|
4
|
+
*/
|
|
5
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
6
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
7
|
+
success: boolean;
|
|
8
|
+
enabled_models: any;
|
|
9
|
+
}> | NextResponse<{
|
|
10
|
+
error: any;
|
|
11
|
+
}>>;
|
|
12
|
+
/**
|
|
13
|
+
* GET /api/auth/ai-model-settings
|
|
14
|
+
* Get user's enabled models settings
|
|
15
|
+
*/
|
|
16
|
+
export declare function GET(request: NextRequest): Promise<NextResponse<{
|
|
17
|
+
enabled_models: any;
|
|
18
|
+
}> | NextResponse<{
|
|
19
|
+
error: any;
|
|
20
|
+
}>>;
|
|
21
|
+
//# sourceMappingURL=ai-model-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-model-settings.d.ts","sourceRoot":"","sources":["../../../src/api/auth/ai-model-settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;IA4E9C;AAED;;;GAGG;AACH,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;IAyC7C"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POST /api/auth/ai-model-settings
|
|
3
|
+
* Update user's enabled AI models settings
|
|
4
|
+
*/
|
|
5
|
+
import { NextResponse } from "next/server";
|
|
6
|
+
import { getSupabaseServerClient } from "@lastbrain/core/server";
|
|
7
|
+
import { logger } from "@lastbrain/core";
|
|
8
|
+
export async function POST(request) {
|
|
9
|
+
try {
|
|
10
|
+
const supabase = await getSupabaseServerClient();
|
|
11
|
+
// Get current user
|
|
12
|
+
const { data: { user }, error: userError, } = await supabase.auth.getUser();
|
|
13
|
+
if (userError || !user) {
|
|
14
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
15
|
+
}
|
|
16
|
+
// Parse request body
|
|
17
|
+
const body = await request.json();
|
|
18
|
+
const { enabled_models, enabled_providers } = body;
|
|
19
|
+
// Validate input
|
|
20
|
+
if (!Array.isArray(enabled_models)) {
|
|
21
|
+
return NextResponse.json({ error: "enabled_models must be an array" }, { status: 400 });
|
|
22
|
+
}
|
|
23
|
+
if (enabled_providers !== undefined &&
|
|
24
|
+
enabled_providers !== null &&
|
|
25
|
+
!Array.isArray(enabled_providers)) {
|
|
26
|
+
return NextResponse.json({ error: "enabled_providers must be an array or null" }, { status: 400 });
|
|
27
|
+
}
|
|
28
|
+
// Upsert settings in user_ai_settings.allowed_models
|
|
29
|
+
const { data, error } = await supabase
|
|
30
|
+
.from("user_ai_settings")
|
|
31
|
+
.upsert({
|
|
32
|
+
owner_id: user.id,
|
|
33
|
+
allowed_models: enabled_models,
|
|
34
|
+
updated_at: new Date().toISOString(),
|
|
35
|
+
}, {
|
|
36
|
+
onConflict: "owner_id",
|
|
37
|
+
})
|
|
38
|
+
.select()
|
|
39
|
+
.single();
|
|
40
|
+
if (error) {
|
|
41
|
+
logger.error("[ai-model-settings] Error upserting settings:", error);
|
|
42
|
+
return NextResponse.json({ error: "Failed to update settings" }, { status: 500 });
|
|
43
|
+
}
|
|
44
|
+
logger.info(`[ai-model-settings] Updated for user ${user.id}: ${enabled_models.length} models`);
|
|
45
|
+
return NextResponse.json({
|
|
46
|
+
success: true,
|
|
47
|
+
enabled_models: data.allowed_models || [],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.error("[ai-model-settings] Error:", error);
|
|
52
|
+
return NextResponse.json({ error: error.message || "Internal server error" }, { status: 500 });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* GET /api/auth/ai-model-settings
|
|
57
|
+
* Get user's enabled models settings
|
|
58
|
+
*/
|
|
59
|
+
export async function GET(request) {
|
|
60
|
+
try {
|
|
61
|
+
const supabase = await getSupabaseServerClient();
|
|
62
|
+
const { data: { user }, error: userError, } = await supabase.auth.getUser();
|
|
63
|
+
if (userError || !user) {
|
|
64
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
65
|
+
}
|
|
66
|
+
// Fetch settings from user_ai_settings
|
|
67
|
+
const { data: settings, error } = await supabase
|
|
68
|
+
.from("user_ai_settings")
|
|
69
|
+
.select("allowed_models")
|
|
70
|
+
.eq("owner_id", user.id)
|
|
71
|
+
.single();
|
|
72
|
+
if (error && error.code !== "PGRST116") {
|
|
73
|
+
logger.error("[ai-model-settings] Error fetching:", error);
|
|
74
|
+
return NextResponse.json({ error: "Failed to fetch settings" }, { status: 500 });
|
|
75
|
+
}
|
|
76
|
+
// Return allowed_models array
|
|
77
|
+
const result = {
|
|
78
|
+
enabled_models: settings?.allowed_models || [],
|
|
79
|
+
};
|
|
80
|
+
return NextResponse.json(result);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
logger.error("[ai-model-settings] Error:", error);
|
|
84
|
+
return NextResponse.json({ error: error.message || "Internal server error" }, { status: 500 });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth API for user_ai_settings
|
|
3
|
+
* GET /api/ai/auth/ai-settings - Get user settings
|
|
4
|
+
* PUT /api/ai/auth/ai-settings - Update user settings
|
|
5
|
+
*/
|
|
6
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
7
|
+
export declare function GET(request: NextRequest): Promise<NextResponse<{
|
|
8
|
+
data: any;
|
|
9
|
+
}> | NextResponse<{
|
|
10
|
+
error: any;
|
|
11
|
+
}>>;
|
|
12
|
+
export declare function PUT(request: NextRequest): Promise<NextResponse<{
|
|
13
|
+
data: any;
|
|
14
|
+
}> | NextResponse<{
|
|
15
|
+
error: any;
|
|
16
|
+
}>>;
|
|
17
|
+
//# sourceMappingURL=ai-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-settings.d.ts","sourceRoot":"","sources":["../../../src/api/auth/ai-settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAcxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;IA2C7C;AAED,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;IA8C7C"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth API for user_ai_settings
|
|
3
|
+
* GET /api/ai/auth/ai-settings - Get user settings
|
|
4
|
+
* PUT /api/ai/auth/ai-settings - Update user settings
|
|
5
|
+
*/
|
|
6
|
+
import { NextResponse } from "next/server";
|
|
7
|
+
import { getSupabaseServerClient } from "@lastbrain/core/server";
|
|
8
|
+
import { logger } from "@lastbrain/core";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
const SettingsSchema = z.object({
|
|
11
|
+
mode: z.enum(["auto", "manual"]),
|
|
12
|
+
default_text_provider: z.string().nullable().optional(),
|
|
13
|
+
default_text_model: z.string().nullable().optional(),
|
|
14
|
+
default_image_provider: z.string().nullable().optional(),
|
|
15
|
+
default_image_model: z.string().nullable().optional(),
|
|
16
|
+
max_tokens_per_call: z.number().int().nullable().optional(),
|
|
17
|
+
});
|
|
18
|
+
export async function GET(request) {
|
|
19
|
+
try {
|
|
20
|
+
const supabase = await getSupabaseServerClient();
|
|
21
|
+
const { data: { user }, } = await supabase.auth.getUser();
|
|
22
|
+
if (!user) {
|
|
23
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
24
|
+
}
|
|
25
|
+
const { data, error } = await supabase
|
|
26
|
+
.from("user_ai_settings")
|
|
27
|
+
.select("*")
|
|
28
|
+
.eq("owner_id", user.id)
|
|
29
|
+
.single();
|
|
30
|
+
if (error && error.code !== "PGRST116") {
|
|
31
|
+
logger.error("[ai-settings] Error fetching settings", error);
|
|
32
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
33
|
+
}
|
|
34
|
+
// Return default settings if none exist
|
|
35
|
+
if (!data) {
|
|
36
|
+
return NextResponse.json({
|
|
37
|
+
data: {
|
|
38
|
+
owner_id: user.id,
|
|
39
|
+
mode: "auto",
|
|
40
|
+
default_text_provider: null,
|
|
41
|
+
default_text_model: null,
|
|
42
|
+
default_image_provider: null,
|
|
43
|
+
default_image_model: null,
|
|
44
|
+
max_tokens_per_call: null,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return NextResponse.json({ data });
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
logger.error("[ai-settings] Unexpected error", error);
|
|
52
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export async function PUT(request) {
|
|
56
|
+
try {
|
|
57
|
+
const supabase = await getSupabaseServerClient();
|
|
58
|
+
const { data: { user }, } = await supabase.auth.getUser();
|
|
59
|
+
if (!user) {
|
|
60
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
61
|
+
}
|
|
62
|
+
const body = await request.json();
|
|
63
|
+
const validation = SettingsSchema.safeParse(body);
|
|
64
|
+
if (!validation.success) {
|
|
65
|
+
return NextResponse.json({ error: validation.error.errors.map((e) => e.message).join(", ") }, { status: 400 });
|
|
66
|
+
}
|
|
67
|
+
const { data, error } = await supabase
|
|
68
|
+
.from("user_ai_settings")
|
|
69
|
+
.upsert({
|
|
70
|
+
owner_id: user.id,
|
|
71
|
+
...validation.data,
|
|
72
|
+
}, {
|
|
73
|
+
onConflict: "owner_id",
|
|
74
|
+
})
|
|
75
|
+
.select()
|
|
76
|
+
.single();
|
|
77
|
+
if (error) {
|
|
78
|
+
logger.error("[ai-settings] Error saving settings", error);
|
|
79
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
80
|
+
}
|
|
81
|
+
return NextResponse.json({ data });
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
logger.error("[ai-settings] Unexpected error", error);
|
|
85
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth API for single api_key operations
|
|
3
|
+
* DELETE /api/ai/auth/api-keys/[id] - Revoke/delete API key
|
|
4
|
+
* DELETE /api/ai/auth/api-keys/[id]?permanent=true - Permanently delete API key
|
|
5
|
+
*/
|
|
6
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
7
|
+
export declare function DELETE(request: NextRequest, { params }: {
|
|
8
|
+
params: Promise<{
|
|
9
|
+
id: string;
|
|
10
|
+
}>;
|
|
11
|
+
}): Promise<NextResponse<{
|
|
12
|
+
success: boolean;
|
|
13
|
+
message: string;
|
|
14
|
+
}> | NextResponse<{
|
|
15
|
+
error: any;
|
|
16
|
+
}>>;
|
|
17
|
+
//# sourceMappingURL=%5Bid%5D.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"[id].d.ts","sourceRoot":"","sources":["../../../../src/api/auth/api-keys/[id].ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;;;IA6EhD"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth API for single api_key operations
|
|
3
|
+
* DELETE /api/ai/auth/api-keys/[id] - Revoke/delete API key
|
|
4
|
+
* DELETE /api/ai/auth/api-keys/[id]?permanent=true - Permanently delete API key
|
|
5
|
+
*/
|
|
6
|
+
import { NextResponse } from "next/server";
|
|
7
|
+
import { getSupabaseServerClient } from "@lastbrain/core/server";
|
|
8
|
+
import { logger } from "@lastbrain/core";
|
|
9
|
+
export async function DELETE(request, { params }) {
|
|
10
|
+
try {
|
|
11
|
+
const { id } = await params;
|
|
12
|
+
const supabase = await getSupabaseServerClient();
|
|
13
|
+
const { searchParams } = new URL(request.url);
|
|
14
|
+
const permanent = searchParams.get("permanent") === "true";
|
|
15
|
+
const { data: { user }, } = await supabase.auth.getUser();
|
|
16
|
+
if (!user) {
|
|
17
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
18
|
+
}
|
|
19
|
+
// Verify ownership before deleting
|
|
20
|
+
const { data: apiKey, error: fetchError } = await supabase
|
|
21
|
+
.from("api_keys")
|
|
22
|
+
.select("owner_id, is_active")
|
|
23
|
+
.eq("id", id)
|
|
24
|
+
.single();
|
|
25
|
+
if (fetchError || !apiKey) {
|
|
26
|
+
return NextResponse.json({ error: "API key not found" }, { status: 404 });
|
|
27
|
+
}
|
|
28
|
+
if (apiKey.owner_id !== user.id) {
|
|
29
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 403 });
|
|
30
|
+
}
|
|
31
|
+
// Permanent delete only allowed for inactive keys
|
|
32
|
+
if (permanent) {
|
|
33
|
+
if (apiKey.is_active) {
|
|
34
|
+
return NextResponse.json({ error: "Cannot delete active API key. Revoke it first." }, { status: 400 });
|
|
35
|
+
}
|
|
36
|
+
const { error: deleteError } = await supabase
|
|
37
|
+
.from("api_keys")
|
|
38
|
+
.delete()
|
|
39
|
+
.eq("id", id);
|
|
40
|
+
if (deleteError) {
|
|
41
|
+
logger.error("[api-keys] Error deleting key", deleteError);
|
|
42
|
+
return NextResponse.json({ error: deleteError.message }, { status: 500 });
|
|
43
|
+
}
|
|
44
|
+
logger.info("[api-keys] Permanently deleted key", { id });
|
|
45
|
+
return NextResponse.json({
|
|
46
|
+
success: true,
|
|
47
|
+
message: "API key permanently deleted",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Soft delete (set is_active = false)
|
|
51
|
+
const { error: updateError } = await supabase
|
|
52
|
+
.from("api_keys")
|
|
53
|
+
.update({ is_active: false })
|
|
54
|
+
.eq("id", id);
|
|
55
|
+
if (updateError) {
|
|
56
|
+
logger.error("[api-keys] Error revoking key", updateError);
|
|
57
|
+
return NextResponse.json({ error: updateError.message }, { status: 500 });
|
|
58
|
+
}
|
|
59
|
+
logger.info("[api-keys] Revoked key", { id });
|
|
60
|
+
return NextResponse.json({ success: true, message: "API key revoked" });
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger.error("[api-keys] Unexpected error", error);
|
|
64
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth API for api_keys CRUD
|
|
3
|
+
* GET /api/ai/auth/api-keys - List user's API keys
|
|
4
|
+
* POST /api/ai/auth/api-keys - Create new API key
|
|
5
|
+
*/
|
|
6
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
7
|
+
export declare function GET(request: NextRequest): Promise<NextResponse<{
|
|
8
|
+
data: any[];
|
|
9
|
+
}> | NextResponse<{
|
|
10
|
+
error: any;
|
|
11
|
+
}>>;
|
|
12
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
13
|
+
data: any;
|
|
14
|
+
api_key: string;
|
|
15
|
+
message: string;
|
|
16
|
+
}> | NextResponse<{
|
|
17
|
+
error: any;
|
|
18
|
+
}>>;
|
|
19
|
+
//# sourceMappingURL=api-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../src/api/auth/api-keys.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwBxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;IA4B7C;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;IAwD9C"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth API for api_keys CRUD
|
|
3
|
+
* GET /api/ai/auth/api-keys - List user's API keys
|
|
4
|
+
* POST /api/ai/auth/api-keys - Create new API key
|
|
5
|
+
*/
|
|
6
|
+
import { NextResponse } from "next/server";
|
|
7
|
+
import { getSupabaseServerClient } from "@lastbrain/core/server";
|
|
8
|
+
import { logger } from "@lastbrain/core";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { randomBytes, createHash } from "crypto";
|
|
11
|
+
const ApiKeySchema = z.object({
|
|
12
|
+
name: z.string().min(1).max(200),
|
|
13
|
+
env: z.enum(["dev", "prod"]),
|
|
14
|
+
scopes: z.array(z.string()),
|
|
15
|
+
rate_limit_rpm: z.number().int().min(1).max(1000),
|
|
16
|
+
daily_token_limit: z.number().int().nullable().optional(),
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Generate a random API key
|
|
20
|
+
*/
|
|
21
|
+
function generateApiKey() {
|
|
22
|
+
const key = `lb_${randomBytes(32).toString("hex")}`;
|
|
23
|
+
const prefix = key.substring(0, 10);
|
|
24
|
+
const hash = createHash("sha256").update(key).digest("hex");
|
|
25
|
+
return { key, prefix, hash };
|
|
26
|
+
}
|
|
27
|
+
export async function GET(request) {
|
|
28
|
+
try {
|
|
29
|
+
const supabase = await getSupabaseServerClient();
|
|
30
|
+
const { data: { user }, } = await supabase.auth.getUser();
|
|
31
|
+
if (!user) {
|
|
32
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
33
|
+
}
|
|
34
|
+
const { data, error } = await supabase
|
|
35
|
+
.from("api_keys")
|
|
36
|
+
.select("*")
|
|
37
|
+
.eq("owner_id", user.id)
|
|
38
|
+
.order("created_at", { ascending: false });
|
|
39
|
+
if (error) {
|
|
40
|
+
logger.error("[api-keys] Error fetching keys", error);
|
|
41
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
42
|
+
}
|
|
43
|
+
return NextResponse.json({ data });
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
logger.error("[api-keys] Unexpected error", error);
|
|
47
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function POST(request) {
|
|
51
|
+
try {
|
|
52
|
+
const supabase = await getSupabaseServerClient();
|
|
53
|
+
const { data: { user }, } = await supabase.auth.getUser();
|
|
54
|
+
if (!user) {
|
|
55
|
+
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
|
|
56
|
+
}
|
|
57
|
+
const body = await request.json();
|
|
58
|
+
const validation = ApiKeySchema.safeParse(body);
|
|
59
|
+
if (!validation.success) {
|
|
60
|
+
return NextResponse.json({ error: validation.error.errors.map((e) => e.message).join(", ") }, { status: 400 });
|
|
61
|
+
}
|
|
62
|
+
// Generate new API key
|
|
63
|
+
const { key: rawKey, prefix, hash } = generateApiKey();
|
|
64
|
+
const { data, error } = await supabase
|
|
65
|
+
.from("api_keys")
|
|
66
|
+
.insert({
|
|
67
|
+
owner_id: user.id,
|
|
68
|
+
name: validation.data.name,
|
|
69
|
+
key_hash: hash,
|
|
70
|
+
prefix,
|
|
71
|
+
env: validation.data.env,
|
|
72
|
+
scopes: validation.data.scopes,
|
|
73
|
+
rate_limit_rpm: validation.data.rate_limit_rpm,
|
|
74
|
+
daily_token_limit: validation.data.daily_token_limit || null,
|
|
75
|
+
is_active: true,
|
|
76
|
+
})
|
|
77
|
+
.select()
|
|
78
|
+
.single();
|
|
79
|
+
if (error) {
|
|
80
|
+
logger.error("[api-keys] Error creating key", error);
|
|
81
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
82
|
+
}
|
|
83
|
+
// Return the raw key (ONLY TIME IT'S SHOWN)
|
|
84
|
+
return NextResponse.json({
|
|
85
|
+
data,
|
|
86
|
+
api_key: rawKey,
|
|
87
|
+
message: "Store this key securely. It will not be shown again.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
logger.error("[api-keys] Unexpected error", error);
|
|
92
|
+
return NextResponse.json({ error: error.message }, { status: 500 });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -16,7 +16,7 @@ export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
|
16
16
|
}> | NextResponse<{
|
|
17
17
|
url: string;
|
|
18
18
|
sessionId: string;
|
|
19
|
-
paymentId: string;
|
|
19
|
+
paymentId: string | null;
|
|
20
20
|
}>>;
|
|
21
21
|
/**
|
|
22
22
|
* GET /api/ai/create-checkout - Get available token packs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-checkout.d.ts","sourceRoot":"","sources":["../../../src/api/auth/create-checkout.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"create-checkout.d.ts","sourceRoot":"","sources":["../../../src/api/auth/create-checkout.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD;;;;;;;;;;;GAWG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;IAuE9C;AAED;;;;GAIG;AACH,wBAAsB,GAAG;;;;IAuBxB"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// ============================================================================
|
|
6
6
|
import { NextResponse } from "next/server";
|
|
7
7
|
import { getSupabaseServerClient } from "@lastbrain/core/server";
|
|
8
|
+
import { logger } from "@lastbrain/core";
|
|
8
9
|
/**
|
|
9
10
|
* POST /api/ai/create-checkout
|
|
10
11
|
*
|
|
@@ -34,7 +35,7 @@ export async function POST(request) {
|
|
|
34
35
|
// Validate environment
|
|
35
36
|
const frontendUrl = process.env.FRONTEND_URL || process.env.NEXT_PUBLIC_APP_URL;
|
|
36
37
|
if (!frontendUrl) {
|
|
37
|
-
|
|
38
|
+
logger.error("FRONTEND_URL or NEXT_PUBLIC_APP_URL not set");
|
|
38
39
|
return NextResponse.json({ error: "Configuration serveur manquante" }, { status: 500 });
|
|
39
40
|
}
|
|
40
41
|
// Import central payment service dynamically to avoid circular deps
|
|
@@ -49,9 +50,10 @@ export async function POST(request) {
|
|
|
49
50
|
user_id: user.id,
|
|
50
51
|
resourceType: "token_packs",
|
|
51
52
|
resourceId: token_pack_id,
|
|
52
|
-
successPath: "/auth/ai/
|
|
53
|
-
cancelPath: "/auth/ai/
|
|
53
|
+
successPath: "/auth/ai/tokens?success=true",
|
|
54
|
+
cancelPath: "/auth/ai/tokens?cancelled=true",
|
|
54
55
|
description: "Achat de tokens IA",
|
|
56
|
+
email: user.email, // Pass email to link to existing Stripe customer
|
|
55
57
|
});
|
|
56
58
|
return NextResponse.json({
|
|
57
59
|
url: result.url,
|
|
@@ -60,7 +62,7 @@ export async function POST(request) {
|
|
|
60
62
|
});
|
|
61
63
|
}
|
|
62
64
|
catch (error) {
|
|
63
|
-
|
|
65
|
+
logger.error("[POST /api/ai/create-checkout] Error:", error);
|
|
64
66
|
const message = error instanceof Error
|
|
65
67
|
? error.message
|
|
66
68
|
: "Erreur lors de la création du paiement";
|
|
@@ -81,13 +83,13 @@ export async function GET() {
|
|
|
81
83
|
.eq("is_active", true)
|
|
82
84
|
.order("sort_order", { ascending: true });
|
|
83
85
|
if (error) {
|
|
84
|
-
|
|
86
|
+
logger.error("[GET /api/ai/create-checkout] Error:", error);
|
|
85
87
|
return NextResponse.json({ error: "Erreur lors de la récupération des packs" }, { status: 500 });
|
|
86
88
|
}
|
|
87
89
|
return NextResponse.json({ packs: packs || [] });
|
|
88
90
|
}
|
|
89
91
|
catch (error) {
|
|
90
|
-
|
|
92
|
+
logger.error("[GET /api/ai/create-checkout] Error:", error);
|
|
91
93
|
return NextResponse.json({ error: "Erreur serveur" }, { status: 500 });
|
|
92
94
|
}
|
|
93
95
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { NextRequest, NextResponse } from "next/server";
|
|
2
2
|
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
3
|
-
error: string;
|
|
3
|
+
error: string | undefined;
|
|
4
4
|
}> | NextResponse<{
|
|
5
5
|
imageUrl: string;
|
|
6
6
|
supabaseImageUrl: string | null;
|
|
7
|
+
model: string;
|
|
7
8
|
tokensUsed: number;
|
|
8
9
|
tokensRemaining: number;
|
|
9
|
-
model: "dall-e-3" | "dall-e-2";
|
|
10
10
|
}>>;
|
|
11
11
|
//# sourceMappingURL=generate-image.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-image.d.ts","sourceRoot":"","sources":["../../../src/api/auth/generate-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-image.d.ts","sourceRoot":"","sources":["../../../src/api/auth/generate-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA0BxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;;;IA+kB9C"}
|