@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.
Files changed (365) hide show
  1. package/README.md +52 -1
  2. package/dist/ai.build.config.d.ts.map +1 -1
  3. package/dist/ai.build.config.js +508 -9
  4. package/dist/api/admin/ai-provider-models/[id].d.ts +18 -0
  5. package/dist/api/admin/ai-provider-models/[id].d.ts.map +1 -0
  6. package/dist/api/admin/ai-provider-models/[id].js +58 -0
  7. package/dist/api/admin/ai-provider-models.d.ts +20 -0
  8. package/dist/api/admin/ai-provider-models.d.ts.map +1 -0
  9. package/dist/api/admin/ai-provider-models.js +26 -0
  10. package/dist/api/admin/ai-providers/[key].d.ts +18 -0
  11. package/dist/api/admin/ai-providers/[key].d.ts.map +1 -0
  12. package/dist/api/admin/ai-providers/[key].js +55 -0
  13. package/dist/api/admin/ai-providers.d.ts +20 -0
  14. package/dist/api/admin/ai-providers.d.ts.map +1 -0
  15. package/dist/api/admin/ai-providers.js +26 -0
  16. package/dist/api/admin/billing-analytics.d.ts +43 -0
  17. package/dist/api/admin/billing-analytics.d.ts.map +1 -0
  18. package/dist/api/admin/billing-analytics.js +144 -0
  19. package/dist/api/admin/global-ai-settings.d.ts +14 -0
  20. package/dist/api/admin/global-ai-settings.d.ts.map +1 -0
  21. package/dist/api/admin/global-ai-settings.js +63 -0
  22. package/dist/api/admin/token-packs/[id].d.ts.map +1 -1
  23. package/dist/api/admin/token-packs/[id].js +3 -2
  24. package/dist/api/admin/token-packs.d.ts.map +1 -1
  25. package/dist/api/admin/token-packs.js +3 -2
  26. package/dist/api/admin/user-monthly-details.d.ts +49 -0
  27. package/dist/api/admin/user-monthly-details.d.ts.map +1 -0
  28. package/dist/api/admin/user-monthly-details.js +140 -0
  29. package/dist/api/admin/user-quota.d.ts +21 -0
  30. package/dist/api/admin/user-quota.d.ts.map +1 -0
  31. package/dist/api/admin/user-quota.js +59 -0
  32. package/dist/api/admin/user-token/[id].d.ts.map +1 -1
  33. package/dist/api/admin/user-token/[id].js +2 -1
  34. package/dist/api/admin/user-token.d.ts +5 -2
  35. package/dist/api/admin/user-token.d.ts.map +1 -1
  36. package/dist/api/admin/user-token.js +91 -17
  37. package/dist/api/admin/user-usage-by-model.d.ts +22 -0
  38. package/dist/api/admin/user-usage-by-model.d.ts.map +1 -0
  39. package/dist/api/admin/user-usage-by-model.js +78 -0
  40. package/dist/api/admin/user-wallet-analytics.d.ts +15 -0
  41. package/dist/api/admin/user-wallet-analytics.d.ts.map +1 -0
  42. package/dist/api/admin/user-wallet-analytics.js +67 -0
  43. package/dist/api/admin/wallet-repair/route.d.ts +30 -0
  44. package/dist/api/admin/wallet-repair/route.d.ts.map +1 -0
  45. package/dist/api/admin/wallet-repair/route.js +63 -0
  46. package/dist/api/auth/ai-model-settings.d.ts +21 -0
  47. package/dist/api/auth/ai-model-settings.d.ts.map +1 -0
  48. package/dist/api/auth/ai-model-settings.js +86 -0
  49. package/dist/api/auth/ai-settings.d.ts +17 -0
  50. package/dist/api/auth/ai-settings.d.ts.map +1 -0
  51. package/dist/api/auth/ai-settings.js +87 -0
  52. package/dist/api/auth/api-keys/[id].d.ts +17 -0
  53. package/dist/api/auth/api-keys/[id].d.ts.map +1 -0
  54. package/dist/api/auth/api-keys/[id].js +66 -0
  55. package/dist/api/auth/api-keys.d.ts +19 -0
  56. package/dist/api/auth/api-keys.d.ts.map +1 -0
  57. package/dist/api/auth/api-keys.js +94 -0
  58. package/dist/api/auth/create-checkout.d.ts +1 -1
  59. package/dist/api/auth/create-checkout.d.ts.map +1 -1
  60. package/dist/api/auth/create-checkout.js +8 -6
  61. package/dist/api/auth/generate-image.d.ts +2 -2
  62. package/dist/api/auth/generate-image.d.ts.map +1 -1
  63. package/dist/api/auth/generate-image.js +404 -104
  64. package/dist/api/auth/generate-text.d.ts +3 -2
  65. package/dist/api/auth/generate-text.d.ts.map +1 -1
  66. package/dist/api/auth/generate-text.js +130 -58
  67. package/dist/api/auth/process-ocr.d.ts +9 -0
  68. package/dist/api/auth/process-ocr.d.ts.map +1 -0
  69. package/dist/api/auth/process-ocr.js +43 -0
  70. package/dist/api/auth/prompts/stats.d.ts +14 -0
  71. package/dist/api/auth/prompts/stats.d.ts.map +1 -0
  72. package/dist/api/auth/prompts/stats.js +46 -0
  73. package/dist/api/auth/prompts.d.ts +26 -0
  74. package/dist/api/auth/prompts.d.ts.map +1 -0
  75. package/dist/api/auth/prompts.js +175 -0
  76. package/dist/api/auth/token-balance.d.ts +26 -0
  77. package/dist/api/auth/token-balance.d.ts.map +1 -0
  78. package/dist/api/auth/token-balance.js +47 -0
  79. package/dist/api/auth/token-checkout.d.ts.map +1 -1
  80. package/dist/api/auth/token-checkout.js +22 -4
  81. package/dist/api/auth/token-packs.d.ts.map +1 -1
  82. package/dist/api/auth/token-packs.js +2 -1
  83. package/dist/api/auth/usage-by-model.d.ts +25 -0
  84. package/dist/api/auth/usage-by-model.d.ts.map +1 -0
  85. package/dist/api/auth/usage-by-model.js +95 -0
  86. package/dist/api/auth/usage.d.ts +26 -0
  87. package/dist/api/auth/usage.d.ts.map +1 -0
  88. package/dist/api/auth/usage.js +127 -0
  89. package/dist/api/auth/user-tokens.d.ts.map +1 -1
  90. package/dist/api/auth/user-tokens.js +36 -2
  91. package/dist/api/auth/wallet/route.d.ts +17 -0
  92. package/dist/api/auth/wallet/route.d.ts.map +1 -0
  93. package/dist/api/auth/wallet/route.js +68 -0
  94. package/dist/api/auth/wallet.d.ts +16 -0
  95. package/dist/api/auth/wallet.d.ts.map +1 -0
  96. package/dist/api/auth/wallet.js +71 -0
  97. package/dist/api/public/gateway-models.d.ts +25 -0
  98. package/dist/api/public/gateway-models.d.ts.map +1 -0
  99. package/dist/api/public/gateway-models.js +49 -0
  100. package/dist/api/public/pricing-summary.d.ts +46 -0
  101. package/dist/api/public/pricing-summary.d.ts.map +1 -0
  102. package/dist/api/public/pricing-summary.js +70 -0
  103. package/dist/api/public/prompts/[id]/stats.d.ts +15 -0
  104. package/dist/api/public/prompts/[id]/stats.d.ts.map +1 -0
  105. package/dist/api/public/prompts/[id]/stats.js +37 -0
  106. package/dist/api/public/prompts/[id]/view.d.ts +15 -0
  107. package/dist/api/public/prompts/[id]/view.d.ts.map +1 -0
  108. package/dist/api/public/prompts/[id]/view.js +41 -0
  109. package/dist/api/public/prompts/slug/[slug].d.ts +15 -0
  110. package/dist/api/public/prompts/slug/[slug].d.ts.map +1 -0
  111. package/dist/api/public/prompts/slug/[slug].js +40 -0
  112. package/dist/api/public/prompts/user/[username].d.ts +17 -0
  113. package/dist/api/public/prompts/user/[username].d.ts.map +1 -0
  114. package/dist/api/public/prompts/user/[username].js +51 -0
  115. package/dist/api/public/prompts.d.ts +15 -0
  116. package/dist/api/public/prompts.d.ts.map +1 -0
  117. package/dist/api/public/prompts.js +45 -0
  118. package/dist/api/public/token-packs.d.ts +11 -0
  119. package/dist/api/public/token-packs.d.ts.map +1 -0
  120. package/dist/api/public/token-packs.js +25 -0
  121. package/dist/api/public/token-pricing.d.ts +44 -0
  122. package/dist/api/public/token-pricing.d.ts.map +1 -0
  123. package/dist/api/public/token-pricing.js +168 -0
  124. package/dist/api/public/v1/_lib/artifacts.d.ts +52 -0
  125. package/dist/api/public/v1/_lib/artifacts.d.ts.map +1 -0
  126. package/dist/api/public/v1/_lib/artifacts.js +217 -0
  127. package/dist/api/public/v1/_lib/auth.d.ts +43 -0
  128. package/dist/api/public/v1/_lib/auth.d.ts.map +1 -0
  129. package/dist/api/public/v1/_lib/auth.js +108 -0
  130. package/dist/api/public/v1/_lib/errors.d.ts +17 -0
  131. package/dist/api/public/v1/_lib/errors.d.ts.map +1 -0
  132. package/dist/api/public/v1/_lib/errors.js +16 -0
  133. package/dist/api/public/v1/_lib/log.d.ts +29 -0
  134. package/dist/api/public/v1/_lib/log.d.ts.map +1 -0
  135. package/dist/api/public/v1/_lib/log.js +68 -0
  136. package/dist/api/public/v1/_lib/quota.d.ts +24 -0
  137. package/dist/api/public/v1/_lib/quota.d.ts.map +1 -0
  138. package/dist/api/public/v1/_lib/quota.js +118 -0
  139. package/dist/api/public/v1/_lib/router.d.ts +54 -0
  140. package/dist/api/public/v1/_lib/router.d.ts.map +1 -0
  141. package/dist/api/public/v1/_lib/router.js +119 -0
  142. package/dist/api/public/v1/connect.d.ts +20 -0
  143. package/dist/api/public/v1/connect.d.ts.map +1 -0
  144. package/dist/api/public/v1/connect.js +119 -0
  145. package/dist/api/public/v1/doc.d.ts +239 -0
  146. package/dist/api/public/v1/doc.d.ts.map +1 -0
  147. package/dist/api/public/v1/doc.js +253 -0
  148. package/dist/api/public/v1/history/[id].d.ts +92 -0
  149. package/dist/api/public/v1/history/[id].d.ts.map +1 -0
  150. package/dist/api/public/v1/history/[id].js +176 -0
  151. package/dist/api/public/v1/history.d.ts +30 -0
  152. package/dist/api/public/v1/history.d.ts.map +1 -0
  153. package/dist/api/public/v1/history.js +142 -0
  154. package/dist/api/public/v1/image-ai.d.ts +24 -0
  155. package/dist/api/public/v1/image-ai.d.ts.map +1 -0
  156. package/dist/api/public/v1/image-ai.js +233 -0
  157. package/dist/api/public/v1/prompts.d.ts +19 -0
  158. package/dist/api/public/v1/prompts.d.ts.map +1 -0
  159. package/dist/api/public/v1/prompts.js +107 -0
  160. package/dist/api/public/v1/provider.d.ts +16 -0
  161. package/dist/api/public/v1/provider.d.ts.map +1 -0
  162. package/dist/api/public/v1/provider.js +130 -0
  163. package/dist/api/public/v1/purchase.d.ts +11 -0
  164. package/dist/api/public/v1/purchase.d.ts.map +1 -0
  165. package/dist/api/public/v1/purchase.js +18 -0
  166. package/dist/api/public/v1/status.d.ts +35 -0
  167. package/dist/api/public/v1/status.d.ts.map +1 -0
  168. package/dist/api/public/v1/status.js +163 -0
  169. package/dist/api/public/v1/text-ai.d.ts +26 -0
  170. package/dist/api/public/v1/text-ai.d.ts.map +1 -0
  171. package/dist/api/public/v1/text-ai.js +239 -0
  172. package/dist/api/public/webhook.d.ts.map +1 -1
  173. package/dist/api/public/webhook.js +50 -39
  174. package/dist/api/track-usage.d.ts +12 -0
  175. package/dist/api/track-usage.d.ts.map +1 -0
  176. package/dist/api/track-usage.js +37 -0
  177. package/dist/components/Doc.d.ts.map +1 -1
  178. package/dist/components/Doc.js +1 -1
  179. package/dist/components/DocUsageCustom.js +6 -6
  180. package/dist/components/admin/UserTokenTab.d.ts.map +1 -1
  181. package/dist/components/admin/UserTokenTab.js +170 -23
  182. package/dist/components/auth/AuthDashboardAi.d.ts +2 -0
  183. package/dist/components/auth/AuthDashboardAi.d.ts.map +1 -0
  184. package/dist/components/auth/AuthDashboardAi.js +53 -0
  185. package/dist/docs/REFACTORING_BILLING_GUIDE.d.ts +277 -0
  186. package/dist/docs/REFACTORING_BILLING_GUIDE.d.ts.map +1 -0
  187. package/dist/docs/REFACTORING_BILLING_GUIDE.js +276 -0
  188. package/dist/index.d.ts +15 -1
  189. package/dist/index.d.ts.map +1 -1
  190. package/dist/index.js +18 -1
  191. package/dist/scripts/migrate-tokens-to-wallet.d.ts +13 -0
  192. package/dist/scripts/migrate-tokens-to-wallet.d.ts.map +1 -0
  193. package/dist/scripts/migrate-tokens-to-wallet.js +165 -0
  194. package/dist/server/__tests__/billing.test.d.ts +5 -0
  195. package/dist/server/__tests__/billing.test.d.ts.map +1 -0
  196. package/dist/server/__tests__/billing.test.js +223 -0
  197. package/dist/server/ai-client.d.ts +59 -0
  198. package/dist/server/ai-client.d.ts.map +1 -0
  199. package/dist/server/ai-client.js +111 -0
  200. package/dist/server/ai-generation-service.d.ts +66 -0
  201. package/dist/server/ai-generation-service.d.ts.map +1 -0
  202. package/dist/server/ai-generation-service.js +274 -0
  203. package/dist/server/billing.d.ts +200 -0
  204. package/dist/server/billing.d.ts.map +1 -0
  205. package/dist/server/billing.js +488 -0
  206. package/dist/server/gateway-service.d.ts +13 -0
  207. package/dist/server/gateway-service.d.ts.map +1 -0
  208. package/dist/server/gateway-service.js +161 -0
  209. package/dist/server/global-settings.d.ts +16 -0
  210. package/dist/server/global-settings.d.ts.map +1 -0
  211. package/dist/server/global-settings.js +42 -0
  212. package/dist/server/model-filter.d.ts +25 -0
  213. package/dist/server/model-filter.d.ts.map +1 -0
  214. package/dist/server/model-filter.js +240 -0
  215. package/dist/server/ocr.d.ts +39 -0
  216. package/dist/server/ocr.d.ts.map +1 -0
  217. package/dist/server/ocr.js +280 -0
  218. package/dist/server/openai-client.d.ts +19 -0
  219. package/dist/server/openai-client.d.ts.map +1 -0
  220. package/dist/server/openai-client.js +26 -0
  221. package/dist/server/pricing-config.d.ts +18 -0
  222. package/dist/server/pricing-config.d.ts.map +1 -0
  223. package/dist/server/pricing-config.js +94 -0
  224. package/dist/server/pricing-validator.d.ts +41 -0
  225. package/dist/server/pricing-validator.d.ts.map +1 -0
  226. package/dist/server/pricing-validator.js +113 -0
  227. package/dist/server/pricing.d.ts +121 -0
  228. package/dist/server/pricing.d.ts.map +1 -0
  229. package/dist/server/pricing.js +225 -0
  230. package/dist/server/quota.d.ts +66 -0
  231. package/dist/server/quota.d.ts.map +1 -0
  232. package/dist/server/quota.js +538 -0
  233. package/dist/server/wallet-repair.d.ts +32 -0
  234. package/dist/server/wallet-repair.d.ts.map +1 -0
  235. package/dist/server/wallet-repair.js +189 -0
  236. package/dist/server.d.ts +13 -1
  237. package/dist/server.d.ts.map +1 -1
  238. package/dist/server.js +87 -16
  239. package/dist/sitemap/handlers/prompts.d.ts +6 -0
  240. package/dist/sitemap/handlers/prompts.d.ts.map +1 -0
  241. package/dist/sitemap/handlers/prompts.js +72 -0
  242. package/dist/sitemap/handlers/users.d.ts +6 -0
  243. package/dist/sitemap/handlers/users.d.ts.map +1 -0
  244. package/dist/sitemap/handlers/users.js +80 -0
  245. package/dist/sitemap/manifest.d.ts +8 -0
  246. package/dist/sitemap/manifest.d.ts.map +1 -0
  247. package/dist/sitemap/manifest.js +27 -0
  248. package/dist/types/gateway.d.ts +40 -0
  249. package/dist/types/gateway.d.ts.map +1 -0
  250. package/dist/types/gateway.js +4 -0
  251. package/dist/types/quota.d.ts +74 -0
  252. package/dist/types/quota.d.ts.map +1 -0
  253. package/dist/types/quota.js +11 -0
  254. package/dist/utils/date.d.ts +7 -0
  255. package/dist/utils/date.d.ts.map +1 -0
  256. package/dist/utils/date.js +17 -0
  257. package/dist/web/admin/AdminTokenPacksPage.js +1 -1
  258. package/dist/web/admin/BillingAnalyticsPage.d.ts +2 -0
  259. package/dist/web/admin/BillingAnalyticsPage.d.ts.map +1 -0
  260. package/dist/web/admin/BillingAnalyticsPage.js +141 -0
  261. package/dist/web/admin/GlobalAISettingsPage.d.ts +2 -0
  262. package/dist/web/admin/GlobalAISettingsPage.d.ts.map +1 -0
  263. package/dist/web/admin/GlobalAISettingsPage.js +93 -0
  264. package/dist/web/admin/UserTokenPage.d.ts.map +1 -1
  265. package/dist/web/admin/UserTokenPage.js +20 -7
  266. package/dist/web/auth/AISettingsPage.d.ts +2 -0
  267. package/dist/web/auth/AISettingsPage.d.ts.map +1 -0
  268. package/dist/web/auth/AISettingsPage.js +258 -0
  269. package/dist/web/auth/APIKeysPage.d.ts +2 -0
  270. package/dist/web/auth/APIKeysPage.d.ts.map +1 -0
  271. package/dist/web/auth/APIKeysPage.js +154 -0
  272. package/dist/web/auth/HistoryPage.d.ts +2 -0
  273. package/dist/web/auth/HistoryPage.d.ts.map +1 -0
  274. package/dist/web/auth/HistoryPage.js +279 -0
  275. package/dist/web/auth/PromptsPage.d.ts +5 -0
  276. package/dist/web/auth/PromptsPage.d.ts.map +1 -0
  277. package/dist/web/auth/PromptsPage.js +137 -0
  278. package/dist/web/auth/TokenPage.d.ts.map +1 -1
  279. package/dist/web/auth/TokenPage.js +88 -31
  280. package/dist/web/auth/UsageAndTokensPage.d.ts +2 -0
  281. package/dist/web/auth/UsageAndTokensPage.d.ts.map +1 -0
  282. package/dist/web/auth/UsageAndTokensPage.js +157 -0
  283. package/dist/web/auth/UsagePage.d.ts +2 -0
  284. package/dist/web/auth/UsagePage.d.ts.map +1 -0
  285. package/dist/web/auth/UsagePage.js +62 -0
  286. package/dist/web/auth/components/ApiKeyFilterSelect.d.ts +13 -0
  287. package/dist/web/auth/components/ApiKeyFilterSelect.d.ts.map +1 -0
  288. package/dist/web/auth/components/ApiKeyFilterSelect.js +16 -0
  289. package/dist/web/auth/components/ModelUsageTable.d.ts +19 -0
  290. package/dist/web/auth/components/ModelUsageTable.d.ts.map +1 -0
  291. package/dist/web/auth/components/ModelUsageTable.js +37 -0
  292. package/dist/web/auth/components/PurchaseButton.d.ts +7 -0
  293. package/dist/web/auth/components/PurchaseButton.d.ts.map +1 -0
  294. package/dist/web/auth/components/PurchaseButton.js +13 -0
  295. package/dist/web/auth/components/TokenHistoryCard.d.ts +20 -0
  296. package/dist/web/auth/components/TokenHistoryCard.d.ts.map +1 -0
  297. package/dist/web/auth/components/TokenHistoryCard.js +76 -0
  298. package/dist/web/auth/components/TokenKpiGrid.d.ts +24 -0
  299. package/dist/web/auth/components/TokenKpiGrid.d.ts.map +1 -0
  300. package/dist/web/auth/components/TokenKpiGrid.js +38 -0
  301. package/dist/web/auth/components/UsageByDayChart.d.ts +11 -0
  302. package/dist/web/auth/components/UsageByDayChart.d.ts.map +1 -0
  303. package/dist/web/auth/components/UsageByDayChart.js +32 -0
  304. package/dist/web/auth/components/UsageByModelBarChart.d.ts +12 -0
  305. package/dist/web/auth/components/UsageByModelBarChart.d.ts.map +1 -0
  306. package/dist/web/auth/components/UsageByModelBarChart.js +32 -0
  307. package/dist/web/auth/components/WalletStatusCard.d.ts +9 -0
  308. package/dist/web/auth/components/WalletStatusCard.d.ts.map +1 -0
  309. package/dist/web/auth/components/WalletStatusCard.js +50 -0
  310. package/dist/web/components/ImageGenerative.d.ts +3 -1
  311. package/dist/web/components/ImageGenerative.d.ts.map +1 -1
  312. package/dist/web/components/ImageGenerative.js +139 -52
  313. package/dist/web/components/TextareaGenerative.d.ts +3 -1
  314. package/dist/web/components/TextareaGenerative.d.ts.map +1 -1
  315. package/dist/web/components/TextareaGenerative.js +10 -5
  316. package/dist/web/public/PromptDetailPage.d.ts +25 -0
  317. package/dist/web/public/PromptDetailPage.d.ts.map +1 -0
  318. package/dist/web/public/PromptDetailPage.js +71 -0
  319. package/dist/web/public/PromptDetailPageServer.d.ts +15 -0
  320. package/dist/web/public/PromptDetailPageServer.d.ts.map +1 -0
  321. package/dist/web/public/PromptDetailPageServer.js +68 -0
  322. package/dist/web/public/PublicPromptsPage.d.ts +5 -0
  323. package/dist/web/public/PublicPromptsPage.d.ts.map +1 -0
  324. package/dist/web/public/PublicPromptsPage.js +110 -0
  325. package/dist/web/public/PurchaseTokensPage.d.ts +2 -0
  326. package/dist/web/public/PurchaseTokensPage.d.ts.map +1 -0
  327. package/dist/web/public/PurchaseTokensPage.js +98 -0
  328. package/dist/web/public/UserAvatar.d.ts +13 -0
  329. package/dist/web/public/UserAvatar.d.ts.map +1 -0
  330. package/dist/web/public/UserAvatar.js +13 -0
  331. package/dist/web/public/UserDetailPageServer.d.ts +15 -0
  332. package/dist/web/public/UserDetailPageServer.d.ts.map +1 -0
  333. package/dist/web/public/UserDetailPageServer.js +31 -0
  334. package/dist/web/public/UserPromptsPage.d.ts +9 -0
  335. package/dist/web/public/UserPromptsPage.d.ts.map +1 -0
  336. package/dist/web/public/UserPromptsPage.js +112 -0
  337. package/dist/web/public/UserPromptsPageServer.d.ts +15 -0
  338. package/dist/web/public/UserPromptsPageServer.d.ts.map +1 -0
  339. package/dist/web/public/UserPromptsPageServer.js +31 -0
  340. package/package.json +18 -9
  341. package/supabase/migrations/20251125000000_ai_tokens.sql +7 -0
  342. package/supabase/migrations/20260123100002_user_token_quota_monthly copy.sql +173 -0
  343. package/supabase/migrations/20260128100003_update_and_add_table.sql +368 -0
  344. package/supabase/migrations/20260128120000_seed_providers_models.sql +78 -0
  345. package/supabase/migrations/20260128131405_add_api_key_id_to_ledgers.sql +41 -0
  346. package/supabase/migrations/20260128140000_ai_artifacts_storage.sql +99 -0
  347. package/supabase/migrations/20260128140002_ai_user_settings.sql +57 -0
  348. package/supabase/migrations/20260128150000_drop_ai_user_settings.sql +21 -0
  349. package/supabase/migrations/20260128160000_wallet_billing_system.sql +192 -0
  350. package/supabase/migrations/20260128160001_wallet_rpc_functions.sql +165 -0
  351. package/supabase/migrations/20260128170000_add_pack_coef_to_token_packs.sql +30 -0
  352. package/supabase/migrations/20260129120000_wallet_view_rpc.sql +41 -0
  353. package/supabase/migrations/20260129220003_update_pack_margins.sql +31 -0
  354. package/supabase/migrations/20260129330004_ai_user_prompts.sql +151 -0
  355. package/supabase/migrations/20260129330005_ai_prompts_ip_tracking.sql +92 -0
  356. package/supabase/migrations/20260129330006_ai_prompts_slug.sql +64 -0
  357. package/supabase/migrations/20260129330007_ai_prompts_view_slug.sql +26 -0
  358. package/supabase/migrations/20260129440000_ai_prompts_view_username.sql +33 -0
  359. package/supabase/migrations/20260129450000_ai_prompts_add_lang.sql +40 -0
  360. package/supabase/migrations/20260131000000_extract_model_prompt_in_ledger.sql +92 -0
  361. package/supabase/migrations/20260131140000_fix_duplicate_purchases.sql +64 -0
  362. package/supabase/migrations/20260201120000_module-ai_default_models.sql +63 -0
  363. package/supabase/migrations/20260201130000_module-ai_remove_provider_tables.sql +17 -0
  364. package/supabase/migrations-down/20251217120000_user_token_quota_monthly.sql +34 -0
  365. package/supabase/migrations-down/20260128131405_add_api_key_id_to_ledgers.sql +25 -0
@@ -0,0 +1,58 @@
1
+ /**
2
+ * DEPRECATED: Admin API for single ai_provider_model CRUD
3
+ * @deprecated Tables ai_providers and ai_provider_models have been removed.
4
+ * Use /api/ai/admin/global-ai-settings instead.
5
+ *
6
+ * PUT /api/ai/admin/ai-provider-models/[id] - Update model
7
+ * DELETE /api/ai/admin/ai-provider-models/[id] - Delete model
8
+ */
9
+ import { NextResponse } from "next/server";
10
+ import { logger } from "@lastbrain/core";
11
+ export async function PUT(request, { params }) {
12
+ logger.warn("[ai-provider-models/id] DEPRECATED endpoint called - tables no longer exist");
13
+ return NextResponse.json({
14
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
15
+ deprecated: true
16
+ }, { status: 410 });
17
+ }
18
+ export async function DELETE(request, { params }) {
19
+ logger.warn("[ai-provider-models/id] DEPRECATED endpoint called - tables no longer exist");
20
+ return NextResponse.json({
21
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
22
+ deprecated: true
23
+ }, { status: 410 });
24
+ from("ai_provider_models")
25
+ .update(validation.data)
26
+ .eq("id", id)
27
+ .select()
28
+ .single();
29
+ if (error) {
30
+ logger.error("[ai-provider-models] Error updating model", error);
31
+ return NextResponse.json({ error: error.message }, { status: 500 });
32
+ }
33
+ return NextResponse.json({ data });
34
+ }
35
+ try { }
36
+ catch (error) {
37
+ logger.error("[ai-provider-models] Unexpected error", error);
38
+ return NextResponse.json({ error: error.message }, { status: 500 });
39
+ }
40
+ export async function DELETE(request, { params }) {
41
+ try {
42
+ const { id } = await params;
43
+ const supabase = await getSupabaseServiceClient();
44
+ const { error } = await supabase
45
+ .from("ai_provider_models")
46
+ .delete()
47
+ .eq("id", id);
48
+ if (error) {
49
+ logger.error("[ai-provider-models] Error deleting model", error);
50
+ return NextResponse.json({ error: error.message }, { status: 500 });
51
+ }
52
+ return NextResponse.json({ success: true });
53
+ }
54
+ catch (error) {
55
+ logger.error("[ai-provider-models] Unexpected error", error);
56
+ return NextResponse.json({ error: error.message }, { status: 500 });
57
+ }
58
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * DEPRECATED: Admin API for ai_provider_models CRUD
3
+ * @deprecated Tables ai_providers and ai_provider_models have been removed.
4
+ * We now query Vercel AI Gateway directly for available models.
5
+ * Global defaults are managed via ai_global_settings table.
6
+ * Use /api/ai/admin/global-ai-settings instead.
7
+ *
8
+ * GET /api/ai/admin/ai-provider-models - List all models
9
+ * POST /api/ai/admin/ai-provider-models - Create model
10
+ */
11
+ import { NextRequest, NextResponse } from "next/server";
12
+ export declare function GET(request: NextRequest): Promise<NextResponse<{
13
+ error: string;
14
+ deprecated: boolean;
15
+ }>>;
16
+ export declare function POST(request: NextRequest): Promise<NextResponse<{
17
+ error: string;
18
+ deprecated: boolean;
19
+ }>>;
20
+ //# sourceMappingURL=ai-provider-models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-provider-models.d.ts","sourceRoot":"","sources":["../../../src/api/admin/ai-provider-models.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;IAY7C;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;IAY9C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * DEPRECATED: Admin API for ai_provider_models CRUD
3
+ * @deprecated Tables ai_providers and ai_provider_models have been removed.
4
+ * We now query Vercel AI Gateway directly for available models.
5
+ * Global defaults are managed via ai_global_settings table.
6
+ * Use /api/ai/admin/global-ai-settings instead.
7
+ *
8
+ * GET /api/ai/admin/ai-provider-models - List all models
9
+ * POST /api/ai/admin/ai-provider-models - Create model
10
+ */
11
+ import { NextResponse } from "next/server";
12
+ import { logger } from "@lastbrain/core";
13
+ export async function GET(request) {
14
+ logger.warn("[ai-provider-models] DEPRECATED endpoint called - tables no longer exist");
15
+ return NextResponse.json({
16
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
17
+ deprecated: true,
18
+ }, { status: 410 });
19
+ }
20
+ export async function POST(request) {
21
+ logger.warn("[ai-provider-models] DEPRECATED endpoint called - tables no longer exist");
22
+ return NextResponse.json({
23
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
24
+ deprecated: true,
25
+ }, { status: 410 });
26
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * DEPRECATED: Admin API for single ai_provider CRUD
3
+ * @deprecated Tables ai_providers and ai_provider_models have been removed.
4
+ * Use /api/ai/admin/global-ai-settings instead.
5
+ *
6
+ * PUT /api/ai/admin/ai-providers/[key] - Update provider
7
+ * DELETE /api/ai/admin/ai-providers/[key] - Delete provider
8
+ */
9
+ import { NextRequest, NextResponse } from "next/server";
10
+ export declare function PUT(request: NextRequest, { params }: {
11
+ params: Promise<{
12
+ key: string;
13
+ }>;
14
+ }): Promise<NextResponse<{
15
+ error: string;
16
+ deprecated: boolean;
17
+ }>>;
18
+ //# sourceMappingURL=%5Bkey%5D.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"[key].d.ts","sourceRoot":"","sources":["../../../../src/api/admin/ai-providers/[key].ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;IAUjD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * DEPRECATED: Admin API for single ai_provider CRUD
3
+ * @deprecated Tables ai_providers and ai_provider_models have been removed.
4
+ * Use /api/ai/admin/global-ai-settings instead.
5
+ *
6
+ * PUT /api/ai/admin/ai-providers/[key] - Update provider
7
+ * DELETE /api/ai/admin/ai-providers/[key] - Delete provider
8
+ */
9
+ import { NextResponse } from "next/server";
10
+ import { logger } from "@lastbrain/core";
11
+ export async function PUT(request, { params }) {
12
+ logger.warn("[ai-providers/key] DEPRECATED endpoint called - tables no longer exist");
13
+ return NextResponse.json({
14
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
15
+ deprecated: true
16
+ }, { status: 410 });
17
+ }
18
+ export async function DELETE(request, { params }) {
19
+ logger.warn("[ai-providers/key] DEPRECATED endpoint called - tables no longer exist");
20
+ return NextResponse.json({
21
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
22
+ deprecated: true
23
+ }, { status: 410 });
24
+ select()
25
+ .single();
26
+ if (error) {
27
+ logger.error("[ai-providers] Error updating provider", error);
28
+ return NextResponse.json({ error: error.message }, { status: 500 });
29
+ }
30
+ return NextResponse.json({ data });
31
+ }
32
+ try { }
33
+ catch (error) {
34
+ logger.error("[ai-providers] Unexpected error", error);
35
+ return NextResponse.json({ error: error.message }, { status: 500 });
36
+ }
37
+ export async function DELETE(request, { params }) {
38
+ try {
39
+ const { key } = await params;
40
+ const supabase = await getSupabaseServiceClient();
41
+ const { error } = await supabase
42
+ .from("ai_providers")
43
+ .delete()
44
+ .eq("key", key);
45
+ if (error) {
46
+ logger.error("[ai-providers] Error deleting provider", error);
47
+ return NextResponse.json({ error: error.message }, { status: 500 });
48
+ }
49
+ return NextResponse.json({ success: true });
50
+ }
51
+ catch (error) {
52
+ logger.error("[ai-providers] Unexpected error", error);
53
+ return NextResponse.json({ error: error.message }, { status: 500 });
54
+ }
55
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * DEPRECATED: Admin API for ai_providers CRUD
3
+ * @deprecated Tables ai_providers and ai_provider_models have been removed.
4
+ * We now query Vercel AI Gateway directly for available models.
5
+ * Global defaults are managed via ai_global_settings table.
6
+ * Use /api/ai/admin/global-ai-settings instead.
7
+ *
8
+ * GET /api/ai/admin/ai-providers - List all providers
9
+ * POST /api/ai/admin/ai-providers - Create provider
10
+ */
11
+ import { NextRequest, NextResponse } from "next/server";
12
+ export declare function GET(request: NextRequest): Promise<NextResponse<{
13
+ error: string;
14
+ deprecated: boolean;
15
+ }>>;
16
+ export declare function POST(request: NextRequest): Promise<NextResponse<{
17
+ error: string;
18
+ deprecated: boolean;
19
+ }>>;
20
+ //# sourceMappingURL=ai-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-providers.d.ts","sourceRoot":"","sources":["../../../src/api/admin/ai-providers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;IAY7C;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;IAY9C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * DEPRECATED: Admin API for ai_providers CRUD
3
+ * @deprecated Tables ai_providers and ai_provider_models have been removed.
4
+ * We now query Vercel AI Gateway directly for available models.
5
+ * Global defaults are managed via ai_global_settings table.
6
+ * Use /api/ai/admin/global-ai-settings instead.
7
+ *
8
+ * GET /api/ai/admin/ai-providers - List all providers
9
+ * POST /api/ai/admin/ai-providers - Create provider
10
+ */
11
+ import { NextResponse } from "next/server";
12
+ import { logger } from "@lastbrain/core";
13
+ export async function GET(request) {
14
+ logger.warn("[ai-providers] DEPRECATED endpoint called - tables no longer exist");
15
+ return NextResponse.json({
16
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
17
+ deprecated: true,
18
+ }, { status: 410 });
19
+ }
20
+ export async function POST(request) {
21
+ logger.warn("[ai-providers] DEPRECATED endpoint called - tables no longer exist");
22
+ return NextResponse.json({
23
+ error: "This endpoint is deprecated. Tables ai_providers and ai_provider_models have been removed. Use /api/ai/admin/global-ai-settings to manage default models.",
24
+ deprecated: true,
25
+ }, { status: 410 });
26
+ }
@@ -0,0 +1,43 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ /**
3
+ * GET /api/ai/admin/billing-analytics
4
+ * Returns billing analytics: total CA, cost, margin per user and global
5
+ * Now uses the new USD wallet system instead of legacy token ledger
6
+ */
7
+ export declare function GET(_request: NextRequest): Promise<NextResponse<{
8
+ users: {
9
+ userId: string;
10
+ email: string | undefined;
11
+ tokensAdded: number;
12
+ tokensUsed: number;
13
+ totalPurchaseUsd: number;
14
+ totalProviderCostUsd: number;
15
+ totalGiftBudgetUsd: number;
16
+ totalCharges: number;
17
+ realMarginUsd: number;
18
+ realMarginPercent: number;
19
+ totalSellUsd: number;
20
+ totalMarginUsd: number;
21
+ marginPercent: number;
22
+ avgPackCoef: number;
23
+ walletProviderBudgetUsd: number;
24
+ walletSellValueUsd: number;
25
+ lastActivity: any;
26
+ hasActivity: boolean;
27
+ }[];
28
+ global: {
29
+ totalPurchaseUsd: number;
30
+ totalProviderCostUsd: number;
31
+ totalGiftBudgetUsd: number;
32
+ totalCharges: number;
33
+ realMarginUsd: number;
34
+ avgRealMarginPercent: number;
35
+ totalSellUsd: number;
36
+ totalMarginUsd: number;
37
+ avgMarginPercent: number;
38
+ totalUsers: number;
39
+ };
40
+ }> | NextResponse<{
41
+ error: any;
42
+ }>>;
43
+ //# sourceMappingURL=billing-analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing-analytics.d.ts","sourceRoot":"","sources":["../../../src/api/admin/billing-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,QAAQ,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkN9C"}
@@ -0,0 +1,144 @@
1
+ import { NextResponse } from "next/server";
2
+ import { getSupabaseServiceClient } from "@lastbrain/core/server";
3
+ import { logger } from "@lastbrain/core";
4
+ /**
5
+ * GET /api/ai/admin/billing-analytics
6
+ * Returns billing analytics: total CA, cost, margin per user and global
7
+ * Now uses the new USD wallet system instead of legacy token ledger
8
+ */
9
+ export async function GET(_request) {
10
+ try {
11
+ const supabase = getSupabaseServiceClient();
12
+ // Auth is already verified by middleware (superadmin required)
13
+ // Get all users
14
+ const { data: authUsers, error: usersError } = await supabase.auth.admin.listUsers();
15
+ if (usersError) {
16
+ logger.error("[Billing Analytics] Failed to fetch users:", usersError);
17
+ throw usersError;
18
+ }
19
+ // Get wallet states for all users
20
+ const { data: walletRows, error: walletError } = await supabase
21
+ .from("user_token_wallet")
22
+ .select("user_id, wallet_provider_budget_usd, wallet_sell_value_usd, created_at");
23
+ if (walletError) {
24
+ logger.error("[Billing Analytics] Failed to fetch wallets:", walletError);
25
+ throw walletError;
26
+ }
27
+ const wallets = new Map((walletRows || []).map((w) => [
28
+ w.user_id,
29
+ {
30
+ walletProviderBudgetUsd: parseFloat(w.wallet_provider_budget_usd) || 0,
31
+ walletSellValueUsd: parseFloat(w.wallet_sell_value_usd) || 0,
32
+ createdAt: w.created_at,
33
+ },
34
+ ]));
35
+ // Get AI usage costs from user_token_ledger (real provider costs)
36
+ const { data: ledgerRows, error: ledgerError } = await supabase
37
+ .from("user_token_ledger")
38
+ .select("owner_id, type, provider_cost_usd, sell_usd, provider_budget_added_usd, ts")
39
+ .in("type", ["use", "purchase", "gift", "signup_bonus"])
40
+ .order("ts", { ascending: false });
41
+ if (ledgerError) {
42
+ logger.error("[Billing Analytics] Failed to fetch ledger:", ledgerError);
43
+ throw ledgerError;
44
+ }
45
+ const ledger = ledgerRows || [];
46
+ // Calculate stats per user
47
+ const userAnalytics = authUsers.users.map((user) => {
48
+ const userId = user.id;
49
+ const wallet = wallets.get(userId);
50
+ const userLedger = ledger.filter((l) => l.owner_id === userId);
51
+ // Separate by type
52
+ const purchases = userLedger.filter((l) => l.type === "purchase");
53
+ const usages = userLedger.filter((l) => l.type === "use");
54
+ const gifts = userLedger.filter((l) => l.type === "gift" || l.type === "signup_bonus");
55
+ // CA réel = achats uniquement
56
+ const totalPurchaseUsd = purchases.reduce((sum, l) => sum + (parseFloat(l.sell_usd) || 0), 0);
57
+ // Coût utilisation = provider costs
58
+ const totalProviderCostUsd = usages.reduce((sum, l) => sum + (parseFloat(l.provider_cost_usd) || 0), 0);
59
+ // Budget offert = budget fournisseur ajouté via gifts (non consommé)
60
+ const totalGiftBudgetUsd = gifts.reduce((sum, l) => sum + (parseFloat(l.provider_budget_added_usd) || 0), 0);
61
+ // Total sell value (what was charged to user for usage)
62
+ const totalSellUsd = usages.reduce((sum, l) => sum + (parseFloat(l.sell_usd) || 0), 0);
63
+ // Current wallet state
64
+ const currentSellValue = wallet?.walletSellValueUsd || 0;
65
+ const currentProviderBudget = wallet?.walletProviderBudgetUsd || 0;
66
+ // Calcul de la marge réelle
67
+ // Charges = UNIQUEMENT les usages consommés (pas les budgets offerts)
68
+ const totalCharges = totalProviderCostUsd;
69
+ // Marge réelle = CA (achats) - Charges (consommation réelle)
70
+ const realMarginUsd = totalPurchaseUsd - totalCharges;
71
+ const realMarginPercent = totalPurchaseUsd > 0 ? (realMarginUsd / totalPurchaseUsd) * 100 : 0;
72
+ // Ancienne marge (sur utilisation seulement, pour compatibilité)
73
+ const totalMarginUsd = totalSellUsd - totalProviderCostUsd;
74
+ const marginPercent = totalSellUsd > 0 ? (totalMarginUsd / totalSellUsd) * 100 : 0;
75
+ const hasActivity = wallet !== undefined ||
76
+ totalProviderCostUsd > 0 ||
77
+ totalPurchaseUsd > 0;
78
+ return {
79
+ userId,
80
+ email: user.email,
81
+ tokensAdded: 0, // Legacy field (tokens system deprecated)
82
+ tokensUsed: 0, // Legacy field (tokens system deprecated)
83
+ totalPurchaseUsd: parseFloat(totalPurchaseUsd.toFixed(4)), // CA réel
84
+ totalProviderCostUsd: parseFloat(totalProviderCostUsd.toFixed(4)), // Coût utilisation
85
+ totalGiftBudgetUsd: parseFloat(totalGiftBudgetUsd.toFixed(4)), // Budget offert (non consommé)
86
+ totalCharges: parseFloat(totalCharges.toFixed(4)), // = totalProviderCostUsd
87
+ realMarginUsd: parseFloat(realMarginUsd.toFixed(4)), // Marge réelle
88
+ realMarginPercent: parseFloat(realMarginPercent.toFixed(2)), // % marge réelle
89
+ // Anciennes valeurs (compatibilité)
90
+ totalSellUsd: parseFloat(totalSellUsd.toFixed(4)),
91
+ totalMarginUsd: parseFloat(totalMarginUsd.toFixed(4)),
92
+ marginPercent: parseFloat(marginPercent.toFixed(2)),
93
+ avgPackCoef: 0, // Legacy field (tokens system deprecated)
94
+ walletProviderBudgetUsd: parseFloat(currentProviderBudget.toFixed(4)),
95
+ walletSellValueUsd: parseFloat(currentSellValue.toFixed(4)),
96
+ lastActivity: userLedger.length > 0 ? userLedger[0].ts : wallet?.createdAt || null,
97
+ hasActivity,
98
+ };
99
+ });
100
+ // Filter out users with no activity
101
+ const activeUsers = userAnalytics.filter((u) => u.hasActivity);
102
+ // Calculate global stats (marge réelle)
103
+ const globalStats = {
104
+ totalUsers: activeUsers.length,
105
+ totalPurchaseUsd: activeUsers.reduce((sum, u) => sum + u.totalPurchaseUsd, 0),
106
+ totalProviderCostUsd: activeUsers.reduce((sum, u) => sum + u.totalProviderCostUsd, 0),
107
+ totalGiftBudgetUsd: activeUsers.reduce((sum, u) => sum + u.totalGiftBudgetUsd, 0),
108
+ totalCharges: activeUsers.reduce((sum, u) => sum + u.totalCharges, 0),
109
+ realMarginUsd: activeUsers.reduce((sum, u) => sum + u.realMarginUsd, 0),
110
+ // Anciennes valeurs
111
+ totalSellUsd: activeUsers.reduce((sum, u) => sum + u.totalSellUsd, 0),
112
+ totalMarginUsd: activeUsers.reduce((sum, u) => sum + u.totalMarginUsd, 0),
113
+ avgMarginPercent: activeUsers.length > 0
114
+ ? activeUsers.reduce((sum, u) => sum + u.marginPercent, 0) /
115
+ activeUsers.length
116
+ : 0,
117
+ avgRealMarginPercent: activeUsers.length > 0
118
+ ? activeUsers.reduce((sum, u) => sum + u.realMarginPercent, 0) /
119
+ activeUsers.length
120
+ : 0,
121
+ };
122
+ logger.info(`[Billing Analytics] Fetched analytics for ${activeUsers.length} active users (USD wallet system)`);
123
+ return NextResponse.json({
124
+ users: activeUsers,
125
+ global: {
126
+ ...globalStats,
127
+ totalPurchaseUsd: parseFloat(globalStats.totalPurchaseUsd.toFixed(2)),
128
+ totalProviderCostUsd: parseFloat(globalStats.totalProviderCostUsd.toFixed(2)),
129
+ totalGiftBudgetUsd: parseFloat(globalStats.totalGiftBudgetUsd.toFixed(2)),
130
+ totalCharges: parseFloat(globalStats.totalCharges.toFixed(2)),
131
+ realMarginUsd: parseFloat(globalStats.realMarginUsd.toFixed(2)),
132
+ avgRealMarginPercent: parseFloat(globalStats.avgRealMarginPercent.toFixed(2)),
133
+ // Anciennes valeurs
134
+ totalSellUsd: parseFloat(globalStats.totalSellUsd.toFixed(2)),
135
+ totalMarginUsd: parseFloat(globalStats.totalMarginUsd.toFixed(2)),
136
+ avgMarginPercent: parseFloat(globalStats.avgMarginPercent.toFixed(2)),
137
+ },
138
+ }, { status: 200 });
139
+ }
140
+ catch (error) {
141
+ logger.error("[Billing Analytics] Error:", error);
142
+ return NextResponse.json({ error: error.message || "Internal server error" }, { status: 500 });
143
+ }
144
+ }
@@ -0,0 +1,14 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ /**
3
+ * GET /api/ai/admin/global-ai-settings
4
+ * Retrieve global AI configuration (default models)
5
+ * Auth checked by middleware (superadmin only)
6
+ */
7
+ export declare function GET(): Promise<NextResponse<any>>;
8
+ /**
9
+ * PUT /api/ai/admin/global-ai-settings
10
+ * Update global AI configuration (superadmin only)
11
+ * Auth checked by middleware (superadmin only)
12
+ */
13
+ export declare function PUT(req: NextRequest): Promise<NextResponse<any>>;
14
+ //# sourceMappingURL=global-ai-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-ai-settings.d.ts","sourceRoot":"","sources":["../../../src/api/admin/global-ai-settings.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD;;;;GAIG;AACH,wBAAsB,GAAG,+BAgBxB;AAED;;;;GAIG;AACH,wBAAsB,GAAG,CAAC,GAAG,EAAE,WAAW,8BA4DzC"}
@@ -0,0 +1,63 @@
1
+ import { logger } from "@lastbrain/core";
2
+ import { getSupabaseServerClient, getSupabaseServiceClient, } from "@lastbrain/core/server";
3
+ import { NextResponse } from "next/server";
4
+ /**
5
+ * GET /api/ai/admin/global-ai-settings
6
+ * Retrieve global AI configuration (default models)
7
+ * Auth checked by middleware (superadmin only)
8
+ */
9
+ export async function GET() {
10
+ // Auth already checked by middleware for /admin routes
11
+ const supabase = getSupabaseServiceClient();
12
+ const { data, error } = await supabase
13
+ .from("ai_global_settings")
14
+ .select("*")
15
+ .eq("id", 1)
16
+ .single();
17
+ if (error) {
18
+ logger.error("[global-ai-settings] Error fetching global settings:", error);
19
+ return NextResponse.json({ error: error.message }, { status: 500 });
20
+ }
21
+ return NextResponse.json(data);
22
+ }
23
+ /**
24
+ * PUT /api/ai/admin/global-ai-settings
25
+ * Update global AI configuration (superadmin only)
26
+ * Auth checked by middleware (superadmin only)
27
+ */
28
+ export async function PUT(req) {
29
+ // Auth already checked by middleware for /admin routes
30
+ // Get user for updated_by field
31
+ const supabaseAuth = await getSupabaseServerClient();
32
+ const { data: { user }, } = await supabaseAuth.auth.getUser();
33
+ const body = await req.json();
34
+ const { default_text_provider, default_text_model, default_image_provider, default_image_model, max_tokens_per_call, } = body;
35
+ // Validation basique
36
+ if (!default_text_provider || !default_text_model) {
37
+ return NextResponse.json({ error: "Text provider and model required" }, { status: 400 });
38
+ }
39
+ if (!default_image_provider || !default_image_model) {
40
+ return NextResponse.json({ error: "Image provider and model required" }, { status: 400 });
41
+ }
42
+ // Use service client for update
43
+ const supabase = getSupabaseServiceClient();
44
+ const { data, error } = await supabase
45
+ .from("ai_global_settings")
46
+ .update({
47
+ default_text_provider,
48
+ default_text_model,
49
+ default_image_provider,
50
+ default_image_model,
51
+ max_tokens_per_call: max_tokens_per_call || 16384,
52
+ updated_by: user?.id || null,
53
+ })
54
+ .eq("id", 1)
55
+ .select()
56
+ .single();
57
+ if (error) {
58
+ logger.error("[global-ai-settings] Error updating settings:", error);
59
+ return NextResponse.json({ error: error.message }, { status: 500 });
60
+ }
61
+ logger.info(`[global-ai-settings] ✅ Global defaults updated - Text: ${default_text_provider}/${default_text_model}, Image: ${default_image_provider}/${default_image_model}`);
62
+ return NextResponse.json(data);
63
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"[id].d.ts","sourceRoot":"","sources":["../../../../src/api/admin/token-packs/[id].ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAcxD;;;GAGG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;;IAwB7C;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;;IAkB7C"}
1
+ {"version":3,"file":"[id].d.ts","sourceRoot":"","sources":["../../../../src/api/admin/token-packs/[id].ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAexD;;;GAGG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;;IAwB7C;AAED;;;GAGG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;;;;IAkB7C"}
@@ -1,5 +1,6 @@
1
1
  import { NextResponse } from "next/server";
2
2
  import { getSupabaseServiceClient } from "@lastbrain/core/server";
3
+ import { logger } from "@lastbrain/core";
3
4
  /**
4
5
  * PUT /api/ai/admin/token-packs/[id]
5
6
  * Update a token pack
@@ -20,7 +21,7 @@ export async function PUT(request, context) {
20
21
  return NextResponse.json({ data }, { status: 200 });
21
22
  }
22
23
  catch (error) {
23
- console.error("[Admin Token Packs] PUT error:", error);
24
+ logger.error("[Admin Token Packs] PUT error:", error);
24
25
  return NextResponse.json({ error: error.message || "Erreur lors de la mise à jour du pack" }, { status: 500 });
25
26
  }
26
27
  }
@@ -38,7 +39,7 @@ export async function DELETE(request, context) {
38
39
  return NextResponse.json({ success: true }, { status: 200 });
39
40
  }
40
41
  catch (error) {
41
- console.error("[Admin Token Packs] DELETE error:", error);
42
+ logger.error("[Admin Token Packs] DELETE error:", error);
42
43
  return NextResponse.json({ error: error.message || "Erreur lors de la suppression du pack" }, { status: 500 });
43
44
  }
44
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"token-packs.d.ts","sourceRoot":"","sources":["../../../src/api/admin/token-packs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAexD;;;GAGG;AACH,wBAAsB,GAAG;;;;IAmBxB;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;IAgD9C"}
1
+ {"version":3,"file":"token-packs.d.ts","sourceRoot":"","sources":["../../../src/api/admin/token-packs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAgBxD;;;GAGG;AACH,wBAAsB,GAAG;;;;IAmBxB;AAED;;;GAGG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;IAgD9C"}
@@ -1,5 +1,6 @@
1
1
  import { NextResponse } from "next/server";
2
2
  import { getSupabaseServiceClient } from "@lastbrain/core/server";
3
+ import { logger } from "@lastbrain/core";
3
4
  /**
4
5
  * GET /api/ai/admin/token-packs
5
6
  * List all token packs (including inactive)
@@ -16,7 +17,7 @@ export async function GET() {
16
17
  return NextResponse.json({ data }, { status: 200 });
17
18
  }
18
19
  catch (error) {
19
- console.error("[Admin Token Packs] GET error:", error);
20
+ logger.error("[Admin Token Packs] GET error:", error);
20
21
  return NextResponse.json({ error: error.message || "Erreur lors de la récupération des packs" }, { status: 500 });
21
22
  }
22
23
  }
@@ -51,7 +52,7 @@ export async function POST(request) {
51
52
  return NextResponse.json({ data }, { status: 201 });
52
53
  }
53
54
  catch (error) {
54
- console.error("[Admin Token Packs] POST error:", error);
55
+ logger.error("[Admin Token Packs] POST error:", error);
55
56
  return NextResponse.json({ error: error.message || "Erreur lors de la création du pack" }, { status: 500 });
56
57
  }
57
58
  }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * GET /api/ai/admin/user-monthly-details?userId=xxx&month=2026-01
3
+ * Get detailed monthly usage for a specific user
4
+ */
5
+ import { NextRequest, NextResponse } from "next/server";
6
+ export declare function GET(request: NextRequest): Promise<NextResponse<{
7
+ error: string;
8
+ }> | NextResponse<{
9
+ user: {
10
+ id: string;
11
+ email: string;
12
+ };
13
+ month: string;
14
+ summary: {
15
+ totalPurchases: number;
16
+ totalGifts: number;
17
+ totalUsages: number;
18
+ totalPurchaseUsd: number;
19
+ totalProviderCostUsd: number;
20
+ totalGiftBudgetUsd: number;
21
+ totalCharges: number;
22
+ realMarginUsd: number;
23
+ realMarginPercent: number;
24
+ totalSellUsd: number;
25
+ totalMarginUsd: number;
26
+ marginPercent: number;
27
+ };
28
+ usageByAction: {
29
+ avgCostPerCall: number;
30
+ count: number;
31
+ providerCostUsd: number;
32
+ sellUsd: number;
33
+ marginUsd: number;
34
+ actionType: string;
35
+ }[];
36
+ recentEntries: {
37
+ created_at: any;
38
+ type: any;
39
+ debit_tokens: any;
40
+ provider_cost_usd: any;
41
+ sell_usd: any;
42
+ margin_usd: any;
43
+ model: any;
44
+ provider: any;
45
+ meta: any;
46
+ provider_budget_added_usd: any;
47
+ }[];
48
+ }>>;
49
+ //# sourceMappingURL=user-monthly-details.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-monthly-details.d.ts","sourceRoot":"","sources":["../../../src/api/admin/user-monthly-details.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;eA8F/B,MAAM;yBACI,MAAM;iBACd,MAAM;mBACJ,MAAM;;;;;;;;;;;;;;;IA+FxB"}