Skip to content

feat(app-shell): the copilot's applied card opens the change review and undoes the draft; the badge follows an in-turn publish; the chat fits the 1010 px slot (objectui#12894, objectui#12725 phase 6) - #12964

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-12725-copilot-composer-wiring
Oct 18, 2026

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #12894
Part of #12725
Clause-②: no

objectui#12725 phase 6, carrying objectui#12894's console wiring (both cards are claimed for this branch). This is a draft by a dispatched developer; the seat lands it.

What changes

  1. The applied card's two doors are wired from ChatPane (objectui#12894). The card the copilot draws after it saves a change as a draft (objectstack-ai/cloud#2924) now shows 查看变更并发布 and 撤销 in the console. Both props landed in PR feat(plugin-chatbot,i18n): the copilot's change card draws the draft posture, and the applied card offers review and undo (objectui#12894) #12951; until now no host passed them, so the card kept its old inline Publish.
    • 撤销 calls POST /api/v1/packages/:id/discard-drafts for the card's package through the SDK client the console's adapter holds (packages.discardDrafts, typed by the spec's DiscardPackageDraftsResponse). A draft the server could not drop is a failure the card shows, with the server's reason. Either way the assistant bus pulses (emitMetadataRefresh), so the Studio 变更 badge re-reads its ledger.
    • 查看变更并发布 opens Studio's 变更 drawer for the package through one declared way in: the Studio URL parameter ?changes=review (new studioChangesLink.ts). StudioDesignSurface reads it, opens the drawer in its review posture and drops it (replace), the way the metadata designer consumes ?review=1. Inside the package's Studio (the copilot) the parameter goes onto the current location, so the surface stays mounted with its pillar and selection. From anywhere else (the full-page chat, the console dock) the link opens the package's Interfaces pillar with it.
  2. The published-result pulse (objectui#12725). ChatPane's authoring pulse now also fires on a tool result that detectAuthoringVerdict (exported by plugin-chatbot) classifies, which covers a non-replay status: 'published' answer. That is cloud's maybeAutoPublish: it publishes in the turn, which promotes every pending draft of the package, and rewrites the envelope. The chat lifts neither draftReview nor replayOutcome from it, so before this the badge kept the swept drafts as pending.
  3. The copilot composer (objectui#12725 Target item 4's last line). Only measured; see "Item 3" below.
  4. The 1010 px slot clip (objectui#12725 Target item 1). The chat column in ChatPane ([data-chat-column]) is now min-w-0. See "The culprit" below.

Premise, re-read on main (b5153f44)

  • ChatbotEnhanced declares onReviewDrafts and onDiscardDrafts; ChatPane passed neither. StudioDesignSurface's changesOpen was component state with no URL parameter and no bus event. Holds.
  • ChatPane's pulse predicate was tool.draftReview || tool.replayOutcome. Holds: the new pulse case below is red on the base file.
  • The slot clip: holds, but only with a tool card that has a one-line summary in the thread (phase 5's drafted card); see "The culprit".
  • The placeholder 「问问数据,或让我改改这个应用…」: already on main for the real Studio copilot. The Studio copilot resolves the build agent (cloud's BUILD_AGENT_NAME) and passes its package as editPackageId, so ChatPane hands ChatbotEnhanced console.ai.askOrChangeApp, whose zh string is exactly that sentence. studio_copilot is the name phase 5's live driver gave its stub agent; the console does not resolve it as the build agent, so that driver's composer read 「向 Studio Copilot 提问…」. Measured live (agent build) and pinned in the Studio harness below; that case is green on the base file too.

The measured chain (file and symbol)

  • Review: ChatbotEnhanced AppliedDraftCard onReview → ChatPane reviewDrafts → studioChangesReviewTarget (studioChangesLink.ts) → navigate → StudioDesignSurface (useSearchParams, STUDIO_CHANGES_PARAM) → setChangesPosture('review') + setChangesOpen(true) → DraftChangesPanel open.
  • Undo: AppliedDraftCard onDiscard → requestDiscardDrafts (asks first when other drafts are pending, as PR feat(plugin-chatbot,i18n): the copilot's change card draws the draft posture, and the applied card offers review and undo (objectui#12894) #12951 drew it) → ChatPane discardDrafts → useAdapter().getClient().packages.discardDrafts(packageId) → POST /api/v1/packages/:id/discard-drafts (framework discardPackageDrafts) → emitMetadataRefresh → usePendingDrafts (subscribeMetadataRefresh) → GET /api/v1/meta/_drafts?packageId= → studio-changes-count.
  • Pulse: ChatPane's announcement effect (announcedAuthoringRef) → detectAuthoringVerdict(tool.result) beside draftReview / replayOutcome → the same emitMetadataRefresh.

The culprit (item 4)

Measured live at 1010 x 900 with phase 5's thread (a non-replay drafted card, then English narration). The probe lays the chat column out at its min-content width (342 px), then hides one element at a time and keeps those whose absence brings it down to the slot's 300 px. The deepest one is the draft card's summary, span.min-w-0.flex-1.truncate (nowrap; its own min-content is 296 px), in the card's publish row (发布 (1) plus the summary, 320 px). min-w-0 and truncate on the span only take effect when an ancestor bounds the width. The chat column is a flex item, and a flex item's automatic minimum width is its content's min-content. So the summary's whole text widened the column, the chat panel inside it, and everything in the panel: the share button, the bubbles and the composer.

reading slot ai-chat-panel send button right edge elements past the slot
before, 1010 300 342 1040 (the slot ends at 1010) 43
after, 1010 300 299 997 0
after, 1280 360 359 1267 0

The fix is the one token on the column, inside the claimed file. No plugin-chatbot change.

Item 3: the composer chip — stopped, as the dispatch asks

The chip naming the item in view exists: plugin-chatbot's surfaceContextLabel chip, which the Studio copilot already fills (「正在讨论:任务」 live). The artboard's 「借阅看板 ×」 is removable and sits in the composer's footer. plugin-chatbot declares no prop for a remove control, and the chip's placement is its own rendering, so this line stops here. It is an open question in the report (a new plugin-chatbot prop would make that round Clause-②: yes). The draft marks (草稿 chip, 来源 line) are not this round; they wait on objectstack-ai/objectstack#24298.

Tests

New or extended, all in packages/app-shell:

  • StudioDesignSurface.copilotDoors-12894.test.tsx (6). The real surface, the real Studio copilot (StudioChatDock → StudioCopilotConversation → ChatPane) and the real ChatbotEnhanced, fed the producer's changes_proposed card and its confirm replay (drafted with appliedCard). Cases:
    • 查看变更并发布 opens the drawer in review posture, with the same surface tree, the same applied card node and the same URL afterwards;
    • arriving with ?changes=review opens the drawer and drops the parameter;
    • CONTROL: an unknown value opens nothing and is dropped;
    • zh: the composer's placeholder and the chip;
    • 撤销 calls discardDrafts('app.hcpl'), the card reads 已撤销 and the badge goes away;
    • a server-side failure shows object/hcpl_borrowing: … on the card and still pulses once.
  • AiChatPage.appliedCardDoors-12894.test.tsx (7). Review from the full-page chat goes to /studio/app.hcpl/interfaces?changes=review; on the package's pillar it keeps the path and ?surface= and adds the parameter; CONTROL: on another package's Studio, the card's own package opens. Undo resolves { ok: true } and passes the package id; a thrown request resolves { ok: false, error }; CONTROL: with no adapter, no 撤销 is offered. The chat column carries min-w-0.
  • StudioDesignSurface.copilotDraftBadge-12725.test.tsx (+1, now 6): a non-replay published result re-reads the badge as it lands (2 → none), with exactly one pulse.

Results:

  • After, at a1babb11: the three files, 18 tests passed (VERDICT command-exit 0), and the composer case in its own run of its file (6 of 6). All 19 are in the whole-package run below.
  • Before: the base AiChatPage.tsx and StudioDesignSurface.tsx (b5153f44 blobs ad1d0a6041b1 / adb0557ca0fc) checked out over the committed tests. 13 failed and 6 passed. The six are phase 5's five cases plus the placeholder case, which already holds. The published case fails with an AssertionError saying the badge's SPAN, still reading 2, was expected to be null (the tag is spelled as a word here because GitHub strips tag-shaped text). Restored with git checkout HEAD --: blobs equal to HEAD (cf440a8cc984 / 30523c1a60ce), git diff HEAD 0 bytes.
  • Ablations (one per wired door, through objectstack's scripts/ablation-replace.mjs, wrap mode; no dist step, since the tests import app-shell source relatively):
    • A1 deletes onReviewDrafts={reviewDrafts}: anchor 1 → 0, blob cf440a8cc984 → cc06b4b1962a. 5 failed and 8 passed: the four review cases, plus the no-adapter CONTROL, whose other half asserts the review door.
    • A2 deletes onDiscardDrafts={dataSource ? discardDrafts : undefined}: anchor 1 → 0. 4 failed and 9 passed: the four undo cases.
    • Each leg: 'ok restored: blob == HEAD (cf440a8cc984) and git diff HEAD is empty'. After both legs git status --porcelain is empty.
  • Whole package: pnpm exec vitest run --maxWorkers=2 --shard=K/8 packages/app-shell/, sharded through the verify lock because one run exceeds the 10-minute foreground cap, at a1babb11. All 8 shards: VERDICT command-exit 0. Files per shard: 194/197/197/196/196 (1 skipped)/196/197/197, so 1570 run of the 1570 tracked test files (git ls-files count), 1569 passed and 1 skipped. Tests: 14758 passed, 9 skipped. origin/main moved one commit since the branch was cut (7f9cc37d, i18n console copy). It touches none of these files and merges cleanly (git merge-tree exit 0), so the branch was not re-merged.

Gates

Local, with each exit code captured before any pipe:

  • pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build: VERDICT command-exit 0.
  • pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json): exit 0, 0 error TS. tsconfig.test.json --listFilesOnly lists all 3 test files.
  • eslint on the 6 changed source and test files: exit 0, 0 errors. Warnings, base to head: AiChatPage.tsx 34 to 34; StudioDesignSurface.tsx 13 to 14 (one react-hooks/set-state-in-effect, the effect that consumes ?changes=review; the rule is warn in eslint.config.js and not ratcheted); the new files 0.
  • Exit 0 at a1babb11: check:new-line-citations, check:control-bytes, check:test-path-roots, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:changeset-claims, check:pending-changeset-literals, changeset:check, node scripts/check-changeset-presence.mjs, check:spec-symbols, check:phantom-deps, check:self-import, check:esm-specifiers, check:unreferenced-sources, check:handler-key-reads, check:metadata-write-doors, check:comment-mask-corpus, check:i18n-keys, check:doc-json, check:doc-fences, check:doc-types, check:doc-example-ids, check:doc-example-readers, check:shell-escape-residue.
  • NOT MEASURED locally: check:doc-snippets and check:doc-examples answered PRECONDITION NOT MET (exit 2): 7 packages they resolve against are unbuilt here. The docs change is one table row with no code fence. CI runs both.
  • Not run locally: check:readme-exports (no README in the diff; it also stopped on an unbuilt plugin-gantt) and check:eager-closure (it weighs the console dist). CI covers both.

objectui has no dispatch-gates.mjs. The list above is the root package.json check:* scripts whose scan roots read app-shell source, test files, .changeset/ or content/docs. CI's check-runs are the merge gate.

Evidence

Branch claude/issue-12725f-evidence at 2301a354, evidence/12725f/: screenshots at 1010 and 1280 px (zh-CN), the JSON readings, the driver and a README. The screenshots show:

  • the copilot with a thread and the send button whole;
  • the applied card with both buttons;
  • the drawer opened by 查看变更并发布 (in place: same location.href, same navigation entry count);
  • the card after 撤销, with the badge gone;
  • the full-page chat's 查看变更并发布 landing on Studio with the drawer open;
  • the slot before and after the fix.

Deviations

  • The discard door uses the SDK client, not the metadata client. The dispatch preferred "one client method on the metadata client". MetadataClient (@object-ui/data-objectstack) has no discard method, and adding one would widen that published package's surface (Clause-②: yes) and leave the claimed file surface. The SDK client the console's adapter already holds declares the route (packages.discardDrafts) with the spec's response type, so this adds no API anywhere and no second bare fetch. PackagesPage's own bare call is untouched (not this card).
  • File surface: a new views/studio-design/studioChangesLink.ts (the parameter's one definition, not exported from the package entry). Also one row in content/docs/guide/console.md (AGENTS.md Add automated testing infrastructure and CI/CD workflows #2). Nothing else outside the claim.
  • Clause-②: no, with one thing for the seat to judge: no export, prop, spec key or language-pack key changes. The Studio route reads one new page-scoped URL parameter, changes, which is page-scoped like ?surface= and not in urlParams.ts's reserved registry.
  • The live driver names its agent build (cloud's real build agent), not phase 5's studio_copilot. That is why the pending-drafts bar appears in these shots (below).

Acceptance notes

  • The floating pending-drafts bar covers the Studio copilot's composer. With the real build agent, ChatPane draws PendingDraftsBar (objectui#5694) while a draft is pending. In the copilot's slot it sits over the composer's input line, at 1010 and at 1280 (the evidence shots doors-*-2-applied-card.png, after-*-slot-fits.png). This is on main too, untouched here; phase 5's stub agent never drew it. It is reported to the seat as a finding: whether Studio, whose top bar already carries 变更 and 发布, should draw that bar at all is a design call, not a mechanical change.
  • Full-package suite counts are this branch's tracked test files; the CI matrix is the merge gate.

Session: https://claude.ai/code/session_01Cbdek8SKSHxddGqTPZXdqX


Generated by Claude Code

…nd undoes the draft; the badge follows an in-turn publish; the chat fits the 1010 px slot (objectui#12894, objectui#12725)

- ChatPane passes onReviewDrafts / onDiscardDrafts to ChatbotEnhanced.
  Review opens Studio's Changes drawer through its one declared way in,
  `?changes=review` (studioChangesLink.ts): in place inside the package's
  Studio, a navigation to the package's Studio from anywhere else.
  Undo is the SDK client's packages.discardDrafts, then the bus pulse.
- StudioDesignSurface reads `?changes=review`, opens the drawer to
  review and drops the param.
- ChatPane's authoring pulse also fires on a non-replay `published`
  result (detectAuthoringVerdict): cloud's in-turn auto-publish.
- The chat column is `min-w-0`, so a tool card's nowrap summary no
  longer widens the chat past the Studio copilot's slot.

Claude-Session: https://claude.ai/code/session_01Cbdek8SKSHxddGqTPZXdqX
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added documentation Improvements or additions to documentation tests package: app-shell labels Oct 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 75 chunks) 3161.7 KB 3744.1 KB
Main entry chunk (gzip) 80.5 KB 350 KB
Entry file index-fzbzHAun.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) 21.41KB 7.88KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 612.39KB 149.02KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.72KB 74.47KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 230.81KB 54.29KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 266.04KB 70.50KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 272.87KB 75.68KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 139.82KB 36.04KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 125.37KB 41.04KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · repo:cloud#2 · session session_01Cbdek8SKSHxddGqTPZXdqX · 2026-10-18T13:09Z

Thread-read: objectui#12725's newest comment is this round's os-dev-report; objectui#12894's is its pointer 6250222949. PR #12964 is at head a1babb11.

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 tests

Projects

None yet

2 participants