From 13e33c87e63f8e03ad44e6cca0243f0ed3668cde Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2026 10:56:11 +0000
Subject: [PATCH] chore: release packages
---
.changeset/action-modal-transport.md | 7 -
.changeset/action-result-dialog.md | 50 ---
.changeset/adr-0032-condition-validation.md | 12 -
.changeset/adr-0033-draft-discoverability.md | 11 -
.changeset/adr-0033-phase-b-draft-review.md | 21 -
.changeset/adr-0033-publish-app-button.md | 7 -
.changeset/adr-0034-objectview-seam.md | 5 -
.../adr-0034-runtime-persistence-seam.md | 5 -
.changeset/ai-workspace-page-polish.md | 5 -
.changeset/app-hidden-shell-wiring.md | 14 -
.changeset/bell-inbox-message-cutover.md | 31 --
.changeset/block-config-complete.md | 5 -
.changeset/block-config-elements.md | 5 -
.changeset/block-config-expand.md | 5 -
.changeset/block-config-pickers.md | 5 -
.changeset/chat-window-flow-polish.md | 6 -
.changeset/core-shell-i18n-polish.md | 6 -
.../data-objectstack-listviews-form-family.md | 17 -
.changeset/external-datasource-studio.md | 58 ---
.changeset/flow-designer-visual-polish.md | 36 --
.../flow-empty-start-and-edge-insert.md | 20 -
.changeset/flow-palette-grouped.md | 23 -
.changeset/flow-runner-screen-flows.md | 22 -
.changeset/gate-runtime-editors-admin.md | 5 -
.changeset/grid-reference-cell-render.md | 20 -
.changeset/i18n-language-switch.md | 30 --
.changeset/line-items-lookup-cells.md | 5 -
.changeset/master-detail-atomic-batch.md | 24 --
.changeset/master-detail-edit-atomic.md | 25 --
.changeset/master-detail-subform.md | 11 -
.changeset/master-detail-submit-feedback.md | 15 -
.../master-detail-submit-reliability.md | 22 -
.../notifications-sdk-receipt-cutover.md | 38 --
.changeset/package-discard-delete-buttons.md | 12 -
.changeset/page-block-config-panels.md | 5 -
.changeset/page-edit-in-studio.md | 5 -
.changeset/page-editor-nested.md | 5 -
.changeset/page-editor-slotted.md | 5 -
.changeset/perf-detail-rail-poller-fanout.md | 24 --
.changeset/runtime-dashboard-editor-studio.md | 5 -
.changeset/runtime-report-editor-studio.md | 5 -
.../runtime-view-editor-studio-inspector.md | 6 -
.changeset/runtime-viewkind-form-family.md | 24 --
.changeset/studio-package-scope-home.md | 8 -
.changeset/url-action-cross-origin.md | 12 -
.changeset/view-inspector-i18n.md | 5 -
apps/console/CHANGELOG.md | 2 +
apps/console/package.json | 2 +-
packages/app-shell/CHANGELOG.md | 392 ++++++++++++++++++
packages/app-shell/package.json | 2 +-
packages/auth/CHANGELOG.md | 34 ++
packages/auth/package.json | 2 +-
packages/cli/CHANGELOG.md | 14 +
packages/cli/package.json | 2 +-
packages/collaboration/CHANGELOG.md | 7 +
packages/collaboration/package.json | 2 +-
packages/components/CHANGELOG.md | 39 ++
packages/components/package.json | 2 +-
packages/core/CHANGELOG.md | 57 +++
packages/core/package.json | 2 +-
packages/create-plugin/CHANGELOG.md | 2 +
packages/create-plugin/package.json | 2 +-
packages/data-objectstack/CHANGELOG.md | 48 +++
packages/data-objectstack/package.json | 2 +-
packages/fields/CHANGELOG.md | 60 +++
packages/fields/package.json | 2 +-
packages/i18n/CHANGELOG.md | 36 ++
packages/i18n/package.json | 2 +-
packages/layout/CHANGELOG.md | 15 +
packages/layout/package.json | 2 +-
packages/mobile/CHANGELOG.md | 7 +
packages/mobile/package.json | 2 +-
packages/permissions/CHANGELOG.md | 7 +
packages/permissions/package.json | 2 +-
packages/plugin-ai/CHANGELOG.md | 15 +
packages/plugin-ai/package.json | 2 +-
packages/plugin-calendar/CHANGELOG.md | 26 ++
packages/plugin-calendar/package.json | 2 +-
packages/plugin-charts/CHANGELOG.md | 19 +
packages/plugin-charts/package.json | 2 +-
packages/plugin-chatbot/CHANGELOG.md | 33 ++
packages/plugin-chatbot/package.json | 2 +-
packages/plugin-dashboard/CHANGELOG.md | 23 +
packages/plugin-dashboard/package.json | 2 +-
packages/plugin-designer/CHANGELOG.md | 29 ++
packages/plugin-designer/package.json | 2 +-
packages/plugin-detail/CHANGELOG.md | 23 +
packages/plugin-detail/package.json | 2 +-
packages/plugin-editor/CHANGELOG.md | 15 +
packages/plugin-editor/package.json | 2 +-
packages/plugin-form/CHANGELOG.md | 90 ++++
packages/plugin-form/package.json | 2 +-
packages/plugin-gantt/CHANGELOG.md | 21 +
packages/plugin-gantt/package.json | 2 +-
packages/plugin-grid/CHANGELOG.md | 20 +
packages/plugin-grid/package.json | 2 +-
packages/plugin-kanban/CHANGELOG.md | 25 ++
packages/plugin-kanban/package.json | 2 +-
packages/plugin-list/CHANGELOG.md | 2 +
packages/plugin-list/package.json | 2 +-
packages/plugin-map/CHANGELOG.md | 15 +
packages/plugin-map/package.json | 2 +-
packages/plugin-markdown/CHANGELOG.md | 15 +
packages/plugin-markdown/package.json | 2 +-
packages/plugin-report/CHANGELOG.md | 24 ++
packages/plugin-report/package.json | 2 +-
packages/plugin-timeline/CHANGELOG.md | 16 +
packages/plugin-timeline/package.json | 2 +-
packages/plugin-view/CHANGELOG.md | 23 +
packages/plugin-view/package.json | 2 +-
packages/plugin-workflow/CHANGELOG.md | 15 +
packages/plugin-workflow/package.json | 2 +-
packages/providers/CHANGELOG.md | 7 +
packages/providers/package.json | 2 +-
packages/react/CHANGELOG.md | 94 +++++
packages/react/package.json | 2 +-
packages/runner/CHANGELOG.md | 17 +
packages/runner/package.json | 2 +-
packages/tenant/CHANGELOG.md | 7 +
packages/tenant/package.json | 2 +-
packages/types/CHANGELOG.md | 20 +
packages/types/package.json | 2 +-
packages/vscode-extension/CHANGELOG.md | 10 +
packages/vscode-extension/package.json | 2 +-
124 files changed, 1363 insertions(+), 731 deletions(-)
delete mode 100644 .changeset/action-modal-transport.md
delete mode 100644 .changeset/action-result-dialog.md
delete mode 100644 .changeset/adr-0032-condition-validation.md
delete mode 100644 .changeset/adr-0033-draft-discoverability.md
delete mode 100644 .changeset/adr-0033-phase-b-draft-review.md
delete mode 100644 .changeset/adr-0033-publish-app-button.md
delete mode 100644 .changeset/adr-0034-objectview-seam.md
delete mode 100644 .changeset/adr-0034-runtime-persistence-seam.md
delete mode 100644 .changeset/ai-workspace-page-polish.md
delete mode 100644 .changeset/app-hidden-shell-wiring.md
delete mode 100644 .changeset/bell-inbox-message-cutover.md
delete mode 100644 .changeset/block-config-complete.md
delete mode 100644 .changeset/block-config-elements.md
delete mode 100644 .changeset/block-config-expand.md
delete mode 100644 .changeset/block-config-pickers.md
delete mode 100644 .changeset/chat-window-flow-polish.md
delete mode 100644 .changeset/core-shell-i18n-polish.md
delete mode 100644 .changeset/data-objectstack-listviews-form-family.md
delete mode 100644 .changeset/external-datasource-studio.md
delete mode 100644 .changeset/flow-designer-visual-polish.md
delete mode 100644 .changeset/flow-empty-start-and-edge-insert.md
delete mode 100644 .changeset/flow-palette-grouped.md
delete mode 100644 .changeset/flow-runner-screen-flows.md
delete mode 100644 .changeset/gate-runtime-editors-admin.md
delete mode 100644 .changeset/grid-reference-cell-render.md
delete mode 100644 .changeset/i18n-language-switch.md
delete mode 100644 .changeset/line-items-lookup-cells.md
delete mode 100644 .changeset/master-detail-atomic-batch.md
delete mode 100644 .changeset/master-detail-edit-atomic.md
delete mode 100644 .changeset/master-detail-subform.md
delete mode 100644 .changeset/master-detail-submit-feedback.md
delete mode 100644 .changeset/master-detail-submit-reliability.md
delete mode 100644 .changeset/notifications-sdk-receipt-cutover.md
delete mode 100644 .changeset/package-discard-delete-buttons.md
delete mode 100644 .changeset/page-block-config-panels.md
delete mode 100644 .changeset/page-edit-in-studio.md
delete mode 100644 .changeset/page-editor-nested.md
delete mode 100644 .changeset/page-editor-slotted.md
delete mode 100644 .changeset/perf-detail-rail-poller-fanout.md
delete mode 100644 .changeset/runtime-dashboard-editor-studio.md
delete mode 100644 .changeset/runtime-report-editor-studio.md
delete mode 100644 .changeset/runtime-view-editor-studio-inspector.md
delete mode 100644 .changeset/runtime-viewkind-form-family.md
delete mode 100644 .changeset/studio-package-scope-home.md
delete mode 100644 .changeset/url-action-cross-origin.md
delete mode 100644 .changeset/view-inspector-i18n.md
diff --git a/.changeset/action-modal-transport.md b/.changeset/action-modal-transport.md
deleted file mode 100644
index 1acc953d7..000000000
--- a/.changeset/action-modal-transport.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-"@object-ui/app-shell": minor
----
-
-Action modal transport with placement (SDUI opt #2).
-
-`useActionModal` provides a reusable `onModal` handler that renders an action's modal envelope in the right container by `placement`: `center` (Dialog), `side` (Sheet), `bottom` (Drawer), `fullscreen`. `content` is an arbitrary SchemaNode rendered via `SchemaRenderer`, so a modal action can open any page/form/list; string targets / `{objectName, mode}` keep opening a `ModalForm`. Wired into `RecordDetailView` so `type:'modal'` actions open client-side (previously routed to a server POST).
diff --git a/.changeset/action-result-dialog.md b/.changeset/action-result-dialog.md
deleted file mode 100644
index 332803257..000000000
--- a/.changeset/action-result-dialog.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-'@object-ui/core': minor
-'@object-ui/react': minor
-'@object-ui/app-shell': minor
----
-
-Add resultDialog + target interpolation for one-shot action reveals
-
-Some platform actions return values the user MUST copy now because the
-server will not surface them again — 2FA TOTP URI + backup codes, freshly
-minted OAuth client_secret, regenerated recovery codes. Previously these
-had to ship as bespoke pages in `apps/account` because actions only
-emitted a fire-and-forget toast.
-
-**`@object-ui/core` — ActionRunner**
-
-- New `ActionDef.resultDialog: ResultDialogSpec` field. When set on a
- successful action, the runner suppresses the `successMessage` toast and
- awaits the registered `ResultDialogHandler` instead. Missing handler is
- non-fatal (logs a warning); rejected handler is treated as acknowledged.
-- New `setResultDialogHandler(handler)` setter.
-- New types: `ResultDialogSpec`, `ResultDialogFieldSpec`,
- `ResultDialogHandler`.
-- `executeUrl` and `executeAPI` now run `${param.X}` and `${ctx.X}`
- interpolation against `target` before fetching / navigating. Values are
- `encodeURIComponent`'d, missing keys resolve to empty string. `ctx`
- exposes `origin`, `user`, `org`, `recordId` by default; consumers can
- inject more via `context.ctx`.
-
-**`@object-ui/react`**
-
-- `ActionProvider` and `useActionRunner` both gained an `onResultDialog`
- option that wires straight through to the runner.
-
-**`@object-ui/app-shell`**
-
-- New `ActionResultDialog` component — promise-based, blocks click-outside
- and Escape (the user MUST click acknowledge), renders five field
- formats: `qrcode` (client-side via the `qrcode` package — never sent
- off-device, so 2FA URIs stay secret), `code-list`, `secret`, `text`,
- `json`. Falls back to `json` when a value's shape doesn't match its
- declared format.
-- `ObjectView` and `RecordDetailView` install the handler and mount the
- dialog automatically, so any action with `resultDialog` declared in
- metadata now works without code changes.
-- New dependency: `qrcode@^1.5.x` for client-side QR rendering.
-
-Pairs with the framework-side `Action.resultDialog` schema added in
-`@objectstack/spec` and the `sys_two_factor` / `sys_oauth_application` /
-`sys_account` updates in `@objectstack/platform-objects`.
diff --git a/.changeset/adr-0032-condition-validation.md b/.changeset/adr-0032-condition-validation.md
deleted file mode 100644
index 90c160887..000000000
--- a/.changeset/adr-0032-condition-validation.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-"@object-ui/app-shell": minor
----
-
-ADR-0032: author-time condition validation in the flow inspectors.
-
-Flow node and edge condition editors now flag a malformed predicate **as you
-type** — most importantly the `{record.x}` template-brace-in-CEL mistake (#1491),
-which `{…}` parses as a CEL map literal and silently fails — with the same
-corrective message the build and the `validate_expression` agent tool emit.
-Client-side check for now (no CEL parser in the browser); swaps to
-`@objectstack/formula`'s shared `validateExpression` once it is published.
diff --git a/.changeset/adr-0033-draft-discoverability.md b/.changeset/adr-0033-draft-discoverability.md
deleted file mode 100644
index a7ea55b65..000000000
--- a/.changeset/adr-0033-draft-discoverability.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-'@object-ui/data-objectstack': minor
-'@object-ui/app-shell': minor
----
-
-feat(studio): surface pending drafts on the package detail (ADR-0033)
-
-After an AI builds an app, its objects/views land as drafts bound to the app package — but Studio's active-only browsers hid them, so the package looked empty and there was no obvious way to find what to review/publish.
-
-- `MetadataClient.listDrafts({ packageId?, type? })` calls the new `GET /api/v1/meta/_drafts` endpoint, returning pending draft headers (with `packageId`).
-- The package detail sheet (PackagesPage) now shows a **Pending changes** section listing each drafted item, each linking to the existing per-item review/diff (`?review=1`) so the user can publish it. A just-built app package is no longer shown as empty.
diff --git a/.changeset/adr-0033-phase-b-draft-review.md b/.changeset/adr-0033-phase-b-draft-review.md
deleted file mode 100644
index d6e97e532..000000000
--- a/.changeset/adr-0033-phase-b-draft-review.md
+++ /dev/null
@@ -1,21 +0,0 @@
----
-'@object-ui/plugin-chatbot': minor
-'@object-ui/app-shell': minor
----
-
-feat(studio): ADR-0033 Phase B — draft review surface (chat → designer → generic diff)
-
-Closes the AI metadata-authoring loop in Studio. The framework (ADR-0033 Phases A + C) makes the assistant stage every change as a DRAFT; this lets a human see and review those drafts.
-
-**`@object-ui/plugin-chatbot`**
-
-- `mapMessages` now detects the framework's draft envelopes — `{ status:'drafted', type, name, … }` (single) and `{ status:'drafted', drafted:[{type,name}] }` (apply_blueprint batch) — and lifts the reviewable targets onto `ChatToolInvocation.draftReview` (mirrors the existing HITL `pendingActionId` path; the Vercel `{type:'text',value}` wrapper is peeled). `blueprint_proposed` is intentionally not surfaced (no draft yet).
-- `ChatbotEnhanced` renders a **"Review N change(s)"** button on drafted tool results, driven by a new `onReviewDraft` callback prop.
-
-**`@object-ui/app-shell`**
-
-- `assistantBus` gains a review channel (`requestReview` / `requestAssistantReview`); `ConsoleFloatingChatbot` wires the chat button to it; a small navigator inside `AppContent` (which knows the app base) routes to `/apps/:appName/metadata/:type/:name?review=1`.
-- `ResourceEditPage` honours `?review=1`: it force-reloads the pending draft (covers the case where the AI drafted the item after the page mounted) and opens the review/diff.
-- New **`DraftReviewPanel`** — a generic, type-agnostic draft↔published structural diff (added / changed / removed by key), reusing `LayeredDiff`'s `computeDiffRows`. It gives **every** metadata type (view, dashboard, flow, …) a real "what will publishing change" review, surfaced as a toolbar affordance + sheet whenever a draft exists. The object designer keeps its richer per-field review.
-
-Nothing is published by any of this — the human still clicks Publish.
diff --git a/.changeset/adr-0033-publish-app-button.md b/.changeset/adr-0033-publish-app-button.md
deleted file mode 100644
index 3444ee6dc..000000000
--- a/.changeset/adr-0033-publish-app-button.md
+++ /dev/null
@@ -1,7 +0,0 @@
----
-'@object-ui/app-shell': minor
----
-
-feat(studio): add "Publish app" button to publish all package drafts (ADR-0033)
-
-The package detail's Pending changes section gains a primary **Publish app (N)** button that calls `POST /api/v1/packages/:id/publish-drafts` to promote every drafted item of the app in one shot, then refreshes the pending list. Complements the per-item review/publish links — so after an AI builds an app you can review item-by-item or publish the whole thing at once.
diff --git a/.changeset/adr-0034-objectview-seam.md b/.changeset/adr-0034-objectview-seam.md
deleted file mode 100644
index cc58f65c0..000000000
--- a/.changeset/adr-0034-objectview-seam.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": patch
----
-
-ADR-0034 step 2: route ObjectView's view-config save through the runtime persistence seam, completing the seam's coverage of all three runtime editors (view/report/dashboard). Corrects the seam's `view` branch to mirror ObjectView's real update path (`dataSource.updateViewConfig(...)`, the ADR-0005 overlay API) rather than a raw `sys_view` write. Behaviour is unchanged while the `VITE_RUNTIME_EDIT_VIA_META` flag is off; flag on routes the view update to the studio `/meta` draft. The view CREATE path (`createView` + default-column/kanban/gallery massaging) and the draft/publish UI remain deferred.
diff --git a/.changeset/adr-0034-runtime-persistence-seam.md b/.changeset/adr-0034-runtime-persistence-seam.md
deleted file mode 100644
index 21777d126..000000000
--- a/.changeset/adr-0034-runtime-persistence-seam.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": patch
----
-
-ADR-0034 step 1: introduce a flag-gated runtime metadata persistence seam. `persistRuntimeMetadata` / `publishRuntimeMetadata` centralise where the runtime view/report/dashboard editors save. Behind the `VITE_RUNTIME_EDIT_VIA_META` flag (default **off**) they reproduce today's `sys_*` writes exactly (zero behaviour change); flag **on** routes to the studio `/meta` per-item draft/publish model (`MetadataClient.save(..., { mode: 'draft' })` + `publish`). ReportView and DashboardView now save through the seam; ObjectView (view) and the draft/publish UI are deliberately deferred. No `sys_*` table is removed and no data is migrated. Also adds the finalized ADR-0034.
diff --git a/.changeset/ai-workspace-page-polish.md b/.changeset/ai-workspace-page-polish.md
deleted file mode 100644
index f70b61843..000000000
--- a/.changeset/ai-workspace-page-polish.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": patch
----
-
-Polish the full-page AI workspace with a responsive conversation drawer, clearer page context, constrained chat width, and accessible conversation row actions.
diff --git a/.changeset/app-hidden-shell-wiring.md b/.changeset/app-hidden-shell-wiring.md
deleted file mode 100644
index 9f7cd1cca..000000000
--- a/.changeset/app-hidden-shell-wiring.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-'@object-ui/app-shell': minor
----
-
-**Wire `App.hidden` shell hint — App Switcher + avatar dropdown**
-
-Honour the new `App.hidden` field from `@objectstack/spec/ui`:
-
-- **`AppSwitcher.tsx`** — filter `app.hidden === true` out of the top-bar app dropdown so personal-settings-style apps don't appear next to business apps.
-- **`AppHeader.tsx`** — render hidden apps as entries in the avatar / user dropdown (immediately after the hardcoded Profile / Settings items). Uses the app's `icon` + `label` via the existing `getIcon` + `appLabel` utilities, and navigates to `/apps/${app.name}`.
-
-This is the front-end side of the Account-app split: the `account` app shipped by `@objectstack/platform-objects` declares `hidden: true` and now surfaces through the avatar menu — same pattern as GitHub Settings, Google account chip, and Salesforce Personal Settings.
-
-No new dependencies; pure metadata-driven wiring.
diff --git a/.changeset/bell-inbox-message-cutover.md b/.changeset/bell-inbox-message-cutover.md
deleted file mode 100644
index 08758fb2d..000000000
--- a/.changeset/bell-inbox-message-cutover.md
+++ /dev/null
@@ -1,31 +0,0 @@
----
-'@object-ui/app-shell': minor
----
-
-Repoint the Console bell to `sys_inbox_message` + `sys_notification_receipt` (ADR-0030)
-
-The notification bell read the legacy `sys_notification` object's
-`recipient_id`/`is_read`/`title`/`body` columns. ADR-0030 re-modeled
-`sys_notification` into the L2 *event* (no recipient/read-state), so the bell
-returned nothing — every notification the new pipeline produced was invisible.
-
-The bell now reads the L5 in-app materialization instead:
-
-- **List**: `sys_inbox_message` filtered by `user_id` (the `mine` scope), 20
- most-recent, ordered by `created_at`.
-- **Read-state**: joins `sys_notification_receipt` (filtered by `user_id` +
- `channel:'inbox'`). A message is unread until its event has a
- `read`/`clicked`/`dismissed` receipt; the unread count drives the badge.
-- **Mark-read**: `UPDATE`s the existing `delivered` receipt to `read`
- (keyed `(notification_id, user_id, channel)`), inserting only as a fallback
- when no receipt exists. Replaces the old `sys_notification.is_read` write.
-- **Navigation**: follows the materialization's `action_url` (absolute,
- `/apps/...`, or app-relative `/{object}/{id}`), falling back to the legacy
- `source_object`/`source_id` pointer.
-- **"View all"**: routes to `/apps/setup/sys_inbox_message?view=mine`.
-
-Pairs with the framework ADR-0030 pipeline (`@objectstack/service-messaging`).
-Verified in-browser (showcase Console): a materialized inbox message + its
-`delivered` receipt lit the bell badge; the popover rendered the row;
-"mark all read" flipped the receipt to `read` in place (no duplicate) and
-cleared the badge.
diff --git a/.changeset/block-config-complete.md b/.changeset/block-config-complete.md
deleted file mode 100644
index d6be4d1ee..000000000
--- a/.changeset/block-config-complete.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": minor
----
-
-Complete the page-editor block configuration and prune shell-only blocks. Adds configurable property panels for the remaining content blocks with authorable properties — `page:accordion`, `record:path`, `record:quick_actions`, `ai:chat_window`, `ai:input` — so every page-content block in the palette is configurable in the UI (pure containers like `page:section` / `element:divider` correctly have no panel). Removes shell-singleton blocks (`app:launcher`, `global:notifications`, `user:profile`) from the page block palette — those are provided by the app shell, not authored as page content.
diff --git a/.changeset/block-config-elements.md b/.changeset/block-config-elements.md
deleted file mode 100644
index 27980c919..000000000
--- a/.changeset/block-config-elements.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": minor
----
-
-Align the page-editor element palette with reality. Adds the real lightweight-list primitives — `element:definition-list` (compact key/value `
`) and `element:repeater` (data-bound, chrome-free list) — to the block palette with full config panels (object/field pickers for the repeater), and removes three palette entries that have no renderer (`element:form`, `element:filter`, `element:record_picker`) so the palette only offers blocks that actually render.
diff --git a/.changeset/block-config-expand.md b/.changeset/block-config-expand.md
deleted file mode 100644
index b34de157d..000000000
--- a/.changeset/block-config-expand.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": minor
----
-
-Expand page-editor block configuration. Adds configurable property panels for more blocks (`element:number`, `element:button`, `record:alert`) and introduces array-valued property editors — a `string-list` editor (e.g. `record:highlights` fields) and an add/remove `array` editor (e.g. `page:tabs` items, `record:details` sections) — so these blocks are configurable in the UI instead of only via raw JSON.
diff --git a/.changeset/block-config-pickers.md b/.changeset/block-config-pickers.md
deleted file mode 100644
index 093ade474..000000000
--- a/.changeset/block-config-pickers.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": minor
----
-
-Schema-driven object/field pickers in the page-editor block inspector. Data-reference block properties are now dropdowns populated from the live metadata instead of free-text: an object picker (e.g. `record:related_list` object, `element:number` object) and cascading field pickers that list the chosen object's actual fields (e.g. `record:related_list` relationship field, `element:number` field, `record:path` status field, `record:highlights`/`record:details` field lists). Resolves the object from the record page's bound object or a sibling block property; degrades gracefully to a text input when the metadata can't be fetched.
diff --git a/.changeset/chat-window-flow-polish.md b/.changeset/chat-window-flow-polish.md
deleted file mode 100644
index 5231f83fa..000000000
--- a/.changeset/chat-window-flow-polish.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@object-ui/plugin-chatbot": patch
-"@object-ui/app-shell": patch
----
-
-Improve the floating chatbot flow with responsive panel bounds, safer FAB placement, inline responding and stop states, and clearer retryable error feedback.
diff --git a/.changeset/core-shell-i18n-polish.md b/.changeset/core-shell-i18n-polish.md
deleted file mode 100644
index 075877507..000000000
--- a/.changeset/core-shell-i18n-polish.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-"@object-ui/app-shell": patch
-"@object-ui/i18n": patch
----
-
-Localize AI workspace, shell navigation, startup, connection, toast, and chatbot affordance text across core console screens.
diff --git a/.changeset/data-objectstack-listviews-form-family.md b/.changeset/data-objectstack-listviews-form-family.md
deleted file mode 100644
index a9f0ecd52..000000000
--- a/.changeset/data-objectstack-listviews-form-family.md
+++ /dev/null
@@ -1,17 +0,0 @@
----
-'@object-ui/data-objectstack': patch
----
-
-fix(datasource): exclude form-family views from `listViews()`
-
-`OBJECTSTACKDataSource.listViews(objectName)` feeds the object list-view
-switcher (`ObjectView` → `ViewTabBar`), but returned **every** view bound to
-the object — including form-family ones. With the backend now exposing each
-view as an independent **ViewItem** carrying a `viewKind` discriminant
-(ADR-0017, "Object has-many View"), a form view such as `crm_activity.default`
-(expanded from `formViews.default`) leaked in as a spurious switcher tab and,
-when opened, fell back to the default grid.
-
-`listViews()` now filters out `viewKind` `form`/`detail` items so only
-list-family views reach the switcher. Bare view specs without a `viewKind`
-(legacy artifacts and user-saved views) are still treated as list views.
diff --git a/.changeset/external-datasource-studio.md b/.changeset/external-datasource-studio.md
deleted file mode 100644
index 88f3b66e7..000000000
--- a/.changeset/external-datasource-studio.md
+++ /dev/null
@@ -1,58 +0,0 @@
----
-'@object-ui/app-shell': minor
----
-
-Add the External Datasource Federation Studio surface (ADR-0015 P5)
-
-Federated datasources (`schemaMode !== 'managed'`) now get a dedicated
-panel inside their Studio Preview tab, so connecting a mature external
-database and registering its tables as ObjectStack objects is a
-point-and-click flow instead of a CLI-only one. The panel pairs with the
-framework backend shipped in objectstack-ai/framework#1390
-(`registerExternalDatasourceRoutes` → `/api/v1/datasources/:name/external/*`).
-
-ObjectStack is metadata-driven: `datasource` is a metadata type, so it is
-browsed and edited through the standard metadata-admin engine
-(`metadata:resource`) reached from the Studio app's left-side menu —
-**not** a hand-written page. The Studio app (framework
-`packages/platform-objects/src/apps/studio.app.ts`, Integration group)
-gains a `Datasources` nav item pointing at
-`metadata:resource?type=datasource`; the federation panel is contributed
-to that standard surface via `registerMetadataPreview('datasource', …)`.
-
-**`@object-ui/app-shell` — `views/metadata-admin/external/`**
-
-- `api.ts` — a thin, typed REST client over the four federation routes
- (`tables`, `tables/:remote/draft`, `refresh-catalog`, `validate`) plus an
- `importObjectDraft` helper that PUTs a generated draft to `/meta/object`.
- All calls go through `createAuthenticatedFetch()` (Bearer + `X-Tenant-ID`
- + `Accept-Language`). A `503 external_service_unavailable` reply is mapped
- to a typed `ExternalServiceUnavailableError` so the UI shows a friendly
- "federation not enabled on this server" hint. Contract types are inlined
- (they were added in framework 7.3; objectui pins `@objectstack/spec`
- `^7.2.1`).
-- `SchemaBrowser` — lists remote tables (allowedSchemas-filtered server-side)
- with a text filter, on-demand Refresh (never a timer — warehouse
- introspection is expensive), and a per-table Import action.
-- `ImportObjectDialog` — generates an Object draft, surfaces the
- type-compat matrix's `// REVIEW:` columns and the generated `*.object.ts`
- source, then imports it as a real object. Never mutates the remote schema.
-- `ValidationPanel` — runs validation on demand and renders per-object
- structured schema diffs (missing column, type mismatch, …). Doubles as an
- on-demand drift view.
-- `ExternalDatasourcePanel` — Tables / Validation tabs plus a header strip
- with "Refresh catalog" and the snapshot timestamp.
-- `DatasourcePreview` — registered via `registerMetadataPreview('datasource', …)`,
- it renders the panel automatically inside the standard resource edit
- page's Preview tab when the saved datasource is federated
- (`schemaMode !== 'managed'`), keyed off the item name. This is the only
- wiring needed: no bespoke page, no extra route, no `@object-ui/app-shell`
- surface to re-export — the metadata-admin engine + left-side nav own the
- navigation. Federated datasources are read-only code artifacts (the
- `datasource` type forbids runtime create), which the standard list view
- already reflects (no "Create" button).
-
-Out of scope (blocked on backend follow-ups): the connection wizard
-(driver/credentials/secrets — belongs in System Settings) and a push-based
-drift inbox (needs an event feed). The framework exposes no
-test-connection, secrets, or drift-feed routes yet.
diff --git a/.changeset/flow-designer-visual-polish.md b/.changeset/flow-designer-visual-polish.md
deleted file mode 100644
index 15b427a8f..000000000
--- a/.changeset/flow-designer-visual-polish.md
+++ /dev/null
@@ -1,36 +0,0 @@
----
-'@object-ui/app-shell': minor
----
-
-Polish the Studio flow-designer canvas visuals
-
-A refinement pass over the metadata-admin flow designer (`FlowCanvas` +
-`flow-canvas-parts`) — purely presentational, no behavioral or API changes,
-theme-aware (light/dark), and still dependency-free.
-
-- **Node cards**: the flat 3px left-accent stripe is replaced by a tinted,
- color-coded **icon chip** (the card's primary category cue), with a bolder
- label, refined uppercase type caption, layered hover elevation
- (`-translate-y-0.5` + soft shadow), and clearer selected / run-state rings.
- Per-category `chip` tone tokens (soft bg + inset ring) added alongside the
- existing icon/accent/label tones. Added distinct tones for `loop` (sky),
- `screen`/`user_task` (pink) and `assignment` (purple) — previously they fell
- back to the generic slate "task" tone, so every node type now reads as a
- distinct color in the canvas.
-- **Readable labels**: node width 188→240 and the per-node summary moved from a
- right-hand column onto a second line, so the label now gets the **full card
- width** (it was badly truncated — "Manager Re…", "Budget Ab…"). A native title
- tooltip surfaces the full text on the rare remaining truncation.
-- **No overlap on add**: adding a connected node no longer pins it directly below
- its parent (which stacked every sibling on the same spot) — it's left to the
- layered auto-layout, which slots it beside its siblings.
-- **Canvas surface**: the dot grid now tracks pan **and** zoom (it moves with
- the diagram instead of floating behind a static texture), plus a subtle inset
- vignette for depth.
-- **Edges**: rounded line caps, slightly stronger default stroke, and
- pill-shaped (rounded-full, frosted) branch/condition labels.
-- **Toolbar + add-node palette**: frosted, rounded controls with a primary
- hover affordance; the palette gains an "Add node" header and matching tinted
- icon chips per row.
-
-Verified in-browser (Studio → flow → designer) in both light and dark themes.
diff --git a/.changeset/flow-empty-start-and-edge-insert.md b/.changeset/flow-empty-start-and-edge-insert.md
deleted file mode 100644
index f973bada6..000000000
--- a/.changeset/flow-empty-start-and-edge-insert.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-'@object-ui/app-shell': patch
----
-
-Flow designer: start a new flow with a trigger, and stop the edge "+" overlapping branch labels
-
-Two more dogfooding fixes for the Studio flow designer:
-
-- **Empty flow → Start node.** An empty editable flow's "Add node" inserted a
- generic `task` node; it now seeds a `start` (trigger) node — the canonical
- entry point every flow needs — so the canvas opens on the trigger and the
- author builds forward from there.
-- **Edge insert handle no longer collides with the branch label.** The "insert
- node" `+` button and the branch/condition label pill were both centered on the
- edge midpoint, so on a labeled edge (`approve`, `if …`) the `+` sat on top of
- the label. The `+` now slides to the right of the label when one is present
- (unlabeled edges keep the centered `+`).
-
-Verified in-browser: labeled edges show the label and a clear, separate insert
-handle; `tsc --noEmit` clean.
diff --git a/.changeset/flow-palette-grouped.md b/.changeset/flow-palette-grouped.md
deleted file mode 100644
index 2aa974fa2..000000000
--- a/.changeset/flow-palette-grouped.md
+++ /dev/null
@@ -1,23 +0,0 @@
----
-'@object-ui/app-shell': minor
----
-
-Group the flow add-node palette by category, and offer every node type
-
-The quick-add palette listed 12 node types as a flat list; `assignment`,
-`screen`, `delete_record` and the parallel gateways could only be reached by
-adding a node and switching its type in the inspector. Building flows, that's a
-real friction point.
-
-- **Complete**: the palette now offers Delete record, Set variables
- (assignment), Screen, Parallel split and Parallel join too — so every common
- node type is one click away.
-- **Grouped**: items are organised into **Data / Logic / Human / Integration /
- Flow** sections with headers and dividers, so the (now longer) list stays
- scannable. A new `nodeCategory(type)` helper drives the grouping and gives
- engine-only / plugin-contributed node types a sensible section; `mergePalette`
- preserves a base item's category and infers one for engine-only types.
-
-Verified in-browser: the grouped palette renders all sections with tinted icon
-chips, and the newly-offered types add to the canvas with the correct icon/tone
-and no overlap.
diff --git a/.changeset/flow-runner-screen-flows.md b/.changeset/flow-runner-screen-flows.md
deleted file mode 100644
index 64bf51cbb..000000000
--- a/.changeset/flow-runner-screen-flows.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-'@object-ui/app-shell': minor
----
-
-Add FlowRunner — render & resume interactive screen-flows
-
-A `type: 'flow'` action whose run pauses at a `screen` node now opens a
-`FlowRunner` modal that renders the screen's fields, submits the values to the
-framework resume endpoint (`POST /api/v1/automation/{flow}/runs/{runId}/resume`),
-and advances to the next screen or closes + refreshes on completion. Previously
-such flows launched server-side but the screen was never rendered, so the input
-was never collected.
-
-- New `FlowRunner` component (fields → form → resume loop).
-- `ObjectView` + `RecordDetailView` flow handlers detect a paused-screen launch
- response (`{ status:'paused', runId, screen }`) and open the runner; for
- list_item actions the row's id (`_rowRecord.id`) flows in as the flow's
- `recordId`.
-
-Pairs with the framework screen-flow runtime (`@objectstack/service-automation`
-+ `@objectstack/runtime`). Verified in-browser: showcase task row → "Reassign…"
-→ form → submit → the task is reassigned.
diff --git a/.changeset/gate-runtime-editors-admin.md b/.changeset/gate-runtime-editors-admin.md
deleted file mode 100644
index fe9efcaab..000000000
--- a/.changeset/gate-runtime-editors-admin.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/app-shell": patch
----
-
-Gate the runtime report and dashboard editors behind an admin check. Editing a report or dashboard mutates the **shared** definition (it writes the single `sys_report` / `sys_dashboard` record, not a per-user copy), but the edit buttons were shown to every user — so any viewer could change a report/dashboard for everyone. The "Edit" affordance (and its config panel) is now admin-only, matching ObjectView's existing view-config gate. This is the first step of ADR-0034 (runtime edits are an admin quick-edit of the shared definition).
diff --git a/.changeset/grid-reference-cell-render.md b/.changeset/grid-reference-cell-render.md
deleted file mode 100644
index 6be7661a4..000000000
--- a/.changeset/grid-reference-cell-render.md
+++ /dev/null
@@ -1,20 +0,0 @@
----
-'@object-ui/fields': patch
----
-
-Render reference/lookup cells as labels, not raw JSON
-
-A `lookup` / `master_detail` value can arrive as a JSON-encoded object string —
-e.g. an unresolved external-id reference `{"externalId":"Website Relaunch"}`.
-`LookupCellRenderer` treated the whole JSON string as an opaque id, failed to
-resolve it, and fell through to `String(value)`, leaking raw JSON into the grid
-cell (and detail/kanban surfaces).
-
-- `LookupCellRenderer` now parses a JSON-object-looking string value and renders
- a human label (`name` → `label` → `externalId` → `id`).
-- `coerceToSafeValue` (the shared safe-render helper used by 8 cell renderers)
- gains the same JSON-string parsing, and `externalId` is added to the
- reference-label precedence for plain object values and arrays.
-
-Verified in the browser (showcase task grid: Project column shows "Website
-Relaunch" instead of `{"externalId":"Website Relaunch"}`) and by unit tests.
diff --git a/.changeset/i18n-language-switch.md b/.changeset/i18n-language-switch.md
deleted file mode 100644
index 19ea793ce..000000000
--- a/.changeset/i18n-language-switch.md
+++ /dev/null
@@ -1,30 +0,0 @@
----
-'@object-ui/i18n': minor
-'@object-ui/auth': minor
-'@object-ui/app-shell': patch
----
-
-Relabel metadata-driven UI on a language switch without a page refresh (#1319)
-
-Switching the UI language left server-resolved metadata labels (object/field/
-view labels, action-dialog text) in the old language until a hard refresh,
-because renderers cache those labels by object name and never refetch on a
-language change.
-
-**`@object-ui/auth`** — `createAuthenticatedFetch` now folds the active
-`` into `Accept-Language` on API calls (never clobbering an explicit
-header), so a switch carries the new locale on every subsequent request.
-
-**`@object-ui/app-shell`** — `ConnectedShellInner` drops the adapter's
-locale-blind metadata cache in the render phase and remounts the metadata
-subtree via `key={language}`, so every renderer refetches in the new locale.
-The adapter and its connection sit above the key and are preserved — an in-app
-relabel, not a reconnect.
-
-**`@object-ui/i18n`** — dev-mode missing-key warnings: `createI18n` gains
-`warnMissingKeys` (default on outside production) wiring a deduped i18next
-`missingKeyHandler`. `useObjectLabel`'s convention-key probes are flagged so
-their intentional misses (which fall back to server metadata) stay silent.
-
-Pairs with the framework-side locale-aware metadata changes in
-`@objectstack/client` / `@objectstack/objectql` / `@objectstack/rest`.
diff --git a/.changeset/line-items-lookup-cells.md b/.changeset/line-items-lookup-cells.md
deleted file mode 100644
index c90952dcb..000000000
--- a/.changeset/line-items-lookup-cells.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"@object-ui/fields": minor
----
-
-Lookup cells in line-item grids. `LineItemsField` columns now support `type: 'lookup'` (with `reference` / `displayField` / `idField`), rendering a real lookup picker per cell that resolves display labels and stores the foreign-key id — so master-detail line grids can reference other objects (category, account, assignee, …) instead of only plain selects.
diff --git a/.changeset/master-detail-atomic-batch.md b/.changeset/master-detail-atomic-batch.md
deleted file mode 100644
index 6967f845e..000000000
--- a/.changeset/master-detail-atomic-batch.md
+++ /dev/null
@@ -1,24 +0,0 @@
----
-"@object-ui/data-objectstack": minor
-"@object-ui/plugin-form": minor
-"@object-ui/types": minor
----
-
-Atomic master-detail create via the cross-object transactional batch endpoint (ObjectStack #1604).
-
-When the server exposes the transactional batch endpoint, a NEW parent record and its child line items are now persisted in ONE server transaction — commit all or roll back all — instead of the previous client-orchestrated "create parent → create children → best-effort cleanup on failure" sequence.
-
-**`@object-ui/data-objectstack` — `ObjectStackAdapter.batchTransaction(operations)`**
-
-- New method posting `{ operations }` to `POST /api/v1/batch`. Operations run in one server transaction. A field value of `{ $ref: }` resolves to that op's generated id, so a child can reference its parent created earlier in the same batch (master-detail FK). Throws `ObjectStackError('BATCH_ERROR')` on a non-2xx response.
-
-**`@object-ui/plugin-form`**
-
-- `MasterDetailForm` now detects `dataSource.batchTransaction` and, on a NEW parent, builds one atomic batch (parent at index 0, each child FK set to `{ $ref: 0 }`) via the new pure helper `buildMasterDetailBatch`. Client-side total rollups are merged into the parent payload before the batch. Edit mode and adapters without `batchTransaction` keep the existing client-orchestrated path.
-- `ObjectForm` gained a `submitHandler` hook: when supplied, the form validates and hands the collected values to the host instead of calling `dataSource.create` / `dataSource.update`. `MasterDetailForm` uses it to own the atomic parent+children write while the parent fields are still rendered by `ObjectForm`.
-
-**`@object-ui/types`**
-
-- `ObjectFormSchema.submitHandler?: (values) => any | Promise` — typed override for host-owned persistence.
-
-Pairs with the framework-side ambient-transaction fix (ObjectQL `AsyncLocalStorage` transaction propagation) and the `/api/v1/batch` endpoint added in `@objectstack/rest`.
diff --git a/.changeset/master-detail-edit-atomic.md b/.changeset/master-detail-edit-atomic.md
deleted file mode 100644
index 21fc32692..000000000
--- a/.changeset/master-detail-edit-atomic.md
+++ /dev/null
@@ -1,25 +0,0 @@
----
-"@object-ui/plugin-form": minor
----
-
-feat(master-detail): atomic EDIT via the cross-object batch endpoint
-
-Edit mode now persists the parent update together with its child line-item
-create/update/delete diffs in ONE server transaction (commit all or roll back
-all), matching what create already did. Previously only create used the atomic
-`/api/v1/batch` path; edit fell back to client-orchestrated writes with
-best-effort cleanup.
-
-- New pure helper `buildMasterDetailEditBatch(parentObject, parentId,
- parentData, details)` — emits a parent `update` op (index 0) then diffs each
- child collection against its loaded snapshot into `create` / `update` /
- `delete` ops (children reference the known parent id directly, no `$ref`).
-- `MasterDetailForm` now treats `canBatch` as available whenever the data
- source exposes `batchTransaction` (create AND edit). `submitViaBatch` builds
- create-ops or edit-ops by mode; `onSuccess` → `handleSaved` ("saved" toast,
- no form reset in edit).
-
-The server `/api/v1/batch` handler already supports `update`/`delete` actions,
-and the adapter already forwards `action`/`id`, so this is a front-end change.
-Unit-tested (parent update + child create/update/delete diff); the create path
-remains verified by the live e2e.
diff --git a/.changeset/master-detail-subform.md b/.changeset/master-detail-subform.md
deleted file mode 100644
index 0d7000326..000000000
--- a/.changeset/master-detail-subform.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-"@object-ui/plugin-form": minor
-"@object-ui/fields": minor
-"@object-ui/components": minor
----
-
-Master-detail subform + lightweight list primitives (SDUI).
-
-- `MasterDetailForm` (`object-master-detail-form`): enter a parent record and its child line items together; client-orchestrated transactional create (parent → FK → bulk children → rollup → cleanup). Enterprise-convention layout (header on top, line grid, single Save bar at the bottom).
-- `LineItemsField` editable child grid (line numbers, right-aligned numerics, running total) and `LineItemsPanel` (`record:line_items`) for detail-page inline edit.
-- `element:definition-list` and `element:repeater` — lightweight, low-chrome list primitives for simple data.
diff --git a/.changeset/master-detail-submit-feedback.md b/.changeset/master-detail-submit-feedback.md
deleted file mode 100644
index 39833a843..000000000
--- a/.changeset/master-detail-submit-feedback.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-"@object-ui/plugin-form": patch
-"@object-ui/components": patch
----
-
-fix(master-detail): never silent on save — feedback, reset, and a duplicate-submit guard
-
-`MasterDetailForm`'s "Create" submitted successfully but gave **no feedback**: no toast, no form reset, no navigation. A successful create looked broken, and re-clicking created duplicate records.
-
-- On success: a `toast.success`, and on create the form clears (line items reset + parent `` remounts) ready for the next entry. A page-supplied `onSuccess` still runs afterwards (e.g. to navigate).
-- On failure (validation / network / atomic rollback): a `toast.error` surfaces the message instead of failing silently.
-- In-flight guard: the Create button shows "Saving…" and is disabled while a submit is running, preventing duplicate submissions, with a safety release if client-side validation blocks the submit.
-- `@object-ui/components` now re-exports `toast` (alongside `Toaster`) from its sonner wrapper.
-
-Tests: two new `MasterDetailForm` tests assert success → toast + form clear, and failure → error toast.
diff --git a/.changeset/master-detail-submit-reliability.md b/.changeset/master-detail-submit-reliability.md
deleted file mode 100644
index 83a6db8fa..000000000
--- a/.changeset/master-detail-submit-reliability.md
+++ /dev/null
@@ -1,22 +0,0 @@
----
-"@object-ui/plugin-form": patch
-"@object-ui/fields": patch
----
-
-fix(master-detail): reliable submit + stable e2e hooks
-
-Fixes the "click Create, nothing happens" report, surfaced by a new live browser
-e2e harness that drives the form with real input.
-
-- **MasterDetailForm `handleSave`** now triggers the button-less parent form's
- submit from a deferred macrotask and re-queries the live `