Skip to content

feat(app-shell): Setup page for packaged automation — on/off + clone (ADR-0126 §7.4) - #6382

Merged
os-support-ai merged 4 commits into
mainfrom
claude/issue-6301-packaged-automation-setup-page
Aug 25, 2026
Merged

feat(app-shell): Setup page for packaged automation — on/off + clone (ADR-0126 §7.4)#6382
os-support-ai merged 4 commits into
mainfrom
claude/issue-6301-packaged-automation-setup-page

Conversation

@os-support-ai

@os-support-aios-support-ai commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

Closes#6301
Part of objectstack-ai/objectstack#12150

Adds the operational Setup surface for the flows an installed package ships (ADR-0126 §7.4 + §9, objectstack 28b47a93). Automation authoring stays in Studio; this page holds only what the activation ledger knows.

How it is reached

Through the component-registry nav contribution — the mechanism every other framework-contributed Setup surface uses (metadata:directory, metadata:resource, developer:packages). services/builtinComponents registers automation:packaged; app navigation names that ref and ComponentNavView resolves it at /apps/<app>/component/automation/packaged.

No bespoke route is added. A second way in is a URL the app metadata does not know about, and the nav contribution is the mechanism the card asks for.

What the page does, and what it deliberately does not

Per packaged flow, exactly two actions:

on/off for this scopereads the engine's activation state (GET /automation/_status, backed by the §7.2 sys_metadata_activation ledger); flips it via POST /automation/:name/toggle
clonePOST /automation/:name/clone with a mandatory new machine name and label (§7.1)

The carried-over definition is never offered as editable form fields (the #11753 discipline) — the request body carries exactly { name, label }, pinned by a test. The copy is edited in Studio like any other flow.

The page shows no bound / status column even though _status carries both: §7.4 scopes it to what the activation ledger knows, and the Studio rail is where a flow's binding is diagnosed.

⛔ No drift or ancestry surface (§9)

No diff-vs-base, no "customized" badge, no base-moved notice, no link from a clone back to its source. Cloned-without-disabled and disabled-without-clone are ordinary states, shown plainly.

The sharpest test feeds a clone response that carries clonedFrom and baseVersionanyway and asserts neither reaches the DOM — pinning the rule at the renderer, not only on the wire. A response field is the cheapest place for ancestry to reappear. The rule is carried into the locale packs too: the packagedAutomation key group has no lineage vocabulary in any of the ten, because a translatable string for it is the cheapest way for that surface to come back.

One distinction the tests draw explicitly: the scan for withdrawn shapes deliberately excludes/copied from/. The server's own post-clone notice ends "…will run alongside the flow it was copied from", and that notice is relayed verbatim. §9 withdraws a lineage surface this page would have to invent and maintain; it does not censor the server's sentences. The first draft of the test scanned for the phrase and failed on the platform's own words.

Server refusals reach the operator verbatim

No client-side softening, shortening or rewording. actionErrorDetail (this repo's one ADR-0112 envelope reader) is the single reader; a fallback string is used only when the response carried no message at all. Three shapes, each pinned as the exact server string:

  • 403 PERMISSION_DENIED — the §5 posture gate. The message names the tenancy posture and the sanctioned clone path; a summarising client would drop the half that says what to do instead.
  • 409 DELETE_RESTRICTED — the §7.3 subflow guard, on disable only. The message names the packaged callers that would break mid-run — a list nothing on the client could reconstruct.
  • 409 on clone — the §7.1 name conflict, explaining why same-name clones are refused and suggesting a free name.

Scoping to packaged flows

packagedFlows.ts transcribes isCodeArtifactBody (@objectstack/objectql registry.ts, ADR-0029 D9.6) clause for clause rather than shortening it to the _packageId sentinel. That shortcut classifies a tenant overlay bound to a package as packaged — the cloud#970 misread — and here it would put a tenant's own flow behind an install-wide switch. The counterexample is pinned by test, not just the easy cases.

The runtime list is the spine (it holds every flow the engine can actually toggle or clone); the metadata list answers packaged-ness and the label.

Three commits, and why the second and third are here

7306a81 moves apiBase() out of views/metadata-admin/previews/useFlowNodePalette.ts into a leaf utils/apiBase.ts. That module's scope reaches flow-canvas-parts.tsx and the whole flow-designer canvas below it — free for the two importers already inside the designer, a chunk for this page, which services/builtinComponents imports eagerly and is therefore in the console's eager closure (check:eager-closure). useFlowNodePalette.ts imports and re-exports the name, so its existing importers are untouched and there is still exactly one definition; the repo already carries several hand-rolled copies of the same VITE_SERVER_URL arithmetic and a seventh was the wrong way to avoid the drag.

2eb4fb4 fixes the Type Check failure this PR's first push produced. check-i18n-call-site-keys.mjs found that all 22 keys the page names existed in no locale pack, so every string was reachable only through its inline defaultValue — English at the call site, untranslatable everywhere (objectui#3517). The packagedAutomation group now lives in en.ts and in real translations across the other nine packs, with terminology taken from each pack's own flowRunner.completed and common.package rather than invented (zh 流程/软件包, ja フロー/パッケージ, ko 플로우/패키지, de Flow/Paket, fr Flux/Package, es Flujo/Paquete, pt Fluxo/Pacote, ru Поток/Пакет, ar التدفق/الحزمة), each one's quotation convention included.

Two call-site changes the keys required: toggleFailed / cloneFailed each split in two, because the response arm has an HTTP status to name and the transport-exception arm does not, and one key cannot carry a hole only half its call sites can fill; and cloneCreated / toggleLabel now spell their holes {{name}} / {{label}} rather than interpolating in a JS template literal, so the inline default is byte-identical to the value the pack serves.

de-quote-pairing-3876.test.ts moves 53 → 54 on both counts: the German cloneCreated adds one matched „…“ span around an interpolated hole, the same shape flowRunner.completed contributed. rdq stays 0, which is the half of that ratchet carrying the meaning.

Verification — all at 082f466 (branch merged up to origin/main, no rebase)

checkresult
node scripts/check-i18n-call-site-keys.mjs — the gate that was redexit 0 — "Every in-scope call-site key resolves against the en pack (2848 keys), every literal inline defaultValue matches the value the pack serves, every call site passes exactly the arguments that value has holes for…"
pnpm exec vitest run packages/i18n/ (all-locales key parity + the de quote ratchet)55 files, 910 passed, exit 0
pnpm exec vitest run packages/app-shell/src/views/setup/3 files, 24 passed, exit 0
pnpm --filter @object-ui/i18n --filter @object-ui/app-shell type-checkexit 0 (both tsc --noEmit && tsc -p tsconfig.test.json)
check:i18n-keys · check:i18n-drift · check:i18n-dead-keysexit 0 — drift reports "0 en value(s) changed (24 key(s) added, 0 removed)"
pnpm exec eslint over the touched files, --format jsonexit 0 — 16 files, 0 errors, 0 warnings
check-changeset-presence · check-changeset-no-majorexit 0 — 20 released-source files across 2 packages, 1 changeset, no major
earlier, at 7306a81: app-shell type-check, and vitest over views/setup/ + views/metadata-admin/previews/ + views/metadata-admin/inspectors/ (the new page plus every importer of the moved symbol)exit 0 — 103 files, 1143 passed

Reverse-verified — each leg mutated, the mutation confirmed on disk by anchor greps (never the editor's exit code), then restored:

  1. drop the _provenance clause from the packaged-ness test → 3 red, incl. the cloud#970 counterexample and the rendered scoping case;
  2. soften refusals (actionErrorDetail → the client's own fallback) → 3 red, exactly the three verbatim-refusal tests;
  3. make the clone result display the ancestry the response smuggled in → 2 red, incl. the no-ancestry test.

Leg 3's first attempt was a no-op — a perl s/// whose pattern contained === and $ failed to compile, leaving the file untouched, and the run came back green. The anchor greps caught it (injected 0, removed 1), so that green was discarded rather than reported; the leg was redone with a literal replace that exits non-zero on an anchor miss.

Declared narrowing. The full 533-file packages/app-shell/ suite was started but held the shared verify lock 15 minutes with another agent queued behind it and produced no per-file progress, so it was stopped by its own PIDs (other agents run the same command from the shared checkout — a pkill -f would have taken out their runs) and replaced with the targeted runs above. CI runs the full farm.

check:eager-closure is not reported: it requires a built apps/console/dist/eager-closure.json and refuses locally as a broken gauge rather than reporting a false pass. It is the gate 7306a81 exists to keep honest — worth a look on CI.


Generated by Claude Code

Adds the operational Setup surface for the flows an installed package ships
(ADR-0126 section 7.4). Automation authoring stays in Studio; this page holds
only what the activation ledger knows.
Reached through the component-registry nav contribution, the way every other
framework-contributed Setup surface is: `services/builtinComponents` registers
`automation:packaged`, app navigation names that ref, and `ComponentNavView`
resolves it at `/apps/<app>/component/automation/packaged`. No bespoke route is
added — a second way in would be a URL the app metadata does not know about.
Per packaged flow, exactly two actions:
* on/off for this scope — reads the engine's activation state
(`GET /automation/_status`, backed by the section 7.2
`sys_metadata_activation` ledger), flips it via `POST /automation/:name/toggle`;
* clone — `POST /automation/:name/clone` with a mandatory new machine name and
label (section 7.1). The carried-over definition is never an editable form
field; the copy is edited in Studio like any other flow.
The list is scoped to packaged flows by the server's own three-clause provenance
test (`isCodeArtifactBody`, ADR-0029 D9.6), transcribed in `packagedFlows.ts`
rather than shortened to the `_packageId` sentinel — that shortcut classifies a
tenant overlay bound to a package as packaged (the cloud#970 misread), which here
would put a tenant's own flow behind an install-wide switch.
Server refusals reach the operator verbatim, with no client-side softening: the
section 5 posture gate (403 PERMISSION_DENIED, naming the posture and the
sanctioned clone path), the section 7.3 subflow guard (409 DELETE_RESTRICTED,
naming the packaged callers that would break mid-run) and the section 7.1 clone
name conflict (409). `actionErrorDetail` is the single reader; a fallback string
is used only when the response carried no message at all.
No drift or ancestry surface (section 9): no diff-vs-base, no "customized" badge,
no base-moved notice, no link from a clone to its source. Cloned-without-disabled
and disabled-without-clone are ordinary states shown plainly. Tests pin the
absence, including a response that carries a `clonedFrom` key anyway — proving
the rule is enforced at the renderer and not only on the wire.
Claude-Session: https://claude.ai/code/session_01KWRU3s15AJz7PGW7a7wdCh
…stays light
`apiBase()` lived in `views/metadata-admin/previews/useFlowNodePalette.ts`,
whose module scope reaches `flow-canvas-parts.tsx` and the whole flow-designer
canvas below it. That costs nothing for the two modules already importing it
(the palette fetch and the runs panel, both inside the designer), and costs a
chunk for one that is not: the new packaged-automation page is imported EAGERLY
by `services/builtinComponents`, so everything in its graph joins the console's
eager closure that `check:eager-closure` weighs.
Three lines of URL arithmetic now live in `utils/apiBase.ts`, a leaf.
`useFlowNodePalette.ts` imports and re-exports the name, so its existing
importers are untouched and there is still exactly ONE definition — the repo
already carries several hand-rolled copies of the same `VITE_SERVER_URL`
arithmetic, and a seventh was the wrong way to avoid the drag.
Imported and then exported rather than `export { apiBase } from …`: that module
calls `apiBase()` itself, and a bare re-export forwards the name without binding
it in local scope.
Claude-Session: https://claude.ai/code/session_01KWRU3s15AJz7PGW7a7wdCh
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3226.2 KB3266.6 KB
Main entry chunk (gzip)156.1 KB350 KB
Entry fileindex-BKxM6w6T.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.30KB4.28KB
app-shell (runtime-config.js)18.10KB6.51KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)505.84KB114.57KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.18KB47.97KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.66KB12.84KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.46KB34.48KB
plugin-designer (index.js)211.95KB42.75KB
plugin-detail (index.js)245.10KB62.31KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)128.11KB31.17KB
plugin-gantt (index.js)164.14KB39.87KB
plugin-grid (index.js)201.66KB54.55KB
plugin-kanban (index.js)52.87KB14.57KB
plugin-list (index.js)112.63KB27.45KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.70KB7.69KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.55KB20.74KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)54.84KB18.43KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

…ten packs
`check-i18n-call-site-keys.mjs` failed the Type Check job: all 22 keys the new
Setup page names exist in no locale pack, so every string on it was reachable
only through its inline `defaultValue`. That renders English at the call site
and leaves the page untranslatable everywhere (objectui#3517) — the gate says
in as many words that an inline default is NOT a fix.
Adds the `packagedAutomation` group to `packages/i18n/src/locales/en.ts`, the
source of truth, and real translations to the other nine packs. Terminology
follows each pack's existing vocabulary rather than being invented here — the
words for "flow" and "package" are taken from `flowRunner.completed` and
`common.package` in that same pack (zh 流程/软件包, ja フロー/パッケージ,
ko 플로우/패키지, de Flow/Paket, fr Flux/Package, es Flujo/Paquete,
pt Fluxo/Pacote, ru Поток/Пакет, ar التدفق/الحزمة), as is each one's quotation
convention.
The group deliberately carries no drift or ancestry wording (ADR-0126 section
9): a translatable string for a lineage the platform does not track is the
cheapest way for that surface to reappear. It also carries no refusal prose —
the posture gate, the subflow guard and the clone name conflict are
server-authored and rendered verbatim; the four `*Failed*` keys are last-resort
fallbacks for a response that carried no message at all.
Two call-site changes the keys required:
* `toggleFailed` and `cloneFailed` each split in two. The response arm has an
HTTP status to name and the transport-exception arm does not, and one key
cannot carry a hole only half its call sites can fill — the gate's
interpolation-parity leg checks exactly that.
* `cloneCreated` and `toggleLabel` now spell their holes `{{name}}` /
`{{label}}` instead of interpolating in a JS template literal, so the inline
default is byte-identical to the value the pack serves and a provider-less
render cannot drift from a translated one.
`de-quote-pairing-3876.test.ts` moves 53 -> 54 on both of its counts. The German
`cloneCreated` adds one MATCHED „…“ span around an interpolated hole, the same
shape `flowRunner.completed` contributed; `rdq` stays 0, which is the half of
that ratchet that carries the meaning.
Claude-Session: https://claude.ai/code/session_01KWRU3s15AJz7PGW7a7wdCh
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3229.8 KB3266.6 KB
Main entry chunk (gzip)156.1 KB350 KB
Entry fileindex-BmhjJCJX.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.30KB4.28KB
app-shell (runtime-config.js)18.10KB6.51KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)505.84KB114.57KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.18KB47.97KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.66KB12.84KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.21KB44.67KB
plugin-dashboard (index.js)133.46KB34.48KB
plugin-designer (index.js)211.95KB42.75KB
plugin-detail (index.js)245.10KB62.31KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)128.11KB31.17KB
plugin-gantt (index.js)164.14KB39.87KB
plugin-grid (index.js)201.79KB54.60KB
plugin-kanban (index.js)52.87KB14.57KB
plugin-list (index.js)112.63KB27.45KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.49KB11.93KB
plugin-timeline (index.js)26.70KB7.69KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.55KB20.74KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)54.84KB18.43KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.35KB0.70KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

L5: Setup page "packaged automation" — on/off + clone actions for packaged flows (ADR-0126 §7.4)

2 participants

@os-support-ai@claude