Skip to content

feat(app-shell,i18n): render the environment admin's read-rate report from the usage endpoint's readRate reading - #10052

Merged
os-tesla merged 5 commits into
mainfrom
claude/issue-9954-read-rate-banner
Sep 20, 2026
Merged

os-tesla merged 5 commits into
mainfrom
claude/issue-9954-read-rate-banner

Conversation

@os-tesla

Copy link
Copy Markdown
Collaborator

Fixes #9954

Clause-②: no

The tenant runtime's GET /api/v1/usage/storage gained one optional nested readRate key. The data half landed on the cloud side (PR 2376 in that repo, merged 2026-09-18); nothing here consumed it, so a measured anomaly reached nobody. This is the rendering half, on the maintainer's ruling batch #164 item 3.

Falsification first, before any code

Triage's instruction was to re-run the usage scan and stop if a storage banner had landed since. Re-run on this branch's base e86445f57:

reading value
files matching usage/storage under packages + apps 0
control, same corpus, same command family: files matching usage 90
readRate / readsPerWrite / ratioThreshold anywhere 0
control for that zero, same command family: files matching useAiUsage 8
the one runtime-composed /usage URL useAiUsage.ts in app-shell, which builds it from apiBase — the AI quota meter, not storage

Both zeros are lit beside a same-subject control in the same command family, so neither is a misfire. No storage banner exists. The scope stands as triage re-stated it: build the reading, build the banner, land the three contract behaviours.

What landed

  • packages/app-shell/src/hooks/useReadRateReading.ts — reads the endpoint, parses only the one key this repo has a contract for, and exposes a status.
  • packages/app-shell/src/layout/ReadRateBanner.tsx — the surface.
  • Mounted in ConsoleShell beside ImpersonationBanner.
  • console.readRate.* (four keys) in all ten locale packs.

The three contract properties, and the ablation that proves each pin can fail

Every case below was measured from the committed tree: mutate, prove the write landed on disk (anchor count 1 to 0, injected 0 to 1), run, restore with git checkout HEAD -- PATH, and confirm git diff HEAD empty with the blob hash equal to the HEAD blob.

(1) An absent readRate is not "fine". The hook reports unmeasured; a measured verdict of ok is measured; an unreadable endpoint is unavailable. Three values, three facts. All three render nothing, and classifyReadRate keeps them apart. unavailable is deliberately not folded into unmeasured: that status is a positive claim about what the control plane said, and a failed read gives no basis to make it.

  • Ablation A — classify unmeasured as ok: 2 tests red, restored clean.

(2) An absent readsPerWrite is the worst case. It means the environment made no writes at all, so the ratio has no upper bound. Its own title, its own sentence, the heavier tone. The parser keeps the key absent rather than defaulting it, and accepts both spellings of an omitted optional (missing and JSON null) — reading null as off-contract would hide the most severe reading there is, which is the one thing the card forbids.

  • Ablation B — hide the banner when the number is missing: 3 tests red (2 in the banner file after the case below was strengthened), restored clean.
  • That ablation also found a weak test of my own: "says something different for the no-writes case" was green on the defect, because an empty render is trivially different from the ratio copy. It now asserts the banner EXISTS first, and goes red on the same mutation. That fix is its own commit.

(3) The threshold is data. Rendered from ratioThreshold on the wire; the verdict is read, never re-derived.

  • Ablation C — hard-code the line: 1 test red, restored clean.
  • Ablation D — re-derive the verdict by comparing the ratio to the threshold: 1 test red, restored clean.

And it stays a report. No gate, no throttle, no upgrade call to action; a test asserts there is no button and no link in the banner, that the copy says nothing is limited or blocked, and that it carries none of the refusal vocabulary.

Design readings this repo owns

The card said the shape is this repo's call and prescribed none of it. What I chose, and why:

  • Mount point: ConsoleShell, not ConsoleLayout, not the notification host. ConsoleLayout wraps only /apps/*, so an admin sitting on /home would see nothing — which is the reasoning ImpersonationBanner already records for itself. ConsoleNotificationBanners renders notifications RAISED through the spec notification system; this reading is neither a notification nor raised by anything in this app.
  • Audience gate: useWorkspaceAdminStatus. The card names the environment's own admin. Gating the hook rather than only the render also keeps the request off every ordinary session instead of spending a 403 per page load.
  • Lane: createAuthenticatedFetch, not bare fetch. The console authenticates to /api/v1/* with a Bearer token in localStorage and has no session cookie — the fact the MetadataClient auth ratchet in this package exists to protect. It is built inside the effect, so no memoised identity is ever an effect dependency (AGENTS.md [WIP] Enhance every detail of the designer #10).
  • No refetch loop. Unlike the AI meter beside it, this reading is a slow control-plane aggregate over the whole read history; nothing a user does in a session moves it. One fetch per mount, plus an explicit refetch.
  • i18n: the repo's convention binds an inline defaultValue to the en pack value and full parity across ten packs, so this touched packages/i18n as well as packages/app-shell. That is wider than the dispatched file surface and is called out here rather than done quietly.

Verification

All commands from the repo root, exit codes captured before any pipe. Heavy runs went through the shared verify lock in the sibling checkout.

command exit reading
pnpm exec vitest run packages/app-shell/ 0 738 files, 7321 passed, 1 skipped
pnpm exec vitest run packages/i18n/ 0 69 files, 1145 passed
pnpm --filter @object-ui/app-shell --filter @object-ui/i18n run type-check 0 both Done, including each package's tsconfig.test.json
pnpm --filter @object-ui/app-shell --filter @object-ui/i18n run lint 0 0 errors; the new sources contribute no finding of any kind
pnpm check:i18n-keys 0 every call-site key resolves, every inline default matches its pack value, every option name matches that value's holes
pnpm check:i18n-drift · check:i18n-dead-keys · check:i18n-designer-parity 0
pnpm check:eager-locale-catalogues 0 nine catalogues deferred, only en resident
pnpm check:eager-closure 0 five ceilings weighed, all with headroom
pnpm check:doc-snippets 0 672 of 672 blocks judged, 0 failed
pnpm check:readme-exports 0
pnpm check:new-line-citations 0 0 new citations
pnpm check:control-bytes · check:changeset-claims · check:test-path-roots · check:esm-specifiers · check:self-import · check:unreferenced-sources · check:component-surface-parity · check:side-effects-array · check:entry-guard · check:doc-fences · check:dist-completeness · the three vi-mock gates 0
node scripts/check-changeset-presence.mjs 0 19 changed files, 1 changeset declared
node scripts/check-governed-queue-guard.mjs --test over the diff 0 NOT GOVERNED, 19 paths against 5 surfaces; the control run on AGENTS.md does refuse

The doc gates were re-run after the README commit; the suites, type-check and lint ran before it, and the only test that reads that README was re-run after it (7 passed). The measurements above were taken at 41710d21a, this branch's head.

Not measured locally, said plainly rather than implied: the repo-wide pnpm lint and pnpm test, and CI's own matrix. check:doc-links is not a script in this repo — its non-zero is "no such script", not a finding.

Acceptance notes

Noticed while reading, not filed and not fixed here, because nothing in this card's blast radius touches them:

  • useAiUsage carries the same "setState synchronously within an effect" lint warning this hook originally had; the new hook derives its inert state instead, so it does not add another instance. Not a defect, not filed.
  • Neither content/docs/guide/console-architecture.md nor console.md enumerates the surfaces ConsoleShell mounts, so neither documents ImpersonationBanner or AiUsageIndicator either. There is therefore no docs-site home for this one to join, and inventing a section had no precedent to follow; AGENTS.md Add automated testing infrastructure and CI/CD workflows #2 is satisfied through the package README instead. Noted, not filed — I could name no pull request or person who would land on it.

Related, and untouched by this branch: cloud#2377 remains open. Nothing here acts on it.

🤖 Generated with Claude Code

https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq


Generated by Claude Code

The tenant runtime's `GET /api/v1/usage/storage` gained an optional nested
`readRate` reading (state, readsPerWrite, ratioThreshold). The data half landed
on the cloud side and nothing here consumed it, so a measured anomaly reached
nobody. This is the rendering half.

`useReadRateReading` reads the endpoint and keeps the three silent answers
apart: an absent `readRate` is `unmeasured` (the control plane reported no
reading), a measured `ok` is `measured`, and an unreadable endpoint is
`unavailable`. All three render nothing; none of them is the others.

`ReadRateBanner` renders only on the control plane's `anomalous` verdict, which
it reads and never re-derives. An absent `readsPerWrite` means the environment
made no writes at all, so the ratio is unbounded — it gets its own title, its
own sentence and the heavier tone rather than a dash or a hidden banner. The
line comes from `ratioThreshold` on the wire; this repo holds no copy of it.

It is a report: no gate, no throttle, no CTA, and the copy says so. Mounted in
`ConsoleShell` beside `ImpersonationBanner` so `/home` carries it too, and shown
only to a workspace admin, who is also the only session that issues the request.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
…its copy

Measured under ablation: hiding the banner when `readsPerWrite` is absent left
this case green, because an empty render is trivially "different from the ratio
copy". The presence assertion makes the comparison mean what its name claims.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
AGENTS.md #2. Sits beside the Notifications section on purpose: both surfaces
are "banners" and only one of them is raised through the notification system.
The table states what renders for each reading, and names the three silent
answers as three different facts rather than one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
@github-actions github-actions Bot added documentation Improvements or additions to documentation tests package: app-shell package: i18n labels Sep 20, 2026
@github-actions

github-actions Bot commented Sep 20, 2026

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 1 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/6661-app-launcher-nav-menu-renderers.md

  • names en.tspackages/i18n/src/locales/en.ts — edited by this change

    Three new strings — the launcher's and the menu's accessible names, and the menu's empty state — are declared under console.nav in en.ts and its nine sibling packs. An inline defaultValue alone is not a fix: it renders English at one call site and leaves the string untranslatable everywhere (objectui#3517).

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Compared the checked-out tree with c2f0f4832 (merge-base with origin/main): 18 file(s) changed outside .changeset/, read against 1223 pending declaration(s) that publish a body (1783 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3058.2 KB 3104.5 KB
Main entry chunk (gzip) 146.9 KB 350 KB
Entry file index-utILKLHd.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 545.92KB 130.72KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 221.99KB 61.72KB
fields (index.js) 249.62KB 63.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.90KB 10.97KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 50.26KB 14.36KB
plugin-charts (index.js) 71.73KB 20.08KB
plugin-chatbot (index.js) 198.20KB 47.14KB
plugin-dashboard (index.js) 132.96KB 35.17KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 255.18KB 66.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 139.56KB 35.40KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 213.44KB 58.21KB
plugin-kanban (index.js) 48.71KB 15.17KB
plugin-list (index.js) 113.53KB 27.99KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.18KB 21.05KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 109.04KB 36.08KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.38KB 1.98KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.74KB 2.54KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 15.71KB 5.30KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

…er mock

`check:vi-mock-inherit` refuses a hand-listed factory: it freezes the mock to
the exports written that day, so the next export any module in this file's
import graph reads at module scope kills the file during COLLECTION — zero
failed assertions, reading green.

Why my own pre-push run of that gate said exit 0: it walks `git ls-files`, and
the file was still UNTRACKED when I ran it. Measured just now on this head, in
one command: an untracked copy carrying the identical violation is reported 0
times while the tracked offender is reported once.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
Two pull requests landed on the same ten locale packs while this branch was in
review. Taking the merge rather than a rebase, per AGENTS.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
@os-tesla
os-tesla enabled auto-merge September 20, 2026 08:32
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3058.7 KB 3104.5 KB
Main entry chunk (gzip) 146.9 KB 350 KB
Entry file index-d4g3HFBU.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 545.92KB 130.72KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 221.99KB 61.72KB
fields (index.js) 251.67KB 63.42KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.90KB 10.97KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 50.26KB 14.36KB
plugin-charts (index.js) 71.73KB 20.08KB
plugin-chatbot (index.js) 198.20KB 47.14KB
plugin-dashboard (index.js) 132.96KB 35.17KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 255.18KB 66.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 139.56KB 35.40KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 213.44KB 58.21KB
plugin-kanban (index.js) 48.71KB 15.17KB
plugin-list (index.js) 113.53KB 27.99KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.68KB 8.95KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.18KB 21.05KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 109.04KB 36.08KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.38KB 1.98KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.74KB 2.54KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 15.71KB 5.30KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation package: app-shell package: i18n tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Render the read-rate banner for the environment admin from the usage endpoint's new readRate reading (cloud#2333 data half has landed)

2 participants