Skip to content

chore: release packages#2282

Merged
os-zhuang merged 1 commit into
mainfrom
changeset-release/main
Jul 5, 2026
Merged

chore: release packages#2282
os-zhuang merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

Releases

@object-ui/app-shell@11.5.0

Minor Changes

  • 544d8eb: Add the app → Studio reverse bridge (ADR-0080): workspace admins see a "Design in Studio" entry in the app top bar that deep-links to the running app's owning package on the Studio design surface (/studio/:packageId/data). Hidden for non-admins and for apps with no owning package; package writability stays server-side (read-only packages open as browse-only).

  • 6fffd3d: Client-side data-invalidation bus — refresh data, don't rebuild UI (objectui#2269 P1).

    • @object-ui/react gains the bus: notifyDataChanged({objectName, recordId?}), useDataInvalidation(objectName, recordId?) (reader nonce), subscribeDataChanges, and useMutationInvalidationBridge(dataSource) which fans every dataSource write (MutationEvent) onto the bus. The bus also dispatches the legacy objectui:related-changed window event, so pre-bus listeners keep working.
    • The key={refreshKey} remount of RecordDetailView (AppContent) and the key={actionRefreshKey} remount of DetailView (RecordDetailView) are GONE: record data now refetches in place via the bus — scroll, collapsed sections, tabs and in-progress inline edits survive every save/action/undo. All nine action-success bumps became precisely-scoped notifyDataChanged calls; undo/redo use the operation's own objectName/recordId.
    • RelatedCountStore is wired to the bus (tab count badges refetch after any change to their object) and its useSyncExternalStore snapshot is now a monotonic version — previously it returned the same Map reference, so emit() never re-rendered subscribers and invalidations left badges stale; useRelatedCountVersion() is exported and drives the probe effect's re-fetch.
    • app-shell also gains the reserved URL-param registry (urlParams.tsform/formObject/formLink/tab/recordId/palette/shortcuts constants replace scattered string literals) and AGENTS.md Commandment feat: add live playground for interactive schema demonstration #8 (UI-state classification: state that must survive a data refresh may never live only in an uncontrolled component).
  • 9255686: Record detail tabs are URL-addressable (?tab=) and survive subtree remounts (objectui#2257, ADR-0054 C3).

    • buildDefaultTabs emits STABLE semantic tab values (details / related:<child> / related / activity / history) instead of leaving the renderer to synthesize index-derived ones.
    • PageTabsRenderer honors item.value, a host-provided schema.defaultTab (validated against actual tabs) and schema.onTabChange; index fallback kept for authored schemas without values.
    • app-shell RecordDetailView restores the active tab from ?tab= and writes it back with replace (tab switches never stack history), via the pure withPageTabsUrlSync page-tree injector (never mutates authored/memoized page schemas). Legacy DetailView.autoTabs wired to the same contract (defaultTab/onTabChange).
    • Fixes the tab strip resetting to Details after save-refresh remounts (refreshKey-style) and dev-StrictMode URL churn; enables ?tab= deep links; invalid values fall back to Details.
  • 6c1ad9e: Record task flows open as derived overlays with lossless return (framework#2604, extends framework#2578).

    • Create/Edit never route — the global record form is URL-driven (?form=new / ?form=<id>): browser Back closes the overlay with the origin (list scroll/filters, detail state) intact; field-heavy objects derive a full-screen modal (modalSize:'full') via the new deriveRecordFlowSurface mirror in plugin-view, light ones keep the auto-sized modal. editMode:'page' opt-in unchanged.
    • Save invariantedit never moves you (origin refetches in place); create lands on the new record's detail on its derived surface (drawer over the still-intact list for light objects, detail route for heavy), with replace:true so Back skips the transient form entry.
    • Subtable child create/edit = overlay over the parent detail, never a route — related-list New/Edit push ?form=…&formObject=<child>&formLink=<fk>:<parentId>; the one global overlay pre-links the parent (refresh-safe), sizes to the CHILD object, and on save stays on the parent while only the child's related lists refetch. ModalForm now forwards initialValues into its master-detail (subforms) branch so pre-links survive for children with inline line items.
  • fbec4e1: feat(studio): pick a connector action from the chosen connector (no more hand-typed action ids)

    In a flow's Connector Action node, the actionId field was a free-text box
    (sendMessage · send placeholder) — a typo silently produced a node that fails
    at run time. It was left as text because a connector's actions have "no flat
    catalog"; but each connector already advertises its actions in the runtime
    descriptors (GET /api/v1/automation/connectors{ name, actions:[{key,label}] }).

    actionId is now a picker of the chosen connector's actions, resolved from
    the sibling connectorId (mirroring how object-field lists the fields of its
    resolved object). New reference kind connector-action + connectorSource on
    FlowReferenceSpec; useConnectorActionOptions fetches the descriptors and
    resolveConnectorName reads the connector from the node's connectorConfig. Like
    every reference in the designer it stays an editable combobox — with no
    connector chosen (or none installed) it degrades to free text with a hint
    ("Choose a Connector above to list its actions" / "Actions of .").

    Closes the last critical hand-typed-identifier gap in flow-node config (the
    object / field / flow / role / connector / template references were already
    pickers). Unit-tested (resolveConnectorName, connectorActionsToOptions).

  • 7a6837c: Studio package-create dogfood follow-ups (Studio package-create UX dogfood follow-ups (2026-07 browser walkthrough) objectstack#2615):

    • Read-only packages now gate authoring affordances client-side (Add field, New object/flow/permission set, nav Edit, Save draft, Publish, Create app) with a "switch to a writable package" hint, instead of letting doomed edits pile up until the server 422s (objectui#2259). Records stay fully usable; the field inspector opens read-only.
    • New fields auto-derive their API name from the label while still auto-named — now also for the Data pillar's generic field_N names, so relabeling "New field" to "Status" yields a status column instead of field_2 forever (objectui#2260).
    • Publish is review-then-confirm: the header button opens the pending-changes panel, whose footer "Publish N change(s)" fires the atomic package publish; panel entries expand to a per-item field/property diff against the live version (objectui#2261).
    • Create app can scaffold navigation from the package's objects (checkbox, on by default): one spec-valid object menu item per object, closing the "fresh app has zero nav" dead-end (objectui#2262).
  • 5ed8d2d: feat(studio): automation enable/disable switch + live status in the Automations rail

    The Automations pillar showed only an icon + label per flow, and no way to turn a
    flow on or off — so an author couldn't tell whether an automation was live, or
    stop one without deleting it (the header even said "Off by default · review before
    enabling", but nothing reflected or controlled it). UX eval Fix documentation deployment for www.objectui.org #6.

    • Live status dot on every flow in the rail — a green "On" / gray "Off",
      fetched from the engine's GET /api/v1/automation/_status (persisted status
      is intent; this is what's actually enabled + bound to its trigger). Refetched
      after a publish; degrades silently on an older backend. A flow the engine
      doesn't know yet (never published) shows no dot — the amber "unpublished draft"
      chip already covers that.
    • Enable/Disable switch in the flow header. It flips the flow's deployment
      status (active ↔ obsolete) and saves the draft immediately; the change goes
      live when the package is published (so "review before enabling" is preserved).
      Pairs with framework's engine-side gate (obsolete/invalid → not bound).

    New engine.studio.auto.* i18n keys (en + zh). Unit-tested (FlowStatusDot:
    enabled→On, disabled→Off, no-state→nothing, bound-vs-unbound tooltip). Verified in
    a live browser: the rail shows a green "On" against every showcase flow and the
    header switch reads "Enabled".

  • 70c4a3f: Studio package-create dogfood follow-ups (framework#2615 — P2 wizard + P3 polish):

    • Package-id wizard feedback. The three package wizards (switcher create,
      landing create, landing duplicate) share a new PackageIdInput: illegal
      characters are still normalized away, but no longer silently — a notice
      says what was removed — a reverse-domain format hint shows while the id
      doesn't parse, and a CJK-only name that yields no id suggestion is told to
      type one manually instead of leaving the id box mysteriously empty.
    • Records-grid duplicate "Actions" column. A field literally named
      actions is now dropped from the Studio grid's data columns, so it no
      longer collides with the always-pinned row-actions column (it stays
      editable in the form designer).
    • Record-create verb consistency. The ObjectView toolbar create button
      resolved a hardcoded English "Create"; it now uses the same
      console.objectView.new ("New" / 新建) key as the runtime object pages so
      Studio and the running app agree.
    • Branded cold-load splash. The console's pre-auth loading gate rendered a
      bare "Loading…"; it now shows the branded, boot-safe LoadingScreen.
    • Picklist option editor. Value/label inputs and CJK option labels no
      longer truncate — the six controls that shared one cramped row are split
      into a two-row layout so the inputs get the full panel width.
    • Draft-save confirmation. The Data pillar's "Save draft" now shows a
      success toast and a "last saved HH:MM" indicator, matching the App and
      Automations pillars.

Patch Changes

  • ec6bb16: Studio Automations rail now shows authored-but-unpublished (draft) flows.

    The Automations pillar loaded its rail with client.list('flow', …) only, which
    returns published/active metadata — so a flow authored (saved as a draft) but not
    yet published was invisible in the rail, even while the "Changes · N" counter
    showed a pending draft existed. Every sibling pillar (Data / Interfaces / Access)
    already merged client.listDrafts; Automations was the sole outlier.

    The published ∪ draft merge is extracted into a shared, unit-tested
    loadPackageSurfaces helper and adopted by the Automations pillar, which also now
    re-reads on publishNonce so drafts that go live collapse back into the published
    rail after a package publish. A draft-only flow now appears in its rail (badged
    "Unpublished draft"), is selectable, and loads its draft body for editing —
    matching the other pillars. Fixes the empty-rail report for writable-base packages
    whose flows are all still drafts.

  • 4fbf910: Stop double-firing action toasts on record-detail script actions and the delete handler.

    ActionRunner.handlePostExecution already surfaces a result's error as a toast
    (and a success toast unless silent). Two handlers ALSO toasted themselves while
    returning {success:false, error} (or a non-silent success), so on a runner
    seeded with onToast the same message fired twice:

    • RecordDetailView serverActionHandler (script actions): the HTTP/inner-fail
      branch and the catch branch each called toast.error before returning the error.
      fix(app-shell): stop double-toasting failed script/modal action errors #2177 fixed the twin in useConsoleActionRuntime (interface pages) but not this
      copy, so record-detail script-action failures (e.g. a RECORD_LOCKED from an
      approval-locked record) still showed the error twice for everyone on the published
      console bundle. Both branches now return the error and let the runner toast it once.

    • useObjectActions delete handler (ObjectView list/detail deletes): kept its
      richer localized toast (label + description, or the bulk succeeded/failed summary)
      and now returns WITHOUT error on failure so the runner doesn't re-toast it, and
      marks successful deletes silent so the runner doesn't append a second generic
      "Action completed successfully" toast.

    Adds useObjectActions.test.tsx asserting exactly one toast on delete
    success / failure / partial-bulk-failure.

  • 6f15e43: test(studio): extend the create-conformance gate to the inline pillar creators

    createConformance.test.ts guards that every authorable type's default
    create-form output passes spec validation — catching the recurring "the designer
    emits a minimal shape the spec rejects, so create→save 422s" dead-end family. But
    it read only the metadata-admin registry, so the Studio's inline "New X"
    creators (Data → object, Automations → flow, Interfaces → app, Access →
    permission) — which build their skeletons directly in StudioDesignSurface.tsx,
    bypassing the registry — were uncovered. A future edit to one of those shapes
    could turn its "New" button into a silent dead-end with nothing to catch it.

    Extracted the four inline skeletons into pure, exported builders
    (studio-design/skeletons.ts) consumed by BOTH the pillars and a new gate block,
    so the test can't drift from what the "New" button actually emits. No behavior
    change — the builders return the byte-identical skeletons. The gate now covers all
    create paths (registry + inline); the four inline skeletons validate clean.

  • Updated dependencies [544d8eb]

  • Updated dependencies [6fffd3d]

  • Updated dependencies [9255686]

  • Updated dependencies [fae75e2]

  • Updated dependencies [1072701]

    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/data-objectstack@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/layout@11.5.0
    • @object-ui/plugin-editor@11.5.0
    • @object-ui/auth@11.5.0
    • @object-ui/collaboration@11.5.0
    • @object-ui/core@11.5.0
    • @object-ui/permissions@11.5.0
    • @object-ui/providers@11.5.0

@object-ui/components@11.5.0

Minor Changes

  • 6fffd3d: Client-side data-invalidation bus — refresh data, don't rebuild UI (objectui#2269 P1).

    • @object-ui/react gains the bus: notifyDataChanged({objectName, recordId?}), useDataInvalidation(objectName, recordId?) (reader nonce), subscribeDataChanges, and useMutationInvalidationBridge(dataSource) which fans every dataSource write (MutationEvent) onto the bus. The bus also dispatches the legacy objectui:related-changed window event, so pre-bus listeners keep working.
    • The key={refreshKey} remount of RecordDetailView (AppContent) and the key={actionRefreshKey} remount of DetailView (RecordDetailView) are GONE: record data now refetches in place via the bus — scroll, collapsed sections, tabs and in-progress inline edits survive every save/action/undo. All nine action-success bumps became precisely-scoped notifyDataChanged calls; undo/redo use the operation's own objectName/recordId.
    • RelatedCountStore is wired to the bus (tab count badges refetch after any change to their object) and its useSyncExternalStore snapshot is now a monotonic version — previously it returned the same Map reference, so emit() never re-rendered subscribers and invalidations left badges stale; useRelatedCountVersion() is exported and drives the probe effect's re-fetch.
    • app-shell also gains the reserved URL-param registry (urlParams.tsform/formObject/formLink/tab/recordId/palette/shortcuts constants replace scattered string literals) and AGENTS.md Commandment feat: add live playground for interactive schema demonstration #8 (UI-state classification: state that must survive a data refresh may never live only in an uncontrolled component).
  • 9255686: Record detail tabs are URL-addressable (?tab=) and survive subtree remounts (objectui#2257, ADR-0054 C3).

    • buildDefaultTabs emits STABLE semantic tab values (details / related:<child> / related / activity / history) instead of leaving the renderer to synthesize index-derived ones.
    • PageTabsRenderer honors item.value, a host-provided schema.defaultTab (validated against actual tabs) and schema.onTabChange; index fallback kept for authored schemas without values.
    • app-shell RecordDetailView restores the active tab from ?tab= and writes it back with replace (tab switches never stack history), via the pure withPageTabsUrlSync page-tree injector (never mutates authored/memoized page schemas). Legacy DetailView.autoTabs wired to the same contract (defaultTab/onTabChange).
    • Fixes the tab strip resetting to Details after save-refresh remounts (refreshKey-style) and dev-StrictMode URL churn; enables ?tab= deep links; invalid values fall back to Details.

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0
    • @object-ui/react-runtime@11.5.0
    • @object-ui/sdui-parser@11.5.0

@object-ui/data-objectstack@11.5.0

Minor Changes

  • 1072701: Import wizard: use registered server-side import mappings (framework fix(actions): defuse the three action-visibility traps (#2358) — clean rebase, replaces #2575 #2611). When an object has mapping metadata artifacts targeting it, the wizard shows a "Saved mapping" selector; picking one hands rename + transforms + write semantics to the server (the artifact is authoritative), replaces the manual column table with a read-only summary of the mapping, and submits mappingName over source-header rows (mutually exclusive with the inline column rename). ImportRequestOptions gains mappingName; the objectstack adapter gains listImportMappings(objectName) (feature-detected — the selector simply doesn't appear when unsupported). New grid.import.* strings added across all locales.

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/i18n@11.5.0

Minor Changes

  • 544d8eb: Add the app → Studio reverse bridge (ADR-0080): workspace admins see a "Design in Studio" entry in the app top bar that deep-links to the running app's owning package on the Studio design surface (/studio/:packageId/data). Hidden for non-admins and for apps with no owning package; package writability stays server-side (read-only packages open as browse-only).
  • 1072701: Import wizard: use registered server-side import mappings (framework fix(actions): defuse the three action-visibility traps (#2358) — clean rebase, replaces #2575 #2611). When an object has mapping metadata artifacts targeting it, the wizard shows a "Saved mapping" selector; picking one hands rename + transforms + write semantics to the server (the artifact is authoritative), replaces the manual column table with a read-only summary of the mapping, and submits mappingName over source-header rows (mutually exclusive with the inline column rename). ImportRequestOptions gains mappingName; the objectstack adapter gains listImportMappings(objectName) (feature-detected — the selector simply doesn't appear when unsupported). New grid.import.* strings added across all locales.

@object-ui/plugin-detail@11.5.0

Minor Changes

  • 6fffd3d: Client-side data-invalidation bus — refresh data, don't rebuild UI (objectui#2269 P1).

    • @object-ui/react gains the bus: notifyDataChanged({objectName, recordId?}), useDataInvalidation(objectName, recordId?) (reader nonce), subscribeDataChanges, and useMutationInvalidationBridge(dataSource) which fans every dataSource write (MutationEvent) onto the bus. The bus also dispatches the legacy objectui:related-changed window event, so pre-bus listeners keep working.
    • The key={refreshKey} remount of RecordDetailView (AppContent) and the key={actionRefreshKey} remount of DetailView (RecordDetailView) are GONE: record data now refetches in place via the bus — scroll, collapsed sections, tabs and in-progress inline edits survive every save/action/undo. All nine action-success bumps became precisely-scoped notifyDataChanged calls; undo/redo use the operation's own objectName/recordId.
    • RelatedCountStore is wired to the bus (tab count badges refetch after any change to their object) and its useSyncExternalStore snapshot is now a monotonic version — previously it returned the same Map reference, so emit() never re-rendered subscribers and invalidations left badges stale; useRelatedCountVersion() is exported and drives the probe effect's re-fetch.
    • app-shell also gains the reserved URL-param registry (urlParams.tsform/formObject/formLink/tab/recordId/palette/shortcuts constants replace scattered string literals) and AGENTS.md Commandment feat: add live playground for interactive schema demonstration #8 (UI-state classification: state that must survive a data refresh may never live only in an uncontrolled component).
  • 9255686: Record detail tabs are URL-addressable (?tab=) and survive subtree remounts (objectui#2257, ADR-0054 C3).

    • buildDefaultTabs emits STABLE semantic tab values (details / related:<child> / related / activity / history) instead of leaving the renderer to synthesize index-derived ones.
    • PageTabsRenderer honors item.value, a host-provided schema.defaultTab (validated against actual tabs) and schema.onTabChange; index fallback kept for authored schemas without values.
    • app-shell RecordDetailView restores the active tab from ?tab= and writes it back with replace (tab switches never stack history), via the pure withPageTabsUrlSync page-tree injector (never mutates authored/memoized page schemas). Legacy DetailView.autoTabs wired to the same contract (defaultTab/onTabChange).
    • Fixes the tab strip resetting to Details after save-refresh remounts (refreshKey-style) and dev-StrictMode URL churn; enables ?tab= deep links; invalid values fall back to Details.

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0

@object-ui/plugin-grid@11.5.0

Minor Changes

  • 1072701: Import wizard: use registered server-side import mappings (framework fix(actions): defuse the three action-visibility traps (#2358) — clean rebase, replaces #2575 #2611). When an object has mapping metadata artifacts targeting it, the wizard shows a "Saved mapping" selector; picking one hands rename + transforms + write semantics to the server (the artifact is authoritative), replaces the manual column table with a read-only summary of the mapping, and submits mappingName over source-header rows (mutually exclusive with the inline column rename). ImportRequestOptions gains mappingName; the objectstack adapter gains listImportMappings(objectName) (feature-detected — the selector simply doesn't appear when unsupported). New grid.import.* strings added across all locales.

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0
    • @object-ui/mobile@11.5.0

@object-ui/plugin-view@11.5.0

Minor Changes

  • 6c1ad9e: Record task flows open as derived overlays with lossless return (framework#2604, extends framework#2578).

    • Create/Edit never route — the global record form is URL-driven (?form=new / ?form=<id>): browser Back closes the overlay with the origin (list scroll/filters, detail state) intact; field-heavy objects derive a full-screen modal (modalSize:'full') via the new deriveRecordFlowSurface mirror in plugin-view, light ones keep the auto-sized modal. editMode:'page' opt-in unchanged.
    • Save invariantedit never moves you (origin refetches in place); create lands on the new record's detail on its derived surface (drawer over the still-intact list for light objects, detail route for heavy), with replace:true so Back skips the transient form entry.
    • Subtable child create/edit = overlay over the parent detail, never a route — related-list New/Edit push ?form=…&formObject=<child>&formLink=<fk>:<parentId>; the one global overlay pre-links the parent (refresh-safe), sizes to the CHILD object, and on save stays on the parent while only the child's related lists refetch. ModalForm now forwards initialValues into its master-detail (subforms) branch so pre-links survive for children with inline line items.

Patch Changes

  • 70c4a3f: Studio package-create dogfood follow-ups (framework#2615 — P2 wizard + P3 polish):

    • Package-id wizard feedback. The three package wizards (switcher create,
      landing create, landing duplicate) share a new PackageIdInput: illegal
      characters are still normalized away, but no longer silently — a notice
      says what was removed — a reverse-domain format hint shows while the id
      doesn't parse, and a CJK-only name that yields no id suggestion is told to
      type one manually instead of leaving the id box mysteriously empty.
    • Records-grid duplicate "Actions" column. A field literally named
      actions is now dropped from the Studio grid's data columns, so it no
      longer collides with the always-pinned row-actions column (it stays
      editable in the form designer).
    • Record-create verb consistency. The ObjectView toolbar create button
      resolved a hardcoded English "Create"; it now uses the same
      console.objectView.new ("New" / 新建) key as the runtime object pages so
      Studio and the running app agree.
    • Branded cold-load splash. The console's pre-auth loading gate rendered a
      bare "Loading…"; it now shows the branded, boot-safe LoadingScreen.
    • Picklist option editor. Value/label inputs and CJK option labels no
      longer truncate — the six controls that shared one cramped row are split
      into a two-row layout so the inputs get the full panel width.
    • Draft-save confirmation. The Data pillar's "Save draft" now shows a
      success toast and a "last saved HH:MM" indicator, matching the App and
      Automations pillars.
  • Updated dependencies [544d8eb]

  • Updated dependencies [6fffd3d]

  • Updated dependencies [9255686]

  • Updated dependencies [fae75e2]

  • Updated dependencies [1072701]

  • Updated dependencies [ec9c8ee]

  • Updated dependencies [6c1ad9e]

    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/plugin-form@11.5.0
    • @object-ui/plugin-grid@11.5.0
    • @object-ui/core@11.5.0

@object-ui/react@11.5.0

Minor Changes

  • 6fffd3d: Client-side data-invalidation bus — refresh data, don't rebuild UI (objectui#2269 P1).

    • @object-ui/react gains the bus: notifyDataChanged({objectName, recordId?}), useDataInvalidation(objectName, recordId?) (reader nonce), subscribeDataChanges, and useMutationInvalidationBridge(dataSource) which fans every dataSource write (MutationEvent) onto the bus. The bus also dispatches the legacy objectui:related-changed window event, so pre-bus listeners keep working.
    • The key={refreshKey} remount of RecordDetailView (AppContent) and the key={actionRefreshKey} remount of DetailView (RecordDetailView) are GONE: record data now refetches in place via the bus — scroll, collapsed sections, tabs and in-progress inline edits survive every save/action/undo. All nine action-success bumps became precisely-scoped notifyDataChanged calls; undo/redo use the operation's own objectName/recordId.
    • RelatedCountStore is wired to the bus (tab count badges refetch after any change to their object) and its useSyncExternalStore snapshot is now a monotonic version — previously it returned the same Map reference, so emit() never re-rendered subscribers and invalidations left badges stale; useRelatedCountVersion() is exported and drives the probe effect's re-fetch.
    • app-shell also gains the reserved URL-param registry (urlParams.tsform/formObject/formLink/tab/recordId/palette/shortcuts constants replace scattered string literals) and AGENTS.md Commandment feat: add live playground for interactive schema demonstration #8 (UI-state classification: state that must survive a data refresh may never live only in an uncontrolled component).

Patch Changes

  • fae75e2: Fix two bugs verified still-present after Fix objectui-side follow-ups from Showcase E2E audit (framework#2620) #2254 claimed to resolve them (framework#2620 / framework#2616 Showcase UX pass, tracked in Verification of #2254: B1 (wizard submitBehavior) and D (chart width/labels) still broken #2268):

    • Wizard/form submitBehavior: 'thank-you' allowed duplicate resubmission. Fix objectui-side follow-ups from Showcase E2E audit (framework#2620) #2254 fixed the spec-bridge dropping submitBehavior before it reached the renderer, so the configured toast message started appearing — but WizardForm's last step and ObjectForm's submit handler only ever called toast.success(...) for thank-you/next-record; the form stayed mounted and fully filled with its submit button re-enabled once the request settled, so a second click created a second record. Both components now track a terminal submitted state and, when set, replace the form with a confirmation panel (using the behavior's title/message, which were also never read before) — mirroring the pattern apps/console/src/components/FormPage.tsx already used for its own standalone forms.

    • Command Center-style 3-up chart bands stayed collapsed to ~100-130px, and a dataset-bound chart's measure leaked its raw field name.

      • responsiveStyles (and style) were declared on the page-spec PageComponent bridge input type but never copied onto the SchemaNode in spec-bridge/bridges/page.ts::mapComponent() — so a page author's ADR-0065 layout override (e.g. forcing display: 'grid' on a type: 'flex' band) never reached SchemaRenderer, and the node silently fell back to its default flex layout. Both fields are now mapped through.
      • ObjectChart's dataset-bound fetch path (schema.dataset + ds.queryDataset(...)) discarded the response's fields array (which carries each measure's label, e.g. { name: 'task_count', label: 'Tasks' }) before it ever reached buildChartSeries() — whose fields param already resolves this correctly (see chart-series.test.ts) — so the legend/tooltip always fell back to the raw field name. The fetched fields are now captured and threaded through.
  • Updated dependencies [544d8eb]

  • Updated dependencies [9255686]

  • Updated dependencies [1072701]

    • @object-ui/i18n@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/data-objectstack@11.5.0
    • @object-ui/core@11.5.0

@object-ui/types@11.5.0

Minor Changes

  • 1072701: Import wizard: use registered server-side import mappings (framework fix(actions): defuse the three action-visibility traps (#2358) — clean rebase, replaces #2575 #2611). When an object has mapping metadata artifacts targeting it, the wizard shows a "Saved mapping" selector; picking one hands rename + transforms + write semantics to the server (the artifact is authoritative), replaces the manual column table with a read-only summary of the mapping, and submits mappingName over source-header rows (mutually exclusive with the inline column rename). ImportRequestOptions gains mappingName; the objectstack adapter gains listImportMappings(objectName) (feature-detected — the selector simply doesn't appear when unsupported). New grid.import.* strings added across all locales.

Patch Changes

  • 9255686: Record detail tabs are URL-addressable (?tab=) and survive subtree remounts (objectui#2257, ADR-0054 C3).

    • buildDefaultTabs emits STABLE semantic tab values (details / related:<child> / related / activity / history) instead of leaving the renderer to synthesize index-derived ones.
    • PageTabsRenderer honors item.value, a host-provided schema.defaultTab (validated against actual tabs) and schema.onTabChange; index fallback kept for authored schemas without values.
    • app-shell RecordDetailView restores the active tab from ?tab= and writes it back with replace (tab switches never stack history), via the pure withPageTabsUrlSync page-tree injector (never mutates authored/memoized page schemas). Legacy DetailView.autoTabs wired to the same contract (defaultTab/onTabChange).
    • Fixes the tab strip resetting to Details after save-refresh remounts (refreshKey-style) and dev-StrictMode URL churn; enables ?tab= deep links; invalid values fall back to Details.

@object-ui/console@11.5.0

Patch Changes

  • @object-ui/react-runtime@11.5.0
  • @object-ui/sdui-parser@11.5.0

@object-ui/auth@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0

@object-ui/cli@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0

@object-ui/collaboration@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0

@object-ui/core@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0

@object-ui/fields@11.5.0

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0
    • @object-ui/providers@11.5.0

@object-ui/layout@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/mobile@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0

@object-ui/permissions@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0

@object-ui/plugin-ai@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-calendar@11.5.0

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/plugin-detail@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0
    • @object-ui/mobile@11.5.0

@object-ui/plugin-charts@11.5.0

Patch Changes

  • fae75e2: Fix two bugs verified still-present after Fix objectui-side follow-ups from Showcase E2E audit (framework#2620) #2254 claimed to resolve them (framework#2620 / framework#2616 Showcase UX pass, tracked in Verification of #2254: B1 (wizard submitBehavior) and D (chart width/labels) still broken #2268):

    • Wizard/form submitBehavior: 'thank-you' allowed duplicate resubmission. Fix objectui-side follow-ups from Showcase E2E audit (framework#2620) #2254 fixed the spec-bridge dropping submitBehavior before it reached the renderer, so the configured toast message started appearing — but WizardForm's last step and ObjectForm's submit handler only ever called toast.success(...) for thank-you/next-record; the form stayed mounted and fully filled with its submit button re-enabled once the request settled, so a second click created a second record. Both components now track a terminal submitted state and, when set, replace the form with a confirmation panel (using the behavior's title/message, which were also never read before) — mirroring the pattern apps/console/src/components/FormPage.tsx already used for its own standalone forms.

    • Command Center-style 3-up chart bands stayed collapsed to ~100-130px, and a dataset-bound chart's measure leaked its raw field name.

      • responsiveStyles (and style) were declared on the page-spec PageComponent bridge input type but never copied onto the SchemaNode in spec-bridge/bridges/page.ts::mapComponent() — so a page author's ADR-0065 layout override (e.g. forcing display: 'grid' on a type: 'flex' band) never reached SchemaRenderer, and the node silently fell back to its default flex layout. Both fields are now mapped through.
      • ObjectChart's dataset-bound fetch path (schema.dataset + ds.queryDataset(...)) discarded the response's fields array (which carries each measure's label, e.g. { name: 'task_count', label: 'Tasks' }) before it ever reached buildChartSeries() — whose fields param already resolves this correctly (see chart-series.test.ts) — so the legend/tooltip always fell back to the raw field name. The fetched fields are now captured and threaded through.
  • Updated dependencies [544d8eb]

  • Updated dependencies [6fffd3d]

  • Updated dependencies [9255686]

  • Updated dependencies [fae75e2]

  • Updated dependencies [1072701]

    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-chatbot@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-dashboard@11.5.0

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-designer@11.5.0

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
  • Updated dependencies [ec9c8ee]
  • Updated dependencies [6c1ad9e]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/plugin-form@11.5.0
    • @object-ui/plugin-grid@11.5.0
    • @object-ui/data-objectstack@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-editor@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-form@11.5.0

Patch Changes

  • fae75e2: Fix two bugs verified still-present after Fix objectui-side follow-ups from Showcase E2E audit (framework#2620) #2254 claimed to resolve them (framework#2620 / framework#2616 Showcase UX pass, tracked in Verification of #2254: B1 (wizard submitBehavior) and D (chart width/labels) still broken #2268):

    • Wizard/form submitBehavior: 'thank-you' allowed duplicate resubmission. Fix objectui-side follow-ups from Showcase E2E audit (framework#2620) #2254 fixed the spec-bridge dropping submitBehavior before it reached the renderer, so the configured toast message started appearing — but WizardForm's last step and ObjectForm's submit handler only ever called toast.success(...) for thank-you/next-record; the form stayed mounted and fully filled with its submit button re-enabled once the request settled, so a second click created a second record. Both components now track a terminal submitted state and, when set, replace the form with a confirmation panel (using the behavior's title/message, which were also never read before) — mirroring the pattern apps/console/src/components/FormPage.tsx already used for its own standalone forms.

    • Command Center-style 3-up chart bands stayed collapsed to ~100-130px, and a dataset-bound chart's measure leaked its raw field name.

      • responsiveStyles (and style) were declared on the page-spec PageComponent bridge input type but never copied onto the SchemaNode in spec-bridge/bridges/page.ts::mapComponent() — so a page author's ADR-0065 layout override (e.g. forcing display: 'grid' on a type: 'flex' band) never reached SchemaRenderer, and the node silently fell back to its default flex layout. Both fields are now mapped through.
      • ObjectChart's dataset-bound fetch path (schema.dataset + ds.queryDataset(...)) discarded the response's fields array (which carries each measure's label, e.g. { name: 'task_count', label: 'Tasks' }) before it ever reached buildChartSeries() — whose fields param already resolves this correctly (see chart-series.test.ts) — so the legend/tooltip always fell back to the raw field name. The fetched fields are now captured and threaded through.
  • ec9c8ee: Fix master-detail record create: stop double success toast + localize the Cancel button.

    Objects with inline subforms (master-detail, e.g. a Lead with product line items)
    render MasterDetailForm inside ModalForm/DrawerForm instead of the plain
    footer, which exposed two mismatches with the host contract:

    • Double success toast. Flat ObjectForm delegates confirmation to the host
      when an onSuccess is supplied (skips its own default toast), but
      MasterDetailForm.handleSaved ALWAYS toasted Created/Saved AND ran
      onSuccess. In the console the host's onSuccess chains into the crud_success
      handler, which toasts a localized message — so create fired both Created and
      e.g. 线索创建成功. handleSaved now only toasts as a fallback when no host
      onSuccess is provided, matching the ObjectForm contract; saves without a host
      handler stay non-silent.

    • Hardcoded English Cancel. The master-detail action bar wrote Cancel as a
      literal and accepted no cancelText, so the button stayed English while the
      submit button was localized (submitText was already forwarded).
      MasterDetailForm now takes cancelText, and ModalForm/DrawerForm/ObjectForm
      forward the host's localized label down the subforms branch.

    Adds regression tests: create with a host onSuccess fires no built-in toast (no
    double-confirm), and the Cancel button renders the host-supplied cancelText.

  • 6c1ad9e: Record task flows open as derived overlays with lossless return (framework#2604, extends framework#2578).

    • Create/Edit never route — the global record form is URL-driven (?form=new / ?form=<id>): browser Back closes the overlay with the origin (list scroll/filters, detail state) intact; field-heavy objects derive a full-screen modal (modalSize:'full') via the new deriveRecordFlowSurface mirror in plugin-view, light ones keep the auto-sized modal. editMode:'page' opt-in unchanged.
    • Save invariantedit never moves you (origin refetches in place); create lands on the new record's detail on its derived surface (drawer over the still-intact list for light objects, detail route for heavy), with replace:true so Back skips the transient form entry.
    • Subtable child create/edit = overlay over the parent detail, never a route — related-list New/Edit push ?form=…&formObject=<child>&formLink=<fk>:<parentId>; the one global overlay pre-links the parent (refresh-safe), sizes to the CHILD object, and on save stays on the parent while only the child's related lists refetch. ModalForm now forwards initialValues into its master-detail (subforms) branch so pre-links survive for children with inline line items.
  • Updated dependencies [544d8eb]

  • Updated dependencies [6fffd3d]

  • Updated dependencies [9255686]

  • Updated dependencies [fae75e2]

  • Updated dependencies [1072701]

    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0
    • @object-ui/permissions@11.5.0

@object-ui/plugin-gantt@11.5.0

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/plugin-detail@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-kanban@11.5.0

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/plugin-detail@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-map@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-markdown@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-report@11.5.0

Patch Changes

  • Updated dependencies [544d8eb]
  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/i18n@11.5.0
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/plugin-grid@11.5.0
    • @object-ui/fields@11.5.0
    • @object-ui/core@11.5.0

@object-ui/plugin-timeline@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0
    • @object-ui/mobile@11.5.0

@object-ui/plugin-tree@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@object-ui/providers@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0

@object-ui/runner@11.5.0

Patch Changes

  • Updated dependencies [6fffd3d]
  • Updated dependencies [9255686]
  • Updated dependencies [fae75e2]
  • Updated dependencies [1072701]
    • @object-ui/react@11.5.0
    • @object-ui/components@11.5.0
    • @object-ui/types@11.5.0
    • @object-ui/plugin-charts@11.5.0
    • @object-ui/plugin-kanban@11.5.0
    • @object-ui/core@11.5.0

@object-ui/tenant@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0

@object-ui/create-plugin@11.5.0

@object-ui/plugin-list@11.5.0

@object-ui/react-runtime@11.5.0

@object-ui/sdui-parser@11.5.0

object-ui@11.5.0

Patch Changes

  • Updated dependencies [9255686]
  • Updated dependencies [1072701]
    • @object-ui/types@11.5.0
    • @object-ui/core@11.5.0

@vercel

vercel Bot commented Jul 5, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Jul 5, 2026 10:06am

Request Review

@os-zhuang
os-zhuang merged commit 37e5b2b into main Jul 5, 2026
2 checks passed
@os-zhuang
os-zhuang deleted the changeset-release/main branch July 5, 2026 10:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant