ugly-app 0.1.0

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 (554) hide show
  1. package/.claude/settings.local.json +18 -0
  2. package/.env.example +9 -0
  3. package/.yarn-metadata.json +113 -0
  4. package/README.md +709 -0
  5. package/dist/cli/authCommands.d.ts +6 -0
  6. package/dist/cli/authCommands.d.ts.map +1 -0
  7. package/dist/cli/authCommands.js +50 -0
  8. package/dist/cli/authCommands.js.map +1 -0
  9. package/dist/cli/build.d.ts +2 -0
  10. package/dist/cli/build.d.ts.map +1 -0
  11. package/dist/cli/build.js +26 -0
  12. package/dist/cli/build.js.map +1 -0
  13. package/dist/cli/configure.d.ts +2 -0
  14. package/dist/cli/configure.d.ts.map +1 -0
  15. package/dist/cli/configure.js +53 -0
  16. package/dist/cli/configure.js.map +1 -0
  17. package/dist/cli/dev.d.ts +2 -0
  18. package/dist/cli/dev.d.ts.map +1 -0
  19. package/dist/cli/dev.js +66 -0
  20. package/dist/cli/dev.js.map +1 -0
  21. package/dist/cli/index.d.ts +3 -0
  22. package/dist/cli/index.d.ts.map +1 -0
  23. package/dist/cli/index.js +340 -0
  24. package/dist/cli/index.js.map +1 -0
  25. package/dist/cli/initDb.d.ts +2 -0
  26. package/dist/cli/initDb.d.ts.map +1 -0
  27. package/dist/cli/initDb.js +110 -0
  28. package/dist/cli/initDb.js.map +1 -0
  29. package/dist/cli/logQuery.d.ts +12 -0
  30. package/dist/cli/logQuery.d.ts.map +1 -0
  31. package/dist/cli/logQuery.js +176 -0
  32. package/dist/cli/logQuery.js.map +1 -0
  33. package/dist/cli/migrate.d.ts +4 -0
  34. package/dist/cli/migrate.d.ts.map +1 -0
  35. package/dist/cli/migrate.js +62 -0
  36. package/dist/cli/migrate.js.map +1 -0
  37. package/dist/cli/publishAssets.d.ts +6 -0
  38. package/dist/cli/publishAssets.d.ts.map +1 -0
  39. package/dist/cli/publishAssets.js +87 -0
  40. package/dist/cli/publishAssets.js.map +1 -0
  41. package/dist/cli/purgeAssets.d.ts +2 -0
  42. package/dist/cli/purgeAssets.d.ts.map +1 -0
  43. package/dist/cli/purgeAssets.js +36 -0
  44. package/dist/cli/purgeAssets.js.map +1 -0
  45. package/dist/cli/scaffold.d.ts +2 -0
  46. package/dist/cli/scaffold.d.ts.map +1 -0
  47. package/dist/cli/scaffold.js +37 -0
  48. package/dist/cli/scaffold.js.map +1 -0
  49. package/dist/cli/serverLogQuery.d.ts +6 -0
  50. package/dist/cli/serverLogQuery.d.ts.map +1 -0
  51. package/dist/cli/serverLogQuery.js +76 -0
  52. package/dist/cli/serverLogQuery.js.map +1 -0
  53. package/dist/cli/storageClient.d.ts +3 -0
  54. package/dist/cli/storageClient.d.ts.map +1 -0
  55. package/dist/cli/storageClient.js +22 -0
  56. package/dist/cli/storageClient.js.map +1 -0
  57. package/dist/cli/uglyappConfig.d.ts +29 -0
  58. package/dist/cli/uglyappConfig.d.ts.map +1 -0
  59. package/dist/cli/uglyappConfig.js +125 -0
  60. package/dist/cli/uglyappConfig.js.map +1 -0
  61. package/dist/client/AppProvider.d.ts +32 -0
  62. package/dist/client/AppProvider.d.ts.map +1 -0
  63. package/dist/client/AppProvider.js +126 -0
  64. package/dist/client/AppProvider.js.map +1 -0
  65. package/dist/client/ErrorLog.d.ts +16 -0
  66. package/dist/client/ErrorLog.d.ts.map +1 -0
  67. package/dist/client/ErrorLog.js +28 -0
  68. package/dist/client/ErrorLog.js.map +1 -0
  69. package/dist/client/FeedbackContext.d.ts +7 -0
  70. package/dist/client/FeedbackContext.d.ts.map +1 -0
  71. package/dist/client/FeedbackContext.js +15 -0
  72. package/dist/client/FeedbackContext.js.map +1 -0
  73. package/dist/client/Logger.d.ts +2 -0
  74. package/dist/client/Logger.d.ts.map +1 -0
  75. package/dist/client/Logger.js +72 -0
  76. package/dist/client/Logger.js.map +1 -0
  77. package/dist/client/LoginPopup.d.ts +7 -0
  78. package/dist/client/LoginPopup.d.ts.map +1 -0
  79. package/dist/client/LoginPopup.js +55 -0
  80. package/dist/client/LoginPopup.js.map +1 -0
  81. package/dist/client/Router.d.ts +56 -0
  82. package/dist/client/Router.d.ts.map +1 -0
  83. package/dist/client/Router.js +224 -0
  84. package/dist/client/Router.js.map +1 -0
  85. package/dist/client/Screenshot.d.ts +7 -0
  86. package/dist/client/Screenshot.d.ts.map +1 -0
  87. package/dist/client/Screenshot.js +54 -0
  88. package/dist/client/Screenshot.js.map +1 -0
  89. package/dist/client/ViewFlipper.d.ts +16 -0
  90. package/dist/client/ViewFlipper.d.ts.map +1 -0
  91. package/dist/client/ViewFlipper.js +156 -0
  92. package/dist/client/ViewFlipper.js.map +1 -0
  93. package/dist/client/animation/Animated.d.ts +14 -0
  94. package/dist/client/animation/Animated.d.ts.map +1 -0
  95. package/dist/client/animation/Animated.js +97 -0
  96. package/dist/client/animation/Animated.js.map +1 -0
  97. package/dist/client/animation/animatedValue.d.ts +41 -0
  98. package/dist/client/animation/animatedValue.d.ts.map +1 -0
  99. package/dist/client/animation/animatedValue.js +123 -0
  100. package/dist/client/animation/animatedValue.js.map +1 -0
  101. package/dist/client/animations/FadeIn.d.ts +6 -0
  102. package/dist/client/animations/FadeIn.d.ts.map +1 -0
  103. package/dist/client/animations/FadeIn.js +24 -0
  104. package/dist/client/animations/FadeIn.js.map +1 -0
  105. package/dist/client/animations/SlideFromBottom.d.ts +6 -0
  106. package/dist/client/animations/SlideFromBottom.d.ts.map +1 -0
  107. package/dist/client/animations/SlideFromBottom.js +24 -0
  108. package/dist/client/animations/SlideFromBottom.js.map +1 -0
  109. package/dist/client/animations/SlideFromRight.d.ts +6 -0
  110. package/dist/client/animations/SlideFromRight.d.ts.map +1 -0
  111. package/dist/client/animations/SlideFromRight.js +24 -0
  112. package/dist/client/animations/SlideFromRight.js.map +1 -0
  113. package/dist/client/audio/AudioPlayer.d.ts +11 -0
  114. package/dist/client/audio/AudioPlayer.d.ts.map +1 -0
  115. package/dist/client/audio/AudioPlayer.js +51 -0
  116. package/dist/client/audio/AudioPlayer.js.map +1 -0
  117. package/dist/client/audio/AudioRecorder.d.ts +11 -0
  118. package/dist/client/audio/AudioRecorder.d.ts.map +1 -0
  119. package/dist/client/audio/AudioRecorder.js +66 -0
  120. package/dist/client/audio/AudioRecorder.js.map +1 -0
  121. package/dist/client/audio/audioPlayer.worklet.d.ts +2 -0
  122. package/dist/client/audio/audioPlayer.worklet.d.ts.map +1 -0
  123. package/dist/client/audio/audioPlayer.worklet.js +46 -0
  124. package/dist/client/audio/audioPlayer.worklet.js.map +1 -0
  125. package/dist/client/audio/useSTT.d.ts +19 -0
  126. package/dist/client/audio/useSTT.d.ts.map +1 -0
  127. package/dist/client/audio/useSTT.js +91 -0
  128. package/dist/client/audio/useSTT.js.map +1 -0
  129. package/dist/client/audio/useTTS.d.ts +17 -0
  130. package/dist/client/audio/useTTS.d.ts.map +1 -0
  131. package/dist/client/audio/useTTS.js +70 -0
  132. package/dist/client/audio/useTTS.js.map +1 -0
  133. package/dist/client/components/Button.d.ts +22 -0
  134. package/dist/client/components/Button.d.ts.map +1 -0
  135. package/dist/client/components/Button.js +27 -0
  136. package/dist/client/components/Button.js.map +1 -0
  137. package/dist/client/components/Card.d.ts +8 -0
  138. package/dist/client/components/Card.d.ts.map +1 -0
  139. package/dist/client/components/Card.js +6 -0
  140. package/dist/client/components/Card.js.map +1 -0
  141. package/dist/client/components/EnumInput.d.ts +16 -0
  142. package/dist/client/components/EnumInput.d.ts.map +1 -0
  143. package/dist/client/components/EnumInput.js +11 -0
  144. package/dist/client/components/EnumInput.js.map +1 -0
  145. package/dist/client/components/FeedbackButton.d.ts +9 -0
  146. package/dist/client/components/FeedbackButton.d.ts.map +1 -0
  147. package/dist/client/components/FeedbackButton.js +112 -0
  148. package/dist/client/components/FeedbackButton.js.map +1 -0
  149. package/dist/client/components/Header.d.ts +10 -0
  150. package/dist/client/components/Header.d.ts.map +1 -0
  151. package/dist/client/components/Header.js +12 -0
  152. package/dist/client/components/Header.js.map +1 -0
  153. package/dist/client/components/Image.d.ts +20 -0
  154. package/dist/client/components/Image.d.ts.map +1 -0
  155. package/dist/client/components/Image.js +12 -0
  156. package/dist/client/components/Image.js.map +1 -0
  157. package/dist/client/components/Input.d.ts +14 -0
  158. package/dist/client/components/Input.d.ts.map +1 -0
  159. package/dist/client/components/Input.js +19 -0
  160. package/dist/client/components/Input.js.map +1 -0
  161. package/dist/client/components/Modal.d.ts +9 -0
  162. package/dist/client/components/Modal.d.ts.map +1 -0
  163. package/dist/client/components/Modal.js +19 -0
  164. package/dist/client/components/Modal.js.map +1 -0
  165. package/dist/client/components/PageLayout.d.ts +9 -0
  166. package/dist/client/components/PageLayout.d.ts.map +1 -0
  167. package/dist/client/components/PageLayout.js +6 -0
  168. package/dist/client/components/PageLayout.js.map +1 -0
  169. package/dist/client/components/Panel.d.ts +8 -0
  170. package/dist/client/components/Panel.d.ts.map +1 -0
  171. package/dist/client/components/Panel.js +5 -0
  172. package/dist/client/components/Panel.js.map +1 -0
  173. package/dist/client/components/PopupPanel.d.ts +9 -0
  174. package/dist/client/components/PopupPanel.d.ts.map +1 -0
  175. package/dist/client/components/PopupPanel.js +5 -0
  176. package/dist/client/components/PopupPanel.js.map +1 -0
  177. package/dist/client/components/Pressable.d.ts +14 -0
  178. package/dist/client/components/Pressable.d.ts.map +1 -0
  179. package/dist/client/components/Pressable.js +8 -0
  180. package/dist/client/components/Pressable.js.map +1 -0
  181. package/dist/client/components/ScrollView.d.ts +9 -0
  182. package/dist/client/components/ScrollView.d.ts.map +1 -0
  183. package/dist/client/components/ScrollView.js +7 -0
  184. package/dist/client/components/ScrollView.js.map +1 -0
  185. package/dist/client/components/SettingGroup.d.ts +10 -0
  186. package/dist/client/components/SettingGroup.d.ts.map +1 -0
  187. package/dist/client/components/SettingGroup.js +8 -0
  188. package/dist/client/components/SettingGroup.js.map +1 -0
  189. package/dist/client/components/Text.d.ts +21 -0
  190. package/dist/client/components/Text.d.ts.map +1 -0
  191. package/dist/client/components/Text.js +43 -0
  192. package/dist/client/components/Text.js.map +1 -0
  193. package/dist/client/components/Toast.d.ts +10 -0
  194. package/dist/client/components/Toast.d.ts.map +1 -0
  195. package/dist/client/components/Toast.js +21 -0
  196. package/dist/client/components/Toast.js.map +1 -0
  197. package/dist/client/components/View.d.ts +9 -0
  198. package/dist/client/components/View.d.ts.map +1 -0
  199. package/dist/client/components/View.js +5 -0
  200. package/dist/client/components/View.js.map +1 -0
  201. package/dist/client/components/index.d.ts +33 -0
  202. package/dist/client/components/index.d.ts.map +1 -0
  203. package/dist/client/components/index.js +17 -0
  204. package/dist/client/components/index.js.map +1 -0
  205. package/dist/client/components/zIndex.d.ts +10 -0
  206. package/dist/client/components/zIndex.d.ts.map +1 -0
  207. package/dist/client/components/zIndex.js +12 -0
  208. package/dist/client/components/zIndex.js.map +1 -0
  209. package/dist/client/createSocket.d.ts +26 -0
  210. package/dist/client/createSocket.d.ts.map +1 -0
  211. package/dist/client/createSocket.js +138 -0
  212. package/dist/client/createSocket.js.map +1 -0
  213. package/dist/client/index.d.ts +27 -0
  214. package/dist/client/index.d.ts.map +1 -0
  215. package/dist/client/index.js +20 -0
  216. package/dist/client/index.js.map +1 -0
  217. package/dist/playwright/index.d.ts +16 -0
  218. package/dist/playwright/index.d.ts.map +1 -0
  219. package/dist/playwright/index.js +32 -0
  220. package/dist/playwright/index.js.map +1 -0
  221. package/dist/server/App.d.ts +43 -0
  222. package/dist/server/App.d.ts.map +1 -0
  223. package/dist/server/App.js +215 -0
  224. package/dist/server/App.js.map +1 -0
  225. package/dist/server/Auth.d.ts +21 -0
  226. package/dist/server/Auth.d.ts.map +1 -0
  227. package/dist/server/Auth.js +171 -0
  228. package/dist/server/Auth.js.map +1 -0
  229. package/dist/server/Cache.d.ts +38 -0
  230. package/dist/server/Cache.d.ts.map +1 -0
  231. package/dist/server/Cache.js +113 -0
  232. package/dist/server/Cache.js.map +1 -0
  233. package/dist/server/ChangeStream.d.ts +22 -0
  234. package/dist/server/ChangeStream.d.ts.map +1 -0
  235. package/dist/server/ChangeStream.js +93 -0
  236. package/dist/server/ChangeStream.js.map +1 -0
  237. package/dist/server/DB.d.ts +17 -0
  238. package/dist/server/DB.d.ts.map +1 -0
  239. package/dist/server/DB.js +442 -0
  240. package/dist/server/DB.js.map +1 -0
  241. package/dist/server/Email.d.ts +22 -0
  242. package/dist/server/Email.d.ts.map +1 -0
  243. package/dist/server/Email.js +64 -0
  244. package/dist/server/Email.js.map +1 -0
  245. package/dist/server/EmailTemplate.d.ts +17 -0
  246. package/dist/server/EmailTemplate.d.ts.map +1 -0
  247. package/dist/server/EmailTemplate.js +29 -0
  248. package/dist/server/EmailTemplate.js.map +1 -0
  249. package/dist/server/FeedbackReport.d.ts +19 -0
  250. package/dist/server/FeedbackReport.d.ts.map +1 -0
  251. package/dist/server/FeedbackReport.js +94 -0
  252. package/dist/server/FeedbackReport.js.map +1 -0
  253. package/dist/server/ImageGen.d.ts +5 -0
  254. package/dist/server/ImageGen.d.ts.map +1 -0
  255. package/dist/server/ImageGen.js +5 -0
  256. package/dist/server/ImageGen.js.map +1 -0
  257. package/dist/server/Logging.d.ts +59 -0
  258. package/dist/server/Logging.d.ts.map +1 -0
  259. package/dist/server/Logging.js +293 -0
  260. package/dist/server/Logging.js.map +1 -0
  261. package/dist/server/Nats.d.ts +56 -0
  262. package/dist/server/Nats.d.ts.map +1 -0
  263. package/dist/server/Nats.js +162 -0
  264. package/dist/server/Nats.js.map +1 -0
  265. package/dist/server/NatsStore.d.ts +26 -0
  266. package/dist/server/NatsStore.d.ts.map +1 -0
  267. package/dist/server/NatsStore.js +86 -0
  268. package/dist/server/NatsStore.js.map +1 -0
  269. package/dist/server/PushNotification.d.ts +33 -0
  270. package/dist/server/PushNotification.d.ts.map +1 -0
  271. package/dist/server/PushNotification.js +131 -0
  272. package/dist/server/PushNotification.js.map +1 -0
  273. package/dist/server/RateLimit.d.ts +28 -0
  274. package/dist/server/RateLimit.d.ts.map +1 -0
  275. package/dist/server/RateLimit.js +101 -0
  276. package/dist/server/RateLimit.js.map +1 -0
  277. package/dist/server/Redis.d.ts +61 -0
  278. package/dist/server/Redis.d.ts.map +1 -0
  279. package/dist/server/Redis.js +226 -0
  280. package/dist/server/Redis.js.map +1 -0
  281. package/dist/server/Router.d.ts +27 -0
  282. package/dist/server/Router.d.ts.map +1 -0
  283. package/dist/server/Router.js +71 -0
  284. package/dist/server/Router.js.map +1 -0
  285. package/dist/server/Socket.d.ts +8 -0
  286. package/dist/server/Socket.d.ts.map +1 -0
  287. package/dist/server/Socket.js +278 -0
  288. package/dist/server/Socket.js.map +1 -0
  289. package/dist/server/SpendTracker.d.ts +18 -0
  290. package/dist/server/SpendTracker.d.ts.map +1 -0
  291. package/dist/server/SpendTracker.js +110 -0
  292. package/dist/server/SpendTracker.js.map +1 -0
  293. package/dist/server/Storage.d.ts +16 -0
  294. package/dist/server/Storage.d.ts.map +1 -0
  295. package/dist/server/Storage.js +95 -0
  296. package/dist/server/Storage.js.map +1 -0
  297. package/dist/server/TextGen.d.ts +5 -0
  298. package/dist/server/TextGen.d.ts.map +1 -0
  299. package/dist/server/TextGen.js +6 -0
  300. package/dist/server/TextGen.js.map +1 -0
  301. package/dist/server/WorkerQueue.d.ts +27 -0
  302. package/dist/server/WorkerQueue.d.ts.map +1 -0
  303. package/dist/server/WorkerQueue.js +147 -0
  304. package/dist/server/WorkerQueue.js.map +1 -0
  305. package/dist/server/ai/ImageGenClient.d.ts +6 -0
  306. package/dist/server/ai/ImageGenClient.d.ts.map +1 -0
  307. package/dist/server/ai/ImageGenClient.js +29 -0
  308. package/dist/server/ai/ImageGenClient.js.map +1 -0
  309. package/dist/server/ai/ProviderBalance.d.ts +15 -0
  310. package/dist/server/ai/ProviderBalance.d.ts.map +1 -0
  311. package/dist/server/ai/ProviderBalance.js +110 -0
  312. package/dist/server/ai/ProviderBalance.js.map +1 -0
  313. package/dist/server/ai/ProviderSelector.d.ts +13 -0
  314. package/dist/server/ai/ProviderSelector.d.ts.map +1 -0
  315. package/dist/server/ai/ProviderSelector.js +25 -0
  316. package/dist/server/ai/ProviderSelector.js.map +1 -0
  317. package/dist/server/ai/TextGenClient.d.ts +9 -0
  318. package/dist/server/ai/TextGenClient.d.ts.map +1 -0
  319. package/dist/server/ai/TextGenClient.js +72 -0
  320. package/dist/server/ai/TextGenClient.js.map +1 -0
  321. package/dist/server/ai/fallbacks.d.ts +9 -0
  322. package/dist/server/ai/fallbacks.d.ts.map +1 -0
  323. package/dist/server/ai/fallbacks.js +77 -0
  324. package/dist/server/ai/fallbacks.js.map +1 -0
  325. package/dist/server/ai/index.d.ts +12 -0
  326. package/dist/server/ai/index.d.ts.map +1 -0
  327. package/dist/server/ai/index.js +37 -0
  328. package/dist/server/ai/index.js.map +1 -0
  329. package/dist/server/ai/providers/Claude.d.ts +3 -0
  330. package/dist/server/ai/providers/Claude.d.ts.map +1 -0
  331. package/dist/server/ai/providers/Claude.js +124 -0
  332. package/dist/server/ai/providers/Claude.js.map +1 -0
  333. package/dist/server/ai/providers/FAL.d.ts +3 -0
  334. package/dist/server/ai/providers/FAL.d.ts.map +1 -0
  335. package/dist/server/ai/providers/FAL.js +24 -0
  336. package/dist/server/ai/providers/FAL.js.map +1 -0
  337. package/dist/server/ai/providers/Fireworks.d.ts +3 -0
  338. package/dist/server/ai/providers/Fireworks.d.ts.map +1 -0
  339. package/dist/server/ai/providers/Fireworks.js +79 -0
  340. package/dist/server/ai/providers/Fireworks.js.map +1 -0
  341. package/dist/server/ai/providers/Google.d.ts +3 -0
  342. package/dist/server/ai/providers/Google.d.ts.map +1 -0
  343. package/dist/server/ai/providers/Google.js +105 -0
  344. package/dist/server/ai/providers/Google.js.map +1 -0
  345. package/dist/server/ai/providers/GoogleImage.d.ts +3 -0
  346. package/dist/server/ai/providers/GoogleImage.d.ts.map +1 -0
  347. package/dist/server/ai/providers/GoogleImage.js +24 -0
  348. package/dist/server/ai/providers/GoogleImage.js.map +1 -0
  349. package/dist/server/ai/providers/Groq.d.ts +3 -0
  350. package/dist/server/ai/providers/Groq.d.ts.map +1 -0
  351. package/dist/server/ai/providers/Groq.js +99 -0
  352. package/dist/server/ai/providers/Groq.js.map +1 -0
  353. package/dist/server/ai/providers/Kie.d.ts +3 -0
  354. package/dist/server/ai/providers/Kie.d.ts.map +1 -0
  355. package/dist/server/ai/providers/Kie.js +79 -0
  356. package/dist/server/ai/providers/Kie.js.map +1 -0
  357. package/dist/server/ai/providers/KieImage.d.ts +3 -0
  358. package/dist/server/ai/providers/KieImage.d.ts.map +1 -0
  359. package/dist/server/ai/providers/KieImage.js +50 -0
  360. package/dist/server/ai/providers/KieImage.js.map +1 -0
  361. package/dist/server/ai/providers/OpenAIText.d.ts +3 -0
  362. package/dist/server/ai/providers/OpenAIText.d.ts.map +1 -0
  363. package/dist/server/ai/providers/OpenAIText.js +103 -0
  364. package/dist/server/ai/providers/OpenAIText.js.map +1 -0
  365. package/dist/server/ai/providers/Together.d.ts +3 -0
  366. package/dist/server/ai/providers/Together.d.ts.map +1 -0
  367. package/dist/server/ai/providers/Together.js +99 -0
  368. package/dist/server/ai/providers/Together.js.map +1 -0
  369. package/dist/server/ai/providers/TogetherImage.d.ts +3 -0
  370. package/dist/server/ai/providers/TogetherImage.d.ts.map +1 -0
  371. package/dist/server/ai/providers/TogetherImage.js +24 -0
  372. package/dist/server/ai/providers/TogetherImage.js.map +1 -0
  373. package/dist/server/ai/providers/Wavespeed.d.ts +3 -0
  374. package/dist/server/ai/providers/Wavespeed.d.ts.map +1 -0
  375. package/dist/server/ai/providers/Wavespeed.js +53 -0
  376. package/dist/server/ai/providers/Wavespeed.js.map +1 -0
  377. package/dist/server/ai/registry.d.ts +10 -0
  378. package/dist/server/ai/registry.d.ts.map +1 -0
  379. package/dist/server/ai/registry.js +26 -0
  380. package/dist/server/ai/registry.js.map +1 -0
  381. package/dist/server/ai/types.d.ts +67 -0
  382. package/dist/server/ai/types.d.ts.map +1 -0
  383. package/dist/server/ai/types.js +17 -0
  384. package/dist/server/ai/types.js.map +1 -0
  385. package/dist/server/audio/STTStream.d.ts +12 -0
  386. package/dist/server/audio/STTStream.d.ts.map +1 -0
  387. package/dist/server/audio/STTStream.js +59 -0
  388. package/dist/server/audio/STTStream.js.map +1 -0
  389. package/dist/server/audio/TTSStream.d.ts +16 -0
  390. package/dist/server/audio/TTSStream.d.ts.map +1 -0
  391. package/dist/server/audio/TTSStream.js +151 -0
  392. package/dist/server/audio/TTSStream.js.map +1 -0
  393. package/dist/server/audio/index.d.ts +5 -0
  394. package/dist/server/audio/index.d.ts.map +1 -0
  395. package/dist/server/audio/index.js +14 -0
  396. package/dist/server/audio/index.js.map +1 -0
  397. package/dist/server/audio/resample.d.ts +7 -0
  398. package/dist/server/audio/resample.d.ts.map +1 -0
  399. package/dist/server/audio/resample.js +17 -0
  400. package/dist/server/audio/resample.js.map +1 -0
  401. package/dist/server/audio/stt/GroqWhisper.d.ts +3 -0
  402. package/dist/server/audio/stt/GroqWhisper.d.ts.map +1 -0
  403. package/dist/server/audio/stt/GroqWhisper.js +91 -0
  404. package/dist/server/audio/stt/GroqWhisper.js.map +1 -0
  405. package/dist/server/audio/stt/registry.d.ts +5 -0
  406. package/dist/server/audio/stt/registry.d.ts.map +1 -0
  407. package/dist/server/audio/stt/registry.js +11 -0
  408. package/dist/server/audio/stt/registry.js.map +1 -0
  409. package/dist/server/audio/stt/types.d.ts +25 -0
  410. package/dist/server/audio/stt/types.d.ts.map +1 -0
  411. package/dist/server/audio/stt/types.js +2 -0
  412. package/dist/server/audio/stt/types.js.map +1 -0
  413. package/dist/server/audio/stt/vad.d.ts +18 -0
  414. package/dist/server/audio/stt/vad.d.ts.map +1 -0
  415. package/dist/server/audio/stt/vad.js +90 -0
  416. package/dist/server/audio/stt/vad.js.map +1 -0
  417. package/dist/server/audio/tts/InWorld.d.ts +3 -0
  418. package/dist/server/audio/tts/InWorld.d.ts.map +1 -0
  419. package/dist/server/audio/tts/InWorld.js +147 -0
  420. package/dist/server/audio/tts/InWorld.js.map +1 -0
  421. package/dist/server/audio/tts/providers/Azure.d.ts +3 -0
  422. package/dist/server/audio/tts/providers/Azure.d.ts.map +1 -0
  423. package/dist/server/audio/tts/providers/Azure.js +31 -0
  424. package/dist/server/audio/tts/providers/Azure.js.map +1 -0
  425. package/dist/server/audio/tts/registry.d.ts +6 -0
  426. package/dist/server/audio/tts/registry.d.ts.map +1 -0
  427. package/dist/server/audio/tts/registry.js +12 -0
  428. package/dist/server/audio/tts/registry.js.map +1 -0
  429. package/dist/server/audio/tts/types.d.ts +20 -0
  430. package/dist/server/audio/tts/types.d.ts.map +1 -0
  431. package/dist/server/audio/tts/types.js +2 -0
  432. package/dist/server/audio/tts/types.js.map +1 -0
  433. package/dist/server/billing/BillingGateway.d.ts +40 -0
  434. package/dist/server/billing/BillingGateway.d.ts.map +1 -0
  435. package/dist/server/billing/BillingGateway.js +116 -0
  436. package/dist/server/billing/BillingGateway.js.map +1 -0
  437. package/dist/server/billing/BillingLedger.d.ts +67 -0
  438. package/dist/server/billing/BillingLedger.d.ts.map +1 -0
  439. package/dist/server/billing/BillingLedger.js +214 -0
  440. package/dist/server/billing/BillingLedger.js.map +1 -0
  441. package/dist/server/billing/CreditStore.d.ts +58 -0
  442. package/dist/server/billing/CreditStore.d.ts.map +1 -0
  443. package/dist/server/billing/CreditStore.js +112 -0
  444. package/dist/server/billing/CreditStore.js.map +1 -0
  445. package/dist/server/billing/LimitEnforcer.d.ts +73 -0
  446. package/dist/server/billing/LimitEnforcer.d.ts.map +1 -0
  447. package/dist/server/billing/LimitEnforcer.js +276 -0
  448. package/dist/server/billing/LimitEnforcer.js.map +1 -0
  449. package/dist/server/billing/UserLimitCache.d.ts +35 -0
  450. package/dist/server/billing/UserLimitCache.d.ts.map +1 -0
  451. package/dist/server/billing/UserLimitCache.js +91 -0
  452. package/dist/server/billing/UserLimitCache.js.map +1 -0
  453. package/dist/server/billing/index.d.ts +6 -0
  454. package/dist/server/billing/index.d.ts.map +1 -0
  455. package/dist/server/billing/index.js +4 -0
  456. package/dist/server/billing/index.js.map +1 -0
  457. package/dist/server/billing/types.d.ts +95 -0
  458. package/dist/server/billing/types.d.ts.map +1 -0
  459. package/dist/server/billing/types.js +19 -0
  460. package/dist/server/billing/types.js.map +1 -0
  461. package/dist/server/embeddings/EmbeddingClient.d.ts +8 -0
  462. package/dist/server/embeddings/EmbeddingClient.d.ts.map +1 -0
  463. package/dist/server/embeddings/EmbeddingClient.js +30 -0
  464. package/dist/server/embeddings/EmbeddingClient.js.map +1 -0
  465. package/dist/server/embeddings/index.d.ts +5 -0
  466. package/dist/server/embeddings/index.d.ts.map +1 -0
  467. package/dist/server/embeddings/index.js +6 -0
  468. package/dist/server/embeddings/index.js.map +1 -0
  469. package/dist/server/embeddings/providers/OpenAI.d.ts +3 -0
  470. package/dist/server/embeddings/providers/OpenAI.d.ts.map +1 -0
  471. package/dist/server/embeddings/providers/OpenAI.js +28 -0
  472. package/dist/server/embeddings/providers/OpenAI.js.map +1 -0
  473. package/dist/server/embeddings/registry.d.ts +7 -0
  474. package/dist/server/embeddings/registry.d.ts.map +1 -0
  475. package/dist/server/embeddings/registry.js +15 -0
  476. package/dist/server/embeddings/registry.js.map +1 -0
  477. package/dist/server/embeddings/types.d.ts +12 -0
  478. package/dist/server/embeddings/types.d.ts.map +1 -0
  479. package/dist/server/embeddings/types.js +2 -0
  480. package/dist/server/embeddings/types.js.map +1 -0
  481. package/dist/server/index.d.ts +59 -0
  482. package/dist/server/index.d.ts.map +1 -0
  483. package/dist/server/index.js +41 -0
  484. package/dist/server/index.js.map +1 -0
  485. package/dist/shared/Api.d.ts +40 -0
  486. package/dist/shared/Api.d.ts.map +1 -0
  487. package/dist/shared/Api.js +30 -0
  488. package/dist/shared/Api.js.map +1 -0
  489. package/dist/shared/Audio.d.ts +108 -0
  490. package/dist/shared/Audio.d.ts.map +1 -0
  491. package/dist/shared/Audio.js +3 -0
  492. package/dist/shared/Audio.js.map +1 -0
  493. package/dist/shared/DB.d.ts +339 -0
  494. package/dist/shared/DB.d.ts.map +1 -0
  495. package/dist/shared/DB.js +51 -0
  496. package/dist/shared/DB.js.map +1 -0
  497. package/dist/shared/Errors.d.ts +10 -0
  498. package/dist/shared/Errors.d.ts.map +1 -0
  499. package/dist/shared/Errors.js +19 -0
  500. package/dist/shared/Errors.js.map +1 -0
  501. package/dist/shared/FeedbackReport.d.ts +38 -0
  502. package/dist/shared/FeedbackReport.d.ts.map +1 -0
  503. package/dist/shared/FeedbackReport.js +14 -0
  504. package/dist/shared/FeedbackReport.js.map +1 -0
  505. package/dist/shared/Router.d.ts +28 -0
  506. package/dist/shared/Router.d.ts.map +1 -0
  507. package/dist/shared/Router.js +82 -0
  508. package/dist/shared/Router.js.map +1 -0
  509. package/dist/shared/Socket.d.ts +26 -0
  510. package/dist/shared/Socket.d.ts.map +1 -0
  511. package/dist/shared/Socket.js +2 -0
  512. package/dist/shared/Socket.js.map +1 -0
  513. package/dist/shared/index.d.ts +28 -0
  514. package/dist/shared/index.d.ts.map +1 -0
  515. package/dist/shared/index.js +61 -0
  516. package/dist/shared/index.js.map +1 -0
  517. package/dist/webrtc/index.d.ts +14 -0
  518. package/dist/webrtc/index.d.ts.map +1 -0
  519. package/dist/webrtc/index.js +24 -0
  520. package/dist/webrtc/index.js.map +1 -0
  521. package/package.json +97 -0
  522. package/templates/.claude/skills/assets.md +39 -0
  523. package/templates/.claude/skills/check-errors.md +35 -0
  524. package/templates/.claude/skills/check-feedback.md +23 -0
  525. package/templates/.claude/skills/check-perf.md +22 -0
  526. package/templates/.claude/skills/create-test-users.md +34 -0
  527. package/templates/.claude/skills/extend-api.md +37 -0
  528. package/templates/.claude/skills/fix-code.md +5 -0
  529. package/templates/.claude/skills/fix-errors.md +9 -0
  530. package/templates/.claude/skills/fix-feedback.md +8 -0
  531. package/templates/.claude/skills/fix-perf.md +8 -0
  532. package/templates/.claude/skills/uploads.md +38 -0
  533. package/templates/.claude/skills/use-ai.md +49 -0
  534. package/templates/.env.example +49 -0
  535. package/templates/.husky/pre-commit +2 -0
  536. package/templates/CLAUDE.md +199 -0
  537. package/templates/client/App.tsx +33 -0
  538. package/templates/client/index.html +14 -0
  539. package/templates/client/main.tsx +52 -0
  540. package/templates/client/pages/AuthDemoPage.tsx +85 -0
  541. package/templates/client/pages/HomePage.tsx +111 -0
  542. package/templates/client/pages/SearchPage.tsx +48 -0
  543. package/templates/client/pages/UserPage.tsx +33 -0
  544. package/templates/client/router.ts +4 -0
  545. package/templates/docker-compose.yml +50 -0
  546. package/templates/index.html +14 -0
  547. package/templates/package.json +56 -0
  548. package/templates/playwright.config.ts +21 -0
  549. package/templates/server/index.ts +24 -0
  550. package/templates/shared/api.ts +36 -0
  551. package/templates/shared/collections.ts +11 -0
  552. package/templates/shared/dbIndexes.ts +11 -0
  553. package/templates/shared/pages.ts +8 -0
  554. package/templates/vite.config.ts +17 -0
@@ -0,0 +1,276 @@
1
+ import { WINDOW_MS } from './BillingLedger.js';
2
+ import { BillingLimitError, BillingValidationError } from './types.js';
3
+ const HOUR_MS = WINDOW_MS.HOUR;
4
+ const DAY_MS = WINDOW_MS.DAY;
5
+ const WEEK_MS = WINDOW_MS.WEEK;
6
+ /**
7
+ * Checks all billing limits and fires threshold callbacks.
8
+ *
9
+ * Global and provider hourly limits use a synchronous in-memory rolling
10
+ * accumulator — race-free within a single Node.js process.
11
+ *
12
+ * Per-user hourly/daily/weekly limits perform async DB queries via BillingLedger.
13
+ *
14
+ * Known limitations (documented):
15
+ * - Multi-server: each server's accumulator is independent; limits are eventually
16
+ * consistent up to the reconciliation interval.
17
+ * - TOCTOU for per-user async checks: concurrent charges for the same userId can
18
+ * both pass under very high concurrent load. Mitigable with per-userId mutex (v2).
19
+ */
20
+ export class LimitEnforcer {
21
+ ledger;
22
+ userLimits;
23
+ config;
24
+ credits;
25
+ accumulators = new Map();
26
+ // Tracks which threshold ratios have already fired per window key this window
27
+ firedThresholds = new Map();
28
+ userThresholdCb = null;
29
+ globalThresholdCb = null;
30
+ constructor(ledger, userLimits, config, credits = null) {
31
+ this.ledger = ledger;
32
+ this.userLimits = userLimits;
33
+ this.config = config;
34
+ this.credits = credits;
35
+ }
36
+ setUserThresholdCallback(fn) {
37
+ this.userThresholdCb = fn;
38
+ }
39
+ setGlobalThresholdCallback(fn) {
40
+ this.globalThresholdCb = fn;
41
+ }
42
+ /**
43
+ * Load current-window spend from DB to warm the in-memory accumulators.
44
+ * Called by BillingGateway.start() before serving traffic.
45
+ */
46
+ async init() {
47
+ const now = Date.now();
48
+ const globalSpend = await this.ledger.getWindowSpend(HOUR_MS);
49
+ if (globalSpend > 0) {
50
+ this.addToAccumulator('global', globalSpend, now);
51
+ }
52
+ for (const provider of Object.keys(this.config.providers ?? {})) {
53
+ const spend = await this.ledger.getWindowSpend(HOUR_MS, {
54
+ provider,
55
+ });
56
+ if (spend > 0) {
57
+ this.addToAccumulator(`provider:${provider}`, spend, now);
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Check all applicable limits for a charge.
63
+ *
64
+ * Check order (observable — documented):
65
+ * 1. global-hourly
66
+ * 2. provider-hourly
67
+ * 3. user-hourly
68
+ * 4. user-daily
69
+ * 5. user-weekly
70
+ *
71
+ * Throws BillingLimitError on first violation.
72
+ * Throws BillingValidationError on invalid input.
73
+ */
74
+ async check(params) {
75
+ const now = Date.now();
76
+ const { costUsd } = params;
77
+ // 1. Validate
78
+ if (!Number.isFinite(costUsd) || costUsd <= 0) {
79
+ throw new BillingValidationError(`costUsd must be a finite positive number, got ${String(costUsd)}`);
80
+ }
81
+ const provider = params.provider?.trim().toLowerCase();
82
+ if (!provider) {
83
+ throw new BillingValidationError('provider must be a non-empty string');
84
+ }
85
+ // 2. Global hourly check (synchronous — pruned before reading)
86
+ this.pruneAccumulator('global', now);
87
+ const globalPrev = this.sumAccumulator('global');
88
+ if (globalPrev + costUsd > this.config.global.hourlyUsd) {
89
+ throw new BillingLimitError('global-hourly', globalPrev, this.config.global.hourlyUsd);
90
+ }
91
+ // 3. Provider hourly check
92
+ const providerKey = `provider:${provider}`;
93
+ const providerLimit = this.config.providers?.[provider]?.hourlyUsd;
94
+ let providerPrev = 0;
95
+ if (providerLimit !== undefined) {
96
+ this.pruneAccumulator(providerKey, now);
97
+ providerPrev = this.sumAccumulator(providerKey);
98
+ if (providerPrev + costUsd > providerLimit) {
99
+ throw new BillingLimitError('provider-hourly', providerPrev, providerLimit);
100
+ }
101
+ }
102
+ // 4. Optimistically update accumulators (before async user checks)
103
+ this.addToAccumulator('global', costUsd, now);
104
+ if (providerLimit !== undefined) {
105
+ this.addToAccumulator(providerKey, costUsd, now);
106
+ }
107
+ // 5. Per-user async checks
108
+ if (params.userId) {
109
+ try {
110
+ await this.checkUserLimits(params.userId, costUsd);
111
+ }
112
+ catch (err) {
113
+ // Roll back optimistic accumulator entries on user limit violation
114
+ this.removeFromAccumulator('global', costUsd, now);
115
+ if (providerLimit !== undefined) {
116
+ this.removeFromAccumulator(providerKey, costUsd, now);
117
+ }
118
+ throw err;
119
+ }
120
+ }
121
+ // 6. Fire threshold callbacks (errors swallowed — never block a charge)
122
+ this.maybeFireGlobalThreshold('global', globalPrev, globalPrev + costUsd, this.config.global.hourlyUsd, this.config.global.thresholdPct);
123
+ if (providerLimit !== undefined) {
124
+ this.maybeFireGlobalThreshold(providerKey, providerPrev, providerPrev + costUsd, providerLimit, this.config.providers[provider].thresholdPct, provider);
125
+ }
126
+ }
127
+ // ---------------------------------------------------------------------------
128
+ // Private — accumulator management
129
+ // ---------------------------------------------------------------------------
130
+ addToAccumulator(key, cost, ts) {
131
+ const entries = this.accumulators.get(key) ?? [];
132
+ entries.push({ cost, ts });
133
+ this.accumulators.set(key, entries);
134
+ }
135
+ /** Remove the most recent entry that matches cost+ts (rollback of optimistic add). */
136
+ removeFromAccumulator(key, cost, ts) {
137
+ const entries = this.accumulators.get(key);
138
+ if (!entries)
139
+ return;
140
+ for (let i = entries.length - 1; i >= 0; i--) {
141
+ if (entries[i].cost === cost && entries[i].ts === ts) {
142
+ entries.splice(i, 1);
143
+ return;
144
+ }
145
+ }
146
+ }
147
+ pruneAccumulator(key, now) {
148
+ const entries = this.accumulators.get(key);
149
+ if (!entries || entries.length === 0)
150
+ return;
151
+ const cutoff = now - HOUR_MS;
152
+ const pruned = entries.filter((e) => e.ts > cutoff);
153
+ this.accumulators.set(key, pruned);
154
+ if (pruned.length === 0) {
155
+ // Window fully rolled over — reset threshold state so it can fire again
156
+ this.firedThresholds.delete(key);
157
+ }
158
+ }
159
+ sumAccumulator(key) {
160
+ const entries = this.accumulators.get(key);
161
+ if (!entries)
162
+ return 0;
163
+ return entries.reduce((sum, e) => sum + e.cost, 0);
164
+ }
165
+ // ---------------------------------------------------------------------------
166
+ // Private — per-user limit checks
167
+ // ---------------------------------------------------------------------------
168
+ async checkUserLimits(userId, costUsd) {
169
+ const limits = await this.userLimits.get(userId);
170
+ if (!limits)
171
+ return; // null = no limits configured for this user
172
+ // User hourly
173
+ if (limits.hourlyUsd !== undefined) {
174
+ const spent = await this.ledger.getWindowSpend(HOUR_MS, { userId });
175
+ if (spent + costUsd > limits.hourlyUsd) {
176
+ await this.tryCreditsOrThrow(userId, costUsd, new BillingLimitError('user-hourly', spent, limits.hourlyUsd));
177
+ return; // credit covered it — skip remaining limit checks
178
+ }
179
+ this.maybeFireUserThreshold(userId, 'hourly', spent, spent + costUsd, limits.hourlyUsd, limits.thresholds?.hourly);
180
+ }
181
+ // User daily
182
+ if (limits.dailyUsd !== undefined) {
183
+ const spent = await this.ledger.getWindowSpend(DAY_MS, { userId });
184
+ if (spent + costUsd > limits.dailyUsd) {
185
+ await this.tryCreditsOrThrow(userId, costUsd, new BillingLimitError('user-daily', spent, limits.dailyUsd));
186
+ return;
187
+ }
188
+ this.maybeFireUserThreshold(userId, 'daily', spent, spent + costUsd, limits.dailyUsd, limits.thresholds?.daily);
189
+ }
190
+ // User weekly
191
+ if (limits.weeklyUsd !== undefined) {
192
+ const spent = await this.ledger.getWindowSpend(WEEK_MS, { userId });
193
+ if (spent + costUsd > limits.weeklyUsd) {
194
+ await this.tryCreditsOrThrow(userId, costUsd, new BillingLimitError('user-weekly', spent, limits.weeklyUsd));
195
+ return;
196
+ }
197
+ this.maybeFireUserThreshold(userId, 'weekly', spent, spent + costUsd, limits.weeklyUsd, limits.thresholds?.weekly);
198
+ }
199
+ }
200
+ /**
201
+ * If a CreditStore is configured and the user has sufficient balance, deduct and return.
202
+ * Otherwise throw the original limit error.
203
+ */
204
+ async tryCreditsOrThrow(userId, costUsd, limitErr) {
205
+ if (this.credits) {
206
+ const deducted = await this.credits.tryDeduct(userId, costUsd);
207
+ if (deducted)
208
+ return; // credit covered this charge
209
+ }
210
+ throw limitErr;
211
+ }
212
+ // ---------------------------------------------------------------------------
213
+ // Private — threshold callbacks
214
+ // ---------------------------------------------------------------------------
215
+ /**
216
+ * Fire the global/provider threshold callback if the charge crosses the threshold.
217
+ * Fires at most once per window per threshold ratio (deduplicated by firedThresholds map).
218
+ * Window reset is detected when the accumulator for that key becomes empty after pruning.
219
+ */
220
+ maybeFireGlobalThreshold(key, prevSpend, newSpend, limit, thresholdPct, provider) {
221
+ if (!this.globalThresholdCb || thresholdPct === undefined || limit <= 0)
222
+ return;
223
+ const prevRatio = prevSpend / limit;
224
+ const newRatio = newSpend / limit;
225
+ if (prevRatio >= thresholdPct || newRatio < thresholdPct)
226
+ return;
227
+ const fired = this.firedThresholds.get(key) ?? new Set();
228
+ if (fired.has(thresholdPct))
229
+ return;
230
+ fired.add(thresholdPct);
231
+ this.firedThresholds.set(key, fired);
232
+ try {
233
+ this.globalThresholdCb({
234
+ limitType: provider ? 'provider-hourly' : 'global-hourly',
235
+ provider,
236
+ spent: newSpend,
237
+ limit,
238
+ thresholdPct,
239
+ });
240
+ }
241
+ catch {
242
+ // Swallow — never block a charge
243
+ }
244
+ }
245
+ /**
246
+ * Fire the user threshold callback if the charge crosses a per-user window threshold.
247
+ * User threshold state is tracked per (userId, limitType) key.
248
+ */
249
+ maybeFireUserThreshold(userId, limitType, prevSpend, newSpend, limit, thresholdPct) {
250
+ if (!this.userThresholdCb || thresholdPct === undefined || limit <= 0)
251
+ return;
252
+ const prevRatio = prevSpend / limit;
253
+ const newRatio = newSpend / limit;
254
+ if (prevRatio >= thresholdPct || newRatio < thresholdPct)
255
+ return;
256
+ const key = `user:${userId}:${limitType}`;
257
+ const fired = this.firedThresholds.get(key) ?? new Set();
258
+ if (fired.has(thresholdPct))
259
+ return;
260
+ fired.add(thresholdPct);
261
+ this.firedThresholds.set(key, fired);
262
+ try {
263
+ this.userThresholdCb({
264
+ userId,
265
+ limitType,
266
+ spent: newSpend,
267
+ limit,
268
+ thresholdPct,
269
+ });
270
+ }
271
+ catch {
272
+ // Swallow
273
+ }
274
+ }
275
+ }
276
+ //# sourceMappingURL=LimitEnforcer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LimitEnforcer.js","sourceRoot":"","sources":["../../../src/server/billing/LimitEnforcer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { GetUserLimits, UserLimits } from './types.js';
2
+ /**
3
+ * Caches per-user spending limits returned by an async callback hook.
4
+ *
5
+ * - TTL tracked via Date.now() (fake-timer compatible)
6
+ * - LRU eviction to bound memory with many users
7
+ * - Concurrent miss deduplication: simultaneous gets for the same userId
8
+ * share one in-flight hook call
9
+ * - Errors from the hook are NOT cached (next call retries); returns null
10
+ * (fail-open — don't lock users out on infrastructure failures)
11
+ */
12
+ export declare class UserLimitCache {
13
+ private readonly ttlMs;
14
+ private readonly maxSize;
15
+ private hook;
16
+ private readonly cache;
17
+ private readonly inFlight;
18
+ constructor(ttlMs?: number, maxSize?: number);
19
+ /** Register or replace the async callback that retrieves limits for a userId. */
20
+ setHook(fn: GetUserLimits): void;
21
+ /**
22
+ * Get limits for a userId.
23
+ * - Returns cached entry (including null = "no limits") if not expired.
24
+ * - On miss or expiry: calls hook, caches result for TTL, returns it.
25
+ * - If hook throws: logs warning, returns null, does NOT cache.
26
+ * - Concurrent misses for the same userId share one in-flight promise.
27
+ */
28
+ get(userId: string): Promise<UserLimits | null>;
29
+ /** Remove a specific userId from the cache; next get() will call hook fresh. */
30
+ invalidate(userId: string): void;
31
+ /** Clear the entire cache. */
32
+ invalidateAll(): void;
33
+ private fetchFromHook;
34
+ }
35
+ //# sourceMappingURL=UserLimitCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserLimitCache.d.ts","sourceRoot":"","sources":["../../../src/server/billing/UserLimitCache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO5D;;;;;;;;;GASG;AACH,qBAAa,cAAc;IAOvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,IAAI,CAA8B;IAE1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiD;gBAGvD,KAAK,GAAE,MAAkB,EACzB,OAAO,GAAE,MAAe;IAQ3C,iFAAiF;IACjF,OAAO,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI;IAMhC;;;;;;OAMG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqBrD,gFAAgF;IAChF,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,8BAA8B;IAC9B,aAAa,IAAI,IAAI;YAQP,aAAa;CAiB5B"}
@@ -0,0 +1,91 @@
1
+ import { LRUCache } from 'lru-cache';
2
+ /**
3
+ * Caches per-user spending limits returned by an async callback hook.
4
+ *
5
+ * - TTL tracked via Date.now() (fake-timer compatible)
6
+ * - LRU eviction to bound memory with many users
7
+ * - Concurrent miss deduplication: simultaneous gets for the same userId
8
+ * share one in-flight hook call
9
+ * - Errors from the hook are NOT cached (next call retries); returns null
10
+ * (fail-open — don't lock users out on infrastructure failures)
11
+ */
12
+ export class UserLimitCache {
13
+ ttlMs;
14
+ maxSize;
15
+ hook = null;
16
+ // LRU used for eviction only — TTL is managed manually via CacheEntry.expiresAt
17
+ cache;
18
+ inFlight = new Map();
19
+ constructor(ttlMs = 3_600_000, maxSize = 10_000) {
20
+ this.ttlMs = ttlMs;
21
+ this.maxSize = maxSize;
22
+ this.cache = new LRUCache({
23
+ max: this.maxSize,
24
+ allowStale: false,
25
+ });
26
+ }
27
+ /** Register or replace the async callback that retrieves limits for a userId. */
28
+ setHook(fn) {
29
+ this.hook = fn;
30
+ this.cache.clear();
31
+ this.inFlight.clear();
32
+ }
33
+ /**
34
+ * Get limits for a userId.
35
+ * - Returns cached entry (including null = "no limits") if not expired.
36
+ * - On miss or expiry: calls hook, caches result for TTL, returns it.
37
+ * - If hook throws: logs warning, returns null, does NOT cache.
38
+ * - Concurrent misses for the same userId share one in-flight promise.
39
+ */
40
+ async get(userId) {
41
+ const entry = this.cache.get(userId);
42
+ if (entry !== undefined && Date.now() < entry.expiresAt) {
43
+ return entry.value; // null is a valid cached value (user has no limits)
44
+ }
45
+ // Expired or not present — evict if stale
46
+ if (entry !== undefined)
47
+ this.cache.delete(userId);
48
+ // Deduplicate concurrent in-flight requests for the same userId
49
+ const existing = this.inFlight.get(userId);
50
+ if (existing)
51
+ return existing;
52
+ const promise = this.fetchFromHook(userId);
53
+ this.inFlight.set(userId, promise);
54
+ try {
55
+ return await promise;
56
+ }
57
+ finally {
58
+ this.inFlight.delete(userId);
59
+ }
60
+ }
61
+ /** Remove a specific userId from the cache; next get() will call hook fresh. */
62
+ invalidate(userId) {
63
+ this.cache.delete(userId);
64
+ }
65
+ /** Clear the entire cache. */
66
+ invalidateAll() {
67
+ this.cache.clear();
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Private
71
+ // ---------------------------------------------------------------------------
72
+ async fetchFromHook(userId) {
73
+ if (!this.hook)
74
+ return null;
75
+ try {
76
+ const limits = await this.hook(userId);
77
+ // Cache result (including null = user has no limits)
78
+ this.cache.set(userId, {
79
+ value: limits,
80
+ expiresAt: Date.now() + this.ttlMs,
81
+ });
82
+ return limits;
83
+ }
84
+ catch (err) {
85
+ console.warn('[UserLimitCache] hook threw for userId', userId, err);
86
+ // Do NOT cache errors — next call will retry the hook
87
+ return null;
88
+ }
89
+ }
90
+ }
91
+ //# sourceMappingURL=UserLimitCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserLimitCache.js","sourceRoot":"","sources":["../../../src/server/billing/UserLimitCache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQrC;;;;;;;;;GASG;AACH,MAAM,OAAO,cAAc;IAON;IACA;IAPX,IAAI,GAAyB,IAAI,CAAC;IAC1C,gFAAgF;IAC/D,KAAK,CAA+B;IACpC,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE1E,YACmB,QAAgB,SAAS,EACzB,UAAkB,MAAM;QADxB,UAAK,GAAL,KAAK,CAAoB;QACzB,YAAO,GAAP,OAAO,CAAiB;QAEzC,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAqB;YAC5C,GAAG,EAAE,IAAI,CAAC,OAAO;YACjB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,EAAiB;QACvB,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACf,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,oDAAoD;QAC1E,CAAC;QACD,0CAA0C;QAC1C,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEnD,gEAAgE;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACnC,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC;QACvB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAED,8BAA8B;IAC9B,aAAa;QACX,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,8EAA8E;IAC9E,UAAU;IACV,8EAA8E;IAEtE,KAAK,CAAC,aAAa,CAAC,MAAc;QACxC,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,qDAAqD;YACrD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE;gBACrB,KAAK,EAAE,MAAM;gBACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK;aACnC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;YACpE,sDAAsD;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export { BillingGateway, getBillingGateway, initBillingGateway, } from './BillingGateway.js';
2
+ export { CreditStore, MongoCreditDB } from './CreditStore.js';
3
+ export type { CreditDB } from './CreditStore.js';
4
+ export { BillingLimitError, BillingValidationError } from './types.js';
5
+ export type { BillingConfig, BillingRecord, BillingType, ChargeParams, GetUserLimits, GlobalThresholdCallback, HistoryFilters, SpendFilters, UserCredit, UserLimits, UserThresholdCallback, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/billing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC9D,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACvE,YAAY,EACV,aAAa,EACb,aAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,UAAU,EACV,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { BillingGateway, getBillingGateway, initBillingGateway, } from './BillingGateway.js';
2
+ export { CreditStore, MongoCreditDB } from './CreditStore.js';
3
+ export { BillingLimitError, BillingValidationError } from './types.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/billing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,95 @@
1
+ export type BillingType = 'textGen' | 'imageGen' | 'stt' | 'tts' | 'embedding' | 'service';
2
+ export interface BillingRecord {
3
+ id: string;
4
+ userId?: string;
5
+ provider: string;
6
+ model: string;
7
+ type: BillingType;
8
+ costUsd: number;
9
+ inputTokens?: number;
10
+ outputTokens?: number;
11
+ imageCount?: number;
12
+ imageWidth?: number;
13
+ imageHeight?: number;
14
+ imageSteps?: number;
15
+ audioSeconds?: number;
16
+ timestamp: number;
17
+ }
18
+ export interface UserLimits {
19
+ hourlyUsd?: number;
20
+ dailyUsd?: number;
21
+ weeklyUsd?: number;
22
+ thresholds?: {
23
+ hourly?: number;
24
+ daily?: number;
25
+ weekly?: number;
26
+ };
27
+ }
28
+ export interface BillingConfig {
29
+ global: {
30
+ hourlyUsd: number;
31
+ thresholdPct?: number;
32
+ };
33
+ providers?: Record<string, {
34
+ hourlyUsd: number;
35
+ thresholdPct?: number;
36
+ }>;
37
+ /**
38
+ * Profit margin applied to every charge before limit checks and persistence.
39
+ * e.g. 0.5 = 50% markup: raw costUsd × 1.5 is recorded and checked against limits.
40
+ * Callers always pass the raw provider cost; the gateway applies the margin internally.
41
+ * Must be >= 0. Default: 0 (no markup).
42
+ */
43
+ profitMarginPct?: number;
44
+ reconcileIntervalMs?: number;
45
+ userLimitCacheSize?: number;
46
+ }
47
+ /**
48
+ * Stored per-user credit balance in the userCredits collection.
49
+ * Credits are used as a fallback when a user's rate limits are exceeded.
50
+ * Global and provider limits are never bypassed by credits.
51
+ */
52
+ export interface UserCredit {
53
+ id: string;
54
+ balanceUsd: number;
55
+ updated: number;
56
+ }
57
+ /** Params passed to gateway.charge() — everything except id and timestamp */
58
+ export type ChargeParams = Omit<BillingRecord, 'id' | 'timestamp'>;
59
+ /** App-provided async callback to retrieve per-user spend limits. Return null = no limits. */
60
+ export type GetUserLimits = (userId: string) => Promise<UserLimits | null>;
61
+ export type UserThresholdCallback = (event: {
62
+ userId: string;
63
+ limitType: 'hourly' | 'daily' | 'weekly';
64
+ spent: number;
65
+ limit: number;
66
+ thresholdPct: number;
67
+ }) => void;
68
+ export type GlobalThresholdCallback = (event: {
69
+ limitType: 'global-hourly' | 'provider-hourly';
70
+ provider?: string;
71
+ spent: number;
72
+ limit: number;
73
+ thresholdPct: number;
74
+ }) => void;
75
+ export interface SpendFilters {
76
+ userId?: string;
77
+ provider?: string;
78
+ type?: BillingType;
79
+ from?: number;
80
+ to?: number;
81
+ }
82
+ export interface HistoryFilters extends SpendFilters {
83
+ limit?: number;
84
+ skip?: number;
85
+ }
86
+ export declare class BillingLimitError extends Error {
87
+ readonly limitType: 'global-hourly' | 'provider-hourly' | 'user-hourly' | 'user-daily' | 'user-weekly';
88
+ readonly spent: number;
89
+ readonly limit: number;
90
+ constructor(limitType: 'global-hourly' | 'provider-hourly' | 'user-hourly' | 'user-daily' | 'user-weekly', spent: number, limit: number);
91
+ }
92
+ export declare class BillingValidationError extends Error {
93
+ constructor(message: string);
94
+ }
95
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/billing/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,UAAU,GACV,KAAK,GACL,KAAK,GACL,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE;QACX,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAChB,MAAM,EACN;QACE,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CACF,CAAC;IACF;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAMD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6EAA6E;AAC7E,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,CAAC,CAAC;AAEnE,8FAA8F;AAC9F,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;AAE3E,MAAM,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,KAAK,IAAI,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE;IAC5C,SAAS,EAAE,eAAe,GAAG,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;CACtB,KAAK,IAAI,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAkB,SAAQ,KAAK;aAExB,SAAS,EACrB,eAAe,GACf,iBAAiB,GACjB,aAAa,GACb,YAAY,GACZ,aAAa;aACD,KAAK,EAAE,MAAM;aACb,KAAK,EAAE,MAAM;gBAPb,SAAS,EACrB,eAAe,GACf,iBAAiB,GACjB,aAAa,GACb,YAAY,GACZ,aAAa,EACD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM;CAShC;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,19 @@
1
+ export class BillingLimitError extends Error {
2
+ limitType;
3
+ spent;
4
+ limit;
5
+ constructor(limitType, spent, limit) {
6
+ super(`[Billing] Limit exceeded: ${limitType} (spent=${spent.toFixed(6)}, limit=${limit.toFixed(6)})`);
7
+ this.limitType = limitType;
8
+ this.spent = spent;
9
+ this.limit = limit;
10
+ this.name = 'BillingLimitError';
11
+ }
12
+ }
13
+ export class BillingValidationError extends Error {
14
+ constructor(message) {
15
+ super(`[Billing] Validation error: ${message}`);
16
+ this.name = 'BillingValidationError';
17
+ }
18
+ }
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/server/billing/types.ts"],"names":[],"mappings":"AAgHA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAExB;IAMA;IACA;IARlB,YACkB,SAKC,EACD,KAAa,EACb,KAAa;QAE7B,KAAK,CACH,6BAA6B,SAAS,WAAW,KAAK,CAAC,OAAO,CAC5D,CAAC,CACF,WAAW,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAChC,CAAC;QAbc,cAAS,GAAT,SAAS,CAKR;QACD,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAQ;QAO7B,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,+BAA+B,OAAO,EAAE,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import type { EmbeddingOptions, EmbeddingVector } from './types.js';
2
+ export interface EmbeddingClient {
3
+ embed(text: string, options?: EmbeddingOptions): Promise<EmbeddingVector>;
4
+ embedBatch(texts: string[], options?: EmbeddingOptions): Promise<EmbeddingVector[]>;
5
+ }
6
+ export declare function cosineSimilarity(a: number[], b: number[]): number;
7
+ export declare function createEmbeddingClient(providerName?: string): EmbeddingClient;
8
+ //# sourceMappingURL=EmbeddingClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingClient.d.ts","sourceRoot":"","sources":["../../../src/server/embeddings/EmbeddingClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1E,UAAU,CACR,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAWjE;AAED,wBAAgB,qBAAqB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,eAAe,CAmB5E"}
@@ -0,0 +1,30 @@
1
+ import { getAllEmbeddingProviders } from './registry.js';
2
+ export function cosineSimilarity(a, b) {
3
+ let dot = 0, normA = 0, normB = 0;
4
+ for (let i = 0; i < a.length; i++) {
5
+ dot += a[i] * b[i];
6
+ normA += a[i] * a[i];
7
+ normB += b[i] * b[i];
8
+ }
9
+ if (normA === 0 || normB === 0)
10
+ return 0;
11
+ return dot / (Math.sqrt(normA) * Math.sqrt(normB));
12
+ }
13
+ export function createEmbeddingClient(providerName) {
14
+ const providers = getAllEmbeddingProviders();
15
+ const provider = providerName
16
+ ? providers.find((p) => p.name === providerName)
17
+ : providers.find((p) => !!process.env[p.apiKeyEnv]) ?? providers[0];
18
+ if (!provider)
19
+ throw new Error('[Embeddings] No provider available — register one with registerEmbeddingProvider()');
20
+ return {
21
+ async embed(text, options) {
22
+ const vecs = await provider.embed([text], options);
23
+ return vecs[0];
24
+ },
25
+ async embedBatch(texts, options) {
26
+ return provider.embed(texts, options);
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=EmbeddingClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingClient.js","sourceRoot":"","sources":["../../../src/server/embeddings/EmbeddingClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAWzD,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,GAAG,GAAG,CAAC,EACT,KAAK,GAAG,CAAC,EACT,KAAK,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAqB;IACzD,MAAM,SAAS,GAAG,wBAAwB,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,YAAY;QAC3B,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC;QAChD,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ;QACX,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IAEJ,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO;YACvB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,CAAC,CAAC,CAAE,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO;YAC7B,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { cosineSimilarity, createEmbeddingClient } from './EmbeddingClient.js';
2
+ export type { EmbeddingClient } from './EmbeddingClient.js';
3
+ export { clearEmbeddingRegistry, getAllEmbeddingProviders, registerEmbeddingProvider, } from './registry.js';
4
+ export type { EmbeddingOptions, EmbeddingProvider, EmbeddingVector, } from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/embeddings/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { openAIEmbeddingProvider } from './providers/OpenAI.js';
2
+ import { registerEmbeddingProvider } from './registry.js';
3
+ registerEmbeddingProvider(openAIEmbeddingProvider);
4
+ export { cosineSimilarity, createEmbeddingClient } from './EmbeddingClient.js';
5
+ export { clearEmbeddingRegistry, getAllEmbeddingProviders, registerEmbeddingProvider, } from './registry.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/embeddings/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,yBAAyB,CAAC,uBAAuB,CAAC,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,eAAe,CAAC"}