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,18 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(git add:*)",
5
+ "Bash(git check-ignore:*)",
6
+ "Bash(ls -la /Users/admin/Documents/GitHub/app/server/backend/DB*)",
7
+ "Bash(npx tsc:*)",
8
+ "Bash(npx vitest:*)",
9
+ "Bash(grep -E \"\\\\.ts$\")",
10
+ "Bash(npm test:*)",
11
+ "Bash(git push:*)",
12
+ "Bash(git rm:*)",
13
+ "Bash(npm run:*)",
14
+ "Bash(git worktree:*)",
15
+ "Bash(git remote:*)"
16
+ ]
17
+ }
18
+ }
package/.env.example ADDED
@@ -0,0 +1,9 @@
1
+ # AI Providers (all optional — Together AI works with TOGETHER_API_KEY alone)
2
+ ANTHROPIC_API_KEY=
3
+ OPENAI_API_KEY=
4
+ GOOGLE_API_KEY=
5
+ GROQ_API_KEY=
6
+ FAL_API_KEY=
7
+ ELEVENLABS_API_KEY=
8
+ DEEPGRAM_API_KEY=
9
+ MAINTAIN_BOT_USER_ID=
@@ -0,0 +1,113 @@
1
+ {
2
+ "manifest": {
3
+ "name": "ugly-app",
4
+ "version": "0.1.0",
5
+ "type": "module",
6
+ "main": "./dist/server/index.js",
7
+ "exports": {
8
+ ".": "./dist/server/index.js",
9
+ "./shared": "./dist/shared/index.js",
10
+ "./client": "./dist/client/index.js",
11
+ "./playwright": "./dist/playwright/index.js",
12
+ "./webrtc": {
13
+ "default": "./dist/webrtc/index.js"
14
+ }
15
+ },
16
+ "bin": {
17
+ "web": "dist/cli/index.js"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "test": "vitest run",
22
+ "test:watch": "vitest"
23
+ },
24
+ "dependencies": {
25
+ "@anthropic-ai/sdk": "^0.80.0",
26
+ "@deepgram/sdk": "^5.0.0",
27
+ "elevenlabs": "^1.59.0",
28
+ "@aws-sdk/client-s3": "^3.700.0",
29
+ "@aws-sdk/s3-request-presigner": "^3.700.0",
30
+ "@fal-ai/client": "^1.9.4",
31
+ "@google/generative-ai": "^0.24.1",
32
+ "bcrypt": "^6.0.0",
33
+ "commander": "^12.0.0",
34
+ "concurrently": "^9.0.0",
35
+ "cookie-parser": "^1.4.7",
36
+ "express": "^4.21.1",
37
+ "fs-extra": "^11.0.0",
38
+ "groq-sdk": "^1.1.1",
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
+ "openai": "^6.32.0",
46
+ "together-ai": "^0.13.0",
47
+ "ws": "^8.18.0",
48
+ "zod": "^4.3.6",
49
+ "handlebars": "^4.7.8",
50
+ "onnxruntime-node": "^1.23.0"
51
+ },
52
+ "devDependencies": {
53
+ "@playwright/test": "^1.58.2",
54
+ "@testing-library/dom": "^10.4.1",
55
+ "@testing-library/react": "^16.3.2",
56
+ "@types/bcrypt": "^5.0.2",
57
+ "@types/cookie-parser": "^1.4.10",
58
+ "@types/express": "^5.0.0",
59
+ "@types/fs-extra": "^11.0.4",
60
+ "@types/node": "^22.0.0",
61
+ "@types/react": "^19.2.14",
62
+ "@types/react-dom": "^19.2.3",
63
+ "@types/ws": "^8.5.13",
64
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
65
+ "@typescript-eslint/parser": "^8.0.0",
66
+ "@vitejs/plugin-react": "^6.0.1",
67
+ "eslint": "^8.57.0",
68
+ "eslint-watch": "^7.0.0",
69
+ "html2canvas": "^1.4.1",
70
+ "jsdom": "^29.0.1",
71
+ "mongodb-memory-server": "^10.0.0",
72
+ "react": "^19.2.4",
73
+ "react-dom": "^19.2.4",
74
+ "typescript": "^5.9.3",
75
+ "vitest": "^4.0.18"
76
+ },
77
+ "peerDependencies": {
78
+ "@types/react": ">=18.0.0",
79
+ "html2canvas": ">=1.0.0",
80
+ "preact": ">=10.0.0",
81
+ "react": ">=18.0.0",
82
+ "react-dom": ">=18.0.0"
83
+ },
84
+ "peerDependenciesMeta": {
85
+ "@types/react": {
86
+ "optional": true
87
+ },
88
+ "html2canvas": {
89
+ "optional": true
90
+ },
91
+ "preact": {
92
+ "optional": true
93
+ },
94
+ "mediasoup": {
95
+ "optional": true
96
+ }
97
+ },
98
+ "_registry": "npm",
99
+ "_loc": "/Users/admin/Library/Caches/Yarn/v6/npm-ugly-app-0.1.0-d3eac800-7702-4eda-affb-29c511f7037a-1774140424109/node_modules/ugly-app/package.json",
100
+ "readmeFilename": "README.md",
101
+ "readme": "# website-core\n\nA full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI integration, and audio streaming.\n\n## What's Included\n\n- **Server**: Express with type-safe RPC routing and Zod schema validation\n- **WebSockets**: Bidirectional socket server/client with RPC calls, document tracking, and file uploads\n- **Database**: MongoDB with typed collections, cascade delete, indexes, migrations, and Change Streams\n- **Auth**: JWT + OAuth (ugly.bot by default, extensible via `AuthProvider` interface)\n- **Storage**: AWS S3 / Cloudflare R2 with presigned URLs and file promotion\n- **AI**: 5 text generation providers (Together, Claude, OpenAI, Google, Groq) + 3 image providers (Together, FAL, Google)\n- **Audio**: Text-to-speech and speech-to-text streaming with React hooks (`useTTS`, `useSTT`), optional viseme data for lip sync, and word-level timestamps\n- **Logging**: Multi-channel logging to MongoDB (error, console, perf, feedback) with server error capture, deduplication, and classification\n- **Queues**: NATS JetStream worker queues, Redis pub/sub with in-memory fallback\n- **Rate Limiting**: Per-user/per-operation token-bucket limiting with queue management\n- **Push Notifications**: Real-time delivery via WebSocket + Redis, with FCM support\n- **Feedback**: Built-in user feedback collection with screenshot capture\n- **CLI**: `web` command for dev, build, deploy, migrations, log queries, and auth utilities\n\n## Installation\n\n```bash\nnpm install website-core\n```\n\nPeer dependencies:\n\n```bash\nnpm install react react-dom html2canvas\n```\n\n## Quick Start\n\n### Scaffold a new project\n\n```bash\nnpx web init my-app\n```\n\n### Start development\n\n```bash\nyarn dev\n# Starts Docker services, Express server, Vite, TypeScript watcher, and ESLint concurrently\n```\n\n## Usage\n\n### Server\n\n```typescript\nimport { createApp } from 'website-core';\n\nconst app = await createApp({\n authProvider, // optional — defaults to ugly.bot OAuth\n pages, // optional — page definitions with SSR support\n onSocketMessage, // optional — handle custom WebSocket messages\n workerQueues, // optional — background job queue configs\n extendContext, // optional — add fields to handler context\n});\n```\n\n### Shared types and API definitions\n\n```typescript\nimport { fn, req, defineFunctions, defineRequests } from 'website-core/shared';\nimport { z } from 'website-core/shared';\n\nexport const functions = defineFunctions({\n greet: fn(\n z.object({ name: z.string() }),\n z.object({ message: z.string() })\n ),\n});\n```\n\n### React client\n\n```typescript\nimport { AppProvider, useApp, createRouter, createSocket } from 'website-core/client';\n```\n\n## Key APIs\n\n### Server — `createApp()`\n\nRegisters handlers with full context (user, db, storage, textGen, imageGen, logger, rateLimit):\n\n```typescript\napp.registerFunction('greet', functions.greet, async ({ input, userId, db, logger }) => {\n return { message: `Hello, ${input.name}` };\n});\n\napp.registerRequest('stream', requests.stream, async ({ input, res }) => {\n // streaming HTTP handler\n});\n```\n\nBuilt-in routes: `GET /health`, `POST /auth/verify`, `GET /auth/url`, `POST /logs/client`, `GET /my_feedback`\n\n### Database — `createTypedDB()`\n\n```typescript\nimport { defineCollections, defineDbIndexes } from 'website-core/shared';\n\nconst collections = defineCollections({\n notes: { schema: noteSchema, cascadeDelete: ['attachments'] },\n});\n\nconst db = createTypedDB(mongoClient, collections);\nawait db.notes.setDoc(id, data);\nawait db.notes.getDocs({ userId });\n```\n\n### WebSocket Client\n\n```typescript\nconst socket = createSocket({ url, registry });\n\nawait socket.call('greet', { name: 'world' }); // RPC call\nconst doc = await socket.getDoc('notes', id); // fetch document\nsocket.trackDoc('notes', id, (doc) => { /* live */ }); // live updates\nawait socket.uploadFile(file, { bucket: 'temp' }); // file upload\n```\n\n### AI — Text Generation\n\n```typescript\nconst textGen = createTextGen({ provider: 'claude' });\n\nconst text = await textGen.generate({ messages, model });\nconst json = await textGen.generateJson({ messages, schema, model });\nconst result = await textGen.generateWithTools({ messages, tools, model });\n```\n\nSupported providers: `together`, `claude`, `openai`, `google`, `groq`\n\n### AI — Image Generation\n\n```typescript\nconst imageGen = createImageGen({ provider: 'fal' });\nconst url = await imageGen.generate(prompt, { width: 1024, height: 1024 });\n```\n\nSupported providers: `together`, `fal`, `google`\n\n### Audio — TTS/STT React Hooks\n\n```typescript\n// Text-to-speech\nconst { playing, currentWord, play, stop } = useTTS(socket);\nawait play('Hello world');\n\n// With viseme data for lip sync (opt-in — adds latency)\nawait play('Hello world', { requestVisemes: true });\n// viseme events arrive via onViseme callback in useTTS options\n\n// Speech-to-text\nconst { transcript, isFinal, listening, start, stop } = useSTT(socket, {\n mode: 'realtime', // 'realtime' | 'batch' | 'auto'\n});\n\n// With word-level timestamps (opt-in — uses Groq verbose_json, slower)\nconst { transcript, words } = useSTT(socket, {\n mode: 'batch',\n requestWords: true,\n});\n// words: STTWord[] — each has { word, startMs, durationMs }\n```\n\nViseme and word types are exported from `website-core/shared`:\n\n```typescript\nimport type { TTSViseme, TTSVisemeName, STTWord } from 'website-core/shared';\n```\n\n### Rate Limiting\n\n```typescript\nconst rateLimit = createRateLimiter({\n windowMs: 3600_000, // 1 hour\n maxUnits: 1.0,\n queueDepth: 5,\n});\n\nawait rateLimit.check(userId, 'generate', 0.1);\nawait rateLimit.charge(userId, 'generate', actualCost);\n```\n\n### Worker Queues\n\n```typescript\nconst queue = createWorkerQueue({ stream: 'jobs', subject: 'jobs.process' });\n\nawait queue.enqueue({ type: 'email', to: 'user@example.com' });\nqueue.registerHandler('email', async (job) => { /* process */ });\nawait queue.start();\n```\n\n### Storage\n\n```typescript\nconst storage = createStorageClient();\n\nconst key = await storage.put(buffer, { bucket: 'temp', ext: 'png' });\nconst publicKey = await storage.moveToPublic(key);\nconst url = storage.url(publicKey);\n\n// Browser direct upload\nconst { uploadUrl, key } = await socket.call('uploadUrl', { ext: 'jpg' });\n```\n\n### Logging\n\n```typescript\nconst logger = createLogger({ db, userId });\n\nlogger.info('User signed in', { userId });\nlogger.perf('query', durationMs, { collection: 'notes' });\nlogger.feedback('Feature request', { screenshot, context });\nlogger.error('Something failed', error);\n```\n\n### Server Error Capture\n\n`captureServerError` persists unexpected errors to a MongoDB `errorLog` collection with automatic deduplication (repeated errors increment a `count` field instead of inserting duplicates). Expected/recoverable errors can be suppressed from persistence by registering patterns.\n\n```typescript\nimport {\n captureServerError,\n registerExpectedErrorPattern,\n classifyError,\n} from 'website-core';\n\n// Register known-recoverable patterns at startup — matched errors log to\n// console only and are never written to MongoDB\nregisterExpectedErrorPattern('ECONNRESET')\nregisterExpectedErrorPattern('[STT] Session ended before audio was received')\n\n// Capture an error in a catch block\ntry {\n await riskyOperation()\n} catch (err) {\n captureServerError('[MyService] Failed to process request', err, { userId })\n}\n\n// Classify a message manually ('expected' | 'unexpected')\nconst classification = classifyError('[STT] Session ended before audio was received')\n```\n\n### Push Notifications\n\n```typescript\nimport { sendPush } from 'website-core';\n\nawait sendPush(userId, { title: 'New message', body: 'You have a reply' });\n```\n\n## CLI Commands\n\n| Command | Description |\n|---|---|\n| `web init <name>` | Scaffold a new project |\n| `web dev` | Start all dev services (Docker, server, Vite, TS, ESLint) |\n| `web build` | Production build |\n| `web db:init` | Create/update MongoDB indexes |\n| `web db:migrate` | Run pending database migrations (`--status` to preview) |\n| `web publish:assets` | Deploy static assets to CDN (`--dry-run` to preview) |\n| `web purge:assets` | Remove old build artifacts (keeps last 3 by default) |\n| `web logs:local` | Query local dev logs |\n| `web logs:server` | Query server logs from MongoDB |\n| `web error:local` | Query local error logs |\n| `web error:server` | Query server error logs from MongoDB |\n| `web perf:local` | Query local performance metrics |\n| `web perf:server` | Query server performance metrics from MongoDB |\n| `web feedback` | Query user feedback submissions |\n| `web auth:create-account` | Create an account directly in the database |\n| `web auth:create-token` | Generate a JWT for a userId |\n| `web test:e2e` | Run Playwright end-to-end tests (`--headed` for browser UI) |\n\n## React Components\n\n```typescript\nimport {\n Button, Card, Text, Input, Modal, Toast, PageLayout,\n FeedbackButton,\n} from 'website-core/client';\n```\n\nThe `FeedbackButton` captures a screenshot and submits it with user context automatically.\n\n## Routing (Client)\n\n```typescript\nconst { useRouter, RouterProvider } = createRouter(pages);\n\nfunction App() {\n const { push, replace, back } = useRouter();\n return <RouterProvider fallback={<NotFound />} authGuard={<Login />} />;\n}\n```\n\nPage transitions are animated by default using `ViewFlipper`. The transition type (`PUSH`, `POP`, `REPLACE`, `NONE`) is inferred automatically from navigation calls.\n\n### Popups\n\n```typescript\nimport { usePopup } from 'website-core/client';\n\nfunction MyComponent() {\n const { showPopup } = usePopup();\n\n function openMenu() {\n const handle = showPopup(<MyMenu />, {\n mode: 'contextMenu', // 'block' | 'transient' | 'contextMenu'\n slideFrom: 'bottom', // 'left' | 'right' | 'top' | 'bottom' | 'none'\n onClose: () => console.log('closed'),\n animConfig: { duration: 250 },\n });\n\n // Dismiss programmatically\n handle.hide();\n }\n}\n```\n\n- **`block`** — modal overlay, blocks interaction behind it\n- **`transient`** — tapping the backdrop closes it\n- **`contextMenu`** — same as transient but typically for menus/pickers\n\n### Animation Primitives\n\n```typescript\nimport {\n createAnimatedValue,\n useAnimatedValue,\n Animated,\n easingFunctions,\n} from 'website-core/client';\nimport type { EasingFunction } from 'website-core/client';\n\n// Imperative animated value (RAF-driven, no React re-renders)\nconst spring = createAnimatedValue(0);\nspring.animateTo(1, { duration: 300, easing: easingFunctions.easeInOut });\n\n// React hook version\nconst opacity = useAnimatedValue(0);\n\n// Apply to DOM via ref — zero re-renders\n<Animated value={spring} style={(v) => ({ opacity: v, transform: `scale(${v})` })}>\n <div>Content</div>\n</Animated>\n```\n\n## Project Structure\n\nProjects built with `website-core` follow this layout:\n\n```\nmy-app/\n├── src/\n│ ├── server/ # Express handlers, DB collections, migrations\n│ ├── client/ # React pages and components\n│ └── shared/ # API definitions and shared types\n├── static/ # Build-time static assets\n└── docker-compose.dev.yml\n```\n\n## Environment Variables\n\n| Variable | Description |\n|---|---|\n| `MONGO_URL` | MongoDB connection string |\n| `JWT_SECRET` | Secret for signing JWT tokens |\n| `REDIS_URL` | Redis connection (optional, uses in-memory fallback) |\n| `NATS_URL` | NATS server URL |\n| `NATS_CREDS` | NATS credentials file path (Synadia Cloud) |\n| `R2_ACCOUNT_ID` | Cloudflare R2 account ID |\n| `R2_ACCESS_KEY_ID` | R2 access key |\n| `R2_SECRET_ACCESS_KEY` | R2 secret key |\n| `R2_BUCKET` | R2 bucket name |\n| `TOGETHER_API_KEY` | Together AI API key |\n| `ANTHROPIC_API_KEY` | Anthropic Claude API key |\n| `OPENAI_API_KEY` | OpenAI API key |\n| `GOOGLE_API_KEY` | Google Gemini API key |\n| `IS_CLOCK_SERVER` | Set to `true` on the instance that processes worker queues |\n\nClient-side variables must be prefixed with `VITE_`.\n\n## Tech Stack\n\n- **Runtime**: Node.js, TypeScript (ES2022, NodeNext modules)\n- **Server**: Express, ws (WebSockets)\n- **Frontend**: React 18, Vite, Tailwind CSS\n- **Database**: MongoDB\n- **Messaging**: NATS with JetStream\n- **Cache**: Redis (in-memory fallback for dev)\n- **Storage**: AWS S3 / Cloudflare R2\n- **Auth**: JWT (jose), OAuth\n- **AI**: Together AI, Anthropic, OpenAI, Google, Groq, FAL\n- **Audio**: InWorld TTS, Groq Whisper STT\n- **Validation**: Zod\n- **Testing**: Vitest, Playwright, mongodb-memory-server\n\n## Development\n\n```bash\nnpm run build # Compile TypeScript\nnpm test # Run unit tests\nnpm run test:watch # Watch mode\n```\n",
102
+ "description": "A full-stack TypeScript framework for building production-ready web applications. Provides an opinionated architecture combining an Express backend, React frontend, and MongoDB database with built-in authentication, real-time communication, storage, AI integration, and audio streaming."
103
+ },
104
+ "artifacts": [],
105
+ "remote": {
106
+ "type": "copy",
107
+ "registry": "npm",
108
+ "hash": "1f1f44d3-e29b-4eb4-a53b-7939ba38f3b9-1774221755838",
109
+ "reference": "/Users/admin/Documents/GitHub/app/.worktrees/ugly-app"
110
+ },
111
+ "registry": "npm",
112
+ "hash": "1f1f44d3-e29b-4eb4-a53b-7939ba38f3b9-1774221755838"
113
+ }