@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,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;AAGxD;;;;;;;;;;;GAWG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;IAsE9C;AAED;;;;GAIG;AACH,wBAAsB,GAAG;;;;IAuBxB"}
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
- console.error("FRONTEND_URL or NEXT_PUBLIC_APP_URL not set");
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/token?success=true",
53
- cancelPath: "/auth/ai/token?cancelled=true",
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
- console.error("[POST /api/ai/create-checkout] Error:", error);
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
- console.error("[GET /api/ai/create-checkout] Error:", error);
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
- console.error("[GET /api/ai/create-checkout] Error:", error);
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;AAiDxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;;;IA0L9C"}
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"}