ugly-app 0.1.44 → 0.1.46

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 (107) hide show
  1. package/README.md +143 -111
  2. package/dist/cli/initDb.d.ts.map +1 -1
  3. package/dist/cli/initDb.js +33 -1
  4. package/dist/cli/initDb.js.map +1 -1
  5. package/dist/cli/scaffold.d.ts.map +1 -1
  6. package/dist/cli/scaffold.js +6 -2
  7. package/dist/cli/scaffold.js.map +1 -1
  8. package/dist/cli/uglyBotLogin.d.ts.map +1 -1
  9. package/dist/cli/uglyBotLogin.js.map +1 -1
  10. package/dist/cli/upgrade.d.ts.map +1 -1
  11. package/dist/cli/upgrade.js +5 -5
  12. package/dist/cli/upgrade.js.map +1 -1
  13. package/dist/client/Logger.d.ts +11 -0
  14. package/dist/client/Logger.d.ts.map +1 -1
  15. package/dist/client/Logger.js +82 -22
  16. package/dist/client/Logger.js.map +1 -1
  17. package/dist/client/Router.d.ts +5 -3
  18. package/dist/client/Router.d.ts.map +1 -1
  19. package/dist/client/Router.js +25 -10
  20. package/dist/client/Router.js.map +1 -1
  21. package/dist/client/animation/Animated.d.ts +11 -6
  22. package/dist/client/animation/Animated.d.ts.map +1 -1
  23. package/dist/client/animation/Animated.js +11 -27
  24. package/dist/client/animation/Animated.js.map +1 -1
  25. package/dist/client/callAI.d.ts.map +1 -1
  26. package/dist/client/callAI.js +2 -3
  27. package/dist/client/callAI.js.map +1 -1
  28. package/dist/client/createHttpClient.d.ts +13 -0
  29. package/dist/client/createHttpClient.d.ts.map +1 -0
  30. package/dist/client/createHttpClient.js +24 -0
  31. package/dist/client/createHttpClient.js.map +1 -0
  32. package/dist/client/createSocket.d.ts +1 -3
  33. package/dist/client/createSocket.d.ts.map +1 -1
  34. package/dist/client/createSocket.js +0 -11
  35. package/dist/client/createSocket.js.map +1 -1
  36. package/dist/client/index.d.ts +4 -2
  37. package/dist/client/index.d.ts.map +1 -1
  38. package/dist/client/index.js +2 -1
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/server/App.d.ts +4 -4
  41. package/dist/server/App.d.ts.map +1 -1
  42. package/dist/server/App.js +54 -14
  43. package/dist/server/App.js.map +1 -1
  44. package/dist/server/Auth.d.ts.map +1 -1
  45. package/dist/server/Auth.js +14 -11
  46. package/dist/server/Auth.js.map +1 -1
  47. package/dist/server/ErrorLogAdmin.d.ts +50 -0
  48. package/dist/server/ErrorLogAdmin.d.ts.map +1 -0
  49. package/dist/server/ErrorLogAdmin.js +143 -0
  50. package/dist/server/ErrorLogAdmin.js.map +1 -0
  51. package/dist/server/FeedbackReport.d.ts +2 -3
  52. package/dist/server/FeedbackReport.d.ts.map +1 -1
  53. package/dist/server/FeedbackReport.js +4 -5
  54. package/dist/server/FeedbackReport.js.map +1 -1
  55. package/dist/server/Logging.d.ts +6 -0
  56. package/dist/server/Logging.d.ts.map +1 -1
  57. package/dist/server/Logging.js +97 -45
  58. package/dist/server/Logging.js.map +1 -1
  59. package/dist/server/Router.d.ts +12 -25
  60. package/dist/server/Router.d.ts.map +1 -1
  61. package/dist/server/Router.js +66 -48
  62. package/dist/server/Router.js.map +1 -1
  63. package/dist/server/Socket.d.ts.map +1 -1
  64. package/dist/server/Socket.js +3 -1
  65. package/dist/server/Socket.js.map +1 -1
  66. package/dist/server/index.d.ts +6 -4
  67. package/dist/server/index.d.ts.map +1 -1
  68. package/dist/server/index.js +3 -2
  69. package/dist/server/index.js.map +1 -1
  70. package/dist/shared/Api.d.ts +18 -20
  71. package/dist/shared/Api.d.ts.map +1 -1
  72. package/dist/shared/Api.js +9 -9
  73. package/dist/shared/Api.js.map +1 -1
  74. package/dist/shared/DB.d.ts +29 -8
  75. package/dist/shared/DB.d.ts.map +1 -1
  76. package/dist/shared/DB.js.map +1 -1
  77. package/dist/shared/Socket.d.ts +4 -6
  78. package/dist/shared/Socket.d.ts.map +1 -1
  79. package/package.json +1 -1
  80. package/templates/CLAUDE.md +26 -7
  81. package/templates/client/App.tsx +1 -1
  82. package/templates/client/allPages.ts +12 -1
  83. package/templates/client/main.tsx +3 -3
  84. package/templates/client/pages/AITestPage.tsx +27 -10
  85. package/templates/client/pages/AuthDemoPage.tsx +34 -9
  86. package/templates/client/pages/HomePage.tsx +51 -14
  87. package/templates/client/pages/UserPage.tsx +5 -1
  88. package/templates/package.json +1 -1
  89. package/templates/server/index.ts +16 -26
  90. package/templates/shared/api.ts +22 -16
  91. package/templates/shared/collections.ts +43 -2
  92. package/templates/shared/pages.ts +12 -0
  93. package/templates/vite.config.ts +1 -0
  94. package/templates/shared/dbIndexes.ts +0 -11
  95. package/templates/shared/types.ts +0 -6
  96. /package/templates/.claude/skills/{assets.md → assets/SKILL.md} +0 -0
  97. /package/templates/.claude/skills/{check-errors.md → check-errors/SKILL.md} +0 -0
  98. /package/templates/.claude/skills/{check-feedback.md → check-feedback/SKILL.md} +0 -0
  99. /package/templates/.claude/skills/{check-perf.md → check-perf/SKILL.md} +0 -0
  100. /package/templates/.claude/skills/{create-test-users.md → create-test-users/SKILL.md} +0 -0
  101. /package/templates/.claude/skills/{extend-api.md → extend-api/SKILL.md} +0 -0
  102. /package/templates/.claude/skills/{fix-code.md → fix-code/SKILL.md} +0 -0
  103. /package/templates/.claude/skills/{fix-errors.md → fix-errors/SKILL.md} +0 -0
  104. /package/templates/.claude/skills/{fix-feedback.md → fix-feedback/SKILL.md} +0 -0
  105. /package/templates/.claude/skills/{fix-perf.md → fix-perf/SKILL.md} +0 -0
  106. /package/templates/.claude/skills/{uploads.md → uploads/SKILL.md} +0 -0
  107. /package/templates/.claude/skills/{use-ai.md → use-ai/SKILL.md} +0 -0
package/README.md CHANGED
@@ -33,41 +33,39 @@ import {
33
33
  createApp,
34
34
  createUserHelper,
35
35
  getFeedbackHandlers,
36
- type CallHandlers,
36
+ type AppConfigurator,
37
37
  type RequestHandlers,
38
- type HandlerContext,
39
38
  } from 'ugly-app';
40
39
  import { dbDefaults } from 'ugly-app/shared';
41
- import { functions, requests } from '../shared/api';
40
+ import { requests } from '../shared/api';
42
41
  import { collections } from '../shared/collections';
43
42
  import { pages } from '../shared/pages';
44
- import type { User } from '../shared/types';
43
+ import type { User } from '../shared/collections';
45
44
 
46
45
  const userHelper = createUserHelper<User>(collections.user);
47
-
48
- const calls = {
49
- ...getFeedbackHandlers(maintainBotUserId),
50
- myFunction: async (ctx: HandlerContext, input) => {
51
- return { greeting: `Hello, ${input.name}` };
52
- },
53
- } satisfies CallHandlers<typeof functions>;
54
-
55
- const reqs = {
56
- getMe: async (ctx: HandlerContext) => {
57
- const user = await userHelper.get(ctx.db, ctx.userId);
58
- return { userId: ctx.userId, email: user?.email };
46
+ const maintainBotUserId = process.env.MAINTAIN_BOT_USER_ID ?? '';
47
+
48
+ const app = createApp(
49
+ { requests },
50
+ {
51
+ ...getFeedbackHandlers(maintainBotUserId),
52
+ getMe: async (userId: string) => {
53
+ const user = await userHelper.get(app.db, userId);
54
+ return { userId, email: user?.email, phone: user?.phone };
55
+ },
56
+ } satisfies RequestHandlers<typeof requests>,
57
+ collections,
58
+ (configurator: AppConfigurator) => {
59
+ configurator.setPages({ pages });
60
+ configurator.setUserHelper(userHelper);
61
+ configurator.setOnUserCreate(async (userId, info, db) => {
62
+ await userHelper.set(db, { id: userId, ...dbDefaults(), ...info });
63
+ });
59
64
  },
60
- } satisfies RequestHandlers<typeof requests>;
61
-
62
- const app = createApp({ functions, requests }, calls, reqs, collections, (configurator) => {
63
- configurator.setPages({ pages });
64
- configurator.setUserHelper(userHelper);
65
- configurator.setOnUserCreate(async (userId, info, db) => {
66
- await userHelper.set(db, { id: userId, ...dbDefaults(), ...info });
67
- });
68
- });
65
+ );
69
66
 
70
- await app.start(3000);
67
+ const port = parseInt(process.env['PORT'] ?? '3000');
68
+ await app.start(port);
71
69
  ```
72
70
 
73
71
  **Signature:**
@@ -75,7 +73,6 @@ await app.start(3000);
75
73
  ```typescript
76
74
  function createApp<R extends AppRegistryBase, Defs extends CollectionDefRegistry>(
77
75
  registry: R,
78
- calls: Partial<CallHandlers<R['functions']>>,
79
76
  requests: Partial<RequestHandlers<R['requests']>>,
80
77
  appDefs: Defs,
81
78
  configure?: (configurator: AppConfigurator) => void,
@@ -86,7 +83,8 @@ The returned `App` object has:
86
83
  - `start(port?)` — starts the server (default port 3000)
87
84
  - `registerRoutes(fn)` — mount additional Express routes after creation
88
85
  - `httpServer` — the underlying Node.js HTTP server
89
- - `dispatch(type, name, input, userId)` invoke an RPC handler programmatically
86
+ - `db` the `TypedDB` instance for direct database access
87
+ - `dispatch(name, input, userId)` — invoke an RPC handler programmatically
90
88
 
91
89
  ### `AppConfigurator`
92
90
 
@@ -96,24 +94,23 @@ The returned `App` object has:
96
94
  | `setUserHelper(helper)` | User lookup for WebSocket auth handshake |
97
95
  | `setOnUserCreate(handler)` | Called on first login — must create the user record. `(userId, { email?, phone? }, db) => Promise<void>` |
98
96
  | `setAuth(provider)` | Custom `AuthProvider` (default: ugly.bot OAuth). Provider must implement `verify(code)` and `authUrl(origin)` |
99
- | `setContextExtensions(fn)` | Add fields to `HandlerContext` — `(base: HandlerContext) => Promise<E>` |
100
97
  | `setOnSocketMessage(handler)` | Handle raw WebSocket messages. Return `true` to consume, `false` to let the framework handle it |
101
98
  | `registerRoutes(fn)` | Mount custom Express routes — `(router: express.Router) => void` |
102
99
  | `setWorkerQueue(queue)` | Register a background worker queue with `start()` and `stop()` |
103
100
 
104
- ### Handler context (`ctx`)
101
+ ### Handler signatures
105
102
 
106
- Every RPC handler receives a `HandlerContext`:
103
+ Handlers are plain async functions — no context object, just `userId` and `input`:
107
104
 
108
- | Field | Type | Description |
109
- |-------|------|-------------|
110
- | `ctx.userId` | `string` | Authenticated user ID (always set) |
111
- | `ctx.db` | `TypedDB` | MongoDB client with typed collection methods |
112
- | `ctx.storage` | `StorageClient` | R2/S3 presigned uploads and public URLs |
113
- | `ctx.textGen` | `TextGenClient` | Text generation (see AI section) |
114
- | `ctx.imageGen` | `ImageGenClient` | Image generation |
115
- | `ctx.log` | `Logger` | Structured logging to MongoDB |
116
- | `ctx.rateLimit` | `RateLimiter` | Token-bucket rate limiting |
105
+ ```typescript
106
+ // req() — public, userId may be null
107
+ getPublicData: async (userId: string | null, input) => { ... }
108
+
109
+ // authReq() authenticated, 401 auto-enforced, userId always a string
110
+ getMe: async (userId: string, input) => { ... }
111
+ ```
112
+
113
+ Access `app.db`, storage, and AI clients directly via imports or the `app` object they are not injected into handlers.
117
114
 
118
115
  ---
119
116
 
@@ -121,31 +118,40 @@ Every RPC handler receives a `HandlerContext`:
121
118
 
122
119
  All type definitions live in `shared/` and are used by both server and client.
123
120
 
124
- ### Functions and requests (`shared/api.ts`)
121
+ ### Requests (`shared/api.ts`)
125
122
 
126
123
  ```typescript
127
- import { defineFunctions, defineRequests, fn, req, z } from 'ugly-app/shared';
124
+ import { authReq, defineRequests, req, z } from 'ugly-app/shared';
128
125
 
129
- export const functions = defineFunctions({
130
- createNote: fn({
131
- input: z.object({ title: z.string(), body: z.string() }),
132
- output: z.object({ id: z.string() }),
126
+ export const requests = defineRequests({
127
+ // Public request — handler receives (userId: string | null, input)
128
+ getPublicData: req({
129
+ input: z.object({ id: z.string() }),
130
+ output: z.object({ data: z.string() }),
133
131
  }),
134
- });
135
132
 
136
- export const requests = defineRequests({
137
- getNotes: req({
133
+ // Authenticated request handler receives (userId: string, input)
134
+ getMe: authReq({
138
135
  input: z.object({}),
139
- output: z.array(z.object({ id: z.string(), title: z.string() })),
136
+ output: z.object({ userId: z.string(), email: z.string().optional() }),
137
+ }),
138
+
139
+ // With rate limiting
140
+ submitFeedback: authReq({
141
+ input: z.object({ type: z.enum(['bug', 'design', 'feature']), message: z.string() }),
142
+ output: z.object({ id: z.string() }),
143
+ rateLimit: { max: 20, window: 60 },
140
144
  }),
141
145
  });
142
146
  ```
143
147
 
144
- - `fn({ input, output })` — defines a mutation (write operation). `input` and `output` are Zod schemas.
145
- - `req({ input, output })` — defines a query (read operation).
146
- - `defineFunctions()` / `defineRequests()` — identity wrappers that preserve types. `defineCalls` is an alias for `defineFunctions`.
148
+ - `req({ input, output })` — defines a public request. Handler signature: `(userId: string | null, input: I) => Promise<O>`.
149
+ - `authReq({ input, output })` — defines an authenticated request. Handler signature: `(userId: string, input: I) => Promise<O>`. Returns 401 automatically if no token.
150
+ - `defineRequests()` — identity wrapper that preserves types.
147
151
  - `z` is re-exported from Zod for convenience.
148
152
 
153
+ Every endpoint is accessible via both WebSocket (`socket.request(name, input)`) and HTTP (`POST /api/:name { input }`).
154
+
149
155
  ### Collections (`shared/collections.ts`)
150
156
 
151
157
  ```typescript
@@ -203,11 +209,11 @@ export type AppPages = typeof pages;
203
209
  ```tsx
204
210
  import { createRoot } from 'react-dom/client';
205
211
  import { AppProvider, createSocket, LoginPopup } from 'ugly-app/client';
206
- import { functions, requests } from '../shared/api';
212
+ import { requests } from '../shared/api';
207
213
  import { RouterProvider } from './router';
208
214
  import App from './App';
209
215
 
210
- const token = (window as any).__AUTH_TOKEN__;
216
+ const token = (window as unknown as { __AUTH_TOKEN__?: string }).__AUTH_TOKEN__;
211
217
  const root = createRoot(document.getElementById('root')!);
212
218
  const loginPopup = <LoginPopup onSuccess={() => window.location.reload()} />;
213
219
 
@@ -219,7 +225,7 @@ if (!token) {
219
225
  );
220
226
  } else {
221
227
  const userId = JSON.parse(atob(token.split('.')[1]!)).sub as string;
222
- const socket = createSocket({ functions, requests, url: '/rpc' });
228
+ const socket = createSocket({ requests, url: '/rpc' });
223
229
  socket.connect(token).then((user) => {
224
230
  root.render(
225
231
  <RouterProvider fallback={<div>404</div>} loginFallback={loginPopup} isAuthenticated={() => true}>
@@ -237,7 +243,7 @@ if (!token) {
237
243
  Creates a typed WebSocket client for RPC communication.
238
244
 
239
245
  ```typescript
240
- const socket = createSocket({ functions, requests, url: '/rpc' });
246
+ const socket = createSocket({ requests, url: '/rpc' });
241
247
  await socket.connect(token); // returns UserBase
242
248
  ```
243
249
 
@@ -246,14 +252,30 @@ await socket.connect(token); // returns UserBase
246
252
  | Method | Description |
247
253
  |--------|-------------|
248
254
  | `connect(token)` | Authenticate and connect. Returns the user object |
249
- | `call(name, input)` | Invoke a function (mutation) |
250
- | `request(name, input)` | Invoke a request (query) |
255
+ | `request(name, input)` | Invoke a request (query or mutation) |
251
256
  | `getDoc(collection, id)` | Fetch a single document |
252
257
  | `trackDoc(collection, id, cb)` | Subscribe to real-time doc changes. Returns unsubscribe fn |
253
258
  | `trackDocs(collection, filter, cb, opts?)` | Subscribe to query results. Returns unsubscribe fn |
254
259
  | `uploadFile(file, key)` | Upload a file via presigned URL |
255
260
  | `disconnect()` | Close the connection |
256
261
 
262
+ ### `createHttpClient()`
263
+
264
+ Creates a typed HTTP client for RPC communication (no WebSocket needed).
265
+
266
+ ```typescript
267
+ import { createHttpClient } from 'ugly-app/client';
268
+
269
+ const client = createHttpClient({ requests, token: 'eyJ...', baseUrl: '' });
270
+ const result = await client.request('getMe', {});
271
+ ```
272
+
273
+ | Option | Description |
274
+ |--------|-------------|
275
+ | `requests` | The requests registry from `shared/api.ts` |
276
+ | `token?` | Bearer token for authenticated requests |
277
+ | `baseUrl?` | URL prefix (default: `''` — relative paths: `POST /api/:name`) |
278
+
257
279
  ### `AppProvider`
258
280
 
259
281
  Wraps your app with context for `useApp()`. Provides user info, socket access, popup management, async loading overlay, splash screen, and localization.
@@ -303,7 +325,7 @@ export const { RouterProvider, RouterView, useRouter } = createRouter({ pages, a
303
325
 
304
326
  `createRouter()` returns three things:
305
327
  - **`RouterProvider`** — wrap your app. Props: `children`, `fallback?` (shown before first route resolves), `loginFallback?` (shown for auth-guarded pages when unauthenticated), `isAuthenticated?` (function returning boolean)
306
- - **`RouterView`** — renders the active page with animated transitions. Props: `durationMs?`, `easing?`, `transitionComponent?`
328
+ - **`RouterView`** — renders the active page with animated transitions. Props: `durationMs?`, `easing?`, `transitionComponent?`, `renderPage?`
307
329
  - **`useRouter()`** — hook returning the router context
308
330
 
309
331
  #### Page map (`client/allPages.ts`)
@@ -479,57 +501,61 @@ configurator.setAuth({
479
501
 
480
502
  ## Database (`TypedDB`)
481
503
 
504
+ Access via `app.db` or by importing `createTypedDB` / `getMongoClient` from `'ugly-app'`.
505
+
506
+ All methods accept either a `CollectionDef` object (from `defineCollections`) or a plain collection name string as the first argument.
507
+
482
508
  ### Writing
483
509
 
484
510
  ```typescript
485
511
  // Insert or replace a document
486
- await ctx.db.setDoc(collections.note, doc);
487
- await ctx.db.setDoc(collections.note, doc, { skipIfExists: true });
512
+ await db.setDoc(collections.note, doc);
513
+ await db.setDoc(collections.note, doc, { skipIfExists: true });
488
514
 
489
515
  // Partial update — only specified fields (supports dot-notation paths)
490
- await ctx.db.setDocFields(collections.note, id, { title: 'New title' });
516
+ await db.setDocFields(collections.note, id, { title: 'New title' });
491
517
 
492
518
  // Partial update — returns null if document doesn't exist (no error)
493
- const doc = await ctx.db.setDocFieldsOrIgnore(collections.note, id, { title });
519
+ const doc = await db.setDocFieldsOrIgnore(collections.note, id, { title });
494
520
 
495
521
  // Partial update — creates the document if it doesn't exist (obj = default doc for insert)
496
- await ctx.db.setDocFieldsOrCreate(collections.note, id, { title }, defaultDoc);
522
+ await db.setDocFieldsOrCreate(collections.note, id, { title }, defaultDoc);
497
523
 
498
524
  // MongoDB update operators ($inc, $addToSet, $pull, $unset, $set)
499
- await ctx.db.setDocOp(collections.note, id, { $inc: { views: 1 } });
500
- await ctx.db.setDocOpOrIgnore(collections.note, id, { $inc: { views: 1 } }); // no error if missing
525
+ await db.setDocOp(collections.note, id, { $inc: { views: 1 } });
526
+ await db.setDocOpOrIgnore(collections.note, id, { $inc: { views: 1 } }); // no error if missing
501
527
  ```
502
528
 
503
529
  ### Reading
504
530
 
505
531
  ```typescript
506
- const note = await ctx.db.getDoc(collections.note, id);
507
- const notes = await ctx.db.getDocs(collections.note, { userId }, { sort: { created: -1 }, limit: 20 });
532
+ const note = await db.getDoc(collections.note, id);
533
+ const notes = await db.getDocs(collections.note, { userId }, { sort: { created: -1 }, limit: 20 });
508
534
 
509
535
  // Aggregation pipeline
510
- const results = await ctx.db.getQuery<MyResult>('note', pipeline, { skip, limit });
511
- const count = await ctx.db.getQueryCount('note', pipeline);
512
- const raw = await ctx.db.getQueryRaw<T>('note', pipeline);
536
+ const results = await db.getQuery<MyResult>('note', pipeline, { skip, limit });
537
+ const count = await db.getQueryCount('note', pipeline);
538
+ const raw = await db.getQueryRaw<T>('note', pipeline);
513
539
 
514
540
  // Dynamic/untyped access (when collection name is a runtime string)
515
- const doc = await ctx.db.rawGetDoc(collectionName, id);
516
- const docs = await ctx.db.rawGetDocs(collectionName, filter);
541
+ const doc = await db.rawGetDoc(collectionName, id);
542
+ const docs = await db.rawGetDocs(collectionName, filter);
517
543
  ```
518
544
 
519
545
  ### Deleting
520
546
 
521
547
  ```typescript
522
- await ctx.db.deleteDoc(collections.note, id); // single doc (cascades via parent)
523
- await ctx.db.deleteQuery(collections.note, { userId }); // bulk delete by filter
548
+ await db.deleteDoc(collections.note, id); // single doc (cascades via parent)
549
+ await db.deleteQuery(collections.note, { userId }); // bulk delete by filter
524
550
  ```
525
551
 
526
552
  ### Caching
527
553
 
528
554
  ```typescript
529
- const cached = await ctx.db.cacheGet<MyType>(key);
530
- await ctx.db.cacheSet(key, value, ttlMs);
531
- await ctx.db.cacheDelete(key);
532
- const key = ctx.db.cacheKey('prefix', id); // generate a cache key
555
+ const cached = db.cacheGet<MyType>(key);
556
+ db.cacheSet(key, value, ttlMs);
557
+ db.cacheDelete(key);
558
+ const key = db.cacheKey('prefix', id); // generate a cache key
533
559
  ```
534
560
 
535
561
  ### Helpers
@@ -554,15 +580,21 @@ await userHelper.set(db, { id: userId, ...dbDefaults(), email });
554
580
  import { defineDbIndexes } from 'ugly-app/shared';
555
581
 
556
582
  export const dbIndexes = defineDbIndexes({
557
- note: [
558
- { key: { userId: 1, created: -1 } },
559
- { key: { title: 'text' }, type: 'search' },
560
- ],
583
+ note: {
584
+ indexes: [
585
+ { fields: { userId: 1, created: -1 } },
586
+ { fields: { title: 1 }, unique: true },
587
+ ],
588
+ searchIndexes: [
589
+ { name: 'note_search', fields: { title: 'string', body: 'string' } },
590
+ ],
591
+ vectorIndexes: [
592
+ { name: 'note_embedding', field: 'embedding', dimensions: 1536, similarity: 'cosine' },
593
+ ],
594
+ },
561
595
  });
562
596
  ```
563
597
 
564
- Index types supported: standard (`IndexDef`), text search (`SearchIndexDef`), and vector/embedding (`VectorIndexDef` with cosine, euclidean, or dotProduct similarity).
565
-
566
598
  Run `npm run db:init` to create/update indexes.
567
599
 
568
600
  ---
@@ -572,10 +604,12 @@ Run `npm run db:init` to create/update indexes.
572
604
  ### Text generation
573
605
 
574
606
  ```typescript
575
- // In a handler via ctx.textGen:
576
- const text = await ctx.textGen.generate(messages);
577
- const json = await ctx.textGen.generateJson(schema, messages); // Zod schema, retries on parse failure
578
- const result = await ctx.textGen.generateWithTools(messages, tools); // automatic tool-call loop
607
+ import { createTextGen } from 'ugly-app';
608
+ const textGen = createTextGen();
609
+
610
+ const text = await textGen.generate(messages);
611
+ const json = await textGen.generateJson(schema, messages); // Zod schema, retries on parse failure
612
+ const result = await textGen.generateWithTools(messages, tools); // automatic tool-call loop
579
613
  ```
580
614
 
581
615
  | Provider | `provider` value | JSON | Tools | Vision |
@@ -589,17 +623,13 @@ const result = await ctx.textGen.generateWithTools(messages, tools); // automati
589
623
 
590
624
  Use `provider: 'auto'` (default) to let the system pick based on requirements.
591
625
 
592
- **Standalone client (outside handlers):**
593
-
594
- ```typescript
595
- import { createTextGenClient } from 'ugly-app';
596
- const textGen = createTextGenClient();
597
- ```
598
-
599
626
  ### Image generation
600
627
 
601
628
  ```typescript
602
- const url = await ctx.imageGen.generate(prompt, { width: 1024, height: 1024 });
629
+ import { createImageGen } from 'ugly-app';
630
+ const imageGen = createImageGen();
631
+
632
+ const url = await imageGen.generate(prompt, { width: 1024, height: 1024 });
603
633
  ```
604
634
 
605
635
  | Provider | `provider` value |
@@ -609,13 +639,6 @@ const url = await ctx.imageGen.generate(prompt, { width: 1024, height: 1024 });
609
639
  | Google (Imagen 3) | `'google'` |
610
640
  | Wavespeed | `'wavespeed'` |
611
641
 
612
- **Standalone client:**
613
-
614
- ```typescript
615
- import { createImageGenClient } from 'ugly-app';
616
- const imageGen = createImageGenClient();
617
- ```
618
-
619
642
  ### Embeddings
620
643
 
621
644
  ```typescript
@@ -652,9 +675,9 @@ The client can call AI through the server proxy without managing tokens directly
652
675
  ```typescript
653
676
  import { callTextGen, callJsonGen, callImageGen } from 'ugly-app/client';
654
677
 
655
- const text = await callTextGen(messages, options);
656
- const json = await callJsonGen(schema, messages);
657
- const image = await callImageGen(prompt, options);
678
+ const text = await callTextGen(input);
679
+ const json = await callJsonGen(input);
680
+ const image = await callImageGen(input);
658
681
  ```
659
682
 
660
683
  These call `POST /ai/request` (same-origin, avoids CORS). The server verifies the user JWT and forwards to `https://ugly.bot` using the `UGLY_BOT_TOKEN` env var.
@@ -765,11 +788,18 @@ Server-side, `getFeedbackHandlers(maintainBotUserId)` provides the RPC handlers
765
788
 
766
789
  ### Rate limiting
767
790
 
791
+ Rate limiting is configured per-endpoint in the request definition:
792
+
768
793
  ```typescript
769
- // Inside a handler — always call before expensive operations
770
- await ctx.rateLimit.check();
794
+ submitFeedback: authReq({
795
+ input: z.object({ ... }),
796
+ output: z.object({ ... }),
797
+ rateLimit: { max: 20, window: 60 }, // 20 requests per 60 seconds
798
+ })
771
799
  ```
772
800
 
801
+ The framework enforces rate limits automatically before calling the handler.
802
+
773
803
  ---
774
804
 
775
805
  ## Built-in endpoints
@@ -781,8 +811,10 @@ await ctx.rateLimit.check();
781
811
  | `POST /auth/logout` | Clear the auth cookie |
782
812
  | `GET /auth/token` | Refresh and return the current token |
783
813
  | `GET /auth/url` | Get the OAuth popup URL |
814
+ | `POST /api/:name` | RPC endpoint — dispatches any registered request handler |
784
815
  | `POST /ai/request` | AI proxy — forwards to ugly.bot (requires auth) |
785
816
  | `POST /api/client-error` | Client-side error capture |
817
+ | `POST /logs/client` | Client-side log ingestion |
786
818
  | `GET /my_feedback` | User feedback history (markdown, requires auth) |
787
819
 
788
820
  ---
@@ -831,7 +863,7 @@ Run with `npm run db:migrate`. Use `npm run db:migrate -- --status` to preview p
831
863
  | Variable | Description |
832
864
  |----------|-------------|
833
865
  | `JWT_SECRET` | **Required** — signs auth tokens |
834
- | `JWT_EXPIRY_SECONDS` | Token lifetime (optional) |
866
+ | `JWT_EXPIRY_SECONDS` | Token lifetime (optional, default: 2592000 = 30 days) |
835
867
  | `MONGODB_URI` | MongoDB connection string |
836
868
  | `PORT` | Server port (default: 3000) |
837
869
  | `NODE_ENV` | `development` or `production` |
@@ -1 +1 @@
1
- {"version":3,"file":"initDb.d.ts","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"AAgCA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAiG/C"}
1
+ {"version":3,"file":"initDb.d.ts","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"AAuCA,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA6H/C"}
@@ -16,7 +16,14 @@ async function loadDbIndexes() {
16
16
  // Built-in indexes always applied
17
17
  const BUILTIN_INDEXES = {
18
18
  user: { indexes: [{ fields: { email: 1 }, unique: true }] },
19
- errorLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
19
+ errorLog: {
20
+ timeseries: {
21
+ timeField: 'created',
22
+ metaField: 'meta',
23
+ granularity: 'seconds',
24
+ expireAfterSeconds: 7 * 24 * 60 * 60, // 7 days
25
+ },
26
+ },
20
27
  consoleLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
21
28
  perfLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
22
29
  feedbackLog: { indexes: [{ fields: { created: 1 }, ttl: 7 * 86400 }] },
@@ -38,6 +45,31 @@ export async function runInitDb() {
38
45
  }
39
46
  for (const [collection, config] of Object.entries(allIndexes)) {
40
47
  const col = db.collection(collection);
48
+ if (config.timeseries) {
49
+ try {
50
+ await db.createCollection(collection, {
51
+ timeseries: {
52
+ timeField: config.timeseries.timeField,
53
+ ...(config.timeseries.metaField
54
+ ? { metaField: config.timeseries.metaField }
55
+ : {}),
56
+ ...(config.timeseries.granularity
57
+ ? { granularity: config.timeseries.granularity }
58
+ : {}),
59
+ },
60
+ ...(config.timeseries.expireAfterSeconds !== undefined
61
+ ? { expireAfterSeconds: config.timeseries.expireAfterSeconds }
62
+ : {}),
63
+ });
64
+ console.log(`[init-db] Time-series collection created: ${collection}`);
65
+ }
66
+ catch (e) {
67
+ const err = e;
68
+ if (err.code !== 48)
69
+ throw e; // 48 = NamespaceExists (already exists)
70
+ console.log(`[init-db] Time-series collection already exists: ${collection}`);
71
+ }
72
+ }
41
73
  for (const idx of config.indexes ?? []) {
42
74
  const opts = {};
43
75
  if (idx.unique)
@@ -1 +1 @@
1
- {"version":3,"file":"initDb.js","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"initDb.js","sourceRoot":"","sources":["../../src/cli/initDb.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AAyFA,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DxE"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"AA6GA,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4DxE"}
@@ -44,7 +44,9 @@ function findCodeCli() {
44
44
  execSync('code --version', { stdio: 'ignore' });
45
45
  return 'code';
46
46
  }
47
- catch { /* not in PATH */ }
47
+ catch {
48
+ /* not in PATH */
49
+ }
48
50
  const candidates = process.platform === 'win32'
49
51
  ? [
50
52
  path.join(process.env['LOCALAPPDATA'] ?? '', 'Programs\\Microsoft VS Code\\bin\\code.cmd'),
@@ -74,7 +76,9 @@ async function installVsixExtension() {
74
76
  throw new Error(`HTTP ${res.status}`);
75
77
  const buf = await res.arrayBuffer();
76
78
  await fs.writeFile(vsixPath, Buffer.from(buf));
77
- execSync(`${codeCli} --install-extension "${vsixPath}"`, { stdio: 'inherit' });
79
+ execSync(`${codeCli} --install-extension "${vsixPath}"`, {
80
+ stdio: 'inherit',
81
+ });
78
82
  console.log('[ugly-app] VSCode extension installed.');
79
83
  }
80
84
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/cli/scaffold.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"uglyBotLogin.d.ts","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CA0EtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAKtB"}
1
+ {"version":3,"file":"uglyBotLogin.d.ts","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;AAE1B;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CA0EtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,SAAqB,GAC7B,OAAO,CAAC,WAAW,CAAC,CAMtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"uglyBotLogin.js","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uglyBotLogin.js","sourceRoot":"","sources":["../../src/cli/uglyBotLogin.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/cli/upgrade.ts"],"names":[],"mappings":"AA4BA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgIhD"}
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/cli/upgrade.ts"],"names":[],"mappings":"AA4BA,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAqIhD"}