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,26 @@
1
+ import type { FunctionRegistry, RequestRegistry } from './Api.js';
2
+ /**
3
+ * Unauthenticated socket — can only make public `request()` calls.
4
+ * Parameterized by the app's request registry.
5
+ */
6
+ export interface SocketLoggedOut<Requests extends RequestRegistry> {
7
+ type: 'loggedOut';
8
+ sessionId: string;
9
+ request<K extends keyof Requests>(name: K, input: Requests[K]['_input']): Promise<Requests[K]['_output']>;
10
+ }
11
+ /**
12
+ * Authenticated socket — can make both authenticated `call()` and public `request()` calls.
13
+ * Parameterized by the app's call registry and (optionally) a separate request registry.
14
+ */
15
+ export interface SocketLoggedIn<Calls extends FunctionRegistry, Requests extends RequestRegistry = Calls> {
16
+ type: 'loggedIn';
17
+ userId: string;
18
+ sessionId: string;
19
+ call<K extends keyof Calls>(name: K, input: Calls[K]['_input']): Promise<Calls[K]['_output']>;
20
+ request<K extends keyof Requests>(name: K, input: Requests[K]['_input']): Promise<Requests[K]['_output']>;
21
+ }
22
+ /**
23
+ * Union of logged-in and logged-out sockets.
24
+ */
25
+ export type TypedAppSocket<Calls extends FunctionRegistry, Requests extends RequestRegistry = Calls> = SocketLoggedIn<Calls, Requests> | SocketLoggedOut<Requests>;
26
+ //# sourceMappingURL=Socket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Socket.d.ts","sourceRoot":"","sources":["../../src/shared/Socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElE;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,QAAQ,SAAS,eAAe;IAC/D,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC9B,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;CACpC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc,CAC7B,KAAK,SAAS,gBAAgB,EAC9B,QAAQ,SAAS,eAAe,GAAG,KAAK;IAExC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,CAAC,SAAS,MAAM,KAAK,EACxB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GACxB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAChC,OAAO,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC9B,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CACxB,KAAK,SAAS,gBAAgB,EAC9B,QAAQ,SAAS,eAAe,GAAG,KAAK,IACtC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Socket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Socket.js","sourceRoot":"","sources":["../../src/shared/Socket.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ export * from './Api.js';
2
+ export type { STTWord, TTSViseme, TTSVisemeName } from './Audio.js';
3
+ export * from './DB.js';
4
+ export * from './Errors.js';
5
+ export * from './Router.js';
6
+ export type { SocketLoggedIn, SocketLoggedOut, TypedAppSocket, } from './Socket.js';
7
+ export declare const oneSecond = 1000;
8
+ export declare const oneMinute: number;
9
+ export declare const oneHour: number;
10
+ export declare const oneDay: number;
11
+ export declare const oneWeek: number;
12
+ /** Returns true if value is neither null nor undefined */
13
+ export declare function isDefined<T>(value: T | undefined | null): value is T;
14
+ /** Removes null and undefined values from an array */
15
+ export declare function compact<T>(arr: (T | null | undefined)[]): T[];
16
+ /** Returns a debounced version of fn that fires after ms of silence */
17
+ export declare function debounce<T extends (...args: Parameters<T>) => ReturnType<T>>(fn: T, ms: number): (...args: Parameters<T>) => void;
18
+ /**
19
+ * Formats a Date or timestamp to a locale date string.
20
+ * Uses the user's system locale. For server-side, defaults to en-US.
21
+ */
22
+ export declare function formatDate(date: Date | number, locale?: string): string;
23
+ /**
24
+ * Returns a human-readable relative time string (e.g. "2 hours ago", "in 3 days").
25
+ * Uses the Intl.RelativeTimeFormat API.
26
+ */
27
+ export declare function formatRelativeTime(date: Date | number, locale?: string): string;
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACpE,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,YAAY,EACV,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,aAAa,CAAC;AAGrB,eAAO,MAAM,SAAS,OAAQ,CAAC;AAC/B,eAAO,MAAM,SAAS,QAAiB,CAAC;AACxC,eAAO,MAAM,OAAO,QAAiB,CAAC;AACtC,eAAO,MAAM,MAAM,QAAe,CAAC;AACnC,eAAO,MAAM,OAAO,QAAa,CAAC;AAGlC,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,IAAI,CAAC,CAEpE;AAED,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAE7D;AAED,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAC1E,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,MAAM,GACT,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAMlC;AAGD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAOvE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,GAAG,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAaR"}
@@ -0,0 +1,61 @@
1
+ export * from './Api.js';
2
+ export * from './DB.js';
3
+ export * from './Errors.js';
4
+ export * from './Router.js';
5
+ // ─── Time constants ────────────────────────────────────────────────────────
6
+ export const oneSecond = 1_000;
7
+ export const oneMinute = 60 * oneSecond;
8
+ export const oneHour = 60 * oneMinute;
9
+ export const oneDay = 24 * oneHour;
10
+ export const oneWeek = 7 * oneDay;
11
+ // ─── Type guards ───────────────────────────────────────────────────────────
12
+ /** Returns true if value is neither null nor undefined */
13
+ export function isDefined(value) {
14
+ return value !== undefined && value !== null;
15
+ }
16
+ /** Removes null and undefined values from an array */
17
+ export function compact(arr) {
18
+ return arr.filter(isDefined);
19
+ }
20
+ /** Returns a debounced version of fn that fires after ms of silence */
21
+ export function debounce(fn, ms) {
22
+ let timer;
23
+ return (...args) => {
24
+ clearTimeout(timer);
25
+ timer = setTimeout(() => fn(...args), ms);
26
+ };
27
+ }
28
+ // ─── Date formatting ───────────────────────────────────────────────────────
29
+ /**
30
+ * Formats a Date or timestamp to a locale date string.
31
+ * Uses the user's system locale. For server-side, defaults to en-US.
32
+ */
33
+ export function formatDate(date, locale) {
34
+ const d = date instanceof Date ? date : new Date(date);
35
+ return d.toLocaleDateString(locale ?? 'en-US', {
36
+ year: 'numeric',
37
+ month: 'short',
38
+ day: 'numeric',
39
+ });
40
+ }
41
+ /**
42
+ * Returns a human-readable relative time string (e.g. "2 hours ago", "in 3 days").
43
+ * Uses the Intl.RelativeTimeFormat API.
44
+ */
45
+ export function formatRelativeTime(date, locale) {
46
+ const d = date instanceof Date ? date : new Date(date);
47
+ const diffMs = d.getTime() - Date.now();
48
+ const diffSec = Math.round(diffMs / 1000);
49
+ const diffMin = Math.round(diffMs / oneMinute);
50
+ const diffHour = Math.round(diffMs / oneHour);
51
+ const diffDay = Math.round(diffMs / oneDay);
52
+ const rtf = new Intl.RelativeTimeFormat(locale ?? 'en', { numeric: 'auto' });
53
+ if (Math.abs(diffSec) < 60)
54
+ return rtf.format(diffSec, 'second');
55
+ if (Math.abs(diffMin) < 60)
56
+ return rtf.format(diffMin, 'minute');
57
+ if (Math.abs(diffHour) < 24)
58
+ return rtf.format(diffHour, 'hour');
59
+ return rtf.format(diffDay, 'day');
60
+ }
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AAEzB,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAO5B,8EAA8E;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;AAC/B,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,GAAG,SAAS,CAAC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,GAAG,SAAS,CAAC;AACtC,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,CAAC;AACnC,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC;AAElC,8EAA8E;AAC9E,0DAA0D;AAC1D,MAAM,UAAU,SAAS,CAAI,KAA2B;IACtD,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC;AAC/C,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,OAAO,CAAI,GAA6B;IACtD,OAAO,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC/B,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,QAAQ,CACtB,EAAK,EACL,EAAU;IAEV,IAAI,KAAgD,CAAC;IACrD,OAAO,CAAC,GAAG,IAAmB,EAAE,EAAE;QAChC,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAmB,EAAE,MAAe;IAC7D,MAAM,CAAC,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC,kBAAkB,CAAC,MAAM,IAAI,OAAO,EAAE;QAC7C,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAmB,EACnB,MAAe;IAEf,MAAM,CAAC,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAE5C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjE,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface WebRTCServerConfig {
2
+ /** Number of mediasoup workers to spawn. Defaults to CPU count. */
3
+ numWorkers?: number;
4
+ /** UDP/TCP port range for RTP. */
5
+ rtcMinPort?: number;
6
+ rtcMaxPort?: number;
7
+ /** Public IP or announced IP for ICE candidates. */
8
+ listenIp?: string;
9
+ }
10
+ export interface WebRTCServer {
11
+ close(): Promise<void>;
12
+ }
13
+ export declare function createWebRTCServer(config?: WebRTCServerConfig): Promise<WebRTCServer>;
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webrtc/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,kBAAkB,CACtC,MAAM,GAAE,kBAAuB,GAC9B,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
@@ -0,0 +1,24 @@
1
+ // src/webrtc/index.ts
2
+ // Optional WebRTC module — only import this file when WebRTC is needed.
3
+ // Zero cost for applications that don't call createWebRTCServer().
4
+ export async function createWebRTCServer(config = {}) {
5
+ // Dynamic import — mediasoup is not loaded unless this function is called.
6
+ // Add mediasoup to your project's dependencies to use this module:
7
+ // npm install mediasoup
8
+ // @ts-ignore
9
+ const mediasoup = await import('mediasoup').catch(() => {
10
+ throw new Error('[WebRTC] mediasoup is not installed. Run: npm install mediasoup');
11
+ });
12
+ const { cpus } = await import('os');
13
+ const numWorkers = config.numWorkers ?? cpus().length;
14
+ const workers = await Promise.all(Array.from({ length: numWorkers }, () => mediasoup.createWorker({
15
+ rtcMinPort: config.rtcMinPort ?? 40000,
16
+ rtcMaxPort: config.rtcMaxPort ?? 49999,
17
+ })));
18
+ return {
19
+ async close() {
20
+ await Promise.all(workers.map((w) => w.close()));
21
+ },
22
+ };
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/webrtc/index.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,wEAAwE;AACxE,mEAAmE;AAgBnE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA6B,EAAE;IAE/B,2EAA2E;IAC3E,mEAAmE;IACnE,0BAA0B;IAC1B,aAAa;IACb,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACrD,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,CACtC,SAAS,CAAC,YAAY,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;QACtC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,KAAK;KACvC,CAAC,CACH,CACF,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,CAAC,CAA6B,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAC1D,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json ADDED
@@ -0,0 +1,97 @@
1
+ {
2
+ "name": "ugly-app",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "./dist/server/index.js",
6
+ "exports": {
7
+ ".": "./dist/server/index.js",
8
+ "./shared": "./dist/shared/index.js",
9
+ "./client": "./dist/client/index.js",
10
+ "./playwright": "./dist/playwright/index.js",
11
+ "./webrtc": {
12
+ "default": "./dist/webrtc/index.js"
13
+ }
14
+ },
15
+ "bin": {
16
+ "ugly-app": "./dist/cli/index.js"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest"
22
+ },
23
+ "dependencies": {
24
+ "@anthropic-ai/sdk": "^0.80.0",
25
+ "@aws-sdk/client-s3": "^3.700.0",
26
+ "@aws-sdk/s3-request-presigner": "^3.700.0",
27
+ "@deepgram/sdk": "^5.0.0",
28
+ "@fal-ai/client": "^1.9.4",
29
+ "@google/generative-ai": "^0.24.1",
30
+ "bcrypt": "^6.0.0",
31
+ "commander": "^12.0.0",
32
+ "concurrently": "^9.0.0",
33
+ "cookie-parser": "^1.4.7",
34
+ "elevenlabs": "^1.59.0",
35
+ "express": "^4.21.1",
36
+ "fs-extra": "^11.0.0",
37
+ "groq-sdk": "^1.1.1",
38
+ "handlebars": "^4.7.8",
39
+ "ioredis": "^5.10.1",
40
+ "jose": "^6.0.13",
41
+ "lru-cache": "^11.0.0",
42
+ "mongodb": "^6.18.0",
43
+ "nanoid": "^5.1.5",
44
+ "nats": "^2.28.2",
45
+ "onnxruntime-node": "^1.23.0",
46
+ "openai": "^6.32.0",
47
+ "together-ai": "^0.13.0",
48
+ "ws": "^8.18.0",
49
+ "zod": "^4.3.6"
50
+ },
51
+ "devDependencies": {
52
+ "@playwright/test": "^1.58.2",
53
+ "@testing-library/dom": "^10.4.1",
54
+ "@testing-library/react": "^16.3.2",
55
+ "@types/bcrypt": "^5.0.2",
56
+ "@types/cookie-parser": "^1.4.10",
57
+ "@types/express": "^5.0.0",
58
+ "@types/fs-extra": "^11.0.4",
59
+ "@types/node": "^22.0.0",
60
+ "@types/react": "^19.2.14",
61
+ "@types/react-dom": "^19.2.3",
62
+ "@types/ws": "^8.5.13",
63
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
64
+ "@typescript-eslint/parser": "^8.0.0",
65
+ "@vitejs/plugin-react": "^6.0.1",
66
+ "eslint": "^8.57.0",
67
+ "eslint-watch": "^7.0.0",
68
+ "html2canvas": "^1.4.1",
69
+ "jsdom": "^29.0.1",
70
+ "mongodb-memory-server": "^10.0.0",
71
+ "react": "^19.2.4",
72
+ "react-dom": "^19.2.4",
73
+ "typescript": "^5.9.3",
74
+ "vitest": "^4.0.18"
75
+ },
76
+ "peerDependencies": {
77
+ "@types/react": ">=18.0.0",
78
+ "html2canvas": ">=1.0.0",
79
+ "preact": "^10.29.0",
80
+ "react": ">=18.0.0",
81
+ "react-dom": ">=18.0.0"
82
+ },
83
+ "peerDependenciesMeta": {
84
+ "@types/react": {
85
+ "optional": true
86
+ },
87
+ "html2canvas": {
88
+ "optional": true
89
+ },
90
+ "preact": {
91
+ "optional": true
92
+ },
93
+ "mediasoup": {
94
+ "optional": true
95
+ }
96
+ }
97
+ }
@@ -0,0 +1,39 @@
1
+ # Managing Static Assets
2
+
3
+ ## Static assets (images, fonts, icons)
4
+ Place in `client/assets/` — Vite serves them at `/assets/filename.ext`
5
+
6
+ ```tsx
7
+ // Reference in React
8
+ <img src="/assets/logo.png" alt="Logo" />
9
+ ```
10
+
11
+ ## Generating assets with imageGen
12
+ ```ts
13
+ app.registerFunction('createAsset', async (ctx, input: { prompt: string; name: string }) => {
14
+ // Generate image
15
+ const tempUrl = await ctx.imageGen.generate(input.prompt)
16
+ // Extract temp key from URL
17
+ const tempKey = tempUrl.split('/temp/')[1]
18
+ // Promote to public assets
19
+ const publicUrl = await ctx.storage.moveToPublic(tempKey, `assets/${input.name}.png`)
20
+ return { publicUrl }
21
+ })
22
+ ```
23
+
24
+ ## Recommended asset organization
25
+ ```
26
+ client/assets/
27
+ icons/ — UI icons
28
+ backgrounds/ — Background images
29
+ generated/ — imageGen output (promoted to public bucket)
30
+ public/ — Static files served at root (favicon.ico, robots.txt)
31
+ ```
32
+
33
+ ## Image sizes for flux schnell
34
+ - Default: 1024×1024
35
+ - Banners: use prompt guidance ("wide landscape format", "16:9 ratio")
36
+ - Icons: generate at 1024×1024, scale down in CSS
37
+
38
+ # Notes
39
+ <!-- Claude: append observations here — record generated asset URLs -->
@@ -0,0 +1,35 @@
1
+ # Checking Error Logs
2
+
3
+ ## Query recent errors
4
+ ```bash
5
+ mongosh "$MONGODB_URI" --eval "
6
+ db.errorLog.find({}, {message:1, stack:1, userId:1, created:1})
7
+ .sort({created:-1}).limit(20).pretty()
8
+ "
9
+ ```
10
+
11
+ ## Group by message (find patterns)
12
+ ```bash
13
+ mongosh "$MONGODB_URI" --eval "
14
+ db.errorLog.aggregate([
15
+ { \$group: { _id: '\$message', count: { \$sum: 1 }, last: { \$max: '\$created' } } },
16
+ { \$sort: { count: -1 } },
17
+ { \$limit: 10 }
18
+ ]).pretty()
19
+ "
20
+ ```
21
+
22
+ ## Filter by level
23
+ ```bash
24
+ mongosh "$MONGODB_URI" --eval "
25
+ db.errorLog.find({level:'error'}).sort({created:-1}).limit(10).pretty()
26
+ "
27
+ ```
28
+
29
+ ## Tips
30
+ - `source: 'server'` = server-side error, `source: 'browser'` = client-side
31
+ - Check `stack` field for full stack trace
32
+ - `userId: null` means unauthenticated user
33
+
34
+ # Notes
35
+ <!-- Claude: append observations here -->
@@ -0,0 +1,23 @@
1
+ # Checking Feedback Logs
2
+
3
+ ## Query all feedback
4
+ ```bash
5
+ mongosh "$MONGODB_URI" --eval "
6
+ db.feedbackLog.find().sort({created:-1}).limit(20).pretty()
7
+ "
8
+ ```
9
+
10
+ ## Group by type
11
+ ```bash
12
+ mongosh "$MONGODB_URI" --eval "
13
+ db.feedbackLog.aggregate([
14
+ { \$group: { _id: '\$type', count: { \$sum: 1 }, messages: { \$push: '\$message' } } }
15
+ ]).pretty()
16
+ "
17
+ ```
18
+
19
+ ## Types: `bug`, `design`, `feature`
20
+ ## Screenshots available at `screenshotUrl` field
21
+
22
+ # Notes
23
+ <!-- Claude: append observations here -->
@@ -0,0 +1,22 @@
1
+ # Checking Performance Logs
2
+
3
+ ## Slowest operations
4
+ ```bash
5
+ mongosh "$MONGODB_URI" --eval "
6
+ db.perfLog.aggregate([
7
+ { \$group: { _id: '\$operation', avgMs: { \$avg: '\$durationMs' }, maxMs: { \$max: '\$durationMs' }, count: { \$sum: 1 } } },
8
+ { \$sort: { avgMs: -1 } },
9
+ { \$limit: 10 }
10
+ ]).pretty()
11
+ "
12
+ ```
13
+
14
+ ## Recent slow calls (>500ms)
15
+ ```bash
16
+ mongosh "$MONGODB_URI" --eval "
17
+ db.perfLog.find({durationMs:{\$gt:500}}).sort({created:-1}).limit(20).pretty()
18
+ "
19
+ ```
20
+
21
+ # Notes
22
+ <!-- Claude: append observations here -->
@@ -0,0 +1,34 @@
1
+ # Creating Test Users
2
+
3
+ ## Register a test user
4
+ ```bash
5
+ curl -X POST http://localhost:3000/auth/register \
6
+ -H "Content-Type: application/json" \
7
+ -d '{"email":"test1@test.com","password":"testpass123"}'
8
+ # Returns: {"token":"..."}
9
+ ```
10
+
11
+ ## Save token for use in tests
12
+ ```bash
13
+ TOKEN=$(curl -s -X POST http://localhost:3000/auth/login \
14
+ -H "Content-Type: application/json" \
15
+ -d '{"email":"test1@test.com","password":"testpass123"}' | jq -r .token)
16
+ echo $TOKEN
17
+ ```
18
+
19
+ ## Seed multiple users
20
+ ```bash
21
+ for i in 1 2 3 4 5; do
22
+ curl -s -X POST http://localhost:3000/auth/register \
23
+ -H "Content-Type: application/json" \
24
+ -d "{\"email\":\"bot${i}@test.com\",\"password\":\"botpass123\"}"
25
+ done
26
+ ```
27
+
28
+ ## Delete all test users
29
+ ```bash
30
+ mongosh "$MONGODB_URI" --eval "db.user.deleteMany({email:/test\.com$/})"
31
+ ```
32
+
33
+ # Notes
34
+ <!-- Claude: append observations here — record which test users exist -->
@@ -0,0 +1,37 @@
1
+ # Extending the API
2
+
3
+ Use this skill when adding new server functions or requests.
4
+
5
+ ## Steps
6
+
7
+ 1. **Add to `shared/api.ts`**
8
+ ```ts
9
+ export const functions = defineFunctions({
10
+ // existing...
11
+ myNewFunction: {} as FunctionDef<{ param: string }, { result: string }>,
12
+ })
13
+ ```
14
+
15
+ 2. **Register the handler in `server/index.ts`**
16
+ ```ts
17
+ app.registerFunction('myNewFunction', async (ctx, input) => {
18
+ // input: { param: string } — fully typed
19
+ // ctx.userId, ctx.db, ctx.storage, ctx.textGen, ctx.imageGen, ctx.log
20
+ return { result: `Hello ${input.param}` }
21
+ })
22
+ ```
23
+
24
+ 3. **Call from client**
25
+ ```ts
26
+ const { result } = await socket.call('myNewFunction', { param: 'world' })
27
+ ```
28
+
29
+ 4. **For read-only operations**, use `defineRequests` + `app.registerRequest` + `socket.request()` instead.
30
+
31
+ ## Rules
32
+ - Functions = mutating (writes, AI calls, side effects) → `call()`
33
+ - Requests = read-only → `request()`
34
+ - Both always have `ctx.userId: string`
35
+
36
+ # Notes
37
+ <!-- Claude: append observations here -->
@@ -0,0 +1,5 @@
1
+ Run type and lint checks, fix all issues.
2
+
3
+ Run: `yarn build`
4
+
5
+ This runs: tsc + vite build. Fix all TypeScript errors and lint warnings reported. Run again to confirm all issues are resolved.
@@ -0,0 +1,9 @@
1
+ Fetch production errors and fix them.
2
+
3
+ Run: `yarn error:server`
4
+
5
+ This fetches recent errors from the production MongoDB errorLog collection. For each error:
6
+ 1. Find the relevant source file
7
+ 2. Understand the root cause
8
+ 3. Fix the code
9
+ 4. Run `yarn build` to verify the fix compiles
@@ -0,0 +1,8 @@
1
+ Fetch user feedback and fix reported issues.
2
+
3
+ Run: `yarn feedback`
4
+
5
+ This fetches recent user feedback from the production MongoDB feedbackLog collection. For each piece of feedback:
6
+ 1. Understand the user's issue or request
7
+ 2. Implement the fix or feature
8
+ 3. Run `yarn build` to verify it compiles
@@ -0,0 +1,8 @@
1
+ Fetch performance issues and optimize slow paths.
2
+
3
+ Run: `yarn perf:server`
4
+
5
+ This fetches recent performance log entries from production. For each slow path:
6
+ 1. Find the source of the slowdown
7
+ 2. Optimize the code (avoid blocking operations, add caching, etc.)
8
+ 3. Run `yarn build` to verify
@@ -0,0 +1,38 @@
1
+ # Uploading and Using Files
2
+
3
+ ## Client → upload to temp
4
+ ```ts
5
+ // In a React component
6
+ const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {
7
+ const file = e.target.files?.[0]
8
+ if (!file) return
9
+ const tempUrl = await socket.uploadFile(file, `uploads/${file.name}`)
10
+ // tempUrl is now usable — pass to a server function to promote
11
+ }
12
+ ```
13
+
14
+ ## Server → promote temp to public
15
+ ```ts
16
+ app.registerFunction('saveUpload', async (ctx, input: { tempKey: string; destKey: string }) => {
17
+ const publicUrl = await ctx.storage.moveToPublic(input.tempKey, input.destKey)
18
+ return { publicUrl }
19
+ })
20
+ ```
21
+
22
+ ## Server → direct write to public (server-generated content only)
23
+ ```ts
24
+ const url = await ctx.storage.put('public', 'assets/logo.png', buffer, 'image/png')
25
+ ```
26
+
27
+ ## Get a public URL without uploading
28
+ ```ts
29
+ const url = ctx.storage.url('public', 'assets/logo.png')
30
+ ```
31
+
32
+ ## Rules
33
+ - Only server can write to `public` bucket
34
+ - Client uploads always go to `temp`
35
+ - `temp` files expire — promote to `public` if keeping long-term
36
+
37
+ # Notes
38
+ <!-- Claude: append observations here -->
@@ -0,0 +1,49 @@
1
+ # Using Text and Image Generation
2
+
3
+ ## Text generation (llama4)
4
+ ```ts
5
+ app.registerFunction('generateText', async (ctx, input: { prompt: string }) => {
6
+ const text = await ctx.textGen.generate([
7
+ { role: 'user', content: input.prompt }
8
+ ])
9
+ return { text }
10
+ })
11
+ ```
12
+
13
+ ## With system prompt
14
+ ```ts
15
+ const text = await ctx.textGen.generate(messages, {
16
+ systemPrompt: 'You are a helpful assistant.',
17
+ maxTokens: 512,
18
+ temperature: 0.7,
19
+ })
20
+ ```
21
+
22
+ ## Image generation (flux schnell) — returns temp URL
23
+ ```ts
24
+ app.registerFunction('generateImage', async (ctx, input: { prompt: string }) => {
25
+ const tempUrl = await ctx.imageGen.generate(input.prompt)
26
+ // Promote to public if keeping permanently:
27
+ // const publicUrl = await ctx.storage.moveToPublic('imagegen/xxx.png', 'assets/xxx.png')
28
+ return { url: tempUrl }
29
+ })
30
+ ```
31
+
32
+ ## Spend limits
33
+ - Budget set via `AI_MAX_SPEND_PER_HOUR` env var (default $1.00/hr)
34
+ - Calls over budget are queued (max 5 min wait) then execute when window clears
35
+ - If queue is full (100 calls), throws `SpendLimitError` — show user a friendly message
36
+
37
+ ## Check current spend
38
+ ```bash
39
+ mongosh "$MONGODB_URI" --eval "
40
+ const since = new Date(Date.now() - 3600000);
41
+ db.aiSpend.aggregate([
42
+ { \$match: { created: { \$gte: since } } },
43
+ { \$group: { _id: '\$model', total: { \$sum: '\$costUsd' } } }
44
+ ]).pretty()
45
+ "
46
+ ```
47
+
48
+ # Notes
49
+ <!-- Claude: append observations here -->
@@ -0,0 +1,49 @@
1
+ # ── Core ────────────────────────────────────────────────────────────────────
2
+ JWT_SECRET=CHANGE_ME_RUN_web_init_to_generate
3
+ APP_DOMAIN=
4
+ NODE_ENV=development
5
+ PORT=3000
6
+
7
+ # ── MongoDB ──────────────────────────────────────────────────────────────────
8
+ # Leave blank to use local docker MongoDB
9
+ # Get a free cluster at https://mongodb.com/atlas
10
+ MONGODB_URI=
11
+
12
+ # ── File Storage ─────────────────────────────────────────────────────────────
13
+ # Leave blank to use local docker MinIO
14
+ STORAGE_ACCOUNT_ID=
15
+ STORAGE_ACCESS_KEY_ID=
16
+ STORAGE_SECRET_ACCESS_KEY=
17
+ STORAGE_PUBLIC_BUCKET=
18
+ STORAGE_TEMP_BUCKET=
19
+ STORAGE_PUBLIC_URL=
20
+ STORAGE_TEMP_URL=
21
+
22
+ # ── NATS ─────────────────────────────────────────────────────────────────────
23
+ # Leave blank to use local docker NATS
24
+ NATS_URL=
25
+ NATS_CREDS=
26
+
27
+ # ── Redis ────────────────────────────────────────────────────────────────────
28
+ # Leave blank to use local docker Redis
29
+ REDIS_URL=
30
+
31
+ # ── AI Generation ────────────────────────────────────────────────────────────
32
+ TOGETHER_API_KEY=
33
+ AI_MAX_SPEND_PER_HOUR=1.00
34
+
35
+ # ── Push Notifications ───────────────────────────────────────────────────────
36
+ FIREBASE_PROJECT_ID=
37
+ FIREBASE_PRIVATE_KEY=
38
+ FIREBASE_CLIENT_EMAIL=
39
+
40
+ # ── Email ────────────────────────────────────────────────────────────────────
41
+ MAILGUN_API_KEY=
42
+ MAILGUN_DOMAIN=
43
+ MAILGUN_FROM=
44
+
45
+ # ── Deploy:multi only ────────────────────────────────────────────────────────
46
+ IS_CLOCK_SERVER=
47
+
48
+ # ── Maintain Bot ──────────────────────────────────────────────────────────────
49
+ MAINTAIN_BOT_USER_ID= # userId of maintain bot account (from web auth:create-account)