ugly-app 0.1.86 → 0.1.87

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 (197) hide show
  1. package/dist/cli/imageGen.d.ts.map +1 -1
  2. package/dist/cli/imageGen.js +32 -11
  3. package/dist/cli/imageGen.js.map +1 -1
  4. package/dist/cli/textGen.d.ts.map +1 -1
  5. package/dist/cli/textGen.js +3 -2
  6. package/dist/cli/textGen.js.map +1 -1
  7. package/dist/cli/version.d.ts +1 -1
  8. package/dist/cli/version.js +1 -1
  9. package/package.json +1 -1
  10. package/src/cli/authCommands.ts +56 -0
  11. package/src/cli/build.ts +32 -0
  12. package/src/cli/configure.ts +68 -0
  13. package/src/cli/deploy.ts +744 -0
  14. package/src/cli/deployGenerators.test.ts +79 -0
  15. package/src/cli/deployGenerators.ts +89 -0
  16. package/src/cli/deployPlatform.test.ts +63 -0
  17. package/src/cli/deployPlatform.ts +91 -0
  18. package/src/cli/dev.ts +166 -0
  19. package/src/cli/imageGen.ts +104 -0
  20. package/src/cli/index.ts +514 -0
  21. package/src/cli/initDb.ts +169 -0
  22. package/src/cli/logQuery.ts +220 -0
  23. package/src/cli/migrate.ts +90 -0
  24. package/src/cli/publishAssets.ts +120 -0
  25. package/src/cli/purgeAssets.ts +54 -0
  26. package/src/cli/scaffold.ts +170 -0
  27. package/src/cli/serverLogQuery.ts +84 -0
  28. package/src/cli/storageClient.ts +24 -0
  29. package/src/cli/textGen.ts +75 -0
  30. package/src/cli/uglyBotAuth.ts +50 -0
  31. package/src/cli/uglyBotLogin.ts +104 -0
  32. package/src/cli/uglyBotSetup.ts +68 -0
  33. package/src/cli/uglyappConfig.test.ts +43 -0
  34. package/src/cli/uglyappConfig.ts +179 -0
  35. package/src/cli/upgrade.ts +200 -0
  36. package/src/cli/version.ts +2 -0
  37. package/src/cli/vultrClient.test.ts +81 -0
  38. package/src/cli/vultrClient.ts +135 -0
  39. package/src/client/AppProvider.tsx +239 -0
  40. package/src/client/ErrorLog.ts +34 -0
  41. package/src/client/FeedbackContext.ts +16 -0
  42. package/src/client/Logger.ts +151 -0
  43. package/src/client/LoginPopup.tsx +80 -0
  44. package/src/client/Router.tsx +616 -0
  45. package/src/client/Screenshot.ts +58 -0
  46. package/src/client/ViewFlipper.tsx +229 -0
  47. package/src/client/animation/Animated.tsx +118 -0
  48. package/src/client/animation/animatedValue.ts +194 -0
  49. package/src/client/animation/useAnimatedTransition.tsx +306 -0
  50. package/src/client/animation/useScrollAnimation.ts +150 -0
  51. package/src/client/animations/FadeIn.tsx +27 -0
  52. package/src/client/animations/SlideFromBottom.tsx +31 -0
  53. package/src/client/animations/SlideFromRight.tsx +31 -0
  54. package/src/client/audio/AudioPlayer.ts +56 -0
  55. package/src/client/audio/AudioRecorder.ts +73 -0
  56. package/src/client/audio/audioPlayer.worklet.ts +66 -0
  57. package/src/client/audio/useSTT.ts +121 -0
  58. package/src/client/audio/useTTS.ts +99 -0
  59. package/src/client/callAI.ts +38 -0
  60. package/src/client/components/Alert.tsx +88 -0
  61. package/src/client/components/AnimatedInput.tsx +404 -0
  62. package/src/client/components/AnimatedList.tsx +249 -0
  63. package/src/client/components/AppScrollViewProvider.tsx +73 -0
  64. package/src/client/components/Button.tsx +92 -0
  65. package/src/client/components/Card.tsx +30 -0
  66. package/src/client/components/CardStack.tsx +1112 -0
  67. package/src/client/components/CelebrationOverlay.tsx +143 -0
  68. package/src/client/components/Confetti.tsx +212 -0
  69. package/src/client/components/DatePicker.tsx +49 -0
  70. package/src/client/components/DateRangePicker.tsx +384 -0
  71. package/src/client/components/DateTimePicker.tsx +61 -0
  72. package/src/client/components/DrawingCanvas.tsx +478 -0
  73. package/src/client/components/EnumInput.tsx +59 -0
  74. package/src/client/components/FeedbackButton.tsx +178 -0
  75. package/src/client/components/FlatList.tsx +386 -0
  76. package/src/client/components/Header.tsx +32 -0
  77. package/src/client/components/Image.tsx +46 -0
  78. package/src/client/components/Input.tsx +64 -0
  79. package/src/client/components/LayoutSize.tsx +142 -0
  80. package/src/client/components/Loading.tsx +92 -0
  81. package/src/client/components/Modal.tsx +58 -0
  82. package/src/client/components/PageLayout.tsx +50 -0
  83. package/src/client/components/Pager.tsx +405 -0
  84. package/src/client/components/Panel.tsx +24 -0
  85. package/src/client/components/PopupPanel.tsx +31 -0
  86. package/src/client/components/Pressable.tsx +53 -0
  87. package/src/client/components/ResponsiveGrid.tsx +81 -0
  88. package/src/client/components/ScrollAnimatedView.tsx +85 -0
  89. package/src/client/components/ScrollDownArrow.tsx +66 -0
  90. package/src/client/components/ScrollIndicator.tsx +93 -0
  91. package/src/client/components/ScrollView.tsx +255 -0
  92. package/src/client/components/SelectView.tsx +353 -0
  93. package/src/client/components/SettingGroup.tsx +59 -0
  94. package/src/client/components/SimpleScrollView.tsx +113 -0
  95. package/src/client/components/TabPicker.tsx +371 -0
  96. package/src/client/components/Text.tsx +88 -0
  97. package/src/client/components/Toast.tsx +50 -0
  98. package/src/client/components/ValidatedTextInput.tsx +646 -0
  99. package/src/client/components/View.tsx +29 -0
  100. package/src/client/components/WheelPicker.tsx +184 -0
  101. package/src/client/components/WizardView.tsx +402 -0
  102. package/src/client/components/ZoomPanPinch.tsx +446 -0
  103. package/src/client/components/index.ts +87 -0
  104. package/src/client/components/zIndex.ts +11 -0
  105. package/src/client/createHttpClient.ts +54 -0
  106. package/src/client/createSocket.ts +666 -0
  107. package/src/client/index.ts +75 -0
  108. package/src/playwright/index.ts +41 -0
  109. package/src/server/App.ts +611 -0
  110. package/src/server/Auth.ts +299 -0
  111. package/src/server/Cache.ts +160 -0
  112. package/src/server/DB.ts +652 -0
  113. package/src/server/Email.ts +88 -0
  114. package/src/server/EmailTemplate.ts +46 -0
  115. package/src/server/ErrorLogAdmin.ts +252 -0
  116. package/src/server/EventCounter.ts +213 -0
  117. package/src/server/EventLogAdmin.ts +538 -0
  118. package/src/server/ExperimentAdmin.ts +200 -0
  119. package/src/server/FeedbackReport.ts +120 -0
  120. package/src/server/ImageGen.ts +6 -0
  121. package/src/server/Logging.ts +434 -0
  122. package/src/server/Nats.ts +209 -0
  123. package/src/server/NatsStore.ts +188 -0
  124. package/src/server/PushNotification.ts +172 -0
  125. package/src/server/RateLimit.ts +165 -0
  126. package/src/server/Redis.ts +257 -0
  127. package/src/server/Router.ts +145 -0
  128. package/src/server/ScheduledTask.ts +42 -0
  129. package/src/server/Socket.ts +515 -0
  130. package/src/server/Storage.ts +138 -0
  131. package/src/server/StoreHandlers.ts +174 -0
  132. package/src/server/TextGen.ts +7 -0
  133. package/src/server/WorkerQueue.ts +299 -0
  134. package/src/server/ai/ImageGenBase.ts +40 -0
  135. package/src/server/ai/ImageGenClient.ts +33 -0
  136. package/src/server/ai/ImageGenFactory.ts +124 -0
  137. package/src/server/ai/ProviderBalance.ts +148 -0
  138. package/src/server/ai/ProviderSelector.ts +26 -0
  139. package/src/server/ai/TextGenBase.ts +167 -0
  140. package/src/server/ai/TextGenClient.ts +141 -0
  141. package/src/server/ai/TextGenFactory.ts +321 -0
  142. package/src/server/ai/fallbacks.ts +107 -0
  143. package/src/server/ai/index.ts +73 -0
  144. package/src/server/ai/providers/Claude.ts +260 -0
  145. package/src/server/ai/providers/FAL.ts +62 -0
  146. package/src/server/ai/providers/Fireworks.ts +191 -0
  147. package/src/server/ai/providers/Google.ts +241 -0
  148. package/src/server/ai/providers/GoogleImage.ts +32 -0
  149. package/src/server/ai/providers/Groq.ts +239 -0
  150. package/src/server/ai/providers/Kie.ts +95 -0
  151. package/src/server/ai/providers/KieImage.ts +55 -0
  152. package/src/server/ai/providers/OpenAIText.ts +246 -0
  153. package/src/server/ai/providers/Together.ts +249 -0
  154. package/src/server/ai/providers/TogetherImage.ts +34 -0
  155. package/src/server/ai/providers/UglyBotImageGenProvider.ts +62 -0
  156. package/src/server/ai/providers/UglyBotTextGenProvider.ts +132 -0
  157. package/src/server/ai/providers/Wavespeed.ts +59 -0
  158. package/src/server/ai/registry.ts +31 -0
  159. package/src/server/ai/types.ts +118 -0
  160. package/src/server/audio/STTStream.ts +93 -0
  161. package/src/server/audio/TTSStream.ts +208 -0
  162. package/src/server/audio/index.ts +16 -0
  163. package/src/server/audio/resample.ts +17 -0
  164. package/src/server/audio/stt/GroqWhisper.ts +137 -0
  165. package/src/server/audio/stt/registry.ts +15 -0
  166. package/src/server/audio/stt/types.ts +33 -0
  167. package/src/server/audio/stt/vad.ts +121 -0
  168. package/src/server/audio/tts/InWorld.ts +192 -0
  169. package/src/server/audio/tts/providers/Azure.ts +43 -0
  170. package/src/server/audio/tts/registry.ts +17 -0
  171. package/src/server/audio/tts/types.ts +27 -0
  172. package/src/server/billing/BillingGateway.ts +181 -0
  173. package/src/server/billing/BillingLedger.ts +275 -0
  174. package/src/server/billing/CreditStore.ts +161 -0
  175. package/src/server/billing/LimitEnforcer.ts +384 -0
  176. package/src/server/billing/UserLimitCache.ts +101 -0
  177. package/src/server/billing/index.ts +21 -0
  178. package/src/server/billing/types.ts +138 -0
  179. package/src/server/embeddings/EmbeddingClient.ts +44 -0
  180. package/src/server/embeddings/index.ts +17 -0
  181. package/src/server/embeddings/providers/OpenAI.ts +37 -0
  182. package/src/server/embeddings/registry.ts +22 -0
  183. package/src/server/embeddings/types.ts +13 -0
  184. package/src/server/index.ts +385 -0
  185. package/src/shared/Api.ts +83 -0
  186. package/src/shared/Audio.ts +138 -0
  187. package/src/shared/DB.ts +499 -0
  188. package/src/shared/Errors.ts +20 -0
  189. package/src/shared/EventCounter.ts +39 -0
  190. package/src/shared/Experiment.ts +71 -0
  191. package/src/shared/FeedbackReport.ts +33 -0
  192. package/src/shared/ImageGen.ts +508 -0
  193. package/src/shared/Router.ts +151 -0
  194. package/src/shared/Socket.ts +74 -0
  195. package/src/shared/TextGen.ts +996 -0
  196. package/src/shared/index.ts +94 -0
  197. package/src/webrtc/index.ts +50 -0
@@ -1 +1 @@
1
- {"version":3,"file":"imageGen.d.ts","sourceRoot":"","sources":["../../src/cli/imageGen.ts"],"names":[],"mappings":"AAkBA,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CA6Cf"}
1
+ {"version":3,"file":"imageGen.d.ts","sourceRoot":"","sources":["../../src/cli/imageGen.ts"],"names":[],"mappings":"AA0BA,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,IAAI,CAAC,CAuEf"}
@@ -33,20 +33,41 @@ export async function runImageGen(prompt, opts) {
33
33
  throw new Error(`imageGen failed: ${res.status} ${body}`);
34
34
  }
35
35
  const data = (await res.json());
36
- const url = data.result;
37
- if (opts.output) {
38
- const imgRes = await fetch(url);
39
- if (!imgRes.ok) {
40
- throw new Error(`Failed to download image: ${imgRes.status}`);
41
- }
42
- const buffer = Buffer.from(await imgRes.arrayBuffer());
43
- const outputPath = path.resolve(opts.output);
36
+ if ('error' in data && data.error) {
37
+ throw new Error(`imageGen error: ${data.error}`);
38
+ }
39
+ // Response is base64 image data
40
+ if ('base64' in data && data.base64) {
41
+ const buffer = Buffer.from(data.base64, 'base64');
42
+ const ext = data.mime === 'image/png' ? 'png' : 'jpg';
43
+ const outputPath = opts.output
44
+ ? path.resolve(opts.output)
45
+ : path.resolve(`image.${ext}`);
44
46
  fs.mkdirSync(path.dirname(outputPath), { recursive: true });
45
47
  fs.writeFileSync(outputPath, buffer);
46
- console.log(`Saved to ${outputPath}`);
48
+ console.log(`Saved to ${outputPath} (${data.width}x${data.height})`);
49
+ return;
47
50
  }
48
- else {
49
- console.log(url);
51
+ // Response is a URL
52
+ const url = ('result' in data ? data.result : undefined) ??
53
+ ('url' in data ? data.url : undefined);
54
+ if (url) {
55
+ if (opts.output) {
56
+ const imgRes = await fetch(url);
57
+ if (!imgRes.ok) {
58
+ throw new Error(`Failed to download image: ${imgRes.status}`);
59
+ }
60
+ const buffer = Buffer.from(await imgRes.arrayBuffer());
61
+ const outputPath = path.resolve(opts.output);
62
+ fs.mkdirSync(path.dirname(outputPath), { recursive: true });
63
+ fs.writeFileSync(outputPath, buffer);
64
+ console.log(`Saved to ${outputPath}`);
65
+ }
66
+ else {
67
+ console.log(url);
68
+ }
69
+ return;
50
70
  }
71
+ throw new Error('imageGen returned no image data');
51
72
  }
52
73
  //# sourceMappingURL=imageGen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"imageGen.js","sourceRoot":"","sources":["../../src/cli/imageGen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAQpB,SAAS,QAAQ;IACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAe,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,IAGC;IAED,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IAExB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,UAAU,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACvC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,UAAU;YACd,KAAK,EAAE;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,gBAAgB;gBACrC,MAAM;aACP;YACD,SAAS,EAAE,KAAK;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;IACtD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IAExB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,EAAE,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"imageGen.js","sourceRoot":"","sources":["../../src/cli/imageGen.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"textGen.d.ts","sourceRoot":"","sources":["../../src/cli/textGen.ts"],"names":[],"mappings":"AAkBA,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
1
+ {"version":3,"file":"textGen.d.ts","sourceRoot":"","sources":["../../src/cli/textGen.ts"],"names":[],"mappings":"AAkBA,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CA+Cf"}
@@ -41,11 +41,12 @@ export async function runTextGen(prompt, opts) {
41
41
  throw new Error(`textGen failed: ${res.status} ${body}`);
42
42
  }
43
43
  const data = (await res.json());
44
+ const text = data.message?.content ?? data.result ?? '';
44
45
  if (opts.json) {
45
- console.log(JSON.stringify({ text: data.result }));
46
+ console.log(JSON.stringify({ text }));
46
47
  }
47
48
  else {
48
- console.log(data.result);
49
+ console.log(text);
49
50
  }
50
51
  }
51
52
  //# sourceMappingURL=textGen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"textGen.js","sourceRoot":"","sources":["../../src/cli/textGen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAQpB,SAAS,QAAQ;IACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAe,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAMC;IAED,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAwC,EAAE,CAAC;IACzD,IAAI,IAAI,CAAC,YAAY;QACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,UAAU,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACvC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,SAAS;YACb,KAAK,EAAE;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe;gBACpC,QAAQ;gBACR,OAAO,EAAE;oBACP,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;oBAC/D,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG;iBACnE;aACF;YACD,SAAS,EAAE,KAAK;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAuB,CAAC;IACtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"textGen.js","sourceRoot":"","sources":["../../src/cli/textGen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAQpB,SAAS,QAAQ;IACf,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAe,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAMC;IAED,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,QAAQ,GAAwC,EAAE,CAAC;IACzD,IAAI,IAAI,CAAC,YAAY;QACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,UAAU,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACvC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,EAAE,EAAE,SAAS;YACb,KAAK,EAAE;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,eAAe;gBACpC,QAAQ;gBACR,OAAO,EAAE;oBACP,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;oBAC/D,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG;iBACnE;aACF;YACD,SAAS,EAAE,KAAK;SACjB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;IACxD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;AACH,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.86";
1
+ export declare const CLI_VERSION = "0.1.87";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.86";
2
+ export const CLI_VERSION = "0.1.87";
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.86",
3
+ "version": "0.1.87",
4
4
  "type": "module",
5
5
  "main": "./dist/server/index.js",
6
6
  "exports": {
@@ -0,0 +1,56 @@
1
+ import { SignJWT } from 'jose';
2
+ import { MongoClient, ObjectId } from 'mongodb';
3
+ import { nanoid } from 'nanoid';
4
+
5
+ function getMongoUri(): string {
6
+ const uri = process.env.MONGODB_URI;
7
+ if (!uri) throw new Error('MONGODB_URI env var is required');
8
+ return uri;
9
+ }
10
+
11
+ export async function createAccount(
12
+ email: string,
13
+ name?: string,
14
+ ): Promise<{ userId: string; email: string }> {
15
+ const client = new MongoClient(getMongoUri());
16
+ try {
17
+ await client.connect();
18
+ const db = client.db();
19
+ const users = db.collection('user');
20
+
21
+ const existing = await users.findOne({ email });
22
+ if (existing) {
23
+ return { userId: existing._id.toString(), email };
24
+ }
25
+
26
+ const now = Date.now();
27
+ const userId = nanoid();
28
+ await users.insertOne({
29
+ _id: userId as unknown as ObjectId,
30
+ id: userId,
31
+ email,
32
+ name: name ?? email.split('@')[0],
33
+ version: 1,
34
+ created: now,
35
+ updated: now,
36
+ });
37
+
38
+ return { userId, email };
39
+ } finally {
40
+ await client.close();
41
+ }
42
+ }
43
+
44
+ function getJwtSecret(): Uint8Array {
45
+ const secret = process.env.JWT_SECRET;
46
+ if (!secret) throw new Error('JWT_SECRET env var is required');
47
+ return new TextEncoder().encode(secret);
48
+ }
49
+
50
+ export async function createToken(userId: string): Promise<string> {
51
+ return new SignJWT({ sub: userId })
52
+ .setProtectedHeader({ alg: 'HS256' })
53
+ .setExpirationTime('30d')
54
+ .setIssuedAt()
55
+ .sign(getJwtSecret());
56
+ }
@@ -0,0 +1,32 @@
1
+ import { execSync } from 'child_process';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+
5
+ export function runBuild(): void {
6
+ const buildId = String(Date.now());
7
+
8
+ // Write shared/Build.ts
9
+ const buildFilePath = path.join(process.cwd(), 'shared', 'Build.ts');
10
+ const buildFileContent = `// Auto-generated by 'web build' — do not edit manually
11
+ export const buildId = '${buildId}';
12
+ `;
13
+
14
+ // Ensure shared/ dir exists
15
+ const sharedDir = path.dirname(buildFilePath);
16
+ if (!fs.existsSync(sharedDir)) {
17
+ fs.mkdirSync(sharedDir, { recursive: true });
18
+ }
19
+
20
+ fs.writeFileSync(buildFilePath, buildFileContent, 'utf-8');
21
+ console.log(`[Build] buildId: ${buildId}`);
22
+
23
+ // Run vite build
24
+ console.log('[Build] Running vite build...');
25
+ execSync('npx vite build', { stdio: 'inherit', cwd: process.cwd() });
26
+
27
+ // Run tsc for server typecheck
28
+ console.log('[Build] Running tsc...');
29
+ execSync('npx tsc --noEmit', { stdio: 'inherit', cwd: process.cwd() });
30
+
31
+ console.log(`[Build] Build complete (${buildId})`);
32
+ }
@@ -0,0 +1,68 @@
1
+ import fs from 'fs';
2
+ import { nanoid } from 'nanoid';
3
+ import path from 'path';
4
+ import readline from 'readline';
5
+ import {
6
+ printPortTable,
7
+ readUglyAppConfig,
8
+ validatePortStart,
9
+ writeUglyAppConfig,
10
+ } from './uglyappConfig.js';
11
+
12
+ async function promptPortStart(rl: readline.Interface): Promise<number> {
13
+ return new Promise((resolve) => {
14
+ const ask = () => {
15
+ rl.question('Port start? [3000]: ', (answer) => {
16
+ const raw = answer.trim() || '3000';
17
+ const parsed = parseInt(raw, 10);
18
+ // String(parsed) !== raw catches "3000abc" → parseInt returns 3000 but string differs
19
+ if (
20
+ !Number.isInteger(parsed) ||
21
+ parsed <= 0 ||
22
+ String(parsed) !== raw
23
+ ) {
24
+ console.error(
25
+ `Invalid value "${raw}". Must be a positive integer. Try again.`,
26
+ );
27
+ ask();
28
+ } else {
29
+ resolve(parsed);
30
+ }
31
+ });
32
+ };
33
+ ask();
34
+ });
35
+ }
36
+
37
+ export async function configureProject(cwd: string): Promise<void> {
38
+ const configPath = path.join(cwd, '.uglyapp');
39
+
40
+ if (fs.existsSync(configPath)) {
41
+ const existing = readUglyAppConfig(cwd);
42
+ console.warn(
43
+ `[uglyapp] .uglyapp already exists (projectId: ${existing?.projectId}, portStart: ${existing?.portStart}). Remove it first to reconfigure.`,
44
+ );
45
+ return;
46
+ }
47
+
48
+ const rl = readline.createInterface({
49
+ input: process.stdin,
50
+ output: process.stdout,
51
+ });
52
+
53
+ try {
54
+ const portStart = await promptPortStart(rl);
55
+ validatePortStart(portStart); // warns on conflicts, does not throw
56
+
57
+ const projectId = nanoid(10);
58
+ writeUglyAppConfig(cwd, { projectId, portStart });
59
+
60
+ console.log(`\n[uglyapp] Created .uglyapp`);
61
+ console.log(` projectId: ${projectId}`);
62
+ console.log(` portStart: ${portStart}`);
63
+ printPortTable(portStart);
64
+ console.log('Commit .uglyapp to share port assignments with your team.');
65
+ } finally {
66
+ rl.close();
67
+ }
68
+ }