ugly-app 0.1.374 → 0.1.376

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 (126) hide show
  1. package/AGENTS.md +161 -0
  2. package/coverage/client/AppProvider.tsx.html +1 -1
  3. package/coverage/client/FeedbackContext.ts.html +1 -1
  4. package/coverage/client/LoginPopup.tsx.html +1 -1
  5. package/coverage/client/Router.tsx.html +1 -1
  6. package/coverage/client/Screenshot.ts.html +1 -1
  7. package/coverage/client/StringsProvider.tsx.html +28 -28
  8. package/coverage/client/ViewFlipper.tsx.html +1 -1
  9. package/coverage/client/animation/Animated.tsx.html +1 -1
  10. package/coverage/client/animation/animatedValue.ts.html +1 -1
  11. package/coverage/client/animation/index.html +1 -1
  12. package/coverage/client/components/Button.tsx.html +1 -1
  13. package/coverage/client/components/FeedbackButton.tsx.html +1 -1
  14. package/coverage/client/components/Input.tsx.html +1 -1
  15. package/coverage/client/components/Modal.tsx.html +1 -1
  16. package/coverage/client/components/Text.tsx.html +1 -1
  17. package/coverage/client/components/Toast.tsx.html +1 -1
  18. package/coverage/client/components/index.html +1 -1
  19. package/coverage/client/components/zIndex.ts.html +1 -1
  20. package/coverage/client/createSocket.ts.html +34 -34
  21. package/coverage/client/index.html +1 -1
  22. package/coverage/clover.xml +83 -83
  23. package/coverage/collab/server/CollabServer.ts.html +1 -1
  24. package/coverage/collab/server/index.html +1 -1
  25. package/coverage/coverage-final.json +8 -8
  26. package/coverage/index.html +1 -1
  27. package/coverage/server/Cache.ts.html +1 -1
  28. package/coverage/server/DB.ts.html +1 -1
  29. package/coverage/server/DataProxyClient.ts.html +3 -3
  30. package/coverage/server/Email.ts.html +1 -1
  31. package/coverage/server/EmailTemplate.ts.html +1 -1
  32. package/coverage/server/EventLogAdmin.ts.html +1 -1
  33. package/coverage/server/NatsProxyClient.ts.html +1 -1
  34. package/coverage/server/PushNotification.ts.html +1 -1
  35. package/coverage/server/RateLimit.ts.html +1 -1
  36. package/coverage/server/Router.ts.html +4 -4
  37. package/coverage/server/SchemaCheck.ts.html +1 -1
  38. package/coverage/server/Socket.ts.html +1 -1
  39. package/coverage/server/Strings.ts.html +1 -1
  40. package/coverage/server/ai/ImageGenClient.ts.html +1 -1
  41. package/coverage/server/ai/ProviderBalance.ts.html +1 -1
  42. package/coverage/server/ai/TextGenClient.ts.html +1 -1
  43. package/coverage/server/ai/WebSearchClient.ts.html +1 -1
  44. package/coverage/server/ai/index.html +1 -1
  45. package/coverage/server/ai/index.ts.html +1 -1
  46. package/coverage/server/ai/providers/UglyBotImageGenProvider.ts.html +1 -1
  47. package/coverage/server/ai/providers/UglyBotTextGenProvider.ts.html +1 -1
  48. package/coverage/server/ai/providers/UglyBotWebSearchProvider.ts.html +1 -1
  49. package/coverage/server/ai/providers/index.html +1 -1
  50. package/coverage/server/ai/types.ts.html +1 -1
  51. package/coverage/server/billing/BillingGateway.ts.html +1 -1
  52. package/coverage/server/billing/BillingLedger.ts.html +1 -1
  53. package/coverage/server/billing/CreditStore.ts.html +1 -1
  54. package/coverage/server/billing/LimitEnforcer.ts.html +1 -1
  55. package/coverage/server/billing/UserLimitCache.ts.html +1 -1
  56. package/coverage/server/billing/index.html +1 -1
  57. package/coverage/server/billing/types.ts.html +1 -1
  58. package/coverage/server/embeddings/EmbeddingClient.ts.html +1 -1
  59. package/coverage/server/embeddings/index.html +1 -1
  60. package/coverage/server/embeddings/providers/OpenAI.ts.html +1 -1
  61. package/coverage/server/embeddings/providers/index.html +1 -1
  62. package/coverage/server/embeddings/registry.ts.html +1 -1
  63. package/coverage/server/index.html +1 -1
  64. package/coverage/server/uglyBotProxy.ts.html +1 -1
  65. package/coverage/shared/AiProxy.ts.html +1 -1
  66. package/coverage/shared/Api.ts.html +2 -2
  67. package/coverage/shared/Audio.ts.html +1 -1
  68. package/coverage/shared/DB.ts.html +1 -1
  69. package/coverage/shared/Errors.ts.html +1 -1
  70. package/coverage/shared/Experiment.ts.html +1 -1
  71. package/coverage/shared/FrameworkMessages.ts.html +1 -1
  72. package/coverage/shared/FrameworkRequests.ts.html +13 -28
  73. package/coverage/shared/ImageGen.ts.html +1 -1
  74. package/coverage/shared/Router.ts.html +1 -1
  75. package/coverage/shared/SchemaDiff.ts.html +1 -1
  76. package/coverage/shared/SchemaSerializer.ts.html +1 -1
  77. package/coverage/shared/Strings.ts.html +1 -1
  78. package/coverage/shared/TextGen.ts.html +1 -1
  79. package/coverage/shared/UglyBotMessages.ts.html +1 -1
  80. package/coverage/shared/Voice.ts.html +1 -1
  81. package/coverage/shared/index.html +1 -1
  82. package/coverage/shared/index.ts.html +1 -1
  83. package/coverage/shared/lang/builtin_en.ts.html +1 -1
  84. package/coverage/shared/lang/index.html +1 -1
  85. package/coverage/shared/uglyBotUrl.ts.html +1 -1
  86. package/coverage/three/server/VideoEncoder.ts.html +4 -4
  87. package/coverage/three/server/index.html +1 -1
  88. package/coverage/three/shared/CameraController.ts.html +13 -13
  89. package/coverage/three/shared/PostProcessing.ts.html +1 -1
  90. package/coverage/three/shared/index.html +1 -1
  91. package/coverage/webrtc/server/VideoRoomServer.ts.html +1 -1
  92. package/coverage/webrtc/server/index.html +1 -1
  93. package/coverage/worker/TaskHost.ts.html +1 -1
  94. package/coverage/worker/index.html +1 -1
  95. package/dist/cli/doctor.d.ts +12 -0
  96. package/dist/cli/doctor.d.ts.map +1 -0
  97. package/dist/cli/doctor.js +255 -0
  98. package/dist/cli/doctor.js.map +1 -0
  99. package/dist/cli/index.js +13 -0
  100. package/dist/cli/index.js.map +1 -1
  101. package/dist/cli/version.d.ts +1 -1
  102. package/dist/cli/version.js +1 -1
  103. package/dist/server/bootstrap.d.ts +34 -0
  104. package/dist/server/bootstrap.d.ts.map +1 -0
  105. package/dist/server/bootstrap.js +52 -0
  106. package/dist/server/bootstrap.js.map +1 -0
  107. package/dist/server/index.d.ts +1 -0
  108. package/dist/server/index.d.ts.map +1 -1
  109. package/dist/server/index.js +1 -0
  110. package/dist/server/index.js.map +1 -1
  111. package/dist/shared/AiProxy.d.ts.map +1 -1
  112. package/dist/shared/AiProxy.js +6 -0
  113. package/dist/shared/AiProxy.js.map +1 -1
  114. package/dist/shared/TextGen.d.ts +44 -4
  115. package/dist/shared/TextGen.d.ts.map +1 -1
  116. package/dist/shared/TextGen.js +247 -4
  117. package/dist/shared/TextGen.js.map +1 -1
  118. package/package.json +1 -1
  119. package/src/cli/doctor.ts +269 -0
  120. package/src/cli/index.ts +13 -0
  121. package/src/cli/version.ts +1 -1
  122. package/src/server/bootstrap.ts +56 -0
  123. package/src/server/index.ts +1 -0
  124. package/src/shared/AiProxy.ts +7 -0
  125. package/src/shared/TextGen.ts +302 -4
  126. package/templates/AGENTS.md +10 -0
package/AGENTS.md ADDED
@@ -0,0 +1,161 @@
1
+ # ugly-app — agent-facing guide
2
+
3
+ You are working inside an **ugly-app child app** (or the ugly-app framework itself). This file is the framework's own agent-facing documentation. Read it BEFORE grepping `node_modules/ugly-app/**` or guessing at config — the answers below are authoritative and a lot shorter than the source.
4
+
5
+ If you are looking at this file inside `node_modules/ugly-app/`, you are in a child app. If you are looking at it at the top of the `ugly-app/` repo, you are editing the framework itself — most of this file still applies.
6
+
7
+ ## Architecture in one paragraph
8
+
9
+ Child apps are Node.js/React projects that depend on the published `ugly-app` package. Runtime infrastructure (PostgreSQL, NATS, object storage, vector search) is **not** provided by a local `docker-compose.yml` in the child app — it is provisioned by ugly.bot and reached over a WebSocket called the **DataProxy**. The `ugly-app` CLI, the server runtime, and your seed scripts all talk to DataProxy instead of connecting to Postgres directly. A child app has no `docker-compose.yml`, no `.env` file, and no local Postgres.
10
+
11
+ ## Config model (NOT `.env`)
12
+
13
+ ugly-app child apps **do not use `.env` files**. Stop looking for one — it will not be there and adding one will not help.
14
+
15
+ Instead, two things hold configuration:
16
+
17
+ 1. **`.uglyapp`** — a JSON file at the child app's root, written by `ugly-app configure`. Contains:
18
+ - `projectId` — stable identifier used as the DB/NATS/storage prefix
19
+ - `localPort` — Vite dev server port
20
+ - `uglyBotToken` / `localToken` — project tokens (can be migrated to the auth store below)
21
+ 2. **Auth store** — project and user tokens at `~/.ugly-bot/auth.json` (cloud) and `~/.ugly-bot/local.json` (local ugly.bot). Managed by `ugly-app login`.
22
+
23
+ At runtime, `ensureInfra()` (from `src/cli/ensureInfra.ts`) reads both, opens a tunnel to ugly.bot, receives a short-lived DataProxy token, and sets `process.env.DATA_PROXY_URL` + `process.env.DATA_PROXY_TOKEN` for the current process only. The tokens are NOT written to a dotenv file.
24
+
25
+ ## First-run checklist
26
+
27
+ ```bash
28
+ npx ugly-app configure # writes .uglyapp with a fresh projectId + port
29
+ npx ugly-app login # authenticates against ugly.bot, mints a project token
30
+ npx ugly-app db:migrate # applies pending migrations via DataProxy
31
+ npx ugly-app dev # starts Vite + server + tsc + eslint
32
+ ```
33
+
34
+ If `db:migrate` reports `[DataProxy] Not connected`, you skipped `configure` or `login` — run them. Do not try to start a local Postgres; there isn't one.
35
+
36
+ ## Diagnose first, act second: `ugly-app doctor`
37
+
38
+ Run `npx ugly-app doctor` at the start of any task that touches infra, migrations, or data. It prints a single report covering:
39
+
40
+ - `.uglyapp` presence + parsed contents
41
+ - Whether an auth token is present for cloud / local
42
+ - DataProxy connection status + resolved URL
43
+ - Pending vs. applied migrations
44
+ - Obvious fixes ("run `ugly-app configure`", "run `ugly-app login`", etc.)
45
+
46
+ Reading `doctor`'s output first is almost always faster than guessing what's wrong from a failing command.
47
+
48
+ ## CLI catalog
49
+
50
+ Every script in a child app's `package.json` that looks like `"ugly-app <cmd>"` is implemented in `src/cli/<cmd>.ts`. Cheat sheet:
51
+
52
+ | Command | Purpose |
53
+ |---|---|
54
+ | `init [name]` | Scaffold a new child app from `templates/` |
55
+ | `configure` | Write a fresh `.uglyapp` (projectId, port) |
56
+ | `login` | Authenticate to ugly.bot, mint project tokens |
57
+ | `dev` | Start server, Vite, tsc, eslint concurrently |
58
+ | `build` | Production build (Vite + tsc) |
59
+ | `doctor` | Print current config + infra state (run this FIRST when stuck) |
60
+ | `db:migrate` | Apply pending migrations |
61
+ | `db:migrate --status` | Show applied vs pending without running |
62
+ | `db:schema-gen` | Generate migration from collection schema diff |
63
+ | `db:schema-status` | Show current schema drift |
64
+ | `publish:assets` | Push static assets to CDN |
65
+ | `purge:assets` | Remove old asset bundles |
66
+ | `error:dev` / `error:prod` | Query error logs from dev-tunnel / prod |
67
+ | `perf:dev` / `perf:prod` | Query perf logs |
68
+ | `feedback:dev` / `feedback:prod` | Query user feedback |
69
+ | `feedback:submit` / `feedback:resolve` | Manage feedback items |
70
+ | `dev-logs` | Tail local JSONL dev logs |
71
+ | `auth:create-account` | Create a user directly in the DB |
72
+ | `auth:create-bot` | Create a bot principal |
73
+ | `textGen <prompt>` | AI text generation via CLI |
74
+ | `imageGen <prompt>` | AI image generation via CLI |
75
+ | `url` | Print local dev URL from `.uglyapp` |
76
+ | `deploy` | Build + deploy to ugly.bot infra |
77
+ | `prod --buildId <id>` | Promote a build to production |
78
+ | `versions` / `versions:prune` | List / clean deployed versions |
79
+ | `domain <sub>` | Reserve a custom subdomain |
80
+ | `infra:destroy` | Tear down all project infrastructure |
81
+ | `cloud:cleanup` | Clean up cloud dev resources |
82
+ | `upgrade` | Upgrade framework config files |
83
+
84
+ ## Package entry points
85
+
86
+ Child apps import only via these paths — there is no deep-import contract beyond what's listed here:
87
+
88
+ - `ugly-app/server` — server-side primitives: `createApp`, `verifyToken`, `pgQuery`, `createTypedDB`, `textGen`, `imageGen`, `storage`, `initDataProxy`, `isDataProxyConnected`, `bootstrapInfra` (see below)
89
+ - `ugly-app/shared` — zod schemas, `req()`/`authReq()`, type helpers, `definePage`/`definePages`
90
+ - `ugly-app/client` — React components + hooks (`useRouter`, `TabContent`, `TabContentAllActive`, etc.)
91
+ - `ugly-app/playwright` — test helpers
92
+ - `ugly-app/markdown/*`, `ugly-app/collab/*`, `ugly-app/conversation/*` — optional subsystems
93
+ - `ugly-app/vite`, `ugly-app/eslint` — build config helpers
94
+
95
+ ## Writing data from a script
96
+
97
+ Seed scripts, one-off imports, and cron-ish batch jobs all need the same three lines of boilerplate:
98
+
99
+ ```typescript
100
+ import { bootstrapInfra, createTypedDB } from 'ugly-app/server';
101
+ import { collections } from '../shared/collections.js';
102
+
103
+ await bootstrapInfra(); // ensureInfra() + initDataProxy()
104
+ const db = createTypedDB(collections);
105
+ await db.file.insert({ ... });
106
+ ```
107
+
108
+ **`bootstrapInfra()` is the supported entry point.** It wraps `ensureInfra()` (which reads `.uglyapp`, handles login, requests a DataProxy token) and `initDataProxy()` (which opens the WebSocket). Your script can freely use `pgQuery`, `createTypedDB`, `storage`, etc. after it returns.
109
+
110
+ Legacy scripts that set `DATA_PROXY_URL` / `DATA_PROXY_TOKEN` by hand still work, but they're fragile — tokens rotate, and a human is not meant to copy them out of a tunnel. Use `bootstrapInfra()` in anything new.
111
+
112
+ ## Adding an endpoint
113
+
114
+ 1. Define in `shared/api.ts` with `req()` (public) or `authReq()` (authed) + Zod schemas.
115
+ 2. Add a handler to the `requests` object in `server/index.ts`, typed with `satisfies RequestHandlers<typeof requests>`.
116
+ 3. Import `db`, `storage`, `textGen(userId)`, `imageGen(userId)` from `'ugly-app/server'` directly.
117
+
118
+ Handler signatures:
119
+
120
+ ```typescript
121
+ // req() — public, userId may be null
122
+ getPublicData: async (userId: string | null, input) => { ... }
123
+
124
+ // authReq() — authed, userId always present
125
+ submitFeedback: async (userId: string, input) => { ... }
126
+ ```
127
+
128
+ Every endpoint is reachable via WebSocket (`socket.request(name, input)`) and HTTP (`POST /api/:name { input }`).
129
+
130
+ ## Adding or changing a collection
131
+
132
+ 1. Edit the Zod schema in `shared/collections.ts`.
133
+ 2. Run `npx ugly-app db:schema-gen` — generates a migration with `REPLACE_ME` placeholders where human judgment is required.
134
+ 3. Fix the `REPLACE_ME`s, then run `npx ugly-app db:migrate`.
135
+ 4. The app refuses to boot until pending migrations are applied — that's intentional.
136
+
137
+ Never edit collection schemas without regenerating the migration. The schema check at boot will immediately fail.
138
+
139
+ ## Common failure modes
140
+
141
+ | Symptom | Likely cause | Fix |
142
+ |---|---|---|
143
+ | `[DataProxy] Not connected` | no `.uglyapp`, no login, or DataProxy token expired | `ugly-app configure` then `ugly-app login`, then re-run |
144
+ | `docker compose ... no configuration file provided` | you are in a child app and tried to start infra locally | There is no local docker-compose. Run `ugly-app doctor` instead. |
145
+ | `command not found: ugly-app` | CLI not on PATH | use `npx ugly-app <cmd>` or add `./node_modules/.bin` to PATH |
146
+ | `Schema drift detected` on boot | collections changed without a migration | `ugly-app db:schema-gen`, fix REPLACE_MEs, `ugly-app db:migrate` |
147
+ | `db:migrate` exits on `_migrations` read error | DataProxy connected but the migrations table is gone | re-run; `ensureMigrationsTable()` is idempotent |
148
+
149
+ ## Critical rules
150
+
151
+ - **Never** add `.env` files to a child app — config goes through `.uglyapp` + the auth store.
152
+ - **Never** change a collection without `db:schema-gen` → fix REPLACE_MEs → `db:migrate`.
153
+ - **Never** use module-level Maps for per-user state — use NATS KV or DB (multi-server).
154
+ - **Always** call `bootstrapInfra()` (or its CLI equivalent) before reading/writing data in scripts.
155
+ - **Always** include a `schema: ZodSchema` when defining a collection.
156
+ - **Always** use framework UI components (`Button`, `Pressable`, `TabPicker`, `TabContent`, `Pager`, `ScrollView`, `Input`, `SelectView`, `Modal`, `FlatList`) with `data-id` and `aria-label` instead of raw HTML.
157
+ - **Never** read `process.env` in client code — use `import.meta.env.VITE_*`.
158
+
159
+ ## When in doubt
160
+
161
+ Run `npx ugly-app doctor`. If that doesn't clear it up, read the file this file lives next to in `node_modules/ugly-app/` — the `CLAUDE.md` next to this `AGENTS.md` has the current framework rules, and the source under `dist/` is the ground truth for any specific call.
@@ -880,7 +880,7 @@ function PopupLayer({ popups }: { popups: PopupEntry[] }) {
880
880
  <div class='footer quiet pad2 space-top1 center small'>
881
881
  Code coverage generated by
882
882
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
883
- at 2026-04-15T00:50:21.748Z
883
+ at 2026-04-15T02:27:16.035Z
884
884
  </div>
885
885
  <script src="../prettify.js"></script>
886
886
  <script>
@@ -118,7 +118,7 @@ export function clearFeedbackContext(): void {
118
118
  <div class='footer quiet pad2 space-top1 center small'>
119
119
  Code coverage generated by
120
120
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
121
- at 2026-04-15T00:50:21.748Z
121
+ at 2026-04-15T02:27:16.035Z
122
122
  </div>
123
123
  <script src="../prettify.js"></script>
124
124
  <script>
@@ -322,7 +322,7 @@ export function LoginPopup({ onSuccess, inline = false }: LoginPopupProps) {
322
322
  <div class='footer quiet pad2 space-top1 center small'>
323
323
  Code coverage generated by
324
324
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
325
- at 2026-04-15T00:50:21.748Z
325
+ at 2026-04-15T02:27:16.035Z
326
326
  </div>
327
327
  <script src="../prettify.js"></script>
328
328
  <script>
@@ -2218,7 +2218,7 @@ export function Link&lt;
2218
2218
  <div class='footer quiet pad2 space-top1 center small'>
2219
2219
  Code coverage generated by
2220
2220
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2221
- at 2026-04-15T00:50:21.748Z
2221
+ at 2026-04-15T02:27:16.035Z
2222
2222
  </div>
2223
2223
  <script src="../prettify.js"></script>
2224
2224
  <script>
@@ -775,7 +775,7 @@ export function captureElementMap(): ElementMap {
775
775
  <div class='footer quiet pad2 space-top1 center small'>
776
776
  Code coverage generated by
777
777
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
778
- at 2026-04-15T00:50:21.748Z
778
+ at 2026-04-15T02:27:16.035Z
779
779
  </div>
780
780
  <script src="../prettify.js"></script>
781
781
  <script>
@@ -319,18 +319,18 @@
319
319
  <span class="cline-any cline-neutral">&nbsp;</span>
320
320
  <span class="cline-any cline-neutral">&nbsp;</span>
321
321
  <span class="cline-any cline-neutral">&nbsp;</span>
322
- <span class="cline-any cline-yes">35x</span>
322
+ <span class="cline-any cline-yes">34x</span>
323
323
  <span class="cline-any cline-neutral">&nbsp;</span>
324
324
  <span class="cline-any cline-neutral">&nbsp;</span>
325
325
  <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-yes">35x</span>
326
+ <span class="cline-any cline-yes">34x</span>
327
327
  <span class="cline-any cline-neutral">&nbsp;</span>
328
328
  <span class="cline-any cline-neutral">&nbsp;</span>
329
329
  <span class="cline-any cline-neutral">&nbsp;</span>
330
330
  <span class="cline-any cline-neutral">&nbsp;</span>
331
331
  <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-yes">35x</span>
333
- <span class="cline-any cline-yes">35x</span>
332
+ <span class="cline-any cline-yes">34x</span>
333
+ <span class="cline-any cline-yes">34x</span>
334
334
  <span class="cline-any cline-neutral">&nbsp;</span>
335
335
  <span class="cline-any cline-neutral">&nbsp;</span>
336
336
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -350,16 +350,16 @@
350
350
  <span class="cline-any cline-neutral">&nbsp;</span>
351
351
  <span class="cline-any cline-neutral">&nbsp;</span>
352
352
  <span class="cline-any cline-neutral">&nbsp;</span>
353
- <span class="cline-any cline-yes">35x</span>
354
- <span class="cline-any cline-yes">35x</span>
355
- <span class="cline-any cline-yes">35x</span>
356
- <span class="cline-any cline-yes">35x</span>
353
+ <span class="cline-any cline-yes">34x</span>
354
+ <span class="cline-any cline-yes">34x</span>
355
+ <span class="cline-any cline-yes">34x</span>
356
+ <span class="cline-any cline-yes">34x</span>
357
357
  <span class="cline-any cline-neutral">&nbsp;</span>
358
358
  <span class="cline-any cline-neutral">&nbsp;</span>
359
- <span class="cline-any cline-yes">35x</span>
359
+ <span class="cline-any cline-yes">34x</span>
360
360
  <span class="cline-any cline-neutral">&nbsp;</span>
361
361
  <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-yes">35x</span>
362
+ <span class="cline-any cline-yes">34x</span>
363
363
  <span class="cline-any cline-yes">21x</span>
364
364
  <span class="cline-any cline-yes">21x</span>
365
365
  <span class="cline-any cline-yes">1x</span>
@@ -368,21 +368,21 @@
368
368
  <span class="cline-any cline-neutral">&nbsp;</span>
369
369
  <span class="cline-any cline-neutral">&nbsp;</span>
370
370
  <span class="cline-any cline-neutral">&nbsp;</span>
371
- <span class="cline-any cline-yes">35x</span>
372
- <span class="cline-any cline-yes">35x</span>
373
- <span class="cline-any cline-yes">35x</span>
374
- <span class="cline-any cline-yes">35x</span>
371
+ <span class="cline-any cline-yes">34x</span>
372
+ <span class="cline-any cline-yes">34x</span>
373
+ <span class="cline-any cline-yes">34x</span>
374
+ <span class="cline-any cline-yes">34x</span>
375
375
  <span class="cline-any cline-neutral">&nbsp;</span>
376
376
  <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-yes">35x</span>
377
+ <span class="cline-any cline-yes">34x</span>
378
378
  <span class="cline-any cline-neutral">&nbsp;</span>
379
379
  <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">35x</span>
380
+ <span class="cline-any cline-yes">34x</span>
381
381
  <span class="cline-any cline-yes">21x</span>
382
382
  <span class="cline-any cline-neutral">&nbsp;</span>
383
383
  <span class="cline-any cline-neutral">&nbsp;</span>
384
384
  <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-yes">35x</span>
385
+ <span class="cline-any cline-yes">34x</span>
386
386
  <span class="cline-any cline-yes">21x</span>
387
387
  <span class="cline-any cline-yes">4x</span>
388
388
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -403,7 +403,7 @@
403
403
  <span class="cline-any cline-neutral">&nbsp;</span>
404
404
  <span class="cline-any cline-neutral">&nbsp;</span>
405
405
  <span class="cline-any cline-neutral">&nbsp;</span>
406
- <span class="cline-any cline-yes">35x</span>
406
+ <span class="cline-any cline-yes">34x</span>
407
407
  <span class="cline-any cline-neutral">&nbsp;</span>
408
408
  <span class="cline-any cline-yes">7x</span>
409
409
  <span class="cline-any cline-yes">7x</span>
@@ -425,12 +425,12 @@
425
425
  <span class="cline-any cline-neutral">&nbsp;</span>
426
426
  <span class="cline-any cline-neutral">&nbsp;</span>
427
427
  <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-yes">35x</span>
429
- <span class="cline-any cline-yes">35x</span>
428
+ <span class="cline-any cline-yes">34x</span>
429
+ <span class="cline-any cline-yes">34x</span>
430
430
  <span class="cline-any cline-neutral">&nbsp;</span>
431
431
  <span class="cline-any cline-neutral">&nbsp;</span>
432
432
  <span class="cline-any cline-neutral">&nbsp;</span>
433
- <span class="cline-any cline-yes">35x</span>
433
+ <span class="cline-any cline-yes">34x</span>
434
434
  <span class="cline-any cline-neutral">&nbsp;</span>
435
435
  <span class="cline-any cline-neutral">&nbsp;</span>
436
436
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -447,16 +447,16 @@
447
447
  <span class="cline-any cline-neutral">&nbsp;</span>
448
448
  <span class="cline-any cline-neutral">&nbsp;</span>
449
449
  <span class="cline-any cline-neutral">&nbsp;</span>
450
- <span class="cline-any cline-yes">29x</span>
451
- <span class="cline-any cline-yes">29x</span>
452
- <span class="cline-any cline-yes">26x</span>
450
+ <span class="cline-any cline-yes">28x</span>
451
+ <span class="cline-any cline-yes">28x</span>
452
+ <span class="cline-any cline-yes">25x</span>
453
453
  <span class="cline-any cline-neutral">&nbsp;</span>
454
454
  <span class="cline-any cline-neutral">&nbsp;</span>
455
455
  <span class="cline-any cline-neutral">&nbsp;</span>
456
456
  <span class="cline-any cline-neutral">&nbsp;</span>
457
- <span class="cline-any cline-yes">29x</span>
458
- <span class="cline-any cline-yes">29x</span>
459
- <span class="cline-any cline-yes">26x</span>
457
+ <span class="cline-any cline-yes">28x</span>
458
+ <span class="cline-any cline-yes">28x</span>
459
+ <span class="cline-any cline-yes">25x</span>
460
460
  <span class="cline-any cline-neutral">&nbsp;</span>
461
461
  <span class="cline-any cline-neutral">&nbsp;</span>
462
462
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -682,7 +682,7 @@ export function useStringsContext(): StringsContextValue | null {
682
682
  <div class='footer quiet pad2 space-top1 center small'>
683
683
  Code coverage generated by
684
684
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
685
- at 2026-04-15T00:50:21.748Z
685
+ at 2026-04-15T02:27:16.035Z
686
686
  </div>
687
687
  <script src="../prettify.js"></script>
688
688
  <script>
@@ -763,7 +763,7 @@ export function ViewFlipper({
763
763
  <div class='footer quiet pad2 space-top1 center small'>
764
764
  Code coverage generated by
765
765
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
766
- at 2026-04-15T00:50:21.748Z
766
+ at 2026-04-15T02:27:16.035Z
767
767
  </div>
768
768
  <script src="../prettify.js"></script>
769
769
  <script>
@@ -529,7 +529,7 @@ export const Animated = {
529
529
  <div class='footer quiet pad2 space-top1 center small'>
530
530
  Code coverage generated by
531
531
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
532
- at 2026-04-15T00:50:21.748Z
532
+ at 2026-04-15T02:27:16.035Z
533
533
  </div>
534
534
  <script src="../../prettify.js"></script>
535
535
  <script>
@@ -706,7 +706,7 @@ export function useAnimatedValueTracker(animatedValue: AnimatedValueRef): number
706
706
  <div class='footer quiet pad2 space-top1 center small'>
707
707
  Code coverage generated by
708
708
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
709
- at 2026-04-15T00:50:21.748Z
709
+ at 2026-04-15T02:27:16.035Z
710
710
  </div>
711
711
  <script src="../../prettify.js"></script>
712
712
  <script>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-04-15T00:50:21.748Z
119
+ at 2026-04-15T02:27:16.035Z
120
120
  </div>
121
121
  <script src="../../prettify.js"></script>
122
122
  <script>
@@ -364,7 +364,7 @@ export function Button({
364
364
  <div class='footer quiet pad2 space-top1 center small'>
365
365
  Code coverage generated by
366
366
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
367
- at 2026-04-15T00:50:21.748Z
367
+ at 2026-04-15T02:27:16.035Z
368
368
  </div>
369
369
  <script src="../../prettify.js"></script>
370
370
  <script>
@@ -616,7 +616,7 @@ export function FeedbackButton(): ReactNode {
616
616
  <div class='footer quiet pad2 space-top1 center small'>
617
617
  Code coverage generated by
618
618
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
619
- at 2026-04-15T00:50:21.748Z
619
+ at 2026-04-15T02:27:16.035Z
620
620
  </div>
621
621
  <script src="../../prettify.js"></script>
622
622
  <script>
@@ -271,7 +271,7 @@ export function Input({
271
271
  <div class='footer quiet pad2 space-top1 center small'>
272
272
  Code coverage generated by
273
273
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
274
- at 2026-04-15T00:50:21.748Z
274
+ at 2026-04-15T02:27:16.035Z
275
275
  </div>
276
276
  <script src="../../prettify.js"></script>
277
277
  <script>
@@ -262,7 +262,7 @@ export function Modal({
262
262
  <div class='footer quiet pad2 space-top1 center small'>
263
263
  Code coverage generated by
264
264
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
265
- at 2026-04-15T00:50:21.748Z
265
+ at 2026-04-15T02:27:16.035Z
266
266
  </div>
267
267
  <script src="../../prettify.js"></script>
268
268
  <script>
@@ -334,7 +334,7 @@ export function Text({
334
334
  <div class='footer quiet pad2 space-top1 center small'>
335
335
  Code coverage generated by
336
336
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
337
- at 2026-04-15T00:50:21.748Z
337
+ at 2026-04-15T02:27:16.035Z
338
338
  </div>
339
339
  <script src="../../prettify.js"></script>
340
340
  <script>
@@ -220,7 +220,7 @@ export function Toast({
220
220
  <div class='footer quiet pad2 space-top1 center small'>
221
221
  Code coverage generated by
222
222
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
223
- at 2026-04-15T00:50:21.748Z
223
+ at 2026-04-15T02:27:16.035Z
224
224
  </div>
225
225
  <script src="../../prettify.js"></script>
226
226
  <script>
@@ -191,7 +191,7 @@
191
191
  <div class='footer quiet pad2 space-top1 center small'>
192
192
  Code coverage generated by
193
193
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
194
- at 2026-04-15T00:50:21.748Z
194
+ at 2026-04-15T02:27:16.035Z
195
195
  </div>
196
196
  <script src="../../prettify.js"></script>
197
197
  <script>
@@ -103,7 +103,7 @@ export const Z = {
103
103
  <div class='footer quiet pad2 space-top1 center small'>
104
104
  Code coverage generated by
105
105
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
106
- at 2026-04-15T00:50:21.748Z
106
+ at 2026-04-15T02:27:16.035Z
107
107
  </div>
108
108
  <script src="../../prettify.js"></script>
109
109
  <script>
@@ -951,21 +951,21 @@
951
951
  <span class="cline-any cline-neutral">&nbsp;</span>
952
952
  <span class="cline-any cline-neutral">&nbsp;</span>
953
953
  <span class="cline-any cline-neutral">&nbsp;</span>
954
- <span class="cline-any cline-yes">429x</span>
955
- <span class="cline-any cline-yes">429x</span>
956
- <span class="cline-any cline-yes">429x</span>
954
+ <span class="cline-any cline-yes">421x</span>
955
+ <span class="cline-any cline-yes">421x</span>
956
+ <span class="cline-any cline-yes">421x</span>
957
957
  <span class="cline-any cline-neutral">&nbsp;</span>
958
958
  <span class="cline-any cline-neutral">&nbsp;</span>
959
- <span class="cline-any cline-yes">429x</span>
959
+ <span class="cline-any cline-yes">421x</span>
960
960
  <span class="cline-any cline-neutral">&nbsp;</span>
961
961
  <span class="cline-any cline-yes">100x</span>
962
962
  <span class="cline-any cline-neutral">&nbsp;</span>
963
963
  <span class="cline-any cline-neutral">&nbsp;</span>
964
964
  <span class="cline-any cline-neutral">&nbsp;</span>
965
965
  <span class="cline-any cline-neutral">&nbsp;</span>
966
- <span class="cline-any cline-yes">417x</span>
967
- <span class="cline-any cline-yes">417x</span>
968
- <span class="cline-any cline-yes">12x</span>
966
+ <span class="cline-any cline-yes">407x</span>
967
+ <span class="cline-any cline-yes">407x</span>
968
+ <span class="cline-any cline-yes">13x</span>
969
969
  <span class="cline-any cline-neutral">&nbsp;</span>
970
970
  <span class="cline-any cline-neutral">&nbsp;</span>
971
971
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1032,7 +1032,7 @@
1032
1032
  <span class="cline-any cline-neutral">&nbsp;</span>
1033
1033
  <span class="cline-any cline-neutral">&nbsp;</span>
1034
1034
  <span class="cline-any cline-neutral">&nbsp;</span>
1035
- <span class="cline-any cline-yes">519x</span>
1035
+ <span class="cline-any cline-yes">510x</span>
1036
1036
  <span class="cline-any cline-yes">75x</span>
1037
1037
  <span class="cline-any cline-yes">75x</span>
1038
1038
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1204,21 +1204,21 @@
1204
1204
  <span class="cline-any cline-neutral">&nbsp;</span>
1205
1205
  <span class="cline-any cline-neutral">&nbsp;</span>
1206
1206
  <span class="cline-any cline-neutral">&nbsp;</span>
1207
- <span class="cline-any cline-yes">338x</span>
1208
- <span class="cline-any cline-yes">337x</span>
1209
- <span class="cline-any cline-yes">337x</span>
1207
+ <span class="cline-any cline-yes">329x</span>
1208
+ <span class="cline-any cline-yes">328x</span>
1209
+ <span class="cline-any cline-yes">328x</span>
1210
1210
  <span class="cline-any cline-neutral">&nbsp;</span>
1211
- <span class="cline-any cline-yes">337x</span>
1212
- <span class="cline-any cline-yes">338x</span>
1211
+ <span class="cline-any cline-yes">328x</span>
1212
+ <span class="cline-any cline-yes">329x</span>
1213
1213
  <span class="cline-any cline-yes">6x</span>
1214
1214
  <span class="cline-any cline-yes">12x</span>
1215
1215
  <span class="cline-any cline-neutral">&nbsp;</span>
1216
1216
  <span class="cline-any cline-neutral">&nbsp;</span>
1217
1217
  <span class="cline-any cline-neutral">&nbsp;</span>
1218
- <span class="cline-any cline-yes">337x</span>
1219
- <span class="cline-any cline-yes">337x</span>
1218
+ <span class="cline-any cline-yes">328x</span>
1219
+ <span class="cline-any cline-yes">328x</span>
1220
1220
  <span class="cline-any cline-neutral">&nbsp;</span>
1221
- <span class="cline-any cline-yes">337x</span>
1221
+ <span class="cline-any cline-yes">328x</span>
1222
1222
  <span class="cline-any cline-yes">75x</span>
1223
1223
  <span class="cline-any cline-yes">75x</span>
1224
1224
  <span class="cline-any cline-yes">75x</span>
@@ -1249,12 +1249,12 @@
1249
1249
  <span class="cline-any cline-neutral">&nbsp;</span>
1250
1250
  <span class="cline-any cline-neutral">&nbsp;</span>
1251
1251
  <span class="cline-any cline-neutral">&nbsp;</span>
1252
- <span class="cline-any cline-yes">337x</span>
1253
- <span class="cline-any cline-yes">337x</span>
1254
- <span class="cline-any cline-yes">337x</span>
1255
- <span class="cline-any cline-yes">337x</span>
1252
+ <span class="cline-any cline-yes">328x</span>
1253
+ <span class="cline-any cline-yes">328x</span>
1254
+ <span class="cline-any cline-yes">328x</span>
1255
+ <span class="cline-any cline-yes">328x</span>
1256
1256
  <span class="cline-any cline-neutral">&nbsp;</span>
1257
- <span class="cline-any cline-yes">337x</span>
1257
+ <span class="cline-any cline-yes">328x</span>
1258
1258
  <span class="cline-any cline-yes">3x</span>
1259
1259
  <span class="cline-any cline-yes">3x</span>
1260
1260
  <span class="cline-any cline-yes">3x</span>
@@ -1265,27 +1265,27 @@
1265
1265
  <span class="cline-any cline-yes">3x</span>
1266
1266
  <span class="cline-any cline-neutral">&nbsp;</span>
1267
1267
  <span class="cline-any cline-neutral">&nbsp;</span>
1268
- <span class="cline-any cline-yes">334x</span>
1269
- <span class="cline-any cline-yes">334x</span>
1268
+ <span class="cline-any cline-yes">325x</span>
1269
+ <span class="cline-any cline-yes">325x</span>
1270
1270
  <span class="cline-any cline-yes">1x</span>
1271
1271
  <span class="cline-any cline-yes">1x</span>
1272
1272
  <span class="cline-any cline-neutral">&nbsp;</span>
1273
- <span class="cline-any cline-yes">334x</span>
1273
+ <span class="cline-any cline-yes">325x</span>
1274
1274
  <span class="cline-any cline-neutral">&nbsp;</span>
1275
- <span class="cline-any cline-yes">334x</span>
1276
- <span class="cline-any cline-yes">329x</span>
1277
- <span class="cline-any cline-yes">329x</span>
1278
- <span class="cline-any cline-yes">329x</span>
1279
- <span class="cline-any cline-yes">237x</span>
1280
- <span class="cline-any cline-yes">237x</span>
1275
+ <span class="cline-any cline-yes">325x</span>
1276
+ <span class="cline-any cline-yes">321x</span>
1277
+ <span class="cline-any cline-yes">321x</span>
1278
+ <span class="cline-any cline-yes">321x</span>
1279
+ <span class="cline-any cline-yes">228x</span>
1280
+ <span class="cline-any cline-yes">228x</span>
1281
1281
  <span class="cline-any cline-neutral">&nbsp;</span>
1282
1282
  <span class="cline-any cline-neutral">&nbsp;</span>
1283
- <span class="cline-any cline-yes">5x</span>
1284
- <span class="cline-any cline-yes">5x</span>
1283
+ <span class="cline-any cline-yes">4x</span>
1284
+ <span class="cline-any cline-yes">4x</span>
1285
1285
  <span class="cline-any cline-neutral">&nbsp;</span>
1286
1286
  <span class="cline-any cline-neutral">&nbsp;</span>
1287
1287
  <span class="cline-any cline-neutral">&nbsp;</span>
1288
- <span class="cline-any cline-yes">337x</span>
1288
+ <span class="cline-any cline-yes">328x</span>
1289
1289
  <span class="cline-any cline-neutral">&nbsp;</span>
1290
1290
  <span class="cline-any cline-neutral">&nbsp;</span>
1291
1291
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -2233,7 +2233,7 @@ export function createSocket&lt;R extends AppRegistryBase&gt;(
2233
2233
  <div class='footer quiet pad2 space-top1 center small'>
2234
2234
  Code coverage generated by
2235
2235
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2236
- at 2026-04-15T00:50:21.748Z
2236
+ at 2026-04-15T02:27:16.035Z
2237
2237
  </div>
2238
2238
  <script src="../prettify.js"></script>
2239
2239
  <script>
@@ -206,7 +206,7 @@
206
206
  <div class='footer quiet pad2 space-top1 center small'>
207
207
  Code coverage generated by
208
208
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
209
- at 2026-04-15T00:50:21.748Z
209
+ at 2026-04-15T02:27:16.035Z
210
210
  </div>
211
211
  <script src="../prettify.js"></script>
212
212
  <script>