ugly-app 0.1.987 → 0.1.989

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 (49) hide show
  1. package/README.md +118 -109
  2. package/dist/cli/probeAuth.d.ts +13 -0
  3. package/dist/cli/probeAuth.d.ts.map +1 -1
  4. package/dist/cli/probeAuth.js +49 -0
  5. package/dist/cli/probeAuth.js.map +1 -1
  6. package/dist/cli/version.d.ts +1 -1
  7. package/dist/cli/version.js +1 -1
  8. package/dist/markdown/client/MarkdownEditor.d.ts +6 -0
  9. package/dist/markdown/client/MarkdownEditor.d.ts.map +1 -1
  10. package/dist/markdown/client/MarkdownEditor.js.map +1 -1
  11. package/dist/markdown/client/MarkdownEditorInternal.d.ts.map +1 -1
  12. package/dist/markdown/client/MarkdownEditorInternal.js +2 -2
  13. package/dist/markdown/client/MarkdownEditorInternal.js.map +1 -1
  14. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.d.ts +7 -1
  15. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.d.ts.map +1 -1
  16. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.js +24 -2
  17. package/dist/markdown/client/ProseMirrorEditor/EditorContextMenu.js.map +1 -1
  18. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.d.ts +8 -1
  19. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.d.ts.map +1 -1
  20. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.js +19 -2
  21. package/dist/markdown/client/ProseMirrorEditor/FloatingToolbar.js.map +1 -1
  22. package/dist/markdown/client/SelectionActionBar.d.ts +23 -0
  23. package/dist/markdown/client/SelectionActionBar.d.ts.map +1 -0
  24. package/dist/markdown/client/SelectionActionBar.js +153 -0
  25. package/dist/markdown/client/SelectionActionBar.js.map +1 -0
  26. package/dist/markdown/client/index.d.ts +4 -0
  27. package/dist/markdown/client/index.d.ts.map +1 -1
  28. package/dist/markdown/client/index.js +2 -0
  29. package/dist/markdown/client/index.js.map +1 -1
  30. package/dist/markdown/client/markdownComponents.d.ts +4 -1
  31. package/dist/markdown/client/markdownComponents.d.ts.map +1 -1
  32. package/dist/markdown/client/markdownComponents.js +2 -2
  33. package/dist/markdown/client/markdownComponents.js.map +1 -1
  34. package/dist/markdown/shared/SelectionAction.d.ts +48 -0
  35. package/dist/markdown/shared/SelectionAction.d.ts.map +1 -0
  36. package/dist/markdown/shared/SelectionAction.js +36 -0
  37. package/dist/markdown/shared/SelectionAction.js.map +1 -0
  38. package/package.json +1 -1
  39. package/src/cli/probeAuth.ts +51 -0
  40. package/src/cli/version.ts +1 -1
  41. package/src/markdown/client/MarkdownEditor.tsx +6 -0
  42. package/src/markdown/client/MarkdownEditorInternal.tsx +2 -0
  43. package/src/markdown/client/ProseMirrorEditor/EditorContextMenu.tsx +55 -0
  44. package/src/markdown/client/ProseMirrorEditor/FloatingToolbar.tsx +51 -0
  45. package/src/markdown/client/SelectionActionBar.tsx +223 -0
  46. package/src/markdown/client/index.ts +10 -0
  47. package/src/markdown/client/markdownComponents.tsx +12 -5
  48. package/src/markdown/shared/SelectionAction.ts +62 -0
  49. package/templates/.claude/skills/create-test-users/SKILL.md +58 -23
package/README.md CHANGED
@@ -1,15 +1,14 @@
1
1
  # ugly-app
2
2
 
3
- A full-stack TypeScript framework for shipping production web apps. Scaffold
4
- with `npx ugly-app init my-app` and you get an opinionated Node + React +
5
- Postgres stack with type-safe RPC over WebSocket and HTTP, real-time doc
6
- subscriptions, built-in auth, AI generation, storage, workers, cron, and a CLI
7
- for every workflow.
3
+ A full-stack TypeScript framework for shipping production web apps: Node +
4
+ React + Postgres, type-safe RPC over WebSocket and HTTP, real-time doc
5
+ subscriptions, built-in auth, AI generation, storage, cron / workers, and a
6
+ CLI for every workflow.
8
7
 
9
- ugly-app is designed to run against [ugly.bot](https://ugly.bot), which
10
- provides auth, infra (Postgres, Qdrant, NATS, S3-compatible object storage),
11
- AI provider keys, push, email, and deployment. Your app talks to all of it
12
- through the project's dev tunnel and its `UGLY_BOT_TOKEN`.
8
+ ugly-app runs against [ugly.bot](https://ugly.bot), which provides auth,
9
+ infra (Postgres, Qdrant, NATS, S3-compatible object storage), AI provider
10
+ keys, email, push, and deployment. Your app talks to all of it through the
11
+ project's dev tunnel and its `UGLY_BOT_TOKEN`.
13
12
 
14
13
  ```bash
15
14
  npx ugly-app init my-app
@@ -21,8 +20,8 @@ npm run dev
21
20
 
22
21
  | Import path | Contents |
23
22
  |-------------|----------|
24
- | `ugly-app` (a.k.a. `ugly-app/server`) | Server: `createApp`, `TypedDB`, auth, AI clients, storage, NATS, workers. |
25
- | `ugly-app/shared` | Cross-tier: `defineRequests`, `defineCollections`, `definePage`, `defineWorkers`, Zod, experiments. |
23
+ | `ugly-app` (a.k.a. `ugly-app/server`) | Server: `createApp`, `TypedDB`, auth, AI clients, storage, NATS. |
24
+ | `ugly-app/shared` | Cross-tier: `defineRequests`, `defineCollections`, `definePage`, `defineWorkers`, Zod, experiments, model catalogs. |
26
25
  | `ugly-app/client` | React: `bootstrapApp`, `createRouter`, `lazyPage` / `lazyPageLoader`, `AppProvider` / `useApp`, `SimpleScrollView`, animations, audio, AI helpers. |
27
26
  | `ugly-app/server/adapter/workers` | Cloudflare Workers entry (Hono router + Durable Objects + Neon HTTP driver + R2). |
28
27
  | `ugly-app/server/ssr` | SSR renderer used by the Workers adapter. |
@@ -35,7 +34,7 @@ Additional per-feature bundles: `conversation`, `character`, `collab`,
35
34
 
36
35
  ---
37
36
 
38
- ## Server — `createApp()`
37
+ ## 1. Server — `createApp()`
39
38
 
40
39
  `createApp` is the single server entry. It owns Express, the WebSocket
41
40
  server, the typed DB, and the RPC dispatcher.
@@ -108,7 +107,7 @@ for in-process invocation of any registered handler.
108
107
 
109
108
  | Member | Description |
110
109
  |--------|-------------|
111
- | `start(port?)` | Start the server (templates use 4321). |
110
+ | `start(port?)` | Start the server. Framework default is `3000`; templates pass `PORT` (default `4321`). |
112
111
  | `db` | `TypedDB<Map>` — map inferred from your collections + framework built-ins. |
113
112
  | `httpServer` | The underlying Node `http.Server`. |
114
113
  | `wss` | The main `WebSocketServer` (path set via `setWsPath`, default `/rpc`). |
@@ -180,7 +179,6 @@ override the framework's defaults. Rate-limited handlers are marked below.
180
179
  | `shareLink` | Mint a `https://ugly.bot/l/<code>` short link with OG metadata. Rate-limited 60/60s. |
181
180
  | `feedbackReportCreateNoAuth` | Public, same-origin feedback endpoint used by browser telemetry. Rate-limited 10/60s. |
182
181
  | `feedbackReportResolve` | Mark an in-app feedback report resolved/declined. Admin-gated. |
183
- | `submitFeedbackBot` | Feedback path used by the bot-swarm test tooling. |
184
182
  | `errorLogCaptureNoAuth` | Public error-log capture. |
185
183
  | `perfSnapshotCaptureNoAuth` | Public perf snapshot capture. Rate-limited 60/60s. |
186
184
  | `adminGetPerfLogs` | Admin-only perf log query used by the CLI `perf:*` commands. |
@@ -192,98 +190,12 @@ Add per-endpoint rate limits on your own handlers with
192
190
 
193
191
  ---
194
192
 
195
- ## Shared API definitions
196
-
197
- `shared/` is consumed by both server and client. Keep all Zod schemas,
198
- types, collections, and route declarations here.
199
-
200
- ### Requests (`shared/api.ts`)
201
-
202
- ```ts
203
- import { authReq, defineRequests, req, z } from 'ugly-app/shared';
204
-
205
- export const requests = defineRequests({
206
- // Public — handler signature: (userId: string | null, input) => Promise<output>
207
- getPublicData: req({
208
- input: z.object({ id: z.string() }),
209
- output: z.object({ data: z.string() }),
210
- }),
211
-
212
- // Authenticated — 401 enforced automatically, userId guaranteed string
213
- getMe: authReq({
214
- input: z.object({}),
215
- output: z.object({ userId: z.string(), email: z.string().optional() }),
216
- }),
217
-
218
- // Per-endpoint rate limiting — enforced before the handler runs
219
- submitFeedback: authReq({
220
- input: z.object({ type: z.enum(['bug', 'design', 'feature']), message: z.string() }),
221
- output: z.object({ id: z.string() }),
222
- rateLimit: { max: 20, window: 60 },
223
- }),
224
- });
225
- ```
226
-
227
- Every request is reachable as **both** `socket.request(name, input)`
228
- (WebSocket) and `POST /api/:name { input }` (HTTP). `z` is re-exported from
229
- Zod for convenience.
230
-
231
- ### Collections (`shared/collections.ts`)
232
-
233
- ```ts
234
- import { defineCollections, InferDocType, neon } from 'ugly-app/shared';
235
- import { z } from 'zod';
236
-
237
- export const TodoSchema = z.object({
238
- userId: z.string(),
239
- text: z.string(),
240
- done: z.boolean(),
241
- });
242
- export type Todo = InferDocType<typeof TodoSchema>;
243
-
244
- export const collections = defineCollections({
245
- todo: {
246
- schema: TodoSchema,
247
- meta: {
248
- db: neon, // REQUIRED — `neon` (Postgres) or `d1` (SQLite / D1)
249
- cache: true, // or { ttlMs: 60_000 }
250
- trackable: true,
251
- public: false,
252
- cascadeFrom: null,
253
- },
254
- },
255
- });
256
- ```
257
-
258
- **`CollectionMeta`:**
259
- - `db` — **required.** `neon` (Postgres) or `d1` (Cloudflare D1 / SQLite). Both handles are exported from `ugly-app/shared`. Omitting it is a compile error and runtime throw.
260
- - `cache` — `true` / `false` / `{ ttlMs }`. When enabled, `getDoc` / `getByIds` read from an LRU cache; writes invalidate it.
261
- - `trackable` — enables real-time `trackDoc` / `trackDocs` via change-stream NATS notifications.
262
- - `public` — allow unauthenticated client reads.
263
- - `cascadeFrom` — parent collection: when the parent doc is deleted, docs in this collection are cascade-deleted.
264
- - `trackKeys?` — fields usable as NATS routing keys for scoped `trackDocs` subscriptions.
265
- - `getter?(ids)` — batch resolver for collections with no local table (e.g. `userPublic` resolves via ugly.bot).
266
- - `skipReadValidation?` — opt out of per-row zod validation on reads for very hot collections. Writes are always validated. Global kill-switch: `UGLY_DB_VALIDATE_READS=0`.
267
- - `search?: { fields, language? }` — full-text index over the named JSONB paths (Neon: Postgres FTS; D1: SQLite FTS5, ranked by bm25).
268
- - `vector?: { dimensions, metric?, filterable? }` — ANN index. Vector supplied out-of-band at write time (`setDoc(c, doc, { vec })`) — never stored in the doc JSON. Query with `getDocs(c, filter, { near })`.
269
-
270
- All documents extend `DBObject`: `{ _id, version, created, updated }`.
271
- Use `dbDefaults()` to stamp `version` / `created` / `updated` on inserts.
272
- **Always generate `_id` with `nanoid()`** — never `crypto.randomUUID()`,
273
- `Date.now()`, or `Math.random()` (see `CLAUDE.md`).
274
-
275
- After schema changes, run `npm run db:schema-gen` then `npm run db:migrate`.
276
- The app refuses to start when drift is detected (set `SCHEMA_CHECK_SKIP=true`
277
- only as a last resort).
278
-
279
- ---
280
-
281
- ## Routing
193
+ ## 2. Routing
282
194
 
283
195
  Route definitions live in `shared/pages.ts`; the client-side router is
284
196
  created by `createRouter({ pages, allPages?, ssrPages? })`.
285
197
 
286
- ### `definePage` / `definePages` (`shared/pages.ts`)
198
+ ### `definePage` / `definePages`
287
199
 
288
200
  ```ts
289
201
  import { definePage, definePages } from 'ugly-app/shared';
@@ -452,10 +364,10 @@ virtualized lists with scroll-position persistence, use the richer
452
364
 
453
365
  ---
454
366
 
455
- ## Client — `bootstrapApp()`
367
+ ## 3. Client — `bootstrapApp()` and `useApp()`
456
368
 
457
- The recommended entry point. Handles auth detection, socket creation,
458
- background account-sync with ugly.bot, and provider wiring.
369
+ The recommended client entry point. Handles auth detection, socket
370
+ creation, background account-sync with ugly.bot, and provider wiring.
459
371
 
460
372
  ```tsx
461
373
  // client/main.tsx
@@ -562,7 +474,7 @@ For pure HTTP (no WebSocket), use
562
474
 
563
475
  ---
564
476
 
565
- ## Auth
477
+ ## 4. Auth flow
566
478
 
567
479
  ugly-app uses HttpOnly cookies and server-side JWT injection — no
568
480
  `localStorage`, no client-side token handling.
@@ -631,12 +543,91 @@ configurator.setAuth({
631
543
 
632
544
  ---
633
545
 
634
- ## Database — `TypedDB`
546
+ ## 5. Database — `TypedDB`
635
547
 
636
548
  Access via `app.db`. All methods accept a `CollectionDef` (from
637
549
  `defineCollections()`) or, on the `raw*` / `getQuery*` variants, a plain
638
550
  collection name string.
639
551
 
552
+ ### Requests (`shared/api.ts`)
553
+
554
+ ```ts
555
+ import { authReq, defineRequests, req, z } from 'ugly-app/shared';
556
+
557
+ export const requests = defineRequests({
558
+ // Public — handler signature: (userId: string | null, input) => Promise<output>
559
+ getPublicData: req({
560
+ input: z.object({ id: z.string() }),
561
+ output: z.object({ data: z.string() }),
562
+ }),
563
+
564
+ // Authenticated — 401 enforced automatically, userId guaranteed string
565
+ getMe: authReq({
566
+ input: z.object({}),
567
+ output: z.object({ userId: z.string(), email: z.string().optional() }),
568
+ }),
569
+
570
+ // Per-endpoint rate limiting — enforced before the handler runs
571
+ submitFeedback: authReq({
572
+ input: z.object({ type: z.enum(['bug', 'design', 'feature']), message: z.string() }),
573
+ output: z.object({ id: z.string() }),
574
+ rateLimit: { max: 20, window: 60 },
575
+ }),
576
+ });
577
+ ```
578
+
579
+ Every request is reachable as **both** `socket.request(name, input)`
580
+ (WebSocket) and `POST /api/:name { input }` (HTTP). `z` is re-exported from
581
+ Zod for convenience.
582
+
583
+ ### Collections (`shared/collections.ts`)
584
+
585
+ ```ts
586
+ import { defineCollections, InferDocType, neon } from 'ugly-app/shared';
587
+ import { z } from 'zod';
588
+
589
+ export const TodoSchema = z.object({
590
+ userId: z.string(),
591
+ text: z.string(),
592
+ done: z.boolean(),
593
+ });
594
+ export type Todo = InferDocType<typeof TodoSchema>;
595
+
596
+ export const collections = defineCollections({
597
+ todo: {
598
+ schema: TodoSchema,
599
+ meta: {
600
+ db: neon, // REQUIRED — `neon` (Postgres) or `d1` (SQLite / D1)
601
+ cache: true, // or { ttlMs: 60_000 }
602
+ trackable: true,
603
+ public: false,
604
+ cascadeFrom: null,
605
+ },
606
+ },
607
+ });
608
+ ```
609
+
610
+ **`CollectionMeta`:**
611
+ - `db` — **required.** `neon` (Postgres) or `d1` (Cloudflare D1 / SQLite). Both handles are exported from `ugly-app/shared`. Omitting it is a compile error and runtime throw.
612
+ - `cache` — `true` / `false` / `{ ttlMs }`. When enabled, `getDoc` / `getByIds` read from an LRU cache; writes invalidate it.
613
+ - `trackable` — enables real-time `trackDoc` / `trackDocs` via change-stream NATS notifications.
614
+ - `public` — allow unauthenticated client reads.
615
+ - `cascadeFrom` — parent collection: when the parent doc is deleted, docs in this collection are cascade-deleted.
616
+ - `trackKeys?` — fields usable as NATS routing keys for scoped `trackDocs` subscriptions.
617
+ - `getter?(ids)` — batch resolver for collections with no local table (e.g. `userPublic` resolves via ugly.bot).
618
+ - `skipReadValidation?` — opt out of per-row zod validation on reads for very hot collections. Writes are always validated. Global kill-switch: `UGLY_DB_VALIDATE_READS=0`.
619
+ - `search?: { fields, language? }` — full-text index over the named JSONB paths (Neon: Postgres FTS; D1: SQLite FTS5, ranked by bm25).
620
+ - `vector?: { dimensions, metric?, filterable? }` — ANN index. Vector supplied out-of-band at write time (`setDoc(c, doc, { vec })`) — never stored in the doc JSON. Query with `getDocs(c, filter, { near })`.
621
+
622
+ All documents extend `DBObject`: `{ _id, version, created, updated }`.
623
+ Use `dbDefaults()` to stamp `version` / `created` / `updated` on inserts.
624
+ **Always generate `_id` with `nanoid()`** — never `crypto.randomUUID()`,
625
+ `Date.now()`, or `Math.random()` (see `CLAUDE.md`).
626
+
627
+ After schema changes, run `npm run db:schema-gen` then `npm run db:migrate`.
628
+ The app refuses to start when drift is detected (set `SCHEMA_CHECK_SKIP=true`
629
+ only as a last resort).
630
+
640
631
  ### Writing
641
632
 
642
633
  ```ts
@@ -745,7 +736,7 @@ Imports available from `ugly-app`:
745
736
 
746
737
  ---
747
738
 
748
- ## AI providers
739
+ ## 6. AI providers
749
740
 
750
741
  AI calls are proxied through ugly.bot — your app never holds a provider
751
742
  key. Pass `UGLY_BOT_TOKEN` in the environment and the framework handles
@@ -758,6 +749,7 @@ import { createTextGen } from 'ugly-app';
758
749
  const textGen = createTextGen(userId);
759
750
 
760
751
  const text = await textGen.generate(messages, { model: 'gemini_2_5_flash' });
752
+ const obj = await textGen.generateJson(mySchema, messages, { model: 'gemini_2_5_flash' });
761
753
  ```
762
754
 
763
755
  Or invoke the framework `textGen` request through the RPC pipeline — its
@@ -794,6 +786,7 @@ const url = await imageGen.generate('A red panda eating noodles', { model: 'flux
794
786
  import { createEmbeddingClient, cosineSimilarity } from 'ugly-app';
795
787
  const embeddings = createEmbeddingClient();
796
788
  const vector = await embeddings.embed('hello world');
789
+ const many = await embeddings.embedBatch(['a', 'b', 'c']);
797
790
  const sim = cosineSimilarity(vectorA, vectorB);
798
791
  ```
799
792
 
@@ -838,9 +831,25 @@ const { speak, stop: stopTTS } = useTTS(uglyBotSocket);
838
831
  `uglyBotSocket` is the `UglyBotSocket` on `useApp()`; it opens a direct
839
832
  WebSocket to the platform.
840
833
 
834
+ ### Sharing / share links
835
+
836
+ ```ts
837
+ import { shareLink } from 'ugly-app'; // server
838
+ const url = await shareLink({
839
+ target: `/article/${id}`, // app route or absolute URL
840
+ og: { title, description, image }, // OG card metadata
841
+ requireAuth: false, // true → logged-out web users hit login
842
+ }); // → https://ugly.bot/l/<code>
843
+ ```
844
+
845
+ Minting is idempotent (deterministic code) and dedupes within a run.
846
+ Never hand-build outbound URLs (`${PUBLIC_URL}/article/${id}`) in emails,
847
+ push, or share flows — always go through `shareLink()`. See the "sharing
848
+ links" rule in `CLAUDE.md`.
849
+
841
850
  ---
842
851
 
843
- ## Storage
852
+ ## 7. Storage
844
853
 
845
854
  S3-compatible. Two logical buckets:
846
855
 
@@ -40,5 +40,18 @@ export interface ProbeAuthResult {
40
40
  * since some service tokens are intentionally non-expiring
41
41
  */
42
42
  export declare function inspectJwt(token: string): 'valid' | 'expired' | 'unknown';
43
+ /**
44
+ * The account a token acts as, read from its `sub` claim without verifying the
45
+ * signature (it's our own token — we only need to know whose it is).
46
+ *
47
+ * This is the check that would have caught the worst auth failure this tool has
48
+ * had: a project token minted while a FAKE login was in place carries a phantom
49
+ * subject (`e2e-auth-user`, `e2e-user`, …) that is not a ugly.bot account at
50
+ * all. The token verifies, `dev` works, tests appear to sign in — and then every
51
+ * billable call for that project 402s, or worse, test accounts get created
52
+ * pointing at an account that cannot pay. Nothing in the failure names the
53
+ * token, so it has cost hours more than once.
54
+ */
55
+ export declare function jwtSubject(token: string): string | null;
43
56
  export declare function probeAuth(input: ProbeAuthInput): ProbeAuthResult;
44
57
  //# sourceMappingURL=probeAuth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"probeAuth.d.ts","sourceRoot":"","sources":["../../src/cli/probeAuth.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAyBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAazE;AAyCD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAqLhE"}
1
+ {"version":3,"file":"probeAuth.d.ts","sourceRoot":"","sources":["../../src/cli/probeAuth.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,uEAAuE;IACvE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,yCAAyC;IACzC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;;;OAMG;IACH,UAAU,EAAE,OAAO,CAAC;IACpB,mDAAmD;IACnD,kBAAkB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAyBD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAazE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWvD;AAyCD,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CA+MhE"}
@@ -57,6 +57,30 @@ export function inspectJwt(token) {
57
57
  return 'unknown';
58
58
  }
59
59
  }
60
+ /**
61
+ * The account a token acts as, read from its `sub` claim without verifying the
62
+ * signature (it's our own token — we only need to know whose it is).
63
+ *
64
+ * This is the check that would have caught the worst auth failure this tool has
65
+ * had: a project token minted while a FAKE login was in place carries a phantom
66
+ * subject (`e2e-auth-user`, `e2e-user`, …) that is not a ugly.bot account at
67
+ * all. The token verifies, `dev` works, tests appear to sign in — and then every
68
+ * billable call for that project 402s, or worse, test accounts get created
69
+ * pointing at an account that cannot pay. Nothing in the failure names the
70
+ * token, so it has cost hours more than once.
71
+ */
72
+ export function jwtSubject(token) {
73
+ const parts = token.split('.');
74
+ if (parts.length !== 3)
75
+ return null;
76
+ try {
77
+ const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
78
+ return typeof payload.sub === 'string' && payload.sub ? payload.sub : null;
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ }
60
84
  function readGlobalAuth(homeDir) {
61
85
  const file = path.join(homeDir, '.ugly-bot', 'auth.json');
62
86
  const { data, malformed } = readJson(file);
@@ -219,6 +243,31 @@ export function probeAuth(input) {
219
243
  });
220
244
  }
221
245
  }
246
+ // 2b. Does each project token actually act as YOU?
247
+ //
248
+ // A project token whose `sub` isn't your account is not a smaller problem
249
+ // than a missing one — it is a token that works everywhere except where it
250
+ // matters. `auth:create-bot` bills test accounts to that subject, so a
251
+ // phantom one produces exactly the symptom that started all this: accounts
252
+ // that look fine and can't spend.
253
+ if (projectId && globalAuth) {
254
+ for (const [label, token, file] of [
255
+ ['auth (cloud)', cloudToken, `${projectId}.json`],
256
+ ['auth (local)', localToken, `${projectId}.local.json`],
257
+ ]) {
258
+ if (!token)
259
+ continue;
260
+ const sub = jwtSubject(token);
261
+ if (!sub || sub === globalAuth.userId)
262
+ continue;
263
+ lines.push({
264
+ status: 'error',
265
+ label,
266
+ detail: `token acts as "${sub}", not you (${globalAuth.userId}) — test accounts made with it bill an account you don't own`,
267
+ });
268
+ nextSteps.push(`Delete ~/.ugly-bot/${file} and re-run \`npx ugly-app dev\` (or \`login\`) to re-mint it as ${globalAuth.userId}`);
269
+ }
270
+ }
222
271
  // 3. Agent-ready summary.
223
272
  // For headless tooling, the global user token is what unblocks
224
273
  // everything: project tokens are derived. If we're in local mode we
@@ -1 +1 @@
1
- {"version":3,"file":"probeAuth.js","sourceRoot":"","sources":["../../src/cli/probeAuth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"probeAuth.js","sourceRoot":"","sources":["../../src/cli/probeAuth.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.987";
1
+ export declare const CLI_VERSION = "0.1.989";
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.987";
2
+ export const CLI_VERSION = "0.1.989";
3
3
  //# sourceMappingURL=version.js.map
@@ -4,6 +4,7 @@ import type { EditorMode } from './EditorModeToggle.js';
4
4
  import type { HeadingLabels } from './ProseMirrorEditor/commands.js';
5
5
  import type { HighlightActions } from './ProseMirrorEditor/FloatingToolbar.js';
6
6
  import type { SpecialMentionItem } from './ProseMirrorEditor/plugins/mentionPlugin.js';
7
+ import type { SelectionAction } from '../shared/SelectionAction.js';
7
8
  export declare function MarkdownEditor(props: MarkdownEditorProps): import("react").JSX.Element;
8
9
  export interface MarkdownEditorFunctions {
9
10
  focus: (selectStart: boolean) => void;
@@ -156,5 +157,10 @@ export interface MarkdownEditorProps {
156
157
  * `{ 1: 'Title', 2: 'Chapter', 3: 'Section' }`. Levels left unmapped keep the
157
158
  * generic `Heading N`. Purely cosmetic: the underlying markdown is unchanged. */
158
159
  headingLabels?: HeadingLabels;
160
+ /** App-defined verbs for the selected text — e.g. Translate / Listen / Copy.
161
+ * They appear in the bubble toolbar AND the right-click menu, so an app
162
+ * declares each action once. The same array drives `SelectionActionBar` in
163
+ * read-only surfaces, giving one set of verbs across read and write. */
164
+ selectionActions?: readonly SelectionAction[];
159
165
  }
160
166
  //# sourceMappingURL=MarkdownEditor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.d.ts","sourceRoot":"","sources":["../../../src/markdown/client/MarkdownEditor.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MarkdownEditor.d.ts","sourceRoot":"","sources":["../../../src/markdown/client/MarkdownEditor.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../src/markdown/client/MarkdownEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAgB,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAOrD,MAAM,sBAAsB,GAAG,IAAI,CACjC,GAAG,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAC5C,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,OAAO,CACL,KAAC,QAAQ,IAAC,QAAQ,EAAE,eAAO,YACzB,KAAC,sBAAsB,OAAK,KAAK,GAAI,GAC5B,CACZ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"MarkdownEditor.js","sourceRoot":"","sources":["../../../src/markdown/client/MarkdownEditor.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAgB,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAQrD,MAAM,sBAAsB,GAAG,IAAI,CACjC,GAAG,EAAE,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAC5C,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,KAA0B;IACvD,OAAO,CACL,KAAC,QAAQ,IAAC,QAAQ,EAAE,eAAO,YACzB,KAAC,sBAAsB,OAAK,KAAK,GAAI,GAC5B,CACZ,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownEditorInternal.d.ts","sourceRoot":"","sources":["../../../src/markdown/client/MarkdownEditorInternal.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,qBAAqB,CAAC;AAyC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AA4C1D,OAAO,wCAAwC,CAAC;AAEhD,OAAO,0BAA0B,CAAC;AAoPlC;;GAEG;AACH,iBAAwB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,+BA6rCxE;kBA7rCuB,sBAAsB;;;eAAtB,sBAAsB"}
1
+ {"version":3,"file":"MarkdownEditorInternal.d.ts","sourceRoot":"","sources":["../../../src/markdown/client/MarkdownEditorInternal.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,qBAAqB,CAAC;AAyC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AA4C1D,OAAO,wCAAwC,CAAC;AAEhD,OAAO,0BAA0B,CAAC;AAoPlC;;GAEG;AACH,iBAAwB,sBAAsB,CAAC,KAAK,EAAE,mBAAmB,+BA+rCxE;kBA/rCuB,sBAAsB;;;eAAtB,sBAAsB"}
@@ -1149,9 +1149,9 @@ export default function MarkdownEditorInternal(props) {
1149
1149
  return (_jsxs("div", { ref: containerRef, style: {
1150
1150
  minHeight: 14,
1151
1151
  ...(props.fillHeight ? { height: '100%' } : {}),
1152
- }, children: [props.showToolbar && contextMenuPos == null && (_jsx(FloatingToolbar, { view: viewRef.current, editorState: editorState, disabled: props.disabled, limited: props.limitedToolbar, onLinkClick: undefined, highlightActions: props.highlightActions, onAnnotate: props.onAnnotate ? handleAnnotate : undefined, headingLabels: props.headingLabels })), props.showToolbar && (_jsx(SlashCommandMenu, { view: viewRef.current, editorState: editorState, onImageClick: props.onShowImagePicker ? handleImageClick : undefined, onAIAction: props.onAIAction ? handleAIAction : undefined, headingLabels: props.headingLabels })), _jsx(TableToolbar, { view: viewRef.current, editorState: editorState, disabled: props.disabled }), _jsx(EditorContextMenu, { view: viewRef.current, position: contextMenuPos, onClose: () => {
1152
+ }, children: [props.showToolbar && contextMenuPos == null && (_jsx(FloatingToolbar, { view: viewRef.current, editorState: editorState, disabled: props.disabled, limited: props.limitedToolbar, onLinkClick: undefined, highlightActions: props.highlightActions, onAnnotate: props.onAnnotate ? handleAnnotate : undefined, headingLabels: props.headingLabels, selectionActions: props.selectionActions })), props.showToolbar && (_jsx(SlashCommandMenu, { view: viewRef.current, editorState: editorState, onImageClick: props.onShowImagePicker ? handleImageClick : undefined, onAIAction: props.onAIAction ? handleAIAction : undefined, headingLabels: props.headingLabels })), _jsx(TableToolbar, { view: viewRef.current, editorState: editorState, disabled: props.disabled }), _jsx(EditorContextMenu, { view: viewRef.current, position: contextMenuPos, onClose: () => {
1153
1153
  setContextMenuPos(null);
1154
- }, onImageClick: props.onShowImagePicker ? handleImageClick : undefined, onLinkClick: undefined, onPlayFromHere: undefined, onAnnotate: props.onAnnotate ? handleAnnotate : undefined, highlightActions: props.highlightActions, headingLabels: props.headingLabels, onNewComment: isDefined(props.onCommentsChange)
1154
+ }, onImageClick: props.onShowImagePicker ? handleImageClick : undefined, onLinkClick: undefined, onPlayFromHere: undefined, onAnnotate: props.onAnnotate ? handleAnnotate : undefined, highlightActions: props.highlightActions, headingLabels: props.headingLabels, selectionActions: props.selectionActions, onNewComment: isDefined(props.onCommentsChange)
1155
1155
  ? (newId) => {
1156
1156
  const newComment = {
1157
1157
  id: newId,